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

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

Bitcoinの実装について調べてみた

タイトルにあるように、Bitcoinの実装について調べてみました。
色々なサイトがあったのですが、個人的には以下のサイトが分かりやすかったので紹介します。

Building Blockchain in Go. Part 1: Basic Prototype - Going the distance

こちらのサイトはGolangでのBitcoinの実装について書かれており、実装は7回に分かれて書かれています。
特に最初の2回は、それぞれ

を扱っており、実装も合わせて分かりやすく感じました。

以下、私が写経したソースです。
GitHub - SrcHndWng/go-learning-blockchain

part3についてはCLI化の処理をurfave/cliを使って実装し直しました。
CLI化については以下のサイトを参考にしました。

コマンドラインツールを作るときに参考にしている資料 | SOTA

JSON Web Tokenを返すGolang Serverを実装してみた

タイトルにあるように、JSON Web Tokenを返すGolang Serverを実装してみました。
認証が必要なAPIがあり、そのAPIのみTokenの検証を行なった後にアクセス可能にするケースを想定しています。

とは言っても、基本的には
Authentication in Golang with JWTs
を写経しています。

参考にしたサイトではWeb側の画面なども実装していますが、私の方は認証周り、Token周りを知りたかっただけなので
以下のような変更を加えました。

  • 画面はindex.htmlのみ
  • Tokenを取得するAPI(get-token)は固定のユーザー名、パスワードでBasic認証を行う
  • Tokenの判定についてはvalidateToken()という関数にて行うように変更

ソースは以下になります。
GitHub - SrcHndWng/go-learning-webapp-auth

使い方はREADMEにも記述しましたが、バイナリを実行したら以下のようなcurlで叩くことができます。

$ curl -v http://localhost:8080/status # APIのステータス確認
$ curl -v http://localhost:8080/products # Tokenを渡していないためエラー
$ curl -u username:password -v http://localhost:8080/get-token # Tokenの取得。username、passwordは固定。
$ TOKEN=上記で取得したトークン
$ curl -v http://localhost:8080/products -H "Authorization: $TOKEN"

ポイントとなるのは、Token周り、Basic認証を実装しているauth/login.goとauth/token.goです。
Tokenを取得する際のBasic認証はlogin.goのLogin()にて、Tokenの検証はtoken.goのValidateToken()にて実装してあります。

google-java-formatでJavaのコードをフォーマットしてみる

まあタイトル通りのことをしたので、そのメモです。

https://github.com/google/google-java-format

を参考に

https://github.com/google/google-java-format/releases

から「google-java-format-1.6-all-deps.jar」をダウンロードしました。

使い方は

$ java -jar path_to/google-java-format-1.6-all-deps.jar --help

で大体わかります。


私の場合は

  • インデントは4つ
  • フォーマットしてファイルを上書き保存したい

ので

$ java -jar path_to/google-java-format-1.6-all-deps.jar --aosp --replace path_to/your_program.java

のように「--aosp」「--replace」オプションをつけて実行しました。


フォーマットスタイルを任意に指定することはできないようですが、とりあえずサクッとフォーマットしたい場合にはいいかもです。

urfave/cliを使ってみた

Building a Network Command Line Interface in Go | TutorialEdge.net という記事を見つけました。

https://github.com/urfave/cli
このライブラリを使い、いくつかのネットワークコマンドを実行するCLIアプリを作ってみる記事です。

今回はこの記事を写経してみました。私が作ったソースは以下になります。
GitHub - SrcHndWng/go-learning-network-cli

単純に写経した訳ではなく

  • 「net.LookupNS(c.String("url"))」→「host」に修正
  • コマンド作成処理を独立したパッケージ(Commands)に切り出した

などの改変を行なっています。

GolangCLIアプリを作る際にはflagパッケージを使うことが多いかと思いますが
より簡単に作りたい場合などはurfave/cliを検討してもいいかもしれません。

Java 10 + Spring BootでTwitter Botを作成してみた

タイトルにあるように、Java 10でTwitter Botを作成してみました。
まあ今後、Java 8から10への移行案件とかもあるかもしれないし、
ということで予習を兼ねて。。。

作ったものとしては、前回書いたGolangでのTwitter Botと同等機能を
持つものになります。
前回の記事はこちら。
GolangでTwitter Botを作成してみた - ソースコードから理解する技術-UnderSourceCode

仕事の予習も兼ねているので、フレームワークはSpring Boot 2系を使ってみました。
あんまり2系固有の機能は使っていないですが。

Spring Bootを使う際、私はSpring Initializr(https://start.spring.io/)でプロジェクトの
雛形を作ることが多いです。
Java 10 で動かすにあたり、作成した雛形のbuild.gradleに以下の定義を行いました。

sourceCompatibility = 10
targetCompatibility = 10

Java 10 ということで、積極的にローカル変数の宣言には「var」を使ったのですが
個人的にはソースがスッキリとして好ましいですね。

作ったものは以下になります。
GitHub - SrcHndWng/learningTwitterRandomSearch

以下、参考にしたサイトです。
http://robo.genv.sophia.ac.jp/wp_robot/?p=1866
Twitter4J - 設定
Twitter Streaming APIをTwitter4Jで試してみる - @thorikiriのてょりっき
スレッドを終了させる | じっくり学ぶ Java講座 [初心者向け・入門]

GolangでTwitter Botを作成してみた

タイトルにあるようにGolangTwitter Botを作成してみました。
EC2などのマシン上でバイナリを常駐させて動かすことを想定しています。

ソースは以下となります。
GitHub - SrcHndWng/go-learning-tweet-random-search at v1.0.0


READMEにも書きましたが、機能としては

  • 予め実行するマシンの環境変数Twitter APIAccess Tokenなどを設定しておく
  • マシン上でバイナリを起動する
  • Twitterのアカウントに「@Account Keyword」形式でメッセージを投げる
  • キーワードで検索した結果からランダムにツイートを選んで返却する

というものです。

検索した結果から返却するツイートを選択するロジックは、
リツイート数 * お気に入り数 * ランダムな係数」が一番大きいもの
を選択しています。

Twitterへのアクセス周りは
GitHub - dghubble/go-twitter: Go Twitter REST and Streaming API v1.1
を使用しました。

作って見ての感想としては、こういうのをサクっと作るのにはGolangは向いているかな、と思います。

以下、参考にしたサイトです。
Writing A Twitter Bot in Golang | TutorialEdge.net
GitHub - dghubble/go-twitter: Go Twitter REST and Streaming API v1.1

Mackerel カスタムメトリックプラグインを開発してみた

先日に引き続き、Mackerelのカスタムメトリックプラグインを開発してみました。
今回は独自のロジックで開発してみました(既に同じようなものはあるかも知らないが・・・)。

作成したのは、AWS S3にあるオブジェクトのサイズを取得し、メトリックに送信するものです。
ソースは以下になります。

GitHub - SrcHndWng/go-learning-mackerel-plugin-aws-s3-size

開発環境はMac、実行環境はAMAZON EC2 Linuxで、それぞれで動作確認をしています。
開発環境にはAWSのクレデンシャル、EC2にはS3にアクセスするEC2ロールが必要となります。

開発の手順は以下の記事と同じです。(ロジックは違うけど)
「Mackerel サーバ監視[実践]入門」を買ってみた - カスタムメトリックプラグイン開発手順メモ - ソースコードから理解する技術-UnderSourceCode

ヘルパーライブラリを利用することで独自のロジックの開発に集中できて非常に楽である
というのが作ってみての感想です。

システムの運用時に監視したい項目があったら、サクッとプラグインを作って監視を行う
ということも十分可能かと思います。