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

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

Elixir

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

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

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

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

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 が終了時に送信するメッセージを受け取ればよい、と…

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 を書く

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

ETS (Erlang Term Storage)を利用する(今後は、たぶん)

ETS とは Ex2ms ETS を Ex2ms で使う いつか読むはずっと読まない:先入観 ETS とは Erlang/OTP には ETS というストレージライブラリが標準で用意されています。 当然 Elixir でも利用できます。 www.erlang.org elixirschool.com ただ、ETS の問い合わせに…

ExUnit で change matcher を使いたい、ので、書いてみた

change matcher とは 普段、しごとでは Ruby on Rails を使い、テストには RSpec を利用しています。 RSpec は matcher が充実していて、単純な一致や不一致だけでなく、いろいろなパタンの検証をすることができ重宝しています。 Elixir に標準装備の ExUnit…

日ごとの更新件数をEctoで集計したいとき

日ごとの更新件数をEctoで集計したいとき データベースへは時刻(日時)で記録しておき、利用するときに日付単位で集計したいときがあります。 例えば更新の頻度を日付単位で集計したいばあい、次のような SQL になると思います。 select date(updated_at) a…

Phoenix 1.6 と HEEx

先の日曜日、2021-09-26 に Phoenix 1.6 がリリースされました! www.phoenixframework.org …が、なぜかブログ記事の日付は August 26th, 2021 。 今回も目玉はいくつかあるのですが、その中でも気になる存在が HEEx 。 新しく追加されたシジル ~H を使って…

PDF.js を使って PDF をブラウザに表示するための覚書

仕事で PDF をブラウザのページ中に埋め込んで表示したいことがあり、そのときに PDF.js を利用しました。 のちのち再び使いたくなったときのために、骨格を抜き出してまとめたものです。 サーバには Elixir の Phoenix framework を使っていますが、ほぼ静…

Raspberry Pi 用タッチスクリーンを Elixir で利用する

以前購入した Raspberry Pi 用のタッチスクリーンを Elixir から利用する方法をまとめましたので、ご報告がてらの記事です。 Quimat 3.5インチタッチスクリーン Raspberry Pi ディスプレイ TFT LCD モニタ HDMI GPIO端子 保護ケースキット Raspberry Pi 3 2 …

ビットとバイトとストリングと in Elixir

Elixir でビット操作を行うコードを書いたんですが、使うべき関数やガードで混乱しそうになったので、明日の自分のためにまとめてみました。 ガード パタンマッチング 長さとサイズ 型 やりたかったこと いつか読むはずっと読まない: ≥ 1.6 ガード is_binary…

ElixirでPNGを出力するための覚書

defmodule PNG do @moduledoc """ PNG イメージを作成します cf. https://en.wikipedia.org/wiki/Portable_Network_Graphics """ @magic_number [0x89, "PNG", 0x0D, 0x0A, 0x1A, 0x0A] @width 32 @height 8 @depth 8 @color_type 3 # indexed @compression_…

ElixirからErlangのASN.1のライブラリを利用するための覚書

Erlang には、 ASN.1 で記述されたデータ構造のコンパイルと、エンコード/レコードをおこなうライブラリが標準で用意されています。 erlang.org ja.wikipedia.org かつて通信機器の開発が仕事だったころにあつかっていたことを思い出しつつ、Elixir で利用す…

Rustlerを使ってElixirのNIFを書たときに異なる型の要素を含むリストをあつかいたいばあいの覚書

結論: Vec<Term<'a>> 型にデコードするとよい 実例 Rustler を導入する NIF の雛形を生成する Rust のコードを編集する NIF をマウントする Elixir のモジュールを作成する コンパイラとパッケージを指定する 実行 いつか読むはずっと読まない:ラスト・モンスターに</term<'a>…

Phoenix LiveView で temporary_assigns を設定したときにどのように DOM を削除するか

temporary_assigns を設定したときの削除問題 実装のアイディア Ecto.Schema の状態を調べる DOM にスキーマの状態を持たせる JavaScript のフックで削除された状態の DOM を削除する Hotwire のことを少し いつか読むはずっと読まない:YOUはSHOCK 動作確認…

C++のクラスをNIFでElixirにバインドしてみた

C++ のライブラリを Elixir から利用したくなりました。 NIF を使った単純な関数の呼び出しは実装したことがあるのですが、オブジェクトを利用するようなケースは試したことがなかったので、今回調べてみました。 NIF環境の用意 elixir_make counter_nif Mak…