ラベル Javascript の投稿を表示しています。 すべての投稿を表示
ラベル Javascript の投稿を表示しています。 すべての投稿を表示

2012年8月11日土曜日

素数の時にEnrico Pucciと出力するプログラムを書いてみた

ドラクエ、素手プレイのため、

全然先に進めません。

みけです。

おやおや!


FizzBuzz問題が話題になっているさなかですが、

面白いエントリーがあったので、批判しつつ取り上げます。


SST


素数のときだけ"JOJO!"って出力するプログラムを作ってみた - くりにっき

まあ、Rubyを応用したシンプルなプログラムです。

ただ、Integer#prime?という言語に元々ある素数判定を使うのは

反則な気がしなくもないかな。

この問題のポイントは素数であるか判定できるプログラムを書くことなので…


KPT


素数のときにJoJo - scala - - 言葉をポッケに持ち歩こう

Scalaをつかった、これまたシンプルな実装です。

Scalaには素数を判定するというメソッドがないので、

自前で実装しています。

それはいいんだけど、計算量が多すぎるorz

例えば、素数1009を素数であると計算するための計算回数が、1007回になります。

そんなに計算する必要はありません。


計算量


どれくらい計算する必要があるかというと、

2で割り切れるかどうか調べたら、対象となる数値の約1/2まで、

調べれば良いことがわかると思います。

何故ならば、対象となる数値(N)の1/2より大きい数値(M)は、

もはや商が1で余りがM - Nなので、

Mの値を増やしていっても商が1以外の数値を取ることはないからです。

同様に、3で割り切れるかどうか調べたら、対象の数値(N)の1/3より大きい数値は

もう調べる必要がありません。

何故ならば、Nの1/3より大きい数値MでNを割ると、

商1または2、余り1~Mの間の値になるからです。

という感じで、割り算をする値kをインクリメントしつつ、

チェックする最大値MをN/kとして限定していくことで、

計算量を減らします。


屁理屈はここまでで…


素数の時にJOJOと出力するプログラムを書こうとしたのですが、

素数でJOJOと言ったら、忘れることのできないキャラが居ますね。

プッチ神父です。

というわけで、素数になったら、Enrico Pucciと出力されるプログラムを

JavaScriptで書きました。


サンプルではまあ、他のブログのご多分に漏れず、1~100までやっています。





JavaScript可愛いですね。

2012年7月22日日曜日

TDD in Actionに参加してきた

涼しいですね。体調が悪くて死にそうです。

みけです。

JavaScriptで参加してきた


最近はJavaとかGroovyは毎日やっているので、

たまには違うものをやりたかったので、

JavaScript + qunitでの参加となりました。


ペアプロ


ペアを組んでやりましょうということで、

@tomy_kairaさんと組んでやりました。

トミー君はemacs的な人で、僕はWebStormなので、githubを介してTDDしてました。

僕はここ二日間の調子が悪くて、頭がどっか行っていたので、

「あー、いいねー…あー、うー」という感じでしたので、

トミー君の頭の回転には脱帽という感じです。


成果物


途中までできました。

github上にあるので、まあ見てみて下さい。

mike-neck/Tdd-In-Action


qunit


今回使ったのはqunitですが、

まだ使い始めたばっかりだったので、

うまく使いこなせていない感が半端無かったです。

ここで、実現できている機能とかは、Fx-Js-JUnitでは最低限実現したいところではあります。


Erlang


後半のほうでgdgdな時間が発生していたので、

一人でErlangの勉強していました。

こっちは大した成果はありません…

2012年7月15日日曜日

JavaScriptでStringを拡張した

暑い。

みけです。

JavaScript面白いよ


JavaScriptの面白いところは、メタプログラミングができるところ、

インスタンス後にもメソッド拡張ができるあたりです。

詳しい話は下記の本に譲りますが、そういうところが好きです。




というわけで、


JavaScriptのStringにメソッドを拡張してみました。

拡張したメソッドはeachメソッドで、

最近のモダンな言語なら大抵持っている語彙と同じで、

文字列の中の一つ一つの要素にクロージャー(関数)を適用する

というものです。



実行結果がこれ。



ういやつです、JavaScript。



2012年6月12日火曜日

Fx-Js-JUnitの改良1



誰か、Retina MBP僕に下さい。

みけです。

今のまずい点


まず、まったくもっていただけないのが、Fx-Js-JUnitがエンベデッドのサーバーしか想定していないところ。

昨日のテストコードで@ClassRuleアノテーションを付与した箇所を見てみましょう。

    @ClassRule
    static public UseFxWebView fxWebView = UseFxWebView
                                                .defaultServer()
                                                .identifiedBy('JsJUnitTest')
                                                .get()

このUseFxWebViewというクラスが実はエンベデッドサーバーに依存しているのです。





ここはもうすこしちゃんとビルダーの設計をしてFx-Js-JUnitのコア(JavaFXでJavascriptのコードをJavaから呼び出す)部分とFx-Js-JUnitのエンベデッドサーバー(自プロジェクトのJavascriptを読み込めるようにする)を分離したいと思っています。

2012年6月11日月曜日

JavaFX + JUnit で javascriptのunit testできるようにしてやるんで、これからハマっていってやんよ - 4

前回のポストから約2ヶ月半、やっとできましたよFxJsJUnit。

みけです。


ひらめき


JavaFX2.0の発表を聞いた時にWebViewがwebkitを搭載するということで、

すぐにjavascriptのテストをJavaで書けるようになると閃いて、

今年の3月くらいにとりかかりました。

桜庭さんからJavaからJavascriptを呼び出すにはjavafx.scene.web.WebEngine#executeScript(java.lang.String)を叩けばよいと聞いていたので、

実際、初回に叩いてみたわけですが

JavaFXのコンポーネントはJavaFXスレッドで立ち上げないとダメということで、挫折しました。


成功?!


その後、桜庭さんのブログエントリーで色々とアドバイスを頂いたりしました。


それを参考にしてコードを書いてみたら、テスト1つは通ったのですが、複数回のテストが実行できないという残念な結果に終わりました


スレッド、スレッド、スレッド


もともと業務SEさんで、スレッドとか興味なかったのでスレッドの制御に悩みました。

3月末頃にはコードがグダグダになってきていて、どうしようもなくなっていたようです。

この頃は何に悩んでいたかというと、

  • テストを起動→Webサーバー起動→JavaFXアプリケーションを起動という順番で実行
  • JavaFXアプリケーションが起動完了したところで、何も動かなくなる

といった状態でどのスレッドで何がどうなっているかが全く?になっていました。

JUnitとWebサーバーとJavaFXアプリケーションとWebViewと4つのスレッドの同期化を図りつつ実行していかなければならないので、

スレッドの知識がない僕には何がどうなっているのか全くわからない状態でした。


Java並行処理プログラミング


そこで、スレッドで悩まないために、Java並行処理プログラミング ―その「基盤」と「最新API」を究める―を読みました。



桜庭さんの記事にもあるように4つのスレッドの制御のためにはjava.util.concurrent.BlockingQueue>T<や、java.util.concurrent.ExecutorServiceを押さえとかないと厳しいです。

僕もこの本のお陰でBlockingQueueとかがなんとなくわかるような気がしてきました。

で、やっとうまく行った実装では次のようにスレッドを作っています。


これらのスレッドにBlockingQueueで値を受け渡しさせることで同期化を図っています。


テストコード


テストコードを書く人(ユーザー)には、これらのスレッドのあたりを意識させない(隠蔽して)ようにするのが望ましい形です。

そこで、JUnitの@ClassRuleでテストクラスの実行前に準備することで、

ユーザーにはjavascriptの呼び出しだけを提供できるようにしました。

サンプルのテストコードは次のとおりです。

JsJUnitTest.groovy



コードはGroovyで書いていますが、Javaに近い形で書いていますので、

それほど読みづらくないと思います。


テスト対象のJavascriptは次のとおりです。

test.js




技術的なこと


実は苦労話ばかり書いていて、技術的なことは何も触れてないですね。

そのあたりは、7/2(月)にある桜庭さん主催の『第7回 JavaFX 勉強会』でお話しようと思います。

まあ、JavaFXの話は殆どなしで、javascriptとスレッドの話になりそうですが…


TODO


一応スタティックなWebサーバーのjavascriptのテストが実行できるようになったわけですが、

まだまだ、javascriptのJavaにおける扱いに関して不明な点が多くありますし、全然型安全でありません。

また、ajaxなどのテストも書けませんし、DOMでassertする部分のサポートも不十分です。

さらにGitHubリポジトリーも作ってないですし、今のgradleスクリプトではMac以外では動きません( ー`дー´)キリッ

というわけで、次のような課題があります。

  • Windows/Linux対応
  • リポジトリ公開
  • javascript→POJOマッピング対応
  • function型の扱い
  • ServletコンテナもしくはJavaEEコンテナ搭載

このあたりはボチボチとやっていきたいと思います。

2012年3月25日日曜日

JavaFX + JUnit で javascriptのunit testできるようにしてやるんで、これからハマっていってやんよ - 3

ども。

あいかわらず、ハマっています。

現状のコード


かなりひどいことになっています。





とにかく、ページをロードした時の同期を図るのがかなりしんどいです。

JUnit / JavaFX / WebView 3つのスレッドを管理しないといけないので、

これがかなりきつい。

ExecutorServiceを使うといいのでは?

と、java-ja温泉でよしおりさんに教えてもらったので、

改善していこうと思います。


2012年3月9日金曜日

JavaFX + JUnit で javascriptのunit testできるようにしてやるんで、これからハマっていってやんよ - 2

どーも、季節性鬱症がかなりひどくてやる気が0なミケです。


ツイッターでJavaFXの同期がむずいとつぶやいていたら、@skrbさんから



こんなツイートをいただきました。

JavaFXとJUnitのThreadについて丁寧に解説されていて、動作できたようです。

というわけで、コピペプログラマーとしてはコピペしないわけにはいきません。

早速Jettyも使ってunit testできるようにしましょう。


@BeforeClassで起動するWebサービス


JUnitのテストコードの中でServerを持っているのが大分辛くなってきたので、

Serverのコードは外に出すことにしました。

まだ、試作段階なので、Handlerクラスなども固定でしか動きません。




一応、サーバーのアドレスとかポートも設定できるようにしておきたいので、

コンストラクターで指定できるようにはしてあります。

ただし、現段階では使っていません。


TestBrowser


JavaFXのWebEngineを使ってテストコードを走らせるクラスです。

@skrbさんのブログの内容をそのままコピーしています。

なお、一部分を変更しています。

どうやら@Testメソッドを実行時に、画面のロードが完了していないなどの同期の部分で

失敗したため、javascript上でロードしたことをマークするようにして、ロードが完了するまでは待機するように

改造してあります。




なかなか、ソースが読みづらくてごめんなさい。試作段階ということで許しておくれ。

Threadの同期と非同期は難しいですね。

@skrbさんには非常に感謝しております。



実際のテストコード


実際のテストコードです。

これは単純に数値を計算するfunctionを呼び出しているだけです。




なお、@BeforeにてApplication#launch(Class<T extends Application>, java.lang.String[])

第二引数でサーバーのURLを渡してあります。

これは、アプリケーション側でgetParameter()メソッドを使うと取得することができます。

サーバーのポートなどの問題でURLを変更することはよくあるので、

この辺は可変にしておきたかったです。



実行結果


実行結果は次のような感じになります。



お気づきな方もいると思いますが、doStringTestの方は@Ignoreしています。

これ、@Ignoreを外すと、2つ目のテストが今は動かない状態なんです。



これはTestBrowserの部分の作りがまだまだ粗いため、2つ目のテストが実行できない状態になっているからですね。

TestBrowserの起動を@BeforeClassに移動して、

@Before毎にページを読み直すような仕様に変更しようと考えています。


とりあえず、今はこんな感じです。


どうやら…


@skrbさんの周囲で、

JRubyのなひさんJenkinsの川口さんといった

錚々たる面々のお方から反応があったらしく、

意外と面白そうなプロダクトになりそうな気がしてきました。


Seleniumと比べて


SeleniumなどのUIテスト系と比べて、僕がこのFxJsJUnitでやりたかったのはjavascriptのunit testなので、

実はUIはあまり気にしていないんです。

なので、縦幅がいくつとかはあまり興味がなくて、

純粋にjavascriptの関数に対してTDDを実施していけるような状態にしたいというのが第一の目標です。

あと@skrbさんのブログにあったとおり、

GUIは別に表示しなくてもいいという点からいくと、

Seleniumのように画面がポコポコ生まれなくていいというのが強みかなと思っていたりします。

あとはwebkit搭載なので、巷に最近溢れているブラウザー(Chrome/Android用のブラウザ/Safari)に対応できるので、

モバイル系のアプリにも対応できるテストツールになりうるかもしれません。


いずれにせよ、もう少し安定して動かせるようにしたいところです。


なお、コードはgist( https://gist.github.com/2001562 )上にあげていますので、ぜひご意見等いただければ幸いです。

あと、そのうちちゃんとしたプロジェクトとしてgithubにプロジェクトを作りたいと思っています。







2012年3月6日火曜日

JavaFX + JUnit で javascriptのunit testできるようにしてやるんで、これからハマっていってやんよ - 1

こんちわ。

大分暖かくなって来ました。

暖かくなってくると、旅に出たくなります。

特に、春なら鹿がお勧めです。

ついでに勉強会にも参加しましょう。

というわけで、


鹿駆動勉強会



とかいうのにエントリーすることになりました。

能楽堂でLTをするらしいです。


で、ネタ


JavaFX1のときはあまり惹かれなかったんですが、

JavaFX2になって、Webkit搭載となったので、

おお、JUnitでjavascriptのテストできんじゃね~と思ったので、

試してみることにしました。

まあ、その辺の経緯はtogetterにまとめてます。


事前にJavaFXとThreadにハマった言い訳を書いておく


もともと業務SEだったオレなので、

JavaのGUIとかはあまり触ったことがないというか、

ほとんど触ったことがないというか、

Javaを勉強した時にチョコっと触っただけです。はい。

なので、かなりクソいコードになっています。

サーバーサイドのJavaは書いたことありますです。



テスト対象のJavascript




特に大したことのないコードです。

数字を返す関数、文字列を加工して返す関数、オブジェクトを返す関数です。



テスト戦略???


テスト対象のJavascriptは大したことのないものですが、

ajaxアプリケーションのテストもやっていきたいので、

サーバーを立てていこうと思います。

JUnitでテストサーバーを立てる場合、

以前のエントリにも書きましたが、

Jettyエンベデッドサーバーを用いていきます。

サーバーが立ち上がった後で、ブラウザを立ち上げて、javascriptのテストをしていくという流れになります。

したがって、書いていくJUnitのコードは次のようになります。

  • @BeforeClassにてJettyサーバーを立ち上げる。
  • @Beforeにてブラウザーを立ち上げる。
  • @TestにてJavascriptのテストを実行する。
  • @Afterにてブラウザーを終了させる。
  • @AfterClassにてJettyサーバーを終了する。


JUnitのコード


次のような感じです。




なお、ハンドラーをJUnitに書くと若干読みづらくなるので、ハンドラーは別クラスにしてあります。





ハマる様子をとくと見よ


さて、JsJUnitを実行してみるとこんな感じになる。





JavaFXのWebViewはJavaFXのThreadで立ち上げなければならないらしいだって(´・ω・`)



さて、まだまだハマるのだが、それは後日。

2011年12月14日水曜日

恥ずかしくて今さら聞けない、mongodb講座 2

はい、始まりました。

今更感があるものをあえて後ろから追いかけていくこの企画。

世の中のスピードに負けずに、今日もテキトー感満載でのんびりやりますよ。

今日の目的はクエリーです。

データ準備


今日はクエリーですので、データをまんべんなく準備します。

データの挿入は前回にやったとおり、

db.collection.insert({jsondata})です。


> var ary = [1, 3, 7];
> var bry = [5, 11, 2];
> var cry = ["hop", "step", "jump"];
> cry.forEach(function(c) {
......   ary.forEach(function(a) {
......     bry.forEach(function(b) {
......       db.list.insert(
......         {
......           "type" : c,
......           "aIndex" : a,
......           "bIndex" : b,
......           "sum" : a + b,
......           "multi" : a * b
......         }
......       );
......     })
......   })
...... });
> assert(db.list.find().length() === 27, "check size");
> 


はい、 3 x 3 x 3 = 27 のデータが入っているようですね。

クエリ


じゃあ、一応リストを出力してみましょう。
なお、これはSQLで言うところの、

SELECT
    *
FROM
    LIST

にあたります。

これは、db.list.find()で出力できます。


> db.list.find()
{ "_id" : ObjectId("4ee7bd7b4238f3326533177f"), "type" : "hop", "aIndex" : 1, "bIndex" : 5, "sum" : 6, "multi" : 5 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331780"), "type" : "hop", "aIndex" : 1, "bIndex" : 11, "sum" : 12, "multi" : 11 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331781"), "type" : "hop", "aIndex" : 1, "bIndex" : 2, "sum" : 3, "multi" : 2 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331782"), "type" : "hop", "aIndex" : 3, "bIndex" : 5, "sum" : 8, "multi" : 15 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331783"), "type" : "hop", "aIndex" : 3, "bIndex" : 11, "sum" : 14, "multi" : 33 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331784"), "type" : "hop", "aIndex" : 3, "bIndex" : 2, "sum" : 5, "multi" : 6 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331785"), "type" : "hop", "aIndex" : 7, "bIndex" : 5, "sum" : 12, "multi" : 35 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331786"), "type" : "hop", "aIndex" : 7, "bIndex" : 11, "sum" : 18, "multi" : 77 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331787"), "type" : "hop", "aIndex" : 7, "bIndex" : 2, "sum" : 9, "multi" : 14 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331788"), "type" : "step", "aIndex" : 1, "bIndex" : 5, "sum" : 6, "multi" : 5 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331789"), "type" : "step", "aIndex" : 1, "bIndex" : 11, "sum" : 12, "multi" : 11 }
{ "_id" : ObjectId("4ee7bd7b4238f3326533178a"), "type" : "step", "aIndex" : 1, "bIndex" : 2, "sum" : 3, "multi" : 2 }
{ "_id" : ObjectId("4ee7bd7b4238f3326533178b"), "type" : "step", "aIndex" : 3, "bIndex" : 5, "sum" : 8, "multi" : 15 }
{ "_id" : ObjectId("4ee7bd7b4238f3326533178c"), "type" : "step", "aIndex" : 3, "bIndex" : 11, "sum" : 14, "multi" : 33 }
{ "_id" : ObjectId("4ee7bd7b4238f3326533178d"), "type" : "step", "aIndex" : 3, "bIndex" : 2, "sum" : 5, "multi" : 6 }
{ "_id" : ObjectId("4ee7bd7b4238f3326533178e"), "type" : "step", "aIndex" : 7, "bIndex" : 5, "sum" : 12, "multi" : 35 }
{ "_id" : ObjectId("4ee7bd7b4238f3326533178f"), "type" : "step", "aIndex" : 7, "bIndex" : 11, "sum" : 18, "multi" : 77 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331790"), "type" : "step", "aIndex" : 7, "bIndex" : 2, "sum" : 9, "multi" : 14 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331791"), "type" : "jump", "aIndex" : 1, "bIndex" : 5, "sum" : 6, "multi" : 5 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331792"), "type" : "jump", "aIndex" : 1, "bIndex" : 11, "sum" : 12, "multi" : 11 }
has more
> 


なんか、全部出してくれませんでした…orz

では、ここで、"type"が"step"で、"sum"の値が7より大きくて、"multi"の値が15以下のものを検索してみましょう。
SQLでは、つぎのような感じですね。

SELECT
    *
FROM
    LIST
WHERE
    TYPE = 'step'
AND SUM > 7
AND MULTI <= 15
なお、クエリーにはJSONを利用します。
> db.list.find({"type" : "step", "sum" : {$gt : 7}, "multi" : {$lte : 15}});
{ "_id" : ObjectId("4ee7bd7b4238f33265331789"), "type" : "step", "aIndex" : 1, "bIndex" : 11, "sum" : 12, "multi" : 11 }
{ "_id" : ObjectId("4ee7bd7b4238f3326533178b"), "type" : "step", "aIndex" : 3, "bIndex" : 5, "sum" : 8, "multi" : 15 }
{ "_id" : ObjectId("4ee7bd7b4238f33265331790"), "type" : "step", "aIndex" : 7, "bIndex" : 2, "sum" : 9, "multi" : 14 }
> 
演算子には$で始まる記号を用いるんですね。 ちょっとHTMLに慣れていると、一瞬オヤっ!と思うかもしれません。 記号の向きが逆になっていることに気をつけてください。
数学記号JSON中で指定する記号
<&gt
<=&gte
>=&lte
>&lt


はい、というわけで、次回はGmongoに行きます。


2011年12月11日日曜日

恥ずかしくて今さら聞けない、mongodb講座 1

とりあえず、 G* Advent Calendarに向けて目下ネタを作成中です。

というわけで、mongodbをいじることにしました。

なぜは聞かないでください。

たんなる思いつきだけで生きていますので…

インストールとサービスの起動


インストールは結構簡単です。

サービスの起動も簡単です。

Macの人


Mac Portsでインストールしました。オレは…


sudo port install mongodb


だったような…(テキトーなので忘れている

まあ、わからなくても、「Max mongodb インストール」とかでググればなんか出てきます。
そんなものです。

ちなみに、portでインストールした場合、ビルドに結構時間がかかりました。

MBA 11inch Core-i7 で2時間くらいかかります。

あと、portでインストールした場合、自動でサービスを起動してくれるコマンドの紹介とか書いてあります。

Windowsの人


とりあえず、mongodbのホームページからzipをダウンロードして適度なフォルダにインストールしましょう。

インストール完了したら、mongod.exeとかいうのをダブルクリックすれば多分サービスが起動します。

Linuxの人


え、オレが教えなくても(ry
sudo apt-getとかでいいんじゃね(テキトー


とりあえず使う


クライアントを起動


とりあえず、使うには次のコマンドを叩いて、クライアントを起動しましょう。


$ mongodb
MongoDB shell version: 2.0.1
connecting to: test
> 


DBの選択



> use mydb
switched to mydb
> 


とりあえずデータを入れてみよう



> db
mydb
> db.items
mydb.items
> db.items.insert({"type" : "data", "value" : 1})
> assert(db.items.find().length() === 1, "insert 1 record, the number of fetch will become 1")
> 


はいデータ1件入っていますね。

とりあえず今日はここまで。



2011年10月27日木曜日

Curry化のお勉強の入門1

Curry化くらいスクリプト言語やっているんだから、出来るよね


なんてことを言われたら、困るので、カリー化のお勉強をしておこうと思う。

カリー化とは?


ググッてください

部分適用とかもよくわからないんで、どうしようかな


というわけで、Javascriptではよく使われている、
変数のprivate化をやって見ることにしましょう。
カリー化はその先にある。

多分。

counter.groovy

def counter = {
    def cnt = 0
    return { cnt += 1 }
}

def cnt = counter()

10.times {
    def value = cnt()
    println value
    assert value == it + 1
}


実行結果は次の通り

1
2
3
4
5
6
7
8
9
10


さて、オレが最初にカリー化を覚えたのは実はjavascriptの方が最初でして、やはりここはjavascript大先生に登場願わなければならんとせんといかんであるで御座候。

counter.js

var counter = function() {
    var c = 0;
    return function() {
        c += 1;
        return c;
    }
}
var cnt = counter();
for (var i = 1; i <= 10; i += 1) {
    console.assert (cnt() == i);
}
はい、これをChrome14.0.835.hogehogeで実行したところ、Assertion Errorは発生しませんでした。 というわけで、今回の目的、クロージャー内に変数をprivateとして隠蔽するという目標は達成。 では、明日はおもむろにカリー化に挑戦する!

2011年6月27日月曜日

ちょっとやりたいアプリメモ

やりたいアプリのメモ

  • 恋ゲー的情報処理試験アプリ
  • Chrome Extension : ページ内の一部の文章を選択したら、その部分と、ページのタイトルと、URLをTwitterに投稿する
  • 英語、フランス語、スペイン語から日本語への翻訳英会話Androidアプリ - 大学で三ヶ国語(英語、スペイン語、ラテン語)をやっていたオレにしかできないアプリ

今んとこはこれくらいかな

しかし、昨日、英語での音声出力ができなかったのがショックで、3.は頓挫中。
だれかオレにアドバイスを~(涙)