それが僕には楽しかったんです。

いろんなレイヤーに居ます

今までやったこと、これからやりたいこと

はじめに

最近、荒廃した世界で生きていく系の映画とドラマに弱いという事が発覚したけんつです。

今まで色んなことやり過ぎて、最近自分でも何やってきたか思い出すまでややしばらく時間がかかるようになってしまったのでポエムっぽく書いていきます。

ざっくりと

こんなこと今までやってきました。

時系列順です。最初にやっていたことからです。

  • 競プロやってました (Java)
  • 一瞬Androidやってた時期ありました (Java)
  • 一瞬クローラ作ってました (Ruby)
  • 画像処理を少しやってました (Python + OpenCV)
  • 自然言語処理も少しやっていました (Java + Deeplearning4j)
  • APIのラッパーライブラリ作りました (Scala)
  • Webサービス展開している企業でリモートワークはじめました (PHP7 + ES6)
  • Linux Kernel Module作りました (C-lang)
  • DHCPパケット書いてました (C-lang)
  • サーバサイドに骨埋めました (PHP7 + NodeJS)
  • AWS使ってインフラ構築しました (S3 + EC2 + Cognito + SQS + RDS)

インフラ系の技術は以下のやつ触ってきました

普段の開発環境

現在進行形でやっていること

  • サーバサイド全力で勉強しています
  • nodejsはじめました
  • API設計に関する勉強しています
  • 深層学習についてゼミで勉強しています(Python + Keras)

やっていきたいこと

  • OSS 開発に貢献していきたい
  • モバイルやってみたい
  • サーバサイド、もっと極めてみたい
  • とにかくなんでもやってみたい(これ大事)

競プロ

これは、プログラミングというものを始めたは良いが何を作ればいいかわからなくて結構やっていた時間は長い。
新しい言語をやったときは大体やる。

基本的にはAtcoder, Yukicoder, ちょっとだけTopcoderに出ていた。
今は難しいが、ABCでいうところのC問ぐらいまでは30分で解けるだけは勉強していた。

これは

  • Java8
  • Python3
  • PHP7
  • Scala2.12
  • C

で解いていた。

途中でJVM系言語のパフォーマンスチューニングやったり、無駄にワンライナーで解いたり
意味不明な方向に走り始めたのが最後になってしまっている。

一瞬系

これはほんとに一瞬やっていたぐらいのやつ

android

競プロやりすぎて、もっとグラフィカルなものをやりたいとおもって少しだけ始めた。
何を血迷ったか WebView おもしれぇ!!ってなってブラウザを作りたいなってなって、実際に作っていた。

クローラー

Androidをやった後に、なにやろうってなって本屋でクローラー開発技法の本を見つけ一瞬はまっていた。
多分この時期ぐらいしかRuby書いてない。

画像処理

これは他のに比べると少し長い。
すぐに結果が画像としてわかるっていうのが面白くてのめり込んでいた。

Python + OpenCVと書いたけど、画像処理に関する基礎的な勉強をしたくて
OpenCVは画像のロードにだけ使っていた。
フィルタとかその他色々なものは、二次元配列を直接いじって再現したりなんだりと。
このブログに色々まとめている。

自然言語処理

この時期が一番、本当に一番迷走していた。
なにかをこじらせて、彼女造る宣言をして急にやり始めた。
結局会話はできなかったけど、形態素解析マルコフ連鎖、単語のベクトル化はやった。
なぜかJavaで書くことに固執していた。

APIラッパーライブラリ

これはかなりやっていて、ここまでのものに比べると本当に頑張っていた。
やった内容は、ScalaでTwitter4Sというラッパーライブラリを作っていた。

というのも、これ実は数年前にもやっていて、その時は難しすぎて作れなくてリベンジの意味合いもあった。
なので、本気でリベンジしようと思って ver 1.0.0 は Java, Scala の標準ライブラリのみで処理を書いていた。
なんだったらそれにこだわるが故に、Apache Base64Scalaで書きなおしていた。

その後、デザインパターンを学んだり、テストを導入してCIで回したりして公開することになったので
Base64 部分と JSON 解析部分はライブラリを使うようになった。
HTTP系の処理は今も標準ライブラリでフルスクラッチしたままだけど、これが最高に楽しかった。
寝ても醒めても、考えていたのはこのプロダクト以外には無い。

github.com

リモートワーク

社名とかは出せないが、大きなトラフィックを誇るWebサービスを自社展開している企業でリモートワークを昨年から始めた。
基本的に作業内容は新機能開発とリファクタリング、バグ修正を行っている。
今の自分が半人前ながらサーバサイドエンジニアをやっているということや、色んな所で自分の得意分野はサーバサイドですと胸を張って言えるのはここで現場に突っ込まれて鍛えてもらえたからだとおもっている。
けんつのサーバサイド人生には欠かせない要素。

未経験だった自分を採用して頂いたことや、そのあと色々と勉強させてもらったこと
いろんな経験を積めたこと、お世話になった方々
その全てに感謝してもしきれない。

カーネルモジュール

これは初めてのインターンで KLab さんの技術系インターンに参加することになった時にでた事前課題「カーネルモジュールでEchoサーバを作る」に取り組んだことに関連している。

事前面談で
「ネットワーク系に触れて欲しいけど、単にEchoサーバじゃ簡単すぎるからカーネルモジュールにしてもらおうか」
ということではじめた。

カーネル周りはバージョンによっては本当にドキュメントがなくて
必要とあらば、カーネルソースコードを読んだりして理解してきた。

大変だったけど、ただのネットワークどころかカーネルで扱えるネットワークについての知見を貯めることができたので面白かった。

この時点で、やった分野がカーネルからWebまでという意味不明な広さになっていく。

github.com

DHCPパケット

その後のインターンでは
メンターの山本雅也さんが作っていたアプリケーション空間で動作するプロトコル・スタック「microps」にDHCPクライアント機能をつける
という課題に取り組んだ。

C言語でやっていたわけだが、アドレスやポインタ、16進数、ネットワークと格闘しながらどうにかこうにか実質3日で実現できた。
RFCと格闘したのも今となってはいい経験となった。

github.com


これの本当に大事な部分は、「問題にぶちあたった時に、経験が無くとも問題を解決していく」という過程にあった。
また「わかることと、実際にできること」の違いなどを実感することにもなった。

この経験は大きく、このインターンで経験したこれらは今のリモートワークでも生きていて
パッとみたときに全くどうしたらいいかわからない状況でも問題を分析し解決していけるだけのノウハウを手に入れた。

技術的な部分ではこのあたりから低レイヤーと言われるものに抵抗がなくなり
画像処理の講義でPNGのヘッダーをバイナリから解析したりしていた。

サーバサイド

インターンの後は一層Webサーバサイドに注力していった。
やったことは、PHPでシンプルテンプレートエンジンをつくったりOSSを読んだりしていた
基本的に全てフルスクラッチすることで勉強して、ブログにアウトプットし泥臭く経験を積んでいった。

ここでは主にPHPとJSをつかった。

作ったものはいろいろあるが、特に注力したのは
マストドンの OAuth2 を扱うライブラリを作ったこと。

github.com

これは The PHP League の oauth2-client をベースにしている。
これをつくったあとプルリクを出したらマストドンのドキュメントにある、Mastodon APIを使う上で推奨されるライブラリリストに加えてもらえた

Add oauth2-mastodon to list of libraries by lrf141 · Pull Request #712 · tootsuite/documentation · GitHub

AWS

これはインフィニットループさんのインターンで使うことになった。
というのも、学生が主体になって開発するインターンだったのだがサーバサイドをやっている人間が自分しかいなくて
インフラは誰もいない状況で、構築からする必要があったためである。

流石に物理サーバを用意している時間も無かったので、AWSの無料枠を全力で使い倒していた。
初めてAWSをつかってインフラを構築したがめちゃおもしろかった。

f:id:RabbitFoot141:20181024231454p:plain

やったのはこんな感じに、
マストドンのストリーミングAPIを叩いてコメントを取得しVRコンテンツ内に降らせる処理を作り
VRゲームのスコアを扱うAPIサーバを作り
最後にそれらの色々を Webサービス化した。

APIサーバには Lumen を使って、基本的にインフラはAWS 以外は docker に全部乗っけた。

このあたりでいろんな技術に触れる楽しさに目覚めた。

NodeJS

これは最近やっていることなのだが、サーバサイドをいくらPHPでやったところで
リアルタイム性が求められるものはしんどすぎる、そうなるとサーバサイドで出来ない部分があることになってしまう。
それが嫌で NodeJS を始めた。

ただ作るものが思いつかなかったので、軽量でセキュアな画像プロキシサーバをnode v10.10.0に移行して無駄にhttp2対応させようとしている。

github.com

すごく便利なのに、メンテされていないのと
node → coffeescript と書きなおされている上に node v6対応なのが残念だったので
ちゃんと書きなおして色々と便利にしたい。

というわけで、昨日どうにかES2016版 camo と言われる donuts という画像プロキシを動くところまではもっていけた。
ただ3**リクエストの場合に location が消えるというバグを潰している最中。

github.com

深層学習

これは最近、本当に最近やり始めたばかりなんだけども深層学習をゼミでやっている。
ニューラルネットワークとは何かみたいなところからやっている。

つい最近、keras を使って iris の学習をやったところですごく理解が進んで楽しかった。
家にGPU積んだマシンとか無いので楽しめなさそうだけど、勉強する分には面白いとは思った。

ここまで

序盤、主に高校時代に独学していた部分は本当に広く浅くという感じだが大学以降の経験はうまいこと積めたと持っている。
色んなことに触れてきたけれど、どの経験も無駄というわけではなく問題にぶち当たったとき解決に必要なアプローチを増やしてくれるツールになっている。

技術的には主に PHP と NodeJS を使ってサーバサイドを中心にスキルアップをしている最中となっている。
ここまで分野がばらけた自分が年単位で取り組めているのできっとこれが自分の専門分野になっていくとおもっている。

これから

業務に携わって思ったが、OSSを使う上でバグや仕様で意外と困ることが多い。
そして同じような問題で困っている人もよく見るので、今後は積極的にOSS開発に携わっていきたい。


それと、自分がサーバサイドの分野にハマったようにきっとまだやっていない事でも自分が楽しめる分野が埋もれているはずなので
もっともっといろんな分野や技術に触れていきたい。

そして一番はそういった成長ができる環境に身を置きたい。


以上がけんつの戦歴とこれからの抱負でした