2012年12月27日木曜日

アクティブ・ブレイン・セミナー2

いろいろ書いてもそれはそれで胡散臭くなってしまう事に気づく。
自分の持っていた疑問への回答だけを書いておく事にする。
・超能力めいた記憶法ではない。
・記憶方法を改める事で記憶ができるようになる。
・セミナーを受けたその日から効果が実感できる。
1日目で意味のない60個の単語を覚え、宿題として翌日までに100単語覚える。
実際にほとんどの人がこなせるようになっていた。
若い人ほど飲み込みは早い傾向。でも確実に効果は現れている。
・すぐ効果が実感できる反面、使いこなすには練習するべきだと思う。
・教えてもらった内容をどう活かすかが重要。
教えてもらった事をそのまま使うだけだと宴会芸レベル。
・読書法コース、英単語コースなどの先のコースがあり、目的ごとのコースを受けないと使い方に悩んでしまう。
こんなところだろうか。


2012年12月13日木曜日

アクティブ・ブレイン・セミナー

色々予定が続いて、最近は通勤以外で自転車には乗ってないんですが、
その間にアクティブ・ブレイン・セミナーという記憶術のセミナーを受講して来ました。

胡散臭いとか思ってましたが、
記憶術だけではなく基本的な考え方を改めさせられる
貴重な機会となりました。

せっかくなので記録に残す予定。

2012年11月17日土曜日

【Titanium】AdMobをAndroidとiOSに両対応させる

開発PC:MacOS 10.7.5
Titunium Studio:2.1.2.201208301612
Android:L-01D(Android4.0にアップデート済)

先にAndroidに導入済みでそこからiOSにもさせたいって時にすんなりできなかったのでメモ。

AdMobのmoduleはAndroid用が2.0、iOS用が1.3。
tiapp.xmlのmodulesの部分はこんな感じに。

<modules>
    <module platform="iphone" version="1.3">ti.admob</module>
    <module platform="android" version="2.0">ti.admob</module>
</modules>

大きなポイントとしては、AdMobのオブジェクトを作るときに、
AndroidはHeightの指定がいらない、iOSではHeightの指定が必要という点。
少なくとも自分の環境ではそんな結果に。
なので、こんな感じにiOSのときだけ高さの指定を別に行っています。

    if ( Ti.Platform.name == 'iPhone OS'){
        adMobView.height = 50;
    }

これくらいですんなり動くように。
あとはAdmobオブジェクトのイベントが、
iOSだと'didFailToReceiveAd'、AndroidだとAdmob.AD_NOT_RECEIVEDってなっているみたいで、
広告の呼び出し失敗時などにイベントを発生させたい場合は注意が必要みたいです。

以上。

2012年11月13日火曜日

【Titanium】Android環境でのadmobの実装

開発PC:MacOS 10.7.5
Titunium Studio:2.1.2.201208301612
Android:L-01D(Android4.0にアップデート済)

作っているアプリは無料での公開を考えているので、公開の際には広告を入れたいなぁと思っています。
とりあえず、有名どころでAdmobを組みこもうと数日試行錯誤。

あちこちのブログを参考に試してみましたが、最初2011年の記事を参考にして実装を試みたところ、Tituniumのバージョンが違うのか、「実機で表示されない」、「表示されない場合が多々ある」などの問題に見舞われました。
いろいろ試したので結局のところ何が悪いのか絞り込めなかったのですが、以下のサイト
http://web.showjin.me/2012/07/titanium-mobile_android_admob.html
を参考にしたところ、うまくエミュレータ&実機で動作させる事ができました。
ポイントはModuleについてくるapp.jsのコードを使用したところでしょうか。
それと、requestAd()を呼び出す際に
setTimeout(function(){
    adMobView.requestAd();
},3000);
時間をおいてから呼び出すようにしてみて今のところ安定動作しています。
表示確率が低い、という記事も見かけましたが、現行版だと問題なさそうですが引き続き試してみる必要がありそうです。

2012年10月19日金曜日

【Titanium】iOSでボタンの色

を変えられないなぁと思っていたら仕様で、どうしようかと思ってたら
ボタンバーを使うという荒業で解決できるのですね。

うーん、なるほど!

2012年10月18日木曜日

Titanium Mobileの本

先日こちらの本を買いました。

これまでにもTitaniumMobileの本を買っていますが、
手元においてるのはこれ1冊になりました。

情報が新しく、Requireの使い方にも触れているのでかなり実用的な
内容だと思い、とても気に入っています。
とはいえ基本部分はこれまでに学習済みなのでしょっちゅう読む事もないのですが、
これから始めようという人がいたらぜひお薦めしたい書籍です。

2012年10月8日月曜日

仙台~奥松島

前日の夜に少し体調崩してたので出かけるか迷ったものの
先週の土日が仕事で全然走れてなかったので奥松島まで行ってきた。

何度か走っているので割となれたコースではあるんだけど、
新しい自転車になってからは初の松島方面だった。
道中の登りが、前の自転車だともう少し大変だった気がするんだけど、
今回は実に楽に走れた。
これがロードとクロスの差だろうか。体感の距離もかなり短く感じられた。
自分自身の体力、脚力もついたのかもしれない。
DSCN1301
奥松島、なんかもっと色々あったような気がするんだけど、
ずいぶんとすっきりしてしまったものだ。
あ、つまり震災後は来てなかったらしい。松島は行った記憶あるんだけど。
DSCN1297 
鳥。すぐ逃げられた。
DSCN1295 
この辺りはあまり雰囲気変わっていないなぁ。
走行中、軽く異音がしたのでどこか緩んできているかもしれない。
自分で見た限りではよくわからなかったので、近いうちに自転車屋に持っていこうと思う。


2012年9月23日日曜日

あちこち回ってみる

新しい自転車を買ってやる気がでてきたのか、あちこち走って回っている。

まずは遠刈田。
前日に1日かけて秋田から松島まで(230kmくらい?)自転車で走ってきた友達と一緒のロングライド。
遠刈田は以前も走った事があったけど、そのときよりは楽にこなせる様になっていたのは感動。
友達の方はビンディングペダルな為か、前日の疲れを感じさせない走り。
ボクも近々買おうと思う。
温泉に入ったけど体の熱が抜けてなくて水を被りまくった。
次に泉ヶ岳。これが昨日の話。
あちこちと書いておきながら2箇所しか周ってないじゃないか。なんてこった。

実を言うと、こちらのコースの方がビンディングペダルの必要性を認識させられた。
(引き足使ったこと無いから良くわからないのだけども。 )
ドッペル君の時にはタイム等も意識してなかったので適度に休憩を取りながら登っていたんだよね。
せっかくのロードなので一気に走ろうと思ったけど、途中で疲れて漕ぐペースが激落ち。
しかも距離を勘違いしてペース配分を大いに誤る。ルートラボのハーフクライムとかいうのを見てた!
401376_349572741799045_518086044_n
しかも帰りにハーフクリップのボルトが一本無くなってることに気づく。
お前もビンディングペダルを買えと言っているのか・・・?
SPDにしようかと思ってたけど普段乗りはドッペルだし、クリートカバーをつければなんとかなるから
SPD-SLにしてみるのも良いかな。行く行くは蔵王ヒルクライムとか挑戦してみたい。


2012年9月10日月曜日

心機一転、というほどでもないが

毎日少しづつ触っていたけど迷走気味のまま日々が経過。
なんとか作っている物を完成させたいです。

きっかけ作りの為に記事を投稿してみました。

2012年9月9日日曜日

DEFY COMPOSITE SEを購入

これまで3年ほど乗ってきたDOPPELGANGER 801 primacy。
買ったときはどんな自転車が良いのかもよくわからず(今でもよくわかってないけど)、10万以上の自転車を買ったほうがいいっていうサイトに反発したい気持ちもあってドッペル自転車でがんばってきた。
(あと、飽きやすい性格なので高いもの買って無駄にしてしまうのがもったいないと思ったのもあるかも)
実際、仙台を拠点に、宇都宮にも行ったし、秋田にも行った。
そのドッペルは普段乗りに使ってる事もあってだいぶくたびれてきた。
そろそろ新しいものにしても良いかなーと思って、新しい自転車にしてみました。
GIANTのDEFY COMPOSITE SE。なかなか良いお値段の自転車!
安い自転車でどこだって行けるんだぜって書いている自サイトのポリシー(?)に反する感じなのが心苦しいところだけど、3年乗ってきたのでそろそろ次のステップに進んでみようと思う。
とりあえずは、より遠くにいくことを目標にしてみようか・・・。
で、新しい自転車はカーボンフレームで、重量にしてドッペルの約半分。実に軽い!
558743_344663675623285_612635688_n
昨日、70kmほどのポタリングに行ってきた。
同行した友達のペースに合わせていたのでややスローペースでの走行だったけど(平均時速で20kmくらい)
店から自宅に乗って帰るときはわからなかったけどとても加速しやすい!
うっかりすると友達をおいていってしまいそうなほど(いや、ドッペルの時からそうだったかもしれないw)
難点がいくつかあって荷物があまり積めない、カーボンなので取り扱いに気を使う、盗難が怖い(笑)などなど。
積載量の問題はフロントにとりつけたバッグが一応は解決してくれてて、日帰りツーリングであれば大丈夫そう。
かなりぎちぎちだけど、以下のものがなんとか収まった。
・予備のチューブ
・タイヤレバー
・携帯工具
・財布
・ケータイ
・スマホ
・行動食
・タオル
・着替えのTシャツ
テントとかを背負っていけばキャンプツーリングもいけるかな。
あと、ドッペルにはこれまでどおり普段乗り自転車として活躍してもらう。これからもよろしく!


2012年7月24日火曜日

【Titanium】AndroidとiPhoneの両対応に悩む

手持ちの環境はMacbookAirとTitaniumStudio2.1、iOS5.1、Android2.3.7でお送りしております。
朝時間を使って最近のまとめです。

ちまちまと小規模のアプリ制作に励んでいます。
目標は用途を限定した電卓的アプリ。

前回のchangeイベントの件は何をどうしたのか、いつの間にか解決しました。
多分、changeイベントで発生させていた計算処理が足をひっぱっていたんじゃないかと。

下みたいな事をしようとした時、

textFieldC.value = textFieldA.value / textFieldB.value;

iOSだと問題なく計算してくれるんですが、Androidだとエラーになるみたいで、
恐らく型変換をしないまま計算しようとしているのがダメなんですよね。

textFieldC.value = String(parseFloat(textFieldA.value) / parseFloat(textFieldB.value));

こんな感じにしたらエラーが出なくなりました。
他にもiPhoneとAndroidで同じ結果が得られなくて苦労する感じです。

割り切ってiPhoneのみとかで作っちゃった方が良いかなとも思いましたが、
それはそれでAndroidに手を出そうとしたときに苦労しそうだったのでがんばりたいです。
うーん、このあたりは同じWebkit系ブラウザで動作するのでCordovaは優秀でしたと今更ながらに。

あと、解像度の違いへの対応も面倒そう。
ピクセル指定だとAndroidとiPhoneのエミュレータ結果がだいぶ違うんですよね。当たり前なんですけど。
とりあえずは単位dpでの指定をする事で乗り切ろうかと思っています。
一番きれいに処理できるのはjssなのでしょうか。手間がかかりそうだったので今回は手を出さない事にしました。

2012年7月22日日曜日

【Titanium】Requireの子から親への連携

前回からの続き的な内容。
Requireの中にあるボタンで発生したイベントからいかにして親のオブジェクトに連携するか悩んでいましたが、
最適解かはわかりませんが、fireEventで解決させました。

exports.view = function(_viewNum){
    var view = Ti.UI.createView({});

    var button = Titanium.UI.createButton({
        title:’ボタン',
    });
    view.add(button);

    button.addEventListener('click', function(){
            view.fireEvent('newEvent');
    });

    return view;
}

これで親側にあるexports.viewに当たるオブジェクトにイベントを伝えられるので、
あとは親側のオブジェクトにnewEventをaddEventListenerすれば大丈夫。

最初、全部グローバルオブジェクト(?)として設定すれば解決するかと思ってたんですが、
それだとiPhoneだと動いてもAndroidだとダメみたいだったんであきらめました。
使い方としても本来のCommonJSの仕様から外れたものみたいですし・・・。

もっと簡単に作れるかなーと思ってましたが、なんだかんだで色々なところでひっかかりますね。
JavaScriptで簡単な制御以上の事をやった事がないからだと思いますが。

解決したと思ったら今度はTextFieldのchangeイベントを使おうとするとAndroidでエラーになってしまって困ってます。

2012年7月17日火曜日

【Titanium】シングルコンテキストに苦戦

手持ちの本に沿って、Includeで別ファイルを呼んでくるスタイルで多少わかってきたかな、と思ったら
TitaniumMobile2.0からはrequireで呼んでくるシングルコンテキストというスタイルが一般的である事を知りました。

あちこちのサイトをみて多少はわかったけど、まだまだわからない状況です。

こちらのサイト http://ti.imthinker.net/ あたりが比較的わかりやすかった印象。

元々わかってないところに飛び込んできた新情報なのでメリットもよく理解していませんが、
どうやら今はこっちの方法がスタンダードでパフォーマンス面でも優れているようなので
なんとかして覚えたいと思っています。

とりあえず、app.jsにこんな感じに書いて、

var app = {};
app.win = require("mainwin").win();

mainwin.jsにこんな感じに書いておくと、

exports.win = function (){
    var winX = Titanium.UI.createWindow({});
    winX.open();
    return winX;
};

app.winはmainwin.jsに書かれているwinXに成り代わる感じだっていう事まではなんとなく理解しました。
オブジェクトが別ファイルに分割されたという感じ。

app.winがmainwin.jsのwinを呼び出す

mainwin.jsの内容が呼ばれる。

mainwin.jsの関数内でwinXというウィンドウを作る(createWindow)

関数の結果としてwinXを返す(return winX)
exports(require”mainwin”).winはwinXである

app.winはexports(require”mainwin”).winであるので、つまりwinXである。

つながりを整理しようと思ったんですが、まだまだ理解不足ですね。
とりあえず動く状態にはもっていけるようになったんですが、require内に定義したaddEventListenerから
親のjsファイルのオブジェクトに結果を与える事がうまくできません。

どうしたらよいのかなぁ。

2012年7月9日月曜日

【Titanium】スペルミスで悩む

環境:TitaniumStudio2.1、第4世代iPodTouch(iOS5.1)

買った書籍のサンプルを一通り試し、できる事はわかったけど使いこなせてない、そんなラインまで来ました。
特定のものの計算に限定した電卓系アプリの作成にチャレンジしています。

電卓系アプリということでテキストボックスに数字しかいれられないようにしたいのですが、こんな感じ

var text1 = Ti.UI.createTextField({
    width:160,
    top:180,
    left:170,
    height:60,
   keybordType:Titanium.UI.KEYBOARD_NUMBER_PAD,
    borderStyle:Ti.UI.INPUT_BORDERSTYLE_ROUNDED
})

にしてみたんですが、うまくいかない。
どうしてだろうどうしてだろうと悩んでいたら・・・スペルミスでした(笑

正しくはkeyboardTypeですね。
この手のミスはエラーとして出てこないんですかね~。

続いての問題として一度出したキーボードをどうやって消すか、です。
Titanium.UI.KEYBOARD_NUMBER_PADの場合に確定するキーがでなかったのです。

2012年7月8日日曜日

車で龍泉洞へ

自転車で遠出しようかと思っていたが、残念なまでの雨だったので車での遠出。
雨でも影響のない洞窟なんて良いなと岩手の龍泉洞に行ってきた。
そうしてやってきた岩手は割と晴れてきた。
朝に出てきたのに、高速代をケチって一般道を走っていたら6時間くらいかかって昼過ぎになってしまった。
車の持ち主である友人も同行していたが、夜勤明けだったので自分が延々と運転。
DSCN1167 
以前行ったのは10年以上前になるのですごく新鮮に楽しめた!
DSCN1174 DSCN1184
龍泉洞近くの食事処で焼き鮎の定食食べたり。
お土産屋はいかにも地方のお土産屋って感じだったけど、こんな
https://gs825.ggsv.jp/~w825144/detail.php?n=6
クリアファイルが置いていて時代を感じる。
龍泉洞クリアファイルをネタで買おうと思ったけど残念ながら売り切れ。

車を自由に使えるのが1日だけだったのでその日のうちに帰りました。
帰りはある程度高速も使いつつ。
4年くらいは車を所有していたので早々下手にはならないと思うけど、年1くらいで運転しておくのはよいね。


2012年7月3日火曜日

TitaniumMobileでひっかかったとこメモ1

Mac+iPodtouch+TitaniumMobile2.1での環境です。
2があるかどうかわからないのに先走って1とナンバリングしておきます。

①'undefined' is not an object とかいうエラーがでる。
 本に載っている写真アプリを作ってる際に発生。該当行を見ても問題は無し。
 悩んだ挙句、検索をしてみたらこちらが出てきて解決。

 その通り、プロジェクトフォルダのbuild/iphone下位の内容をまるごと削除したら解消しました。
 そんなアホな!

②アプリ名を変更したい
 Resources/iphoneにInfoPlist.stringを作成。

 CFBundleDisplayName = "アプリ名";

 って感じの内容を書いてあげたら大丈夫でした。

③アプリアイコン(iPhone向)について
 Retina用のアイコンはResources/iphoneフォルダ内にappicon@2x.png(114x114)を入れるだけでOKです。
 また、iPhoneアプリのアイコン特有の光沢を入れたくない場合、tiapp.xmlを修正。

<prerendered-icon>false</prerendered-icon>

 という行があるはずなので、trueに修正すると元画像のまま表示されるようになります。

 

要らないところでひっかかってしまい、非常に進捗は良くないです。
でも少しづつTitaniumMobileのスタイルがわかってきました!

今の時点の知識で実現できそうなアプリの構想もぼんやりとながらできてきたり。
その前にリジェクトされたCordovaのアプリもなんとかしたい・・・。

【アプリをプレイ】動体視力のテスト

ランキングにあった動体視力のテストをプレイ。

右から次々に流れてくる「C」の開いている方向を視力検査の要領で答えていくゲーム。
徐々に流れる速度が速くなっていくので為、高得点には動体視力が求められるのが特徴、でしょうか。

正直、UIの造りが残念な感じで、最初どこを押して良いかわからなかったり、
開始時の画面方向キーの配置が何故かPCのような配列だったりする点がとても惜しいと思いました。

それでもシンプルなゲームシステムや、貯めたコインをアイテム(?)と交換できるやりこみ要素はやはり熱くなれるのでしょうかね。

2012年7月1日日曜日

IIJmio回線でradiko

インターネットでラジオが聞けるサービスのradiko、IIJmio128kでもなんとか聞くことができます。

難視聴地域でも聞けるようにするような目的からなのか、本来はその地域で流れている局しか聴くことができません。

自分は東北在住なんですが、IIJmioの回線使うと聞けちゃうんですよね。関東圏のラジオが。
Androidアプリのradikoからだと、GPSで地域を判定してるみたいなので地元の局しか聞けませんが、
テザリングで接続したPCのブラウザからは何故か関東圏のラジオが聞けました。

普段は自宅の無線LANから接続するので関係ないんですが、これって実際のところ何かの決まりに触れてしまうんですかね?

疑問を解決しないままにするこの日記。

TitaniumMobile勉強中

引き続きこちらの本を読みながら勉強中です。

 
やはりHTML5なCordovaからこちらを始めるとちょっとハードルは高いなぁという感じです。
UIデザインも全部コードとして書いていかないといけませんしね。
でも、自分みたいな初心者がひっかかりそうな箇所を説明してくれているので安心して読み進められます。

今はChapter5まで進めたところです。
小さなサンプルをこなす、というもの。
TitaniumMobileに限らずですが、なんとなくは理解してきたものの自分の頭で考えて作らないと身にはつかなそうです。

今のChapterを少し進めたら何か作って見たいと思います。

2012年6月29日金曜日

【アプリをプレイ】水を満たすゲーム

水を満たすゲーム。
http://itunes.apple.com/jp/app/shuiwo-mantasugemu/id516332107?mt=8

ダイハード3に出てたゲームだとかでダイハード3はみていないのですが、気になってしまう名前だったのでダウンロード。
海外製アプリのようなのでローカライズの際に直訳したらこうなった、っていうタイトルな気もしますが結果的に良い感じです。

容量の違う複数個のボトルを使って水の量を指定の分量にするというもの。
この手のゲームは得意ではないけどついはまっちゃいますね。

しかし、基本部分は日本語化されているけどヘルプが日本語化されてないのが痛いところ。
やることはシンプルなので触っていれば大体のことはわかりますが、水をどうやって捨てるのかわからず悩んでしまいました。

モードも多く、はまると長く遊べそうなゲームです。

TitaniumMobile アプリ開発入門を読む

TitaniumMobileはいける!となんとなく思ったので1冊本を買ってきて読んでいます。
今年に出た本で、開発環境のTitaniumStudioに触れられていたりJavaScriptの基礎的な部分にも触れられているので自分にはちょうど良いです。

環境構築はCordovaで既にやっていた部分だったりWebサイトを見ながら済ませていた部分だったりしたので、とりあえずはChapter3のJavaScriptに関する部分を読んだり試したりしています。
スコープとかクロージャとかの知識が自分には足りない部分かなぁと思ってそのあたりを熟読中です。

今月中に何か作ってみたかったけどできるかなぁ・・・。

2012年6月28日木曜日

【アプリをプレイ】精神年齢診断

40代でした・・・。

スタンダードな診断ゲームという印象。
アイコンと同じデザインの枠の中に質問が大きく表示される画面レイアウトが目を引きます。

特筆するところもないですが、片手で操作する場合にも苦なく選択肢が選べるレイアウトで手軽に使うことができます。
質問の種類は少ないみたいですが、そう何度も使われないであろう事を考えるとその点も問題はなさそうです。

診断系は好きな人が多そうなので狙いどころのジャンルなんでしょうかね~。

2012年6月27日水曜日

AppStoreの審査に落ちました

先日審査を申し込んだアプリが10日ほど待った後に審査落ちしました。
Cordovaアプリ特有のもっさり感がいけなかったのかと思いきや「君のアプリはエンターティーメント性に欠けるんだよねぇ」みたいな感じの英文でのご返答でした。

軽い気持ちで審査に申し込んだので仕方ないですね。

作っていたのが元々シンプルなコンセプトのアプリだったのでどう調整して再申請するか悩みどころです。

【アプリをプレイ】犯人はお前だ!!!!

もう少し他のアプリももっと触れてみようかと思ってランキングからダウンロード。

「犯人はお前だ!!!!」です。


http://itunes.apple.com/jp/app/fan-renhao-qianda!!!!/id436603154?mt=8

事件仕立てですが、クイズでよくある数人の証言を見て「うそつきは誰か」を当てるゲームの亜種。
5人の証言には矛盾する箇所があり、その中から嘘を言っている人を見抜き、その上で犯人を当てるというもの。

嘘つきを当てる、というところじゃないのがミソかなぁ。

タイトルのわかりやすく良いし、ゲームのシンプルさにこだわってあえて解説アプリを分離してると推測。
推理モノというジャンル自体をうまくデフォルメしてるアプリでした。

2012年6月26日火曜日

JavaScriptのお勉強


Titanium Mobileを始める前段階として、一度JavaScriptの基礎を勉強しなおしています。

プログラマではないので「とりあえず動けばOK」と思ってやってきてますが、先日まで無名関数の存在を知らなかったり、グローバル変数に頼り気味になったりと、かなり無茶苦茶な事をやってきたので良い機会と思いこちらのサイトをみて勉強中です。

http://astronaughts.net/titanium-mobile-%E9%96%8B%E7%99%BA%E3%81%A7%E6%9C%80%E4%BD%8E%E9%99%90%E7%90%86%E8%A7%A3%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA-javascript-%E3%81%AE%E3%81%93%E3%81%A8/

感覚的に覚えてきた部分が多いので、ところどころ用語の意味がわからずにひっかかったりしています。
ステップアップする為、がんばりたいと思います。

そして、先日AppStoreへの登録申請したアプリの結果がまだでません。
7~10日かかるという話は各所でみていたものの実際に待ってみると長い・・・。

2012年6月17日日曜日

AppStoreへの登録申請

予定通り作っていたアプリに区切りをつけ一度AppStoreに登録申請をしてみました。

とにかく英語ばかりで、かつての高校入試などで英文の意味が9割くらいわからなかったような自分にはまるで呪文などを見ているかのよう。
あちこちのサイトをみながらなんとか審査待ちの状態まで進めました。

こちらの記事はだいぶ新しいエントリでxcodeのバージョンも同じだったので最終的にはこちらを参考にした部分が多いかも。
xCode4.2くらいの記事でもだいぶ違うところがあるような感じです。

さて、あとは無事審査通過を待つだけですが・・・。
JQueryMobileを使ったページ遷移の挙動がおかしいので落ちてしまうかも!

骨伝道イヤホン

自転車で移動する時の為に骨伝道ヘッドホンを使っている。
http://goldendance.co.jp/product/p_ab29.html
自分が住んでいる仙台市では
高音量でカーラジオ、カーステレオ等を聞き、ヘッドホン又はイヤホンを使用して音楽を聞くなど、安全な運転に必要な交通に関する音又は声が聞こえないような状態で車両等を運転しないこと。 というのが条件。
多くの地域で運転中のケータイやヘッドホンを聞いての音楽が禁止されている。
地域にもよるかもしれないが、周囲の音を阻害しない耳をふさがないタイプの骨伝道ヘッドホンは大丈夫・・・らしい。
ということで何ヶ月か使っているのでその感想。
結論としては本格的に音楽を楽しむものではない、ということ。
まず、音質が良くない。
骨伝道というからには骨に響く重低音が楽しめるのかと思いきやそんなことはなく、むしろちょっとこもった感じの音しか聞こえない。
加えて出力が低い。
iPodTouchでは問題なく使えたけど他のプレイヤーで使ったらちょっと音が小さかった。
iPodでもラジオ等の会話が伴うものは何が言ってるのかぜんぜんわからない。
加えて、音漏れが結構するので静かな電車などでは使えないというダメっぷり。
そんな有様だけど周囲の音がはっきり聞こえる上に音楽も楽しめるというのは大きい。
音質云々も周囲の音と混ざって聞こえる分には気にならないレベル。
今後も使っていくつもりだけど、部品が安っぽいので壊れてしまわないかが今のところ不安要素だ。


2012年6月13日水曜日

TitaniumMobileへの関心

Cordovaでの実行速度の問題に直面し、よくPhoneGapとの比較対象にされているTitaniumMobileへの関心が自分の中で高まってきました。
あくまでWebアプリの範疇で動作するCordovaに対し、TitaniumMobileはネイティブに近い状態で動作するアプリが作れる開発環境。

その代償として敷居は若干上がりますが、今までCordovaでこまごましたところで躓いていた事を考えるとあまり大差はないのかも。

おまけにゲーム開発に向いたモジュールもあるとかで
http://d.hatena.ne.jp/infosia/20120108/1326002975
自分の中での期待が高まっている開発環境です。

とりあえずは今Cordovaで作っているアプリを完成させ、次はこっちの挑戦してみようかなとか思っています。

おそらく、iOSのデベロッパー登録等はそのまま活かせるでしょうから導入もその分早く済むんじゃないかと。

目標は今週土日で現アプリに区切りをつけ、月内にTitaniumで超小規模の何かを作る。
そんな感じにしてみたいです。

2012年6月10日日曜日

Cordova+iOSで、画面の自動ロックの防止

AppDelegate.mの

- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

に以下の行を追加。

[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
これだけで無操作状態でも画面が勝手に消えないようになりました。

PhoneGapは3倍遅い

Cordovaアプリを動かしていて、ブラウザで作っていた時より遅い気がしてたんですが、こんな記事を発見。

PhoneGap 1.1.0とSafariでJavaScriptの速度比較してみたメモ

ただでさえ通常のネイティブアプリに比べての制限が大きいというのに、更にこんな縛りがあるなんて・・・。
この状況はCordovaアプリの基礎として動いてるUIWebView(iOS)の仕様の為、Cordova1.7でも改善はされていません。

HTML5やJQueryMobileの勉強も兼ねているという部分も大きいので当面はCordovaと付き合おうかと思ってますが、時期をみて他の作り方も覚えてみようかなと思った記事でした。

2012年6月9日土曜日

その後のIIJmio128k

IIJmio 高速モバイル/Dミニマムスタート128プランを使い始めて1ヶ月になりました。

回線以外の問題で不便をすることはあるものの、速度自体には特に不満なく使っています。
主にブログやTwitterの閲覧、GoogleMapに使っています。
GoogleMapについて、IIJmioではA-GPSが使えないそうなのですが、少なくともL-04Cではしっかり現在地捕捉ができたのでナビ用途にも使えてます。

アプリのダウンロードをするときはWi-Fiのあるところで。

ちなみに問題というのは主に手持ちのL-04Cが原因。
・L-04C(root化済)を通してのテザリング時、何故かiPodからのインターネット接続ができなくなった。(ノートPCからの接続はOK)
・L-04CにカスタムROMを適用しているせいかたまに端末が落ちて数分間使えなくなる事がある。
・L-04Cのタッチパネルが暴走して意図しない動作をすることがある。
・バッテリの持ちがよろしくない。
・電話用のガラケー、音楽用のiPod、L-04Cの3台持ちになった。

などなど。恐らくL-04Cからの乗り換えで解消する問題が多いと思います。
節約を考えてのIIJmioなので、あまり頻繁に端末を買い換えるのもどうかと思うのですが、ISフラットで毎月5460円(auの場合)かかる事を考えればまだ安いです。

また、これまでは諸事情でauガラケーをガンガン使っていたのですが、こちらは一転して節約モードに入る事にしました。
ダブル定額ライトをダブル定額スーパーライトに、ケータイ安心サポートを解約しました。
いつもダブル定額の上限4200円に達していたので、IIJmioの月額費用を払う事を考えても3000円/月くらいの節約になる予定です。

2012年6月7日木曜日

Cordovaからの音再生その2

http://koyoy-lab.blogspot.jp/2012/06/cordova.html
からの続き。
iPodの音楽再生を継続させつつ、Cordovaアプリで音声を再生することに成功しました。
当初の読み通り、PGLowLatencyAudioプラグインにAVAudioSessionクラスを追加することで対応できました。
強引に組み込んだ感がありますので、動作保証はできませんが・・・。
Objective-Cの知識が無いので組み込みにあたっては
こちらのブログ記事、「RemoteIOでのオーディオ再生」がちょうどAudioSessionを使ってたので参考にさせてもらいました。

PGLowLatencyAudioAsset.hをこんな感じに変更。
#import <Foundation/Foundation.h>
#import <AVFoundation/AVAudioPlayer.h>
#import <AudioToolbox/AudioToolbox.h>
@interface PGLowLatencyAudioAsset : NSObject {
    NSMutableArray* voices;
    int playIndex;
    AudioUnit outputUnit;//aaaa
}
-(id) initWithPath:(NSString*) path withVoices:(NSNumber*) numVoices;
- (void) setupAudioSession;
- (void) play;
- (void) stop;
- (void) loop;
- (void) unload;
@end
あと、PGLowLatencyAudioAsset.mは、
まずinitWithPathの「self = [super init];」の次の行に
    [self setupAudioSession];
を追加。
更に、以下の内容を追加。
void InterruptionListener(void *inUserData,
                          UInt32 inInterruption)
{
    AudioUnit *remoteIO = (AudioUnit*)inUserData;
    if (inInterruption == kAudioSessionEndInterruption) {
        AudioSessionSetActive(true);
        AudioOutputUnitStart(*remoteIO);
        printf("EndInterruption\n");
    }
    if (inInterruption == kAudioSessionBeginInterruption) {
        AudioOutputUnitStop(*remoteIO);
        printf("BeginInterruption\n");
    }
}
- (void) setupAudioSession
{
    AudioSessionInitialize(NULL, NULL, InterruptionListener, &outputUnit);
    UInt32 category = kAudioSessionCategory_AmbientSound;
    AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
    AudioSessionSetActive(true);
}
といった感じでとりあえずはiPodの再生を止めずに音声の再生ができるようになりました。

2012年6月3日日曜日

Cordovaからの音再生

Cordovaを使ってのmp3再生について調べています。
HTML5標準の再生機能もありますが、その再生の都度ファイルを読みに行くのかレスポンスがあまりよくありません。
API等を使った場合にはその問題が大幅に解消されました。
尚、Xcode4.3.2Cordova1.6.0を使用しています。
【HTML5標準】→多重再生×、iPodの曲停止。そのまま移植できるのでWebアプリからの移植が容易。簡単に使えるけど再生指示を出してからのレスポンスは悪い。
使い方はあちこちに書いてあると思うので省略。

【Cordova標準のMediaAPI】→多重再生×、iPodの曲停止。レスポンスは比較的良い感じ。録音ができる。
使い方は公式サンプルを参照。(リンク先はCordova1.7)

【PGLowLatencyAudio】→多重再生○、iPodの曲停止(同時再生については後述)レスポンスは比較的良い感じ。
導入はちょっと面倒。使用方法を以下に記載。
  1. プロジェクトのPluginsにプラグインのiPhoneフォルダの以下のファイルをドラッグして投入。
    PGLowLatencyAudio.hPGLowLatencyAudio.mPGLowLatencyAudioAsset.hPGLowLatencyAudioAsset.mPGPlugin.hPGPlugin.m
    (PGPluginはこの辺からダウンロード)
  2. PGLowLatencyAudio.hを開き、以下の部分
    #import <PhoneGap/PGPlugin.h>

    #import <PGPlugin.h>
    に書き換える。
    書き換え忘れるとエラーに。
  3. Cordova.plistのPluginsに「PGLowLatencyAudio」を追加(keyとvalueの両方)。
  4. 使い方はサンプルを参照。
    phonegap-1.3.0.jsの部分を使用しているCordovaのバージョンに置き換えるのを忘れずに。
preloadFXを呼び出す場合は、AudioToolboxフレームワークを追加しておく必要があります。
(Androidの場合はSoundPoolクラスを使うらしい?)
しかしながらpreloadFXを使った場合に、ちゃんとファイルも読み込んでplay自体もSuccess扱いになるんだけども音がならないという問題にひっかかっています。
AudioToolboxではmp3が開けないという記述をみかけたのでwavやaifファイルも試したけど解決できずにおります。
(更に、シミュレータ上では再生されるという不思議)
通知音扱いなのでマナーモードだと再生されません。

追記)iPodの曲再生を止めたくない場合にはAVAudioSessionクラスを使えば良さそう。
しかし、それを使ったCordovaプラグインがなさそうなので、
PGLowLatencyAudioプラグイン辺りをいじって対応させるしかない・・・?
追記その2)
iPodの音楽との同時再生ができるところまで進みました→http://koyoy-lab.blogspot.jp/2012/06/cordova_07.html

2012年5月31日木曜日

Cordovaを使ったアプリへのiAdの組み込み その2

前記事に続き、自作アプリへの組み込みに挑戦しました。
前回同様、Cordova1.7.0とXcode4.3を使用。

自分にとってブラックボックスな部分が多いので、サンプルのindex.htmlのjavascript部分をjsファイルとして独立させ、
ほぼそのまま自作アプリに持っていってみました。
途中、ダブルクォーテーションが全角になってるとかいうくだらないミスで
ひっかかってしまうトラブルがありましたが、ほぼそのままの状態で動作しました。
広告の表示位置の変更がオリジナルの状態ではうまくできず、adAtBottomの指定を先頭に持ってくることで解決しました。
var gLastAdLoadedDate = null;
var gTotalAdsLoaded = 0;
var gTimerId = null;

/*この準備okな時に関数が呼んで欲しい関数*/
function onDeviceReady()
{
        //広告の表示位置。trueで下部、falseで上部に表示。
        var adAtBottom = true;
        window.plugins.iAdPlugin.prepare(adAtBottom);

        // 端末の方向をチェックして適切なサイズに修正する部分
        // 横向きの時に上手く広告が表示されない可能性有。
        window.addEventListener("orientationchange", window.plugins.iAdPlugin.orientationChanged, false);
        window.plugins.iAdPlugin.orientationChanged(true);//trigger immediately so iAd knows its orientation on first load

        //広告を表示させる。
        window.plugins.iAdPlugin.showAd(true);
        //
        // listen for the "iAdBannerViewDidLoadAdEvent" that is sent by the iAdPlugin
        document.addEventListener("iAdBannerViewDidLoadAdEvent", iAdBannerViewDidLoadAdEventHandler, false);
        // listen for the "iAdBannerViewDidFailToReceiveAdWithErrorEvent" that is sent by the iAdPlugin
        document.addEventListener("iAdBannerViewDidFailToReceiveAdWithErrorEvent", iAdBannerViewDidFailToReceiveAdWithErrorEventHandler, false);
        setTimeout(function() {
                             window.plugins.iAdPlugin.prepare(adAtBottom); // by default, ad is at Top
                             }, 1000);
}

function iAdBannerViewDidFailToReceiveAdWithErrorEventHandler(evt)
{
        //alert(evt.error);
        window.plugins.iAdPlugin.showAd(false);
        var elem = document.getElementById("showAd");
        elem.checked = false;
}

function iAdBannerViewDidLoadAdEventHandler(evt)
{
        // if we got this event, a new ad is loaded
        var elem = document.getElementById("lastAdLoaded");
        gLastAdLoadedDate = new Date();
        elem.innerHTML = gLastAdLoadedDate.toLocaleString();
        elem = document.getElementById("showAd");
        elem.disabled = false;
        elem.checked = true;
        window.plugins.iAdPlugin.showAd(true);
        gTotalAdsLoaded++;
        elem = document.getElementById("totalAdsLoaded");
        elem.innerHTML = gTotalAdsLoaded.toString();
        if (gTimerId) {
                clearInterval(gTimerId);
        }
        gTimerId = setInterval(lastAdLoadedInterval, 1000);
}

function lastAdLoadedInterval()
{
        var now = (new Date()).getTime();
        var diff = now - gLastAdLoadedDate.getTime();
        var elem = document.getElementById("lastAdLoaded");
        var ms_in_a_year = 31449600000; /* 1000ms x 60s x 60m x 24hrs x 7d x 52w */
        var ms_in_a_week = 604800000; /* 1000ms x 60s x 60m x 24hrs * 7d */
        var ms_in_a_day = 86400000; /* 1000ms x 60s x 60m x 24hrs */
        var ms_in_an_hour = 3600000; /* 1000ms x 60s x 60m */
        var ms_in_a_minute = 60000; /* 1000ms x 60s */
        var ms_in_a_second = 1000;       
        var milliseconds = Math.floor(diff);
        var seconds = Math.floor(milliseconds / ms_in_a_second) % 60;
        var minutes = Math.floor(milliseconds / ms_in_a_minute) % 60;
        var hours = Math.floor(milliseconds / ms_in_an_hour) % 24;
        var days = Math.floor(milliseconds / ms_in_a_day) % 7;
        var weeks = Math.floor(milliseconds / ms_in_a_week) % 52;
        var years = Math.floor(milliseconds / ms_in_a_year);
        var caption = seconds + "s ago";
        if (minutes > 0) {
                caption = minutes + "m " + caption;
        }
        if (hours > 0) {
                caption = hours + "h " + caption;
        }
        if (days > 0) {
                caption = days + "d " + caption;
        }
        if (weeks > 0) {
                caption = weeks + "w " + caption;
        }
        if (years > 0) {
                caption = years + "yr " + caption;
        }
        elem.innerHTML = caption;
}

function showAdClicked(evt)
{
        window.plugins.iAdPlugin.showAd(evt.checked);
}

//広告消す
function AdFalse(){
        window.plugins.iAdPlugin.showAd(false);
}
//広告出す
function AdTrue(){
        window.plugins.iAdPlugin.showAd(true);
}

追記)横向きのときに広告エリアのサイズがおかしくなってしまう現象を確認しました。
サンプルでは問題なく、JQuerymobileを使ってる自作アプリで発生したのでJQuerymobileと
併用したときに発生する現象かも。なんとかしたい。

Cordovaを使ったアプリへのiAdの組み込み

アプリの審査申請にはまだ早いのですが、アプリ内広告の組み込みも試してみたかったのでiAdについて調べています。
このあたりの日本語ドキュメントがほとんど見つけられずとても苦労しています。

とりあえずサンプルを動かすところまでできたので一度手順をまとめておきます。

しつこく書いておきます。Phonegap(Cordova)は全然簡単じゃないです!
Webアプリをそのまま移植する場合はお手軽だけど、APIを使おうとした途端に難易度が跳ね上がります!

で、今回はXcode4.3とCordova1.7.0を使用しています。

 

参考にしたのはCordovaのAdPluginの組込み手順
https://github.com/phonegap/phonegap-plugins/tree/master/iOS/AdPlugin
と、Working Ossanさんのこちらのページ。
http://working-osan.blog.so-net.ne.jp/2011-09-14-2
※バージョンが違う為、Working Ossanさんのサイトの手順そのままではうまく動きません。

1)iAdのプラグインのzipふぁいるをダウンロードして解凍する。

2)解凍したファイルの中、iPhone/AdPluginのファイルをプロジェクトにコピーをする。
  SAiOSAdPlugin.js(とサンプルを試す場合はindex.html)をプロジェクトのwwwフォルダにコピー。
 サンプルのindex.htmlを使用する場合はcordova-x.x.x.jsを読み込んでる箇所があるので、
 使用しているCordovaのバージョンに修正する事。
 もちろんwwwフォルダにcordova-x.x.x.jsもコピーしておく必要があります。

 SAiOSAdPlugin.hSAiOSAdPlugin.mをXcodeのPluginsにドラッグアンドドロップ。
 「Copy items into destination group’s folder (if needed)」にはチェックを入れない。

iad1 

3)iAdフレームワークをプロジェクトに追加する。
TERGETS→Build Phases→Link Binary With Librariesを開き、+をクリックしてiAd.frameworkを追加する。
Link Binary With Librariesが2つあるけど上の方に追加する。

iad2
4)Cordova.plistのPluginsにSAiOSAdPluginを追加する。
 iad3
4)自前のhtmlに組み込むときはいろいろ修正。ヘッダにjs読み込む部分入れたり。
 このあたりはこれから試していくところ。

<script type="text/javascript" charset="utf-8" src="cordova-1.7.0.js"></script>
<script type="text/javascript" charset="utf-8" src="SAiOSAdPlugin.js"></script>

サンプルのindex.htmlを実行すると表示になりました。多分これで成功みたいです。
IMG_0172

まだ解決していない問題があって、ネットに接続されていない場合に、
以下の表示がされてアプリがそれ以上動作しなくなる事。
ネットワークに接続後アプリを再起動する必要があります。
追記)サンプルのindex.htmlの「alert(evt.error);」をコメントアウトすれば大丈夫そう。
IMG_0171 
iAd広告のドメインに接続できないよ!みたいな事なのかな。
あと、pluginのファイルを解凍したときにiOSフォルダとiPhoneフォルダが別にあるのも不明。
少なくともシミュレータ上ではiPhoneフォルダのファイルを使ってiPad上でも動作しています。

組み込みにはもう少し時間がかかりそうです。

2012年5月30日水曜日

CordovaからSafariにリンクする

自分のサイトへのリンク等の外部URLをクリックした時、アプリから抜け出してブラウザで開くようにしたかったのでその対応をしました。

以下のサイトを参考にしました。
http://blog.bbtune.com/archives/1376/external-link-to-safari-phonegap-ios

しかし、そのままではXcode、PhoneGapのバージョンが違うせいなのかうまく適用ができませんでした。
(Xcode4.3&Cordova1.6を使用)

試行錯誤した結果、Classes>MainViewController.mに下記の内容を追加することでうまくSafariで開けました。
(「- (BOOL) webView:(UIWebView・・・」がコメントアウトされていたのでそれは放置)

- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL *url = [request URL];
    if( [[url scheme] isEqualToString:@"http"] || [[url scheme] isEqualToString:@"https"])
    {
        [[UIApplication sharedApplication] openURL:url];
        return NO;
    }
    else
    {
            return [super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType];
    }
}

Objectb-Cの事はわからないので大半は参考サイトのものを転用しています。

2012年5月29日火曜日

JPEGを用いたアニメーション

File機能は一旦やめてJPEGを用いたアニメーションを試しています。

アニメGIFのようなパラパラアニメで、複数のページを参考に試していますが、いずれも全フレームの画像を横(縦)に並べた巨大なJPEGを用意してそれをJavascriptやCSSを利用してアニメーションさせる方法をとっています。
動かすまでは割りとあっさり成功しました。

参考にしたのは以下のページ。
CSS SpritesとCSSアニメーションでコマアニメを作る
アニメーションgifならぬアニメーションjpg/png
AfterEffectsを使ったiPhone用アニメーションjpegの作り方

1つめはCSS、2、3個目はJavascriptで実現しているみたいです。3は試しておらず。
Cordovaにはまだ落としこんでおらず、mobileSafari上で1,2を試してみましたが問題無く自分のアプリに組み込めそうです。

CSSだけで実現できる1つ目が導入が簡単ですが、

0% { background-position: 0px 0px; }
1% { background-position: -1px 0px; }
2% { background-position: -2px 0px; }
3% { background-position: -3px 0px; }
4% { background-position: -4px 0px; }
5% { background-position: -5px 0px; }



100% { background-position: -100px 0px; }

みたいに細かいアニメーションをさせようとするとCSSが長くなってしまうのが難点でしょうか。
また、1の方法だとScaleX、ScaleYを変更することで拡大縮小ができましたが、2の方ではうまくできず。

今回、20000x800の画像を使用しましたがちゃんと動作しました。

ただ、きちんとRetinaディスプレイを想定したサイズの画像を用意した割にジャギーのようなものが入ってしまい、今後の課題となりました。
ひとまずはアニメーション成功といった感じで終了です。

2012年5月20日日曜日

続File機能

最近はあまり進歩がない状況です。
ファイルからの読み込みサンプルを試してみたってくらいです。
サンプルだとテキストの保存、読込をやっているんですが複数の変数を保存して管理したい場合はどうしたら良いんだろう。
テキストで一括で取得してから各変数に分ければ良いのかなぁ。

Javascriptを使いこなせてないので今ひとつわかってません。
おとなしくLocalStorageを使っておくべきか。

ファイル書き込みの方については、こちらのページがサンプルの1つを和訳しているので参考になりそう。
http://dev.web-app.jp/?p=172

ちょっと違うけど一応チェック。
http://d.hatena.ne.jp/hagino_3000/20111122/1321897281
ストアの審査をはさまないでのちょっとしたアップデートの方法に関しての記述。

2012年5月15日火曜日

CordovaのFile機能を試している

Cordovaでのファイル保存を試しています。

特にLocalStorageだけでも問題はないかと思ってますが、ものは試しにと思って使ってみています。
例によって日本語ドキュメントは記述がPhoneGap時代の古いもので、どうやら新しいものとは差が大きいみたいです。
日本語ドキュメントのサンプルはうまく動作しませんでした。

現時点での最新は1.7ですが、使用しているのが1.6なので下記のドキュメントのサンプルを試してみました。
http://docs.phonegap.com/en/1.6.0/cordova_file_file.md.html#File

今日はFileWriterを試してみましたがサンプルそのままで問題なく動作。
もっとも、読み込みを試していないので本当に保存されているかまでは確認していません。

英語が苦手なのでまだいまいち内容も理解不足気味。

あとデバッグ方法もなんとかしたいのだけどどうしたら良いのかわからず困っています。
スペルミス等があるとJavascriptがまったく動作しない事があり、原因がわからなくて右往左往。
どうしたものかなぁ。

今日覚えたこと:ファイル機能については日本語のドキュメントは参考にならなそう。

2012年5月10日木曜日

IIJmioのSIMが届いた

3日頃に申し込んでいたIIJmio 高速モバイル/Dミニマムスタート128プランのSIMが届きました。
さっそく手持ちのDOCOMO L-04Cにさして遊んでみました。
294998_288639057892414_100002389654910_611879_2080947726_n

結果としては他のブログ等に書かれている情報どおり。
128kといいつつ速度チェックで150kbps近い数字を叩き出したりしてくれます。
3度ほどやって100~150kbpsあたりだったのでほぼ表記どおりの速度がでてると見てよさそうです。

地図、普通のサイト閲覧レベルなら問題はなく、動画は厳しい。低ビットレートのものならなんとかみれる場合があります。
たまに聞くネットラジオサイト「音泉」は普通に聞けたのが満足。

ちなみに、ルート化しているのでテザリングしてPC、iPodToucからも接続してみました。
iPodからの接続に関しては、位置情報もキチンと伝わっているみたいです。
PCからも割と問題なく使えますが、GoogleMapは表示に時間がかかります。

手持ちのガラケーがauなので、Wi-Fi WIN対応機種にすればそちらの通信もフォローできそうですが今のところは保留です。
Wi-Fi WINの契約が必要、対応端末が必要、いつスマホに機種変するかもわからない、などの点を考えると導入費分を回収できるか微妙なので。

しばらくはこれで遊んでみたいと思います。

2012年5月9日水曜日

目下の目標

iOSでの連絡先の取得がうまくでき、自分の目標とするアプリが実現できそうなところまできました。
一応、メールのテンプレソフト的なものを完成させるのが目標です。

送信先を選択(送信先はiPhoneの連絡先を参照して登録しておける)

文章を選択

といったシンプルなものです。現在地情報もつけたいと思っています。
UIにはJQuery mobileを使用します。

次の課題としては選択した連絡先をアプリ側に登録する部分です。
恐らくLocalStorageを使うか、CordovaのAPIからファイルアクセスするかの2択になりそう。

少し調べてみる必要がありそうです。

Cordovaでの連絡先取得の問題がほぼ解決

連絡先一覧の取得ができず悩んでいましたが、
単純にfilterのオプションにある複数の連絡先取得の指定をしていなかった為でした。

options.multiple = true;

この指定を入れるだけで複数件が取得できるようになりました。

続けて、メールアドレスの取得に挑戦しました。
フィールドにemailsを指定します。

var fields = ["displayName","emails"];

取得したcontactに入るemailsは配列の形で取得される点に注意。

emList=contacts[i].emails;
for (var k=0; k<emList.length; k++){
    alert(emList[k].value);
}

ここでまた別の問題としてフィルタの処理がうまく動かなくて悩んでいます。

とりあえず、displayNameでの絞込みが効かないみたいで、フィールドをdisplayNameではなくnameにし、取得の際はcontacts[i].name.formattedみたいな形にすることで絞込みができました。
が、どうやら全角文字での絞込みができないみたいでそれがまだ未解決の状態です。

まだまだ悩み中。

追記)
と思ったら、ヘッダにutf-8の指定をしただけであっさり解決しました。
javascript側にだけ指定をしてたのでそのせいでしょうかね。

<meta charset="utf-8" />

プチまとめ)
・日本語訳のドキュメントは古いPhoneGap向けのものなので注意。
 「navigator.service.contacts.find」のserviceの部分が不要。
・iOSでcontact.findするときはdisplayNameの使用は避ける。nameを使うのがおそらく無難。
・ヘッダでutf-8の指定をしておかないと全角文字での絞込みができない。
・「(options名).multiple = true; 」の指定がないと結果が1件しか返ってこない。

ようやく連絡先一覧の取得ができるようになった感じです。

2012年5月6日日曜日

Cordovaからの連絡先参照ができない

アプリ中でiPhoneの連絡先を参照したいのですが、うまく行かず苦戦中。
尚、デベロッパ登録しておらず、実機テストはできないのでiOSシミュレータ上でのテストです。

一度、サンプルを試してみようと思って以下のサイトのcontacts.findの部分をテスト。
http://docs.phonegap.com/jp/0.9.5/phonegap_contacts_contacts.md.html#contacts.find

そのままでは動かなかったので
まず、

<script type="text/javascript" charset="utf-8" src="phonegap.0.9.5.js"></script>

の部分はCordovaに置き換え。
次に、


navigator.service.contacts.find(fields, onSuccess, onError, options);

の部分。
そのままだとうまく動かなかったのですが、英語版の新しいドキュメントを見たところserviceを省いた記述をとってたので修正。

この時点で一通り動くようになりました。
でも返ってくる値がおかしい。

10件弱テスト用のデータをiOSシミュレータに登録しているのに、検索条件無の状態で1件しか出てこない。
検索条件を何かしら指定すると0件。
フィルタの指定がうまく動いてないのと、連絡先の情報をうまく取得できていないのの2点が原因かと思うのですが・・・。


可能性としてはこんなところでしょうか。


・実機以外ではうまく動作しない
・iOSシミュレータへの連絡先の登録の仕方が間違っている
・xcode、iOSシミュレータに参照のための設定箇所がある。


さっぱりわからなくて困った・・・。
実機で試してみるべきだろうか・・・

2012年5月5日土曜日

コンプガチャの中止要請-SNSアプリの終焉を迎えるか?

今朝、1つ気になるニュースがありました。

消費者庁がソーシャルゲーム『グリー』や『モバゲー』のコンプガチャを景品表示法で禁止と判断! 中止要請へ

現在の国内SNSアプリ市場で主流となっている販売スタイル「コンプガチャ」を禁止しようとする動きです。
まだ、具体的な方針は打ち出されていないようですが、これを境に何かしらの変化はあることでしょう。

いつかカードゲーム(と言う名のガチャ商法)バブルの終わりが来るとは思ってましたが、こんな形で終わりを迎える事になるとは。
本来、常にユーザーにお金を使う判断はゆだねられているので問題になる事はないはずなのですが、
市場の規模が大きくなりすぎた事で、「勢いで大金を使ってしまう事がある」現在の販売スタイルを無視できない状況になってしまったんでしょうね。

今後どうなっていくか考えてみました。

1)とか言いつつ何も変わらない。
 これ以上の話の展開が無いこともあるやもしれません。
2)抜け道を見つけて結局似たような販売方法が続く
景品表示法で禁じる懸賞にあたる、のが問題との事。
そこで、問題となる部分を変更するだけで中身は変わらないかもしれません。
3)新たな主流の商法が作られる
 SNSアプリの今後を考えるならこれでしょう。
 ただし、ユーザー自体が現在の課金スタイルに慣れていると思われるので、移行には時間がかかるかもしれません。
4)国内は見捨てられ海外展開へ
 進撃のバハムートが海外で成功しているという話を聞いたことがあります。
 今回の件の適用範囲を良く知りませんが、国外市場に可能性があるのなら・・・?

現時点でどの部分までが景品表示法にひっかかっているのかわからないので、2のようなケースであっさり解決する事もありそうですが、遅かれ早かれ3の流れになるんではないでしょうか。
元々、SNSアプリ市場はできて年月の浅い市場なので、販売スタイルのブームが移り変わりがあるのが常です。

デジタルデータのガチャに大金を出す時代がくるなんてかつては考えられない事でした。
また思いもよらない販売方法が現れ、市場を賑わす事になるんじゃないでしょうか。

今後の動きが気になって仕方ないです。

追記 2012/5/5 9:00)
実際に記事が載っている新聞を購入してみました。
問題となっているのは景品表示法で「カード合わせ」に該当する、いわゆるコンプガチャが問題になっている模様。
つまり、コンプ要素が無ければガチャ自体は問題ないようなので現状から大きく変わることはないかもしれません。

2012年5月4日金曜日

PhoneGap=Cordova最初の一歩

HTMLとJavaScriptでアプリが作れるという甘い囁きに釣られたPhoneGap。
最初につまづいたところが何箇所かありました。

・利用環境
Mac(Xcode4.2.1)
PhoneGap1.6

Q.PhoneGapが落とせない

PhoneGapのサイトでダウンロードボタンを押してもCordovaってソフトしか落とせない

フレームワークの名前が変わってました。
http://www.infoq.com/jp/news/2012/03/Adobe-Cordova-PhoneGap

まだ名称が変わってから日が浅くCordovaに関する情報が少ないみたいです。
PhoneGap関連の情報サイトをみるときも一部記述が違うので注意。
大きくはphonegap.jsを読み込むタイミングで使用するファイルがcordova-x-x-x.jsみたいなファイルになっている点かと思います。

あとはプロジェクト作る際の種類がCordova-basedになっている点も。
 スクリーンショット 2012-05-04 7.16.39

Q.なんか実行できない1。

プロジェクトを作成してもindex.htmlをどこに作っていいかわかりませんでした。
これについては、別に用意したwwwフォルダをxcodeのウィンドウにドラッグする事で解決。

確認画面が出るので「Create folder references for any added folders」を選びます。
スクリーンショット-2012-05-04-7.19.11 

xcode画面に青いwwwフォルダが追加されればOKでした。
スクリーンショット-2012-05-04-7.20.25 

Q.なんか実行できない2

外部ファイルを読み込もうとする時に(jsファイルとか)修正が必要な箇所があります。
よくは理解してないんですが、外部参照するURLを許可してあげないといけないとか・・・?

とりあえず
Supporting.Files>Cordova.plist>ExternalHostsのItem 0 に * を設定してあげればOKみたいです。
スクリーンショット 2012-05-04 7.14.56 

PhoneGapが簡単って書いてる本・サイトがあったらそれは嘘です(笑

2012年5月3日木曜日

IIJmioの高速モバイル/Dを申し込む

スマホとしてDOCOMOのL-04Cを持っているのですが、諸事情でAndroidでサイトの表示確認するためにかった中古の端末です。
自分のケータイはauのガラケーで、理由はバッテリの持ちとかなんとかあるんですが、まだまだスマホ移行しないつもりでいます。

でもスマホはスマホで使いたい気持ちがあって安価な回線を契約しようかずっと悩んでいました。

有名なところで日本通信のB-mobile、その派生のイオンSIMやヨドバシ基本0円SIM、もう少し新しいところだとBIGLOBE3Gなんていうのも。
BIGLOBE3Gは家庭用の回線としてBIGLOBEを使っているので興味が強かったのですが、新規受付に制限を設けているのでなかなか申し込みができず。

イオンSIMは良いうわさを聞かないし、ほかの回線は大方3000円/月程度。
もう少し良いものはないかと悩んでいたところでIIJのmio高速モバイル/Dを発見。
https://www.iijmio.jp/guide/outline/hdd/

他所の情報によれば、イオンSIMと同等でありながら(今のところは)良いパフォーマンスを発揮してくれるとか。
IIJmio 高速モバイル/D を使ってみた
IIJmioの高速モバイル/Dのミニマムスタート128契約した
IIJmio高速モバイル/Dサービスを申し込んでみた

月1000円程度でイオンSIMよりの早い(らしい)。しかもクーポンを購入することで必要に応じて高速回線としても使える。
これこそ待っていた回線だ!と思って申し込みをしました。
まだ申し込んだばかりで届いていないのですが。

しかし、うっかり標準SIMで申し込んだことを唯一後悔しています。
microSIMならアダプタで標準サイズとして使えるのだからmicroで申し込めば良かったなぁ。

解約金がかからないので、いざとなったらmicroを新たに契約するなりSIMカッターで強制micro化するなり手段はあるのでとりあえずは良しとしておきます。
到着はGW明けでしょうか。楽しみです。

開発環境

まだこのブログを活用していけるかわからないけどとりあえずはじめてみました。

プログラマではないのでたいした事はできないけれど、いくつか作ってみたいアプリがあり、Macを買ったのをきっかけに何ヶ月か前からアプリ作成に向けて勉強中です。

とりあえず開発環境として
・WindowsのPC(Win7)
・MBA 13インチ(MC965J/A)

テスト環境として
・DOCOMO L-04C(root化済 Android2.3.7)
・iPod touch(第4世代 iOS5.1)

を所有しています。
Macに関してはまだ購入から半年も経ってないのですが、今時点ではMac+iPod touchでiOS向けのアプリを作ろうと模索中です。
尤も、PhoneGapを使用しているのでAndroid向けとしても出したいところです。

htmlやJavaScriptは多少触れるもののjquery等に関しては今回初めて触っています。
とりあえずここまで。

2012年1月22日日曜日

その後のクリップ

昨年末にハーフクリップを装着した後、実家への帰省、年明け早々の風邪で2週間ほど自転車に乗れない日々が続いていて、先週からやっと乗れるようになった。
通勤程度くらいにしか使ってないけど感想をざっと書くと、
  1. 足をひっかけるアクションが増えるので、信号が多い街中だと面倒。
  2. 自転車を押している時に地面にクリップが当たると言う情報があったけど、ペダルの高さが違うのかあまり問題無し。
  3. ビンディングペダルと違って(使ったこと無いけど)普通の靴で乗れるのでお手軽。
  4. サイコン絶賛紛失中で使用前後の速度の変化がわからない。
といった感じで、普段の乗り方程度では変化がわからない。
ていうかサイコンなんとかしないとね。
あー、早く暖かくならないかな~。


2012年1月15日日曜日

無線LAN親機の買い替え

MBAでの生活にも慣れたもので、たまにWindowsマシンでCtrlを押そうとしてMacのcommandの位置に手をやってしまうことがあるほどに。稀にだけど。

MBAはLANポートがないので無線LANで接続しているわけだけど、その無線LANの調子が最近悪い。たまに接続が切れてしまって親機の再起動をしてあげる必要がでてきた。
今まで使ってきたのが以下のもの。どうやら6,7年は使ってきたらしい。今までお疲れ様でした。
http://www.planex.co.jp/product/bwave/brcap04.shtml
とりあえず無線LANに接続できれば良いかなと思ったので安かった以下の製品に。IODATA。
http://www.iodata.jp/product/network/wnlan/wn-g300dr/
MBAやiPodTouchの接続もなんなく成功。
おまけにプリンタも接続できる!簡易プリントサーバ万歳!と思ってプリンタもつなげてみた。
見事に印刷もできた。でも、これ簡易プリントサーバ機能じゃなかった。
あくまでUSB機器をLAN経由で使用しているだけだった。その点はちょっと残念
でも逆にその仕組みのおかげでUSB機器なら割となんでもいけるのかもしれない。
手持ちのプリンタも、本来なら純正プリントサーバじゃないとネットワーク化できないと聞いていた。

ひょっとしてUSBのオーディオ出力とかをつなぐとネットワーク経由で音を鳴らしたりもできるんだろうか。擬似AirTunes。
気が向いたら何か試してみよう。


2012年1月9日月曜日

MacBookAirを購入

IMG_0084
昨年末、以前から欲しいなぁと思っていたMacを購入。
MacBookAirの13インチ128Gモデル。
主なきっかけは以下の3点。
1)PC持参のとあるデザイン系の講座に行ったら大多数がMacだった。
2)iPodTouchを持っているのでiOSアプリに手を出してみたかった。
3)手持ちのノート(ネットブック)の解像度や発色に不満があった。
Adobeのソフトを買いなおさなきゃいけない、という大きな不満があったけどそこは後で考えよう、と思って最終決断。
安価なMacMiniも候補にあったが、帰省時に持っていけるという利点を考えてMacBookAirに。

ちなみにAdobeのソフトの問題は、Parallels Desktop 7 for Macを買って手持ちのXPをインストールすることで解決。
(PD7に行き着く前にWineも試した。フリーの割にはなかなかよく動いたと感心。)
で、夢のMacライフが始まってようやく2週間ほど経つ。
まだ理解できてない機能が多いけど、トラックパッドでの操作がとにかく心地良く、ブラウジングするだけならフォントもきれいなMacに分がある。
しかし、他の面ではWindowsの方が自分のやりたいことができるな、という印象。
Macに完全移行したWindowsユーザがいると聞くけど自分はそこまでではなかった。
とりあえずそのあたりの不満はParallels Desktop 7 for Macで大きく解消されているので当面はMacBookAir中心の生活を送ってみようと思ってる。