Runner in the High

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

プログラミング

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

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

"初夏のJavaScript祭り2019" にElmのはなしで登壇した

6/1に開催されたJavaScript祭りというイベントに「jQueryからElmまで」というタイトルで15分枠の登壇をした This is my slides on #jsfes https://t.co/6p0mONwZrk— IzumiSy (@sy_izumi) June 1, 2019 内容はjQueryからJavaScriptを触り始めた自分が、Elmを…

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

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

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

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

プログラミング・インポテンツ

紛れもない事実として、学生の頃よりも明らかにプライベートの時間でプログラミングをするのが億劫になった。 後輩にこのことを話すと「それってインポみたいですよね」と言われたので、これをプログラミング・インポテンツと名づける。 いまの生活に関して …

Maybeに代えてカスタム型を使う

ElmのMaybeはデータの有無を型で表現できるゆえ非常に便利なものであるが、文脈が失われるため無闇に使い過ぎるとワケがわからなくなる。ケースによっては、カスタム型を使うことによって型でデータの有無を Maybe に代えて表現するほうがよりメンテナブルに…

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

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

依存関係について再び考える

izumisy-tech.hatenablog.com あとからこの過去記事を読み返して「ムム」と思うところがあったので改めて。 CategoryId ではなく Category を引数として渡すことでデータ構造が隠蔽されているという旨の説明をしているが、これは fetchArtclesByCategory を…

JavaScriptにおける配列操作の計算量オーダー

日本語だとググっても出てこなかったのでまとめた 操作 計算量 添字アクセス O(1) 挿入(splice) O(n) 削除(splice) O(n) 削除(delete) O(1) 最後に追加 O(1) 先頭に追加 O(n) スワップ O(1) 添字アクセスがO(1)だったりするのは、JavaScriptの配列は連結リス…

AnyValを継承する意味

ScalaでDDDなコードのアプリケーションを作ろうとしているときに UserId など値型はどうするべきか の記事を読み、「専用の値クラスを作る」のパターンでふと 「ここでケースクラスが AnyVal を継承する理由ってなんだ...?」 と思ったので調べた。 case cla…

Rubyにおけるポリモーフィズムとダック・タイピング

自分がOOPをそれっぽく学んだのは、サンディ・メッツの「オブジェクト指向設計実践ガイド」だが、この本だとダック・タイピングはバキバキにでてくる一方であまりポリモーフィズムについては詳しく書かれていない。thoughtbotのブログの記事、Rubyとポリモー…

D言語で作るTCPサーバの最小構成

コネクションプーリングとかワーカスレッドの多重化とかやってないめっちゃ簡易版。 import std.stdio; import std.socket; import core.thread; void main() { Socket server = new TcpSocket(); server.setOption(SocketOptionLevel.SOCKET, SocketOption.…

なんらかの処理において、できるだけその処理は依存するモデルのデータ構造をしりすぎないほうがよい?

たとえばSPAにおいて 「あるカテゴリに紐づく記事一覧を取得する」 という実装があるとする このような処理を実装するにあたっては、各レイヤによって知ってよいことと、知っててはいけないものが変わってくる。 例えばバックエンドが、RDBMSのようなIDによ…

入門ROM.rb 第3回: Repository

さーて、お待ちかねのROM.rb入門の第3回はRepositoryから。 前回の記事はRelationを説明していますので、読んでない人は参考までに。 izumisy-tech.hatenablog.com Repository リポジトリと聞くと文脈的にPoEAAやDDDっぽい雰囲気を感じる人が多いのではない…

入門ROM.rb 第2回: Relation

さて、入門ROM.rbの第2回は、まずRelationから。 ROM.rbとはなんぞやという方は第1回の下の記事からどうぞ。 izumisy-tech.hatenablog.com 入門なのでいきなりSinatraやRailsとどう使うか、ではなくワンソースでどういうAPIがあって、どう使うのか、というと…

D言語でforkを使う

core.sys.posix.unistdの中にある。使い方はforkそのまま。 import std.stdio; import core.thread; import core.stdc.stdlib; import core.sys.posix.unistd; void main() { auto pid = core.sys.posix.unistd.fork(); if (pid == 0) { writeln("child work…

D言語でstd.signalsを使ったオブザーバー実装

std.signalsというモジュールを使うとオブザーバー・パターンの実装が簡単にできる。 この例ではひとつのオブザーバーしか登録していないが、複数のオブザーバーを登録した上で一気にシグナルを発行できる。 dlang.org import std.signals; import std.stdio…

D言語でCtrl-Cのシグナルハンドラを登録する

whileループからCtrl-Cで抜ける処理を横取りしたいときに。 import std.stdio; import core.thread; import core.stdc.stdlib; import core.sys.posix.signal; extern (C) { void cleanup(int signal) { writeln("cleanup"); exit(1); } } void main() { sig…

SAMパターンの大雑把な理解

SAMパターンというのを勉強している。 www.infoq.com この記事は少しだけはてブでバズったが、実際コレを読んだだけでは例えば実際に実装に落としたときにどういうデータ・フローになるのか、というところまでは若干理解しづらい。この記事の作者のDubrayはs…

Yeomanに代わるNode.jsのスキャフォルディングツール4選

ハッカソンや個人開発でよく使う自分でこしらえたアプリケーションのスケルトン・コードをGithubに置いて、それを気軽にスキャフォルディングしたい。こんな欲求はだれしもあると思う。スキャフォルディング・ツールの王道といえばYeomanだが、ちょっとYeoma…

Reactの優位性は関数っぽいアプローチができるところなのではないかと思う

何が言いたいのかというと、Vue.js, React, Angularなどここ最近のフロントエンド界隈を賑わせているフレームワークはたくさんあるけれども、その中でビューレイヤという責務に対して最も薄いアプローチをしているのがReactで、もっとも関数らしい副作用のな…

入門ROM.rb 第1回: イントロダクション

RubyといえばRails、RailsといえばActiveRecordというくらいに、事実上ActiveRecordはRuby界隈におけるORマッパのデファクトスタンダードだ。しかしながら、Piotr Solnicaというソフトウェア・エンジニアは、ActiveRecordパターンが常にスケーラブルなアプリ…

validatable-recordについて

www.npmjs.com validatable-recordというモジュールをすこし前に作った。Twitterでは軽く流したが、実際にはこれを作ろうと思ったモチベーションが少なからずあったので、自分自身の学びやのちのちの振り返りのためにも、そのモチベーションについてここに書…

フレームワーク・ライブラリを選ぶということ

「とりあえず、ググったら大抵解決しそうなんでReduxを使おうと思います」 2016年の夏、僕はあるフリマアプリで有名なECスタートアップでインターン生として、商品を販売するユーザー向けのアプリケーションのプロトタイピングをしていた。ほとんどすべての…

モデルの中でセッションを使う

ときたまセッションに関連するロジックをモデルの中に作りたいときがある。ところが、原則的にRailsではセッションをモデルの中で操作することができない。 この問題を解決する最も簡単な方法は、モデルに生やしたメソッドへセッションのインスタンスを渡す…

コントローラを名前空間で分離して責務の分割をする

Deviseなどを使って、ひとつ以上のスコープを持つアプリケーションを開発している際に、RESTfulなコントローラとビューが1対1対応をしていると、コントローラがどうしても複数のスコープが絡みついた見通しの悪いコードになりがちである。 たとえば、ECカー…

Chrome Extensionのbackground pageでconstを使うのに気をつけよ

Chrome Extensionではbackgroundを使っている方々各位にお伝えしたいのがなんといつのまにやらconstで定義した変数がextension.getBackgroundPageメソッドから取れなくなっているということ background.js ...const NOTIFY_ID = "default";const ITEMS_ID = …

loadstop イベントより細かい request.onCompleted を使う

Chrome API の WebView にはページのロードが終了した時に発生する loadstop というイベントが存在する。これを用いたサンプルが公式のドキュメントにあるのだが、ここにひとつ注意したい点がある。 onload = function() { var webview = document.getElemen…

Webview 内のデータを取得するメモ

webview を用いて表示させたページのソースやらなにやらのようなデータを取得する手段がドキュメントのどこにも書かれていないので困ったが、いろいろ調べたら見つかった。 var view = document.getElementById("web-view-test");view.executeScript({ code:…

Chrome Dev EditorではGitで512kb以上のコミットをプッシュできない

Error whilst pushing changes #3456 - Chrome Dev EditorGit push fails for huge changes. #2553 - Chrome Dev Editor詳しくは上の2つのチケットを参照のこと。Chrome Dev Editor(CDE)ではjs-gitというGitをJavaScriptで実装したものを利用してコミット…