お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。
投稿日:
ソフトウェア::MSYS2ソフトウェア::zsh

MSYS2のzshで.zshを叩いたときに次のエラーが出るときの対策

./test.zsh: 2 行: read: -q: 無効なオプションです
read: 使用法: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

動かないシェルスクリプトのサンプル

  • 但しこれは動く
    • echo "yes or no (y/N): "; if read -q; then; echo hello; else echo abort; fi
echo 'yes or no (y/N): '
if read -q; then
  echo y
else
  echo n
fi

解決方法

  • 次のようにshebangを入れてやる
    • 多分shが呼ばれているのだと思う
#!/bin/zsh

echo 'yes or no (y/N): '
if read -q; then
  echo y
else
  echo n
fi
投稿日:
ミドルウェア::HTTPD::nginx
  1. 次のコマンドでBase64エンコードしたIDPWを吐く
    1. echo -n 'username:password' | base64
  2. nginxの設定ファイルを以下のように設定し、 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXを暗号化したIDPWに置き換える
location /foo/ {
    # プロキシが使うHTTPヘッダ
    proxy_set_header Authorization "Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    # プロキシするURL
    proxy_pass   https://example.com/;
}
投稿日:
ソフトウェア::Git

いくつか方法があるが、正直どれも使わないに越したことはない。しかし業務上の様々なしがらみなどでやむを得ず使うハメになることがある

ローカルで無視しておきたいがリモートで変更があったときには検知したいケース

リモートの変更まで無視してしまうと事故の元なので一番オススメ
git update-index --[no-]skip-worktreeを使う

  • .envのような個々人の環境によって異なるものがリポジトリ管理対象になっているときに使える
  • ブランチの切り替え時のコンフリクト対策としてはスクリプトを組んでおくと楽
ブランチ切り替え時のテクニック
  • ブランチで--skip-worktreeとなっている対象の変更を隠す
# --skip-worktreeの一括解除
git ls-files -v | grep ^S | sed -r 's/^S.(.+)$/\1/g' | xargs git update-index --no-skip-worktree
# 出てきた変更を全てスタッシュに入れる
git stash push -q -m stash_skiptree
  • 前項で隠した変更を再現して、--skip-worktreeし直す
# stashから戻す
git stash pop -q
# この時点での差分に対し--skip-worktree
git diff --name-only HEAD | xargs git update-index --skip-worktree

常に無視しておきたいケース

リモート側で重大な変更があったときにローカルで検知できないので事故りやすい
git update-index --[no-]assume-unchangedを使う
使ったことないので存在だけ記述して終わり

リポジトリの管理下にないファイルを常に無視するケース

--[no-]skip-worktree--[no-]assume-unchangedも使えないときにユースケースが存在するやつ

  • .git/info/excludeに無視対象のパスを記述することで無視できる
  • 自分のローカルにだけこっそり存在するdocker-compose.override.yamlみたいなのを無視するときに使える
投稿日:
サービス::GitHub::GitHub Actions開発::自動化

取り敢えず各ジョブの中で使うやつ

今まで使っていた::set-outputは2023-05-31に廃止される予定なので置き換える必要があります。

GitHub Actions: Deprecating save-state and set-output commands

サンプルコード

  • 設定方法:echo "<KEY>=<VALUE>" >> "$GITHUB_OUTPUT"
  • 参照方法:steps.<ID>.outputs.{KEY}
name: variable example
on:
  workflow_dispatch:
jobs:
  ubuntu-testing:
    runs-on: ubuntu-latest
    steps:
      - id: example
        run: echo "value=hoge" >> "$GITHUB_OUTPUT"
      - name: disp
        run: echo ${{ steps.example.outputs.value }}

フックを単体でテストするケースを想定。

このパターンはコンポーネントからフックを切り離しているケースで有用。手法としては@testing-library/react-hooksrenderHook()を使う。

カスタムフック

export const useUserForm = () => {
  const [username, setUsername] = useState('');
  const [password, setPassword] = useState('');

  const onChangeUserName = (ev: string) => {
    setUsername(ev);
  };
  const onChangePassword = (ev: string) => {
    setPassword(ev);
  };

  return {
    username,
    password,
    onChangeUserName,
    onChangePassword,
  };
};

テストコード

it('onChangeUserName で username が設定されること', () => {
  // `renderHook` で Hook をレンダリング
  const { result } = renderHook(() => useUserForm());
  // `act()` で Hook のイベントを叩く
  act(() => result.current.onChangeUserName('foo'));
  // 結果を見る
  expect(result.current.username).toBe('foo');
});