2011年12月31日土曜日

紅白FLASH合戦に参加しました。

思春期の若者は再生注意だぜ!


【ニコニコ動画】dead incarnation
movie : hmtbsmv
music : retroshadowz
produced by www.psychedesire.org

Exhibit for The Annual Flash Contest heldon New Years Eve in 2011
http://flash-rw.com/

http://psychedesire.blogspot.com

This Movie was Made by MMD and Other Tools.
Thanks to PMD Modelers,3DS Modelers.


というわけで、紅白FLASH合戦に参加しました。
動画イヴェント自体は、エイヤッサというイヴェントが最後かな?2005年?
http://eiyassa.net/05/
これ以来ですねー。

MMD使ったのがちょっとアレだったーっていう声があったので、
反省したりもしてるんですけど、アニメが簡単に作れるので、
使わないのがもったいないなーと思いますよ。うむ。
もっとFLASHと絡めていきたかったけど、
なかなか難しいなーという感じでした。
踊ってる初音ミクの横を矢印が走る動画なんて、
今更目新しくもないんだろうしねぇ。
もっと、ストーリもあって、音楽もあって、みたいなのが作りたいですねー。
MMDだとアニメ作るの簡単だからねー。面白い面白い。
紅白もMMDおっけーになったみたいだし、
もっとみんなやればいいですよ。ええ。難しいけどね。

2011年12月30日金曜日

紅白FLASH合戦2011に参加します。

あー。というわけで、紅白FLASH合戦に参加致します。

公式サイトは

http://flash-rw.com/

です。
公式サイトに載っている情報を書き換えたら、
このブログのアクセス数がなんと3倍になりました!
20が60になりました!やったね!
何にも載ってないのにね!ごめんね!来た人たち!

私めの作った動画は、
31日の5回戦目(最後の対戦)の赤組となります。

http://flash-rw.com/timetable.php

一番下の、なんだろうくんというやつです。
最初名前どうしようか迷ってたから、適当に名前入れたらそのままになっちゃったよー。
まぁいいんだけどね。

そんな感じでした。
発表をお楽しみにお待ちくださいませませ。

あ、関連リンク集です。

[公式掲示板]■ 紅白FLASH合戦2011 議論スレッド
http://flash-rw.com/bbs/test/read.cgi/rw2011/1312734441/l50


[Twitterハッシュタグ]
http://twitter.com/#!/search?q=%23flashRW

[ニコニコミュニティ]2011年 紅白FLASH合戦
http://com.nicovideo.jp/community/co5520

Enjoy !! :-)


2011年12月26日月曜日

Titaniumで作ったAndroidアプリがデベロッパーコンソールでバージョンアップ出来ない

というわけで、アプリのバージョンアップをしたのですが、
ここでも躓きました。
直したアプリをアップロードしようとしたら、

“The new apk’s versionCode (1) already exists.”

というエラーが出たわけです。

なんでやっ!と思って調べてみたら、


 TitaniumでAndroidアプリのバージョンアップ
 http://www.sawadaru.com/blog/?p=220

こうやって直せば良いわけです。
上のサイトのリンクからたどると書いてありますが、
Titaniumプロジェクト直下(/Resources とか tiapp.xml と同じディレクトリ)に
platform というディレクトリを作り、
更にその中に android というディレクトリを作り、
その中に、
/build/android/AndroidManifest.xml
をコピーしていれて、
その
AndroidManifest.xml
の最初ら辺にある、


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.www.testApp"
android:versionCode=" ここをインクリメント 1 になってたら 2 にする"
android:versionName="バージョン番号 1.0 だったら、1.0.1 とか 1.1 とか">

こんな感じで書き換えます。

以上!勉強になりました。忘れないようにメモ。

忘れないように!と言えば、

PHP で $json = json_decode($jsonStr);
したら、
{"hoge":"huga"}

print($json["hoge"]);
じゃなくて
print($json->{'hoge'}); // huga

これです!連想配列じゃないよ!
忘れるな!俺!


[versionup]Beholdr 1.0.1

Android用ソーシャルフィードリーダ Beholdr のバージョンアップをしました。

一部RSS・2ちゃんねるの購読時に不具合があったことの修正です。




あと、RSSがきちんと取得できていなかった部分を直しました。

Androidマーケットでアプリを公開しました。

 というわけで、取りあえず、公開しちゃいましょうということで、
公開してみました。

いきなりハードルをあげて、300円という値段をつけています。
いいね。勇気があるね。気持ちが違うね。うん。

https://market.android.com/details?id=org.psychedesire.www.beholdr

market://search?q=pname:org.psychedesire.www.beholdr

Beholdrというアプリケーションです。
ソーシャルフィードリーダというカテゴリを名乗ってみました。
どういうアプリかというと、
Twitter/Facebook/Tumblr/FriendFeed/Identi.ca/Flickr/Last.fm/Wassr/はてなハイク/LifeSpaceTime
の更新情報が、ひとつのタイムラインに流れてくるというものです。
また、GoogleReaderの購読リストを取り込んで、その内容を表示することも出来ます。
あと、2ちゃんねるのスレッドを購読することで、2ちゃんねるのスレッドの書き込みも表示できます。

なかなか、大変な思いをしましたが、
出来上がったので満足です。

mixi とか GREE の更新も取得できるようにしたいのだけど、
クレカがなきゃだめだとか、法人じゃなきゃだめだとかで、めんどくさいです。
他に追加して欲しいソーシャルサービスとかあったら教えてください。

いきなり300円だと誰も買わないと思うので、
Twitter と 2ちゃんねると RSSの3種類に限定した、
無料の評価版を作ろうと思います。
まぁ、機能削るだけだから、すぐ出来るとと思います。

あと、購読RSSのところにプリセットするブログとかを探して、
色々メールさせてもらったんだけど、なかなかお返事貰えませんでした。

Androidアプリの情報を取り扱ってるオクトバさんからOKを貰えたので、
プリセット登録させていただいております。
オクトバさん、ありがとうございました!!

2011年12月18日日曜日

Titanium の WebView では AnimationGIFが動かない

な、なんだってー!!

http://developer.appcelerator.com/question/49181/run-animated-gif-image-in-webview-on-andorid

http://developer.appcelerator.com/question/68971/does-imageview-support-gif-file

ということで、

Titanium.UI.ActivityIndicator 使えよってことらしいです。
オブジェクトイヴェントが無駄に増えるお…
APIドキュメントはこちら…

http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.UI.ActivityIndicator-object

Titanium で Facebook連携

Titanium Mobileで作る! iPhone/Androidアプリ 第21回 Facebookとの連携
http://gihyo.jp/dev/serial/01/titanium/0021

大体は、ここに載っているとおりに書いて大丈夫なんだけど…
動かしてみるとエラーになる。

[Titanium Mobile]Facebook と連携するとエラー
http://d.hatena.ne.jp/oreflow/20110517/1305636612

ここにあるように、tiapp.xml を書き換えなきゃならないらしい。
というわけで、書き換えてみる。

んで、適当に技評さんの記事を基にログインしてみるが、

I/Database(  318): sqlite returned: error code = 14, msg = cannot open file at source line 25467

というエラーが発生して動かず。
ログイン関連の情報をSQLiteに保存しようとしてエラーが出ているのかな?
エミュレータだから出ているのかもしれないけど、
あとあと面倒くさそうなので、
自分でFacebook用にOAuth認証をこさえる。

こさえると言えても、以前にJSで動かすものは作っていたので、それを使えば良いだけの話である。
まぁ、SSLを超えられなかったりするから、当時は俺以外の人間に使わせられなかったのだけど、
アプリの中に埋め込むとなると、色々と制約も取れるので、良い感じ。

すげー長いしキモイけど、ザザザっと書いた。


var cid         = [your client id];
var aSec        = [your app secret];
var redirectUrl = [your redirect url]
var authUrl = "";
    authUrl += "http://www.facebook.com/dialog/oauth";
    authUrl += "?client_id=" + cid;
    authUrl += "&redirect_uri=" + redirectUrl;
    authUrl += "&scope=publish_stream";
var faceWin  = Ti.UI.createWindow({title:"faceBook認証"});
var faceView = Ti.UI.createWebView({url:authUrl,scalesPageToFit: true,touchEnabled: true});
faceWin.add(faceView);
faceWin.open({animated:true,fullscreen:true});
var loads = 0;
var cnt = 0;
var inc = 1;
faceView.addEventListener('load',function(e){
    loads++;
    if(loads==cnt){
        var t = setInterval(function(loads){if(loads==cnt + inc){clearInterval(t);return;}},100);
    }else if (loads==cnt + inc) {
        var pincode = faceView.evalJS('window.document.body.innerHTML');
        pincode     = pincode.replace(/\s|\r\n|\r|\n|\t/gi,"").replace(/.*.<code>|<\/code>.*./gi,"").replace(/\s|\r\n|\r|\n|\t/gi,"");
        if (pincode != "") {
            // my attempt at making sure the stupid webview dies
            faceView.stopLoading();
            faceWin.remove(faceView);
            var tknUrl  = "";
                tknUrl += "https://graph.facebook.com/oauth/access_token?";
                tknUrl += "client_id=" + cid + "&redirect_uri=" + redirectUrl + "&";
                tknUrl += "client_secret=" + aSec + "&code=" + pincode;
            var XHR = Ti.Network.createHTTPClient();
            XHR.onload = function() {
                var res  = XHR.responseText;
                var aTkn = res.replace("acccess_token=",""); // <- こいつを保存
            };
            XHR.onerror = function(e) {
                faceWin.close(); // <- 取得失敗
            }
            XHR.open("GET", tknUrl);
            XHR.send();
            setTimeout(function(){faceWin.close();},3000);
            return true; // we are done here
        }
    }
});
リダイレクトURL のやつは、こんな感じにしとけば、
内容を取得して PIN(じゃなくて、CODEか) を取得できます。
このまま使えば OAuth1.0 と兼用できますよ。
(PHP です。色々ザックリだけど、許して…)
<?php
    $rtkn = $_GET["oauth_token"];
    $pin  = (isset($_GET["oauth_verifier"])) ? $_GET["oauth_verifier"] : "";
    $pin  = (isset($_GET["code"])) ? $_GET["code"] : "";
?>
<!DOCTYPE html>
<html lang='ja'>
    <head>
        <meta charset='UTF-8'>
        <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;">
        <style>
        </style>
    </head>
    <body>
        PIN CODE ...<br>
        <code><?php print($pin); ?></code>
        このウィンドウは自動的に閉じられます。
    </body>
</html>

2011年12月17日土曜日

続・TitaniumのWebViewで変数を渡す

前に、

TitaniumのWebViewで変数を渡す
http://psychedesire.blogspot.com/2011/12/titanium-webview.html

この記事の中で、

var obj = {hoge:"hugahuga"};
var win = Ti.UI.createWindow();
var web = Ti.UI.createWebView({url:"hoge.html"});
win.add(web);
win.addEventListener("open",function(e){
web.evalJS("func(" + JSON.stringify(obj) + ")");
});

こうやって書けば、WebView:web に変数を渡せると書いたけど、
これだと、問題が発生することがわかった。
どんな問題かというと、WebView 内で jQuery とかを読み出していた時に、
jQuery のロードを待たずに変数の代入や関数の実行が行われるのだ。

というわけで、こういう場合は、

var obj = {hoge:"hugahuga"};
var win = Ti.UI.createWindow();
var web = Ti.UI.createWebView({url:"hoge.html"});
win.add(web);
web.addEventListener("load",function(e){
web.evalJS("func(" + JSON.stringify(obj) + ")");
});

このように書けば、WebView:web のロードを待って、
ロードが終わった後に、evalJS が実行される。

2011年12月15日木曜日

見つけたTitanium Tips等。

Titaniumって、案外情報がないので、わからないことがあると、結構検索して周っています。
そんななかで見つけた記事を書いてみます。

Titaniumでネットワーク周りのメモリリークを回避する
http://www.mountposition.co.jp/blog/?p=86

一応やってみました。効果があるのか無いのかは、まだ未確認…

Titanium アプリ初回起動時のRestart Requiredダイアログ対処法
http://www.mountposition.co.jp/blog/?p=295

これ、俺の使ってるAUのINFOBAR A01 でも起こります。
いったいなんなんだろうなーくらいにしか思って無かったです。

ウィンドウを開くたびに初期処理を行う
http://www.mountposition.co.jp/blog/?p=60

単純にウィンドウを開いたときに行う処理は、open でいいんだけど、
例えばメニューウィンドウのように、行ったり来たりを繰り返すときは、
focus を使ったほうが良いと思います。




Android マーケットに登録しました。

まだアプリは完成していないけど、
取りあえず登録だけはしてみました。
諸事情あり、クレジットカードが持てない私ですが(笑)、
V-preca という、まぁ、WAON とか、 NANACO みたいな、チャージして使うカードで、
VISAのカードの番号も持てるやつがあったので、
それを使い、GoogleCheckOutでお金が払えました。

http://vpc.lifecard.co.jp/

Androidマーケットの登録については、

http://www.taosoftware.co.jp/android/market/market_start.html

ここを見たら良いでしょう。

V-preca で、ついでに mixi の個人デヴェロッパ登録(クレカが無いとGraphAPIが使えないのだ!)もしてみたのですが、
こちらはVISAの番号が通らないようです。
V-preca の利用可否については、

http://ja.v-preca.wikia.com/wiki/%E5%88%A9%E7%94%A8%E5%8F%AF%E5%90%A6

ここが詳しいです。

今日は、2ちゃんねるの板情報、スレッド情報、DATの取得等を、
PHPで書いたりしました。

2chのdatをjsonpで返す非公式APIを作ってみた
http://d.hatena.ne.jp/ogatatsu/20090917/1253184608

既にこういう便利なものがあるのですが、
人様の AppEngine のトラフィックを増やすわけにはいかないので、
自前でコツコツ書いていました。
メンドくさかったー。

先日書いた、phpcloud.com で動くようにしてあり、
phpcloud.com 上で 2ch のデータを JSON に変換し、
Android アプリが、そのJSONデータを引っ張ってくるような感じです。
WebView と Titanium 本体のイヴェントのやりとりが、
結構面倒だったり、結構頭がこんがらがってくる感じではありますが、
一気に片付けたので、なんとかなりました。多分。


というか、WebView内でJSONPもらおうとしても、もらってくれない!
というわけで、Titanium 側で生のレスポンステキストをWebViewに送って、
WebView 側でJSON.parse() することに…
なんなんだー!
と思ったら、Titanium でJSONゲット、JSON.parse 、 JSON,stringify したのをWebViewしたら動きました。
死にたい。。。

あ、あと、Google+ のアカウントと、Blogger のアカウントを連動させることが出来る(?)ようになったようなので、
それをやってみました。

あー。あと、欲張って Google+ のAPIも使おうとしたんだけど、
これって Twitter で言う Timeline 的なものは取得できないんですなぁ。
使えないのう。OAuth2.0 だから、BirdHouse 書き換えなきゃならなくなるしなぁ。

2011年12月11日日曜日

続々・Titanium と BirdHouse で TwitterOAuth

まーじーかっ!!
おかげでなぞが解けた。ありがとう。スタックオーヴァフロゥ

んと、BirdHouseをそのまま使うと、
AccessToken取得時に、Accesser に Request_token_secret を入れないようになっている。
これはTwitterには必要ないためだと思う。
なので、
Tumblr や Flickr のOAuthに対応できなくなってしまうので、
利用するサービス名を取得しーの、

function get_access_token(callback) {}
の頭のほうに、
if(cfg.serviceName != "twitter"){accessor.tokenSecret    = cfg.request_token_secret;}
と書けば、万事解決な気持ちがします!

http://stackoverflow.com/questions/8373885/getting-an-oauth-access-token-not-language-specific-same-issue-for-flickr-an



0 down vote accepted
I'll answer my own question.
There were a few discrepancies between the different oauth service provider implementations:
Twitter
  • Expects oauth_callback on request_token step
  • Doesn't return oauth_token_secret until access_token response
  • Therefore, there's an empty oauth_token_secret in signing the access_token request
Flickr & Tumblr
  • Expect oauth_callback on authenticate (i.e. authorize) step
  • Return oauth_token_secret on request_token step (and expect you to remember it and use it to sign access_token request)
Youtube (and other Google OAuth service providers):
  • Expects Google-proprietary "scope" on request_token step
  • Expects oauth_callback on authenticate (i.e. OAuthAuthorizeToken) step
  • Doesn't seem to like oauth_token passed in Authorization header in the access_token step (responds with "token invalid" due to required double-encoding in base string). Pass it in the post body or query string instead.

続・Titanium と BirdHouse で TwitterOAuth

というわけで、BirdHouseを使ってOAuth認証させるにあたり、相当直した。
直したっていうか、直して、エミュレータでは、動いたけど、実機で動くかは、まだ確かめていない。

まず、PINコードがそのままでは取得できないぽい(?)
function get_request_verifier() を色々と直してやった。
まず function checkStatus() は削除。いらね。
if (loads==2) { ~ }

if(loads==1){var t = setInterval(function(loads){if(loads==2){clearInterval(t);return;}},100);}
こうした。
ログを見ていると、loads がインクリメントされるのが、2回なので、こうしないと動かないぽい。
これにともない、 checkStatus() はいらなくなった気がする。
あと、 loading というフラグもいらなくなった気がする。

で、
else if (loads==3) { ~ }
がこうなった。
else if (loads==2) {
    var pincode = webView.evalJS('window.document.body.innerHTML');
    pincode     = pincode.replace(/\s|\r\n|\r|\n|\t/gi,"").replace(/.*.<code>|<\/code>.*./gi,"").replace(/\s|\r\n|\r|\n|\t/gi,"");
    cfg.request_verifier = pincode;
    if (cfg.request_verifier!="") {
        // my attempt at making sure the stupid webview dies
        webView.stopLoading();
        win.remove(webView);
        get_access_token(callback);
        setTimeout(function(){ //* TODO: check for ios vs android
            win.close(); //* we close it after 3 seconds, which is more than enough time
        }, 3000);
        return true; // we are done here
    }
}

PINを取得する部分は、どうしてもTwitterなどサービス側の仕様変更などに、
粒さに対応し、手を加えなくてはいけない気もする。
めんどくせーから正規表現でボリボリとむしってみた。
最後のreplace()は完全に蛇足だけど、心配性なの私。

赤字の部分は、
https://github.com/jpurcell/birdhouse/issues/16
ココを元に。
古い端末向けに、Windowが閉じるのを数秒待たないと、

W/MessageQueue( 337): Handler{4059ce70} sending message to a Handler on a dead thread
こう言われて、AccessToken が取得できなくなってしまうぽい。

他は、requestToken 発行用のURLと authorizeURL 、 AccessToken 発行用の URL を init() のパラメタにして、
AccessToken 、AccessTokenSecret の保存先をあれやこれやしてみた。
まぁ、PINコード取得画面がサービス毎に違うだろうから、単純にはいかないだろうけど、
Tumblr と Flickr でも OAuth で認証させたいので、そこらへんもカリカリして、
ホゲホゲしたら、後は動かせるかなぁ~という感じ。
OAuth対応だけで一日かかったよ~。めんどくせ。

2011年12月10日土曜日

Titanium と BirdHouse で TwitterOAuth

色々見て周って、動かしてみたんだけれども、
Twitterだけに関しては、

http://blog.mogya.com/2011/01/oauthiphone10.html

こっちより、

https://github.com/jpurcell/birdhouse

こっちのほうが良い。
なんか、twitter_api.js はエラーが起きる128行目で。
何故かは判らないけど。

で、

http://blog.fkoji.com/2011/06282251.html

ココを見ると、birdhouse はアクセストークンとかの保存が変らしい。
そこのところを直したり、他のOAuthサービスでも使えるようにチョコチョコ直した。
PINコード持ってくるところがいろんなサービスによって違うので、
そこが困ったところである。うむむむむ。

スクリーンショット

こんな感じのを作っています。






WebView のリンクをクリックしたら、別なWebView を開く

WebView上のリンクをクリックすると、
そのWebView上でリンクを開いてしまうようなので、これを何とかしたい。

手順としては、
WebView上のリンクをクリックしたら、
Titanium へリンクがクリックされたというイヴェントと共に、
リンク先URLを送る。
更に、リンククリックを無効化する。

次に、
Titanium側でリンクがクリックされたイヴェントを発火させる。
受け取ったリンクを元に、新しいWindowとWebViewを開く。

まぁ、書いてみると、たいしたことではない。
忘れる前に参考URL
jQueryでリンクを無効にするやり方はコチラ。
http://black-flag.net/jquery/20110526-3128.html

TitaniumのWebViewからリンククリックイヴェントを取得するやり方はコチラ。
http://www.mountposition.co.jp/blog/?p=81

実際に書いてみるとこんな感じ。
【html側】
$(document).ready(function(){
    $("a").live("click",function(e){
        var link     = $(this).attr("href");
        Ti.App.fireEvent("linkClick", {link:link});
        return false;// or e.preventDefault();
    });
});

で、Titanium側は

【Titanium側】
Ti.App.addEventListener("linkClick",function(e){
        var win      = Ti.UI.createWindow();
        var linkView = Ti.UI.createWebView({url:e.link});
        win.add(linkView);
        win.open({animated:true,fullscreen:true});
});

return false;// or e.preventDefault();
で、A要素をクリックしたときのイヴェントを打ち消してる
(現在ののWebView上でURLを開かないようにしている)感じ。
まぁ、あとは参考URLのとおりです。
$("a").live() にしているのは、
動的に要素を追加した時とかに困るから。
jQuery1.7 系からは on/off とかだっけ?忘れた。それとは別か?

まぁ、こんな感じですね~。
あんまり、 $(document).ready(function(){}); の中にコード書きたくないんだけど、まぁ、いいかな。たまには。

WebView内のスクロール制御

WebView内に読み込むHTMLファイルで、

html,body{width:100%}
とかやってみると、
横にビローンって長くなる。なんぞこれ。と色々やってみるも、
うまく動かず。
解決方法は、

http://d.hatena.ne.jp/sDaigo/20101113/1289650584

にあるとおり、

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;" />
としてあげれば良いです。
 
まぁ、はみ出す要素があった場合は、その分スクロールバー出ちゃうんだけど、
たとえば画像とかだと、
<img src='src/hoge.png' style='max-width:80%;height:auto'> 
ってやれば、横幅は親要素の80%で、縦はそれにあわせて勝手に調整してくれるので、
こんな感じでやっておけばよいです。

Noooooooooooo!!

エミュレータで動いて実機で動かないってなんじゃそりゃおーーーい!
おろろろろろ~~~~~~~~~ん!!

2011年12月9日金曜日

Androidではあんまり動的にTableViewRowとか追加したらダメ

だと思います。
動的の使い方が間違っているかもしれないけど。
なんつーの?イヴェントをやったら行がどんどん増えていくとか、そういうのは、
やらんほうがよいっぽい。気がする。

やったら判るけど、重い。処理が。
まぁ、端末にも寄るだろうし、ただ行の中身が文字列とかなら、まだ大丈夫だろうけど、
行の中にImageView追加してみたり、あれやこれや追加してしまうと、
すんごく重い。アプリケーションから反応がありませんが頻発するっぽい。
WebView内に、追加したい行みたいなのを追加していったほうが、サックサクだと思います 。
ていうか、そうしましょう。
むしろ、殆どWebViewでいいんじゃねーかと思う。
Titaniumで開発しているからそうなってるのかなー。たぶん、違うだろうな。

画像を読み込む時と、画像をリサイズするときの処理が重いっぽい。
そこら辺かな。画像はキャッシュしたりとかすればいいんだろうけども。
そこ、もうちょい調べてみようとは思うが、まぁ、調べたところで、WebViewでやっちゃいます。僕は。

2011年12月7日水曜日

TitaniumのWebViewで変数を渡す

【Titanium Mobile】WebViewへ変数を渡す
http://www.johnnnnny.com/blog/?p=82


Titanium の WebView で HTML をホスト
http://akabeko.sakura.ne.jp/blog/2010/11/titanium-%E3%81%AE-webview-%E3%81%A7-html-%E3%82%92%E3%83%9B%E3%82%B9%E3%83%88/


ここらへんを見たんだけど、
要は、Evalするんで、Evalできるようなものじゃないとだめ。
難しいなー。難しくは無いんだけど、なんだろね。
【html側】
var test = function(obj){
$("#dummy").before(obj["val"]);
}

【Androidアプリ側】
var wv = Ti.UI.createWebView({url:"test.html"});
var btn = Ti.UI.createButton({title:"hoge",width:300,height:50});
btn.addEventListener = function(e){
var obj = {val:"hoge"};
var js  = "test(" + obj + ");";
webview.evalJS(js);
}

これで、btnを押したら、WebViewでhogeって文字が出て欲しい。
まぁ、勿論でないのは、わかる。動きません。

なんていうの?そのー、変数の実体を渡したいの。僕は。
でも、それが出来ないということなんだと思う。つまり。
つか、Evalなんだから、当たり前なんだけど。
つまり、オブジェクトを渡したいなら、
JSON化しなきゃならん。つまりそういうことなんだろうなと思う。
配列にせよ、同じなんだろうが。

コンテキストをまたいでデータを参照で共有する方法
http://ti.masuidrive.jp/topic.php?id=221#post-655

ここらへんかな?
まぁ、そういうわけなんで、解決方法としては、

var js = "test(" + obj + ");";

の部分を、

var js = "test(" + JSON.stringify(obj) + ");";

と書いてあげればいいです。
終了

2011年11月28日月曜日

Titanium Mobile からAndroidエミュレータを動かす時に躓いたところ。

PhoneGAPで色々やっては居たんだけど、
PhoneGAPでは、基本WEBView上でアプリを全部動かす(んだっけ?)都合上、
TwitterのOAuthの認証小窓とか出すときに、
元のアプリに戻れなかったりとか色々めんどくさい(らしい / ChildBrowserとか?)。

というわけで、Titanium(タイタニウムと読むらしい・チタニウムじゃねーんだぁ)で
作り直しをしています。

つか、その前に、Androidのエミュレータが起動しない。
なんやねーん。というわけで、起動するまでに至らしめた記憶です。


WinXPSP3の環境で。JDK1.7環境で。

1・JAVAのパスが通らない。
スタート ⇒ まいこんぴゅーた を 右クリックして、
プロパティ ⇒ 詳細設定 ⇒ 環境変数 ⇒ システム変数に "C:\java\jdk1.7.0\bin" とか、
JAVAのインストールディレクトリを追加。\binが大事。

2・JDKのバージョンで怒られる
『[ERROR] JDK version 1.7.0 detected, but 1.6 is required』
とか出る場合。

C:\Documents and Settings\[ユーザ名]\Application Data\Titanium\mobilesdk\win32\1.7.5\android\prereq.py
をUTF8対応のテキストエディタで開く。
(開く前にバックアップコピーを取って置こうね。)

で、21行目あたりの
if not version.startswith("1.6"):

if not version.startswith("1.7"):
とか、自分のJDKのバージョンに合わせて書き換えましょう。

http://developer.appcelerator.com/question/124891/error-jdk-version-170-detected-but-16-is-required


3・SDCARDのPATHに半角スペースを含んでいて怒られる。
『invalid command-line parameter: and』
とか出る場合。


C:\Documents and Settings\[ユーザ名]\Application Data\Titanium\mobilesdk\win32\1.7.5\android\builder.py
をUTF8対応のテキストエディタで開く。
(開く前にバックアップコピーを取って置こうね。)

で405行目あたりの

self.sdcard,

'"'+self.sdcard+'"',
に書き換える

http://developer.appcelerator.com/question/125578/emulator-fails-in-winxp-because-of-sdcard-directory


ForgedUI という Titanium のプラグイン?みたいなのを使うと、
GUIが凄く楽に作れるらしいんだけど、
ベータ版であるがために、Repositoryがどこにあるか教えてくれない。
楽してなぁ。


---- 追記 -----------------------------------------


結局

Java 7でandroid apkをビルドできない問題の解決方法
http://d.hatena.ne.jp/atsushieno/20110907/p1

これが出た!ので、JDK1.6にしました。めんどくせーもん!もんもん!
prereq.py書き直さなきゃーだな。

http://stackoverflow.com/questions/7866723/dx-bad-class-file-magic-cafebabe-or-version-0033-0000-with-adk14

この解決方法もなんかだめであったーのだ。

おーのーれーじゃきおーう!

2011年11月23日水曜日

PhoneGAP.js と DreamWeaver で Android アプリ作成

というわけで、前から作っているんですが、
色々と一から作っては壊し作っては壊ししています。

なかなかにこういうのは、先にすすまねーなーという。
インタフェイスから作っていくのか、中で動くJSから作っていくのか、
どっちから始めても、途中でどっちかに集中して、
またこっちに戻って~みたいなのを繰り返しますね。

とりあえず、GoogleChrome で動くものを作って、
あとで DreamWeaver とかに持っていって、って感じで。

作っているものとしては、ただのフィードアグリゲータです。
前から作っているやつの、Android アプリ版です。

楽しいので、頑張ってるんです。

2011年11月18日金曜日

localStorage と file:///

予め。
php_date.js は
http://rewish.org/javascript/php_date
にございます。これは素敵。

以下は、
Safariの5.0.3で動かしてみた。
WindowsXPSP3で動かしてみた。

file:///C:/Documents%20and%20Settings/[ユーザ名]/デスクトップ/dir1/test.html
とかに

<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js'></script>
<script type='text/javascript' src='php_date.js'></script>
<script type='text/javascript'>
$(document).ready(function(){
    if(!localStorage.hoge){localStorage.hoge = "setted at " + (new Date()).format("Y-m-d H:i:s");}
    alert(localStorage.hoge);
});
</script>

とか書いてみる。

動かすと、

『setted at 年-月-日 時:分:秒』

とかアラートが出る。
別に問題ない。


んで、
file:///C:\dir2\test.html
とかに

<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js'></script>
<script type='text/javascript' src='php_date.js'></script>
<script type='text/javascript'>
$(document).ready(function(){
    if(!localStorage.hoge){localStorage.hoge = "setted at " + (new Date()).format("Y-m-d H:i:s");}
    alert(localStorage.hoge);
    localStorage.hoge = "書き換えたぜ";
    alert(localStorage.hoge);
});
</script>

と書いてみる。

んで、動かすと、

『setted at 年-月-日 時:分:秒』
(さっきと同じ日時)

って出てから、

『書き換えたぜ』

ってアラートが出てくる。
んで、また、
file:///C:\Documents and Settings\[ユーザ名]\デスクトップ\dir1\test.html
を開くと、

『書き換えたぜ』

って出てくる。


う~む。

Adobe DreamWeaver 5.5 と Phonegap でAndroidアプリが作れるんだけど、
PhonegapでHTMLでAndroidアプリを作った時に、localStorage 使えるっぽいんだけど、
(http://docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html)
file:///~で保存されてるデータが他のアプリで読めちゃうんなら、
AってPhonegap製のアプリの localStorage.twitterusr と localStorage.twitterpwd を
BってPhonegap製のアプリが 盗み見れちゃうかも~ってことでしょ?これ。
Sandboxとかそういうので、なんかうまい事やっているのかしら?

っていうようなことが書いたBlogの記事がどっかにあった気がするんだけど、忘れた。
調べてみるかなー。

因みに、

file:///C:\Documents and Settings\[ユーザ名]\デスクトップ\dir1\test.html




file:///E:\dir1\test.html

とかやっても、結果は同じでございます。

2011年11月12日土曜日

いやぁ

Bloggerくらい何もないBlogサービスだと、
色々とくっつけたくなりますなー。
昔はTAGクラウドつけてみたり、
リンク柱つけてみたり、開閉メニューにしてみたり、
カテゴリを階層化してみたり、
MovableTypeとかでやってましたわぁ。
再構築コケて大変なことになったりね。
懐かしい話ですわ。うんうん。

Blogという文化自体が、2002年とか2003年とか辺りには、
本当に目新しくて、
『CMS!すげー!ページがどんどん出来ていく!
これは新しいジャーナリズムやでメディアやで!既存メディアを駆逐するで!』
という感じだったんだけど、
今では小学生だろうがじいさんばあさんだろうが、
BlogどころかSNSやらMicroblogまでやる始末。

時代は変わった。いや、変わり続ける。
永続的なものなどやはりないのですわな。
誰かのPOSTしたデータの残骸は残り続けるようになって、
これがゴミなのか、宝の山への道標なのかは、
その道を歩く多くの人それぞれにとって意味を変えるのでしょうけど、
そこに何かが残ることにはかわりは無いのです。

いつ誰が何を書いたから、
いつ誰がどこで何を書いたに、
どんどん多次元的に、ひとつのPOSTへのデータ量が増えていく。
『ヒルメシなう』のひとつのPOSTのデータ量が肥大化していく。
そのうち、その瞬間のカロリーやら体脂肪率やら健康状態やら血中コレステロールの量が、
頼んでもいないのにクラウドに蓄えられていくのかもしれないし。

ん~。痺れるねぇ~。

さてさて

疲れるわー。
フホホホホ。Bloggerの新投稿画面、
なんか、日本語入力状態で改行すると、変な動きをたまにするなー。
 会社の中身が、凄い雑過ぎて、入社2ヶ月あまりで辟易ですね。
売り上げメインの業種自体が既にグレーからブラックな感じなので、
いい加減、どっか探さなきゃダメだなー、って感じです。

プライベート的にも変革期なので、丁度よいのではないかと思います。
なんかかんか、ステップアップ出来るプロダクトを作って、
自分的な励みにしたいですね~。

面倒なことが多いけれど、概ね今月中にはKillできるプロセスなんで、
いいんじゃないでしょうかー?

2011年10月25日火曜日