mac で RamDisk

macRamDisk を使おうとしていろいろ試したけど、リブートしたらマウント外れたり、セーブ&リストアを強制されたりで、なんかしっくりくるのがない。

で、結局シェルスクリプトを書いた。特徴は下記。

  • セーブやリストアはしない
  • キャッシュ等を置きたいアプリは自分で登録する
  • システム起動時にマウントされる
  • マウントポイントは /Volumes/.RamDisk
  • Finder では untitled と表示される。誤操作防止のためイジェクトはできない
  • システム起動時に自動的にRAMDISKが作成されるようにするには、 Lingonを使う

使い方:

  1. RAMDISKにキャッシュを置きたいアプリのキャッシュフォルダ名を変数cachesに登録する。
    キャッシュフォルダ名は/Users/ユーザ/Library/Cachesの中を見ればわかる。
  2. 変数mbにメガバイト単位でRAMDISKの容量を設定する。
  3. Lingonをインストールして起動。
  4. Newボタンを押して、下の画像のように設定。
  5. リブート。
  6. ターミナルで"cd /Volumes/.RamDisk/cache/;ls -a"して、caches変数に登録した名前のフォルダができていることを確認。
  7. caches変数に設定したキャッシュフォルダを/Users/ユーザ/Library/Cachesから削除し、代わりにそれぞれ、
    "ln -s /Volumes/.RamDisk/cache/キャッシュフォルダ名 /Users/user/Library/Caches"
    としておく。
  8. 設定したアプリを起動してしばらく使った後、
    "cd /Volumes/.RamDisk/cache/キャッシュフォルダ名;ls -a"
    して、ファイルができてることを確認。

Finderで見た時の"untitled"っていう名前をなんとかしたいけど、よくわからんからまあいいや。

Monolingual が fixされてる模様

Mountain Lion だと Monolingual がいつまでたっても終わらないという不具合があった。

今日 1.5.7 にアップデートしたら、正常に終了できた。
 Languages:日本語と英語以外をすべてチェック
 Architectures:IntelIntel 64-bit以外をすべてチェック
上記の状態で確認済み。

emacsでもマーク位置をフリンジに表示

mac にスイッチしたので xyzzy から cocoa Emacs に移行中。
やっぱり細かなところの違いで違和感が感じる。

xyzzyはマークするとフリンジに目印が表示される。地味な機能だけど何気に役に立ってた。emacsにはないから、テキトーに書いてみた。

transient-mark-modeとかよりこっちの方がしっくりくる。


参考にさせてもらったところ:fringeの使い方


にしても、最近のemacsは transient-mark-modeとか、set-mark-default-inactiveとかややこしいのがいっぱい増えてて困惑した。
本家Emacs、大丈夫か?

Audio device switcher for Windows 7

windows 7 になってオーディオ再生デバイスの切替えが妙にだるくなった。
HDMI経由でヘッドフォンか本体内蔵音源か、はたまた USB-DAC か。

コントロールパネル / サウンド / 右クリック / 規定のデバイスとして設定

とか、いちいちやってられない。

win xp では SetPlayDevice が便利だったけど、これは vista/win7 では使えないと作者のページに書いてあった。

win7 では Vista Audio Changer の 1.04b が使えると聞いたけど、僕の環境ではかなりの頻度で落ちる。

なので、別のを探してたところにいいのを見つけた。

http://hardforum.com/showthread.php?t=1656534

一番上のエントリからダウンロードしてどこか適当なところに解凍し、exe をスタートアップに登録しとけばOK。あとは通知アイコンの左向きのスピーカーを左クリックすれば、再生デバイスを選択できる。実にお手軽。

windows 7 x64 でも問題なし。

PSoC でGPIO割り込みを使うときの手順

度忘れるので、いまさらながらメモっとく。

  1. Pinout の設定で、割り込みをかけたいポートの Interrupt を DisableInt 以外にする
  2. lib/PSoCGPIOINT.asm の59行目あたりに下記を追加

    ;---------------------------------------------------
    ; Insert your custom code below this banner
    ;---------------------------------------------------
    ljmp _GPIO_INT                                         // added
    


  3. main.c の main() 関数の先頭に下記を追加

    M8C_EnableGInt ;                             // <--- これはもともとあるので、アンコメントする
    M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);  // <--- 追加
    


  4. main.c に #pragma ディレクティブと割り込みハンドラを追加

    #pragma interrupt_handler GPIO_INT
    void GPIO_INT(void)
    {
        // do something
    }
    


注意点としては、

  • lib/PSoCGPIOINT.asm に追加した ljmp のジャンプ先ラベル名
  • #pragma ディレクティブで指定したシンボル名
  • 割り込みハンドラの関数名

が一致していないと割り込みが入らないこと。

ちなみに、F6(Generate / Build Project) とか Ctrl+F6(Generate Configuration Files) とかすると、lib 内のファイルは再生成されるので、lib/PSoCGPIOINT.asm に変更を加えるタイミングによっては変更前の状態に上書きされることもある。割り込みが入らないときは、もう一度 lib/PSoCGPIOINT.asm をチェックするのもいいかもしれない。

続 左手の小指を救え

こないだ作ったこれの続き。

使ってるといい感じなので、SHIFT キーもタッチセンサにしてみた。プロジェクト一式はここに。

CapSense のセンサが1つ増えても GUI で簡単にデバイス追加できる。下は PSoC Designer の Wizard 画面。

Buttons を 1 → 2に変えて、ポートにドラッグアンドドロップしただけ。楽ちんすぎて屁が出る (w

HHK Lite2 の基板と FIRST TOUCH 基板との接続に線4本足した。

ハードの変更はこれだけ*1。逆にソフトの方がめんどく感じる。

//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules

BYTE out_ctrl, out_shift, out_led;

void main(void)
{
	M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
	// Insert your main routine code here.
	M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
	CSD_1_Start();
	CSD_1_InitializeBaselines() ; //scan all sensors first time, init baseline
	CSD_1_SetDefaultFingerThresholds() ; 

	while(1) {
		BYTE ctrl, shift, led;
		CSD_1_ScanAllSensors();
		CSD_1_UpdateAllBaselines();

		// CTRL:  P0_2 -> P1_6
		if(CSD_1_bIsSensorActive(0)) {
			ctrl = 0x80;	// 10xx_xxxx: CTRL SENSEOUT LO
			led |= 0x04;	// xxxx_0100: BLUE LED ON (touch sw indicator)
		} else {
			ctrl = 0xC0;    // 11xx_xxxx: CTRL SENSEOUT HI (Hi-Z)
			led &= 0x0B;	//  ^
		}

		// SHIFT: P0_3 -> P1_7
		if(CSD_1_bIsSensorActive(1)) {
			shift = 0x40;	// 01xx_xxxx: SHIFT SENSEOUT LO
			led  |= 0x08;	// xxxx_1000: RED LED ON (touch sw indicator)
		} else {
			shift = 0xC0;   // 11xx_xxxx: SHIFT SENSEOUT HI (Hi-Z)
			led  &= 0x07;	// ^
		}

		out_ctrl = ctrl;
		out_shift = shift;
//		PRT1DR = (PRT1DR & 0xC0) | led;  // this line occurs mulfunction when typing '-' or '[' !!!
	}
}

BYTE p0, p0_old, diff;

#pragma interrupt_handler GPIO_INT
void GPIO_INT(void)
{
	// output keyboard matrix drive signal (active-lo)

	p0 = PRT0DR;
	diff = (p0 ^ p0_old);
	if(diff == 0x00) return;

	if(diff & 0x04)
		PRT1DR = (p0 & 0x04)? 0xC0 : out_ctrl;
	else if(diff & 0x08)
		PRT1DR = (p0 & 0x08)? 0xC0 : out_shift;

	p0_old = p0;
}

ソフトの構成はあまり変わらないが、割り込みハンドラでやることが若干増えた。キーマトリクスのドライブ側のエッジを割り込みで捕まえるのはいいとして、CTRLとSHIFTのどちらで割り込みが入ったのかはわからない。結局は割り込みハンドラの中で判断してるけど、少々めんどくさい。それと、なんでか LED インジケータがバグってる*2ので無効にしてる。なんでか。

外見的には、

写真ではわかりにくいけど、メンブレンシートをカットして、キーの高さを低くしといた。これで小指の負担をさらに軽減できる。

蛇足ながら FIRST TOUCH 基板の回路図とかは Cypress のサイトにある。直リンはよく切れるから探して、落とせる。zip には回路図だけじゃなく、基板のアートワークやらガーバーデータやらBOMやら、一通り入っている。

PSoC って、このへんが至れり尽くせり。慣れるとふつうのワンチップマイコンに戻れなくなりそうで、ちょっと怖くなってきてたり。

*1:他にもポートの設定を変えたり、 チップ抵抗(R9)を外してたりするけど。

*2:誤入力を起こす

左手の小指を救え

Emacs系のエディタを使っていると朝から晩までCTRLキー押しっぱなし。お陰で左手の小指は常に痛い。
あまりにも辛いので、HHK Lite2*1 の CTRLキーをタッチセンサにしてみた。

今回は Cypress の PSoC を使う。横着して FirstTouch のFTMF基板にテキトーに配線して筐体に押し込んだ。

一応 GitHubPSoC Designerのプロジェクト一式を置いておく。

手書きで汚いけど、接続はこんな感じ↓。

下はソフトウェア部分。PSoC はハードウェア初期化を書かなくていいから楽だ。

//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules

BYTE out_p1;

void main(void)
{
	M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
	// Insert your main routine code here.
	M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
	CSD_1_Start();
	CSD_1_InitializeBaselines() ; //scan all sensors first time, init baseline
	CSD_1_SetDefaultFingerThresholds() ; 

	out_p1 = 0x40;
	while(1) {
		BYTE val_p1 = out_p1;

		CSD_1_ScanAllSensors();
		CSD_1_UpdateAllBaselines();

		if(CSD_1_bIsSensorActive(0)) {
			val_p1 |= 0x04;  // BLUE LED HI (touch sw indicator)
			val_p1 &= ~0x40; // SENSEOUT LO
		} else {
			val_p1 &= ~0x04; // BLUE LED LO
			val_p1 |= 0x40;  // SENSEOUT HI (Hi-Z)
		}
		out_p1 = val_p1;
	}
}


#pragma interrupt_handler GPIO_INT
void GPIO_INT(void)
{
	// P0_2: keyboard matrix drive signal (active-lo)
	PRT1DR = (PRT0DR & 0x04)? 0x40 : out_p1;
}

メインループでセンサを読んどいて、キーボードマトリクスのドライブ周期をエッジ割り込みで捉えて乗せるだけ。ソフトで出力してるから若干遅れるけど、CPU_Clock = 24MHz/2 くらいなら問題なく読み取ってくれるようだ*2

下はセンサの電極部分。CTRLキーのキートップの裏側に銅板*3を貼って、ホットボンドで止めとく。センサの配線は黄色の1本のみ*4

USBハブ基板を取り去って、代わりに書込器用のヘッダをつけとく。これでCapSense の感度を後で調整できる。

左手小指はCTRLキーに乗せているだけ。ああ、なんて楽なんだ。
これでまた一歩、普通のキーボードにさわれない体に近づいた。

*1:ちなみに、これは「もらいもん」

*2:CPU_Clock = 24MHz/16だとさすがにダメだった。

*3:粘着テープつき t=0.1mm

*4:緑線は予備