JavaScript

Bing Translator APIを使いたいけどAppIDってどれか分かりにくい。(client_idとclient_secretってどれ?)

アカウント情報のページにプライマリ アカウント キー顧客 IDとかあって翻訳具合が微妙で分かりにくい。

自分ほど英語読めないと顧客 ID=client idだけどOAuthを通らない。

開発者のタブにはクライアント ID顧客の秘密があってどうやら

[クライアント ID]=[client_id]
[顧客の秘密]=[client_secret]

でOKでした。

bing

Node.jsのイベントループ

Node.jsのイベントループについて

JavaScriptはシングルスレッドなので「並行処理」を行うために、「ノンブロッキングI/O」で「非同期処理」を実現しており
Node.jsはイベントループと呼ばれるモデルを採用しています。

イベントループのイベントキューにイベントが登録され、イベントハンドラを実行します。
イベントハンドラの完了した結果は、イベントキューにコールバック関数を登録することで受け取ります。

そのため、シングルスレッドでブロックするI/Oを行った場合、そのイベント完了後に次のイベントが実行されてしまう。
並行処理させるためには、ノンブロッキングI/Oを使ってイベントの完了を待たずに次のイベントハンドラを実行させます。

Node.jsはイベントを生成と処理の制御を行うので
ファイルのリード、DBへのクエリ発行、HTTPサーバがリクエストを受けた時などにイベントが生成されます。

例えばテストファイルを作って試すとわかります。

test.js

var oHttp = require('http');
var oFs = require('fs');
oHttp.createServer(function(req, res) {
    console.log("Start");
    oFs.readFile('index.txt', function(err, content) {
        res.writeHead(200, { 'Content-Type':'text/html; charset=utf-8' });
        res.end(content);
        console.log("Response");
    });
    console.log("End");
}).listen(8080, '127.0.0.1');
console.log('ListenStart');

読み込むファイル

<html/>
 <head/>
   <title/>index</title/>
 </head/>
  <body/> みれた? </body/>
</html/>

実行

[root@dti-vps-srv34 ~]#node test.js

ブラウザで「http://127.0.0.1:8080」にアクセス。

[root@dti-vps-srv34 ~]#node test.js
ListenStart
Start
End
Response

EndがResponseより先になっています。
これはreadFile()にコールバック関数を登録しているので、非同期となり
読み込み完了した時点で関数が呼び出されているからです。

プログラムの書き方によっては非同期の部分をロックしてしまうので注意。

Node.jsとは

Node.jsとはサーバサイドJavaScriptの一種

サーバサイドJavaScriptとはサーバサイドのアプリケーションの実装言語として、JavaScriptを使用する言語および環境のこと
ブラウザ(クライアント)サイドと同じ開発言語で、サーバサイドの開発が出来るので、開発効率が上がるといわれている。

サーバサイドJavaScriptにはこれらがある。

  • Node.js
    googleが開発したエンジン、V8で実行する環境
  • Rhino
    JavaVM上で実行するJavaScript言語処理系
  • Aptana Jaxer
    Aptana社がオープンソースとして配布している。

でもそれだけならそんなに自分は興味を持ちませんでした。
node.jsの何がすごいと感じたかというと

  • WebSocketが簡単そう。
  • サーバーの負荷分散に期待あり。

です。

WebSocketが簡単そうは「node.jsでTwitteのタイムライン取得」でも書きましたが
ほんとに簡単に実装が出来ました。
npmというパッケージマネージャーでフレームワークなどのライブラリを取り込めるのでいろいろ可能性があります。

負荷分散はC10k 問題で「apache vs nginx」=「スレッド対イベントループ」を取り上げています。
Apacheはスレッド、nginx はイベントループで、スレッドモデルは実行スタックをコピーするので
スレッド(アクセス)が増えるほどメモリ使用率が上昇するが、イベントループはプロセスは1個なので
メモリ使用量はあまり上がらないので、大量のアクセスに関してはイベントループが有利ということ。

そして、Node.jsは後者のイベントループ
これによって、特定の重い処理を待つことなく、次の入力を受け取れるので
トランザクションを重視するより、短縮URLのようなIOを優先されるような場合で活用できそう。

AndroidアプリでWebView

Javaでゴリゴリ書かなくても、WebView+HTML5でアプリっぽく何かを作ろうと思う。

詳しくはココ
http://developer.android.com/reference/android/webkit/WebView.html

マニュフェストに必要

<uses-permission android:name="android.permission.INTERNET" />

インスタンスの場合

WebView webview = new WebView(this);
setContentView(webview);

XMLで定義する場合

setContentView(R.layout.main);
webview = (WebView) findViewById(R.id.webview);
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<WebView
android:id="@+id/webview_1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>

URLの読み込み
HTMLファイルとして、HTMLの文字列を渡してもOKそう。

webview.loadUrl("http://www.google.com");

WebViewClient
そのままだとページ内のリンクをクリックすると、
標準ブラウザになってしまうが、自分のWebViewで遷移先も表示させるには

webview.setWebViewClient(new WebViewClient() {});

デフォルトのズームコントロールを使う

webview.getSettings().setBuiltInZoomControls(true);

JavaScript を有効にする

webview.getSettings().setJavaScriptEnabled(true);

まだ試してないけど、cookieは標準ブラウザのデータとは共有しない。
http://developer.android.com/reference/android/webkit/CookieSyncManager.html