2020年12月29日火曜日

2020年の振り返り「Go編」

私が2020年に参加したGoのイベント活動について振り返ります。
参加イベントは28個で、うち5個を主催、2つを講師、4個で登壇させて頂きました。

GDG Shikoku

香川県にて、GDG Shikokuさんの協力で有志にて開催されているGoイベント。
私はいずれもテーマではなく「はじめてのGo言語教室」を担当しました。

Go Release Party

日本にて、毎年2月と8月のGoリリース月に開催されるGoイベント。
今年は、両方の「What's new Go 1.1x?」を担当させて頂きました。
後日、参加されていた方から「発表よかったです」とのお言葉を聞けて、嬉しかったです!

        発表資料:What's new Go 1.14?

        発表資料:What's new Go 1.15?
        発表資料:Go articles from Google Open Source Blog at August 27, 2020

Go Conference

年に1,2回開催される日本最大級のGoイベント。
Sendaiの有志にて、夏から秋への開催時期の変更を乗り越えて開催して頂けました。
現地集合とオンライン配信のハイブリッド開催だったため、今回も無事に参加できました。

Goコミュニティ

日本各地で有志にて開催されているGoコミュニティ。
オンライン開催のおかげでSendai、Fukuoka、Shizuoka、Umedaに参加できました。
この他にもKyotoが月一回のペースでオンライン開催されています。

        発表資料:Goでイケる!Azureサービスの紹介

        発表資料:Goをやり直そう!

Women Who Go Tokyo

東京にて、女性とジェンダーマイノリティの方々を対象に開催しているGoコミュニティ。
たまにヒューマンを対象にオンラインで開催されるため、その際に参加しています。

『プログラミング言語Go』オンライン読書会

訳者の柴田さんが休日にオンラインで開催されている読書会。
各自が1ページほど音読した後、必要に応じて柴田さんが解説をしてくださります。
放課後の柴田さんと参加者の皆さんとのフリートークは貴重&充実の時間となっています。

Go Language Specification輪読会

有志が主催する、Go公式サイトの仕様書を音読&日本語訳して読み進めるGoイベント。
平日の夜の開催ですが、年末になって仕事が落ち着いたことで参加できるようになりました。
主催者の方々が仲良し&バリバリGopherさん達なので、安心して参加させて頂いています。

メルカリ/Mercari

有志社員が開催しているGoイベント。
平日の日中にも、多くのGoイベントを開催しています(私は時間的に参加不可能)
Go Fridayは毎週金曜日に社内で開催されているGoイベントで、Open付きの時は社外からも参加できます。

tenntennさん主催

GDE/Goのtenntennさんが開催されるGoイベント。
Gopher道場は、募集対象が一致して休日にオンラインで開催ということで参加できました。

Amigurumi Gopher's

有志によるGopherのあみぐるみを編むイベント。
私は編めないため、ガヤ要員として参加させて頂きました。
参加者の皆さんは、お話ししながらも着実に編み上げて行かれていました。

その他

2020年の振り返り「Azure編」

私が2020年に参加したAzureのイベント活動について振り返ります。
参加イベントは12個で、うち4個で登壇させて頂きました。

de:code夏まつり

マイクロソフト主催の「de:code 2020」をコミュニティから盛り上げるためのイベント。
当初、計3回の開催の予定でしたが、その盛り上がりによってthe FINALが追加で開催に。
マイクロソフトのコミュニティにデビューさせて頂いた、私にとって大切な今夏の思い出です。

        発表資料:AzureとSDKとGoと私

        発表資料:I am gaining the skills I want!

Hack Azure!

ZEN ARCHITECTS社のHACK EVERYTHING.チームが主催の、Azureを深堀りするイベント。
深すぎて全然わからないながらも、Azureを知るために参加させて頂いています。

Azure Rock Star

日本でのAzureコミュニティを繋ぐためのマイクロソフト公式プログラム。
Azureおよび周辺の情報を収集をメインに、参加させて頂いています。

Japan Azure User Group (JAZUG)

今年で10周年を迎える、有志が主催するAzureのユーザー会。
オンライン開催のおかげで、地方からも登壇させて頂くことが出来ています。

        発表資料:Join Azure Using Go (10 items)

        発表資料:私のExam AZ-900: Microsoft Azure Fundamentals学習記

Japan Microsoft Learn User Group

有志が主催する公式eラーニング「Microsoft Learn」のユーザー会。
Learnを通じてAzureを学ぶための学習機会として、参加させて頂いています。

Azure Tech Lab

関西からクラウド業界を盛り上げる目的で立ち上がったAzureコミュニティ。
第8回はAzureの入門セッションが多かったため、参加させて頂きました。

その他

2020年の振り返り「Go/Azure以外編」

私が2020年に参加したGo/Azure以外のイベント活動について振り返ります。
参加イベントは8個で、うち5個で登壇させて頂きました。

GDG Shikoku

四国地方で活動しているGoogle Developer Group (GDG) コミュニティ。
Angularは、仕事で使う可能性が少しあったので事前学習のために参加させて頂きました。Firebaseは、Flutterをやり進めると絡むだろうと事前学習のために参加させて頂きました。

GDG Devfest

年1回、Google Developer Group (GDG) コミュニティが主催するイベント。
今年はGDG Tokyoさんが主体となってオンラインで2日間、開催されました。
Goのセッションも通常とLTでそれぞれ2つずつあったので、ひと安心。

        発表資料:日本のGoコミュニティ活動状況 [2020年10月版]

Flutter Osaka

有志によりOsakaで活動しているFlutterコミュニティ。
Meetupでは、オンライン開催のおかげで関東の方々のお話しも聞けてよかったです。

        発表資料:Introduce Flutter Japan activities
        発表資料:Install Android Virtual Device to macOS on command line interface

Android Bazaar and Conference

日本Androidの会が年2回ペースで開催するAndroidイベント。
今回は、香川県の現地会場とオンライン配信のハイブリッド開催。
イベント名にDiverse(多様性)が付き、「ワーケーション」をテーマに開催されました。

        発表資料:今こそ始めようGoケーション

地元「岡山」のイベント

Rails勉強会では、「はじめてのGo言語教室」のWebアプリ編を考える際にRailsチュートリアルに取り組んだ内容で発表させて頂きました。
毎年年末に開催される合同勉強会では、2020年の自分のAzure/Go活動の集大成と位置付けて発表させて頂きました。

        発表資料:"Railsをはじめよう"を真似てみた

        発表資料:Microsoft AzureのGo紹介

2020年11月7日土曜日

「[Windows] そのexeがx64かx86かを見分ける方法 Part2」をmacOSのGoで確認

何気に遥佐保さんのブログ記事「[Windows] そのexeがx64かx86かを見分ける方法 Part2」をGoで確認してみました。

Goはクロスコンパイルができますからね。ブログ記事投稿のツイートから20分ほどで確認できました。

1.x64(amd64)用とx32(386)用のGoのソースコードを書く。(違いは出力メッセージのみ)

$ cat main64.go 

package main

import (

"fmt"

)

func main() {

fmt.Println("GOOS=windows GOARCH=amd64")

}

$ cat main32.go 

package main

import (

"fmt"

)

func main() {

fmt.Println("GOOS=windows GOARCH=386")

}

2.macOS上でGoのソースコードをx64(amd64)とx32(386)でコンパイル。

$ GOOS=windows GOARCH=amd64 go build -o main64.exe main64.go 

$ GOOS=windows GOARCH=386 go build -o main32.exe main32.go

3.ファイルの生成を確認。

$ ls main*

main32.exe main32.go  main64.exe main64.go

4.fileコマンドで確認。

$ file main32.exe 

main32.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows

$ file main64.exe

main64.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows

やったね!q@w@p

2020年11月4日水曜日

Microsoft AzureのGo紹介

2020年11月3日(火)にオンラインで「合同勉強会 in 大都会岡山 -2020 Winter Online-」が開催されました。今回は初のオンライン開催でしたが、バラエティ豊かなセッションが揃った、これまで通りの雰囲気だったので安心しました。

2020年、これまでの「Azure SDK for Go」の学習の過程で知り得たMicrosoft Azureな情報のお裾分けと、裏テーマとしてお世話になった方々への恩返しとして、「Microsoft AzureのGo紹介」にて発表させて頂きました。

直前まで何回リハをしても予定の20分を超えてしまいどうなるかと心配していましたが、いざ本番、ほぼ時間通りに終われたということで、ひと安心。

現時点での日本のMicrosoft、Azure、コミュニティの情報と、今回は少しとなってしまった関連するGoの情報を紹介しています。あなたの知らないAzureがあるかも!?

2020年10月4日日曜日

Join Azure Using Go 〜GoでAzureを始めたい&知りたい方々へ〜

2020年9月30日(水)にオンラインで「★祝★Japan Azure User Group 10周年」が開催されました。3年前の7周年の時にLTでチャレンジしたのですが失敗しており、また、Azure SDK for Goの学習を始めた今年が記念の10周年にあたるのも何かのGo縁だと思い、再度、祝辞(LT)枠にて申し込みさせて頂きました。

今回は事前に動画を投稿し、公開された物から順に各自で閲覧するという、私も初めて体験する形式でした。

今夏の私の「Microsoft/Azure x Go」活動の集大成として、力一杯作成したところ少々長めの動画となってしまいました。ダメ元で JAZUG のコミュニティリーダーの方々に相談させて頂いたところO.K.を頂くことができ、5分枠に対して21分の動画を採用して頂くことができました m(_ _)m

現時点でのAzureサービスでのGoの使われ処やGoで使えるAzureサービスを目一杯紹介しています。これからGoでAzureを始めたい方や知りたい方などは、ぜひ一度みて頂けれたら!

P.S. 18ページ目の「Web App for Contsainers」の補足:先日、Windowsコンテナーも一般提供(GA)になりました。

2020年8月16日日曜日

Azure SDKsのGo Guidelines(現在ドラフト版)を日本語訳

Azure SDKに関するサイトとして「Azure SDKs」があります。

画面右上の「ハンバーガーメニュー」から「Guidelines」-「Go (Draft)」を選択するとGoのページである「Go Guidelines」にアクセスできます。ちなみに「Go Guidelines」は現在ドラフト版です。

また、本サイトのドキュメントはGitHubに「Azure/azure-sdk」として存在しており「Go Guidelines」のドキュメントである「Azure/azure-sdk/docs/golang」を今回もGoogle翻訳ベースで日本語訳しました。

主要コンテンツは3つです。

見栄えについては、GitHub形式だと少し見辛いのでAzure SDKs形式に変更しようかとも考えています。表が崩れていたりとかもあるので、ちょいちょい修正して行きます。

日本語訳した理由は、Azure SDKのサイトであり「Azure SDK for Go」を見ていくのに読んでおいた方が良いかと思い、同じ読むなら日本語訳しておけば後の人のお役にも立てるかと。Azure SDK for Goの中の人がcommitした形跡もあるので信頼性も大丈夫です。

内容的には、Azure SDK for Goを「提供する側の心得」という感じでした。RESTful API クライアントを作成する方とかにはオススメかと。作り手側の目線を知れたことで、ソースコードを読み進めていく際に着眼点がブレないなど収穫は大きいと思います。

2020年8月10日月曜日

私の「de:code夏まつり the FINAL」

前回の「de:code夏まつり #3」から、ちょうど1ヶ月後。

2020年8月8日(土)にオンラインで開催された「de:code夏まつり ~よりコミュニティを楽しくするためのコミュニティのすすめ the FINAL」にて、タイトル「I am gaining the skills I want! 〜What inspired me to take one step for being a "Go MVP" through de:code and summer festival〜」で発表をさせて頂きました。

内容は、私が拝見した「de:code 2020」のセッションの内容、感想、Go情報などを紹介しています。

以下、自分目線ながらそこに至るまでの経緯を記録として。

「de:code夏まつり the FINAL」への参加

2020年7月30日(木)の昼休みに「de:code夏まつり the FINAL」が土曜日開催であることに気付き、だったら参加しようかなぁと思い立ちました。

今回はLT公募ということで集まり具合をみてみると、募集人数16名に対して6名とちょい少なめ。くしくも今日が募集締め切り日だったので、主催者のおだしょーさんに「募集締め切り日を2020年8月2日(日)までに延長できないか?」問い合わせてみました。

なぜ2020年8月2日(日)までかというと、今回の発表条件が「de:code 2020で学んだことを共有する」のため、土日があればセッションを見る時間がとれて新たにLT申し込みする人が増えるのでは?と考えたからです。

これは自分のためにも、という部分も含まれていました。参加ではなくLT登壇で申し込んで少しでもお助けできないかと思ったからであり、その時、私はまだ「de:code 2020」のセッションを1本も見れていませんでした!(@o@)

その後、おだしょーさんのお力添えで、まずはLT登壇の申し込みを行い、発表内容は後日再提出することで調整して頂くことができました。

発表資料の作成

2020年7月31日、8月1日とで「de:code 2020」のセッションを見て行ったのですが、当初109ものセッションのどれを見ていけばよいのかと途方に...。

「自分が普通に見るなら」と立ち返り、次の視点に絞ることにしました。

  • GoでMVP アワードを受賞するにはAzureカテゴリーのため、Azureに関するもの。
  • あとは、知っている人や知り合いの方のもの。

発表内容としては「やはりGoは絡めたい!q@w@p」ということで、それぞれのセッションのテーマに何とかGo情報を絡めることで、発表資料を作成して行きました。

発表タイトル

発表資料のタイトルをどうしようかと悩みましたが、今回お世話になったおだしょーさんのセッションからお借りすることに。

実際にセッションを見てみるとコミュニティに関する内容でしたし、まさに今回私もLT登壇でお助けできれば!と思ったので、アンサーソングならぬアンサープレゼンとさせて頂きました。(お兄さん、イヤでも受け取って頂きます!w)

発表タイトルの副題

発表タイトルと概要を事務局に提出後、返ってきたメールはRieさんからでした。

RieさんはMVP Managerさんであり、その時の副題はGo MVPを目指す旨の英語の一文だったため、意味合いが違っていてはいかーん!と思い、確認させて頂きました。

その時にReiさんの方から、こちらの方がより意味合い的に良いのでは?と、今回の一文を提案して頂き、「確かに」と思い、授からせて頂きました。

ちなみに意味合い的に気になったのは「MVPになるための」を表現するための「becoming」と「being」でした。結果はどちらでも。(ネットをみるとbecomingは未来を表すものには使えない、とも。)

リハーサル

今回は2回目のリハーサルである当日2020年8月8日(土)の午前中に参加しました。

Teamsには新しいつよつよ登壇者の皆さんの顔ぶれが並び、ちょい緊張。Rieさん、ちょまどさん、少し遅れて登場のおだしょーさん、と前回お世話になった方々の顔ぶれを見て、ひと安心。リハが始まってから配信担当のタダさんの声も聞けて、ふた安心。

今回もつよつよな方々が集った様で順調に確認作業が進みました。

ちなみに今回のリハで一番嬉しかったのは「岩田プロ、髪切った?」でした(乙女かよっ!w)

いざ本番

2020年8月8日(土)の13:00から「de:code夏まつり the FINAL」がスタート!

前回はトップバッター&テンパリ気味だったり、初めて聞く技術名ばかりだったので、自分が発表した後の話はあまり理解できていなかったのですが(^^;)、今回は後半の2人目だったため、皆さんの発表も余裕を持って拝見することが出来ました。

お楽しみ企画では、非マイクロソフト系コミュニティ&地方コミュニティの人という立ち位置からコメントする様に心掛けてみたのですが、空回りしていたらスミマセン。

その後、嬉しいことに八重樫さんがAzure SDK for Goで作成したGo製自作ツールについて発表してくださりました。ガチめな内容での発表は一つの目安となり、Goということで心強かったですし、ありがたかったです!q@w@p ナカーマ

私の発表は、今回も早口で送らせて頂くことになり、申し訳なく。 自分で何回かリハしたのですが12分の壁を越えらなかったので、もし長引いていましたらスミマセン。全部お伝えしたかったのですよぉ!

登壇者の皆さまの発表ですが、資料も内容もしっかりされており、ネタもキッチリ消化され、やはりつよつよでしたね!今回も良い刺激を頂けました。

さいごに

de:code夏まつり、ホントまさか二回連続で参加&登壇とは...です。

私にとっての「トリオ DE de:code夏まつり」である、おだしょーさん、Rieさん、ちょまどさん、山盛りお世話になりました&ありがとうございました!

引き続き、まったりよろしくお願い致します。

AzureでWebアプリを稼働させる「App Service」とGo

Azureには、Webアプリを稼働させるPaaSとして「App Service」が用意されています。

通常は、WebアプリをWindows上でネイティブに稼働させる「App Service(App Service on Windows)」となります。

WebアプリをDocker化してLinuxコンテナーとして稼働させる「Web App for Containers(App Service on Linux)」も用意されています。

当初、Goは「App Service」にて実験サポートされていたのですが、2017年12月に対象外となりました(T_T)

そのため、現在Goで作成したWebアプリは「Web App for Containers」で稼働させることになっています。

これでDockerを学ぶ理由ができたので、よしとしま、しょうか、ねぇ...q@w@p

Gopher道場#8に入門してきました

 2020年7月5,11,18,25(x2),27,30日に開催された「Gopher道場#8」に参加しました。

今回はこれまでと違ってオンライン開催&土日開催ということで、残業が多いサラリーマンな私でも遠方の岡山から参加することが出来ました。

今回は「末広がりの8期生」である同期Gopherが13名も集い、slackやslide上ながら、それぞれのGoな活動を垣間見ることができて、良い刺激を受けることができました。

内容的には、Goの文法解説が中心ですが、周辺情報や最新情報などもしっかりと交えて説明されていたの安心して受講できました。

個人的には、主催者&講師であるtenntennさんの言葉で話を聞けたり質問できたりするのがGopher道場の一番の「旨味」だと思いました。

2020年7月31日(金)にはオンラインで卒業式LT大会が開催されました。

私もLT発表をさせて頂いたりして、同期全員が無事に卒業できたと信じています!

    今回のオンライン配信動画ですが、なんと「自習室」として公開されました!q@w@p

    これからGoを学びたい方は、個人でまったり、みんなとワイワイ、しっかり活用して頂けれたら私も嬉しいですし、熟練Gopherの方にも学びがあったりしますので、復習がてら見てみるのも良いかと!


    2020年7月13日月曜日

    私の「de:code夏まつり #3」[完全版]

    2020年7月8日(水)にオンラインで開催された「de:code夏まつり ~よりコミュニティを楽しくするためのコミュニティのすすめ #3」にて、タイトル「AzureとSDKとGoと私」で発表をさせて頂きました。


    以下、自分目線ながらそこに至るまでの経緯を記録として。

    de:code 2020

    今年もマイクロソフト主催のITエンジニア向け技術カンファレンス「de:code 2020」が開催されました。しかしながら世界的なコロナウィルスの流行により今年はデジタルイベントとして6月17日(水)から7月17日(金)までの1ヶ月間のオンライン開催となりました。

    de:code夏まつり

    日本では、コミュニティサイドから「de:code 2020」を盛り上げたり楽しんだりしようとMicrosoft Open Tech Night主催でコミュニティイベント「de:code夏まつり」が6月に2回、7月に1回開催されました。

    なぜ私が発表することになったのか?

    2020年6月24日(水)に第2回の「de:code夏まつり」が開催されました。

    その中で「MS Techクイズまつり」があり、第5問で「Azure Functions(3.x系のランタイム)でサポートされていない言語はどれ?」という問題が出題され、その答えは「Go」でした。

    私的には「おぉ、マイクロソフトさんのイベントで"Go"の二文字が!」と喜んだのも束の間、Goがサポートされていないことへの悔しさが湧き上がりました。


    2014年にサティア ナデラ氏がマイクロソフトCEOに就任して以降、マイクロソフトのOSSへの貢献や対応には目を見張るものがあり、Goに関してもAzureでの対応が多くなりました。

    • Azure App Service:GoでのWebアプリ作成
    • Azure SDK:Goのサポート
    • Azure Kubernetes Service:Go製OSSの採用(Docker、Kubernetes、など)

    しかしながら、他のプログラミング言語と比べて「対応サービスの少なさ」「正式リリースまでの長さ」「公式サイトへ掲載されるまでの遅さ」など、Goには出遅れ感があります。

    原因のひとつとが「Goの開発者」および「Goで使うユーザー」が少ないという現実です。

    私は「マイクロソフトにはGoもしっかりサポートして欲しい!」と願っており、マイクロソフトとGoの繋がりをもっと知ってもらおうとツイートしたり発表したりしていました。

    2018年からは、その思いは大きくなり、できるものなら「de:code」でGoを発表したい!と思うようになりました。2020年も「MS Techクイズまつり」のAzure FunctionsでのGoの未サポートを見て思わず「やはりde:codeでGoを発表したい!」とツイートしました。

    その日の夜遅く、タマコナさん(@tamagawaconan)と「de:codeでの発表、出来るものなら」「口にしたことは、実現しますよ。」と話をしていました。


    その直後、突然ちょまど(@chomado)さんから「de:code夏まつりでAzure SDK for Goについて発表できませんか?」とのお声掛けを頂きました。


    この時は「会話をしていたすぐ後に」「ちょまどさんから」「de:code関連イベントで発表」という予想だにしなかった流れが一気に押し寄せて、何が何だかで驚きまくり動揺しまくり。


    私はちょまどさんをフォローしていませんでしたが「こんな奇跡は二度と来ない!」と神速でフォロー&快諾して「de:codeでの発表」へ導いて頂くことになりました。

     
    私とAzure SDK for Go

    マイクロソフトの有識者を認定する制度「MVP アワード」において、唯一Goが絡める部分ということもあり、Azure SDK for Goは2016年のv8のころからウォッチしていました。

    2020年に入って本格的にやって行こうと、ブログやQiitaに記事を投稿したり、ツイートしたり、GitHubでドキュメントを日本語化したりコントリビュートしたりしています。

     
    発表スライドの作成

    イベントにはITエンジニア以外の方々も多く参加されるため、Azure SDK for Goはニッチ過ぎると考え、Goの紹介やAzureやSDKや私のことを交えて、お伝えしたいことをまとめることにしました。

    発表時間は10分ということで、スライド作成後に何度かリハーサルを行なったのですが、12分の壁が超えられませんでした。発表スライドは後から公開して見て頂くことが出来るため、内容の削除は行わず、当日は少し早口で詳細な部分を読み飛ばして進めることにしました。


    2日間のリハーサル

    2020年7月6日(月)、7日(火)の2日間、オンラインにて全体リハーサルが行われました。

    1日目は、主に各発表者のスライドや音声の確認、YouTube Live画面の調整などが行われました。今回はMicrosoft Teamsを使っての接続で、私は使うのが初めてでしたので、そちらの操作の確認なども行いました。

    テキストで少しやりとりをしていたちょまどさんを含めて、皆さまと顔合わせをするのは初めてで、画面越しに見ても皆さんの「つよつよさ」が伝わってきました。緊張しつつも会話できるところでは声を出したり笑ったりするなどして、少しでも早く馴染めるように心がけました。


    確認事項は1日目で完了していたのですが、新参者のことを少しでも見知りしておいて頂けた方が良いかと思い、2日目も参加しました。2日目は「MS Techクイズ」のテスト運用も行われ、準備や技術や担当者の方々のすごさを垣間見れました。


    進行役のおだしょー(@MS_odasho)さんからは、顔見知りの皆さんと分け隔てなく話かけて頂き、スムーズに会話をしたり確認事項をこなす事ができました。

    天の声役(?)のRie(@Rie_Moriguchi)さんには、内輪のハッシュタグ(?)の存在が知られていてビックリしました。


    Tadaさんチームの皆さま、配信の準備、調整、対応、お疲れ様でした!m(__)m

    いざ、開催!

    2020年7月8日(水)、ついに開催日となりました。

    雰囲気作りの意味合いも含めて、関係者は開始1時間前に集合しました。

    この時、おだしょーさんによるSpecial GuestのAI「りんな」の紹介テストが行われたのですが、ギリギリまで音声を出せずに焦りまくっていたおだしょーさんを皆さんでフォローすることで、リラックスできたり一体感が生まれたような気がしました。

    オープニングでは、そんな「りんな」の音声出力に失敗するも、二度目に成功。


    続いての「MS Techクイズ」では150人以上の方々が同時参加されて、ワイワイとお祭り気分が味わえました。

     
    いざ、発表!

    マイクロソフトな皆様にGoを知って使ってサポートして頂きたく、日本のGopherを代表する勢いで挑ませて頂きました。



    元々発表スライドのボリュームがあったのと、私が発表する時点で時間が押していたため、拍車のかかった早口になってしまったことはGo了承ください。多少なりとも緊張していたのも理由のひとつかも。


    発表後にJourneyman(@beajourneyman)さんがまとめられたTogetterにて自分の発表について確認させて頂きました。


    個別で前向きなツイートを頂いたり、概ね良い方向に捉えて頂けたようで、ツイートして頂いた皆さま、ありがとうGoざいます!q@w@p



    日本マイクロソフト公式TwitterのひとつであるMicrosoft Tech(@msdevjp)さんに「Go」をツイートして頂いたことは「Microsoft x Go」の大切な一歩を踏み出せた大事な証となりました。


    皆さんの発表

    改めて発表者の皆さんを見てみますと、MVPの方、コミュニティの関係者、社長さんなど「つよつよ」で「すごすご」の方々ばかり。お目当ての発表を見られた皆さんは、きっとご満足されたことでしょう!

     
    クロージング

    発表公募の第4回の開催告知のサプライズに、おだしょーさんの「じゃあな!」にはコミュニティ愛を感じました。

     
    初夏の夜の夢...

    携わってくださった皆さま、感謝ありがとう!引き続き、マイクロソフトにGoをサポートして頂くべく、Azure SDK for Goを中心にまったりと活動して参ります。

    サンキューコミュニティ!フォーエバーコミュニティ!q@w@p

    P.S. 個人的には、ちょまどさんから面と向かって「岩田プロ」と呼ばれる日が来るとは夢にも思っていませんでしたね...q@w@p その後、皆さんからも呼んで頂けました。

    2020年7月10日金曜日

    Azure Functions for Goの歴史

    Azure Functionsは、関数単位で処理を実行するAzureサービスです。


    2020年6月現在、Azure Functionsは

    • C#, JavaScript, F#, Java, PowerShell, Python, TypeScript

    を正式サポートしていますが、残念ながらココにGoはありません。


    Azure/azure-sdk-for-goにAzure Functions for Goに関するイシューがあります。


    このイシューを読み進めると、Azure Functions for Goの歴史を垣間見ることができます。

    2017年12月、当初、Private Preview版への招待が開始されました。


    2018年頃は、開発が停滞したり再開したりしました。

    2019年10月、開発担当者がマイクロソフト社を辞められていました。

    2019年12月、別の実装方法が模索されることになりました。

    2020年5月、その答えが「Azure Functions custom handlers」でした。


    私もリアルタイムにその流れを目撃していたのですが、azure.microsoft.comに一瞬ブログ記事が掲載されたのですが、すぐに取り消されてしまいました。

    現在「Azure Functions custom handlers」はPublic Previewであり、正式リリースされた暁には、公式サイトにも再度アナウンス記事が掲載されることでしょう。

    Goなサンプル

    2020年6月13日土曜日

    GitHubのAzure/go-autorestのREADME(v14.1.1)を日本語訳

    今後の理解のために、GitHubのAzure/go-autorestのREADME(v14.1.1)を日本語訳しました。


    go-autorestは、GoでAzureへアクセスする際の認証や、Goの基本型を変換するヘルパーを利用する際になどに使用します。

    2020年6月7日日曜日

    Azure SDK for GoのGitHubのREADMEの日本語訳をv43.0.0に最新化

    Azure SDK for GoのGitHubのREADMEを日本語訳していたものを2020年6月2日にリリースされたv43.0.0の内容で最新化しました。


    初回の v8.0.1-beta 以来、今回で2回目の更新です。

    この活動には元ネタがあって、以前 @ayatokura さんがVSCodeがリリースされる都度、リリースノートの日本語訳をGitHubに公開されていたのを見て「これはよいかも!」と私も始めてみたものです。

    今回更新した理由は、次の通りです。

    • 私自身がこれからAzure SDK for Goを触り始めるため、最新の内容を知っておきたかった。
    • Google検索にて「Azure SDK for Go」で検索すると上位に表示され、情報が古いままだとダメだと思ったため。(2020年6月7日時点:少なくとも私の環境からは公式の次に表示されています)
    2020年6月7日にGoogle検索で「Azure SDK for Go」を検索した結果のスクリーンショット


    引き続き、まったりと。

    2020年5月4日月曜日

    Azure SDK for Goでの認証方式

    Azure SDK for Go documentation」サイトの「Authentication methods in the Azure SDK for Go」ページを読み進めました。

    本セクションでは、Azure SDK for Goを使ってAzureで認証するための形式と方式が紹介されています。

    ここでは、対象ページの内容をベースに...というか結果的にGoogle翻訳による日本語翻訳状態となり、私なりの言い回しを加えています。ちなみに、"type"は"形式"に、"method"は"方式"に、日本語訳しています。

    利用可能な認証の形式と方式


    Azure SDK for Goは複数の資格情報セットと認証形式を提供し、認証形式は複数の認証方式(認証情報をSDKに取り込む操作)で呼び出せます。

    提供されている認証形式は、次の通りです。

    証明書ベース形式


    クライアント資格情報形式

    • アプリケーションに構成済みのサービスプリンシパルを組み込んで認証します。詳細については「Create a service principal with Azure CLI」を参照してください。

    AzureリソースのマネージドID形式

    • アプリケーションは、Azure ADが自動的にAzureサービスに提供したマネージドIDを使ってAzure AD認証をサポートするAzureサービスを認証します。詳細は「Managed identities for Azure resources」を参照してください。

    デバイストークン形式

    • 多要素認証を有効にしたユーザーのデバイスにトークンを渡し、WebブラウザーでMicrosoftサインインにアクセスしてAzure ADアカウントで認証します。詳細は「Use device token authentication」を参照してください。

    ユーザー名/パスワード形式

    • ユーザー名とパスワードで認証します。多要素認証が無効状態でのAzure ADサインインのため、セキュリティ面で不安があります。

    【重要】クライアント資格情報形式以外の認証形式を使用する場合、アプリケーションはAzure ADに登録されている必要があります。詳細は「Integrating applications with Azure Active Directory」を参照してください。

    【注意】特別な要件がない限り、ユーザー名/パスワード形式は避けてください。ユーザーベースのサインインが必要な場合はデバイストークン形式で対応してください。

    これらの認証形式は、さまざまな認証方式で利用できます。

    環境ベース方式

    • シェルの環境変数から資格情報を読み取ります。

    ファイルベース方式

    • サービスプリンシパルの資格情報などをファイルから読み込みます。

    クライアントベース方式

    • コード内のオブジェクトを使用し、プログラムの実行中に資格情報を提供する必要があります。

    デバイストークン方式

    • ユーザーはトークンを使用してWebブラウザーからインタラクティブにサインインする必要があります。

    すべての認証機能と認証方式は、github.com/Azure/go-autorest/autorest/azure/authパッケージで利用できます。

    【注意】特別な要件がない限り、クライアントベース方式は避けてください。認証情報をハードコード化する傾向にあり、認証要件が変更された場合のSDKリリースで機能しなくなる可能性があります。

    環境ベース方式を使用する


    アプリケーションを実行する前にシェルの環境変数を構成し、実行時にこれらの環境変数を読み取り、Azureで認証します。

    環境ベース方式は、デバイストークン形式を除くすべての認証形式をサポートしており、次の順序で評価されます。

    • クライアント資格情報形式
    • 証明書ベース形式
    • ユーザー名/パスワード形式
    • AzureリソースのマネージドID形式

    認証形式に未設定の値があるか拒否された場合、SDKは自動的に次の認証形式を試行し、形式がなくなるとエラーを返します。

    次の表は、環境ベース形式でサポートされる認証形式ごとに設定する必要がある環境変数の詳細を示しています。

    クライアント資格情報形式

            AZURE_TENANT_ID
                    サービスプリンシパルが属するActive DirectoryテナントのID。
            AZURE_CLIENT_ID
                    サービスプリンシパルの名前またはID。
            AZURE_CLIENT_SECRET
                    サービスプリンシパルに関連付けられているシークレット。

    証明書ベース形式

            AZURE_TENANT_ID
                    証明書が登録されているActive DirectoryテナントのID。
            AZURE_CLIENT_ID
                    証明書に関連付けられているアプリケーションクライアントID。
            AZURE_CERTIFICATE_PATH
                    クライアント証明書ファイルへのパス。
            AZURE_CERTIFICATE_PASSWORD
                    クライアント証明書のパスワード。

    ユーザー名/パスワード形式

            AZURE_TENANT_ID
                    ユーザーが属するActive DirectoryテナントのID。
            AZURE_CLIENT_ID
                    アプリケーションクライアントID。
            AZURE_USERNAME
                    サインインに使用するユーザー名。
            AZURE_PASSWORD
                    サインインに使用するパスワード。

    AzureリソースのマネージドID形式

            マネージドID形式に資格情報は必要ありません。
            アプリケーションは、マネージドIDを使用するように構成
            されたAzureリソースで実行されている必要があります。
            詳細については「Managed identities for Azure resources」を
            参照してください。

    既定のAzureパブリッククラウド以外のクラウドまたは管理エンドポイントに接続するには、次の環境変数を設定します。例えば、Azure Stack、別の地域のクラウド、または従来のデプロイモデルを使用している場合です。

            AZURE_ENVIRONMENT
                    接続するクラウド環境の名前。
            AZURE_AD_RESOURCE
                    接続時に使用するActive DirectoryリソースID。
                    管理エンドポイントへのURIとして使用します。

    Goコードでは、NewAuthorizerFromEnvironment関数を呼び出してオーソライザーオブジェクトを取得します。このオブジェクトは、クライアントのAuthorizerプロパティで設定され、Azureへのアクセスを許可します。

            import "github.com/Azure/go-autorest/autorest/azure/auth"
            authorizer, err := auth.NewAuthorizerFromEnvironment()

    Azure Stackでの認証


    Azure Stackで認証するには、次の環境変数を設定する必要があります。

            AZURE_AD_ENDPOINT
                    Active Directoryエンドポイント。
            AZURE_AD_RESOURCE
                    Active DirectoryリソースID。

    これらの環境変数は、Azure Stackメタデータ情報から取得できます。メタデータを取得するには、Azure Stack環境でWebブラウザーを開き、次のURLを使用します:(ResourceManagerURL)/metadata/endpoints?api-version=1.0

    ResourceManagerURLは、Azure Stackデプロイメントのリージョン名、マシン名、および外部の完全修飾ドメイン名(FQDN)によって異なります。

            開発キット
                    https://management.local.azurestack.external/
            統合システム
                    https://management.(region).ext-(machine-name).(FQDN)

    Azure StackでAzure SDK for Goを使用する方法の詳細については「Use API version profiles with Go in Azure Stack」を参照してください。

    ファイルベース方式を使用する


    ファイルベース方式では、Azure CLIによって生成されたファイル形式を使用します。--sdk-authパラメータを使用して新しいサービスプリンシパルを作成するときに、このファイルを簡単に作成できます。CLIはstdoutに出力するため、出力をファイルにリダイレクトします。

            az ad sp create-for-rbac --sdk-auth > azure.auth

    AZURE_AUTH_LOCATION環境変数を、許可ファイルが配置されている場所に設定します。この環境変数はアプリケーションによって読み取られ、その中の資格情報が解析されます。実行時に認証ファイルを選択する必要がある場合は、os.Setenvhttps://golang.org/pkg/os/#Setenv関数を使用してプログラムの環境を操作します。

    認証情報を読み込むには、NewAuthorizerFromFile関数を呼び出します。環境ベース方式とは異なり、ファイルベース方式にはリソースエンドポイントが必要です。

            import "github.com/Azure/go-autorest/autorest/azure/auth"
            authorizer, err := NewAuthorizerFromFile(azure.PublicCloud.ResourceManagerEndpoint)

    サービスプリンシパルの使用とアクセス許可の管理の詳細については「Create a service principal with Azure CLI」を参照してください。

    デバイストークン方式を使用する


    ユーザーにインタラクティブにサインインさせる場合は、デバイストークン方式が最適です。ユーザーにトークンを渡してMicrosoftサインインサイトに貼り付け、Azure Active Directory(AAD)アカウントで認証します。この認証方式は、標準のユーザー名/パスワード方式とは異なり、多要素認証が有効になっているアカウントをサポートします。

    NewDeviceFlowConfig関数を使用してDeviceFlowConfigオーソライザーを作成します。結果のオブジェクトでAuthorizerを呼び出して、認証プロセスを開始します。デバイスフロー認証は、認証フロー全体が完了するまでプログラムの実行をブロックします。

            import "github.com/Azure/go-autorest/autorest/azure/auth"
            deviceConfig := auth.NewDeviceFlowConfig(applicationID, tenantID)
            authorizer, err := deviceConfig.Authorizer()

    認証クライアントを使用する


    特定の形式の認証が必要で、プログラムがユーザーからの認証情報を読み込んで処理を進める場合は、auth.AuthorizerConfigインターフェースに準拠する任意のクライアントを使用できます。次の場合は、このインターフェースを実装する型を使用します。

    • インタラクティブなプログラムを書く
    • 専用の構成ファイルを使用する
    • 用意されている認証形式では対応できない要件である

    【警告】Azure資格情報をアプリケーションにハードコードしないでください。アプリケーションのバイナリーにシークレットを入れると、アプリケーションが実行されているかどうかにかかわらず、攻撃者がシークレットを簡単に抽出できます。これにより、資格情報が承認されているすべてのAzureリソースが危険にさらされます。

    次の表に、AuthorizerConfigインターフェースに準拠するSDKの形式を示します。

            証明書ベース形式
                    ClientCertificateConfig
            クライアント資格情報形式
                    ClientCredentialsConfig
            AzureリソースのマネージドID形式
                    MSIConfig
            ユーザー名/パスワード形式
                    UsernamePasswordConfig

    関連付けられたNew関数を使用してオーセンティケーターを作成し、結果のオブジェクトに対してAuthorizeを呼び出して認証します。たとえば、証明書ベース形式を使用するには次のようになります:

            import "github.com/Azure/go-autorest/autorest/azure/auth"
            certificateAuthorizer := auth.NewClientCertificateConfig(certificatePath, certificatePassword, clientID, tenantID)
            authorizerToken, err := certificateAuthorizer.Authorize()

    2020年5月1日金曜日

    Goで月末日の時は増加減した月の月末日を返す

    GoのtimeパッケージのAddDate()関数ですが、例えば10月31日に1ヶ月を足すと11月31日となりDateの正規化によって12月1日になります。

    package main
    
    import (
            "fmt"
            "time"
    )
    
    func main() {
            t := time.Date(2019, 10, 31, 0, 0, 0, 0, time.Local)
            fmt.Println(t)
            fmt.Println(t.AddDate(0, 1, 0), "(Add 1 month)")
    }
    

    実行結果

    2019-10-31 00:00:00 +0000 UTC
    2019-12-01 00:00:00 +0000 UTC (Add 1 month)

    そこで、月末日の時は増減した月の月末日、すなわち、10月31日に1ヶ月を足すと11月30日となる関数「AddMonth()」を考えてみました。(注意:横スクロールしてください)
    package main
    
    import (
            "fmt"
            "time"
    )
    
    // AddMonth returns the time corresponding to adding the
    // given number of months to t.
    // For example, AddMonth(t, 2) applied to January 1, 2011
    // (= t) returns March 1, 2011.
    //
    // AddMonth does not normalize its result in the same way
    // that Date does, so, for example, adding one month to
    // October 31 yields November 30.
    func AddMonth(t time.Time, months int) time.Time {
            lastMonthDay := func(t time.Time) int {
                    return time.Date(t.Year(), t.Month()+1, 1, 0, 0, 0, 0, t.Location()).AddDate(0, 0, -1).Day()
            }
    
            // Creating 1st Date from t and adding months because AddDate() normalizes t.
            am := time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, t.Location()).AddDate(0, months, 0)
            ad := lastMonthDay(am)
    
            if ld := lastMonthDay(t); t.Day() == ld || t.Day() > ad {
                    return time.Date(am.Year(), am.Month(), ad, am.Hour(), am.Minute(), am.Second(), am.Nanosecond(), am.Location())
            }
    
            return t.AddDate(0, months, 0)
    }
    
    func main() {
            cnt := 14
    
            fmt.Println("First Days")
            ft := time.Date(2020, 2, 1, 0, 0, 0, 0, time.Local)
            for i := -cnt; i <= -1; i++ {
                    fmt.Println(AddMonth(ft, i), "(Add", i, "month)")
            }
            fmt.Println(ft)
            for i := 1; i <= cnt; i++ {
                    fmt.Println(AddMonth(ft, i), "(Add", i, "month)")
            }
    
            fmt.Println()
    
            fmt.Println("Last Days")
            lt := time.Date(2020, 2, 29, 0, 0, 0, 0, time.Local)
            for i := -cnt; i <= -1; i++ {
                    fmt.Println(AddMonth(lt, i), "(Add", i, "month)")
            }
            fmt.Println(lt)
            for i := 1; i <= cnt; i++ {
                    fmt.Println(AddMonth(lt, i), "(Add", i, "month)")
            }
    }
    

    実行結果

    First Days
    2018-12-01 00:00:00 +0000 UTC (Add -14 month)
    2019-01-01 00:00:00 +0000 UTC (Add -13 month)
    2019-02-01 00:00:00 +0000 UTC (Add -12 month)
    2019-03-01 00:00:00 +0000 UTC (Add -11 month)
    2019-04-01 00:00:00 +0000 UTC (Add -10 month)
    2019-05-01 00:00:00 +0000 UTC (Add -9 month)
    2019-06-01 00:00:00 +0000 UTC (Add -8 month)
    2019-07-01 00:00:00 +0000 UTC (Add -7 month)
    2019-08-01 00:00:00 +0000 UTC (Add -6 month)
    2019-09-01 00:00:00 +0000 UTC (Add -5 month)
    2019-10-01 00:00:00 +0000 UTC (Add -4 month)
    2019-11-01 00:00:00 +0000 UTC (Add -3 month)
    2019-12-01 00:00:00 +0000 UTC (Add -2 month)
    2020-01-01 00:00:00 +0000 UTC (Add -1 month)
    2020-02-01 00:00:00 +0000 UTC
    2020-03-01 00:00:00 +0000 UTC (Add 1 month)
    2020-04-01 00:00:00 +0000 UTC (Add 2 month)
    2020-05-01 00:00:00 +0000 UTC (Add 3 month)
    2020-06-01 00:00:00 +0000 UTC (Add 4 month)
    2020-07-01 00:00:00 +0000 UTC (Add 5 month)
    2020-08-01 00:00:00 +0000 UTC (Add 6 month)
    2020-09-01 00:00:00 +0000 UTC (Add 7 month)
    2020-10-01 00:00:00 +0000 UTC (Add 8 month)
    2020-11-01 00:00:00 +0000 UTC (Add 9 month)
    2020-12-01 00:00:00 +0000 UTC (Add 10 month)
    2021-01-01 00:00:00 +0000 UTC (Add 11 month)
    2021-02-01 00:00:00 +0000 UTC (Add 12 month)
    2021-03-01 00:00:00 +0000 UTC (Add 13 month)
    2021-04-01 00:00:00 +0000 UTC (Add 14 month)
    
    Last Days
    2018-12-31 00:00:00 +0000 UTC (Add -14 month)
    2019-01-31 00:00:00 +0000 UTC (Add -13 month)
    2019-02-28 00:00:00 +0000 UTC (Add -12 month)
    2019-03-31 00:00:00 +0000 UTC (Add -11 month)
    2019-04-30 00:00:00 +0000 UTC (Add -10 month)
    2019-05-31 00:00:00 +0000 UTC (Add -9 month)
    2019-06-30 00:00:00 +0000 UTC (Add -8 month)
    2019-07-31 00:00:00 +0000 UTC (Add -7 month)
    2019-08-31 00:00:00 +0000 UTC (Add -6 month)
    2019-09-30 00:00:00 +0000 UTC (Add -5 month)
    2019-10-31 00:00:00 +0000 UTC (Add -4 month)
    2019-11-30 00:00:00 +0000 UTC (Add -3 month)
    2019-12-31 00:00:00 +0000 UTC (Add -2 month)
    2020-01-31 00:00:00 +0000 UTC (Add -1 month)
    2020-02-29 00:00:00 +0000 UTC
    2020-03-31 00:00:00 +0000 UTC (Add 1 month)
    2020-04-30 00:00:00 +0000 UTC (Add 2 month)
    2020-05-31 00:00:00 +0000 UTC (Add 3 month)
    2020-06-30 00:00:00 +0000 UTC (Add 4 month)
    2020-07-31 00:00:00 +0000 UTC (Add 5 month)
    2020-08-31 00:00:00 +0000 UTC (Add 6 month)
    2020-09-30 00:00:00 +0000 UTC (Add 7 month)
    2020-10-31 00:00:00 +0000 UTC (Add 8 month)
    2020-11-30 00:00:00 +0000 UTC (Add 9 month)
    2020-12-31 00:00:00 +0000 UTC (Add 10 month)
    2021-01-31 00:00:00 +0000 UTC (Add 11 month)
    2021-02-28 00:00:00 +0000 UTC (Add 12 month)
    2021-03-31 00:00:00 +0000 UTC (Add 13 month)
    2021-04-30 00:00:00 +0000 UTC (Add 14 month)
    

    月末日に関しては、12ヶ月の月末日の並びから

            ...,31|31,28&29,31,30,31,30,31,31,30,31,30,31|31,...

    30日が連続することがないことを考慮して、以下のケースで動作確認しました。(基:基準日の月末日)

            -1 基 +1
            -- -- --
            31,28,31
            31,29,31
            31,30,31
            28,31,30
            29,31,30
            30,31,30
            30,31,31
            31,31,28
            31,31,29
            31,31,30

    例)基準日が2019年2月28日で前後2ヶ月の月末日を出力するmain()関数内のコード。

            tl := time.Date(2019, 2, 28, 0, 0, 0, 0, time.Local)
            fmt.Println(AddMonth(tl, -2), "(Add -2 month)")
            fmt.Println(AddMonth(tl, -1), "(Add -1 month)")
            fmt.Println(tl)
            fmt.Println(AddMonth(tl, 1), "(Add 1 month)")
            fmt.Println(AddMonth(tl, 2), "(Add 2 month)")

    2020.05.02 11月30日の時に-1ヶ月すると10月31日ではなく10月30日になっていた不具合を修正しました。

    2020.05.03 2020年3月31日の時に-1ヶ月すると2月29日ではなく3月1日になっていた不具合を修正しました。

    2020年4月29日水曜日

    GoでSubversionからパッケージをgo getして実行する(自マシン内完結型)

    社内や個人でSubversionを使ってGoコードを管理しているGopherには朗報!?Go 1.14から、goコマンドはmoduleモードでSubversionリポジトリーをサポートしました。

    しかしながら、具体的な手順がなかなか見つかりませんでした。そこで「自マシン内のSubversionサーバーに登録されたGoの外部パッケージを、自マシン内で取得して実行する」ことを色々と目標に試してみました。実際に動作した時は心の中でガッツポーツ!q@w@p

    Subversionサーバーの構築

    自マシンに「Subversion」と「Apache HTTP Server」をインストールします。

    Apache HTTP Serverには、Subversionと連動してHTTP/HTTPS通信でアクセスできる仕組みが用意されています。

    今回は、諸事情によりno_ssl版のためHTTP通信でアクセスした場合の内容となっています。openssl版&HTTPS通信であればスマートに進められるはずです。

    ちなみに、Subversionからの外部パッケージの取得には、svnコマンドが使用されます。

    本筋ではないため、具体的なインストールやセットアップについては割愛します。

    Subversionリポジトリーの作成

    svnadmin createコマンドで新規リポジトリーを作成します。

    リポジトリー内に、branches/、tags/、trunk/、の定番ディレクトリーを作成します。

    ここでは以下のパス構成を想定しています。

    svn://127.0.0.1/go/trunk/src/

    本筋ではないため、具体的な手順は割愛します。

    GOPROXYとGOSUMDBの無効化

    今回は、諸事情により外部へのインターネット接続が制限されているため、moduleに関する2つの環境変数の値を無効化します。

    GOPROXYとGOSUMDBの初期値を確認します。

    $ go env GOPROXY
    https://proxy.golang.org,direct

    $ go env GOSUMDB
    sum.golang.org

    GOPROXYとGOSUMDBに無効値を設定します。

    $ go env -w GOPROXY=direct
    $ go env -w GOSUMDB=off

    GOPATH上への移動

    以降、GOPATH上で作業します。GOPATHは以下のコマンドで確認できます。

    $ go env GOPATH

    外部パッケージをSubversionに登録

    外部パッケージとして、Add()関数を持つcalcパッケージを用意します。

    calc/ディレクトリーを作成します。

    $ mkdir calc

    calc/ディレクトリー内に移動します。

    $ cd calc

    modの初期化を行います。

    $ go mod init

    作成されたgo.modファイルのmodule行をURLパスに修正します。

    修正前:

    module calc

    go 1.14

    修正後:

    module 127.0.0.1/svn/go/trunk/src/calc.svn

    go 1.14

    calc.goを作成します。

    $ vim calc.go

    package calc

    func Add(x, y int) int {
    return x + y
    }

    calc/ディレクトリーをSubversionにチェックインします。
    # 私はsvnコマンドではなく、Eclipseでチェックインしています m(__)m

    svn://127.0.0.1/go/trunk/src/
    |
    +--calc/
       |
       +--calc.go
       +--go.mod

    メイン パッケージの作成

    test/ディレクトリーを作成します。

    $ mkdir test

    test/ディレクトリー内に移動します。

    $ cd test

    modの初期化を行います。

    $ go mod init

    main.goファイルを作成します。

    $ vim main.go

    package main

    import (
    "fmt"

    calc "127.0.0.1/svn/go/trunk/src/calc.svn"
    )

    func main() {
    fmt.Println(calc.Add(1, 2))
    }

    外部パッケージURLのホストが自マシンの場合、IPアドレス(ここでは127.0.0.1)で指定します。localhostで指定すると「import path does not begin with hostname」エラーになります。

    通常でしたら、ここでmain.goファイルを実行します。

    $ go run main.go

    この時、import句の"127.0.0.1/svn/go/trunk/src/calc.svn"にHTTPS通信でアクセスして自動で外部パッケージが取得されます。

    https://127.0.0.1/svn/go/trunk/src/calc.svn?go-get=1

    しかし、今回はHTTP通信のためエラーとなります。そのため、go getコマンドを実行して手動で外部パッケージを取得します。

    通常、go getするURLにはHTTPS通信でアクセスします。

    $ go get 127.0.0.1/svn/go/trunk/src/calc.svn

    今回はHTTP通信のため、-insecure オプションを付けてgo getします。

    $ go get -insecure 127.0.0.1/svn/go/trunk/src/calc.svn

    main.goファイルを実行すると、外部パッケージ「calc」のAdd(1, 2)が実行されて、結果の3が標準出力されます!

    $ go run main.go
    3

    メイン パッケージのモジュール情報

    go.sumファイルが作成されます。

    $ vim -R go.sum

    127.0.0.1/svn/go/trunk/src/calc.svn v0.0.0-YYYYMMDD... h1:...=
    127.0.0.1/svn/go/trunk/src/calc.svn v0.0.0-YYYYMMDD.../go.mod h1:...=

    go.modファイルに外部パッケージが追加されます。

    $ vim -R go.mod

    module test

    go 1.14

    require 127.0.0.1/svn/go/trunk/src/calc.svn v0.0.0-YYYYMMDD... // indirect

    気づいた点など

    go getではデフォルトでHTTPS通信が行われています。
    →Subversionと連動させるApache HTTP Serverはopenssl版を使いましょう。

    Subversionの外部パッケージURLの最後には「.svn」が必要です。
    →GihHub経由に慣れていると、なかなか気付けない。

    import句にて、Subversion経由の外部パッケージには別名を付けて使用します。
    →本ページでは"127.0.0.1/svn/go/trunk/src/calc.svn"にcalcと別名付けています。

    関連するGoのソースコード
    →使われているsvnコマンドの引数とかがわかります。

    2020年4月26日日曜日

    Azure SDK for Goを使う上での開発者向けツール

    Azure SDK for Go documentation」サイトの「Tools for developers using the Azure SDK for Go」ページを読み進めました。

    本セクションでは、Azure SDK for Goを使用する上でGoコードを効率的に記述したりAzureサービスとシームレスに連携したりする開発者向けツールが紹介されています。

    ここでは、対象ページの内容をベースとして、私なりの解説を加えてみます。

    Azure CLI

    AzureにはAPIを操作する方法として、WebブラウザーでログインしてのGUI操作、Azure SDKを使ってのコード操作の他に、Azure CLIによるコマンドライン操作が用意されています。


    Azure CLIは az コマンドで操作を行い、Windowsは実行バイナリーで、macOSとLinuxはPython 3スクリプトでインストールされます。またDockerやAzure Cloud shellでも実行可能です。

    CLIのメリットは、コマンドライン上で他のコマンドと組み合わせて一連の処理をスクリプト化して実行できる柔軟性の良さが挙げられます。

    個人的には、Goのマルチプラットフォーム向けに処理速度の良さも含めた実行バイナリーを提供できるメリットを生かして「Azure CLIこそGoで!」と思うのですが、如何でしょうか?(Google社のパブリッククラウド「Google Cloud Platform」のCLIツールであるgcloudコマンドにも同様に思うところ)

    Visual Studio Code

    Visual Studio Code(以下、vscode)は、Microsoft社が提供しているオープンソースのコードエディターで、エクステンション(いわゆるプラグイン)をインストールすることで機能拡張でき、オートコンプリート、実装テンプレート、リファクタリング、デバッグなどの機能が追加されます。


    Goコードを効率的にコーディングするためのエクステンションとして「ms-vscode.Go」がMicrosoft社員にて開発&サポートされており、デバッガーとして「delve」が対応しています。


    2015年11月のvscodeのベータ版の公開時にms-vscode.Goも紹介され、当時はGopherとして「Microsoft社がGoへの取り組みもしっかり行なっている!」と感動しました。


    本セクションでは、Azure サービスと連携するためのエクステンションがまとめられた「Azure Extension Pack」も紹介されていますが、


    リンク先のエクステンション提供サイト「Marketplace」では非公開(unpublished)になっているため、今後は個々のAzureサービス用のエクステンションをインストールして使用することになります。

    Azure DevOps プロジェクトでのCI/CD

    Azure上にデプロイしているGoアプリケーションを継続的インティグレーション/継続的デリバリー(CI/CD:Continuous Integration/Continuous Delivery)するには、Azure DevOps Project パイプラインを使用します。これにより、gitリポジトリー上のGoアプリケーションのソースコードを直接Azureにデプロイしてテストすることができます。


    depによる依存関係管理

    Azure SDK for Goは、パッケージ(ライブラリー)の依存関係管理にdepを使用しています。


    depはGoでパッケージ依存管理を行うためのプロジェクトとしてスタートしました。現在のGo本体には、これらの成果を反映した「Go Modules」が実装されています。Go Moludesの採用によりdepの開発も収束しており、今後はAzure SDK for GoもGo Modules化が進むと思われます。

    2020年3月29日日曜日

    「autorest」および「go-autorest」とは?

    Azure SDK for Go documentation」サイトの「Install the Azure SDK for Go」ページを読み進めています。

    Include the Azure SDK for Go in your project」セクションにて、GoでAzure サービスを使うには Azure/azure-sdk-for-go とは別に Azure/go-autorest もインポートする必要があるとの記述がありましたので、autorestについて少し調べてみました。

    ちなみに Azure/go-autorest は Azure/azure-sdk-for-go をgo getした時に一緒にダウンロードされます。

    • go get -u -d github.com/Azure/azure-sdk-for-go/...

    AzureのREST API

    AzureにはREST APIが用意されており、各プログラミング言語はAzure SDKで用意されているHTTPクライアントを通じてこのAPIにアクセスし、Azureとの連携を図ります。

    AzureのREST API 仕様はOpen API 仕様 形式で書かれており、また、公開されています。


    Azure SDKで用意されているHTTPクライアントは、この仕様書をautorestに読み込ませて自動作成されています。

    Azure/autorest

    autorestは、Microsoft社が開発している汎用(Azure専用ではない)オープンソースのツールで、Open API 仕様 形式を読み込んでRESTful Webサービスにアクセスするクライアント ライブラリーを生成します。

    OpenAPI 3.0をサポートしており、PowerShall、C#、Python、Java、TypeScript、Ruby、そしてGoのHTTPクライアント ライブラリーを生成できます。

    Azure/go-autorest

    go-autorestは、autorestで作成されたAzure SDK for Goのクライアント ライブラリーに対して、ゴルーチンを使ってHTTPリクエストを並列処理できる機能を追加するパッケージで、

    • Azure Active Directory 認証 ライブラリー (autorest/adal)
    • 日付型を正確にパースするパッケージ (autorest/date)
    • 型アサーション(autorest/to)
    • モック (autorest/mock)
    • バリデーション (autorest/validation)
    • ロガー (logger)

    なども含まれています。

    例:autorest/adal(Active Directory Authentication Library

    クライアント サービスでは、毎回ログイン画面からログインするのはわずらわしいため、リソースを操作するためのアプケーション IDである「サービス プリンシパル」を作成してアクセスします。


    autorest/adal はサービス プリンシパルのトークンを扱うためのパッケージです。


    今回で「Azure SDK for Go のインストール / Install the Azure SDK for Go」ページを読み終えたことになります。

    P.S. これまで通りja-jpでアクセスしたのですが日本語ドキュメントが表示されなくなっていました... > Microsoftさん

    2020年3月20日金曜日

    「Azure SDK for Go」とは別の独自サービスパッケージ

    Azure SDK for Go のドキュメント」サイトの「Azure SDK for Go のインストール」ページを読み進みています。

    Azure SDK for Go を入手する」セクションにて、いくつかのAzure サービス用のパッケージは Azure/azure-sdk-for-go とは別に用意されているとの記述があり、それらは主にストレージ サービスとメッセージング サービスのパッケージです。

    ストレージ サービス

    File Storage(パッケージ:Azure/azure-storage-file-go

    • Azure上に構築されたSMB プロトコルのファイル共有システム。
    • 汎用 OS(Linux, macOS, Windows、など)でのファイル共有で使用。

    Blob Storage(パッケージ:Azure/azure-storage-blob-go

    • ファイルをBLOBで扱うストレージ。
    • 大量データの蓄積や操作(アーカイブ、ランダム アクセス、データ解析、など)

    Queue storage(パッケージ:Azure/azure-storage-queue-go

    • RESTでのテキストメッセージをキューイングする。
    • Service Busと比べてキューイング(格納)に重きが置かれている。

    Table storage(パッケージ:なし)

    • 分散Key-Valueストア。

    メッセージング サービス

    Service Bus(パッケージ:Azure/azure-service-bus-go

    • TCP プロトコルのメッセージをキューイングしたりPub/Subで処理する。
    • Queue Storageと比べてメッセージングに重きが置かれている。

    Event Hubs(パッケージ:Azure/azure-event-hubs-go

    • HTTPS/AMQP/Kafka プロトコルの大量のイベントを受け取って、Kafka プロトコルに対応したサービスに振り分ける。
    • ビッグ データ向け。

    Event Grid(パッケージ:なし)

    • 対応したAzure サービスからのイベントを受け取って、対応したAzure サービスに振り分ける。

    サービスのパッケージが分家する動きは、Azure SDK for Goがベータ版だった時からあり、最初はストレージでした。

    2020年3月15日日曜日

    「Azure Stack」とは?

    Azure SDK for Go のドキュメント」サイトの「Azure SDK for Go のインストール」ページの「Azure SDK for Go を入手する」セクションにて、Azure SDK for GoはGo 1.8以上をサポートしているが、Azure Stack環境だとGo 1.9以上が必要だと書かれてあります。

    Azure Stack」は初めて見聞きするサービス名なので少し調べました。

    Azure Stackは、グローバル Azureを利用できない企業などがオンプレミス環境で利用できる様にしたAzureの拡張機能です。

    自社内にMicrosoft 認定 ハードウェア パートナーから提供されたAzure Stackをセットアップした物理 サーバーを構えることで、オンプレミスで利用したりグローバル Azureと連携させたりできます。

    Azure Stackには3つの製品ファミリーがあります。

    Azure Stack Hub

    • 仮想マシン、Webアプリ&関数、コンテナーなどを実行するサーバー製品。
    • 運用はオンプレミスで、グローバル Azureとの連携も可能。

    Azure Stack Edge

    • 主にAI/ML向けでFPGAが組み込まれた1Uラックマウント型サーバー製品。
    • 処理したデータはネットワーク経由でグローバル Azureに転送。

    Azure Stack HCI

    • Azure HCIを採用したサーバー製品。
    • サービスは仮想マシンとして実行してグローバル Azureと連携する。

    個人的には、自社でサーバー用 Azureがインストールされた物理 サーバーを購入して運用するソリューション サービスだと解釈しました。

    【用語の補足】

    • グローバル Azure:パブリック クラウド版 Azureのこと
    • オンプレミス (on-premise):自社内にハードウェアやソフトウェアを構築して情報システムを運用する形態。
    • HCI (Hyper Converged Infrastructure):CPU処理、ストレージ、ネットワークを仮想化して統合した基盤

    2020年3月12日木曜日

    「Azure SDK for Go」とは?

    Azure SDK for Goは、マイクロソフト社のパブリッククラウド「Azure」をGoでコーディングして扱うためのSDK(ソフトウェア開発キット)です。

    Apache License 2.0ライセンスのオープンソースソフトウェアであり、GitHub上で管理および開発されています。


    最初のコミットは2014年8月11日で、2016年、2017年とベータ期間を経て、2018年2月12日のv14.0.0で正式リリースとなりました。


    おおよそ毎月末にメジャーバージョンのアップデートが行われます。

    現在では、日本語ドキュメントも公開され、サポートされるAzureサービスも増えています。


    当時、他のプログラミング言語のSDKやドキュメントが出揃っていた中、Goだけがなかなか正式リリースされずヤキモキしたり、ベータ期間中にストレージ系のパッケージが本家から出たり戻ったりしていたのを眺めていたも良い思い出です。

    まずは「Azure/azure-sdk-for-go」の README.md や「Go 開発者向けの Azure」のドキュメントを読み進め、どんなものなのか?何ができるのか?を見て行きます。

    2020年3月8日日曜日

    私の「AzureとGo」に関する発表資料

    Azure SDK for Goウォッチャー(?)として、過去3回「AzureとGo」に関する発表資料を作成しました。

    タイトル:Microsoft × Go
    イベント:2016年2月20日(土) [岡山] Okayama ComCamp 2016 powered by MVPs
    概要説明:マイクロソフト社の組織や製品とGoの関係について、通常セッションで発表させて頂いた「発表済」作品です。



    タイトル:Microsoft Azure for Go
    イベント:2017年3月25日(土) [東京] Go Conference 2017 Spring
    概要説明:AzureでのGoの使われ処について通常セッションで申し込みましたが、残念ながら落選した「未発表」作品です。



    タイトル:Just Azure Using Go (7 items)
    イベント:2017年9月9日(土) [東京] JAZUG 7周年総会
    概要説明:AzureとGoの関係についてLTセッションで申し込んでいましたが、病欠で不参加となった「未発表」作品です。



    1勝2負で負け越し中。マイクロソフトさん、イベントでGoの発表をさせてください!q@w@p

    2020年は「Azure SDK for Go」をまったりと

    「Azure SDK for Go」は、2015年にその存在を知り、2016年から本格的に、まったりとウォッチしてきました。


    2019年からは、Goのクラウド開発キット「Go CDK」でもAzureがサポートされました。


    2020年、英語や日本語を問わず、相変わらず情報量は少ないです。

    そのため、2020年は「Azure SDK for Go」をまったりと触って行こうと思います。

    触った内容については、本ブログやQiitaなどでアウトプットしていきます。

    ハッシュタグやラベルとして「azuregojp」を使います。

    2020年3月1日のツイート: