0

RubyでFlickr APIのphotos.getInfoを呼ぶ

Net::Flickrをインストールしたら、flickr.photos.getInfoメソッドが実装されてなかったので良い機会なので実装してみた。

flickr apiをrubyで使う – replore的日記がとても参考になった。

FlickrAPIは普通にRESTなので、REXMLで取得してparseする。

今回自分で実装したのはgeotagまわりのため。FlickrのAPIの仕様でtagは小数点やハイフンが消されるので、その元の値を取るのにgetInfoメソッドが必要になる。Tagオブジェクトのrawからアクセスできるようにした。

使い方はphoto_idをコンストラクタに渡す。

info = PhotoInfo.new(photo_id)

info.tags.each{ |tag|

puts tag.raw

}

flickr-photos-getInfo.rb

require’open-uri’

require’rexml/document’

require’cgi’

FLICKR_API_KEY=’your-api-key’

defflickr_call(method_name,arg_map={}.freeze)

args=arg_map.collect{|k,v|CGI.escape(k)<<'='<
url=”http://www.flickr.com/services/rest/?api_key=%s&method=%s&%s”%

[FLICKR_API_KEY,method_name,args]

doc=REXML::Document.new(open(url).read)

end

classPhotoInfo

@xml_doc

definitialize(photo_id)

@xml_doc=flickr_call(‘flickr.photos.getInfo’,’photo_id’=>photo_id)

end

deftags

tag_list=Array.new

REXML::XPath.each(@xml_doc,’//tag’){|tag|

tag_list<
‘id’=>REXML::XPath.first(tag,’attribute::id’),

‘author’=>REXML::XPath.first(tag,’attribute::author’),

‘raw’=>REXML::XPath.first(tag,’attribute::raw’),

‘tag’=>tag.text

)

}

returntag_list

end

end

classTag

definitialize(args)

@id=args[‘id’]

@author=args[‘author’]

@raw=args[‘raw’]

@tag=args[‘tag’]

end



defid

@id

end



defauthor

@author.to_s

end



defraw

@raw.to_s

end



deftag

@tag.to_s

end



defis_machine

if@tag=~/.+:.+=.+/

returntrue

else

returnfalse

end

end



defis_geo

if@tag=~/geo:.+=.+/

returntrue

else

returnfalse

end



end

end

0

秋月FT232RL基盤をPSoC CY8C29466で使ってみる

秋月のFT232RL基板(AE-UM232R)を使ってみた。

FT232シリーズは、FTDI社製のUSB-UART変換基板。

USBデバイスとしてパソコンからは認識されるが、Win/Mac両対応のVirutal COM Port Driverをインストールすると、シリアルポートとして認識する事ができるようになるので、ArduinoやGainerの部品としても使われている。

写真の通り、周辺回路が全て基板上に実装されているので簡単に使えた。

プログラムはPSoC – CY8C29466でUART受信割り込みと同じものを使用した。

PC側からUSBを通して基盤側に5Vを給電するのもできた。

配線したのはRXD, TXD, VCC, GNDだけで終わりなのでとても楽。

秋月FT232RL基盤+PSoCでUART

Read more

0

C#3.0 – 任意のウィンドウをアクティブにしてキーコードを送る

ウィンドウのタイトルバーを検索して、そいつを無理矢理最前面に表示させて、キーボード操作を送る方法。これを使えば全てのアプリケーションを、UIをAPIとして自動操縦する事が出来る。

SendKeysで送れるキーコードはSendKeys クラス (System.Windows.Forms)を参照

例。

Skype COM APIに通話を切るAPIが無いっぽいので

まずタイトルバーに「Skype」を含むウィンドウを見つけて、SendKeysでキーボード入力の「ESC」を発生させて無理矢理通話を切る。

using System.Runtime.InteropServices; // for DllImport

[DllImport(“user32.dll”)]

externstaticIntPtrGetWindow(IntPtrhWnd,uintuCmd);

[DllImport(“user32.dll”)]

externstaticIntPtrGetForegroundWindow();

[DllImport(“user32.dll”)]

externstaticintGetWindowText(IntPtrhWnd,StringBuilderlpStr,intnMaxCount);

[DllImport(“user32.dll”)]

externstaticboolIsWindowVisible(IntPtrhWnd);

[DllImport(“user32.dll”)]

externstaticboolSetForegroundWindow(IntPtrhWnd);

publicvoidcallStop()

{

StringBuildersb=newStringBuilder(100);

IntPtrhwnd=GetForegroundWindow();//最前面のウィンドウハンドルを取得

while(hwnd!=IntPtr.Zero)

{

if(IsWindowVisible(hwnd))

{

GetWindowText(hwnd,sb,sb.Capacity);//タイトルバー文字列を取得

if(sb.ToString().IndexOf(“Skype”)>=0)

{

SetForegroundWindow(hwnd);//アクティブにする

Thread.Sleep(1000);//ちょっと待って

SendKeys.SendWait(“{ESC}”);//通話を切る

break;

}

}

hwnd=GetWindow(hwnd,2);//次のウィンドウハンドル

}

}

ウィンドウが正面に来るまでちょっと待つのが肝。

VisualStudio2008買って使ってみてるんだけど、設定をVS2005から読み込んでくれてるので違和感無く使えてる。C#3.0になってるんだけど普通に使う分にはあまり変わってないな

1

RailsなしでActiveRecordだけ使って、SQLiteを読み書きする

Ruby on Railsが巨大すぎてよくわからないので、とりあえずRailsの中で使われているO/RマッパであるActiveRecordだけ使ってみた。

SQLを使ってオブジェクト指向で書くとき、SQL文を発行して受け取った返り値の配列をオブジェクトに突っ込み直してやらなければならないんだけど、O/R mappingを使うとSQLのデータベースとそこに接続しているプログラム上のオブジェクトが同期できる。

もちろん、プログラム側のオブジェクトで save()などすればSQLのINSERT文が発行されるので、すぐ保存される。

■準備

環境はAMD64版Ubuntu 7.4。

ActiveRecordとSQLite3(設定とか無くて簡単なので)をインストールする

sudo apt-get install libdbd-sqlite3-ruby libsqlite3-ruby libsqlite3-dev sqlite3 ruby1.8-dev

sudo gem install activerecord sqlite3-ruby

今回はokTwitterへのUpdateを保存したり、読み出したりする例。

今回保存するのは

・text(postされたupdateの本文)

・time(postされた時刻)

の2つだけ。

■DBに接続する

table等を作る必要はない。

先にmkdir dbしておいて、

#!/usr/bin/ruby
require’rubygems
require’active_record’
ActiveRecord::Base.establish_connection(
:adapter=>’sqlite3′,
:dbfile=>’db/oktwitter’
)

dbfileに :memory: を指定すると、ファイルに保存せずにメモリ上で試せる。

MigrationというRailsでのDBのバージョンを管理するしくみを使って、tableを作る。

参考:Class: ActiveRecord::Base

classUpdatesInit create_table(:updates){|t|
t.column:text,:string,:limit=>200,:null=>false
t.column:time,:int,:null=>false
}
end
defself.down
drop_table:updates
end
end

upの中でcolumnの型を指定しておく。ちなみに自動的にidというcolumnができて、主キーになっている。

UpdatesInit.migrate(:up)

するとDBができる。(2回やる必要はない)

テーブルを消すのもできる

UpdatesInit.migrate(:down)

で、さっそく保存してみる。

Read more

3

PSoC – CY8C29466でUART受信割り込み

ひさしぶりにPSoC Designer4.4をいじって、UARTの受信割り込みを覚えたのでメモ。

1年ぐらい前にUART送信と、受信バッファに溜まったデータの読み込み方はやったんだけど

s.h.log: PSoC – CY8C29466でUART送信

受信した瞬間にイベントを発生させて、あらかじめ登録しておいた関数にジャンプさせる「受信割り込み」の方法がわからなかった。

んで最近植木さんが「uart_1int.asmの_UART_1_RX_ISR:からljmp」と言っていたので、その通りやったらできた。

■回路

ADM3202のRXとTXに、PSoCのPort2_4とPort2_5を突っ込む。

Port_2_2にタクトスイッチ、Port_2_0にLED。

PSoC UARTPSoC UART

PSoC UART Receive Int

■今回の動作

スイッチを押すとLEDが付き、離すと消える。これはGPIOの両エッジ割り込みでやってる。

さらに、UARTでパソコン側から送られた文字はそのまま送り返す(エコーする)

送られてきた文字の中にUがあればLEDを点灯させ、 !Up!を送り返す。Dがあれば消灯して!Down!を送り返す。

Acknowrichでシリアル通信をやりとりしているところ

PSoC UART Receive Int



Source Code (PSoC Designer 4.4 + C Compiler)

/***
  Port2_2のスイッチでLEDをON/OFFする
  UARTを受信してそのままエコー。DでLEDをOFF、UでLEDをONする
  
  CPU: CY8C29466 24MHz(Internal)
  Board: Bread-board
  Compiler: PSoC Designer4.4 + C Compiler
  Date: 2008/3/14
  Author: Sho Hashimoto
  WebSite: http://shokai.org
  ***/
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#define _BV(BIT) (1<<BIT)
#define sbi(BYTE,BIT) (BYTE |= _BV(BIT))
#define cbi(BYTE,BIT) (BYTE &= ~_BV(BIT))
#define LED_ON() sbi(PRT2DR, 0);
#define LED_OFF() cbi(PRT2DR, 0);
void main(){
  M8C_EnableGInt; // enable global interrupt
  M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
  UART_1_CmdReset(); // uart init
  UART_1_IntCntl(UART_1_ENABLE_RX_INT); // enable receive interrupt
  UART_1_Start(UART_1_PARITY_NONE);
  LED_ON();
}
#pragma interrupt_handler INT_GPIO
void INT_GPIO(void){
  if(PRT2DR & _BV(2)){
    LED_ON();
    UART_1_CPutString("ON¥r¥n");
  }
  else{
    LED_OFF();
    UART_1_CPutString("OFF¥r¥n");
  }
}
#pragma interrupt_handler INT_UART_RX
void INT_UART_RX(void){
  char recv_data;
  recv_data = UART_1_cGetChar(); // read UART
  UART_1_PutChar(recv_data); // echo
  switch(recv_data){
  case 'U':
    LED_ON();
    UART_1_CPutString("!Up!");
    break;
  case 'D':
    LED_OFF();
    UART_1_CPutString("!Down!");
    break;
  }
}


uart_1int.asmに受信割り込みをljmpで書いておく
_UART_1_RX_ISR:
   ;@PSoC_UserCode_BODY_2@ (Do not change this line.)
   ;---------------------------------------------------
   ; Insert your custom code below this banner
   ;---------------------------------------------------
   ;   NOTE: interrupt service routines must preserve
   ;   the values of the A and X CPU registers.
   
   ljmp _INT_UART_RX
   ;---------------------------------------------------
   ; Insert your custom code above this banner
   ;---------------------------------------------------
   ;@PSoC_UserCode_END@ (Do not change this line.)


psocgpioint.asmにも、GPIOの割り込みをljmpで書いておく
PSoC_GPIO_ISR:
   ;@PSoC_UserCode_BODY@ (Do not change this line.)
   ;---------------------------------------------------
   ; Insert your custom code below this banner
   ;---------------------------------------------------
   
    ljmp _INT_GPIO
   ;---------------------------------------------------
   ; Insert your custom code above this banner
   ;---------------------------------------------------
   ;@PSoC_UserCode_END@ (Do not change this line.)
   reti

UARTまわりの関数はuart_1.asmとuart_1.hに自動生成されてる。

cGetChar()とiGetChar()があるが、cGetChar()の方だとchar型として読み出せた。iGetCharの方はおそらく数値としてかな?

RXのバッファが残っているかどうかを確かめる方法がわからない。

Read more