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 のコマンド置換には、"`" (バッククォート)を使う形式と "$()" を使う形式の 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 で [End] キーは、ちょっと変わった移動です。
Excel では、次のように 「入力された一番右の列」「入力された一番下の行」の 交わるセルを、最終有効セルとして記憶しています。
デフォルトでは、最終有効セルまでが印刷範囲になります。
[Ctrl]+[End] は、カーソルを最終有効セルに移動させます。
最終有効セルがどこにあるかわからなくなったときや データの最終行に移動したいときに便利です。
ちなみに、入力した値をクリアしても「入力された一番右の列(下の行)」は変わりません。 最終有効セルを内側に移動させるためには、行や列を削除します。
次に [End] キーだけを 1 回押すと、 右下に次のように "END" と表示されます。
この状態で カーソルキーを押すと
その方向に大きく移動します。
移動する内容は [Ctrl]+[カーソル] と同じです。
黄緑がカーソルの現在の位置、黄色が各方向の移動です。
値の入ったセルがなければ 行や列の先頭や後尾に、 値の入ったセルがあれば、連続して値の入っているセルの端に カーソルを移動させます。
カーソルの代わりに [Home] を押すと [Ctrl]+[End] と同じで 最終有効セルに移動します。
これら同じ動きの移動コマンドがあるので 自分が使い易いものを選んで覚えると良いと思います。
次のような変数があります。
$ K="abc def gh"
wc コマンドで文字数を取得できますが echo するだけでは行末に改行が入ってしまうので "-n" オプションを付ける必要があります。
$ echo -n $K | wc -m
10
その他に "#" を付ける方方もあります。
$ echo ${#K}
10
"#" は、変数が配列の場合は要素数が取得できますが 変数が文字列の場合、文字数を取得することもできます。
$ K="あいう" $ echo ${#K} 3
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 の 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
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 では、メニューからシートを非表示にすることができます。
ただし、この方法の場合、簡単に再表示させることができます。
別の方法で、「再表示」を表示しないようにすることができます。
まず、どこからでも良いので(下の図は「コードの表示」)で Visual Basic Editor を起動します。
必要なのは、下の赤枠の「プロパティ ウィンドウ」なので 表示されて居ない場合は [F4] を押して表示します。
このプロパティウィンドウの一番下の項目に "Visible" があります。 このプロパティを "2 - xlSheetVeryHidden" に設定します。
これで、シートは非表示になり メニューから見ても「再表示」が不活性なままになりました。
ちなみに "Visible" プロパティですが、Excel のメニューから 通常のやりかたで非表示にした場合は、"0 - xlSheetHidden" になります。 Excel からでは、"-1 - xlSheetVisible" と "0 - xlSheetHidden" の 切り替えしかできないわけです。
最近の(というほど最近では無いですが) 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"
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 ファイルからデータを読み込むための 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 で「名前」を付けていると 多くなりすぎて 何が何やらわからなくなるときがあります。 少なくとも私にはあります。
そんなときに、「名前」で定義されている内容を セルに出力する機能があります。
メニューから「挿入」→「名前」→「貼り付け」を選択します。
名前の貼り付けウィンドウが出てくるので 「リスト貼り付け (L) 」ボタンをクリックします。
カーソルの当たっていたセルに 「名前」のリストが出力されます。
以前、「 Excel の ふりがな」といネタを書きましたが この値を別のセルで取得するためのワークシート関数 PHONETIC があります。
使い方は次のように簡単です。
平仮名、片仮名は「ふりがな」の設定に依存します。
通常の「ふりがな」の表示と少し違うのは、 常にセルの文字全ての「ふりがな」が表示されることです。
左のセル内の「ふりがな」は、「ほんじつ」と「ひがら」だけですが 右の関数セルでは、「ほんじつはおひがらも」と表示されます。
Vista 環境の IE 7 で Office2007 形式のファイル (.docs, .xlsx, .pptx) を ダウンロードすると zip ファイルとしてダウンロードされてしまう、という現象が発生しました。
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 のドキュメントとして認識されるようになります。
Excel では、表に簡単に行番号を付けることができます。
Word では Excel のように簡単にはいきませんが アウトラインや段落番号のように自動で番号を付ける機能があるので それを利用して表に行番号を付けてみたいと思います。
このような結果になります。
まず、次のようなスタイルを作成します。
後は空の列にスタイルを適用するだけです。
面白いのは、列を挿入した場合は 自動で番号が付きます。
セルを結合した場合も 自動で番号が減ります。
表を増やすと前の番号の 続きになってしまうことがあります。
そういう場合は 新しく番号を始めたいセルを選択して 「書式」メニューから「箇条書きと段落番号」を選択します。
ここで「リストの番号」の「番号を振り直す」を選択します。
次のようになります。
ちょっとクセはありますが、慣れればとても便利です。
サンプルを上げておきます。