Tokyo Course Grained

カナダ西海岸ソフトウェアエンジニアのブログです

397日続いていたiKnowのStreakが途絶えた。

f:id:iwg:20170319145000p:plain

(まじどうでもいい話が続きます)

続きを読む

コーディング面接対策には coursera の「Mastering the Software Engineering Interview」がおすすめ

これ https://www.coursera.org/learn/cs-tech-interview/home/welcome

本で勉強していたので自分にとっては知ってる話が多いんだけど、いい例、悪い例とか動画で見れるのがよかった。インタビュー多くて経験談とか失敗談が身近に感じさせていい(最初の面接で緊張して場を和まそうとジョークいったら面接官にキレられた話とか渋い Sometimes it happens らしい。そうだね

このコース見るまでこういう本を読んでた。

www.amazon.com

www.amazon.com

Cracking the PM interview は Product Manager 向けと見せかけてソフトスキルとか経験に関する受け答えに関しては一番くわしい。あとコードインタビューの説明もある。Coding Interview はコードインタビュー特化の問題集みたい。

www.amazon.com

これは説明が多くてよかった。

コーディングインタビューとしてはこの本がレビュー高くて気になってる。

www.amazon.com

finagle の Contexts

以前発表した finagle 話 で request id をリクエストに振るのにフィルタを使うといいよ、 でも後続のフィルタまたはサービスで id を使いたい場合どうやって渡すかが問題で、 今のところ http のヘッダにぶっこんでるが悩む…って話をした。

finagle のドキュメント読んでたら Contexts という機構を見つけてこれがリクエストごとのid に使えそう。 サンプル見ただけじゃ意味がわからなかったんだけど、ちょっとしたコード書いてみたら完全に理解した。

case class MyContext(id: String) {
  def asCurrent[T](f: => T): T = MyContext.let(this)(f)
}

object MyContext {

  val ctx = new Contexts.broadcast.Key[MyContext]("com.github.iwag.mycontext") {

    override def marshal(value: MyContext): Buf = {
      value match {
        case MyContext(id) => Buf.Utf8(id)
        case _ => Buf.Empty
      }
    }

    override def tryUnmarshal(buf: Buf): Try[MyContext] =
      buf match {
        case b if buf.isEmpty => Throw(new IllegalArgumentException("illegal"))
        case Buf.Utf8(id) => Return(MyContext(id))
        case invalid => Throw(new IllegalArgumentException("illegal"))
      }
  }

  def current = Contexts.broadcast.get(ctx)

  private[iwag] def let[R](myContext: MyContext)(f: => R): R =
    Contexts.broadcast.let(ctx, myContext)(f)
}

class RequestIdFilterEx extends SimpleFilter[Request, Response] {
  override def apply(request: Request, service: Service[Request, Response]): Future[Response] = {
    MyContext("test").asCurrent { // コンテキスト作成
      service(request) map { res =>
        MyContext.current.map { c => // こんな感じでとれる
         res.headerMap.add("mycontext-id", c.id)
       }
        res
      }
    }
  }
}


class HTTPServiceImpl(log:Logger) extends Service[Request, Response] {
  override def apply(request: Request): Future[Response] = Future.value{
   val res = Response()
   MyContext.current.map { c=>
      res.headerMap.add("mycontext-id-http", c.id) // 別のサービスでも取れる!
    }
  }
}

// ... 略
curl -i -XPOST localhost:40080 
mycontext-id-http: test
mycontext-id: test
Content-Length: 0

ClinentId のソース 見るとわかりますがほぼパクってます、、ちょっと違うけど、、、ClientId.scala これ finagle.thrift じゃなくて finagle.core においてもよいんじゃという気がする。

結局、 if(contextsがあるなら)みたいな感じで汚いがヘッダに突っ込む方式ではフィルタサービスが HttpRequest じゃないといけなかったのでよりいろんなところで使えるようになっていると思う。

いろんなところで読めるようになると何がうれしいか。例えば私のfinagleサーバは elasticsearch を使ってるんだけど、elasticsearch へのHTTPリクエスト(JSON) にこの id を紛れ込ませれば elasticsearch のスロークエリログにもidが載ることになり、スロークエリがどのリクエストだったか照合とかができるようになる。 MySQLとかRedisとかにもどっかに突っ込めるのだろうか、、、

ちなみにこのContextsの応用がTrace(zipkinとかで使う処理のトレース用)でこんな感じでどこでも(!)取れる

Trace.id.traceId.toString()

これを RequestId ということにするのが早いという説も、、、

しかし Context の仕組みがわからない(例えば broadcastとlocalの違い)、たぶん Trace.scala とか見れば、サーバを越えてContextから値を取るとかできるはず。。。

Traceというか zipkin の仕組みも調べて書きたいな、、、

広告を非表示にする

scala Future 使う気ないよ

最近 finagle の gitter http://gitter.com/twitter/finagle 気づいてウォッチしてるんだけど盛り上がっててよい。

finagle では com.twitter.util.Future を使っていることで有名だが、 scala の Future 使う気ないのって聞いてる人がいた。

gitter.im

それに対するnakamura氏の回答。

gitter.im

する気ないっぽい。 いろいろサポートしてない機能あるしそもそもセマンティック違うしとのこと。 まあ bijection https://github.com/twitter/bijection とかあるしな。

以後コンテキストスイッチとかスケジューラとかの話が続くが全然理解できてない。。。

MadMax: 怒りのデスロードを見ました

素晴らしかった。自分はヒャッハーってならなくていい映画だったなーとしみじみ思いました。とにかく映像、アクションのアイディア、アイディアがすごかった。

www.youtube.com

いままで見たことないシーン・アクションしかなくて、しかもCGじゃない生々しい!!

そしてストーリーは教科書みたいにちゃんと整ってるし希望が持てるストーリーだもんなー、、奇跡みたいな映画だったなーと思うわけです。 それに比べてネットの企画や自分作ったりしてるもんはなんて普通なんだ…って思うわけです。*1

立川シネマシティの爆音上映にも行ったよ!でも耳が悪いのかあんまりわからなかったw まあそれまで見た中で一番大きいスクリーンだったのでよし。

で、そんなゲームをやりたいわけですが、車に体当りしたり銃撃でぶっこわしたり槍を投げたりとか(さすがに棒に乗るのはないとしても)できるゲームはないんですかね…。 Just Cause のチームが作ってるというMadMaxのゲームはトレーラーを見ていろいろ察した 初見時は音楽はいまいち乗れないなーって思ったんですがApple Music に来てたのでカーチェイス中の音楽(brother in arms, spickey cars(訳すとトゲトゲ車って))を何度も聴いてたらかなりハマってる気がしました。

ちなみに推しメンは人喰い男爵(原語:people eater)です。

*1:最近のアクションってゲームで見たな、、とか多いわけで、インセプションの最後の雪山のとこのMW2感とか、ミッションインポッシブルの新作の予告あったけど飛行機に捕まるのとかこれセインツロウで見たわ〜って思った。

大阪と高松に行ってきた

scala関西っていうイベントに行ってきた。大阪はその日最高気温37度で本当に暑かった。
f:id:iwg:20150809004040j:imagef:id:iwg:20150809004029j:image

その後高松へ移動。姫路ー小豆島ー高松というルートを使った。
姫路港でみた野生化した多肉植物です。
f:id:iwg:20150809004202j:image
姫路から小豆島までのフェリーが1500円なのに売店もあるでかい船だった… 

島で見た農民車。農民車についてのサイト見てたのでちょっと感動 http://tkn203.webcrow.jp/
f:id:iwg:20150809004347j:image
高松で食ったうどん
f:id:iwg:20150809004537j:image
f:id:iwg:20150809004639j:image
8月に西日本に行くもんじゃないなと思った… 

最も効率的にシムオリオンを稼ぎたかったらイスとネジを作りなさい #SimCityBuildIt コスト表

掲題の通りで表を作ってみた。2015/04/12現在のものでレベル調整とかで変わるかも。

品名 売価(最高) 時間 必要な品名 1時間あたりの金
レンガ 190 20m 2 ミネラル 570
セメント 440 50m 2 ミネラル 1液体 528
イス 300 20m 1ネジ 1ハンマー 2木材 900
液体 60 2h 30
310 30m
ハンマー 90 14m 360
メジャー 110 20m 220
ミネラル 40 30m 80
120 30m 2木材 240
30 20m 90
シャベル 150 30m 1鉄 1木材 1プラ 300
壁紙 90 3h 30
野菜 160 20m 2種 480
木材 20 3m 400
ネジ 80 5m 2鉄 960
ノリ 1h 2プラ

自分のおすすめはネジとイスなんだけど、木材もかなり割がいいというのも工場はラインがたくさんあるので、時間あたり4000, 5000とかいけるわけなんだけど、ただ木材は市場を見る限り供給過多感あるのでおすすめしない。