2015年2月19日木曜日

はじめてのスマートウォッチ Pebble

このたび、人生初となるスマートウォッチを入手しました。
名前は、Pebble。

文字盤は好みのものをインストールすることができる。 裏面も割りとおしゃれ。
GENUNE LEATHER(本革)と書いてある。
最初なんて書いているのか分からなかった。。。

スマートウォッチの中では、そこそこの売上がある商品だそうです。
AppleWatch も気になったけど、日本で見れるのはもう少し先ということと、値段の面で Pebble にしました。

特徴としては、バッテリーの持ちがいいと言うことと、iPhone/Android 両方に対応ができているという点。

バッテリーは、液晶が低電力な物を使用していると言うことと、周りのスマートウォッチに比べると必要なものだけを載せているという点でしょうか。
液晶は、e-ink かと思っていたけど、どうやら Au の IS03 で使っていたサブディスプレイの液晶を使っているっぽいです。
フル充電で、だいたい 5 日は充電なしで行けるということで、他の商品が 1 日から 2日で、充電が切れる事を考えると、ずいぶん楽に使うことができるかと思います。

あと、iPhone/Android 両対応については、Android に対応するスマートウォッチは多いのですが、iPhone はまだ対応する物が少ないので、必然的に Pebble を選ぶようになるでしょう。

注意点としては、スマートフォンが無いとこの時計全く意味がないということ。
スマートウォッチなので、当然じゃないかと思いますが、ひょっとしてスマホなしでも使えるんじゃない?と思ったらいけないので一応書いておきます。

理由としては、まず開封後に、ファームウェアを流し込む動作からスタートするため。
蓋を開けて、USB で充電しても画面には時計は表示されません。
スマホに Pebble 用のアプリをインストールして、まずは Pebble とのペアリングを行い、その後ファームウェアを送り込む処理を走らせたら、初めて画面に時計が出てくる様になります。

その後は、これまたスマホにインストールしたアプリをつかって(これが、Pebble 用の AppStore)、Pebble で使用するアプリや Watchface と呼ばれる時計盤のインストール/アンインストールを行います。

素の状態からファームウェアを入れた状態では、日本語の表示が行えません。
常に英語圏での使用であれば問題なのですが、ここは日本。
スマートウォッチの醍醐味のスマホとの通知連携では、日本語が必須となります。
この点については、有志の方々により日本語対応をしたカスタムファームを提供して頂いているので、そちらを利用させてもらうことにより、対応ができます。

インストールの方法は、以下のページに書かれています。

Pebble 日本語 (ひらがな, カタカナ) カスタムファームウェアを公開しました
(株式会社テクスプレスさんのページより)
http://www.texpress.co.jp/pebble_hiragana

ざっと書くと、Pebble のバージョンを確認し、スマホのブラウザで上記のページヘ移動し、バージョンにあったファイルをダウンロードすることにより、ファームが導入されます。
あとは、通知で文字サイズを small にセットすることで、日本語が表示できるようになります。

ここまで、できたらあとは自分好みのアプリ等を入れるだけ。
また、独自でアプリの開発もできるようなので、色々と楽しめそうです。

到着したばっかりなので、なんとも言えないのでまた追って記事を書こうと思います。

Written with StackEdit.

2015年2月15日日曜日

iPhone を Mac につないだ時に iPhoto を起動させない方法

MacBook Pro(Yosemite) にiPhone を繋ぐと、iPhoto が自動で起動します。
写真目的でつないだ場合は良いのですが、充電等の目的の場合は、この動作がありがた迷惑となります。

そこで、自動起動しない方法を探した所、iPhoto の環境設定で、「カメラ接続時に開くアプリケーション」の項目を「割り当てアプリケーションなし」にすれば良いとあったので、確認をすると、、、

すでに設定されている。。。

また、他のページを見てみると、iTunes の環境設定で、デバイスのタブから、「iPod、iPhone、および iPad を自動的に同期しない。」にチェックを付ければ良いとあったので、早速チェックを入れて、再度接続した所。。。

iPhoto 起動

これ、一体どうなってるんですか?

更に、再度方法を調べてみると、イメージキャプチャのアプリで「この iPhone を接続時に開くアプリケーション」を「割り当てなし」に設定すれば良いとの情報を見つけ、イメージキャプチャのアプリを見ると、なんと・・・

iPhoto

ということで、ここを「割り当てなし」にして、再々度の接続をすると、、、

iPhoto 起動せず

ついに実現することが出来ました。
なんだか設定するところが多い気がするけど、大きいのはイメージキャプチャのアプリの設定だったりするので、この動きが気になっている人は、

イメージキャプチャアプリの iPhone 接続時に開くアプリ設定を「割り当てなし」にしてください。

Written with StackEdit.

2015年2月14日土曜日

フェードアウトした(している)ボタンがクリック出来ない

iPhone アプリで、ボタンに画像を指定した物を配置し、フェードイン・フェードアウトのアニメーションをするものを作成してみた。

実装をして、確認を取るが、自分の悪い癖で、表示の確認をした時点で満足し出来たものとしていた。
が、しかし、あることを思いつく。

「これ、消えた時にクリックできるのかしら?」

こんな疑問点が出てきたが、なんとなく予想が付いたので、腫れ物を触るかの気持ちでタップした所、案の定タップイベントが動かない。。。

どうやら、hidden プロパティを YES、または、alpha を 0 にすると、タップは無効になるようだ。
また、フェードアウトの時は、消えかかっている状態でもタップは無効となる。

地味に、alpha を 0.05 にすると、タップは出来るが、正に亡霊の如く消えずに残っているので見た目が悪い。

ボタンのラベル文字をアニメーションさせるのであれば、最悪ボタン自体ではなく、中のラベルの部分をフェードイン・アウトさせてやれば、ラベルが消えてもタップは可能となる。
しかし、今回は画像で、ボタンの位置をコードで変更している様にしていたのだが、画像をフェードイン・アウトさせると何故かボタン位置が変更前に戻るアニメ付きでフェードイン・アウトするという動きとなった。

数パターンあたってみたが、ボタン単発で表示が消えた時にタップの動作を取得する事は出来なかった。

結論から言うと、今回取った手段としては、フェードイン・アウトさせるオブジェクトの上に透明のボタンを配置して、処理を分離させる様にし実現を行った。

コードは以下のとおり

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self fadeOut];
}


- (IBAction)buttonPush:(id)sender
{
    NSLog(@"Push The Button");
}

- (void)fadeOut
{
    [UIView beginAnimations:@"hideOverlayButtonFadeOut" context:nil];
    [UIView setAnimationDuration:1.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(fadeIn)];
    [self._button setAlpha:0.0];
    [UIView commitAnimations];
}

- (void)fadeIn
{
    [UIView beginAnimations:@"hideOverlayButtonFadeIn" context:nil];
    [UIView setAnimationDuration:1.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(fadeOut)];
    [self._button setAlpha:1.0];
    [UIView commitAnimations];
} 

ボタンを2つ用意して、ひとつはフェードイン・アウトを行うためのボタン(別段ボタンでなくても良い)を用意して、その上に実際にイベントを取る透明のボタンを配置する。
一応出来たが、一つのボタンの為にもう一つボタンを使用するのが、なんだか面倒。

何かいい方法あるんじゃないだろうか。。。

Written with StackEdit.

2015年2月12日木曜日

お前のコードは余裕が無い

数日前に、上司に言われた一言

「お前のコードは余裕が無い」

今更ながらの、この言葉。
内容としては、ロジック云々ではなく、コーディングの書式の問題とのこと。

小さい会社ということもあり、また、別会社との協力なども無いため、この点は個人の裁量に任されているわけですが、レビューの際に混みいったロジックがあるときに、言われたわけです。

難しいことでななく、例えば

...
- (void)hogehoge {
    ....
    if (a != nil) {
       ...
    }
}
...

と、なっているが詰まっていると。
よって、

...
- (void)hogehoge
{

    ....
    if (a != nil)
    {

       ...

    }
    ...
}
...

こうした方が処理が、見た目にハッキリするだろう。
ってことでした。

確かに、、、
この際なので、Objective-C のコーディング規約を見ると、、、

Cocoa向け コーディングガイドライン - Apple Developer
https://developer.apple.com/jp/documentation/CodingGuidelines.pdf

メソッド名や、制御構文の横に「{」が。。。
そういえば、storyboard からの Action 貼り付けでは、この形だなと。

結局、いままで通りで行こうかと思ったけど、空白を使ってブロックを明確にする点と、メソッドのブロックは、改行することにしました。

些細な事ですが、開発が一段落ついたあとに、修正などがあった場合の可読性に関わってくるので結構重要ですね。

あと、コメントも同様。
わかりやすいメソッド名をつけていても、やはりパッと見での判断に差がでてくるので(適当な英語力で作ったメソッド名っていうこともある)、適切なコメントをつけることを心がけるようにしたいかと思います(言い訳がましいコメントをつけるのは論外ですが)。

新人の頃の内容なのに、おっさんになっても言われたので、戒めのために。。。

Written with StackEdit.

2015年2月2日月曜日

Form Submit 後に画面遷移をさせない方法

プログラムも畑が違えば、新鮮なものです。
普段お世話になっている Web 系の技術も、Windows のアプリや、iPhone アプリなど Web に関係するけど、直接は触らない様にしていると、いざっ!って時に動きはわかるけど、実現方法がわからなかったりと苦労します。

今回も、そのノリです。

会社で簡単なページを作成したけど、未完だから仕上げてくれと言われました。
内容は、タイトル通り、Form の Submit をしたら、処理はするけどページの遷移が行われるのを抑制してくれといった内容。

まあ、単純に Submit 後に画面遷移させなきゃ良いだろうと、そのままの考えで居たけれど、はて?どうやってやるの?っと。。。

流石に、この手の業界にいるので、簡単にわかりませんとも言えないし、うかつにも言ってしまうと、冷たい目線で見られるのがわかっているので、調べてみました。

ここまで、長かったので結論から言うと、iframe を使えば良いということでした。
こんな感じ
    <form action="/postMessage" method="post" enctype="plain" id="sendMessageForm" target="sendMessage">
      <div class="form-group">
        <label for="name1">お名前</label>
        <input type="name" name="name" class="form-control" id="name1" placeholder="Your Name">
      </div>
      <div class="form-group">
        <label for="email1">Emailアドレス</label>
        <input type="email" name="email" class="form-control" id="email1" placeholder="Enter email">
      </div>
      <div class="form-group">
        <label>内容</label>
        <textarea class="form-control" name="question" rows="3"></textarea>
      </div>
      <br>
      <button type="button" id="sendMessageTrigger" class="btn btn-large btn-success">送信</button>
    </form>
    <iframe name="sendMessage" style="width:0px;height:0px;border:0px;"></iframe> ← ここが重要
    ...
    <script>
    ...
        var $form = $('#sendMessageForm'),
            $trigger = $('#sendMessageTrigger'),
            $iframe = $('iframe[name="sendMessage"]');

        $trigger.click(function() {
            $form.submit();

            $form[0].reset();   // フォームをリセット

            return false;
        });

        $form.submit(function() {
            $iframe.unbind().bind('load', function() {
                // 結果が見たい場合はココで処理
            });
        });
    ...
    </script>

これで、「Form 送信してかつ画面遷移なし」が実現できました。
ただ、送信後に何もメッセージを出すようにしていないので、とてもそっけない。
本当なら処理結果をもらって判定して、それなりのダイアログを出す様にした方が良いですね。

ここに行き着く前には、subtmit ボタンの onclick に return false を入れたり、form タグの onsubmit に return false を入れたりして、一向に動かないと悩んでいました。
それは当然、これらは submit 自体を取りやめると言う内容でしたから。。。

分かれば、楽なんですけどね。
ちらっと見ての判断ではなかなか思っている内容なのかわかりませんでした。

あと、普段 jQuery に触れていないので、この書き方で良いものか?気になってしょうがない。
Web の畑の耕し方を勉強する必要がありそうです。