水底

ScalaとかC#とかk8sとか

`docker exec -it` を便利にしたかった

Dockerコンテナ弄りにはみんな大好き docker exec -it (まさかSSH使ってませんよね…?). docker exec -it $container_name $shell_name とすることでコンテナ内に入ってインタラクティブシェルを使うことが出来ます.

ただし基本的にコンテナ内には素のシェル環境しかありません (ツライ). コンテナ内で作業をするとは言えあくまでコンテナは使い捨て. いちいちコンテナ内にzsh, vimやtmuxの自前環境を用意するのは大変で環境も汚してしまうという問題がありました.

…というわけでローカルに用意しておいた設定をコンテナ内に自動的に持っていく docker exec -it 用のラッパーが出来上がりました.

github.com

使い方やサンプルはリポジトリを参照してください. 大体はSSHでリモートに設定ファイルを持っていくというコンセプトの sshrc に倣っています.

エイリアスを無視してコマンドのフルパスを取得するだけ

例えば .bashrc.zshrcls の利便性を上げるために alias ls='ls -G' といったようにエイリアスを張っているとします. この状態で ls コマンドのフルパスを取得するため which lstype ls を実行するとフルパスではなく ls: aliased to ls -G のようなエイリアス情報が出てきててしまいます. which -a lstype -a ls のようにオプションを渡すことで ls: aliased to ls -G; /bin/lsエイリアス・フルパス全ての情報を取得できますがフルパスのみ欲しい時にはちょっとばかし不便です.

解決策

$SHELL -c 'which ls'

もっといい方法がありそうだけど見当たらなかった (完)

欲しいもの

見かけたら教えてください

ノートパソコン

MUST

  • 13-15inchi
  • メモリ16GB
  • CPU: HQ以上
  • ペン入力 (w/ 筆圧)
  • SSD
  • 2K以上の解像度

SHOULD

  • 〜2.0kg
  • メモリ32GB
  • hot pluggable eGPU
  • JP配列 or 短スペースキー・最下段キー多めの配列
  • トラックポイント
  • 生体認証
  • LTE

タブレット

MUST

  • 7-9inchi
  • 2K程度の解像度
  • ペン入力 (w/o 筆圧)
  • 生体認証
  • LTE
  • 置いたときにぐらつかない

SHOULD

  • ペン入力 (w/ 筆圧)
  • 背面が滑りにくい素材
  • Android (要検討)

キーボード

MUST

  • テンキーレスコンパクト
  • JP配列 or 短スペースキー・最下段キー多めの配列
  • 赤軸or静電容量
  • トラックポイント

ノーパソは軽量化・U付きCPUが蔓延していてなかなか出てこず, タブレットiPadiOSでなければ…とか思ったり

技術書典お疲れ様でした & BOOTHでScalaTourを販売します

技術書典お疲れ様でした. 技術系個人サークル「かいていどうくつ」としてScala入門本のScala Tourを片手に参加していました. ISUCON2日目と被るわ台風来るわで大変でしたが来てくださった方ありがとうございました.

頒布していたScala Tourですが, 若干数で本のみですがBOOTHにて販売を行います. 技術書典は行けなかったけど気になる…という方は是非! なくなり次第終了で増刷は行いませんのでご了承ください.

ktdkt.booth.pm

Scalaの入門本です. ネットでは探しづらいScalaのアレコレもふんだんに掲載しています. 関数型は難しそう…? なんとScalaでは関数型に深入りせずとも関数型の恩恵だけ受けることができるんです. (以前頒布したα版からの更新が多々あります)

コンテンツ

Scalaとは

・環境構築

・基本文法

・コレクション

・Option/Either

・非同期処理

・外部ライブラリ

・ベストプラクティス

・参考リンク集

今後も「かいていどうくつ」ではScalaやその他技術系で活動を続けていく予定です. 次は夏コミか技術書典4 (あるのか?) でScalaのリファレンスになるようなものを作れたらと考えています.

「かいていどうくつ」の告知サイトはこちら (css…? 知らない子ですね)

ktdkt.sapphire.in.net

ISUCON7予選通過できた #ISUCON

isucon.net

やったぜ!

ISUCON5とISUCON6はScala界隈の方とScalaで突破しようとして一般枠で撃沈していたのですが, 今回はチーム「チーム名を考えるのが苦手すぎる」として OUCC老害組 (@spring_raining, @susisu2413) と人生最後の学生枠を初利用して最終スコア89,047で初の予選突破できました (なお一般枠のスコアを見て真顔). 開催時間が押したことにより @spring_raining の途中離脱が発生したりしましたが無事 (?) 終えることができました.

チームメンバーの2人が 💪JavaScript力の塊💪 だったので (Scalaではなく) JavaScriptです. その2人がアプリ, 私はミドル系で分担していました.

  • アプリ側: Linter/リファクタ → iconsをDBに入れないようにする → ひたすらredisにぶっこむ → 細かいチューニング → ベンチマークガチャ
    (アプリ側はそのうち2人がまとめてくれそう)
  • ミドル側: いろいろ初期化 → いろいろプロファイリング → iconsをDBから取り出す → いろいろ事前gz化 → mysql/nginx/redisの設定を地道に弄る → ベンチマークガチャ

大したことしてないですね, はい. 終始リーダーボードの下の方で見え隠れするくらいのスコアでした. リーダーボード凍結辺りからはCPUが100%に張り付きiconsがタイムアウト連発して全くスコアが伸びませんでした…圧倒的力不足…

よくなかったこと

  • 色々勘違いしてサーバ1台で頑張ってしまった (アホ)
  • キャッシュに関する圧倒的知識・経験不足 (すまん)
  • レギュレーションをちゃんと読まなかった (レギュレーションにヒントが多かった)
  • リハーサルなし (pixiv社内ISUCONがそっくりだったらしい…終了後に知った…)

よかったこと

  • 予選突破 (めでたい)
  • 全員集まって参加 (実は初めて)
  • Webアプリの知見が結構増えた (普段, 特に最近はWebアプリを触る機会がないので. つまり ISUCON最大の目的を達成)

忙しくて (言い訳) 予選は完全に準備不足というか初期化スクリプトの準備くらいしかできていなかったので本戦は足を引っ張らないように頑張りまふ. それと本戦終了後は結果がどうであれもうちょっとまともなエントリ書きます.

チームメンバーのエントリをぺたり

susisu.hatenablog.com

spring-raining.hatenablog.com


最後にISUCON7予選で最高のスクリーンショットを共有しておきたいと思います.

f:id:amaya382:20171023000850p:plain

(デバッグ風景)

Scala2.13からの新しいコレクションライブラリ

今更

もうProposalが出されてから暫く経っていますが今更軽く確認したのでメモ書き. 特に大した内容はないです. ちゃんと知りたい方は SCALA 2.13 COLLECTIONS REWORKソース を読んで下さい.

過去にScala2.8でも一度Scalaのコレクションライブラリは大きな変更が加えられています. その際に (確かに機能的なんですが) 分かりづらいと評判の CanBuildFrom を中心とした仕組みが追加されました. しかしながら, その挙動は一見トリッキーで実装は無駄に巨大になってしまっているため, Scala2.13で新しいコレクションライブラリである Strawman に変更される予定です. 普通に(?) 利用している分にはAPIの変更はないため既存のコードはそのまま動くはずですが, breakOut, view や継承して自前のコレクションを作成している場合などには破壊的変更があるためコードの修正が必要 になります. 以下は個人的に気になった変更箇所のピックアップ.

速くなる

→うれしい

CanBuildFrom が消える

コレクション内部の操作方法が変更され, map 等で生成されるコレクションの型を決定していた CanBuildFrom が消えます. これでやっとIDEの補完が分かりやすくなりますね (今までのやつだと初心者が見たらわけわからんかったと思うの). 内部的にシンプルにしようとしているらしくソースをちら見した限りではかなり読みやすくなっていました. implicit が大幅に減ってほぼ型クラス用にしか使われなくなっていたり.

ちなみに, CanBuildFrom の代替として (?) FromIterable で Concreteなコレクションの生成を行います (to メソッドもこれを使うようになる). CanBuildFrom と違ってExplicitな引数を使います.

CanBuildFrom が消えたので当然 breakOut も消える

以前は breakOut でコレクション変換を端折ってちょっとパフォーマンスを上げるといったことができたのですが消えます. 代わりに view を使うことになるようです. ちなみに view の実装もシンプルになったとか.

val s: Seq[Int] = ...
val set: Set[String] = s.map(_.toString)(collection.breakOut) // before
val set = s.view.map(_.toString).to(Set) // after

collection.parallel が標準ライブラリから外れる

parser-combinatorsxml のように外部モジュールに切り出されるようです

Migrationは ScalaFix

ScalaFix以外のMigrationツールも検討中らしい

まとめ

よさの塊. まだ実装途中なのでリリースが楽しみ.

リリースが待ちきれない, そんなあなたに (すぐに試せます)