読者です 読者をやめる 読者になる 読者になる

水底

ScalaとかC#とかネットワークとか

複数のコマンドの出力をまとめてリダイレクトする2つの方法

1. (), {} の利用

(), {} で囲んでまとめてリダイレクト先を指定する. 丸括弧の場合はサブシェルで, 波括弧の場合はカレントシェルで実行される.

{
  command1
  command2
} >> log 2>&1

2. exec の利用

exec は現行プロセスを別コマンドのプロセスに置換するコマンドである. このとき, 引数を省略してリダイレクトのみ記述することで現行プロセス (shell) のリダイレクト先を上書きすることができる.

exec >> log 2>&1
command1
command2

ちなみに元に戻す方法が見当たらないけどどうやるのだろうか… (exec 1>&1 2>&2 とかで戻ってくれても良さそうだがうまくいかない)

まとめ

exec を使うと副作用が怖いので {} (or ()) でまとめてリダイレクトの方が無難っぽい (?)

sh・bash・zsh等, shellの違いでハマりやすい部分とか

前提として

sh の実体は環境によって POSIX互換bash (bash --posix) であったり, dash であったり, busybox であったりと様々である (ls -l `which sh` とすれば実体がわかる). 唯一の制約は POSIX互換であること だ (※どこぞの今はなきお行儀が悪いOSを除けば). そのためシバンsh を利用する場合は, 最低限のPOSIX互換shell上で動作するように書かれるべき で, 例えば bash 拡張を用いる時はシバンbash を指定するべきだ. しかしながら, シバンsh を指定しているにも関わらずPOSIXの範囲を超えた命令を利用しても動いてしまうケースもままあり, 意識しないと難しい.

ハマりやすい差異の一例

空白 (正確には区切り文字) が含まれた変数

変数の展開され方が異なる

# bash, bash --posix, dash, busybox
: > 'a b'
x='a b'
mv $x c # error (`mv a b c` と解釈される)
ls # -> 'a b'
# zsh
: > 'a b'
x='a b'
mv $x c # (`mv 'a b' c` と解釈される)
ls # -> c

文字列の比較

== による文字列比較はPOSIX互換のものではない

# dash
[ 'a' = 'a' ] && echo 'ok' || echo 'ng' # -> ok
[ 'a' == 'a' ] && echo 'ok' || echo 'ng' # error -> ng
# zsh
[ 'a' = 'a' ] && echo 'ok' || echo 'ng' # -> ok
[ 'a' == 'a' ] && echo 'ok' || echo 'ng' # error
# bash, bash --posix, busybox
[ 'a' = 'a' ] && echo 'ok' || echo 'ng' # -> ok
[ 'a' == 'a' ] && echo 'ok' || echo 'ng' # -> ok

プロセスリダイレクト

これは bashzsh 固有の機能の一つ

# bash --posix, dash, busybox
cat <(echo 'a') # error
# bash, zsh
cat <(echo 'a') # -> a

結論

shellは方言や実装で微妙に違うところが多すぎて厳しい

いい感じの深層学習に関する資料を貼るだけ

Chromeのタブにスタックされつつあったのでメモして閉じる作戦. 折角なので別途読んだものもまとめて追加してる.

理論系中心でふわふわした某プログラマのための技術情報共有サービスのようなソースはなし. 基本的に最新の事柄を扱っているもの. 結構重複が多い.

続きを読む

Alpine Linuxでユーザやグループを追加・修正・削除する

Alpine Linux 3.5+ をお使いの方

おめでとうございます!今すぐ apk add shadow しましょう. 他のディストロ同様の useraddusermodvipw といった 様々なコマンド がお試しいただけます.

Alpine Linux ~3.4 をお使いの方

残念ながらbusyboxによる adduseraddgroupdeluserdelgroup しかありません. 強く生きましょう.

Docker Composeでビルド時に任意のイメージ名を指定する方法

公式リファレンスを見ても分かりづらいのでメモ.

Docker Compose経由でビルドされたデフォルトイメージ名は {プロジェクト名}_{サービス名} となる (デフォルトプロジェクト名はディレクトリ名だが, コマンドラインオプション -p から指定可能). 例えば以下のような構成であれば, イメージ名が hoge_fuga, コンテナ名が piyo となる.

hoge
 ┣ Dockerfile
 ┣ docker-compose.yml
 ┗ ...
# docker-compose.yml
version: '2'
services:
  fuga:
    build: .
    container_name: piyo

しばしば長ったらしいイメージ名になってしまう. そこで以下のように image を追加することでイメージ名を指定できる. imagebuild が同時に宣言されている場合は, ビルドが優先的に実行されて, image はその構成に使われる (image によるプルは発生しない). 結果としてイメージ名が nyan, コンテナ名が piyo となる. ちなみにタグの付与も image からできる. これらは全て, Compose File v2からの機能である.

# docker-compose.yml
version: '2'
services:
  fuga:
    build: .
    image: nyan
    container_name: piyo

既存環境に手を加えずにサクッとHTTPS化する (NAT配下でもok)

いい加減やらないとなーとn年思いながらも放置していた案件.

結論から言うと↓を使うだけ.

github.com

得られるもの

  • HTTPS化 (DV by let’s encrypt)
    • 無料
    • ずっと使える (let’s encryptの証明書には90日の期限があるが, 自動的に更新してくれる)
続きを読む

Gitで気をつけるべき設定

大体デフォルトで問題ないが, 気をつける必要がある設定がいくつかあるのでメモ.

f:id:amaya382:20170326024520p:plain

続きを読む