Processing でファイル変更を監視する

表題の通り。

Java の WatchService を使うと指定したディレクトリに生じた変更をモニタリングできる。 具体的には、WatchService を起動し、監視したいフォルダを指定。その後、WatchKey というオブジェクトに WatchService のイベントを随時保存し、それに変更がないか、変更があった場合はどのようなものか、をチェックすればよい。

一番下の「参考」 に貼ったブログを基本的には元にしているが、Processing 表記にするため多少変更している。

以下、実際のコード:

import static java.nio.file.LinkOption.NOFOLLOW_LINKS;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.OVERFLOW;
import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

WatchService watchService;
File dir;
Path path;
WatchKey watchKey;

void setup() {
  try {
    watchService = FileSystems.getDefault().newWatchService();

    dir = new File("/Users/Ken/Desktop");
    path = dir.toPath();
    path.register(
      watchService, 
      ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY
      );
  }
  catch (IOException ioe) {
    ioe.printStackTrace();
  }
}

void draw() {
  try {
    while ((watchKey = watchService.take()) != null) {
      for (WatchEvent<?> event : watchKey.pollEvents()) {
        System.out.println("Event kind: " + event.kind()
          + ". File affected : " + event.context() + ".");
      }
      watchKey.reset();
    }
  }
  catch (InterruptedException ie) {
    ie.printStackTrace();
  }
}

ただ、これは現在非常にラグがある。予想されるのは、watchservice以外の代替があるのではないか、watchservice自体が遅い、などいろいろあるけれど、実質的には別スレッドで定期的にファイル構造を読めばいいだけなので、案外自分で一から書いた方が早いのかもしれない。
暇なときにきちんと見直したい。

参考
- A Guide To NIO2 WatchService | Baeldung

Orange is the New Black

数ヶ月前から Netflix を契約していて、いろいろちょこちょこ見ていたので、考えたことや感想を少しずつ残していこうと思った。

最初に紹介したいと思ったのは『Orange is the New Black』。

Orange Is the New Black | Netflix Official Site 

 

こちら、 Netflix が人気になるきっかけになったドラマのひとつらしい。
アメリカのとある女子刑務所を舞台に、その内外で起こるさまざまな事件が囚人や看守たちの記憶なども交えて語られる。
シーズン6まで公開されていて、今のところ3の途中まで見たので、ここに書くのは基本的にはシーズン1と2のことになる。

いつか『Stranger Things』についても書きたいと思うのだけれど、こちらは異なる人物同士の物語が並行していくつも進み、最後になってもものによっては統合されない(それぞれ単品で終わる)こともあり、思うところも多かったので、シーズンの途中だけれど一旦考えをまとめようと思った。

 

細かいあらすじは Wikipedia に詳しく掲載されているので、そちらを参照してもらって、ここでは考えたことだけをツラツラと書く(ネタバレ注意)。

 

シーズン1は基本的には「基礎」をつくったシーズンだと思う。
シーズンの当初、主人公パイパーはロシア人の料理長レッドに喧嘩を売って、「彼女らしいやり方」で仲直りする。この時点では僕は、「ああよくある異なる環境でも自分の強みを見失わずに〜」的な話かなと思いきや、どちらかというとシーズンを通してパイパーは徐々に変化していく。
具体的に言うと、彼女は「刑務所の外」と同じ状態であろうとし続けていたものの、さまざまな事件を経て刑務所の中で同じ態度を取り続けることが難しくなってしまった上、唯一の心のより場であった「外」とのコネクションも失ってしまったから。

 

ここでおもしろいと思ったのは、ダヤの存在。
彼女はパイパーとは実は真逆の存在で、彼女にとって大事なものはすべて刑務所内にある。
シーズン2でも3でもずっと、刑務所生活が続いた後のことも考えて地道で穏やかな人生のことをずっと考えている。彼女にとってはそれで十分で、そう考えるとパイパーは若干滑稽に見える。もちろん、ここには「家族をつくる」ことが最優先のヒスパニックグループと白人的な自由を謳歌するライフスタイルの差も含まれてはいるものの、この二人の対照的な囚人生活はすごい。

 

というわけでシーズン1はすったもんだがありつつも、いろんな人間関係が少しずつ変化していく。

ただ、これはシーズン2を見たあとだと、ゆっくりすぎると感じるくらいシーズン2は激動だった。

 

ヴィーという新しい存在が刑務所に入ってきたことで、一気に人間関係がはっきりと派閥に別れてしまったから。
黒人(ヴィー)、白人(レッド)、ヒスパニック(グローリア)、無党派(パイパー他)。
それぞれとても興味深い終わりを迎える。

ヴィーは死に、黒人グループは元の仲良しグループに戻る。

レッドは九死に一生を得て、自分のグループをゆるやかに取り戻す。ビジネスは放棄。

グローリアは何も得なかったものの、自分のグループからも誰も怪我人を出さず。

無党派は終始混戦状態のまま、最終的には彼らの敵が刑務所事態であると見定め、これに(ある程度)勝利を収める。


ここで一番おもしろかったのはそれぞれの「家族観」の違い。

  • ヴィーにとって家族は利用するもの。必要なら切っていく。つまり「部下」。
  • レッドにとっても最初はある程度ヴィーと同じだった。このことは、「昔とはゲームが変わった」といいつつも、昔と同じようなやり方でヴィーと対抗した結果大きく痛手を受けたことでも明らか。しかし、そのあとより自律的なつながりへと変化させていく。おそらくこれの一番の原因は仲間が自分についてこなくなり、頼れて守れるべき仲間(家族)の大切を自覚したから。彼女にとっては「仲間」。
  • グローリアにとっては家族は最優先して守るべきものであり、そこに疑いなどはないし、試したり試されたりする必要も感じていない。事実このシーズンで彼女が誰かを疑うシーンというのはない。かつ、自分の家族を超えて慈愛の心があるというのも明らか。

 

ではなぜグローリアはそんなに慈愛が溢れているのか。なぜ他の二人にはできないのか。

この秘密はシーズン3にあると思う。
シーズン3ではヒスパニックグループの一人、マリアが「私たちは家族ではない」と語っている。
つまり、彼女たちは家族ではない。


たしかにグローリアにとっての家族の大切さは仲間のさらに上に行くのは端々で伺えるし、彼女は内は内、外は外、と割り切っているのではないだろうか?

それと比較すると他の二人はそう割り切れているわけでもなさそう。
ヴィーは外での関係を中でも続けているし(テイスティー)、レッドは逆に外よりも内側で権力を握っていた事実から、刑務所内での方が心地がよかったのではないか。

 

ここで、主人公パイパーがおもしろい位置にいる。
彼女は、
1. もとは内は内、外は外と割り切れてこざっぱりした刑務所生活を送ろうとしたけれど、刑務所外の関係が崩壊する
2. シーズン2ではアレックスがいなくなって刑務所以前からパイパーを知っている人はいなくなったものの、1を経てアレックスを呼び戻す策を取り、外での関係を刑務所内に再度引きずり込む
ということで、もとはグローリアの立ち位置にいた(いようとした)ものの、ヴィーとアレックスの二人の属性を併せ持つ存在へと身を変えていってしまうことが見える。

ということは、シーズン3以降の彼女がどうなるかは簡単に予想がついてしまう。


物語をとおして、こういった「人間関係観」や「倫理観」がかなりトピックにされているのでおもしろい。
(刑務所の外の人と刑務所の中の人とどっちの方が倫理観が崩壊しているか、とかね)

 

シーズン3も割とおもしろいのだけれど、割とドラマチックに個別にものが動いているので、シーズン2ほど大局的なおもしろさはないものの、引き続き楽しんで見ていきたい。

 

Raspberry PI で FMOD Studio API を動かす

表題の通り。

FMOD (https://www.fmod.com/download) はゲームなんかでよく使われているサウンドライブラリらしく、Raspberry PI で使えるようにするまでの道のりを書く。

作業をはじめる前に、事前に自分のラズパイの ARM のバージョンを確かめておくとよい。

cat /proc/cpuinfo

このとき、Arm 6 だったら arm、Arm 7 だったら armhf というふうに ARM のバージョンを指定すればよい。 uname -aとかでも分かる。 ここではすべて armhf に統一して説明するので、適宜置き換えてください。

まず、アカウント登録を済ませて、 FMOD Studio API をダウンロード(https://www.fmod.com/download)。 あまり重くないので、アカウント登録だけ他のマシンで済ませて、Raspberry PI から直接ダウンロードすれば良いかなと思う。

ダウンロードしたら、適当に解凍して、適宜ものを移動させる。

tar -xvzf fmodstudioapiXXXXXlinux.tar.gz

API/lowlevel のうち、lib 以下を /usr/local/lib に、inc 以下を /usr/local/include へと移動させる。

sudo cp fmodstudioapiXXXXXlinux/api/lowlevel/lib/armhf/libfmod* /usr/local/lib
sudo cp fmodstudioapiXXXXXlinux/api/lowlevel/inc/*.h* /usr/local/include

これができたら、だいたい環境が整った感じ。 あとは、fmod.h をインクルードして、適宜コンパイル

api/lowlevel/examples の中に例も入っているので、適宜参照しつつやるのがわかりやすい。

ちなみに、サンプルは

make --file play_sound.makefile CONFIG=Debug CPU=armhf 

のように、CONFIG と CPU のパラメーターを指定して make しないといけない。

参考:

FMOD Running on Raspberry Pi

nvm のデフォルトのバージョンを変える

nvm ls
nvm alias default v???

でバージョン変更。ターミナルのセッション再起動で設定が読み込まれるはず。 再度 nvm ls でデフォルトになっているのが確認可能。

❯ nvm ls
         v4.0.0
->       v7.2.1
         system
default -> v7.2.1
node -> stable (-> v7.2.1) (default)
stable -> 7.2 (-> v7.2.1) (default)
iojs -> N/A (default)
lts/* -> lts/boron (-> N/A)
lts/argon -> v4.7.0 (-> N/A)
lts/boron -> v6.9.2 (-> N/A)

上記は出力一例。

ただ、もし default が自分が指定したいバージョンになっているもののうまく反映されていない場合、shell の rc ファイルでの nvm.sh の読み込み順によるものの可能性があるので、nvm.sh を読み込むのをできる限り後にずらす。変更後 source ~/zsh.rc (shellによって適宜変更)で反映されるはず。

MacOS Sierra を中国製 Arduino Nano につなぐと強制終了する

書いて字の如く、中国製の Arduino Nano を買って遊ぼうとしたところ、 OS 自体がシャットダウンするとかいうことが起きてた。 これは FTDI の代わりにCH340G とかいう ISP 用のチップを積んでいるおかげで、安価ではあるものの、ドライバーがバグ起こしてしまうため、らしい。

そこで以下のことをする: 1. ドライバ消す

sudo rm -rf /Library/Extensions/usbserial.kext

上記、OS によっては /System/Library/Extensions/usb.kext かも)

  1. 再起動

  2. ドライバ入れる

brew tap mengbo/ch340g-ch34g-ch34x-mac-os-x-driver https://github.com/mengbo/ch340g-ch34g-ch34x-mac-os-x-driver
brew cask install wch-ch34x-usb-serial-driver
  1. 再起動

  2. 差してみる

参考:

製造会社のドライバダウンロードページ

GitHub - adrianmihalko/ch340g-ch34g-ch34x-mac-os-x-driver: CH340G CH34G CH34X Mac OS X driver