shinobe179の日記

パケットの気持ちになって考えるのはもうやめだ

今年の夏季休暇は『Goプログラミング実践入門』の写経に取り組んだ(実施中)

概要

タイトルの通り、『Goプログラミング実践入門』の写経に取り組んでいます。この記事を書いている時点で第4章の最中です。

book.impress.co.jp github.com

動機

AtCoderを通してPythonの文法がある程度分かってきたので、今度はコンパイル言語を習得しようと思いました。Goはクロスコンパイルの容易さという点でメリットがある「らしい」(よく知らない)のと、現職でも使う可能性があるという点で選択しました。

コンパイル言語そのものははじめてというわけではなく、以前『スッキリ分かるC言語入門』の写経に取り組んだ経験があります。実務での開発経験はなく、トラブルシュートなどの際にソースコードを読む時の一助になっている程度です。

book.impress.co.jp github.com

Rustも気になっていますが、仕事で使う機会がないので見送りました。以下の本は買いました。

booth.pm

そもそも、低レイヤー技術が私が忌み嫌うハードウェアと切っても切れない縁で結ばれている(というか低レイヤーという言葉自体がハードウェアを多分に含む)ということもあって、基本的には低レイヤーへの興味は自分の趣味と割り切って、「自分も興味があって、かつ仕事にも役立てられる」技術の習得を優先しようというのが目下の方針です。

この本を選んだ理由

新しい言語を学習するとき、私に一番合っているのは「文法の説明をしつつサンプルコードを組み合わせるといつの間にかプロダクトっぽくなっている」本です。文法の説明に終始しているものだと、どういう時に使うのかがイメージできないので、プロダクトの開発過程を辿って各過程において必要な文法やパッケージの説明があると分かりやすいのです。書店でGo関連の書籍にざっと目を通したところ、それに一番近いのが同書でした。既に経験のあるネットワーク分野(HTTPサーバー)を題材のひとつとして取り上げているのも、とっつきやすそうだと感じました。

実際どう?

まだ途中ですが、正解だったと思っています。各文法の細かな説明は行われていないので、別途文法書やチュートリアルで補強したほうがいいなと感じています。前提としてHTTPの理解が多少あることや、C言語入門をやっておいたのもよかったです。

今後

この本の写経はもちろん続けるとして、よりよい環境を求めて「モダンな開発環境」を意識してスキルを身につけていこうと思います。

Protocol Buffersのことを調べてだいたい分かった気になった人のメモ

はじめに

Protocol Buffers(ProtoBuf)という技術があるらしいということを最近知った。データの送受信に関係する技術らしいし、プロトコルなんて言われたらネットワーク屋(やめるけど)として知ってなきゃならないかなと思ってちょっとだけ調べたのでまとめておく。ProtoBufについて本気で調べたくてこの記事に辿り着いた方のことを思うと、本当に申し訳ない。

ProtoBuf is 何

よそではデータシリアライザとかって言葉で紹介されている。シリアライザって言われてもピンと来なかったんだけど、あるフォーマットに基づいたデータを効率よくやりとりするための技術と解釈した。gRPCで使われている。

データフォーマット(スキーマ)の定義 - データの送受信のためのシリアライズ、デシリアライズ

チュートリアル

protocのビルド、インストール

protocコマンドをインストールする。結構時間がかかる。protocコマンドは、後で作るスキーマ定義ファイルから各言語向けのライブラリを生成できる。

$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/protobuf-python-3.7.1.tar.gz
$ tar xvzf protobuf-python-3.7.1.tar.gz
$ cd protobuf-3.7.1
$ ./configure
$ make
$ make check
$ sudo make install
$ sudo ldconfig

.protoファイルの作成

やりとりするデータのスキーマ(:=プロトコル)を定義する。文法はよく分ってないけど、フィールドの名前と、ユニークなIDを定義すれば最低限いいっぽい。

$ cat protobuf_chat.proto 
syntax = "proto3";

message Chat {
  string name = 1;
  string content = 2;
  string ps = 3;
}

Python用ライブラリの生成

さっきビルドしたprotocコマンドで、Python用のライブラリを生成する。

$ protoc --python_out ./ protobuf_chat.proto

あとは生成されたライブラリをロードして、データをやりとりするコードを書けばよい。Pythonでは追加で以下のライブラリが必要だった。

$ pip install protobuf
$ pip install google-api-python-client

だいたいの使い方

.protoファイルで定義した通りの構造体+シリアライズ、デシリアライズのためのメソッドがある、という感じ。

# インポート
>>> import protobuf_chat_pb2

# Chatインスタンスを作り、スキーマに沿ってデータを入力
>>> chat = protobuf_chat_pb2.Chat()
>>> chat.name = 'Alice'
>>> chat.content = 'I am Alice.'

# シリアライズ
>>> chat.SerializeToString()
b'\n\x05Alice\x12\x0bI am Alice.'

# Chatインスタンスを作って、シリアライズされた文字列をパースしてインスタンスにデータをロードする
>>> peer = protobuf_chat_pb2.Chat()
>>> peer.ParseFromString(b'\n\x05Alice\x12\x0bI am Alice.')
20
>>> peer.content
'I am Alice.'
>>> 

作ったもの

名前だけで食いついたものの、分散システム作ったりとかしてないので、とりあえずsocketと組み合わせて簡易なチャットを作って供養した。

github.com

送信側は文字列をProtoBufでシリアライズして送信し、受信側ではデシリアライズして表示する。文字列がどのようにシリアライズされているのか分かるようにした。

$ python protobuf_chat_server.py Alice
[*] Ready to listen.
[*] Connected by 127.0.0.1:42670.
Server> I am Alice
raw send data: b'\n\x05Alice\x12\nI am Alice'
raw recieve data: b'\n\x03Bob\x12\x08I am bob'
Client> I am bob
Server> Hello
raw send data: b'\n\x05Alice\x12\x05Hello'
raw recieve data: b'\n\x03Bob\x12\x03bye'
[*] Bye.

こうしてみると、シリアライズされた文字列は可読性が低いものの、圧縮されているので、JSONとかをそのまま送るのと比べて転送効率がいいんだろうな。内部通信向けとも紹介されていたので、そういうことだろう。

参考

ProtoBuf

www.slideshare.net

tech-blog.tsukaby.com

qiita.com

qiita.com

socket

algorithm.joho.info

2019年GW進捗(7日目: 2019/05/03)

概要

昨日の進捗です。ご査収ください。

AtCoder

  • 精進
    • ABC
      • B: 22問

所感

がっつり時間がとれたので、怒涛の22問AC。老番からやっていってとうとうテストケースが公開されてない領域まで来たんだけど、このへんは難易度のバラつきが大きい気がする。

明日の目標

  • AtCoder
    • 精進
      • ABC
        • B: 8問
        • C: 1問
  • CTF
    • SECCON 令和CTFのWriteUp見る

2019年GW進捗(6日目: 2019/05/02)

概要

昨日の進捗です。ご査収ください。

AtCoder

  • 精進
    • ABC
      • B: 9問

所感

先日受験した某検定試験、受かっててよかった。令和CTF、WriteUpが大量に公開されててありがたい。

明日の目標

  • AtCoder
    • 精進
      • ABC
        • B: 8問
        • C: 1問
  • CTF
    • SECCON 令和CTFのWriteUp見る

2019年GW進捗(5日目: 2019/05/01)

概要

昨日の進捗です。ご査収ください。

AtCoder

  • 精進
    • ABC
      • B: 9問

所感

Bですら効率のいいコードが思いつかない。

明日の目標

  • AtCoder
    • 精進
      • ABC
        • B: 8問
        • C: 1問
  • CTF
    • SECCON 令和CTFのWriteUp見る

2019年GW進捗(4日目: 2019/04/30)

概要

本日…ではなく昨日の進捗です。ご査収ください。

AtCoder

  • 精進
    • ABC
      • B: 1問

CTF

  • SECCON 令和CTF
    • 1問(10点のやつなので実質0問)

所感

令和CTF、時間切れた後だけど手計算解けた。競プロ始めてよかった。

明日の目標

  • AtCoder
    • 精進
      • ABC
        • B: 8問
        • C: 1問
  • CTF
    • SECCON 令和CTFのWriteUp見る