msgbartop
だめでつれづれな日記
msgbarbottom

20 3月 12 Windowsでファイル中の文字を検索する方法

私はLinux/Solarisを使ったシステム構築や開発を行うことが多いのですが、普段使っているクライアントはWindowsです。Windowsでgrepみたいなコマンドないのかなと思っていたら、ありましたね。「findstr」コマンド。

正規表現も使えるし。

> findstr -?
ファイルから文字列を検索します。

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P]
        [/F:ファイル] [/C:文字列] [/G:ファイル] [/D:ディレクトリ一覧]
        [/A:色属性] [/OFF[LINE]] 文字列 [[ドライブ:][パス]ファイル名[ ...]]

  /B           行の先頭にあるパターンを検索します。
  /E           行の末尾にあるパターンを検索します。
  /L           検索文字列をリテラルとして使用します。
  /R           検索文字列を正規表現として使用します。
  /S           現在のディレクトリとすべてのサブディレクトリから一致する
               ファイルを検索します。
  /I           検索するときに大文字と小文字を区別しません。
  /X           完全に一致する行を出力します。
  /V           一致しない行のみを出力します。
  /N           一致する各行の前に行番号を出力します。
  /M           ファイルに一致する行があるときに、ファイル名のみを出力します。
  /O           一致する各行の前に文字オフセットを出力します。
  /P           印刷不可能な文字を含むファイルをスキップします。
  /OFF[LINE]   オフライン属性が設定されたファイルをスキップしません。
  /A:属性      2 桁の 16 進数で色属性を指定します。"color /?" を参照してくだ
               さい。
  /F:ファイル  指定したファイルからファイル一覧を読み取ります (/ を指定する
               とコンソール)。
  /C:文字列    指定された文字列をリテラル検索文字列として使用します。
  /G:ファイル  指定されたファイルから検索文字列を取得します (/ を指定する
               とコンソール)。
  /D:ディレクトリ
               セミコロンで区切られた検索されるディレクトリ文字列テキストの
               一覧を検索します。
  [ドライブ:][パス]ファイル名
               検索するファイルを指定します。

複数の文字列を検索する場合には、引数 /C を使わず、各文字列をスペースで区切り
ます。
たとえば、FINDSTR "hello there" x.y と指定した場合は、ファイル x.y で "hello"
または "there" が検索されます。
これに対して、FINDSTR /C:"hello there" x.y と指定した場合はファイル x.y で
"hello there" が検索されます。

正規表現クイック リファレンス:
  .            ワイルドカード: 任意の文字
  *            繰り返し: ゼロ個以上の直前の文字またはクラス
  ^            行位置: 行頭
  $            行位置: 行末
  [class]      文字クラス: セットの任意の 1 文字
  [^class]     逆クラス: セット以外の任意の 1 文字
  [x-y]        範囲: 指定した範囲の任意の文字
  \x           エスケープ: メタ文字 x のリテラル使用
  \<xyz        単語位置: 単語の先頭
  xyz\>        単語位置: 単語の終わり

FINDSTR の詳細な正規表現に関しては、オンライン ヘルプのコマンド リファレンスを
参照してください。

 

16 1月 12 tarコマンドの–newer-mtimeオプション

CentOS5に付属しているtarコマンド(GNU tar)が高機能で、ある日付以後に修正が入ったファイルだけをバックアップするというオプションがついています。–newer-mtimeオプションというやつです。

以下、man tarを抜粋

       --newer-mtime DATE
              like --newer, but with a DATE

例えばこのコマンドを使って、2012/01/01以後に出力されたログファイルだけを対象にバックアップを取得するには以下を実行すればいいわけです。

$ tar cvfz /var/tmp/backup.tar.gz --newer-mtime 2012-01-01 /var/log

16 1月 12 Windows(cygwin)でのrsync

Windows 7からFreeBSDに対して差分バックアップを取得したかったので、rsync(cygwin)を導入しました。導入は至ってかんたんで、cygwinのsetup.exeから導入しました。

ただ普通にバックアップしようとすると、以下のエラーが出て困りました。。

$ rsync.exe -avz --delete  /cygdrive/d/Java/ www.example.com:/backup/Java
sending incremental file list
created directory /backup/Java
./
rsync: failed to modify permissions on "/backup/Java.": Permission denied (13)
rsync: opendir "/backup/Java." failed: Permission denied (13)
apache-maven-3.0.3/

cygwin上ではWindows上のパーティション(Cドライブとか)は/cygdrive/c配下にマウントされますが、cygdrive上のパーミッションが以下のように見えていて、ディレクトリが権限不足になることが原因のようですね。ま、環境によると思います。

d---------+ 1 ????????       ????????             0 Mar 21  2011 Program Files
d---------+ 1 ????????       ????????             0 Sep 24 15:44 tmp
d---------+ 1 ????????       ????????             0 Oct 16 15:34 Java
d---------+ 1 ????????       ????????             0 Dec 18 22:00 Program Files (x86)

今回は以下chmodオプションで回避しましたが、少々ださいな・・・

rsync.exe -avz --delete --chmod=u+rwx /cygdrive/d/Java/ www.example.com:/backup/Java

04 1月 12 CakePHPでのキャッシュコントロール

Webアプリケーションではキャッシュさせない実装が割と多いと思います。

CakePHP 1.3の場合、boforeFilter()に$this->disableCache()を追加するだけでキャッシュを無効化できるから楽ちんですね。ちなみにソースは以下。cake/libs/controller/controller.phpに書いてます。

function disableCache() {
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
}

Cache-Control: post-check/pre-checkの意味はMSDN参照。

Cache-Control: no-store, no-cache, must-revalidate/Pragma: no-cacheはIPA参照。

03 1月 12 FreeBSD 9.0 RELEASEがでるぞー

FreeBSD 9.0 RELEASEが 2012/01/06付けで出るようですね。

タグをRELENG_9_0_0_RELEASEでcsupしたらダウンロードできたし、/usr/src/UPDATINGファイルには以下の記述が。

20120106:
        9.0-RELEASE.

ただいま、BUILD中。

11 12月 11 FreeBSDのCVSタグ

このホストはFreeBSD-9.0をcsup経由でbuildして使っていますが、freebsd-updateでRELEASE-9.0等にアップデートしようとすると以下のエラーが出たので。。。

# freebsd-update fetch
Looking up update.FreeBSD.org mirrors... 4 mirrors found.
Fetching public key from update4.FreeBSD.org... failed.
Fetching public key from update5.FreeBSD.org... failed.
Fetching public key from update3.FreeBSD.org... failed.
Fetching public key from update2.FreeBSD.org... failed.
No mirrors remaining, giving up.

freebsd-updateはRELEASE間のアップデートには対応しているけどstable -> releaseって対応していないんですね。

なので、csupでreleaseに対応するstableを引っ張ってくる方法を探していました。

FreeBSDのページにCVS tagというところがあり、ばっちり書いていますね。参考になりました。

20 11月 11 FreeBSD 9.0(PRERELEASE) on ZFS root

FreeBSD 9.0 (PRERELEASE) on ZFS rootにチャレンジしてみました。安定して動くのでおすすめですね。早くインストーラがZFSインストールに対応してくれればいいのにな。

http://wiki.kinusati.net/index.php/FreeBSD:FreeBSD9.0(amd64)_on_ZFS

03 10月 11 VMware Playerのサービス化

sexeを使うと簡単にVMware Playerをサービス化できます。

1. sexeをインストール

2. sexeを起動してサービスを登録。起動時オプションにVMXファイルのパスをフルパスで指定する必要があります。登録が終わったらOKボタンを教えてください。

3. サービスの画面から、アカウントでログオンする設定を追加する。

これで無事登録完了です。自動起動はすてきです。

 

03 10月 11 MySQL4.0以前に作成したアカウントがMySQL5.5で利用できない

MySQLを5.5にバージョンアップしたら、PHP経由でデータベースに接続できないという不具合にぶち当たりました。

よくよく調べてみると、MySQL4.0以前に作成したアカウントだけ接続できない模様。

http://dev.mysql.com/doc/refman/5.5/en/old-client.html

C.5.2.4. Client does not support authentication protocol
MySQL 5.5 uses an authentication protocol based on a password hashing algorithm that is incompatible with that used by older (pre-4.1) clients. If you upgrade the server from 4.0, attempts to connect to it with an older client may fail with the following message:
...

とりあえず平文パスワードはわかったので、パスワードを再設定して事なきを得ました。パスワードをリセットする方法もあると公式ページで書いているので間違いないでしょう。

Reset the password to pre-4.1 style for each user that needs to use a pre-4.1 client program. This can be done using the SET PASSWORD statement and the OLD_PASSWORD() function:

mysql> SET PASSWORD FOR
    -> 'some_user'@'some_host' = OLD_PASSWORD('newpwd');
Alternatively, use UPDATE and FLUSH PRIVILEGES:

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd')
    -> WHERE Host = 'some_host' AND User = 'some_user';
mysql> FLUSH PRIVILEGES;
Substitute the password you want to use for “newpwd” in the preceding examples. MySQL cannot tell you what the original password was, so you'll need to pick a new one.

03 10月 11 Linuxのcron

Solarisと違って、Linuxのcronで「%」(パーセント)を利用するためにはエスケープしないとダメなんですね。はまりました。

$ man 5 crontab
...
「 第 6」フィールド (行の残りの部分) には実行されるコマンドを指定する。その行のコマンド部 (改行文字ま
たは % 文字まで) が /bin/sh (またはその crontab ファイルの SHELL 環境変数で指定されたシェル) によって
実 行される。コマンド中にパーセント記号 (%) がバックスラッシュ (\) によってエスケープされずに置かれて
いると、改行文字に置き換えられ、最初に現れた % 以降の全てのデータは標準入力としてコマンドに送られる。

覚えておきましょう。