node-serialportを使ってArduinoとシリアル通信

node-serialportを使うと簡単にArduinoとお話ができます。

 

ただ、Readmeに書いてあるコードをそのまま実行しても、うまく通信できませんでした。

いろいろ試したところ、openイベントが発生してから、実際に通信ができるようになるまでに若干のタイムラグがあるっぽいです。

 

なので、NodeからArduinoに書き込みをしたい場合は、以下のようにsetTimeoutを設定するとうまくいきました。

var SerialPort = require("serialport").SerialPort
var serialPort = new SerialPort("/dev/tty.usbmodem1411", {
  baudrate: 9600
});
 
serialPort.on("open", function () {
  console.log('open');
 
  setTimeout(function() {
    serialPort.write("ls\n", function(err, results) {
      console.log('err ' + err);
      console.log('results ' + results);
    }); 
  }, 1000); 
});
 
serialPort.on('data', function(data) {
  console.log('data received: ' + data);
});
 
serialPort.on('error', function(err) {
  console.log('err ' + err);
});

 

ちなみに、Arduino側はExamples > 04.Communication > SerialEventのサンプルコードを実行しています。

 

イベント発生してるのに、その中でsetTimeoutしないといけないのは気持ち悪いですが、動いたのでひとまずよし。。

OpenFlow(Trema)の環境構築

OpenFlowとかいう謎の技術に触れてみたくなったので、まずRubyで開発ができるTremaフレームワークからはじめようと思います。

 

基本的にはGithubのページに書いてある通りにやればインストールできると思うのですが、yumを使う場合には対応するパッケージのインストールが必要です。

あと、Rubyはrvmを使って入れました。

# git、gcc、makeなどのインストール
$ sudo yum -y groupinstall "Development Tools"
 
# その他必要なパッケージのインストール
$ sudo yum install zlib-devel openssl-devel readline-devel sqlite-devel libsqlite3-devel libpcap-devel
 
# rubyのインストール
$ \curl -L https://get.rvm.io | bash -s stable --ruby
 
# と思ったら、1.9系はサポートされていないらしいので1.8.7を入れる
$ rvm install 1.8.7
$ rvm use 1.8.7
 
# tremaのインストール
$ gem install trema

Sublime Text 2でスペースやタブを除く行頭に移動したいとき

Sublime Text 2で、行頭に移動したい時は「control + a」を押せば移動できるのですが、

スペースやタブを除く行頭に移動したい場面も結構あって、そういうときはやっぱり「command + ←」を押す必要があります。

 

せっかくEmacs風のキーバインドを使ってコーディングしていても、そこで矢印キー押すためにホームポジションから離れるのはやだなぁ。

 

ということで、スペースやタブを除く行頭に移動するキーバインドの設定を追加しました。

以下がその設定。

 

Preferences > Key Bindings - User

{
  "keys": ["ctrl+w"],
  "command": "move_to",
  "args": {
  "to": "bol"
  }
},
{ 
  "keys": ["ctrl+shift+w"],
  "command": "move_to",
  "args": {
  "to": "bol",
  "extend": true
  }
}

 

デフォルトで「control + e」で行末に移動できるようになっているので、今回は「control + w」で行頭に移動できるようにしました。

EC2でNode.js+MongoDB環境を作るまで

EC2でインスタンスを作成してから、Node.js+MongoDBの環境を構築するまでのメモ。

プロンプトが%になっているものはローカル、#はリモートのスーパーユーザ、$はリモートの一般ユーザで実行されたことをあらわす。

 

// EC2からダウンロードした秘密鍵を.sshディレクトリへ移動
% mv Downloads/xxx.pem .ssh/
 
 
// パーミッションの設定(読み出し可+書き込み可)
% chmod 600 .ssh/xxx.pem
 
 
// 秘密鍵を読むファイルを指定して、ssh接続
% ssh -i .ssh/xxx.pem ec2-user@ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com
 
 
// rootユーザに切り替え
$ sudo -s
 
 
// ID番号に20000を指定して、deployグループを作成
# groupadd -g 20000 deploy
 
 
// ID番号に19999を、グループに20000を指定して、deployユーザを作成
# useradd -u 19999 -g 20000 deploy
 
 
// deployユーザのパスワードを設定
# passwd deploy
 
 
// 環境変数を引き継ぎ、パスワードなしでsudoコマンドを実行可能に
# visudo
  + # Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
  + Defaults:deploy !env_reset
 
    ## Same thing without a password
    # %wheel  ALL=(ALL)       NOPASSWD: ALL
  + deploy  ALL=(ALL)       NOPASSWD: ALL
 
 
// deployユーザのホームディレクトリに、.sshディレクトリを作成して、authorized_keysファイルを作成
# cd /home/deploy
# mkdir .ssh
# touch .ssh/authorized_keys
 
 
// authorized_keysファイルを編集(自分の公開鍵を入力)
# vim .ssh/authorized_keys 
 
 
// .sshディレクトリの所有者をdeployユーザに変更
# chown -R deploy:deploy .ssh
 
 
// ディレクトリ.sshパーミッションをrwx------に変更
# chmod 700 .ssh
 
 
// ファイルauthorized_keysをrw-------に変更
# chmod 600 .ssh/authorized_keys
 
 
// 開発向けのパッケージをまとめてインストール
# yum -y groupinstall "Development Tools"
 
 
// deployユーザで入りなおす
% ssh deploy@ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com
 
 
// nodebrewインストール
$ curl https://raw.github.com/hokaccha/nodebrew/master/nodebrew | perl - setup
 
 
// nodebrewへのパスを.bashrcに追加
$ vim .bashrc 
    # User specific aliases and functions
  + export PATH=$HOME/.nodebrew/current/bin:$PATH
 
 
// .bashrc読み込み
$ source .bashrc
 
 
// 安定版のnodeをインストール
$ nodebrew install stable
 
 
// 安定版のnodeを使用
$ nodebrew use stable
 
 
// npmをインストール
$ curl https://npmjs.org/install.sh | sh
 
 
// foreverをインストール
$ npm install forever -g
 
 
// 設定ファイル作成
$ sudo touch /etc/yum.repos.d/10gen.repo
 
 
// 10genリポジトリ追加
$ sudo vim /etc/yum.repos.d/10gen.repo
  + [10gen]
  + name=10gen Repository
  + baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
  + gpgcheck=0
  + enabled=0
 
 
// MongoDBをインストール
$ sudo yum install mongo-10gen mongo-10gen-server
 
 
// mongodのランレベルを設定
$ sudo chkconfig mongod on
 
 
// mongod起動
$ sudo service mongod start
 
 
// ホスト名を変更する
$ sudo hostname xxx.xxx.com
 
 
// ホスト名を変更する(再起動時に元に戻らないように)
$ sudo vim /etc/sysconfig/network
    NETWORKING=yes
  + HOSTNAME=xxx.xxx.com
 
 
// 一度再起動
$ sudo reboot
 
 
// デプロイ後forever起動
$ sudo PORT=80 forever start app.js

10秒でPassbookクーポンを発行できるサイトを作ってみた

第一回 プログラマ向けデザイン勉強会 - connpass」に補欠どまりで参加できなかったので、
アップされている資料を参考に、Passbookのクーポンを発行できるサイトを作ってみました。

 

おしゃれ頑張っちゃった感はありますが、これまで作ったサイトのなかでは一番見栄えよくできたかも。

 

ちなみに、参考にさせてもらった資料は、

@ken_c_loさんの「少ない手間と知識で”それなり”に見せる、ズルいデザインテクニック

Railsでログローテートをするには

Railsだと、簡単にログファイルのローテーションができます。

logrotateなど別の手段もあるのですが、常弱君には難しかったので、RailsのLogger.new()を使います。笑

 

config/envronment.rbやconfig/environments下の各環境の設定ファイルに、以下の1行を追加するだけです。

config.logger = Logger.new('/var/log/app/production.log', 10, 10.megabytes)

 

第一引数では、ログファイルを置きたい場所を指定します。

デフォルトのlogディレクトリでよければ、"#{Rails.root}/log/#{Rails.env}.log"と指定しておきます。

 

第二引数では、残したいログファイルの数を指定します。

上の例では、10ファイルまで残しておく指定をしています。

 

そして、ログが第三引数で指定したサイズを超えるごとに、ローテーションをしてくれて、10ファイルより多くなると、古いものから順に削除していってくれます。

 

また、以下のように記述することもできます。

config.logger = Logger.new('/var/log/app/production.log', 'weekly')

 

第一引数は同じくログファイルを置きたい場所を指定、第二引数に'daily'や'monthly'を指定すると、その期間ごとにローテーションをしてくれます。