読者です 読者をやめる 読者になる 読者になる

素敵なおひげですね

主にWindowsな技術ブログ。最近はPowerShellなネタが多めです。

WindowsのVisual Studio CodeでGoの開発環境を作る

vscode golang Windows

@ishisakaさんのブログの手順を参考に私もやってみました。

opcdiary.net

1. Visual Studio Codeのインストール

こちらは特に言うことは無いでしょう。

code.visualstudio.com

からインストーラーをダウンロードして適当にインストールします。
私の場合は以前からインストールしてましたが、現時点の最新バージョンはVer.1.3.1です。

そしてGo for Visual Studio Code拡張機能を追加します。

Go拡張機能を検索すると2つ出てくるのですが、キモいかわいいGopher君の方を追加してください。

f:id:stknohg:20160723021647p:plain

2. Gitのインストール

go getコマンドなどでGitが必要になるのでインストールします。

git-for-windows.github.io

からインストーラーをダウンロードして適当にインストールします。
今回はVer.2.9.2をインストールしました。

通常であればPATHが通っているのでgitコマンドが普通に使える様になるはずですが、通っていなければPATHを通しておいてください。

3. Goのインストール

The Go Programming Language

からWindows用のインストーラーをダウンロードしてインストールします。
今回はgo1.6.3.windows-amd64.msi (Ver.1.6.3)C:\Go\にインストールしました。

インストール後、GOROOTを設定し、%GOROOT%\binに対してPATHを通します。
PowerShellからだと以下の様な感じで設定できます。

# GOROOTの設定 (要管理者権限)
$GOROOT = 'C:\Go'
$GOROOTBIN = (Join-Path $GOROOT "bin")
[Environment]::SetEnvironmentVariable('GOROOT', $GOROOT, 'Machine')
[Environment]::SetEnvironmentVariable('PATH', [Environment]::GetEnvironmentVariable('PATH', 'Machine') + ";$GOROOTBIN", 'Machine')

また、今回はGOPATHの設定も併せて行います。
GOPATH%USERPROFILE%\Goにして、%GOPATH%\binに対してPATHも通しておきます。

# GOPATHの設定
$GOPATH = (Join-Path $env:USERPROFILE "Go")
$GOPATHBIN = (Join-Path $GOPATH "bin")
mkdir -p $GOPATHBIN
[Environment]::SetEnvironmentVariable('GOPATH', "$GOPATH", 'User')
[Environment]::SetEnvironmentVariable('PATH', [Environment]::GetEnvironmentVariable('PATH', 'User') + ";$GOPATHBIN", 'User')

ここまでで必要なソフトウェアのインストールは完了です。

4. Go for Visual Studio Codeための環境設定

ここからGo for Visual Studio Codeための環境設定を行います。

必要パッケージのインストール

以下のコマンドを実行してGo for Visual Studio Codeに必要なパッケージをインストールします。

# Go for Visual Studio Codeに必要なパッケージをインストール
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/lukehoban/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/newhook/go-symbols
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v golang.org/x/tools/cmd/goimports

エラーがなければ%GOPATH%\bin配下に各パッケージの実行ファイルができているはずです。

Delve(デバッガ)のインストール

Go for Visual Studio CodeはデバッガにDelveを使用するのでインストールします。

以前はソースをMinGW上のGCCでMakeする必要があったのですが、今は単純にgo getするだけでインストール出来る様です。

# 今はgo getだけでDelveのインストールが可能
go get -u -v github.com/derekparker/delve/cmd/dlv

と、コマンドを実行して%GOPATH%\bindlv.exeができていればOKです。

最終的に%GOPATH%\binが以下の様になっていれば完了となります。

f:id:stknohg:20160723022627p:plain

最後に

これでGoの開発環境が出来上がります。
あとは適当にコードを書いてデバッグしてやればOKです。

f:id:stknohg:20160723023005p:plain

Delveのインストールが楽になったおかげで環境構築はものすごく簡単になりました。

ちょっとでも書いたことある言語

その他

なんかTwitter上で流行ってたので自分もやってみました。

めけぽんビンゴ ちょっとでも書いたことある言語

結果はこちら。

f:id:stknohg:20160721221656j:plain:w480

で、せっかくなのでブログのネタにしました。
一言語る感じでいきます。

ちょっとでも書いたことある言語

本当にちょっとでもな言語を含んでます。

Basic

中学生の時に授業で書きました。
一応初めて書いたプログラム言語になるんですけど、当時はプリントに書かれたコードを意味も分からず転記してなんか動いたってくらいの記憶しかないのでコードを書いてた実感は全く無いです。

FORTRAN

大学生の時の授業とゼミでちょろっと書いてました。
こっちの方が初めて書いた言語っていう実感があります。

C

会社の新人研修がCだったので。
以来全然書いてないですね...

C++

お仕事でほんの少しだけ。
VC++でちょっとしたコンソールアプリのツールを作った程度なので全然駄目です。

C#

お仕事でぼちぼち書いてます。
とはいえ、VB.NETがメインの部署にいるのでC#はプライベートって感じです。

Delphi

お仕事でほんの少しだけ。
DelphiからVB.NETC#への移行案件で動作確認のためにちょっと触れた程度なのでDelphiで何か作れるというわけではないのですが...

Python

お仕事でぼちぼち。
Flaskで簡単なサイト作ったり、NagiosプラグインPythonで書きまくったりしてました。
あとはFabricのfabfileを書いた程度でしょうか。

PHP

お仕事でほんの少しだけ。
あとNagiosのカスタマイズに使ったことがある程度です。
たいして使ってないのですが、PHPはなんかVB6に近いものを感じてあまり好きになれない感じです...

Javascript

PHPとセットで、といった感じです。
正直ほとんど書けません。

Java

お仕事でちょろっと。
既存のプログラムを改修する程度であればできる程度でしょうか...

COBOL

お仕事でちょっとだけ。
COBOLのレコード指向なところは何気に好きだったりします。
言語レベルでソートやマッチングの仕組みがあれば意外とイケるんでね?と思わなくもな...やっぱり無しで。

Ruby

VagrantやSensuの解析のために読みつつ、検証コードを書いてみたレベルです。
Vagrantfile書いたらRuby書いたって言っても良いですかね?

Go

PackerやInfluxDBの調査のために読みつつ、ちょっとコードも書いてみて勉強してるといったレベルです。

その他

Scala、F#、Typescript、Objective-Cは写経でちょっと書いてみた程度です。

まったく書いたことない言語

Perl

結構読む機会は多いのですが、書いたことは一度もない...はず。
もしかしたら既存スクリプトの改造とかしてたかもしれません。

Erlang

Riakをきっかけにして、興味はとてもあるのですがコードは書いたことないです。

Elixir

Erlangが気になるのでElixirも、といった感じです。

Swift

機会があればなんか書きたいなーって感じ。

その他

FortressLispSmalltalkはよくわかりません。
うかつに触れると火傷しそうな雰囲気があります...

ビンゴにはないけど書いたことある言語

Visual Basic

一番長く書いてる言語で、言葉通りメシの種ってやつです。
VB6からはじめていまはVB.NETがメイン、VBAVBScriptなんかもたまに書く感じです。

PowerShell

一応いま自分の中で一番主力な言語だと思います。
最近はお仕事でもPowerShellばっかり書いてます。

シェルスクリプト

お仕事でたまに書きますけど、書かずに済むなら書きたくないです。
可能ならシェルスクリプトではなくPythonで書いてしまう感じです...

SQL

ちょっと言語としては意味が広くなってしまうかなーって感じですが、Visual Basicと併せて私のもう一つのメシの種です。
ブログでは書くネタがないので書いていませんが割とSQLおじさんだと自分では思っています。

Nano ServerのPowerShellについてざっくりとした話

NanoServer PowerShell

基本的にはこちらの記事の内容をかいつまんだ感じです。

technet.microsoft.com

まだ日本語に翻訳されてないみたいなので、自分の勉強がてらざっくりとまとめていきます。
そのうち翻訳されると思いますのでその際はこのエントリの内容も不要になるでしょう。

はじめに

本エントリの内容はWindows Server 2016 TP5で確認しています。
製品版のWindows Server 2016、およびWMF 5.1が出る際はこのエントリの内容と違うことになっている可能性がありますので予めご了承ください。

PowerShellのエディションについて

PowerShell 5.1からプラットフォームに応じて以下の2つのエディションに分かれます。

  • Desktop Edition

    所謂これまでのPowerShell
    Full Server/Server CoreやDesktop Windowsに搭載され、.NET Framework上で動作します。

  • Core Edition

    Nano ServerやWindows IoTに搭載されるサブセット版のPowerShell
    .NET Core上で動作します。

エディションの判別

PowerShell 5.1では$PSVersionTablePSEditionプロパティが増え、DesktopまたはCoreが設定されるのでこの値を取得することでエディションの判別が可能になります。

PS C:\> $PSVersionTable  

Name                           Value  
----                           -----  
CLRVersion                     4.0.30319.34011
BuildVersion                   10.0.14284.1000  
PSVersion                      5.1.14284.1000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3  
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
SerializationVersion           1.1.0.1 
PSEdition                      Core

エディションの指定

requires -PSEditionステートメントスクリプトを実行可能なエディションを指定できる様になるそうです。
指定例は以下。

#requires -PSEdition Core

モジュールとエディション

PowerShell 5.1からはモジュールのManifest keyにCompatiblePSEditionsというパラメーターが増え、モジュールがサポートするエディションを指定できる様になるそうです。
以下の様なコマンドで当該のエディションでサポートされるモジュールを取得できます...

Get-Module -ListAvailable | ? CompatiblePSEditions -Contains "Desktop"

が、Windows Server 2016 TP5で試した限りでは既存のモジュールにはこのパラメーターは設定されておらず、値を取得することはできませんでした。

Nano Server上のPowerShell

PowerShell CoreエディションではDesktopエディションに対して以下の機能が制限されています。

1. ADSI, ADO, and WMI type adapters

PowerShell CoreエディションにはADSI、ADO、WMI Type Adapterはありません。
これはADSI、ADO、WMI(V1)に関する機能が使えないという事も意味しています。

WMI(V1)が使えないという事は、Get-WmiObject等のWMI関連のコマンドレットが使えないという事で割と一大事なのですが、こちらに関してはCIM Type AdapterおよびCIM Cmdlet(Get-CimInstanceなど)が代わりに使え、古いWMI関連の機能を捨てる形となります。

2. Enable-PSRemoting, Disable-PSRemoting

Enable-PSRemotingDisable-PSRemotingコマンドレットは使えません。
PSRemotingの設定はOSイメージ作成時に行うため削除されています。

3. Scheduled jobs and PSScheduledJob module

Scheduled Jobの機能とPSScheduledJobモジュールは使えません。
PSScheduledJobモジュールは使えず、Scheduled Jobの機能を利用することはできません。
なお、通常のJobは利用可能です。

4. Computer cmdlets for joining a domain

Add-CompurterRemove-Computerコマンドレットは使えません。
ドメインへの参加はOSイメージ作成時に設定するため削除されています。

5. Reset-ComputerMachinePassword, Test-ComputerSecureChannel

Reset-ComputerMachinePasswordTest-ComputerSecureChannelコマンドレットは使えません。
ADSI Type Adapterが無いことに起因する感じでしょうか?

6. Profiles

PowerShell Coreエディションではプロファイルの機能が無くなり、$Profile変数も無くなっていました。
Nano Serverではコンソールログオンでの管理をあまり想定していない様なのでその影響を受けている感じでしょうか。

Set-PSSessionConfigurationを使ってリモート接続時にスタートアップスクリプトを実行するすることは可能です。

7. Clipboard cmdlets

クリップボード関連のコマンドレット(Get-ClipboardSet-Clipboard)は使えません。
Nano Serverではクリップボードの使いどころが無いので当然といった感じです。
ちなみにclip.exeも無くなってました。

8. EventLog cmdlets

イベントログ関連のコマンドレット(Clear-EventLogGet-EventLogLimit-EventLogNew-EventLogShow-EventLogRemove-EventLogWrite-EventLog)は使えません。
代わりにGet-WinEventNew-WinEventコマンドレットを使います。
単純に古いコマンドレットを捨てる形になる様です。

9. Get-PfxCertificate cmdlet

Get-PfxCertificateコマンドレットは使えません。
このコマンドレットは内部でSystem.Security.Cryptography.X509Certificates.X509Certificate2クラスを使っているのですが、このクラスが当初.Net Coreに含まれていなかった?*1ため使えない様に見受けられます。

10. TraceSource cmdlets

Get-TraceSourceSet-TraceSourceコマンドレットは使えません。
機能が削られた理由はよくわかりません。

11. Counter cmdlets

Get-CounterExport-CounterImport-Counterコマンドレットは使えません。
typeperfコマンドは使えますのでパフォーマンスカウンターに関してはこのコマンドで頑張る感じでしょうか?

12. Web-related cmdlets

Invoke-WebRequestInvoke-RestMethodNew-WebServiceProxySend-MailMessageConvertTo-HtmlといったWEBアクセスに関するコマンドレットは使えません。

Invoke-WebRequestInvoke-RestMethodが使えないのは非常に痛いです。

13. Logging and tracing using PSDiagnostics module

PSDiagnosticsモジュールの機能を使ったロギングやトレースはできません。

14. Get-HotFix

Get-HotFixコマンドレットは使えません。
Nano ServerではManaging updates in Nano Serverにある様にWMIを使ってアップデート管理をする方針の様です。

15. Implicit remoting cmdlets

暗黙的なリモート処理を行うためのExport-PSSessionImport-PSSessionコマンドレットは使えません。
暗黙的なリモートとは何かについてはこちらを参考にしてくだい。

16. New-PSTransportOption

New-PSTransportOptionコマンドレットは使えません。
機能が削られた理由はよくわかりません。

17. PowerShell transactions and Transaction cmdlets

トランザクションは使えません。
トランザクションについては、正直使ってる人いるの?ってくらいの機能なので不要でしょう。

18. PowerShell Workflow infrastructure, modules, and cmdlets

ワークフローは使えません。
縄神様には申し訳ないですが残当

19. Out-Printer

Out-Printerコマンドレットは使えません。
当然ですがOut-GridViewもありません。

20. Update-List

Update-Listコマンドレットは使えません。
理由はよくわかりませんが、単純に利用されないからでしょうか?

21. WMI v1 cmdlets

こちらについては1. ADSI, ADO, and WMI type adaptersで述べた通りです。

Nano ServerのWindows PowerShell Desired State Configuration

Nano ServerのDSCについては、Using DSC on Nano Serverを参考にすると良いでしょう。
こちらは日本語に翻訳済みで分かりやすくまとまっています。

*1:今は含まれています