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

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

pdftotextをRubyの関数にする

pdftotext Poppler のコマンドラインツールの一つである pdftotext は PDF からテキストを抽出することができます。 en.wikipedia.org 通常は入力に PDF ファイルを指定するのですが、マニュアルに "If PDF-file is ´-', it reads the PDF file from stdin."…

Ruby の NKF.nkf のオプションを式で演算する

Ruby には nkf コマンドを利用するための NKF というライブラリがあります。 docs.ruby-lang.org 文字コードを変換する関数 NKF.nkf オプションは、nkf コマンドのオプションと同じものを文字列で指定します。 # -W 入力に UTF-8 を仮定する # -s Shift_JIS …

Active Record とクラスメソッド

とある Ruby on Rails アプリケーションを開発するプロジェクトで、次のような雰囲気のコードを目にしました。 class Foo < ApplicationRecord # テーブル foos は、カラム a, b, c を持つものとします class << self def add_a_and_b(foo) foo.c = foo.a + …

Pascalの試練場

"Wizardry: Proving Grounds of the Mad Overlord" *1 のコードを GitHub に見つけてしまいました。 github.com Apple II で Pascal で書かれていたという話は昔から聞いていて、ときおり思い出したように検索したりしていたのですが、とうとうヒットしてし…

Factor へ、パラダイムを飛び移る

あまり時間をさけていませんが、細々と Factor をいじっています。 Hello, World! の次の定番、Fizz Buzz をやってみました。 前回のおさらい 「Factor とは何?」という話は、前回の記事に書きましたのでこちらを参照していただけたら。 プログラミング言語…

プログラミング言語 Factor のプログラミングで仕事の疲れを癒す

この数ヶ月は、仕事でも私的なことでも負担の大きな時期で、気分の低空飛行もまた致し方なしという感想。 ようやく気持ちも多少は上向いてきたので、そろそ好きなことをして諸々の疲れを癒す時期かと。 そんなわけで、この数日 Factor をいじっています。 Fa…

生成AIとソフトウェア的愛情

生成AIを使ったプログラミングが百花繚乱の昨今。 かつて何度か記事にしたように、30年40年経っても、プログラミングだけは飽きずに続いています。 blog.emattsan.org blog.emattsan.org ここにきて、人間とプログラミングの関わり方が大きく変わってきまし…

近況

このところプログラミングができていない感じがしています。 というか、たぶんできてません。 職業プログラマなのでプログラミングしていないということはないのですが、自分の思うようなプログラミングができていない感じがします。 仕事のプログラミングだ…

順序を入れ替えるための覚書

今回の話は次のようなことを念頭に置いています。 1の要素を3の位置に移動する これは順序を決定する情報を各要素が持っているばあい、たとえば次のようなばあい、 その情報を入れ替えることを意味します。 順序情報をもとに並び替えると次のようになります…

Elixir の構造体を JSON データからデシリアライズする

過去のブログ記事を検索してみても、たびたびシリアライズやデシリアライズと格闘していることが伺えます。 見れば 2018 年にも Poison パッケージを使った Elixir の構造体のシリアライズ/デシリアライズを試みていました。 poison | Hex 主流は Posion か…

「Specification は述語である」という話

勉強不足を晒すことになりますが。 仕事で "Specification" なるオブジェクトが出てきたときに、しばらくは漠然としたイメージしか持てませんでした。 当面は直接関わることがなかったのでそのままにしていたのですが、原典に当たったことですっきりしました…

GoogleDriveに行と列の位置を指定して値を書き込むのが面倒なのでヘッダを指定して書き込めるWriterを書いてみた

ことの起こり "google_drive" という Ruby gem があります。 rubygems.org これを使うと Ruby のコードから Google Drive にアクセスして操作することができます。 仕事で Google Spreadsheet に書き込みに使っているのですが、既存のコードではセルへの書き…

Rubyでunfoldを書く

特定の値から出発して演算を繰り返し値の並びを出力する unfold 。 そういえば Ruby に unfold ってないんだっけ? というのが発端。 unfold とは 早い話が fold の逆です。 Elixir では Stream.unfold/2 が定義されています。 # 1 から始めて、前の値に 1 …

クエリをオブジェクトにして 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 のレスポンスとして送信できればよい…