読者です 読者をやめる 読者になる 読者になる

存在を忘れられる備忘録

あれこれTwitterじゃ流れるから残しときたい書き物用

心から温まる技術

この記事はcoins Advent Calendar 2016 19日目の記事です。

毎日毎日寒いですね。今日は寒い日々を耐え忍ぶための技術についてです。

coinsで暖を取ると言えば、一般的には計算機をぶん回すことを指すと思います。 徐ろにGentoo Linuxのインストールを始めたり、撮りためたアニメをエンコードするのは冬の恒例行事とも言えるでしょう。 過去のcoins Advent calendarを眺めてみてもこたつをサーバで温める記事があったり、計算機で暖を取ることはもはや目新しいことでもありません。 そこで、今日はちょっと趣向を変えてみようと思います。

迫りくるクリスマス。 どんなに部屋が暖かくても共に過ごす相手がいなければ、心は冷えきったままで生命の温もりが恋しくなるでしょう。 無ければ作るの精神ということで、今日はちょちょっと生命を作り出してしまいましょう。 coinsで生命と言えば?

そう、ライフゲームですね。

ご存じない方のために説明すると、ライフゲームとは碁盤の目状に並んだセルの状態が簡単なルールに従って更新されていく、シミュレーションゲームの一種です。 各々のセルは生死どちらかの状態で、

  1. 死んだセルの周囲8セルの内、生きているセルがちょうど3つの時にそのセルは「生」に変わる
  2. 生きたセルの周囲8セルの内、生きているセルが1つ以下の時にそのセルは死ぬ
  3. 生きたセルの周囲8セルの内、生きているセルが4つ以上の時にそのセルは死ぬ
  4. 上記以外の場合、セルの状態は変化しない

の4つのルールに従ってセルの更新を繰り返し、盤面の変化を眺めて楽しみます。

というわけで、ライフゲームを作っていきます。 ただ単に盤面の状態を液晶ディスプレイに表示するだけだと生命の温もり感に欠けるので、Arduinoを使って8x8のマトリクスLEDに表示しようと思います。 マトリクスLED内部は、

f:id:dj_marble:20161219002125p:plain

(MNA20SR092Gデータシートより引用)

こんな回路をしているので、何も考えずにつなごうとするとArduino Unoではピン数が足りず、金を積んでArduino Megaを買う必要が出てきます。 そんなお金は無いので、今回は8bitのシリパラ変換ICを2つ使ってつなぐことでArduino Unoからでも制御できるようにします。 いい感じにつないだ結果こうなります。

f:id:dj_marble:20161219002938j:plain

後はパパっとArduinoのスケッチを書いてしまいましょう。 マトリクスLEDの点灯には少し工夫が必要で、そのままだと一度に全てのLEDを任意の点灯状態にすることができません。 各行(もしくは列)1つだけに着目すると任意の点灯状態にすることができるので、まず1行だけ表示して、すぐに次の1行だけを表示して……と表示する行を高速で切り替えることで全てのLEDについて任意の点灯状態にすることができます。 ArduinoにはShiftOutという1byteのデータをシリアル出力してくれる便利な関数があるので、これを使うと各行のデータを簡単にシリアル出力することができます。 最終的なスケッチがこちらです。

このスケッチをArduinoに書き込んで完成です。

f:id:dj_marble:20161219013026g:plain

どうですか、生命の温もりを感じられますか。 僕は部屋のあまりの寒さに凍え死にそうです。 とはいえ、もともと箱庭シミュレーションを無心で眺めているのが好きなので楽しいことは楽しいです。

f:id:dj_marble:20161219012517g:plain

完全にただの一発ネタでしたが、ここまでお読みいただきありがとうございました。

matplotlibのcolormapを自分好みにする

散布図とか描くとき色分けしてプロットすると思うんですけど、ちょっとデフォルトのものから変更したかったので調べてみました。途中から飽きて雑にしか理解してないので話半分に読んでください。

ざっくり説明すると、以下のようにRGB各色について点を0から1の範囲で指定すると線形補間してくれて色が決まるそう。1列目が入力の対応位置、2列目と3列目が実際に取る値になります。y=f(x)とすると1列目がxで2,3列目がyに当たると考えれば。yが2つある理由は後述しますが、取りあえずは同じ値を設定しておけば困らないと思います。

cdict1 = {'red':((0.0,0.5,0.5),
                 (0.25,0.0,0.0),
                 (0.5,1.0,1.0),
                 (0.75,0.0,0.0),
                 (1.0,0.5,0.5)),
          'green':((0.0,0.0,0.0),
                   (1.0,0.0,0.0)),
          'blue':((0.0,0.0,0.0),
                  (1.0,0.0,0.0))}

この場合、緑と青は全域で0、赤の値が最小値から最大値にかけて以下のグラフのように変化します。

f:id:dj_marble:20151118213656p:plain

実際に散布図をプロットしたものが以下になります。

f:id:dj_marble:20151118213742p:plain

さて、2列目と3列目が分かれている理由ですが線形補間を行う際、補間したい点を挟むcdictで定義された2点をa,bとしてa[0]<b[0]とすると、a[2]とb[1]を用いて補間されます。説明下手なので自分でも何言ってるかさっぱりですが、以下のように点を指定すると、

cdict2 = {'red':((0.0,1.0,1.0),
                 (0.5,0.0,1.0),
                 (1.0,0.0,0.0)),
          'green':((0.0,0.0,0.0),
                   (1.0,0.0,0.0)),
          'blue':((0.0,0.0,0.0),
                  (1.0,0.0,0.0))}

赤色の値は下図のように補完されます。

f:id:dj_marble:20151118215841p:plain

散布図を描くとこんな感じ。

f:id:dj_marble:20151118220011p:plain

おわかりいただけただろうか。理解力を総動員していただきたい。

もともと欲しかったのはこんなcolormap。

cdict3 = {'red':((0.0,1.0,1.0),
                 (0.5,0.25,0.25),
                 (1.0,1.0,1.0)),
          'green':((0.0,1.0,1.0),
                   (0.5,0.5,0.5),
                   (0.75,1.0,1.0),
                   (1.0,0.25,0.25)),
          'blue':((0.0,1.0,1.0),
                  (0.5,0.75,0.75),
                  (0.75,0.0,0.0),
                  (1.0,0.0,0.0))}

f:id:dj_marble:20151118220446p:plain

気持ち雨量レーダーっぽいかと思います。そうでもないかとも思います。どんなグラフにすればこうなるか理解力が無くてわからなかったので以下のサイトを使いました。

Custom colormaps for Matlab and Matplotlib - Colormap.org

これそのまま使えばええやんとも思った。以下使用したコード。

ファイル保存時にtexを自動コンパイル

タイトル通りです。Twittertex書きながらその場でプレビューしたいっていうpostを見てinotifyとか適当に組み合わせればできそうだなと思ったのでシェルスクリプト4級(?)の腕を駆使してまた一つゴミみたいなスクリプトを生み出してしまいました。

エラーとか全部投げ捨ててるのでflycheckとか入れてない場合リダイレクトしないほうが使いやすいと思います。

Arch linuxにxmonadを導入した

今までWMにはawesomeを使っていたのだけれど、マルチディスプレイ周りの挙動が気に入らなかったのと、じわじわとHaskellを勉強している影響でxmonadに移行した。それで色々メモとして残しておきたかったので久しぶりに筆を執ることに。基本的にArch Wikiを読めばある程度までは動かせるはず。

通知

作業中でもすぐリプライやふぁぼに対応するためにmikutterからの通知を取りこぼすわけにはいかない。awesomeでは標準でnaughtyとかいうのが入っていて特に何をすることもなく使えた気がするのが、xmonadは別で通知サーバーを入れないとダメらしい。Arch Wikiに色々候補が上げられているので適当にそれっぽいものをインストール。

ちなみに色々試した結果、dunstで落ち着いた。

壁紙の設定

デフォルトではあまりに真っ暗な画面が襲いかかってくるので起動できているのかすら確認できない。実際最初は失敗したと勘違いして諦めそうになった。awesomeではテーマを適当にいじれば壁紙を変更できたのが、xmonadではnitrogenなど外部ツールを使って設定するらしい。これでこころぴょんぴょん出来るように。

システムトレイ(xfce4-panelで言う通知エリア)

これもawesomeだと何もする必要がなかったけれど、xmobarはテキストを表示する程度の能力しかない(多分)のでそんな器用なことはできない。うまい方法が見つからなかったのでとりあえずxfce4-panelを使って、透明度を100%にするとそれっぽくなったのでそのまま放置。

gtk3が叛逆を起こす

具体的に言うと、gtk3のアプリケーションだけ周りに異様な空間ができる。gtk3のテーマファイル自体を書き換えたら若干ましになった。/usr/share/themes/にテーマファイルがあるので、使用中のテーマファイルの.window-frameの項目を消し去ったら何とかなる、はず。

他にもあった気がするので思い出したら書き足す。

dokuwikiでバックアップを取ったら生成されるリンクが壊れてた話

完全に備忘録というか、あまりに初歩的すぎて(?)ググっても出てこなかったので。

大学のサークルで情報共有にdokuwikiを用いているのですが、ちょっと色々あって再インストールする羽目になって、元のwikiをディレクトリごとバックアップ取ってデータを新しい方にコピーしたのですが、生成されるページの一部だけリンクが壊れていたんです。

で、結果的に直ったんですが、原因はdokuwikiのドキュメントルートを指定していなかったからでした。明示的に指定しなくても自動で推測してくれるので、元々設定は空欄だったのですが、それがバックアップ側のディレクトリを読みに行ってたのが原因みたいです。

csv ファイルを Python 使って一発でグラフにする話

Arduino で SD カードにとったログをグラフ化する作業にいちいちLibreOffice 使ってるのかなり頭悪いのでちょっと勉強がてら書きました. って言っても matplotlib と numpy が予想以上に強力だったので何もしてないに等しいですが. 今後も同じことがしたくなることがありそうなので備忘録に.

用意するもの

  • matplotlib

多分 pip で入ると思いますが依存関係足りないって言われることもあるみたいなので各自頑張ってください. 入れた時のこと覚えてない.

コード

解説

今回は最初に実行時間,後ろに5つのデータの数値がカンマ区切りで続くデータを, x軸が実行時間, y軸がデータの数値となるグラフにしたかったのでそのようになっています.

np.loadtxt()csv 風のファイルを numpy の array オブジェクトにしてくれます. delimiter=',' で区切り文字の指定. unpack=True とすることで各列ごとの array にしてくれます. unpack しなかったら二次元配列で返ってくるみたいです.

あとは plt.plot() に x軸の値が順に並んだ array, y軸の値が順に並んだarray を渡してあげればグラフにしてくれます. 第3引数で色と線(点)の形式を指定できて, label を指定すれば plt.legend() で凡例も表示してくれます.

plt.subplot() でグラフの表示領域を分割できるが, 引数が若干分かりにくい気がします. 引数の数字は高位の桁から順に上下の分割数, 左右の分割数, インデックスを表すそうです.

そして, plt.show() でグラフの表示, やったね.

Audio CDをコマンドライン上でリッピングするはめになった話

ほぼインストールしただけの状態のGentoo Linuxが入ったPC(CD/DVDドライブ有)とMacbook AirUSBフラッシュメモリが手元にあって、MBAに何とかしてリッピングしたデータを入れたい時の話。

sudo emerge cdrtools
cdda2wav -x -B

これでCD/DVDドライブにあるAudioCDトラック毎にをPCM形式のWAVファイルでカレントディレクトリに保存できます。-xが最高音質で出力するためのオプションで、-Bがトラック毎にファイルを分割するためのオプションです。後はできたWAVファイルをUSBフラッシュメモリ経由でMBAに移動させてミッション終了です。

この記事書きながら調べて知ったんですがWAVファイルって必ずしも無圧縮で音声データを保存してるわけではないんですね。