2012/10/23

Blogger 投稿後の「google+で共有」を表示されないようにする

投稿したり記事を変更したりするたびに「google+で共有」というダイアログが表示される。


非常にうっとうしい。毎回、意味が分からないままESCキーを押して消していた。

これを無効化するには、Bloggerの設定ページ > Google+ とたどり、「投稿後に共有のメッセージを表示する」のチェックを外せばいい。

はてなダイアリーからBloggerに移行する

はてなダイアリーの無料プランの広告がいい感じにうっとおしくなってきたので、Bloggerに引っ越してみました。

http://d.hatena.ne.jp/hhh/20100509/1273392585

いったんMTにしてインポートするみたい。
でも作成日時がインポート日時になる記事が10件ほどありました。
改行も多めに入るし、脚注とかもおかしい。ちょっと難はあるけどまあそのうち直そう。

2012/10/22

Mac で RamDisk

Mac (Mountain Lion)で RamDisk を使おうとして、Esperance DV とか Ramdisk On Menubar とかいろいろ試したんですが、
  • リブートしたらマウント外れたり
  • シャットダウン時にRamDiskの内容を強制的にセーブしたり
  • 起動時にRamDiskの内容を強制的にリストアしたり
  • メニューバーにRamDisk操作用のアイコンが表示されたり
などなど、なんかしっくりくるのがないので、結局シェルスクリプトを書きました。
特徴は
  • セーブやリストアはしない
  • キャッシュ等を置きたいアプリは、自分で登録したり symlink を貼る必要あり
  • システム起動時にマウントされる
  • マウントポイントは /Volumes/.RamDisk
  • Finder では untitled と表示される。誤操作防止のためイジェクトはできない
  • システム起動時に自動的にRAMDISKが作成されるようにするには Lingon を使う
といったものです。


使い方:
  1. RAMDISKに置きたいアプリのキャッシュフォルダ名を変数cachesに追加。
    キャッシュフォルダ名は /Users/ユーザ/Library/Caches の中を見ればわかります。
  2. 変数mbにメガバイト単位でRAMDISKの容量を設定。
  3. Lingonをインストールして起動。
  4. Newボタンを押して、"Users Daemons" を選択し、下の画像のように設定。



  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:IntelとIntel 64-bit以外をすべてチェック
上記の状態で確認済み。

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

f:id:gnrr:20121022180539p:image

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

xyzzyではC-SPACEでマークするとフリンジに目印が表示されます。地味な機能だけど何気に役に立っていたようで、なくなると寂しいものです。emacsにはないから、テキトーに書いてみました。
習慣とは恐ろしいもので、transient-mark-mode とかよりこっちの方がしっくりきます。

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

にしても、最近のemacsは transient-mark-modeとか、set-mark-default-inactiveとかややこしいのがいっぱい増えてて、ちょっと困惑しました。

2012/07/05

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 でも問題なし。





2012/02/19

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 をチェックするのもいいかもしれない。





2012/02/07

続 左手の小指を救え



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


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


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


f:id:gnrr:20120208014706p:image:w360


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


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


f:id:gnrr:20120208014109p:image:w360

ハードの変更はこれだけ*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ので無効にしてる。なんでか。


外見的には、


f:id:gnrr:20120208014106j:image:w360


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


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


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




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


*2:誤入力を起こす





2012/01/28

左手の小指を救え



Emacs系のエディタを使っていると朝から晩までCTRLキー押しっぱなし。お陰で左手の小指は常に痛い。

あまりにも辛いので、HHK Lite2*1 の CTRLキーをタッチセンサにしてみた。


f:id:gnrr:20120127233946j:image:w360


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


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


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


f:id:gnrr:20120127233128p:image:w360


下はソフトウェア部分。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


f:id:gnrr:20120127234032j:image:w360


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


f:id:gnrr:20120127234034j:image:w360


左手小指はCTRLキーに乗せているだけ。ああ、なんて楽なんだ。


これでまた一歩、普通のキーボードにさわれない体に近づいた。




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


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


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


*4:緑線は予備





2012/01/08

xming を気軽にテスト



すでに teraterm とかで telnetで linux につながってて、でも ssh とか入れるのめんどくさいときに手軽にテストするには、次のように。



  1. windows に xming をインストール

    ココとかを参考に。

    puttyはとりあえずは入れなくていい。

  2. X0.hosts ファイルに、linux マシンのIPアドレスかホスト名を書く

    X0.hosts は xming のインストールフォルダにある。

  3. xming を再起動

  4. linux マシンにログインして下記実行

    ~/.profile に

    export DISPLAY="192.168.100.2:0"


    とか書き足して、飛ばし先のwindowsマシンを指定しといて、

    . ~/.profile


    として効かしとく。

  5. テスト
    linux マシンのコンソールで

    xterm


    とか入れるとウィンドウが開くはず。


これで ssh なしで X 飛ばすことができるが、セキュリティに難有り。


ちゃんと使うならやはり ssh 接続すべし。これはあくまでテスト用。





TortoiseGit / github のリポジトリを作って既存のプロジェクトをつっこむ



よく忘れるのでメモ。




  1. github にログインして 黒い「New repository」ボタンを押す

  2. Project Name を適当に入れて、「Create repository」ボタンを押す

  3. 表示された案内に書いてある「Next steps:」の「git@github.com:なんちゃら.git」の部分をコピる

  4. Exproler でローカルの適当なフォルダ内で右クリックして、TortoiseGit のメニューから「Git Clone...」を選択

  5. 下記のように設定して「OK」する
    f:id:gnrr:20120109013946p:image:w300
    ローカルフォルダにディレクトリができて、その中に .git フォルダができる

  6. .git フォルダと同じ階層に、管理したいプロジェクトフォルダの中身を放り込む
    f:id:gnrr:20120109013947p:image:w300

  7. そのフォルダ内のなにもないところで右クリックして、
    TortoiseGit のメニューから「Git Commit -> "master"...」を選択

  8. 下記のように設定して「OK」する
    f:id:gnrr:20120109013948p:image:w300

  9. ついでにPushしとく
    f:id:gnrr:20120109013950p:image:w300
    f:id:gnrr:20120109013949p:image:w300


再度 github を見に行って、リポの中身が反映されていたらOK。


もちょっと簡単にやる方法があるような気がする…。