Showing posts with label プログラミング. Show all posts
Showing posts with label プログラミング. Show all posts

2023-07-30

アナログジョイスティックデバイスを最新のQMK Firmware 0.21に対応してみた [自キ沼#35]

見慣れたNintendo Switch Joyconのアナログジョイスティックの保守部品を、以前から自作のLilithキーボードに組み込んでいます。

当初はQMK 0.12上でアナログデータを直接読み取ってマウスポインタ移動情報を生成していましたが、思ったほどスムーズな動きが実現できていなくて、メイン利用のMagic Trackpadを無くすにはまだまだです。

QMKの最近のバージョンを見ていると、アナログジョイスティックのドライバが少し前から提供されるようになっています。
このドライバが、QMK 0.21の設定だけでどこまで使えるかを今回試してみました。

ADC(ADコンバータ)入力はPro Microのほぼ全てのピンでサポートされています。
どのピンに接続するのかはconfig.hで設定します。
マウスボタンをレイヤに定義するだけで動作する自動マウスレイヤ機能や、左右分割キーボードでホストに接続していない側にジョイスティックがあっても動作させられるsplit pointing機能も、使えるようになりました。
以下、QMKに設定した内容です。

rule.mk :

POINTING_DEVICE_ENABLE = yes
POINTING_DEVICE_DRIVER = analog_joystick 

config.h :

// アナログジョイスティックの基本設定
#define ANALOG_JOYSTICK_X_AXIS_PIN F4 // ADC機能のある任意のピン
#define ANALOG_JOYSTICK_Y_AXIS_PIN F5
#define ANALOG_JOYSTICK_SPEED_REGULATOR 5 // default 20
#define ANALOG_JOYSTICK_SPEED_MAX 1 // default 2
// 自動マウスレイヤ機能
#define POINTING_DEVICE_AUTO_MOUSE_ENABLE
//#define AUTO_MOUSE_DEFAULT_LAYER 3 // 今回はkeymap.cで設定した
// 左右どちらのPro Microをホストに繋いでもジョイスティックが動作するように
#define SPLIT_POINTING_ENABLE
#define POINTING_DEVICE_RIGHT

keymap.c :

void pointing_device_init_user(void) {
    set_auto_mouse_layer(3);       // 今回はレイヤ3にKC_BTN1とKC_BTN2を置いた
    set_auto_mouse_enable(true);
}

最新のQMK Firmwareのアナログジョイスティックドライバで良い点は以下です。

  • 上記の簡単な設定だけで、ポインタ動作がある程度スムーズに動作するようになります。操作に慣れればこれだけでも日常使いできるかもしれないレベルです。
  • 抵抗値の変化でアナログ的に出力をするジョイスティックであれば、どのデバイスでも汎用的に対応できそうです。たまたまなのかもしれませんがセンターの抵抗値のキャリブレーションなしで問題なく動いています(ソースコードを確認しておきます)。
  • 自動マウスレイヤや、split pointingなど高度な機能を実現できます。

 この方式の現状の課題は以下です。

  • Joyconのアナログジョイスティック部品は0.5mmピッチのFPCリボン接続です。コネクタの手ハンダは(私には)無理なのでPCBA必須なのが費用的に少し不利です。PSP用の部品など他のデバイスも試してみたいところです。
  • ポインタ動作はほぼスムーズなのですが、小さな動きが少し難しいのと、大きく動かすのもじれったい感じがあるので、移動量データに補正を入れるなどして、なんとかしたいところです。
  • ポインタ操作でスクロールするモードも試してみたのですが、スクロール速度が速すぎるのを調整できていません。他の仕組みのポインティングデバイスであればCPIの設定等があるようなのですがアナログジョイスティックではできません。何が起こっているのかもう少し解析が必要です。

完成形まで後少しといったところかな、と思います。

この投稿は自作Lilithキーボード(LilithKbd)を使って書きました。

2023-07-26

AZ1UBALLをPro MicroでQMK Firmwareな自作キーボードで使うための検証をした(Pro MciroとRP2040) [自キ沼 #34]

AZ1UBALL(BOOTHの購入ページ、githubの技術情報)を現時点の最新のQMK Firmware version 0.21.3で動かしてみました。
最新のQMKを使うと非常に少ないコードで対応できました。
まだ実験なので、SU120から空中配線しています(写真は載せませんがお察しください)。

ポインティングデバイスのドライバの説明はこちらです。
Pro Microとの接続ピンは、I2C通信なのでD1とD2で固定です。
以下、QMKに設定した内容です。

rule.mk :

POINTING_DEVICE_ENABLE = yes
POINTING_DEVICE_DRIVER = pimoroni_trackball

config.h : ポインタの移動速度、2倍が限界、これ以上だとポインタが飛び飛びになる

#define PIMORONI_TRACKBALL_SCALE 10    // default 5

keymap.c : 加速度モードを設定しようとしています、必須ではない

// AZ1UBALL
void pointing_device_init_kb(void) {
    uint8_t addr=(0x0a << 1 );        // ic2 address with 1bit shift up
    //uint8_t data[]={0x90, 0x00};    // AZ1UBALL normal speed mode
    uint8_t data[]={0x91, 0x00};      // AZ1UBALL accellaration mode
    uint16_t timeout=100;             // in milli-seconds
    i2c_status_t status;
    status  = i2c_transmit (addr, data, 1, timeout);
    //if (status != I2C_STATUS_SCCESS) {
    if (status != 0) {
        return;
    }
}

AZ1UBALL を実際に試してみて良いな、と思った点を挙げます。

  • 触感:どういう仕組みなのかわかりませんが、操作するとジ、ジ、ジと指先にクリック感が来ます。これがとても良いフィードバックです
  • 細かな操作:細かな操作はとても直感的に行えます
  • QMKですぐ動作:I2C接続のPiromoni互換のトラックボールとして設定するだけで動きます
  • 1u、ロープロファイル:16mm角の正方形なのでキーボードの1uの余裕で収められます。また、ソケットプレートの上に置いて、ちょうどロープロファイルキーボードのキートップと同じくらいの高さに抑えられているので、デザインの自由度が大きいです

工夫して使わないと、と思った点もあります。

  • 移動速度:タブレットくらいの画面までは快適なのですが、大画面では難ありと思いました。ボールが小さいので一度にたくさん動かせないのと、同方向に慣性で転がし続ける動きができません。keymap.cで0x91の加速モード設定も試してみましたが、それほど違いが出ませんでした(設定できていないのかもしれずもう少し調査必要)
  • 天面の処理:低頭の小ネジの頭が天板に出ているため、操作の際に邪魔に感じることがありました。3Dプリンタ等でケースを作った方が良いのかもしれません
  • キーボードへの固定方法:基板への実装は、2.54mmの標準ピンヘッダでのハンダ直付けかソケット化しかなさそうで多少心許ないかもしれません。ネジでしっかりと固定する方法があれば良いのですが。また、側面が空いているのでケースで覆うかマスキングテープでカバーしたいです

このAZ1UBALLと、Joyconアナログジョイスティック(それと、もしかして秋月電子のPSPアナログジョイスティック部品も、あとジャンクのトラックポイント部品もあったような)は並行して試していきます。

この投稿は自作Lilithキーボード(LilithKbd)を使って書きました。


[2023-08-24] Yuta Sakaiさんがコードのスペルミスと、i2cアドレスの指定方法の誤り(QMKのi2cアドレス指定方法の説明箇所)を見つけてくださいました(Twitterでのやりとり)ので、手直ししました。
さらにこの方は、加速度機能の動的ON/OFF、感度の動的変更と、気の利いた追加機能まで考えられています。
コチラの記事に掲載されています。

[2023-12-29] QMKをRP2040(Raspberry PI PicoやRP2040-Zero)で使う場合の設定です。
m.kiさんのTwitter投稿「AZ1UBALLをqmk0.22.3とRP2040-Zeroで試してみました (2023-12-26)」と、よしザウルスさんのブログ「QMK FirmwareをRaspberry Pi Picoで使ってみる (2022-07-24)」からの転記です。

rules.mk :

POINTING_DEVICE_ENABLE = yes
POINTING_DEVICE_DRIVER = pimoroni_trackball
I2C_DRIVER_REQUIRED = yes

halconf.h :

#define HAL_USE_I2C TRUE

mcuconf.h :

#undef RP_I2C_USE_I2C0
#define RP_I2C_USE_I2C0 FALSE
#undef RP_I2C_USE_I2C1
#define RP_I2C_USE_I2C1 TRUE    # 例

config.h :

#define I2C1_SCL_PIN GP27    # 例
#define I2C1_SDA_PIN GP26
#define I2C_DRIVER I2CD1    # 例

2020-11-26

Apple Silicon MacでshellをIntelモードで簡単に起動するには arch -arch x86_64 zsh、Intelコードをコマンドで作成するには cc -arch x86_64、Universalバイナリ作成は lipo -create

新しいコンピュータでまずやってみるのがHelloWorldアプリ。
Xcodeでの例はたくさんあると思います。
でももっとシンプルにC言語でのHelloWorldももちろん作れます。
macOSは少し特殊なので、「はじめてのC」の方でも作成できるように、手順を少していねいに紹介してしてみたいと思います。

macOS上でのはじめてのプログラムの作り方(Xcodeに頼らずに)
こんな感じのソースコードをテキストエディット(textEdit.app)に入力します。

#include <stdio.h>
int main () {
    printf ( "hello world.\n");
}

この内容をソースコードとして保存するためには、少し面倒ですが、次のおまじないが必要です。

保存する前に [フォーマット] => [標準テキストにする] を指定します(※1)。
ファイルの保存は [ファイル] => [保存...] メニューなのですが、以降のCLIコマンドで扱えるように次の指定をします。
保存先シートの [場所:] がデフォルトでは [書類] が選ばれていると思いますが、この一覧から自分のユーザ名を選び(またはShift+Cmd+H)、
その右側の下矢印 [v] を選んでフォルダ一覧を出します。
さらに [新規フォルダ] ボタンを押して、[名称未設定フォルダ] のところを tmp に書き換えて [作成] ボタンを押します(※2)。
保存先シートの [名前:] に a.c と入力し、[保存] ボタンを押します。
※1 プログラムファイルはテキスト形式にするのが必須なので、このようにします。)
※2 書類フォルダに a.c を保存することもできるのですが、次に実行するターミナルでのアクセスがmacOSの保護機能で制限されるので、このようにします。)

次にterminal.app(アイコン名はターミナル、アプリケーション配下のユーティリティフォルダの中にあります、あるいはCmd+Spaceでterminalまたはターミナルで検索してもよいです)を起動します。

ターミナルアプリの中で shell が起動されます。
まずはプログラミング環境一式を整えるために make コマンドを呼び出します。

make

すると、右の図の1つ目のダイアログが表示されますので、指示の通り [インストール] ボタンを押します
(このように必要なものがオンデマンドでインストールを促されます、面白いですよね。
 事前に Xcode をインストールしてある場合はこのダイアログは表示されません)。
次のコマンドでコンパイルします。

cd tmp
cc a.c

これでエラーメッセージがでなければ a.out という名前で、アプリの実行ファイルが作成されます。
ファイルの確認は次のコマンドでできます。

ls -l

作成したアプリは次のようにして実行できます。hello worldと表示されれば成功です。

./a.out

動きましたか?

Intel版アプリの作成方法
この手順でアプリを作成するとApple Silicon専用のアプリが作成されます。
file コマンドで確認すると、a.out: Mach-O 64-bit executable arm64 と表示されると思います。

file a.out

Apple Silicon Mac上で、Intel用のアプリを作成することもできます。
コンパイルする際に次の指定を行います。

cc -arch x86_64 a.c

先ほど同じように file コマンドで確認すると a.out: Mach-O 64-bit executable x86_64 と表示されます。

file a.out

作成したIntel用のアプリも同じ様に実行できます。

./a.out

ただし、今度は右の図の2つ目のダイアログが表示されます。
これは、macOS Big Surの初期状態ではRosetta 2がインストールされていないためなので、ここでも [インストール] ボタンを押します。
Rosetta 2のインストールが終わるとIntel版の a.out アプリが実行できるようになります。

Universalアプリの作成方法
さてここで私は、macOSが提供しているコンパイラアプリ自体はApple Silicon用なのか、Intel用なのかの疑問が湧きました。
次のコマンドで見てみると、Apple SiliconとIntelのUniversalアプリになっていることがわかります。

file /usr/bin/cc

自分でUniverasalバイナリを作成するには次のようにします。

cc a.c
mv a.out a_arm64.out
cc -arch x86_64 a.c
mv a.out a_x86.out
lipo -create -output a.out a_x86.out a_arm64.out

このコマンドで a.out が作成されます。
file コマンドでUniversalになっていることを確認してください。

file a.out

もちろん実行も問題なくできると思います。

./a.out

Intelモードのshellを起動する最も簡単な方法
先ほどやってみたように、Apple Silicon版でもIntel版でもアプリは区別なく必要に応じて自動的にRosetta 2で翻訳されて実行されるので、通常の利用目的ではとても都合が良くできています。
ところが、アプリ開発やパフォーマンス検証等の目的で明示的にIntel版環境を使用したい場面もあります。
その場合は、最初からターミナルのshellをIntel版にしておくのが便利です。
他の方のブログ等では、ターミナルアプリ自体の属性を [Rosettaを使用して開く] に明示的に変更する方法が紹介されているケースが多いです。
しかしながらこの方法はmacOSの [アプリケーション] => [ユーティリティ] に保存されているターミナルアプリを直に書き換えることになるため、あまりスマートではないと感じていました。

次のコマンドを使用すれば、ターミナルアプリの設定を書き換えることなくIntel版環境のshellを起動できることがわかりました。

arch -arch x86_64 zsh

実行中のshellがApple Silicon版なのかIntel版なのかは、次のいずれかのコマンドでの確認できます。

arch
uname -m
echo $CPUTYPE
machine

Intel版のshellからApple Silicon版のshellに戻るには次のコマンドを使います。

exit

逆に、Intel版のshellからApple Silicon版のshellを呼び出すのは次のコマンドです(引数に注意)。

arch -arch arm64e zsh

なお、Intel版環境のshellでは、Universalアプリはx86_64のコードが優先的に実行されます。
少しややこしいのですがIntel版環境においてもApple Silicon専用のアプリを意識することなくそのまま実行できるようになっています(macOS自体がApple Siliconなので)。

archコマンドでCPUタイプを指定した起動を行えるのはshellだけではありません。
例えばSafariをIntel版で動かしたい場合は次のようにします。

arch -arch x86_64 /Applications/Safari.app/Contents/MacOS/Safari

一発で起動できて、これ捗ります。

[English version of this post]

2019-06-29

ブログのweb表示のダークモード用のテーマを適用

macOS Mojave 10.14(厳密には10.14.4以降のSafari)やiOS 13 Betaのダークテーマ用に、このブログもダークテーマ用のCSSを追加してみました。
Supporting macOS Mojave’s Dark Mode on the web — Kevin Chen (2018-10-25の記事)を参考に以下のCSSを追加しました。
 @media (prefers-color-scheme: dark) {
    /* Overrides for Dark Mode. */
    body {
        color: white;
        background: #222;
    }
}
いかがでしょうか。
SafariだけでなくてFirefox(こちらも最新の67から)でも適用されますね。
Windows 10 1803/1903のFirefoxでも適用されますね([個人設定] => [色] => [既定のアプリモードを選択します] の [白/黒] でダークモードに設定)。

iOS 12以下には [アクセシビリティ] => [色を反転] => [反転(スマート)] がありますが、機械的に一律に明暗反転してしまうので、あまり実用的ではなさそうです。

OS、ブラウザ、それにwebサイト側の対応が必要なので、広まるにはなかなか時間がかかりそうですね。

2016-07-10

iOS 10のSwift Playgroundsを自分のプログラムのテストに使用するには

iOS 10とmacOS Sierra (10.12)のパブリックベータが始まりました。
早速両方をインストールしてみました。

Appleの規約上、おおっぴらにパブリックベータの内容に関して書けないことになっています。
スクリーンショットとかバンバン載せたいのですが、そうはいきません。

なので今回は、パブリックベータプログラムに参加しているお友達に向けての発信です。

私がiOS 10で一番気になっているのはSwift Playgroundsです。
XCodeにもPlaygrounds機能は、2バージョンつくらい前から付いてきていましたが、iOS版はプログラミング教育のツールとして機能を強化して紹介されました(Appleのページ)。
準備された課題を実行するだけではなくて、一から自分で作ったプログラムのテストにも使えるはずだと、にらんでいました。

少し試してみたところ、次のような感じのコードで、汎用的な使い方ができそうなことがわかりました。
もっとスマートな書き方があるのかもしれませんが、まずは第一報として、共有します。
//おまじない
import UIKit
import PlaygroundSupport
//ボタン生成
var button = UIButton(frame: CGRectFromString("0,0,150,50"))
button.backgroundColor = UIColor.gray()
button.setTitle("Buttonテスト", for: UIControlState.init(rawValue: 0) )
button.setTitle("Buttonハイライト", for: UIControlState.highlighted)
//Live Viewに表示
PlaygroundPage.current.liveView = button
Swift Playgroundsでは、コード入力の際も、いわゆるインテリセンスが今まで以上に効いていてXCodeでコーディングするよりも気持ちよくできると感じました。

2016-04-28

備忘録 - Windows用の文字コード変換は安直にSJISではなくてCP932を指定

Wikipediaより
結論:
iconvコマンドでSJIS変換する場合はCP932を指定しましょう。
% iconv -t CP932 linux-file-in > windows-file-out
% iconv -f CP932 windows-file-in > linux-file-out

解説:
Linuxの日本語の文字コードはUTF-8が標準設定されていることが多くなりました。
一方のWindowsではUTF-8のファイルは扱えますが、まだまだShift JISのファイルの方が相性が良いようです。
たとえば、UTF-8のCSVファイルをダブルクリックしたら文字化けすることが多いですし、メモ帳のデフォルト文字コードもSJIS (ANSI)です。

そこで文字コードの変換が必要になります。
テキストファイルの文字コード変換を行うLinux上の業界標準のコマンドがiconvです。
iconvコマンドは、オプション -f と -t で、変換元と変換先の文字コードを指定します。
デフォルトの文字コードはUTF-8です。

ここでは陥りやすいのが、Windows用にShift JISに変換する場合、Shift JISだからといって安直に、SJIS を指定することです。
これ絶対ダメです。

少しテストしただけでは気付かないのですが、いわゆる外字(①など)が、標準規格のSJISでは定義されていないので、簡単にエラーになってiconvが途中終了してしまいます(これはこれで外字の存在確認に使えるのですが)。

ではShift JIS用に何を指定するかといえば、CP932を使います。

①などの外字の文字コードは、むかしむかし、Microsoftが日本語Windows用に、JIS規格のShift JISを拡張して割り当てました。
この拡張Shift JISの名前がCode Page 932 (CP932) です。
(ここの説明は感覚的で専門家が見たら正確ではないかもしれません。)(なお、iconvでの指定はCP932ですが、JavaではMS932、WebではWindows-31Jを指定します。)
(Emojiではどうなるのかは、今度調べたいと思います。)

CP932という、なんとも覚えにくい文字コードの名前です。
Shift JISの文字コード変換はSJISではない」ということだけ、最低でもいつも思い出すようにしましょう。
(わたしは実際、今日これで失敗してしまいました。)

[2020-11-13] UTF-8からSJISに変換する際に、絵文字などが含まれている場合は、また途中でエラーになって落ちてしまいます。
なので今後は、

% iconv -t CP932//TRANSLIT linux-file-in > windows-fie-out

の指定を心掛けるのがより良いと思います。

2010-01-23

Yahoo Pipesが動かなくなっていると思ったら、Yahoo.comのアカウントが停止されていて、の顛末

以前からいくつかのPipesを作ってRSS購読していたのですが、何となく最近更新が少ない(全くない)と思いながら、そのままになっていました。
今日、面白いPipesを見つけたので、Copyして、自分のPipesのページを見たら、以前作ったPipesが全て削除されているではありませんか。

いろいろググった後、もしやと思いyahoo.comのメールにログインしてみると、見事にアカウントが一時停止されていました。
yahoo.comのアカウントが有効じゃないと、Pipesも抹消されてしまうようです。

それではと思い、yahoo.com mailを普段のメーラで毎日開けるようにすれば良いと思い、設定するのですがIMAP/POPでつながりません。
IMAP/POPでアクセスするためには、有料版にアップグレードする必要があるようです(Yahoo Japanは無料でIMAP/POPアクセスが許されています)。
MacFreePOPs(またはFreePOPs)という便利なツールが、WebメールをPOPに変換してくれるようなので、なんとか一件落着(かな、4ヶ月後に再度チェックが必要)。

以前作ったPipesを再度作らなきゃ。

2009-09-22

あなたの大切なiPhone/iPod touchを即座にロック : Passcode Lock Now

iPhone/iPod touchのパスコードを長くして、パスコードロックを強化する対策を以前紹介しました。
多くの人は、パスコードの設定と一緒に [パスコードを要求] するまでのタイマーを設定して、短い時間の間に自動ロックされても、再度パスコードを入力しなくても良いようにしていると思います。
これが結構不安で、同期の最中など、iPhone/iPod touchを置いてその場を離れなければならないようなケースには、他の人にあなたのiPhone/iPod touchがパスコードなしでのぞき見られてしまう恐れがあります。
この不安を解消するために、パスコードロックを即座に行うアプリを作成しました。
PasscodeLckNw (Passcode Lock Now) (build #001 2009-09-22) [Download]

インストールの仕方
  • App Storeからはインストールできません。
  • 上記キットをiPhone/iPod touchに適当な方法でmobileユーザのホームディレクトリなどにコピーします。
  • iPhone/iPod touchにログインして、rootユーザになります(suコマンドなど)。
  • unzipコマンドで、/Applications/ フォルダの配下に展開します。
    cd /Applications/ ; unzip ~mobile/PasscodeLckNw-001.zip
  • respring コマンドを実行して、iPhone/iPod touch に新しいアプリを認識させます。
仕組み
  • 久しぶりのシェルスクリプトアプリです。
  • SpringBoard プロセスをkillallしています。リブートするよりはずっと早く、確実にパスコードロックすることができます。

2009-08-18

iPhone 3.0のnotes.dbの変更点

iPhone/iPod touch 3.0のメモアプリ (MobileNotes.app) のsqlite3テーブルスキーマが1.1の頃に比べて拡張されています(2.xからかもしれません)。
$ sqlite3 notes.db
sqlite> .tables
Note
_SqliteDatabaseProperties
NoteChanges
note_bodies
sqlite> .schema
CREATE TABLE Note (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, creation_date INTEGER, title TEXT, summary TEXT, contains_cjk INTEGER, modification_date INTEGER, author TEXT, content_type INTEGER);
CREATE TABLE NoteChanges (record INTEGER, type INTEGER);
CREATE TABLE _SqliteDatabaseProperties (key TEXT, value TEXT, UNIQUE(key));
CREATE TABLE note_bodies (note_id INTEGER, data, UNIQUE(note_id));
CREATE TRIGGER delete_note_bodies AFTER DELETE ON Note
BEGIN
DELETE FROM note_bodies WHERE note_id = OLD.ROWID;
END;
sqlite>

変更点は、
  • Notesテーブルの追加カラム:
    contains_cjk:cjk文字が含まれているかどうか。1でYes。漢字の有無でフォントが切り替わる謎がこれで解けた。
    modification_date:最終修正日時。1.1ではcreation_dateでmodification_dateを代用していた。
    author:おそらく、Sync時にサーバ側のFrom:ユーザがストアされる。
    content_type:不明。メモアプリで作ったアイテムは、全て0のようだ。
  • 追加テーブル:NoteChanges
    アイテムを編集したり削除した履歴。編集の度にレコードが追加される。おそらく、type=1は編集、type=2は削除。Syncすると履歴が削除されると思われる(後で実験)。

2009-08-15

iPhoneシミュレータでのアプリの実行環境

  • $USER:Mac OS Xのログオンユーザ
  • $PWD:/
  • $HOME:/Users/$USER/Library/Application Support/iPhone Simulator/User/Applications/$UUID/
  • アプリのUUIDはXcodeでビルドして実行するたびに変化する
  • $HOME配下にあるもの:Documents/、Library/、tmp/、appl.app/
[2011-05-14] 2009年に記事を書いてからXcodeを更新していない (3.1.3) ので、いまは変わっているかもしれませんが...
  • シミュレータでのユーザのホームディレクトリは、
    ~/Library/Application\ Support/iPhone\ Simulator/User/
    この下に、Media や Library や Applications がある。
  • シミュレータでのファイルシステムのルートは、
    /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulatorX.Y.sdk/
    例えばこの下の Applications にi386用にビルドした? アプリをコピーして実行することもできる。
  • シミュレータ本体の起動は、
    open "/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app"

2009-08-10

/Applicationsのアプリと、/var/mobile/Applicationsのアプリの出来ることの違い

/Applicationsのアプリで出来て、/var/mobile/Applicationsのアプリ(Xcodeで開発する一般アプリ)で出来ないこと。
  • NSThreadは使えるが、popen()はPARENTAGE_FORK DENY 1のエラーで阻害される。やはりバックグラウンド処理はFrameworkの範疇のお行儀の良いものでないと許されない(ちなみにバックグラウンド実行のNSTaskはiPhone OSのFrameworkから元々外されている;参照noviさんのBlogエントリ)。
  • Shellのターゲットは作成できるけれど、デプロイ時に実行権が外される(chmod -x)。
逆に、/Applicationsアプリで出来ないこと。
  • Settings Bundleによるアプリ設定アプレットが効かない。一般アプリはplistを作成するだけで、設定アプリ(Preferences.app)に組み込まれた設定項目と画面を、非常に容易に生成することができますが、/Applicationsのアプリはこの機能を使えないようです。
  • SpringBoardによるアイコンの自動iPhone化(rounded border と glossy effect) が利かない。一般アプリではべた塗りのアイコンを作成すれば済むが、/Applicationsアプリでは自分でアイコンのiPhonne化をしないといけない。(逆に、一般アプリでアイコンの自動いPhone化を抑止するにはInfo.plistにUIPrerenderdIcon属性を設定する。)
[2011-05-14] アイコンの自動iPhone化を追記。これが分からず、1週間くらい悩みました。一般アプリと/Applicationsアプリのアイコンpngを入れ替えたりして確かめました。

Xcodeで実機デバッグの初級編

XcodeのiPhoneシミュレータでの開発は、すんなりいきましたが、今回、実機デバッグを初めて体験しました。
Xcodeで [Device 3.0 - Debug] をターゲットに選んで [ビルドして進行] を実行すると、iPhoneまたはiPod touchの実機でアプリの実行が始まります。
デバッグモードでは通常より起動が少し遅いので落ち着いて待ちます。

下記3つのウインドウは、実機デバッグ中にいつでも開いておくと便利。
  • [ウインドウ] メニューの [オーガナイザ] を開き、[DEVICES] から実機を選び、[Console] を選ぶと、何がおこっているのかのログが表示される。
  • [実行] メニューの [コンソール](またはメインウインドウのgdbのボタン)はgdbのコンソールで、アプリが落ちたときのステータスなどが表示される。
  • [実行] メニューの [デバッガ](またはメインウインドウの殺虫スプレーのボタン)はGUIデバッガで、コールスタックから調査したいプロシージャを選んで、ソースコードや変数を見たりできる。
シミュレータで一通りうまく動いても、実機では動かないケースがやはりあります。
私がいきなり経験したのは、
NSStringでstringByAppendingString: の引数がnilだと NSInvalidArgumentExceptionで落ちるケースと、
NSDateでdateFromString: でこちらも引数がnilだとEXC_BAD_ACCESSのシグナルで落ちるケース。

2008-08-10

iPod touch/iPhone 2.0の日本語入力を快適に - Kill3Apps独立アプリ

以前の記事で、BossPrefsのプラグインとして、常駐稼動するAppleの3つのアプリ(MobileMail、MobileSafari、MobileMusicPlayer)を停止するツールをご紹介しました。

また、孫さんが、ご自身のパワーユーザとしてのTipsとして、「ホームボタンの長押しでiPhoneのメモリをリセットできる」を2008/08/05の決算会見で紹介されています。
試してみると確かに、Safariの中で長押しすればSafariが、メールの中で長押しすればメールが、常駐せずに終了するようです(SSHでログオンしてモニタしながら確認しました)。
全部停止するためには、3つのアプリを起動して順々にホームボタンを長押し(約7秒ずつ)する必要があります。

前回のツールは、BossPrefsに頼っているため、3つのアプリを停止するにはBossPrefsの起動時間約3秒を待つ必要がありました。

今回は独立アプリとしました(とは言ってもShellスクリプトアプリですが)。
下記zipファイルをダウンロードし、/Applications に展開すると、Kill3Apps.appフォルダが作成されるので、Re-Spring(再起動)するとアイコンが現れます。
アイコンをタップすると1秒以内に、3つのアプリを停止できます(強制的に停止させているので、問題が発生する可能性はゼロではありませんが、今のところ大丈夫なようです)。

常駐プロセス停止ツール Kill3Apps (build #002 2008-08-10) [Download]
[2008-08-11更新 URLが間違っていたので修正しました。ご指摘ありがとうございます、kittaさん]

iPhone OS 2.0 (OS X iPhone 2.0) になって、アプリの起動ユーザがmobileにそろったので、実現したツールです。
ご意見、ご感想、いただけるとうれしいです。

[2010-10-19] Mailのプッシュ同期をOFFにしないと、Mailは停止してもすぐに再起動され常駐します。

2008-07-17

じつはiPhone SDKでの開発は容易かつお手軽なのかもしれない

iphonedev teamの成果を待ち続ける日々ですが...
実は、正式のiPhone SDK (Xcode、Interface Builder、Objective C) での開発は、容易かつお手軽なのかもしれないと、ふと思いました。
今まで食わず嫌いでしたが、待っている間に少しは試してみて損はないと思えてきました。
例えば、一般配布が禁止されていても、iPhone SDKを持っている人が個人的に使用するTermやMobileFinderがあっても悪くはないわけですし...?

2008-06-09

メモ同期アプリ Notes Upload Build #003

OS X iPhone/iPhone OS (iPod tuoch)メモ同期アプリにGUIをつけました。

メモ同期 Notes Upload (build #003 2008-06-09) [Download]

できること
  • メモ(MobileNotes)のエントリをメールフォルダに同期(現バージョンではアップロードのみ)します。
  • 無線LAN (Wi-Fi) 接続で同期を行います。
  • Mac OS X Leopard (10.5) のMail.appのメモ機能との互換性を目指してみました(実験的)。
  • GUIの国際化(英語と日本語)を行っています(実験的)。
使い方
  • ファイルをダウンロードして /Applications フォルダで展開(unzip)してください。/Applications/Notes Upload.app/ というフォルダができればOKです。
  • メールサーバに同期用のフォルダを作成してください。
  • 同期処理には多少の時間がかかります(1メッセージ当たり1秒程度)。メモがたくさんある場合には最初は気長に待ってください。
事前に必要なもの
  • Python (2.5-6)で開発していますでの、Pythonが必要です。
  • Erica's UtilitiesのdoAlertを使用してメッセージを表示しています。
  • GUIはJiggyで開発しました。Jiggyも必要です。
WWDC08まで24時間を切ってしまいましたが、何とか更新にこぎつけました。
ご意見、ご感想などいただければ幸いです。

[2009-08-19] 新バージョン出ました。

2008-05-03

メモ同期アプリNotes Update次の一手

iPhone OS (iPod touch)のメモ(Notes)をメールサーバに同期するアプリNotes Uploadですが、次の一手として下記を考えています。
  • 同期した際のメモの最終更新日時を記録しておいて、次回はそれ以降のメモをアップロードする。こうすることで、毎回全件をアップロードする必要がなくなる。
  • メールアカウント設定のためのGUIを作成する。Jiggyがお手軽そう。もしかしてPythonから直接UIKitを呼び出せるのでしょうか?
  • Gmailでのフォルダ管理は主流ではないので、Googleとの同期は、Goole Notebookと行う。APIも用意されているのでうまくいきそう。
また、最終的にはiPhone OSのメモとPC/Macのメモを双方向同期を行いたいです。その時のネタは下記です。
  • iPhone OSのメモは一度書いたメモを後で編集できるところが一つのミソと思っています。メモエントリを後で編集できるPC/Macアプリは、他に以下のものがあると思います。
    • Mac OS X 10.5 LeopardのMailのメモ機能
    • Microsoft Outlookの投稿エントリ(実はどんなエントリも編集できる)
    • Thunderbirdの下書きフォルダ(間違って送信してしまわず、保存をする必要がある)
    • Google Notebook
  • できるだけ共通の方法で記事の紐付けを取りたいです。
  • 第一の課題は、PCアプリ側で作成したエントリを、うまくiPhone OSのメモに取り込めるかだと思っています。Outlookなんかはとんでもないhtmlを生成してしまうようです。
ご意見いただけると嬉しいです。

2008-04-30

メモ(Notes)同期アプリを改良

iPhone OS (iPod touch)で、スクリプトアプリをアプリアイコンから起動すると20秒ほどで強制終了させられる問題を、ちょっと姑息な方法で回避しました。
メモ同期アプリが起動したらアラートボックスを1回出して、本体をバックグランドで起動し即座に終了するようにしました。
本体はアラートボックスを2回出して処理の開始と終了を知らせるようにしました。
現状、アラートボックスはシステムモダルなので、他の操作を中断しますが、お許しください。

メモ同期 Notes Upload (build #002) [Download]
その他、使い方は直前のエントリを参照してください。

[2009-08-19] 新バージョン出ました。

メモ(Notes)同期アプリを作ってみました

iPhone OS (iPod touch)のメモは、実は、携帯電話より入力しやすくて、ちょっと思いついたことをメモするのにとても便利です。
ところが、Appleさんはこのデータを活用するための手段を、メールで送信する機能以外、提供していません。
そこで、メモ同期アプリをDIY的に作ってみました。
本格的にObjective-Cでの開発ではなく、スクリプト言語Pythonを今回一から学んで作りました。
まだまだ完成品とは言えませんが、ご意見を頂ければと思い、ともかく公開してみたいと思います。

メモ同期 Notes Upload (build #001) [Download]
できること
  • iPod touchのメモアプリのエントリを指定したメールサーバのフォルダに同期(アップロード)します。
  • メールサーバへの接続はIMAP4プロトコルを使用します。
  • .Macのような暗号化なしのIMAP4サーバにも、gmailのような暗号化IMAP4にも対応します。
  • gmailの場合1件当たり1秒、.Macの場合1件当たり0.5秒くらいで処理できると思います。
  • Mac OS X 10.5 LeopardのMailのメモデータとの互換性を目指しています。
できないこと
  • エントリの更新があってもなくても全件アップロードし、新しいエントリを作成します。差分のみを処理するようなことは、現状はできていません。
  • アプリケーションをアイコンから起動する使い方は、処理に時間がかかるため、現状実用的ではありません(途中で落ちる)。[改善済み]
制限事項・注意事項
  • メールアカウントの管理機能がないので、直接ファイルを編集してください。
  • アイコンからの起動は、処理に時間がかかるためか、途中で終了していしまいます。[改善済み]
  • エラー処理は全く行っていません。
  • 作者の環境ではそれなりに動作していますが、あなたの環境に悪影響を及ぼさないことを保証できるわけありませ。その点をご承知の上でご利用ください。
使い方
  • リンク先のzipファイルを何らかの方法でダウンロードして、/Application フォルダに展開してください。Notes Upload.appというフォルダに展開されるはずです。
  • 展開されたファイルに実行権をつけてください。
    cd /Application/Notes Upload.app
    chmod +x *
  • Notes Upload.appフォルダのnotes2imap.pyファイルをテキストエディタで編集してください。先頭の方にメールアカウントおよびフォルダの設定があります(HOST、USER、PWD、FOLDER)。
  • メールサーバのホスト名がiPod touchから認識できない場合(pingもエラーする)はIPアドレスで指定してください。
  • メモのファイルにプロテクションがかかっている場合があるので、Ownerをmobileに変更してください。
    cd /var/mobile/Library/Notes/
    chown mobile notes.db
  • IMAP4メールサーバのフォルダは事前に作成しておいてください。
  • 実行は、notes2imap.py をターミナルアプリで起動してください。
    cd /Application/Notes Upload.app
    ./notes2imap.py
事前に必要なもの
  • Python;Installer.appからインストールしたPython 2.5-6で開発しています。
  • Erica's Utilities;メッセージを表示するためにdoAlertを使用しています。
Pythonの素のスクリプトで開発しているのですが、アイコンから起動すると5秒くらいで処理が強制終了させられるようで困っています。[改善済み;暫定対処]
使ってみて、ご意見、アドバイスなどありましたら、ご連絡いただけると幸いです。
また、ダウンロードされましたら、コメントくださると大いに励みになります。

[2009-08-19] 新バージョン出ました。

2008-04-29

MobileTerminalをアップデートすると

iPhone OSで昨日、Installer.appを起動したら、大量の更新が現れました。その中に、私のお気に入りのterm-vt100 (MobileTerminal)のアップデートがあったので、早速更新しました。
たくさんの機能追加が追加されていました(v278)。
o コマンドメニュー
o 矢印キーなどは、タップ操作から、Swipe操作に変更
o 2本指タップで、キーボードを隠せる
o 複数ターミナルが起動され、切替可能(上のステータスバーの右側をタップ)
o 設定画面(上のステータスバーの左側をタップ)
o 横向け表示に対応
o ログオンユーザがrootから非特権のmobileに変更
非特権ユーザに変更になったのは良いのですが、suコマンドが動きません。FAQに従ってBSD Subsystem 2.x SU Replacementをインストールして、解決しました。

2008-04-12

今日の実験:iPhone OS(iPod touch)のメモ帳(Notes)のデータをWindowsで覗く

iPhoneBrowserでメモ帳(Notes)のファイル、notes.dbを読み出せました(パスは /var/mobile/Library/Notes/notes.db)。
これをSQLiteのGUI、sqlitecc3jできっちり読み出せました。

テーブルはNoteとnote_bodiesに分かれています。
Noteテーブルのカラムは(rowid)、creation_date、title、summaryです。
note_bodiesテーブルのカラムはnote_id、dataです。
Notes.rowidとnote_bodies.note_idがリンクしています。
メモを編集するとcreation_dateも更新されるようです(メモ帳での表示順も変わりますし)。