2013年9月19日木曜日

HDレコーダー:さよならRD

■過去3代RD■

RD-XS41、RD-XD91、RD-BZ800と過去3代RDでした。

その前はVHSとHDがついたビクター製、これがまだ動くから凄い。見習えよ>東芝

さて、RDは最初からトラブルの多いやつでした。特に予約録画:

  • 予約したのに音声とCMの静止画がずーっと入っているだけ
  • 予約録画したらただただ真っ黒
  • 何の説明もなくすっぽかし
  • バグが原因で2回フォーマットかけるはめになった41
  • とにかく予約録画失敗が多かった91
  • 突然外付けHDDを認証できないとか言い出したBZ800…。

それでも他社製同世代機と比較すると容量の割に安いしパソコンとの連携でできる事が多いので3代も買っていました。

でも、さすがに疲れました…だって、もうエエ加減安定したと思っていたBZ800ですが、よりによって「きんいろモザイク」の録画に失敗しやがったのですから…。


「BZ800世代のRDは最悪だった。でも、今は良い」という人もいます。41の時にも91の時にも同じセリフ聞いたよ、お前はボジョレー・ヌーヴォーかよ。

■機種選定■

というわけで、3番組同時録画の中級機、一応ソニーかパナソニックに狙いをしぼり、とりあえず買った人がレビューを書くAmazonと炎上気味のKakaku.comを参考に、ソニーBDZ-ET2000とパナソニックDMR-BZT750を候補としてヨドバシへ。

なお、3番組同時録画と書きましたが、ソニーはスカパーを含む3番組、パナソニックは3番組+スカパーです。AT-X愛用者の私としてはこれは結構重要な点ですが、最後の最後まで気づきませんでした。ソニーは操作の軽快さで定評があります。



■店頭にて■

実際の操作してみると、ネット上の評価と違ってソニーは意外ともっさり。もちろんRD-BZ800と比べればそこそこ速いんですが、番組一覧のリフレッシュに10秒以上かかるのはちょっとストレスが大きい。一方でパナソニックは爆速じゃった。リモコンを押しっぱなしにしていると、まるでひっかかることなく文字が読めないスピードでスクロールしていく。

機能面ではRDの美点だったフォルダ機能は最近の中級機には搭載されていないのだとか。それは困る。番組別にわけたり、「ヨメがあとで見るアニメ」「私が後で見るかもしれないアニメ」という分類でとりあえず投げ込んでおくことができない。店員さんに尋ねたところ、ソニーには所有者?みたいな機能でタグ付けすることができ、パナソニックは複数の番組を一つにまとめたりバラしたりすることができる。うちの場合とにかくアニメが多いので、まとめる束数に制限のないパナソニックの方が使いやすいと判断。

爆速とまとめ機能、3番組+スカパー同時録画、パナソニックの圧勝でした(※個人の感想です)。

店員さんには30分ほど付きあわせてしまったので、値引きなし(一応交渉はしたけど、無しだったのであまり押さずに1回で諦めた)で購入しました。

■DMR-BZT750を使って■

電源onの起動もまるで一昔前のアナログ液晶か予熱付きブラウン管のような速さ。何より笑ったのが、NHKのデータ放送。RDだとボタンを押してから早くても20秒ぐらいしないと天気予報に辿りつけないんだけど、パナソニックは押した瞬間に出てきやがる。こんなに使える子だったのか、とデータ放送を見直しました。

スカパーからNASに録画した番組もローカルHDの番組も全表示で一覧表示でき、爆速スクロールする。スカパーの番組も問題なく再生できる。もうね、今までのもっさりとろとろ時々クラッシュ、は一体何だったのかと。

■互換性について■

RDで焼いたBlurayディスクは今のところREもRも問題なく再生できてます。LAN経由でRDを見ると番組名一覧は表示できるのですが、選択すると数秒後に「再生できません」とアラートが出ます。

2013年8月25日日曜日

Force.com mobile SDK 2.0 for iOS

【重要なお知らせ】新プロジェクトはコマンドライン

前のバージョンまでは、XcodeのFile->New->New Project...でHyblid Force.com App / Native Force.com REST Appを選べばすぐにプロジェクトができていましたが、2.0ではコマンドラインから作る必要があります。簡単ですけども。

【重要なお知らせ】ARCに対応しました!

Xcode 5はARC対応のプロジェクトしか作れないですし。それにARC、慣れてしまえばそんなに悪いヤツじゃないですよw

■大まかな手順■

  • gitからcloneしてbuild
  • テンプレートをbuild
  • では、新しいプロジェクトを

参考ページは以下。
https://github.com/forcedotcom/SalesforceMobileSDK-iOS

以前より増えた分(テンプレートのbuild)
https://github.com/forcedotcom/SalesforceMobileSDK-iOS/blob/master/build.md

■gitからcloneしてbuild■

まず、適当なディレクトリに移動して、ターミナルから以下のコマンドを実行します。

git clone https://github.com/forcedotcom/SalesforceMobileSDK-iOS.git
回線速度にもよりますが、数十秒程度。終了してプロンプトが出たら、次はgitが作ったプロジェクトの中に異動してビルドします。

    cd SalesforceMobileSDK-iOS/
    ./install.sh

これは回線やマシンの速度の応じてやっぱり数十秒から数分。SSDだと妙に速くて感動です。以前はこれでXcode用のテンプレートが自動的にインストールされていたのですが。

■テンプレートをbuild■

それではテンプレートをbuildします。

    cd build/
    ant 

今度はそれほど時間かかりません。

■では、新しいプロジェクトを■

    cd artifacts/
    cd NativeAppTemplate/ または cd HyblidAppTemplate/
    ./createApp.sh

これでテンプレート生成シェルから使い方が出てきます。

Usage:
createApp.sh
   -t <Application Type> (native, hybrid_remote, hybrid_local)
   -n <Application Name>
   -c <Company Identifier> (com.myCompany.myApp)
   -g <Organization Name> (your company's/organization's name
   [-o <Output directory> (defaults to this script's directory)]
   [-a <Salesforce App Identifier>] (the Consumer Key for your app)]
   [-u <Salesforce App Callback URL] (the Callback URL for your app)]
   [-s <App Start Page> (defaults to index.html for hybrid_local, and /apex/VFStartPage for hybrid_remote)]

では、素直にプロジェクトを作ってみます。com.company / companyはあなたご自身のものを使ってください。蛇足ですが。

    ./createApp.sh -t native -n TestForceMobile20 -c com.company -g company

ほんの一瞬で以下のメッセージが出来て終了します。

Creating app in SalesforceMobileSDK-iOS/build/artifacts/NativeAppTemplate/TestForceMobile20
Successfully created native app 'TestForceMobile20'.

あとは適当なディレクトリにコピーして、.xcodeprojをダブルクリックすればXcodeが起動します。

■プロジェクトについて■

コマンドラインで生成した時に指定しなかった場合にはAppDelegate.mのRemoteAccessConsumerKeyとOAuthRedirectURIを設定します。

生成されたコードはばっちりARC対応です。__weakが邪魔っすね。まだ慣れません。AppDelegate.mは1.xよりはかなり洗練されていて、いじりやすくなりました。例によってStoryboardには対応していませんが、setupRootViewControllerでnibではなくStoryboardから生成されるようにすれば問題ないはずです。

取り急ぎ、以上。

2013年8月11日日曜日

ワイシャツの洗濯

■クリーニング屋に不満がある■

うちの近所のクリーニング店はどうもいかん。特にワイシャツ方面:
  • 安いところは襟汚れが落ちない
  • 高いところはまぁ良い仕上がりだったけど潰れた。プリペイ残あるのに
  • どこも高温乾燥しているせいか縮む
  • 糊付けないでと言ってもパリパリ
こんな感じ。なので自分で洗ってるんですが、アイロンは苦手だし面倒なので掛けたくない。とりあえず試行錯誤の結果、ある程度うまくいくようになったので、まとめてみました。

基本的にはきちんとたたんでからネットに入れて洗う。マルイのワイシャツ専用洗濯ネットってどうなんでしょね。良いとは思うものの、ネット1枚でワイシャツ1枚しか洗えないのがイヤなので買ってません。高いし(1枚1000円)。

■前準備■

使い古した歯ブラシでワイシャツの襟と袖口に液体洗剤を塗りつける。

適当な作業場所で襟のボタンをとめてからシャツを広げます。うちは風呂フタの上でやってます。LED電球なので写真の色温度がヒドいことになってますがご容赦ください。

脇の下の縫い目を左右に引っ張るようにするといい感じにシワが取れます。これを3-4枚、写真のように重ねて行きます。重ねる時には、ノーアイロン性能の高いものが上に来るようにすると良いです。今回は綿100%のダンガリー☓2、エディー・バウアーの綿100%シワ無し加工シャツ、ビズポロ…の順番。ビズポロは普通に洗濯脱水しても皺にならないのですが、スペーサーとして入れてます。

次に、片袖ずつ内側に折っていきます。なんか「デュワ〜」って感じ。


最後に、ネットに入る大きさに折ります。私はデブなので幅65cmないと入らないですが、普通の人なら60x45cmのネットに入ると思います。

あとは、普通に洗濯しますが、脱水はしません。洗濯>すすぎ>すすぎ…が終わったところで止めておきます。水槽からネットごとワイシャツを取り出して、濡れたままハンガーに干します。

ノーアイロンはもちろんアイロン簡単シャツならこれで十分パリっと仕上がりますし、綿100%のダンガリーも程よいざっくり加減になります。

2013年8月3日土曜日

NAS + スカパー録画の危機

要約:NASを再起動したらスカパーが見えなくなった

■発端■

バッファローのLX-WV4.0TL/R1というNASにスカパー!の放送を録画してます。2-3年、何の文句もなく動いていたのですが、久しぶりにファイルサーバとして使っているパーティションがアクセスできません。

ホコリも溜まっているので、一度電源を落として清掃しました。で、再起動したら無事ファイルは見えるようになったものの…スカパー!チューナーから、NASが見えなくなってしまいました。ホームサーバ一覧画面には虚しく「オフライン」と表示されるだけ。

■原因■

いくらなんでも再起動が原因ではないと思いますが、スカパー!のサーバとしての認証が消えてしまったようです。

スカパーチューナー側でサーバリストを表示すると、同じ名前のNASが2台並んでいて、1台は接続済、もう一台は未接続。接続済サーバを削除して未接続を再登録すれば解決します。とても簡単な話なのですが、一つ問題があります。

スカパーチューナーは、録画先サーバを変更すると録画が全消去されるという面白い仕様になっています。こればっかりはどうしようもないので…予約リスト画面をiPhoneで撮影してから接続(および予約リスト)を全消去し、改めて予約しなおしました。

いやはや…。

■試行錯誤したリスト■

  • NASをWebコントロール画面から再起動
  • NASのDTCP/IPサービスを再起動
  • NASの電源を落として、数分後再起動
  • NASのアップデータを確認(最新版だった)
  • NASのマニュアルを確認(まったく参考にならん)
  • 「スカパー HDD オフライン」でググった→同様の症状がヒット

2013年7月15日月曜日

あまりにも暑いので、やってみた。




なお、QRコードはcmanで生成しました。文字列はwikipediaから。

QRコード落語、とか思いついたけど、「子別れ」ってタイトルの後に何百個並べればいいのかわからないのでやめた。

2013年7月10日水曜日

サンダーバードの未来との差分

香港にて。

朝、サンダーバードの展示会についてのニュースをやっていた。

その中で、あれもこれも実用化されたけど、当時は携帯電話もインターネットも想定外だったねぇ、みたいな話が出ていた。

確かに、電子機器の発達は異常なほどだけど、交通機関は意外と発展してない気がする。チューブ式の高速鉄道や、車輪のない空飛ぶ自動車はどうなったんだw もちろん、サンダーバードの頃に比べれば、空の旅は特別なものではなくなっているし発展途上国でも自動車が多すぎて公害問題を引き起こしてたりと、量的な問題は大きく変わっているんだけども。

でも、ニュースを見ながら思った。電話など通信技術の発達が移動手段の進歩を止めちゃったんじゃないかなー。話をするなら顔を合わせなくちゃいけないし、必死こいて高速移動な未来を目指していたんだけど…どこにいても海外とも無料で顔を見ながら話ができる世の中になっちゃったら、余計な放射線浴びながら高々度超高速ジェット機乗ろうって気分も無くなっちゃう…ような気がする。

ついでにいえば、公共交通機関がきちんと定時運行されることは高速化と同じぐらいの意味があるよね。時間の読めない乗り物だとそれなりにマージンを見ないといけないけど、マージンの30分も電車に乗ってる30分も同じだから、みんながそのマージンを織り込まなくて済むということは、電車が30分速くなったのと同じこと。

なのでJRさん、はやくホームドアを全駅に設置してくださいね。

iPhoneのキーボードが出た時にUITextFieldの高さを変える方法(iOS 6)

よく、ブログなどに書かれているのは、「出てきたキーボードの高さ分をUITextFieldのheightから引いてやる」って感じだけど…それだと英語キーボードから日本語キーボードに切り替え、さらに予測変換窓が出た時に過剰に小さくなってしまったりします。

ということで、それを回避できるコードを張っておきます。UITextFieldが画面一杯に貼ってあるのが前提です。

■準備:Notificationの設定■

UIKeyboardWillShowNotificationでkeyboardWillShowを呼び出すよう設定します。


- (void)viewDidLoad
{
    [super viewDidLoad];

    NSNotificationCenter *center;
    center = [NSNotificationCenter defaultCenter];
    [center addObserver:self
               selector:@selector(keyboardWillShow:)
                   name:UIKeyboardWillShowNotification
                 object:nil];
}


■本体■

UIKeyboardWillChangeFrameっていうnotificationが別にあるんですが、willShowだけでキーボードが現れる時、英語と日本語切り替えた時、日本語キーボードで予測変換窓が現れた時に呼び出されてしまいます。良いのかそれで?

ミソは、convertRectです。keyboardFrameEndから返ってくるのはwindowの座標系で、ツールバーの高さやOrientationなどが配慮されていません。ので、現在のviewの座標系に変換します。これで「キーボードのorigin.y座標=使える画面の下限座標」となりますから、これでtext fieldの高さを設定し直します。

同じViewの上でキーボードを出したり消したりする必要のある時にはUIKeyboardWillHideNotificationを使います。ノリは同じで、viewのframeを取得してその下限を元にtext fieldなどの高さを調整するだけです。



- (void)keyboardWillShow:(NSNotification*)notification
{
    CGRect keyboardFrameEnd = [[notification.userInfo 
           objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    keyboardFrameEnd = [self.view convertRect:keyboardFrameEnd
                                     fromView:self.view.window];
    
    originFrame = self.textInput.frame;    
    float newHeight = keyboardFrameEnd.origin.y - originFrame.origin.y;

    [self.textInput setFrame:CGRectMake(originFrame.origin.x, 
                                        originFrame.origin.y, 
                                        originFrame.size.width, 
                                        newHeight)];
}


■後始末■

最後にnotificationを消し忘れないように。私はよく忘れます。ではでは。


- (void)dealloc {
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center removeObserver:self 
                      name:UIKeyboardWillShowNotification 
                    object:nil];

    [textInput release];
    [super dealloc];
}

2013年7月9日火曜日

古いアプリをiOS6対応にしたらupside downにならない件を解決

■症状■

古いプロジェクトをiOS 6対応にしたら、portrait upside downにならない。NotificationでOrientationが変わったことは検出できるけど、Viewが回転しないので横向きになったまま。

iOS6のデフォルトではiPhoneではupside down以外が許可、iPadでは全方向が許可されていますので、それがそのまま効いていて変更できていない、ということになります。


■一般的な対策■

iOS 6ではshouldAutorotateToInterfaceOrientationが廃止になったので、対象ViewControllerでsupportedInterfaceOrientationsとshouldAutorotateを使う。


- (BOOL)shouldAutorotate {
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskAll;
}

iOS 6対応として最初から作ったプロジェクトはこれで動きます。しかし、viewやらcontrollerをいろいろいじっている古くからのプロジェクトはこれではダメでした。

個人的困ったのはSalesforce対応アプリです。Salesforce mobile SDK for iOSの最新版ver 1.5でも未だにStoryboardやARCに対応していないので、中身は結構古いまま。テンプレートからiOS 6 targetにしても、upside downは働いてくれません。

その一方で…iOS 5をターゲットにすると、Web ViewのログインでID入力欄をタップしただけでSIGABRTするのは私だけでしょうか?


■原因■

root view controllerが別にあるためview controller上で上記shouldAutorotate / suportedInterfaceOrientationsをいじったとしても、標準のUINavigationController等で上書きされてしまう。


■解決策■

私のプロジェクトでは、Storyboard上のUINavigationControllerからメインviewを呼び出していましたので、UINavigationControllerのサブクラスNavigationControllerを作り、上記shouldAutorotate / supportedInterfaceOrientationsを貼ります。その上で、Storyboard上のnavigation controllerのcustom classをNavigationControllerに変更します。これでうまく行きました。いやはや。



■Salesforce mobile SDK for iOSの場合■

上記Salesforce mobile SDKの場合、テンプレートから作成されるプロジェクトはAppDelegate.hのnewRootViewControllerでViewとUINavigationControllerを生成しています。

上記と同じ手順でUINavigationControllerのサブクラスNavigationControllerを作り、AppDelegate.mにインクルードしてから、newRootViewControllerを書き換えます(書き換え箇所は赤字)。


- (UIViewController*)newRootViewController {
    RootViewController *rootVC = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    NavigationController *navVC = [[NavigationController alloc] initWithRootViewController:rootVC];
    [rootVC release];
    
    return navVC;
}



2013年7月8日月曜日

Salesforce mobile SDK for iOS 1.5

五十肩とか自転車レースとか転倒等によりすっかりご無沙汰してしまいました。今日はSalesforce mobile SDK for iOS 1.5のお話。

■感想:速い…?■

1.3当時は更新がうまいこと反映されないなどの問題があったので切っていたのですが、今回試してみたら起動がヤケに速い。記事によるとデフォルトでonになったとのこと。せっかくなので試してみたら、以前の問題は解消していて、これならキャッシュとして十分機能していると判断し、今回からONにしました。

Authentificateも早くなったような気がします。私のアホなアプリ「FourChatter」はあまり処理らしい処理をしていないのに(いないからこそ?)、2回目以降の起動時間が1/4ぐらいになりました。

■問題点■

ご存知の通り、iOS 6でOrientationの仕様が大きく変わっています。そのせいかどうか、SDKから作ったテンプレートアプリのinfo.plist上でPortrait Upside Downに設定しても、upside downになってくれません。他の方向へは問題なくrotateしますし、UIDeviceOrientationDidChangeNotificationでnotificationを受けるとちゃんと「upside downになるで」と通知が来ますが、表示は横を向いたままです。

追記:解決しました→古いアプリをiOS6対応にしたらupside downにならない件を解決

SFNativeRestAppDelegate.mを見ると「iOS 6になったらこの書き方はダメ」って書いてある書き方が多々あるけど、うーむ…。

かといってiOS 5でビルドするとSalesforceへのログイン画面に触っただけで落ちるし…困ったもんだ。

■そこに別の問題が■

アップデートしたアプリをAppleへ送付しようとしたのですが、失敗しました。Validate...は成功しますが、Distributeでエラーが…。


ググるとJVM関連のトラブルのようで、JDK 6が立ち上がるようにすれば良いという解決策などが出ているのですが、ダメでした…。この件、アップルに問い合わせメールを送って対応待ちです。いやはや。

2013年6月1日土曜日

Fitbit oneのリストバンドが朝になると外れている件、を解決

NHK技術研究所公開中ですね。玄関脇のIEEE記念看板
睡眠を記録するためにFitbit oneを入れて手首に装着するリストバンド、ふと夜中に目を覚ますと必ず外れている。

ベルクロがちょっとはみ出した部分が服や布団に張り付いて、バリバリ→やめてー、になっている模様。

はみ出ないようにきちっと巻いたり、ベルクロの位置を調整したり工夫してみたけど、ダメ。そのうち、めんどくさくなってしなくなっていまして。

が、昨夜久しぶりに装着してみたのですが、ふと思いついて自由に回転するようにユルユルに巻いてみた。

解決しました。
実際は2:30起床で止め忘れた。それ以前に睡眠の質が悪すぎるorz

結論:Fitbit oneのリストバンドはゆるく装着しましょう。