じゃ、ま、いっか

その隙間にジャストフィット

いろいろ雑記

rbenvのrubyスクリプトをcronで処理する方法

環境はさくらVPS上のUbuntu Serverです。
セットアップのログはここ

セットアップついでにrbenvに乗り換えたのだけれど
cronでrubyのスクリプトを動かそうとしてハマりました。

とりあえず動けばいいや

ってことでcronじゃなくて、無限ループさせてた

while :; do ./homu.rb; sleep 3600; done

けれどターミナルがひとつつぶれるしアレなので解決策を探してみた。

cronで処理する方法

以下参考にしたサイト

まず、$HOME/.bash_profileにrbenvの設定を追加

if [ -s ${HOME}/.rbenv ]; then 
        export PATH="$HOME/.rbenv/bin:$PATH"
        eval "$(rbenv init -)"
        source ~/.rbenv/completions/rbenv.bash
fi

んでcronに登録

1 * * * * bash -lc '/home/hoge/workspace/huga/script/homu.rb >>/home/hoge/log/homu.log 2>>/home/hoge/log/homu.log'

bashの-lオプション重要

  • lで.bash_profileを読み込む

スクリプトのshebangはこんな感じ

#! /usr/bin/env ruby    

参考サイトの合わせ技でスマートに書けたー、わーい

たわごと

誰がハタ坊か(w
Git道場は行けるかなー

twitterのリプライをArduinoで通知してみた

RubyからArduinoにこんにちわー!できたので, twitterでリプライ来たら通知するようにしてみました。

ruby側はtwitterのuserstreamを監視してリプライきたらシリアルポートにユーザ名を書き込むだけ

#!/usr/bin/env ruby
# encoding : utf-8

require 'userstream'
require 'yaml'
require 'serialport'

sp = SerialPort.new("/dev/ttyACM0", 9600, 8, 1, SerialPort::NONE)

stream_config = YAML.load_file(File.expand_path(File.dirname(__FILE__) + '/config.yml'))
UserStream.configure do |config|
  config.consumer_key = stream_config[:consumer_key]
  config.consumer_secret = stream_config[:consumer_secret]
  config.oauth_token = stream_config[:oauth_token]
  config.oauth_token_secret = stream_config[:oauth_token_secret]
end

client = UserStream.client
client.user do |status|
  if status.has_key? "text"
    if status.in_reply_to_screen_name == "nefo_mi"
      sp.puts "@#{status.user.screen_name} "
    end
  end
end
sp.close 

Arduino側はシリアルポートに書き込まれた文字を受け取ってLCDに表示させてLEDを交互にチカチカさせればOK

#include <LiquidCrystal.h>
int incomingByte;
char inByte;
String inMsg;
boolean led;
int light;
LiquidCrystal lcd(7,8,9,10,11,12,13);

void setup()
{
  lcd.begin(2, 16);
  lcd.clear();
  lcd.print("Twitter Mention");

  lcd.setCursor(0, 1);
  lcd.print("Notification");
  Serial.begin(9600);
  Serial.println("setupDone");
 
  led = false;
  light = 0;
}

void loop()
{
  if (Serial.available() > 0) {
    inByte = Serial.read();
    if((inByte >= 65 && inByte <= 90) || (inByte >= 97 && inByte <= 122)
        || (inByte >= 48 && inByte <= 57) || (inByte == 64) || (inByte == 95)){
      inMsg.concat(inByte);
    }
  
    if (inByte == 10 || inByte == 13){
      inByte = 0;
      lcd.clear();
      lcd.print(inMsg);
      inMsg = "";
      led = true;
      light = 0;
    }
  }
  
  if (led){
    if (light % 2 == 0){
      digitalWrite(5, HIGH);
      digitalWrite(6, LOW);
    }else{
      digitalWrite(5, LOW);
      digitalWrite(6, HIGH);
    }
    
    delay(500);
    
    if(++light >= 100){
      led = false;
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
    }
  }
}

初期表示
f:id:nefo_mi:20120509020308j:image

おらねこからリプライ送ってみた。

f:id:nefo_mi:20120509020331j:image
USBから電源とってると電力が弱いのかLEDの光が弱いー
ACアダプタから電源とるとシリアル通信できないという・・・
イーサネットシールド欲しいw

たわごと

接着剤ではくっつかないよね・・・

Emacs 24でhowmの挙動がおかしかったのでRC版入れました。

さくらVPSを新プランに乗り換えて設定しなおした で書いてるとおりemacs24をインストールして
howmの最新版(1.3.9.2)を入れてたのだけれど
検索のなんだか挙動がおかしい・・・

グーグル先生に聞いてみたら, howmサイトに思いっきり書いてました。

リリース予定版 1.4.0rc2: emacs24 でのエラーを修正 [2012-02-18]

ということでRC版を落としてきてインストールしました。

wget http://howm.sourceforge.jp/a/howm-1.4.0rc2.tar.gz
tar zxvf howm-1.4.0rc2.tar.gz
cd howm-1.4.0rc2/ 
./configure
make install

これで期待通りにメモを検索することができるようになった!
やったね!
最新版がリリースされたら入れ直そう。

たわごと

SAKELIFE という素敵なサービスを見つけたので登録してみたー
沖縄という土地柄もあっておいしい日本酒は貴重なので楽しみ。

秩父で呑んだ武甲政宗がうまかったので忘れられないのさ

ArduinoでLチカして、Rubyからこんにちわー!して遊んだ

GWだったので秋葉原で買ったArduinoエントリーキットで遊びました。
なんだかんだで半年ぐらい寝かしてたのかorz
もっと早くやれよ・・・

Ubuntuに環境つくるよ

Arduino IDEっていうEclipse的なものが必要なのでサイトからダウンロードしてくる。

Androidの開発環境のときにJavaはインストール済みだったのでコンパイラだけをインストール

sudo aptitude install gcc-avr avr-libc

解凍して実行すればおk
簡単,簡単

ハードなHello WorldといえばLチカらしい

ぼくはへっぽこプログラマーなので
一番最初にやることといえばHello Worldしか思いつかないのだけれど
電子工作やハードな人たちはLチカというらしい。
LEDチカチカの略?

というわけでやってみた。

f:id:nefo_mi:20120506214612j:image

プログラムはサンプルの
File -> Example -> Basics -> Blinkをそのまま
簡単,簡単と思いきや・・・

  • ブレッドボード触るの久しぶりすぎてアタフタw
  • 抵抗の色の読み方がわかんねーw
  • LEDの向きはナニがプラスで、どれがマイナスなのw

とかなんか無駄に時間がかかりましたw
だけどブレッドボードにジャンパーをポチポチ刺すの楽しいわー!

なんとかLチカが終わったのでいっぱい光らしてみる。

エントリーキットについてたLEDを全部光らせる。
プログラムはサンプルとか見ながら適当に書いた。
C言語っぽく書けるので簡単,簡単

f:id:nefo_mi:20120506214719j:image

void setup() {                
  for(int i = 2; i <= 8; i++){
    pinMode(i, OUTPUT);
  }  
  Serial.begin(9600);
  Serial.println("setupDone");  
}

void loop() {
  for(int i = 2; i <= 8; i++){
    digitalWrite(i, HIGH);   
    delay(150); 
    digitalWrite(i, LOW);
    delay(15);
  }
  for(int i = 8; i >= 2; i--){
    digitalWrite(i, HIGH);
    delay(150);
    digitalWrite(i, LOW);
    delay(15);
  }
}

なんか0番と1番端子に刺したらLED光っぱなしという悲しいことになったので2番から8番使ってます。
うーん、なんでだろう。

RubyからこんにちはArduino

グーグル先生に聞いてみたらなんかRubyから直接Arduinoとやりとりできるらしい。
なにそれすごい、ということで下記のサイトを参考に遊んでみる。

Funnelっていうニュータイプっぽいライブラリをつかえばいいらしいけど、WindowsとMac用っぽいので別の方法を探す。

そのまんまシリアル通信できるらしいのでgem install
なんかruby-serialportは失敗したのでserialportを入れる。

gem install ruby-serialport #=> 失敗
gem install serialport

Arduino側のプログラムは参考サイトのやつをコピッとなー

int incomingByte = 0;
int ledPin = 13;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {
    incomingByte = Serial.read();
    Serial.print("I received: ");
    int ledBlinkTime = (incomingByte - 48) * 1000;
    Serial.println(ledBlinkTime);
    digitalWrite(ledPin, HIGH);
    delay(ledBlinkTime);
    digitalWrite(ledPin, LOW);
    delay(1000);
  }
}

んでおもむろにpryを起動して

[1] pry(main)> require 'serialport'=> true
[2] pry(main)> sp = SerialPort.new("/dev/ttyACM0", 9600, 8, 1, SerialPort::NONE)

=> #<SerialPort:fd 5>
[3] pry(main)> sp.putc '3'
=> "3" #=> LEDが3秒光る
[4] pry(main)> 

pryでインタラクティブにArduinoとお話できるとか凄すぎる!
電子工作敷居が高いなーって思ってたけれど
こんなにも簡単だなんて!

というわけでArduinoRubyからこんにちはー!

エントリーキットに入ってたLCDをブレッドボードにとりつける。
これで文字が出力できる。
Lチカも良いけどやっぱりHello Worldだよねということで
Rubyから送った文字をArduinoに表示させました。

f:id:nefo_mi:20120506214613j:image

Arduino側のプログラムはこれ

#include <LiquidCrystal.h>
int incomingByte;
char inByte;
String inMsg;
LiquidCrystal lcd(7,8,9,10,11,12,13);

void setup()
{
  lcd.begin(2, 16);
  lcd.clear();
  lcd.print("*Hello World*");

  lcd.setCursor(1, 1);
  lcd.print("homuhomu");
  Serial.begin(9600);
  Serial.println("setupDone"); 
}

void loop()
{
  if (Serial.available() > 0) {
    inByte = Serial.read();
    if((inByte >= 65 && inByte <= 90) || (inByte >= 97 && inByte <= 122) 
        || (inByte >= 48 && inByte <= 57) || (inByte == 43)
        || (inByte == 61) || (inByte == 63)){
      inMsg.concat(inByte);    
    }
  }
  if (inByte == 10 || inByte == 13){
    inByte = 0;
    lcd.clear();
    lcd.print(inMsg);
    inMsg = "";
  }
}

んでpryを起動してっと

[1] pry(main)> require 'serialport'                                   
=> true
[2] pry(main)> sp = SerialPort.new("/dev/ttyACM0", 9600, 8, 1, SerialPort::NONE)
=> #<SerialPort:fd 5>
[3] pry(main)> sp.puts "homuhomu"                                     
=> nil

f:id:nefo_mi:20120506214614j:image
ほむー!

Rubyとお話できるってことはTwitterのuserstreamを監視してメンションが来たらLEDをチカチカして
相手のIDを表示するとかすぐできちゃうわけだ!

逆にArduinoのセンサの値をRubyに渡せば・・・
うは、夢がひろがりんぐ

センサーとか色々電子部品が欲しくなっちまったぜw
Arduino楽しい!

たわごと

umitterのザオラルに失敗したというか、やる気がでないというか、部屋の掃除が捗るよね!
一気に変えないで少しずつやるかー

海分を補充してきました

微妙な天気でおなじみの沖縄のGWの晴れ間を狙って海に行ってきました。
真栄田岬と砂辺ですよ!

@libkinjo先輩と真栄田岬へ!

水温はまだ低いですね、僕はウェットスーツだったのですが
先輩は半袖で寒さの限界ということで青の洞窟には入らず撤退しました。

一年ぶりに潜ったけれど
真栄田の植え付けサンゴがなくなってた・・・;;
全滅してしまったか・・・かなしい。


f:id:nefo_mi:20120430144716j:image

クマノミさんこんにちは!こんにちは!

f:id:nefo_mi:20120430150405j:image

ツバメウオがこんなに!

f:id:nefo_mi:20120430150918j:image

岩の割れ目がいやらしいですね。
高まるー

@mori_102と砂辺へ!

若干うねりがあったので、沖にはいかず2〜3mの浅い所で夏の前哨戦をすることに。
ずっとウミウシを探してました。
三種類のウミウシを見つけましたよ。さすが砂辺

f:id:nefo_mi:20120505122205j:image
ウミウシ!(名前なんだろう・・・)

f:id:nefo_mi:20120505122810j:image
レモンウミウシ
一生懸命サンゴの真似してるのがかわいい。

f:id:nefo_mi:20120505125639j:image
イボウミウシ
うがーブレてる・・・
適当にとってもブレないカメラが欲しい。

f:id:nefo_mi:20120505124436j:image
ハコフグ?もいました。
こいつもかわいいな

新しいおもちゃ 水深計つきG-Shock DW-6500が楽しい

東京いるときにヤフオクでポチったG-Shockを稼働させてみました。

f:id:nefo_mi:20120505230131j:image

何m潜ったか見れて楽しいいいいい!
今回の最深度は9.1mでした。
夢の2桁潜りたいなー。肺活量鍛えないと!

だけどこの時計、水中で内側が曇るんだよねorz
上の写真だと内側に水滴がついてるし・・・w

内側がくもるということはどっかから漏れてる・・・?
一応水深測れてるっぽいのでこのまま使ってみるけど、水没怖いなーw

たわごと

@umitterがサーバーごと逝ってしまったのではやくザオラルしないと!

あと、GWで肉たべすぎだよね・・・

github:pages + Octopressでブログできたよー

大学の同期とハブ酒の会っていう模合的なことをしているんです。
エンジニアを志すものとしては、やっぱりDRYでしょうと
Rubyist Hotlinks【第 29 回】 松田明さんを見て居酒屋DRYルールを取り入れたのだけれど
今までどこに行ったのか記録とっていなかったのでどこかに記録を残したかった。

「ハブつながりでgithubに記録を残せば良いじゃない」という電波を受信したので早速試してみることに

適当に作ったリポジトリにindex.htmlを置いてみた。

ダメだった。
まぁそりゃそうだ。
@yono「それgithub+jekyllでできるよ!」とアドバイスが

そういえば、mattnさんの記事を見て気になってたんだった。
忘れてた。

Octopressとgithubのインスコ記録

OctoPressの公式ページと適当にググって出てきたサイトを参考にしました。

1. まずは適当なリポジトリをgithubに作ります。

mkdir blog
git init
touch README.mkd
git add README.mkd
git commit -m 'first commit'
git remote add origin git@github.com:nefo-mi/blog.git
git push origin master

2. 環境準備

  • Octopressが1.9.2-p290にしか対応していないっぽいのでrbenvで入れる。
  • gem でbundleインストールしてrake install
rbenv install 1.9.2-p290 
git clone git://github.com/imathis/octopress.git octopress
cd octpress
rbenv local 1.9.2-p290
ruby --version #=> ruby 1.9.2p290
gem install bundler --no-ri --no-rdoc
rbenv rehash
bundle install
rake install

3. octoprssのデプロイ先をgithub:pagesに指定する。

  • rake setup_github_pages実行して、1.で作ったリポジトリのURLを貼り付けるだけ。
  • rake gen_deploy実行するとgithubにサイトがデプロイされるのでhttp://yourusername.github.com/blog/にアクセスしてちゃんとブログができてることを確認する。
rake setup_github_pages
rake gen_deploy

4. ブログの設定と記事の投稿

  • _config.ymlにブログのタイトルとかを設定する。
  • GithubやTwitterとの連携もここで設定できる。
  • rake new_post['title']で新しい記事を作ってMarkdown形式で書く
    • zshだと確固が展開されちゃうのでエスケープする。
    • rake new_post\['title'\]
  • org-mode派なんだけどこの際Markdownも覚えるかなー
    • はてな記法も覚えるのめんどくさいのでorgかMarkdownに統一してほしいw
  • rake generateでhtml生成
  • rake previewでブログにアップする前に確認
  • rake deployでブログにアップ
  • めんどくさい場合はrake gen_deploy一発でおk
vim _config.yml
rake new_post\['test'\]
vim source/_posts/2012-04-27-test.markdown
rake generate
rake preview
rake deploy

というわけでできたブログがこちらです!
http://nefo-mi.github.com/Hubooze/


レイアウトデフォルトなのでいじったりしてみたいな。

たわごと

次回のハブ主は@gongoZ
たのしみや

たわごと2

Saturday Night's Alright For Fightingたのしすぐる

練習中

参加報告: OJAG Workshop@Naha 19 & Lions本よみよみ会

OJAG Workshop@Naha 19

ATND

@mgwsuzukiさんが開発中のAndropic? & bluetoothを見せてもらいました。
なにこれ夢が広がりんぐ!
100mの範囲であれば無線通信できるらしいので色々と遊べそう。

ずっと妄想していた風見鶏もこれがあれば実現できそうや・・・ハァハァ
屋根の上に風見鶏を置いて、風向きを検知してTwitterにつぶやくとかそういうやつ
うみったーと連携させれば・・・ゴクリ

Lions本よみよみ会

ATND

Lions本よみよみ会では、さくらVPSにsimhでPDP11なシミュレータ環境を構築してました。
PDP11 unix v6 on Cloudというなかなかおもしろい環境が出来上がりましたw

手順はv6 unix勉強会 in Okinawaに追記していただいたやつそのまんま

sudo aptitude install simh
wget http://simh.trailing-edge.com/kits/uv6swre.zip
unzip uv6swre.zip
vim unixv6.cfg
pdp11 ./unixv6.cfg #=> 実行

unixv6.cfgの内容はこれ

set cpu 11/40
set cpu u18
att rk0 unix0_v6_rk.dsk
att rk1 unix1_v6_rk.dsk
att rk2 unix2_v6_rk.dsk
att rk3 unix3_v6_rk.dsk
boot rk0

一応手順どおりにブレイクポイントで止めてみたけれど
simhを使いこなせていない感が
アセンブラしか見ることできなかったので、なんとかC言語までたどり着きたい。


しかし環境構築して満足してるのなんとかしないとなぁ。
ぜんぜん時間がとれてないorz

あとは@superhogeさんのunix v6へのお誘いなエントリを読んでもくもく

pre K&R Cの記述にひとりでウボァーってなってました。


次回のLions本よみよみ会は4/30か5/3,4ぐらいだそうです。

emacs で xpmがないぞこらー!って怒られなくなった。

さくらVPSの環境構築で残ってた問題が解決したのでメモ

解決方法は、
画像のlib***-devをインストールしてからconfigureしてmakeでおkでした。

sudo aptitude install libxpm-dev libgif-dev libjpg-dev libpng-dev
./configure --with-x-toolkit=no
make

これでエディタまわりの設定は全部おわりかなー

たわごと

ちょっと海分が足りない。
このままでは干からびちゃう。

今週末のCloud on the BEACH Party!が楽しみや