2010年12月19日

素数について

すべての素数は2と3の足し算および掛け算のみで表現できる。これって発見かな?

2010年11月29日

(調査中)iPhone 4.2.1のAirPrintをブラザーのプリンタでダイレクト印刷

やっぱり、自分の持っているプリンタでAirPrintしたい。それもPCを介さずに、ダイレクトに。
幸いなことに私の持っているプリンタはBonjour (mDNS)対応のプリンタであり、なんとかAirPrintできそうだ。

ネットで探せば、あるソフトを使うとAirPrintでプリンタ共有されているPCを介して印刷できる。まあこれだけでも大きな進歩だが、やはりiPhoneから直接プリンタへ出力したい。その方法を丸1日調査したところ少し光が見えてきた。といっても(まだ)正直言って成功していない。後一歩なので今後いろいろ調べて印刷できるようにしたい。



さて、私の持っているBrother MFC-9840CDWだが、これはAirPrint対応でなく、プリントしようとしてもiPhoneからプリンタが見つからない。4.2.1へアップグレードした(対応プリンタを持っていない)誰もがこれに遭遇するだろう。これはAirPrintがmDNSサービスレコードに一定の条件で問い合わせているためである。この条件は以下の2つである。
  1. subtypeが_universalであること
  2. TXTレコードにURFのキーがあり、かつEmptyでないこと
多くのBonjour対応プリンタは上記の対応をしていないためプリンタの検出がされないと思われる。
ここで実験であるが、WindowsやMacにはmDNSへサービスを登録するコマンドが存在する。
"dns-sd" コマンドである。このコマンドを使えばmDNSへ自由にサービスが登録できるので、プリンタのために私が手作業で登録してやることができる。以下のように-Pオプションを使用してコマンドを実行する:

dns-sd -P 名前 _ipp._tcp,_universal "" ポート ホスト名.local IPアドレス TXTレコード
(斜体には実際の値が入る)

名前:何でもいいでしょう。好きな名前を入れる。
ポート:これは通常631。Internet Printing ProtocolのWell-knownポートである。
ホスト名:これはプリンタのネットワーク登録名である。
IPアドレス:プリンタのIPアドレス。
TXTレコード:これはプリンタに依存するものが含まれる。たとえばこんな感じ
txtvers=1 priority=50 pdl=application/vnd.hp-PCL, type="Brother MFC-9840CDW" Color=T qtotal=1 ... URF=W8,SRGB24,DM1,CP255,RS600

dns-sd -P "Brother Printer" _ipp._tcp,_universal "" 631 BRDBB.local 192.168.0.22 txtvers=1 pdl=application/vnd.hp-PCL type="Brother" Color=T qtotal=1 URF=W8,SRGB24

さて上記で、気をつけるのが _ipp._tcp,_universal とサブタイプをつけていること、TXTレコードにURFを含めることである。URFについてはよくわからないがラスターフォーマット指定であろうか。
これでmDNSで登録してやれば少なくともiPhoneのAirPrint機能でプリンタを見つけてくれる。

しかし、残念なことにこれでもまだiPhoneから印刷が成功しない。プリントを実行すると一見プリント処理はされたかのようにふるまうが、実際にデータがプリンタまで届いていない。どうもiPhone側では送信のリトライをし続けているように見えるが、ネットワークへ送り出してもいない。ためしにポートを9100(PDL Datastream)へ変えてみるとプリンタへデータは送付され、文字化けしたものが印刷される。
なぜIPPポートでデータが送信できないのかがまだわからない。
ちなみに、ePrintでは手作業で登録したサービスでまったく問題なく印刷ができ、本体情報(トナー残量等)も取得できている。つまり、AirPrintにはまだTrickyな仕掛けがあるに違いない。

まだまだ先は長そうだ。

2010年11月27日

JailbreakしたiPhone 4.2.1でAppleマークが出た画面で止まってしまう

iPhone 4/iOS 4.2.1でJailbreakとCydiaインストールの最後でも少し注意書きをしておいたが、現在のところRedSn0w 0.9.6b3でJailbreakしたiPhone 4.2.1は通常の電源ON/OFF、リブート操作ではAppleマークが出た画面でとまってしまい、起動が完了しない。もしこうなってしまったら再びRedSn0wを用いないと起動できない。電源を切った後再び起動させるには以下の手順を踏めばよい。
  1. ロゴマークで固まっている状態で、iPhoneをPCと接続する。
  2. RedSn0w 0.9.6b3を立ち上げ、ipsw選択後、「Just boot tethered right now」を選択
  3. DFUモードにするインストラクションのところで、2.からはじめる。
    つまり、電源ボタンとホームボタンを同時に10秒ホールドする。その後、電源ボタンを離し、ホームボタンを引き続き15秒間ホールドする。
  4. ホームボタンをホールドしているときにRedSn0wのGUI画面が遷移するが、気にせずにホームボタンを押し続けている必要がある。
上記手順を経るとiPhoneは無事に起動する。
つまり、現状、4.2.1をJailbreakすると、電源OFFもしくはリブートのたびにRedSn0w(と4.2.1のipsw)が必要になる。飛行機に乗るとき等RedSn0wの環境にアクセスできることを確認してから電源を切ろう。

2010年11月24日

iPhone 4/iOS 4.2.1でJailbreakとCydiaインストール

ほぼ1年ぶりのブログ更新となってしまいました。さて私事ですが、仕事の関係で日本を離れ、今暮らしているのはこの国、SIMフリーのiPhoneが買える数少ない国であります、オーストラリアです。

つい最近iOS 4.2.1が一般リリースされました。AirPrint対応のプリンタもっていないし、ストリーミングでわざわざiPhoneから音楽を飛ばしたいとも思わない私はあまりアップグレードする利点はないのですが、新しいもの好きとしてはどうしてもアップグレードしたくなるものです。そこであちこちのウェブで4.2.1でもJailbreakが可能なことを確認のうえ、アップグレードを慣行!

あちこちのウェブサイトでその方法は丁寧に述べられていますが、ここでも丁寧に解説いたします。それがこのブログの使命ですので。

さて、用意するのは、
  1. iOS 4.2.1へアップグレードしたiPhone 4
  2. redsn0w_win_0.9.6b3
  3. Cydia.patch
  4. SSH_bundle
  5. iFunBox (SFTPでもよい)
  6. putty (SSHクライアント)
上記は私が一番簡単だと思った方法でJailbreak(+4.2.1で動作するCydiaをインストール)するために必要なものです。少し時間がたてばもっと簡単にJailbreak+Cydiaインストールまでできるようになるでしょう。

必要なものをすべて用意したらredsnowを立ち上げ「Browse」から
iPhone3,1_4.2.1_8C148_Restore.ipsw
を指定。これは通常、
C:\Users\(ユーザ名)\AppData\Roaming\Apple Computer\iTunes\iPhone Software Updates
にあります。(Windows 7の例)
見つからない場合は、ipswをコンピュータ全体から検索すれば見つかるでしょう。
「Next」を押して、“Install Cydia”にチェックが入っていることを確認し、「Next」


iPhoneをPCへつなげ、iPhoneの電源を切っておきます。
この後DFUモードでJailbreak開始です。操作手順は画面に従えばよいのですが、画面見ながらだと焦ることがあるのでここでも書いておきます。
DFUモードにするには、
  1. 電源ボタンを3秒間押し続ける
  2. 電源ボタンを離さず、そのままホームボタンを10秒間押し続ける
  3. ホームボタンを離さずに、電源ボタンを離す。
  4. そのまま15秒待つ。ここで15秒経つ前に画面が切り替わりますが、そのまま押し続けている必要があります。
あとはしばらくすればJailbreak完了です。

(ブート画面)

ここからが少し面倒です。現在のオリジナルのCydiaは4.2.1では正しく動作しません。このためPatchを当てる必要があります。
JailbreakできたらiFunBoxを使ってCydia.patch (cy-3.zip内のcy-3フォルダ内に入っています)をiPhoneへコピーします。コピー先はRaw File Systemの/Applications/Cydia.app/です。ドラッグ&ドロップで置けば簡単です。
次にiPhoneにSSHをインストールします。これはまたredsn0wを立ち上げ、


今度は「Install custom bundle」を選択し、ファイル選択ダイアログでSSH_bundle.tgzを選択します。あとは先ほどJailbreakした手順のとおりです。
さてSSH Bundleがインストールできたら、今度はtethered modeでブートする必要があります。
再びredsn0wを起動し、「Just boot tethered right now」にチェックを入れ同じように画面の指示に従います。


(Just boot tethered right nowでのブート画面)

これが完了すればSSHが有効になったiPhoneが立ち上がります。iPhoneの「設定画面」からIPアドレスを確認し、PuTTYでiPhoneへ接続します。
デフォルトではログインは root/alpineです。これはどのiPhoneでも同じですので、セキュリティの観点で真っ先に替えたほうがよいです。とくにJailbreakされたiPhoneはそれだけでセキュリティが崩されていますのでこれは必須です。
ログインしたら、まずpasswdと入力し、自分の好きなパスワードを設定します。(パスワードは決して忘れないようにしましょう。)


あとは以下のコマンドを呪文のように入力していきます。

apt-get update

apt-get install bsdiff

cd /Applications/Cydia.app/

cp Cydia_ Cydia.bak

bspatch Cydia.bak Cydia_ Cydia.patch

chmod +x+s Cydia_

ここまでできたらCydiaは起動できる状態になります。ふたたびredsn0wを立ちあげて「Just boot tethered right now」を選択し、再起動をかけます。あとはCydiaを起動し、Updateをインストールすれば無事アイコンも表示され一番上の画像にあるところにたどり着きます。
注意!!
現在のところJailbreakしたiPhoneは一度リブートもしくは電源を切って再起動をかけようとするとreadsn0wなしでは正常に立ち上がらない現象に見舞われています。redsn0wでtethered bootの手順で起動しないと立ち上がらないようです。電源を切る必要のある場合はredsn0wとipswがある環境であることを確認しましょう。

多くの人がinstallousと、AppSyncをインストールすることでしょう。
ちなみにこのCydiaはまだいろいろと不具合があってレポジトリのAdd Sourceで入力フィールドが見えない状態になっていたりします。このときはめくら状態でキーボードからURL(http://以降)を入力します。
cydia.hackulo.us (http://cydia.hackulo.us)は、installousやAppSync for iOS 4.2 を入れるときに入れたいレポでしょう。
注意!!
きれいごとを言うようですが、installousでインストールしたアプリで、これはいい、と思ったアプリはちゃんとApp Storeで買いましょう。ソフトウェアは著作権が命です。人類のソフトウェア技術力向上のため、ご協力ください。