gist

2012年5月15日火曜日

[Node.js] dnodeで簡単に非同期通信してみた

dnodeは、ソケット通信を利用して、クライアント/サーバ間で簡単に関数を実行できるNode.jsらしいパッケージです。

$ npm install dnode

サーバ側はこんな感じです。

server.coffee

dnode = require 'dnode'

server = dnode {
 hoge: (str, cb)->
  cb str + ' World!'
}
server.listen(8080)

dnodeメソッドで関数を指定し、listenでサーバを起動します。ここではhogeという関数を指定しています。

クライアント側はこんな感じで。

client.coffee

dnode = require 'dnode'

dnode.connect 8080, (remote)->
 remote.hoge 'Hello', (result)->
  console.log 'result=' + result

connect関数でポートを指定してサーバに接続。引数remoteで、サーバ側で指定した関数hogeを実行しています。第一引数に「Hello」を与えると、サーバ側で「World」が追加されて、resultに返却されます。

サーバーを起動してから、別ターミナルでクライアントを実行します。

サーバ側を起動

$ coffee server.coffee

クライアントを起動

$ coffee client.coffee 
result=Hello World!

socket.ioで実装することも可能ですが、dnodeを使うと、非常に簡単に通信が可能になります。

ブラウザ側にも対応しています。サンプルも豊富ですのでぜひお試しあれ。

それにしても、このキャラはなに?有名なの?

2012年5月14日月曜日

promptを使ってみた

promptは、コマンドラインからプロンプト入力できる Node.jsのパッケージです。

$ npm install prompt
prompt@0.1.12 ../../../node_modules/prompt 
├── pkginfo@0.2.3
├── colors@0.6.0-1
├── async@0.1.18
└── winston@0.5.11

CoffeeScriptはこんな感じです。

prompt = require 'prompt'

prompt.start()

prompt.get ['username', 'email'], (err, result)->
 console.log 'コマンドラインからの入力値:'
 console.log '  username: ' + result.username
 console.log '  email   : ' + result.email

実行してみます。

$ coffee sample.coffee 
prompt: username: ニャルラトホテプ
prompt: email: nyaruko@Lovecraft.com
コマンドラインからの入力値:
  username: ニャルラトホテプ
  email   : nyaruko@Lovecraft.com

prompt.get() メソッドの第1引数に、プロンプトに入力するキーを配列で指定します。第2引数には、エラーと結果(result)を引数としたコールバックを渡します。入力値はresultにキーを指定して取得できます。

入力値のバリデーションやパスワード入力(非表示)も可能です。

prompt = require 'prompt'

props = [
 {
  name: 'email'
  validator: /^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/
  warning: '正しいEmailを入力して下さい'
  empty: false
 }
 {
  name: 'password'
  hidden: true
 }
]

prompt.start()

prompt.get props, (err, result)->
 console.log 'コマンドラインからの入力値:'
 console.log '  email   : ' + result.email
 console.log '  password: ' + result.password

変数propsを作成します。各キーをオブジェクトで指定し、プロパティを設定します。

  • name:キーの名前を指定します。ユーザからの入力値を取り出す場合に使います。
  • validator:入力チェックを正規表現で指定します。
  • warning:入力チェックでNGだった場合の警告メッセージを指定します。
  • empty:必須入力ならfalse。
  • hidden:パスワード入力のように入力値を隠すならtrue。

実行結果です。

$ coffee sample.coffee 
prompt: email:  a 
error:  Invalid input for email
error:  正しいEmailを入力して下さい
prompt: email: sample@sample.com
prompt: password: 
コマンドラインからの入力値:
  email   : sample@sample.com
  password: password

promptは、hook.ioやwizardなど、27のパッケージから使われています。shouldやjshintと同じくらいでしょうか。充分使えるようです。

2012年5月10日木曜日

Nodepressを試してみた

Nodepressはシンプルなブログシステムです。

$ npm install nodepress
$ cp ./node_modules/nodepress/skeletons/blog/server.js .
$ node server.js 

Wordpressのようにはいけませんが、コードリーディングには最適です。

2012年5月9日水曜日

diskspaceで容量確認してみた

diskspaceは、ドライブの使用容量と空き容量、状態を確認できるパッケージです。

$ npm install diskspace

コードはこんな感じです。

diskspace = require 'diskspace'

diskspace.check '/', (total, free, status)->
 console.log 'Total : ' + total + ' Byte'
 console.log 'Free  : ' + free + ' Byte'
 console.log 'Status: ' + status

実行すると、こんな感じ。

$ coffee sample.coffee 
Total : 319213174784 Byte
Free  : 82739359744 Byte
Status: READY

大体あってますね。

使いどころがそんなに無いかも。

2012年5月8日火曜日

サンダルを履くようにブログを作成する「flipflop」

flipflopは、作者曰く「サンダルを履くような感覚でブログを作成できる」パッケージです。markdown形式で記事を書けます。記事は手動で書きます。

$ npm install -g flipflop

flipflop create でプロンプトが表示されるので、ブログの情報を入力します。

$ flipflop create
prompt: Blog title: My Blog
prompt: Blog description: This my blog site
prompt: May I create your blog @ "/Users/inouetomoyuki/Projects/node/my-blog"?: yes

my-blog というディレクトリが作成されます。早速起動してみます。

$ cd my-blog
$ flipflop start
/Users/inouetomoyuki/Projects/node/my-blog/articles
info:   http server listening. port=8080

http://localhost:8080 にアクセスします。

トレードマークなのか、サンダルが表示されます。シンプルなブログです。

記事を追加するには、articles ディレクトリに markdown形式で記述します。

その前に作者を登録します。blog.jsonを以下のように書き換えます。

{
 "title": "My Blog",
 "description": "This my blog site",
 "keywords": [],
 "authors": {
  "bradharris": {
   "name": "Brad Harris",
   "gravatar": "bmharris@gmail.com",
   "github": "bmharris"
  },
  "tomoyuki": {
   "name": "Tomoyuki INOUE",
   "gravatar": "sample@gmail.com",
   "github": "tomoyukiinoue"
  }
 },
 "articles": "articles",
 "domain": "http://yourdomain.com"
}

サンプルの記事をコピーして作ってみます。

$ cp -R articles/flipflop-ftw/ articles/hello-world

article.json に記事のメタ情報を記述します。authorには、blog.jsonに追記した作者のキーを記述します。

{
 "author": "tomoyuki",
 "title": "Hello World",
 "date": "05/09/2012",
 "publish": true,
 "tags": [
  "flipflop",
  "sample",
  "node.js"
 ]
}

article.md に記事の内容を記述します。

# flipflop

## サンダルを履くようにブログを作成しよう

+ **[markdown][]** - 記事をMarkdown形式で記述できます。
+ **[jade][]** - テーマをJadeテンプレートと[less][]でカスタマイズできます。
+ run it from a [node.js http server](#start-er-up), or [generate a static site](#static-sites-are-hawt) that you can host pretty much anywhere and not worry about dependencies.

---

## インストールする

**flipflop** はグローバルインストールすることでcliを提供します。

```
> npm install -g flipflop
```

## 新しいブログを作成する

```
> flipflop create
```

This starts a cli app that will prompt for a few bits of info about your blog, and create a directory for it in the `process.cwd()`.

## 起動する

Make sure you're inside your blog's directory.

```
> flipflop start <port>
```
check your browser @ `http://localhost:8080`
+ port is optional, defaults to 8080

起動してみます。

lessを使ってテーマも変更できます。2つのファイルだけで記事を追加できます。サンダルを履いたようには簡単、かもしれません、たぶん。

2012年5月7日月曜日

punchでサクッとHTMLを作る

punchは、サクッとHTMLを作れるパッケージです。JSONでデータ部分を、Mustacheでテンプレートを記述してサーバを起動するとHTMLができあがります。

$ npm install -g punch
$ mkdir sample
$ cd sample
$ npm install mime
$ punch setup

punch setup で以下のようなディレクトリが作成されます。

$ tree .
.
├── config.json
├── contents
└── templates

templatesディレクトリには、mustache形式でテンプレートを作成していきます。contentsディレクトリには、JSON形式でmustacheファイルへのデータwp記述します。

templates/about.mustache

<!doctype html>

  <head>
  <meta charset="utf-8">

  <title>{{title}}</title>
  </head>

  <body>

    <h1>{{title}}</h1>

   <p>{{{overview}}}</p> 

    <ul>
      {{#team}}
        <li><strong>{{name}}</strong> - {{bio}}</li>
      {{/team}}
    </ul>
  </body>
  </html>

contents/about.json

{
    "title": "About Us",
    "team": [
      {
        "name": "Pointy-Haired Boss",
        "bio": "Incompetent Manager"
      },

      {
        "name": "Wally",
        "bio": "Senior Engineer"
      },

      {
        "name": "Dilbert",
        "bio": "Engineer"
      }
    ]
  }

サーバを起動します。

$ punch server
Server is running on localhost:9009
Generating the site...
Serving requests...

ターミナルに戻ると、publicディレクトリにabout.htmlが作成されています。

<!doctype html>

  <head>
  <meta charset="utf-8">

  <title>About Us</title>
  </head>

  <body>

    <h1>About Us</h1>

   <p></p> 

    <ul>
        <li><strong>Pointy-Haired Boss</strong> - Incompetent Manager</li>
        <li><strong>Wally</strong> - Senior Engineer</li>
        <li><strong>Dilbert</strong> - Engineer</li>
    </ul>
  </body>
  </html>

mustacheで見た目よくテンプレートを作成できます。ちょっとしたHTML作成にはいいかもれません。

2012年4月30日月曜日

Node.jsでメール送信

weaverさんのnode-mailは、Node.jsでメール送信できるようにするパッケージです。テキストオンリーっぽい。

$ npm install mail

mail = require('mail').Mail({
 host: 'smtp.gmail.com'
 ,username: 'Gmailのアドレス'
 ,password: 'パスワード'
})

mail.message({
 from: '差出人のメールアドレス'
 ,to: ['宛先のメールアドレス']
 ,subject: 'Hello!'
}).body('このメッセージはNodeから送られました').send (err) ->
 throw err if err
 console.log 'Sended!'

実行結果

シンプルですので、テキストメールの送信だけであれば、こちらが便利そうです。