Memoエモさ駆動開発2018-12-292018年買ってよかったもの年の瀬なので2018年に購入したものの中で、買ってよかったものをまとめてみた。ミラーボール友人との会話の中でふざけて購入したミラーボールが思いのほか生活に潤いを与えてくれている。このミラーボールは音に反応して光る機能があり、通常は流れている音楽のテンポに合わせて光らせる用途に使うらしいのだが、この機能が思いのほか日常生活で役立つ。使い方としては、部屋の天井に装着し、音楽に合わせて光るモードを常にONにしておく。友人を部屋に招いておしゃべりをするとき、話が盛り上がり、笑い声が出る。すると笑い声に反応してミラーボールが回りだす。それを見て笑いが止まらなくなる。ミラーボールは回り続ける。意外性も高いため、今年1位。ラップトップとしても、タブレット端末としても使える2-in-1。これを購入して家での過ごし方が変わった。今までは、机にラップトップを置いておき、プログラミングなどの作業をする場合は机に向かう、机に向かうのに飽きたらソファーに座りスマホを触る、という過ごし方をしていたのだが、これがすべてSurfaceに置き換わった。SurfaceはTypeCoverを外せばタブレット端末として使えるため、机から離れるときはTypeCoverさえ外せば自由に持ち運ぶことができる。プログラムを書いていてビルド待ちの間TypeCoverを外し、ソファーに寝転がってビルドの進捗を確認しながらYoutubeを眺める、などといったことができるようになった。512GBと通常のラップトップPCとしても申し分ない。スピーカーも疑似サラウンドに対応していたり、ディスプレイの発色が良かったり、マルチメディアを楽しむうえでも十分なスペックがあると思う。Pencilは要らない。自分のような字が下手で絵も描けない人はミミズの絵を量産して飽きる。充電が遅そう、劣化しそうなどのイメージがあったため使ってこなかったQi充電器だが、試しに使ってみたところ完全にハマった。普段使ってるのはiPhoneとAppleWatchを同時に充電できるタイプの充電器。現在はオフィスと家にひとつづつ置くことで、充電ケーブルを持ち歩かない生活を送っている。ケーブルがないだけでデスク上も持ち物もかなりすっきりした。Light光で目を覚ましてくれる目覚まし時計。物は試しと思って買ってみたが、iPhoneのアラームで起きる2倍は目覚めが良い。この目覚ましは、設定時刻の30分ほど前からゆっくりと明るくなっていく。この光によって半分覚醒している状態で設定時刻を迎えることができる。設定時刻になると、鳥のさえずりの音声が流れだし、徐々に音量が大きくなっていく。いえかなり小さい音、初めはこの音量じゃ起きれないだろと思っていたが、半分覚醒している状態のためこの音量でも十分起きることができた。起きれなかったことは一度もない。(ただし起きれても遅刻はする)iPhoneのアラーム、強引に覚醒させるため、実はかなり健康に良くないんじゃないかと思うようになった。NILSKickstarterのプロジェクトだが、腕に取り付けることのできる充電ケーブル。Qiで充電ケーブルを持ち運ばない生活を手に入れることはできたが、終電逃してネカフェなど、いざというときにUSBポートはあるのに充電できないという事態がたまに起こる。いう場合の対応策として、普段はアクセサリとして腕に装着しておき、いざというときに充電ケーブルとして使用することができるNILSを購入した。www.kickstarter.com今年もお世話になりました。16:132018年買ってよかったものTweet広告を非表示にするコメントを書くもっと読む2018-09-30Golangのメモリ周りのメモ以前、このレポジトリがバズっていた。limitations.bytebufが小さなサイズのバッファ用にあらかじめ用意しているbootstrapというバイト列が、エスケープ解析の際に必ずヒープ上に確保されてしまうため、buffer構造体も本来はスタック上に確保できるはずであるが、ヒープ上にエスケープされてしまうという問題があった。64byte以下の小さなバッファであっても必ずヒープ上にアロケーションが走ってしまい、パフォーマンスが落ちていた。この件は既にパッチが当たっており、正しくエスケープがされるよう修正されているのだが、これをきっかけに「なんでヒープに確保することが重たいんだっけ」「どういうときにエスケープされるんだっけ」などのメモリ周りを調べたメモ。なんでヒープ確保が重たいのスタックの確保はとてもシンプルで、関数呼び出し時にスタックを伸ばし、関数を抜けた時点でスタックを縮める。比較して、ヒープ上へ確保する場合は、確保先の探索、GCなど様々な処理が走り、この差がパフォーマンスに効いてくる。他の関数で参照される、参照を取得する必要があるといった場合を除き、極力エスケープしないようなコードが高速に動作する。関数内のみで参照される値は、スタック上に確保されるそうでないものは、ヒープ上へ確保されるのだが、コンパイラが途中で解析を止め、エスケープする条件が複数ある。この条件は日々変更が入ったり、今回のような特定の条件下で異なる動作をする場合があるため、網羅することはできないが(本来プログラマが意識するべきではないが)、2015年の時点で以下のリンクなどにまとまっている。ドキュメントGoの公式ドキュメントを読んでも「すべての条件を説明するのは複雑すぎるので、コンパイルフラグで実際にエスケープされるか確認して」と書いてある。以下のコマンドで確認することが出来る。関係はないが、エスケープ解析に効いてくる最適化の一つに、関数のインライン化の解析がある。Goのコンパイラは、関数が以下の条件に当てはまるとき、関数を直接、呼び出し元に展開する最適化を行っている。GitHubこのインライン化がどうメモリ周りに効いてくるかというと、インライン化が無い場合、関数の引数に値を渡した時点でその値はヒープ上に確保されてしまう。インライン化された関数であれば、関数内での値の使用となるため、スタック上の確保で済む。別の記事で、この最適化を意識したコードの例を考えてみたいと思う。20:59Golangのメモリ周りのメモTweet広告を非表示にするコメントを書くもっと読む2018-08-26Prometheusの長期ストレージメモPrometheusを使うに当たって、長期ストレージについて調査をしたのでそのメモ。Storageのサポートがされている。以下のストレージを選択可能。writehttps://prometheus.io/docs/operating/integrations/ThanosThanosは、Prometheusのサイドカーとして動作し、長期ストレージ、クエリの高可用性、ストレージの最適化などを行ってくれるミドルウェア。既存のPrometheusにサイドカーを付け足せば良いため、運用後導入することも可能。Thanosは複数のコンポーネントから構成され、Sidecar、Store、Query、Rule、Compactorが存在する。実際の収集はPrometheusが行い、それをSidecarを通してStoreコンポーネントが永続化を行う。クエリ発行時はQueryコンポーネントがStoreコンポーネントに問い合わせる形でメトリクスを返す。Compactorは永続化ストレージ上のデータのコンパクションを行う。RuleはPrometheusのruleなどを分散管理するコンポーネントなのだが、仕組み上実験的なものとなっている。そのため、プロダクションで使用する際にはRuleコンポーネントを使わずに、各Prometheusに個別にRuleを定義し、管理することが推奨されている。各コンポーネントはgossipプロトコルを通してゆるふわに繋がるので、共通のserviceに繋げれば特に設定はいらない。導入はとても楽であるが、Prometheus詳しい人に聞くと、口を揃えて「良さそうだけど、まだ微妙」みたいな意見が聞ける。今までSSL証明書をなんとなく雰囲気で使っていた感が否めないため、自信を持って解説ができるよう具体的な仕組みを調べたメモ。三つがあり、主に公開鍵証明書が一般に「証明書」と呼ばれる。公開鍵証明書は、CA証明書とエンドエンティティ(またはリーフ)証明書に別れる。CA証明書はルートCA証明書と、中間CA証明書に別れ、ブラウザやOSはルートCA証明書の一覧をあらかじめ持ち検証に使う。ルートCA証明書は中間CA証明書を発行することができ、その中間CAも新しい中間CA証明書を作成することができるため、チェーンする。CA証明書かどうかは、拡張領域のbasicConstraints(基本制約)フィールドに設定されるフラグにより判断され、CAであれば上位のCAをたどり、ルートCAまで遡れれば検証が完了する。R2/O=GlobalSign/CN=GlobalSignsがSubject(証明の対象)、iがIssuer(発行者)。ServicesのCA、GlobalSignのルートCAと辿れていることがわかる。(GlobalSignはGMOグループのルート認証局。GoogleがGMOに依存してるの意外。)apacheだと中間証明書を指定するディレクティブがあるため意識しないが、nginxなどでは公開鍵に中間証明書を結合して設定する必要がある。https://tools.ietf.org/html/rfc7468#page-5。サーバ証明書、中間CA証明書の順で結合する。notAfter)以外の理由で失効する場合、証明書の失効はCRLまたは、OSCPというプロトコルによってクライアントに伝えられる。CRLは証明書に付与されるシリアルナンバーのリストをWeb上でホストする方式で、古いTLSクライアントで用いられている。このリストは肥大化するため、デルタCRLという差分のみを提供する方式がある。OSCPは認証局に証明書の状態を問い合わせるプロトコル。staplingを用いてサーバが代わりに認証局へ問い合わせる方式がある。22:43いまさらSSL/TLS証明書Tweet広告を非表示にするコメントを書くもっと読む2018-08-04GoでSpannerを扱う際のポイントそもそもSpannerって?SpannerはGCPが提供する高可用性のあるリレーショナルデータベース。SQL文が使え、スキーマ定義・スキーマの変更・SELECT系のクエリを実行できる。プライマリーキーを適切に設定すれば、負荷に応じて自動でシャーディングを行ってくれる。トランザクションも使える。この辺がよくまとまっている。設計講座GoでSpannerを利用した開発を行う中で、何点かわかったことがあったのでそのまとめ。CreateSessionは遅いSpannerに対してリクエストを行うとき、まずCreateSessionというgRPCが走るのだが、これが500msぐらいかかるため、Spannerに対して初めてリクエストを送る際など遅延が発生する。これを防ぐために、SessionPoolConfigを適切に設定する必要がある。この記事を見ながら設定すると良い。(Spannerはこの辺のドキュメントが全て日本語で読めるためありがたい...)クエリの遅延が発生した場合、この辺の設定を見直すことをおすすめする。DeleteでAllKeyは(基本的に)使えないテーブル内の全データを削除したいと思ったとき、愚直に考えれば「DeleteにAllKeys渡せばいいんだろ」となるのだが、データ数が増えた場合にこの戦略は使えなくなる。CloudSpannerは、変更系のクエリの影響範囲が20000件以内、という制限を持つ。これは、UPDATEやINSERTに関しては「影響を受ける列数が20000件以内」で、DELETEに関しては「影響を受ける行数が20000件以内」となる。「影響を受ける」件数であるため、20000件以上のデータを持つテーブルの初期化は、「一度消して作り直す」しか方法が無いらしい。実際には使うことができない。NULL制約を指定すると矛盾が発生するため、指定することができない。セカンダリインデックスの場合も、スプリットを意識したキーを選ぶ必要があるSpannerのPKを選ぶ際、スプリットが入ることを意識してキーを選ぶ必要があるのはご承知の通りだと思うが、セカンダリインデックスについても、スプリットが入ることを意識し、ホットスポットが入らないようなキーを選ぶ必要がある。ドキュメントにも明記されているのだが、セカンダリインデックスもテーブルとして実装される。よって、セカンダリインデックスに指定したキーは、そのテーブルの主キーとして使用され、スプリットもそのキーによって決められる。Timestampなどの単調に増加・減少する値を設定した場合、ホットスポットが発生し、スケールしなくなる。今後、また気づきが増えたタイミングで更新します。※Makefileに一部間違いがあったため、修正しましたbazelはビルドシステムの一つで、Googleが開発し社内でも使用している。makeなどの従来のビルドシステムと比べると、簡潔な設定で幅広い言語・ビルド対象に対応していて、ビルドが必要なものはほとんどbazelで解決できる。Bazel例えば、Goのビルドと同時にdockerイメージもビルドしたい、protoもビルドしたいといった場合、通常であれば個別にビルドコマンドを打つ必要があるのだが、この作業をbazelに一本化でき、とても便利。rules_dockerrules_goはGo言語向けbazelルール。go_libraries、go_test、go_binaryなどを提供し、Go言語に関するビルド、テスト処理を記述できるようになる。gazelleはrules_goを用いたビルド設定を自動生成するツール。importなどを見て、自動で依存を解決し、ビルド設定を吐き出してくれる。rules_dockerは、bazelを用いてdockerイメージをビルドしたり、プッシュすることができるルール。今回はgoのバイナリを含めたイメージをビルドし、実行する。以下にサンプルのレポジトリを作成した。mjhd-devlion/bazel-gazelle-sampleディレクトリ構造としては以下のようになっており、cmd以下のsampleが、今回動かす対象のプログラム。Worldを出力する。Worldを表示している。vendorまた、以下のようなMakefileを用意している。runすることによってプログラムを実行することができる。./Gopkg.lockここで一つ注意点があり、Makefileのgazelleの項に、update-reposという記述をしている。gazelleとvendoringは相性が悪く、特にprotoをビルドする際など、バージョンの違いによる問題が発生したりする。GitHub)に詳しく載っているのだが、protoをビルドする際にrules_goが提供する依存のバージョンがvendoringしているものと衝突した場合、ビルド時、または実行時のエラーが発生する。これを解決するためには、WORKSPACEにgo_repositoryルールを用いて依存するライブラリのバージョン指定をする必要があるのだが、手作業でやるのは流石に辛い。いうことで、実はgazelleはupdate-reposという「Gopkg.lockとgo_repositoryを同期する」プログラムを用意してくれている。(つい先日知った)サンプルでは、このプログラムを用いてdepの解決した依存に、bazelの依存を同期し、安全にビルドが行えるよう、update-reposをgazelle実行時に呼ぶような設定を行っている。実はvendorディレクトリを削除しても動く。依存はbazelがビルド時にダウンロードし、その後も管理をしてくれるため、vendorディレクトリの中身はビルド時に使用されていない。二重管理になってしまうため、vendorディレクトリを削除したいのだが、vendorディレクトリが無いとエディタが真っ赤になる...。何かもっと良い方法をご存じの方、是非コメントいただけると嬉しいです。AirBarを購入してみたwww.air.barAirBarは、タッチ未対応のノートパソコンの画面を、タッチ対応にするデバイス。(現在はWindows10のみの対応。今後Mac対応の製品が発売されるらしい)お値段も$69.00で買え、13.3inchから15inchまでのサイズをそろえている。最近、秋葉原で5000円ほどのタッチパネルを購入し、タッチ機能のすばらしさに気づいたため、どうせなら本体のディスプレイもタッチ対応にしてしまおうということで購入した。Amazon.com(co.jpじゃない)だと安い日本の並行輸入品だと1万超えてきてしまうし、海外で購入しても1週間ほどで届くため、注文時に多少英語を読む必要はあるけどAmazon.comで購入した方がお得。Amazon.comでは、$69.00+Shipping($11.31)で購入できた。内容物は、予備のマグネット4個、スクリーンクリーナー、ケース、AirBar本体、説明書。マグネット自体は本体にあらかじめ付いているため、予備は本当に予備。AirBar本体が思ったよりも細長く、洗練された印象。取付AirBar本体の背面に、マグネットが付いているため、このマグネットのシールをはがす。粘着面が現れるため、AirBar本体のガイドラインをよく見ながら位置を合わせる。位置は、ガイドラインと画面のはじを合わせ、画面した3mmほどのところに、水平に設置すると良いらしい。位置を決めたら、AirBarを画面に押し付け、そっとはがすと、マグネットが画面に張り付く。あとは、AirBarを画面に取り付け、USBを接続すれば画面がタッチ対応になる。Neonodeからファームウェアをアップデートすると良い。(例えば、初期の状態では変なブザー音が鳴っていたのだが、解消された。)感想タッチパネルとしての感想だが、精度は中の下ぐらい。同じ光学式のタッチパネルと比べても、少し感度が悪いため、文字の手書きなどの用途には使えない。設置の具合かもしれないが、画面右上の反応が悪いため、ウィンドウを全画面にした際にバッテンが押せないなどのもどかしさがある。持ち運ぶにもへし折れそうなほど細長いので怖く、あまり持ち歩く気にならない...。有線接続なのももったいない...かといって無線にすると電源が確保できないか...。...ただ、ディスプレイを交換することなくタッチ機能を追加できるのは、メリット。マルチタッチにも対応しているので、ちょっとズームをしたい際など、AirBarがあると便利。結論ノートPCってそもそも程よい位置にトラックパッドがあり、画面まで手をもっていかなくても操作をできるようになっているため、あえて追加のデバイスを使って、ノートPCを畳めなくしてまで、画面をタッチ対応にする必要もないなと思った。ノートPCをすぐに畳めない、持ち運びに不安があるという懸念点があるため、ノートPCをデスクトップ化して使っている人など、持ち運ばない用途であれば十分価値があると思う。余談Windowsってタッチパネル2つあると、カーソルがどっちかのタッチパネルにしか表示されないっぽい。<p>引用をストックできませんでした。<p>限定公開記事のため引用できません。