ドラムスティック: pro-mark TX7AW, REGAL TiP HELLO KITTY KT-5A-X

普段はTAMA H213Pを愛用している。非常に細く、長さは普通で非常に軽量なドラムスティックだ。反発はかなり強く、手の中で遊ぶ叩き方に最適。非常にバランスもよく叩きやすいスティックだ。とても気に入っているのだが、これで壊れると替えがきかない。もちろん、私は繊細なプレイヤーなのでそうそう折ったり曲げるようなことはしないが、それでもこれだけ細くて軽いスティックだと壊れるリスクは高い。特に生ドラムではパワーがかかるため曲がりやすいし、傷つくことも多い。

そこで、このスペアと、生ドラム用のスティックを調達する意味を込めて新たにスティックを購入した。これがタイトルの2つ、pro-mark TX7AW, REGAL TiP HELLO KITTY KT-5A-Xだ。

pro-mark TX7AWは45g弱で揃えた。ショートタイプで細くて非常に軽い。H213Pよりも軽いスティックを期待して購入した。ジャズ及びライトロック向けとある。実際に叩いてみると、反発がかなり少なく硬質なフィーリング。かなりしっかりグリップしておく必要がある。短いものをさらに短く持って上から叩くようなタイプだろうか。指にはさんで使うようなタイプだろうか。いまいちしっくりこない。

REGAL TiP HELLO KITTY KT-5A-Xはその名の通りハローキティモデル。スタンダードなサイズだが、52gで揃えたほどで結構軽い。女性ドラマー向けだろうか。性質的にも硬質で普通、比較的腕を振るロックドラマーに向いている気がするし、入門用に適しているだろうか。私の場合、やはり振りにくい。生ドラムでは細いドラムでは叩きづらく、スティックの反発の弱さもカバーされるため、主に生ドラムで使うことになるだろう。人に貸しやすいものでもある。

私は右手は遊ばせ、左手は握ることが多いため、左にTX7AW、右にH213Pという組み合わせも、かなり叩きやすい。ただし、これは左で右にあるものを叩くことが多いと感覚がつかみづらく叩きにくくなる。

Linuxで最新のFlash player pluginを使う

LinuxのFlash PlayerはAdobeがサポートを終了し、11.2が最終バージョンになっている。もうだいぶ古くなって、最近は様々なサイトで動画が見られないなどの不具合がでている。いや、動画のようなコンテンツだけならいい。保険サイトのようなところが見られない、という事態すらある。

Flash PlayerはGoogleのメンテナンスに移行し、案の定、Googleが抱え込んでChromeに同梱している。そう、Flash Player単体のリリースはしていないのだ。当然ながら、Chromiumや、その派生であるSRWare ironにはFLash Player pluginが含まれていない。

MozillaはChromeが利用するPepperプラグインには「興味がない」と言っているため、このままいくとFirefoxでFlash Playerは利用できなくなる。既に11.2までしか利用できずに様々なサイトが見られなくなってきている。だが、chromiumやironはPepperプラグインが利用できるため、術はある。

どうしてもGoogle Chromeが受け入れられなかったため、Chrome x84_64 rpmをダウンロードし、それをarkでPepperFlashのみ展開。あとは

iron --ppapi-flash-path=/opt/google/chrome/PepperFlash/libpepflashplayer.so --ppapi-flash-version=15.0.0.152

のようにすればよい。バージョンはmanifest.jsonファイルを参照する。

のだが、これでうまくいかずに随分悩んでしまった。理由は、自分で書いたiron起動用スクリプトが引数を渡すようになっていなかった、という実にくだらない理由。スクリプトを書き換え、デフォルトでプラグインをロードするようにするとともに引数を渡すようにした。

Mail Deliver 0.0.1 release!

全面的にコードを書き直す改変を行った。GitHubに反映済みだ。

従来のコードではアドレスの抽出がうまく動いておらず、アドレスに合わせてソートされていなかった。どこが問題なのか見つけ出すよりは全面的に新しいコードにしたほうがよさそうだったため、大幅に修正した。

メインとなるlocaldelivは従来を踏襲する。ただし、ヘッダーの取得・保存に使うスクリプト、アドレス抽出に使うスクリプトはあたらしくなり、またlocaldelivが何を受け取り何を渡すかという動作も変更された。

getheaderスクリプトはメールのヘッダを読み、NKFで変換して適切に結合し、Hashにして、YAMLにして出力する。NKFを使うため、日本語か、ASCIIか、UTF-8のメールでないとうまく動作しない。これはRubyスクリプトだが、Mageiaはnkfパッケージをもっていないし、恐らくRuby経由でNKFを使うほうが確実に動作する。

getaddrはそのHashからFromの値をとった上で正規表現でマッチングを行い、アドレスを取得して出力する。うまく取得できない場合はexit 1だが、それよりもむしろlocaldeliv側でif [[ -n $addr ]]しているほうが重要になる。

localdelivはソートされなかったメールを$MH/inbox/domain/addressに振り分ける。Zshのコードは今回はあまり難しいものはいれていないが、この部分については

box="inbox/address/${addr#*@}/${addr}"

という形でドメインの切りだしを行っている。

savemailはほぼ以前の通りだが、設計がおかしかったので、修正した。

従来、savemailにはフォルダのみを渡していた。この時渡されるのはdomain/addressだけだった。しかし、このためにinboxフォルダを使うようなものが$Mail/inbox/address/inboxになってしまっていた。そこで、$Mail/junkなどを使うためにも、$Mail以下を指定するようにした。これは、localdelivが渡す値の修正と、savemailの受けとった値の取り扱いが変更された。

また、localdelivが呼ぶコマンドにはmaildeliv.というプレフィクスをつけるようになった。これにあわせて名前を変更しながらコピーするインストールスクリプトを書く予定だ。

基本的に修正したのはこの4つだ。とりあえず、目的の動作はするようになったが、メール関連はいくつかユーティリティを書かないとうまく動作しない。また、設定サンプルも書いたほうがいいのだろうか?

このメールユーティリティはZshとRubyの組み合わせとなっている。まさに私らしいユーティリティスクリプトだと言えるだろう。

さて、ここまで書いてから一日がかりの大幅な加筆修正とバグフィックスを行った。コードの詳細はかなり詳しいREADMEもついているのでGitHubを参照して欲しい。ここでは裏話をしよう。

今回最もハマったのは、Rubyでexit 1が書けないことだろう。カッコが省略できない。ちなみに、Kernel.abortも省略できなかった。以前(1.8.6)はできた気がするのだが、やはり1.9以降の変更でハマっている状況だ。

設計は根本的に見直した。まず、今回再認識したのが、設計していないコードや、コメントのないコードは、手が入る時点で投げ捨てるのが正義である、ということだ。

とりあえずでやっつけで作ったこのプログラムは徐々に拡張されてきたが、その過程で入出力のフォーマットの整合性がなかったり、YAMLをつかっているのにわざわざ正規表現で抽出したりということがあった。変数名が統一されていないためにエラーになるような状況もあった。

そのことからそもそもlocaldelivが既存のutilを利用せず新たに書き起こす展開だったのだが、当然ながらlocaldelivに限らずほとんど書き直すことになった。ただ、mail-notify-countに関しては既にYAMLでカウントするようになっていたためそのままとなった。しかしNotify系のコマンドも整合性をとるための編集をしたり、動作モデルを変更したりとなかなか大変だった。

特に大掛かりな変更となったのがmdafilterだろう。なにしろ、今までZshで書いていたものをRubyで書き直し、設定ファイルの形式も変更されてしまったのだから。どれほど変更されたかはgit logで具体的に確認することができるが、結局「これは違うな」と思った時点で挙動を確認せず新たに書き起こしてしまった部分がほとんどだし、修正した部分の中にも最初からやり直すのと大して変わらない労力をかけた部分が多い。

こんな小さなプログラムに6時間もかかってしまったので、だいぶ悔しい。

ソートルールに関しては従来、第二フィールドの値をシェルコマンドとして実行して終了ステータスから判断する仕様だったが、ほとんどの場合Fromから判断するのだから、コマンドで、というのはあまり合理的でない。そこで、Rubyに変更し、ルール自体をRubyで書くことにした。Procに対して渡されるのはメールヘッダのHashオブジェクトだが、さらにアドレスについては#fromメソッドで取得できるほか、#bodyメソッドで本文も取得できる。ちなみに、メールボディについては呼ばれた時にメールを読んでインスタンス変数に格納する仕組みでロードを遅延している。これは、メールボディはSTDIN経由で渡す、という方法で実現している。最新のコードでは次のようになっている

def body
@body ||= NKF.nkf("-w -Lu -m", STDIN.read.to_s).split("

", 2).last
end

今回の作業は多岐にわたったが、なんといってもちゃんとしたREADMEにInstallスクリプトまで書いてリリースにこぎつけた。

ぜひGitHubをのぞいてみてほしい。

Mikutter

Mikutterが2.0.6になったのでアップデートするついでにプラグインを導入してみた。

Mikutterのプラグインは原則~/.mikutter/plugin/pluginnameディレクトリに導入する。このpluginnamepluginname.rbを読む仕様のため、これに合わせなくてはいけない。

ほとんどのプラグインはGitHubで管理されており、git clone URI.git ~/.mikutter/plugin/pluginnameで大体はいける。そうでなくてもそのような形式のディレクトリに一式ぶちまければいける。

しかし、当然ながらそれによって依存関係の欠如が生じる。例によってMikutterリポジトリでbundle installすればいいのだが、いくつかのGemファイルがエラー終了してしまう。少しハマったがよくよく調べてみるとruby-develが入っていないということだった。

プラグインを利用していないのでまだその効果のほどは分からないが、Userconfig Accessorはロードするとクラッシュしてしまう。

操作系プラグインはごく単純なものが多いが、これを見ると自分で書くのも難しくはなさそうだ。ただし、「何にアクセスするか」という問題は出るだろう。

しかし、個人的にはRubyスクリプトであることが非常に助かる。ローカルな対応のためにソースを読んだり、挙動を確認するためにソースを読んだりできるからだ。

Firefox Latest 起動スクリプト修正

やってはいけない、と分かっていたが、突然の再起動でFirefox Latest起動中に終了してしまい、うっかりそのままFirefox Latestをスタートしてしまった。

起動スクリプトは最初にmv ~/.mozilla ~/.mozilla.origをやるため、Firefox Latest用の.mozillaが紛失してしまった。ちょっと焦ったが、これは~/.mozilla.orig/.mozilla.origになるため復元はできた。

だが、このような問題のあるコードをそのままにする気にはなれないので修正する。

#!/bin/zsh --extended-glob

# If .moziila is not for latest Firefox.
# (#q:A) means expand symbolic link
if [[ -e ~/.mozilla $( print ~/.mozilla(#q:A) ) != */.mozilla.latest ]]
then

# Abort if .mozilla is a directory
if [[ ! -h ~/.mozilla -d ~/.mozilla ]]
then
print .mozilla is a directory. 2
exit 1
fi

# Link .mozilla for latest Firefox if any.
if [[ -e ~/.mozilla.latest ]]
then
[[ -h ~/.mozilla ]] rm ~/.mozilla
ln -sf ~/.mozilla.latest ~/.mozilla
fi

fi

# Invoke latest Firefox
~/lib/firefox/firefox

# If invoked with no .mozilla for latest Firefox.
# Rename .mozilla for it.
if [[ ! -h ~/.mozilla ]]
then
mv ~/.mozilla ~/.mozilla.latest
fi

# Change link for original Firefox.
if [[ -e ~/.mozilla ]]
then
rm ~/.mozilla
fi
ln -s ~/.mozilla.orig ~/.mozilla
ln -sf

なぜかln -sfで機能しなかった。

Mail Virtual Alias @ CentOS 6

メールサーバーの本運用は通常virtualであるはずだ。メールアカウントの数だけユーザーアカウントがあるというのは考えられない。

ただし、私の場合はサブドメインをバーチャルエイリアスにするため、バーチャルドメインが必要になる。

新しいDovecotに関する情報がなく苦労したが、http://vogel.at.webry.info/201312/article_10.htmlの通りにやってみた。大体これでうまくいったのだが、私の場合はいくつかひっかかった点があった。

まず、hown -R mailuser ~mailuserをちゃんと実行しておかなくてはいけないこと。vmailboxファイルは最後に/をつけ忘れるとmbox形式になってしまうこと。

しかしこれではPOPの認証がfailedとなる。調べてみると、このサイトにはデフォルトでコメントアウトしているauth-passwdfile.conf.extのロードをしていない。

[root@server ~]# grep -R auth-passwd /etc/dovecot
/etc/dovecot/conf.d/10-auth.conf:#!include auth-passwdfile.conf.ext

さらに、パスワードファイル認証も無効化されている。

[root@server ~]# grep disable /etc/dovecot/conf.d/10-auth.conf
#disable_plaintext_auth = no
# Authentication cache size (e.g. 10M). 0 means it’s disabled. Note that
# 0 disables caching them completely.
# NOTE: See also disable_plaintext_auth setting.

この2点を修正したが、それでもエラーになる。原因はパスワードファイルのファイル名(設定ではなくファイル自体)が間違っていたためのNo such file or directoryだった。

さらにPostfixからのDovecot認証の利用は情報が錯綜してよくわからない状態だったが、結局のところ/etc/dovecot/conf.d/10-master.confのPostfixから利用するコメントアウトをはずすだけでエラーは出なくなった。しかしながら、認証自体がうまくいかない。userとgroupの設定を追加したが、元々666なのだから、効果はなかった。明らかに問題はPostfixにあり、Dovecotはこれでいいだろう。

telnetを打ってみると25番ポートが反応しない。ここでOP25Bによるものだと気付いた。

submissionの設定を探してみると、master.cfにsubmissionの項目があり、このコメントアウトをはずせばsubmissionは機能する。しかしながら

submission inet n – n – – smtpd
# -o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING

TLSを強制するとTLSが機能しない。とりあえず、TLSは要求しないことにした(encryptでなくmayにしておく)。

しかし、それでも544 host access deniedという応答で送ることができない。調べてみると、さらに別のパラメータを設定する必要があるようだ。main.cfに記述する。

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_relay_restricions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
broken_sasl_auth_clients = yes

さらにスペルミスにもひっかかってしまったが、これでうまく通った。TLSが上手く動かない以外は正常だ。

TLSについて調べてみると、どうも鍵にパスフレーズがかかっていると使えない、ということだ。そこで、次のようにして問題の解決を図る。

[root@sesrver]# openssl genrsa -aes128 1024 server.key
Generating RSA private key, 1024 bit long modulus
.++++++
…………………….++++++
e is 65537 (0x10001)
Enter pass phrase: #ここでは普通にパスフレーズを入力する
Verifying – Enter pass phrase:
[root@dti-vps-srv71 certs]# openssl rsa -in server.key -out server.key #これによってパスフレーズを消滅させる
Enter pass phrase for server.key:
writing RSA key
[root@dti-vps-srv71 certs]# openssl req -new -x509 -key server.key -days 3650 -out server.crt # certファイルを作る
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [XX]:JP #カントリーコード
State or Province Name (full name) []:Kanagawa #神奈川
Locality Name (eg, city) [Default City]:Yokohama #横浜
p {[
“さらにスペルミスにもひっかかってしまったが、これでうまく通った。TLSが上手く動かない以外は正常だ。”,
“TLSについて調べてみると、どうも鍵にパスフレーズがかかっていると使えない、ということだ。そこで、次のようにして問題の解決を図る。”
]}

sb { -END
[root@sesrver]# openssl genrsa -aes128 1024 server.key
Organization Name (eg, company) [Default Company Ltd]:HarukaSound #組織名
Organizational Unit Name (eg, section) []: #部署はない
Common Name (eg, your name or your server’s hostname) []:reasonset.net #FQDN
Email Address []:master@reasonset.net #メールアドレス
[root@dti-vps-srv71 certs]# openssl x509 -in server.crt -outform der -out server.der # derファイルの生成

これで鍵の生成は完了。ファイル名が若干変わったので、main.cfを修正。さらに、DovecotのSSLが設定されていなかったので、/etc/dovecot/conf.d/10-ssl.confを修正(ssl = yesのコメントアウトをはずし、ファイル名を修正)。

そしてmaster.cfencryptに戻して完了。STARTTLSが正しく働くようになった。

新旧のFirefoxを使い分けるスクリプト

新旧のFirefoxを使い分けるスクリプト

MageiaのFirefoxは24ESRだ。最新のFirefox31を~/lib/firefox/firefoxとして置いた。

しかしこのまま起動すると、どちらのバージョンを使うかによって.mozillaのバージョンチェックが行われ、アドオンなどがいじられてしまう。そのため、それぞれの.mozillaを分けたい。なお、ここでは.mozillaをいじっているが、本来なら.firefoxをいじるべきなのかもしれない。

単純に起動するバージョンによって.mozillaを変えることにした。

#!/bin/zsh

mv ~/.mozilla ~/.mozilla.orig
if [[ -e ~/.mozilla.latest ]]
then
mv ~/.mozilla.latest ~/.mozilla
fi

~/lib/firefox/firefox

mv ~/.mozilla ~/.mozilla.latest
mv ~/.mozilla.orig ~/.mozilla

Firefoxはシェルスクリプトとは別プロセスであるため、Firefox起動中にシャットダウンするようなことをしない限りファイルは保たれる。また、同時起動はどのみちできない。

しかしこのままだとbookmarkが共有されないなど不便な点がある。bookmarkやhistoryなどは~/.mozilla/firefox/$profile.default/places.sqliteにあるということだ。これは通常ファイルなので、symbolic linkにしておけばいい。ただし、latest側を、起動時に作られる.origディレクトリへのリンクにする必要がある。

$ ln -sfv ~/.mozilla.orig/firefox/$profile.default/places.sqlite ~/.mozilla/firefox/$profile.default/places.sqlite

bookmarkbackupsディレクトリもリンクしておいたほうがいいかもしれない。

PureDocにYAMLメタデータ機能を追加

これまで仕様としても定義されてこなかった@metaの使い方だが、この度実装された。

文書中の最初にある##–ではじまる行と次にくる##–ではさまれた行が、# (スペース込み)をstripしてYAMLとして解釈され、それが@metaに格納される。

1つのスペースを削除して解釈するのはYAMLにおいてスペースが意味をもつからだ。他のマクロやRubyのmagic commentにひっかからないように使用を決定したつもりだが、異論があれば修正するつもりだ。既にPureDocのリポジトリをアップデートしてある。

例えばこの文書では

##–*–*–*–*–*–*–*–##
# title : PureDocにYAMLメタデータ機能を追加
# since : 2014-09-01 15@29:00 +09:00
# tags: [devel, programming, ruby, utility]
##–*–*–*–*–*–*–*–##

というメタデータを書いてある。もちろん、仕様自体がこのような見た目のよいコメントブロックを書きやすいように考慮したものだ。

このためのコードは

# Process META DATA
# META DATA is start and end line beginning ##--.
# Lines between them is proceed as YAML after strip beginning "# " .
docstr = ARGF.read # Content

begin
if docstr =~ /^##--.*$/ $' =~ /^##--.*$/
yax = $`.each_line.map {|i| i.sub(/^# /, "") }.join
DOC.meta = YAML.load(yax) || Hash.new
end
rescue
DOC.meta = {}
end

正規表現でマッチ位置を決めて、そこから後ろでさらにマッチを探し、そしてその前、という形で「中身」を取りだし、行のEnumerableにしてからstripしている。失敗は例外任せ。

@metaをどう使うかは規定がないが、基本的には文書中で参照するためにある。また、PureDoc自体をparseしないプログラムからでもメタデータだけを読みたい要望があるかもしれないので、メタデータは#isの中ではなくここで定義することが望ましい。