kakakakakku blog

Weekly Tech Blog: Keep on Learning!

VS Code 拡張機能を実装する第一歩を踏み出すために「Get Started: Your First Extension」を試した

「VS Code 拡張機能」ってどう実装するんだろう.最近 VS Code を使う場面が多いため,便利な拡張機能にコントリビュートしたり,自分用に拡張機能を作ったりする機会もありそう.さらに今まで TypeScript をほとんど書いたことがなく,書く機会を探していたという側面もある.今回は VS Code ドキュメントに載っている「Get Started: Your First Extension」を試してみた.

code.visualstudio.com

雛形を自動生成する

まず,Yeoman を使って雛形となる「Hello World Sample」を自動生成する.今回はドキュメントの通りに TypeScriptHelloWorld という名前の「VS Code 拡張機能」を作ることにした.

$ npm install -g yo generator-code

$ yo code

     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------´   │        generator!
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? What type of extension do you want to create? New Extension (TypeScript)
? What's the name of your extension? HelloWorld
? What's the identifier of your extension? helloworld
? What's the description of your extension?
? Initialize a git repository? Yes
? Which package manager to use? npm

自動生成したディレクトリ階層は以下のようになる.

$ tree -L 1
.
├── CHANGELOG.md
├── README.md
├── node_modules
├── out
├── package-lock.json
├── package.json
├── src
├── tsconfig.json
├── tslint.json
└── vsc-extension-quickstart.md

3 directories, 7 files

Extension Development Host ウィンドウ

VS Code で helloworld ディレクトリを開き,さっそく F5 を押すと,拡張機能の動作確認をする「Extension Development Host ウィンドウ」が起動する.次に「コマンドパレット」から「Hello World」を選択すると,画面右下にメッセージが表示される.おおおー!

f:id:kakku22:20190803170008p:plain

src/extension.ts を修正する

src/extension.ts を開くと,画面右下にメッセージを表示する実装を確認できる.

vscode.window.showInformationMessage('Hello World!');

以下のように文字列部分を修正すると,実際に反映された.

vscode.window.showInformationMessage('Hello VS Code!');

ドキュメントに「現在時刻を表示してみよう!」という追加課題もあり,実際に書いてみた.おおおー!

vscode.window.showInformationMessage(new Date().toString());

f:id:kakku22:20190803183523p:plain

拡張機能をデバッグする

VS Code のデバッグ機能を使うと,簡単にステップ実行もできる.これは便利!

f:id:kakku22:20190803224143p:plain

「Get Started: Your First Extension」の内容はここまでとなり,あくまで第一歩ではあるけど,拡張機能をどのように実装し,デバッグするのかを知ることができた点で,非常に価値があった.続くドキュメント「Extension Anatomy」も合わせて読んでおくと良いと思う.

code.visualstudio.com

Contribution Points : contributes.commands

作成した HelloWorld をもう少し変えていく.今回は以下のドキュメント「Contribution Points」を読みながら試してみた.

code.visualstudio.com

package.json の中に定義されている contributes.commandscategory を追加すると,「コマンドパレット」からコマンドを検索するときにカテゴリー表示(カテゴリ名: コマンド名)となる.確かによく使う拡張機能は全部カテゴリー表示になっている.

{
    (中略)
    "contributes": {
        "commands": [
            {
                "command": "extension.helloWorld",
                "title": "Hello World",
                "category": "Hello"
            }
        ]
    },
    (中略)
}

f:id:kakku22:20190803230409p:plain

vscode-extension-samples

以下の GitHub リポジトリに VS Code 拡張機能のサンプルが多く公開されている.今回作成した「Hello World Sample」helloworld-sample ディレクトリにある.他のサンプルを動かしながら拡張機能でできることを把握したり,実装例を確認したり,よく見るリポジトリになりそう.

github.com

まとめ

  • 「VS Code 拡張機能」を実装する第一歩を踏み出してみた
  • 最初は VS Code ドキュメントに載っている「Get Started: Your First Extension」を参考にすると良さそう
  • 今後はサンプル集などを参考に理解を深めていく
  • ブログ関連の拡張機能を作ってみるかなぁー!

アジャイル開発の基礎知識を問う「アジャイルソフトウエア開発技術者検定試験 Lv.1」に合格した

昨日「アジャイルソフトウエア開発技術者検定試験 Lv.1」に合格した.試験問題に関係する内容は NDA を厳守するため書かず,今回は「試験紹介(普及のため!)」にフォーカスする.正直言って,まだまだ知られていない資格だと思う.また,あくまで理解度を証明する「資格」であるため,合格したらすぐにアジャイル開発を実践できるという意味ではなく,あくまでマインドセットを合わせられる程度だとは思う.とは言え,個人的には「アジャイル開発を知る第一歩として」なら価値があるように思う.

agilecert.org

僕自身はアジャイル開発の経験(スクラムマスター含む)が4年ほどあり,さらに「認定スクラムマスター (CSM : Certified ScrumMaster)」も取得しているため,試験対策はほとんどせず,移動時間に試験対策本を Kindle でザッと流し読みした程度となる.試験対策本らしく体系的に書かれていて,入門書としても良いと思う.

アジャイル検定公式テキスト アジャイルソフトウエア開発技術者検定試験 レベル1対応

アジャイル検定公式テキスト アジャイルソフトウエア開発技術者検定試験 レベル1対応

  • 作者: アジャイルソフトウエア開発技術者検定試験コンソーシアム
  • 出版社/メーカー: リックテレコム
  • 発売日: 2017/02/15
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (1件) を見る

アジャイルソフトウエア開発技術者検定試験とは?

「アジャイルソフトウエア開発技術者検定試験(アジャイル検定)」「アジャイルソフトウエア開発技術者検定試験コンソーシアム」が運営している試験で,現在は「Lv.1」「Lv.2」が提供されている.特に「Lv.2」に関しては,今年6月に受験できるようになった新試験となる.近々「Lv.2」も受験してみようと思っている.

試験概要

「アジャイルソフトウエア開発技術者検定試験」の試験概要を公式サイトを引用しながら紹介する.試験は「プロメトリック」で受験する.会場ごとに受験可能日が異なり,予約が取れれば希望日に受験できる.料金は10800円となる.僕は今回慣れた「渋谷会場」で受験した.問題数は「60問」となり,合格ラインが「80%」と公開されているため,単純計算で「48問正解」がボーダーラインとなる.

  • 問題数 : 60問(四肢択一)
  • 試験時間 : 60分
  • 合格ライン : 正解率 80%以上

試験範囲

  • アジャイル開発に対する基礎知識
    • アジャイル・マニフェスト
    • アジャイル原則
  • 開発チームの運営
    • コミュニケーション
    • 自律性と協調
    • ルール
    • 振り返り
  • アジャイル開発プロジェクト管理
    • 会議体
    • ロール(役割)
    • 反復
    • ドキュメント
    • チーム編成
    • 計画
    • 見積り
    • ビジョン
    • 品質
  • アジャイル開発の技能
    • ペアプログラミング
    • リファクタリング
    • 常時結合
    • テスト駆動開発

試験対策

試験対策本以外だと,やはり「アジャイルソフトウェア開発宣言」「アジャイル宣言の背後にある原則」を繰り返し読む.

他は試験対策本に参考文献として載っているアジャイル関連の名著を合わせて読むと効果的だと思う.例えば「アジャイルサムライ」「エクストリームプログラミング」「アジャイルレトロスペクティブズ」など.スクラム関連の名著も多く参考文献に載っているけど,本試験は「アジャイル開発」全般をテーマにするため,スクラム用語は出てこなく,個人的には戸惑う場面もあった.

アジャイルサムライ−達人開発者への道−

アジャイルサムライ−達人開発者への道−

  • 作者: Jonathan Rasmusson,西村直人,角谷信太郎,近藤修平,角掛拓未
  • 出版社/メーカー: オーム社
  • 発売日: 2011/07/16
  • メディア: 単行本(ソフトカバー)
  • 購入: 42人 クリック: 1,991回
  • この商品を含むブログ (257件) を見る

エクストリームプログラミング

エクストリームプログラミング

アジャイルレトロスペクティブズ 強いチームを育てる「ふりかえり」の手引き

アジャイルレトロスペクティブズ 強いチームを育てる「ふりかえり」の手引き

試験結果レポート 🎉

試験を終えると,すぐに試験結果レポートが出る.満点合格できたら良いなぁーと考えていたけど,選択肢の日本語が微妙なものもあり,結果としては「93点」だった.単純計算だと4問間違えているらしく残念だった.どこを間違えたんだろう!

分野 正答率
基礎知識 88%
開発チームの運営 100%
プロジェクト管理 92%
開発技能 92%

まとめ

  • 「アジャイルソフトウエア開発技術者検定試験 Lv.1」に合格した
  • あくまで理解度を証明する「資格」であるため「アジャイル開発を知る第一歩として」なら価値があるように思う
  • 先月から受験できるようになった新試験「Lv.2」も近々受験してみようと思う

小ネタ : Scrum Alliance Certificant Directory

今回の試験とは直接関係ないけど,「認定スクラムマスター」など Scrum Alliance で認定されている場合,Certificant Directory で認定者を検索できる.例えば「Japan x Certified ScrumMaster」だと,既に4000人を超えている!案外知られてなく,小ネタとして紹介しておく.

nginx でリクエストを複製できるモジュール「ngx_http_mirror_module」

nginx でリクエストを複製できるモジュール「ngx_http_mirror_module」を使うと,簡易的な「Shadow Proxy」を構築することができる.例えば,本番環境のリクエストの一部を開発環境に流せるようになる.この「ngx_http_mirror_module」は nginx 1.13.4 で実装された機能で,2017年8月リリースなので,最近のバージョンだとデフォルトで使えるようになっている.今回は「リクエストの複製」を試すため,Docker Compose を使って検証環境を構築した.

nginx.org

検証環境

今回 Docker Compose を使って,nginx と Sinatra を起動する検証環境を構築した.コンテナは計3種類で,以下の構成図にまとめた.基本は FrontendBackend でリクエストを処理し,今回は Mirror にもリクエストを複製する構成にしている.ドキュメントにも記載されている通り,Mirror からのレスポンスは無視される仕様になっている.

  • Frontend (nginx)
  • Backend (Sinatra)
  • Mirror (Sinatra)

f:id:kakku22:20190722223752p:plain

特に設定はなく,すぐに docker-compose up で起動できるようにした.今回エンドポイントは Sinatra で //ping を実装している.なお,Docker Compose の設定などは GitHub に公開した.

$ docker-compose up

$ curl http://localhost
Hello, backend!

$ curl http://localhost/ping
Pong, backend!

github.com

Frontend (nginx)

ドキュメントを参考に nginx.confmirror を設定した.リクエストは proxy_passBackend に転送し,さらに複製されたリクエストは proxy_passMirror に転送される.ポイントは複製用の /mirror ロケーションを内部用にしておくことと,転送先の URL に $request_uri を追加する点で,ドキュメントにも記載されている.なお,デフォルトで mirror_request_bodyon になっているため body も転送される.

location / {
    mirror /mirror;
    proxy_pass http://backend;
}

location /mirror {
    internal;
    proxy_pass http://mirror$request_uri;
}

動作確認

さっそく //ping にリクエストを投げる.

$ curl http://localhost
Hello, backend!

$ curl http://localhost/ping
Pong, backend!

すると,Docker Compose のログに以下のようなアクセスログが出力される.今回 WEBrick のアクセスログは抑止しているため,nginx と Sinatra のアクセスログとなる.そして,期待通りに BackendMirror に転送されていることが確認できる.簡単にリクエストを複製できる「ngx_http_mirror_module」は便利だ!

mirror_1    | 172.22.0.4 - - [22/Jul/2019:13:17:44 +0000] "GET / HTTP/1.1" 200 14 0.0073
backend_1   | 172.22.0.4 - - [22/Jul/2019:13:17:44 +0000] "GET / HTTP/1.1" 200 15 0.0074
frontend_1  | 172.22.0.1 - - [22/Jul/2019:13:17:44 +0000] "GET / HTTP/1.1" 200 14 "-" "curl/7.54.0" "-"

backend_1   | 172.22.0.4 - - [22/Jul/2019:13:18:20 +0000] "GET /ping HTTP/1.1" 200 14 0.0071
mirror_1    | 172.22.0.4 - - [22/Jul/2019:13:18:20 +0000] "GET /ping HTTP/1.1" 200 14 0.0118
frontend_1  | 172.22.0.1 - - [22/Jul/2019:13:18:20 +0000] "GET /ping HTTP/1.1" 200 14 "-" "curl/7.54.0" "-"

nginx : resolver 127.0.0.11

検証中にうまくリクエストを Mirror に転送できず,nginx から出力される no resolver defined to resolve mirror というエラーに悩まされていた.実際に出力されていたエラーは以下となる.

frontend_1  | 2019/07/22 13:28:06 [error] 6#6: *3 no resolver defined to resolve mirror, client: 172.22.0.1, server: localhost, request: "GET / HTTP/1.1", subrequest: "/mirror", host: "localhost"
frontend_1  | 2019/07/22 13:28:11 [error] 6#6: *1 no resolver defined to resolve mirror, client: 172.22.0.1, server: localhost, request: "GET /ping HTTP/1.1", subrequest: "/mirror", host: "localhost"

調査したところ,Docker の Embedded DNS に関係していることに気付き,今回は nginx.confresolver を指定して解決をした.Embedded DNS の詳細は以下のドキュメントに載っている.正直結構ハマった!

server {
    (中略)
    resolver 127.0.0.11;
    (中略)
}

docs.docker.com

まとめ

nginx でリクエストを複製できるモジュール「ngx_http_mirror_module」を試した.簡易的な「Shadow Proxy」を構築することができる.今回は Docker Compose を使って検証環境を構築して,疎通確認をしたけど,トラフィックを増やした場合に複製による負荷がどの程度なのか,追加で検証してみたいと思う.

投票サービス「DirectPoll」を使ってイベントを盛り上げよう

最近イベント中に「参加者アンケート」を取得する必要があり,普段はお手軽に挙手をして頂くことも多いけど,より臨場感のある演出を検証するため,前から気になっていた投票サービス「DirectPoll」を試してみた.投票するとリアルタイムにグラフが更新されるため,とても盛り上がった.「DirectPoll」は無料で使えて,すごく便利なので,基本的な機能を紹介したいと思う.

directpoll.com

設定画面("Cockpit" と呼ぶ)

新規投票("Poll" と呼ぶ)を作る場合,"Cockpit" と呼ばれる設定画面にアクセスする.以下はブログ記事用のサンプルとして「よく使うプログラミング言語は?」という新規投票を作った.タイトルと選択肢を直感的に入力できるし,迷うことはなさそう.さらに右側に「SETTINGS」「QUESTION TYPE」があり,細かな設定もできるため,後述したいと思う.

f:id:kakku22:20190717213533p:plain

投票画面("Vote" と呼ぶ)

作成した新規投票を公開すると,以下のような "Vote" と呼ばれる投票画面にアクセスできるようになる.

f:id:kakku22:20190717214235p:plain

もし設定画面で「multiple choice」を有効化すると,以下のように複数項目に投票できるようになる.

f:id:kakku22:20190717214936p:plain

投票結果画面("Results" と呼ぶ)

実際に10件ほど投票し,"Results" と呼ばれる投票結果画面を表示すると,以下のようにシンプルなグラフで結果を確認することができる.投票するとリアルタイムにグラフが更新されるため,大人数であるほど臨場感が出る.大きなスクリーンに表示するとなお良し!

f:id:kakku22:20190717214547p:plain

また設定画面で「Show results in %」を有効化すると,以下のように % 表示をすることもできる.投票数よりも割合を重要視する場合は「Show results in %」を使うと良さそう.

f:id:kakku22:20190717214743p:plain

投票結果画面のデザイン("Look" と呼ぶ)

"Look" と呼ばれる投票結果画面のデザインは以下の計4種類から選ぶことができる.

  • Dark background look(デフォルト)
  • White background look
  • Transparent background, light look
  • White background, single colored bars

例えば,2番目の「White background look」を選ぶと,以下のように白基調になる.

f:id:kakku22:20190717215137p:plain

Restricted Poll

設定画面で「Restricted Poll」というオプションを有効化すると,プライベート利用を前提とした新規投票を作ることができる.プライベート利用として,投票画面にアクセスする前にトークンを求められるため,事前に管理者からトークンを配布する必要がある.

f:id:kakku22:20190717215432p:plain

トークンは設定画面からダウンロードすることができる.以下のような5文字のランダム文字列となり,最初から500個取得できた.

axwqn
e4pw3
rtmpm
xfe69
ukhm7

まとめ

  • 投票サービス「DirectPoll」を試してみた
  • 「single choice」「multiple choice」「Show results in %」など細かな設定もできる
  • プライベート利用の場合は「Restricted Poll」を有効化して使う

2019年(1-6月)のプルリクエストを振り返る

2016年から OSS に送ったプルリクエストを振り返る記事を書いている.今までは毎年年末に振り返っていたけど,今年は既にプルリクエストの件数が多いため,2019年(1-6月)の期間で振り返ることにした.過去の振り返りは以下にある.そして,2019年(1-6月)で「計12件」だった.

プルリクエストを振り返るための検索

プルリクエストを振り返るために GitHub の検索条件を使う.created:2019 を使うと2019年に限定できるけど,今回は「2019年(1-6月)」に限定する必要があるため created:2019-01-01..2019-06-30 を使う.

is:pr is:public author:kakakakakku -user:kakakakakku created:2019
is:pr is:public author:kakakakakku -user:kakakakakku created:2019-01-01..2019-06-30

日付の検索条件は,GitHub の公式ドキュメントに「Query for dates」として載っている.今回使った .. 以外にも :>:>= などもサポートされている.とても便利!

help.github.com

2019/01

docker/docker-bench-security

「Docker Bench for Security」を試していたら README.md に載っていないオプションを発見して,修正した.Docker (Moby) 関連のリポジトリにプルリクエストを出す場合,コミットメッセージに署名を追加する必要があり,git commit --signoff を経験することもできた.

github.com

「Docker Bench for Security」の詳細は以下の記事にまとめてある.

kakakakakku.hatenablog.com

openfaas/workshop

FaaS フレームワークの「OpenFaaS」に興味があり,公式ワークショップを試していたところ,日本語の手順に誤りがあり,修正した.もう1件は手順として意図を読み取れなかった部分を修正したけど,Close となった.

github.com

github.com

「OpenFaaS」の公式ワークショップの詳細は以下の記事にまとめてある.

kakakakakku.hatenablog.com

2019/02

awsdocs/aws-sam-developer-guide

AWS SAM CLI を使って sam init --help を実行したときに,ランタイムの一覧がドキュメントと異なることを発見して,修正した.

github.com

2019/03

awslabs/aws-devops-essential

CI/CD を体験できるワークショップ「aws-devops-essential」を試していたところ,Markdown をより読みやすく改善できる部分が多くあり,修正した.

github.com

2019/05

microservices-demo/microservices-demo

マイクロサービスの学習に使えるサンプルアプリケーション「Sock Shop」を試していたところ,Fluentd + Elasticsearch + Kibana を使ったログ可視化の機能が動かず,Docker Compose に指定されているイメージ名に問題があることを特定した.本来なら Elasticsearch 7 など,最新バージョンを使うべきだけど,アプリケーションの実装と合わない部分があり,ワークアラウンドとして Elasticsearch 5 + Kibana 5 にして,動くようになった.

github.com

「Sock Shop」の詳細は以下の記事にまとめてある.

kakakakakku.hatenablog.com

jmespath/jp

「JMESPath」の仕様を学ぶために JMESPath CLI : jp を試そうとしたら,README.md に書いてある brew の手順に誤りがあることを発見して,修正した.早めに Merge してもらえると良いんだけど.

github.com

「JMESPath」の詳細は以下の記事にまとめてある.

kakakakakku.hatenablog.com

awslabs/aws-devops-essential

3月に続き「aws-devops-essential」を試していたところ,手順に不明確な部分があったり,AWS Lambda のランタイムとして指定されている Node.js 6.10 が EOL になったりして,うまく動くように修正した.ワークショップを今後試す人たちのためにも継続的にメンテナンスをしていく.Merge してもらえると良いなぁー!

github.com

github.com

github.com

mackerelio/documents

mkr コマンドの新機能 mkr wrap を試していたところ,ドキュメントに typo を発見して,修正した.Mackerel 関連のドキュメントは今年3月頃に OSS 化されている.今後も積極的にプルリクエストを送りたいと思う.

github.com

mkr wrap の詳細は以下の記事にまとめてある.

kakakakakku.hatenablog.com

mikegcoleman/todo

Amazon Lightsail Workshop を試していたところ,サンプルアプリケーションで TODO を編集するとエラーになった.MongoDB 関連の実装に問題があることを特定して,修正した.

github.com

まとめ

2019年(1-6月)で「計12件」のプルリクエストを送ることができた.2019年(7-12月)も頑張る!