ikasama over technology

忘れたくないことを忘れないために

ゴリラ.vim #4 に参加してきました #gorillavim

gorillavim.connpass.com

当日飛び入りで参加してきました。 今回は神回という声もあって、そんなタイミングで参加できたのは幸運だったなと思います。

各発表のサマリと感想

翻訳プラグイン作った by ゴリラ さん @gorilla0513

docs.google.com

github.com

  • コマンドやバッファで入力した内容を翻訳
  • GAS ( Google Translate ) + Go + VimScript で実装
  • バッファに文字列を入力して Enter すると逐次翻訳されていく様は見ていて楽しい
    • 学生の頃、英単語の勉強のために xyzzy で似たようなことやってたな~としみじみ

https://camo.githubusercontent.com/bb7ce3f10042c5266c6dac15afe6b70def11ec93/68747470733a2f2f692e696d6775722e636f6d2f657a4c437253472e676966
リポジトリの README から拝借

GWで初めてVim Pluginを作った話 by かまたけんし さん @knsh14

docs.google.com

github.com

  • Vim のバッファ上の選択範囲から GitHub のリンクを作ってクリップボードにコピーするプラグイン
  • 便利!
    • コードレビューとかで「ここの実装見てみて」といったアドバイスするときに URL 欲しくなる
    • いつもブラウザでアクセスしてアドレスコピーしてた
  • 今のところ GitHub と GitLab に対応

  • Vim Plugin の作り方わからん
    • vim plugin 作り方 [検索]
  • wandbox, 手軽にいろいろ試せる SandBox 環境
    • 便利!
    • Vim Script が試せるのは初めて見た

wandbox.org

terminal-api について by てんなし さん @tnnsh1

speakerdeck.com

  • terminal mode ( Vim 8.0 )
    • Vim から terminal を使える mode
    • VSCode の terminal と同じようなことができる
  • vim-in-vim 問題
    • terminal mode で Vim を開くと Vim の中に Vim がネストしてしまう

vim-in-vimasciinema.org

  • terminal-api を使うと terminal mode から親 Vim へ通信ができる
    • Vim でファイルを開かせたり、関数を実行させたり
    • terminal-api での実行できる関数には命名規則があり、 Tapi_ で始まるものである必要がある

tapioka.vim

Neovim 0.4.0 新機能 フロートウィンドウについて by ドッグ さん @Linda_pp

speakerdeck.com

  • 既存のウィンドウの上にオーバーラップしたウィンドウを作ることができる!
  • 従来の Vim ウィンドウと同じように使える
  • はみ出すときは自動で位置とサイズを調整してくれる
    • こういうところ考えなくてよくなるのは楽!
  • フロートウィンドウを使った Plugin 例
    • git-messenger.vim
      • カーソル位置のコミットログをフロートウィンドウで表示 github.com
    • vim-iced
      • カーソル位置の Clojure の評価結果をフロートウィンドウで表示 github.com
  • 惜しむらくは Neovim の機能というところ
    • 本家 Vim にもほしい!
    • それか Neovim に乗り換えるか

飛び入り LT by tamy さん @__tamy

github.com github.com

  • comamnd-line fuzzy finder の紹介
  • 作者謹製の Vim Plugin もある
  • バッファをたくさん開いているときのバッファ選択とかに強い
  • fzf はいいぞ!
    • ぼくも enhancd と組み合わせて使ってます

飛び入り LT by ujihisa さん @ujm

  • ライブコーディングが印象的でそれしか覚えてない、、、
  • grep コマンドを VimScript で実装してみることに
  • 「美しいけど動かないコードより汚くても動くコードのほうが無限倍良い」、至言
  • 小さく実装して QuickRun を回す
    • スピードが圧倒的に違う、、、
  • マニュアルを参照しながら実装していく
  • 最終的に出来上がったコード ( 所用時間: 15 分 ) gist.github.com

  • 米国に行かれるそうなので、これが日本で最後の LT になるかもとのこと

    • 最後に面白いもの見させてもらいました!

飛び入り LT by はやぶさ さん @haya14busa

  • vim-easymotion でタブ移動する vim-hinttab を作った *1

github.com

  • タブにラベルを付与して表示させて、それをもってタブ移動できる
    • タブ 4 つ以上開いてるときは便利そう
    • でもぼくは tmux 使うから Vim の中であんまりタブ開かないかも……

VimConf 2019 の告知!

vimconf.org

全体を通して

  • Vim 初心者なので半分くらい話わからなかった
  • プラグイン作ってみるのもいいかなと思った
  • その前によくわからないままコピペで継ぎはぎした .vimrc をまともにしたい
  • 最終的にゴリラ、犬、猫、ウーパールーパー、隼が登壇し、人類より動物のほうがたくさん発表してた LT 会になりました
  • ぼくの HN は ikasama でイカ *2 なので動物側として近いうち LT 枠で参加を目指します

*1:勉強会中に、、、

*2:アイコンの白矢印はイカです。後から生えた設定です。

レガシーをぶっつぶせ。現場でDDD! 参加レポート #genbadeDDD

genbade-ddd.connpass.com

申込み時点で +100 人くらいで補欠だったので諦めてたんですが、 当日の 0:30 に繰り上がり通知が来て、慌てて参加しました。

全体を通して、いくつか印象に残ったことを書いておきます。

  • 始める前にメンバーとの共通認識をつくる
    • DDD の方法そのものの学習
    • 業務知識の理解
      • エンジニア以外のメンバーとの共通認識も重要
    • 良い設計のためにはビジネスの理解が必要
  • まったく新しく取り組む場合はリスクを小さくする
    • 小さく始める
    • 重要だが緊急性が低いもの
      • 緊急性が高いと品質を犠牲に完成を強いる圧力がかかりがち
  • ビジネスサイドへの説明は簡単ではないが大事
    • 小さく始めると少ないコストで実績を積んで成果を確認できる
    • 刷新前と刷新後のコードベースに対して同じ改修をして効果測定をした

  • 変化に弱い = レガシーになりやすい
    • とりあえずマイクロサービスにすればいいというわけではない
    • サービス分割がイケてないとやっぱりポシャる

感想

  • 新規開発ではつまづかないような、レガシーと戦う上での知見が聞けてよかった
  • チームで DDD に取り組むための心構えができた
  • まだ仕事で実践できていないけど、学んだ内容の再確認ができた
  • DDD は銀の弾丸ではない。レガシーとの戦いは泥臭い作業の繰り返しだ。

zsh + zplug で最強でポータブルなターミナル環境を作りたい

タイトルで言いたいことは全部言いました。

なんとなくインストールしていた zplug, よく見ると何でもかんでもインストールできることに気づきました。

github.com

zplug "jhawthorn/fzy", \
    as:command, \
    rename-to:fzy, \
    hook-build:"make && sudo make install"

これを使えば、言語環境から各種 CLI ツールまで全部 zpug で管理できるのでは? 最終的に、まっさらな環境で

sudo yum install -y git zsh
git cllone git@github.com:ikasam/dotfiles.git
chsh -s /bin/zsh
exec zsh -l

と実行するだけで開発環境が出来上がるかもしれない。

導入するもの

次に新しい職場に行くまでに作っておきたい。

技術書典 6 の本の感想 / 技術を伝えるテクニック

mochikoastech.booth.pm

  • テクニックの具体例があって実践しやすい
  • 文章だけでなく、登壇のテクニック、上手く教わるテクニックも紹介されていて良い
  • 目次だけでもだいたい伝わってくるところがすごい

技術書典 6 の本の感想 / フリーランスを完全に理解できる本 / バーチャル幼女プログラマー きりみんちゃん 公式ファンブック

フリーランスを完全に理解できる本

kirimin-chan.booth.pm

  • フリーランスという働き方にまつわる事柄を 1 冊で知れます
    • 一つ一つのトピックは自力で調べられる内容だけど、コンパクトにまとまっていて良い
  • 単価水準は参考にしてみようと思いました
    • あくまで 2019 年現在、東京都内の Web 系エンジニアの相場です
  • 税金周りはサラリーマンでも知っておいて損はない内容だと思います
  • キャリアについては軽く触れられている程度ですが、すぐに実践しやすい内容です
    • このあたりを掘り下げたかったら、より詳しい専門書をあたると良いでしょう

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

バーチャル幼女プログラマー きりみんちゃん 公式ファンブック

kirimin-chan.booth.pm

  • 文字が少ないので脳のリソースを使わなくて良いです
  • 1 ページ目に Hallo kirimin-chan って書いてあるけど幼女キャラの演出かなと好意的に捉えています
  • 君も公式ファンブックを買ってきりみんちゃんを応援しよう!

CakePHP 2.x の PaginatorHelper をハックする

TL;DR

この CookBook にあるようなパラメータを $this->request->params['paging'] に渡すことで任意のページネーション表示ができます。

https://book.cakephp.org/2.0/ja/core-libraries/helpers/paginator.html#PaginatorHelper::params

実際にパラメータを渡すサンプル。

$params = [
    'page'      => 2,
    'current'   => 10,
    'count'     => 777,
    'prevPage'  => false,
    'nextPage'  => true,
    'pageCount' => 4,
    'order'     => null,
    'limit'     => 10,
    'options'   => [],
    'paramType' => 'querystring',
];

$this->request->params['paging']['YourModel'] = $params;

背景

いまどき CakePHP 2 かよ! とお思いかもしれませんが、なかなかレガシーから抜け出せない組織、ありますよね。 弊社ではようやく新しいフレームワークに移行することが決まったんですが、それがまさかの CakePHP 3 。 どうせならもっとほかのフレームワークにしてくれや……と内心思いながら移行の仕事をしています。

今回の移行は、利用者や役割の異なる複数のアプリケーションにそれぞれ書かれている、同じようなビジネスロジックAPI に一本化してしまおうという目的があります。 単なるデータフェッチなら API にまるっと移してほぼ同じ構造のデータを返してもらい、 Controller とかがそれを受け取ればいいだけです。 しかし Paginator は View に がっつり Helper として入っていて、正直修正したくない。 *1 ということで Paginator によるデータフェッチをレガシーから切り離しつつ、 レガシーの Paginator には出来合いのパラメータを渡して PaginatorHelper を生きながらえさせる作戦を考えました。

実装

PaginatorHelper のパラメータサンプルの URL を再掲します。

https://book.cakephp.org/2.0/ja/core-libraries/helpers/paginator.html#PaginatorHelper::params

各パラメータの意味はこんな感じ。間違っていたら指摘ください。

$params = [
    'page'      => 2,             // 現在のページ番号
    'current'   => 17,            // 現在のページに表示している件数
    'count'     => 3,             // 全体の件数
    'prevPage'  => false,         // 前のページがあるか?
    'nextPage'  => true,          // 次のページがあるか?
    'pageCount' => 4,             // 全体のページ数
    'order'     => null,          // ソート順
    'limit'     => 26,            // 1 ページの件数( {:start}, {:end} の計算に使うのはこちら )
    'options'   => [],            // ページネーションのオプション。なんかいろいろあるっぽい。
    'paramType' => 'querystring', // 生成するリンクのタイプ。この場合は ?page=2 のようなリンクを生成する。
];

こういうデータを渡してあげることで、実際のデータフェッチ内容とは無関係のページング UI を生成できます。

f:id:ikasamak503:20190309234948p:plain
{:end} がちゃんと計算されていてえらい

しかし無意味なページング UI を構築しては使い物にならないので、フェッチしたデータとの整合性をとる必要があります。 今回、データフェッチは API 化して HTTP の JSON でレスポンスを返してくれる実装になりました。 なので、データと横並びでページングのパラメータをセットし、それをそのまま横流しする形をとりました。 気を付ける点として、 API 側は CakePHP 3 のため、若干パラメータのキーが変わっています。 以下、 CakePHP2 => CakePHP 3 の形式です。

  • order => sort *2
  • limit => perPage

この変換は CakePHP 3 側に実装しました。 こういった互換性対応は新旧どちらに実装するかは好みによるところですが、新 : 旧 = 2 : 4 という事情もあって新側に実装しました。 *3

余談

今回の CakePHP 2 => CakePHP 3 移行でこういうのも作りました。 レガシーと戦う全国 5000 億人の CakePHPer のためにも、また別の機会に紹介できたらなと思います。

  • Paginator でフェッチしたときに明示的にページングパラメータをセットするのが面倒なので自動化
  • CakePHP 3 の Entity を CakePHP 2 の配列形式と型に変換

まとめ

  • $this->request->params['paging'] にパラメータを渡すことで PaginatorHelper を操れます
  • CakePHP 2 <=> CakePHP 3 の Paginator のパラメータには一部互換性がないので気を付けよう

参考

*1:もちろんユニットテスト、UI 自動テストなんで気の利いたものはありません

*2:今回は order を使っていないので、ここの互換性は確かめてないです

*3:いずれ捨てることになるので旧側に作ってそのまま捨てたいという気持ちもある

可処分時間を上手に分配する

概要

  • 一日のうち、自由時間をうまく使いたい
    • 今の自分の環境だと平日 2 時間、休日 13 時間
  • 自由時間を可視化したい
  • 自由時間から自動計算してやりたいことを割り当てたい
    • 日々取り組みたいこととそれぞれの割合あるいは固定時間を定義しておく
    • そういう Web サービスとかスマートフォンアプリないかな?
    • ないなら作るか・・・
  • 自由時間を増やしたい

背景

やりたいことはいくつかあるんだけど、「知る」ことが大好きなぼくは自由な時間をほとんどそれにつぎ込んでしまっている。 特に、簡単に情報にアクセスできるネットサーフィンをやりがちだ。 Twitter の TL やリストを眺める、ブログや Qiita を読み漁る、 Wikipedia で知らない単語を延々とはしごする、はてブ人気エントリーをチェックする。 さらには読み切れないから「あとで読む」に入れて、次の日は他の新しい記事を読んでいたりする。 「あとで読む」があとで読まれない。無限に積みあがっていく。

今日、このブログを書いたのはある意味では奇跡で、ある意味では自分への警告だ。 今から時間の使い方を変えなければ、無限に「知」をむさぼるだけの妖怪になってしまう。 かつてそれでもいいと思っていた時期もあったが、今はそう思っていない。 自分を変えねば。

考察

自由時間 = 24 時間 - 生活維持時間

  • 生活維持時間とは?
    • 仕事と通勤
    • 睡眠、食事、入浴といった生理的なもの
    • ルーチンワーク
      • 掃除や家電、住環境のメンテナンス
      • 子供がいたら送迎とか

まずは自由時間を見えるようにする

  • 生活維持時間から逆算する
  • 生活維持時間を見えるようにする
    • 仕事と通勤: 12h ( 定時勤務でこれはアレな気がする )
    • 睡眠: 7h ( 最低これだけは欲しい )
    • 食事: 1h ( これは朝+夜だけ、昼は仕事時間に含まれる )
    • 入浴: 1h ( ぬるま湯で長風呂が好き )
    • その他: 1h ( 掃除とか、アトピーのケアとか、雑に使うバッファ )
  • 24h - 22h ( 生活維持時間 ) = 2h ( 自由時間 )
    • 少なくね・・・?
    • 2h 残業するだけで消える
    • まず通勤時間が 3h でアレ。通勤は悪。
  • 休日は 13h あった
    • 仕事と通勤がなくなって自由時間 +12h
    • 睡眠を +1h して 自由時間 -1h。休日はたくさん寝たいよね。

自由時間のスケジューリング

  • やりたいことを決める
    • インプット
      • インターネット
      • 書籍
    • アウトプット
      • ブログを書く
      • コードを書く
    • 語学 ( 特に英語 )
    • ゲーム ( 最近はモチベーション低い )
  • やりたいことの時間配分を決める
    • 割合: インプット 50%, アウトプット 30%, ゲーム 20% とか
    • 固定時間: インプット.書籍 は 0.5h/1日 とか
  • こういうのを日々自動計算して教えてくれると嬉しい
  • イレギュラーなイベントで予定が狂っても現在時間から再計算してくれると助かる
  • 何に何時間使ったとか、時間の記録もできると良い

自由時間を増やす

  • = 生活維持時間を削る
  • 安易に短時間睡眠に挑戦して睡眠時間を削りがち
    • やってもいいけど向き不向きがあるのでその方法に固執しないこと
  • 通勤時間は本当に無駄でしかないので削りたい
  • 個人的には入浴、その他は頑張れば削れそう
    • 体のケアや QoL 維持、日々の時間に余裕を持たせたいのでできれば削りたくない
  • 仕事の時間を削るのもありかもしれない

結論

  • まずは手動で、自由時間、生活維持時間の可視化とスケジューリングをやってみる
  • そういうことを計算・記録してくれるアプリや Web サービスを探す
  • なかったら自分で作る