2014年1月13日月曜日

JavaScriptでCプリプロセッサを使用する

「ハイパフォーマンスJavaScript」の本にも書かれているのですが、JavaScriptでCプリプロセッサを使用するといろいろと便利です。


一つのソースファイルでC言語とJavaScriptの両方で動くものも作れます。
写真をたくさん表示するページなど、表示オブジェクトの動きの多いページを作るときは座標の計算をC言語でやれば、デバッグが早くて、テストコードも簡単に自動化できて便利です。

さらに、googleドライブを使うと、自分の使うPCやスマホでデータをすべて同期できるので、電車の中とかでも自分のソースがみれて便利。

---------------
#ifndef JAVASCRIPT
#include<stdio.h>
#ifdef _WIN32
#include<windows.h>
#endif
#ifdef unix
#include<unistd.h>
#endif
#endif /* JAVASCRIPT */

#ifdef JAVASCRIPT
#define int var
#else
#define null 0
#endif

#ifdef JAVASCRIPT
function print(name)
#else
void print(char* name)
#endif
{
#ifdef JAVASCRIPT
if(name==null)return;
$("#body").append(name+"<br/>");
#else
printf("%s\n",name?name:"null");
#endif
}

#ifdef JAVASCRIPT
function mysleep(ms)
#else
void mysleep(int ms)
#endif
{
#ifndef JAVASCRIPT
#ifdef _WIN32
Sleep(ms);
#endif
#endif
}

//
//
//

int MYEVENTNO_ONKEYDOWN=1;

int MYKEYCODE_RIGHT=37;
int MYKEYCODE_LEFT=39;
int MYKEYCODE_UP=38;
int MYKEYCODE_DOWN=40;

int event_no=0;
int event_param1=0;
int event_param2=0;

int a_x=50;
int a_y=50;



//
//
//
#ifdef JAVASCRIPT
$(function(){
oninit();
main();
});
#endif

//
//
//

#ifdef JAVASCRIPT
function cursor_init()
#else
void cursor_init()
#endif
{
a_x=50;
a_y=50;
}

#ifdef JAVASCRIPT
function cursor_update()
#else
void cursor_update()
#endif
{
if(event_param1==MYKEYCODE_LEFT){
a_x+=50;
if(a_x>500)a_x=500;
}
if(event_param1==MYKEYCODE_RIGHT){
a_x-=50;
if(a_x<50)a_x=50;
}
if(event_param1==MYKEYCODE_DOWN){
a_y+=50;
if(a_y>300)a_y=300;
}
if(event_param1==MYKEYCODE_UP){
a_y-=50;
if(a_y<50)a_y=50;
}
}

//
//
//

#ifdef JAVASCRIPT
function view_init()
#else
void view_init()
#endif
{
//print("view_init");
#ifdef JAVASCRIPT
$("#body").append("<div id=\"tag1\"></div>");
$("#tag1").css({
position:"absolute",
overflow:"hidden",
border:"solid",
width:"300px",
height: "300px",
left: ""+50+"px",
top: ""+50+"px",
});
$("#body").keydown(function(evt){ event_no=MYEVENTNO_ONKEYDOWN; event_param1=evt.keyCode;});
#endif
}

#ifdef JAVASCRIPT
function view2_init()
#else
void view2_init()
#endif
{
//print("view2_init");
#ifdef JAVASCRIPT
$("#tag1").append("<div id=\"tag2\"></div>");
$("#tag2").css({
position:"absolute",
border:"solid",
width:"50px",
height: "50px",
left: ""+a_x+"px",
top: ""+a_y+"px",
});
$("#body").keydown(function(evt){ event_no=MYEVENTNO_ONKEYDOWN; event_param1=evt.keyCode;});
#endif
}



#ifdef JAVASCRIPT
function view2_update()
#else
void view2_update()
#endif
{
//print("view2_update");
#ifdef JAVASCRIPT
$("#tag2").animate({
left: ""+a_x+"px",
top : ""+a_y+"px",
},200);
#endif
}

//
//
//

#ifdef JAVASCRIPT
function oninit()
#else
void oninit()
#endif
{
//print("oninit");
cursor_init();
view_init();
view2_init();
}

#ifdef JAVASCRIPT
function onkeydown()
#else
void onkeydown()
#endif
{
//print("onkeydown");
cursor_update();
view2_update();
}


#ifdef JAVASCRIPT
function main()
#else
int main(int argc,char* argv[])
#endif
{
int en=0;
//print("test");

#ifndef JAVASCRIPT
oninit();
#endif
while(event_no!=-1){
en=event_no;
event_no=0;
if(en==MYEVENTNO_ONKEYDOWN){
onkeydown();
}
#ifdef JAVASCRIPT
setTimeout(main,50);
break;
#else
mysleep(50);
#endif
}
return 0;
}





2014年1月10日金曜日

乾電池の電圧を聞いてみた。

僕、個人的には「東京大学は、『日本の最高学府のうちの一つ。』」だと思っているのですが、世の中にはそうではないと謙遜している方もいらっしゃいます。

http://www.insightnow.jp/article/680

よく読むと、「※弊社の出版物などで、誤用をしているものがあれば、お知らせください(苦笑)。」とも書いてあります。
きっとgoogleのように、入社試験なんですね。
応募すると、この会社に入社できるかもしれないです。

これは大変なことだと思い、日本の理系の最高学府のうちでもっとも偏差値の高い大学院を卒業した数人に乾電池の電圧を聞いてみました。

東大の漢文の入試問題の答えを中国人に聞いてみた以来の実験です。


Aさん:30V

おー、クイズダービーの最終問題の篠沢教授。

Bさん:50V

ついにこういう時がきたか。こりゃー正しい答えが電話。

Cさん:1.5V

インドの大学で教わって、日本に留学に来たそうです。
やっぱ、インディアン嘘つかない。
http://earthlodge.main.jp/wind/log/2007/08/post_97.html


何ボルトだと思います?
コンビニでパナソニックの乾電池エボルタなどをいくつか買って測ってみました。
なんと、1.7Vか1.6V。

http://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%AD%E3%82%B7%E3%83%A9%E3%82%A4%E3%83%89%E4%B9%BE%E9%9B%BB%E6%B1%A0

本当に申し訳ございません。実は最後のオチは実際には計測してないです。ねつ造です。



2014年1月9日木曜日

JavaScriptでイベントループを作る。

JavaScriptのイベントコールバック関数って適当に書くと、コードが増えてくると、どんどんぐちゃぐちゃになっていきます。

イベントループを作って処理すると誰でも簡単に読みやすいコードがかけるんじゃないかと思い、ためしに作ってみました。



---------

function print(str)
{
    $("#body").append(str+"<br/>");
}


var event_no=0;
function oninit()
{
    $("#body").append("<div id=\"tokucyo1\">イベント1</div>");
    $("#tokucyo1").click(function(){event_no=1;});
    $("#body").append("<div id=\"tokucyo2\">イベント2</div>");
    $("#tokucyo2").click(function(){event_no=2;});
    $("#body").append("<div id=\"tokucyo3\">イベント3</div>");
    $("#tokucyo3").click(function(){event_no=3;});
    return 0;
}

function func1()
{
    print("event1");
    return 0;
}

function func2()
{
    print("event2");
    return 0;
}

function func3()
{
    print("event3");
}


function main()
{
    var en=0;

    //oninit();
    //while(1){
        en=event_no;
        event_no=0;
        //if(en==-1)break;
        switch(en){
        case 1:
            func1();
            break;
        case 2:
            func2();
            break;
        case 3:
            func3();
            break;
        }
        //mysleep(100);
       setTimeout(main,100);
    //}
}
//main=Concurrent.Thread.compile(main);

$(function(){
    oninit();
    //Concurrent.Thread.create(main);
    main();
});


JavcaScriptでsleep関数を作る

JavaScriptでsleep関数を使いたくなる時があります。
残念ながら、多くのサイトにはsleep関数はないと書いてあります。

でも、そんなときはConcurrentThread.jsがお勧めです。
http://sourceforge.jp/projects/sfnet_jsthread/releases/


関数をコンパイルする関数を呼び出さないといけないのですが、このように簡単にスリープできます。
C言語風に書いてみました。
スリープだけでなく、スレッドも作れます。


---------------
function print(str)
{
    $("#body").append(str+"<br/>");
}

function mysleep(ms)
{
    Concurrent.Thread.sleep(ms);
}
mysleep=Concurrent.Thread.compile(mysleep);


function main()
{
    print("Hello Javascript World!!");
    mysleep(1000);
    print("Hello Javascript World!!");
}
main=Concurrent.Thread.compile(main);


$(function(){
    Concurrent.Thread.create(main);
});


2014年1月7日火曜日

C++でrangeイテレータを作ってみた。

c++14ではforループがPythonのようにレンジベースで操作できるようになるらしいです。
そこで、c++11でPythonのようなrangeイテレータを作ってみました。
イテレータをゼロから作るといろいろと勉強になります。



-------------------------------

#include <stdio.h>
#include <iostream>
#include <algorithm>

using namespace std;

class range{
public:
class iterator {
public:
int operator *() const { return i_; }
const iterator &operator ++() { ++i_; return *this; }
iterator operator ++(int) { iterator copy(*this); ++i_; return copy; }
bool operator ==(const iterator &other) const { return i_ == other.i_; }
bool operator !=(const iterator &other) const { return i_ != other.i_; }
iterator(int start) : i_ (start) { }
private:
unsigned long i_;
};

public:
range(int start,int stop):a_(start),b_(stop){}
iterator begin() const { return iterator(a_); }
iterator end() const { return iterator(b_); }
public:
int a_,b_;
};


int main () {

range i(0,5);
for(int a:i)printf("a=%d\n",a);

return 0;
}



2014年1月6日月曜日

ソート アルゴリズム

最近、日本の大学とアメリカの大学で教える情報教育にものすごい差があることにとても驚かされます。

たとえば、理系の情報学科の学生が大学一年で習う、数値を小さい順に並べるアルゴリズム。
日本の多くの大学生はqsortという関数を教えられますが、スタンフォードの学生はラムダ式で記述。
C++言語やJava言語なんて昔とまったく文法違うんです。
ビジネス的に生産性の高いというか、安く品質の良いコードが書けるようにプログラム言語の記述方法が変わってきています。そして、大学の教育でもきちんと生産性の高い記述方法を教える。
この一貫した体制というか新しいものを常に求める姿勢が本当に素晴らしいです。

C++でのソートの方法を時代ごとに書いてみました。
下に行くほど最新の記述方法になります。

昔はgccでコンパイルしていたものが、いまやMacOSやGoogleではclang+llvmになっています。
スタンフォードではもちろん最新のコンパイラ。
たぶん日本の大学は中国とインドと比べても負けてます。

日本の情報分野の生産性の低さと競争力のなさをとても悲しく思う今日この頃。



------------------------
#include <stdio.h>
#include <iostream>
#include <algorithm>

using namespace std;

int myqfunction (int* i,int* j)
{
return *i-*j;
}

bool myfunction (int i,int j)
{
return (i<j);
}

struct myclass {
  bool operator() (int i,int j) {
 return (i<j);
  }
} myobject;


int main () {
  int myints[] = {32,71,12,45,26,80,53,33};

  // using qsort
  qsort(myints,8,sizeof(int),(int(*)(const void*,const void*))myqfunction);

  // using default comparison (operator <):
  sort (myints, myints+8);

  // using function as comp
  sort (myints, myints+8, myfunction);

  // using object as comp
  sort (myints,myints+8, myobject);

  // using rambda
  sort (myints,myints+8, [](int x,int y){return (x<y);});


  return 0;
}



2013年12月29日日曜日

Micro Piano

昨日は僕の誕生日でした。Facebookでいろいろな方にお誕生日おめでとうと言われました。
ありがとうございます。ついでなので、僕のほしいものを書いておきます。

ぼく、来年くらいにミニ楽器が流行ると個人的に勝手に思ってます。
ここ数年、高機能なデジタル機器が数千円で買える時代。デジタル楽器も数千円でかなり高機能なものが買えます。

そこで、僕、家におけるグランドピアノほしいのです。
これ、KORGのMicroPiano。アマゾンだと17800円。

http://www.amazon.co.jp/KORG-%E3%83%8A%E3%83%81%E3%83%A5%E3%83%A9%E3%83%AB%E3%83%BB%E3%82%BF%E3%83%83%E3%83%81%E3%83%BB%E3%83%9F%E3%83%8B%E9%8D%B5%E7%9B%A4%E6%90%AD%E8%BC%89-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88%E3%83%BB%E3%83%94%E3%82%A2%E3%83%8E-MICROPIANO-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%BB%E3%83%94%E3%82%A2%E3%83%8E/dp/B0043U631S

おもちゃのピアノのレベルをはるかに超えていて、かなりすごいレベルの演奏ができるようです。
実際の演奏の様子はこちら。
http://www.youtube.com/watch?v=tuZ2LOqV3DI

これが17800円なんて、安すぎ。どうやって作ってるのでしょう。