write ahead log

ロールフォワード用

postgresql-setup --initdbでinvalid locale settings; check LANG and LC_* environment variables エラーが出る

Alma Linuxでdnfで入れたPostgreSQL10を設定しようとした。

こんな感じ。

# postgresql-setup --initdb

すると以下のエラーメッセージがログへ出た。

initdb.bin: invalid locale settings; check LANG and LC_* environment variables

ロケールを確認すると日本語になっているっぽい。

# localectl
   System Locale: LANG=ja_JP.utf8
       VC Keymap: us
      X11 Layout: us

でも利用可能なロケールを見ると「ja_JP.utf8」が入っていない。えぇ。

# locale -a

以下で入れて解決した。

# dnf -y install langpacks-ja glibc-langpack-ja.x86_64

PostgreSQLは再設定するときに一度以下を消してやらないとならない。

# rm -rf /var/lib/pgsql/*
# postgresql-setup --initdb

Alma Linuxでdnfやyumを使うとGPG checkエラーになった

alma linux8.8で出た。

You can remove cached packages by executing 'yum clean packages'.
Error: GPG check FAILED

入れたいパッケージのGPGキーが入っていなかったらしい。

(何を入れようとしたのか書こうと思ってたが記録が抜けてた)

rpm --import https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinux

参考: Cloud-Linux: yum update error Error: GPG check FAILED

HTTPでファイルをアップロードしたりダウンロードしたりする仕組みをおさらいした時にみたページ

よくわからなくなりがち。
RFC眺めるとなかなかためになった。
MIME-HEADERフィールドに使えるヘッダーってそんなにないんだなーとか。

javascriptでUUIDを作成する方法あれこれ

色々あって面白かったのでメモしておく。 一応全部ブラウザ上の前提。

  1. CryptoAPIを使う
  2. 外部パッケージを使う
  3. URL: createObjectURLを使う

CryptoAPIを使う

使えるなら真っ先に考えるやつ。

MDN - Crypto: randomUUID() メソッド

外部パッケージを使う

ここら辺の有名なやつを持ってきて使う。 HTTPSじゃないとブラウザAPIは使えないのでそういう場合は便利かも。
さすがにrandomUUIDが使えない環境は少ないだろうし。

uuid - npm

URL: createObjectURLを使う

知らなかったし想像もしなかったやつ。リンク先からの引用。

function uuid() {
  return URL.createObjectURL(new Blob()).slice(-36)
}

uuidライブラリの代わりになる実装方法の紹介

マジで?と思って調べてみたらホントっぽい。

W3C - File API - 8.2. Model

パーサーコンビネータというものを学んだときに読んだ記事

正直わかったようなわからないような微妙な感じなのだが、良い記事だったのでメモしておこうと思う。

TypeScript でゼロから作るパーサコンビネータ

JavaScriptでパーサコンビネータのコンセプトを理解する(「正規表現だけに頼ってはいけない」の続き)

小さい関数を作って組み立てるというのは割とわかりやすい気がする。

ただ、Typescriptの型定義に頭がついていかない。。。

php.iniを環境変数で指定したい

かなりレアケースだと思うんだけど、環境変数でphp.iniを指定したかった。

よくわからなくてChatGPTに聞いてみたりしたけどダメで、結局公式を読めばよかった。

www.php.net

PHPRCという変数があるらしい。

PHPIniDirでディレクトリ指定してもよかったのかもしれない。

これで何ができるかというと、エックスサーバーで一部ディレクトリのPHPバージョンを指定した上で好きなディレクトリのphp.iniを読みにいける。

twinbird-htn.hatenablog.com

CGIファイルをこんな風に書くと好きなディレクトリのphp.iniを読みに行ける。

#!/usr/bin/sh
export PHPRC="/home/path/to/php.ini"
exec /usr/bin/php5.6-cgi

これで何が嬉しいのかという話もあるが、これが必要な時も人生にはある。

dockerでvolumeマウントした時にPermission Deniedが出るのでユーザーを合わせたい

スマートな方法を探したが、結局Dockerfileでユーザーを作るアプローチになった。

volume mountする時にはユーザーが合わせられないと不便なケースが多いので、何か良いアプローチがほしい。

1. Dockerfileに以下を書く

パラメータから取得するようにしとく。

# ホスト側と同じユーザーを作成
ARG UID
ARG GID
ARG USERNAME

RUN groupadd -g ${GID} ${USERNAME}
RUN useradd -u ${UID} -g ${USERNAME} -m ${USERNAME}

2. docker-compose.ymlに以下を書く

環境変数をパラメータにして設定しておく。

version: '3'
services:
  web:
    build:
      context: ./docker/web
      args:
        UID: $UID
        GID: $GID
        USERNAME: $USERNAME
    volumes:
      - "./src:/var/www/project"

3. .envファイルを作る

環境変数を用意する。 docker-compose.ymlと同じ場所に作る。

UID=1000
GID=1000
USERNAME=twinbird

これでdocker compose upでユーザーが作られる。

コンテナ内に入るときにユーザーを指定するには

ホストとユーザーが合わせてあれば以下で同じユーザーで入れる。

docker compose exec --user=$USER -it web /bin/bash

参考

以下がとても参考になった。というかそのまま。 https://qiita.com/houchiey/items/ef0321956821c05b4b6a