生涯未熟

プログラミングをちょこちょこと。

S3にファイルがアップロードされた時にCloudFrontのキャッシュを削除してみる

掲題の通りのことが社で必要になったのでGoでやってみました。

やりたいこと

S3に置いた静的HTMLをCloudFrontを通してアクセスする、という形で配信しているシステムがあり、運用する中で静的HTMLを置き換えた時にすぐに切り替わるようにしたいということで、CloudFrontのキャッシュを都度削除する必要がありました。
ただし、毎日切り替わる代物なのでその都度手動でCloudFrontの特定Bucketに対してInvalideするのは面倒だなーと思ったので、それならファイルを置いた時に自動的にInvalidateが実行されるようにしたいというのが目的です。

どうやるか

さて、やり方ですが今回はLambdaを使って実現しました。

Lambdaのイベント発火条件として「S3のObjectCreatedByPut」を使います。
これでS3の指定したBucketにObjectが生成・更新された際にLambdaの関数が動いてくれます。

そして、以下のようなLambda関数を作成します。

簡単に説明すると、発火したイベント詳細を引数として受け、そこからバケット名を取得してCloudFrontのDistoributionのドメイン名と合致するものを探します。

見つかれば、そのDistributionに向かって CreateInvalidation 関数を使ってinvalidationを実行するだけです。非常に簡単ですね。

こんなにも簡単に作成出来てしまうのだからLambdaの力は凄いですね。
贅沢を言うとGoの設計テンプレートが全く無いので、AWSの中の人には頑張って追加して欲しいところ・・・🙏

Elmハンズオンに行ってきた

最近ある方がElmを猛プッシュしているので、Elmハンズオンに行ってきました。

elm-jp.connpass.com

f:id:syossan:20180923143335j:plain

togetter.com

Elm is 何?

Elmはウェブブラウザベースのグラフィカルユーザインタフェースを宣言的に作成するためのドメイン固有プログラミング言語である。Elmは純粋関数型言語であり、ユーザビリティ・パフォーマンス・堅牢性を重視して開発されている。静的かつ強力な型検査によって「事実上一切の実行時例外が起こらない」ことを売りにしている。 - wikipediaより引用

ってなわけで、WebアプリケーションにおけるUIを担う純粋関数型言語ですね。

The Elm Architecture

ElmにはThe Elm Architectureというアーキテクチャで動いています。

f:id:syossan:20180923142523p:plain

ハンズオンではこれをカウンタアプリケーションだとこう動くよって感じで示してくれました。

f:id:syossan:20180923142939p:plain

UpdateでModelの状態を変更し、変更されたModelを基にViewでHTMLを表示する、って感じですね。

ちなみにこのアーキテクチャを参考にReduxとかも作られたらしいです、しゅごい。

純粋関数型言語

Elmは純粋関数型言語のため、副作用を生むことなくアプリケーションを作成することが出来ます。
初めて純粋関数型言語を触ったんですが、変数を使わず関数のみで書くのはなかなか不思議な体験でした。

例えば、ハンズオン中でも説明があったのですが、 |> という要素も関数というので驚きでした。

ハンズオンの感想

というわけで、ハンズオンですが物凄く丁寧な説明と複数人のメンターの方がいて、初心者の私でもElmが理解できるくらい手厚いハンズオンでした。
資料自体もかなりわかりやすく、これだけ読んでもアプリケーションを作れるくらいに仕上がっています。

gitpitch.com

今回のハンズオンではインクリメンタルサーチを作ってみたのですが、少し悩みながら1h30ほどで動くものが作れました。
早い人では15分ほどで完成しており、元々関数型言語に造形の深い方はスッと慣れることが出来る言語なんじゃないかと。

あと、このハンズオンだけでElmのほとんどの基礎を網羅しており、残りはif文くらいの要素を学べば「Elm完全に理解した」と言えるくらいの学習コストの低さにも驚かされました。

最後に有識者のLTがあったのですが、Elmを使ってこんなのが作れるんだー!という気持ちになれたので最高でした。
飛び入りのLTもあったのですが、まさかの海外Elm勢で更にsoundcloudのエンジニアさんで、しかも物理演算を使ったプログラムを紹介していて3重に驚きでした・・・しゅごい。
その方の発表の中でPrometheusでElmが使われているということを知り、もっと有名なソフトウェアでElmが使われれば流行ってくるのかな?というお気持ちになりました。

github.com

というわけで、めちゃくちゃ勉強になったハンズオンでした!
運営の方々、ありがとうございました!!

Ergo42を買った

最近、非常に肩こりが酷くなって「そろそろ分割キーボードってものに手を出すか」って感じになったのでErgo42を買ってみました。

Ergo42とは?

Biacco42さんが作製された分割キーボードで、こちらにどういうキーボードなのかの詳細が書かれております。

biacco42.hatenablog.com

キットを買って自作するタイプが多い中、組み立て済みのものが買えるようだったので「試しに買ってみるか」というノリで買ってみることに。
購入は以下から出来ます。

tanoshii-life.booth.pm

使ってみて気付いたこと

数日ガッツリ使ってみたのですが、確かに肩こりは楽になった気がします。
もっと使い込んだら正確に分かると思うのですが、数日レベルだとまだ気がするレベルです。

あと、実際に使ってみて分かったことと言えば腕を広げて使うことによって、自然と姿勢が良くなるってことですね。
結構気付くと猫背気味になる人間だったのですが、肩幅くらいまで広げて使っていると猫背だと逆に使い心地が悪くなるんですよね。
猫背気味になってしまう方にはオススメかも。

やっぱり慣れるまでは大変

初めての分割キーボード&格子配列なのですが、やはり慣れるまでは結構大変・・・という印象です。
特に今まで手癖のように打っていたログインパスワードなどが全く打てなくなって現在進行系で困っていたりします・・・

あとは我流でキータイプを覚えていたのですが、今までbを右手で打っていたのが間違っていることに気付けました。
なので、こちらも相まって慣れるまでが大変だなぁ・・・と。

けどやっぱり便利

ただ、やっぱり便利だなーと思う場面は多いです。
やはりキーマップを好きにいじれるというのは偉大ですね。

現在、親指にEnterを配置しているのですがこれが凄い快適です。
今までは小指で力強く打っていたのですが、親指で打てることによって小指の負荷がだいぶ減りました。

個人的におもしれーと思っているのがマクロですね。
Cでサクッとコード書くことによって設定した好きなマクロを動かせます。
僕はGopherなのでタイプすることの多い if err != nil {} をキー1つで入力出来るようにマクロを設定しています。

まだまだカスタマイズの余地がある

キーマップもそうですが、まだキーキャップの選定などやらないといけないなーっていうカスタマイズ項目があってワクワクしています。
こういう本当に自分にフィットしたものを作れる、っていうところに惹かれて自作キーボード沼にハマっていくんだろうなぁと朧気ながらに感じております。

あまり沼にハマらないよう、適切な距離を保ってこれから自作キーボードと触れ合っていきたいと思います。

備考:キーマップの変更について

キーマップ変更の際に少しハマったところをメモ。

キーマップ変更に使うavr-gccですが、最初に osx-cross/avr にあるavr-gccを使って試したら以下のエラーが発生しました。

avrdude: ERROR: address 0x8001f8 out of range at line 1058 of .build/ergo42_rev1_default.hex

そこで色々調べたら以下の記事が。

www.reddit.com

どうやら、 leico/avr をtapしてからv8.1のものをインスコして使うといいよ、ということらしく試してみると無事成功しました。

別の情報でv8.2だとまだうまく動かないというのを見かけましたので、困られている方はその辺を調べてみてください。

buildersconに初参加してきたぞ!

というわけで、以前から気になっていたbuildersconに行ってきました。

どんなイベント?

builderscon.io

buildersconではトークに関して技術的な制約はありません。
特定のプログラミング言語や技術スタックによるくくりも設けません。
必要なのは技術者達に刺激を与えワクワクさせてくれるアイデアのみです。

という、何でもありの技術イベントですね。
開催前にCFPが募集され、運営様によって厳正に審査された選りすぐりの技術セッションが楽しめます!

会場は日吉にある慶應義塾大学です。
何気に今回初めて日吉に行きました・・・

こちらメインホール2Fからの素晴らしい眺め👀

f:id:syossan:20180907141651j:plain:w600

どうだったか?

詳しいセッションの感想などは社のブログに書くとして、builderscon全体のザクッとした感想をつらつら書いていきます。

運営様の素晴らしさ

どのカンファレンスも素晴らしい運営様によって支えられていますが、ご多分に漏れずbuildersconの運営様も素晴らしかったです!
今回の初参加にあたってチケット周りとか「あれ?これどうしたらいいんだろ?」って困ることが特に無かったくらい、運営様からのお知らせが公式Twitterアカウント等でされていました。
また、一点分からなかったところがあったのでTwitterで聞いてみたところ即レスポンスが返ってきたのは本当にありがたかったです!

また、途中腕時計を落としたのですがすぐにTwitterでアナウンスされており、それを見て取りに行くという一コマもありました。
ありがたやありがたや・・・🙇

天然のうまい棒

行った人は分かると思うのですが、参加者にはjollyjoesterさんからの天然のうまい棒が振る舞われました。

戦利品の天然のうまい棒(サラダ味・たこ焼き味)

f:id:syossan:20180908001331j:plain:w300

そしてjollyjoesterさんの後継者がいたので、お写真撮らせて頂きました。

f:id:syossan:20180907160426j:plain:w300

大学近くのお食事処

慶應義塾大学があるということで、近くにはお昼ご飯を食べるところが盛り沢山にあります。
最初はランチセッションを狙っていたのですが、人大杉状態でランチが売り切れてしまい泣く泣くお昼を求めに行きました。

近くに「普通部通り」というところがあり、ここには松屋などの有名チェーン店から多種多様な個人店がありました。
どこに行くか迷っていたのですが、「エンジニアなら寿司だろ!」というわけで幸甚寿司さんでお昼を食べることに。

関連ランキング:寿司 | 日吉駅

f:id:syossan:20180907115607j:plain:w300

あと、ご飯食べてると有名エンジニアたちが続々と集まってきて、皆さんビールを頼んでたのが印象的でした・・・🍺

満員スピード

ちょっと残念だったなー、と思ったのが各セッションで満員になるスピードがめちゃくちゃ早かったところですね。
セッション聞き終わって「次のセッション行くかー」と向かったら既に満員になってたり・・・
これはさすがに仕方ないな、とは思うのですが来年はもっと広い会場で開催されることを祈っております!

まとめ

そんなこんなで、色々あったのですが控えめに言って最高でした
懇親会やアフターパーティーに参加できなかったのは残念ですが、来年こそは参加するぞ!
というわけで、2日目も全力で楽しみます!

kafka2.0にした時にShopify/saramaでCRCエラーが出る件

皆さん、Goでkafkaやっとりますか?僕はバリバリ伝説な感じでバリバリやっとります。
というわけで、最近kafka2.0がリリースされましたね。
うちでも使うかと2.0にアップグレードしたんですが、見事にsaramaを使ったGo製のProducer/Consumerが死にました、南無。

突然の死

メッセージ受け取った瞬間、こんな感じで死にました。

2999-19-05T10:39:05.798+0900    error    Failed receive message    {"error": "kafka: error while consuming hoge/0: kafka: error decoding packet: CRC didn't match expected 0x0 got 0xe38a6876"}

あじゃぱ〜。
こりゃ2.0の速にsaramaがついていっておらんなとISSUEを掘りにいきました。

イッシュー

github.com

そうそうこれこれ。
wladhさんが見てくれて解説してくれてますね。

で、問題解決PRがこれ。

github.com

斜め読みするとkafka2.0から導入されたメッセージチャンクのダウンコンバートのせいでオフセットがズレてデコードエラーになったっぽいですね、知らんけど。

メッセージチャンクについてはこの辺の記事が関連。

KIP-283: Efficient Memory Usage for Down-Conversion - Apache Kafka - Apache Software Foundation

解決

なので、とりあえずこのPRを適応すれば動くようになります。
今の所、最新のmaster branchには突っ込まれているので適宜追従しておきましょう。