Title

夜更かししないためのライフハック

昔実践していたことがあるのが、ひとりサマータイムもどき。
自分だけ時計を1時間か2時間ずらして生活します。(時計を進めます)

そうすると時計が午前2時とか3時とかになるまで起きていても平気です。(気分ですよ気分)
実際には午前0時頃なわけですが、さすがに(表示が)1時、2時になると寝ようかなーという気分になるわけです。

これはこれでよいのですが、昼間は他の人と時間がずれていて何かと不便です。

といわけで、帳尻合わせて夜だけ時計を進める歪みタイムゾーンを考えてみました。

・午前6時から午後6時までは普通の時計と同じです。
・午後6時からちょっと加速して、午後10時になるころに表示は24時(0時)になります。
・午後10時から午前2時までは表示は2時間進んだまま、通常と同じ速度で表示が進みます。
・午前2時から午前6時の間に2時間の進みを帳尻合わせします。

<図解>

とりあえずみんな笑顔でハッピーということで「スマイルタイム」と名づけました。
(というかいろいろ検索したんだけどわかりやすくて取れるドメインがこれでした)

http://smiletime.info/ <スマイルタイム>

↑思いついたらすぐになんかしてみたくなるので、説明のためのサイト作りました。全てパブリックドメイン的に扱って構わないので是非お試しください。普及活動します(弱々しく)
 寝る時間だけではなく、仕事もはやく終えるようになったらいいですよね。
 iPhone時計アプリとかもそのうち作ってみる。

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でデータの先頭がわかる)

フィリピン災害への寄付

【寄付ハック】フィリピン災害へ寄付した人に、オレが自腹でiPad miniプレゼントキャンペーン(fladdictさん)

fladdictさんはいつもアイデア素晴らしい。
全員が得するやり方でないと支持されにくいんですよね。うまい。
まんまと宣伝しちゃうぜ!

僕も応募したよー

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

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

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

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

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

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

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

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

【高速化】abs()関数を使うべきか

絶対値を求めるC言語の関数はabs() です。

なんとなく関数呼び出しのコストがもったいない気がして、

int a = b >0 ? b : -b;

みたいな書き方を見かけることがあります。
(というか意識せずに自分でも書いていることが・・・)

ちょっと話は変わって、絶対値計算に条件分岐が必要だと思いますか?

答えは環境依存、、ということになりますが、大抵の環境では条件分岐不要です。
現代の多くの環境においてはabs()関数を使えば関数呼び出しはインライン展開された上に分岐なしの絶対値計算コードが出力されます。
だからあまり気にせずabs()を使ってOK。

VisualC++にてint a = abs(b);というプログラムをコンパイルした結果は以下のような感じになりました。たったの3命令、しかも分岐なし。

(EAXレジスタにbの値が入っている)

cdq 
xor eax,edx 
sub eax,edx

CDQが見慣れない感じですが、CDQ命令はEAXレジスタの符号をEDXレジスタのすべてのビット位置にコピーする便利命令です。

C言語風に書くと以下のような感じでしょうか。

a = (b ^ (b >> 31)) - (b >> 31);

結論。
標準関数は自分で再実装せず、ありがたくそのまま使え。

Objective-Cで中国語文字コードのC文字列をNSStringに読み込む

これわからずに非常に苦労しました。
そもそも中国語の文字コードなんて知らんし・・・。

NSStringEncodingの一覧には中国語っぽいものが無いんですよね。
下のように日本語は優遇されている気がしますが、その他言語はどうするんだろうって思いますよね。

enum {
    NSASCIIStringEncoding = 1,		/* 0..127 only */
    NSNEXTSTEPStringEncoding = 2,
    NSJapaneseEUCStringEncoding = 3,
    NSUTF8StringEncoding = 4,
    NSISOLatin1StringEncoding = 5,
    NSSymbolStringEncoding = 6,
    NSNonLossyASCIIStringEncoding = 7,
    NSShiftJISStringEncoding = 8,          /* kCFStringEncodingDOSJapanese */
    NSISOLatin2StringEncoding = 9,
    NSUnicodeStringEncoding = 10,
    NSWindowsCP1251StringEncoding = 11,    /* Cyrillic; same as AdobeStandardCyrillic */
    NSWindowsCP1252StringEncoding = 12,    /* WinLatin1 */
    NSWindowsCP1253StringEncoding = 13,    /* Greek */
    NSWindowsCP1254StringEncoding = 14,    /* Turkish */
    NSWindowsCP1250StringEncoding = 15,    /* WinLatin2 */
    NSISO2022JPStringEncoding = 21,        /* ISO 2022 Japanese encoding for e-mail */
    NSMacOSRomanStringEncoding = 30,

    NSUTF16StringEncoding = NSUnicodeStringEncoding,      /* An alias for NSUnicodeStringEncoding */

    NSUTF16BigEndianStringEncoding = 0x90000100,          /* NSUTF16StringEncoding encoding with explicit endianness specified */
    NSUTF16LittleEndianStringEncoding = 0x94000100,       /* NSUTF16StringEncoding encoding with explicit endianness specified */

    NSUTF32StringEncoding = 0x8c000100,                   
    NSUTF32BigEndianStringEncoding = 0x98000100,          /* NSUTF32StringEncoding encoding with explicit endianness specified */
    NSUTF32LittleEndianStringEncoding = 0x9c000100        /* NSUTF32StringEncoding encoding with explicit endianness specified */
};
typedef NSUInteger NSStringEncoding;

もちろんUTF8ならいいのですが、Windowsで作ったテキストファイルなどはUnicodeになっていないことが多いようです。
日本語でもShiftJISが未だに使われますよね。

日本人でこの問題に言及している方がいなかったので情報共有で書いておきます。

結論を書きますと、CFStringConvertEncodingToNSStringEncodingを使えばその他の文字コードも読み取りできるようです。
中国語(簡体)ではGB 18030というコードが使われるようなので、以下のような感じになります。

NSStringEncoding encode = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
str = [NSString stringWithCString:cstring encoding: encode];

さて、知っている方いらっしゃったら教えてほしいのですが、台湾で使われるトラディッショナル(繁体?)な方のコードと、韓国語はどのようなコードが使われているのでしょうか?
台湾と韓国のユーザーの方もそれなりにいらっしゃるので対応したいのですがそもそもサンプルも無ければハングルを入力する術もないので・・・。

ちなみに、自動判別は無理だと思われます。。

追記:
とりあえずEUC-krが一般的っぽいので、それに対応しておいてみます。
そういうファイルが無いので確認はできませんが・・・。
台湾(?)ではbig5が普通と聞きましたので、それに対応しておいてみます。

ラテン文字はどう区別していいのかわかんないですね。
とりあえず手動で全て選択できるようにしておきます。力技。

自動着色(擬似カラー)

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

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

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

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

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

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

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

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

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

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

ComicGlass次のバージョン

まずはバグフィックスを優先してます。
すみません。

ストリーミングはおかげ様で反響を多数頂いてます。
ストリーミングを試してみたい方は、デフォルトで登録されているComicGlass Library内であればアドオンがなくてもストリーミングできますのでお試し下さい。
(JコミのファイルはPDFでストリーミングに不向きなので、佐藤秀峰先生の「ブラックジャックによろしく」をお楽しみください)

ストリーミングはiOS7に合わせたため、実装できなかった関連機能がありますので、今後進めてまいります。
またストリーミングに関して頂いているご要望に関してもできる限り対応しようと思います。

予定しておりますのは、

・FTP対応(ほとんどのNASが利用可能になると思われます)
 プロトコル上HTTPよし少しだけ効率が悪いですが、ほとんど気にならないレベルではないかと予想しています
 (FTPは大きなカタマリを転送することに向いており、細切れの転送はあまり想定されていないため)
・任意のリモートディレクトリのショートカットを本棚に作れるようにする
・履歴機能(ローカル、リモートの履歴表示、選択するとその本を開く)
・Digest認証対応(少し優先度低め)

といったところです。

また、Version6.01で残っているバグは以下のものです。6.02で修正されます。
バイナリはアップルに提出済みです。
・iOS4.3でクラッシュする
・分割を左右入れ替えが効いてない(すみません2回もミスって・・・)
・テーマのtintColor項目がiOS7で反映されない
・パスワード付zipが正しく開けない

MediaServerは特にMacOS版で多数の不具合がありました。申し訳ありません。
既に修正済みですが、初期にダウンロードされた方は更新お願い致します。
MacOS X10.6 Snow Leopardで実行できるバージョンも新たに用意致しました。

VPSサービス

一部WebサーバにVPSサービスを利用しているのですが、去年1年間の転送量を見てみたら自分の想像より多い感じ。
年間9.4TBに達しています。

2012transfer

一般的なレンタルWebなんかだと、そろそろ警告もらうくらいの水準! と思っていたのですが、自分の感覚が数年前のままだったようで、2013年の現在、この程度のアクセスは月額1,000円~2,000円程度の価格帯のサービスでも問題ないようです。

VPSだと勝手に503出されることもないので更にいいですね。
しかしOSごと管理しないといけないと思うと気が重いのでした。。
(しかも複数管理している)

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

カレンダー

2020年8月
« 10月    
 12
3456789
10111213141516
17181920212223
24252627282930
31  

▲Pagetop