0

ArgsParserをrubygemsに登録した

車輪の再発明臭がヤバイが、コマンドラインの引数のパーサを作ったのでrubygemsに登録した。はじめてgem登録した。

gemでインストールできる。

gem update --system
gem install ArgsParser


newgemコマンドでgemを作ってrubygems.orgに登録し、一応rspecでtestも書いた
gemはrubyforge.orgで公開するのが普通だったけど、2年ぐらい前からgithubでgemが作れる様になったので新しいプロジェクトはみんなgithubに行って、2009年秋?頃にgithubでgemがビルドできなくなったからかrubygems.orgでやってねという事になったらしい。


なのでリポジトリはいつも使っているmercurialにしてbitbucket.orgで公開する事にした。
shokai / argsparser-ruby / overview — bitbucket.org


既にgemにはいくつかCのgetopt風なARGVのparserがあるけど、なんとなくインタフェースが好きじゃないので自分が欲しい物を作った。

  1. –help -debug等のオプションの有無を判別する
  2. -x 320 -y 240 等のパラメータ(key value)を取得する
  3. -hと-helpのように省略名称が関連づけられていれば同じ物として扱う
  4. -helpと—helpのようなハイフンの数の違いを無視して、全て :help でアクセスできる
  5. ruby math.rb add -a 10 -b 25 の”add”のような、第一引数を取り出す
  6. パラメータ名にコメント文を付ける(-helpで起動した時の引数の説明文に使う)
という機能に絞ってある。



parseすると、第一引数(String)とパラメータ(Hash)が返ってくる。第一引数がない(いきなりパラメータが来た)場合は、第一引数はnilになる。
example.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'ArgsParser'

# 必要なパラメータ名を登録する
parser = ArgsParser.parser
parser.bind(:help, :h, "show help") # name, shortname, comment for help
parser.bind(:frame, :f, "frame image (required)")
parser.bind(:message, :m, "message (required)")
parser.bind(:size, :s, "size (required)")
parser.comment(:min, "minimum size") # add comment for help
parser.comment(:max, "maximum size")
parser.comment(:debug, "debug mode")


# parseして、引数が足りてるか、help表示指定が無いかチェック
first, params = parser.parse(ARGV)

if parser.has_option(:help) or !parser.has_params([:frame, :message, :size])
  puts parser.help
  puts 'e.g.  ruby example.rb -f frame.png -m "hello world" -s 320x240 -debug'
  exit 1
end

if first
  puts 'first arg : ' + first # 第一引数
end

if parser.has_param(:size)
  puts 'size : ' + params[:size] # -sでも-sizeでも :size でアクセスできる
end

# 全ての引数を表示
p params


実行してみる
ruby example.rb hoge -f frame.png -m "hello world" -s 320x240 -debug
結果
first arg : hoge
size : 320x240
{:message=>"hello world", :size=>"320x240", :debug=>true, :frame=>"frame.png"}

1

mbed NXP LPC1768を買った

rain_yukizoraが東京に来ていて、2人でスタバでmbedをいじったりした。
Basic StampやGainerのように、ブレッドボードに刺す事を前提にピンが裏に出ている。でもその時はブレッドボードを持ち歩いて無かったので、基板上のLEDとシリアル通信等を試した。ピンク色の物体は鞄の中でピンが折れないように基盤裏につけてる梱包材。

R0014222.JPG

mbedはエディタとコンパイラがwebサービス側にあり、開発は全てwebブラウザ上で行う。そしてできたバイナリをダウンロードしてマイコンに書き込み、実行させるという謎の16bitマイコンボード。

開発言語はC++。どうやら高価な商用コンパイラとライブラリ群がサーバー側にあるらしい。
例えばHTTPClientのライブラリがあり、DNSなども解決してくれるのでtwitterに認証してtweetするとかが簡単にできたりする。40円ぐらいで売ってるEhternetコネクタをそのまま接続するだけでLANケーブルが刺せるようになるとか、既にいろいろ揃っている。Audio IOやリチウムポリマー電池を使うための回路もボード上にあるように見える。


mbed.orgのトップページに貼られているビデオを見れば雰囲気がわかる。40秒ぐらいで短くてわかりやすいし、センスがいい。



■購入
スイッチサイエンスで6000円台後半で買った。秋月では6000円で売ってるけど、スイッチサイエンスで物を買った事が無かったので買ってみた。注文した翌日に届いて驚いた。
秋月の方は「評価キット」という名前でCDや箱やケーブルなどが付いてきて得な様に見えるけど、スイッチサイエンスの方にもちゃんと付いてた。

しばらくの間は6000円ぐらいで、そのうち1万円ぐらいに値上げするらしい。



■アカウントを取る
mbedをUSBケーブルでMacに接続すると、USBドライブとしてマウントされる。(Windowsでも同様)


開くとMBED.HTMというファイルが入っている
ピクチャ 1


webブラウザが開き、アカウント登録画面に行く。この画面は普通に誰でも見れるけど、USBデバイスとしてmbedが刺さっていないとsignupできないようになっている。どうやっているのかな・・・


アカウントを取るとこんなプロフィールページができる。publishしたnotebookやプログラムが見れる。
http://mbed.org/users/shokai/



■コードを書く
ログインして右上のcompilerのリンクから、IDEが開く。新規プロジェクト作成して、handbookを参考にしながらコードを書いてみた。
まず新規プロジェクト作成した時点でとりあえずLEDを一つ0.5秒間隔で点滅させるプログラムが書かれているので、ああこういう感じなのか〜とすんなり入れる。
ピクチャ 4

main.cpp

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx

DigitalOut myled1(LED1);
DigitalOut myled2(LED2);

int main() {
    while(1) {
        myled1 = 1;
        myled2 = 0;
        pc.printf("led 1 on\r\n");
        wait(0.5);
        myled1 = 0;
        myled2 = 1;
        pc.printf("led 2 on\r\n");
        wait(0.2);
    }
}
左上の「Compile」ボタンを押すとコンパイルされる。エラーが無い場合、いきなりプログラムがダウンロードされる。



■プログラムを書き込み、実行する
USBドライブとしてマウントされてるmbedにbinを投げ込んで、基板上のリセットボタンを押すと実行される。
ピクチャ 2


基板上のLEDが点滅すると同時に、シリアル通信もちゃんと来ていた。
1つのUSBコネクタだけど、USBストレージと /dev/tty.usbmodem622 の2つのデバイスとして同時に認識されている。
ピクチャ 7
MacやLinuxではドライバは必要ない。WindowsもSerialPC – handbook – Tracにあるドライバをインストールすれば使えるらしい。


■プログラムを公開する
エディタ画面でプロジェクト名を右クリックして「publish」ができる。プロジェクト名に – (ハイフン)が入っているとHTTPステータスコード500でconnection errorというのが出て、publishできない。 _ (アンダーバー)を使った。
ピクチャ 5

公開したプログラム
led_serial | mbed

コードがブラウザ上で見れない。まあそのうち改良されるだろう。
コメントや星を付けれるし、「import program into compiler」を押せば他人のプログラムでもすぐ自分で編集できる。
importは、他にもtarで固められたファイルかSVNのリポジトリのアドレスを指定する事もできる。



■感想
便利なライブラリが揃っていて、現状でもう十分面白いボードになっていると思う。

あとはネットワーク上にあってユーザアカウントがあるのだから、もっと色々できそう。組み込み系は開発効率よりもコミュニケーション効率の低さがまずいと思うので、web上にエディタがあるという事がそのへんをどうにかする手段になりそう。

人の作ったコードをimportするだけではなくライブラリとして使えるようになると思うので、何かRSSのparserとかjsonのシリアライザとかから作っていってみるとリソースが積み重なって面白い事になるかも。

0

モバイルSuicaの履歴をtwitterに流したかった

xtunnelのためにスクレイピングの勉強をしていて、Mechanize+hpricotからMechanize+nokogiriの組み合わせに乗り換えようと色々と使ってみている中でできた物のひとつ。
昔しゃお先生がやっていたのを俺もやりたくて3ヶ月ぐらい前に作ったけど、mobilesuica.comのおサイフケータイ使用履歴は1日一度早朝に更新される仕様に変更されたらしくボツになった。


結局idやcssなどの手がかりが無くて手動で要素を取り出す事になり、nokogiriはHTMLタグを除去するのにしか使わなかった
MobileSuica.rb

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'nokogiri'
require 'mechanize'
require 'kconv'

module MobileSuica
  def MobileSuica.get(user,pass)
    agent = WWW::Mechanize.new
    agent.user_agent_alias = 'Windows IE 7'
    page = agent.get('http://www.mobilesuica.com/iq/ir/SuicaDisp.aspx?returnId=SFRCMMEPC03')
    login_form = page.forms_with(:name => 'form1').first
    login_form.fields_with(:name => 'MailAddress').first.value = user
    login_form.fields_with(:name => 'Password').first.value = pass
    page = login_form.click_button
    
    return page.body.toutf8.split(/<tr>/).delete_if{|tr|
      !(tr =~ /&yen;/m)
    }.map{|tr|
      tr.gsub(/\n/,"").split(/\r/)[0..5].map{|line| # 月日,種別,利用場所,種別,利用場所,残額
        Nokogiri(line).inner_text.chomp.strip.gsub(/[\t ]/,"")
      }
    }
  end
end


mobilesuicaのユーザ名、パスワードで履歴を2次元配列として取り出せる。
require 'MobileSuica'
MobileSuica.get("user", "pass")
月日、種別、利用場所、種別、利用場所、残額の順になる
01/30

川崎

横浜
5,110
01/30

相鉄横浜
窓出
川崎
5,320



履歴のうち最新の駅名をtwitterに投稿する。-dつけて起動するとdaemonになる
tweet-mobilesuica.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'webrick'
require 'twitter'
require 'MobileSuica'

def start(conf)
  loop do
    begin
      first = MobileSuica.get(conf["suica_user"], conf["suica_pass"]).first
    rescue
      first = nil
    end
    if first != nil
      last = first if !last
      if first != last # 1回前に取得した履歴と比較
        puts first
        puts '-'*10
        if first[1] == '入' && first[3] == '出' # 降車履歴の時
          message = first[4].chomp.strip+"なう (suica)"
          if !(message =~ /#{conf["ngwords"]}/)
            if conf["nopost"] != true
              httpAuth = Twitter::HTTPAuth.new(conf["twitter_user"], conf["twitter_pass"])
              tw = Twitter::Base.new(httpAuth)
              tw.update(message) # twitter post
            end
            puts message
          end
        end
        last = first
      end
    end
    sleep 60*60*1.5 # 1時間半待つ
  end
end

conf = YAML::load open File.dirname(__FILE__)+'/config.yaml'
if ARGV[0] == '-d'
  WEBrick::Daemon.start {
    start(conf)
  }
else
  start(conf)
end


設定ファイル。自宅の駅名などはngwordsに入れておく
config.yaml
# config.yaml
# mobilesuica.com user/pass
suica_user : 'username@docomo.ne.jp'
suica_pass : '12345678'

# twitter user/pass
twitter_user : 'shokai'
twitter_pass : 'password'

# postしない駅名を正規表現で
ngwords : "(東京|横浜)"

# for debug
#nopost : "true"

0

使ってるchrome extensions

LDRにいろいろ付ける系のgreasemonkeyはGM_系の関数がまだ実装されてないので、LDRだけはFirefoxで見ている。
テキストエリアを外部テキストエディタで開くIt’s all text相当の拡張もあったけど、server側のインストールやら起動が面倒なのでblog書くのはFirefox使う。

普段の調べ物とSBMへの投稿、twitterぐらいならこれらを入れてあれば十分。一番重要なのはTaberarelooでdeliciousとはてなブックマークとlivedoor clipにすばやくクロスポストができる事。

意外なことにchrome keyconfigにLDRizeが入っている。AdBlock+は要素の指定がなんか面倒くさい。

pbtweet、chrome FullFeed、fldr_show_fc2_images.user.jsはMacはdev版のchromeなら使える。

GM_系が一通り実装されるのと、URLバーの履歴検索がFirefoxみたいに一部一致でも利用頻度の高い順にソートされて表示されるようになればFirefoxから乗り換えられるな。
chromeのURLバーは前方一致が優先されるので、例えばりそな銀行のログインページに行きたい場合、Firefoxだと「res」まで打てば候補にすぐ出てくるが、chromeなら「ib.res」まで打ち込まないと https://ib.resonabank.co.jp/IB/0102/SC_N_0102_010.aspx が出てこない。ibとか思い出せない。「りそな→reso」なら連想できる。URLがおかしい気もするが、サービス毎にサブドメイン振っているケースはいっぱいあるし、サブドメインは覚えられない。 https://e-navi.rakuten-kc.co.jp/ava_top とか。
chrome extensions

0

ユビキタスコンテンツシンポジウム 2010

来週16日(火)に、日吉でシンポジウムがあります。事前予約の受付がはじまりました

本人そっくりのロボットの石黒先生や、Leading Edge Designの山中俊治先生が来ます。参加費無料。


以下リリース文引用

2010年2月16日、「ユビキタスコンテンツ製作支援システムの研究」は、神奈川県横浜市港北区日吉・藤原記念ホールにて、「ユビキタスコンテンツシンポジウム2010」を開催致します。

本プロジェクトは、JSTの戦略的創造研究推進事業CRESTによって支援を受けたプロジェクトで、平成16年度から5年間の研究プロジェクトとして「ユビキタスコンテンツ」という新しいコンテンツジャンルを提案し、基盤技術開発、デザイン理論構築、コンテンツ制作の3軸から研究を実施してまいりました。

ユビキタスコンテンツは、私たちの衣食住遊に新たな経験と感動をもたらすコンテンツです。それらはモノや環境に溶け込み、ヒトや状況によってダイミックに変化します。また、ネットワークと接続されることにより各々のコンテンツのユーザ経験が蓄積され、蓄積されたデータをもとにコンテンツ同士の連動が可能となります。

このようなユビキタスコンテンツを制作するためのプラットフォームとしてわれわれが開発したxtelは、近距離無線通信が可能な小型基板moxa、 MCUボードのためのprogramming・runtime環境Talktic、動画、音声などの連続情報を扱うことが可能なP2Pネットワークライブラリ EntityCollaborator、コンテンツ経験の連動と蓄積を可能にするwebサービスLifeの4つのツールで構成されています。

さらに、本プロジェクトの成果であるユビキタスコンテンツのためのデザイン理論は、デザイン思考とティンカリングと呼ばれるプロセスを通して、効率よく良質なユビキタスコンテンツを創出することを支援します。このデザイン理論は、xtelの開発環境にも生かされており、デザイン思考とティンカリングを実行しやすくなるように、xtelの開発環境が設計・構築されています。

本プロジェクトを締めくくる今回のシンポジウムでは、ロボット研究者の石黒 浩 大阪大学大学院教授、プロダクトデザイナーの山中 俊治 慶應義塾大学環境情報学部教授をゲストスピーカとしてお招きし、トークセッションを行います。また、シンポジウムでは、5年間の活動内容をまとめた書籍「xtel: 生活を豊かにするインタラクションデザイン」をお配りする予定です。

日時・場所:
  2010年2月16日(火) 10:30-15:30 (開場 10:00)
  慶應義塾大学日吉キャンパス 藤原記念ホール


プログラム:
  10:30 – 10:40 代表挨拶
  10:40 – 12:10 「親しみのデザイン」
           石黒 浩 大阪大学大学院 基礎工学研究科 教授
           奥出 直人 慶應義塾大学 メディアデザイン研究科 教授
  12:10 – 13:30  休憩
  13:30 – 15:00 「美しさのデザイン」
           山中 俊治 慶應義塾大学 環境情報学部 教授
           稲蔭 正彦 慶應義塾大学 メディアデザイン研究科 教授
  15:00 閉会挨拶


事前登録方法:
  シンポジウムへのご来場をお考えの方は、
  ・お名前
  ・所属
  ・電話番号
  ・メールアドレス
  を添えて、office [at] dlb.sfc.keio.ac.jpまでメールをお送りください。

  なおシンポジウムの詳細は随時 webにてご連絡差し上げます。
  http://xtel.sfc.keio.ac.jp/


本件に関するお問い合わせ先
  〒223-8526 神奈川県横浜市港北区日吉4-1-1 
  慶應義塾大学日吉キャンパス 協生館C6S04
  CREST ユビキタスコンテンツプロジェクト
  Tel. 045-564-2483
  Fax. 045-564-2540
  E-mail: office [at] dlb.sfc.keio.ac.jp