『Goならわかるシステムプログラミング』を読んだ

11 月から『Real World HTTP』[2017-11-28-1] と同時に読んでいたのに、 読み終わったのが今日になってしまった。意外とボリュームあったのと、 あと少しで読み終えられたのに油断して読み進めなかったせい。 本書のもとになった ASCII.jp のウェブ連載では、この書籍(※)の内容 とかぶらないように、実用性よりも低レベルの説明にフォーカスしたとい うのが実態です。 ※『Real World HTTP』 P332 にこう書かれているように、『Real World HTTP』と一部内容が被る ものの、低レイヤの話が大部分を占める。 一応私は組み込みエンジニア時代に open(3), ioctl(3), close(3) 等を 使ったデバイスドライバを書いたことがあるので(VxWorks だけど)、 ある程度想像力を働かせて読むことが出来た。 先の引用に書かれているとおり実用性は考慮されていないので、それを期 待すると期待はずれに終わると思う。あくまでエンジニアとしての知識を 深めるための技術書かと。 「第17章 Go言語とコンテナ」は面白そうだったので、あとで写経するかも。 以下、個人的なメモ。 P98 最近では、RESTful の究極形態(第4形態)として位置づけられる HATEOAS という考え方も広まりつつあります。 (中略) HATEOAS の原則に従った API を採用しているウェブサービスとしては GitHub があります。 『Web API: The Good Parts』[2015-04-09-2] に書いてあったようだけ ど頭に入ってなかった。Go言語は関係ない。 P285 Go言語の場合、ヒープに置くかスタックに置くかは、コンパイラが自動的 に判断します。new で作っても、その関数内でしか利用されなければスタッ クに確保されます。ローカル変数として宣言しても、そのポインタを他の 関数に渡したり、関数の返り値として返すような場合にはヒープに置かれ ます。そのためGo言語では、「ローカル変数のポインタを関数の返り値と して返すと、呼んだ側からアクセスしに行ったときにはもうスタックのフ レームが巻き戻されて無効なメモリになっており、実行時エラーで落ちる」 (中略)という C/C++ で起きるような問題は置きません。 Go言語で、メモリがスタックとヒープのどちらに確保されているかを知り たい場合は、ビルド時に -gcflags -m を渡します。...

2017-12-31 (Sun) · masutaka

これまで試したダイエット7つを紹介する(※全部失敗)

この記事は feedforce Advent Calendar 2017 の 19 日目の記事です。 18 日目はなべはるさんの『ITベンチャー企業の人事が使っている SaaS 10選! 』でした。なべはるさんは一日に食べるアイスと同じくらい SaaS を活用していてすごいと思います! 昨年 [2016-12-14-1] に引き続き、今年も生活に関する記事です。ダイエッ トは皆さん興味があると思うので、とても有用な情報かと思います。 実際試して、結果的に全部失敗しています。この記事をアンチパターンと して試せば、成功するのではないでしょうか?(えぇ..) 1. ヘルシア緑茶を 3 ヶ月間飲み続ける 川崎の平間に住んでいた頃なので、2004 年秋頃だと思います。 経緯は忘れましたが、ヘルシア緑茶を毎日 1 本、3 ヶ月間飲み続けまし た。毎日バラで買うのは大変なので、近所の酒屋での箱買いです。 「ヘルシア緑茶飲んでいるからへーきへーき」と食事制限はしませんでした。 ★結果: 何も変わらず。むしろ増えた記憶が。ヘルシア緑茶のようにほろ 苦い思い出です。 2. ジムに毎日通う 時は流れ、2010 年 9 月。それまで全く運動をしていなかったのに、急に 近所のジムに通い始めました。今は無きクイックシェイプというジムです。 最初の何ヶ月かは本当に毎日通っていて、行かないのはジムが休みの金曜 日と、たまの飲み会の日くらいでした。 これらの記事に意識高くまとまっています。 [2011-03-05-1] [2011-03-05-2] [2011-03-05-3] 今でもなぜあそこまでやる気があったのか分かりません。 ★結果: 意識が高くなりすぎて、新卒から 11 年在籍した会社を退職 [2011-04-22-1] 。スタートアップで社員第一号として働き始める。 ダイエットには失敗。 西明石に引っ越した 2011 年 4 月末まで、7 ヶ月間通いました。 3. 野々池貯水池でウォーキング 一階のダイニングキッチンがオフィス、二階の各部屋に若者と住んでいた この家の近所には、ジムなんて便利なものはありません。あるのは田んぼ くらいでした。 自転車でいけるくらいの距離に野々池貯水池があり、老若男女がジョギン グやウォーキング、犬の散歩などをしていました。...

2017-12-19 (Tue) · masutaka

『Real World HTTP』を読んだ

HTTP の仕様を歴史から紐解く良書でした。 HTTP/0.9(!) から始まり、1.0, 1.1, 2、そしてセキュリティと網羅的に学ぶことが出来ます。個人的には HTTP/2 を雰囲気でしか理解していませんでしたが、分かった気になれた気がします。 ↓ まえがき v から引用。 本書では次の二冊の間におさまる本として書いてきました。 ・『Web API: The Good Parts』(オライリー・ジャパン 刊、水野貴明 著) ・『ハイパフォーマンスブラウザネットワーキング』(オライリー・ジャパン 刊、Ilya Grigorik 著) これにピンときたら、読んだ方が良いと思います。『Web API: The Good Parts』は [2015-04-09-2] に読みました。読み終わった後、何度も参照することとなった、とても良い本です。 一点、サンプルコードが Go 言語なので、好き嫌いは分かれるかもしれません。 それについて私は問題なかったのですが、『Goならわかるシステムプログラミング 』と平行して読んでいたので、割と混乱しました(笑)。両方とも Go 言語で、内容が似た章もあり、作者さんも同じ渋川よしきさんです。 渋川よしきさん、どれほどの知識量なんや…。 以下、自分用のメモ。 P47 ・プロクシ:通信内容を理解する。必要に応じてコンテンツを改変したり、 サーバーの代わりに応答したりする ・ゲートウェイ:通信内容をそのまま転送する。内容の改変も許さない。 クライアントからは途中に存在することを気づかれてはならない P58 表2-3 スキーマの組み合わせとリファラーの有無 アクセス元 アクセス先 送信するかどうか? HTTPS HTTPS する HTTPS HTTP しない HTTP HTTPS する HTTP HTTP する P92 curl コマンドは複数のリクエストを並べて書くことで、Keep-Alive を使っ て複数のリクエストを続けて送ります。 $ curl -v http://www....

2017-11-28 (Tue) · masutaka

iPhone X 64GB SIM フリー版を買って一週間経った

[2013-10-14-1] に iPhone 5s 64GB、[2015-09-29-1] に iPhone 6s 64GB、という流れで iPhone X 64GB を購入しました(iPhone 4 と iPhone 4s も買ったけど記事を書いてなかった)。値段は忘却の彼方です…。 loading... 予約から入手まで 今回初めて予約開始日に予約しました。[2017-02-25-1] に au から IIJmio に乗り換えたので、初めての物理店舗を介さずの購入です。 10/27(金)16:01 と同時に https://www.apple.com/jp/ にアクセスして予約成功。ストアを表示できるまで、5~10 分ほどかかりました。 自宅に届いたのは 11/11(土)の 11:00 過ぎ。予約時には「出荷は 2~3 週間」と出ていたので、予想より少し早かったです。そもそも予約前は年内に届くとは思っていなかったので、大満足です。 セットアップ SIM カードを別の機種に入れ替えるのは初めてだったので、内心ドキドキでした。 ですが、誘導されるがままに進めると、iPhone 6s と Bluetooth で繋いでからの最新の iCloud バックアップ作成から、iPhone X への復元など、必要なことを全部やってくれました。 事前に iCloud バックアップは済ませていましたが、念のためまたバックアップしました(あるある)。 Music や Movie は iTunes から同期しました。 今回は iTunes を使った完全バックアップからの復元は使いませんでした。この iPhone 6s はなぜか完全バックアップできず、途中でエラーになってしまうからです。 以前は Mac も iPhone も容量が足りてるのに容量が足りないエラー、今回は読み込みに失敗したエラーでした。謎です。他の Mac への完全バックアップも失敗したことと、あとで iPhone X の完全バックアップを試したら成功したので、この iPhone 6s 固有の問題だったんだと思います。...

2017-11-18 (Sat) · masutaka

golang.tokyo #10 x WomenWhoGoTokyo に行ってきた #golangtokyo

golang.tokyo #10 x WomenWhoGoTokyo golang.tokyo #2 以来、久々に参加してきました。運営の皆様、ありがと うございました。 MacBook Air を持っていくのが面倒になったので、リュウドの折りたたみ キーボード [2010-11-15-1] を引っ張り出して持っていたけど、机がなく 使うのは断念。でもその分、聞くことに集中できた気はする。 テキスト審査 in Pairs ※ TODO: 資料が公開されたらここに貼る 後藤勝哉さん/株式会社エウレカ 後藤さんが高熱のため、同じエウレカの森川さんが代わりに発表。 業者などの悪徳ユーザを、サインアップやマッチング成立後にどのように 除外しているかのお話。 kagome という形態素解析ライブラリを使った go-jp-text-ripper を使っ てワードフィルタリングしている。go-jp-text-ripper の作者は、今回代 理で発表している森川さん! Kuromoji も使っていたんだっけかな。忘れた。他に正規表現や機械学習 も使っていて、相当泥臭い。 3か月でフィルタリングルールは使えなくなる。イタチごっこ。 怪しいものは通さない。Slack で CS に通知して、最終的には人間が確認 する。 現在はエンジニアも運用に関わっているとのこと。気になったので質問し てみた。 inerfaceとの付き合い micchieさん/WomenWhoGoTokyo 私は inerface は理解したつもりではいますが、実践で使ってないので、 多分まだ理解できていないでしょう…。 こういう使い捨てスクリプトはつい慣れた言語を使ってしまう。micchie さんの場合、PHP じゃなくて golang を使ったのはどういう意識だったの かな。 メルカリ カウルのマスタデータの更新 tenntennさん/株式会社ソウゾウ GCS 上の 50MB の TSV ファイルを分割しながら(行単位ではない!)、 RDS に入れていくお話。 Transfer の実装は気が狂いそうになるらしい。バイト列の処理はそこそ こ出来るつもりだけど、まだ来てないから待つとかは嫌だな…。 質疑応答の時に「ファイルサイズは GB 単位なので違いますが」という前...

2017-11-16 (Thu) · masutaka

『PromiseとAsync-Awaitまとめ(Emacsで)』という LT をした

社内で久しぶりに LT 大会が開かれたので、私も発表しました。 ちなみにお題をこれに決めたきっかけは、[2017-10-21-1] で async.el を調べた時に promise.el と async-await.el の存在を知ったからです。 予定通り(?)デモの途中で時間オーバーになったので、それぞれ解説して いきます。 解説 まずは同期処理から。2 行目で call-process が子プロセスとして sh が、 孫プロセスとして sleep が起動した後、Message Box がポップアップし ます。同期処理なので call-process の間 Emacs は固まります。 start-process で非同期処理にしました。Emacs は固まらなくなりました が、コード量は増えてしまいました。let ではなく setq 使っているのは、 発表での説明簡略化のためです。 lambda で関数を減らしました。場合によってはアリです。 make-process を使ってみました。動作は変わりませんが、こちらの方が 分かりやすいかもしれません。 これも lambda で関数を減らすことは出来ます。ただ、同期処理と比べる と相変わらずコード量が多いです。非同期処理にしたいだけなのに。 ここで promise.el の登場です。ビルトインライブラリではないので、 package.el 等でインストールします。 Promise に馴染みのある人であれば、読みやすいコードなのかもしれません。 8 行目でゼロ除算エラーを発生させました。promise-catch によって無事 catch されます。エラーの有無に関わらずその後 done は通ります。 次は async-await.el の登場です。これもビルトインライブラリではあり ません。 同期処理のコードとほぼ同じように書くことが出来ました。これはすごい。 defun を async-defun にして、call-process を (await...

2017-11-12 (Sun) · masutaka

RSpec 3.5 から shared_context の使い方が少し変わっていた

RSpec 3.5 から shared_context のメタデータの使い方に変更があったのでメモ。 このようなテストがあったとします。 context 'given login' do let(:user) { create(:user) } before { signin_as user } ... end shared_context を使うと、このように書くことが出来ます。同じ context を複数で使いたい場合に便利です。 shared_context 'User signin' do let(:user) { create(:user) } before { signin_as user } end context 'given login' do include_context 'User signin' ... end RSpec 3.4 までは、メタデータを使ってこのように省略することが出来ました。 shared_context 'User signin', :signin do let(:user) { create(:user) } before { signin_as user } end context 'given login', :signin do ....

2017-11-10 (Fri) · masutaka

S3 の public バケットで特定パス以下を IP アドレス制限する

全体を Allow したあとに、制限したいパスに対して Deny を追加すれば 可能。 例えば以下の場合。 https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/aaa/ * → インターネットに全公開 https://s3-ap-northeast-1.amazonaws.com/masutaka-hoge/bbb/ * → IP アドレス AAA.BBB.CCC.DDD からのアクセスのみ許可 このようなポリシーになる。 { "Id": "Policy1234567890", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt0123456789", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::masutaka-hoge/*", "Principal": "*" }, { "Sid": "Stmt9876543210", "Action": [ "s3:GetObject" ], "Effect": "Deny", "Resource": "arn:aws:s3:::masutaka-hoge/bbb/*", "Condition": { "NotIpAddress": { "aws:SourceIp": "AAA.BBB.CCC.DDD" } }, "Principal": "*" } ] } S3 の Console の Bucket の Permissions → Bucket Policy で上記ポリ...

2017-11-10 (Fri) · masutaka

『オブジェクト指向設計実践ガイド』読書会での感想メモ

6/1 から 8/24 まで、フィードフォース社内で『オブジェクト指向設計実 践ガイド』の読書会を主催しました。 loading... ↑ これはブログ記事に使うための先行 Tweet でした。やっと使えたw 都度メモを取って会社の Slack channel に書いていたのですが、公開の タイミングを逃して後悔していました。そんな折、kano-e さんが会社の 新生開発者ブログに記事をポスト。 空気を読まずに私もポストします。個人ブログに。本当に五月雨式のメモ で自分向けです。 第1章 オブジェクト指向設計 まだ意識が高まっておらず、感想を書いていなかった。プロローグ的な章。 第2章 単一責任のクラスを設計する これらが当たり前に出来るスキルが必要だと思った。 健康的な書き方をほかのプログラマーに促進するコードを書く atter_reader 等を介して、複雑か簡単かどうかさえも見せないように 隠蔽する リファクタリングでメソッドへの切り出しをすることで、クラスの責務 を明確にする 決断を先延ばしにする 第3章 依存関係を管理する DI 初登場!! 第3章は P19 の『オブジェクト指向設計とは、「依存関係を管理する こと」です。』を具体的に説明した章 とにかく依存関係を減らすことが重要 DI メソッドでキーワード引数を使うことで、パラメータの順序依存をなくす ファクトリパターンを使った外部インターフェイスのラッピング あまりに複雑だと、ラッピングしすぎないほうが良いことも 自身より変更しないものに依存しなさい Ruby にはインターフェイスがないので、エンジニアのスキルがな いと振る舞いに気づかないことも 本質的に抽象はより安定 Jpeg, Png, Gif などより、Image といった抽象度を高めたオブジェ クトのほうが変更されづらい 第4章 柔軟なインターフェイスをつくる ◆ P102 の図は少し煙に巻かれた気がした “#prepare_trip” に self を渡す発想はなかった でも、self には “.bicycles” という振る舞いが必要だから、bicycles をそのまま渡せば良いのでは? CarMechanic class とか登場したら、 “....

2017-11-01 (Wed) · masutaka

『スターティングGo言語』を読んだ

大変良い本でした。Kindle 版を購入しました。 1 年前に買って積んでいたのは勿体なかったですが、最近ようやく golang と向き合うようになったので、致し方なしか。 対応バージョンは 1.6 で最新の 1.9 より古いですが、golang は後方互 換性は保たれているので、あまり問題ないかと。 型や構文、よく使われるパッケージの説明など、網羅的に書いてあります。 ネット上の情報をつまむくらいなら、この本で学んだほうが良いと思いま すよ…。> 過去の自分 一番良かったところ 私は元々組み込みエンジニアで、clang に馴染みがあります。そういう意 味では、golang は馴染みやすくはあるのですが、ポインタまわりがどう もしっくり来ませんでした。 この本を読んで、その辺りを理解できて大変良かったです。 ・(*p)[i] の省略が p[i] であるなど、ポインタ記法を省略できる ・参照型(スライス、マップ、チャネル)はポインタを取り扱う型である ・配列は値、スライスは参照型。性質は 180 度異なる ・配列は値であるため、代入ではすべての要素のコピー(clang だとポイ ンタの代入) ・同じ理由で、関数の引数に渡すとコピーが作られ渡される 中でも、見た目が似ている配列とスライスが裏では全く違うことを知り、 腑に落ちました。 loading... string 型は参照型ではありませんが、Immutable なポインタのような不 思議な振る舞いをします(clang だとほぼポインタ)。 ・string 型は内部的に「文字列の実体へのポインタ」と「文字列のバイ ト長」によって構成 ・string 型の値を、変数への再代入や関数の引数として使った場合であっ ても、文字列の実体が別のメモリ領域にコピーされることはない 何が値で何がポインタかを理解することは、プログラムのパフォーマンス と大きく関係してくるので、今後もより理解を深めていきます。 雑多なメモ ・iota 知らなかった ・パッケージを別名で import した時、alias ではなく上書きになる ・文字列を range で for loop すると、byte ごとではなく、UTF-8 でエ ンコードされた文字列のコードポイントごとに反復される ・予約語 fallthrough のこと忘れてた...

2017-10-30 (Mon) · masutaka