Title

iOS上でSMB/CIFS(Windowsファイル共有)をゼロから実装してみる

何故か全くライブラリが見つからないSMB/CIFS。
ググってみても、「SMBのiOSライブラリないの?(そもそもObj-cに限定しなくても無い)」「sambaがGPL、ぐぬぬぬ・・・」という記事しか見当たらない。組込み向けの製品はいくつか見つかりましたが、たぶん個人で買えるようなものじゃない。
きっと実装は厄介なんだろうなと見る気もしてなかったですが、風邪でダウンしていたので、その時に一度気合を入れてテストしてみました。

なお、tangoというOSSがあるようですが、うまく動かない。
恐らく認証関連が古いせいで最近のWindowsでは動かないぽい。
extended security flagが立っていると即座にエラー返すようなのできっとダメだろう、ってことでtangoは諦める。

SMBはSMB1とSMB2があって、SMB2は大きなバッファが扱えて高速LANで効率がいいようですが、NASとかで対応していないものもあるかもしれないし、iPhoneのWifiからではほとんど速度は変わらない(と思う)のでまずSMB1にトライ。(SMB1の仕様書読んでいるうちに、ファイルオフセット指定が32bitしかなく、2G超えるファイルダメじゃん!って気づいたけど気づかなかったことにします:→追記で訂正)

悪名高いMicrosoftの仕様書を読み解くわけですが、SMBは魑魅魍魎な方言やら実はこうでしたー! 残念! みたいな実装があって苦しむと噂には聞いております。

さて、さて、
仕様書読むと案外単純な通信です。
これはいける。

流れは、
・ネゴシエーション
・セッションリクエスト(認証)
・ツリー接続、一覧取得、(ここでパイプ、RPCの仕様書を読まされる(涙))
・ファイル一覧の取得 (ワイルドカード*でFindFileする。ルートディレクトリだと失敗するのでちょっと変える必要ある
・データの転送(実は簡単な命令っぽい)

という感じで、バイナリデータなのでC言語では扱いやすい(はず・・)

しかしセッションリクエストで早速ハマる。

[MS-CIFS]306ページ、2.2.4.53 SMB_COM_SESSION_SETUP_ANDX (0x73)

This command was introduced in the LAN Manager 1.0 dialect.
The formats of the request and response messages have changed since the command was first defined. The CIFS format, as defined for the NT LAN Manager dialect, is presented here. This format MUST be used when the NT LAN Manager dialect has been negotiated.
(後略)

このコマンドはLAN Manager1.0のときの(方言で?)定義された。
このコマンドが最初に定義されてから、リクエストと応答メッセージのフォーマットが変わったよ。

うーん。LAN Manager1.0はIBMの頃の仕様でもう使われていないので、NT LMを使うみたいね。
Wordデータは26 bytesなので、WordCoundは13になるはず??? よくわからん

他の通信をパケットキャプチャしてみるとWordCountが12=24Byteしかない。1バイトどこいったー?

試しにきにせず26Byteで送ってみたら見事エラーでございます・・・。

と思ったら別のファイルの[MS-SMB]の方の53ページにextended security flagを使う時にはSecurityBlobLengthを使えって書いてあった。・・・といった具合に仕様書読むにもコツが必要な模様。

とりあえずWindows7とNAS相手にツリー一覧取得までは出来たので、頑張ればなんとかなるかなー。
どうも一番面倒なのはツリー一覧取得するところだったっぽい。
もう少しちゃんとエラー処理とか、ネゴシエーションやらないと実用的には使えないと思うので作業量は多そうですが。

時間かかる要素その2は、SMB通信に使うNTLMの暗号化をどうするか。
とりあえず外部ライブラリ使って認証が通ることは確認しましたが、ここも自前で実装するとなると読まなければならない仕様書がまた増えて面倒くさい。
まぁ、こちらの方が内容はある程度クリアなので実装することは出来そうですが、まっとうにやったら時間かかりそうです。まっとうじゃない方法探します。

NTLMもUIWebViewでは使えるので、API公開してくれたらいいのに・・・。

ComicGlassへはうまく出来たら実装します。

追記:

だいぶ分かってきました。
上記記述にいくつか間違いがあったので一応訂正。

ファイルのリードについては見ていた資料が古かったようで、新しい資料にはOffsetの上位バイトのフィールドがありました。
(SMB_COM_READ_ANDX==0xeE最後の4バイト,Optinal)
よって2GBを超えるファイルもオフセット付で扱えます。
またTimeoutがTimeout_or_MaxCountHighになっており、ファイルを読む場合はMaxCountHighとして扱うように変わってました。
ネゴシエーションの時に対応非対応を設定できるようです。
(しかしWindowsXPの通信見てみると使ってない・・・)

ときおり出てくるDataOffsetとかの意味がわかって受信データのpaddingサイズ不要が要らないことがわかりました。(DataOffsetでデータの先頭がわかる)

添い寝アラームアップデート 1週間無料にします!

添い寝アラームは子供寝かしつけていたら自分も寝てしまって気づいたら夜中/朝だよ!
洗濯してないし、洗い物もそのままだよ!
大人の時間が! 
深夜アニメ見るつもりだったのに!

といったような事を防ぐ、小さいお子さんをお持ちのかたのためのアプリです。

使い方はアラームスタートボタンをタップするだけ。
あとは画面を下に伏せておいておけば、マイクと加速度センサをつかって、良い頃合いに起こしてくれます。
アラームは最初はバイブレータ、次は音。止めないと音がだんだん大きくなります。

アラームは本体を叩くと延長されます。画面見なくても暗闇でスヌーズできます。

今回のアップデートでiOS7及びiPhone5s/5cに最適化しました。
(前のバージョンでも動いていましたが)

アイデアも含めけっこう自信作、、というか自分ではとても役立ってるアプリなので是非多くのパパママに使って頂きたく、1週間無料にしておきますのでパパママお試し下さい!

よろしくおねがいします。

自動着色(擬似カラー)

掲示板で擬似カラーフィルタを実装してほしいというご要望があったので実装してみました。

やりかたは濃淡の応じて色を割り当てているだけです。
いわゆるPseudo-color技術ですね。

ポイントは漫画の着色にどのような色を使うかということですが、どうやら、暗い色を青系統、明るい色を茶系にすると人が自然に見えるようです。
というわけで擬似4色刷りのような感じになります。

すごくうまくいく場合と、そうでもない場合があるのですが、それは画像次第ですね。
著作権的にOKな良いサンプルがなかったのですが、一例としてはこんな画像になります。

4color
(佐藤秀峰「ブラックジャックによろしく」 漫画onWeb)

元からカラーの画像に適用してしまうと色味がおかしくなってしまいます。
そこでページのモノクロ/カラー判定アルゴリズムも開発しました(ってそんな大げさなものではないですが)
画像中の代表画素(1024画素)を使ってカラー判定する軽量アルゴです。
擬似カラー部分も含めてほとんどストレスない速度で動くはず。

このフィルタはたぶん次のバージョンに実装しますのでお楽しみに。

次のバージョンでは以下の不具合にも対処します(今してます・・・)

・縦長すぎる画像で縦横比がおかしくなる
・リモートファイルの順序がソートされていない
・ストリーミングモードでRARの順序がおかしい

履歴、リモートフォルダのショートカットも実装中です。
バグがまだ多数あるので先にそちらの修正版をリリースするかもしれませんが、どちらにしても近日中・・・の予定です。

iOS発売年ごとの最終対応OSバージョン

デバイスごとのアップデート可能最終iOSバージョンをまとめました。
今回iPod touch第4世代とiPhone3GSがiOS7にアップデートできません。

特に注意が必要なのがiPad初代です。iOS5.xが最終バージョンとなっています。
同じ2010年に発売されたiPhone4はiOS7にも対応していますので、iPad初代は特に短命ということになりますが、まだユーザーが多いデバイスでもあります。

[3.1.3まで]
(2007)iPhone
(2007)iPod touch 1gen

[4.2.1まで]
(2008)iPhone3G
(2008)iPod touch 2gen

[5.1.1まで]
(2010)iPad 1gen
(2009)iPod touch 3gen

[6.xまで]
(2009)iPhone3GS
(2010)iPod touch 4gen

[7対応]
(2010)iPhone4
(2011)iPhone4S
(2012)iPhone5
(2013)iPhone5C/S
(2011)iPad2
(2012)iPad 3gen
(2012)iPad 4gen
(2012)iPad mini
(2012)iPod touch 5gen

タブとナビゲーション(とテーブル)を同時に使った時に横画面にすると、縦方向が明らかに狭いので横にボタン持ってきてみた・・・。

写真 2013-08-20 1 03 42

本の閲覧画面のページスクロールする部分も元々はiPhone5の縦画面で余った画面用だったので、横にしたときも下でなくて横に表示するようにしましたが、同じようなイメージ。

ComicGlassへのストリーミング閲覧機能実装

長らくお待たせしているストリーミング閲覧機能ですが、徐々に形になってきました。
家の中で使うにはすごい便利です。
3Gでも使えますが、読書スピードに回線速度がおいつかない場合が多いのでスキャンサイズによってはストレスフルです。
ただしLTEなら大丈夫そうです。

写真 2013-06-18 10 35 49

 

 

ここからは技術的な話ですが、ZIPのストリーミングはHTTPのRangeリクエストで実現しています。
サーバ側を特殊プロトコルにすることも考えたのですが、Apache等の一般HTTPサーバで使えるメリットは大きいので。

一方で、PDFはHTTPをつかったストリーミングは難しそうです。
PDFのフォーマットは1ページを表示するためにファイル全体にランダムにアクセスする必要がある場合が多く、ストリーミングに向かないためです。色々実験してみましたが非現実的と判断しました。
なので、PDFは非対応とするか、サーバ側で対応することになります。

今のところ実装が終わっているのはZIPのみです。
RARはまだきちんと評価していませんが、アーカイバなのでおそらくzipとさほど変わらないとおもいます。

MediaServerもHEADリクエストやRangeリクエストに対応させるためアップデート予定です。
さらにWindows版ではWindowsNTサービスとして動く、システム・サービス版もリリース予定です。
システムサービス版ではユーザーがログアウトした状態でも動作します。
こちらはほぼ完成しています。

さらにComicGlass自体がMediaServerになる機能も載る予定です。
これを持っていると複数のデバイスに入れているComicGlass間でファイルの転送ができます。(Wifi経由)

リリース時期は未定ですが、iOS7が出る前にはリリースできたらいいなーと思います。

ストリーミングを実装するにあたり、ビューアまわりを作りなおしています。なのでテストは慎重に・・・という状態です。
iOS3.xのコードを消すなど整理しなおしたので、全体のパフォーマンスも少しよくなる?かもしれないです。

なお、ストリーミング、MediaServer(HTTPD機能)のネットワーク追加機能は、In-App Purchaseで提供させていただくかもしれません。
ライブラリのライセンス等買いたいのですみません。

もうしばらくしたらベータテストを行います。
ご協力頂けるとありがたいです。
twitterで募集しますので是非よろしくです。
(@rhotta)

iPhoneから他のホストへのTCP接続を確認するアプリ

Windowsファイアウォールの設定ミスなどでネットワーク機能が機能しない場合に、ユーザー様に簡単に確認してもらう手段が少ないので、アプリを探してみました。

例えば以下のアプリでiPhoneから、PC(Windows等)へのTCP接続が可能かどうか確認できます。

Port Monitor By SBR Soft

この記事を書いた時点では無料でしたが、変わる可能性もありますのでよくご確認ください。(同機能のアプリは他にもありますが、分かりやすそうだったものを紹介します)

<使い方>

右上の+ボタンをタップしてグループを追加します。名前はなんでもいいです。

写真 2013-01-30 18 35 23

グループを作成したら、その中のビューでもう一度+ボタンをタップします。
以下のような画面になりますので、必要な情報を入力してください。
Name・・・任意の名前
Host・・・接続先のパソコンのIPアドレス(調べ方は下に書きます)
Port・・・確認したいポート番号。(ComicGlass Sync&BackupServerであれば49728)

写真 2013-01-30 18 36 51

保存したら右下の更新ボタンをタップして、アイコンが緑色のチェックになれば接続出来ています。接続できない場合は赤い×マークになります。ネットワークの設定を確認してください。

写真 2013-01-30 18 38 04

ほとんどの方はパソコンのIPアドレスをDHCPで自動設定していると思いますので、アドレスの調べ方を以下に書いておきます。

<パソコンのIPアドレスの調べ方(Windows)>
(方法1)コントロールパネル→ネットワークと共有センター→(左の一覧から)アダプター設定の変更→利用しているアダプタをダブルクリック→詳細(E)…→IPv4アドレス

(方法2)コマンドプロンプトでipconfigと打つ

<パソコンのIPアドレスの調べ方(Mac)>
システム環境設定→ネットワーク→使用しているネットワークを選択し、状況の部分を見てください

stringByAddingPercentEscapesUsingEncoding(NSString)の使い道

URLをパーセントエンコーディングするとき、stringByAddingPercentEscapesUsingEncodingを使ってはいけないという記述をよく見ますが、用途次第です。

このメソッドは「$&+,/:;=?@」をエンコードしてくれません。
しかしこれが逆に必要な時もあって、具体的には非アスキーなURLをエンコードする場合です。

例えば以下のようなURLですね。
http://exmple.com/日本語/index.html

このURLはこのままだとNSURLなどに渡せません。
日本語部分をエスケープする必要があります。

しかしながら「/」や「:」までエスケープしてしまってはURLでなくなってしまいます。
stringByAddingPercentEscapesUsingEncodingはこのような時に使います。

「$&+,/:;=?@」は日本語まじりの場合でも必ずエスケープしないとURLの構成要素と区別がつきませんのでエスケープされているが、その他の非ASCII文字はエスケープされていないというような場合に利用できるわけですね。
どこで出現するかと言えば、NSURLConnectionなど使って通信しているとホスト側からリダクレイとされたりしたときに返ってくることがあります。

iPhone5対応

iPhone5とiOS6の地雷原から未だに完全に抜け出せていません、こんにちは。
しかしながら、ようやく解決の目処がついてきております。

iOS5.0のときほどではないにしても、今回もギャンブル性が高いアップデートでした。
なにせ解像度が変わることが正式に発表されてから2,3日以内にsubmitしないとiPhone5の発売に間に合わないというスケジュールでしたからネ。

次はiPad miniの噂も出てきていますがどうでしょうか。
電子書籍ビューアにとっては少し小さいタブレットは理想的だと思いますので、もし本当に発売されるのであれば、また地雷原が広がっているとしても果敢に早期対応する意気込みではあります・・。

iPad Retinaの時も実機が手元に来る前にアップデートしましたからね!
(この時は奇跡的?にうまくいきました)

Retina用@2xがついた画像から半分の解像度の画像を自動生成

iOSでは通常の画像(image.png)と、解像度が倍のRetina用画像(image@2x.png)を両方用意しないといけませんが、すごく面倒です。

そこでimage@2x.pngを入れるとimage.pngを自動生成するアプリケーションを作ってみました。
奇数の大きさを持つファイルや@2xが名前についていないファイルは何もしません。
また、既にファイルが存在している場合は上書きします。

remove@2x

縮小は4画素を平均して1画素を作る方法で計算しています(画素平均法)。
輝度の端数は切り捨てです。
png画像のみ対応。需要があればjpegも対応しますが、ひとまずこれで。

ダウンロード

何かありましたらコメントかtwitter(@rhotta)までお願いします。


カレンダー

2024年4月
1234567
891011121314
15161718192021
22232425262728
2930  

▲Pagetop