鈴木颯介のブログ

技術的なメモとかポエムとか。

もう遅い気がするものの夏休みの目標を立ててみる

夏休みが始まって、はやいものでもう 2 週間くらいが経とうとしている気がします。大学生の夏休みはそれなりに長いので今からでも遅くないと信じて目標をいくつか立ててみて、夏休み終了時に達成できたのかを確認してみるこころみです。

目標 1: Prettier へのコントリビューション数合計 20

最近趣味でPrettierに貢献しています。今コントリビューション数が 13 で、いまだしてるやつがマージされたら 14 になりますが、夏休み中にあと 6 個出して、20 に届きたい!

目標 2: 「達人プログラマー」を読む

以前、前職でお世話になった方に欲しい物リストから「達人プログラマー」という本を送っていただきました。ちょっと読んでみたところ大変おもしろくためになりそうな内容だったので、夏休みに全部読みたい!

目標 3: Rust をちょこっと書けるようになる

これだけあやふやですね。プログラミング言語の習得というのがそもそも曖昧なんで仕方ない感はありますが、定量的に言えるものとしてはオライリーの「プログラミング Rust」を適当に読んでなにか1つちっこいソフトウェアを作ってみたい!


そんな感じです。できなかったらどうとかいうことはないんですが、できたらいいですね。

2019 年が半分終わるし Ubie でインターンを始めて半年経つし筑波大学に入って 3 ヶ月くらい経つ

2019 年が半分終わる

はやくないですか?小中学生の頃はもっと時が経つのが遅かったような気がするのですが、最近は気がついたら半年くらい一気に過ぎているような気がします。そのまま成人になっていそうな気がして恐ろしいです。

2018 年が終わるときに書いたブログで、「来年も精進していきたい」みたいな目標なんだかよくわからないようなことを書きました。もうその「来年」も半分が終わるので、そろそろ少しは「精進」していないといけないと思うのですが、実際どうなのでしょうか。一つあるとすれば、意識的に OSS へのコントリビューションを増やすようにしていますが、それでいろいろやらかしたりもしたので 1 歩進んで 2 歩下がってしまったような気もしています。

失った 2 歩を貢献で取り戻せるようにあと 2019 年後半も頑張るので、鈴木先生の次回作にご期待ください。

それと、技術ブログを https://sosukesuzuki-blog.netlify.com で書き始めました。Qiita に書くようなことでもないくらいの内容ですが、興味のある方は読んでみてください。

インターン始めて半年経つ

Ubieインターンを初めて約半年が経ちました。Ubie は少なくとも自分にとっては働きやすい会社です。プロダクトに関すること以外で悩むことはあまりなく、楽しくやっています。悩みがあったとしても大体すぐ解決してもらえます。テレビ会議の音が聞こえにくいと相談したら次の会議のときはマイクが設置されていました。

そういえばつくばで見つけた Kotlin コントリビューターの彼は Ubie に連れて行ったらすぐインターン採用が決まり、一緒に働いています。会社に彼を連れて行ったとき、同じく Kotlin コントリビューターの社員さんと遭遇して、「Kotlin コントリビューションあるある」を聞くという大変貴重な体験ができました。すげえとこにきてしまったなと思いました。

放課後に彼の家にいって課題そっちのけで仕事しつつ出前館でカレーを頼んで日が変わった頃に帰るのはなかなか楽しいですが、放棄された課題の行方が気になるところではあります。それと、行くたびにゴミを放置して帰るのを彼から注意されており、反省はしているもののネクストアクションとしては謝罪しかしていないので、そろそろ出禁を食らうかもしれません。出禁にしないでほしい。

大学入って 3 ヶ月くらい経つ

もう少しで大学生になって 3 ヶ月が経ちます。僕は約一ヶ月間洗濯ものを干していませんが、皆さんはどうですか?どうやら僕は洗濯ものを干すのがとても苦手だったみたいで、服がなくなるたびに実家までとりにいったり、買ったりしています。最初の 2 ヶ月間くらいは謎のエネルギーによって洗濯ものを干せていましたが、最近はそのエネルギーが供給されなくなり、大変です。

そして、頭文字 G が現れてから、家でご飯を作ることがなくなりました。朝食兼昼食はすき家ですませ、学校が終わったあとはすき家で夕食を食べて帰るという生活をほぼ毎日送っています。はやくこの生活から抜け出したいですが、すき家は美味しいです。

しかも、最近は欠席が目立ち、課題の未提出もぽつぽつと現れはじめ、実際にすでに成績が出ている科目では落単ギリギリの C 評価をいただいたりと、ダメ大学生の道を順調に進んでいます。

おわりに

まとめると、開発者としてはいままでの活動に加えて OSS コントリビューションが増え、大学生としては順調にダメになっております。プラマイゼロどころかマイナスな気がしますが、とりあえず体と心は健康でやっています。

お水をもらうと励みになるので気が向いた方はよろしくおねがいします。( https://www.amazon.co.jp/hz/wishlist/ls/2VMKXAI8J8278 )

大学に入学して2週間くらい経って、良かったことと困ったこと。

4月から筑波大学情報学群情報科学類の学生になりました。

良かったこと

変な人に会った

同い年のKotlinコントリビューターのウェブエンジニアに会いました。彼と話すと技術的な話で盛り上がります。彼は僕と同じくウェブエンジニアですが、フロントエンドは僕の方が得意で、バックエンドは彼の方が得意なようです。でも彼は僕と違って人と話すのが苦手ではないそうで、どんどん知り合いを増やしています。悲しくなるのでやめてほしいです。

同い年の型大好き好きマンに会いました。彼はもともとゲームを作りたくてプログラミングを始めたそうですが、手を動かしていたら間違えて単純型付ラムダ計算を実装してしまったそうです。よくわかりませんね。ちなみに、Advanced Topics in Types and Programming Languagesが恋人だそうで、彼の家に遊びに行ったら枕元においてありました。

学問に若干触れるのは楽しい

大きな部屋で行われる形の講義でやたらと機械学習とかの話をされますが、機械学習の応用とか如何に利益を出すかとかではなく、数学的な話がほとんどです。内容は理解できないことも多いですが、数学モチベは上がりますし、なにより単純に楽しいです。

パン屋さんが安くて美味しい

学校内にあるパン屋さんが安い上に美味しいです。

困ったこと

決まった時間に動くのは難しい

僕は1年くらい前に津田沼高校という全日制の高校を辞めてから、時間を気にせずに生きていました。前職も現職も働く時間がかなり自由だったし、学校もなかったので、好きな時に起きて好きな時に働いて好きなと時に寝ていました。そんな人がいきなり普通の大学生っぽい生活リズムに合わせて生活をしたら肉体的も精神的にもそれなりにストレスを感じるというのは想像に難くありません。

うわっ私の学力、低すぎ・・・?

僕はAC入試という他大学で言うところのAO入試みたいなもので入ったのですが、当然周りはみんな普通に受験して入ってきています。学類内で一番多いのは当然一般受験を乗り越えて入ってきた人達です。そんな人達と同じ土俵で数学をやるのは結構無理があります。僕は色々あって数学Bと数学Ⅲを履修していないんですが、例えば線形代数の授業では平面ベクトルと空間ベクトルは使えることが前提となって話が進みます。なんとなく独学でやっていたので、致命的に困るレベルかと言われればそんなことはないんですが、普通に考えて直近1年ずっとプロダクト開発のためのプログラミングをしていた人とずっと受験のための勉強をしていた人には大きな差があります。AC入試、良い仕組みだとは思いますが、学力がとっても低い人が入れてしまうので少しは学力でふるいをかけたほうがむしろ受験者に優しいような気がします。

ちゃんと時間をかけてやっていくしかなさそうです。

部屋から腐卵臭がするらしい

僕の部屋からは腐卵臭がするらしいです。なんで? しかもこういうのって自分では気づけないんですよね。来客が指摘してくれるまで腐卵臭に気づきませんでした。とりあえず台所周りをちゃんと管理するのと掃除をしてゴミを出すというのを徹底する必要がありそうです。

一人暮らしをはじめました。辛いです。

4月から筑波大学に進学するため、つくば市で一人暮らしをはじめました。辛いので辛さをまとめておきます。

暗い。

つくば駅付近はショッピングセンター的なものがあって実家付近と雰囲気があまり変わらないものの、自分が住んでいる区域が街灯が少なく夜間暗すぎます。日中に起きれないので夕方起きて深夜に活動していたんですが、知らない暗い街を深夜歩くのは普通に怖いです。それに4月とは思えないくらい寒いし。本当にやめてほしい。

家事ができない。

これは私のせいなんですが、家事ができません。洗濯のやり方とか知らないしゴミの捨て方も知らないし料理なんてもちろんできません。スクランブルエッグの作り方と電子レンジの使い方は教わったのでサトウのごはんを使うことでスクランブルエッグ丼を作ることができます。

寒い。

部屋が寒い上に蛇口からはお湯が出ないので皿を洗うのがつらすぎる。しかも流しの下に最初からゴキブリの死骸があるし全然意味がわからないのでゴキブリホイホイをたくさん置きました。

大切なものは失ってから気づく。

実家に何気なくあったもの、なくなってからその大切さに気づきます。よさげな位置にあるティッシュとかゴミ箱とかタオルとか、、、。両親を尊敬します。

飯は待っててもでてこない。

寝ているだけではご飯はでてきません。作るか買うかしないといけません。でも作れないのでコンビニまで買わないといけなくてすっごくめんどくさい。飯を食わなくなりそうです。

洗濯物かごに洗濯物を入れるだけでは洗濯されることはない。

洗濯物かごに洗濯物を入れてもそれだけでは洗濯されることはありません。ただでさえ洗濯機を使うのが難しいのに終わったあとに干さないといけない。母親は毎日それをやっていたと考えると本当に敬意を払うべきですね。

朝起きれない。

今はまだ学校が始まっていないので大した問題じゃないんですが、フレックスでコアタイムがないのをいいことに仕事を夕方から始めるのがスタンダードと化してる身としては、誰かが起こしてくれない環境で朝起きれる自信が本当になくて、つらいです。

まとめ

今までどれだけ甘やかされて育ってきたかわかりますね。母親曰く「不器用すぎて教えるより私がやったほうがはやかったから教えなかった」らしいですが、この機会に克服したいとは思っています。 ほしいものリストを載せておくので惨めに思った人はなにか恵んでやってください。 https://www.amazon.jp/hz/wishlist/ls/2VMKXAI8J8278?ref_=wl_share

2018年が終わるから今年を振り返ろう

2018年ももうすぐ終わりなので、今年1年を振り返ってみます。

1月〜3月-当時のバイト先の環境が大きく変わりました

当時のバイト先のBoostIOでの環境が大きく変わりました。会社としてのフェーズが変わり、人が変わり、オフィスが変わり、技術も変わり。それまではもっぱらフロントエンドをやっていたのですが、今年に入ってからはバックエンド開発の業務に関わることが圧倒的に増えました。

そしてこの頃から転校を考え始めました。

5月-N高等学校に転校しました

前にブログで書きましたが、N高等学校に転校して、生活環境が大きく変わりました。家にいることが多くなって体を動かす機会が減ってしまい、かなり太りました。

tako-programing.hatenablog.com

10月-大学受験に合格しました

こちらも以前ブログに少し書きましたが、筑波大学情報学群情報科学類にAC入試で合格しました。別に人にアドバイスできる立場ではないんですが、もし書類に書いた内容とか面接についてとか聞きたい方がいたらTwitterのDMとかFacebookメッセンジャーとかで連絡くれれば可能な範囲で公開はします。

12月-バイトが変わりました

約2年間お世話になったBoostIOを辞め、インターンという形でUbieというAI医療のスタートアップで働き始めました。

BoostIOを辞めた理由はUbieに誘われておもしろそうだったからというのが主な理由で、ドロドロした話は特にありません。「転職を考えています」という話をしたときも(当たり前かもですが)特に何もなく認めてくれました。最終日になぜかみんなでカラオケに行ってCTOにコブクロの蕾を歌われたり、サプライズでケーキが出てきたりしました。初めてエンジニアとして働いた会社で良い人たちと巡り会えたのは幸せなことですね。BoostIOでの仕事についてはそれについて1つ記事を書いてもおもしろいかもしれません。

Ubieに入った理由は、上にも書きましたが一言で言えば、「誘われておもしろそうだったから」です。以前から交流があったUbie社員のエンジニアの方に、Ubieオフィスで行われているイベントに誘っていただいて(そしてケーキをいただいて)、そこで話を聞いてインターンとして働くことを決めました。

Ubieで働き始めて2週間程度なのですが、すでに周囲の人々の能力の高さに圧倒されています。自分も価値を出していけるよう頑張ってまいります。

まとめ

結構適当に生きていたんですが、こうして振り返ってみると実はいろいろあった激動の1年になっていました。来年の4月からは大学生になったりとまたいろいろありそうなので、これからも精進していきたいですね。

Frozenをちょっとアップデートした

趣味で作っているMarkdownエディタ、Frozenをちょっとアップデートしたので忘備録。

GitHub: https://github.com/sosukesuzuki/frozen

Netlify: https://frozen-editor.netlify.com/

MobXからReduxに移行した

もともとMobXを使って状態の管理を行っていたけど、辛くなってきたのでReduxに移行した。MobXは書き心地は良かったけど、何も考えずに書くとあとで管理が大変になる。というか実際そうなってしまった。だからReduxに移行してみた。Reduxならアーキテクチャがコーディングの自由度をある程度まで下げてくれるから、後々になって見直しても問題なさそうな気がする。非同期処理はredux-saga。

1つ問題として、InversifyJSの使い方どうしようみたいのがあった。IndexedDBとLocalstorageを使う部分をInversifyJSでサービスとして実装してそれをMobXのストアのクラスに注入していたから、Reduxでそこをどう解決しようというのは少し考える必要があった。結論としては、InversifyJSの公式に載ってる関数に依存性を注入する方法を使って、reudx-sagaのジェネレータ関数に対して注入することにした。

普通のtextareaをやめてCodeMirrorにした

実際に自分で使ってて、普通のtextarea使いにくすぎるなぁと感じたのでCodeMirrorに移行してみた。

CodeMirrorをReactで使うときはちょっとした工夫が必要だったりする。今まではクラスコンポーネントのライフサイクルメソッドでそれをやっていたけど、今回はHooksを使うことにした。Hooksについては前から他の用途で使っていたから、それなりにすんなり使うことができた気がする。使うたびに思うけど、今後のReactは本当にクラスコンポーネントを使う必要がなくなるなぁ、、、

Workspace機能を実装した

バイト中につかっていて、プライベートのメモと混ざりそうで面倒だったからワークスペースごとにメモを作成できるような機能を実装してみた。左側にSideNavigationを表示して、そこでワークスペースを切り替える。ワークスペースの追加や名前の編集、削除などはモーダルから行うことができる。

InversifyJSでMobXのStoreに注入します

Frozenエディタを開発するにあたって、localStorageとIndexedDBを扱う関数をMobXのStoreから叩いていたけど、テストが書きにくい。最近バイトでInversifyJSを使ってサーバーサイドの開発をやっているので、ここでも使ってみたい。

ServiceとそのMock、Interfaceを定義する

今回はとりあえずLocalStorageServiceを作りたい。その人がFrozenにアクセスしたのが初めてかどうかという情報をIS_FIRST_ACCESSというキーを使ってlocalStorageで管理ているので、そんな感じで書く。

// LocalStorageService.ts

import { injectable } from "inversify";

const IS_FIRST_ACCESS = "IS_FIRST_ACCESS";

export interface LocalStorageServiceInterface {
  setIsFirstAccess: () => void;
  getIsFirstAccess: () => string | null;
}

@injectable()
export class LocalStorageService implements LocalStorageServiceInterface {
  setIsFirstAccess(): void {
    localStorage.setItem(IS_FIRST_ACCESS, "false");
  }

  getIsFirstAccess(): string | null {
    return localStorage.getItem(IS_FIRST_ACCESS);
  }
}

function doNothing(): any {}

@injectable()
export class MockLocalStorageService implements LocalStorageServiceInterface {
  setIsFirstAccess = doNothing;
  getIsFirstAccess = doNothing;
}
// TYPES.ts
export default {
  LocalStorageService: Symbol.for("LocalStorageService")
};

ここは普通にInversifyJSを使うのと何も変わらない。本当はMockもちゃんと作ってあげるべきなのだけどここではとりあえずdoNothingで、、、。

Containerを作る

ここでinversify-inject-decoratorsという別のライブラリを使う。このライブラリを使うことで本来コンストラクタインジェクションができないような、別のライブラリ(ReactやMobXなの)が作るクラスのインスタンスに対してもコンストラクタインジェクションができるようになるらしい。

// container.ts

import "reflect-metadata";
import { Container } from "inversify";
import getDecorators from "inversify-inject-decorators";
import {
  LocalStorageServiceInterface,
  LocalStorageService,
  MockLocalStorageService
} from "./services/LocalStorageService";
import Types from "./services/Types";

const env = process.env.NODE_ENV;

const container = new Container();
export const { lazyInject } = getDecorators(container);
if (env != "development" && env != "production") {
  container
    .bind<LocalStorageServiceInterface>(Types.LocalStorageService)
    .to(MockLocalStorageService);
} else {
  container
    .bind<LocalStorageServiceInterface>(Types.LocalStorageService)
    .to(LocalStorageService);
}

こんな感じで環境に合わせてバインドするサービスを変えて、getDecoratorscontainerを食わせた結果のlazyInjectというやつをexportしてやる。

Storeで使う

InversifyJSの通常のinjectと同様にデコレータとして使って注入する。終わり。

// HogeStore.ts

import { lazyInject } from "../container"

export class HogeStore {
  @observable public hoge: Hoge = "hoge";
  @lazyInject(Types.LocalStorageService)
  private localStorageService!: LocalStorageServiceInterface;

  /* いろいろなメソッドら */
}

感想

inversify-inject-decoratorの挙動が全然わかっていないので雰囲気で使っていてよくないので、何をしてくれるライブラリなのかをしっかり把握しておきたい、、、。あとこの記事にあるコードはFrozenのソースから抜いてきて補完のない場所で改変して載せてるので、ミスっている場合があります。気づいたら教えてください:pray: