m4 で画像の data-uri を埋め込む

今どき m4 かと思わなくもないけど、コマンドラインツールがあればだいたい入ってるので重宝する。

埋め込みたい画像のパスを DATA_URI マクロで囲む。 相対パスだと m4 の実行時のカレントディレクトリを見るので (たぶん) そこだけ注意

<img src="DATA_URI(image/image.png)">

画像ファイルの mime-typebase64 を引数から得て置換する m4 のマクロを (とりあえずコマンドラインにて) 定義して、実行する。

繰り返し使うようなら make や別途マクロ定義ファイルにまとめるとよいと思う。

$ m4 -DMIME='esyscmd(file -b --mime-type $1 | tr -d "\n")' \
     -DBASE64='esyscmd(base64 $1 | tr -d "\n")' \
     -DDATA_URI='data:MIME($1);base64,BASE64($1)' \
      hoge.m4.html > hoge.html

【MySQL】カンマ区切りになっているテキストのカラムを縦持ちにする

MySQL 限定テクニック。

項目がいくつあるか事前にわかっていれば、SUBSTRING_INDEX 関数を使って縦持ちにできる。 項目数が不定だとたぶんつらい。(試してない)

例として、下のテーブル favoritesfavorites カラムに、 カンマ区切りで好きな言語が3つ入っているとする。

CREATE TABLE favorites (
    name VARCHAR(16) PRIMARY KEY
  , favorites VARCHAR(255) NOT NULL
);

中身は下のとおり。

name favorites
太郎 C,Rust,Scheme
花子 Ruby,Python,APL

とりあえずインラインビューで 1 .. 3 までの補助テーブル L (loop のつもり) をつくっておいて、直積をとる。

結果の6行に対して、SUBSTRING_INDEX を適用して分割した値を得ることができる。

SELECT  name
      , SUBSTRING_INDEX(SUBSTRING_INDEX(favorites, ",", L.`index`), ",", -1) AS favorite
   FROM favorites CROSS JOIN (
           SELECT 1 AS `index`
     UNION SELECT 2
     UNION SELECT 3
  ) L
 ORDER BY name
;

かくして、縦持ちの結果が得られる。

name favorite
太郎 C
太郎 Rust
太郎 Scheme
花子 Ruby
花子 Python
花子 APL

ズンドコしたい (2)

こっちは入力を5つ区切りにして、それぞれが 00001 の並びになっているかどうかをチェックする。 (仕様はこちらが正しいらしい?)

$ cat /dev/urandom \
 | LANG=C tr -dc "01" \
 | fold -w1 \
 | paste -d' ' - - - - - \
 | (perl -nle 'print; if ($_ eq "0 0 0 0 1") { exit 0; }'; echo 2) \
 | perl -ple 'BEGIN { @table = qw/ズン ドコ キ・ヨ・シ!/ } s/(\d)/$table[$1]/ge' \
ドコ ドコ ズン ドコ ドコ
ズン ドコ ズン ズン ズン
ドコ ズン ズン ズン ドコ
ズン ドコ ズン ズン ドコ
ズン ドコ ズン ドコ ドコ
ドコ ドコ ズン ズン ズン
ズン ズン ドコ ズン ズン
ズン ドコ ドコ ドコ ドコ
ズン ドコ ドコ ズン ドコ
ドコ ドコ ズン ドコ ズン
ドコ ズン ドコ ドコ ズン
ズン ドコ ドコ ズン ドコ
ズン ズン ドコ ズン ドコ
ドコ ドコ ドコ ドコ ズン
ドコ ズン ドコ ズン ドコ
ドコ ドコ ドコ ズン ズン
ズン ドコ ズン ズン ズン
ドコ ドコ ドコ ズン ドコ
ドコ ズン ズン ズン ドコ
ズン ドコ ドコ ドコ ドコ
ズン ズン ズン ドコ ズン
ズン ドコ ズン ズン ズン
ドコ ズン ドコ ドコ ドコ
ズン ズン ズン ドコ ドコ
ズン ズン ズン ズン ズン
ズン ズン ドコ ドコ ドコ
ズン ズン ズン ズン ドコ
キ・ヨ・シ!