Giter Site home page Giter Site logo

aaronparker / evergreen Goto Github PK

View Code? Open in Web Editor NEW
329.0 23.0 61.0 12.44 MB

Create evergreen Windows image build pipelines with the latest version numbers and download URLs for common applications

Home Page: https://stealthpuppy.com/evergreen/

License: MIT License

PowerShell 100.00%
evergreen automation applications updates powershell-gallery psgallery intune packer endpoint-manager configmgr

evergreen's Introduction

About

License PowerShell Gallery Version PowerShell Gallery codecov

Evergreen icon

Evergreen is a simple PowerShell module to return the latest version and download URLs for a set of common enterprise Windows applications. The module consists of a number of simple functions to use in scripts when performing several tasks including:

  • Image creation with Hashicorp Packer - images can be created with the latest version of a set of applications
  • Import applications into Microsoft Endpoint Manager - keep Configuration Manager or Microsoft Intune up to date with the latest versions of applications
  • Validating or auditing a desktop image to ensure the current version of an application is installed
  • Create a library of application installers - by regularly running Evergreen functions, you can retrieve and download the current version of an application and store it in an application directory structure for later use
  • Track application updates to stay on top of new releases
  • Submitting manifests to Winget or Chocolatey or similar - Evergreen can return an object with a version number and download URL that can be used to construct manifests for the most recent versions

Via Get-EvergreenApp each Evergreen application returns at least two properties in the object sent to the pipeline:

  • Version - a string property that is the version number of the application. If you need these in a version format, cast them with [System.Version]
  • URI - a string property that is the download location for the latest version of the application. These will be publicly available locations that provide installers in typically Windows installer formats, e.g., exe, msi. Some downloads may be in other formats, such as zip that will need to be extracted before install

How Evergreen Works

Application version and download links are only pulled from official sources (vendor's web site, vendor's application update API, GitHub, SourceForge etc.) and never a third party.

Evergreen uses an approach that returns at least the version number and download URI for applications programmatically - thus for each run an Evergreen function it should return the latest version and download link.

Evergreen uses several strategies to return the latest version of software:

  1. Application update APIs - by using the same approach as the application itself, Evergreen can consistently return the latest version number and download URI - e.g., Microsoft Edge, Mozilla Firefox or Microsoft OneDrive. Fiddler can often be used to find where an application queries for updates
  2. Repository APIs - repo hosts including GitHub and SourceForge have APIs that can be queried to return application version and download links - e.g., Audacity, Notepad++ or WinMerge
  3. Web page queries - often a vendor download pages will include a query that returns JSON when listing versions and download links - this avoids page scraping. Evergreen can mimic this approach to return application download URLs; however, this approach is likely to fail if the vendor changes how their pages work - e.g., Adobe Acrobat Reader DC
  4. Static URLs - some vendors provide static or evergreen URLs to their application installers. These URLs often provide additional information in the URL that can be used to determine the application version and can be resolved to the actual target URL - e.g., Microsoft FSLogix Apps or Zoom

What Evergreen Doesn't Do

Evergreen does not scrape HTML - scraping web pages to parse text and determine version strings and download URLs can be problematic when text in the page changes or the page is out of date. Pull requests that use web page scraping will be closed.

While the use of RegEx to determine application properties (particularly version numbers) is used for some applications, this approach is not preferred, if possible.

For additional applications where the only recourse it to use web page scraping, see the Nevergreen project.

Why

There are several community and commercial products that manage application deployment and updates already. This module isn't intended to compete against those. In fact, they can be complementary - for example, Evergreen can be used with the Chocolatey Automatic Package Updater Module to find the latest version of an application and then creating and submitting a Chocolatey package, or it can be used to create a Windows Package Manager manifest.

Evergreen's focus is on integration for PowerShell scripts to provide product version numbers and download URLs. Ideal for use with the Microsoft Deployment Toolkit or Microsoft Configuration Manager for operating system deployment, creating applications packages in Microsoft Intune, or with Packer to create evergreen machine images in Azure, AWS, GCP etc.

Documentation

Documentation for Evergreen, including usage examples, is located here: https://stealthpuppy.com/evergreen/.

Versioning

The module uses a version notation that follows: YearMonth.Build. It is expected that the module will have changes on a regular basis, so the version numbering is intended to make it as simple as possible to understand when the last update was made. See the CHANGELOG for details on changes introduced in each version.

Installing the Module

PowerShell Support

Evergreen supports Windows PowerShell 5.1 and PowerShell 7.0+. Evergreen should work on PowerShell Core 6.x; however, we are not actively testing on that version of PowerShell, so support cannot be guaranteed.

Install from the PowerShell Gallery

The Evergreen module is published to the PowerShell Gallery and can be found here: Evergreen. This is the best and recommend method to install Evergreen.

The module can be installed from the gallery with:

Install-Module -Name Evergreen
Import-Module -Name Evergreen

Updating the Module

If you have installed a previous version of the module from the gallery, you can install the latest update with Update-Module and the -Force parameter:

Update-Module -Name Evergreen -Force

Manual Installation from the Repository

The module can be downloaded from the GitHub source repository and includes the module in the Evergreen folder. The folder needs to be installed into one of your PowerShell Module Paths. To see the full list of available PowerShell Module paths, use $env:PSModulePath.split(';') in a PowerShell console.

Common PowerShell module paths include:

  • Current User: %USERPROFILE%\Documents\WindowsPowerShell\Modules\
  • All Users: %ProgramFiles%\WindowsPowerShell\Modules\
  • OneDrive: $env:OneDrive\Documents\WindowsPowerShell\Modules\

To install from the repository

  1. Download the main branch to your workstation
  2. Copy the contents of the Evergreen folder onto your workstation into the desired PowerShell Module path
  3. Open a Powershell console with the Run as Administrator option
  4. Run Set-ExecutionPolicy using the parameter RemoteSigned or Bypass
  5. Unblock the files with Get-ChildItem -Path <path to module> -Recurse | Unblock-File

Once installation is complete, you can validate that the module exists by running Get-Module -ListAvailable Evergreen. To use the module, load it with:

Import-Module -Name Evergreen

Greentech icon by Icons8

evergreen's People

Contributors

aaronparker avatar adotcoop avatar andre-sicking avatar ashleyhow avatar blu3id avatar borntoberoot avatar bronsonmagnan avatar ch0nx avatar dangough avatar dependabot[bot] avatar dw-42 avatar eldobam avatar fritz69420 avatar g3rhard avatar haavarstein avatar iainbrighton avatar jaymichaud avatar jms-du-se avatar jonathanpitre avatar jongalac avatar lwalthert avatar pseymour avatar ricoroodenburg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

evergreen's Issues

SQL SSMS is reporting the wrong version

Describe the bug
SSMS shows the wrong version.

As of writing this, the current version is 15.0.18358.0, SSMS v18.7.1 and the evergreen code is showing an earlier version.

To Reproduce
PS C:> Get-MicrosoftSsms

Version Date Title URI


15.0.18330.0 2020-04-03T06:23:20.6085577Z Microsoft SQL Server Management Studio https://download.microsoft.com/download/2/d/1/2d12f6a1-e28f-42d1-9617-ac036857c5be/SSMS-Setup-ENU.exe

Compared to this:

https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15

Expected behavior
It should return the correct/latest version.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: Windows Server 2016
  • Module Version 2010.219

Additional context
Add any other context about the problem here.

2012.225 Firefox ESR is giving the wrong files

Describe the bug

Getting the ESR release of Firefox shows the non-ESR version to me

To Reproduce

PS C:> Get-MozillaFirefox | where {$.Architecture -eq "x64" -and $.Channel -eq "FIREFOX_ESR" -and $_.type -eq "msi" }

Version : 78.5.0esr
Architecture : x64
Channel : FIREFOX_ESR
Language : en-US
Type : msi
Filename : Firefox Setup 83.0.msi
URI : https://download-installer.cdn.mozilla.net/pub/firefox/releases/83.0/win64/en-US/Firefox%20Setup%2083.0.msi

Expected behavior

Return the ESR version.

Screenshots

Desktop (please complete the following information):

  • OS: Windows Server 2016
  • Module Version: 2012.225

7Zip FunctionStrings Setup/Arguments wrong (2005.176)

When running Export-EvergreenFunctionStrings 7zip, $_.Install["Setup"] returns the wrong exe and the Argument are also wrong
"Setup": "WinMerge*.exe"
"Arguments": "/Silent"

Exe should be: "7z*.exe"
Argument should be: "/S"

https://www.7-zip.org/faq.html

How can I install 7-Zip in silent mode?
For exe installer: Use the "/S" parameter to do a silent installation and the /D="C:\Program Files\7-Zip" parameter to specify the "output directory". These options are case-sensitive.

For msi installer: Use the /q INSTALLDIR="C:\Program Files\7-Zip" parameters.

Windows 10 1909
PSVersion - 5.1.18362.752
PSEdition - Desktop
BuildVersion - 10.0.18362.752
CLRVersion - 4.0.30319.42000
WSManStackVersion - 3.0
PSRemotingProtocolVersion - 2.3
SerializationVersion - 1.1.0.1

Get-ShareX returns HTTP status 403

Get-ShareX returns HTTP status 403 when trying to download the non-portable edition of ShareX

Using this syntax should produce the error:
$Evergreen = Get-ShareX | Where-Object {$_.URI -notlike "portable"} | Sort-Object -Property Version -Descending | Select-Object -First 1
$URL = $Evergreen.uri

Start-BitsTransfer -Source $URL

Tested on Windows Server 2019
EvergreenIssue

Challenges parsing DateTime

Describe the bug

I've created the Convert-DateTime private function to update date/time data returned for various applications and output in localised time using [DateTime]::ParseExact and [DateTime]::Parse to ensure that we get consistent output on PowerShell Core and Windows PowerShell.

However, this still has issues with input from some sources. Typically with an error such as:

Exception calling "Parse" with "1" argument(s): "String was not recognized as a valid DateTime."

Expected behavior

Need to update Convert-DateTime to handle error checking and multiple date/time input types and work consistently on PowerShell Core and Windows PowerShell.

Get-MozillaFirefox changed "Platform" to "Architecture" and only returns en-US

Describe the bug
Get-MozillaFirefox changed "Platform" to "Architecture" and only returns en-US

To Reproduce
Steps to reproduce the behavior:

  1. Update-Module -Name Evergreen -Force to latest version
  2. Get-MozillaFirefox
  3. Results are all en-US
  4. Instead of Platform you now have to filter for Architecture

Expected behavior
No changes in wording, although I can fix this.
But I need a de-DE Client, like before.

Screenshots
grafik

Desktop (please complete the following information):

  • OS: [Windows Server 2016]
  • Module Version
PS U:\> Get-Module Evergreen

ModuleType Version    Name
---------- -------    ----
Script     2012.225   Evergreen

Additional context

Firefox ESR MSI Support

Is your feature request related to a problem? Please describe.

Current ESR returned by Evergreen is the EXE only.

Describe the solution you'd like

Return both EXE & MSI versions, and allow it to be filtered.

Describe alternatives you've considered
This ugly code to change EXE to MSI as the names are predictable!

$ff = Get-MozillaFirefox | where {$.Architecture -eq "x64" -and $.Version -match "esr"}
foreach ($x in $ff) {
$x.uri = $x.uri.replace(".exe", ".msi")
}

Additional context
Add any other context or screenshots about the feature request here.

Get-NotepadPlusPlus has non consistent output (2005.176)

Get-NotepadPlusPlus has non consistent output, the Architecture is missing for x86/exe

Version : 7.8.6
Platform : Windows
Architecture : x64
Date : 2020-04-21T16:14:58Z
Size : 4666076
URI : https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v7.8.6/npp.7.8.6.bin.x64.zip

Version : 7.8.6
Architecture : x86
Date : 2020-04-21T16:14:58Z
Size : 4194290
URI : https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v7.8.6/npp.7.8.6.bin.zip

Version : 7.8.6
Platform : Windows
Date : 2020-04-21T16:14:58Z
Size : 3760568
URI : https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v7.8.6/npp.7.8.6.Installer.exe

Version : 7.8.6
Platform : Windows
Architecture : x64
Date : 2020-04-21T16:14:58Z
Size : 4040456
URI : https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v7.8.6/npp.7.8.6.Installer.x64.
exe

Windows 10 1909
PSVersion - 5.1.18362.752
PSEdition - Desktop
BuildVersion - 10.0.18362.752
CLRVersion - 4.0.30319.42000
WSManStackVersion - 3.0
PSRemotingProtocolVersion - 2.3
SerializationVersion - 1.1.0.1

Zoom Bug

Describe the bug
A clear and concise description of what the bug is.

Error:

Cannot index into a null array.
At C:\Users\xtian\Documents\WindowsPowerShell\Modules\evergreen\Public\Get-Zoom.ps1:34 char:9

  •     $Url = [RegEx]::Match($redirectUrl, $res.Get.MatchUrl).Captur ...
    
  •     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : InvalidOperation: (:) [], RuntimeException
    • FullyQualifiedErrorId : NullArray

To Reproduce
Steps to reproduce the behavior:
Run Get-Zoom

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [e.g. Windows 10, Windows Server 2019]
  • Module Version [e.g. 2004.126]

Additional context
Add any other context about the problem here.

PowerBI Desktop evergreen option in SoftwareUpdater script?

Is your feature request related to a problem? Please describe.
We are trying to find an efficient way to update PowerBI desktop in our environment via Evergreen if possible

Describe the solution you'd like
We have been working with the Software Updater script that yourself and Morpheus78 (and others i'm sure) have collaborated on which works fantastic. We are hoping it is possible to add PowerBI Desktop to the options here to help update/deploy to desktops that have that application as well

Describe alternatives you've considered
We have somewhat been able to do this w/ chocolatey however it requires removing the traditional install first and letting it install via that method. We also are able to use a PDQ Deploy script to first silently uninstall old version then install the new (requires a manual download of each new version however).

Additional context
The best that I can find PowerBI uses this URL to download the latest version if it helps: https://www.microsoft.com/en-us/download/confirmation.aspx?id=58494

Get-FoxitReader errors out

Describe the bug
Get-FoxitReader returns an error (format something something -> https://www.foxitsoftware.com/downloads/downloadForm.html?retJson=1&product=Foxit-Reader&platform=Windows -> this page no longer exists seems like)

Exception calling "Format" with "2" argument(s): "Value cannot be null.
Parameter name: args"
At C:\Program Files\WindowsPowerShell\Modules\Evergreen\2006.212\Private\Invoke-WebContent.ps1:99 char:9

  •     Throw ([string]::Format("Error : {0}", $_.Exception.StatusCod ...
    
  •     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    • FullyQualifiedErrorId : ArgumentNullException

ConvertFrom-Json : Cannot bind argument to parameter 'InputObject' because it is null.
At C:\Program Files\WindowsPowerShell\Modules\Evergreen\2006.212\Public\Get-FoxitReader.ps1:38 char:39

  •         $PackageJson = $Content | ConvertFrom-Json
    
  •                                   ~~~~~~~~~~~~~~~~
    
    • CategoryInfo : InvalidData: (:) [ConvertFrom-Json], ParameterBindingValidationException
    • FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ConvertFrom
      JsonCommand

To Reproduce
Execute "Get-FoxitReader"
Desktop (please complete the following information):

  • OS: Windows 10 2004
  • Module Version 2006-212

Additional context
Add any other context about the problem here.

Get-GitForWindows returns incorrect version number

Describe the bug
When running Get-GitForWindows the version number is suffixed with an extraneous number.

To Reproduce
Steps to reproduce the behavior:

[5] C:\..\Dropbox\PowerShell> Get-Module Evergreen

ModuleType Version    PreRelease Name                                ExportedCommands
---------- -------    ---------- ----                                ----------------
Script     2001.117              Evergreen                           {Export-EvergreenFunctionStrings, Export-Evergreeโ€ฆ

[6] C:\..\Dropbox\PowerShell> Get-GitForWindows

Version Date                     Size URI
------- ----                     ---- ---
2.25.01 13/01/2020 21:34:30  46638048 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/Git-2โ€ฆ
2.25.01 13/01/2020 21:35:19 110495532 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/Git-2โ€ฆ
2.25.01 13/01/2020 21:34:25  46476880 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/Git-2โ€ฆ
2.25.01 13/01/2020 21:35:05 112824606 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/Git-2โ€ฆ
2.25.01 13/01/2020 21:34:55  23405989 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/MinGiโ€ฆ
2.25.01 13/01/2020 21:34:52  23236364 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/MinGiโ€ฆ
2.25.01 13/01/2020 21:35:02  19206638 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/MinGiโ€ฆ
2.25.01 13/01/2020 21:34:59  19086606 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/MinGiโ€ฆ
2.25.01 13/01/2020 21:35:39  17981910 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/pdbs-โ€ฆ
2.25.01 13/01/2020 21:35:35  16473968 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/pdbs-โ€ฆ
2.25.01 13/01/2020 21:34:43  42861256 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/Portaโ€ฆ
2.25.01 13/01/2020 21:34:37  43086536 https://github.com/git-for-windows/git/releases/download/v2.25.0.windows.1/Portaโ€ฆ

Expected behavior
I would expect the version number (in this particular instance) to return 2.25.0 and not 2.25.01

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

[4] C:\..\Dropbox\PowerShell> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.0.0-rc.2
PSEdition                      Core
GitCommitId                    7.0.0-rc.2
OS                             Microsoft Windows 10.0.18363
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0โ€ฆ}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

Additional context
I'll submit a PR to address this!

Get-ControlUpAgent fails on PowerShell Core

Describe the bug

Get-ControlUpAgent fails with:

Exception calling ".ctor" with "1" argument(s): "Input string was not in a correct format."                                                                         
At /Users/aaron/Projects/Evergreen/Evergreen/Public/Get-ControlUpAgent.ps1:58 char:5                                                                                
+     $version = [Version]::new(($splitLines | Select-String -Pattern $ ...                                                                                         
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                                                             
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : FormatException

"Unknown" Zoom versions

Describe the bug
When running Get-Zoom the versions for most downloads is listed as Unknown

PS C:\Users\Iain\Dropbox\Apps\PowerShell\6.1.1> Get-Zoom

Version        Platform Type    URI
-------        -------- ----    ---
Unknown        Windows  Outlook https://zoom.us/client/latest/ZoomOutlookPluginSetup.msi
4.6.17409.0120 Windows  EXE     https://d11yldzmag5yn.cloudfront.net/prod/4.6.17409.0120/ZoomInstaller.exe
Unknown        Windows  Lync    https://zoom.us/client/latest/ZoomLyncPluginSetup.msi
Unknown        Windows  Rooms   https://zoom.us/client/latest/ZoomRooms.exe
4.7.52180.0404 Windows  Notes   https://d11yldzmag5yn.cloudfront.net/prod/4.7.52180.0404/ZoomNotesPlugi...
Unknown        Windows  MSI     https://zoom.us/client/latest/ZoomInstallerFull.msi
Unknown        Citrix   HPTh... https://d11yldzmag5yn.cloudfront.net/prod/vdi/zoomcitrixplugin-hp_amd64...
Unknown        Citrix   eLux... https://d11yldzmag5yn.cloudfront.net/prod/vdi/zoomcitrixplugin_library_...
Unknown        Citrix   eLux... https://d11yldzmag5yn.cloudfront.net/prod/vdi/zoomcitrixplugin_library_...
Unknown        Citrix   HPTh... https://d11yldzmag5yn.cloudfront.net/prod/vdi/zoomcitrixplugin-hp_i386.deb
Unknown        Citrix   Wind... https://d11yldzmag5yn.cloudfront.net/prod/vdi/ZoomCitrixHDXMediaPlugin.msi
Unknown        Citrix   IGEL... https://d11yldzmag5yn.cloudfront.net/prod/vdi/zoomcitrixplugin-igel_64.zip
Unknown        Citrix   Wind... https://d11yldzmag5yn.cloudfront.net/prod/vdi/ZoomInstallerVDI.msi
Unknown        VMware   Client  https://d11yldzmag5yn.cloudfront.net/prod/vdi/ZoomVmwareMediaPlugin.msi

I have confirmed this is the current behaviour in Windows PowerShell 5.1 and PowerShell Core 6.1.1 on Windows 10 1909. It appears that the Resolve-RedirectedUri is having problems following some of the links.

I'm not sure whether it helps or not, but this code (I am only interested in the MSI versions!) functions on both Windows PowerShell 5.1 and PowerShell Core 6.1.1 on Windows 10 1909:

function Resolve-Uri
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [System.String] $Uri
    )
    process
    {
        try
        {
            $httpWebRequest = [System.Net.WebRequest]::Create($uri)
            $httpWebRequest.MaximumAutomaticRedirections = 3
            $httpWebRequest.AllowAutoRedirect = $true
            $webResponse = $httpWebRequest.GetResponse()
            Write-Output -InputObject $webResponse.ResponseUri.AbsoluteUri
        }
        catch
        {
            throw $_
        }
        finally
        {
            $webResponse.Dispose()
        }
    }
}

function Get-ZoomEx
{
    [CmdletBinding()]
    param ( )
    process
    {
        $downloads = @{
            Client = 'http://zoom.us/client/latest/ZoomInstallerFull.msi'
            Outlook = 'http://zoom.us/client/latest/ZoomOutlookPluginSetup.msi'
            Notes = 'https://zoom.us/client/latest/ZoomNotesPluginSetup.msi'
            Lync = 'http://zoom.us/client/latest/ZoomLyncPluginSetup.msi'
            Rooms = 'http://zoom.us/client/latest/ZoomRoomsInstaller.msi'
        }

        foreach ($download in $downloads.GetEnumerator())
        {
            $version = 'Unknown'
            $uri = Resolve-Uri -Uri $download.Value
            $regexMatch = [Regex]::Match($uri, '(?<=/)\d+(\.\d+){2,}(?=\.\d+/)')
            if ($regexMatch.Success -eq $true)
            {
                $version = $regexMatch.Value
            }
            [PSCustomObject] @{
                Version = $version
                Product = $download.Key
                Uri = Resolve-Uri -Uri $download.Value
            }
        }
    }
}

PS C:\Users\Iain\Dropbox\Apps\PowerShell\6.1.1> Get-ZoomEx -Verbose

Version   Product Uri
-------   ------- ---
4.6.17409 Client  https://d11yldzmag5yn.cloudfront.net/prod/4.6.17409.0120/ZoomInstallerFull.msi
4.6.1244  Rooms   https://d11yldzmag5yn.cloudfront.net/prod/4.6.1244.0112/ZoomRoomsInstaller.msi
4.7.52180 Notes   https://d11yldzmag5yn.cloudfront.net/prod/4.7.52180.0404/ZoomNotesPluginSet...
4.8.17303 Outlook https://d11yldzmag5yn.cloudfront.net/prod/4.8.17303.0117/ZoomOutlookPluginS...
4.8.13207 Lync    https://d11yldzmag5yn.cloudfront.net/prod/4.8.13207.1127/ZoomLyncPluginSetu...

Feel free to use whatever helps!

Thanks,
Iain

Add ESR version to Mozilla FireFox

Is your feature request related to a problem? Please describe.
The customer where I want to use this module, uses the ESR version.

Describe the solution you'd like
I would like to see that Get-MozillaFireFox also lists the ESR version.
"FIREFOX_ESR" nest to the "LATEST_FIREFOX_VERSION"

Maybe something like:

$Editions = @('LATEST_FIREFOX_VERSION', 'FIREFOX_ESR')

ForEach ($lang in $Language) {
    ForEach ($plat in $Platform) {
        ForEach ($edition in $Editions) {
            # Select the download file for the selected platform
            Switch ($plat) {
                "win64" { $file = "Firefox%20Setup%20$($firefoxVersions.$edition).exe" }
                "win32" { $file = "Firefox%20Setup%20$($firefoxVersions.$edition).exe" }
            }
            switch ($edition) {
                "LATEST_FIREFOX_VERSION" {$EditionName = "Current"}
                "FIREFOX_ESR" {$EditionName = "ESR"}
            }
            # Build object and output to the pipeline
            $PSObject = [PSCustomObject] @{
                Version      = $firefoxVersions.$edition
                Architecture = Get-Architecture -String $plat
                Language     = $lang
                Edition      = $EditionName
                Filename     = $file.Replace('%20', ' ')
                URI          = "$($res.Get.DownloadUri)$($firefoxVersions.$edition)/$($plat)/$($lang)/$($file)"
            }
            Write-Output -InputObject $PSObject
        }
    }
}

You'll get the following output with that.

Version      : 76.0.1
Architecture : x64
Language     : en-US
Edition      : Current
Filename     : Firefox Setup 76.0.1.exe
URI          : https://download-installer.cdn.mozilla.net/pub/firefox/releases/76.0.1/win64/en-US/Firefox%20Setup%2076.
               0.1.exe

Version      : 68.8.0esr
Architecture : x64
Language     : en-US
Edition      : ESR
Filename     : Firefox Setup 68.8.0esr.exe
URI          : https://download-installer.cdn.mozilla.net/pub/firefox/releases/68.8.0esr/win64/en-US/Firefox%20Setup%20
               68.8.0esr.exe

Version      : 76.0.1
Architecture : x86
Language     : en-US
Edition      : Current
Filename     : Firefox Setup 76.0.1.exe
URI          : https://download-installer.cdn.mozilla.net/pub/firefox/releases/76.0.1/win32/en-US/Firefox%20Setup%2076.
               0.1.exe

Version      : 68.8.0esr
Architecture : x86
Language     : en-US
Edition      : ESR
Filename     : Firefox Setup 68.8.0esr.exe
URI          : https://download-installer.cdn.mozilla.net/pub/firefox/releases/68.8.0esr/win32/en-US/Firefox%20Setup%20
               68.8.0esr.exe

Use a different folder containing manifests

Is your feature request related to a problem? Please describe.
When the name in the manifest does not match the name which my organisation has selected to use as the name for an application i need to edit the manifest to change the name. I would rather not edit the files contained in the module.

Describe the solution you'd like
I would like to have some way of setting which path to use when looking for manifests

Describe alternatives you've considered
Add a setting to Evergreen.json named ManifestsPath(s) and the ability to set this or add another path with a cmdlet

Edit the manifests and holding a copy of the files, when Evergreen is installed (or updated) replace the manifests in the modules folder with the edited ones.

Submit an edited manifest with the new name.

Additional context
One example of this is Zoom. In my organisation it is called Zoom Client for Meetings and in the Evergreen manifest it is simply named Zoom.

7zip download link doesn't work with latest release (2006.203)

Describe the bug
7zip download link doesn't work with latest release

The link presented is:
https://nchc.dl.sourceforge.net/project/sevenzip/19.00/7z1900-x64.exe
What it should be for it to download the file
https://nchc.dl.sourceforge.net/project/sevenzip/7-Zip/19.00/7z1900-x64.exe

To Reproduce

PS C:\> get-7zip

Version Architecture URI
------- ------------ ---
19.00   x64          https://nchc.dl.sourceforge.net/project/sevenzip/19.00/7z1900-x64.msi
19.00   x64          https://nchc.dl.sourceforge.net/project/sevenzip/19.00/7z1900-x64.exe
19.00   x86          https://nchc.dl.sourceforge.net/project/sevenzip/19.00/7z1900.msi
19.00   x86          https://nchc.dl.sourceforge.net/project/sevenzip/19.00/7z1900.exe

Expected behavior
URL is missing a part after "sevenzip", "7-Zip"
https://nchc.dl.sourceforge.net/project/sevenzip/7-Zip/19.00/7z1900-x64.exe

Desktop (please complete the following information):

  • OS: Windows 10, Windows Server 2019
  • Module Version : 2006.203

function Get-MicrosoftEdge no longer returns x64 versions

Describe the bug
The latest version for function Get-MicrosoftEdge no longer returns x64 versions

To Reproduce
Get-MicrosoftEdge | Where-Object {$.Release -like "enterprise" -and $.Channel -like "stable"}

Expected behavior
Return x86 and x64 objects

Screenshots
image

Desktop (please complete the following information):

  • OS: 2019LTSC_CORE
  • Module Version: 2005.176.0

Additional context
The x86 version that is return seems to be a very old version as well:
Version : 79.0.309.65
Platform : Windows
Channel : Stable
Release : Enterprise
Architecture : x86
Date : 2020-01-13T22:11:00
Hash : 8A97FF8F247354A6B62CF0FE0347EBA296B08836F0C6D07000F40A956889158C
URI : http://dl.delivery.mp.microsoft.com/filestreamingservice/files/f9658d03-0e86-45c3-9259-8c5d3795f41d/MicrosoftEdgeEnterpriseX86.msi

Get-Zoom / Get-FoxitReader - PowerShell Core support

Support for PowerShell Core in Get-Zoom and Get-FoxitReader is currently excluded. A fix is required.

Both functions Invoke-WebRequest -Method Head to retrieve a header that includes the location to the download fail. This works OK on Windows PowerShell with -ErrorAction SilentlyContinue; however, on PowerShell Core, Invoke-WebRequest does not return anything from a 302 response.

Invoke-WebRequest returns:

Invoke-WebRequest : Response status code does not indicate success: 302 (Found).
At line:1 char:6
+ $r = Invoke-WebRequest -Uri "https://zoom.us/client/latest/ZoomInstal ...
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (Method: HEAD, Reque\u2026: Edg/79.0.301.2
}:HttpRequestMessage) [Invoke-WebRequest], HttpResponseException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

Expected behavior

Need to find a method to get these functions working on PowerShell Core.

Get-Cyberduck returns extra / in URI; Remove Beta and Snapshot channels

Get-Cyberduck returns an extra / in the download URI for the Release channel:

Version Date       Channel  URI
------- ----       -------  ---
7.7.3   21/12/2020 Snapshot https://update.cyberduck.io/nightly/Cyberduck-Installer-7.7.3.33988.exe
7.7.3   11/12/2020 Beta     https://update.cyberduck.io/beta/Cyberduck-Installer-7.7.3.33961.exe
7.7.2   2/12/2020  Release  https://update.cyberduck.io//Cyberduck-Installer-7.7.2.33862.exe

The URL returned from the update feed at https://version.cyberduck.io/windows/changelog.rss includes the extra /. Function will need to be updated to fix this.

Also, the Snapshot and Release channels should be removed from the function.

Get-AdobeAcrobatReaderDC returns invalid download link for updater types

Describe the bug
URI provided by the latest version returns no valid link for Updater. these are now https://... links (previously they were http links) Older module 2012.225 still returns the correct URI.


PS I:\> get-AdobeAcrobatReaderDC

Version      Type      Language     URI
-------      ----      --------     ---
20.013.20074 Installer English      http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/2001320074/AcroRdrDC2...
20.013.20074 Installer English (UK) http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/2001320074/AcroRdrDC2...
19.008.20071 Installer Danish       http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1900820071/AcroRdrDC1...
19.008.20071 Installer Dutch        http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1900820071/AcroRdrDC1...
20.013.20074 Installer French       http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/2001320074/AcroRdrDC2...
19.008.20071 Installer Finnish      http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1900820071/AcroRdrDC1...
20.013.20074 Installer German       http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/2001320074/AcroRdrDC2...
19.008.20071 Installer Italian      http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1900820071/AcroRdrDC1...
20.013.20074 Installer Japanese     http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/2001320074/AcroRdrDC2...
19.008.20071 Installer Korean       http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1900820071/AcroRdrDC1...
19.008.20071 Installer Norwegian    http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1900820071/AcroRdrDC1...
20.013.20074 Installer Spanish      http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/2001320074/AcroRdrDC2...
20.013.20074 Updater   Neutral      **https://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/2001320074/AcroRdrDC...**
20.013.20074 Updater   Multi        **https://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/2001320074/AcroRdrDC...**

To Reproduce
get-AdobeAcrobatReaderDC with the latest version
Returns https link
https://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/2001320074/AcroRdrDCUpd2001320074_MUI.msp

Expected behavior
http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/2001320074/AcroRdrDCUpd2001320074_MUI.msp

Desktop (please complete the following information):
Windows 10 2004 & Windows Server 2016

Module with the issue: 2101.249
Working module: 2012.225

MicrosoftTeams FunctionStrings missing Setup (2005.176)

MicrosoftTeams FunctionStrings is missing Setup value, empty value.

Should be something like "Teams_windows*.msi"

Windows 10 1909
PSVersion - 5.1.18362.752
PSEdition - Desktop
BuildVersion - 10.0.18362.752
CLRVersion - 4.0.30319.42000
WSManStackVersion - 3.0
PSRemotingProtocolVersion - 2.3
SerializationVersion - 1.1.0.1

Errors with returned URIs

Hi,

Thanks for the modules, really working well.

On Get-Cyberduck, the returned URI is missing a "/" in the URI
i.e. it returns **https:/**update.cyberduck.io/......

That seems to be true on all channels for this product.

Thanks
Matthew

Get-OpenJDK returns only debug version and only a zip

Describe the bug
Get-OpenJDK returns the debug build
https://github.com/ojdkbuild/ojdkbuild/releases/download/java-1.8.0-openjdk-debug-1.8.0.265-1.b01/java-1.8.0-openjdk-debug-1.8.0.265-1.b01.ojdkbuild.windows.x86_64.zip

To Reproduce
Steps to reproduce the behavior:

  1. Run get-openjdk

Expected behavior
Would expect 2 results:
https://github.com/ojdkbuild/ojdkbuild/releases/download/java-1.8.0-openjdk-1.8.0.265-1.b01/java-1.8.0-openjdk-1.8.0.265-1.b01.ojdkbuild.windows.x86_64.zip
https://github.com/ojdkbuild/ojdkbuild/releases/download/java-1.8.0-openjdk-1.8.0.265-1.b01/java-1.8.0-openjdk-1.8.0.265-1.b01.ojdkbuild.windows.x86_64.msi

Eventually also the other versions like
https://github.com/ojdkbuild/ojdkbuild/releases/download/java-11-openjdk-11.0.8.10-1/java-11-openjdk-11.0.8.10-1.windows.ojdkbuild.x86_64.zip
https://github.com/ojdkbuild/ojdkbuild/releases/download/java-11-openjdk-11.0.8.10-1/java-11-openjdk-11.0.8.10-1.windows.ojdkbuild.x86_64.msi

etc.
Screenshots

Version      : 1.8.0.265-1.b01
Platform     : Windows
Architecture : x64
Date         : 2020-08-31T18:50:56Z
Size         : 81832394
URI          : https://github.com/ojdkbuild/ojdkbuild/releases/download/java-1.8.0-openjdk-debug-1.8.0.265-1.b01/java-1
               .8.0-openjdk-debug-1.8.0.265-1.b01.ojdkbuild.windows.x86_64.zip

Desktop (please complete the following information):

  • OS: Windows 10 & Windows Server 2016
  • Module Version 2010.219

Get-MicrosoftTeams displays slightly wrong formatted version number

Describe the bug
The version number from the PowerShell Module shows for example: 1.3.00.12058
Where appwiz.cpl and the MSI itself report: 1.3.0.12058

To Reproduce
Steps to reproduce the behavior:

  1. (Get-MicrosoftTeams | Where-Object {$_.Architecture -eq "x64"}).Version

Expected behavior
The command should report 1.3.0.12058 IMHO

Screenshots
Not applicable.

Desktop (please complete the following information):

  • OS: Windows Server 2016 Datacenter de-DE
PS C:\Users\xenadmin\Downloads> gcm *ever*
CommandType     Name                                               Version    Source                                                                                                                                   
-----------     ----                                               -------    ------                                                                                                                                   
Function        Export-EvergreenFunctionStrings                    2005.176   Evergreen                                                                                                                                
Function        Export-EvergreenResourceStrings                    2005.176   Evergreen

Additional context
Nothing.

GoogleChrome FunctionStrings Setup will fail if x64 (2005.176)

GoogleChrome FunctionStrings "Setup" will fail if x64
Currently the setup value is "googlechromestandaloneenterprise.msi"
This is incorrect for x64 msi because the name is "googlechromestandaloneenterprise64.msi"

Setup should be something like "googlechromestandaloneenterprise*.msi"

Windows 10 1909
PSVersion - 5.1.18362.752
PSEdition - Desktop
BuildVersion - 10.0.18362.752
CLRVersion - 4.0.30319.42000
WSManStackVersion - 3.0
PSRemotingProtocolVersion - 2.3
SerializationVersion - 1.1.0.1

MicrosoftEdge.json Manifest contains typo for post task (2005.176)

"Install": {
"Setup": "",
"Physical": {
"Arguments": "DONOTCREATEDESKTOPSHORTCUT=TRUE",
"PostInstall": [
"Remove-Item -Path "$env:Public\Destkop\Microsoft Edge.lnk" -Force"
]
},
"Virtual": {
"Arguments": "DONOTCREATEDESKTOPSHORTCUT=TRUE",
"PostInstall": [
"Remove-Item -Path "$env:Public\Destkop\Microsoft Edge.lnk" -Force"
]
}

Destkop => Desktop

Foxit Reader not returning latest version

Describe the bug
Get-FoxitReader does not return the latest version

To Reproduce
Get-FoxitReader

Expected behavior
Latest version returned (10.x)

Desktop (please complete the following information):

  • OS: n.a.
  • Module Version: 2005.187

Handle GitHub API rate limiting gracefully

Describe the bug
GitHub rate limits its API when it sees too many queries from a single Ip address. This is most obvious when repeating Pester test run for the Evergeen module (either locally or via AppVeyor).

When the API is rate limited the following message returned:

{
    "message":"API rate limit exceeded for 180.150.38.232. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)",
    "documentation_url":"https://developer.github.com/v3/#rate-limiting"
}

Expected behavior
ConvertFrom-GitHubReleasesJson and Invoke-WebContent should handle API rate limiting more gracefully and return output that indicates this rather than error out.

Get-JamTreeSizeFree and Get-VideoLanVlcPlayer return Version as PSObject instead of System.String

Describe the bug

To Reproduce
$evergreen = Get-JamTreeSizeFree
$evergreen.Version

4.42
$evergreen.Version | fl

4.42
$evergreen.Version | fl -force

PSPath : C:\Users\amensc\AppData\Local\Temp\tmpB35D.tmp
PSParentPath : C:\Users\amensc\AppData\Local\Temp
PSChildName : tmpB35D.tmp
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
ReadCount : 1
Length : 4

Expected behavior
Expected to return a .Version attribute of type System.String

Desktop (please complete the following information):

  • OS: Win10 20H2 fully patched
  • Evergreen 2101.275

Additional context
I don't know if these are the only two functions behaving like this.

Italian language in AdobeAcrobatReaderDC.json

Fantastic project! I want to implement it in my work routine but the lack of the Italian language prevents me from having the updated script.
Please add Italian
"Italian", in to AdobeAcrobatReaderDC.json

thx

Get-MicrosoftSQLServerManagementStudio does not return the newest version

Describe the bug
Get-MicrosoftSQLServerManagementStudio does not return the newest version (it returns 15.0.18183.0)

To Reproduce
Execute Get-MicrosoftSQLServerManagementStudio

Expected behavior
Returns the newest version (15.0.18330.0)

Desktop (please complete the following information):

  • OS: Windows 10 / Windows Server 2019
  • Module Version: 2005.190

Get-LibreOffice fails on PowerShell Core

Describe the bug

Get-LibreOffice returns:

Exception calling ".ctor" with "1" argument(s): "Version string portion was too short or too long.                                                                  
Parameter name: input"                                                                                                                                              
At /Users/aaron/Projects/Evergreen/Evergreen/Public/Get-LibreOffice.ps1:56 char:41                                                                                  
+ ...      $version = [version]::new($($verblock | Select-Object -First 1))                                                                                         
+                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentException

Get-MozillaFirefox

Get-MozillaFirefox reports Version, Architecture, Language etc but cannot we use Get-MozillaFirefox -Architecture x64

Would also be nice, if possible to show ESR or Regular

Per application JSON manifest

All application details exist within a single JSON file right now - Evergreen.json. This won't be scalable as more applications are added, thus per application JSON manifests are required. This could be extended to include application install logic.

Here's an mock up of what the per application JSON could look like:

{
	"Application": {
		"Name": "Adobe Acrobat Reader DC",
		"Download": {
			"Uri": "https://get.adobe.com/reader/webservices/json/standalone/?platform_type=#Platform&platform_dist=#Dist&platform_arch=#Arch&language=#Language&eventname=readerotherversions",
			"Languages": [
				"English",
				"English (UK)",
				"Dutch",
				"French",
				"German",
				"Japanese",
				"Spanish"
			],
			"Platforms": [
				{
					"platform_type": "Windows",
					"platform_dist": "Windows 10",
					"platform_arch": ""
				},
				{
					"platform_type": "Macintosh",
					"platform_dist": "OSX",
					"platform_arch": "x86-32"
				}
			],
			"Headers": {
				"Sec-Fetch-Site": "same-origin",
				"Accept-Encoding": "gzip, deflate, br",
				"Accept-Language": "en-US;q=0.9,en;q=0.8",
				"DNT": "1",
				"Sec-Fetch-Mode": "cors",
				"X-Requested-With": "XMLHttpRequest",
				"Referer": "https://get.adobe.com/reader/enterprise/",
				"Accept": "*/*"
			},
			"UpdateUri": "https://armmf.adobe.com/arm-manifests/mac/AcrobatDC/reader/current_version.txt",
			"UpdateDownloadUri": "http://ardownload.adobe.com/pub/adobe/reader/#Platform/AcrobatDC/",
			"UpdateContentType": "text/plain; charset=utf-8",
			"UpdatePlatforms": [
				"win",
				"mac"
			],
			"UpdateLanguages": [
				"en_US",
				"de_DE",
				"es_ES",
				"fr_FR",
				"ja_JP"
			]
		},
		"Install": {
			"Setup": "AcroRdrDC.*.exe",
			"Physical": {
				"Arguments": "-sfx_nu /sALL /msi EULA_ACCEPT=YES ENABLE_CHROMEEXT=0 DISABLE_BROWSER_INTEGRATION=1 ENABLE_OPTIMIZATION=YES ADD_THUMBNAILPREVIEW=0 DISABLEDESKTOPSHORTCUT=1",
				"PostInstall": [
        ]
      },
      "Virtual": {
				"Arguments": "-sfx_nu /sALL /msi EULA_ACCEPT=YES ENABLE_CHROMEEXT=0 DISABLE_BROWSER_INTEGRATION=1 ENABLE_OPTIMIZATION=YES ADD_THUMBNAILPREVIEW=0 DISABLEDESKTOPSHORTCUT=1 UPDATE_MODE=0 DISABLE_ARM_SERVICE_INSTALL=1",
				"PostInstall": [
					"Get-Service -Name AdobeARMservice -ErrorAction SilentlyContinue | Set-Service -StartupType Disabled",
					"Get-ScheduledTask \"Adobe Acrobat Update Task*\" | Unregister-ScheduledTask -Confirm:$False"
				]
			}
		}
	}
}

Add Get-AdobeAcrobatStandard2020

Hi Aaron,

it would be nice if you could add a cmdlet to get Adobe Acrobat Standard 2020 Updates, which can be downloaded here:

"ftp://ftp.adobe.com/pub/adobe/acrobat/win/Acrobat2020/"

Thanks
Selimir

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.