Cocoa勉強会資料(5/18用)

18日に行うCocoa勉強会の資料です。

CocoaOfCoC.zip.

内容は、Cocoaで設定より規約をやってみたみたいな。

OSBundleLibraries

kextを作る時、info.plsitに手作業で依存するライブラリを記述する必要がある。

OSBundleLibrariesにライブラリの識別子と互換性がある最低バージョン版番号を記述する。

例えばこんな感じ。

<key>OSBundleLibraries</key>
<dict>
        <key>com.apple.kpi.iokit</key>
        <string>12.3</string>
</dict>

この時、どのライブラリのどのバージョンに依存しているかは、”kextlibs”コマンドで確認する事が出来る。

例えばこんな感じ。

$ kextlibs PATH/FILE.kext
        For all architectures:
        com.apple.kpi.iokit = 12.3

いちいち手作業でライブラリの依存関係を調べるのは面倒くさいので、一度ビルドした後に”kextlibs”コマンドで、依存関係を出力させて、plsitに転記するのが楽。

また、”kextload”時に

/PATH/FILE.kext - no compatible dependency found for com.apple.kpi.iokit.

とか

Check library declarations for your kext with kextlibs(8).

等のエラーが出た場合も、悩まずに”kextlibs”ですぐにライブラリのidとバージョンを出力させて、info.plsitを確認すると良い。

2ボタンキーボード

週間アスキー で紹介されていた、英数/かなキーボード for Macintosh をパクってArduinoで作ってみた。

ハードウェア

ハードウェアは2つのボタンを”Arduino Leonardo”のPin13とPin12につないだだけ。

プルアップ抵抗もソフトウェアでONにするので、ハードウェア側には無し。

作図がメンドクサイので図は無し。

ソフトウェア

Arduino IDEに付属のKeyboardライブラリだと「英数/かな」キーコードが送れない仕様だった。

生のキーコードが送れるソースコード が公開されていたので、そのコードを利用して以下のようなコードを書いた。

#include "USBrawkeyboard.h"

USBrawkeyboard rawkybd;

#define RIGHT_KEY_CODE 0x90
#define LEFT_KEY_CODE  0x91

const int kRightSwitch = 12;
const int kLeftSwitch  = 13;

int gPreviousRightSwitchState = 0;
int gPreviousLeftSwitchState  = 0;


void setup()
{
  pinMode(kRightSwitch, INPUT_PULLUP);
  pinMode(kLeftSwitch, INPUT_PULLUP);

  delay(1000);

  gPreviousRightSwitchState = digitalRead(kRightSwitch);
  gPreviousLeftSwitchState  = digitalRead(kLeftSwitch);

  Keyboard.begin();
  rawkybd.begin() ;

  delay(1000);
}

void loop()
{
  int theRightSwitchState = digitalRead(kRightSwitch);
  int theLeftSwitchState  = digitalRead(kLeftSwitch);

  if( theRightSwitchState != gPreviousRightSwitchState )
  {
    if( theRightSwitchState == LOW )
    {
      rawkybd.press(RIGHT_KEY_CODE);
    }
    else
    {
      rawkybd.release(RIGHT_KEY_CODE);
    }
    gPreviousRightSwitchState = theRightSwitchState;
  }


  if( theLeftSwitchState != gPreviousLeftSwitchState )
  {
    if( theLeftSwitchState == LOW )
    {
      rawkybd.press(LEFT_KEY_CODE);
    }
    else
    {
      rawkybd.release(LEFT_KEY_CODE);
    }

    gPreviousLeftSwitchState =      theLeftSwitchState;
  }

  delay(100);
}

コチラからダウンロード出来ます。 sketch_apr14a.zip

今のところ入力モードの切り替えしか出来ないのでホンノリ便利に使えるMacOSX側のユーティリティーが出来ないか妄想中。

参考文献

Arduino IDEに付属のKeyboardライブラリだと生のUSBキーコードが送れない仕様だったので、このサイトにあるソースコードを流用させていただきました。
ここ以外に「英数/かな」のキーコードが説明されているサイトは見つけられなかった。

tinker運用ノート(3)

tinkerを運用するにあたっての覚え書き

tinker運用ノート(1)tinker運用ノート(2) の続き

makeファイルを作って、よく使うコマンドをまとめる

アップロードしたり、プレビューしたりするのに毎回長いコマンドを打つのは面倒なのでMakefileにまとめる。こんな感じ。

PN := $(shell uuidgen)

all : clean build

clean :
    rm -rf ./blog/

cat :
    find . -name "*.rst" | xargs grep -e '^.. categories::' | cut -d':' -f4 | sort | uniq | tr -d ' '

tag :
    find . -name "*.rst" | xargs grep '^.. tags::' | cut -d':' -f4 | tr ',' '\n' | sort | uniq | tr -d ' '

build :
    tinker -b

preview : build
    open index.html

newPost :
    open `tinker -f -p "$(PN)"`


upload : clean build
    rsync -av --exclude=.DS_Store --exclude=.buildinfo blog/html/ USER@EXAMPLE.COM:/HTML/DIR/PATH/

先日の MacPortsでbash-completion と組み合わせると、そのディレクトリだけで有効なコマンドが出来たみたいで快適。

uploadはサーバーへアップロードするコマンド。

newPostはblogに新しい記事を追加するコマンド。私の場合は、内容を書いてからタイトルを決める事が多いので、デフォルトではページ名はuuidで生成された文字列にしました。 任意の名前にしたい場合は”PN=TitleString”を引数に付けると良い。日本語は不可。