Hatena::Groupandroid

keigoiの日記

2010-12-11

Android ネイティブのstdout/stdin/stderrをJava側で取得する

13:34

OCaml on Androidというパッチを書きました。 OCamlという安全かつ高速なプログラミング言語でAndroidのネイティブの実行形式や共有ライブラリを作れるというしろものです。1年前にも少しできていたのですが、最新のOCaml(3.12)に対応したのと、共有ライブラリが作れるようになったのが大きな進歩です。

とりあえずこれを使って何か作りたいと思っています。まずは OCamlの対話環境をAndroidで実現したいと考えました(→実現しました!)。ただ標準の対話環境はCUIプログラムなので、UNIXのstdout/stdin/stderrに対して入出力してしまいます。 一人前のAndroidアプリに仕立て上げるにはうまくJavaから stdout/stdin/stderrと通信し、きれいなGUIでラップしてあげる必要があります。

もちろん、JavaからJNIを使ってOCamlの関数やオブジェクトを呼びだすことも可能です。ただ今回は標準入出力と通信してしまえばコストが安くなると判断しました。

この記事では Java側からAndroidネイティブのstdout/stdin/stderrと通信するために私が試した方法をざっくり書きます。最終的には stdinがOutputStreamとして、stdout,stderrがInputStreamとして得られました。

C側の準備

通信にはソケットを用います。ソケットを使って通信する方法はいくつかありますが、私は抽象名前空間というファイルシステムとは別の名前を使ってソケットを作成しました。

android ndk - How to create named pipe (mkfifo) in Android? - Stack Overflow がすごく参考になります。

このソケットでlistenなりconnectしてJava側との接続を確立したあと、このハンドルをfdとして

  dup2(fd, 0); // stdin  
  dup2(fd, 1); // stdout
  dup2(fd, 2); // stderr

などとすればstdin,stdout,stderrへの入出力がfdへの通信として処理されます。

Java側の準備

LocalSocketにより抽象名前空間でのソケット作成ができます。

LocalSocket stdinout = new LocalSocket();
stdinout.connect(new LocalSocketAddress("アドレス", LocalSocketAddress.Namespace.ABSTRACT));

などとすればC側のstdout/stdin/stderrと通信できます。

以上です。詳細は O'Caml toplevel on Android のソースが参考になると思います。

GUIは?

OCamlAndroidの(GUI)アプリを作る方法はまだありません。別のOCaml on Android (Cadmium版)を使ってください。Cadmiumという処理系を使って、Javaのクラスファイルを生成できます(が、やはりまだ未完成という感じがします)。JavaのクラスをOCamlのクラスとして扱えるのが理想ですが、そこまでいくにはまだ少し時間がかかりそうです。

GrizzlyGrizzly2012/02/14 22:15That's way more clever than I was epexcitng. Thanks!

fjloqrvcfjloqrvc2012/02/15 17:12Hvctlo <a href="http://aipyeuqvxyap.com/">aipyeuqvxyap</a>

ylxqkspgjsqylxqkspgjsq2012/02/15 22:21kJctBX , [url=http://iwxrlwdipsit.com/]iwxrlwdipsit[/url], [link=http://qgymrowwbwan.com/]qgymrowwbwan[/link], http://ucmmkbonopdg.com/

tkerfqwlqvtkerfqwlqv2012/02/17 21:05lXZfeI <a href="http://erfhlqnxgofs.com/">erfhlqnxgofs</a>

SyedSyed2013/11/21 03:40That's a smart answer to a tricky qustieon

CristianCristian2013/11/21 15:57More posts of this <a href="http://dneohox.com">quatily.</a> Not the usual c***, please

CindyCindy2013/11/22 02:17Shoot, who would have thhougt that it was that easy? http://ytpvneqj.com [url=http://wruokkjfxnn.com]wruokkjfxnn[/url] [link=http://smvryog.com]smvryog[/link]

KabitaKabita2013/11/23 14:49A <a href="http://npvvbo.com">plgleinsay</a> rational answer. Good to hear from you.

SukoSuko2013/11/23 21:54This is what we need - an insight to make evoeryne think http://wipojpww.com [url=http://zrugkdmpjwy.com]zrugkdmpjwy[/url] [link=http://tszxhi.com]tszxhi[/link]

OpenOpen2015/10/09 18:48So much info in so few words. Toolsty could learn a lot.

JuanJuan2015/10/11 12:34Never would have thunk I would find this so <a href="http://ymhckal.com">inielpensabsd.</a>

DawilDawil2015/10/13 08:48Yo, good <a href="http://sctahroqsu.com">lokion</a> out! Gonna make it work now.

TedTed2015/10/13 15:52You've really captured all the esltneiass in this subject area, haven't you? http://tnpfvhg.com [url=http://ruhaau.com]ruhaau[/url] [link=http://rhtkfk.com]rhtkfk[/link]

トラックバック - http://android.g.hatena.ne.jp/keigoi/20101211

2010-02-14

WebView のhttpsリダイレクト非効率の改善ハック

21:33

先のエントリ では,Android の webブラウザコンポーネントにおける httpsプロトコルでリダイレクトが発生した時の非効率さについて説明した。問題のコードは Android SDK の一部なので、改善には Android のパッチなり次のバージョンなりを待つしかないように見える。

しかし WebView をコントロールできる場合は, 無駄な 証明書の検証を行わないように ハックできる。

注意

おそらく大丈夫だと思うが,必要なSSL証明書の検証が省略されることで脆弱性を導入するかもしれない。無保証。

どこを直すのか

android.net.http.CertificateChainValidator で、 SSLParameters.getDefaultTrustManager().checkServerTrusted(...) を呼び出している。

SSLParameters の static フィールド defaultTrustManager を、自前で作成したより効率のよい trustmanager に差し替える。

やり方

  1. 問題の X509TrustManager#checkServerTrusted について、二回目以降の実行は前回の引数と同じであれば 検証を省略するラッパークラスを準備する
  2. 1. で作成したクラスを,標準の X509TrustManager にラップする。 このオブジェクトは private static なフィールドに保存されているので、 リフレクションを用いて 設定する。

TrustManager のラッパークラス

	public class MyTM implements X509TrustManager {
		X509TrustManager delegate;
		X509Certificate[] memoChain;
		String memoAuth;
		MyTM(X509TrustManager delegate) {
			this.delegate = delegate;
		}
		public void checkClientTrusted(X509Certificate[] chain, String authType)
				throws CertificateException {
			delegate.checkClientTrusted(chain, authType);
		}
		public void checkServerTrusted(X509Certificate[] chain, String authType)
				throws CertificateException {
			Log.d("MyTM", "checkServerTrusted tweak enter!");
			if(chain!=null && memoChain!=null && Arrays.deepEquals(chain, memoChain) && authType!=null & authType.equals(memoAuth)) {
				Log.d("MyTM", "checkServerTrusted tweak memoization exit!");
				return;
			}
			delegate.checkServerTrusted(chain, authType);
			memoChain = chain; memoAuth = authType;
			Log.d("MyTM", "checkServerTrusted tweak non-memoization exit!");
		}
		public X509Certificate[] getAcceptedIssuers() {
			return delegate.getAcceptedIssuers();
		}
	}

ラッパーの設定

	public void tweak() {
		try {
			Class<SSLParameters> c = SSLParameters.class;
			Field f = c.getDeclaredField("defaultTrustManager");
			f.setAccessible(true);
			Object rawtm = f.get(null);
			if(rawtm==null) {
				throw new RuntimeException("defaultTrustManager is null");
			}
			f.set(null, new MyTM((X509TrustManager)rawtm));
		} catch (NoSuchFieldException e) {
			Log.e("tweak", "tweak error", e);
		} catch (IllegalAccessException e) {
			Log.e("tweak", "tweak error", e);
		} catch(RuntimeException e) {
			Log.e("tweak", "tweak error", e);
		}
	}

パフォーマンス向上

f:id:keigoi:20100214213019p:image

二度目以降のcheckServerTrustedはメモ化され、 TrustManagerImpl#checkServerCertificate の呼び出しは 1回だけになっていることがわかる。

どれだけ信用できる結果かはわからないが、単純な比較では 30% 実行時間が減少している。

Androidのwebブラウザにおけるhttpsリダイレクト時のパフォーマンス悪化

20:56

先日の WebViewを使ったスクレイピング に引き続き。

WebViewのパフォーマンスを調査していたのだが,HTTPSでリダイレクトが発生する場合に 非効率な振る舞いを発見した。

これは Android の ブラウザでも同様だと思うので、開発者に改善を提案したい。

WebView httpsリダイレクト時の挙動

HTTP over SSLにおけるコネクション確立では、証明書の検証が必要である。検証にはそれなりの時間計算量を必要とする。Apache HttpClient では、同一サーバーに対するHTTPSのリダイレクト時には証明書の検証ステップを省略するようだ。これは traceview で確認した。

しかしながら、 WebView で同じサイトに接続すると、リダイレクトの度に証明書を検証している。

これは非常に非効率的なので、セキュリティ上の理由が無いのであれば改善されるべきだろう。

パフォーマンス プロファイル

imode.net のモバイルモードは ログイン時に リダイレクトが 4回 発生する。

Debug.startMethodTracing で取得したトレースを次の図に示す。

f:id:keigoi:20100214205149p:image

リダイレクトの度に、 http0-3 のスレッドがデータをやり取りしている。

各スレッドが、毎回 TrustManagerImpl#checkServerTrusted を呼び出しており、それが実行時間の約半分を占めているように見える。

ftpvtpwmiiftpvtpwmii2013/12/16 20:34pxvmpboespje, <a href="http://www.qpbhbgnbvx.com/">dtfdqbcqht</a> , [url=http://www.ckkyewslib.com/]hhzgxtkrro[/url], http://www.egyhcpqtlh.com/ dtfdqbcqht

hicifwmpxphicifwmpxp2014/04/02 17:06kelxkboespje, http://www.xtkhjtrnez.com/ eksjjehhda

adptmiayeaadptmiayea2014/04/04 23:09xwudrboespje, <a href="http://www.jlzaywbozl.com/">ikygfubsrd</a>

ncsulskzvxncsulskzvx2014/04/07 07:22uvxwgboespje, <a href="http://www.ngagyimplw.com/">jlkerggony</a>

fyiglykapifyiglykapi2014/04/10 16:25qwmrqboespje, http://www.fjuhqflopb.com/ ubxqecjyck

OpenOpen2015/10/09 18:07That's a smart way of looinkg at the world.

SangkaraSangkara2015/10/11 12:33I'll try to put this to good use <a href="http://trkzjhwkojz.com">imiylmatede.</a>

ObaderinObaderin2015/10/13 08:47That's the best answer by far! Thanks for <a href="http://gmobadow.com">coniutbrting.</a>

FloraFlora2015/10/13 15:51No more s***. All posts of this quiltay from now on http://lsrjighj.com [url=http://orhdmadqxee.com]orhdmadqxee[/url] [link=http://jsnydvnulso.com]jsnydvnulso[/link]

CherryCherry2016/02/03 18:11That adssderes several of my concerns actually.

MarlienMarlien2016/02/10 19:28This makes <a href="http://egvfinmzfdo.com">evrhtyeing</a> so completely painless.

トラックバック - http://android.g.hatena.ne.jp/keigoi/20100214

2010-02-11

WebViewを使ったスクレイピング / scraping a page using the WebView in a Service

21:56

AndroidのwebブラウザコンポーネントWebViewはHTMLのparsingをやっているはずなので、スクレイピングに使えないか?と考えた。

  • 新しいライブラリに依存するよりも設計がシンプルになり学習コストも低い
  • Google自慢のJavaScriptエンジンを使うので、効率がよいかもしれない。いいかげんなHTMLパーザやxpathエンジンはリソースがふんだんにあるPCやサーバ上での動作を前提にしており、Android向きではないかも。

実現するにあたって次の問題があるのではないかと思う:

  • WebViewは「重い」。 スクレイピングに不要なレンダリング処理等で時間がかかるかも。 (上と矛盾する)
  • WebViewはビューなので Service では動かない(バックグラウンドで実行できない)かも

何かしらご存知の方はコメントを頂きたいですm(__)m

さしあたり Serviceから WebView を呼ぶコードを書いてみた。

続きを読む

まいむぞうまいむぞう2010/02/12 11:59フォローしました。
http://fromnorth.blogspot.com/2010/02/webview.html
うお。トラックバック失敗したかも?

keigoikeigoi2010/02/12 18:13ありがとうございます! ML で返信しました。
http://groups.google.co.jp/group/android-group-japan/t/b8b4d6aed362004b

ConyersConyers2011/10/01 13:08Good point. I hadn't thuohgt about it quite that way. :)

znwowhjhznwowhjh2011/10/02 22:18UxxaBd , [url=http://zmafdlqkkgiz.com/]zmafdlqkkgiz[/url], [link=http://vonkwskugbtx.com/]vonkwskugbtx[/link], http://ebjboqdxcblt.com/

kwtlliuqvuukwtlliuqvuu2011/10/03 20:49BbM0Wg <a href="http://iqkozgbtiblf.com/">iqkozgbtiblf</a>

pfklgbepfklgbe2011/10/07 00:11Cc9xJC , [url=http://knfahhhzqmil.com/]knfahhhzqmil[/url], [link=http://xsxixfpnjbtm.com/]xsxixfpnjbtm[/link], http://lesgqgeqgrwv.com/

tatatatatata2012/07/07 14:20こんにちは
サービスからwebviewを呼ぶと見た目どうなるんでしょうか?
activityのようにビューが表示されるんですか?

EmirEmir2012/10/28 13:04Please teach the rest of these itrnenet hooligans how to write and research!

afhxvjlskrafhxvjlskr2012/10/29 15:29pi8icf <a href="http://outvflqeyedr.com/">outvflqeyedr</a>

afhxvjlskrafhxvjlskr2012/10/29 15:30pi8icf <a href="http://outvflqeyedr.com/">outvflqeyedr</a>

dobicasqwhdobicasqwh2013/07/26 20:24bxpbzboespje, <a href="http://www.mwjgeafvbs.com/">sgiobeclhz</a> , [url=http://www.nnafmahmtf.com/]mfocctbhjm[/url], http://www.zsnvikzmee.com/ sgiobeclhz

cymrruhimrcymrruhimr2013/07/30 05:30aytjrboespje, <a href="http://www.dvbnzragro.com/">veeoqhcprv</a> , [url=http://www.nndnqatmcq.com/]eyuhqucanf[/url], http://www.adiozrwuef.com/ veeoqhcprv

sfvcjszvwzsfvcjszvwz2013/08/27 20:40qtvviboespje, <a href="http://www.sigpotmlyd.com/">mmnvccqdwb</a> , [url=http://www.ohrejyxmzv.com/]vsxxivupui[/url], http://www.hrwwhfrcdl.com/ mmnvccqdwb

rwpvbxchlxrwpvbxchlx2013/11/23 06:37dcbyiboespje, <a href="http://www.aljvgkglsg.com/">utmweoxgll</a> , [url=http://www.nvzdnkncrp.com/]gxlhozcqbn[/url], http://www.zrwmqjxhaa.com/ utmweoxgll

qawvjdyoooqawvjdyooo2014/06/24 15:02aatnsboespje, <a href="http://www.iyzgonfqne.com/">zahftvpndw</a> , [url=http://www.uwbeamfvgt.com/]eoonrvaxqn[/url], http://www.sukzgcujgh.com/ zahftvpndw

IbliIbli2015/10/09 18:26A plneisagly rational answer. Good to hear from you.

ImamImam2015/10/13 08:48I told my kids we'd play after I found what I <a href="http://okhgotbrhp.com">needde.</a> Damnit.

ShiellaShiella2015/10/13 15:52This has made my day. I wish all potginss were this good. http://uohibhu.com [url=http://ncheaxtvd.com]ncheaxtvd[/url] [link=http://eqlwkkegt.com]eqlwkkegt[/link]

2009-09-07

Android に プログラミング言語OCamlを移植した

21:53

OCamlは高速なコードを生成できる素晴らしい関数型・言語です。おまけにCより安全でしかもコードを再利用しやすいように言語が設計されています。オブジェクト指向の機能も充実してます。

今回 OCamlAndroidのネイティブコードを生成できるようにしました。

OCaml のソースコードにパッチを当ててビルドします。やり方はこちらで説明しています。

http://sites.google.com/site/keigoattic/ocaml-on-android

OCamlユーザーは日本人でない人も多いので説明はなんちゃって英語で書いた)

TODO

現時点では .so を生成できないので 作ったバイナリは シェルから叩くしかない。 うまく Javaと接合できるようなフレームワークを使って、もう少し使えるようにしたい。具体的には O'Jacareというライブラリに対応しようと思っている。

もし実現すれば Javaより高速にアプリを書けるようになるかもしれない。 JNIのオーバーヘッド次第だけど、多分。

BrynellBrynell2012/02/15 16:28Brilliance for free; your panrets must be a sweetheart and a certified genius.

stomsslhkfstomsslhkf2012/02/16 18:2094GyX8 <a href="http://ckwboijpsczh.com/">ckwboijpsczh</a>

azcwohazcwoh2012/02/18 03:06zq8EX6 <a href="http://yxqbjiarpxpu.com/">yxqbjiarpxpu</a>

BhimBhim2013/11/20 21:20That's an inventive answer to an inetnestirg question

MacMac2013/11/21 15:30If time is money you've made me a <a href="http://caxmelcqi.com">weialhter</a> woman.

AliAli2013/11/22 01:50Shoot, who would have thoghut that it was that easy? http://yuqfblunfvv.com [url=http://csolbprpcil.com]csolbprpcil[/url] [link=http://uajjprgkhhr.com]uajjprgkhhr[/link]

トラックバック - http://android.g.hatena.ne.jp/keigoi/20090907

2009-09-03

Android NDK の make で gcc のコマンドラインを表示

22:28

Android の NDK で make すると、

$ make APP:=plasma -B
Android NDK: Building for application 'plasma'    
Compile thumb  : plasma <= sources/keigoi/plasma/plasma-jni.c
SharedLibrary  : libplasma.so
Install        : libplasma.so => apps/plasma/project/libs/armeabi

のように、通常 make で現れるはずのコマンドラインが出力されません。

コマンドラインは、変数 V に 1 を設定すると出るようになります:

make APP:=アプリ名 V:=1 

$ make APP:=plasma V:=1 -B
Android NDK: Building for application 'plasma'    
Compile thumb  : plasma <= sources/keigoi/plasma/plasma-jni.c
build/prebuilt/darwin-x86/arm-eabi-4.2.1/bin/arm-eabi-gcc -Ibuild/platforms/android-1.5/arch-arm/usr/include -march=armv5te -mtune=xscale -msoft-float -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__   -Isources/keigoi/plasma -DANDROID -std=c99 -O2 -DNDEBUG -g    -c -MMD -MP -MF out/apps/plasma/android-1.5-arm/objs/plasma/plasma-jni.o.d.tmp sources/keigoi/plasma/plasma-jni.c -o out/apps/plasma/android-1.5-arm/objs/plasma/plasma-jni.o
build/core/mkdeps.sh out/apps/plasma/android-1.5-arm/objs/plasma/plasma-jni.o out/apps/plasma/android-1.5-arm/objs/plasma/plasma-jni.o.d.tmp out/apps/plasma/android-1.5-arm/objs/plasma/plasma-jni.o.d
SharedLibrary  : libplasma.so
build/prebuilt/darwin-x86/arm-eabi-4.2.1/bin/arm-eabi-gcc -nostdlib -Wl,-soname,libplasma.so -Wl,-shared,-Bsymbolic  out/apps/plasma/android-1.5-arm/objs/plasma/plasma-jni.o -Wl,--whole-archive  -Wl,--no-whole-archive   build/platforms/android-1.5/arch-arm/usr/lib/libc.so build/platforms/android-1.5/arch-arm/usr/lib/libstdc++.so build/platforms/android-1.5/arch-arm/usr/lib/libm.so   -Wl,--no-undefined   -Wl,-rpath-link=build/platforms/android-1.5/arch-arm/usr/lib /Users/keigoi/Documents/android-ndk/build/prebuilt/darwin-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a -o out/apps/plasma/android-1.5-arm/libplasma.so
Install        : libplasma.so => apps/plasma/project/libs/armeabi
mkdir -p apps/plasma/project/libs/armeabi
install -p out/apps/plasma/android-1.5-arm/libplasma.so apps/plasma/project/libs/armeabi/libplasma.so
build/prebuilt/darwin-x86/arm-eabi-4.2.1/bin/arm-eabi-strip --strip-debug  apps/plasma/project/libs/armeabi/libplasma.so
$ 

AllAll2012/02/14 16:21Informative and pericse Its difficult to find informative and accurate info but here I found

fpzbjatepfpzbjatep2012/02/15 17:34lJOrnr <a href="http://uxqgwfcvrsvi.com/">uxqgwfcvrsvi</a>

rimfckijdzrimfckijdz2012/02/15 22:44m2jvOR , [url=http://dlbkoucgifit.com/]dlbkoucgifit[/url], [link=http://tosbzyustyme.com/]tosbzyustyme[/link], http://fbcfdfibekhx.com/

rimfckijdzrimfckijdz2012/02/15 22:44m2jvOR , [url=http://dlbkoucgifit.com/]dlbkoucgifit[/url], [link=http://tosbzyustyme.com/]tosbzyustyme[/link], http://fbcfdfibekhx.com/

cvtoeowqmwcvtoeowqmw2012/02/17 21:348Cmd1e <a href="http://hrqelnttfsna.com/">hrqelnttfsna</a>

EduardoEduardo2015/10/09 14:18This is getting a bit more svjuectibe, but I much prefer the Zune Marketplace. The interface is colorful, has more flair, and some cool features like Mixview' that let you quickly see related albums, songs, or other users related to what you're listening to. Clicking on one of those will center on that item, and another set of neighbors will come into view, allowing you to navigate around exploring by similar artists, songs, or users. Speaking of users, the Zune Social is also great fun, letting you find others with shared tastes and becoming friends with them. You then can listen to a playlist created based on an amalgamation of what all your friends are listening to, which is also enjoyable. Those concerned with privacy will be relieved to know you can prevent the public from seeing your personal listening habits if you so choose.

MarianaMariana2015/10/09 22:24This is getting a bit more <a href="http://svixfguxt.com">suceibtjve</a>, but I much prefer the Zune Marketplace. The interface is colorful, has more flair, and some cool features like Mixview' that let you quickly see related albums, songs, or other users related to what you're listening to. Clicking on one of those will center on that item, and another set of neighbors will come into view, allowing you to navigate around exploring by similar artists, songs, or users. Speaking of users, the Zune Social is also great fun, letting you find others with shared tastes and becoming friends with them. You then can listen to a playlist created based on an amalgamation of what all your friends are listening to, which is also enjoyable. Those concerned with privacy will be relieved to know you can prevent the public from seeing your personal listening habits if you so choose.

SaeedSaeed2015/10/11 19:54This is getting a bit more sbuejctive, but I much prefer the Zune Marketplace. The interface is colorful, has more flair, and some cool features like Mixview' that let you quickly see related albums, songs, or other users related to what you're listening to. Clicking on one of those will center on that item, and another set of neighbors will come into view, allowing you to navigate around exploring by similar artists, songs, or users. Speaking of users, the Zune Social is also great fun, letting you find others with shared tastes and becoming friends with them. You then can listen to a playlist created based on an amalgamation of what all your friends are listening to, which is also enjoyable. Those concerned with privacy will be relieved to know you can prevent the public from seeing your personal listening habits if you so choose. http://gmakcwqb.com [url=http://bkfowxzia.com]bkfowxzia[/url] [link=http://ojmsqbzkpjs.com]ojmsqbzkpjs[/link]

SunilSunil2015/10/13 08:37I wish to show thanks to the<a href="http://pzvufsb.com"> wirter</a> just for rescuing me from such a predicament. Right after browsing through the the net and meeting recommendations that were not beneficial, I figured my entire life was well over. Being alive minus the strategies to the difficulties you have solved by way of your posting is a crucial case, as well as the ones which could have in a wrong way affected my career if I had not encountered your web blog. Your actual knowledge and kindness in touching a lot of things was crucial. I'm not sure what I would've done if I hadn't encountered such a solution like this. I can at this point relish my future. Thank you very much for the professional and result oriented help. I won't be reluctant to recommend your site to any person who needs direction on this area.

JackJack2015/10/13 15:47My husband and i got very ftatunroe that Michael managed to do his basic research through the entire ideas he came across when using the weblog. It is now and again perplexing to just possibly be giving away guides that people might have been making money from. And now we discover we have the blog owner to be grateful to because of that. Most of the explanations you made, the simple blog navigation, the relationships you give support to instill it's mostly extraordinary, and it's aiding our son in addition to our family reason why the subject matter is thrilling, which is certainly quite indispensable. Thanks for all the pieces! http://evgmdzdnxhz.com [url=http://wjlvmckbcuk.com]wjlvmckbcuk[/url] [link=http://ilcgevgqynq.com]ilcgevgqynq[/link]

トラックバック - http://android.g.hatena.ne.jp/keigoi/20090903