0

OAuth0.4.6とsystem_timerがおかしい

twitterにoauthしようとすると401が返ってくる

Faraday: you may want to install system_timer for reliable timeouts
/Users/sho/.rvm/gems/ruby-1.8.7-p358/gems/oauth-0.4.6/lib/oauth/consumer.rb:216:in `token_request': 401 Unauthorized (OAuth::Unauthorized)

なんか最新版のoauth 0.4.6がおかしい


0.4.5使ったら大丈夫だった。
source :rubygems

gem 'twitter'
gem 'oauth', '0.4.5'

faradayに原因があるのかと思ったが、どっちも最新版0.8.0使ってた。
詳しくは調べてない。

0

Herokuで秋月電子の新商品RSS作った

Nokogiriで取得してRSS作った http://shokai.herokuapp.com/feed/akizuki.rss

Yahoo Pipes版が動かなくなってたので作りなおした。
意外と重要な部分だけ抜き出すの面倒だった

RSS読まれるたびに秋月にアクセスすると申し訳ないのでcacheを作って、20分はcacheを使うことにした
memcacheを使えばいいんだけどなんとなく車輪の大発明をしてしまった。


昔は秋月RSSあったんだけどサイトリニューアルした時に無くなったんだよね。4年ぐらい前だったっけ?


電子工作の勉強をはじめたときは、何か作ろうとしても何が作れるのかわからない。
とりあえず有名な店の新着商品を3ヶ月ぐらい見ていれば、世の中にどんな部品が存在しているのかわかってくるはず。

このへんを定期的にチェックしておくと良い

0

DataMapperでMySQLを使ってみる

MacにhomebrewでMySQL5.1.58インストールしたの続き。Ruby+DataMapperで使ってみた編。

gem install data_mapper dm-mysql-adapter

できたもの
https://github.com/shokai/datamapper-study

全体的にMongoidに似てる。Mongoidっぽい華麗なメソッドチェーンによるqueryができないっぽいのだけ残念・・
でもコード書いてて書き心地よかったし、SQL素人なのでORマッパーごしじゃないと怖くて使えない。


参考にしたページ
 

chatとかBBSみたいなのを作ろうと思ったがWebアプリにしないでCUIで使うやつにした。
ruby -Ku bin/post_comment.rb てすと
でMySQLに保存して、
ruby -Ku bin/show_comments.rb
で保存してあるのを読む。


ファイルの構造はこうなってる
そのうちsinatra templateに組み込むつもりで書いてみた。
.
├── Gemfile
├── Gemfile.lock
├── README.md
├── bin
│   ├── console.rb
│   ├── migrate.rb
│   ├── post_comment.rb
│   └── show_comments.rb
├── bootstrap.rb
├── config.yml
├── models
│   └── comment.rb
└── sample.config.yml
2 directories, 11 files


DBの設定 config.yml
db :
adapter : mysql
host : localhost
database : study
username : yourname
password : xxxxxxxx


設定に書いたstudyって名前のDBをmysqlに作って、migrateしておく。
mysql -u your_name -p
mysql> create database study;
ruby bin/migrate.rb


model定義 models/comment.rb
Mongoidに似てる。デフォルト値はlambdaで渡すと都度計算してくれる。
class Comment
include DataMapper::Resource
property :id, Serial
property :name, String, :required => true
property :body, String, :required => true
property :created_at, Time, :default => lambda{Time.now}

def to_s
"[#{name}] #{body} - #{created_at}"
end

def self.get_latests(num=10)
self.all(:order => [:id.desc], :limit => num)
end
end
クラスメソッドに「最近数件のコメントを取得」するメソッドを書いた。Query系はmodelに全部抽象的な名前で書いておいて、controllerとかにquery書かないようにすると綺麗になるし、modelだけで単体テストもできるようになる。



設定読み込んでMySQLに接続する
bootstrap.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'bundler/setup'
Bundler.require
require 'yaml'

begin
@@conf = YAML::load open(File.dirname(__FILE__)+'/config.yml').read
rescue => e
STDERR.puts e
STDERR.puts "config.yml load error!!"
exit 1
end

DataMapper.setup(:default, @@conf['db'])

Dir.glob(File.dirname(__FILE__)+'/models/*.rb').each do |rb|
puts "loading #{rb}"
require rb
end

DataMapper::Logger.new($stdout, :debug)
DataMapper.finalize

DataMapperにどのDBを使うか設定してからModelを読み込んで、Loggerを設定したらfinalizeする。finalizeしないとwebアプリとかで使った時に何度もDBに接続しにいったりModelの定義とかを実行してしまうらしい。


postする
bin/post_comment.rb
#!/usr/bin/env ruby
require File.dirname(__FILE__)+'/../bootstrap'

if ARGV.empty?
puts 'error : comment required'
puts "e.g. ruby #{$0} \"hello world\""
exit 1
end

begin
c = Comment.new(:name => `whoami`.strip, :body => ARGV.join(' '))
c.save
rescue => e
STDERR.puts e
exit 1
end

total = Comment.count
Comment.get_latests(5).each do |c|
puts "(#{c.id}/#{total}) #{c}"
end


最近のcommentを見る
bin/show_comments.rb
#!/usr/bin/env ruby
require File.dirname(__FILE__)+'/../bootstrap'

total = Comment.count
Comment.get_latests(20).each do |c|
puts "(#{c.id}/#{total}) #{c}"
end


postしたりshowした実行結果
(12/12) [sho] てすと - Mon Apr 30 13:14:10 +0900 2012
(11/12) [sho] MySQLに保存できるようになった - Mon Apr 30 00:52:25 +0900 2012
(10/12) [sho] できた!! - Mon Apr 30 00:52:06 +0900 2012
(9/12) [sho] できたのでは - Mon Apr 30 00:50:05 +0900 2012
(以下略)


あと、modelを読み込んでDB接続してIRB起動する簡単なスクリプト作っておくと、modelのメソッド試したりQuery発行できたりして便利
bin/console.rb
#!/usr/bin/env ruby
require File.dirname(__FILE__)+'/../bootstrap'
require 'irb'

IRB.start

0

twitterのlistに自分を追加できない件

自分が作ったリストに自分を追加できない(昔はできた)

API使ったら追加できた。rubygemsのtwitterを使った場合

Twitter.list_add_member("test", "shokai")


ここに置いた
https://github.com/shokai/twitter-api-console/blob/master/cmds/add_list.rb


こんな感じで使えるはず
git clone git://github.com/shokai/twitter-api-console.git
cd twitter-api-console
gem install bundler
bundle install
cp sample.config.yml config.yml
ruby auth.rb
# oauthで認証される
ruby cmds/add_list.rb "shokai" "test"

0

顔アイコンでファイルアップロード

顔が描かれたアイコンにファイルをドラッグアンドドロップすると、相手のサーバーにファイルをアップロードできるアプリを作った。
複数のファイルもまとめてアップロードできる。

俺が作ったのは2種類あって、増井先生も作ってるので今5種類ぐらいある気がする。



■face-upload
https://github.com/shokai/face-upload

増井先生が作った研究室のサーバーにファイルをアップロードするscriptを参考にした。

アップロード先のサーバーとはscp/sshでやりとりする。sshでログインできるサーバー相手なら使えるはず。
git cloneして、icon.pngを自分用のに入れ替えて、config.ymlを修正して ./setup すればアプリが生成される。

例えば、SFC-CNSのサーバーにアップロードする場合、config.ymlはこう書く。

ssh : "shokai@ccz01.sfc.keio.ac.jp"
dir : "public_html/file/"
url : "http://web.sfc.keio.ac.jp/~shokai/file/"

アップローダのコードはPlatypusを使って作ったので超短くできた。


■face-app
https://github.com/shokai/face-app

アップロード先のサーバーとはHTTPでやりとりする。
サーバーはSinatra+MongoDBで実装されている。送信前にmd5を比較して、既にサーバーにあればファイルは送らずに、送信したという情報だけが書き込まれる。
専用のwebページとRSSがある。


feed-imでRSSをIMにしてケータイやGoogleTalkに送信するようにしているので、アップロードされると通知が来る。
自分の顔アプリを配布すればメールをオワコン化させれる気がしている。


実際俺のAndroidでパケット通信量を見ると、今週446MB使っているうち318MBがメールなのでメールが滅びればもっと電池も持つし回線も太くなるはずだ。