AWS Lambdaでnode-gypを使う

node-gypはC/C++のライブラリをNode.jsで使うためのビルドシステムで、これはnpm installした時の環境に適した形のバイナリを生成してくれる。 しかしAWS Lambdaでライブラリを使う場合はnode_modules含む実行ファイルをzipで固めそれをアップロード必要があり、node-gypを含んだLambda functionはLinux環境でnpm installを叩かなければならない。

自分はこれの解決にDockerを用いている。

FROM node:4

RUN apt-get update \
  && apt-get install -y --no-install-recommends sudo zip make gcc g++ libc-dev python \

  && apt-get clean && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/*

WORKDIR /usr/local/app
RUN mkdir lib

COPY package.json .
RUN npm install

COPY .babelrc .
COPY src ./src

上記Dockerfileと

{
  "name": "lambda",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build:babel": "babel ./src/ -d ./lib/",
    "build:zip": "zip -r ./app.zip ./lib/ ./node_modules/",
    "build": "npm run build:babel && npm run build:zip && sudo mv app.zip dist",
    "docker": "docker build -t builder .",
    "release": "npm run docker && docker run --rm -v `pwd`/dist:/usr/local/app/dist builder npm run build"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-cli": "^6.24.1",
    "babel-preset-es2015": "^6.24.1"
  },
  "dependencies": {
    "pg-query-normalizer": "1.0.0"
  }
}

上記package.jsonを用意することでワンコマンドでzipを作成できる。

やっていることはとても単純で、docker buildのタイミングでnpm installを叩いておき、そのイメージを使ってzipファイルを作成しているだけだ。 docker runのタイミングでカレントディレクトリをすべてマウントさせとけばDockerfileいらなくね?と思うかもしれないが、いちいちビルドをするだけでローカルのnode_modulesがlinux実行用に書き換わるのは正直クソ(node-gypのビルドにも時間はかかる)なので辞めた方が良い。

Dockerはbuildを意識する必要が無いし、まぁ今時の開発環境ならDockerの1つや2つインストールされているものだと思っているので、AWS LambdaでC/C++ライブラリを使いたい人は是非参考にして欲しい。

ところで

なんでAWS LambdaでC/C++ライブラリを使うのかって話なんだが、まぁこれを使いたかったからだ。 https://github.com/munisystem/pg-query-normalizer

仕事の話にはなるんだが最近RDSのログからクエリを抜き出しBigQueryにいい感じに挿入するAWS Lambda function (https://github.com/munisystem/kuroneko) を作成していて、これによって突っ込まれたログからSlow Queryの可視化を行ってWEBアプリケーションの速度改善に繋げようという目論見がある。

Slow Queryのもととなるコードを探すためにはある程度正規化されている必要があって、例えば

  • SELECT * FROM Users WHERE id IN(1,3,5,7);
  • SELECT * FROM Users WHERE id IN(1);

は同一クエリと判断されて欲しい。

これを可能にするライブラリが必要だったのだが、クエリをパースするものはあっても正規化を行うものはnpm上には存在していないために自前でライブラリを用意する必要が発生してしまった。 クエリのノーマライズの実現には

  • Queryの妥当性を検証する
  • QueryをASTのように感じで扱えるようにparseする
  • parseされたQueryをwalkして対象箇所を置き換える

みたいなのが必要になると思うんだけど、これをNode.jsで一から実装するには時間が足りない。 そのためそれが出来るC++ライブラリをNode.jsで使うためにnode-gypを使用するに至った訳だ。

とはいえnode-gypで書かれたものをメンテナンスするのも大変なので、土日とか時間あるときにエイヤってC++に依存しない実装に置き換えようかって気分はある。あとは気力の問題。

全然話関係ないんだけど、今めっちゃ眠くて何書いているかすらわからんので目が覚めたあとの自分にリファクタを任せます。

BOSE SoundSport wireless headphonesを買った

ShureのSE215を紛失してしまったので代わりのイヤホンとしてBOSEのSoundSport wireless headphonesを買った。

amzn.asia

良い点

  • ケーブルが絡まってイライラしない
  • 冷蔵庫に行くときとかイヤホン外さなくて良いの強い
  • 結構電池持つ

悪い点

  • 充電が面倒くさい
  • 電池残量が少なくなるとノイズが乗り始める
  • アダプタのカバーの作りが雑ですぐだめになりそう

所感

1時間充電で2時間程度使えるので、思った以上に便利感がある。また、ランニングとかでケーブルが邪魔にならないのは最高としか言いようがない。

けどやっぱり充電は面倒くさくて、いざ使いたい時に電池残量がないと結構萎える。あとワイヤレス特有の問題だけど、エロ動画とか見る時に上手くペアリング出来てなくて外に音が漏れるみたいな、社会的地位を破壊しかねない危うさみたいなのがあって厳しい。

結論

SE535が欲しい。

実家に帰ってきた

糞田舎でやった(やっている)ことの書き起こし。

窓掃除

実家には全面ガラス張りのテラスっぽいのがあって、そこの窓の掃除をやった。腕が死んだ。

サイクリング

生牡蠣食いたくて大洗方面に行った。すれ違うガルパン聖地巡礼観光客に仲間意識持たれないように、"古参オーラ"を出しながらチャリを漕いだ。

那珂湊

シーズンもあってか生牡蠣1個200yenと安かった。オフシーズンとかだと400yenとか取ってくるからな、生牡蠣。

海産物食べるなら大洗より那珂湊のほうがいいぞ。市場で色々売ってるし、寿司とかうまい。

www.nakaminato-osakanaichiba.jp

大洗

実は大洗って海水浴場の印象しかなく、旨い店とか知らない。ガルパンおじさんにご教授願いたい。

Rails

糞田舎は暇なのでナウい構成でなんかウェブサービス作るかって感じになった。ナウい構成って言うとGolang + React + Docker + AWSってのが頭にあったんだけど、業務でRails触るのにRailsでちゃんとしたサービス作ったこと無いのはヤバイなってなってGolangの代わりにRailsを使うことにした。 Railsの知識は素人童貞並なので、Ruby on Rails Tutorialをやっている。

完全にブーメランなんだけど、Tutorialをやるときはある程度の知識を持っていると知っている部分は飛ばしたくなるんだけど、大体そういうときTutorialを理解できずに終了してしまうので、知らないふりをしながら取り組むべきだと思っている。かと言ってRubyの文字列処理とか、Tutorialの本質に関係していないものは飛ばしていいと思うし、実際している。

卒研

バイ

クソコマンドを支える技術

これは CPS Lab Advent Calendar 2016 12日目の記事です。

www.adventar.org

まじで話すネタがないので、

github.com

これについてちょっと言及する。

クソコマンドを作る

クソコマンドは他人に実行してもらうことに意義がある、このようにね。

f:id:munisystem:20161212234851p:plain

なのでできるだけ環境に依存しない方式を取るべきだ。 python2はだいたいの環境で入ってるし、shellスクリプトもちゃんと書けば機能してくれる。コンパイルしてバイナリが吐ける言語ならもっと良い。Github releaseにでもコンパイル済みバイナリを置いておいて、wgetとかで引っ張ってくるだけで試せるからだ。

今回はバイナリを吐けるGolangを使って、Terminal上に加藤恵を表示させることを考えよう。

ANSI escape codeを使う

画像を表示するだけなら、imgcatを使えば良いだろう。こんな感じで綺麗に表示できるしお手軽だ。

f:id:munisystem:20161213000655p:plain

ただimgcatはOSX・iTerm環境でしか動かないし、そもそもimgcatが対象のマシンにインストールされていないと意味がない。 Windows環境はまだしも、Linux環境ですら動かないのは致命的だ。(一部の層に絞るというのであればそれでも構わない)

なのでANSI escape codeを使った文字での表現がこの場合ベストと言えるだろう。 ANSI escape codeの説明をすると長いので例だけあげるが、

$ echo "\x1b[31mMegumiKato"

のように叩くとターミナル上に赤色でMegumiKatoと表示される。echoで吐き出した文字のうち、\x1b[31mANSI escape codeだ。これについては以下が参考になるだろう。

qiita.com

さて方針が決まったが、画像をANSI escape codeに変換する作業が必要だ。とは言ってもこれをやってくれるツールは既に存在していて、わざわざ苦労してやるほどのものではない

image-to-ascii-cli

hihumiを作る時に作ったツールがこれ。

github.com

$ npm i -g image-to-ancii-cli
$ image-to-ancii -i <file path>

で画像からAnsi escape codeを含んだ文字に変換できる。

f:id:munisystem:20161213012722p:plain

img2txt

pythonで書かれたコンバーター。文字ではなくスペースを使って表現されるので、画像っぽさを出すならこっち。

github.com

virtualenvがなくてもpipがあればなんとかなる。

$ pip install pillow
$ python img2txt -i <file path> --ansi

ただ画像がめっちゃ引き伸ばされるので、

f:id:munisystem:20161213014805p:plain

変換前に画像の縦方向を60%くらいに押しつぶしておくといい感じになる。

f:id:munisystem:20161213015314p:plain

今回はコレを使うことにした。

コマンドを作成する

変換も済んだので、今度はこれをgolangから表示させる。<txt data>の部分にimg2txtの実行結果を貼り付けるだけだ。

package main

import (
    "fmt"
)

const image =`<txt data>
`

func main() {
  fmt.Println(image)
}

OSXの場合はpbcopyを使うと簡単にクリップボードに結果を登録できる。

$ python img2txt -i <file path> --ansi | pbcopy

linux環境では

$ python img2txt -i <file path> --ansi > ansi.txt

みたいにtxtに一回渡してコピーするといいかもしれない。

Raspberry Piで実行する

Golangの強みはクロスコンバイルだ。

$ GOOS=linux GOARCH=arm go build *.go

みたいにオプションを指定すれば、Raspberry Piで実行できるバイナリが作成できる。あとはscpなどでバイナリを送ってやれば...

f:id:munisystem:20161213021604p:plain

加藤恵をRaspberry Piで楽しむことが出来るようになるわけだ。

まとめ

どんな環境でも使えてこそのクソコマンド。皆もクソコマンドを量産して、他人のPCのaliasを勝手に張り替えよう。

因みに今回作ったmegumiコマンドはGithubにあがってるので、よかったら使って欲しい。少なくともhihumiよりは存在価値があるだろう。

github.com

白峰あやかとマルコフ連鎖

これは 百合 Advent Calendar 2016 11日目の記事です。

www.adventar.org

最初は今年買った百合漫画の中からおすすめを...とか思っていたが、「やがて君になる」も「新米姉妹のふたりごはん」も「兄の嫁と暮らしています。」と押したいタイトルが全て挙げられていた。

なので布教活動は他の方に任せるとして、私は最近のイチオシである「あの娘にキスと白百合を」の話をしようかと思う。

白峰あやかっぽい台詞をマルコフ連鎖で自動生成する

白峰あやかと黒沢ゆりねをコンピュータの力を使ってイチャイチャさせたい。その計画の先駆けとして白峰あやかっぽい台詞を自動生成することにした。

RNNLMを使ってうまいことやろうと思ったが、そもそも私は機械学習の基礎すら理解していない。 理解しようにもcourseraのmlコース第一週で既に8時間のペナルティを食らっていて完全にお手上げ状態だ。

なので今回は手を抜いてマルコフ連鎖(3-gram)を使った。 マルコフ連鎖に食わせるデータとして、「あの娘にキスと白百合を」の1~5巻の白峰あやかの台詞全560言を用いた。

github.com

実行結果は以下の通り。

よりずっとね、これでも学園の王子様なんだから!!!実力テストで泣いて許しを乞うまでコテンパンにのさないと思ってたのよ、最後までつきあってもらうわ!!これほどまでに部長の肩書が似合わない人もいないし行ってみたら?
奪還するまではね!!!!ばかーーー
まま完勝できるなんて思ってない?でもない貴女に勝ちたいと思う私もわたしも…覚えてももらえないでしょ、先生の頼まれ事で
お姫さまに教えてあげなさい
高校生活はこの人がいるのは私だわどうしてこんなにイライラしてるのは私の敵はあの黒沢さんのことを認めたわけじゃないし大嫌いなんだから!!少なくとも1位はこの人に振り回されて終わってしまうのでしょうか?
こんなふうに話せるの瑞希しかいないの!?次も敗北確定ね!!も〜〜〜
だけは、眠いし
嫉妬とか誘えばいいでしょ
でさえ解くのに30分はかかったわ
赤が好きよ、また食べさせてくれる?
ように声を聞かせてほしいんだけど私今日は海を見に行くから会場と日程を詳しく教えてほし…ってことはあまり関係ないんじゃないかって思う私も本当なのかしら…??
一応言っておかなきゃって思っただけで、貴女はまた適当なことばっかりばかみたい…
結果を出さなくちゃいけないのにその自信は何なの、あんなキレかたしちゃったし
この私よ!!!!!も〜〜〜
要領がいいわ、だけど…私どうかしちゃったし
認めていいのよ!無理無理!!!!私は完璧でいられないなら…真実を書いてもらえる?
ないでも……
よそんなものはもう一番で!!流石私だわ!!!バカ!!!私は好きよ、卓球するから!!ココ2階よ!!!ばかーーー
会ったことは今回も黒沢さんに負けているのは許せないし行ってみたら?
って思っただけで勝てるようになるなら私だって予習くらいしてるの?
こと気にするのよ!!!!好きとか、それが馬鹿だって言ってくれたし
に教えちゃった
だけだけど!?外で会ったことは今回も黒沢さん!?貴女私に本気になりなさい!貴女なんてちょっと要領がいいわ…わかったわよ眩しいくらい…でも負けて得られるものなんてあるわけないでしょ!?好っ…ちょっと!!好きとか色素の薄いまつげとかじゃないのよ、約束したでしょ
また適当なことばっかり…!?しっかりするのよ!!これほどまでに部長の肩書が似合わない人もいないのよ!!!!!!やればいいんでしょやれば
の勝手だけど貴女のそれは自分に勝てる人間なら誰だって良いんでしょ?
どうでもよくなっちゃったのよあやか!!流石私だわ!!!!私の神経を逆撫でたいだけなのに、お母さんのことばかり考えている
ないでよ!!!私は試験に向けて勉強したいんだけど…大丈夫?
「生徒の鏡」であり続ける…はずだった
…わよね…上原さんの提案なのよ、誰にも出てきた問題…私でいいって言うのよ、お母様が?
瑞希もおおげさなのよねお母さんの望む子どもには甘いのね…上原さんとふたりよりずっとね、黒沢さんの事が嫌いすぎて!コテンパンにしてやるわよ!!実力テストで泣いて許しを乞うまでコテンパンにしているかもしれないし、一番じゃなくちゃ意味がないの!?落ちたらどうするの!?さては私だから結果を出さなくちゃいけないのに出来る問題じゃないの私は愛されてる?私に勉強二に勉強二に勉強よ!!!!!少なくとも1位はこの人が?
...

白峰あやかは台詞に感情が乗ってくるキャラで、自動生成された台詞からもそれが見て取れる。 ただエクスクラメーションマーク周りでループが発生したり、前後関係がチグハグになってしまうところはやっぱりマルコフ連鎖って感じがある。

完成度の高い台詞

自動生成された台詞の中で完成度が高かったものを紹介する。

次こそ貴女を倒す日も近……んぐっ

日に日に成長していく白峰あやかを見て思わずキスしちゃう黒沢ゆりねって感じが出ていて良い。

女子校ではあいさつみたいなものなんだけど…大丈夫?

女子校ではキスは当たり前、そんな光景を目の当たりにした下級生を優しくリードする白峰あやか。もはやこれ違う作品なのでは。

私の知っている黒沢さんは背が高いんだから!!!も〜〜〜

黒沢ゆりね、ロリ化。

気持ち

自然言語処理の前に白峰あやかの台詞を抜き出すのがくっそ辛かった。

私が作った白峰あやかデータセットは自由に使っていいので、有効活用してくれるとうれしい。

ayaka/words.txt at master · munisystem/ayaka · GitHub

何故私はGolangを使うのか

この記事は CPS Lab Advent Calendar 2016 6日目の記事です。

www.adventar.org

研究室向けに話したいこととか全く無いから、今度参加するLTで話す予定の内容の整理も兼ねて書き出すことにした。

何故私はGolangを使うのか

細々した処理を行うためのコードを書くとき、特に何も成約が無いときはGolangで実装をするようにしている。

github.com

github.com

単純に言語自体が好みってのもあるけど、Golangを使う理由ってのが明確に存在しているのでそれについて触れる。

シングルバイナリ、クロスコンパイル可能である

@akameco

雑なツールはJavaScriptで書くに限る

って言われたんだけど、ありえないとその時思ったし、今でもそれについては変わらない。

理由は単純で、言語のバージョンや動作環境に大きく振り回されるの辛いから。 例えばRaspberry Piでもそのツールを使いたいってなった場合、Raspberry Piに言語突っ込まなくちゃいけないし、いざ突っ込んでもライブラリのビルドでコケたりするの正直厳しい。

その点Golangはビルドすればシングルバイナリになるしクロスコンパイルも可能なので、Raspberry Piで使いたいなら出来上がったバイナリをぶん投げるだけだ。 手元で動けば向こうでも動くのもポイントの一つ。

使う環境を気にしないでコードを書けるのは体感素晴らしい。

てきとう(いい加減)に書ける

ちょっと雑に言い過ぎた。

Golangの言語仕様的にエラーハンドリングはしっかり行わされるので、コードの質がある程度担保される。 これがとてもよくて、滅茶苦茶な心理状態で書いたコードを跡から見直しても大体理解できる。

あとこれが重要なんだけど、パフォーマンス気にしてないで書いてもそれなりに動作が速い。

まとめ

Golangで雑にツールを作りましょう。

f:id:munisystem:20161206021909g:plain

github.com

最近買った漫画

ブクログで漫画のレビューをしたくないのでここでする。

兄の嫁と暮らしています。

これを広めたいが為にブログを書いたと言っても過言ではない。

兄の嫁と暮らしていますって言うくらいだから修羅場的なことを想像していたけど、兄は死んでいて身寄りの無い主人公 志乃(女)を兄の嫁 希が引き取って一緒に生活する結構重い設定だった。

第二の人生を送れるはずの希を自分という枷が邪魔をしている、これ以上迷惑をかけたくないと思いながら行動する志乃と、そんな志乃を支えてあげたいと思い悩む希の葛藤が丁寧に描写されている。 球技大会用のクラスTシャツを希からもらっているお小遣いから捻出する志乃が描かれた Diary.3 ではそれが全面に感じられるであろう。

作者は犬神さんと猫山さんのくずしろ先生ってこともあり、百合とは明記されていないけど雰囲気がそこらじゅうにある。 菅野 マナミ先生の「ひまわりさん」が好きな人は多分これも好きになれると思う。

ひまわりさん<ひまわりさん> (コミックアライブ)

百合好きには是非手に取ってもらいたい一作。

千早さんはそのままでいい

くずしろ先生繋がりで買った。

先程紹介した「兄の嫁と暮らしています。」、代表作である「犬神さんと猫山さん」が百合だったのに対して、「千早さんはそのままでいい」は幼馴染関係の男女が主役のNL。

この作品を一言で表すのであれば、フェチズムか。 巨乳でちょっとむっちりした肉付きの良い女子高生 千早がダイエットに挑戦するも失敗するという話から、作者のフェチズムを感じられるのだ。 二次元ではスレンダーな女性が溢れかえっているが、現実世界ではそうではないし、多分現実世界ではこういう女性に魅力を感じるのでは無いだろうか? そういった二次元女性に対するアンチテーゼとなる一作だと私は思う。

三村かな子が現実にいたら付き合いたい。

かぐや様は告らせたい

前々から気になっていたので1巻を試しに購入したが、普通に面白くて3巻まで買った。

寝る間も惜しんで勉強やバイトをする努力の"天才"である生徒会長 白銀と、有名企業の一人娘で何をやっても優秀な言葉通りの"天才"である生徒会副会長 かぐやが、好き同士にも関わらずプライドが邪魔をするため相手から告白をさせようと画策する話だ。

天才にも関わらず恋愛という分野ではめっぽう弱いかぐやの表情や行動のひとつひとつが「お可愛い」ので見ていて飽きが来ない。 また男性キャラも含めて登場人物が魅力的なのも特徴の一つ。

作者の赤坂アカ先生はコミカライズ版「さよならピアノソナタ」も担当していたことにあとから気が付き、原作が好きだったこともあって勝手に運命を感じている。

さよならピアノソナタ 1<さよならピアノソナタ> (電撃コミックス)

原作のさよならピアノソナタは引っ越しのタイミングで全部売ったんだけど、売りに行く前に読み始めてしまいいつの間にか一日が終わっていた。

ハッピーシュガーライフ

また百合だ。

表紙から分かるかもしれないが主人公はヤンデレで、その相手はロリっ子という一般的な百合作品とは一線を画している。 しかも主人公やロリっ子を崇拝する変態男性が複数人登場するし、ヤンデレも(直接的な描写はないが)人を殺ってそうだし、めっちゃドロドロしている。

こういったドロドロした百合ってあんまり好きじゃなくて、女性3人の三角関係を描いている「ななしのアステリズム」や、関係がこれからこじれそうだけどカップリングは確定している「やがて君になる」ですら最近キツくなってきているって趣向だけど、この作品に限ってはそれを感じさせないのはキャラクターが魅力的なのか、ストーリーに引き込まれるからなのか...

ななしのアステリズム 1巻 (デジタル版ガンガンコミックスONLINE)

やがて君になる (1) (電撃コミックスNEXT)

これも勢いで買ってしまったのだが結構満足しているし、続きがめっちゃ気になるし、ニュータイプ百合としてこれからも観測していきたい。

新米姉妹のふたりごはん

いやね、美少女がキャッキャウフフしながら飯食べる漫画とか最高でしょ? しかもそれが百合っぽさ出してたらそりゃ買うよ。

料理担当の妹 あやりがコミュ障ながら姉である サチに料理を振る舞いながら勇気を出して関わっていく姿に胸がキュンキュンするし、料理もしているしすごい良いよね。

最近料理漫画増えてきていて個人的には嬉しいところ。 「Fate」の主人公である衛宮士郎が料理を振る舞う「衛宮さんちの今日のごはん」とか、酒が大好きな妻の為にカクテルを作る「お酒は夫婦になってから」とかホント好き。

「衛宮さんちの今日のごはん」|無料Webコミック「ヤングエースUP」

お酒は夫婦になってから 1 (ビッグコミックススペシャル)

もっとこういう漫画増えて。

雑記

他にも買った漫画はあるんだけど、感想書くの疲れるから取り敢えず押したい漫画を中心に書いた。

読んだものはレビューしよう習慣はまだ続いていて、漫画もそれに入ってるんだけど、現状良さげなサイトが無いのが結構痛い。 https://amakan.net/ で買った漫画はまとめてるし、ここに書けたらな、とは思う。

まぁAmazonに残せばいい話だし、なんならブクログに漫画用のアカウントを作って管理すればいい話だろう(利用規約的にどうなのかはわからんが)。