生成AIを使ったプログラミングが百花繚乱の昨今。 かつて何度か記事にしたように、30年40年経っても、プログラミングだけは飽きずに続いています。 blog.emattsan.org blog.emattsan.org ここにきて、人間とプログラミングの関わり方が大きく変わってきまし…
このところプログラミングができていない感じがしています。 というか、たぶんできてません。 職業プログラマなのでプログラミングしていないということはないのですが、自分の思うようなプログラミングができていない感じがします。 仕事のプログラミングだ…
今回の話は次のようなことを念頭に置いています。 1の要素を3の位置に移動する これは順序を決定する情報を各要素が持っているばあい、たとえば次のようなばあい、 その情報を入れ替えることを意味します。 順序情報をもとに並び替えると次のようになります…
過去のブログ記事を検索してみても、たびたびシリアライズやデシリアライズと格闘していることが伺えます。 見れば 2018 年にも Poison パッケージを使った Elixir の構造体のシリアライズ/デシリアライズを試みていました。 poison | Hex 主流は Posion か…
勉強不足を晒すことになりますが。 仕事で "Specification" なるオブジェクトが出てきたときに、しばらくは漠然としたイメージしか持てませんでした。 当面は直接関わることがなかったのでそのままにしていたのですが、原典に当たったことですっきりしました…
ことの起こり "google_drive" という Ruby gem があります。 rubygems.org これを使うと Ruby のコードから Google Drive にアクセスして操作することができます。 仕事で Google Spreadsheet に書き込みに使っているのですが、既存のコードではセルへの書き…
特定の値から出発して演算を繰り返し値の並びを出力する unfold 。 そういえば Ruby に unfold ってないんだっけ? というのが発端。 unfold とは 早い話が fold の逆です。 Elixir では Stream.unfold/2 が定義されています。 # 1 から始めて、前の値に 1 …
仕事では Ruby on Rails を主戦場としているわけですが。 最近、クエリメソッドについて考えています。 Rails のクエリメソッドといえば「スコープ」を定義するのが常套手段です。 # app/models/user.rb class User < ApplicationRecord scope :created_at_b…
HTTP クライアントとして Req をよく利用するのですが。 hex.pm こういった外部の環境と接続する操作はテストが面倒なもの。 その点において Req はテストのための仕組みをパッケージ自身が提供してくれています。 その仕組みの使い方と、ちょっとした工夫の…
Canada という小さな実装のライブラリがあります。 hex.pm Ruby でいうところの CanCanCan のような権限判定のためのライブラリなのですが、とても興味深い実装をしています。 例えば user が article を read できるか判定するとき、 can?(user, read(artic…
ただしサーバとは言っても 祝日一覧をダウンロードする エンコーディングを変換する CSV をパースする データを ETS に格納する データを検索する サーバを作る いつか読むはずっと読まない:全史ならぬ前史 ただしサーバとは言っても Web サーバ等ではなく…
遅ればせながら。 Phoenix Playground の存在に気づきました。 hex.pm 以前から。 状態の変化を LiveView を使ってブラウザ上で閲覧できるようにすることを考えているのですが、ごく簡単な情報を表示するために Phoenix app を構築するのが割に合わず、結局…
条件による分岐をハードコーディングせずに実現する方法について考えてみました。 ただし、ここで試してみた方法はライブラリやフレームワークとして再利用するというよりも、再実装せずにふるまいを変えることができる電子回路のジャンパピンのような仕組み…
ネット上の CSV データを、Req パッケージを使ってダウンロードし、NimbleCSV でデコードしようとしていたのですが。 hex.pm hex.pm 二つのパッケージをインストールして、Req のレスポンスのボディを NimbleCSV でデコードしたら失敗し、ボディがテキストデ…
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 というプログラミング言語があります。 Haskell のような構文で記述でき JavaScript を出力できる、ということを半年ほど前に知ったのですが。 www.purescript.org 最近になって、バックエンドを切り替えれば Erlang のソースコードを出力できる…
前回の続きです。 前回は BDF ファイルをパースして読み込む話をしました。 そして、BDF ファイルは単純なテキストファイルだし、Nerves アプリケーションへそのまま持っていっても大丈夫だろう、と高を括っていたのですが。 Raspberry Pi ZERO W の非力さを…
Glyph Bitmap Distribution Format (BDF) というフォントフォーマットがあります。 en.wikipedia.org 記事の最後の方に書いたような理由があって、 BDF を読み込むパッケージを書いています。 道半ばなのですが、お試しで使えるくらいにはまとまったので、一…
以前、プログラミングを始めて 30 年が経ちましたという記事を書きました。 blog.emattsan.org それから 10 年が過ぎました。 気づくと 40 年。 職業プログラマに転向して 10 年。 今もプログラマを続けています。 好きでプログラミングを続けているとはいえ…
Phoenix LiveView で値を socket に assign するとき、その値が例えば Web API などで取得しなければならないとき、一旦待ち状態を設定して、それから Task.async などを利用して、結果が得られたら取得できた値を設定し直すという非同期の処理を行うわけで…
en.wikipedia.org Compositeパタンは、再起的な構造を表現するときにしばしば顔を出すパタンで、node と leaf に同じイタンフェースを与えることで、それらを同一視して再起的に扱えるようにするしくみです。 Elixir は型付けが動的なので、特別な工夫をしな…
前回、GenServer の渋滞を解消するために Task を利用する方法を紹介しました。 blog.emattsan.org これは Task のプロセスが異常終了しないことを前提にしていて、異常終了が予想されるばあいには、その対策を施しておく必要があります。 結論から言うと Ta…
時間のかかる処理を複数実行したいとき、各々の処理にプロセスを起動して並行に実行することがあります。 しかし、同じ GenServer プロセスに対して GenServer.call/3 で呼び出してしまうと、GenServer.handle_call/3 で処理が順番待ちになってしまい並行し…
ウェブアプリケーションを作っていると、表示する画像を動的に生成したいケースに遭遇します。 探してみると画像ファイルを生成するツールやライブラリは見つかるのですが、ウェブアプリケーションでは画像データを HTTP のレスポンスとして送信できればよい…
Elixir Logger に Erlang/OTP logger がやってきた およそ半年前、1 月にこのような記事を書きました。 blog.emattsan.org ログローテーションなどを装備したファイル出力を可能にするハンドラが OTP 21.0 で装備されていて、それを Elixir から利用しようと…
ちょっとした Web サーバが欲しくなったときに使えるコードの覚え書きです。 基本の形は Plug のドキュメントに書かれている通りです。 hexdocs.pm 任意の Content-Type のレスポンスを返せるように :mimerl を使って Content-Type を設定するようにしたのが…
背景という名の釈明 アイテムを一覧表示する、まずは手動で 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 実行 実は弱点…
Elixir の Web フレームワークである Phoenix Framework に、待望の 1.7 がやってきました。 phoenixframework.org やはり今回のバージョンの最大のポイントは、Controller を用いた静的な View と LiveView のテンプレートが、コンポーネントという形で統合…
数年前に、Elixir の Logger モジュールのカスタムバックエンドを書く、という記事を書きました。 blog.emattsan.org ごく最近になって。 Elixir Forum で Logger の設定の記事を読み、OTP が標準で用意しているハンドラを使えば、バックエンドを書かなくて…
LiveViewでTaskの結果はhandle_infoで受ければよいという話 ElixirWeekly の何号だったか失念してしまったのですが。 LiveView のプロセスで、非同期処理を Task.async/1 で実行したならば、Task.async/1 が終了時に送信するメッセージを受け取ればよい、と…