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

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

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

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

Discord Webhook で Ruby からファイルを POST する

昨年の 10 月に Discord Webhook で Elixir からファイルを POST する方法を記事に書きましたが、その Ruby 版です。 テキストをPOSTする テキストのみの場合、net/http の Net::HTTP.post_form メソッドを使うことで簡単に POST できます。 パラメータとし…

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 動作確認…

覚書 join.h

#ifndef __JOIN_H__ #define __JOIN_H__ #include <sstream> #include <iterator> template<class Iterator> std::string join(Iterator begin, Iterator end) { std::ostringstream io; for(Iterator i = begin; i != end; ++i) { io << *i; } return io.str(); } template<class Iterator, class Sep> std::string join(I…</class></class></iterator></sstream>

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

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

Discord Webhook で Elixir からファイルを POST する

人と直接会う機会がめっきり減り、代わってテキスト、音声、動画を問わずチャットを利用する日々が続いています。 そんなチャット環境を少しでも便利にしようと、Discord の Webhook を Elixir から利用する方法を調べていました。 Discord の Webhook の情…

Pow で認証したユーザを LiveView で参照するときの覚書

先日書いた phx_gen_auth とおなじく認証のしくみを Phoenix に組みこむためパッケージ。 phx_gen_auth が認証のしくみを実現するコードを生成するライブラリなのに対し(なので phx_gen_auth 自体はアプリケーション内で利用されない)、Pow はアプリケーシ…

phx_gen_auth で認証したユーザを LiveView で参照するときの覚書

hex.pm 結論 LiveView モジュールの mount/3 関数の第二引数に "user_token" が設定されているので、phx_gen_auth が生成するモジュールに含まれる関数 get_user_by_session_token/1 を利用してユーザデータを取得する。 実例 アプリケーションを用意する $ …

Action Cable でサーバと通信し、Alpine.js で表示を更新する

Alpine.js です。 軽量で、宣言的で、リアクティブなふるまいを記述できるということで注目されている、ようです。 github.com 既存のフレームワークの Vue.js や React と比べてシンプルで軽量というところが注目点のようなのですが、わたしとしては HTML …

Phoenix LiveView で Markdwon Preview

Phoenix LiveView を使って、textarea に入力した Markdown のテキストを逐次プレビューするサンプルです。 Phoenix 1.5 になって簡単に LiveView を利用できるようになり、動的なページを作るのが本当に簡単になりました。 もちろん万能ではないですし弱点…

Phoenix.PubSub を Phoenix 以外で利用するための素振り

檄を飛ばす 檄を方々に急いで出し,決起を促す。 「スーパー大辞林」より Phoenx.PubSub は Phoenix の名前空間にありますが Phoenix のプロジェクト以外でも利用できます。 バージョンが 2 になってシンプルに扱いやすくなったということで素振りをしてみま…

file_system パッケージを使ってファイルの更新を監視する Phoenix app についての覚書

いまさらなのですが。 Phoenix app の開発時に、コードを更新したときに自動的に再読み込みをおこなうしくみを file_system というパッケージが担っているということを知りました。 file_system | Hex ということなので。 file_system を使ってファイルの更…

Ruby の Enumerable モジュールの使い方の覚書

Enumerable モジュールを使って Fibonacci number を実装する例です。 module Enumerable Fibonacci number - Wikipedia # fibonacci.rb class Fibonacci include Enumerable def each if block_given? n1, n2 = 1, 1 loop do yield n1 n1, n2 = n2, n1 + n2…

AWS SNS で SMS 送信したときの料金を調べる覚書

AWS を使って SMS を送信する機会があったので、送信にかかった利用金を CloudWatch Metrics で取得するコードを Ruby で書きました。その覚書。 Amazon SNS を使用した CloudWatch トピックのモニタリング - Amazon Simple Notification Service Class: Aws…

Railsでサーバサイドで動的にHTMLを更新したいための覚書

動機 Rails で動的に要素を更新するページを作りたい 反 JavaScript 勢としては、JavaScript のコードをできるだけ書かずにすませたい 今回の解決策のメリット サーバサイドでレンダリングするので、View のテンプレートを利用できる 今回の解決策のデメリッ…

Elixir で escript からサーバにリクエストを送る覚書

事の起こり NIF (Native Implemented Functions) を含むパッケージを escript で利用しようとしたのですが。 ビルドした実行ファイルを実行しても NIF のライブラリファイルを読み込めないとエラーになり。 検索してみたらこのとおり。 Unfortunately that's…

Elixir 1.10 のアサーションの改善が、派手さはないけれどありがたい

このあいだ 1.9 がリリースされたと思っていたのに、もう 1.10 がリリースされました。 Elixir v1.10 released - Elixir 1.9 では、Elixir 単体でリリースを構築できるようになったり、config を一新したりと大きな変化がありましたが、それとくらべると今回…

C++ による NIF ことはじめ

使い慣れている言語が C++ なので、ここでは C++ で説明しますが基本的に C 言語でも同じように記述できるはずです。 というか、世の中の NIF の説明は圧倒的に C 言語が多い。 詳細の解説は置いておいて。コードを書いてから呼び出せるところまでを順にたど…

Phoenixの認証をGuardianに護らせる

Phoenix で作成したアプリケーションに、権利のあるユーザにのみアクセスを許可したいばあいに Guardian という Elixir のパッケージを利用して実現する方法の覚書です。 基盤にしている JWT などの技術に今のところ明るくないこともあり、ここでは手順だけ…

黒魔術で Elixir に Ruby を召喚する

まず始めに。 ネタ記事です。 ひさびさのネタ記事です。 ネタプログラミングです。 とはいえ。 黒魔術を使うことはなくても、このようなしくみを知っていると、その知識が役に立つときが来るかもしれません(来ないかもしれません)。 Level 1, Medium: Port…

Phoenixが入ったDocker containerをHerokuに配備する

de・ploy | dɪplɔ́ɪ | 他動詞 1 〘軍〙 〈部隊など〉を展開させる, 〈兵器など〉を配置[配備]する. ウィズダム英和辞典 いまさらなのですが。 Phoenix のドキュメントに Docker container を利用したリリースの手順が追加されていることに気がつきました。 今…

Elixirのreleases.exsの使いどころ

リリースするアプリケーションでは、実行環境に依存する情報をコード内に抱え込まないように、環境変数から設定を取得することが多いと思います。 Elixir では設定情報を config/config.exs に書くことが多いのですが、このファイルはビルド時に読み込まれる…

Phoenix.LiveView 事始め(subscribeとbroadcast)

前回の続きです。 前回、「バージョン 0.1 が公開され…」と書いたばかりなのに、今回の記事を書くまでの十日足らずの間にバージョン 0.2 が公開されてしまいました。 それはそれとして。 今回は Phoenix.LiveView の app で subscribe と broadcast を使って…

Phoenix.LiveView 事始め

先月末にバージョン 0.1 が公開され、Hex からインストールできるようになりました。 これを機に Phoenix.LiveView に挑戦です。 Phoenix.LiveView この記事では、app 作成から LiveView で表示を動かすまでの作業を、ただ淡々と書いてゆきます。 準備 適当…

Elixir でビット列を展開する覚書

例えば右のように 11001010(2) = CA(16) を 1111000011001100(2) = F0CC(16) に Elixir で展開するための覚書です。 Elixir の内包表記は for Elixir にも内包表記があります。他の関数型言語とくらべて内包表記っぽくない表記と感じましたが、意味するとろ…