アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

Nekoと遊ぼう

こんにちは。連日の猛暑で完全に夏バテの高橋です。

さて、皆さんは犬と猫ではどちらが好きですか?
私はどちらかと言えば犬のほうが好きですが、今回は猫と遊ぼうと思います。とはいっても、猫はネコでも「Neko」というプログラミング言語です。

私も最近まで存在を知らなかったのですが、「【レビュー】新進気鋭のプログラミング言語「Neko」ってなに?」の記事を読んで興味がわいたので、ちょっと触ってみようと思います。

まずは、Nekoのサイトへアクセスします。

http://nekovm.org/

なんか怖い顔のお出迎えです。猫というより狼のような……。

それはさておき、Neko Language Specificationへアクセスして、言語仕様を見てみます。
ざっと眺めてみると、確かにPHPJavaScriptを知っている方なら、すぐ覚えられそうです。ただ、組み込み関数の呼び出しに「$」が付いて、変数には「$」が付かないので、PHPを書きなれている方はタイプミスしそうですね。

では、早速使ってみるべくDownloadsへアクセスし、一番手軽に試せそうなWindows binariesをダウンロードします。
ダウンロードが終わったら、neko-1.6.0-win.zipを展開し「c:\neko」として配置します。
あとは、Neko Starter's Guideを見ながら触っていきます。

はじめにコマンドプロンプトを開き、動作確認を行います。



C:\>cd c:\neko

C:\neko>neko test
The virtual machine is working !
Calling a function inside std library...
Test successful


無事動作したので、次に、hello.nekoというファイルを作成します。



$print("hello neko world !\n");


そして、コンパイルします。



C:\neko>nekoc hello.neko


hello.nというファイルが出来ましたので、実行してみます。



C:\neko>neko hello
hello neko world !


無事動作しました!

今度はAn Introduction to Mod_nekoを見ながらいじってみます。
Apacheモジュールだけでなく、なんとWebサーバまで用意してあるんですね。早速動かしてみます。



C:\neko>nekotools server
Starting Neko Server on localhost:2000


ブラウザで「http://localhost:2000/」へアクセスしてみます。
404 Not Foundのページになりますが、ページのフッターに「Neko Web DevServer」と表示されますので、ちゃんと動作しているようです。
とりあえず今回はApacheへのセットアップはおいといて、このまま進めていこうと思います。

では、index.nekoファイルを作成します。



$print("Hello Mod_neko !");


コンパイルします。



C:\neko>nekoc index.neko


index.nが出来たことを確認し、再度「http://localhost:2000/」へアクセスします。



Hello Mod_neko !


無事表示されましたので、index.nekoを書き換えて、次の例を試します。



get_params = $loader.loadprim("mod_neko@get_params", 0);
$print("PARAMS = " + get_params());


今度は「http://localhost:2000/?p1=v1&p2=v2」としてアクセスします。



PARAMS = [p1,v1,[p2,v2,null]]


渡したパラメータが無事表示されました。これでパラメータの取得を行う処理が書けますね。

他にどんなことができるのか、Neko Librariesを見てみます。
お、MySQLの文字が見えますね。リンク先のページを見てみると、最低限必要な関数は一通り揃っているようですので、MySQLへアクセスするプログラムを作成してみます。

まずは、MySQLサーバへ接続して、データベースを作ります。



CREATE DATABASE `neko` DEFAULT CHARACTER SET utf8;


次に、テーブルを作成して、データを登録します。



CREATE TABLE `neko` (
  `id` INT NOT NULL auto_increment,
  `name` VARCHAR(255),
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

INSERT INTO `neko` (`id`, `name`) VALUES (1, 'タマ');
INSERT INTO `neko` (`id`, `name`) VALUES (2, 'ミケ');
INSERT INTO `neko` (`id`, `name`) VALUES (3, 'シロ');


準備が整ったので、mysql_test.nekoファイルを作成します。
と思ってはみたものの、MySQLの関数をどうやって呼び出せばいいのかわかりません……。
とりあえず、ググってみます。

http://lists.motion-twin.com/pipermail/neko/2006-January/000633.html
http://lists.motion-twin.com/pipermail/neko/2006-January/000649.html

どうやらloadprimを使ってfunctionを作ってから使用すればいいようです。では、そのように書いてみます。



// MySQL function
mysql_connect   = $loader.loadprim("mysql@connect", 1);
mysql_close     = $loader.loadprim("mysql@close", 1);
mysql_select_db = $loader.loadprim("mysql@select_db", 2);
mysql_query     = $loader.loadprim("mysql@request", 2);
mysql_fetch_row = $loader.loadprim("mysql@result_next", 1);

// Main
connection = mysql_connect({host => "localhost", port => 3306, user => "user", pass => "password"});
mysql_select_db(connection, "neko");
result = mysql_query(connection, "SELECT * FROM neko");
while((row = mysql_fetch_row(result)) != NULL){
    $print(row + "<br />\n");
}
mysql_close(connection);


お約束のコンパイルです。



C:\neko>nekoc mysql_test.neko


mysql_test.nファイルが出来たので、「http://localhost:2000/mysql_test.n」へアクセスします。



{ name => タマ, id => 1 }
{ name => ミケ, id => 2 }
{ name => シロ, id => 3 }


ちゃんとデータベースからデータを取得できました!

スクリプト言語に慣れてしまった身には、ファイル修正後のコンパイル作業がちょっと面倒に感じられますが、VMのサイズも小さく、動作も軽快でなかなか好印象です。
LAMN(Linux+Apache+MySQL+Neko)環境で何か作ってみるのもいいかも知れませんね。