私が歌川です

@utgwkk が書いている

写真で振り返るインターン

トングをカチカチしてパンを威嚇するTシャツ

https://booth.pm/ja/items/1385948

f:id:utgwkk:20190820102609j:plain

OFUTON DYNAMICS Tシャツ (White)

https://shapoco.booth.pm/items/994571

f:id:utgwkk:20190820191512j:plain

ツイッターやめろTシャツ

https://booth.pm/ja/items/1125516

f:id:utgwkk:20190821202012j:plain

肉体人類向けチャ・ゲバランTシャツ

現在入手不可能

f:id:utgwkk:20190822191031p:plain

めちゃでかめんだこTシャツ

https://suzuri.jp/moko_oxygen/1903248/t-shirt/l/white

f:id:utgwkk:20190823192451j:plain

決戦Tシャツ

https://suzuri.jp/shoshokaki/812875/t-shirt/l/natural

f:id:utgwkk:20190826191548p:plain

ぱちょこんTシャツ

https://minne.com/items/2715511

f:id:utgwkk:20190827220741j:plain

食べて応援!うなぎ絶滅防止キャンペーンTシャツ

https://www.ttrinity.jp/product/4110344

f:id:utgwkk:20190828204918p:plain

OBEYめんだこ

https://suzuri.jp/moko_oxygen/1899664/wash-t-shirt/l/white

f:id:utgwkk:20190903102517j:plain

少女終末旅行 ほね

https://www.amazon.co.jp/dp/B077FRP44G/

f:id:utgwkk:20190904102752j:plain

葉巻を吸うおパタ

https://suzuri.jp/moko_oxygen/1921103/t-shirt/s/indigo

f:id:utgwkk:20190904190846j:plain

シスター・クレア Tシャツ(白)

https://booth.pm/ja/items/952228

f:id:utgwkk:20190906191212j:plain

キズナアイ×Yunomi コラボTシャツ

https://2018hello.world の物販で購入

f:id:utgwkk:20190909190038p:plain

一人月Tシャツ

https://booth.pm/ja/items/1033854

f:id:utgwkk:20190911190602j:plain

LGTM Camera

https://suzuri.jp/hatena/457167/t-shirt/l/royalblue

f:id:utgwkk:20190912190138j:plain

はてなTシャツ2016:はてな15周年デザイン

https://pr.hatenastaff.com/entry/hatenatshirts2016

f:id:utgwkk:20190914121511j:plain

あわせて読みたい

scrapbox.io

はてなインターン2019で優勝した

はてなという会社で1ヶ月インターンに参加していました。 はてなのサービスは普段使っているものが多く、じぶんが使っているものを便利にしたいなと思っていたことや、今年のインターンどうしようかなと思っていたところまだ応募できると聞いたことなどが応募・参加するきっかけでした。

要約すると、めちゃくちゃ充実した4週間が送れて最高でした。

やったこと

応募

インターンに参加するには応募をしないといけません。 応募するために、ポートフォリオを書いてROT13を実装しました。 よく手になじんでるPythonで実装したのですが、そういえばPythonの標準ライブラリにはROT13があります。

import codecs
codecs.encode('hoge', encoding='rot13')  # => 'ubtr'

これでも確かに要件は満たしていたと思いますが、拡張性に乏しいのでこれは没にしました。

引数からオフセットを指定できるようにし、テストも書いて提出しました。

前半

GoとTypeScriptを使って日記サービスを実装する、という課題をやっていました。 どちらの言語も静的型やlinterがあるので、VSCodeを入れて拡張機能をぽちぽち入れるとすごく快適に書けました。

1週目は、午前中に講義を聞いて、午後は講義をもとに機能を追加するということをやっていました。 なんとなく知ってることから初めてのことまでいろいろやっていて、たぶんこの週がいちばん疲れていたと思います。 とくにGraphQLやReactなどは雰囲気はなんとなく知ってるみたいな感じだったので、講義で体系的に知ることができたのでよかったし、実装で致命的に詰まるみたいなことはありませんでした。

2週目は、日記サービスに好きな機能を実装していました。 私はbuilderscon tokyo 2019に行く予定にしていたので、実装時間がかなり短かったです。

utgwkk.hateblo.jp

後半

id:ergofriend とともにブログチームに配属され、GoとTypeScriptを書く暮らしから一変し、Perlを書くことになりました。 7年ぐらい前までPerl掲示板を作って大喜びしていた*1という感じなので、実質本格的にPerlを書くのは初めてでした。

Perlが難しくてめちゃくちゃ困るみたいなことはなくて、はてなブログのコードベースは大きいけど丁寧なので、id:hogashi に見てもらいながら関数定義を見つつやっていく、という感じで実装できました。 DESTROY はおそらくリファレンスが回収されたら走るのだろうな、みたいなことにどんどん詳しくなっていきました*2

手元のDocker環境がときどき壊れて再起動したり、負荷が高いとテストが落ちるなどがあったりしました。たぶんマシンパワーで殴る必要があります。

成果

この記事がTwitterにシェアされた様子を見てなにか気づきませんでしたか?*3 これはアイキャッチ画像自動生成機能といって、アイキャッチ画像が指定されていない記事のタイトルと本文から自動でアイキャッチ画像を生成する機能です。

staff.hatenablog.com

作例です。

社内でもウケが良い機能になったと思っていて、発表もかなりうまく・おもしろくできていたと思います*4。 おかげさまで投票の結果優勝することができました。

Tシャツ

utgwkk.hateblo.jp

utgwkk.hateblo.jp

utgwkk.hateblo.jp

私はおもしろいTシャツを買って着るのが趣味なので、インターン中は毎日違うTシャツを着て出社していました。

utgwkk.hateblo.jp

感想

はてなインターンは一貫して丁寧だなと思いました。 前半でも後半でも、問題が解決するまでメンターの方が付きっきりでサポートしてくれました。

参加するのを迷っているのであればとりあえず応募してみることを強くおすすめします。 とくにあなたが普段はてなのサービスを使っているのならなおさらおすすめです。 一部日程だけどうしても予定があるという場合でも、数日ぐらいならなんとかなると思います(なりました)。

京都に住むのは5年目で、自宅からオフィスまで通う生活をしていました。 やっぱりよく慣れた土地だと調子がめちゃくちゃになりにくい気がします。 そういえばほぼ毎日飲酒してた気がするけど遅刻することはありませんでした。

まかないがおいしいので昼食どうするか考えなくてよいのがいいですね。参加前に比べて体重が増えました。

参加してみて分かったことは、じぶんが普段よく使っているサービスに直接コミットできてフィードバックが得られるのはあまりにも体験が良いということです。 じぶんのモチベーションの源がどこにあるのかのヒントが得られた気がします。

繰り返しになるんですけど、参加するかどうか迷っているならまずは応募しましょう。 こんなに充実した4週間はなかなか送れるものではありません。

その他インターン中の出来事

  • 社員みたいだねと言われる
  • id:cohalz にアニメ娘エイレーンのクッションをもらう
  • Kyoto.なんか を遅刻して見にいく
  • ビルコンを見にいく
  • id:Furutsuki のおかげでさだまさしの歌詞をちょっと知る
  • ISUCONの予選で敗退する
  • PerlのLanguage ServerがDocker上で動くようになる
  • ぶどうジュースを飲みまくってたら自販機のぶどうジュースが増える
  • id:sobreera が最終日についにはてなIDを変える*5
  • カードキーを返却した後にトイレに行って涼風青葉状態になる
  • 最終日にオフィスのソファでくつろいでたら id:motemen に「来週もよろしくお願いします」と言われる

あわせて読みたい

furutsuki.hatenablog.com

blog.hokkai7go.jp

lunastera.hatenablog.com

blondenamazu.hatenablog.com

ergofriend.hatenablog.com

*1:そのころはモジュールとかパッケージとかなにも知らなかった

*2:こういう言語機能の挙動を見るのは実際面白い

*3:この機能のために、この記事では一切写真を入れないように注意しました。

*4:id:ergofriend が自己紹介でいきなり韻を踏んだときは度肝を抜かれた

*5:id:lunastera になった

ISUCON9に参加した #isucon

ISUCON9に参加しました。チーム名は :innocent: で、チームメンバーは id:wass80id:nonylene です。去年と同じチームで、id:nonyleneにインフラ周りを全て見てもらいながら私と id:wass80 で実装を見るという作戦でした。使用言語はPythonです。

最高得点は5410点、最終得点は0点で、予選は突破できませんでした。

nonylene.hatenablog.jp

github.com

やったこと

各言語実装のディレクトリにgitignoreを配置する

gist.github.com

唯一前日から用意していたこととして、こういったスクリプトを書いていました。 これを実行すると各言語実装のディレクトリに対応するgitignoreを置くことができるので、リポジトリが肥大化するのを防ぐことができます。

categoriesをベタ書きする

categories は固定なので、毎回DBから引くのではなくアプリにベタ書きしました。 当初は /initialize でDBから引いたものを使いまわすようにしていたけど、 なぜか flask.g に書き込んでも読み込めなくて断念しました*1*2デバッグ出力からdictをコピーしてきたけど空白が入るなどでけっこうバグってしまい、もうちょっとスムーズにやりたかった……。

GET /new_items.json のN+1を潰す

item_simples に対して get_user_simple_by_id を回していて明らなかN+1だったので潰しました。 今回はINNER JOINじゃなくてSELECT ... WHERE id IN (...)を発行していたのですが、ロジックはこっちのほうがわかりやすい気がします。

GET /users/transactions.json のN+1を潰す

GET /new_items.json とだいたい同じですが、 transaction_evidencesshippings はLEFT JOINで引っ張るようにしました。

インデックスを貼る

pt-query-digestの結果を見つつ次の2つのインデックスを貼りました。

create index items_seller_id on items (seller_id);
create index items_created on items (created_at);

やらなかったこと

商品の表示順の調整

当日マニュアルを見ると、商品一覧の表示順はユーザの編集が反映されてさえいればなんでもよいように見えたので、じゃあ高価な商品をトップに持っていけば点数が出るのでは? ということは検討していたけど、結局やらなかったです。やってもよかったけど競技終了ギリギリになってしまった……。

外部APIの解析

外部APIが2つあって、どちらもHTTPSかつHTTP2でレスポンスが返ってきていたので、これをうまく使えないか? とか、どんなレスポンスヘッダがあるかとか実はキャッシュできるのでは? とか今になって考えているのですが、そこまで手が回りませんでした。 GET /users/transactions.json でN回外部リクエストを送っているのが明らかにやばくて、これはチームメンバーに改善を託していました*3*4。でももうちょっと気合を出してじぶんも実装を見たほうがよかったな……。

得られた知見

VSCode Remote Developmentは重い

最初はVSCodeでリモート編集をしていたのですが、htopを見たところVSCodeのサーバがめっちゃメモリを食っていたので、落としたところ点数がかなり増えました。 それ以降はずっとリモートのvimでコードを書いていました。

画面が多いとお得

当日は id:wass80 が東京にいたので、Slack callとzoomを駆使して音声や画面を共有していました。 チャットで書くよりも音声のほうがやっぱり高速に意思伝達できるし、画面共有でペアプロやペアオペが可能なのはすごく便利でした。

非同期処理がやりたくなったら非同期処理が得意な言語に逃がすのがよい

非同期処理の実装はずっと眺めているだけだったのですが、Pythonで非同期処理をスッと書くのは難しそうでした。 Node.jsに逃がす作戦も検討されていたのですがこれはふつうに時間が足りなかった気がする。

当日マニュアルを読み飛ばさない

自然と書き忘れてた、これが一番大事!!!!!!!!!!

3人いて誰も複数台構成にしてよいことに気づかず、あ~今回はサーバ1台か~って言いながら競技終了まで実装をしていました。こんなことある?

謎だったこと

gunicornやuwsgi経由で起動するより python app.py ってやったほうがスコアが出た

これはマジで何だったんだろうか……。しっかり調査したい。

感想

年々どんどん参加者のレベルが上がり、そして問題のテーマもおもしろくなっています。 N+1を潰してインデックスを貼れば学生なら予選突破できる時代は終わり、アプリケーションの本質的な改善に手をつけないといけない時代になっているのですが、身体が追いついていないですね。

毎年こんなに面白いテーマの問題が出てくるのすごいなあと思っています。

*1:追記: これたぶん /initialize を受けたワーカースレッドにしか flask.g.categories がsetされていなかったからでは? と思う

*2:追記: それはそうとしてベタ書きにするのはRedis入れて云々~よりも引っかかりが少ないと思うのでよかったのではないか、結局バグらせはしたが……

*3:なぜなら前半ずっと実装しつづけていて疲労していたので

*4:なぜなら頭は1つしかなく、非同期処理がよくわかっていなかったので

PerlのLanguage Server、おもむろにVSCodeのsettings.jsonに、

"perl.sshWorkspaceRoot": "/path/to/hoge"

って書いたらsshじゃなくてdocker使っててもパスを変換してくれることがわかった。

marketplace.visualstudio.com github.com

よく考えるとたしかにLanguage Serverにはserverっていう語があるし、リモートがローカルと全く同じ環境で動いてる保証はなく、環境の差異を吸収できるようになってるのは正しそう。 リモートという概念がsshという言葉に一元化されているみたいな感じ。

builderscon tokyo 2019 行った #builderscon

8/28-8/30にbuilderscon tokyo 2019 に行きました。ロゴがグリッチみたいでかっこいい。

builderscon.io

いろいろ聞きましたが、スーパーカミオカンデの話がいちばん面白かったです。 物理の話から始まり、短時間に大量の観測データがやってくるのでそれを捌くとか、FPGATCP/IPを実装するとか、どんどん力のある話が出てきてよかったです。

東京に行くにあたって、地方からの学生はお金ないしな……となると思うのですが、今回はClassi株式会社のスカラーシップのおかげで、お金の心配をすることなく参加することができました。重ねて感謝の意を申し上げます。

普段、コードを書くとかよいロジックの設計をするみたいなことは見たり考えたりするけど、ハードウェア面に寄ったところにはあまりアンテナを張ってなくて、それこそ前夜祭でのやっていきのあるIoTの発表とか、自作キーボードとか、ぜんぜん知らないことや、技術的にもアイデアも面白いことをやっているという発表が聞けたのはよかったです。

来年も参加したいし、来年も学生支援制度が(より多くの学生に向けて)提供されてほしいと思います。

荒川は大きいなと思いました。

対になっているものをよく間違えることがある。 論理演算をするコードを書くときもかなりの確率で間違えてて、走らせてみてあれーおかしいなーとなって気づく。

scrapbox.io

この世には対になっているものが多くてたいへん。

帰省から戻ってきたら自転車がなくなっていた。MOVのクーポンも使い切ってしまい、今はあらゆるところに歩いて向かう過酷な暮らしをしている。

kyoto-bicycle.com

自転車の登録番号を入れると撤去されたかどうかが分かる便利なサイト。