高専カンファレンス in 福井2(fukui089)

参加して来ました

カンファ前日

名鉄バスセンター行きの市バスが遅延して, 間に合うかひやりとしながら, 高速バスで福井に帰国しました. 今年初めて雪見た. さらに親のお金で回るけど一皿108円以下じゃない寿司が食えて満足しました.

当日

ひさしぶりに@rch850さんとか@hidden_xvさんとか@aranagiさんとか@SNpyrrhulaとか@yu_suke1994とか@n0_h0君とか@Hino_cat君ににあったり、死後裁きに会う方(@cyclonext01)に実際にあったりとか出来ました.

見せる機会が重要, 見せる場所はある

@rch850さんの発表で始めてazure webでタダでwebサーバーが建てれるとかherokuとかあるのを知った. (このブログが動いているVPS借りなくてよかったんじゃないか説が急速に持ち上がったけど身内のボイスチャット(team speak3)サーバーとして生きてるので良しということにしたい)
@hidden_xvさんのMashup Award推しの発表で, 出てきたご飯が全部美味しそうだったのと, ちょっとしたweb開発のお財布に対する優しさを見てとてもwebやってみたくなった. webなら環境に依存しにくいのが羨ましく見えた.
懇親会とかで話をした感想としては, 結局人に見せるために期限設けなきゃ完成に辿り着かないんだなと思った. 他にも強い動機付けとして”怒りドリブン開発”を覚えた.

終わりに

明日7時のバスに乗って名古屋に帰ったらその後TOEICなの, すごくつらみを感じる.
TOEIC終わったら取り敢えずheroku触ってみようと思う.
久々の濃い交流のおかげでいい刺激を受けられた.

カーソルキーで座標指定できるCUIマインスイーパー with C#

vimとかemacsとかみたいな, 仮想端末上で動くソフトウェアって, どうやって描画をしているのか気になったので調べたところ,
C言語だとcursesライブラリを使う, C#ならConsoleクラスでごにょごにょするとできるということで, 遊んでみた.
その結果がマインスイーパー

仕様

C#で書かれたコンソール画面上で動くマインスイーパー. したがって.NETのランタイム必須
行数, 列数, 地雷数を入力したら, そのあとはカーソルキー+Enterキーで座標を指定.
もちろん地雷を踏んだらゲームオーバー
画面が下にスクロールしていかない仕様. わりと本格的に見える…?
チェックしたときに周りの地雷の数が0個なら, 隣の0このマスもどばって開くアレも実装

minesweaper

それっぽい!すごい!
画像だと見えないけどカーソルがちゃんとアンダーバー上にあります.
CUIでも結構がんばれるんだなと思った.

アプリケーション本体のダウンロード

ソースコードのダウンロード

どのようにして実現したか

Console.Clear で画面をまっさらに
Console.SetCursorPosition でカーソル位置を指定(左上が原点)
Console.WriteもしくはWriteLineでカーソル位置を起点として文字列描画

cursesだとこれよりはめんどくさいけどいうほどめんどくさいわけでもないはず.

(開設半年にしてやっとこさ動くものをアップロードした)

bmp→wav変換をしてみたけど……

何をしたのか

bmpファイルのヘッダ以外のデータの部分をそのまんまwav化した.
wavファイルのチャンネル数は1, 量子化ビット数は8bitとした. サンプリング周波数は自由に決められるがとりあえず44100kHzにした.
言語はC#. 本体データの読み取りにBinaryReader.ReadBytes()を使った. リトルエンディアンとかはとりあえず気にしないこととした.

ソースコード

usingとかは省く.

static void Main(string[] args)
{
    string name = "bitmap_name";
    BinaryReader br = new BinaryReader(File.OpenRead(name + ".bmp"));

    // ファイルヘッダ
    ushort  bfType = br.ReadUInt16();
    uint bfSize = br.ReadUInt32();
    ushort bfReserved1 = br.ReadUInt16();
    ushort bfReserved2 = br.ReadUInt16();
    uint bfOffBits = br.ReadUInt32();

    // 情報ヘッダ
    uint biSize = br.ReadUInt32(); // 今回は40前提でやる. 
    int biWidth = br.ReadInt32();
    int biHeight = br.ReadInt32();
    ushort biPlanes = br.ReadUInt16();
    ushort biBitCount = br.ReadUInt16();
    uint biCompression = br.ReadUInt32();
    uint biSizeImage = br.ReadUInt32();
    int biXPixPerMeter = br.ReadInt32(); // 水平解像度[ppm]
    int biYPixPerMeter = br.ReadInt32(); // 垂直解像度[ppm]
    uint biClrUsed = br.ReadUInt32();
    uint biCirImportant = br.ReadUInt32();

    byte[] bytemap = br.ReadBytes((int)bfSize);
    double[] doublemap = new double[bytemap.Length];
    for (int i = 0; i < bytemap.Length; i++ )
    {
        doublemap[i] = ((double)bytemap[i] / 255.0);
    }

    // 自作wav管理クラスと書き込み関数 つまりうまい具合にwavにしてください(投げやり)
    // コンストラクタの引数は sampleRate, channels, bitDepth(Eight(8) or Sixteen(16)), sampleRate
    // Write関数の引数は, filename, volume(0.0 ~ 1.0)
    new WaveFile(44100, 1, BitDepthChoices.Eight, doublemap).Write(name + ".wav", 0.1);
    br.Close();
}

結果

音声試聴時の注意 不意に大きな音が流れます. 音量を絞って聞いてください.

画像1
(24bit Color)

画像2
(24bit Color)

画像3
(8bit モノクロ)

改良, 発展案

wav→bmpをしてみる.
頑張ってきれいな絵になる音を探してみると面白そう?
色の割り当てとかどうしようか.

感想

周波数領域のお絵かき(参考 – サウンドスペクトログラムに画像を埋め込む – 人工知能に関する断創録)
があったのでやってみたのだが何とも言えなかった. でも音として聞こえただけマシだったとは思う
3枚目の画像みたいなモノクロだと意外とそれっぽくなる???
画像としても綺麗で, なおかつ, 音声としてもまともに聞こえるような画像は果たしてこの世にあるのか

リナシタイージー

タイトルの通り

ダージュよりも遅くなるとは思わなかった 左右振りの差かなあ
せっかくなのでイージー残り一覧

カプサイシン(未解禁)
インボルク(イージーをつけたくない)
スケールアウト(イージーすらつかない)
クラシック兄弟(イージーをつけたくない)
トイサイエンムラ(50はやっぱり格が違う)

ただの日記

5ヶ月も何も書かず放置してた
毎月VPSにかかってる1008円君が泣いてるので, どんな内容でもいいから日記にしていこうと思う

スペースレクイエムにクリアランプついた

つきました.
なんかツイートの描画範囲おかしいけどどうすればいいんだろう…
テーマが悪かったらしい, 変えたら直った.
それとテーマとは関係なくなぜかmarkdown記法の打ち消し線がつかえないhtmlの書き方(delタグ)にするとできた. markdownにした意味とは一体…うごご…

残り49
カプサイシン(未解禁)
インボルク(癖付いた予感)
ニエンテ(ボーダー-4までいったけど癖怖いし放置かな)
スケールアウト(当然できない)
リナシタ(できるわけない)
クラシック9(もういや)
クラシック11(もういや)