ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

gbのテストで特定のものを実行する、結果を色付けする

タイトルにあるように、gbのテストで

  • 特定のパッケージ、メソッドを実行する
  • テストの結果の詳細を表示する、結果を色付けして分かりやすくする

方法についてです。
ただgbだけでなく、普通の「go test」でも使えるかと思います。
(go testの場合は「gb」を「go」に変えるだけです。)

パッケージ・メソッドを指定、詳細を表示する方法

まず、パッケージ・メソッドを指定、詳細を表示する方法についてです。
以下のようなコマンドとなります。

gb test パッケージ名 -run テスト対象メソッド -v

それぞれについて説明すると

  • パッケージ名 ・・・ gb test の後にテスト対象のパッケージ名を指定
  • -run ・・・ テスト対象のテストメソッド名を指定
  • -v ・・・ 詳細を出力するためのオプション

です。

結果を色づけする方法

次に結果を色づけする方法についてです。
testing - colorizing golang test run output - Stack Overflow
こちらのstackoverflowの記事を参考にし、今回はsedで特定のキーワードを色付けすることにしました。

先のコマンドの結果をパイプで繋げ、以下のように実行します。

gb test パッケージ名 -run テスト対象メソッド -v \
| sed ''/RUN/s//$(printf "\033[33mRUN\033[0m")/'' \
| sed ''/PASS/s//$(printf "\033[32mPASS\033[0m")/'' \
| sed ''/FAIL/s//$(printf "\033[31mFAIL\033[0m")/'' \
| sed ''/error/s//$(printf "\033[31merror\033[0m")/''
  • RUN ・・・ 黄色
  • PASS ・・・ 緑
  • FAIL ・・・ 赤
  • error ・・・ 赤

にそれぞれ色づけしています。
色の指定については以下のサイトを参考にしました。

http://yonchu.hatenablog.com/entry/2012/10/20/044603

これでGolangのテストについて、ターミナルから実行する場合に少しやり易くなるかと思います。
色を変えるsedコマンドについては、シェルスクリプトなどに書いておいて、パイプでシェルに渡してもいいかもです。

ビルドツールのgbをVisual Studio Codeで使ってみる

Golangのビルドツールのgbを試してみました。
私は普段Visual Studio Codeを使っているので、こちらでエラーとならないよう設定もしました。

gbを使うメリットとしては

  • 自分が作成したpackageをimportする際にGopathからのフルパスを書かなくていい
  • 使用する外部ライブラリを定義ファイルに記述できる

などです。

以下、私が使用したときの手順メモです。

プロジェクトについて

プロジェクト直下のsrcフォルダ内に自分で作成するソース、vendorフォルダ内に外部ライブラリを保存します。
今回はGitHub - fatih/gb-example: Example gb project with dependencies and CI integrationという、gbを使ったサンプルプロジェクトがあったので
こちらが動くかどうかを試してみました。

git cloneでプロジェクトをダウンロードしてきます。

git clone https://github.com/fatih/gb-example.git

Visual Studio Codeの設定

File - Preferences - Settings より設定を行います。
まだgbを使っているのはこのプロジェクトのみなので、今回はローカルプロジェクトのみ設定する
Workspace Settingsの方に以下の設定を行いました。

gbの使用について

  • vendor/manifestに使用するライブラリを記載される。
  • なのでvendor/manifest以外はGithub等に上げる必要はない。

外部ライブラリの取得、更新

$ gb vendor update -all

ビルド、テスト

$ gb build
$ gb test

AWSのロードバランサーについて調べてチラシの裏書きw

AWSロードバランサーについて、今更ながら調べてみました。
とはいっても既に様々なサイトで情報が公開されているので、詳細についてはそれらを参考にした方がいいかと思います。
(公式のドキュメントもかなり充実しているし)

なのでここではチラシの裏書きレベルの纏めと、調べてみた際に参考にしたリンク集という形にしたいと思います。

AWSロードバランサーについて

現時点で以下の3種類がある。

  • ELB(Clasic Load Balancer)
  • ALB(Application Load Balancer)
    • ネットワークのOSI参照モデルの第7層(アプリケーションレイヤー)で機能する。
    • 普通のHTTP関係のロードバランシングに使用する。
  • NLB(Network Load Balancer)

「増補改訂Pythonによるスクレイピング&機械学習開発テクニック」を読んだ

増補改訂Pythonによるスクレイピング&機械学習開発テクニック(クジラ飛行机) | 書籍 本 | ソシム
を読みました。以下、その短い感想になります。

本のタイトル通り、Pythonによるスクレイピング機械学習の本なのですが

  • 開発環境の構築
  • 機械学習とはなんぞや
  • 数学がどのように使われるのか
  • 機械学習や深層学習の基礎的な例とサンプルソース
  • それらを使ったサンプルアプリケーションの例

あたりが網羅されていました。

かなり丁寧にプログラムについて解説されているため、ほぼ本を読み進めながら
実装について読み進めていくことが出来ました。
(自分の場合はローカルで実際に実行しないと理解できないことも多いのですが)

機械学習を始めるところ(つまり開発環境の構築)~機械学習の実例まで書かれているので

  • どのように始めるべきか
  • それを使って何ができるのか
  • 具体的なソースコードレベルでどのように実装しているのか

を知ることができたことが良かったというのが、読んでの感想です。

DockerにてPythonの開発環境を作成するためのコマンド

タイトルにあるように、DockerにてPythonの開発環境を作成するためのコマンドのメモです。
ホストOSはWindows 10、Docker for Windowsはインストール済という状態からです。

ローカルイメージ確認~イメージダウンロード~起動

Python3.6のイメージをダウンロードして起動するまでです。

$ docker images

# イメージ名:バージョン番号でダウンロードするイメージを指定。
# /bin/bashを入れることでコンテナのシェルに入れる
$ docker run -it python:3.6 /bin/bash

$ python --version

コンテナ内からapt getが出来ない場合

「Temporary failure resolving・・・」というエラーメッセージが出た場合の対応方法です。
Docker Desktopの「Settings」「Network」にて「DNS Server」を「Fixed」を選択します。

vimのインストール

作業をするのに便利なようにvimをインストールしておきます。
コンテナ内で以下のコマンドを実行するか、もしくはDockerfileに記述してコンテナ作成時にインストールしてもいいかと思います。

$ apt-get update
$ apt-get install -y vim

Dockerfileによるイメージの作成~アプリのデプロイ

こちらについては以下のサイトの内容を一通りやってみたら理解できました。ありがとうございました。
https://qiita.com/ksh-fthr/items/e914ff213791b7150008

ザックリとした作業内容は以下となります。

  • Dockerfileにベースとなるコンテナ、デプロイ処理、アプリ起動処理などを記述し、Dockerfileからコンテナを作成する。
  • (Pythonの場合) requirements.txtに必要なモジュールは記述する。
  • Webアプリの場合は以下のようにコンテナを起動してコンテナのポートとホストのポートを紐づける
# ホストポート番号:コンテナポート番号 イメージ名 を指定
$ docker run -d -p 4080:80 image_name

cal-heatmapを使ってGithubの草を再現してみる

Githubの草、去年は結構話題だったかと思います(いや、Githubが出来てからずっとか?w)
遅ればせながら、あの「草」をどのようにすれば作れるのかを調べてみました。

結論としてはcal-heatmapというライブラリを使えば出来ることが分かりました。
https://cal-heatmap.com/

今回はこれを使い、以下のような草をhtmlファイル一つで作ってみました。
f:id:UnderSourceCode:20190103115740p:plain

htmlファイル一つで作ってみた理由としては

  • APIからデータを取得している例が多いが、cal-heatmapを試したいだけの場合はAPIは用意したくない
  • cal-heatmapをbowerなどでローカルに持ってきている例も多いが、これも試したいでだけの場合は面倒

といったところです。

今回作成したソース

今回作成したソースは以下になります。

<html>
    <head>
        <script type="text/javascript" src="https://d3js.org/d3.v3.min.js"></script>
        <script type="text/javascript" src="https://cdn.jsdelivr.net/cal-heatmap/3.3.10/cal-heatmap.min.js"></script>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/cal-heatmap/3.3.10/cal-heatmap.css" />
    </head>
    <body>
        <div id="sample-heatmap"></div>
    </body>
    <script type="text/javascript">
        var datas = {
            "1530370800" : 1, // 2018/07/01
            "1530457200" : 3, // 2018/07/02
            "1533049200" : 5, // 2018/08/01
            "1533135600" : 7, // 2018/08/02
            "1546268400" : 10 // 2019/01/01
        };
        var cal = new CalHeatMap();
        var now = new Date();
        cal.init({
            itemSelector: '#sample-heatmap',
            domain: "month",
            data: datas,
            domainLabelFormat: '%Y-%m',
            start: new Date(now.getFullYear(), now.getMonth() - 11),
            cellSize: 10,
            range: 12,
            legend: [1, 3, 5, 7, 10],
        });
    </script>
</html>

またGithubにも格納してあります。
https://github.com/SrcHndWng/cal-heatmap-sample

過去1年を表示するようになっているので、「datas」に格納しているデータの日付は任意の値に変えてください。
キーは日付のUnix Timestampですが、以下のサイトで算出できます。
https://url-c.com/tc/

少しソースについて解説すると

  • head部で必要なライブラリ、css等を参照
  • divタグで「草」を表示
  • JavaScriptの「datas」に表示するデータを固定値で設定
  • 「cal.init~」で草の設定

を行っています。

「datas」については先に書いたように、

  • キー = 日付のUnix Timestamp
  • 値 = commit(か何かの)回数

となります。
この値は、実運用ではAPIから取得することが多いかと思います。

「cal.init」で草のグラフの書式を設定します。

  • domainで月毎の表示
  • rangeで表示する期間(ここでは12カ月を設定)
  • legentで草の色の濃さを変えるレベルを指定

という感じです。

上記のソースで単純な「草」は実現できましたが、その他の機能を知りたければ
以下の公式ドキュメントを参考にしてみてください。
https://cal-heatmap.com/

Microsoft To-Do のタスクをGolangで取得してみる

前回の記事で、Microsoft To-Doのタスクをcurlで取得してみました。
Microsoft To-Do のタスクをAPIで取得してみる - ソースコードから理解する技術-UnderSourceCode

今回はGolangでタスクを取得するコンソールアプリを作ってみました。
ビルドしてバイナリを起動すると、10秒ごとにタスクを取得し、以下のようにターミナルに出力します。

※今回もベータ版のAPIをコールしています。なので仕様変更などあったら動かなくなるかもしれません。

token unauthorized.
print tasks status, name...
completed : タスク名
notStarted : タスク名
print tasks status, name...
completed : タスク名
notStarted : タスク名

以下、このアプリの作成手順についてです。
実行環境はWindows 10 になります。(多分他のOSでも動くとは思いますが・・・)

事前準備

アプリの登録~アクセストークンの取得

前回の記事の「1. アプリの登録」「2. コードの取得」「3. アクセストークンの取得」を参考に
APIを叩くのに必要な

を取得しておきます。

環境変数の設定

取得した値を環境変数に設定します。以下のキーで登録します。

  • MS_TO-DO_CLIENT_ID ・・・ アプリケーションID
  • MS_TO-DO_ACCESS_TOKEN ・・・ アクセストーク
  • MS_TO-DO_REFRESH_TOKEN ・・・ リフレッシュトーク

プログラムの作成

今回作成したプログラムは以下になります。
https://github.com/SrcHndWng/ms-todo-sample

詳細な実装はプログラムを見てほしいのですが、流れを簡単に説明すると
1. 環境変数よりアクセストークン、リフレッシュトークンを取得する
2. アクセストークンを使ってAPIを叩いてタスクを取得する
3. 2.のレスポンスのステータスコードがUnAuthorized(401)だった場合、リフレッシュトークンを使って新しいアクセストークン、リフレッシュトークンを取得する
4. 3. で取得したトークンを環境変数に設定する
5. 新しいアクセストークンを使ってタスクを再度取得する
6. 取得したタスクをターミナルに出力する
となり、これを10秒ごとに繰り返しています。
(Ctrl + Cなどでの停止処理は今回は実装していません)

この流れがmain()に実装されています。

ちなみに、今回APIからの戻り値のJSONからGolangのstructを作成するのに、以下のサイトを使いました。
非常に使いやすく、助かりました。
https://mholt.github.io/json-to-go/

最後に

こんな感じでGolangMicrosoft To-Do のタスクを取得することができました。
以上です。