エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

クエリをオブジェクトにして ActiveRecord から分離する

仕事では Ruby on Rails を主戦場としているわけですが。 最近、クエリメソッドについて考えています。 Rails のクエリメソッドといえば「スコープ」を定義するのが常套手段です。 # app/models/user.rb class User < ApplicationRecord scope :created_at_b…

Reqのテストを書く覚書

HTTP クライアントとして Req をよく利用するのですが。 hex.pm こういった外部の環境と接続する操作はテストが面倒なもの。 その点において Req はテストのための仕組みをパッケージ自身が提供してくれています。 その仕組みの使い方と、ちょっとした工夫の…

Elixirの関数っぽい関数でない何かと、Prologの述語っぽい述語でない何か

Canada という小さな実装のライブラリがあります。 hex.pm Ruby でいうところの CanCanCan のような権限判定のためのライブラリなのですが、とても興味深い実装をしています。 例えば user が article を read できるか判定するとき、 can?(user, read(artic…

Elixirで国民の祝日サーバを作る

ただしサーバとは言っても 祝日一覧をダウンロードする エンコーディングを変換する CSV をパースする データを ETS に格納する データを検索する サーバを作る いつか読むはずっと読まない:全史ならぬ前史 ただしサーバとは言っても Web サーバ等ではなく…

Phoenixの遊び場でちょっとしたモニタリングツールを作る

遅ればせながら。 Phoenix Playground の存在に気づきました。 hex.pm 以前から。 状態の変化を LiveView を使ってブラウザ上で閲覧できるようにすることを考えているのですが、ごく簡単な情報を表示するために Phoenix app を構築するのが割に合わず、結局…

分岐をハードコーディングしない方法についての考察

条件による分岐をハードコーディングせずに実現する方法について考えてみました。 ただし、ここで試してみた方法はライブラリやフレームワークとして再利用するというよりも、再実装せずにふるまいを変えることができる電子回路のジャンパピンのような仕組み…

一緒にインストールされるパッケージによってふるまいを変える Elixir の Req パッケージの覚書

ネット上の CSV データを、Req パッケージを使ってダウンロードし、NimbleCSV でデコードしようとしていたのですが。 hex.pm hex.pm 二つのパッケージをインストールして、Req のレスポンスのボディを NimbleCSV でデコードしたら失敗し、ボディがテキストデ…

Elixirの演算子多重定義に関する覚書

Elixir には演算子を再定義できる機能が備わっています。 https://hexdocs.pm/elixir/operators.html#custom-and-overridden-operators defmodule Foo do def lhs + rhs do String.to_integer(Integer.to_string(lhs) <> Integer.to_string(rhs)) end end 普…

PureScript と Erlang、と Elixir、の覚書

PureScript というプログラミング言語があります。 Haskell のような構文で記述でき JavaScript を出力できる、ということを半年ほど前に知ったのですが。 www.purescript.org 最近になって、バックエンドを切り替えれば Erlang のソースコードを出力できる…

フォントデータを ETS で保存する

前回の続きです。 前回は BDF ファイルをパースして読み込む話をしました。 そして、BDF ファイルは単純なテキストファイルだし、Nerves アプリケーションへそのまま持っていっても大丈夫だろう、と高を括っていたのですが。 Raspberry Pi ZERO W の非力さを…

Glyph Bitmap Distribution Format (BDF) を Elixir で読み込む

Glyph Bitmap Distribution Format (BDF) というフォントフォーマットがあります。 en.wikipedia.org 記事の最後の方に書いたような理由があって、 BDF を読み込むパッケージを書いています。 道半ばなのですが、お試しで使えるくらいにはまとまったので、一…

40年のソフトウェア的愛情〜または私は如何にして心配するのを止めてプログラマであったか

以前、プログラミングを始めて 30 年が経ちましたという記事を書きました。 blog.emattsan.org それから 10 年が過ぎました。 気づくと 40 年。 職業プログラマに転向して 10 年。 今もプログラマを続けています。 好きでプログラミングを続けているとはいえ…

Phoenix LiveView の assign_async と async_result

Phoenix LiveView で値を socket に assign するとき、その値が例えば Web API などで取得しなければならないとき、一旦待ち状態を設定して、それから Task.async などを利用して、結果が得られたら取得できた値を設定し直すという非同期の処理を行うわけで…

ElixirでCompositeパタン風な構造を扱う時の覚書

en.wikipedia.org Compositeパタンは、再起的な構造を表現するときにしばしば顔を出すパタンで、node と leaf に同じイタンフェースを与えることで、それらを同一視して再起的に扱えるようにするしくみです。 Elixir は型付けが動的なので、特別な工夫をしな…

ElixirのGenServerでTaskを使うための補遺

前回、GenServer の渋滞を解消するために Task を利用する方法を紹介しました。 blog.emattsan.org これは Task のプロセスが異常終了しないことを前提にしていて、異常終了が予想されるばあいには、その対策を施しておく必要があります。 結論から言うと Ta…

ElixirのGenServer.callの渋滞を解消するための覚書

時間のかかる処理を複数実行したいとき、各々の処理にプロセスを起動して並行に実行することがあります。 しかし、同じ GenServer プロセスに対して GenServer.call/3 で呼び出してしまうと、GenServer.handle_call/3 で処理が順番待ちになってしまい並行し…

ElixirでPNGをつくる

ウェブアプリケーションを作っていると、表示する画像を動的に生成したいケースに遭遇します。 探してみると画像ファイルを生成するツールやライブラリは見つかるのですが、ウェブアプリケーションでは画像データを HTTP のレスポンスとして送信できればよい…

OTP標準装備のハンドラの利用手段がElixirのLoggerに標準装備されたので、その覚書

Elixir Logger に Erlang/OTP logger がやってきた およそ半年前、1 月にこのような記事を書きました。 blog.emattsan.org ログローテーションなどを装備したファイル出力を可能にするハンドラが OTP 21.0 で装備されていて、それを Elixir から利用しようと…

Elixirで書く極々シンプルなWebサーバの覚え書き

ちょっとした Web サーバが欲しくなったときに使えるコードの覚え書きです。 基本の形は Plug のドキュメントに書かれている通りです。 hexdocs.pm 任意の Content-Type のレスポンスを返せるように :mimerl を使って Content-Type を設定するようにしたのが…

Phoenix LiveView で無限スクロール

背景という名の釈明 アイテムを一覧表示する、まずは手動で lib/my_app_web/live/item_live.ex lib/my_app/item.ex lib/my_app_web/router.ex 実行 アイテムを一覧表示する、今度は自動で assets/js/app.js lib/my_app_web/live/item_live.ex 実行 実は弱点…

Phoenix 1.7 とともに LiveView Streams がやってきた

Elixir の Web フレームワークである Phoenix Framework に、待望の 1.7 がやってきました。 phoenixframework.org やはり今回のバージョンの最大のポイントは、Controller を用いた静的な View と LiveView のテンプレートが、コンポーネントという形で統合…

ElixirのログをOTP標準装備のハンドラでファイルに出力する覚え書き

数年前に、Elixir の Logger モジュールのカスタムバックエンドを書く、という記事を書きました。 blog.emattsan.org ごく最近になって。 Elixir Forum で Logger の設定の記事を読み、OTP が標準で用意しているハンドラを使えば、バックエンドを書かなくて…

LiveViewでTaskの結果はhandle_infoで受ければよいという話

LiveViewでTaskの結果はhandle_infoで受ければよいという話 ElixirWeekly の何号だったか失念してしまったのですが。 LiveView のプロセスで、非同期処理を Task.async/1 で実行したならば、Task.async/1 が終了時に送信するメッセージを受け取ればよい、と…

aws-sdkで取得できるタグを扱いやすくするための覚書

動機 AWS のリソースの多くは key-value の組みをタグとして設定できるようになっているのですが。 例えば EC2 インスタンスを取得する aws-sdk のメソッド Aws::EC2::Client#describe_instances のレスポンスは次のようになっています。 resp.reservations[…

Phoenix LiveView 0.18 の新しい構文の覚書とQRコード

Phoenix LiveView 0.18 の構文をいじっています。 具体的にはこれ。 hexdocs.pm :if and :for It is a syntax sugar for <%= if .. do %> and <%= for .. do %> that can be used in regular HTML, function components, and slots. For example in an HTML …

コンソールにQRコードを表示したい

Webアプリケーションを開発しているとき、携帯端末での表示を確認したくなるときがあります。 ブラウザのレスポンシブ・デザイン・モードを利用すれば、デスクトップでも見た目の確認はできますが、やはり手のひらの中でどのように表示されるかを知るには、…

Elixirのドキュメントでガードをグルーピングするときの覚書

ドキュメントを生成した時に、defguard で定義するガードをグルーピングするときの設定について、いつも忘れてしまい自分の以前のリポジトリを見返すことがたびたびなので、こちらの覚書として記録しておきます。 ガードと関数をモジュールに記述した場合、 …

Elixirでmutableなバイト列を扱う(Rustの力を借りて)

先日のブログに書いた通り、いつ以来かのセルラオートマトンに手を出しています。 そのときの記事の実装では、更新処理に Rust を利用してはいるものの、世代ごとにimmutableなバイト列を生成していました。 Erlang のアロケータを利用するので、確保したメ…

Rustlerでコンウェイの Game of Life を書く

かつてセルラオートマトンに魅了されていた時期がありまして。 熱を上げていた時期はそれほど長くはなかったのですが、その後も伴奏のように背景でずっと鳴り続けていました。 最近、セルラオートマトンの新しい本を手に入れて、再び熱が上がってきています…

自己の責任と能力を的確に把握し…

先日、仕事中で。よいプログラマであるために心に留めていることをプロジェクトのメンバに話す機会がありました。 よくあるためにと意識するものは多々ありますが、かつて伺ったこの話がいつもついて回っています。 自己の責任と能力を的確に認識し…個人とし…