アットウィキロゴ

Ruby

標準入力からパスワードを入力したいとき.

最近Googleカレンダーをいじったりしているんだけどもソースの中でPassWordを記述するのはすごく怖いし,かといって普通に標準入力からのデータを受け取るだけだとパスワードが丸見え.どうにかして入力を消したい.とりあえず,パッっと思いついたのは以下の2つ.
1.*で置換する.
2.入力を一切表示させない
2の方法は入力してるかしてないかわからなくて気持ち悪いので1でいくことにします.
具体的にはHighLineライブラリを使います.
  1. require "highline"
  2.  
  3. pass = HighLine.new.ask("enter your password : ") do |q|
  4. q.echo = '*'
  5. 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カレンダーにログインしたいときは以下のような感じ.

  1. require "rubygems"
  2. require "safariwatir"
  3.  
  4. browser = Watir::Safari.new
  5. browser.goto("http://www.google.com/calendar")
  6. browser.text_field(:name, "Email").set("USER_NAME")
  7. browser.text_field(:name, "Passwd").set("PASSWORD")
  8. browser.button(:name, "signIn").click

<101104追記>
GoogleカレンダーみたいにUsernameとPassを使ってログインするプログラムを上記のように書くと,すでにログイン済みの場合,GoogleカレンダーのHPにアクセスしても,ログイン済みのためテキストボックスが見つからずエラーがはかれる.
そこで,とりあえず簡単にページ内に含まれる言葉でどのページにいるのかということを判定して,ログイン画面にいればログインするようにする.
  1. if browser.text.include? "KEYWORD"
  2. #KEYWORDがあるときの処理
  3. else
  4. #KEYWORDがないときの処理
  5. end

RubyからSerialPortをたたく.

SerialPortを使えばRubyからSerialPortをたたくことができます.
マイコン側のプログラムを考えてやればシリアル通信の内容によってLEDとかを操作することもできます.
とりあえず
$ sudo gem install serialport
する.
とりあえず標準入力から入力した数字に応じてLEDが光る回数をコントロールするプログラムを作ってみる.
Arduino使いましょう.
Ruby側のプログラムは,
  1. require "rubygems"
  2. require "serialport"
  3.  
  4. port = "/dev/tty.usbserial-*********"
  5. mySerial = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE)
  6.  
  7. while true
  8. print( "enter number(1..9) : ")
  9. if((incomingByte = gets.chomp).to_s == "q")
  10. break;
  11. else
  12. mySerial.putc incomingByte
  13. end
  14. end
  15.  
  16. mySerial.close
  17.  
こんな感じ.
Arduino側は,
  1. int rcv = 0;
  2.  
  3. void setup(){
  4. Serial.begin(9600);
  5. pinMode(13, OUTPUT);
  6. }
  7.  
  8. void loop(){
  9. if(Serial.available() > 0){
  10. rcv = Serial.read();
  11. rcv = rcv -48;
  12. Serial.print(rcv);
  13. for(int i = 0; i < rcv; i++){
  14. Serial.print("*");
  15. digitalWrite(13, HIGH);
  16. delay(300);
  17. digitalWrite(13, LOW);
  18. delay(300);
  19. }
  20. }
  21. delay(1000);
  22.  
こんな感じ.お手軽.

<追記>
Arduino.ccのPlaygroundより, ( http://www.arduino.cc/playground/Interfacing/Ruby )

<追記101104>
Ruby側のプログラムでArduinoからのデータを受信するとき
  1. while true
  2. #処理
  3. if(rcv = mySerial.getc)
  4. if (rcv == 'c')
  5. #処理
  6. elsif (rcv == 'd')
  7. #処理
  8. end
  9. end}
  10. みたいにループの中で処理(例えば時間を計ったりするとき.)を行うとき.
  11. mySerial.getcの部分は何かデータが来るまで待ち続けるようなので処理がここで止まってしまう.
  12. とりあえずの解決策としては,マイコンなどのデータ送信する側で意味のないデータ(ここで言えば'c''d'以外)を送ってやればデータ受信待ちを抜けるし,意味のないデータなので特に処理もしない.
  13. なんかいい方法あるとは思うんだけどなー.
  14.  
  15. **ASCIIコードまわりの変換とか確認とか.
  16. http://www.namaraii.com/rubytips/?%CA%B8%BB%FA%CE%F3#l19
  17.  
  18. **MacでRubyからSQLite3を使うための準備
  19. ***ローカルのGemに入ってるモジュールの確認
  20. codehighlight(linenumber, c){
  21. $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