OpenSolarisってカナリアかい?

節分は、中国宮廷の重要な年中行事とされていました。日本では、冬と春を分ける 大切な催しとして、古くから行われてきました。

氷川神社では、福は内、鬼は外と言うのを、聞き違えて集まってきた鬼に、するめと豆を渡して お引取り願ったとか。 商家では、鬼は外と言う所を、大荷はうち と言って、商売繁盛を願ったとか。

田舎では、撒いた豆を歳の数だけ拾って食べると、健康になるとかでした。子供ですから 一杯食べて、ギネスの長寿記録を楽々と破ったものです。女房に聞いたら、豆をその まま食べると不潔だから、殻付きのピーナッツで、豆撒きをしたとか。

それから、節分には、トロロを食べる習慣がありました。このいわれは知らないのですが 、多分ねちっこく生きろ との教えなんでしょうかね。このおかげかどうか分かりませんが、 結構ねちっこく技術を追求したりして、役立っていますよ。

節分は、幼稚園とかでも絶好のイベントらしく、福や鬼の仮面を作って、 日本人になる訓練をするみたいです。豆撒きをやっている時、ある園児が、鬼さん外に 追い払ったらかわいそう と、泣き出してしまったとか。

こういう、やさしい心を持って大人になって欲しいものです。

廃棄処分

すっかり、VMWAREの仮想化戦略に乗せられてしまい、サーバー?の集約化が完了した。 すると、使わなくなった古いマシンが残ってしまう。何とかしなければ。 棄却対象は、Debianを入れていたDeskTop機と標準入力がハード的にいかれてしまった NotePC。

まず処分する戦略を考えた。DeskTop機は、まがりなりにも使えるからリサイクル屋行きだな。 NotePCは、リサイクルって訳にもいかんだろう。ちと、頭が痛い。

Debianの方は、使っていた痕跡を消す必要があるな。ネットを探してクリーナーソフトを 入手すればいいんだろうけど、FDDから起動すんの? それともCDに焼いてから? もう FDDメディアなんて無いしな。。。

しょうがない、自前でやるか。/var/log/の中のファイル全てを /dev/nullしたよ。 行儀の悪いプログラムが、/tmpや/var/tmpにファイルを残してると思って点検、そして 削除。/usr/localは全部削除。/homeの下はばっさり削除。rootの所は、ドットファイルも 含めて削除。

そして、updatedb。小さなrubyスクリプトで、1Mのランダムデータが入ったファイルを 作成。そのファイルを、shスクリプトを使って、名前を変えながら増殖。この作業はroot でやっているので、Disk Fullを喰らうと、dfで見た時、Disk利用率が106%ぐらいに なってて、面白い。こういう事を、種のファイルを変えて3回実施。

最後は、ddを使って、Disk一面をZEROクリアしましたよ。オマケで、戸籍謄本から(password) アカウントを削除。rootのアカウントをロックしておきました。今考えるに、/bin/sh(bash)も削除しておけば良かったかな? 査定人の前で このパソコンは動いてますって所を見せてあげないといけないので、微妙なんだよなー。 余り大胆な事も出来ないし。そんなこんなで、ドーと、疲れてしまいましたよ。

リサイクル屋に持ち込んだら、500円ですって。古いからなあ。査定してる間、店内を うろうろしてたら、こういうセットがジャンクと称して2000円で売ってたよ。一応商品 として値札が付いてるって事は、需要あるんだな。

帰りしな、NotePCも引き取って貰えるって聞いてみると、価値はハードディスクぐらい かなあ、ですって。お宝(の個人情報)狙いでしょうかね。こりゃ、断念するしか。だって、HDDをクリア する余裕すら無く、逝っちまったNotePCだものなあ。

マシンの余裕があれば、HDDを引っこ抜いてクリアするっていう手もあるけど、今回は そういう事も出来ない。もうHDDを物理的に破壊する鹿。

大きなトンカチで一撃ですかね。これ実に分かり易い方法なんですが、肝心のトンカチが 無いよ。次なる方法は、キュリー点以上に暖めるかだな。あれ? 何度だろう? そもそも バーナーなんて無いよ。

そうなると、HDDを腐食させちゃうか。米酢かなにかに漬けておけばいいんだな。 ただ漬けておくより煮るのがbetter。アレニウスの化学式によれば、温度が10度か上昇 すると、化学的活性度と2倍になるとか。でも、酢は 高いから断念。

後は、塩水で煮ちゃうか。女房が秘蔵してる、赤い岩塩なんか使うと怒られ そうだし、伯方の塩も勿体ない。ここは、粗塩で十分だろう。空き缶にHDDを入れ、HDDがひたひたになるぐらいの 水を入れてから、塩を大さじ一杯。以上を、ストーブにかけて、ことこと煮てあげましょう。 おっと、この時塩分がHDDの中まで浸透するように、封止シールは必ず剥がしておきます。 お好みで、砂糖を加えてもいいでしょう。レモン煮もお勧めです。

本当は、フィッシャークッカー法に習って、圧力釜で煮るのが一番なんですがね。 あれ? フィシャークッカー法って、ICの気密試験だったかな。円盤のダメージ試験 になるのか? とにかく磁性箔が腐食すればいいんだよな。ベアリングが回らなくなる ぐらいのダメージは与えられただろうに。そうなれば、円盤も正常には回転出来ない だろうから、頼みの綱のフレミングの法則も有効に働けなくなる。心配なら、酢漬けで完璧。我ならが、ねちっこいなあ。

冷めたら乾燥させ、本体に戻しておこう。 後は、時々回ってくる、何でも引き取りますに渡して終了、かな。

Solarisってやっぱり鈍重?

前回、OpenSolaris上で、/dev/audioを呼び出してモールス音を発生させるプログラムを 書いた。結果は、時々雑音が混じるというちょっと悲惨な状態だっだ。 同じプログラムをFreeBSDに持ってきて実行したら、雑音が混じる事なく綺麗に再生して くれた。

なんで、こんな差が出るの? とろろのように、ねちっこく考えてみる。 鬼は、こいつかな。

void tone(short *buf, int n){
  int cnt;

  cnt = dot * n;
  while( cnt-- ){
     write(fd, buf, sizeof(short) * SIZE);
  }
}

dotには、2ms周期の波形を幾つ結合するかを決める数値が入っている。dashの場合は nに3が入ってくるので、3倍の個数になるんだ。dotが50だと、50回、writeのsystem callが 発行される。

この呼び出し回数に悲鳴を上げて、ノイズが発生するんだな。FreeBSDは(多分)このあたりが 軽く作られているんで、デバイスへのデータ転送が途切れる事なくいくのだろう。 期せずして、鈍重さを音で聞いてしまったのか。いろいろなOSが有ると、鬼も隠れ場所が 無いな。

多様性は善! 右を向いても左を見ても、intelのDNA入りCPUじゃ、core(反吐)しちゃうぞ。 Windowsとそのコピー風味のやつも同罪。

ああ、またつぶやいてしまった。話題を戻して、そなら、改善策は?

システムコールの回数を減らすしかないな。dotが50なら、あらかじめ50個分の波形を用意して おいて、それを1回のシステムコールで転送する。dashだとその3倍になるから、大は小を 兼ねるって事で、dash数分のデータを用意しておいて、dotの場合は、そのエリアの1/3 だけを転送する。

// mosc (Morse tone generator) for OpenSolaris
// Usage: echo morse-data | ./mosc
// Data mean  0:end, 1:dot, 2:char sep, 3:dash, 4:word sep
// dot-speed(in MS) can change by env-name ".SPEED"

#define SIZE 16                // point number for 8000Hz / 500Hz
#define SPDNAME "dotSPEED"     // env-name for dot-speed
#define DEFSPEED 80            // default dot-speed in [ms]

#include <sys/audio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>

int fd,dot;
short int mrk[SIZE] = {
   0,11987,22229,29233,31980,30070,23780,14027,
   2232,-9888,-20569,-28254,-31824,-30760,-25216,-16000
};
short int sps[SIZE] = { 0 };

int setup_audio(){
  int fd;
  struct audio_info info;

  fd = open( "/dev/audio", O_RDWR );
  if ( fd < 0 ) {
    fprintf( stderr, "Failed to open file\n" );
    exit(1);
  }

  if ( ioctl( fd, AUDIO_GETINFO, &info ) < 0 ) {
    fprintf( stderr, "Failed to get audio info\n" );
    exit(2);
  }

  info.play.sample_rate = 8000;
  info.play.channels = 1;
  info.play.precision = 16;
  info.play.encoding = AUDIO_ENCODING_LINEAR;
  info.play.gain = 250;
  info.play.port = AUDIO_HEADPHONE;
  if ( ioctl( fd, AUDIO_SETINFO, &info ) < 0 ) {
    fprintf( stderr, "Failed to set audio info\n" );
    exit(3);
  }

  return fd;
}

void fill(short *buf, short *seed, int n){
  int cnt;

  cnt = dot * n;
  while( cnt-- ){
     memcpy(buf, seed, sizeof(short) * SIZE);
     buf +=  SIZE;
  }
}

main(int argc, char *argv[]){
  int c;
  short int *bufmrk, *bufsps;

  dot = getenv(SPDNAME) ? atoi(getenv(SPDNAME)) : DEFSPEED;
  dot = dot >> 1;
  bufmrk = malloc(sizeof(short) * SIZE * dot * 3);
  bufsps = malloc(sizeof(short) * SIZE * dot * 4);
  fill(bufmrk, mrk, 3);
  fill(bufsps, sps, 4);

  fd = setup_audio();
  while( c = (getchar() - '0') ){
    if ( c == 1 || c == 3 ){
         write(fd, bufmrk, sizeof(short) * SIZE * dot * c);
         write(fd, bufsps, sizeof(short) * SIZE * dot);
    } else {
         write(fd, bufsps, sizeof(short) * SIZE * dot * c);
    }
  } 
  close(fd);
  free(bufmrk);
  free(bufsps);
  exit(0);
}

書いてみた。鳴らしてみた。綺麗なモールス音が聞こえたよ。正弦波を16個のデータに してしまうと、総合THDはどれぐらいになるのだろう? こういうのの計算式ってあるのかな? 教えてください。 > えらい人。

OpenSolarisって、カナリアかい?

とまあ、一応の解決を見たわけであるが、自分の未熟さを吸収してくれるFreeBSDとどんくささを 露呈してしまうOpenSolarisと性格が違ってて面白いね。

昔、炭鉱で発生する有毒ガスをいち早く検出するために、鉱夫さん達はカナリアを連れて、 構内に入ったとか。

ちょっとした書き方の違いで根を上げてしまうOpenSolarisは、私用のカナリアだな。 場合によっては、カナリア死して、coreを残す。検視ツールは充実してるのだろうか?