2010年01月28日

doskeyが使えないようで使えるようで、やっぱり使い物にならなかった

Windowsのコマンドラインシェル、cmdにはDOSKEYというユーティリティがある。ファンクションキーや矢印キー等での補完を担当するものだ。
それとは別に、マクロというコマンドの別名が定義出来る機能がある。bash(に限らないが)のaliasみたいなものだ。

前回、cmdでも起動時に実行するバッチファイルを書ける事が解ったので、俄然DOSKEYマクロの使い道が出来た。と言う訳で、次のようなマクロを書いた。


doskey pathpp=PATH $b sed -e "s/^PATH=//" $b sed -e "s/;/\n/g"

PATHは設定したパスを";"で区切って出力するので見にくい。なので、";"の代わりに改行で見やすく出力するようにしたのがこのマクロだ。

さて、このpathppコマンドの出力結果をパイプし、別のコマンドに渡そうとしたが、上手く行かない。

pathpp | SOMECOMMAND

この様にしても、pathppの出力のみ表示され、SOMECOMMANDに渡されない。
気になって調べてみると、リダイレクトも効かない。

pathpp > output.txt

としても、output.txtは作成されず、pathppの結果がコンソールに出力されるのみ。alias万歳。doskeyは微妙。 - 新・日々録 by TRASH BOX@Eelによると、そういう仕様らしい。bash(他、Linuxで使われる各種コマンドラインシェル)のaliasは問題ないというのに……

バッチファイルにすれば問題ないらしいが、たかだかこの程度の単純な内容でファイルを作るというのもねぇ。

cmdはファイル名補完機能も貧弱だし、さっさと他のシェルに移行した方が良いのかもしれない。つかえねぇ……

ラベル:CMD CUI
posted by 天井冴太 at 01:36| Comment(0) | TrackBack(0) | Tool | 更新情報をチェックする

Windowsのcmdで、起動時に必ず実行するバッチファイルを指定する方法

要はbashの.bashrcのような事がしたいな、と。

INASOFTいじくるつくーるの項目をつらつら見てて可能だという事に気付いた。
要はレジストリを弄れという事らしい。わ……分かりづらい……

ユーザー毎の設定と、マシン全体での設定と2種類有り、それぞれ、

ユーザー
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
全体
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor

ここに、AutoRunという名前で実行したいファイルのパスを指定する。
バッチファイルのみかと思ったら、特に制限はないらしい。exeでも出来た。

と言う訳で、喜び勇んで以下の用なバッチファイルを作成し、登録した。doskeyマクロやpromptを設定させておくのに良いね。


@echo off
REM ----
REM  Initialization when cmd.exe is executed (for user env).
REM  Please register passing this file in the registry;
REM	  HKEY_CURRENT_USER\Software\Microsoft\Command Processor\
REM		  AutoRun (REG_SZ)
REM ----

REM *Aliases
doskey cd=cd /d $*
doskey chdir=chdir /d $*
doskey ch=cd /d %HOMEDRIVE%%HOMEPATH%
doskey envpp=if "$1" == "" ( set $b sed -e "s/=/\t/g") else ( set $1 $b sed -e "s/^$1=//i" $b sed -e "s/;/\n/g" )
doskey pathpp=PATH $b sed -e "s/^PATH=//" $b sed -e "s/;/\n/g"
doskey pdate=date /t
doskey ptime=time /t
doskey pushh=pushd %HOMEDRIVE%%HOMEPATH%

REM *Prompt
prompt %USERNAME%@%USERDOMAIN%$S"$P"$S$+$_$G

echo **** LOADED USER CONFIGURES BY %0
ラベル:CMD CUI tips
posted by 天井冴太 at 00:45| Comment(0) | TrackBack(0) | Tool | 更新情報をチェックする

2010年01月17日

twitter4rのTwitter::Userに最新tweet内容のデータが含まれないのでちょっと改造してみた

Rubyは既存のクラスを自由に書き換える事が出来るのでこういう時便利だね。……というお話第2弾。


require 'rubygems'
require 'twitter'

module Twitter
	class User
		@@ATTRIBUTES << :status
		attr_accessor *@@ATTRIBUTES
	
		class << self
			def attributes; @@ATTRIBUTES; end
		end
	end
end

これで、Twitter::Userクラスにstatusというハッシュが追加される。

ね、簡単でしょ?

ラベル:twitter twitter4r ruby
posted by 天井冴太 at 02:49| Comment(0) | TrackBack(0) | Tool | 更新情報をチェックする

twitter4rのTwitter::Client::myが上手く動かなくなってたのでちょっと改造してみた

改造というか、メソッドの追加か。
Rubyは既存のクラスを自由に書き換える事が出来るのでこういう時便利だね。

RubyからTwitterAPIを叩くライブラリ、twitter4r。便利なんだが、TwitterのAPI仕様変更を受け、一部上手く動かなくなっている。

具体的には、statuses/friendsstatuses/follosers。これらは1回の呼び出し辺り100人分のデータしか取得出来ない為、friendsやfollowersの人数によっては、複数回APIを叩かなければならない。

以前はpageパラメータを使い、100人以上のfriendsやfollowersを取得する仕様だった。例えば以下の様に。

http://twitter.com/statuses/friends.xml?page=1
API呼び出し時点での、friendsの1人目~100人目までのデータを取得。pageを省略した場合と同じ。
http://twitter.com/statuses/friends.xml?page=2
API呼び出し時点での、friendsの101人目~200人目までのデータを取得。

この場合、pageに指定すべき値は自明であり、1ずつインクリメントしていけば良いだけだった。

しかし、今はこれが廃止され、cursorというパラメータが導入された。

http://twitter.com/statuses/friends.xml
API呼び出し時点での、friendsの1人目~100人目までのデータを取得。以前のものと同じフォーマットの結果が帰っていると思われる。
http://twitter.com/statuses/friends.xml?cursor=-1
API呼び出し時点での、friendsの1人目~100人目までのデータを取得。cursor未指定時の結果を、更に別の要素でくるみ、次(101人目~200人目)のデータ取得時にcursorに指定すべき値もnext_cursorと言う名で返す。

Twitter APIのWikiを実際に見た方が早いと思う。cursor未指定時と指定時に返ってくるXMLの例が記述されている。

つまり、100人目以降のfriends/followersを取得する場合、旧方式のパース方法では上手く行かない。
それどころか、next_cursorの値を知る必要も出て来たのだ。

……と、ここまでで説明終わり。以下コード。


require 'rubygems'
require 'twitter'

module Twitter
	class Client
		def my2(action, options = {})
			return my(actin, options) if !options.has_key?(:cursor)
			
			raise ArgumentError, "Invalid user action: #{action}" unless @@USER_URIS.keys.member?(action)
			params = options.merge(:id => @login)
			response = http_connect { |conn| create_http_get_request(@@USER_URIS[action], params) }
			
			# get next cursor number
			json = JSON.parse(response.body)
			nextCursor = json['next_cursor']
			json = json['users'].to_json
			
			users = Twitter::User.unmarshal(json)
			
			[bless_models(users), nextCursor]
		end
	end
end

Rubyにはオープンクラスと言って既存クラスを上書きしてしまう機能がある。今回はそれを利用して、twitter4rバージョン0.3.2のTwitter::Clientクラスに新しいメソッドmy2を追加した。
基本的にはmyメソッドと変わらない。:cursor指定時に結果とnext_cursorの値(の配列)を返している点が異なるのみ。

正直、Rubyとか殆ど使った事無い身なので、変な書き方になってるかもしれない。そしてまともにテストしていない(ものぐさ)。
まぁ、恐らく次回のtwitter4rのバージョンアップでcursorに対応されると思うが、それまでの繋ぎとしてどうぞ煮るなり焼くなり。

参考文献

ラベル:ruby twitter twitter4r
posted by 天井冴太 at 02:46| Comment(0) | TrackBack(0) | Tool | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。