Bash で プロンプトの色を変える

SSH などでサーバにログインして さらにそこから別のサーバにログインしたりすると 自分がどのサーバを触っているかわからなくなるときがあります。

プロンプトにホスト名を表示するなどで 分かるようにしても 背景と化してしまうので “本番環境だけは!”というときに プロンプトの色を変えるというのはどうでしょうか。

$ PS1="\[\033[0;31m\][\u@\h:\w]$\[\033[0m\] "
$ PS2="\[\033[0;31m\]>\[\033[0m\] "

こんな感じで設定します。 PS1 は通常のプロンプト、PS2は、入力が続いている場合のプロンプトです。

設定すると次のようになります。

[user1@host1:~]$
[user1@host1:~]$ cd \
> /usr/local/share

[user1@host1:/usr/local/share]$ 

突然目に飛び込んでくる赤色にドキッとさせられます。

Bash の コマンド置換

Bash のコマンド置換には、"`" (バッククォート)を使う形式と "$()" を使う形式の 2 種類があります。

$ echo `pwd`
/usr/local

$ echo $(pwd)
/usr/local

"$()" の形式の方が新しいようです。

この 2 つは、基本同じ動きをしますが、バックスラッシュによるエスケープの処理が違います。 次のようになります。

$ AA=abc

$ echo `echo $AA`
abc

$ echo `echo \$AA`
abc

$ echo $(echo $AA)
abc

$ echo $(echo \$AA)
$AA

Excel の [Ctrl]+[End] / [End]

Excel で [End] キーは、ちょっと変わった移動です。

Excel では、次のように 「入力された一番右の列」「入力された一番下の行」の 交わるセルを、最終有効セルとして記憶しています。

WRITE_0254_02

デフォルトでは、最終有効セルまでが印刷範囲になります。

[Ctrl]+[End] は、カーソルを最終有効セルに移動させます。

WRITE_0254_03

最終有効セルがどこにあるかわからなくなったときや データの最終行に移動したいときに便利です。

ちなみに、入力した値をクリアしても「入力された一番右の列(下の行)」は変わりません。 最終有効セルを内側に移動させるためには、行や列を削除します。

次に [End] キーだけを 1 回押すと、 右下に次のように "END" と表示されます。

WRITE_0254_01

この状態で カーソルキーを押すと その方向に大きく移動します。
移動する内容は [Ctrl]+[カーソル] と同じです。

WRITE_0254_04

黄緑がカーソルの現在の位置、黄色が各方向の移動です。

値の入ったセルがなければ 行や列の先頭や後尾に、 値の入ったセルがあれば、連続して値の入っているセルの端に カーソルを移動させます。

カーソルの代わりに [Home] を押すと [Ctrl]+[End] と同じで 最終有効セルに移動します。

これら同じ動きの移動コマンドがあるので 自分が使い易いものを選んで覚えると良いと思います。

Bash の文字列の文字数を取得する

次のような変数があります。

$ K="abc def gh"

wc コマンドで文字数を取得できますが echo するだけでは行末に改行が入ってしまうので "-n" オプションを付ける必要があります。

$ echo -n $K | wc -m

10

その他に "#" を付ける方方もあります。

$ echo ${#K}

10

"#" は、変数が配列の場合は要素数が取得できますが 変数が文字列の場合、文字数を取得することもできます。

$ K="あいう"
$ echo ${#K}

3

PostgreSQL で実行中のプロセスを確認する

PostgreSQL で 現在実行中のプロセスと 実行中のクエリや実行時間を取得します。

【参考サイト】
PostgreSQLのちょっとテク - よくきたWiki

SELECT
    procpid AS "プロセスID",
    start AS "開始時刻",
    now() - start AS "実行時間",
    current_query AS "実行クエリ"
FROM
    (SELECT
        backendid,
        pg_stat_get_backend_pid(S.backendid) AS procpid,
        pg_stat_get_backend_activity_start(S.backendid) AS start,
        pg_stat_get_backend_activity(S.backendid) AS current_query
    FROM
        (SELECT pg_stat_get_backend_idset() AS backendid) AS S
    ) AS S
WHERE
    current_query <> '<IDLE>'
AND
    procpid <> pg_backend_pid()
ORDER BY
    "実行時間" DESC;

自分自身のプロセスと idle 中のプロセスを除外しています。

件数が少ないときは、"\x" で展開表示 してあげると 長い SQL でも見やすくなります。

db=# \x
db=# SELECT .... (省略)

-[ RECORD 1 ]-----------------------------
プロセスID | 19848
開始時刻   | 2010-03-25 22:17:48.459064+09
実行時間   | 00:00:18.431077
実行クエリ | <IDLE> in transaction

プロセスを止めたい場合は、次のようにします。

db=# SELECT pg_cancel_backend("プロセスID");

"プロセス ID" に対象のプロセス ID を入れてください。

コマンドプロンプトの遅延環境変数

コマンドプロンプトで FOR ループなどを使っているときに 「あれ? 変数の値が変わらない??」ということがあります。

例えば、バッチファイルに次のように書いてあるとします。

FOR /F %%i IN ('SET') DO ECHO %%i 

これは、コマンド SET の実行結果をずらっと表示します。

この結果の件数を取得するためにカウンタを付けたとします。

SET COUNT=0
FOR /F %%i IN ('SET') DO SET /A COUNT=%COUNT%+1
ECHO %COUNT% 

上手く行きそうなのですが、結果は 1 が出力されます。

これは変数の“即時展開”というもので、 ループの中の %COUNT% が先に評価されてしまうので 結果的には次のような処理になってしまうためです。

SET COUNT=0
FOR /F %%i IN ('SET') DO SET /A COUNT=0+1
ECHO %COUNT% 

対応として“遅延環境変数”を使うという方法があります。

遅延環境変数は、名前の通り遅延して変数を評価してくれるわけですが デフォルトではオフ、CMD.exe のオプションやレジストリの変更や SETLOCAL での指定が必要になります。
(詳しくは CMD /? してください)

今回は SETLOCAL を使って見ます。

次のように SETLOCAL で enabledelayedexpansion を指定して ENDLOCAL で終わります。 ( ENDLOCAL は省略可です。)

さらに遅延評価する変数は "%" ではなく "!" で囲みます。

SETLOCAL enabledelayedexpansion
SET COUNT=0
FOR /F %%i IN ('SET') DO SET /A COUNT=!COUNT!+1
ECHO %COUNT%
ENDLOCAL

これで想定していた結果が返ります。
(試す場合はファイルに保存して実行してください)

遅延環境変数を使わないで CALL を使う方法もあります。

SET COUNT=0
FOR /F %%i IN ('SET') DO CALL SET /A COUNT=%%COUNT%%+1
ECHO %COUNT%

これでも同じ結果が返ります。
CALL の中で "%" が二重になっていることに注意してください。

PostgreSQL で使える算術演算子

PostgreSQL の SQL では色々な算術演算子が使えます。
今回はバイナリ演算子を除いたものを紹介したいと思います。

まずは四則演算。

db=# -- 和
db=# SELECT 1 + 1;

db=# -- 差
db=# SELECT 3 - 2;

db=# -- 積
db=# SELECT 4 * 6;

db=# -- 商
db=# SELECT 7 / 2;

商は、整数の割り算の場合、切り捨てになります。

他にも色々あります。
同じ計算をする関数と併せてどうぞ。

db=# -- べき乗
db=# SELECT 2 ^ 5;
db=# SELECT POWER(2, 5);

db=# -- 剰余(割り算の余り)
db=# SELECT 13 % 5;
db=# SELECT MOD(13, 5); 

db=# -- 平方根
db=# SELECT |/ 9;
db=# SELECT sqrt(9);

db=# -- 立方根
db=# SELECT ||/ 8;
db=# SELECT cbrt(8);

db=# -- 絶対値
db=# SELECT @ -4;
db=# SELECT abs(-4);

関数はありませんが、階乗の演算子もあります。
階乗の演算子は左右の 2 バージョンがあります。

db=# -- 階乗(左)
db=# SELECT !! 4;

db=# -- 階乗(右)
db=# SELECT 4 !;

コマンドプロンプトで計算する

コマンドプロンプトは計算もできます。

計算には、SET コマンドの /A オプションを使います。

C:\> SET /A RESULT=1+2*4+5
14

C:\> ECHO %RESULT%
14

直接実行した場合は、計算結果が出力されますが バッチファイルに書いた場合は出力されません。

演算子は次のものが使えます。

()                  - グループ化
! ~ -               - 単項演算子
* / %               - 算術演算子
+ -                 - 算術演算子
<< >>               - 論理シフト
&                   - ビット演算子 AND
^                   - ビット演算子排他的 OR
|                   - ビット演算子 OR
= *= /= %= += -=    - 代入
  &= ^= |= <<= >>=
,                   - 式の区切り記号 

">" が含まれる場合は リダイレクトにならないように ダブルクォーテーションで囲みます。

C:\> SET /A RESULT="14>>2"
3

代入する変数を宣言せずに、計算だけすることもできます。

C:\> SET /A 13*2+1
27

先頭が 0 の場合は、8 進数、0x の場合は 16進数になります。

C:\> SET /A 011+0xA
19

上の例は、10 進数の 9 と 10 を足しています。

コマンドプロンプトで文字列を置換する

コマンドプロンプトでも、簡単な文字列置換が可能です。

例えば、次のような変数 DATE を宣言します。

C:\> SET DATE=2010/03/20
C:\> ECHO %DATE%
2010/03/20

"/" を "-" に置換します。

C:\> ECHO %DATE:/=-% 
2010-03-20

書式は "%変数:置換される文字=置換する文字%" です。

"*" を使うと、"*" 以降が一致するところまでを置換できます。
ただし "*" は先頭にしか使えません。

C:\> ECHO %DATE:*/=YEAR%
YEAR03/20

上の例では、最初に出てくる "/" までを置換対象としています。

置換する文字列を指定しないと 空文字を指定したことになります。

C:\> ECHO %DATE:*/=%
03/20

Firefox で「戻る」したときも JavaScript を実行させる

Internet Explorer (6) では、前のページから戻った場合も JavaScript を再実行します。

例えば、次のようなスクリプトがある場合、 このページに「戻る」したときも、表示される時刻は更新されます。

document.write("<p>");
document.write(new Date());
document.write("<\/p>");

確認用デモ

しかし Firefox (3.6) では、スクリプトの状態を保存しているためか 再実行されません。

ところが、window.onunload を何か定義してやると 再実行されるようになります。

例えば、次のようなに window.onunload を足すと Firefox (3.6) でも時刻が更新されるようになります。

document.write("<p>");
document.write(new Date());
document.write("<\/p>");

window.onunload = function () {}

確認用デモ

ここでは window.onunload 空の関数をセットしていますが、内容のあるものでも OK です。

Excel でシートを Very 非表示にする

Excel では、メニューからシートを非表示にすることができます。

WRITE_0245_01

ただし、この方法の場合、簡単に再表示させることができます。

WRITE_0245_02

別の方法で、「再表示」を表示しないようにすることができます。

まず、どこからでも良いので(下の図は「コードの表示」)で Visual Basic Editor を起動します。

WRITE_0245_03

必要なのは、下の赤枠の「プロパティ ウィンドウ」なので 表示されて居ない場合は [F4] を押して表示します。

WRITE_0245_04

このプロパティウィンドウの一番下の項目に "Visible" があります。 このプロパティを "2 - xlSheetVeryHidden" に設定します。

WRITE_0245_05

これで、シートは非表示になり メニューから見ても「再表示」が不活性なままになりました。

WRITE_0245_06

ちなみに "Visible" プロパティですが、Excel のメニューから 通常のやりかたで非表示にした場合は、"0 - xlSheetHidden" になります。 Excel からでは、"-1 - xlSheetVisible" と "0 - xlSheetHidden" の 切り替えしかできないわけです。

Apache の prefork と worker

最近の(というほど最近では無いですが) Apache には 子プロセスの 扱いに prefork と worker の 2 種類があります。

設定ファイルにも prefork と worker の設定が入っています。

下は Debian (Apache 2.2.3) の設定ファイルです。

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

mpm は Multi Processing Module の略です。

自分の apache がどちらで動いているか 調べるためには 次のように モジュールを確認します。

$ /usr/sbin/apache2 -l

Compiled in modules:
  core.c
  mod_log_config.c
  mod_logio.c
  prefork.c
  http_core.c
  mod_so.c

prefork.c なら prefork 、worker なら worker.c です。

"-V" オプションで確認する方法もあります。

$ /usr/sbin/apache2 -V | grep MPM

Server MPM:     Prefork
 -D APACHE_MPM_DIR="server/mpm/prefork"

Linux で行数を取得する

Unix/Linux には wc というコマンドがあり 行数やバイト数、単語数を取得することができます。

$ wc -l test.txt
558 test.txt

"-l" のオプションで 行数を取得できます。

ファイルだけでなく、コマンドの結果を パイプで渡すこともできます。

$ cat test.txt | sort | wc -l
558

grep した結果が何件あるか、などにも使うことができます。

$ RESULT=`cat test.txt | grep keyword | wc -l`
$ echo $RESULT
32

PHP で CSV ファイルを読み込む

PHP には、CSV ファイルからデータを読み込むための fgetcsv という便利な関数があります。

CSV の文字列を分解する str_getcsv という関数もあるのですが こちらは PHP 5.3 以上からになっています。

というわけで、今回は fgetcsv を紹介します。

【参考サイト】
PHP: fgetcsv - Manual

Manual に載っている次のソースを試してみます。

<?php
$row = 1;
$handle = fopen("test.csv", "r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    $num = count($data);
    echo "<p> $num fields in line $row: <br /></p>\n";
    $row++;
    for ($c=0; $c < $num; $c++) {
        echo $data[$c] . "<br />\n";
    }
}
fclose($handle);
?>

CSV データは次のようになります。

"abc def","123",11,abc
"abc,def","12""3",11,abc

ダブルクォーテーションの間にカンマがあったり ダブルクォーテーションの中にダブルクォーテーションを付けたりしています。

結果は次のようになります。

 4 fields in line 1:
abc def
123
11
abc

4 fields in line 2:
abc,def
12"3
11
abc

カンマもダブルクォーテーションも問題なく読み込めています。

Excel で「名前」の一覧を貼り付ける

Excel で「名前」を付けていると 多くなりすぎて 何が何やらわからなくなるときがあります。 少なくとも私にはあります。

WRITE_0240_01

そんなときに、「名前」で定義されている内容を セルに出力する機能があります。

メニューから「挿入」→「名前」→「貼り付け」を選択します。

WRITE_0240_02

名前の貼り付けウィンドウが出てくるので 「リスト貼り付け (L) 」ボタンをクリックします。

WRITE_0240_03

カーソルの当たっていたセルに 「名前」のリストが出力されます。

WRITE_0240_04

Excel のワークシート関数 PHONETIC

以前、「 Excel の ふりがな」といネタを書きましたが この値を別のセルで取得するためのワークシート関数 PHONETIC があります。

使い方は次のように簡単です。

WRITE_0239_01

平仮名、片仮名は「ふりがな」の設定に依存します。

WRITE_0239_02

通常の「ふりがな」の表示と少し違うのは、 常にセルの文字全ての「ふりがな」が表示されることです。

WRITE_0239_03

左のセル内の「ふりがな」は、「ほんじつ」と「ひがら」だけですが 右の関数セルでは、「ほんじつはおひがらも」と表示されます。

IE で Office2007 形式をダウンロードすると zip になる

Vista 環境の IE 7 で Office2007 形式のファイル (.docs, .xlsx, .pptx) を ダウンロードすると zip ファイルとしてダウンロードされてしまう、という現象が発生しました。

WRITE_0238_01

Web サーバに Office2007 形式用の MIME タイプを設定しないと IE が勝手に中身を見て判断してしまうようです。

追加する MIME タイプは以下のようになります。

Word .docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
Excel .xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
PowerPoint .pptx application/vnd.openxmlformats-officedocument.presentationml.presentation

【参考サイト】
Microsoft - サード パーティのサーバー上のファイル拡張子を登録します。

設定すると Office のドキュメントとして認識されるようになります。

WRITE_0238_02

Word の表に行番号を付ける

Excel では、表に簡単に行番号を付けることができます。

WRITE_0237_01

Word では Excel のように簡単にはいきませんが アウトラインや段落番号のように自動で番号を付ける機能があるので それを利用して表に行番号を付けてみたいと思います。

このような結果になります。

WRITE_0237_02

まず、次のようなスタイルを作成します。

WRITE_0237_03

後は空の列にスタイルを適用するだけです。

WRITE_0237_04

面白いのは、列を挿入した場合は 自動で番号が付きます。

WRITE_0237_05

セルを結合した場合も 自動で番号が減ります。

WRITE_0237_06

表を増やすと前の番号の 続きになってしまうことがあります。

WRITE_0237_07

そういう場合は 新しく番号を始めたいセルを選択して 「書式」メニューから「箇条書きと段落番号」を選択します。

WRITE_0237_08

ここで「リストの番号」の「番号を振り直す」を選択します。

次のようになります。

WRITE_0237_09

ちょっとクセはありますが、慣れればとても便利です。
サンプルを上げておきます。

Google サイト内検索

Amazonアソシエイト