2017/03/21

バッチファイルで virtualenv activate する

Windows でタスク処理をする必要が出てきたので、超久しぶり10年以上…か?にバッチファイルを書きました。

と言っても、処理自体は Python で書いて、起動をバッチファイルで行うだけなので簡単・・・と思っていたら、ハマりました。

### activate しようとすると止まってしまう
私が最初に書いたバッチファイルが以下です。

`test` という名前の virtualenv を activate して、`main.py` を実行するだけ。
当然、問題なく動くと思ったのですが、`activate.bat` を呼んだ直後に止まってしまうのですちなみに、`%HOME%` はホームディレクトリを指定してます。

```
"%HOME%\Envs\test\Scripts\activate.bat"

cd "%HOME%\tasks"

python main.py
```

### バッチファイル中からバッチファイルを呼ぶ時は `call` を使う
調べてみたら、バッチファイルを直接記述で呼び出すと止まるらしいイケて無いと思うのは私だけ?。

> 参考
> - [Windows、バッチファイルからバッチファイルを呼び出す方法あれこれ|マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~](http://piyopiyocs.blog115.fc2.com/blog-entry-280.html)

というわけで、`activate.bat` の呼び出しに `call` をつければオーケーでした。

```
call "%HOME%\Envs\test\Scripts\activate.bat"

cd "%HOME%\tasks"

python main.py
```

2017/03/08

git repository 中の CRLF を LF に一括変換する

2017/03/07

ls の出力が文字化けみたいになってしまう原因


> 注:  
> 今回は文字コードがらみの話ではありません。日本語が文字化けしてしまう場合は文字コードを確認してみると良いでしょう。

`ls` の出力をそのままファイルに出力すると、文字化けのようになってしまうことがあります。

```console
`gutter: false;
$ ls
Dir/
$ ls > ../test.txt
$ less ../test.txt
ESC[0mESC[01;34mDirESC[0m
```

### 原因はフォーマットコード
これ、最初に見るとびっくりしますが、実はターミナルのフォーマットコードです。
`ls` の出力をターミナル上で確認すると、以下のように色付きなのがわかります。

つまり、表示されてはいないけど、ターミナルの装飾用フォーマットコードが同時に出力されているということです。 例えば `.bashrc` 等の中で alias を設定していたりすると、こういった動作になります。 ```bash alias ls='ls --color' ``` `ls` はわかりやすい例ですが、その他の装飾文字を出力するコマンドは同様の問題が起こる可能性があります。 ### 対策1 フォーマットを切る 当たり前ですが、フォーマットしないように設定すれば直ります。一時的に対策するには良いでしょう。 ```console `gutter: false; $ ls --color=never > ../test.txt $ less ../test.txt Dir ``` ### 対策2 `--color=auto` を指定する `--color` は `--color=always` と等価なので問題が起こりますが、 `--color=auto` にするとターミナルに出力される時だけフォーマットコードが挿入されます。 `.bashrc` 等の設定で、以下のように `--color=auto` にしておくと問題が起きにくくなります。 ```bash alias ls='ls --color=auto' ``` ### フォーマットコードの仕様 フォーマットコードは慣れると簡単で、"ESC" (`0x1b`) "[" (`0x5b`) と "m" (`0x6d`) の間にコードを入れて表します。 文字装飾(太字、イタリック等)と文字色、背景色を設定することが出来ます。 具体的な値は以下のサイトにわかりやすくまとまっていたのでご参照ください。 > 参考 > - [bash:tip_colors_and_formatting - FLOZz' MISC](http://misc.flogisoft.com/bash/tip_colors_and_formatting) 例えば先程の例 `ESC[0mESC[01;34mDirESC[0m` だと、 以下のようになります。 - "01" Bold - ";" 区切り文字 - "34" Forground Blue - 前後の `ESC[0m` はリセット ちなみに、バイナリだと以下のようになります。 ```console `gutter: false; $ ls --color | od -t x1 0000000 1b 5b 30 6d 1b 5b 30 31 3b 33 34 6d 44 69 72 1b 0000020 5b 30 6d 0a ```
2017/03/06

git でバイナリファイルとして扱われているファイル一覧を取得する

滅多に使わないので備忘録。

```console
`gutter: false;
$ diff --unchanged-group-format='' <(git grep -Ilc '') <(git grep -lc '')
```

`git grep -I` でバイナリファイルを無視するので、`-I` 有りと無しの差分を取るというアイデア。

参考リンクは出力をフォーマットするのにいろいろ駆使していますが、 `git grep -l` と `diff` の標準機能を組み合わせてシンプルにしてみました。

> 参考
> - [Find all binary files in git HEAD - Stack Overflow](http://stackoverflow.com/questions/30689384/find-all-binary-files-in-git-head)