Node.js お勉強

いまさらですがNode.jsについての覚え書き

ここに書くよりもなんかgithubでマークダウン記法で書いた方が楽かなぁとか思ってそっちに今回は上げました。

https://github.com/mintsu/node_study

Nodeについて覚書
https://github.com/mintsu/node_study/blob/master/about_node.md

Node.jsを触ってみる
https://github.com/mintsu/node_study/blob/master/node_sample.md
XSSとか対策してないコードなので気をつけてくださいね!

node.js, php, perl, go, c 速度比較 メモ

node.js(v8) , php ,perl, go , c でどのくらい計算速度が違うのかちょっと気になったのでメモ。

for文で1~100000000を足していく処理を行ってみる。

$ time node -e 'var sum=0; for(var i=0; i<100000000; i++){ sum+=i;} console.log(sum);'
4999999950000000

real	0m0.904s
user	0m0.900s
sys	0m0.023s
$ time php -r '$sum=0; for($i=0; $i<100000000; $i++){ $sum+=$i;} echo $sum."\n";'
4999999950000000

real	0m6.361s
user	0m6.352s
sys	0m0.007s
$ time perl -e 'my $sum=0; for(my $i=0; $i<100000000; $i++){$sum+=$i;} print "$sum\n"'
4999999950000000

real	0m11.372s
user	0m11.363s
sys	0m0.005s
$ cat test.go
package main

import("fmt")

func main() {
    sum := 0
    for i:=0; i<100000000; i++ {
        sum += i
    }

    fmt.Println(sum);
}

$ time ./test
4999999950000000

real	0m0.085s
user	0m0.082s
sys	0m0.005s
$ cat test.c
#include <stdio.h>

int main() {
    long long int i, sum=0;
    for(i=0; i<100000000; i++){
        sum+=i;
    }
    printf("%ld \n", sum);

    return 0;
}

$ time ./test_c_O0.out
4999999950000000

real	0m0.338s
user	0m0.336s
sys	0m0.001s


$ time ./test_c_O1.out
4999999950000000

real	0m0.002s
user	0m0.000s
sys	0m0.002s


$ time ./test_c_O2.out
4999999950000000

real	0m0.002s
user	0m0.000s
sys	0m0.002s


$ time ./test_c_O3.out
4999999950000000

real	0m0.002s
user	0m0.000s
sys	0m0.002s
結果

node.js(v0.10.5) : 0.904s
php(v5.3.3) : 6.361s
perl(v5.10.1) : 11.372s
go(v1.2.2) : 0.085s
c(O0)(gcc 4.4.7) :0.338s
c(O1)(gcc 4.4.7) :0.002s
c(O2)(gcc 4.4.7) :0.002s
c(O3)(gcc 4.4.7) :0.002s

node.jsが結構早い。
以外だったのがphpよりperlが遅いこと。しかもだいぶ遅いです。
goはコンパイルが必要な言語だけあってやはりそれなりに早い。Cの最適化なし(O0)より早い結果に。
Cで最適化すると圧倒的な早さ。 最適化オプションをつけると内部的な処理はぜんぜん違うものになってたりすることがあるので、この結果を信用していいかは微妙ですが。

そのうちもう少し複雑な処理で比較してみたいです。

gitのプロジェクトをEclipseでインポートする

githubやbitbucketなどのリポジトリEclipseでインポートするときのメモ

鍵の作成

putty-genなどで鍵は作っておきます。
githubやbitbucketのほうに公開鍵を登録しておいてください。
鍵の作成方法は

putty-genというソフトを使って

SSH-2RSAを選択して「Generate」をクリックするだけでできます。

「publick key」と「private key」を保存しておきましょう



Eclipseに鍵を登録

Eclipseのメニューから
Preferences->General->Network Connections->SSH2
Add privateKeyをクリックして作成した秘密鍵を登録します。

プロジェクトのインポート

メニューから
File->import->Git->Projects from Git
を選びます

Nextをクリック

URI」を選択してNextをクリック


URIのところにbitbucketやgithubのcloneURLを入れると
Host:、Repository path:は自動で入るのでその状態で
Nextをクリック

ブランチを選んでNextをクリック

ここの選択したディレクトリはあとで使うので覚えておくなりメモしておくなりしておいてください。
Nextをクリック

今回はandroidのプロジェクトをインポートするので
「Use the New Project wizard」を選択してFinishをクリック

プロジェクト作成のウィザードが出てくるので
Android->Android Project from Existing Code
を選択してNextをクリック

Root Directoryに先ほどメモしたディレクトリを選択します。

NewProjectNameは編集できるので任意のプロジェクトネームに変えておきます。
Copy projects into workspace にチェックを入れてFinishをクリック

これでインポートは完了です。

cloneだけでなくそのままEclipseからコミットなどの操作もできるようにするために設定を行います

package explorerからプロジェクトを右クリックして
Team->Share Project
をクリック

プロジェクトがデフォルトで選択されていると思うのでそのまま「Finish」をクリック

この後
プロジェクトを右クリックして
Teamを選択するとCommitやpullなどgitの操作ができるようになっていると思います。

追記

このままだと pull の操作をした時にエラーが出たのでその時の対処を書いておきます。

プロジェクトを右クリックして
Team->Pullを選択すると次のようなエラーが出る場合があります

対処
git Repositories のperspectiveを開きます

対象のリポジトリを右クリックして
Propertiesをクリックすると下のような画面が出てきます

Add Entryをクリック
して次の値を入力して保存します

Key: branch.master.remote Value: origin
Key: branch.master.merge Value: refs/heads/master
Key: branch.master.rebase Value: true

これでpull等ができるようになるとお思います

WebRecommend公開

WebRecommend
というサービスをこっそり公開してみました。

どんなサービスかというと
おすすめの記事を見つけ出して、Twitterタイムラインに書き込む
といったものです。


実際これを作ったのは大学3年くらいの時につくってからもう2年になるのですが。
最初はPHPの練習と自分用にだけ使っていました。 以前からこれを見た友人に公開して欲しいとか言われていたので、2年ぶりくらいにプログラムに手を入れて一応公開いたしました。

サーバーに負荷のかかる処理をやっているため、とりあえず今は登録できる人数に制限をかけています。

需要がありそうであれば、もうちょっと登録出来る人数とか増やすかもしれません。 今のところあんまり需要なさそうなので、極少人数にしてます。

もし登録してみたいとかいう方いましたら、コメントにでも書き込んでいってくださいー

Mac OS X Snow Leopard バージョン10.6 で バンドルアプリケーションがインストールできない

Mac Book Pro (early 2011) にSnow Leopardクリーンインストールしたときにでたエラーのメモ。

概要

付属のアプリケーションをDVDをセットし、
「install Bundled Software」をダブルクリックし、手順通りインストールを進めていくと、
「インストールに失敗しました」
と表示されてインストールできない。

解決策

http://support.apple.com/kb/DL1512?viewlocale=ja_JP
からソフトをダウンロードし、
ソフトウェアインストーラーのアップデートをする。


メモ

一部のAppleソフトウェアがインストールできない問題が解決されると書いてあるので、バンドルソフトウェアだけでなく、ほかのソフトでも関係あるかも。
クリーンインストールしたときはこのソフトをアップデートしといたほうがよさそう。

セッションできるサイトを作ってみた

ブラウザ上でセッションできるサイトを作ってみました。

MIDI.js *リンク先で音がなります
少し前にMIDI.jsっというのを見つけて面白いなと思っていたのですが、
これって WEB MIDI APIと組み合わせたら演奏できそうだし面白そう!
と思って実験的に作ってみました。

ついでにいろんな人とセッションできたらもっと面白いよね!

ってこでWebSocketも使って実験的に作ってみました。


実際にセッションしてもらったときの動画もとってみました。


D



いくらWebSocketがリアルタイムに向いてるといえ、さすがにセッションするのは難しいかなーと思っていたのですが、安定で高速なネット回線があれば可能っぽいですね。


作ったサイトはこちら。
WebDuetto

Web MIDI APIを使ってみる

Web MIDI APIを使ってみました。

Web MIDI APIとは

Web MIDI APIとは、ブラウザとMIDI機器をつなぐものです。
HTML5の一部として、策定が進められています。

2013年10月13日現在
現在実装しているブラウザはGoogleChromeMac版のみです。

他のブラウザでも,Jazz-puluginというのを使えばMIDI機器をつなげるようになるらしいです。

使ってみる

http://www.w3.org/TR/webmidi/
大体はここを見ればわかります。

とりあえずこんなかんじに書いてみました。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>Web Midi API TEST</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script>
        $(function(){
            var midi = null;
            var inputs =null;

            navigator.requestMIDIAccess().then( onMIDISuccess, onMIDIFailure);
            function onMIDISuccess(midiAccess) {
                console.log( "MIDI ready!" );
                midi = midiAccess;

                inputs = midi.inputs()

                if(inputs.length==0){
                    $("#info").append("<p>利用可能なMIDIデバイスが見つかりませんでした</p>");
                }else {
                    for( var i=0; i<inputs.length; i++){
                        $("#device").append('<option value="'+ i +'">' + inputs[i]["name"]  + '</option>');
                    }
                }
            }
            function onMIDIFailure(msg) {
                console.log( "Failed to get MIDI access - " + msg );
            }

            function onMIDIMessage( event ) {
                console.log(event);
                var str = "MIDI message received [" + event.data.length + " bytes]: ";
                for (var i=0; i<event.data.length; i++) {
                    str += "0x" + event.data[i].toString(16) + " " ;
                }
                console.log(str);
            }

            $("#device").on("change", function(){
                var port = $("#device option:selected").val();
                console.log(port);
                inputs[port].onmidimessage = onMIDIMessage;
            });

        });
    </script>
</head>
<body>
    <h1>Web Midi API TEST</h1>
    <div id="info"></div>
    
    <select id="device">
    <option>選択してください</option>
    </select>

</body>
</html>

MIDI機器からの入力を受け取って、console.logで出力しています。
実際にMIDI機器をつないで、信号を送ったりすると、

MIDI message received [3 bytes]: 0x90 0x3c 0x60  
MIDI message received [3 bytes]: 0x80 0x3c 0x40  

というようなログが出力されます。
1バイト目は メッセージの種類
2バイト目は ノート番号
3バイト目は ベロシティ
です。

1バイト目のメッセージの種類というのは
0x90ならノートオン(キーボードを押した時)
0x80ならノートオフ(キーボードを話した時)
といったようなものです。

2バイト目はノートの番号です。
一般的にピアノであれば中央の「ド」の音が0x3c (60)になると思います。

3バイト目はベロシティです。
音の強弱の情報で、
1~127の間で、高いほうが強い音となります。

実際に作った確認のページはこちら
http://mintsu-dev.com/webmidiapitest/

Web MIDI API を使ってみんなでセッションできるサイトを作ってみました
Webduetto