verus diary このページをアンテナに追加 RSSフィード

Effective ひとり生活++

2009-10-21

【追記した】mixiボイスとtwitterに同時ポストするスクリプトを書いてみた.GUIにも対応してみた.

【追記】TkGUIにも対応しておいた.



twitterでちょっと話題になったので,書いておく.


使い方.(Rubyインストールされている状態で!)


(下記ソース | カキソース(ってオイスターソースだっけ?))を保存して,中の

mixi_email = "hoge@hoge.jp"

mixi_password = "fugafuga"

twitter_id = "hoge"

twitter_password = "fugafuga"

について書き換えて,

コマンドラインで,

gem install twitter

gem install mechanize

をかけて,

ruby mixitter.rb "うんこうんこー!"

と打ちこむとポストする.

ruby mixitter.rb

と打ちこむとGUIを起動する.


イカソース!

mixitter.rb

require "rubygems"
require "mechanize"
require "tk"
require "twitter"
require "kconv"

class Mixi
  MIXI_BASE = "http://mixi.jp/"
  MIXI_HOME = "#{MIXI_BASE}home.pl"

  attr_accessor :email, :password

  def initialize(email, password)
    @email = email
    @password = password
    @agent = WWW::Mechanize.new
  end

  def login
    top_page = @agent.get(MIXI_BASE)
    form_login = top_page.form_with(:name => 'login_form')
    form_login.email = email
    form_login.password = password
    @agent.submit(form_login)
  end

  def post(text)
    home_page = @agent.get(MIXI_HOME)
    form_echoPost = home_page.forms.find{|f| f.form_node['id'] == 'EchoPost'}
    form_echoPost.body = text
    @agent.submit(form_echoPost)
  end
end
  

mixi_email = "hogehoge@hoge.jp"
mixi_password = "fugafuga"

twitter_id = "hogehoge"
twitter_password = "fugafuga"

def mixitterpost(email, mpass, tid, tpass, comment)
  puts "mixiとtwitterに同時ポストするツール"
  puts ""

  comment = Kconv.toutf8(comment)

  puts "mixi================================="
  magent = Mixi.new(email, mpass)
  puts "認証中."
  magent.login
  puts "コメントをポスト中"
  magent.post(comment)

  puts ""

  puts "twitter=============================="
  puts "認証中."
  tauth = Twitter::HTTPAuth.new(tid, tpass)
  tagent = Twitter::Base.new(tauth)
  puts "コメントをポスト中"
  tagent.update(comment)
end

if(ARGV[0] != nil)
  mixitterpost(mixi_email, mixi_password, twitter_id, twitter_password, ARGV[0])
else
  @root = TkRoot.new(:title => "Mixitter")
  @text = TkEntry.new.pack
  @button = TkButton.new(nil, :text => "POST")
  @button.command = proc{
                           mixitterpost(mixi_email, mixi_password, twitter_id, twitter_password, @text.value)
                           @text.value = ""
                         }
  @button.pack
  Tk.mainloop
end


kconvを使っているのは,Windows環境を想定しているから.

Mixiクラスのコンストラクタでloginしていないのは,無駄に重くなることを恐れたため.


以上!

2009-10-04

bamboo touchで"くぱぁ"してみた.

bamboo touchペン付きを買ったので,どんな感じでピンチインとかしているのか気になって,調べてみた.

Wacom ペンタブレット Sサイズ イラスト&ビジネスに Bamboo CTH-460/K0

Wacom ペンタブレット Sサイズ イラスト&ビジネスに Bamboo CTH-460/K0


とりあえずspy++で見てみたら,どうやら仮想キーボードでControlKeyを押して,そいで仮想マウスのスクロールをしている模様.

<00218> 00030B2A P WM_KEYDOWN nVirtKey:VK_CONTROL cRepeat:1 ScanCode:1D fExtended:0 fAltDown:0 fRepeat:0 fUp:0

<00219> 00030B2A P WM_MOUSEWHEEL fwKeys:MK_CONTROL zDelta:120 xPos:531 yPos:494

<00220> 00030B2A P WM_KEYUP nVirtKey:VK_CONTROL cRepeat:1 ScanCode:1D fExtended:0 fAltDown:0 fRepeat:1 fUp:1


なので,適当にコードを書いてみた.フォーム上で"くぱぁ"した時.

Private Sub Form1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
    If Control.ModifierKeys And Keys.ControlKey = Keys.ControlKey Then
        If e.Delta > 0 Then
            '広げたときの処理
        Else
            '閉じたときの処理
        End If
    End If
End Sub

まぁマウスホイールイベントが発生した時に,コントロールキーが押されているか調べて,ホイールの回転角が正なら広げている動作で,負なら閉じている動作というわけ.


というわけで,適当に画像を用意してくぱぁクラスを書いて動画にしてみた.

D


だれか画像きぼんぬ!

2009-08-21

バーコード認識とか,OpenCVとか,OpenGLとか合わせてみる.

f:id:verus:20090821051652j:image:w600


書籍のISBNを使った拡張現実なんぞをやろうかと思い付き,試してみるテスト.

OpenGLとOpenCVを組み合わせる件については以下を参考に.

ページが見つかりません。 - 王様の箱庭


そして,バーコードを認識する件については,ZBar bar code readerなるライブラリを使ってみる.

ZBar bar code reader

ただ,OpenCVのキャプチャデータIplImageから,ImageMagickを使うべきライブラリに持ってこないといけないので,ちょっと弄っておく.

バーコードを見つけて,ISBNコードを返すコードを以下.

bool findBarcode(IplImage *src, char *code)
{
	cvCvtColor(src, grayImage, CV_BGR2GRAY);
	ImageScanner scanner;
	scanner.set_config(ZBAR_ISBN13, ZBAR_CFG_ENABLE, 1);

	Image image(grayImage->width, grayImage->height,
		    "GREY", grayImage->imageData,
		    grayImage->width * grayImage->height);
	// scan the image for barcodes
	int n = scanner.scan(image);

	// extract results
	for(Image::SymbolIterator symbol = image.symbol_begin();
		symbol != image.symbol_end();
		++symbol) {
		if(strcmp(symbol->get_type_name().c_str(), "ISBN-13") == 0)
		{
			strcpy(code, const_cast<char *>(symbol->get_data().c_str()));

			return true;
		}
	}

	// clean up
	image.set_data(NULL, 0);

	return false;
}

とりあえずGoogle Bookからデータも引っ張ってきてみる.

char code[13];
if(findBarcode(capFrame, code))
{
	cout << code << endl;
	System::Net::WebClient wc;
	System::String^ strCode = gcnew System::String(code);
	System::String^ bookdata = wc.DownloadString("http://books.google.com/books?bibkeys=ISBN:" +
						     strCode + "&jscmd=viewapi&callback=mycallback")->Replace("\\x26","&");
	System::Console::WriteLine(bookdata);
}

ネットワークは面倒だったので,CLSで誤魔化し始めていたりw


書籍とARなんてありがちなところだけど,あんなこんなできるといいなー,と考えるだけでも面白くなってくるw

2009-04-15

XilinxのJTAGでLatticeのFPGAをコンフィグする.

なひたふさんのところで,素晴らしい情報が公開されていた.

78K付録基板で作る「78KマイコンUSBプログラマ」

#"使い方その2(XILINX、ALTERA、LATTICEのパラレルケーブルを使う場合)"を参照.


氏の作成したソフトウェアを使えば,XilinxのパラレルJTAGでもLatticeのFPGAがコンフィグできるらしい.

というわけで,ディジタルデザインテクノロジの付録基板で試してみた.

f:id:verus:20090415013111j:image:w400


今回のJTAGにはXilinxパラレルJTAG互換である,ESP企画のX-CABLEを使用.

3000円と他社に比べ安いので,オススメ.

株式会社イーエスピー企画 - 商品[画像ベースボード関連]

もちろん手持ちのXilinx JTAGを使ってもいい.

どうやらAlteraのByteBlasterにも対応しているらしい.


X-Cableはピンアサインが違ったので,写真にあるように変換基盤を噛ませた.

ただピンアサインを再配置しているだけの,直配線の基盤.


なひたふさんのサイトからダウンロードしてきたxp2jtag.lzhを解凍する.

さらに解凍後フォルダ中にあるinstdrv.exeを実行し,ドライバのインストールを行う.

そして,書き込む際にはマニュアル通りコマンドプロンプトから

xp2jtag -cable prnprt -auto e:\DATA\tutorial\hdl_example\hdl_example.jed

のように実行する.


素晴らしい,本当に書き込めた!



んで,使っててフロントエンドが欲しいな,と思ったので作ってみた.


f:id:verus:20090415010917j:image:w400


なひたふさんに許可とらないと配布は怒られるかなー

2009-03-23

RubyでBrainf*ckのインタプリタを実装すること,以上!

適当にWikipediaを読んでいたら,Brainf*ckの項目にたどり着いた

Brainfuck - Wikipedia

ので,とっさに思いついて処理系を実装しようと思った.

ポインタ云々なので,Cを使ったら楽だと思いつつ,あえてRubyで書くことに.


ちなみにWikipediaみてもイミフな人に向けて説明すると,Brainf*ckとは

  • 記憶領域の番地を1進む,あるいは1戻るの移動
  • 指定の番地の記憶領域に1を足すこと,あるいは引く
  • 指定番地の1文字を出力する,あるいは指定番地に1文字入力する
  • それら命令の条件(「指定番地のデータが0か,それ以外か」のみ)を持った繰り返し

だけの命令しか存在しないプログラミング言語.


なので,プログラムの文字は><+-.,[]の8種類のみ.

#8文字ということは"如月千早天海春香"とか"涼宮ハルヒの憂鬱"とかの8文字でもいけるんじゃね!!??


よって,予想通り,Brainf*ckのプログラムは

 >+++++++++[<++++++++>-]<.>++++
 +++[<++++>-]<+.+++++++..+++.[-
 ]>++++++++[<++++>-]<.>++++++++
 +++[<+++++>-]<.>++++++++[<+++>
 -]<.+++.------.--------.[-]>++
 ++++++[<++++>-]<+.[-]++++++++++.

こんなことになりますw



Rubyでの実装は意外とシンプルにできました.

[]が後方で評価してるのは頂けませんが,これは途中までBrainf*ckの仕様をよく理解せず作っていたのが原因w


$ ruby brainfuck.rb hello.bf

てな感じで実行すると,HelloWorld!っちゃいます.

Input filename : hello.bf
Source===============================================================
 >+++++++++[<++++++++>-]<.>++++
 +++[<++++>-]<+.+++++++..+++.[-
 ]>++++++++[<++++>-]<.>++++++++
 +++[<+++++>-]<.>++++++++[<+++>
 -]<.+++.------.--------.[-]>++
 ++++++[<++++>-]<+.[-]++++++++++.

Result===============================================================
Hello World!

イカソース!


brainfuck.rb

filepath = ARGV[0]

puts "Input filename : #{filepath}"
source = open(filepath).read
puts "Source==============================================================="
puts source
puts 
puts "Result==============================================================="

#変数とか準備
stack = Array.new()
data = Array.new()
address = 0
pointer = 0
data.push 0

while(address < source.length)
	case source[address].chr
		when ">"
			pointer += 1
			if(data.length >= pointer)
				data.push(0)
			end
		when "<"
			pointer -= 1
		when "+"
			data[pointer] += 1
		when "-"
			data[pointer] -= 1
		when "."
			print data[pointer].chr
		when ","
			data[pointer] = STDIN.getc
		when "["
			stack.push(address)
		when "]"
			if data[pointer] != 0
				address = stack.pop() - 1
			else
				stack.pop()
			end
		else
			#それ以外は華麗にスルー
	end
		
	address += 1
end

hello.bf

 >+++++++++[<++++++++>-]<.>++++
 +++[<++++>-]<+.+++++++..+++.[-
 ]>++++++++[<++++>-]<.>++++++++
 +++[<+++++>-]<.>++++++++[<+++>
 -]<.+++.------.--------.[-]>++
 ++++++[<++++>-]<+.[-]++++++++++.

echo.bf

 +[>,.<]