初ISUCONはダメだったので来年の俺に向けたメモ書き的な(scala)
なんか皆さんエントリを書いていたので今更ながら釣られて書いてみます(集団心理の勝利)
※内容的には散々だったので参考になるようなことはありません. 来年リベンジする際に個人的に役立てたい(願望)
なんとなくISUCON気になるなぁと呟いていた所, @uadachiさんにお誘いいただき, @haya14busaさんと3人で Some(null) として出ることになりました. 完全にfunctional programing in scala 大阪読書会のメンバー. ちなみにSome(null)は大嫌いです(scala勢的なアレ)
準備
出場が決まってからあまり日程がなく, 割と直前が忙しかったこともあり, 準備という準備はできませんでした. 過去問を解くという発想もなく, 「ISUCONの勝ち方」のようなエントリを流し見をしたり, mysqlを調べた程度. この時点でかなり雲行きが怪しい.
予選本番
開始
開始が遅れる中, Node.jsの実装はありません を大変そうだなーと人事のように思いながら待ち構えていた所, Scalaの実装は不完全です にまず絶望する.
技術的に自分にできるようなことは少ないので, せめても力になれそうなDB周りをやることに.
なにをともあれでとりあえずベンチマークを走らせる → 何故か通ってスコアが出る. 直後にrubyの実装を動かしていたことが発覚しましたデスヨネー. 改めてscalaの実装で動かして比較した所, 表記やリンクがなにかおかしく, ベンチマークも通らない. バグ取りから始まりました. 並行して他の二人がローカルでの実行環境を整えることに.
「scalaでweb…どうせplayだろ?」と構えていた所, まさかのskinny. とはいえ本質的にはあまり関係なかったです. 結論から言うと, templateの変数埋め込みがちょこっとおかしかっただけでした, めでたしめでたし.
中盤
DBのダンプを取ることになったらしく, ローカルでの実行はしばらく足止めを食らう. 後になんとか起動にこぎつけた. 後から考えると, 開発用インスタンス建てたほうが早かったですネ.
バグを取ったことでベンチマークは通るようになったがチョー遅い. ので, てきとうにスロークエリを調べる. 更にpt-query-digestとやらを使って統計を取る. /
でどうみてもアレなクエリが大量に吐かれてる事がわかる. @uadachiさんがnginx辺りを, @haya14busaさんがisFriend
やらのN+1をやっていたので, 自分はスロークエリから見つけたやたらでかいjoin箇所をなんとかしようとしてました. 他で使っている箇所がなかったので力技で非正規化をすることに.
終盤
スキーマ変更やインデックスの貼り直しで意外と時間がかかったもののなんとか実装. digestを見ていた限り, それなりのボトルネックになっていた部分なのでスコアアガルヤローとか思っていたらベンチマークの並列テスト(?)やらでコケる. いろいろ試したものの, エラーの詳細も分からずこの実装はボツに(チーン)
その他, 他の二人がuserをキャッシュさせたり, N+1を解決したりといろいろしていったもののスコア上がらず. そのまま予選終了してしまいました (俺バグ取りくらいしかやってなくね?気のせい?)
反省とか
ちゃんと準備してから望みましょう(当然)
- 感覚をつかむためにも, 過去問やる時間が欲しかったですね.
- ハングアウトで通話しながらやってたんですが, 実際に集まるべきでした. 多分効率が全然違う.
- 普段の開発じゃないので, 保守性を一切捨てたほうが良かったです. 普段じゃ絶対タブーな手法でもどんどん使おう.
@uadachiさん, @haya14busaさんありがとうございました.
使ってたツール等
これだけ書いておけば, 来年の俺がきっと思い出して良いスコアを出してくれるはず…!!scalaで初予選抜けするぞっ
Scala + activator + Docker + IntellijIDEA (java8)での開発〜デプロイ
なんで
仮想環境上での開発はVagrantベースのものが主流らしい. なぜかDocker版のサンプルは見つからない…
でもDocker使いたい…使いたくない?
ポートやらパスやら名前やら細かいオプションやらは適宜調整してください
CIやdocker-composeを伴わない小規模向けの記事ですが, 調整次第で応用可能と思います
(おまけ程度に) under ver1.5
- Dockerfileは1ディレクトリに1つ
- Dockerfileより上位階層のファイルは(基本的に)扱えない
という2つの強い制約があるため結構面倒.
Develop
コンテナ実行後は localhost:5005
にIntellijIDEAからデバッグ接続する
boot2dockerなどを使っている場合はポートフォワーディングを忘れないようにする.
ホストにポートマッピング(したく|でき)ない場合は, DockerfileにEXPOSE 5005
指定を追加して, 代わりにコンテナのIPアドレスを使って接続するなどして対応.
おおまかな流れ
- ベースとなるイメージを作成し, 開発ではそのまま利用する
- デバッグポート5005を開ける
- リソースはホストと共有
- 実行はコンテナ上でデバッグポート5005を開けながら行う
- 開発は上記のポートに接続しながらホスト側のIntellijIDEAから行う
$ cd project_name $ docker build -t base_image_name tools/dev $ docker run -d -p 5005:5005 -p 9000:9000 --name develop_container_name -v $(pwd):/project_name base_image_name
project_name/tools/dev/Dockerfile
FROM ubuntu # install java8 RUN apt-get install -y software-properties-common RUN add-apt-repository ppa:webupd8team/java RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections RUN apt-get update && apt-get clean RUN apt-get install -y oracle-java8-installer # ONBUILD時, つまりデプロイ時は, `docker run -v` で # ファイル群を追加するのではなく, COPYで追加する. # developには直接は関係ない. ONBULD COPY . /project_name WORKDIR /project_name CMD ["./activator", "run", "-jvm-debug", "5005"]
Deploy
おおまかな流れ
- developで作成したイメージをベースとする
- リソースはビルド時にすべてコンテナ上にコピーする
- デバッグ実行をアプリの起動で上書きする
$ cd project_name $ docker build -t deploy_image_name . $ docker run -d -p 9000:9000 --name deploy_container_name deploy_image_name
project_root/Dockerfile
FROM base_image_name CMD ["./activator", "start"]
(こっちがメインだ) ver1.5 or later
ver1.5からビルド時にDockerfileを指定できる -f
オプションが追加された. うれしい.
これでver1.5未満にあった制約をすべて回避できる.
おおまかな流れ
- ベースイメージとして環境構築をする
- ベースイメージをベースとして, 開発/デプロイ それぞれのタイミングでリソースを 共有/コピー
- デバッグ等はver1.5未満と同じ
baseの作成
$ cd project_name $ docker build -t base_image_name -f tools/base/Dockerfile .
project_name/tools/base/Dockerfile
FROM ubuntu # install java8 RUN apt-get install -y software-properties-common RUN add-apt-repository ppa:webupd8team/java RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections RUN apt-get update && apt-get clean RUN apt-get install -y oracle-java8-installer WORKDIR /project_name
Develop
$ cd project_name $ docker build -t develop_image_name -f tools/dev/Dockerfile . $ docker run -d -p 5005:5005 -p 9000:9000 --name develop_container_name -v $(pwd):/project_name develop_image_name
project_name/tools/dev/Dockerfile
FROM base_image_name CMD ["./activator", "run", "-jvm-debug", "5005"]
Deploy
$ cd project_name $ docker build -t deploy_image_name -f tools/dep/Dockerfile . $ docker run -d -p 9000:9000 --name deploy_container_name deploy_image_name
project_name/tools/dep/Dockerfile
FROM base_image_name COPY . /project_name CMD ["./activator", "start"]
sample
ver1.5 or later 用
まとめ
ver1.5未満だと若干トリッキーな構成が必要だったけど, -f
の登場でごく自然にできるようになった
attachして様子見ながら開発していけばなんとかなりそう
chinachu on docker container
See Chinachu γ, Mirakurun and Encoder on Docker - 水底 instead
chinachuと依存先であるrecpt1, ARIB, pcscなどを出来る限りdockerコンテナ上に載せ, 安定した録画環境を目指す
ホストの破壊的変更がPT3のドライバ程度になったのは大きい. 早く他のアプリもコンテナに載せて, Pipework辺りと合わせて鯖缶を楽にしたい…
Majestouch Minila US 赤軸にトラックポイントを追加してみた
前回は Majestouch Minila Air でしたが, 今回は無銘Minilaです.
かなり雑な工作です. 普段からきちんと工作される方は見ないことをおすすめします
必要なもの
- Majestouch Minila(使ったのはUS赤軸)
ベースになるキーボード - ThinkPad USBキーボード(使ったのは0B47190)
トラックポイントモジュールとマウススイッチ部のドナー - USBケーブル(microオス)
ThinkPad USBキーボードに付属しているものでも可. - リューター(使ったのはプロクソンNO.28512-SK)
各加工用. ドリルø30mm程度, 切断砥石. - 釘
トラックポイントの軸. 釘頭が大きすぎないもの. - エポキシ系接着剤
硬度が高めの接着剤ならなんでも. - メンディングテープ
簡単な固定用. - その他ニッパー, ドライバー, はんだこて等
オプション
- お好みのCherryスイッチ
- 銅線
でスイッチの入れ替えや入力信号の調整も可能
手順
- トラックポイントモジュールとマウススイッチ部の取り出し
- トラックポイント取り付け用の穴あけ加工
- マウススイッチ部取り付け用の穴あけ加工
- 内蔵USBハブの延長
- トラックポイントやキートップの加工
- トラックポイントモジュールとマウススイッチ部の取り付け
1. トラックポイントモジュールとマウススイッチ部の取り出し
まず, ドナーであるThinkPad USBキーボードからトラックポイントモジュールを取り出す.
ThinkPad USBキーボードは薄型化のためか, がっつり 粘着テープ止め されているので頑張って引っぺがす
キートップをすべて取っ払ってメンブレンシートを取り出して, マウススイッチだけ生き残るように切り出す.
ちなみにトラックポイント部分は参考リンクにあるような基板とは仕様が変わっていた模様.
2. トラックポイント取り付け用の穴あけ加工
今回は本家のようなGHB間ではなく, HJN間にトラックポイントを設置することとした. MInilaの基板には, ちょうどHJN間に基板固定軸を通すための穴が元から開いており, それを利用する. なお, 基板を支えている鉄板には穴が開いていないので, リューターのドリルを使って開ける. 大体ø30mmも開ければok. 当然だが, 受けケースにある対応する基板固定軸は切り落とす必要がある.
3. マウススイッチ部取り付け用の穴あけ加工
マウススイッチのメンブレンシートを通すための穴を外枠の手前部分に開ける. 内側に補強用(?)の部分があるのでそこも必要に応じて削る. リューターの切断砥石で作業した.
4. 内蔵USBハブの延長
Minilaに内蔵されているUSBハブにThinkPad USBキーボードから取り出したものを繋げるため, 外側に向いているハブを改造する. USB端子の足をニッパで切断, 残りをはんだこてで外す. 用意したUSBケーブルの片側を切って内部のケーブルを出し, はんだづけする.
opt. キースイッチ入れ替えと入力信号の調整
個人的な好みでモディフィアキーは青軸, スペースとエンターはクリア軸へと換装, Fnキー等の入れ替えを行った.
過去にAirで同様のことを行ったので以下参照
5. トラックポイントやキートップの加工
用意した釘を適当な長さに切断し, トラックポイントの軸にする.
キートップはトラックポイントがぶつからないように加工する. この工程だけはリューターよりニッパでザクザクしたほうが楽だった.
6. トラックポイントモジュールとマウススイッチ部の取り付け
ここまでで揃ったトラックポイントモジュールとマウススイッチ部をMinilaに取り付ける. トラックポイントの軸のように強固に固定する必要がある場合はエポキシ系接着剤で, 仮止め程度でいい場合は手軽にメンディングテープで固定した. このうちトラックポイント軸の固定は, 力が加わる割に接着面積がかなり狭く, 材質の関係もあってかうまく固定するのが難しかった. 釘頭を荒らしてエポキシ系接着剤を使ったものの, 強度に不安が残っている.
※雑なのは仕様
完成
やったぜ. キートップは過去記事で紹介した重量化したものに換装してます.
キースイッチ部はうまく固定する方法を模索中. キースイッチだけはメンブレンシートレベルでばらさずに, まとめて切り出したほうが良かったかも?
感想
参考
- PCと遊ぶ日々の記録ーRealforceにトラックポイントを内蔵する
参考というかほぼここのMajestouchバージョン
MINILA Air US赤軸ベース青クリア混合にしてみた記録
こんな感じでキー軸を加工して,
こんな感じに配線しなおして,
こんな感じにModifierキー中心に青軸とクリア軸に入れ替えてみました. ハンダ付けの下手さに泣きました.
入れ替えたキーは基盤にハンダ付けできないのですが, 特にグラつきが気になることはありませんでした. 青軸は凄くいい感じです. (クリア軸はよくわからん…
配列は, ソフト側ではSeilを使って,
- L-Win → 無変換
- L-Fn → L-Win(L-Cmd)
- R-Fn → かな(R-Cmd)
- App → Fn
となりました. JPとUSで同じ基盤を使っているようで, ご丁寧にキーマトリクスも全てプリントされていて, キー入れ替えでそれほど悩むこともありませんでした. 一部配線的に殺されている場所もあるけれど…
ちなみにキートップは重量化+Oリング装備. 青軸部分も静かで, 赤軸部分はスコスコ(?)とHHKBとメカニカルのいいとこ取りした感じで打鍵できてます
押しやすい位置にあったFnをKeyCodeを送ることができるキーに入れ替えられたので幅が広がりますね!! 今度はソフトウェアレベルでDvorakに回帰したい所…
結論
カイオーガかわいい
参考
c#でOptionモナドっぽいものを作ってみる
c#の機能的に, 高階型が表現できなかったり, 直和が表現できなかったりとなかなかしんどい. あくまで実用できればいいや程度の代物.
余裕ができたら改良しつつ, Either, Validation あたりを巻き込んだ簡単なライブラリにしたいところ.