読者です 読者をやめる 読者になる 読者になる

Ruby で Tumblr の OAuth Token を入手する一手法

背景

Tumblr API を使っていろいろやりたい*1. 私は,その第一歩を今日,踏み出したのです.

概要

API 関連の操作は tumblr_client GitHub - tumblr/tumblr_client: A Ruby Wrapper for the Tumblr v2 API という gem が出ているので,これを使えばよさそうです.でも,以下のように,consumer_key と secret だけでなく,access token と access token secret が必要とのこと.まずはこれを手に入れようと言うのが今回の挑戦です.

Tumblr.configure do |config|
  config.consumer_key = "consumer_key"
  config.consumer_secret = "consumer_secret"
  config.oauth_token = "access_token"
  config.oauth_token_secret = "access_token_secret"
end

実践

さて探してみると,php などの参考プログラムはわりかしありますが,ruby があまりありません.数少なく引っかかる情報も,いまいちちゃんと動かないので困りました.結局以下のコードで解決しました.

require 'rubygems'
require 'oauth' # 場合によっては gem install oauth する

# これは tumblr api にアプリ登録するともらえる
CONSUMER_KEY = "xxxx"
CONSUMER_SECRET = "xxxx"

consumer = OAuth::Consumer.new( CONSUMER_KEY,CONSUMER_SECRET,
 {
     :site => "http://www.tumblr.com",
     :request_token_path => "/oauth/request_token",
     :access_token_path => "/oauth/access_token",
     :authorize_path => "/oauth/authorize"
 }
)
# ruby 単体でやる場合はこの :exclude_callback が重要
request_token = consumer.get_request_token(:exclude_callback => true)

# ここで出力される URL にアクセスして,
# アプリのアカウントに対するアクセスを許可する
puts request_token.authorize_url

# callback 先の url にくっついている oauth_verifier の文字列をここへコピペする
# callback 先を http://sasquatch.github.io/tumblr.html とかにするとクエリ出してくれてべんりですよ
# strip がないと改行がはいってしまって,400 Bad Request になってしまう
# (こんなくだらない理由でハマった)
verifier = gets.strip

access_token = request_token.get_access_token(:oauth_verifier => verifier)

puts access_token.token
puts access_token.secret

それと見つけたツール

上記を ruby で動かせばいけますが,なんやわからないけど動かない場合は↓のツールを使うのがよいかもしれません. https://gist.github.com/monde/4577106 基本的に書いてあるとおりにコマンド実行すれば,良い感じに対話形式でやってくれるので,すてきです.

*1:特に,機械学習をつかって,過去のReblogから趣味趣向を学習して,それに沿ったReblogを行うBOTとか作りたい

ffmpeg で動画の再生速度を変更して再出力する

手順は次の通り:

  1. ffmpeg を使って動画を yuv 形式に変換する
  2. ffmpeg を使って,yuv を,再生速度を指定して元の形式に変換する

yuv にすると再生速度やビットレート,画像サイズなどの情報が取り除かれる.それを利用して,yuv から元の形式に戻すときにビットレート・画像サイズは元の動画と同じものを指定し,再生速度だけを違うものに指定することで,再生速度を変更した動画を作成できるというわけ.

以下,元動画を movie.mov とし,変換先動画を movie2.mov として,元動画のサイズは 480x320, fps 60, ビットレート 6000kb とした場合の10倍速動画の生成例を記述する.

手順1. yuv への変換

ffmpeg -i movie.mov movie.yuv

手順2.yuv から元動画への変換

ffmpeg -s 480x320 -pix_fmt yuv420p -r 600 -i movie.yuv  -s 480x320 -b 6M -an -r 600 movie2.mov


オプションの説明:
-s: 入出力動画のサイズ. 両方とも合わせる
-pix_fmt: 「フォーマットがわかりません」的なエラーが出た時にこれを指定する
-r: フレームレート*倍速したい数.元の動画が60なら600にすれば10倍速になる
-b: 出力先のビットレート.小さいと画像がノイズだらけになる
-an: オーディオを無視


この方法の利点:
iMovieなどを使って速度変更した場合の,画像サイズが勝手に4:3のアスペクト比になってしまうのを回避できる.


参考:

タイトルをかえた

ここへ文章を書くのはおひたしぶりです.

タイトルを Ajilog から A-Life on the five strings へとかえました.
A-Life は Artificial Life, つまり人工生命のことです.僕の主な研究
分野です.もうすこし正確に言えば,ガチの人工生命ではなくて,
構成論的手法で言語進化の諸問題にアプローチすることをやっています.


少し前,ブログを書くことを再開しようかと思って,さいしょは人工生命
のことをかっこ良く書いていこうかなと考えていたのですが,ここ数年,
論文やら学振申請書類やらお固い文章ばかり書いてたので,バランスを
取る意味でもここは頭の中のグチャグチャしたものをそのまま垂れ流すような
脈絡のないブログにしてやろうかと思い立ちました.
あまり推敲もしないつもりです.がんばって更新もしないつもりです.


それで,"on the five strings" は何かというと,これは僕の好きな楽器
バンジョーのことです.この楽器は弦楽器で,大雑把に言えば5つの弦が
ネック付きの太鼓に張ってあるというものです.だから five strings.
"on the" はセンテンスにするためというのもありますが,Banjoの指板に
人工生命が乗っかってる感じでしょうか.まあなんか,僕の好きなものを
2つ並べて読みのリズムがよさそうな感じにしたてた感じです
(ああ...つかみどこのない文章だなあ).


今までどおり,計算機関連の Tips を書いたり,
気ままに,僕の好きなものを紹介してこうかなぁと思っています.


以上です.僕の話はよくオチがないと言われます.

Dropbox のデーモンの場所と手動起動

LinuxDropbox において,ファイルの更新や取得をするのはデーモンである.したがって, X 環境で導入しても X を起動せずにコンソールだけで動かすことができる.たいていホームディレクトリに dropbox-dist があるので中の dropboxd を起動すれば良い.

 .dropbox-dist/dropboxd &

とかする.

Leopard にしたら dvipdfmx でエラーが出たので対処した

Mac OS X TigerSnow Leopard に上書きインストールしてから, dvipdfmx するとき以下のようなエラーが出ていた.

[1
** WARNING ** Could not locate a virtual/physical font for TFM "rml".
** WARNING ** >> This font is mapped to a physical font "HiraMinPro-W3".
** WARNING ** >> Please check if kpathsea library can find this font: HiraMinPro-W3
** ERROR ** Cannot proceed without .vf or "physical" font for PDF output...

Output file removed.

どうやらフォント関連でエラーが出ているらしい.調べてみたら

http://oku.edu.mie-u.ac.jp/~okumura/bibun4/

の「Mac OS X 10.5(Leopard)でヒラギノの埋め込みができない」で答えを見つけた.フォントパスが変わってたのかー…

僕は platexmacports で導入したので,前述のページとは微妙にパスが違う.macportsplatex を導入した場合は以下のようにする.

cd /opt/local/share/texmf/fonts/opentype
ln -sf /Library/Fonts/"ヒラギノ明朝 Pro W3.otf" HiraMinPro-W3.otf
ln -sf /Library/Fonts/"ヒラギノ明朝 Pro W6.otf" HiraMinPro-W6.otf
ln -sf /Library/Fonts/"ヒラギノ角ゴ Pro W3.otf" HiraKakuPro-W3.otf
ln -sf /Library/Fonts/"ヒラギノ角ゴ Pro W6.otf" HiraKakuPro-W6.otf
ln -sf /Library/Fonts/"ヒラギノ角ゴ Std W8.otf" HiraKakuStd-W8.otf
ln -sf /Library/Fonts/"ヒラギノ丸ゴ Pro W4.otf" HiraMaruPro-W4.otf

*書き込み権限が必要です.sudo するとか.

10分でコーディングというのに挑戦.

10分でコーディング|プログラミングに自信があるやつこい!!
http://ameblo.jp/programming/entry-10001721422.html

def deal(n, cards)
  a  = Array.new(n, "")
  ca_c = cards.split(//)
  handsize = cards.size / n
  handsize.times do |i|
    n.times do |j|
      a[j] += ca_c.shift
    end
  end
  a
end

p deal(6, "012345012345012345")
p deal(3, "123123123")
p deal(4, "123123123")
p deal(4, "111122223333")
p deal(1, "012345012345012345")
p deal(6, "01234")
p deal(2, "")

できたよ!!1時間かかったよ!\(^o^)/
まず問題の理解で10分使い果たしました

短くするならこんな感じ

def deal(n, cards)
  a  = Array.new(n, "")
  ca_c = cards.split(//)
  (cards.size / n).times {|i| n.times {|j| a[j] += ca_c.shift }}
  a
end

ていうか仕事しろ,研究しろ.

申し訳ありません.loadMovie は使わないほうが良かった.

 以前の投稿で,「動的生成した Flash を loadMovie で読み込む」ということをしていましたが,これは間違いというか,「ファイルサイズ100KB制限」の勘違いでやってしまった失敗です.ごめんなさい.loadMovie を使わずに getURL で直接取得してしまう方がよいです.

 携帯で読み込める swf (Flash Lite 1.x) のファイルサイズはおよそ100KB程度です*1.loadMovie で新しくファイルを読み込めば,ファイルサイズが初期化されて,この制限にはひっかからないと勘違いしていましたが,これは間違いでした.loadMovie では既に読み込んであるデータは初期化されません.そのため,データはどんどん蓄積されます.これでは20KBの swf を5つ読み込んだらアウトです.ああ,なんてくだらない失敗.

 以下のように getURL を使えば読み込み制限に引っかかることはありません.

// loadMovie(url, "/"); のかわりに getURL を使う.
getURL(url);

 推敲なしなので読みにくいかもしれませんが,進学のための引っ越しで忙しいのでこれにて.

*1:KDDI au: マルチメディア・コンテンツ > Flashコンテンツ : http://www.au.kddi.com/ezfactory/mm/flash01.html