2013年6月22日

初めてiPhone/iPadアプリを作った時に役に立ったリンクまとめ

Xcodeのキーボードショートカット


キーボードで完結!ハイスピード Xcodeコーディング
http://www.slideshare.net/cocopon/xcode-12535772

開発レシピ:Xcodeの常用ショートカットキー | iOS開発者@日本
http://www.iosjp.com/dev/archives/92



UIViewに角丸の枠と影を付ける


UIImageに影をつけて角も丸くする | ニョホホホhoooo!の2011年08月27日の2番目の記事
http://plaza.rakuten.co.jp/tech1985/diary/201108270001/

頭と尻尾はくれてやる! 画像に影を付けたいのでいろいろプロパティをいじってみた
http://ringsbell.blog117.fc2.com/blog-entry-494.html

【iPhoneアプリ開発】UIImageViewに枠とドロップシャドウを設定する方法 | WEB開発お役立ちブログ
http://websystem.biz/?p=34



UIViewのタップイベントを取得する


UIViewのタップを検知|Penta creation
http://pentacreation.com/blog/2012/12/121218.html



Objective-Cの基礎


逆引きObjective-C for iPhoneアプリ - 定数(#define,const)
http://www.objectivec-iphone.com/introduction/const/define-const.html

Objective-Cのアクセサの話 - As Sloth As Possible http://blog.livedoor.jp/faulist/archives/1480850.html

【Objective-C】配列(NSArray、NSMutableArray)の要素(値)をランダムに並べ替える方法 - creativi.tea
http://teapipin.blog10.fc2.com/blog-entry-221.html

Objective-Cでの配列シャッフル - Dolice Lab
http://lab.dolice.net/blog/2013/03/14/shuffle-the-array-in-objective-c/



StoryboardのAuto Layoutを理解する


ios - Xcode 4 and Interface Builder: Editing Vertical Spacing Constraint (Anchor Top, not Bottom) - Stack Overflow
http://stackoverflow.com/questions/14107799/xcode-4-and-interface-builder-editing-vertical-spacing-constraint-anchor-top

Using Auto Layout | Building Responsive User Interfaces in iOS6 | InformIT
http://www.informit.com/articles/article.aspx?p=2015112&seqNum=2

Beginning Auto Layout in iOS 6: Part 1/2 | Ray Wenderlich
http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2



Storyboardを使った画面遷移


StoryboardとSegueの基本 - Kesin's diary
http://kesin.hatenablog.com/entry/20120908/1347079921

iOSゆとりプログラミングのススメ - 仕事人の開発日誌
http://d.hatena.ne.jp/omaemona01/20111204/1322961924

Storyboardを使った画面遷移と値の受け渡し 其の二 : てるてる坊主
http://teru2-bo2.blogspot.com/2012/03/storyboard_28.html

複数のStoryboard間を遷移するチュートリアル | XCode始めました。
http://xcode-beginner.blogspot.com/2012/04/storyboard_29.html




意味不明のクラッシュを回避する


OS X 10.8.4でXcodeでiOS Simulatorを実行したときにSIGABRTでアプリがクラッシュすることがある問題の暫定的な対処(修正済み) - 24/7 twenty-four seven
http://d.hatena.ne.jp/KishikawaKatsumi/20130606/1370509631



途中でプロジェクト名を変える


Xcodeのプロジェクト名、Bundle Identifier、アプリ名の関係 - Debian GNU/Linux 3.1 on PowerMac G4
http://d.hatena.ne.jp/paraches/20130211

Xcodeのプロジェクト名を変える | Morizotter Blog
http://blog.morizotter.com/2013/03/03/change-xcode-project-name/



Homeボタンでアプリを一時停止せず終了させる


Cocoaの日々: iOS 4.0 でアプリを一時停止しない設定 - UIApplicationExitsOnSuspend
http://cocoadays.blogspot.com/2010/06/ios-40-uiapplicationexitsonsuspend.html



ユーザーデータを永続化する


iOS - NSUserDefaultsを使うときはWrapして使うと便利 - Qiita [キータ] http://qiita.com/aguuu/items/2af840ded249b3e4e9bb



UIをアニメーションする


UIViewで手軽にアニメーションを実行する方法 - プログラミングノート
http://d.hatena.ne.jp/ntaku/20090226/1235659545

逆引きObjective-C for iPhoneアプリ - CABasicAnimationの基本的な使い方(移動・回転・拡大・縮小)
http://www.objectivec-iphone.com/animation/CoreAnimation/CABasicAnimation.html

Objective-Cと戦うブログ: Core Animationの基礎的なところ
http://obc-fight.blogspot.com/2012/10/Core-Animation-fundamental.html

iOS - Core Animation 中級編 - Qiita [キータ]
http://qiita.com/inamiy/items/bdc0eb403852178c4ea7

CABasicAnimationを試してみた | スマートフォンアプリ開発会社のエンジニアブログ
http://engineerblog.glpgs.com/index.php/archives/165

Core Animation で画像を回す (フェンリル | デベロッパーズブログ)
http://blog.fenrir-inc.com/jp/2010/09/transform_animation.html


パーティクルを表示する


テンポラリー無題 › 忙しい人のためのUIView(UIKit)でパーティクル。CAEmitterLayer & CAEmitterCell 。
http://www.tmpmudai.net/?p=448

CAEmitterLayer でクリスマスは爆発しろ - iOS Advent Calendar 2011
http://d.hatena.ne.jp/KishikawaKatsumi/20111202/1322835912

iOS 5 UIKit "パーティクル•システム"チュートリアル | Ray Wenderlich
http://www.raywenderlich.com/ja/26781/ios-5-uikit-%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%AF%E3%83%AB%E2%80%A2%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB

UIKit上でパーティクルエフェクトを表示する - Over&Out その後
http://d.hatena.ne.jp/shu223/20130315/1363298992


画面サイズの違いに対応する


iPhone, iPad, iPod touchの画面サイズまとめ | noriaki blog
http://blog.noriaki.me/2012-11-18-display-size-iphone-ipad-ipodtouch

【Objective-C】iPhone5(4インチ)のサイズ判別など、画面サイズの取得にはUIScreenが便利 - しすぜろ
http://syszr.com/s13.html

Objective-C - スクリーンのウィンドウサイズ(WindowSize)を取得する方法 - | Learn iPhone, iOS, Objective-c, cocos2d and ....?
http://programming-ios.com/objective_c-window-screen-size/

[xcode][objective-c][ios][cocoa]Storyboardの画面サイズの範囲外なので配置できない問題
http://pnome.blog88.fc2.com/blog-entry-111.html



UIViewの背景に画像をリピート表示する


[iOS] UIViewの背景画像を設定する | Hi-farm blog
http://blog.hi-farm.net/2010/11/21/ios-uiview%E3%81%AE%E8%83%8C%E6%99%AF%E7%94%BB%E5%83%8F%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/



BGMと効果音を鳴らす


第9回 ゲームの仕上げ | Think IT
http://thinkit.co.jp/story/2011/06/03/2145?page=0,1

[iPhone 開発メモ] AVAudioPlayer を使用して音楽を再生する | Sun Limited Mt.
http://blog.syuhari.jp/archives/1015

サウンドを再生する:iPhoneアプリ開発雑記帳
http://iphone.o-84.com/dev-tips/knowhow/play-sound/

イチから学ぶiPhone/iPadアプリ開発 第12回 「BGMや効果音を付けよう!」
http://www.bhnt.co.jp/blog/%E9%9B%91%E8%A8%98/%E7%A4%BE%E5%93%A1%EF%BC%9Acobra/%E3%82%A4%E3%83%81%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6iphoneipad%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-%E7%AC%AC12%E5%9B%9E-%E3%80%8Cbgm%E3%82%84%E5%8A%B9%E6%9E%9C%E9%9F%B3%E3%82%92%E4%BB%98/

音楽と、効果音の再生 (iPhoneアプリ開発記 [fou media lab.])
http://www.fou.ne.jp/iphone/2009/10/post_3.html




広告を表示する


新しいAdMob SDK(Google AdMob Ads SDK for iOS)での広告設置方法 - Over&Out その後
http://d.hatena.ne.jp/shu223/20110324/1300985815

AdMob Ads SDK を Xcode に追加してアプリ内に広告を表示する方法 | Maccle
http://maccle.com/develop-ios-app/how-to-add-google-admob-ads-sdk/


iPad対応(ユニバーサル化)


Xcode4.2におけるiPhone/iPadユニバーサルアプリ化: iPhoneアプリ開発備忘録
http://iphone-app-developer.seesaa.net/article/235646213.html

[Xcode 4.3] iPhone アプリを iPad 対応のユニバーサルアプリにする方法 | ラクイシロク
http://rakuishi.com/iossdk/3733/



タイマー処理の改善


NSObject Class Reference
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/performSelector:withObject:afterDelay:

xcode - Cancel [self performSelector:... withObject:nil afterDelay:20]; - Stack Overflow
http://stackoverflow.com/questions/5055869/cancel-self-performselector-withobjectnil-afterdelay20



アプリの紹介動画を作る


iPhoneの画面をキャプチャして動画撮影できる「Reflector」の使い方~PCツールを使って、非脱獄でも録画可能に!~
http://applian.jp/tweak/iphone_display_recorder/

iPhone・iPadの画面をまるごと動画でキャプチャーできるアプリ『Display Recorder』
http://www.excite.co.jp/News/apple_blog/20120619/TouchLab_2012_2_4184.html




アプリを宣伝する


こんなにあった! iPhone/Androidアプリを出す時にリリースを送りたい媒体53個総まとめ【全て無料】
http://plus.find-job.net/iphone-android-press-site







-----------------------
以上!

2013年6月21日

はじめてのiPhoneアプリ開発

iOSでアプリを作ってみた感想


今までアプリ開発はAndroidひとすじでやって来たけれど、せっかくMacBookAirもあることだしそろそろiOSアプリもやって見たくなった。

初めてXcodeを起動した時はEclipseとあまりにも違うので戸惑った。

昔はC言語で徹夜で仕事したりもしていたけれど、Objective-Cというのはまた独特の文法があってこれも最初はびっくりした。メソッドを呼ぶのにかぎカッコで囲むとは。

まあどれも最初の1週間でほぼ慣れた。

やってみるとiOSアプリの開発は結構面白い。正直言ってAndroidよりも面白いかも。

なぜそう感じるかというと、まずシミュレータの動作が軽いのが一因ではないかと思う。

それからGUIの設計ツール(ストーリーボード)がとても使いやすい。XMLをいじってはいちいち実機で確認しながら進めるAndroidとは効率がかなり違う。

あと、プログラムで画面の一部をアニメーションさせるときの書き方もiOSの方が書きやすい様に感じる。まあイディオムみたいなものなので一度覚えてしまえばそんなに違いはないけれど。

それから、パーティクルを実現するクラス(CAEmmiterLayerなど)が標準で含まれているのは素晴らしい。

全体的に見て、もし初心者にアプリ開発を教えるのであればAndroidよりはiOSの方が教えやすいように感じた。


お世話になっている本



まるごと学ぶiPhoneアプリ制作教室


はじめて開発するならこの本がかなりおすすめ。下の2冊の教科書的な構成と全く違って、本当に作者と一緒に開発しているような感じで、簡単な事から順を追ってアプリが出来て行く様になっている。断片的な知識は読めば分かるけど、僕のように最初のとっかかりの流れが分からないという人にはとても良いと思う。
サーバー側(GAE)のJavaアプリケーション開発のための解説まで入っているけれど、これはさすがに蛇足だったかなと思う。むしろその分のページ数でもっと別のiOSアプリ(特にiPad用)の制作例を載せて欲しかった。







よくわかるiPhoneアプリ開発の教科書【iOS 6&Xcode 4.6対応版】


プロの力を身につける iPhone/iPadアプリケーション開発の教科書











2013年4月25日

ロードバランサーを使って複数のWebサーバーでASP.NET MVCアプリケーションを動かした時のメモ

ハードウェアの構成


ロードバランサー1台
Webサーバー3台
DBサーバー1台


ソフトウェアの構成


Webサーバー
 Windows Server 2008 R2
 IIS7.5
 ASP.NET MVC 4

 IISではひとつのWebサイトの下に複数のASP.NET MVCアプリケーションを配置。

DBサーバー
 Windows Server 2008 R2
 Microsoft SQLServer 2008


パターン1 - それぞれのWebサーバー内でSessionを管理


ロードバランサーが「セッション維持機能」を持っている事が前提。

Session管理は State Service を使う。

State Service を使う為のweb.configの設定

<sessionstate mode="StateServer">      stateConnectionString="tcpip=127.0.0.1:42424"
      stateNetworkTimeout="10" />
各Webサーバーで「ASP.NET State Service」が自動起動する様に設定しておく事。




パターン1で発生した問題


ロードバランサーのセッション維持機能が上手く動いていない!
そのため時々Webサーバーが切り替わってログイン画面が表示されてしまう。

ロードバランサーのベンダーに調査してもらっても「設定に特に問題は見つかりません。アプリ側の問題では?」との事で、解決せず。

教訓:しょぼいロードバランサーは使わない!

今回のプロジェクトではロードバランサーは自分達の管理下にはないので、パターン1はあきらめる。



パターン2 - SQLServerでSessionを管理


ロードバランサーのセッション維持機能に頼らずにSession情報をDBに格納してWebサーバー間で共有する事にする。これならWebサーバーが任意のタイミングで切り替わっても大丈夫。

1. SQLサーバーにSession情報を保存するためのデータベースを作成する。

 aspnet_regsql.exe -S server -U username -P password -ssadd -sstype p

 ※tempdbに保存するのではなく永続化するために -sstype pオプションが必要。

このコマンド一発でデータベースの作成、テーブルの作成、期限切れのSession情報を削除するためのJobの登録まで行なってくれる。

 aspnet_regsql.exeのヘルプはこちら


2. MachineKeyの設定を共通化する。

全てのWebサーバーでMachineKeyを共通化しておかないと、認証クッキーやその他さまざまなデータの暗号化・復号化の処理がWebサーバーが切り替わった時に上手く行かなくなる。

IIS7.5の管理画面で該当のアプリケーションを選択すると、「MachineKey」という項目があるのでそれを開く。


画面右側の「Generate Keys」をクリックして「Apply」するとweb.configファイルのsystem.webセクションに下の様な設定が追加される。

<machineKey decryptionKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" validationKey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />
あとはこの部分をコピーして他の2台のWebサーバーのweb.configにペーストすればOK。

参考URL:How To: ASP.NET 2.0 で MachineKey を構成する方法




3. IIS Metabase上のSite IDを共通化する。

これをしておかないと、Webサーバーが切り替わった時にSQLServer側で別アプリケーションとして認識されてしまって、Session情報の共有が出来なくなってしまう。今回はこれでハマった。。。


対策としてはSQLServerのストアドプロシージャを修正するという方法もあるみたいだけど、IIS7.5以降なら下の方法で簡単にIDを共通化出来るみたい。

IIS上で何度かWebサイトを作成したり削除したりしているとIdの値が変わってしまうので、該当のWebサイトを選択した上で「Advanced Settings」を開いてIDの欄に他のサイトと重複しない値を入力する。


他の2台のWebサーバーでも該当のサイトが同じIDを持つ様に入力する。

この設定を行った後は、IISを再起動する必要があるので注意。




おまけ:Forms認証を使う場合の注意点



  • 一つのWebサイトの下に複数のアプリケーションを配置する場合は、アプリケーション毎に認証クッキーの名前を変える事。

  • 認証クッキーのパスは「/」から変更しない方が良い。
    (ブラウザはクッキーのパスについては大文字小文字を区別するが、サーバーはURLの大文字小文字を区別しない為。)










.

2013年3月16日

Google Readerの代わりはGASで作ろう

GAS(Google Apps Script)というものがあるのは知っていたけれど、今まで使う場面がなかったので勉強していなかった。


ざっとリファレンスに目を通して出来そうな事を見てみると、毎日重宝しているGoogle リーダーの代わりになりそうなものを作れそうな気がしてきた。



アイデアとしてはこんな感じ。



  • フィードURLとその最終取得日をスプレッドシートに保存。
  • 定期的に全フィードをチェック。
  • 最終取得日より新しい記事があればメールで送信。
  • 記事1本を1メールとして自分宛てに送信。
  • Gmailでメールを受けて自動でラベル付け。


この記事を見てEメール送信のスクリプトを試してみたら、定形メールの自動送信は本当に簡単に出来た。

【GAS】簡単!Google Apps Script とAPIを使った自動メール配信システム作成 | カグア!Googleアナリティクス解説Blog

これは使えそうだ。




RSSの管理をGmailで行なうというアイデアは最近どこかで読んだ様な気がするけれど、確かに1記事1メールとしてGmailに取り込んでしまえば、未読・既読の管理も簡単だしスターを付けるのも簡単に出来る。

しかもスマートフォンからもPCからもさっとアクセス可能。


新しいブログなどを見つけてRSSフィードを登録したい時も、Google Appsのフォーム機能を使えば登録画面は簡単に出来そうだ。

フォーム機能を使わなくてもそれこそScriptを使えば(ブックマークレットなども併用して)ブラウザからクリック一発でフィード登録、という事も可能かも知れない。


という事で今度時間がある時にぜひ作りたい。


ああ、また「やりたい事リスト」の項目が増えたなー。(笑)








2013年3月6日

Azure Mobile ServicesがAndroidに対応! Android2.2以降で実行可能


Windows Azure Mobile ServicesがAndroidに対応したそうだ。

Windows Azure Updates: Android Support, SQL Reporting Services, Active Directory, More… - ScottGu's Blog


これでバックエンドのサービスを簡単に作成する事が出来る。嬉しい!

ところが説明を読むと、「Android 4.2以降が必要」という注意書きが。。。

「え、うそでしょ~。4.2以降なんて現時点で使えるのはNexusシリーズぐらいじゃないの...」

と思ったけれども、サンプルコードをダウンロードしてマニフェストファイルを見ると、

android:minSdkVersion="8"
android:targetSdkVersion="17"

となっている。

なので、アプリの動作環境としてはAndroid 2.2以降なら問題ないみたいだ。


(「4.2以降が必要」というのは開発用のSDKのバージョンを指している様だ。)



試しに Android 2.3.5 が入ったHTC Evoでサンプルアプリケーションを動かしてみた所、Todoリストにデータを追加する部分については問題なく動作した。


Azure Mobile Servicesの管理画面からデータを確認したところ。



Todoリストのチュートリアルはこの後「ユーザー認証の追加」や「GCMを使ったプッシュ通知」の実装に続く。

まだそこまでは試していないけれど、多分Android2.2以降なら問題無さそうな気がするので、まずは一安心した。


これでさらにアプリ開発の可能性が広がりそうだ!



*追記:
ここにははっきり「2.2+」と書いてあるので、やっぱり大丈夫そうだ。

MS Open Tech develops the open source Android SDK for Windows Azure Mobile Services - Interoperability @ Microsoft - Site Home - MSDN Blogs







 

2013年2月19日

AndroidでAnimation終了後にViewを削除する

動的に追加したViewに対してアニメーションを実行して、アニメーションが終了したらそのViewを完全に削除してしまいたい、というケースがあってハマったのでメモ。


基本的にはアニメーションの終了後に何かをするには、前もってAnimationListenerをセットしておけば良いはず。

AnimationListener の onAnimationEnd というメソッドをオーバーライドして処理を書く事になる。 

この onAnimationEnd の中でアニメーション対象のViewを親のViewから削除しようとして、次の様に書いたら parentView.removeView の所で エラーで落ちた。




調べてみると、どうやら onAnimationEnd 内でUIの処理をするとまずいみたいだ。parentView.post() を呼んでUIスレッドに処理をRunnableの形で渡せば問題なく実行出来る様になった。






  

2013年2月15日

jQueryのイベントで return false はしない方が良い

前回の記事を書いている時に検索にヒットしたリンクでちょっと「へぇ~っ」となったものがあったのでメモ。

 javascript - event.preventDefault() vs. return false - Stack Overflow

イベントのハンドラを書く時に、jQueryのイベントと通常のDOMのイベントでは

return false;

の意味が違うらしい。まずい、今まで気にしていなかった。。。


jQueryのイベント:

  •   デフォルト動作を抑止。
  •   イベントバブリングを中止する


通常のDOMのイベント: 

  •   デフォルト動作を抑止。(但しブラウザのバージョンに依存)
  •   イベントバブリングの中止はしない


という事らしい。


jQueryのイベントハンドラで return false; をしてしまうと、イベントバブリングまで中止されてしまう。これはあまり好ましくない事だ。

なぜイベントバブリングを中止する事が好ましくない(or やってはいけない)のかは、下の記事を読めばよく分かる。


jQuery Events: Stop (Mis)Using Return False | Fuel Your Coding


jQueryのバブリングと、「return false;」「e.stopPropagation();」「e.preventDefault();」について | ふじこのプログラミング奮闘記


JavaScriptのイベント伝播について覚書 | Linuxで自宅サーバ構築




結論



jQueryのイベントハンドラでは、

1. デフォルト動作を抑止するには、event.preventDefault() を 使う。

2. バブリングを中止する必要がある場合は、event.stopPropagation() もしくは
event.stopImmediatePropagation() を場面に応じて使い分ける。

3. return false は親要素にもイベントハンドラがアタッチされている場合などにバグの原因になり得るので、使う場合は十分に注意する。(もしくは使わない。)

というのが良いみたいだ。







  

[jQuery] Enterキーでフォーカスを移動するには

Enterキーでフォームを送信したくない時は


あるWebアプリケーションのフォームで、Enterキーを押してもSubmitされない様にする必要があって、ちょっと調べた。

リターン(Enterキー)でフォームを送信しない方法: 小粋空間

とりあえずこの記事の「4.押されたキーを判定して抑止する」の所に書いてある方法で対応出来た。


Enterキーで次のフィールドにフォーカスを移動するには


次に、どうせならEnterキーで次のフィールドにフォーカスを自動で移動させたいな~、という事になった。やってみたら、jQueryのおかげでこんな感じで割りと簡単に出来た。

Enterキーが押された時にfalseを返すのではなくて e.preventDefault() を使う様に変えた。その理由はこちらを参照。


Shift+Enterキーにも対応するには


さらについでにShift+Enterキーでの逆順の移動にも対応させてみた。




もっとキーイベントを細かく制御するには


こんな感じで作りだすと、欲が出てきてさらにファンクションキーや矢印キーにも対応したくなってくる。でも、自分で作らなくても何かあるんじゃないかな~という気もする。

探してみたら次の様なjQueryプラグインが見つかった。
Enter/Tab項目移動とFunctionKey制御をplugin化 - せかにゃ~

これで機能的には申し分無さそうだ。ただソースコードを見ると対象のフォームがdocument.forms[0]に固定されていたりするので場合によっては少し変更する必要があるかも知れない。


キーイベントを拾って独自の関数を実行するだけならこういうのもあった。(フォーカス移動の処理は自分で書く必要があるみたいだ。)
jQuery.gpKeyでキー操作が楽々に。 | Ginpen.com



最近はWindowsアプリケーションをWebに置き換える案件も多いので、きっとこの様なプラグインは役に立つと思う。




 

2013年2月14日

Azure仮想マシン上でNode.jsアプリケーションをデーモン化してユーザー権限で運用する方法

作ったNode.jsアプリケーション


初めてのNode.jsアプリケーションを作ってみた。
作ったのは、ここに載っていたもの。
Androidアプリからnode.js+Socket.IOと双方向通信する

早速Windows Azure上で動かそうと思ったのだけれど、いくつか苦労したのでメモしておきたい

「Windows Azure Web Sites」は現状ではWebSocketは不可


まず、「Windows Azure Web Sites」は現時点では使えない。このサービスのベースとなっているIISのバージョンが7.5で、まだWebSocketプロトコルに対応していないからだ。

試しにやってみると、ブラウザ同士で試すと問題なく動くが、実際にはWebSocket以外のプロトコルにフォールバックして動作している。この状態だとAndroidのネイティブアプリケーションからsocket.ioライブラリを使用しての接続は上手く行かなかった。

近い将来これが IIS8.0 にアップデートされてWebSocketが使える様になったら、多分これから下に書く様な面倒な作業は不要になると思う。


「Windows Azure 仮想マシン」でUbuntuサーバーを立てる


仕方ないのでAzure上にUbuntu仮想マシンを立ち上げる事にした。

Ubuntu 12.04 Serverのインスタンスを起動して、Node.jsやその他のパッケージをインストールするのは、何の問題もなく完了。

 node folder/app.js

で起動して3000番ポートで接続を待ち受ける。と同時にAzure仮想マシンの設定でエンドポイントを追加して、外側の80番ポートを内側の3000番ポートにつなげる。これでブラウザからもAndroidアプリからも接続出来て問題無く動作させる事が出来た。

素晴らしい!

ただ、Android側のネットワークをWiFiから3G回線にすると動作しなくなるという現象に遭遇した。どうやらキャリア側で80番ポート上のWebSocketの通信を遮断しているみたいだ。(というよりおそらく、キャリアが使っているProxyサーバーがWebSocketに対応していないのだと思う。)

これに対する対策として、Azure側のエンドポイントのポート番号を443に変更したら問題なく動作する様になった。(特に443番でなくてもいいと思うけれど、ユーザー側にFirewallがある場合に、外向きのTCPパケットがブロックされている可能性が80番の次に低いポート番号という事で、443番にしておいた。)


Node.jsアプリケーションをデーモン化したい


Node.jsのアプリケーションをデーモン化して動かすには、forever を使うのが簡単らしい。

foreverコマンドを実行するスクリプトを rc.localに追加するなり、/etc/rc2.d フォルダにシンボリックリンクを張るなりすればサーバー起動時に自動で実行される様になる。


ユーザー権限でデーモンを実行したい


ただ、root権限ではなくユーザー権限で実行する方法がすぐには見当たらなかったので、調べるのにちょっと時間がかかった。結論としては次の2つのどちらかが良さそうだ。

方法1: suコマンドと forever を使う

 su - [user] -c"cd [/home/directory] && forever start [folder]/app.js"

というコマンドへのシンボリックリンクを /etc/rc2.d フォルダに作成する。(または/etc/rc.localの最後に追加する。)


方法2: Upstartを使う
 

 Upstart を使ってお手軽 daemon 化 - インフラエンジニアway

ここに書いてある方法で initctl コマンドでデーモンとしての実行を管理出来る様になる。
実行ユーザーを指定するには、

 setuid [user]

を設定ファイルに追加すればOK。


Ubuntuの標準的な方法としては Upstart を使う方が良さそうなので、とりあえず今はこれでいいかな、と思う。







 

2013年1月30日

初めてAndroidアプリを公開して1年経過した

作ったアプリ


1年半ぐらい前にこんな記事を書いて、オセロゲームを作ってみた。
http://blog.makotoishida.com/2011/06/android-1.html 

6月から作り始めて、9月に一応大体の機能が完成。その後アイコンを作ったり細かい改善をしたりして、2011年の12月にGoogle Playストアに公開した。

Google Play
https://play.google.com/store/apps/details?id=com.ishida_it.mireversifree



1年間の有効インストール数の推移


公開してから全く更新せずに1年を経過した頃からアクティブユーザー数に減少傾向が見られた。
ちなみに下段のグラフの水色の線はAndroid 2.3、緑の線はAndroid 4.0以降。
グラフの右端で少し右肩上がりになっているのは、Undo機能を追加する更新をした後。

現在の有効インストール・ユーザー数(インストール後、削除していないユーザーの数)は約7400。総ダウンロード数は2万1200となっている。

細々とした数字ではあるけれど、公開してからほぼ1年間放置状態だったのにしては結構インストールされているのではないかと思う。

やはり誰でも知っているオセロゲームだから、ダウンロードする前に「このゲームは面白そうかどうか」を考える必要が無いというのが大きいのだろうと思う。

とは言えさすがに1年も更新せずにいると、新たにインストールされる数よりもアンインストールされる数の方が上回ってアクティブユーザー数が徐々に減少し始める。Google Playの検索アルゴリズム上なんらかのマイナス評価が加えられるのかも知れない。


Undo機能追加でちょっと持ち直す



2012年の12月になってようやくUndo機能を追加する更新を行った。するとやはり新規インストール数がまた上昇しだした。更新によってユーザーの目に付く機会が多少増えたみたいだ。

この直後、ユーザーさんから「Undo機能を付けてくれてありがとう」というメールをもらったのには驚いた。と同時に単純に嬉しかった。アプリ開発者のモチベーションは案外こういう些細な事で保たれるのではないかとも思った。


せっかくなので大幅にリファクタリング


ただ、Google Playのレビュー欄に「コンピュータが弱い」という評価が多かったので、今年の1月に大幅にリファクタリングを行なって思考ルーチンの高速化と強化をしてみた。

思考ルーチンだけでなく盤面のデータ構造から書き直す様な大変更になったのでなかなか大変だったけれども、何とか先日新しいバージョンを公開する事が出来た。

これでまた新規インストール数が増えてくれればちょっと嬉しい。初めて公開したAndroidアプリという事もあってか、何となくよちよち歩きの我が子を見守る様な気分になってくる。



 
 

2013年1月23日

無料で外国語を学べるDuolingoに感動!

今週の中島聡さんのメルマガで紹介されていたこの動画を観た。
Luis von Ahn: Massive-scale online collaboration | Video on TED.com

Webで自動投稿を防ぐための認証に使われる「CAPTCHA」を発明したLuis von Ahnさんのスピーチだ。

CAPTCHAを改良したRECAPTCHAでは多数の人間の画像認識力を集めて古い書籍などのデジタル化に役立てているとの事。

このアイデアをさらに進めて言語教育に応用したのが、「Duolingo」という言語学習サービス。


早速登録して試してみた。今のところスペイン語、ドイツ語、フランス語、ポルトガル語、イタリア語の5ヶ国語のみの様だけれど、ぜひアジアの言語も増やして欲しいところだ。



個々の生徒が学習している間に行った翻訳作業が、実はDuolingoのサーバーで集約されて巨大な知識ベースに格納され、実際に翻訳が必要な所で活用される、というイメージだろうか。

つくづくすごい事を考える人が居るものだと感心させられてしまった。




2012年12月29日

来年こそはしっかりモノにしたい6つの技術スキル

1. Node.js


今注目のサーバーサイドJavaScript実行環境。

Windows Azure上でも簡単にホスティング出来るみたいなのでぜひ何か作りたい。

リアルタイムな何か。最初の題材としては対戦型のゲームとかが面白そう。


この本をちらちら見ながらワクワクしている。



2. クライアントサイド MVC



この本は一応読むことは読んだ。でもまだ実践ではクライアントサイドMVCを使う機会がない。

ASP.NET界隈では Knockout.js の人気が高まっているみたいだ。

個人的にはGoogle発の AngularJS に最も興味がある。DotInstallでのレッスンには興奮した。



3. CSS3/LESS/SCSSなど


CSS3はそろそろ機が熟して来たのかなと感じている。

CSSだけで時計やゲームの様な動きを見事に実現してしまう例を見せてくれた http://www.adventar.org/calendars/2 を眺めて、今さらながら驚かされた。

大規模なプロジェクトになると効率アップのために LESS か SCSS はやはり必要になるだろうなと思う。

LESSとSCSSのどちらを使った方が良いか、というのは迷う所だけれども、LESSの方が明らかに名前で得をしていると思う。子音だけのSCSSよりもLESSの方が発音しやすいし、語感が明るい気がする。名前付けは重要だなあ、と。


4. テスト駆動開発


最近は意識的に単体テストを書く頻度を上げて「テスト駆動」に近づく様にしている。そのおかげでリファクタリング/デバッグのスピードが着実に向上しつつあるのを実感している。

下の2冊はまだ読んでいる途中だけど、しっかりとモノにしたいスキルだ。





5. Titanium Mobileによるスマートフォンアプリ開発


Eclipse+Javaを使ってAndroidアプリを個人的に開発するという事は1年半以上前からやっている。JavaやAndroidの勉強をしながら、少しずつ自分で作ったものが形になって行くのはとても楽しい。

ただ、この方法だとXcode+Objective CでのiOSアプリの開発まではいつまで経ってもたどり着けそうにない。趣味的に続けて行くには、単純に時間が足りなすぎるのだ。

そこで何らかのクロスプラットフォームなツールを使う必要性を強く感じている。

ゲームなら多分 UnityCorona と言ったあたりが良さそうだけれども、ツール系のアプリだと Titanium Mobile が一番良さそうかなと思っている。


この本はかなり前に買ったのだけれど、忙しくてまだじっくり読めていない。

来年はAndroidだけでなくぜひiOSアプリの開発にもチャレンジしたい。


6. TypeScript


CoffeeScript ももちろんいいのだけれど、Windows 8アプリの開発などを視野に入れると TypeScript の方に注目したい。

JavaScriptを書くならTypeScriptを使え! - 部屋とボードゲームと私と酒と泪と男と女
Visual Studio 2012を使ってTypeScriptのサンプルを動かしてみたところ、確かにこれなら気軽に入っていけそうだ。もしかしたら来年の今頃は「TypeScript無しでの開発なんて考えられない」っていうぐらいになっているのかも知れない。



来年こそは!


以上、来年こそはしっかりとモノにしたい6つの技術スキルを挙げてみた。

ホントは今年中にやっておきたかったのだけれど、来年の自分に向けて書いておく。






 

2012年12月18日

Eclipseで急にAndroidアプリのエクスポートが出来なくなった時の対処法

あるAndroidアプリを更新した後、「さあGoogle Playにアップロードするぞ」とAPKのエクスポートをしたら、突然Eclipseがエラーで落ちてエクスポート出来なくなるという問題に遭遇した。

前のバージョンまでは全く問題無かったのに、更新後は何回トライしてもエクスポートしようとすると必ずEclipseが異常終了してしまう。

ActionBarSherlockを使う様に画面を変更したのだけれど、それが関係しているのかも知れない。

エラーログを見ると、何やらZipファイルの処理でエラーが発生している様な感じなのが何となく分かるが、対処法がさっぱり分からないので困った。

色々調べてようやくなんとかエクスポート出来たのでメモ。

Issue 28725 - android - Eclipse Crashes with EXC_BAD_ACCESS when exporting signed applications - Android - An Open Handset Alliance Project - Google Project Hosting


ここにある通り、「Build Automatically」のチェックをOFFにして試したら無事エクスポート出来た!

それにしてもよく分からないエラーだ。



 

2012年12月13日

Entity Framework 6では非同期DB処理がこんなに簡単に書ける!

MicrosoftのScott Guthrie氏のブログで Entity Framework 6 の Alpha 2 がダウンロード可能になったと報告されている。

Entity Framework 6: Alpha2 Now Available - ScottGu's Blog

改善点としてまっさきに挙げられているのは「非同期処理のサポート」。

.NET 4.5 introduced the Task-Based Asynchronous Pattern that uses the async and await keywords to help make writing asynchronous code easier. EF 6 now supports this pattern. This is great for ASP.NET applications as database calls made through EF can now be processed asynchronously – avoiding any blocking of worker threads. This can increase scalability on the server by allowing more requests to be processed while waiting for the database to respond.
The following code shows an MVC controller that is querying a database for a list of location entities:

(以下意訳)

.NET 4.5ではTaskベースの非同期実行のパターンが追加されました。このパターンでは async と await キーワードを使って非同期に実行されるコードを容易に記述する事が出来ます。EF6 も今回このパターンをサポートしました。
EF経由のデータベース呼び出しを非同期で実行する事が可能になるので、これはASP.NETアプリケーションにとっては非常に望ましい事です。 - つまりワーカスレッドをブロックせずともよくなるのです。これによってデータベースからの応答を待つ間に他のリクエストを処理出来るので、サーバー側でのスケーラビリティの向上に寄与します。
次のコードはLocationエンティティの一覧をデータベースから取得するMVCコントローラの例です。


    public class HomeController : Controller
    {
        LocationContext db = new LocationContext();

        public async Task<ActionResult> Index()
        {
            var locations = await db.Locations.ToListAsync();

            return View(locations);
        }
    }
上のコードを見ると、青字の部分が変わっただけで、他は今までと同じ。とても読みやすい。これだけでコントローラ側が非同期処理になるとは、素晴らしいの一言。

最近は Node.js がかなり注目されているけれども、その理由の一つが「非同期処理によるスケーラビリティの向上」にある。Entity Framework 6で非同期なDB処理がここまで簡潔に書ける様になると、ASP.NETもその方向にまた一歩近づいたという事になると思う。




 

2012年12月7日

Nexus7を買って4ヶ月後の感想 - じわじわと良くなって来た感じ


8月の初めにNexus7を購入してから4ヶ月が経った。

当初は期待半分、「本当に使えるのかなー」という疑い半分、という感じで、まあ少なくともアプリ開発のデバッグ用途には役に立つかなという程度に思っていた。

ところが、時間の経過とともに当初想定していなかった使い方もする様になって来て、だんだんと手放せなくなりつつある。

他の人の感想を読んだりして、「やっぱりNexus7いいね」と改めて見直したり。
Nexus7購入から1ヶ月後 — 乱れなよ、そして召されなよ

Nexus 7が、とりわけヒジョーにかなりイイ
なんと言っても7インチというサイズと軽さが素晴らしい。これはまあ当然として、その他に次のような点が大きいかなと思う。


Googleのサービスと親和性が高い


一番大きいと思うのはChromeの同期機能。これは使い出すと本当に欠かせない。
もちろんGmailも使いやすい。Google Mapの高機能さもやはりAndroidならでは。



Android OSのアップデートがすぐに反映される


購入してから4ヶ月で既に3回のアップデートが配信されている。アップデートのたびに細かい点が改善されているのが嬉しい。

特にAndroid 4.2で追加されたマルチユーザー機能はとても便利。子供に渡す時にさっとユーザーを切り替えて渡すだけで良くなったので本当に助かる。


あと、買った当初は想定していなかった使い方というのは、電子書籍を読む事と動画や音楽を楽しむ事の2つだった。



紙のメモを使わなくなった


Nexus7を買ってからミーティングのメモは全て「7notes with mazec」を使って取る様にしている。

最初の頃は「書き流し入力」をして後からきれいにテキストに変換していたけれども、この頃は手書き文字のままPDFで保存する様にしている。どうしてもテキストに変換する必要があるドキュメントでない限りはこれで十分だ。

最近スタイラスペンが少しヘタって来た様な気がするのでそろそろ買い換えたほうが良いかも知れない。

手書き入力をしない時は、Google日本語入力のGodanキーボードが便利。mazecと状況に応じて使い分けている。



電子書籍が読みやすい


Amazon.co.jpで日本語の電子書籍が買える様になった。Nexus7の話からは外れるけれど、僕にとってはこれは大きかった。

電子書籍が便利なのはわかっているけど「読む本が無いから結局読書には使わないだろうなあ」と思っていた。

でも、Amazonで簡単に日本語の本が探せて、しかも今まで払っていた高い海外向け送料無しで読めるとなると話は全く別だ。

試しに好きな作家の小説を買ってみたら、もちろんNexus7で全く問題なく読めた。7インチの画面はさすがに携帯の画面より読み易い。読んでいる位置やブックマークを携帯やPCのKindleアプリと同期する事も出来るし、やっぱり便利。

検索しても出てこない本がまだまだ多いけれど、早く紙の本と同じものが買えるようになって欲しい。そうしたらNexus7の出番がもっともっと増えると思う。



Youtube動画を連続再生


日常生活の中で、「Youtubeのあの動画を再生しながらこれをしたいな~」という場面が結構ある。

僕の場合は実は「食後の食器洗い」の時間がそれに当たる。手が濡れているので出来れば画面を触らずに自動でどんどん再生してくれると嬉しい。

それを実現してくれるのが「PVSTAR+」というアプリ。これで気に入った動画をずっと流しながら両手で作業が出来る。



音楽を聴きながら寝る


前からSky.FMは聴いていて、「Solo Piano」というチャンネルが僕のお気に入りになっている。

Sky.FM Radio

このアプリが便利なのはスリープタイマー機能が付いているので聴きながら寝入ってしまっても時間が来れば停止してくれる事。きれいなピアノの音を聴きながら眠ると本当に気持ちがいい。

ただ、無料で使っていると、たまに寝かかっている時にコマーシャルが始まって目が覚めてしまう事がある。なので有料アカウントにしようかと真剣に検討中。



結論


そんなこんなで4ヶ月後の感想としては、「Nexus7買って良かった。悔いはない!」と思っている。



 

2012年12月6日

ASP.NET MVCでDbContextのトランザクションと独自SQL 処理のトランザクションを同一のスコープにする

最近毎日 ASP.NET MVC4 でWebアプリケーションを作っている。

今まで独自のO/Rマッパを使っていたので Entity Framework を使い出したのは実はごく最近。

これでSQLを書かなくてもデータの取得や更新が簡単に出来る様になったのは嬉しいのだけれど、当然ストアドプロシージャを呼んだり自分で書いたSQL文を実行したりしたいという場面も結構ある。

そこでいくつかのDBアクセスのパターンを試していて、独自SQLの実行とDbContext経由でのデータ更新を同一のトランザクション内で行いたい、という場合にちょっと困ったので対処方法をメモしておきたい。



とりあえず問題ない例

上の例では別のContextを使っているのでこれはエラーにはならない。 ただしこれだと1つめの更新処理と2つめの更新処理を同一のトランザクション内で実行出来ない。



問題になる例

上の例の様にDbContextからの更新処理をADO.NETのTransaction内に入れた場合は次のようなエラーが起きる。





対処の方法


1. 生成済みのDbConnectionを渡してDbContextを生成する。

DbContextのインスタンスを生成する時に、コンストラクタに既存のDbConnectionを渡すとDbContextで勝手にCloseされる事が無くなる。

これをするためには、DbContextのクラスにDbConnectionパラメータを受け取るコンストラクタを追加する必要がある。



    public class MyEntities : DbContext {

        public MyEntities()
            : base("DefaultConnection") {
        }

        public MyEntities(DbConnection existingConnection)  
            : base (existingConnection, false){ 
        }

        public DbSet<Product> Products { get; set; }
    }


2. EntityConnectionを使ってコネクションをOpenする。

DbContextのDatabase.Connectionは素のSqlConnectionを返す。ただしこれを自分で直接OpenしてしまうとEFの管理情報と一致しなくなる。

DbContextをIObjectContextAdapter型にキャストしてそこからObjectContextを取得し、そのConnectionプロパティ(実態はEntityConnection)に対してOpenを実行すればEFの管理内で処理される。


3. EntityConnectionに対してBeginTransationする。

1、2の後、EntityConnectionに対してBeginTransationしてトランザクションを開始すれば、独自のSQL処理とDbContextのSaveChangesメソッドによる内部的なトランザクションとが同一のスコープで実行可能になる。


対処後の例



動作確認可能な全ソースを含んだサンプルプロジェクトはこちら


参考にしたURL

This SqlTransaction has completed; it is no longer usable. Entity Framework Code First - Stack Overflow

task parallel library - Entity Framework, SqlCommand and TransactionScope - Stack Overflow

Exception from DbContext API: EntityConnection can only be constructed with a closed DbConnection - Diego Vega - Site Home - MSDN Blogs

EntityConnection can only be constructed with a closed DbConnection

2011 7月 « Do Design Space

.net - Frequent saves with entity framework - Stack Overflow

entity framework - EF Code First DBContext and Transactions - Stack Overflow






 

2012年12月4日

ASP.NETのWCFサービスでDbContextから取得したオブジェクトを返そうとするとエラーになる場合の対策

先日、ASP.NETのWCFサービスでEntityFrameworkのDbContext経由で取得したモデルクラスのオブジェクトを返そうとして、壁にぶつかった。

発生したエラーの内容はこんな感じ。
Test method ServiceTest.CustLoadData threw exception:
System.ServiceModel.CommunicationException:
An error occurred while receiving the HTTP response to http://localhost:60741/MyService.svc.
This could be due to the service endpoint binding not using the HTTP protocol.
This could also be due to an HTTP request context being aborted
by the server (possibly due to the service shutting down).
See server logs for more details.
---> System.Net.WebException: The underlying connection was closed:
An unexpected error occurred on a receive.
---> System.IO.IOException:
Unable to read data from the transport connection:
An existing connection was forcibly closed by the remote host.
上記のエラーはWCFサービスの呼び出し側で表示されるエラーなので実際に起こっているエラーの原因はちょっと違う部分にある。


いろいろデバッグに苦労したけれど、とりあえずどうやらWCFサービス内でオブジェクトを返すためにシリアライズしようとしている所でエラーが起きているらしい、という事が分かった。

原因は、DbContextの動作原理としてPOCOに対する変更追跡と遅延ローディングを実現するために内部的に「動的プロキシクラス」というものを生成している事にあるらしい。

動的に生成されたプロキシクラスはシリアライズ対象に出来る「既知のクラス」として認識されないのでエラーになってしまう様だ。

POCO エンティティの使用 (Entity Framework)
『Windows Communication Foundation (WCF) では、プロキシを直接、シリアル化または逆シリアル化できません。その理由は、DataContractSerializer では既知の型のみのシリアル化または逆シリアル化ができますが、プロキシ型は既知の型ではないためです。』

結局対策としては

this.Configuration.ProxyCreationEnabled = false;

の1行をDbContextクラスのコンストラクタ内に入れる事で解決した。
これでデータ取得時に動的プロキシが作成されずに純粋なPOCOが返って来るので、シリアライズ時に問題が発生しなくなる。


ちなみにMSDN内の下のページには「シリアル化中にProxyDataContractResolver クラスを使用してプロキシ型を POCO 型にマップ」する方法が載っている。でもちょっと試してみたところ上手く行かなかったので今回はパスした。
チュートリアル: WCF による POCO プロキシのシリアル化 (Entity Framework)


他の解決策として、動的プロキシの作成を抑止せずにWCFサービスでオブジェクトを返す前に手動でPOCOにデータを詰め替えるという方法もある。

データを詰め替えるのはAutomapperなどのライブラリを使えば簡単に出来るので、ProxyCreationEnabled を falseにするという解決策を取りたくない場合はそちらでも良いかも知れない。



その他参考になりそうなURL:

Entity Framework 4, WCF & Lazy Loading Tip | .NET Zone


Entity Framework v4 POCO templates: repository returns object of incorrect type - Stack Overflow





 

2012年11月23日

DotInstallのTodoアプリケーションをASP.NET MVC4/C#で作りなおしてみた


元のレッスンはこちら。
PHP/jQueryで作るToDoアプリ (全20回) - ドットインストール

作ったものはこちら。

Todo_ASPNETMVC4 - GitHub
Zipダウンロード 

元のアプリケーションがシンプルなだけに特に引っかかる箇所もなくサクサク進んだので楽しかった。

jQuery UIの sortable を使った事がなかったので良い練習になった!

あっ、そう言えば最初の準備段階でこんな問題があったりしてちょっと引っかかった。けどASP.NET MVC4のCode Firstの練習にもなった。^^



 

gitで既にコミットしてしまったファイルを無視する様に変更したい場合は

今日、ASP.NET MVC4の Code Firstを試していてgitでつまづいたので将来の自分用にメモ。

Code FirstでDbContextクラスを作ってモデルクラスを作って、Package Managerコンソールから「Update-Database」を実行すると、無事App_Dataフォルダにデータベースファイルが作成された。

モデルクラスに対応したテーブルも自動的に作成されていて、素晴らしい!

と感動したものの、考えてみるとこのデータベースファイルは出来ればgitの管理下には置きたくない。

ところが気付いた時点では既にGitHubにデータベースファイルもろともpushした後だった。

あわてて .gitignoreファイルに
*.mdf
*.ldf
の2行を追加した。

それから git rm -f *.mdfしてみたり試行錯誤してみたけれども、どうも上手く行かない。

まだまだ git の事を理解していない証拠だな~、とちょっと落ち込む。

とりあえず検索して何とか答えが見つかった。
pushした後に.gitignoreに追加したのが良くなかったみたいだ。

git - Visual Studio gitignore and mdf, ldf files - Stack Overflow


  1.  一旦.gitignoreから*.mdf, *.ldfの設定をコメントアウトする。
  2. git rm --cached -- *.mdf を実行。
  3. git rm --cached -- *.ldf を実行。
  4. git commit -m "コミットメッセージ" を実行。
  5. 1でコメントアウトした.gitignoreの設定を戻す。

この操作で無事データベースファイルが除外された。




 

2012年11月21日

Android 4.2で今度こそ反応の良い楽器アプリは可能になるのか!?

以前からAndroidで良い(=実用になる)楽器アプリが存在しないのを残念に思っていた。


AndroidでiPhoneに匹敵する楽器アプリの作成が困難な理由

Android 4.0で反応の良い楽器アプリは可能になるのか




が、Android 4.2になってその状況もついに変わるかも、と思わせてくれる記述が公式ドキュメントの中にあった。


開発者にとってAndroid4.2は何が新しくなったか - Firespeed
Jelly Bean | Android Developers


Low-latency audio
Android 4.2 improves support for low-latency audio playback, starting from the improvements made in Android 4.1 release for audio output latency using OpenSL ES, Soundpool and tone generator APIs. These improvements depend on hardware support — devices that offer these low-latency audio features can advertise their support to apps through a hardware feature constant. New AudioManager APIs are provided to query the native audio sample rate and buffer size, for use on devices which claim this feature. 
(以下意訳)
Android 4.1でOpenSL ESによる低遅延再生、SoudPoolやトーンジェネレータAPIなどが改善されましたが、Android 4.2ではさらに低遅延な音声再生をサポートします。これらの改善点の恩恵を受けるにはハードウェアのサポートが必要です。低遅延再生をサポート可能なハードウェアは、アプリケーションに対してハードウェアフィーチャー定数を通じてその事を知らせます。新しいAudioManager APIを使うと、この機能をサポートしているハードウェア上でネイティブなオーディオサンプリングレートとバッファ・サイズを問い合わせる事が出来ます。

早速、先日Android 4.2に更新されたNexus 7でピアノアプリ「xPiano+」を試してみた。

このアプリは僕が今までAndroid上で試した数種類のピアノアプリの中では最も反応が良かったものだ。と言ってもiOSデバイスの楽器アプリとは全く違って、ちょっとでも速く鍵盤を叩くと遅延が気になってとても実用的に演奏出来るとは言い難かった。

4.2に更新されたNexus 7で試してみたところ、確かに前よりも反応が良くなっている!

感覚的なものなので数値に表すのは難しいけれども、「格段に良くなっている」と言える。

おそらくまだ4.2の新しいAPIを使った最適化はされていないと思うので、今後アプリ側が4.2に合わせて最適化されればもっと反応が良くなる可能性もあると思う。

ただし、まだまだiOSデバイスに匹敵するとは言い難そうだ。

これから何世代かかけてハードウェアがどんどん良くなって行ったとしても、そもそもJavaベースで動いているAndroidというOSでどこまでの「低遅延化」が可能なのかという問題がある様な気がする。

もちろんOSの深い所はC++などで書かれているみたいだし、アプリケーションもNDKを使えばC言語(C++)で開発する事は可能だ。やはり究極の低遅延化を目指そうとすればC言語で開発するしかないのだろうか。

いずれにせよ、Android 4.2で「反応の良い楽器アプリ」の実現に少し近づいた事は間違いない。今後どんな楽器アプリが登場してくるのか、(あるいはやっぱりダメなのか、)期待しながら待ってみようと思う。






2012年11月7日

Galaxy S IIIをAndroid 4.1.1 にアップデートしたらEclipseからアプリの実行が出来なくなった件


ついこの間 Galaxy S III にOSの更新の通知が来たので何も考えずにアップデートしたら、Androidのバージョンが4.1.1になった。

それはいいのだけれど、その後実機でのデバッグが出来なくなってしまった。

Galaxy S IIIをUSBでMacにつないだ状態でEclipseからアプリを実行しようとすると、「Failed to install ........ timed out. Launch canceled.」というエラーになってしまう。

検索してみた所では、このスレッドの最後(2012/10/24)に書かれているコメントが最も近いような気がする。

android - Unable to debug via eclipse on phone with Jelly Bean - Stack Overflow

『After inspecting my UMASK, I saw it's now 0000 (and it was 0077 on stock kernel), so I concluded that the wrong UMASK was the root cause of the error.
Still, as can be seen from numerous other threads on this issue out there, it's very wrong for the stock kernel to cause that problem.』

という事は Android 4.1.1自体のバグなのだろうか。

これは困った。。。

幸いな事に Android 4.1.2 の Nexus 7 の方は全く問題ないので、しばらくはそちらで開発するしかないかも知れない。

この機会にいっそGalaxy S IIIをRoot化してみるかな。^^


追記1:

下記にもある通り、Android 4.1 (Jelly Bean)からデフォルトのumask値が000ではなく077になった事が関係している模様。

[Q] Jelly bean and apk. - xda-developers
Eclipse や adb installを使わずに手動でAPKファイルを端末にコピーしてからインストールすれば動かせるらしい。でもそんな面倒な事はやってられないな〜。


追記2:

試しに

 adb install bin/[APPNAME].apk

を実行してみると、

 Failure [INSTALL_FAILED_ALREADY_EXISTS]

というエラーになった。そこで

 adb uninstall [PACKAGENAME]

をすると、Success になったので、その後もう一度、

 adb install bin/[APPNAME].apk

を行うと Success というメッセージが表示されてアプリがインストール出来た!

ただやはりEclipseから実行した場合はエラーになってしまう。変更する度にuninstallとinstallをコマンドラインでやらないと行けないのは面倒過ぎるので、何とか早く直って欲しいものだ。




2012年11月3日

iPad miniを触って感じた事

仕事の合間に近くのAppleストアに行って iPad miniをちょっとだけ触って来た。


一触瞭然 - 品評 - iPad mini
『今日から Kindle Fire や Nexus 7 を買う人は、情弱乙という他ない。』

確かにその通り。
僕の様に「分かっちゃいるけどAndroidが好き」という人でなければ、もうこれで何も迷う事はない。

少なくとも、これから僕が家族・親戚・友人に勧めるのは、間違いなくこれだ。


miniの感想


この軽さ。この薄さ。そして質感。やっぱり素晴らしいの一言に尽きる。

普通のiPadの上にiPad miniを載せて液晶画面の実質の大きさを比べてみたら、思ったよりも違いは少なかった。全体的には小さくなったと言っても、これなら見た目も指での操作感も、ほとんど違和感が無いはずだ。

年末に向けてこれはきっと売れまくる。
売れすぎて普通のiPadの売上を侵食して、結果的にAppleの売上が下がってしまうのではないか、と要らぬ心配までしてしまうほどだ。(もしそうなっても利益率的には変わらないのかな?)

※2012/11/6 追記: 『iPad miniの粗利益率は他の製品と比べて大幅に低い』との事。
Apple Says The iPad Mini’s Gross Margin Is “Significantly” Lower Than Its Other Products | TechCrunch



iPadとの比較


さて、15分ほどiPad miniを試した後、第4世代iPadというものを手に持って見た。

iPad miniから持ち替えると、さすがに手にずっしりとその重さが感じられる。これは重たい。筋トレを兼ねるのでなければ、ずっと手に持ったまま操作するものではない。

ただ、今さら言う事でもないけれど、Retinaディスプレイの美しさはさすが。

細かい文字を表示した時の読みやすさの違いはあまりにも歴然としている。この画面を見てしまうと、今度はminiの解像度がどうしても残念に思えて来てしまう。


今日の結論


まあ、いずれにせよ、miniは買っておこうと思う。子供用にぴったりのサイズと軽さだから、もしかしたら2台買ってしまうかも知れない。


参考リンク:




2012年10月30日

有料メルマガ「週刊 Life is Beautiful」を購読開始!

前から気になっていながらなかなか出来ていなかったのだけども、ついにこの10月から中島聡さんのメルマガ「週刊 Life is Beautiful」を購読する事にした。

早速今週配信の内容にこんな一節を見つけて、「やっぱりそうか〜」と興奮してしまった。
『何年か前に、インタビューで「プログラマーを目指す学生が最初に勉強すべき言語は何だと思いますか?」と質問された時に、迷いながらも「JavaScript」と答えたことを覚えています。今なら迷わず、JavaScript だと答えます。それどころか「node.js こそが最初にプログラミングを勉強するのに最適な環境」と答えます。』

また、iOSアプリで音声と画像によるリアルタイムな情報共有機能を実装するためにXMPPプロトコルを調べていたら node.js に興味を持って、それをきっかけに node.js を使えば今まで解決出来なかった Single Page Applicationの実装上の問題点を解決出来る事に気付いたという話は特に面白かった。そこからXMPPの事はひとまずそっちのけで興味と情熱の赴くままに AJMax というMVCフレームワークを作ってしまったという所がさすがにすごい。

自分も技術者として仕事をしている限りはいつかは中島さんの様なレベルに少しでも近づきたいし、改めて目指すべき方向を明確にしてくれたという時点で既に購読料の元は取れた気がする。

他にMicrosoftを辞める時のスティーブ・バルマーとのインタビューの話などもあり、読み物としてもとても興味深い。

実は有料メルマガを購読するのは今回が初めてだったのだけれど、もっと早くから購読していれば良かったと思う。 

これから週1回の配信が楽しみだ。





2012年10月19日

Android 4.1.2へのアップデートでNexus7のホーム画面が横置きに対応!

ちょっと前にNexus7にOSの更新の通知が出ていたので、更新するとAndroidのバージョンが 4.1.2になった。

特に更新前との違いに気付かなかったので忘れていたのだけれど、今日ふと画面の自動回転を有効にして試してみると、横置きにした時のホーム画面の使いづらさが見事に改善されていた。

これは嬉しい!

これで横置き対応だけのために Nova Launcher などのサードパーティのホームアプリを入れなくても良くなった!

ロック画面もこの通り横置きに対応

横置き
縦置き




2012年9月20日

ASP.NET MVC4のBasicテンプレートから作成したプロジェクトでWebGridヘルパーが使えない場合の対処

Visual Studio 2012 + ASP.NET MVC4でWebGridヘルパーが使えないという問題に遭遇した。




プロジェクトを作成する時にテンプレートを選ぶ画面で、EmptyかInternetを選択すると、問題は発生しない。

Basicテンプレートを選択した時のみこの問題が発生する。




そこでEmptyテンプレートから作成したプロジェクトとBasicテンプレートから作成したプロジェクトの違いを調べた結果、次の方法で解決出来る事が分かった。


1. Solution ExplorerのReferenceを右クリックして、「Add Reference」を選択。



2. 「System.Web.Helpers」のVersion 2.0.0.0を選択して追加する。


3. 追加したDLL参照のプロパティを開いて「Copy Local」をTrueに変更する。


この「Copy Local」をTrueにする、というのがミソらしい。


これで無事WebGridヘルパーが使える様になった。


多分近いうちに修正される不具合だとは思うけれど、もし他にもBasicテンプレートを使ったプロジェクトで何か上手く行かなかった場合はこれで治るかも知れない。








.






2012年9月15日

GitHub for Windowsミートアップというものに行ってきた

最近MicrosoftからGitHubに移ったPhil Haack氏がハワイに来られていて、GitHubやGitHub for Windowsの話をしてくれるというので、参加して来た。





以下、メモした事をざっと箇条書きで。

GitHubでの働き方について

組織はほぼフラット。Microsoftの時とはかなり違う。

現在60%以上の社員が遠隔勤務をしている。色々なコミュニケーションツールがあるので遠隔でも特に困る事はない。

特に決まった勤務時間は無い。バケーションも「必要なだけ」取って良い。(うらやましい~!)


GitHubの機能

GitHubのWebサイトでは「?」キーでキーボードショートカットのヘルプが表示される。
特にソースコードの画面で「t」を押して検索出来るのが便利。

Adminページの「Automatic Page Generator」という機能も便利なのでぜひ使って欲しい。

TortoiseSVNなどからソースコードをチェックアウトする事も可能。


GitHub for Windows の紹介

GitHub for Windowsでは、「Sync」というボタンがあるがこれは 「git pull --rebase」 を行うのと同等。


その他のTipsやデモ

Gitを学ぶ時は、「SeeGit」を使って可視化すると分かり易いのでぜひどうぞ。

GitHub特有の「Pull Request」機能の説明とデモ。

GitHub APIを使ったコミットオブジェクトへの情報追加のデモ。
(Power Shell + curlでAPIを呼びだそうとしたけど、残念ながらこれは上手く行かなかった。)




最後にGitHubのステッカーをもらって来た。どこに貼ろうかな。^^



ミートアップの後何人かはそのまま「Kanpai(と英語でそのまま言っていた)」をしに近くのバーへ行ったみたいだった。(費用は全部GitHub持ち!)

僕は時間が無かったのですぐに帰ったけれど、アメリカでも最近はこういう、仕事の後に同僚と飲んでコミュニケーションするというケースが増えて来つつあるのかも知れない。だとするとちょっと興味深い。

そもそもGitHubは数人の仲間がバーで飲んでいる時にアイデアが生まれたそうで、そういう文化が特に強くあるのかも知れない。



関連リンク:

Githubではなぜ人が辞めないのか? | IDEA*IDEA

CEOが自ら語った「イノベーションを起こすためのGithubの哲学」 | サンフランシスコ・シリコンバレー拠点のクリエイティブエージェンシー・btrax スタッフブログ













.


2012年9月7日

WindowsでPHPからSQLServerに接続するには

ちょっと調べる必要があったのでさりげなくメモ。

PHPから Microsoft SQLServer に接続するには2つの方法があるみたいだ。

①ODBCを使う

②Microsoftが提供する「SQL Server Driver for PHP」を使う


①の方法の場合は、
$result = odbc_exec($connection, 'SELECT FirstName FROM Names');
という風にodbc_xxxxxというメソッドを使ってSQLServerにアクセスする事が出来る。
http://davidwalsh.name/php-microsoft-sql-server-mssql-iis-connect-query-odbc

ただし下準備としてODBCの接続設定が必要。




②の方法の場合は、詳しい設定方法の説明が下のページにあった。
http://jimmyli.net/2010/08/talking-to-sql-server-with-php-on-iis/

また、「Native Client」というモノもインストールする事が必要らしい。
http://msdn.microsoft.com/en-us/library/cc296170(v=sql.105).aspx





以上メモ終わり。






.

2012年8月30日

Windows 8をインストールしたらまず覚えたいショートカットキー

先週、古いノートパソコン(DELL D520)にWindows 8をインストールしてみた。

予想外に動作が軽快だったので驚いてしまった。

そこで早速本格的にメインのPCも Windows 8 にしようかと思っている。

ただやはり色々と Windows 7から操作が変わっている部分もあるので、ショートカットキーを覚えて作業を効率化したい。

Scott Hanselman氏のブログに便利なショートカットキーが載っているのでメモしておこうと思う。
Windows 8 productivity: Who moved my cheese? Oh, there it is. - Scott Hanselman

なお、下記には Windows 8 で追加されたものだけではなく Windows 7 でも既に使えるものも含まれている。



ロック状態からログイン画面を呼び出す


一部では「上にスワイプする必要があるので不便」などと言われているらしい(?)が、そんな必要は無い。ただロック画面のどこかをクリックするだけ、もしくは何らかのキーを押すだけでOK。


シャットダウンする


下の様にいくつかの方法がある。
  • CTRL+ALT+DELを押してから画面右下の電源ボタンのアイコンをクリック→シャットダウン。
  • Win + I を押してから電源ボタンのアイコンをクリック→シャットダウン。
  • デスクトップで ALT + F4 を押してシャットダウンを選択して、ENTER。
まだ他にもあるかも。


管理者用画面を開く


Win + X を押してメニューから選択。それぞれのメニュー項目にはショートカット用のアルファベットが決められているので、それを覚えればさらに快適。(下記は英語UIで確認したもの。日本語UIだとキーの割り当ては違うかも?)
Win + X, F  → Programs and Features
Win + X, O  → Power Options
Win + X, V  → Event Viewer
Win + X, Y  → System
Win + X, K  → Disk Management
Win + X, G  → Computer Management
Win + X, C  → Command Prompt
Win + X, A  → Command Prompt (管理者権限)
Win + X, T  → Task Manager
Win + X, P  → Control Panel
など


Windowsキーと他のキーの組み合わせ


Win + E      → Windows エクスプローラ
Win + R      → コマンド実行
Win + Break   → システム情報
Win + D      → デスクトップを表示
Win + プラス   → 画面を拡大表示
Win + マイナス  → 画面の拡大表示を戻す
Win + F      → ファイル検索
Win + W      → 設定画面を検索
Win + Q      → アプリケーションを検索
Win + C      → 現在時刻とチャーム(画面右に出てくるパネル) を表示
Win + K      → デバイス設定
Win + I       → 画面の明るさ、ボリュームその他各種設定
Win + L       → 画面をロック
Win + 矢印    → ウィンドウを矢印の方向に自動配置(上で最大化)
Win + ,(カンマ)  → 一時的に(Winキーを離すまで)デスクトップを表示
など

タスクバーにピン止めしたアプリを開く


Win + (数字)でタスクバーの左端からの位置に対応したアプリが開く。
一番左端のアプリは Win + 1
2番目のアプリは Win + 2
など
これはWindows 7でも使える。










.


2012年8月28日

Grouponの通知メールを解除したら面白かった件

最近Grouponからの通知メールの量が多くて気になったので、解除してみた。すると意外にも面白くて笑わされてしまった。

右上の「Unsubscribe」というリンクをクリック。

普通の登録解除画面だったらこれで「登録解除されました。」というメッセージが出ておしまいだ。だけど今回は違った。

突然デスクで居眠りしているDerrikさんの写真が出てくる。予想していなかっただけにインパクトがあった。

Flash動画で微妙に揺れているDerrikさん。

「PUNISH DERRIK」ボタンをクリックすると...

ドアから同僚が現れ、なにやら責められて最後にはカップの飲み物をかけられるDerrikさんが。思わずかわいそうになってしまう。



最後に「Derrikがかわいそうだと思ったらもう一度登録してね」というメッセージで終了。

もうちょっとで「Resubscribe」ボタンを押してしまうところだった。(笑) 









.

2012年8月25日

Nexus 7用のケースとスタイラスペンが届いた

Nexus 7用に注文していたケースとスタイラスペンが先週届いた。ちょうど一週間使ってみて、かなり手に馴染んできた。




i-BLASON Auto Sleep / Wake Google Nexus 7 inch Tablet 100% Genuine Leather Case Cover / Stylus for 8GB 16GB 3 Year Warranty (Blue)


このケースには先端部分がゴム製のスタイラスが付属している。ただゴムなので予想した通り「スラスラ書ける」感じではなく少し抵抗がある。

なので別途安い割に評判も悪くなかった「amPen」というものを購入した。こちらはさすがにスラスラ書ける。ほとんど抵抗が無いので感動してしまった。

これで本当に「紙のノートを置き換えて仕事でバリバリ使う」事が出来そうだ。

amPen (TM) New hybrid stylus for ipad 3, iphone 4s, kindle fire, nexus 7, galaxy S 3 (Black) [in AM Retail Packing]


大きさも見た目もほぼシステム手帳なのでこのまま持ち運んで歩いても全く違和感が無いのが嬉しい。

ケースを閉じると自動的にスリープモードになる。そして開くと自動的にONになる。これがとても便利。実はこのケースを買って一番良かった点はこれかも知れない。

電源ボタンを押す必要があるかどうかというほんのささいな差なのだけれど、これがあるのと無いのとでは日常の使い勝手がかなり変わってくると思う。




もちろんスタンドにもなる。

ただ標準のスマートフォンUIだと横置きではホーム画面に戻った時に最強に使いにくいので、最近はもっぱら縦置きで使うようになってしまった。慣れというものは恐ろしい。(笑)











.


2012年8月11日

Nexus 7で「7Notes with Mazec」を使ってみた感想

「交ぜ書き」機能と言うのがすごい。「後から変換」機能も素晴らしい。



これなら充分仕事のミーティングで使えそうだ。
しかも使えば使うほど効率が良くなって行く様な行くような気がする。

画面を横向きにすれば一気に書いて変換出来る量が増えてとても良い感じだ。

Google日本語入力など他のIMEと比べても、人と話しながら書きやすいのは Mazec の方だ。

フリック入力だと、フリック操作自体に常に集中力を奪われてしまう。
手書きだと喋りながらでも手軽に書ける点が良い。

慣れてくれば右手で書いて左手で変換候補を選択すると言うワザが使える様になって来る。これが出来ると断然入力速度が上がる。

欲を言えば、改行とBackspaceのボタンがもう少し大き目で押し易ければ最高だ。

今は指で書いているけれども、スタイラスペンを使ったらもっと快適になるのではないだろうか。Amazonで注文したスタイラスが届くのがとても楽しみだ。


しかも、手書き入力というものには思わぬ副産物が付いてくる。

これは漢字の練習にもなるのだ。日頃キーボードばかりで漢字を忘れてしまっている僕の様な人間には良いリハビリになるかも知れない。











.


「Google Nexus 7」を買って10日目の感想

●ハードウェア



ハードウェア的な仕様はこちらを参照。
【レビュー】199ドルを実現したGoogle独自タブレット「Nexus 7」を試す(外観編) (1) まずは仕様・デザインを確認 | 携帯 | マイナビニュース 
画面はまずまず見やすくてきれいだし、スピーカーの音質にも不満は無し。
バッテリーの持ち具合も今のところ結構良い感じ。


●不要なプリインストールアプリが無いのが嬉しい


Galaxy S IIIにはSamsung製のアプリがたくさんプリインストールされていてちょっと目障りだった。もちろんNexus 7ではその様な事は無い。アプリ一覧の画面もすっきりしていて気持ちがいい。




●タッチへの反応にはちょっと不満


スクロール時の滑らかさはいい感じだと思うけれど、たまにタップになかなか反応せずボタンなどを2,3回押さないと行けない事がある。これはタッチスクリーンの初期不良か何かなのか? と思ってしまう。かと思うと全く快調に反応する日もあったりして、まだ良くわからない。



●Bluetoothでキーボードとトラックパッドを接続したら便利だ!


AppleのBluetoothキーボード(英語配列)を接続してみたら、何の問題もなくすぐに使える様になった。これは便利かも。

ついでにAppleのトラックパッドもつないだ。こちらも接続は全く問題無し。

日本語入力用IMEについては、初期状態で「iWnn IME」が入っていた。外部キーボードをつないだ状態ではこれを使うのが無難そうだ。なぜかと言うと、他のIMEだと日本語変換のON/OFFが外部キーボードから出来ない場合が多いからだ。

「Google Japanese Input (Beta)」や「Shimeji」を試した限りでは、外部キーボードとの相性という意味ではやはり標準で入っているiWnnが良いみたいだ。



●ホーム画面に戻ると強制的に縦表示になってしまう


(この問題はAndroid 4.1.2への更新で解決済み。下の追記参照)

おそらくマウスやトラックパッドを接続して使う場合に最も困るのがこの点だ。アプリ画面では横向きで作業出来るのに、ホーム画面に戻った途端に強制的に縦表示になってしまう。端末自体はまだ横向きのままなのに、だ。

そして、その状態だとマウスポインタを横に動かすと見た目上は縦に動いてしまって、ものすごく使いづらくなる。

一体全体、Googleの人達は縦置きでしか使ったことが無いのか、と言いたくなってしまう。

画面の表示はそのままでもいいので、少なくともマウスポインタの動きだけは本体の物理的な向きに追従する様に出来ないものだろうか?

これは本当になんとか改善して欲しい。マウスやトラックパッドを全く使わないとしても、スタンドなどにセットして横向きで常用したい人にとっては悪夢の様な仕様だ。

下のサイトのTipsの#38に対処方法があった。ホーム画面を横向きにする事が出来るらしい。但しまずRoot化が必要との事。
http://blog.the-ebook-reader.com/2012/07/18/40-tips-and-tricks-for-google-nexus-7-tablet/
こちらに載っているのも多分同じ方法。
Nexus 7を完全なタブレットUIにするカスタマイズのスゝメ - Digital Grapher
http://digitalgrapher.blogspot.jp/2012/08/nexus-7ui.html

上の「ro.sf.lcf_density=213」の213を170に書き換えるというやり方以外に、 「launcher.force_enable_rotation=true」を書き加えるという方法もあるみたい。
Nexus 7 をタブレットUI~ホーム画面が横回転するようにした。
http://usagisaigon.blogspot.com/2012/08/google-nexus-7-ui.html
確かにこちらの方がJelly Beanらしくて良さそうだ。

出来ればRoot化しなくてもGoogleが標準で対応してくれるのが望ましいと思う。

あるいはやっぱりNexusシリーズはRoot化して自己責任で色々いじって使うのが基本なのだろうか。Nexus 7のRoot化はそれほど難しくないみたいなので、近いうちにチャレンジしてみるかも知れない。



※ 2012/9/27 追記:
コメントで別の解決策を教えてもらった。
「Nova Launcher」をインストールしてデフォルトのホームアプリにすれば横置きでも問題なく使える様になった!



※ 2012/10/18 追記:
Android 4.1.2へのアップデートでNexus7のホーム画面が横置きに対応!
これで上の不満はようやくスッキリ解決。^^/



●デフォルトではカメラアプリは無い


このアプリをインストールすればフロントカメラで写真やビデオが撮れる様になった。
https://play.google.com/store/apps/details?id=com.modaco.cameralauncher
あまり使う機会は無いと思うけど、せっかくカメラがあるのだから一応入れておこう。

でも使って見ると、フロントカメラで自分以外のモノを撮るというのは、実はなかなか難しく、実質的に実用には向かない事が判明した。(当たり前か...笑)

ちょっとしたメモ代わりに書類やホワイトボードなどを撮影してそこに手書きで何か書き込みたい、という様な場面もある(かも知れない)ので、背面カメラはタブレットでもやはり必要なのではないかと思った次第。



●PDANetを使ってテザリング


米国Sprintの携帯回線を使っていると、追加オプション(月19ドル)を契約しないとテザリング機能が一切使えない様になっている。(Wifi, Bluetooth, USBのどれもテザリング実行前にSprintのサーバーに契約の有無を確認しに行っているみたいだ。)

でも、「PDANet Tablet」というアプリを入れれば非公式にテザリングが出来る。
Nexus7をxperiaでテザリング(PDaNet利用)
http://onboradcamera.blog.fc2.com/blog-entry-12.html
携帯が Galaxy S III の場合はアプリがまだ対応していないらしく、上手く動かなかった。HTC Evo 4G で試すと問題なくテザリング出来た。




●さて、何に使うかが問題...?


さて、ハードウェア的にもまずまず不満はないしソフトウェア的には最新のJelly Beanが載っているこの素晴らしいNexus 7、あまり良く考えもせずに勢いで買ってしまったわりに実はこれと言った用途が思い浮かばないので困ってしまった。

こんな事なら250ドルをiPad Miniの為に貯金しておいた方が良かったのではないか。

いやそんな事はない。これがあれば常に最新のAndroidバージョンで自作アプリの実機確認が出来るではないか。

そうだ、アプリ開発のデバッグ用にじゃんじゃん使おう。いやそれなら既にGalaxy S IIIがあるじゃないか、画素数的にも同じだし。

では電子書籍リーダーとして...はどうせ多分使わない。音楽プレーヤーとして...は大き過ぎる。ゲーム用端末...そもそもゲームしてる時間が無い。映画鑑賞?...ならiPadもMBAもあるし。


と色々考えた末、今のところ最有力になりつつあるのは「紙のノートを置き換える」という用途。

この為に手書き入力用アプリ「7 Notes with Mazec」も買ったし、スラスラ書けそうなスタイラスペンもオーダーした。もちろん無料の「Skitch」もインストール済みだ。

これでなんとか後悔せずに済むのではないだろうか。











.





2012年7月28日

個人データの同期とバックアップについて考えてみた

●現在の環境


まず僕の現在の環境は以下の通りになっている。

  • 会社で使うメインマシン - Windows 7 
  • 会社と自宅で使うサブマシン - MacBookAir 
  • 自宅で使う開発用マシン - Linux(Ubuntu 11.10)


●同期・バックアップの対象となるデータ


対象データを分類すると次の様な感じになった。
  1. 自分のAndroidで撮った写真・動画
  2. 奥さんのiPhoneで撮った写真 ・動画
  3. その他の写真・動画
  4. ドキュメント(Word、Excelなどの文書)
  5. KeePassのデータファイル
  6. アプリ開発用素材データ(画像・音楽・効果音など)
これらのデータが、必要なマシンに出来るだけ効率良く同期されバックアップされている状態にしたい。



●用意するもの


  • Google+
  • Google Drive (DropBoxかSkyDriveでも可)
  • SugarSync
  • Wuala
  • Amazon S3 
  • ローカルバックアップ用DVD 




●写真と動画


Android, iPhoneで撮った写真と動画は基本的に全てGoogle+にアップロードする事にする。Google+のモバイル用アプリの「インスタントアップロード」機能を使うと自動的にアップロードされるので便利だ。ピンぼけした写真や要らない動画は後から消せばいいやという考え方だ。

容量無制限で無料との事なのでコストを気にする必要が無いのが嬉しい。(ただし画像のサイズや動画の長さには多少制限がある。)

家族や親戚に近況報告代わりに写真を見せたい時にはここから共有すれば簡単に出来る。

ただGoogle+だけだとWindowsとMacへの同期が出来ないので、さらにSugarSyncの自動アップロード機能も使う。

Androidの場合、SugarSyncのアプリをインストールし「写真の自動同期」と「ビデオの自動同期」を有効にしておくと、WindowsとMacの「Mobile Photos」というフォルダに携帯で撮った写真と動画がコピーされる。こうすれば写真や動画を取り込むためにわざわざUSBケーブルをつなぐ必要が無くなる。

Android用SugarSyncの自動同期の設定画面。
外部電源接続時のみ実行するようにしておけばバッテリーの心配も要らない。


iPhoneでもSugarSyncアプリからWindowsやMacの「Mobile Photos」フォルダに簡単にアップロードする事が出来る。ただしこちらは自動ではなく、送りたい写真を選択して「アップロード」ボタンを押す必要がある。
iPhoneとMacだけならiCloudという選択肢もあるけれども、現時点のiCloudでは動画は対象外だし、AndroidとWindowsも含めて考えると現状ではSugarSyncが最も便利ではないかと思う。
SugarSyncを使ってiPhoneの写真をアップロードする方法 - YouTube



●ドキュメント


ドキュメント類は Google Drive を使ってWindowsとMacの間で同期する。
DropBoxやSkyDriveでも良いと思う。ただGoogle Driveに入れておけばブラウザでGmailを開いている時にもすぐにアクセス出来るので気に入っている。

Linux用のクライアントが出ればもっと便利になるのだけど。



●KeePassのデータファイルと素材データ


KeePassのデータファイルとアプリ開発用素材データに関しては、Linuxも含めて全ての環境で最新のものを利用したい。そのために Wuala を使う事にする。

SugarSyncだとこれ(Linuxも含めた同期)が出来ないのが残念だ。他の選択肢としてはDropBoxもある。ただ、以前のエントリでも書いた通り、個人的な印象としてDropBoxのセキュリティには少しだけ不安がある(※1)のと、僕自身にどうしようもなく「どちらかと言うとマイナーなものを使いたい」という性癖があるのでまずはWualaを使おうと思っている。


※1 つい最近もこんな事例が。
Dropbox が従業員アカウントからユーザ情報を漏洩。セキュリティ対策を強化
Dropboxが約4時間すべてのアカウントのロックを解除してしまう事故が発生



●全てのデータのバックアップ


数あるクラウドストレージの中でもやはり「Amazon S3」の信頼感は絶大。なので出来れば全てのデータを定期的にS3にアップロードしておきたい。おそらく1ヶ月で2~3GB程度にはなると思うので、どれくらいの頻度でアップロードするかはまだ決めていない。ツールとしては Cyberduck を使うのが良さそうだ。

最後にローカルバックアップとしてDVDにも焼いておけば完成だ。1ヶ月に一回は行いたい。(面倒だから半年に1回くらいになるかも。)




●まとめ


図に描くと大体こんな感じになる。


以上、とりあえず現時点での個人的なデータの同期&バックアップ戦略をまとめてみた。

ちょっとやり過ぎかなとも思うけれども、自分で撮った写真や動画は他に代えがたいものだし、一度失ってしまうと取り戻す事も出来ない。なので単一のサービスに依存する事なくしっかりバックアップしておきたい。

またデバイス間の同期に関しては一度設定してしまえばあとは自動的に実行されるので、ほとんど手間はかからない。

今までは写真や動画がバラバラといろんなデバイスの様々なフォルダに散在している状態だったので、こうして図に描いてまとめてみると気分的にもスッキリとする。











.

2012年7月25日

米国Sprint版「Galaxy S III」の使用感


samsung-galaxy-s-iii-galaxy-s-3-8

購入1週間後の感想。
以下、☆は良かった所、■は今ひとつな所。

☆薄くて軽いのでポケットに入れやすい! (HTC Evo 4Gとの比較で)

☆WiFiの「つかみ」がかなり速くなった。 (HTC Evo 4Gとの比較で)

☆通知領域を開くと上に出て来る各種設定ON/OFFボタンが便利!
Screenshot_2012-07-24-13-11-58

☆カメラが高機能! 連射機能とかHDRとか面白そう。

☆バッテリーの持ちは問題ないレベル。僕の使い方(使用しない時はWifi/3G/GPS/自動同期をOFF)だと50時間は充電なしで使えそう。
2日と5時間でバッテリー残量27%


☆RAMとストレージ容量に余裕があるので気持ちが楽。(これは大事。笑)


■つるつるしていて操作中に気を抜くと落としそうになる。

■両サイドの音量ボタン・電源ボタンを間違って押してしまう事がある。

■輝度100%でも直射日光の下では少し見辛い。

■戻るボタンとメニューボタンがハードウェアボタンとして付いているのはいいのだけれど、デフォルトではすぐにバックライトが消えて見えなくなってしまう。(設定で常時ONにしたら解決した。)


全体的にはとても満足。
これがあればNexus 7はもういいかな、とも思ってしまう。







.

2012年6月22日

Android: クリック時にボタンの画像を回転させる方法

押されるとカクッと画像の角度が変わるボタン。

ちょっと調べるのに時間がかかったので一応メモ。

まず res/drawable の下に例えば button_stateful.xml という名前でXMLファイルを作る。





あとは画面レイアウトのXMLファイルの中でボタンを下記の様に定義すればOK。













.