Bash の 文法チェックのオプション

Bash には 処理を実行せずに 文法のチェックだけをしてくれるオプション "-n" があります。

[test.sh]

if [ -z test.txt ]; then
    echo "OK"
endif
$ bash -n test.sh

test.sh: line 4: syntax error: unexpected end of file

このオプションを付けることで コマンドを実行せずに 文法だけをチェックしてくれます。
(逆にコマンドの実行などはチェックできません)

この手の Bash のオプションの指定方法は いくつかあります。

@bash コマンドの引き数に指定する。

$ bash -n test.sh

Aスクリプトの先頭に記載する。

#!/bin/bash -n

Bset コマンドで指定する。

set -n

スクリプトの起動だけを確認したいときなど 色々と応用できます。

Excel の翻訳機能

セルをクリックしたら 偶然表示されて 驚いたのですが Excel には 2007 から翻訳機能があるそうです。

[参考]
【TIPS】Excelの翻訳機能を辞書代わりに使う方法 | Excelを制する者は人生を制す 〜No Excel No Life〜

例えば 次のように 英単語の入った セルを [Alt] を 押しながら マウスでクリックします。

WRITE_0xx2_01

「リサーチ」パネルに 翻訳結果が表示されます。

WRITE_0xx2_02

日本語から英語もできます。

WRITE_0xx2_03

「校閲」タブの「翻訳」から表示させることもできます。

WRITE_0xx2_04

翻訳機能の精度は よくわかりませんが こんな機能まであるとは すごいですね。

Word で印刷されない文字を追加する

Word には「隠し文字」という文字飾りがあります。
(Word 2010 で確認)

以下のように「フォント」のダイアログでチェックするか [Ctrl]+[Shift]+[H]のショートカットから設定することができます。

WRITE_0866_01

たとえば、次のように文字を選択して・・・。

WRITE_0866_02

文字飾り「隠し文字」を設定すると、選択した文字が隠れます。

WRITE_0866_03

「こんにちは」が表示されなくなってます。

隠れている文字を表示するには、 「段落」にある「編集記号の表示/非表示」を使います。

WRITE_0866_04

隠れていた文字が下線付きで表示されます。

WRITE_0866_05

ただし、これは文書全体の編集記号などを表示するため、 特定の隠し文字を表示させるわけではありません。

文書内に「隠し文字」があるかどうかを調べる方法もあります。

「情報」にある「共有情報」を見ます。

WRITE_0866_06

通常は「隠し文字」については何も表示されませんが・・・。

文書内に「隠し文字」があるばあい、次のように表示されます。

WRITE_0866_07

「隠し文字」はデフォルトで印刷しない設定ですが、 印刷オプションを設定することで 印刷することもできます。

WRITE_0866_08

隠し文字の使い道ですが 普通のコメントであれば、 そもそも Word には コメント機能もあります。

ですので、次のように 漢字の読みなどに指定して 印刷物を使い分けたいときに 利用するのが良いのではないかと思います。

WRITE_0866_09

Bash でループを別プロセスにしない

Bash で以下のようなループ処理を書くと パイプ以降が別プロセスになってしまうため その中で設定した変数を、ループ処理の外で参照することができません。

cat test1.txt | while read val1 val2
do
    val3=$val1
done

echo $val3 # ←最後のval1は入っていない

単純にテキストから読み込む場合 次のように書くと 別プロセスを作らずに済むため ループの中で設定した変数を ループの外で参照することができます。

while read val1 val2
do
    val3=$val1
done < test1.txt

echo $val3 # ←最後のval1が入っている

コマンドの実行結果をループに 渡している場合も・・・

cat test1.txt | grep -v "^a" | while read val1 val2
do
    val3=$val1
done

echo $val3 # ←最後のval1は入っていない

次ような書き方をすることができます。

while read val1 val2
do
    val3=$val1
done < <(cat test1.txt | grep -v "^a")

echo $val3 # ←最後のval1が入っている

( "<" の後の空白に注意してください)

プログラム的な処理が必要なときに 助かります。

Excel や Word で選択しにくいオブジェクトを簡単に選択する

Excel や Word で 背景が透明なオブジェクトを複数重ねてしまうと 下になったオブジェクトが選択しにくいことがあります。

WRITE_0864_01

こういうときは 「検索と選択」の中に「オブジェクトの選択と表示」というメニューがあるので それを使います。 (Excel 2010 で確認)

WRITE_0864_02

図形の一覧なんかが出てきますので・・・。

WRITE_0864_03

リストから簡単に選択できます。

Word にも同様の機能があります。 (Word 2010 で確認)

WRITE_0864_04

イライラしそうな操作には ちゃんと機能が用意されてますね。

コマンドプロンプトの REM はコマンド

気付いていませんでした。

コマンドプロンプトのバッチ処理ファイルでコメントを書くときに REM を使いますが REM はコメントのマークではなく 「何もしない」コマンドでした。

C:\> REM コメント!

"/?" を付けるとヘルプも表示されます。

C:\> REM /?

バッチ ファイルまたは CONFIG.SYS にコメント (注釈) を記録します。

REM [コメント]

なので、次のような "/?" で始まる変な装飾を付けてしまうと。

REM /???? -- コメント -- ???/
C:\> test.bat

-- の使い方が誤っています。

このようにエラーが出てしまいます。

PostgreSQL のパスワードファイル

前回、PostgreSQL のパスワードを環境変数で設定するのは PostgreSQL 的には非推奨と書きましたが 推奨されている方法について書いておきます。

[参考]
環境変数 - PostgreSQL 9.3.2文書

以下のような内容を「~/.pgpass」に記載します。

hostname:port:database:username:password

ファイル名は、環境変数 PGPASSFILE で変えることができます。

複数記載することができ、 上から順にマッチしたものを使用してくれます。 環境変数と違って複数設定しておけるのは便利ですね。

localhost:*:testdb1:testuser1:testpassword1
localhost:*:testdb1:testuser2:testpassword2
localhost:*:testdb2:testuser3:testpassword3

"*" も使用できます。 ホスト名は、Unixドメインソケットの場合 でも "localhost" で良いそうです。

[参考]
パスワードファイル - PostgreSQL 9.3.2文書

$ chmod 600 ~/.pgpass

ファイルの権限を 600 にしていないとエラーになります。

Linux でプロセスの環境変数を確認する

以前、PostgreSQL のパスワードを 環境変数で設定する記事を書きましたが PostgreSQL 的には非推奨のようです。
(一部のオペレーティングシステムではroot以外のユーザで環境変数が見える場合がるためとのこと)

[参考]
環境変数 - PostgreSQL 9.3.2文書

一部のオペレーティングシステムがどれを指すのかわかりませんが、 プロセスが使ってる環境変数の見方が気になったので ちょっと確認してみました。

まず環境変数を設定します。

$ export PGPASSWORD=testpassword

PostgreSQL のデータベースに接続するプロセスを作成します。

$ psql -U testuser -d testdb

psql (9.3.10, server 9.3.12)
Type "help" for help.

testdb=#

[Ctrl]+[z] プロセスを眠らせます。

[1]+  Stopped   psql -U testuser -d testdb

起動中のプロセスを確認します。

$ ps

  PID TTY          TIME CMD
28796 pts/0    00:00:00 bash
29754 pts/0    00:00:00 psql
29834 pts/0    00:00:00 ps

参考サイトによると、環境変数は「/proc/%{PID}/environ」に 格納されているそうです。

[参考]
Linux/Unixプロセス起動時の環境変数をダンプする | ギークを目指して

確認してみます。

$ cat /proc/29754/environ | sed -e 's/\x0/\n/g' | grep PGPASSWORD

PGPASSWORD=testpassword

たしかに確認できました。

使用している環境では root ユーザでなければ 自分以外の環境変数は見れませんでしたが、 自分の環境変数を(rootの権限が使えれば、他のプロセスの環境変数も)確認したいこともあると思うので 覚えておくと良いのかもしれません。

ワイルドカードで特定のファイルだけを除外する

通常、ワイルドカードを使うと 以下のようになるところを・・・。

$ ls -1 *.txt

1-1.txt
1-2.txt
2-1.txt
2-2.txt
3-1.txt

"!" を使うことで、逆に除外することができます。

$ ls -1 !(*-2.txt)

1-1.txt
2-1.txt
3-1.txt

この例では「*-2.txt」にマッチしないファイルが 表示されました。

tail コマンドでファイルが再作成されても追いかける

tail コマンドの "-f" オプションは "--follow=descriptor" ということで 対象のファイルが再作成されると追いかけられなくなります。

$ tail -f test.txt

そういうときは、"--follow=name" か "-F" を使います。

$ tail -F test.txt
  -f, --follow[={name|descriptor}]
                    output appended data as the file grows;
                    -f, --follow, and --follow=descriptor are
                    equivalent
  -F                same as --follow=name --retry
$ tail -F test.txt

Fri Sep  9 12:14:01 JST 2017
Fri Sep  9 12:14:02 JST 2017
tail: 'test.txt' has become inaccessible: No such file or directory
tail: 'test.txt' has appeared;  following end of new file
Fri Sep  9 12:14:12 JST 2017
Fri Sep  9 12:14:13 JST 2017

ちなみに ファイルが再作成されると上のように表示されます。

Linux のパスを展開する glob

ファイルやディレクトリを操作するときに "*" や "?" などのワイルドカードを使いますが これが何によって定義されているのかを 考えたことがありませんでした。

これ、 Linux では glob という名前だそうです。

[参考]
Dev Basics/Keyword:glob(グロブ) - @IT

記事を読んで驚いたのが Linux では文字クラス([0-9a-z]みたいなやつ)も使えるとのこと。 Windows のコマンドプロンプトでは使えないため ワイルドカードだけだと思い込んでました。

$ ls -1 /var/log/vsftpd.log*

/var/log/vsftpd.log
/var/log/vsftpd.log.1
/var/log/vsftpd.log.2
/var/log/vsftpd.log.3
/var/log/vsftpd.log.4

$ ls -1 /var/log/vsftpd.log.?

/var/log/vsftpd.log.1
/var/log/vsftpd.log.2
/var/log/vsftpd.log.3
/var/log/vsftpd.log.4

$ ls -1 /var/log/vsftpd.log.[2-3]

/var/log/vsftpd.log.2
/var/log/vsftpd.log.3

$ ls -1 /var/log/vsftpd.log.[^3-5]

/var/log/vsftpd.log.1
/var/log/vsftpd.log.2

うーん、これは便利。

こういうのは当たり前過ぎて、 知ってる人は「他の人も知ってる」と思って わざわざ伝えないものなのかもしれないですね。

ちなみに、ファイルをコピーするときによく使う {} の展開も glob の仕事だそうです。

$ ls -1 /var/log/syslog*

/var/log/syslog

$ cp -p /var/log/syslog{,.keep}

$ ls -1 /var/log/syslog*

/var/log/syslog
/var/log/syslog.keep

[参考]
用語集:ファイルグロブ: UNIX/Linuxの部屋

PostgreSQL のソート順とロケールの設定

PostgreSQL を使っていて ロケールの設定によっては ソート順が想定とは違う結果になることがあります。

ソート順に関するロケールの LC_COLLATE は データベース作成時にしか変更できないと思っていました。

[参考]
PostgreSQLのロケール(lc collate,lc ctype)の確認と変更

次のように SELECT 時に設定したり。

db=# SELECT * FROM tab1 ORDER BY col1 COLLATE "C" DESC;

後から列単位で変更もできるようです。

db=# ALTER TABLE tab1 ALTER COLUMN col1 TYPE VARCHAR COLLATE "C";

マニュアルに登場するのが 9.1 からなので おそらくその辺りで対応されたのではないかと。

[参考]
SELECT - PostgreSQL 9.1.5文書
ALTER TABLE - PostgreSQL 9.1.5文書

Excel で 白黒印刷プレビュー

パソコンで資料を作成したときに 印刷イメージを確認しておくのは 大切なマナーだと思います。 特に Excel だとセルの中で文字列が切れてたり 表がはみ出してたりしますよね。

さらにカラーだとプリント代が高くなるため 会議には白黒印刷で・・・なんてことも多いのではないでしょうか?

Excel には印刷プレビューを白黒にする機能があります。

WRITE_0856_01

上図のように、「ページ設定」⇒「シート」に設定があります。

Google サイト内検索

Amazonアソシエイト