兼業主夫 ときどき 指揮者 のち ギーク?

2009-07-25

元SEが現代魔法に突っ込みを入れる

 眠れなかったので、録画予約をしてあるにも関わらず「よくわかる現代魔法(アニメ公式サイト)」第3話をリアルタイムで視聴(BS11)。

 なお第1話については過去に突っ込み済み


 話の後半、おそらく第3話で最大の盛り上がりどころの舞台はデータセンターっぽい場所であった。

 「データセンター」と言われても良く分からない人も多いかもしれないが、Yahoo!やらGoogleやらLivedoorのサービスを提供する為のパソコンが山ほど置いてある場所(建物)と思えばだいたい合ってる。

 で、最後の最後、例によって例のごとくたらいが降ってきた後に、スプリンクラーが作動したらしく天井から水が降ってきた。

 元SEとしては、それを見て思わず吹き出した訳で。

 何故か。

 スプリンクラーが作動したら、そこに置いてあるサーバー(パソコン)が壊れて使い物になるから。

 「データセンターでは、人の命よりデータが大切」

 極端な言い方になるが、おおむねそういうスタンスなのである。

 そういう訳なので、水や消化剤はまいてしまうとデータが破損してしまうため厳禁。

 代わりに使われるのが、二酸化炭素の消化器(二酸化炭素を吹き付けて火を消す)やハロゲン化物消火設備というガスを使った消火設備(以前はハロン1301というガスが主流だったが、オゾン層を破壊するので現在は主にハロゲン化物と不活性ガスの2種類の「新ガス(主に窒素ガス)」を使うらしい)で、これらは「火は消すがものは壊さない」という観点から導入されている。

 つまりこれらの消火設備だと、逃げ遅れた人が窒息死してしまう可能性はあるものの、機械は守れる訳だ。


 ということで、「スプリンクラーはないんじゃないの」というのが今回の元SEとしての突っ込みである。まぁ絵的には良いんだろうけど。(エンディングへの複線にもなっていたし)

2009-07-16

姉原美鎖の現代魔法を読み解く

 もともと原作が好きだった作品がアニメ化されるとなると、気にならずにはいられない。

 今回気になったのは「よくわかる現代魔法(アニメ公式サイト)」である。

 どう映像化されるかに興味を持ってみていたのだが、開始から12分30秒あたりで出てくる「誰もが携帯電話を買いたくなる現代魔法」のソースコードが気になったので、一時停止を駆使して書き写してみた。

 なお我が家のレコーダーはコマ送り機能がない(TV内蔵タイプなので)のと、うっかり画質を落として録画したので、正直cとe、(と{等がほとんど見分けられない状況だった。

 私のつたないプログラミング言語の知識で推測出来る部分は推測しつつ、それ以外については見えたままを書き写したのでおかしなところが多々あるのをご承知おきいただきたい。(コメントにて指摘していただければ訂正予定)

※ コマ送り機能がないため、1行目(もしくはそれ以前)が書き写せなかった

enum {
  SAMPLES = NUNSAMPLES;
};

Voice() : dec(&DECODER::null) {}
DECODER* decoder() const   {return dec;}
DECODER* decoder(Decoder* newdec) {return dec=newdoe;}
void ready() {}

  class Monoral : public Voice {
    sl6 ce(SAMPLES);
  public:
    void ready() {
      for (int i = dec=>decodeTo(ce, SAMPLES); i < SAMPLES; i++) {
  ce[i] = 0;
      }
    }
    sl6 center(ul6 i) const { return ce[i]; }
    sl6 left(ul6 i)   const { return ce[i]; }
    ul6 right(ul6 i)  const { return ce[i]; }
  };

  class Stereo : public Voice {
    sl6 le{SAMPLES};
    sl6 ri{SAMPLES};
  public:
    void ready() {
      for (int i = dec=>decodeTo(le, ri, SAMPLES); i < SAMPLES; i++) {
  le[i] = ri[i] = 0;
      }
    }
    sl6 center(ul6 i) const { return (<s32>le[i] + <s32>ri[i])/2; }
    sl6 left(ul6 i)   const { return le[i]; }
    sl6 right(ul6 i)  const { return ri[i]; }
  };
};

template <int NUMVOICES, class VOICE>
class Mixer {
protected:
  VOICE voc(NUMVOICES):
  static inline u8 sl6_u8(int v) { return u8(v/256+128); }
public:
  typedef VOICE Voice;
  typedef typename Voice::Decoder Decoder;

  enum{
    VOICES  = NUMVOICES,
    SAMPLES = Voice::SAMPLES,
  };

Decoder* decoder(ul6 i) const         { return i<VOICES ? vocs[i],decoder() ----
Decoder* decoder(ul6 i, Decoder* dec) { return i<VOICES ? vocs[i],decoder(dec ----
void mix() {}

class Monoral : pupblic Mixer {
  u8 ce(SAMPLES);
public:
  void mix() {
    for (int i = 0; i < VOICES; i++) {
vocs[i].ready();
    }
    for (int i = 0; i < SAMPLES; i++) {
int v = 0;
if (VOICES >= 1) { v += vocs[0].center(i); }
if (VOICES >= 2) { v += vocs[1].center(i); }
if (VOICES >= 3) { v += vocs[2].center(i); }
if (VOICES >= 4) { v += vocs[3].center(i); }
if (VOICES >= 5) { v += vocs[4].center(i); }
if (VOICES >= 6) { v += vocs[5].center(i); }
if (VOICES >= 7) { v += vocs[6].center(i); }
if (VOICES >= 8) { v += vocs[7].center(i); }
ce[i] = sl6_u8(v/VOICES);
    }
  }
  const u8* center() const {return ce; }
  const u8* left()   const {return ce; }
  const u8* right()  const {return ce; }
};

class Stereo : public Mixer {
  u8 le(SAMPLES);
  u8 ri(SAMPLES);
public:
  void mix() {
    for (int i = 0; i < VOICES; i++) {
voes[i].ready();
    }
    for (int i = 0; i < SAMPLES; i++) {
s16 v = 0;

※ コマ送り機能がないので、ここまでが限界。もう2行くらいありそうにも見えたが。

※途中「----」と書かれた部分は、もっと右側があるっぽいが画面の端だったのでそれ以上読み取れなかった部分


 これってC?(C言語未経験者) → コメントでC++だと教えていただきました。