ページ

2015年11月25日水曜日

node.js配列データを同期処理する方法

Node.jsを利用し配列データを同期処理する方法を記載

どのように表現して良いかわからないのですが
以下のようなデータの処理です。


var datas = [{"id" : "1"}, {"id" : "2"}];

これを
id = 1
id = 2
と表示してくれるのを同期処理で書く方法です。
単純にfor文を利用すれば良いのではという話ではなく
datasはDBに保存したいデータとらえてください。

つまり実際には
INSERT INTO test(id) VALUES(1);
INSERT INTO test(id) VALUES(2);
と上記の処理をしたい比同期処理ではどちらが先にくるか不明のため
順番に配列からSQLを実行したい場合に考えた方法です。

結論的には再起処理を行います。
実際のサンプルは以下です。

function insert(datas, n, callBack) {
    if (datas.length == n) {
        if (callBack != null) callBack();
        return;
    }
    var sql = "INSERT INTO test(id) VALUES(" + datas[n].id + ")";
    console.log(sql);
    // 実際にここでSQLを実行.
    insert(datas, n + 1, callBack);
}

var datas = [{"id" : "1"}, {"id" : "2"}];
insert(datas, 0, function() {
    console.log("complite");
});
上記のようなソースになります。


INSERT INTO test(id) VALUES(1);
INSERT INTO test(id) VALUES(2);
complite
これで同期処理のようにできます。
ライブラリを使えばほかの方法もあると思うのですが
利用しない場合の考え方になります。

callback地獄感もありますが、これはこれで個人的には使い勝手が良いと思っています。

TensorFlowについて事前知識編【乱数生成】

Googleから出た話題の機械学習用のライブラリTensorFlow
こちらを触ろうと思い奮闘の備忘録

機械学習なんてやったことない+Pythonも初なのでサンプルを理解しようとするだけで必死とりあえず
ちょっとずつまとめ
※インストール手順等は公式ドキュメントとかを見て対応していただきますようにお願いいたします。
そのあたりはQiitaとかの方がすごく良いドキュメントがあります。

チュートリアルを見たらデータの生成があるのですが
まずはここからつまづいたのでまとめる

ランダムデータを作成する段階でわからなかった・・・・
じつはこの「np.float32」、「np.random.rand(2, 100)」はimport文を見たらわかるのですが
TensorFlowとは違いnumpyと言う数学用のライブラリです。
Python発なのでわからなかった(汗汗

と事前にnumpyについて少し備忘録をまとめます。

x_data = np.float32(np.random.rand(2, 100)) # Random input
これの意味ですが、0.0〜1.0までの乱数を2次元配列で100個作るという意味になります。

もっと値を小さくして2次元配列を5個つくるを実行
import numpy as np
x_data = np.float32(np.random.rand(2, 5))
print x_data
実行結果が以下

[[ 0.22113453 0.77961475 0.08531918 0.12012649 0.43397358]
[ 0.72542971 0.40160421 0.13799493 0.22445418 0.3758058 ]]


x_data = np.float32(np.random.rand(2, 5))
この中の2が次元を5が個数を表しているので変更すれば
相当な次元のデータが出来ると思います。


2次元配列で5個のランダム数が出来上がりました。
では、次に1〜10の少数にしたいであればどうするかは10をかけるだけです

import numpy as np
x_data = np.float32(np.random.rand(2, 5)) * 10
print x_data

[[ 5.39343119 5.11242962 2.86795855 7.04219055 6.99380398]
[ 1.75642431 2.2877152 8.44399357 4.74935007 5.61556864]]


高校数学の行列のイメージで0.0〜1.0の間の数字に10をかけてくれます。
ではさらに、1〜10の整数はどうするのか?
答えは以下です。

import numpy as np
x_data = np.int32(np.random.rand(2, 5) * 10)
print x_data

[[4 8 3 5 8]
[1 2 0 8 0]]


なんとなくfloat32をint32に変更すればうまいこといくと思ったのですが
先に10をかける必要がありました。 ということは0.0〜10.0までの少数も先に10をかけることも可能ということでした。
まだまだ難しい・・・

こちらを応用すれば整数は無限と出来ると思います。
64bit型がないか確認しところ以下できるみたいです。

x_data = np.int64(np.random.rand(2, 5) * 10)
x_data = np.float64(np.random.rand(2, 5) * 10)


なんかこれ以外とテストデータ作成もこれでできそうな気がしてたw
まずは基礎の基礎かと思いますが以上乱数生成に関する内容でした。