2016年6月20日月曜日

超軽量JavaScriptエンジンV7をつかってみた


超軽量なJavaScriptエンジンであるV7を使ってみました。
https://github.com/cesanta/v7

ファイルが一つなのでコンパイルも超簡単。
Arduinoなどの組み込みでも動くほど軽量だそうです。
当然Arduinoでなくても、WindowsやLinuxなどのOSでも動きます。
40kバイトくらいでうごくらしいし、こんなに軽量なのにきちんとEcmaScript5.1をみたしているのすごいですね。

C/C++の関数呼び出しとかも簡単にできるので、組み込みなんかの用途だけでなく、ちょとしたサーバプログラムや自動テストなどでPythonの代わりにも使えそうです。




2016年6月17日金曜日

ビッグデータ2.0

最近はビッグデータの処理方法も変わってきていて、ビッグデータ2.0なるものがあるらしいです。MapReduceとか抽象化が偏っているというかなんというか使いづらいしね。
NoSQLとかNon-RDBとか一時は言われたけど、結局またSQLに戻ってきたみたいです。


ということで、GoogleBigQuerlyを使ってみました。
高速だし、WebAPIになってるし、使いやすいし、本当によくできています。
Googleの作っているソフトウェアは、きちんと現状の問題点を的確に分析して、その問題をすらばらしい技術で解決するソフトウェアをすぐにリリースしていて本当にすごいです。
問題解決というのはビジネスの基本なのですが、日本の企業だとソフトウェアで同じことがなかなかできないのがとても残念です。







2016年6月9日木曜日

Googleフォームでメールを自動送信をする。

Googleフォームってアンケートや問い合わせをするようなホームページを簡単に作ることができます。

さらにGoogleフォームでは、GoogleAppsScriptというJavaScriptも動くので、例えば、問い合わせがあった場合に自動でメールを送るってことも簡単にできます。

しかし、問い合わせがあった場合にメールを送るよいJavaScriptのサンプルがなかなか公開されていません。ないので、作ってみました。

https://docs.google.com/forms/d/1si58tjz_6eDW9h7raLEBhR60iKTsrGfCcHjPTzxwTLc/viewform


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

//
// Mail Sender Script for Google Froms Rev 002
//

var g_response=null;
//
// common functions
//

function mysleep(ms)
{
  Utilities.sleep(ms);
}

function print(msg)
{
  try{
    Logger.log(msg);
  }catch(e){}
}

function sendEmail(address,title,body,cc,bcc)
{
  try{
    var ext=null;
    if(cc!=null || bcc!=null){
      ext={};
      if(cc!=null)ext['cc']=cc;
      if(bcc!=null)ext['bcc']=bcc;
    }
    GmailApp.sendEmail(address, title, body,ext);
  }catch(e){}
}

function setResponse(evt)
{
  if(evt!=null){
    g_response=evt.response;
    return;
  }
  var responses = FormApp.getActiveForm().getResponses();
  g_response=responses[responses.length-1];
}

function getSubmitValue(key)
{
  var ret="";
  try{
    var itemresponses=g_response.getItemResponses();
    for(var j=0;j<itemresponses.length;j++){
      var itemresponse=itemresponses[j];
      var title=itemresponse.getItem().getTitle();
      var value=itemresponse.getResponse();
      //print("title="+title);
      //print("value="+value);
      if(key==title)return value
    }
  }catch(e){}
  return ret;
}


//
// Event Trigger
//

function onSubmit(evt)
{
  var to="";
  var body="";

  setResponse(evt);
  to=getSubmitValue("メールアドレス");
  body=getSubmitValue("お問合せ内容");
  print("to="+to);
  print("body="+body);
  sendEmail(to,"test",body,null,null);
}



2016年6月2日木曜日

ヘッダファイルだけのライブラリを作る。

一つ前の記事でEigenのいうライブラリはヘッダーファイルしかなく、ヘッダーファイルをincludeするだけで使えると書いたんですが、グローバル変数とかってどうやって宣言するんだろう?と気になったので、ヘッダーファイルだけのライブラリの作り方を調べてみました。


どうやら論文書いた人がいるようです。

http://www.res.kutc.kansai-u.ac.jp/~ezawa/grad2001/Yamasaki/honbun.pdf

なるほど。
クラスのstaticメソッドのなかにstatic変数を定義して、その参照を返すのね。


ということで、ヘッダーファイルだけのライブラリのテンプレート作ってみました。
Eigenというライブラリは主にGoogleの人が書いてるっぽいんですが、やっぱGoogle賢いわ。

もうライブラリをコンパイルするなんて時代遅れなのね。
おじさんの頭が、C++の書き方が、時代遅れだったわ。

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


class HeaderOnly{

public:
static int& getValueA(){
static int a;
return a;
}
static HeaderOnly& getHeaderOnly()
{
static HeaderOnly he;
return he;
}
public:
int m_b;

};


#if 1
void set_headeronly()
{
int& a = HeaderOnly::getValueA();
HeaderOnly& h = HeaderOnly::getHeaderOnly();

a = 5;
h.m_b = 10;
}

void print_headeronly()
{
int& a = HeaderOnly::getValueA();
HeaderOnly& h = HeaderOnly::getHeaderOnly();
printf("a=%d\n", a);
printf("h.m_b=%d\n", h.m_b);

}

int main()
{
set_headeronly();
print_headeronly();
return 0;
}
#endif


Eigenを使ってみた。


最近、機械学習が流行っています。機械学習といっても単純なベクトル演算をしているだけなのですが、Eigenもこの機械学習のコア部分といいますか、ベクトル演算を行うライブラリの一つです。

Eigenのどこがすごいかというと、超高速なんていう他のサイトにも書いてあることは書きません。
個人的に感じるすごいところは、C++のテンプレートだけで実装されているので、ライブラリ自体を別途ビルドしなくても、includeファイルだけをもってくればつかえるところ。

しかもWindowsのMSVC、LinuxやMacOSXのclang、GCCなどありとあらゆるコンパイラーをサポートしているので、ほんとうにファイルをコピペするだけでサクッと自分のコードが書けて実行できます。

OpenCVとかのライブラリはぐちゃぐちゃでほんとひどいもんね。
やっぱGoogleすげー。

ほかのライブラリのビルドとかインストールっていつもすごくめんどくさくて、そのためにmakeなどのビルドツールがあるんですが、そんなの一切必要ありません。

Eigenのフォルダーをソースコードと同じところにおいて
gcc -I. hoge.cpp
とうつだけでコンパイルができます。
ビルドを行わなくても使えるって本当にすごいね。

やっぱり時代はコピペなんだね。
僕もこれからライブラリを作るときはテンプレートにしようっと

で、適当なサイトに落ちていた以下のコードをVisualStudioやCygwinコンパイルして実行してみました。なんか超簡単。

---------------------
#include <iostream>

// Eigenのコア機能とジオメトリ機能を使う
#include <Eigen/Core>
#include <Eigen/Geometry>


int main() {
  // 以下サンプルコードでは名前空間Eigenを省略
  using namespace Eigen;

  // 二次元ベクトルv1の定義。初期値は未定義
  Vector2f v1;

  // 初期値はコンストラクタで指定できる
  Vector2f v2(1.0f, 0.5f);
  Vector3f v3(0.0f, 1.0f, -1.0f);

  // 内容を表示
  std::cout << "v2\n" << v2 << std::endl;
  std::cout << "v3\n" << v3 << std::endl;

  // double型3x3行列の定義。初期値は未定義
  Matrix3d m;

  // 行列の初期値はコンストラクタで指定できないが
  // 値は以下のようにまとめて代入できる
  m << 1.0, 0.0, 0.0,
       0.0, 1.0, 0.0,
       0.0, 0.0, 1.0;

  std::cout << "m\n" << m << std::endl;
}