Title

CFBundleShortVersionStringの表記

昨日、ComicGlassのアップデートのためiTunes connectにアプリを送信したところ、CFBundleShortVersionStringが無いということで警告が出ました。(警告は出ましたがアップロード自体は受理されてステータスはWaiting For Reviewに)

ComicGlassを最初に作ったのはiOS3の頃です。その時にはCFBundleShortVersionStringが無かったようでxcodeで自動的に作られなかったので今までずっと無いままでした。CFBundleShortVersionString無いなーとは思ってたんですが、バージョンアップのとき変更するの一つでいいし楽だからいいやと放置してました。
前回までは警告出なかったので最近警告が出るようになったんだと思います。

このCFBundleShortVersionStringですが、本来はピリオドで区切った3つの数字を用いるのが正しい表記のようです。10.0.1みたいな感じですね。現在ComicGlassのバージョン表記は7.50といった2数字表記になっているのでいつか改めないといけないかもしれません。警告が出るようになったということは今後厳格にチェックが入る前触れかもしれないので・・・。
なお、現在のところCFBundleShortVersionStringが3数字になっていなくても(7.50.1ではなく7.50とかでも)警告なく通るようです。

新たにアプリ作るときは正しいフォーマットでバージョン番号を付けたほうが良いと思われます。
お気をつけください。

CentOS7にJIRAをインストール

JIRAは課題管理システムで、おそらく(というか当然)チームで使うものですが、一人で使ってみることにしました。
何やるべきかすぐ忘れてしまうので・・・。

有料なのですが、ユーザーが10人以下だと激安(US10ドル)みたいです。

インストールで予想外にハマったのでメモです。

■MySQL

CentOS7ではyum install mysqlとやってもMySQLではなくMariaDBがインストールされてしまうので手動でインストールする。
インストールしちゃった場合は削除してから。
yum -y remove mariadb-libs
yum -y remove mariadb

MariaDBでもいいのかもしれないけど、JIRAのデータベース選択肢には出てこないので一応。

インストールしたらMySQL上のユーザー等を作っておく。

なお、JIRAのデータベースは後から変更できますとりあえずはお試しで!みたいなメッセージ出ますが、あとから変更するの面倒なので最初からセットアップしたほうがいいと思います。

■JIRA

基本的にはインストーラーがやってくれるが、いざMySQL利用しようとするとConnector/Jが無いと言われるのでダウンロードして自分で入れる。
http://dev.mysql.com/downloads/connector/j/

mysql-connector-java-5.xxxx-bin.jarをJIRAのインストールディレクトリのlibに入れる。
デフォルトでは/opt/atlassian/jira/lib/

■JIRAのデータベース設定

ブラウザでポート8080にアクセスすると設定画面が開く。ウチの環境では起動後しばらくはめちゃくちゃ遅い。
JIRAが起動していない場合はservice jira startで起動

初期設定画面で日本語を選ぶと表示が崩れてうまくいかなかったので、まずは英語でセットアップした(後で変えられる)
(たぶんすぐに改善されると思いますが、表示がくずれる場合は英語にしてみてください)
なお、データベース設定に失敗したら/var/atlassian/application-data/jira/dbconfig.xmlを消すとデータベース設定からやり直せる。

なお、外からつなぐ場合(つなぐに決まってますが)ファイアウォールの設定が必要。
ポート8080を許可してください。
デフォルトのファイアウォールがiptablesでなくfirewalldになってます。
ポートの許可は
firewall-cmd –add-port=8080/tcp
firewall-cmd –add-port=8080/tcp –permanent
(上は現在の設定のみ変更、下は恒久的に変更。ただし下だけ実行してもすぐには反映されませんのでとりあえず両方実行しときます)

■Apacheでリーバスプロキシを設定してSSL経由でアクセス

SSLでアクセスしたい&標準ポートでアクセスしたいので、リバースプロキシを設定する。
これが結構面倒で、普通にApacheの設定後JIRAの設定もいくつか必要。

基本的にはここ(https://confluence.atlassian.co.jp/pages/viewpage.action?pageId=54919378)に書かれてるけど、わかりにくい。

の中の設定が必須。
とりあえず見本からProxyNameだけ変えてコピペすれば良い感じ。

加えて、配置がルートの場合は不要だが、https://xxxx/jira/ のような感じにしたい場合は

今さらSnow LeopardとXcode4.2を利用する方法

Snow Leopardの次から色々と断絶があり、現在のxocdeでSnow Leopard以前で動くバイナリを作ることは出来ません。
iOSについても同様で、iOS4.x以前向けのSDKは現在のxcodeには含まれていません。

もう無視していいかなーと思っていましたが、今だに必要になったのでメモ。

必要なもの
・Mac(MacOSX のバージョンは新しいものでOK)
 なお、Snow Leopardが動くMac実機が用意できれば何の問題もありません。普通にそれ使って下さい…。
・Snow Leopardのインストールディスク
・Xcode4.2のインストーラ

Xcode4.2の入手方法

Xcode4.2を入手する方法について困る方がいらっしゃると思います。
Xcode4.2をダウンロードしたことがあるAppleアカウントがあればAppleのサイトから再ダウンロードできます。
(Downloads for Apple Developersのページにて”Xcode 4.2″で検索)

Xcode4.2を購入した事があるか、当時有償で開発者登録しておりXcode4.2をダウンロードしたことがある場合は何の問題もなく再ダウンロードできると思いますが新規アカウントなどでは検索しても出てきません。

実はXcode4は600円の有償販売でした。よって今でも無料ダウンロードは出来ないということになっているようです。
しかも今はもう買えません・・・。
勝手にXcode4.2のインストーラを置いているサイトがあるかもしれませんが、それは違法コピーということになりますのでご注意ください。
アップルさんにはこの際無償公開して欲しいところです。せめて再販売・・・。

現在の環境構築手順

1.VirtualBox(無料)をダウンロードしてMacにインストール
 MacはMarvericksで大丈夫です。

2.仮想マシンにSnow Leopardをインストール
 特に気をつけることはなく普通にインストールできます。
 ちなみにWindowsでやろうとしても無理ですし、ライセンス的にもNGです。

3.Downloads for Apple Developersのページにて”Xcode 4.2″で検索
 ・・・ここでXcode4.2が出てこなかった方。
 大変残念ですが、ログインしているアカウントではXcode4.2はダウンロードできません。

4.Snow LeopardにXcode4.2をインストール
 ・・・「インストールが失敗しました」。となる場合はソフトウエアアップデートをかけてください。
 Appleインストーラの更新がこの時期にかかっており、アップデートしないとインストールに失敗します。

以上です。

新しいxcodeのプロジェクトをXcode4.2で開いたりするとぶっ壊れますのでご注意ください。
また、Xcode4.2で使っていたプロジェクトを新しいXcodeで開いてしまうと、二度とXcode4.2では開けなくなりますのでご注意ください。

ComicGlass、SMB2及びSMB Server対応

詳細

後日また詳細に書こうと思いますが、ComicGlassの次バージョンにてSMB2プロトコルへの対応とSMBサーバ機能が利用できるようになりました。

SMB2はWindows Vista以降で利用できるプロトコルでWindowsXP/WindowsServer2003以前で使われていたSMB1の後継プロトコルになります。
現在ほとんどの機器がSMB1に対応して動作していると思いますが、XPのサポート期限も切れ、WindowsServer2003のサポートもまもなく切れますのでSMB2以降が主流になってくるかもしれません。
Windows8以降では高セキュリティ設定をするとSMB1が使えないことがあります。

SMBサーバ機能は、文字通りSMBサーバ(ファイル共有サーバ)として動作する機能です。
WindowsのエクスプローラーからComicGlass内のファイルを読み書きできます。
書き込みはもちろん、読み出しも出来ますし、直接ファイルを開いて確認することも可能になります。
フォルダを内容を含めてコピーしたり、ファイル名をPCから編集することも出来ますのでファイルの管理やバックアップが大変便利になります。

ただし、エクスプローラーで開いたままiPhoneをスリープしたりアプリを終了してしまうとWindows側がタイムアウトするまで困ったことになりますので使い方には少し注意が必要です。
(一応、ファイルへのアクセス中は自動的にiPhoneがスリープしないように実装してあります)

実装について
SMBの実装はVisuality Systems社のCIFS NQを使っています。
製品なので、接続互換性のテストがしっかりされており、(おそらく通信相手の仕様間違いも含めて())色々な相手と正しく通信できると思います。
基本用途は組み込み向け製品向け製品なのでiOSに移植するために実装した部分で不具合がある可能性は多分にありますが、とりあえず安定した通信が期待できるのではないかと。
(一応当面は旧独自実装も使えるよう、選択式にしてあります。これまで問題なかったのに問題が起きたという場合には旧設定にしてみてください。そして発生状況を教えて頂けると大変助かります)

GoogleDrive対応

重い腰を上げて、GoogleDrive対応を実装しました。
前にAPIを少しみた段階で”うえっっ”てなって放置していたのですが、ちょっと癖があるんですよね。
基本はHTTPなので、通信内容に癖があるわけじゃないのですが、SDKが微妙に使いづらいのです。
といっても作りが悪いわけでなく、GoogleDriveだけでなくGoogleの汎用ライブラリを使っているのが原因です。

ファイルのダウンロードは比較的簡単ですが、ストリーミングが少し面倒でした。
どうしても細切れにアクセスすることになるのでパフォーマンスがいまいち。
もう通信自体Googleのソース使わずに全部独自に実装してやろうか・・と思いましたがあまりに大変すぎて断念。

また、ComicGlassではリモートのファイル一覧を開いた状態のまま、アプリのスリープ中や終了後も状態やリストを保持する機能があります。
モバイルデバイスですから、前の状態からいつでも再開できるというのは重要なことです)

ここがまた問題で、GoogleDriveが返すファイルにアクセスするためのユニークURIが時間が経つと(正確にはセッションが新しくなると)勝手に変わります。
といわけで、前回開いていたファイルが現在どのファイルなのかをマッチングする必要があります。
この辺もURIが変わったら自動的に情報を再取得することで問題を回避しました。
たまに失敗しますので、どうしてもエラーになる場合は接続からやりなおしてください。

OS X Mountain LionのSMB実装に問題を見つけた

MacOS MountainLion で濁点や半濁点のあるファイルやフォルダがあると不具合が起きるとのご報告を受けて調査した結果、MacOS側に問題を発見しました。

SMBパケットをキャプチャしてみると以下のようになりました。
ハイライトで示した部分は、ディレクトリ内のファイル一覧を取得した結果です。

「名称未設定フォルダ」というフォルダがあります。
「名称未設定フォルダ」のUnicode(NFC正規化)のコードは以下で、18バイトです。
540D 79F0 672A 8A2D 5B9A 30D5 30A9 30EB 30C0

以下はMacOSX Marvericksをサーバにして、SMB1でアクセスファイル一覧を取得した結果の一部です。
18バイトのUTF16LEの文字列で「名称未設定フォルダ」が取得できています。

140324osx_marvericks

ところが、MacOSX MountainLion同じ事を行うと、ファイル名の長さが20バイトで、
540D 79F0 672A 8A2D 5B9A 30D5 30A9 30EB 30C0 0000
という結果が返ってきます。

140324osx_mlion

試しに「名称未設定フォル」の濁点を取って「名称未設定フォル」に変更すると、
540D 79F0 672A 8A2D 5B9A 30D5 30A9 30EB 30BF
という18バイトの正しい結果が返ってきます。

140324osx_mlion2

よって、MacOS10.8では、SMBクライアントに対してファイル名をNFCに正規化するが、正規化後のファイル名のサイズ計算に問題があると思われます。
(MacOSではNFDでのみファイルが保存されるので、NFCへの正規化がSMBの一部として行われるようです)
0000は通常文字列終端を表すので、Windowsなどではそこまでを文字列と判断して問題が起きないものだと思われます。

また、この問題はMarvericksでは発生しないので、MacOSとしては修正済みと思われます。

ComicGlassでは素直に、サーバから返してきたファイル名文字列長の後に、検索パターンである\\*を追加してフォルダの階層を辿っています。
その結果、文字列の途中に0000が入ってしまい、追加した\\*が無効になってしまいます。
影響としては、ファイル一覧を取得できない他、ファイルのオープンもできなくなります。

対策として、受け取ったファイル名に0000(‘\0’)が含まれていたらファイル名長を計算しなおす修正を入れます。

しかし、(おそらく)正しく実装していても相手によって不具合が起きる、、SMB互換性の確保は難しいです。

特にMacOSとiOS以外では普通ファイル名にNFCを使いますしが、NFDでもファイル名をつけられます。
MacOSとiOSでは、必ずシステムによってNFD(の変形版・・)の正規化がされますので問題が顕在化します。
Objective-CのSMB実装はあまり例がないようなのですが、実装時にはこの部分おさえておかないと不具合出ますね。

SMBとUnicodeファイル名正規化問題

かつて、LinuxからSambaを使ってWindowsのファイル共有にアクセスすると、文字コードの変換の問題で大変苦労しました。

時代は流れ、LinuxでもWindowsでもUnicodeが標準になりました。
というわけで、一般的にSMBを使う分には文字コードで苦労することはほぼなくなりました。

しかし・・・。

とりあえず以下の画像をご覧ください。
これはWindows8のエクスプローラーの画面です。

SnapCrab_NoName_2014-3-23_1-27-56_No-00

何かおかしいところにお気づきでしょうか。
おかしいですよね。
いいおっさんがプリキュア・・・じゃなくて、同一のファイル名が同じフォルダに存在しています。

実はこれ、「ピ」と「プ」の文字がUNICODEの結合文字列になっています。

通常、Windowsで「プリキュア」と入力した場合、「プ」の文字はU+30D7になります。
しかしMacOSで「プリキュア」と(ファイル名として)入力した場合、「プ」の文字はU+30D5 U+309Aになります。

U+30D5は「フ」です。
U+309Aは半濁点記号です。
つまり、「フ」+「゜」の合成で表現されます。
(なお、ここに書いた「゜」はU+309Cで、合成用ではなくそういう1文字ですので念のため)

Unicodeではこのような複数の表現方法があります。
混ざってる何かと困るので、普通は同一コードになるように正規化して扱います。
合成した方を使うのをNFC(Normalization Form Canonical Composition)、分解した方を使うのをNFD(Normalization Form Canonical Decomposition)と言います。

さて、最初の画像のファイル名ですが、「パ」と「プ」の表現方法を結合文字列、合成文字、混ぜてあります。
結果として4パターンの同名ファイル名が出来てしまったわけです。

何故かWindowsは上記のような状態を許してくれます。
許しているというか、初期の頃になんの正規化もせず扱ってしまったため、以後もそのままになっているんだと思います。(憶測)

さて、一方MacOSですが、上記のようなNFD,NFCの混在を許してくれません。
必ずNFDライクな正規化をされます。(正確にNFDでないのがまた困るんですが・・・)
iOSも一緒です。
よってファイル共有をすると大変困ります。
SMBには明確な仕様がない(もしかしたらあるかもしれなけど、ドキュメント読む限り発見できず)。
おそらくWindowsなのでNFCのUTF16 Little endianなんでしょうが、NFDでもプロトコルとしては問題なく(というかノータッチで)動きます。

さて、どう実装するのが正解なのでしょうか。
困りました。

VisualStudio2013でビルドするとWindowsXP/2003Serverで起動できない

VisualStudio2013では、デフォルトの設定でWindowsXPが切り捨てられています。

フレームワークのバージョンとかでなく、素のWindowsAPIのみを利用していても起動できません。
さすがにもうWindowsXPはサポートしなくても良いのかもしれませんが、Windows2003ServerはWindowsXPと同じ扱いですので、WindowsXPで起動できないとWindows2003Serverでも起動できません。
(Windows 2003Serverは15年7月くらいまでサポート期間があります・・・)

以下の設定を変更すると起動できるようになります。

140321vs2013

もはや動作確認環境もなく、なかなか気づきにくいので気をつけないといけませんね。

・・・しかしVisualStudio高いよねーー。。
自分の作るWindowsアプリケーションは本当に素のC++で書いているので別にどんなコンパイラでもコンパイルできるんですよね。だから高く感じますが・・・
しかし、VisualStudio2013のエディタはかなり良くなりました。エディタとして買ってます。

iOSでSMBライブラリを実装する(その6)

そろそろメモとして書くことがなくなってきました。
一応リリースできましたしね。
SMBは「シンプルの逆」のものなので、完全な互換性を目指すとかなり茨の道を行くことになります。

最後に、ものすごく参考になりそうな本をみつけたのでご紹介。

Implementing CIFS: The Common Internet File System

cifsimp

タイトルまんまですね。
最初に存在を知っていれば・・・ということはよくあります。
ここに辿り着いただけでも褒めてください。

さて、実用としては色々考えるところもありますが、やっぱりSambaのスケールの大きさとか、市販のCIFSライブラリが長年開発されて売られ続けていることとか、使いやすいライセンスの優れたOSSがみつからないとか、ようするにSMBは複雑ってことですね。

SMB初期実装をリリース

さて、せっかく作ったのでComicGlassのSMB対応バージョンをリリースしました。

予想はしていましたが、いくつか互換性で問題が発生しています。
Windows,Samba,MacはチェックしていたのでOKだったのですが、Sambaのバージョンが古いもの、もしくは設定がちょっと古風になっているもの、あとWindowsでもSambaでもMacでもないもので問題がおきました。

一つ目は、パスワードが設定されていないNAS(WindowsはOK)に接続したとき、ストリーミングすると落ちます。
これはプロトコルの解釈というよりは、単純に値の受け渡しミスでした。
内部的にユーザー名とドメインをつなげて指定できるようにしていたのですが、空だとnilになって文字列のパースで落ちます。
こちらは1行修正するだけなので、すぐに修正版出せる予定です。

2つ目はAirMac Time Capsuleです。
こちらも想定どおりといえば想定どおりなのですが、認証方式の問題で接続がうまくいきません。

具体的にはAirMac Time Capsuleでは「Extended Security Negotiation」フラグがオフになっています。

airmac

手元で事前に試した限り、Extended Security Negotiationを使わないデバイスはなかったので、省力化のために実装を省きました。
しかし身近なところにありました。

Extended Security Negotiationがオフの場合でも認証なしの場合のみ対応していたのですが、AirMac Time Capsuleは認証も要求するのでダメです。はい。

他にも、なにかと互換性の問題が起きる可能性は否定できず(なにせSMBはとても歴史あって方言の多いプロトコルなので・・・)、根本的な対策ができたらなと思ってるところです。
(決まりましたらお知らせします)

AirMac Time Capsuleの対応についてはしばらくお時間ください。

カレンダー

2024年4月
1234567
891011121314
15161718192021
22232425262728
2930  

▲Pagetop