Runner in the High

技術のことをかくこころみ

メモ

Elmにおける依存性逆転(DIP)の表現

この記事を読んでなるほどな〜と思ったので記事にしてみる。 medium.com 依存性逆転とは 雑にいうと実装ではなくインターフェイスに依存させ、モジュール間の依存関係を疎結合にする手法。英語ではDependency-Inversion Principleと呼ばれ、頭文字をとってDI…

とにかくいろんな会社でインターンしていた学生時代

テック系の学生というと、やはりいろんな会社のインターンに参加していろんなイケてるナウい技術を触って「圧倒的成長!」を求めますよね。 自分もそうでした。 自分はかなり極端な例で、大学を1年休学してまでインターンしてコロコロと会社変えながら10社く…

ElmでPhantom TypeとExtensible Recordを用いて型安全な状態遷移パターンを実装する

このDiscourseスレッドがかなり面白かった。 OPは「幽霊型(Phantom Type)を使うと特定の順序でしか型安全に状態遷移できないように実装できると思うんだけど、どうしたらいいかな?」と質問している。 discourse.elm-lang.org 実装してみる 回答者からのア…

Elmで再帰構造を使って特定の順序でなければ状態を更新できない型を作る

a, b, c, dという型がある状況でaがなければbが更新できないし、bがなければcが更新できない、のような流れを再帰構造の型で表現する実装。使いどころは謎だが思いついたのでメモしておく。 type Data a b c d = Data (Maybe (a, Maybe (b, Maybe (c, Maybe …

クリーンアーキテクチャのUsecaseはなぜControllerへ値を返すのではなくOutput PortとしてPresenterを呼び出すのか

何を言っているのかと言うと、みんな大好きクリーンアーキテクチャの右下に図示されているFlow of Controlのこと。 黒線が引かれているということは、つまりUsecaseの中でOutput Portのインターフェイスを持つPresenterの関数なりが最終的に実行されるという…

gcloudコマンドの対象プロジェクトIDを関東最速で取得する

iTerm2にはステータスバーという機能があり、そこで現在のgcloudのCLIで操作対象になっているプロジェクトIDを出すと非常に捗る。 単純に考えるとgcloudコマンドのconfigオプションを使い、プロジェクトIDの取得ができるだろうなと思うが gcloud config list…

Datastoreでは将来の変更を見越してフラグ系もStringで格納するのがいいんじゃないか

たとえば以下みたいなデータ構造がDatastoreにあるとする type UserSetting struct { UseNotification Bool `datastore:"useNotification"` } これはユーザーの設定として「通知をするか/しないか」を表現しているものだが、もしも仕様変更でTrue/False以外…

Architecture Night #2 がかなり良かった

architecture-night.connpass.com 千葉に引っ越してから、渋谷あたりで開催されるイベントにあんまり行かなくなっていたが、Twitterで設計メインのArchitecture Nightというものがあると知って会社の先輩と参加した。アーキテクチャと銘打っているくらいだか…

ユーザーインターフェイスにおける5つのステート

元ネタはこれ scotthurff.com Webアプリケーションを作ったことがある人ならわかる話だが、アプリケーションは確実に予想外の状況に晒される。サーバーはレスポンスを返すのに時間がかかるし、ユーザーの環境がメモリ1G以下のこともあれば、完全に想定外の使…

不動産投資を知るために何冊か本を読んだ

今年の頭くらいに書いた今年の抱負に関する記事の中で「不動産投資に関する本を読む」とあるが、ちゃんと有言実行ということでとりあえずいろんな本を読んでみたので、その感想を記事にしておく。 izumisy-tech.hatenablog.com 胡散臭い投資代表「不動産」 …

自分なりの作業工数見積もりのヒント

ソフトウェア開発最大の難所と呼ばれる見積もり。見積もりに関する古典があるくらいにはやはり見積もりというのは難しい。 自分もずっと見積もりを正しくするためにはどうすることがベストなのか、ということにずっと悩みを抱えていたが、社会人2年目ももう…

2019年10月のクラウドバンク

去年末からクラウドバンクをやっている。なんだかんだもう1年近く継続してやっているが、正直かなりいいのでいろんな人に勧めている。勧めている手前、自分の実績というのもある程度公開しておくのが筋かなと思うのでブログの記事にしておく。 izumisy-tech…

GoのAccept Interfaceはなにが嬉しいのか

たまーに考えることがあったが、せっかくなのでアウトプットしておく。 まず前提としてGo以外のインターフェイスを持つ言語、例えばJavaではインターフェイスを満たしていることを明示するためにimplementsキーワードなどで実装を明示してやる必要がある。つ…

FirestoreのCollection Groupに関して(ユースケースや注意点)

個人開発でFirestoreを使っているので情報を集めている。なんか日本語だとググっても要領を得ない記事ばっかりだったが、英語でちゃんと調べたらFirebase Blogでしっかり書いてあった firebase.googleblog.com FirestoreなどのNoSQLデータベースは前提として…

Amazonで買える海外のプロテインバー3選

プロテインバーと呼ばれるものがある。 簡単に言うと一本満足バーやスニッカーズ的なあのおかしのバーにプロテイン(タンパク質)が多めに含まれているバーのことだ。日本国内ではまだこの手の製品はさほどメジャーではないようだが、海外(とくにアメリカ)…

OSカーネルのCコードにでてくるkmainとはなんなのか

ozkl/sosoという小さなオペレーティング・システムの実装を読んでいたのだが、そこで出てくるmain.cのエントリポイントがmain関数ではなくkmain関数であることに気がついた。昔々にCを書いていたときは問答無用でmain関数とした記憶があるので、一体コレはな…

Firebase Cloud FunctionsではSparkプランだと外部ネットワークにGETリクエストすら飛ばせない。

もしかしてGETリクエストなら...と思ったけど普通に無理だった。 Cloud Functionsのログ画面 Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictio…

個人的なアプリケーション設計のバイブル3選

自分が本格的に設計を意識するようになったのは、2015年の夏に現職であるFringe81株式会社で開催されていたサマーインターンに参加してからだ。 インターンではDDDとクリーン・アーキテクチャ*1を一から勉強してAPIサーバーに実装する、というカリキュラムで…

大きなリリースをするべきではない4つの理由

自戒を込めてメモ 大きなリリースはバグを増やす 大きなリリースになればなるほど、コードベースに潜むバグが増える。充分なテストがないチームでは、コードレビューにテスト相当のタスクが求められるようになり、本質的な設計の優先度は低くなる。結果とし…

ソーラーパフミニが被災したときに便利だった

先日9/9に、千葉県広域で大規模な停電があり、自分の家も約一日にわたって電気が使えない状況になった。我が家は自分とおじいちゃん&おばあちゃんで生活しているが、真夏30度のなか暗闇とともに生活をするのはなかなかにしんどいものがある。 そのときにと…

Scalaでモナドとかに入門できそうな記事いろいろ

会社でScalaを使っているので、できれば自分もモナモナしていきたいという気持ちがある。最近見つけた参考になりそうな記事を集めてみる。いつか自分でも手を動かして触って見る予定。 Freeモナド medium.com softwaremill.com dzone.com 1ファイルでつくるF…

GolangでUnmarshallerインターフェースを実装した構造体をフィールドの型として使うと便利

例えばこんな構造体が定義されているとして type User struct { Name string `json:"name"` Status int `json:"status"` } この構造体をJSONからUnmarshalしてマッピングする際に、以下のような要件があるとする statusの取りうる範囲は1,2だけ、かつそれぞ…

ElmのSlackチャンネルが情報収集をするのに便利

世界中のElmエンジニアが集まるSlackワークスペースがあり、情報収集をするには非常によい。 あまり日本のElm界隈では知られてないのかな? と思ったのでメモ程度に周知しておく。以下のページからSlackのワークスペースに入れる。基本的に全部の会話が英語…

dayjsと謎の挙動

年と月だけの文字列をDateへ変換すると2月だけおかしくなる console.log(dayjs('201901', 'YYYYMM').toDate()); // Tue Jan 29 2019 00:00:00 GMT+0900 (日本標準時) console.log(dayjs('201902', 'YYYYMM').toDate()); // Fri Mar 01 2019 00:00:00 GMT+090…

新しいフレームワークを学ぶならTodoMVCではなくRealWorldを参考にしよう

よく新しいフレームワークを学ぶにはTodoアプリを作ってみるのがよい、と言われる。実際、Todoアプリを様々なフレームワークで作ってみたサンプルをまとめたサイトもあったりする。 ところが、実際に業務で作るようなアプリケーションはTodoアプリの範疇を超…

2019年現時点でのElmベストプラクティス6選

先日業務で1からElmアプリケーションを作りきったのでそのときの学びをメモっておく。 1. Model / Msg / View のような分割をしない Rails などのフレームワークからきた人がやりがち。 Elm でファイル分割をするのはモジュール単位でのカプセル化をするとき…

「完璧につくらない」という能力

自分の欠点として、まず「完璧につくろうとしてしまう」というものがあることが分かってきた。 www.wantedly.com 2度現地で参加したリモートハッカソンでは、SAPに勤める若いエンジニア、バークレーで勉強をしている学生とそれぞれペアを組んで開発をしたが…

2018年で最も早くTypeScript+Reactのアプリを作る方法

結論から言うとこれです。 $ npx create-react-app myapp --typescript #React Create App now officially supports #TypeScript!I'm so happy this will make it much easier for devs to start with, well, both of these great pieces of tech! pic.twit…

gpd-pocket-ubuntu-respinの更新を適用したらファンが止まらなくなった

本日久しぶりにGPD Pocketのコミュニティパッチを更新して適用したところ、まだ44℃だというのにCPUファンが思いっきり回転しはじめた おそらくこれはファン周りのデーモンかなにかがうまく動いてないな...ということでおもむろにログを確認 $ journalctl -u …

Golangではinterfaceはどのパッケージに属するのか

Golangを使い始めてinterfaceでDIPっぽいことをしようとするとたしかに湧きがちな疑問のひとつ。結論から言うと、interfaceはそれを使う側のパッケージに所属させるのがセオリーらしい。なるほど。 Go interfaces generally belong in the package that uses…