「引数が大きすぎる」を回避するためのxargs

バイト先で、10万ファイルほど置かれたディレクトリ上で下記コマンドを実行したらエラーになりました。

$ mv * ../other_dir/
引数が多すぎます

シェルがワイルドカードを展開した後の引数文字列が長すぎるのが原因でした。シェルがforkした後、mvをexecするところでエラーになるらしいです。
下記コマンドで回避できました。

$ find . -type f | xargs -i mv {} ../other_dir/

xargsは前から使ってたんですが{}でパイプで受け取った文字列を指定できるのは知らなかったなあ。

fgetsがfgetsに見えなくなる時@PHP

外部プロセスをpopenで起動してfgetsする際、1行単位で文字列取得しなくなるコード例。単なるメモ。

PHPプロセス側をノンブロッキング設定する*1のに加えて、外部プロセス側の標準出力行バッファリングが無効になってないといけない*2

PHPコード(code.php)、

<?php
$res = popen("./a.out", "r");
stream_set_blocking($res, 0);
for(;;){
  $str = fgets($res);
  var_dump($str);
  sleep(1);
 }
?>

外部コード(code.c)、

#include <unistd.h>
#include <stdio.h>

int main(){
  int cnt = 0;
  setvbuf(stdout, 0, _IONBF, 0);
  for(;;){
    if(++cnt == 5){
      cnt = 0;
      printf("b\n");
    }else{
      printf("a");
    }
    sleep(2);
  }
}

実行例:

$ gcc code.c
$ php code.php
string(1) "a"
bool(false)
string(1) "a"
bool(false)
string(1) "a"
bool(false)
string(1) "a"
bool(false)
string(2) "b
"
bool(false)

自宅サーバの電気代

最近、自宅に置いてあるサーバの電気代というリアルマネーコストが気になってきました。

そこで、エコワットを使って月額の電気代を調べました。その結果が以下になります(サーバは2台あるので両方の結果を載せてます)。

  • デスクトップサーバ (FreeBSD)
    • Pentium3 733MHz
    • HDD: Hitachi HDS721616PLAT80を2台
    • 電気代:月834円
  • Let'note T2サーバ (Linux)
    • PentiumM 1.20GHz
    • HDD: TOSHIBA MK4025GASL&外付けHDD
    • 電気代:月313円

両サーバとも、ディスプレイは使っていません。
合計、月額1150円かあ。サーバはLet's noteだけにしようかな。

各種言語の文法

所用で、各種言語の文法がBNFとかで書いてあるサイトを探しました。
忘れないように、ここにメモります。

なお、正確な言語文法が知りたい方は、それぞれの言語仕様書を見た方が良いです。上記リンク先は、ある程度文法がわかればよい人向けです。

*1:PHPの場合、言語仕様では文法が決まってないそうです。リンク先は、有志の人がそれっぽく作った文法ということになります。

英語学習サイトiknow

最近、英語の勉強をしようとiknowを始めました。詳しくは下記リンク先をどうぞ。

http://www.iknow.co.jp/

個人的には脳トレに近いノリを感じています。導入はスムーズにできますが、継続してやれるかは、私のモチベーション次第ですね(当たり前か・・・)。

とりあえず、TOEICチャンネルの「まずは!TOEIC基礎・総仕上げ」をやってます。難易度が高いチャンネルにも興味があったので、ためしに、留学実現チャンネルのdictationをやってみたら、文章が長すぎて挫折しました・・・。

iknowは現在無料です。収入は広告費と有料サービスから得るそうですが、どの程度うまくいくのかが気になるなあ。

http://www.iknow.co.jp/free