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

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

省略されたテキストの全体をポップアップ表示する、CSSで

動機 表示領域に対して、表示したいテキストが長い場合に、はみ出す分を省略表示するスタイルを指定する方法が CSS にはあります。 こんな感じ。 これを、省略表示されたばあいに、マウスオーバーで全体をポップアップ表示しよう、という試みです。 動機 1. …

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…

HTML要素に適用するコードを再利用する、Alpine.jsで。

要素に適用するコードを再利用する、Alpine.jsで。 初期のリリースでは、HTML の中にデータやコードを埋め込むスタイルだった Alpine.js ですが、v3.0 以降はその分離と再利用のためのしくみが整備されてきているようです。 今月になって新しいしくみが提供…

CSVファイルをフィルタリングする

「元のCSVファイルから特定の条件の行だけを抜き出した新しいCSVファイルを作成する」という仕事中の話題から。 Ruby Rubyでしたら、不都合がない限り標準添付のcsvライブラリを利用すると思います。 docs.ruby-lang.org onliner 「ファイルから読み込んで、…

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

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

選択したファイルをプレビュー表示する

ファイルをアップロードするときに利用する input タグ <input type="file"> ですが、ファイルを選択した時点でブラウザ上で画像データを取得することできることを利用してプレビュー表示させる方法です。 過去に使ったことがあったんですが、件のコードにしか情報がなかったの…

Phoenix 1.6 と HEEx

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

Alpine.js が 3.x になり、いっそう利用しやすくなった

記事にするのが遅くなりましたが、6 月に Alpine.js が 3.0 にメジャーバージョンアップしました(ちなみに 2021-08-29 現在の最新は 3.2.4)。 alpinejs.dev 色々と改善されていますが、個人的に一番大きな利点はロジックをグローバルスコープに公開しなく…

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…