giantneco’s blog

技術メモ

社内基礎勉強会 #1

社内で行った勉強会の資料

slides.com

slides.com

他に社内で勉強会が走っているし、自分が勉強会に取り上げたいテーマで人が集まりそうなテーマが思いつなかった。 なので基礎勉強会という形で、再度初めから勉強し直したくはないが復習はしておきたいトピックで初心者にも受けが良さそうなものを紹介していく形の勉強会にした。 (どのみち人は集まらなかったが…)

Git の方は楽にスライド作れそうだし、現在のエンジニアは必須の知識だろうと思って最初のテーマに取り上げた。 楽に作れるかと思っていたが、「基礎」的な部分の定義がブレブレでどういうことを書くべきがかなり迷ってしまった。 Git について語りたいことは山ほどあったが、基礎的な話かというとそうでもない場合が多い。 結局結構スライドを削ることにした。脇道にそれるのはいけない。

次回についての要望がなかったので、独断でテスト駆動開発について話したいと思う。 TDD is dead と言われて久しいが、テストを先に書いたほうが良い場合は結構あるはずなので、うまいところ話しておきたい。

Scala 実践入門を読んだ

実践Scala入門

実践Scala入門

先月でた Scala 実践入門をようやく読んだ。

何か一つの言語(おそらく Java)を経験済みで Scala をこれから始めたいという人に勧めたい。

逆に Scala を超えて、関数型プログラミングアクターモデルなどは入門の範囲外ということであまり触れられておらず、 それらを学びたい人には向いていない。 そういう人は巻末の参考資料にある書籍から当たっていったほうがいいかも.

特に良かった点として、まず本のサイズをあげたい。 持ち運びが楽だし他の Scala 本の置き場所とおおよそ競合しない。 電子書籍にするにしても大きめの本だとコードとか見づらくなりがちなのでコンパクトなサイズは単純に嬉しい。 またこの分量で Scala でプログラミングを始めるのに必要な情報が揃うのは素晴らしいと思う。ビルドとテストのことも書いてあるし。 ただ短い分、若干説明が足りない部分もあったりするのがちょっと気になったか。

あと並行プログラミングに関する部分が薄かったのがちょっと残念。 最近流行りの言語では重要な機能なので、Scala が並行処理得意ですよというのがもっと書いてあっても良かったと思う。 そういうのは Akka でやっているので、おとなしくそちらを読んどけということなのかもしれない。

Kotlin Conf 2018 参加報告会 を見てきたメモ

10/15 と 10/19 に行われた Kotlin Conf 2018 の参加報告会を聞いてきた。

CA_kt の Kotlin Conf 2018 参加報告会

こちらは 10/15 に行われたサイバーエージェント主催の参加報告会。

Kotlin Conf 2018 Keynote Overview @satorufujiwara

Kotlin Conf 2018 Keynote を振り返る内容。

  • Kotlin Conf について
    • 今回で2回め
    • 参加者は 1300+
    • 今回はオランダ、アムステルダムで開催。前回はアメリカで開催だった
    • セッションはすべて動画で公開されている。見よう
    • 内容としてはコルーチン、マルチプラットフォーム、サーバサイドの話が多く、Android に関するセッションは 3 つ
  • キーノート
    • Kotlin 言語のデザイナー Andrey Brslav によるセッション
    • Be Pragmatic 実装者の考えをコードに落とし込めるようにしたい
      • Consicion < Readability
        • 簡潔さより読みやすさ
        • ボイラープレートは減らし、書いたコード全てに意味があるように
      • Expressiveness < Reuse
        • 表現力のためでなく、再利用のため
        • 標準ライブラリによく使われるパターンを入れている
      • Originality < Interoperability
        • 独自性<相互運用性
        • 他の言語にすでにある機能・知見を取り入れる
      • Soundness < Safety / Tooling
        • 言語的な堅牢さより、安全さ、ツールによるサポート
        • 静的型付き言語なのでツールも作りやすい
    • Kotlin 1.3
      • Coroutines -> stable
      • kotlin/native -> beta
      • build -> faster 75%
  • おすすめのセッション
    • coroutine exporing coroutines in kotlin
    • kotlin coroutines in practice
    • mutliplatform
    • kotlin/native concurrency
  • おすすめの Kotlin 教材

Kotlin 1.3 新機能 @_a_akira

  • 元になったセッションは New Type Inference and Related Language Features by Svetlana
  • Experimental features
    • Experimental features の目的は、アーリアダプターになるべく早く新しい機能を試してもらうこと
    • 使いかた
      • migration 1.2 to 1.3    * AndroidStudio で Tools > Kotlin > Enable migration option を選択
      • gradle
        • kotlin { experimental { coroutines 'enable' } }
      • 1.2 と 1.3 の import 違い
        • 1.2 import kotlinx.coroutines.experimental.*
        • 1.3 imoprt kotlinx.coroutines.*
    • ユーザ定義の experimental を作ることができるようになった
    • Contracts
      • Contract があると、そのコードが必ず一度だけ実行されることがコンパイラに保証される
        • run {} で変数を初期化するコードがコンパイルエラーにならなくなった
      • 自作もできる @ExperimentalContracts
    • New Type Inference
      • gradle で kotlin { experimental { newInference 'enable ' }}
      • SAM conversions
        • SAM = single abstract method の引数型が推論されるようになった
          • sequence<int> { yield 11, yield 42 }<int> を書かなくてもよい
      • Inference for call chains
      • Intersection types

優れたコードは小説のようか? @kaelaela31

  • 「よくかけたコード=小説」ということで文法に影響する Kotlin の機能の紹介
    • Kotlin Conf では表現について言及したセッションが多かった
    • Next Level DSLs
    • Writing The Next Great Kotlin Novel
  • Writing The Next Grewat Kotlin Novel
    • コードを自然言語のような書き方ができるとよい
      • 文脈、多様な表現, etc...
    • Kotlin では
      • 基本の語彙は英語、スコープが厳密、冗長な単語は省略、よりわかりやすいシンボルなどを使う
      • Object は名詞
      • Infix が便利
      • 受動態より能動態で書いた方が良い
        • food.isLikedBy(lisa) より lisa.likes(food)
      • Scope function を接続詞のように使うことができる
      • Kotln DSL
        • 内部DSL なのでコード汚染はあまりない

KotlinConf Report @takusemba

  • Best Practices for Unit Tesint in Kotlin, Phillipp Hauer から
    • MockK MockK<HogeFactory> verify() べんり メソッドがどのように呼ばれるかを検査できる
    • JUnit5
      • @TestInstance(TestInstance.Lifecycle.PER_CLASS)
        • テストごとにクラスを再生成できる
      • @Nested
        • テスト結果をグルーピングして IDE とかで見やすくなる
      • バッククォートでテスト名を記述できる
        • テスト結果などがかなり見やすくなる

JKUG の Kotlin Conf 2018 参加報告会

こちらは 10/19 に行われた Kotlin ユーザグループによる参加報告会。 会場は Line Cafe でとてもキレイな場所だった。

KotlinConf 2018 カンファレンス概要とトピックOverview @mhidaka

CA_kt のセッションとかぶるので、おすすめのセッションだけ。

  • おすすめのセッション
    • Keynote
    • Shaping your app's archiecture with kotlin and architecture components by Florina
    • Kotlin Coroutines in Practice by Roman Elizarov
      • コルーチンの使い方、Tips
    • Kotlin corutine bad practice and good practice

KotlinConf 2018 のワークショップに参加してきました あんざいゆき

今年の KotlinConf は初日が Workshop Day でした。 丸一日のワークショップに参加してきたのでその内容と様子についてお伝えします

ワークショップに参加してきた話

  • Kotlin Conf Workshop

    • 649 ユーロ 8万くらい ちょっと高い
    • 9:00 - 17:00
    • 朝食・昼食あり
    • 5 つのワークショップ
      • 変換プラグが C type で、穴にはめるタイプなので、ヨーロッパ行く人は注意
  • Acynchronous Programming with Kotlin

    • About
    • 内容
      • Asynchronous programming, introduction to coroutines ...
      • coroutine について一通り
    • サンプルプロジェクト
      • デスクトップアプリ
        • よく考えられたデモ
      • ちっさなTips
  • Kotiln での並行処理
    • thread
      • -> thread トップレベル関数でバックグラウンド実行
    • callbacks
      • -> Retrofitenqueue を利用
    • coroutine
      • thread の場合とそれほど変わらない書き方になる。シンプル
    • async, awaitAll
    • future
    • channel and actor

KotlinConf 2018 Android編 @hoshi_gaki

gyazo.com

  • Android Ssupenders, chris bane

    • coroutines on ndroid
    • jobs, scopes, reactivity
    • Reactivity
      • Rx のものは coroutine で置き換えられる
  • Shaping your app's archiecture with kotlin and architecture components, Florina

    • coroutine の why, where , how
      • why -> ease of learning, single/maybe/completale -> suspend fn
      • where -> ほぼ全部、どこでも使える
      • how to use -> retrofit2-kotlin-coroutines-adapter
    • Java とのつなぎ込み
      • suspend あ Continue を返すのでこれをどうにかしないといけない
      • callback 使うのが良さそう
    • Typing
      • これまで
        • data class UserId(val id: Long)
      • kotlin 1.3
        • inline class UserId(val id: Long)

「KotlinConf から見る、最近の Kotlin サーバーサイド事情」 @hktechno

gyazo.com

  • Server Side Kotlin
    • good: Null safety, tyep safety, functional programming, dsl
    • imporant: JVM 言語
  • Kotlin web framework
    • 選択肢はいくつかある: Ktor, http4k, spring boot
    • Spring Boot が多いっぽい
  • Which to use
    • Swagger, micrometer, zipkin を使う場合-> http4k, Spring Boot
    • coroutine を使う場合 -> ktor, spring boot(ただし unofficial)
      • Ktor は JetBrain 製なので coroutine もよく対応できている
  • Spring Boot を Kotlin で使うには
    • SpringFu, KoFu で Functional , DSL にできる(ただしincubating feature
    • annotation 対応の cofiguration ができる
      • annotation からは何が発生しているかが辿りにくい
  • API / Micoservices
    • RESTより GrapHQL(外部むけ), GRPC(内部向け), (Line ではThrift)がいいんじゃないか
    • REST bad: 型がない、スキーマが曖昧、パースにCPU使う
    • kubenetes kotlin DSL
    • 分散 Tracing の話が多かった
      • Opentracing , Zipkin
      • マイクロサービス使うなら導入しておきたい
  • Kotlin/Native
    • kotlin/Native はサーバサイドでもつかえるか
      • Concurrency 周りが難しそう
      • Ktor に期待, native をサポートしてほしい
      • Server-less な利用法では kotlin/jvm では startup time 問題があるので厳しい
        • サーバレスで使いたいなら GraalVM に期待したほうが良さそう

「Kotlinのユニットテスト ベストプラクティス」 @ngsw_taro

  • Best Practices for Unit Testing in kotlin @philipp_hauer
    • JUnit4
      • bad
        • boilerplate
        • @JvmStatic - kotlin には static がない
        • mutable な宣言
        • lateinit -> nullable の回避に使っているが煩わしい
        • mock -> mockit など java 用の mock は kotlin 向けでないのでツライ
        • kotlin 予約語と重複する関数があるので使いづらい
        • 読みにくいメソッド名
        • 貧弱なエラーメッセージ貧弱
        • テストごとにインスタンスを生成するので、static での初期化が必要なことがある
    • JUnit5 を使うのがベスト
      • @TestInstance
      • junit.jupiter.tesinstancelifecycyle.defaut = per_class
      • @Nested でグルーピング
      • バッククォートで読みやすいテスト名
  • おすすめライブラリ
    • どれもそこそこよい
    • おすすめは: JUnit5, mockK, AssertJ
  • mockK 注意
    • モックの生成は重い
    • 一度生成して clearMocks でクリアするのがよい
  • アサーション
    • データクラスのアサーション
      • フィールド毎でなく、データクラスをそのまま assertThat に渡すとよい。Assertion の結果が読みやすくなる

感想

  • 聞きに行く前は Android 関連の話が多いかなと思ってたが、Kotlin Conf ではサーバサイド向けの話が多かったらしい
  • コルーチンがあると並行処理に強くなるし、Kotlin/Native で起動時間も早くなるならコンテナ全盛の時流に乗れるかもしれないな、と思った次第
  • これから結構流行るんじゃないかとも思う
  • オランダのアムステルダムいいところらしい
    • 開催場所としては参加者に割と好評だった様子
    • サンフランシスコとかホテル代もどんどん高くなっているし、アメリカ以外での開催もこれから増えてもいいんじゃないかと思う

Visual Studio Code Extension 拡張を作成してみたメモ

最近 golang を書くのに Visual Studio Code を使っている。 で、使っていると当然不満も出てくるので拡張を書いてみることにした。 TypeScript は書き慣れていないのでその点の苦労はあったが、テンプレートや楽に試す環境ができているので割と楽に作ることができた。

一応欲しい機能は作れたのだが、その機能がすでにあることに気付いたのでとりあえず動くところまでやって終わりにしている。

準備

yoVisual Studio Code Extension のテンプレートがある。

yo を入れていない場合は次のコマンドでインストールする。

npm install -g yo generator-code

テンプレートの生成は次のようにする。

yo code

ウィザードに従って情報を入れればよい。

開発

テンプレート生成で作られたディレクトリに移動して、

code .

で workspace に拡張が入った状態で vscode を起動できる。

基本的には extension.ts をいじることになる。 拡張が読み込まれると activate が呼ばれるので、registerCommandでコマンドとして呼び出す関数を作ったり、イベントのサブスクリプトをしたりする。

デバッグする場合には、f5 で拡張を読み込んだ vscode を起動できる。

Ctrl+Shift+p で拡張で作ったコマンド(テンプレートのままだと Hello World)を指定して起動できる。

ハマったところ

拡張をつくるのは割とスムーズに行ったが、肝心の中身は慣れていない TypeScript を使う必要があったので苦労した。

やりたかったのは QuickPick を使って、ワークスペースのファイルを選択して開くということ。 (繰り返しになるが quickOpen というコマンドで完全に実現されている)

APIVisual Studio Code API Reference

このQuickPickを利用するには、showQuickPick に表示したい文字列のリストを渡すのだが、 リストをつくるのに時間がかかる場合にはThenableで包む。 非同期にやらないとエディタが泊まってしまうだろうし。

Thenable がちょっとハマった部分で、最初Tunableと読んでてググってもわからなかったり、 スペルミスに気付いて検索し直しても googleThen と解釈してやっぱりわからなかったりした。

一方、findFilesワークスペース中のファイルのリストをThenable<Uri[]>の形で得られる。 なので、showQuickPickに渡すにはThenable<Uri[]> -> Thenable<string[]>という変換ができればよいということで、これってファンクターだよねということで Thenable + functor で探したがそれっぽいのは見つからず‥

色々試してみると、.then(f: Uri[] -> string[]) とすればThenable<string>が得られることがわかった。

結局次のようなコードを書くことになった:

        var files = vscode.workspace.findFiles("*");
        vscode.window.showQuickPick(files.then((urls) => {
            return urls.map((url) => {
                return url.toString();
            });
        })).then((selectedItem) => {
            if (selectedItem) {
                var path = vscode.Uri.parse(selectedItem);
                vscode.workspace.openTextDocument(path).then(doc => {
                    vscode.window.showTextDocument(doc);
                })
            }
        });

変数の方とかは vscode 側が表示してくれていたので、実験しながらコードを書くのに非常に役に立った。 やっぱり型はあったほうがいい。

他、比較に === が必要だったりと、普段から JavaScript とか書いていないとしっくり部分があったが、 この点は vscode が優秀でちゃんと指摘してくれたのでなんとかなった。

参考

深セン・香港・マカオ観光してきたメモ 2

2018年の9月23日から28日まで深セン・香港・マカオを観光してきた。

この記事では旅行後半の香港とマカオを扱う。

3 日目、深センから香港に移動

この日は電車を乗り継いて香港まで移動した。香港の電車だと、みんな降車する人を優先していたのでやっぱり文化が違うんだなと思ったり。

再度国境を超える

ネイザンロードを少し見てからホテルに移動。

一泊あたりの値段は深センのホテルと大差なかったが、香港のホテルは非常に狭かった。 ホテルで一休みしてビクトリアピークを見に行く。

ピークトラム

観光客の数が相当多くピークトラムに乗るまでに長い行列にならんだ。

夜景はかなり良い。夜景を見ている人をターゲットにしている広告があったりしたのが興味深かった。

4 日目、香港観光

この日も適当にぶらつく。

文武廟

ハリウッド通りの壁画アート地帯

ミッドレベルエスカレーター

スターロード

ネイザンロードと女人街、男人街あたり

街中に来るとそこかしこに宝石店がある。しかもほとんど同じ店なので流石にうんざりしてしまった。

5 日目、マカオ観光

最初の予定ではマカオ観光はしないつもりだったが、気が変わったので急遽マカオにも行ってみることにした。ホテルは香港島にあるので、近くのフェリーターミナルからフェリーで移動。マカオまでは大体 1 時間ぐらいとかなり近い。

歴史保存地区を中心にぶらつく。

思いつきで行動したので、マカオ観光にはあまり時間を取れず、結局カジノには行かなかった。

6 日目、帰国

この日は帰るだけ。 帰りは香港エアポートエクスプレスのチケットをホテルで買って楽して空港まで移動した。

感想

  • 観光しやすい
    • 観光スポットかくあるべしみたいなお手本のような都市だった
    • 香港もマカオも小さい都市なので、観光スポットは狭い範囲に集中している
    • 英語通じるのもかなり楽
    • クレジットカードも大体の店で使える
  • 人多すぎ
    • タイミングもよくなかった。中秋節と、広州から香港への鉄道が開通したばかりなのもあって、中国人観光客が大量に来 ていたらしい
    • 深センよりも中国人が多くいた
  • 物価、交通費は結構高い

今回の旅行では深セン観光のおまけのような部分もあって、ちょっと事前調査が足りてなかった。実を言うとそれほど美味しい料理にはありつけていない。

また割と前半の深セン観光で体力を使いすぎた感じもあったので、あまりいろんな場所にいけなかったかもしれない。次行くとしたら観光だけに集中するようにしたいところではある。

深セン・香港・マカオ観光してきたメモ 1

2018年の9月23日から28日まで深セン・香港・マカオを観光してきた。

この記事では深センを扱う。

準備編

まず深セン観光前にした準備について。

  • インストールしておいたアプリ
    • WeChat
      • チャットというよりはWeChatPay目的に使う
      • インストールした後に WeChatPay を有効化する処理が必要
      • 自分がやったときにはクレジットカード(mastercard)での登録でできた
      • 中国国内では WeChat では通じなくて、「ウェイシン」と言わないと伝わらないので注意。画面見せればだいたいわかってもらえるので、そちらを見せるほうが早い
    • 百度地図
      • 中国本土内で使える地図アプリとしては baidu の百度地図がある
      • 行きたいところがある場合は「收藏」でマークしておくとよい
      • ただし「收藏」のためにはアカウント登録が必要
  • SIM カード
    • ここSIMカードを購入した
    • SIM フリーのスマホを持っているが、SIMスロットを開くのにピンが必要なタイプで、旅行にそれを持っていくと紛失しそうなので、最近の旅行では事前にSIMを購入している
  • チケットの入手
    • 航空券はいつも使っている Expedia から購入し、航空会社は香港エクスプレスを選択。香港で LCC となるとこれ一択になる
    • 直前になって名前と姓が逆になっているのに気付いた。これは香港エクスプレスに電話してなんとか変更してもらえた。あとで調べると香港エクスプレスではこのトラブルが結構多いらしいので、それもあって対応が早かったのかもしれない。
  • WeChatPay の準備
    • このサイトを参考に、旅行前にアカウントを有効にしておいた。自分がやったときには master カードも有効だった。ただしウォレットへの追加はできず。
    • 入金は羽田国際空港のポケットチェンジを使用した。出発ロビー側でなく、到着ロビー側にあるのでこれから出発する人には見つけづらいかもしれない
      • 画面に従ってポイントの振込先に WeChat を指定するとレシートが印刷されてくる。このレシートの QR コードを WeChat の QR コードスキャナーで読み取る。

旅行本番

1 日目、香港到着から深センで1泊目まで

香港到着から越境

バスから見た景色。中国らしくがかなり雄大な景色

早朝に香港に到着したので、香港国際空港から深センには始発が早いバス + 電車を使うことにした。空港バス乗り場から 43 番のバスに乗り、 MTR 上水駅まで移動、後はMTRで羅湖駅まで移動、後は徒歩で国境超えをした。

羅湖駅を降りると深セン方面には看板が出ている。他の人も大体は深センに向かっているので人の流れに乗っていればおそらく深センに行けると思う

入館では指紋の登録など一部混んでいるところもあったが、それほど待たされずに越境できた。日本のパスポートだとICチップ入りなので若干スムーズにできる

深セン入り

羅湖では「深セン通」という、深セン交通機関で使えるプリペイドカードを購入。滞在期間中の足に使った。 ただし、電車の入場でもQRコード支払いができるようだったので、WeChatPayにたっぷり入金していればそれほど必要なかったかもしれない

深セン通。なぜかドラえもんのイラストのものが売られていた。購入は自動販売機からできるので楽だが、リファンドは難しいらしい

羅湖から地下鉄にのり華強路に移動して、その後は徒歩で華強北の電子街に移動した。 昼はマクドナルドで初 QR コード支払いを試した。メニューの選択は店内に設置された端末で行い、 QR コードで支払い、受取だけ人力だった。

地下街でみかけたもの。中国も日本文化の影響を受けているんだよなあ

華強北電子

電子街到着後は体力の限りぶらついた。

「矿机」はマイニング用のマシンと思われる。結構あちこちで扱っていた

デモしている機械があったので3Dプリンタかと思ったら自動のネジ打ち機だった。

PM2.5 の検知器。中国らしいといえばらしい。ところで滞在中はそれほど空気が悪いと感じることはなかった。

LED たくさん

大量のネジだけを扱っている店もあった

ここではプリント基板を作ってくれるらしい。

怪しいものもあったり

無人コンビニ

しばらく電子街をぶらついていたが、訪問したのが土日だったせいか、開いていない店も結構あった。 人で混み合うということはなかったが、日本からわざわざ電子街を見に来た団体もいたし、値引き交渉していた欧米人の姿も見かけたので色々な人が訪れていたのだと思う。

結局この日買ったものは次のようなものだけ

  • Boogie Board っぽいやつ。 80 元だから 1,300 円くらい
  • GoPro っぽいやつ。 店の人は GoPro だとはっきり言っていたがまあそうじゃないと思う。180 元だから 3,000 円くらい

どちらかというと観光客向けのお土産品という感じだが、値段を考えるとまあいいかな。

DJI 旗艦店

ホテルにチェックインしてから今度は DJI 旗艦店に行った。

DJI 旗艦店は割と新しくできたと感じのするショッピングモールの近くにある

かなりモダンな建築

写真には取れていないが、このコーナーではドローンのデモをしていた

直前にあった台風の被害が痛々しい

tello を買おうかちょっと悩んだが、国際クレジットカードが使えないようだったのと、現金支払いだとレートの関係もあり日本で買うのとさほど変わらないようだったのでスルーした。

小米旗艦店

そのあとで小米旗艦店を観に行った

小米というとスマホ屋だという印象があったが、展示されていたのはスマホの他にも生活家電とか知育玩具とか結構幅広い商品を扱っていた。

小米旗艦店もショッピングモールの一角にあったが、周辺は広さを利用したでかい展示品があるので見ていて楽しい。

夕食

夕食は白石州というところまで行って食べてきた。このあたりは一昔前の中国という趣が残っていて、かなり安く食事を済ませられるらしい。

夕食を食べた店。

羊串。辛くしないでと頼んだが割と辛い味付けだった。

焼きなす。正直今回の旅行で一番気に入った料理。再現したい。

これらにビール1缶を合わせて 52 元、でだいたい 800 円くらい。実際安いしうまい。

2 日目、深セン観光と深セン 2 泊目

2 日目は電子街行くと現金がそこをつきそうだったので別の場所を中心に見て回ることにした。

CEES

スタートアップなどの企業の展示があるとのことだったが、フロアは空きのほうが多かった。

深圳书城

深圳にあるでかい本屋。

この建物の大部分が本屋になっている

技術書は AI 関連が多いのは予想していたが、C の本が結構あった。組み込み向け?

「软件」はソフトウェアの意味。ハードウェアは「硬件」

みんな大好きオライリーも中国語になっている

ディープラーニングのコーナー。定番の本が見える。

技術書のコーナーは期待していたよりうは小さかった。池袋のジュンク堂の技術書コーナーより少し小さいくらいか。 逆に広く場所を取っていたのは教育用の書籍のコーナーだった。1フロアがまるまるそのこーなーになっていた。なぜかインド式計算の本がいくつかあった。ブームなのかもしれない。

深圳市软件产业基地

深センソフトウェア産業基地というところにも来てみた。 名前の通りソフトウェアの会社が多く集まっているらしい。 来ては見たもののほとんど人がいない。 このあたりで土日に来たのはあまりよくないんじゃないかと気がついた。

共産党と一緒に企業しようのスローガン。マスコットキャラクターもいるはずだが見つけられなかった。

多分平日はもっと人が多いはず

OCT-LOFT

色々壁画アートなどがあるエリアがあるので見てきた。古い建物をリノベーションしているので、独特の雰囲気がある。

エリアの入り口あたり。スターバックスも後ろに見えている

写真には撮っていないがカップルがたくさんいる

感想・反省点

感想としては、

  • QR コードでの支払いは慣れてみるとかなり楽
    • その一方でネットワークに繋がらない状況だと支払いに失敗する
    • 電波状況には気をつけたい、現金も持っておいた方が良さそう
  • 電子街はとても広く見ているだけでも楽しい
    • おもしろガジェットを探すという点ではうまくいかなかった
    • 何か探したいものが決まっているとつらそう
  • 深センについてはかなり進んだ街という印象
    • 一方、大陸的あおおらかさによる雑さもかなり感じた
  • 深セン行きまでの準備大事
    • 前もっていろいろ調べたのもあって、割とスムーズに行くことができた
    • 逆にいうと調べてから行かないと詰みになりそうな場面もあった
    • 両替屋とかほとんど見かけなかったし
  • 物価、宿泊費、交通費はかなり安い
    • 香港に比べて非常にコストパフォーマンスがよい
    • 香港から日帰りでも行けそうだが、滞在費を考えると深セン泊してじっくり観光するのがいいと思う
  • 台風すごい
    • 直前に台風が来ていたので街並みを見るのにはタイミングが悪かった
    • 街路樹が倒れたままになっているのをよく見かけたが、本来はもっときれいな街だと思う
    • 逆に空気の汚さは滞在中感じなかった。これは台風のおかげなのかどうか?
  • 食事は良かった
    • 安くてうまいと言える
    • 現地の人はみんな鍋を食べていた
      • 個人旅行だったので試してみなかったが、複数人で行ってみんなで鍋を食べると楽しそう

反省点としては

  • 持ち込む現金が少なかった
    • master カード使えるところがもっとあるかと思っていたが、結局深センで使う機会はなかった
    • 深センで日本円から人民元に替えればいいかと思っていたが、香港に到着した後調べてみるとレート的には香港で換金するのが良いということがわかり慌てて換金することになってしまった。
  • 平日に行ったほうがよさそう
    • 営業していない店もあった
    • 深圳市软件产业基地は特にこれに当てはまると思う

参考にした本

builderscon 2018

9/7, 9/8 に builderscon tokyo 2018 に参加してきた。 builderscon はあまり技術分野などの縛りがないカンファレンスで、 他のカンファレンスではなかなか聞かない話が聞けるおもしろイベントだ。 縛りがゆるいとはいえ、発表内容は結構レベルが高いものも多い。

Web周りから低レイヤまで幅広いジャンルの話が聞けるので、 参加したらなにか一つは引っかかるものがあるんじゃないだろうかと思う。 これまで聞いたことがない話を聞きたいという人にはすごいあっているじゃなかろうか。

会場は一つを除くとさほど狭くないので、 観るセッションは決めておいて早めに並んでおかないと見逃しやすい。 自分も結構聞きたいセッションを逃してしまったので、ここらへんは改善してほしい。 そういうのは会場変えないと難しいのかもしれないが…

ちなみに開催場所は日吉。 Google Map での表示を見ると駅から少し歩くように見えるが、 実際には駅から出てすぐの建物になるので初参加の場合は気を付けたい。 前回初参加のときはちょっと間違えた場所に行ったが今回は間違えなかった。

以下見てきたセッション

Envoy Internals Deep Dive by Matt Kelin

Envoyはマイクロサービス向けのサービスプロキシ。発音は「あんぼい」に近い。

Envoy とは

Envoy はマイクロサービス向けのサイドカーロキシー。ユニバーサルなデータプレーンとも。 このサイドカーロキシーは、マイクロサービスを動かすノードに常駐して、 アプリケーションや言語、フレームワークによらずロードバランシグなどを行ってくれるものを指すようだ。 同じノードにのるということで「サイドカー」ということなのかも。

背景

Envoy はマイクロサービスを作るにあたって出てくる次のような問題を解決する: * 複数の言語とフレームワークの解決 * 複数のプロトコル ( HTTP/1, HTTP/2, gRPC etc ) * ブラックボックスなロードバランサ (AWS ELB とか) * 一貫したモニタリング方法がない (統計、トレーシング、ロギング) * 足りない機能 (リトライ、サーキットブレーカー、タイムアウトなど分散システムのベストプラクティス * 認証周り * 言語ごとに存在するサービス呼び出しのライブラリ * レイテンシーやエラーのデバッグの難しさ * マイクロサービスアーキテクチャを信用していない開発者

Envoy は、ネットワークはアプリケーションに対して透過的=アプリケーションの問題が起きたときにその発生元が簡単に特定できるようにしたい。

Envoy の目標

  • プロセスアーキテクチャの外側で動かす
  • 低レイテンシ、高パフォーマンス、高開発効率
  • L3/L4 フィルター
  • L7 での HTTP フィルター
  • HTTP/2 ファースト
  • サービス・コンフィグディスカバリと API の提供
  • アクティブ・パッシブなヘルスチェッキン
  • よりよいロードバランサ
  • サービス・ミドル・エッジプロキシー
  • ホットリスタート

Envoy のアーキテクチャ

xDS API による設定マネジメント

  • Envoy is a universal data plane
  • xDS == X Discovery Service つまり:
    • LDS == Listener Discovery Service
    • CDS == Cluster Discovery Service
  • gRPC ストリーミングや JSON/YAML REST Protocol Buffers (proto3) もサポート
  • 中央集権的に Envoy 設定を管理することができる
  • Eventual consistency

Envoy のスレッドモデル (c10k)

  • アイディアとしては、スレッドにイベントループを持たせて複数のコネクションを操作する
  • メインスレッドはデータと関係ない様々なタスクを実行
  • ワーカースレッドは並列にリスナー、コネクション、プロキシをハンドリングする
  • ブロッキングを避けるためにファイルのフラッシュをするスレッドを持つ
  • 100% ノンブロッキング
  • RCU (read-copy-update) をメインスレッドとワーカー間の共有に使用

ホットリスタート

Envoy はコネクションを一切切らずにバイナリのリロードができる。 仕組みとしては: * ソケット、ロックはシェアドメモリー上に持つ * シンプルな RPC プロトコルunix domain ソケット上で使用 * ソケットなどはプロセス間でやり取りする

Caching at Netflix: The evolution of EVCache by Scott Mansfield

EVCache = Ephemeral VOlatile Cache は Netflix が開発している KV ストア形式のキャッシュ。 特徴として: * 分散、シャードされた KV ストア * memcached を基にしている * インリージョンかグローバルかチューニング可能 * AWS に最適化している (AWS は色々問題があるので)

パフォーマンスの話で性能について話すのにパーセンタイルを使っていたのが興味深い。 聞いてみるとパフォーマンスのイメージを掴みやすいかったので、ぜひ自分もマネしたい。

パフォーマンスの問題解決については同じフロアに Brendan Gregg (詳解システムパフォーマンスの著者、パフォーマンス研究のすごい人)がいたのがよかったとのこと。

カクヨムでの縦組み表示の実装と縦書きWebの将来に向けて by nanto_vi

カクヨムで行っている縦書き表示での苦労と将来的にはどうするかについての話。

縦書き表示は CSS では規格があるものの、そのまま使うと表示がおかしくなる例があったり、バグも結構あったりで大変だったらしい。

後半ではバグの報告の行いかたについての話があった。

バグを新たに報告する際には次の3つを書くとよい * 簡潔な再現コード (jsfiddle を使うのが便利) * 期待する挙動 * 実際の挙動

あと Web 屋さんにとってはブラウザ間の挙動の違いもバグに含むものらしい。

謎ガジェット by @uzulla

https://builderscon.io/tokyo/2018/session/442f46cc-c888-4cc6-8e66-0f17144ea5fb

おもしろガジェットを作ったという話だが、作った数が 200 台ということでなかなか普段聞くことがない話を聞けた。

200 台なのでバッテリーが200個とかネジが 4,000 本あったりとするので購入するのにかなり苦労したという話も。 実際に小規模な大量生産しようとすると訳に立ちそうな話がたくさんあった。

途中でも人に評価してもらうことが大事で、作業に集中しているとすごい見落としてしまうことがあるそうだ。

Java カード @moznion

Java カードの話。SIM カードやクレジットカードはこの Java カードらしく、それらのカードの上で jvm が動いている。 当然制限は普通の JVM よりかなり厳しく型は byte だけだし、メモリの扱いなどにもかなり癖がある。

たとえば、電源を切っても Java カードの vm はとまらず、インスタンス変数のデータは残り続けるなど普通の環境とは違うことが多々あるようだ。

lld, rui314

lld の話。今回の builderscon で聞きたかった話。 lld はとにかく高速ということで、最近色々なプロジェクトで使われているし、特に FreeBSD ではデフォルトのリンカになっている。

最初は Windows 上のリンカとして作られたが、ELF 向けのパッチが送られてきてなし崩し的に他のものもターゲットになったというこ。

高速にするためのコツがかなり聞けたので良かった。 * よいデータ構造にするのが重要:データが先、コードが後 * 2回書く、1度目の経験を2度めに活かす * 最適化する箇所を最小にとどめる

gold との違いが気になっていたが、gold ではスレッドをタスク、ワーカーで扱うなど汎用的な書き方にしているので lld よりも遅くなっているのではという話。

Securty, privacy performace of next-generation transport protocols, Kazuho Oku

ネットワークプロトコルのセキュリティで、主に TLS の現状と将来のQUIC の話を聞いた。

現在の TLS 1.3 でどのような問題があって、 QUIC ではどのように解決しているのかなどを聞いた。 主な話としては: * TLS 1.3 * QUIC * Encrypted SNI

といったようなあたらしい拡張でプライバシーを確保することができるようになり、 セキュリティ面でこれまでの TCP/TLS とはかなり違った世界になるらしい。

ルーター屋とプロトコル屋で意見に違いがあったりしてな興味深かった。

TLS

  • TLS 1.2
    • ハンドシェイクには時間がかかる: Hello -> 鍵交換 -> 終了通知 -> 終了通知
    • 最初のパラメータ交換のときは暗号化されていないので、クライアント証明書・サーバ証明書がバレてしまう
    • iOS はクライアント証明書が端末単位なので、あるユーザがどのネットワークにいたのかがわかってしまっていた (トラッキング)
  • TLS 1.3
    • 最初に公開鍵を交換してとりあえず通信を暗号化
    • 暗号化してから証明書の交換

QUIC

TLS over TCP では man-on-the-side アタック = パケットを観察して RST などをインジェクションする攻撃が多い。 これは他の攻撃に対してコストが安く済むため。 この攻撃に対策するためには、認証付きでパケットを暗号化するのがよくて、QUIC ではそれを行っている。

  • QUIC の特徴
    • encrypted transport
    • handshake in 1 RT
    • mulitiplexing streams int on connection
    • fix head-of-line blocking int HTTP/2
    • mobility (network migration)

QUIC の問題 * 暗号化 * 複数のストリーミングの1つで暗号化のための前処理を行っているので、他のストリームからはいつ QUIC で暗号化通信が開始できるかの判断が難しい

Encrypted SNI

SNI = Server Name Identity も暗号化が進められている。まだドラフト段階。

Excel 依存からの脱却と失敗

非常にレガシーな体制な会社でワークフローを Excel 依存から切り替えようとしてうまく行かなかった話だった。

技術選定に失敗したとあったが、技術選定は選ぶ余地がある場合に使う言葉ではなかろうか。

上からの命令が絶対で、技術の選定が技術的な理由でなく政治的な理由から決まるというのはかなりひどい話だ。

最初から最後まで成功しそうな感じがしていなかったので、大変でしたねと言う他ない。

自分が作ったシステムで人が首になるというのはかなり胃が痛いらしい。

なぜエンジニアはパフォーマンス計測しないのか , @mogetta

健康の話

ウェアラブルバイスや IoT 機器など、健康に関する色々なガジェットを試してみたという話だった。

色々製品が紹介されたので、若干通販番組のような気分だった。

結構お金がかかっているが、健康のためにはしょうが無い。。のか?

紹介されてたモノ * HEALBE Gobe2 * Withings Wifi Body Scale * Withings Activie * Withings Sleep * JINS MEM * Spire

話を聞いてて欲しくなったがちょっと高い…。

計測結果はは Firebase に入れておいて、いろいろグラフを作りやすくしていたらしい。 やっぱり計測は大事か。

Chrome デベロッパーツールのハック

Chromeデベロッパーツールをうまいこと使ってテイラースウィフトのチケットを入手したという話。 テイラースウィフトのPVをたくさんみると、チケットが購入しやすくなるというキャンペーンをやっていたらしく、 紹介されていたハックは youtube の動画の再生数をスクリプトを使って稼ぐようにするものだった。

スクリプトを作るために、まず最初にChromeデベロッパーツールを使って、 動画の再生速度を上げたり自動再生するようにしたりするリクエストがどうなるかを調査していた。

そして狙いのリクエストが作れたらクリップボードにそのリクエストがコピーできるので、これを cURL などに渡す。 後はシェルスクリプトでもなんでもこのリクエストを投げるようにして目的達成となる。

普段フロントエンドそれほど触ったりしないので、興味深く話を聞いていた。活用できれば便利そうだ。

1 日 700,000 ビルド: Docker と Nomad が支える CI/CD プラットフォーム

Circle CI でどのように CI/CD プラットフォームを提供しているかという話。

Docker は当然として、Nomad は全然知らなかったので使っているとは思わなかった。 ただ話を聞いていると、たしかに妥当だなという感じがする。