徒然Vim

はじめに

Sunrise Advent Calendar 2019 - Adventar

VOYAGE GROUPさんのインターン「Sunrise」の Advent Calendar 2日目、やんやんです。

夏からvim幼稚園に入園して早3ヶ月経ったので、vimを使っていて思うことを徒然なるままに書いていく。

プラグイン管理を何でするのが良いのだろうか

vimプラグインマネージャーはいくつか存在している。Neobundleとかvimplugとかdeinとか、、、

自分は今deinでプラグインを管理しているが、みんなは何を使っているのだろうか。

deinはtomlファイルでプラグインを管理しているためvimrcがプラグインを追加するたびに汚くなっていくことがない点は長所だと思う。逆にvimplugみたいに全部vimrcにまとめられるのも複数端末で環境を揃えたいときなどは楽チンではある。こうしてみると、自分がこの結論に至るのは早計な気はするが、一長一短で好きなの使えばいいのでは...? と思えてしまう。dein以外のプラグインマネージャーの感想とかを是非とも聞きたい。

vim-surroundを多用している件

vim-surroundというプラグインがある。括弧やクオーテーションといった文字列を囲む物に対する編集を楽チンにできるようになる。括弧で囲われた中の文字列を削除したり変更するにはオペレータの次にi (inner) を入力すればできるのだが、クオーテーションをダブルクオーテーションにしたいとか、ビジュアルモードで選択したオブジェクトを括弧で囲いたいといった操作はvim-surroundによってできるようになる。

 

f:id:shinya-ml:20191129212103g:plain

上はvim-surroundの良さを伝えようとしている動画。実際はもっと素早くやっていたのだがgifに変換したらやたら遅くなってしまった。とにかく文字列を囲む物に対するアクションが格段に便利になるのでおすすめ。

fzfとの連携

CLIでインクリメンタル曖昧検索ができるfzfというツールが非常に便利。

以下のような関数をzshrc (or bashrc etc...) で定義してあげると、fzfでプレビューしながらファイルを検索して、見つけたファイルをvimで開くことができる。

fvim() {
files=$(ls -F) &&
selected_files=$(echo "$files" | fzf -m --preview 'head -100 {}') &&
vi $selected_files
}

 それだけでなく、vimでfzfが呼び出せるプラグインもある。ctrlpより高速 (らしい)のでキーマップをいじっておけばファイル検索の高速化が図れる。 (ちなみに自分はSpace + f に設定してある)

カラースキーマ決まらない問題

拙者、dracula大好き侍でござる。しかしdracula君はことtexファイルの時だけ真っピンクになってしまうお茶目さんなので使えない。(拙者はtexでスライドを作る侍なので結構致命的でござる) 今はpalenightというのを使っているのだがみんなのおすすめを是非とも教えて欲しい。

f:id:shinya-ml:20191201202413p:plain

texファイルの時だけ真っピンクに染まる淫乱dracula君

もうちょっと色分けして欲しいのは私のわがままなのだろうか。

テンプレート機能みたいな事が簡単にできた

日々のTodoをまとめるためのmarkdownファイルとか、研究の進捗報告スライドみたいに形式が固定化されていてかつ編集頻度が高いファイルを編集したいときが自分は結構ある。texが特にそうなのだが、毎回毎回書くべきおまじない部分が割と多いのがだるかったりする。

 

f:id:shinya-ml:20191201203522p:plain

週一で使う進捗報告用スライドのおまじない部分 (一部)

これまでは以前のファイルをコピペして使っていたのだが、意外とその手間もストレスだった。なんとかならんのかと色々調べた結果、vimrcをいじれば解決した。

f:id:shinya-ml:20191201205144p:plain

テンプレート機能みたいな事ができる設定

やってることはとても単純で、新しくバッファーに追加されたファイルの名前がマッチしたら対応するtxtファイルの中身を展開して流し込むだけ。つまり展開されるtxtファイルにテンプレートとしておきたい部分を記述しておけばストレスフリーなのだ。

まとめ

「思考速度 ≒ 編集速度」の道はまだまだ険しい。texファイルの編集をvimで完結させようとするのは結構手間がかかるがその気になればできてしまう事がわかった。

vimmerな皆さんのvim Tipsをお待ちしております。

vimmerじゃない方は是非一度普段のエディターのキーバインドvimにしてみてください。

 

【Treasure】3週間、コンフォートゾーンの外側で挑戦した話

はじめに

みなさんこんにちは。VOYAGE GROUPさんのインターン「Treasure」に参加したのでブログに色々書きます。

Treasureに参加した感想

まず結論から言うと、Treasureに参加して本当に良かったです。技術的に大きな成長ができただけでなく、サービス開発をする上でのものの考え方、チーム開発の進め方など得られたものがたくさんありました。

書いてる人のバックグラウンド

  • 某名古屋の大学院M1
  • 研究室では機械学習の「多目的ベイズ最適化」というテーマで研究してます
  • Webアプリケーションの作成経験はなし
  • プログラミングは研究の実験のためにpython書いてるくらい

Treasureの概要

  • 期間 : 8/12 ~ 8/30 (三週間)
  • 前半 (7日間) : 講義、後半 (8日間) : チーム開発
  • 参加人数 : 30人
  • 報酬 : 12万円
  • 遠方からの参加の場合東京までの交通費支給

なぜTreasureに参加したのか

バックグラウンドで書きましたが普段自分は機械学習の研究をしています。そんなWeb開発未経験の輩がなんでTreasureに参加したのかと言うと"未経験だった"からです。上述の通りTreasureの前半部分は講義形式になっており、「一人で学びにくいこと」を学べることが参加を決めた一番の理由でした。他にも自分の就職先として、エンジニア or データサイエンティストどちらになりたいのか決めるために開発系のインターンに行きたかったというのもあります。

Treasure中意識し続けたこと

Treasureの初日 (だった気がする)、CTOの小賀さんがありがたいお話をしてくださいました。その中で「コンフォートゾーンの外側で挑戦し続けて欲しい」という言葉が印象に残っています。自分が快適でいられる空間のちょっと外側で挑戦し続けることが成長に繋がるという意味合いだと解釈しています。Web開発経験0な自分からするとTreasure中は常にコンフォートゾーンの外側にいたような気はしますが、小賀さんの言葉を頭に浮かべながら15日間過ごしていました。結果的に初体験の領域で苦しい思いをして最終的に動くものを作ったという経験は、自分を大きく成長させてくれたし自信にもなりました。

 

15日間何をしてきたか

ここでTreasureの内容を1日ごとにざっくり書いていきます。

1日目 (Go講義)

Treasure初日、全員で円を作って名前を覚えるためのちょっとしたゲームをしました。そのあと早速すずけんさんによるGoの講義が始まりました。講義の内容としてはGoでcurlコマンドの機能を実装したり、DBにクエリを投げるapiを生やして小さなコマンドラインアプリケーションを作ったりといった感じです。Treasure全体を通してとにかく手を動かしてコードを書くことを重視していると思いました。

2日目 (Go講義その2 & フロント講義)

2日目の午前中はpeiさんによるGoの講義その2。あらかじめ用意されていたベースアプリを元に要件にそったapiを実装するという内容。バックエンドのディレクトリ構成と各ディレクトリの役割は説明があったのですが、その時は何から書き始めればいいのか分からずTAの方やpeiさんに質問をしながらちょっとずつコードを書いていくといった感じでした。

午後からはyang weiさんのフロントエンド講義。javascript (以降js) の歴史の話から始まりました。jsって10日間で作られたんですね... 驚きでした。そのあとjsの基本的な内容を軽く触れつつ、async, defer, closureといった事項についても適宜演習時間が設けられ手を動かしながら学んでいくという感じでした。

3日目 (フロント講義その2)

3日目はまず前日の講義の続きで、Promiseに関して演習をやりました。これでバックエンドで生やしたapiがフロントで叩けるわけですね。途中からは講師がちゅうこさんに代わり、jsのフレームワークの話から各々好きなフレームワークを使って前日に作ったapiをフロント側で叩いて色々するという演習をやりました。

4日目 (DB講義 & 中間課題)

4日目はDB講義から始まりました。データモデリングの技法やマイグレーションに関するお話をstep by stepで実際に与えられた課題に対して自分でDB設計をするという形で学んでいきました。また、3人チームになって仮想のサービスのDB設計をやりました。そこでは何回か要件が追加されDB設計を変更するという演習もやりました。

その後、中間課題なるものが出題されました。その内容はこんな感じ

  • テーマ : 自由
  • ルール : 講義で習ったものを生かす、動くものを作ること、バックエンド or フロントエンドどちらかだけでも良い
  • 締め切り : 翌週月曜日の10:30

これが発表されたとき自分はこんな顔してました。

f:id:shinya-ml:20190831211712p:plain

 

正直な話、この時点で講義の内容に全然ついていけてなくて結構苦しんでいました。演習も手が止まってしまうことが多く、そんな状態で何か動くものを作れるんか...と不安しかなかったです。考えた結果、その時点ではフロントの方が書けそうな感じだったのでサーバーサイドを全部firebaseにお任せしてReactでTodoアプリを作ることにしました。Reactは触るのは初めてだったのですがこのとき隣の席だった人がReactの経験があって、最低限の知識を丁寧に教えてくれたためなんとか書き始めることができました。

5日目 (中間課題)

1週目の最終日は一日中間課題の実装に当てられました。自分は結局土日も潰してなんとか形になって動くものが作れました。(このときバックエンドに手が回らなかったのが今でも心残りです。)

6日目 (中間課題発表 & セキュリティ)

午前中は5チームくらいに別れて中間課題の発表をしました。みんな個性的なアプリを作っててすごいなーと思いながら、自分ももっと面白いもの作りたかったなぁとかもっと頑張ればバックエンドも実装できたのでは?とか悔しさが残る中間課題でした。

お昼を挟んでセキュリティの講義がありました。そこでは代表的な脆弱性 (XSSとかCSRFとかSQLインジェクションとかとか)がどういうものなのかだけでなく、それらの脆弱性が実装上のどこに潜んでいるかというのを、用意されたアプリで探しながら学んでいきました。

7日目 (認証 & チーム発表 & インフラ)

7日目の午前中は認証のお話 (Auth2.0とか)。そして後半のチームが発表されました。チームは全部で6チームでTreasure生が5人ずつ、そこにエンジニアのサポーターが2人と人事の方が1人という構成でした。 (手厚い)  お昼はチームで食べました。自己紹介をしたりとか自分のあだ名が決定したりとか色々ありましたw

午後からはインフラの講義。後半のチーム開発はAWS上で行うのでAWSの使い方やCI/CDの重要性についてお話がありました。

そしてこの日の終わりに宿題が出されました。

「チームのSOULを考えてこい」

SOULは簡単にいうと自分たちの作るサービスのコアにある考え方のようなものですね。定時後、チームごとに飲みに行きそこでSOULをどうするか話し合いました。各々のものづくりの信念を話したり結構熱い飲み会だったと思います。

8日目 (アイデア出し)

8日目は、アイデア出しの講義。サービスのアイデアの出し方を実際にやりながら学びました。最終的にいくつか面白いプロダクト案が出て、すごい楽しい講義でした。

9日目 (チーム開発スタート)

いよいよこの日からチームでの開発がスタートしました。なのでここからの内容は自分のチームがどんな感じだったのかになります。チームごとで結構進め具合というのは違います。

この日は、チームでどんなサービスを作るのか決めるために前日の講義と同じ手順でアイデア出しをやりました。その過程でたくさんのアイデアが出ましたが最終的に2つに絞ってこの日は終わりました。

10日目

この日の午前中に絞った2つの案からどちらにするかをチームで話しあって決めました。午後からはVGのクルーの方にヒアリングをさせていただいてユーザーのニーズやそれに対するソリューションを明確にしていきました。その後、実装したい機能を列挙してその優先度を決めていきました。

この時点で月曜日 (11日目) から実装を始めたいという意識がチーム全体であったため、そこまでに必要なことを土曜日にやりました。 (レイアウトやDB設計、技術選定、画面遷移etc...)

 

11日目

この日から実装に手をつけ始めました。メンバーの一人の提案でモブプロをすることになりました。メンバー全員がバックエンドもフロントエンドも書けるように、まず全員でapiを生やしてそれを叩くフロントの実装をしました。実はこのモブプロのおかげで前半の講義で不明瞭だった、どこから手をつけていいかというのがわかるようになりました。なのでモブプロを提案してくれたOォーリーにはとても感謝しています。

12日目 ~ 14日目

この3日間はひたすら手を動かしていました。自分のチームはタスクを付箋で管理しており、フロントバック関係なく各自で仕事を取っていくという感じでした。

ちなみにチームの使用技術はこんな感じ

  • バックエンド : Go
  • フロントエンド : React (hooksとかreduxとかstyled-componentとか)

わからないことがあったらメンバー同士で聞き合ったり、サポーターの方に質問したりとまさに一丸となって開発をしていました。

14日目は次の日の11:00が締め切りなこともあって徹夜で開発をしていました。

15日目

最終日、11:00に開発が終了しました。午後から各チームのプレゼンが始まりました。10分間のプレゼンの後学生と審査員の質疑応答がありました。

その後、審査員の評価と学生の投票を元に最優秀賞と優秀賞 (2チーム)が発表されました。ちなみに僕らのチームは優秀賞をいただきました。全てのチームに対してフィードバックコメントがあり、よかった点ともっと改善できそうな点 (実装面だけでなくサービスの設計に関しても) 両方コメントをいただけたのはありがたかったです。

締めにみんなで一言ずつメッセージを言っていきました。涙を見せる人や悔しさを滲ませる人もいましたが、全員が共通して言っていたのは「Treasureに参加してよかった」涙や悔しい気持ちはTreasureに本気でコミットしていたから現れるものだと思います。なので僕を含めTreasureに関わった人全てが本気でTreasureにコミットしていたんだなとその時しみじみ感動していました。最後の飲み会はチームの人たちとこれまでを振り返りながら色々話したり、他のチームのメンバーやクルーの方と話ができて本当に楽しかったです。メンバーやサポーターの方から「お前はめっちゃ成長した!」とか「できるようになったな」とか言ってもらった時は嬉しかったと同時に成長できたんだなって安心しました。(あと泣きそうでした)

Treasureのよかったところ

個人的にTreasureのここがよかった!!という点を箇条書きしていきます。

  • 全体を通してサポーターの数が多い

びっくりするくらいサポートしてくれる人の数が多かったです。前半の講義部分では講師の方以外にTAの方がいて、質問に答えてくれたり時には一緒に調べてくれたり、手厚くサポートしてくれました。

後半のチーム開発では各チームエンジニア2人 + 人事1人がサポーターとして参加してくれました。サポーターの方には、技術的な相談だけでなくチーム開発を進める上でのアドバイス (時間の管理やサービスに対する考え方など)をいただいたり、開発最終日には僕らの分のご飯を買ってきていただいて徹夜に付き合ってもらって...本当に感謝してもしきれないほどたくさんのサポートをしてもらいました。

  • 15時におやつがデプロイされる

日替わりで15時になるといろんな部署の方々がおやつを差し入れしてくれました。ドーナツとか551のアイスキャンディーとかうまい棒900本とかとか... 後半死ぬほどうまい棒を食ってた気がします ()

  • 中間課題に対する個人フィードバック

全員の中間課題に対してyang weiさんが一人30分ずつフィードバックコメントを対面形式でしてくれました。細かく丁寧にアドバイスしていただいて、今後に生かして行かなきゃなと思いました。

  • Treasure生同士で質問しあえる

講義中、講師やTAの方だけでは質問を捌き切れないことがたまにありました。そんな時に結構Treasure生同士で講義中に質問したりそれに答えたりということがありました。僕もいろんな人にいろんなことを質問しまくっていたのですが、みんな嫌がらずに答えてくれて「ええやつしかおらんやん (涙) 」って感じでした。Treasureは講師、サポーター、Treasure生全員で作り上げていく、そういうインターンだなって思いました。

シェアハウス

Treasure中、僕は他の地方からきたTreasure生とクルーの方、合計8人でシェアハウスに住んでいました。正直Treasure前にシェアハウスであることを知った時は「まじか...」って思いましたがいざ始まってみるとシェアハウスでよかったなって思ってます。みんなで講義わからなかった部分を聞き合ったり、ご飯を作ったり、時にはお酒を飲みながらマトリックスを観たりw 振り返るとめちゃくちゃ楽しかったです。

最後に

僕はこのTreasureを通じて、「もの作りクッソ楽しいやんけ!!」って気づきました。それに気づけたのは紛れもなくTreasureに関わった方々全員のおかげでした。知識0の僕が3週間経って「あれ?Webアプ一人で作れんじゃね?」って思えるようになれたのは、Treasureでコンフォートゾーンの外側で挑戦し続けることができたからです。これからもWebアプリの開発は自分で続けていこうと思っています。

Treasure最高でした。興味を持った方、まずは応募してみましょう。

長くなりましたが最後まで読んでいただいてありがとうございました。