2011年4月7日木曜日

YAMLからJSONへ JSONからYAMLへ 変換 メモ

YAML→JSON JSON→YAML 変換 メモ


CouchDBを使っていて、コマンドラインでJSONのサンプルデータを入力していると、
”文字列”に””をいちいち付けるのが

 面 倒

YAMLなら””付けなくてもいいのに!

という事で、YAML→JSON ついでにJSON→YAMLを作成した。

とはいっても、Rubyでは、ライブラリが豊富なので、ほんの数行でOK!

今回YAMLは標準のライブラリ、JSONは
$ gem install json
でインストールしておく。
自インストールの場合は require "rubygems”も宣言
($ gem install ya2yaml)もなければインストール

---------------------------------------------------------------------------
ytj.rb (yaml to json)

require "rubygems"
require "yaml"
require "json/pure"

streof = <<'EOF'
名前: 永田浩一
電話番号: 090-0000-0000
年齢: 28
EOF

ypon = YAML.load( streof );
jpon = JSON.pretty_generate(ypon);
puts jpon


---------------------------------------------------------------------------
jty.rb (json to yaml)

require "rubygems"
require "json/pure"
require "yaml"
require "ya2yaml"

streof = <<'EOF'
{
"名前": "永田浩一",
"電話番号": "090-0000-0000",
"年齢": 28
}
EOF

jpon = JSON.parse( streof );

#YAML.loadでも読める
#jpon = YAML.load( streof );

$KCODE = 'utf8'
puts jpon.ya2yaml





という事で、さすがRuby。
JSONはYAMLのサブセットなので、Jsonを読むだけならYAMLオブジェクトでも読める。
ライブラリがutf8のみの対応みたいで、変換時に$KCODEを設定するのが味噌です。

ちなみに私の年齢は大嘘です。ごめんなさい(ーくー)m


2011年4月6日水曜日

CouchDBをMacでJavaScriptを使ってJSONPしてハマった所メモ

1 マックはデフォルトの設定では、Couchdbでjsonpできない。
futonで、下記の「allow_jsonp」を「true」にする

(Ubuntuではこの設定なくて、デフォルトでjsonpできたのになぜ?
 バージョンのせいか、macがルートでインストールしなかったせいだろう多分)




2 マックでは、jsonの日本語が文字化けする
<例>
function k_getdoc(){
  var gtjdot = 'http://127.0.0.1:5984/cocktail-book/matini" + "callback=?';


  $.getJSON(gtjdat, function(jdata){
    var jstr = JSON.stringfy(jdata); //jsonオブジェクトを文字列に
alert(jstr);  //日本語文字化け
    kdoc = eval('(' + jstr + ')');  //evalを使うと簡単に日本語になる!
alert(kdoc);  //日本語OK
  });
}


3  削除(DELETE)の時は、&でcallback=?をつなげる
<例>
function k_deldoc(){
  var gtjdot = 'http://127.0.0.1:5984/cocktail-book/matini?rev=XXXX' +  '&callback=?'  //&で ま当たり前か


  $.delJSON(gtjdat, function(jdata){  //注意!jqueryにdelJSONはありません自作です
alert("データを削除しました”);
  });
}


以上、C、C++屋なんで、Javascriptなんてほとんどやったことなかったので、常識かもしれませんが、

ハ マ っ て しまいました。

詳細のソースはこちらのツールを作った時なので参照
http://vasdaqtv.blogspot.com/2011/04/couchdb-couchdbgoza.html

2011年4月5日火曜日

CouchDB用のツールを作ってみた CouchDBマネージャ「Goza」蓙

CouchDBを使っていると、CurlコマンドやTelnetなどで、URLやJSONをコマンドラインで記述して、




結 構 面 倒  くさい。



DBの基本操作を画面で行って、HTTPリクエストの文字列をコピペで使いたい!

なので、CouchDBマネージャ「Goza」蓙(ござ)を作ってみた。
元々たたみにしようかと思ってたら、Couchのツールかなんかで、「tatami」がありそうだったのと、
被災者の方が、「ござをひいて寝てます」とテレビで言っているのを聞いて、
この地震を忘れないように、「Goza」にしました。

現時点のバージョンは、まだMacでしかテストしてません。
近日中にLinuxとWindowsでテストします。(会社で。。。)

様々なサイトを参考にさせてもらいましたが、メインで参考にしたのは、
ゆったリラックス! CouchDBがあるところ(2)APIとDesign Documentでカクテルブックに挑戦
です。

という事で、下記の画面サンプルも、カクテルブックがサンプルで表示されています。






画面続き


使い方

上から順に、
URL入力→サーバ情報取得ボタン押下→DBの一覧が表示
DB名入力→データベース情報取得ボタン押下→全てのドキュメントが表示
キー(_id)を入力→ドキュメント取得ボタン押下→ドキュメント内容表示

データ更新して 新規/更新(PUT)
  (キーを変えれば新規になる)
もしくは 削除(DELETE)
全ての操作は、画面一番上のコンソールにHTTPリクエストが文字で表示されるので、
コピペして再利用が出来るという、超手抜きツールです。




<注意>


◯ダウンロードしてすぐ起動出来るように、1ファイルであえて作っています。


◯画面サイズはiPhoneでもいずれ使いたいので、横幅640以内になるようにしてます。


◯JSONP解釈に、eval使用してます(ご注意)


◯まだ十分テストしてません

◯ソースコードはこちら↓




2011年4月4日月曜日

node.jsインストール メモ(macで、brewを使って)Expressも

以下2010年3月14日 ヤフーブログの記事です。元記事 http://blogs.yahoo.co.jp/coke_kouichi/60356780.html
↓ヤフーブログは、Microsoft Silverlightが異常終了するようになったので、こちらにメモを移しました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

東北地方で地震が発生し、
津波、原発と日本中が大騒ぎなので、
気持ちを落ち着ける為にも、
かねてから気になっていた、
node.js、WebSocket、couchdb
でいろいろ試してみようかな!


マックでnode.jsのインストール (brewを使って)

昔BarkleyDialog(コマンドラインからストリームで文字列を渡せば、ダイアログを表示してくれるという簡単なツール)を会社の教育用にインストールしようとしたら、MacPortsで、5時間くらいしてもインストール完了しなくて、途中であきらめた事がある。多分定義ファイルがおかしくて、片っ端からUNIX関連の関係ないものをインストールしまくっていた。
という事で、node.jsのインストールにはbrewがいいらしいと聞いてトライしてみた

XCodeをインストールしている事が前提らしい。
(開発関連のコマンドが入るからだろう多分)

○まず、brewのインストール。

(HomeBrewって、マックのターミナルにあるHomeBrewとは違うらしい)

$ ruby -e "$(curl -fsSLk https://gist.github.com/raw/323731/install_homebrew.rb)" 

スーパーユーザのパスワードを聞いてくるので、パスを入力してね

echo $PATHで、パスを確認。なければ下記追加
export PATH=/usr/local/bin:$PATH

($ which brew でbrewのインストール先を確認)

brewここまで
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

○node.js自身はbrewがあれば簡単
$ brew install node
とりあえずnode.jsのイストールは完了

make installするから時間は少しかかるかも

○node.jsのパッケージマネージャ(RubyのGemsにあたる)のnpmインストール
$ curl http://npmjs.org/install.sh | sh
(curlはリッチクライアントと思ってたら、cURLで、URL指定でファイル転送するものらしい)
(npmでインストール出来る役立ちパッケージは、http://www.atmarkit.co.jp/fwcr/rensai2/nodejs01/02.html を参照)


○続いてnode.jsのバージョン管理システムをnpmでインストールしておく
$ npm install nvm
$ source ~/.bashrc

node.jsのバージョンを切り替えたかったら
$ nvm install v0.4.2 
(0.4.2は2011年3月14日時点でのnode.js安定板だ)

$ node -v でバージョンを確認できる)

nvmが.bashrcに下記を勝手に追加しているか確認する
# ADDED BY npm FOR NVM
. /usr/local/lib/node/.npm/nvm/0.1.0/package/nvm.sh
# END ADDED BY npm FOR NVM


node.jsを使う前にパスをきっとく
export NODE_PATH=/usr/local/lib/node:$PATH
export PATH=/usr/local/share/npm/bin:$PATH

上記も.bashrcに入れとけば、毎回きらなくてOK
(macの.bashrcは、デフォルトではターミナルが起動時に実行してくれないので注意)

node.jsここまで
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

○Expressのインストール
Expressは、Rubyのsinatraみたいなフレームワーク
大規模業務システムじゃなければ、Expressを使った方がRailsよりはるかに効率的開発が出来る
(RailsライクなExpress on Railwayというのもあるらしい)

$ npm install express

($ which express でパスを確認)

expressここまで
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

ここでお試しのHelloWorld

helloworld.js という名前で

console.log("Thank you World, We never forget this earthquake 2011.03.11");

$ node helloworld.js
Thank you World, We never forget this earthquake 2011.03.11



という事で、今回被災にあわれた皆様やご家族の方、お悔やみ申し上げます。世界の人たち、ご協力ありがとうございます。

node.js express ejs でUNIXのコマンド実行ツールを作ってみた!

サーバでコマンドを実行し、Webで結果を表示するツールを作ってみた。
ただ、セキュリティ考えれば、サーバに入れて公開してはいけません。
あくまでローカルで、node.jsの動作確認用です。ご注意を!(当たり前ですね)




index.ejs (viewsディレクトリに入れる)

 <html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>kcmd</title>
<script type="text/javascript">
<!--
var cwd;
function check(){
  cwd = document.getElementById('cwd');
  cwd.value = cwd.value;
  return true; // 「OK」時は送信を実行
}
// -->
</script>
</head>


<body>
<form name="kform" method="GET" action="/command" onSubmit="return check()">
作業ディレクトリ:<input type="text" id="cwd" name="kcwd" value="/users"><p>
UNIXコマンドを入力してください: 例 ls -l<p>
$<input type="text" name="kcmdline" size="80"> 
<input type="submit" id="kcmdbtn" value="コマンド実行"><p>
</form>
<div id="dbs">実行結果</div><p>
<h2 style="color:green;background-color:black">
  <% if (message) { %>
    <pre><%= message %></pre>
  <% } %>
</h2>
</body>
</html>



app.js ( $node app で起動する)

var app = require('express').createServer();

app.set('view options', { layout: false });
app.set('view engine', 'ejs');

app.get('/', function(req, res){
  res.render('index.ejs', {
    locals: {
      message: ''
    }
  });
});

//コマンド実行サブミット処理
app.get("/command", function(req, res){
  var cmdstr;

  var util = require('util'),
      exec = require('child_process').exec,
      child;

    var kcwd = req.param("kcwd");
    var kcmdline = req.param("kcmdline");
    console.log('input command is:' + kcmdline);
    console.log('at:' + kcwd);

    child = exec(kcmdline,
    { encoding: 'utf8',
    timeout: 0,
    maxBuffer: 200*1024,
    killSignal: 'SIGTERM',
    cwd: kcwd,
    env: null },

    function (error, stdout, stderr) {
      console.log('stdout: ' + stdout);
      cmdstr = stdout;
      console.log('stderr: ' + stderr);
      res.render('index.ejs', {
        locals: { 
          message: cmdstr
        }
      });
      if (error !== null) {
        console.log('exec error: ' + error);
      }
    }
  );
});

app.listen(8124);
console.log('kcmd: Server running at http://127.0.0.1:8124/');



node.js 手軽でツールとしても面白いね!