FLYING

/* TODO: 気の利いた説明を書く */

Eclipse先生に「Unresolved Inclusion」と怒られないAndroid NDKのセットアップ方法

最新のCDT Plugin/ADT Plugin/Android SDK/Android NDKの組み合わせで「Unresolved Inclusion」のエラーが多発するので、その解決方法をメモ。結論から言うと、単体のEclipseにCDT Pluginをインストールし、ある箇所の設定を変更した上でADT Plugin/Android SDK/Android NDKをインストールすれば解決する。

以下にWindows環境での具体的な手順を載せる。Macでも同様の手順でインストール可能だと思われる。

1. Eclipseの導入

公式からEclipse Classicをダウンロードして適当な場所に配置する。今ならJuno(Version 4.2.x)でイイと思う。

2. CDT Pluginの導入

Eclipseを起動し、Help→Install New Software……を実行。「Work with」の欄で「Juno」を選び、下のパッケージ一覧からProgramming Language→C/C++ Development Toolsにチェックを入れてインストール。再起動を求められるので再起動する。

3. 設定の変更

ここが(たぶん)重要。

EclipseのメニューからWindow→Preferencesを開き、C/C++のセクションにある「Property Pages Settings」を表示する。「Display "Preprosessor Include Paths" tab and enable language settings providers」のチェックを外す。この部分がCDTの最近のバージョンで追加された機能で、Android NDKとの相性がよくないようだ。

チェックを外したら必ず「Apply」を押しておく。

4. Android SDK/NDKの導入

公式からAndroid SDKをダウンロードする……のだが、いきなり「Download the SDK」のボタンを押さずに「USE AN EXISTING ONE」のセクションを開き、「Download the SDK Tools for Windows」を選ぶ。これでEclipseが同梱されていない単体のSDKをダウンロードできる。ダウンロードが完了したら、インストーラを実行してインストールする。

併せてNDKをダウンロードして適当な場所に配置する。通常の手順と同様、各プラットフォーム用のものを選べばOK。

5. ADT Pluginの導入

CDT Pluginの導入と同じ手順でInstall New Software……を開き、「Work with」の欄に「https://dl-ssl.google.com/android/eclipse/」を入力してAddする。表示用の名前を聞かれるので、適当に「ADT」とかにしておく。下の欄にDeveloper ToolsとNDK Pluginsが表示されるので、両方にチェックを入れてインストール。再起動を求められるので再起動する。

再起動したら、Window→Preferencesを開きAndroid SDK LocationとNDK Locationを正しく設定する。

ここまでで開発環境の導入は完了。以降、「Add Native Support」でNDK対応化したAndroidプロジェクトでは「Unresolved Inclusion」のエラーは発生しない(はず)。既に「Add Native Support」して「Unresolved Inclusion」な状態になっているプロジェクトについては、次の手順で一旦通常のAndroidプロジェクトに戻した後、再度「Add Native Support」する。

6. Remove Native Support

事前にプロジェクトのjni以下のフォルダをバックアップし、Eclipseを終了しておく。プロジェクトの.cprojectファイルとbinフォルダの中身を削除し、下記のように.projectファイルの中身を編集する。

  • buildSpec要素のうち、子のName要素が「org.eclipse.cdt」で始まるものを削除。
  • nature要素のうち、値が「org.eclipse.cdt」で始まるものを削除。

編集したら、Eclipseを起動する。該当プロジェクトが通常のAndroidプロジェクトに戻っているのを確認し、改めて「Add Native Support」を実行する。最後にバックアップしたjniフォルダの中身を新しいjniフォルダにコピーすれば完了。

Tumblrのショートカットキーを置換する

dashboardでいちいちoption+R/Eキーでrblgするのが指的に辛いので,ChromeのUserScriptでR/Eキー単体でrblgできるようにした。ソースは下記から。

KeyboardEvent#stopPropagationでイベントの伝播を止めつつ,似非KeyboardEventを生成して,Tumblr側のjsで定義されているkeydownのイベントハンドラに渡してやるという実装になっている。

バッドノウハウっぽいポイントとしては,ウェブページのコンテキストで関数を実行する下記の関数と……

var executeBrowserContext = function(f) {
	var code = f.toString();
	var script = document.createElement("script");
	script.textContent = '(' + code + ')();';
	document.body.appendChild(script);
};

Chrome向けにむりやりKeyboardEventインスタンスを生成する下記の関数。

var createEvent = function(charCode, optionKey) {
	var e = document.createEvent('KeyboardEvent');
	Object.defineProperty(e, 'charCode', {
		get: function() { return charCode; }
	});
	Object.defineProperty(e, 'shiftKey', {
		get: function() { return optionKey; }
	});
	Object.defineProperty(e, 'altKey', {
		get: function() { return optionKey; }
	});
	return e;
};

そんな感じの怪しい実装なのだが,とりあえず手元のChrome(Version: 25.0.1364.99)では動いている。

追記(2013-03-16T15:09:00+09:00)

LキーでのLikeトグルが動かない不具合があったので,スクリプトを修正した。

Tumblrがデフォルトで無限リブログに対応してくれた

たぶん今更感のある話題なのでみんな知っているんだと思うのだけど,久々にdashboardでrblgしようとしたら,Tumblr Lifeのキーボードショートカットがうまく働かなくなっていた。で,どこが原因なのかを調べる過程で,そもそもデフォルトでrblgやlikeのショートカットキーが用意されていたことを知った。
Macならoption+Rでrblg。option+Eでエンキュー。option+Lでlike。Windowsの場合はshift+R,shift+E,shift+Lが対応するようだ。エンドレススクロール機能もTumblr側に付いているので,標準環境でも無限rblgできるようなお膳立てがされたというわけだ。
そういう感じなので,今までお世話になったTumblr Lifeに感謝しつつ,標準ショートカットキーに乗り換えることにした。ただ,optionとの同時押しが難しいので,キーカスタマイズができるような仕組みを考えるかも。

USBサスティンペダルを作った

以前買ったmicrokey-61にはサスティンペダルを繋ぐ端子が用意されていなかったので,単体で使えるサスティンペダルを作った。これはMIDIコントローラとして動作して,ペダルを踏んだり踏まなかったりすることで,Control Changeの64番を送信する。

必要なものとしては,どこのご家庭にもあるArduinoとキーボード用のフットペダル,抵抗,LED(これはオプション)くらいのもの。Arduinoがだいたい最低でも2000円くらい,フットペダルがYAMAHAのFC-5で1000円くらいするので,3000円くらい出してもいいよって人向け。どうせ工作するならボリュームやらトグルスイッチやらを付けて,汎用MIDIコントローラとして使う方が嬉しみがあるかもしれない。

回路図。Hello Worldレベルなので私にも作れました。スイッチが絶縁状態だと電流が流れないので電圧降下も起こらず,端子電圧=VCCになるのがポイント。LEDの回路は特に必須ではないが,動作が正しいことを確認するために付けておいたもの。

完成品の写真*1

フットペダルのインターフェイスは6.3mmのモノラルプラグなので,このような箱型のジャック部品を用意しておく。私が使ったペダルとジャックの組み合わせだと,下の写真ではんだ付けされている2つの端子がスイッチによって導通したり絶縁されたりした。スイッチを踏むと絶縁状態,足を離すと導通状態だということが分かったので,踏んだ状態がHIGHで離した状態がLOWになるよう回路を組んだ。

Arduinoのスケッチ。

int pin_switch = 12;
int pin_led = 13;
int prev_value = 0;

void setup() {
  pinMode(pin_switch, INPUT);
  pinMode(pin_led, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  int value = digitalRead(pin_switch);
  if (value != prev_value) {
    digitalWrite(pin_led, value);
    sendMidiMessage(0xb0, 64, value == HIGH ? 127 : 0);
  }
  prev_value = value;
}

void sendMidiMessage(unsigned char message, unsigned char control, unsigned char value) {
  Serial.write(message);
  Serial.write(control);
  Serial.write(value);
}

実際には,MIDIと同等のデータをSerial over USBで送信しているだけなので,これをPC側でMIDI信号に変換してあげる必要がある。この変換をやってくれるのがThe Hairless MIDI to Serial BridgeというフリーソフトMac環境の場合,Audioのシステム設定でIAC Driverを有効にして仮想バスを出力用に1つ作成,Bridgeの出力をそこに繋ぐ。

DAWなどのソフトウェアで,MIDI入力にキーボードと前述の仮想バスを設定することで,サスティンペダルとして使えるようになる。回路にボリュームやスイッチを増やせば,他のControl ChangeやNote On/Offの信号も送れるようになるし,PC側で工夫してあげれば,フットスイッチのON/OFFをエロゲのスペースキー代わりにするようなこともできると思う。

ちなみに,スケッチの中にSerial.begin(115200);という行があるが,これはシリアル通信のボーレート(bps)を指定している部分で,Bridge側の設定とこの数字を合わせておかないと,うまく信号を送受信できないので注意。また,Arduino特有の注意点として,0番ピン及び1番ピン(RX/TXと印字されている)はシリアル通信に利用されるので,ここに他の入出力を繋ぐと回路が動かない原因に延々と悩むことになる(悩んだ)。

*1:実は写真の回路に付いている抵抗は上の回路図で示したものとは微妙に違うのだが,理想的には回路図に示したような値の抵抗を使うのがいいと思う。LEDを駆動するならおそらく10mAもあれば充分だし,スイッチを流れる電流はどうせ無駄なので抵抗はそれなりに大きいもののほうがよい

ピアノ独習

『休日に何してる?』と聞かれて「寝てます……」『あっ…(察し)』という流れになったので趣味を拡充しようと思い,MIDIキーボードを購入,両手でそれなりにピアノ(というかキーボード)が弾ける状態を目指すことにした。

キーボードはKORGmicrokey-61。61鍵ながら学習机の上に置けるサイズで,KORG Legacy Collectionが付属するのでDTM用途には嬉しい製品だと思う。値段を考えれば「MIDIキーボード付きソフトウェア音源」と言ってしまってもいいだろう。サスティンペダルを接続するインターフェイスがないのが残念だが,いざとなればArduinoで自作するつもりで居る。ちなみに,練習するときはKORG Legacy Collectionの一部であるM1の音源をスタンドアローンで起動し,ピアノ系のプリセットを選んで鳴らしている。

キーボードと併せてこのスコアを買った……が,燦然と輝く「中級」のラベルに偽りなし,超初心者が突然弾ける代物でもなかったので基礎から独習することにした*1

独習するからには何かしら教科書が必要だろう,ということで「おとなのためのピアノ教本」を購入。全5巻のシリーズで,1巻でバイエル前半レベル,2巻でバイエル後半レベルの内容が身に付くとされている*2。右手で単純なメロディを弾くところから始まり,両手を動かす練習,スリーコードの導入,8分音符や付点4分音符の導入,いくつかの簡単な伴奏形の練習,ハ長調ヘ長調での練習曲……と言った内容が第1巻で網羅される。

個人的に嬉しいのは,指示に従って練習を進めるだけで(C Majorスケールであれば)C・F・G・G7などのごく基本的なコードの知識と,コードを使った伴奏方法を習得できるという点だ。知識面での解説が詳しくされているわけではないが,なんとなーく耳コピしたりメロディにコードを付けたりしたいと考えている私にとって,このシリーズをこなすことがひとつの足がかりになるのではないかと期待している。

そんなこんなで練習を始めてから2週間ほどで1冊目を(一応)ひと通りこなし,単純なスリーコードの伴奏とともに8分音符や付点4分音符が登場するような曲を両手で弾けるようになった……が,まだ登場する楽譜が単純なので,元々目標としていたようなピアノらしい音の響きを体感できる地点までは到達していないように感じる。これが2冊目をこなすことでどう変わっていくのかが楽しみだ。

*1:昔少し練習して「ひぐらしのなく頃に」の『you』を弾けるようにはなったが,これまでの経験といえばほぼそれのみ

*2:バイエルはピアノを習うとよく課される初心者用の練習曲集。ピアノを習ったことがなかったので,練習曲集の存在も今までほとんど知らなかった

build.xmlにjar生成用の記述を追加

Eclipseで作ったAndroidプロジェクトをコマンドラインでビルドするで作ったbuild.xmlに,jarを生成するための記述を追加するメモ。
下記の記述をproject要素の末尾に追記しておく。

<target name="jar">
	<delete dir="./bin/*" />
	<delete file="./hoge.jar" />
	<javac
		srcdir="./src;./src-optional"
		destdir="./bin"
		classpath="./libs/optional.jar;${sdk.dir}/platforms/android-16/android.jar">
		<!-- SDKバージョンは適宜書き換える -->
	</javac>
	<jar jarfile="./hoge.jar">
		<fileset dir="./bin" includes="**/*.class" />
	</jar>
</target>

追記後にant jarとすることでプロジェクト直下にhoge.jarが生成される。
ちなみに,EclipseのPackage Explorerで特定フォルダを選択した状態でexport→jarと選ぶことで,速やかに特定フォルダのjar書き出しができることを知ったので,上記のコードは不要になった。

「出、出た〜www○○奴〜www」のガイドライン

最近流行しているネットスラングで「出、出た〜www○○奴〜www」というものがある。「○○」の部分に何かしら突っ込みどころのある文言を入れる一種のあるあるネタなのだが,「煽られて必死奴〜」「文系気取り奴〜」などの例に見られるように,送り仮名をわざと省略する形で多く使われている*1
発祥は2chだと思われるが,この1年ほどでTwitterなどのSNS・個人ブログでも使用例が散見されるようになった。また,数は少ないが,送り仮名をすべて省略して似非漢文のような形で使われている例もある*2
微妙に変化しつつ使われ続けている,というのは間違いがなさそうなので,2chに限ってその初出と変遷をまとめてみた。

2005/02/05 - ネット実況板

http://mimizun.com/log/2ch/ogame/1107563873/
初出という意味ではおそらくここだろう,というスレ。このスレを契機に「で、でたー!」というフレーズがネット実況板で流行することになったのではないかと思う。末尾が「奴」で固定されているわけではなかったり,日本語として正しい文章になっているなどの点で今の形とは異なる。

http://mimizun.com/log/2ch/ogame/1118913807/
同年の6月頃になると,既にこのフレーズを使ったスレが乱立していた様子が伺える。

2011/03/02 - ニュー速VIP

http://mimizun.com/log/2ch/news4vip/1298994218/
現行の形が完成されたのはおそらくここだろう,というスレ。「で、でた〜」で始まり「奴〜」で終わる,日本語として不自然,などの特徴をすべて備えている。この頃までには既に2ch全板に飛び火していたようだ。

2012/06/02 - ニュー速VIP

http://mimizun.com/log/2ch/news4vip/1338567833/
送り仮名をすべて省略するスタイルが確立されたのはおそらくここだろう,というスレ。初出が7年前であることを考えると,この形に変化したのは比較的最近のことであると言える。

最後に

http://search.takatyan.info/http://mimizun.com/などで検索した結果をまとめただけなので,2ch外での使用例や,過去ログとして保存されていないスレについては見逃している可能性も当然あるので注意が必要である。
また,で、でたーw◯◯奴〜wwwの元ネタによれば,「タイホー工業クリンビューというコーティング剤のCMが元ネタ」という説もあるので,こちらも併せて参照されたい。

関連として2003年頃に流行した下記のコピペを挙げておく。

今日、電車乗ってたら、前にキモオタが二人乗ってきた。

なんか一人がデカイ声で「貴様は〜〜〜!!だから2ちゃんねるで馬鹿に
されるというのだ〜〜〜!!この〜〜〜!」
ともう片方の首を絞めました。
絞められた方は「ぐええぇーー!悪霊退散悪霊退散!!」と十字を切っていた。
割と絞められているらしく、顔がドンドンピンクになっていった。

渋谷でもう一人、仲間らしい奴が乗り込んできてその二人に声をかけた。
お!忍者キッドさんとレオンさん!奇遇ですね!」 「おお!そういう君は****(聞き取れず。何かキュンポぽい名前)ではないか!
 敬礼!」
「敬礼!出た!敬礼出た!得意技!敬礼出た!敬礼!これ!敬礼出たよ〜〜!」
俺は限界だと思った。

*1:ここで普通に日本語として通る文にしてしまうと,「使い方が間違っている」などと指摘されることもあるようだ。

*2:http://mimizun.com/log/2ch/news4vip/1346432450/など。