標準入力からパスワードを入力したいとき.
最近Googleカレンダーをいじったりしているんだけどもソースの中でPassWordを記述するのはすごく怖いし,かといって普通に標準入力からのデータを受け取るだけだとパスワードが丸見え.どうにかして入力を消したい.とりあえず,パッっと思いついたのは以下の2つ.
1.*で置換する.
2.入力を一切表示させない
2の方法は入力してるかしてないかわからなくて気持ち悪いので1でいくことにします.
具体的にはHighLineライブラリを使います.
require "highline"
pass = HighLine.new.ask("enter your password : ") do |q|
q.echo = '*'
end
}
こんな感じ.
mac portsでvim-rubyをインストールしたとき.
OS入れ直してからはめんどくさくてほぼ生のVimを使っていたのだけれどやっぱりどう考えても不便なのでVim-rubyを入れた.
そしたらrubygemsがないといわれたので,
$ sudo port install rb-rubygems
してやる.
一件落着.
crontabで定期的にRuby実行@Mac
いきなりCrontab使ってデバッグしようとするとやたらとMailが送られてきて非常にうざったいので以下の手順を踏んだ方がいいんじゃないかな.
1.とりあえずRubyプログラムを作る.エラーがなくなるまでやる.
2.シェルスクリプトを書く.うまく実行できるまで試してみる.
3.Crontabに登録.Mailがうざったいのでログと標準出力をテキストファイルにでもしとこう.
こんな感じ.
watirを使ってRubyからブラウザを起動する
watirというのを利用すればブラウザをRubyから呼び出すことができる.元々自動テストをするためのものなようなので,テキストフィールドに入力したり,クリックしたりもできる.詳しくは公式サイト.
http://watir.com/
今回はMacでSafariを呼び出すので,safariwatirを使います.
$ sudo gem install rb-appscript
$ sudo gem install safariwatir
例えば,Googleカレンダーにログインしたいときは以下のような感じ.
require "rubygems"
require "safariwatir"
browser = Watir::Safari.new
browser.goto("http://www.google.com/calendar")
browser.text_field(:name, "Email").set("USER_NAME")
browser.text_field(:name, "Passwd").set("PASSWORD")
browser.button(:name, "signIn").click
<101104追記>
GoogleカレンダーみたいにUsernameとPassを使ってログインするプログラムを上記のように書くと,すでにログイン済みの場合,GoogleカレンダーのHPにアクセスしても,ログイン済みのためテキストボックスが見つからずエラーがはかれる.
そこで,とりあえず簡単にページ内に含まれる言葉でどのページにいるのかということを判定して,ログイン画面にいればログインするようにする.
if browser.text.include? "KEYWORD"
#KEYWORDがあるときの処理
else
#KEYWORDがないときの処理
end
RubyからSerialPortをたたく.
SerialPortを使えばRubyからSerialPortをたたくことができます.
マイコン側のプログラムを考えてやればシリアル通信の内容によってLEDとかを操作することもできます.
とりあえず
$ sudo gem install serialport
する.
とりあえず標準入力から入力した数字に応じてLEDが光る回数をコントロールするプログラムを作ってみる.
Arduino使いましょう.
Ruby側のプログラムは,
require "rubygems"
require "serialport"
port = "/dev/tty.usbserial-*********"
mySerial = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE)
while true
print( "enter number(1..9) : ")
if((incomingByte = gets.chomp).to_s == "q")
break;
else
mySerial.putc incomingByte
end
end
mySerial.close
こんな感じ.
Arduino側は,
int rcv = 0;
void setup(){
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop(){
if(Serial.available() > 0){
rcv = Serial.read();
rcv = rcv -48;
Serial.print(rcv);
for(int i = 0; i < rcv; i++){
Serial.print("*");
digitalWrite(13, HIGH);
delay(300);
digitalWrite(13, LOW);
delay(300);
}
}
delay(1000);
こんな感じ.お手軽.
<追記101104>
Ruby側のプログラムでArduinoからのデータを受信するとき
while true
#処理
if(rcv = mySerial.getc)
if (rcv == 'c')
#処理
elsif (rcv == 'd')
#処理
end
end}
みたいにループの中で処理(例えば時間を計ったりするとき.)を行うとき.
mySerial.getcの部分は何かデータが来るまで待ち続けるようなので処理がここで止まってしまう.
とりあえずの解決策としては,マイコンなどのデータ送信する側で意味のないデータ(ここで言えば'c'や'd'以外)を送ってやればデータ受信待ちを抜けるし,意味のないデータなので特に処理もしない.
なんかいい方法あるとは思うんだけどなー.
**ASCIIコードまわりの変換とか確認とか.
http://www.namaraii.com/rubytips/?%CA%B8%BB%FA%CE%F3#l19
**MacでRubyからSQLite3を使うための準備
***ローカルのGemに入ってるモジュールの確認
codehighlight(linenumber, c){
$gem list --local
入ってなかったので.
codehighlight(linenumber, c){
$sudo gem install sqlite3-ruby
$sudo gem install dbi
$sudo gem install dbd-sqlite3}
最終更新:2011年04月24日 17:33