2019年書いた記事/発表まとめ

気がついたら2019年もあっという間に過ぎてしまいました。

去年は一昨年に書こうと思って放置していた記事を追記してまとめ記事にしました。

kurochan-note.hatenablog.jp

上記の記事の最後で書いたのですが、今年の1月から開発責任者という役割になりました。所属しているチームは新卒で入社してから変わっておらず、4年半が過ぎました。所属は変わらずとも仕事だったり役割は毎年変わってきていて楽しくやらせてもらっています。役割が変わったので慣れない事も多い一年でしたが、学びの多い一年でした。

来年は引き続き開発責任者をさせてもらう予定です。決断とアウトプットの量を増やしていきたいと思います。

2019年書いた記事/発表

情報科学若手の会 冬の陣という情報科学若手の会を紹介するイベントでブラウザのトラッキング手法を紹介しました。ITPのアップデートによってユーザの意図しないトラッキング手法はどんどん塞がれていくと思います。

今年の情報科学若手の会は台風19号の直撃があり中止という判断をしました。来年は無事に開催したいです。

speakerdeck.com

CA Base CAMPという社内エンジニアカンファレンスで登壇しました。

speakerdeck.com

CyberAgentScala Matsuriに将軍スポンサーだけでなく、Wi-Fiスポンサーとしても協力しました。Wi-Fiスポンサーは自分が引き受けて、社内でメンバを集めチームを結成し挑みました。

speakerdeck.com

実際にカンファレンスにデプロイし安定運用に成功したので、飛び入り発表の打診があり、急いで資料を作り発表しました。

speakerdeck.com

Datadog社の勉強会で発表しました。

speakerdeck.com

東京リージョンで発生したAWSのAZ障害が日本で大きな話題となりました。このタイミングでAZというものについて改めてわかりやすく解説してみたいと思い投稿したところたくさんの方々に読んでいただけました。

developers.cyberagent.co.jp

Scala Matsuriでのことをネットワークプログラマビリティ勉強会というところで発表しました。

speakerdeck.com

Scala秋祭りというScala Matsuri 2019で協賛した4社で開催した勉強会で自分が担当しているプロダクトのことを書きました。

speakerdeck.com

AWSのAZ障害について書いた記事を読んだ方から勉強会での登壇を打診してくださり、発表しました。

speakerdeck.com

社内の事業部内エンジニアカンファレンスがあり、発表しました。普段の業務の中で使っているクラウドというものの基盤(特にネットワーク)がどのような技術で構成されているのか、30分でおおまかに紹介しました。

speakerdeck.com

CyberAgentのAI事業本部のPRサイト( AI tech studio | AI事業本部は、サイバーエージェントグループのデジタルマーケティング分野におけるサービス開発を行う組織です。 ) のインフラ面でのリニューアルを担当しました。

developers.cyberagent.co.jp

2020年もやっていきましょう〜

Google Pixel 3a XLはUSBケーブルとの相性問題があるかも? #GooglePixel #Pixel3a #Pixel3aXL

Google Pixel 3a XLが届きました🎉

さっそく充電しようと思ったところ、充電ができない問題に遭遇したので、どんな状況だったのか書いてみます。

充電できない

常用していたUSB type A → USB type Cのケーブルをつかって端末を充電しようと思ったのですが、コネクタを刺しても反応せず…

もちろん常用していたので、別の端末 (Huawei Mate9) を接続すると正常に充電できます。

ケーブルが断線しているのかよくわからなかったのでUSB-Cの電圧・電流チェッカを使っていくつかのケーブルを比較してみました。

比較対象のケーブルたち

①: エレコム USB Type C ケーブル MPA-FACS12RD

Type A → Type Cのケーブルです。常用していて、外皮がナイロンメッシュなので耐久性が高そうで気に入っていました。

②: Huawei Mate9を買ったときに付属していたケーブル

Type A → Type Cのケーブルです。付属品なので単品では売っていません。 f:id:kuro_m88:20190519122321j:plain

③: Apple USB-C充電ケーブル MLL82AM/A

Type C → Type Cのケーブルです。Macを買うとついてくるやつです。もちろんPDにも対応してるので汎用性が高いです。

④: Pixel 3a XL付属ケーブル

Type C → Type Cのケーブルです。さすがにこれが使えないということはないと思いますが、一応比較。

f:id:kuro_m88:20190519122523j:plain

比較

USB-Cの電圧・電流チェッカが手元にあったのでチェッカを通してPixelを接続し、ケーブル自体に通電しているのか、Pixelに電流が流れているのかをを調べました。測定に使ったのはこれです。

電源の供給にはAnker PowerPort+ 5 USB-C PDを使いました。全体で60Wまで供給できてPDにも対応しているのでMacも充電できて便利です。

①: エレコム USB Type C ケーブル MPA-FACS12RD

f:id:kuro_m88:20190519121550j:plain

いきなりですがダメでした…。ケーブルには通電しているものの、Pixel側で受け入れられていないのか、電流は流れていません。充電できないということです。

②: Huawei Mate9を買ったときに付属していたケーブル

f:id:kuro_m88:20190519121750j:plain

電流が流れています。また、本体にも充電中と表示されました。

③: Apple USB-C充電ケーブル MLL82AM/A

f:id:kuro_m88:20190519121926j:plain

電流が流れています。USB-CかつPDに対応しているので約9Vで給電されています。本体にも急速充電中と表示されました。

④: Pixel 3a XL付属ケーブル

f:id:kuro_m88:20190519122651j:plain

もちろん電流が流れていますし、PDにも対応しているので本体に急速充電中と表示されました。

結果

手持ちのエレコムのケーブルではPixel 3a XLに給電できませんでした。ケーブルの細かい仕様の違いのせいなのか、詳しい原因は切り分けができませんでしたが、ケーブルとの相性問題があるかもしれませんので外出先に持っていく充電ケーブルは事前に充電できるかチェックしてみることをおすすめします。

ちなみに

給電はできないけどPCとの通信はできるということはないのか…?と考え試してみました。

f:id:kuro_m88:20190519123307j:plain

MacBook Airに接続するためにType A → Type Cの変換アダプタを間にはさみましたが、やはり認識されませんでした。残念。

紹介したもの

ssh-import-idコマンドでGitHubに登録した公開鍵をサーバに登録する

ssh-copy-id コマンドをご存知でしょうか。 サーバに公開鍵を登録するときに対象サーバの ~/.ssh/authorized_keys に公開鍵を手動で追加せずとも、手元の公開鍵を指定して自動で対象のサーバに追加してくれるコマンドです。

ssh-import-id コマンドはそれのGitHub版といった感じです。GitHubのほかにLaunchPadも対応していてそのサービスに登録している公開鍵をサービスから取得してきて登録してくれるのでとても便利です。

GitHubだと自分の公開鍵は https://github.com/kurochan.keys のように username.keys で取得できます。

使い方

Ubuntu18.04で試しました。ログインしたい対象サーバでコマンドを実行します。

GitHubの場合は gh:username, LaunchPadの場合は lp:username と打ちます。

$ ssh-import-id gh:kurochan
2019-05-07 14:37:19,163 INFO Authorized key ['2048', 'SHA256:f+9eGlHij0d5SwHYZWPkhafqQ5htuuINWrYxk8Cbipo', 'kurochan@github/11532103', '(RSA)']
2019-05-07 14:37:19,169 INFO Authorized key ['4096', 'SHA256:wKII8N+s47M+ggRhFbIrRpcVXjZCH48VVjs0TJq9XTU', 'kurochan@github/31733264', '(RSA)']
2019-05-07 14:37:19,169 INFO [2] SSH keys [Authorized]

ssh-import-id コマンドのソースコード

LaunchPadにリポジトリがあります。

launchpad.net

実践Rust入門を読んだ

Rustに興味を持っていたところ、著者の一人であるκeen氏*1から献本頂いたのでゴールデンウィークに読みました。全部は読み切れていないですが、紙媒体の発売前に記事を出して応援したかったので今読んでいるところまでの感想を書きます。

Rustに興味を持ったきっかけ

κeen氏とは新卒入社時の同期で、彼はコンパイラとRustの話をよくしていたのでそれをきっかけでRustの存在は認知していましたが、そこまで強い関心は持っていませんでした。

時が経ち、世の中でもRustという言語について言及されることが増えてきた頃にこの本が出版されたので、改めて興味を持ったという感じです。

(2016年にRustのハンズオン会に参加したことがあったのですが、高熱が出てで早退してしまったのでこれは書いたウチに入らないですね。。)

普段書いている言語

普段は業務で書くScalaがメインです。Scalaで広告システムを作っています。あとはたまにスクリプト的にRubyを書くくらいです。C言語は大学の授業で使った程度です。

どんな本なのか?

Scalaを書いている人にはScalaでいうところの「コップ本」に相当すると言うとわかりやすいです。 入門する人、業務等まとまった時間を使って書きたい人が最初に読む本という感じだなと思いました。飽きずに読み進められました!

あとはRustに限らないプログラミング上必要になってくる前提知識が適度に挟まれているのがよかったです。 例えば、標準ライブラリとしてHashMapが用意されていますが、そのハッシュアルゴリズムはSipHashというものが使われています。ハッシュアルゴリズムは簡単なものだとhashdos攻撃という攻撃に対して脆弱になってしまいますが、暗号学的ハッシュ関数を使うことでこの種の攻撃に対して耐性が得られます。(初版 p183) こういった知識がしつこくない程度に入っているのが嬉しいです。

本の構成

目次の一覧は技評のサイトに載っています。

実践Rust入門[言語仕様から開発手法まで]:書籍案内|技術評論社

C言語等何かしらのプログラミング言語を触ったことがあって、とりあえずRustの言語機能的な部分が知りたい人は5章から流し読みを始めるとよさそうです。Rustの所有権の概念についてだけ知りたい人は7章だけで読むとよさそうです。ちなみに僕は1章から順番に8章までと12章を読みました。

1章はRustという言語が流行っているらしいがどんな言語なのかなんとなく知りたい、といった人にとってはありがたいと思いました。初めて聞いたプログラミング言語について調べるときまず適当にググって世の中の情報を集めるとおもうのですが、それがだいたいまとまっている感じです。どんな言語なのかなんとなく知った気になれます。

2-3章ではRustを実行するための環境を構築してVS Code上でコードを書いてみます。僕はPCを横に置いて実際に手をうごかすことはせず、流し読みしました。2章で環境構築をして、3章でバイトニックソートというソートアルゴリズムを実装します。いきなり完全なものを実装するのではなく、Pythonのコードと比較しながら最低限の実装→ジェネリクス→ソート順のカスタマイズ→並列ソートというふうに改善していきます。コードや実行結果が全て書かれているので書いて動かす様子を想像しながら進めました。とりあえず基礎編をひととおり読み進めてからまた戻ってきて見返しながら実際に実装するとよさそうな気がします。性格的な問題もあるかもしれませんが、先が気になるのでひとつひとつ丁寧に確認することはせずにどんどん読み進めめました。

4-5章でデータ型について知ることができます。5章はプログラム上で定義したデータが実行時にメモリ上でどのような扱いがされるのか等書かれているので抑えておいたほうが何か疑問に思ったときに想像がつきやすそうです。

6章が文法系です。特に違和感のあるものはなかったです。初めて見たのはシャドウイングくらいでしょうか。

7章がRustの一番の特徴でもある所有権についてです。さすがにここは初めての概念なので手元で実行しながら復習したほうがよさそうです。所有権による管理が常に強制されるのかと思っていましたが参照カウンタによるリソース管理も用意されているのは便利そうですね。弱い参照も実装されているおかげでオンメモリキャッシュ等も作りやすそうでした。

8,9-11章: トレイトとポリモーフィズム, 実践編です。まだ読んでいません。。

12章はFFI(Foreign Function Interface)についてです。RustからC言語の関数を呼び出したり、C言語からRustの関数を呼び出したりすることができますが、それの実現方法について書かれています。今までプログラミングをしていて他の言語で書かれたコードを呼び出した経験がなく興味があったのと、C言語で実装したものが呼び出せるのであればその他の言語との連携もできるのであろうという想像をしているので方法が気になったので読みました。 RustのコードからするとC言語で実装されている部分は外界なのでRustのプログラミング的な安全性は保証されませんが、unsafeという概念によってRustの言語機能によって守られる部分と守られない部分を明確に扱うことで他言語と連携できることがわかりました。

感想

2年くらいかけて書いたそうなのですが、対象は最新の2018editionについてになっていたり、昨年末に発表されたAmazonのfirecrackerについての言及があったり、常に最新の話題に追従しながら書かれていたんだろうなと思いました。

Scalaで知っていたような概念(タプルとか、トレイトとか)も多少出てきていたので、読んでいてそこまでハードルは感じませんでした。一番大きいのはきっと所有権まわりだと思いますが、まだ書いていないのでそこはこれから学びます。この本をひととおり読んでから手を動かし始めれば何もしらないよりはつまずかないはず、と予想しています。「Scalaでいうところの「コップ本」に相当する」と書きましたが、まだ自分が実際どうだったかはまだわからないものの、数日でひととおり知識としてインプットすることはできたと思うのでRustに入門したい人が周りにいればとりあえず薦めたい一冊です。

ちなみに献本してくれたκeen氏が担当した箇所は自分が読んでいない実践編なので今後ちゃんと読み進めます… m( )m

書籍版

Kindle

*1:kじゃなくてκなのがポイント