アーカイブ
NFCタグサーバーもJavaScriptだけで使えるようにした
NFCタグサーバーにもクロスドメインでAjaxできるようにするためにHTTP HeaderにAccess-Control-Allow-Originを追加した。
JavaScriptだけでNFCタグリーダーを使える。
これ → IO-DATAのNFCタグリーダーをHTTP、WebSocket、Socketから使えるようにした
Eventmachine HttpServerが軽量で使いやすいので、sinatraを使うほどでもないプロジェクトでよく使っている。
class NfcHttpServer < EM::ConnectionEventmachine HttpServerはドキュメント全然書かれてないけど、コードが読みやすいのでどうにでもできる。cometとかもできるし。
include EM::HttpServer
def process_http_request
res = EM::DelegatedHttpResponse.new(self)
puts "* http #{@http_request_method} #{@http_path_info} #{@http_query_string} #{@http_post_content}"
res.headers['Access-Control-Allow-Origin'] = '*'
res.headers['Access-Control-Allow-Headers'] = 'Content-Type'
res.headers['Access-Control-Allow-Methods'] = 'PUT,DELETE,POST,GET,OPTIONS'
res.status = 200
res.content = @@tag.to_s
res.send_response
end
end
■参考にした
Ajaxのクロスサイト通信をJSONPを使わないでやってみよう – Back yard : yuya_lush’s report
HTML+JavaScriptをArduinoに直結できるシリアルポートサーバーを作った
SerialPort Serverを使うと、HTMLとJSをArduinoに直結できる。JavaScriptを少し書くだけでArduinoに「カーテン開けろ」とか「部屋の明るさよこせ」とか命令を送れるわけだ。
Web系の技術とハードウェアの技術を同時に使うには、間に「つなぎ」が必要なので、必要な機能を全部入れたサーバーを作ってみた感じです。
(github pagesでプロジェクトページ作ってみたんだけど楽でいいですね)
こういうこと。
シリアルポートサーバーはrubygemsでインストールできる。
gem install serialport-server–helpでヘルプが出る。デバイス名を引数にして起動できる。
which serialport-server
serialport-server --help
serialport-server /dev/tty.デバイス名
Macならsudo gem installで一発でインストールできるはず。
起動するとHTTPサーバー(http://localhost:8783)、WebSocketサーバー(ws://localhost:8784)、TCP Socketサーバー(localhost:8785)の3つが同時に起動する。
HTTPのサーバーはajaxのクロスドメイン制限を超えてデータのやりとりができるようにしてある。シリアルポートサーバーを動かして、HTMLとJavaScriptを書けばArduinoとJavaScriptが直接通信できるというわけだ。
(response headerにAccess-Control-Allow-Originを付ければ良いとyuisekiのはてブを見ていて知ったのでやってみた。)
■デモ
SerialPort Serverのページにも英語で書いたが、簡単なサンプルプロジェクトを日本語でも解説しておく。
1. Arduinoにプログラムを書き込む
2. ArduinoのDigital13番ピンにLEDを、Analog0番ピンにCdSと10kΩの抵抗を接続する


3. SerialPort Serverを起動する
4. Ajax版サンプルを開いて試してみる
5. WebSocket版サンプルを開いて試してみる
WebブラウザからLEDを点灯消灯したり、CdSの明るさの値がリアルタイムにスライダーに反映されているはずだ。
実際にAjaxサンプルのJavaScriptのコードを見てみると簡単さがわかると思う。17行でLEDとCdSを制御できている。
もちろんWebサーバーなので、複数のWebブラウザがSerialPort Serverから同時にデータを読み出そうとしても大丈夫。
増井研で1年以上、遠隔操縦ロボットの制御に使っていたプログラムを元に使っているのでプロセスを起動してたぶん3ヶ月ぐらい放置していても動き続けるぐらいに安定していると思う。
Apache+Passengerでenvironmentの設定
いままでsinatra使う時にconfig.ruに
set :environemt, :productionとか
set :environemt, :developmentって書いてたんだけど、httpd.confに
RackBaseURI /app_pathって書けばいいのだった。
RackEnv production
twitterの発言をskypeに投げる
研究会のskype chatで存在感がない人を忘れないために、研究会のtwitterアカウントでfollowしている人の最近の発言をランダムに投稿するようにしている
3時間ごとに投げる。
ここにコードおいてある
https://github.com/shokai/skype-chat-gateway-mac/tree/master/tools/twitter
skypeへの投稿はSkype Chat Gatewayと、WebブラウザからSkypeチャットできるやつ作ったに書いたskype-chat-gatewayを使っている。HTTPでskype chatが使えるスゴイ奴だよ
args_parserを使うとRubyでコマンドラインアプリ作るのにとても便利
args_parserというgemを作りました。
2年前に作ったArgsParserをバージョンアップしていたら互換性が無くなってきたので名前を変えた。
optparseよりもすっきり書けると思う。
■インストール
gem install args_parser
■使い方
試しに、「webページのURLを指定してダウンロードする」アプリを作ってみる。
こういう風に使えるのを作る。
ruby download_webpage.rb -url http://example.com -o out.html
download_webpage.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'args_parser'
parser = ArgsParser.parse ARGV do
arg :url, 'URL', :alias => :u
argutput, 'output file', :alias =>
, :default => 'out.html'
arg :verbose, 'verbose mode'
arg :help, 'show help', :alias => :h
end
if parser.has_option? :help or !parser.has_param?(:url,utput)
STDERR.puts parser.help
STDERR.puts "e.g. ruby #{$0} -url http://example.com -o out.html"
exit 1
end
require 'open-uri'
puts 'download..' if parser[:verbose]
data = open(parser[:url]).read
puts data if parser[:verbose]
open(parser[:output], 'w+') do |f|
f.write data
end
puts "saved! => #{parser[:output]}"
こんな感じで実行できる。

最近のコメント