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 | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する

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 | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
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というハッシュが追加される。

ね、簡単でしょ?

posted by 天井冴太 at 02:49 | Comment(0) | TrackBack(0) | Tool | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する

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

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

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

具体的には、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 APIWikiを実際に見た方が早いと思う。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に対応されると思うが、それまでの繋ぎとしてどうぞ煮るなり焼くなり。

参考文献

posted by 天井冴太 at 02:46 | Comment(0) | TrackBack(0) | Tool | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2009年12月08日

WSHの各種オブジェクトのメソッドはどうやらfunctionではないらしい

WSH(wscript.exe或いはcscript.exe)と、XULRunnerのjs.exe(或いはxpcshell.exe)でのJavaScript(JScript)実行時の違いを確認したくて、ちょっとしたコードを書いた。

それぞれ文字列出力用メソッドが異なり、以下のようになっている。

WSH
WScript.Echo
XULRunner
print

毎回書き直すのもアホくさいので、以下のように書いてみた。

if(typeof print === 'undefined') { print = WScript.Echo; }

// ここから下にテスト用コード

もはや何の説明も要らない程単純なコード。で、WSH環境で実行してみる。

D:\Documents and Settings\amaisaeta\test_error.js(1, 36) Microsoft JScript 実行時
エラー: オブジェクトサポートされていないプロパティまたはメソッドです。

あるぇ?

XULRunner環境下では勿論問題ない。36行目といったら、print = WScript.Echo;の部分。意味が分からん。

少し悩んで、WScript.Echo(typeof WScript.Echo);を実行してみた。

unknown

あるぇ?
"object"でも"function"でもなく、unknown?

……確かによく考えてみたら、WSHの各種オブジェクトはActiveXオブジェクトだったような

で、ググってみると、

最速の人の大昔のエントリに書いてあるんですけど、

IEのActiveXObjectっていうのはちょっと特殊で、メソッドなんかがJavaScriptのfunctionではない。

var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
alert(typeof xmlhttp.open); // unknown

こうなる。xmlhttp.openはfunctionではなくて謎オブジェクト。

IEでXMLHttpRequestを使えるようにする

つまりunknownってのはメソッドだと思って良いハズ。

という記述を発見
つまりunknownってのはメソッドだと思って良いハズ。とあるが、
"unknown"はメソッド("function")に似て非なるナニモノか
と考えといた方が良いのかもしれない。

つまり、

// if(typeof print === 'undefined') { print = WScript.Echo; }
// これを……
if(typeof print === 'undefined') { print = function(arg) { WScript.Echo(arg); } } // こうする

こうか。
最も、これだと1引数しか渡せない。可変長引数を更に別関数に渡したい時ってどうやれば良いんだろう……?

ActiveXオブジェクトだったような
COMオブジェクトだったかもしれない。どっちでもいいや。
posted by 天井冴太 at 21:52 | Comment(0) | TrackBack(0) | Study | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2009年11月13日

MSDNの誤謬に思いっきりだまされた件

ポインタとハンドルの取得には、この関数に代わる関数として GetClassLongPtr 関数があります(ポインタとハンドルは、32 ビット Windows では 32 ビット、64 ビット Windows では 64 ビットです)。32 ビット Windows と 64 ビット Windows の両方と互換性のあるコードを記述するには、GetClassLongPtr 関数を使ってください。

以上、GetWindowLong 関数より。

Windows APIに明るい人は気付いているかもしれないが、この文章内のGetClassLongPtr、正しくはGetWindowLongPtrである。ご丁寧にリンク先もGetClassLongPtrなお陰で、ものの見事に引っかかって長い事悩んでしまった。Microsoftめ……時間返せ……

そもそも、MSDN ライブラリの文章、誤謬や脱字の類が多すぎないか?

タグ:MSDN Windows API
posted by 天井冴太 at 02:45 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2009年11月07日

UTF-8な文字列出力をWindowsのコマンドプロンプトで確認する『恐らく一番現実的な』方法

TwitterAPIを叩いて遊んでみた。Twitter APIの返す文字列はUTF-8なので、そのまま標準出力に吐いても、デフォルトの文字コードがcp932(Shift JIS)なWindowsのコマンドプロンプトでは、ものの見事に化けてしまう。一度ファイルリダイレクトして、それを適当なテキストエディタで開けば読む事は出来るが、少々手間だ。めんどくさい。

じゃあコマンドプロンプトでUTF-8を表示する事は出来ないのかと探してみたら、CHCPコマンドを使えばいいと言う情報が出て来た。例えば、コマンドプロンプトで文字コードがUTF-8のテキストを表示する - KUMA TYPE。ただしこの方法だと、(リンク先の記事でも書かれているが)表示が崩れてしまう。これはよろしくない。

Cygwinの次期バージョンである1.7はUTF-8に対応する予定らしいが、公式ページにThe official 1.7.1 release should go public in late October or early November 2009.なんて書かれてあったら、今更βを導入しようなんて気も消え失せようというものだ。

では他に方法はないのか。やはりリダイレクトとエディタかめんどくさいコマンドプロンプトなんて死んじゃえばいいのに、と悶々としていたら、ふとひらめいた。

nkf使えばいいんじゃないか。

コマンドプロンプトでのUTF-8文字列の表示例(通常に出力した場合)試してみると、この様に化け化けだったのが……

コマンドプロンプトでのUTF-8文字列の表示例(nkfにパイプした場合)化けずに表示された。素晴らしい!

つまり、UTF-8な文字列を返すプログラムSOME_UTF8_OUTPUTが在るとすると……

SOME_UTF8_OUTPUT | nkf -s

……とすればいいことになる。

まぁいちいちパイプ処理書くのは面倒だけど、リダイレクトしてエディタで確認するのに比べたら万倍ぐらいマシだろう。なんなら確認用バッチファイルを用意するなり、DOSKEYエイリアスを設定するなりすれば良いだろうし。

タグ:nkf utf-8 Windows CUI CMD
posted by 天井冴太 at 03:24 | Comment(0) | TrackBack(0) | Tool | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2009年10月25日

ホスト名の用語についてちょっとまとめてみた。

どうにも憶えられないので簡単にまとめてみた。
ちょいちょいと調べた結果だから、微妙に間違い在るかも。もしあったら誰ぞフォローよろしく。

www .example .co .jp
ホスト名(広義)
ホスト名(狭義) ドメイン名
セカンドレベルドメイン トップレベルドメイン
属性型JPドメイン名
地域型JPドメイン名
国別コードトップレベルドメイン
ジェネリックトップレベルドメイン
スポンサー付きトップレベルドメイン
国際トップレベルドメイン
特殊用途トップレベルドメイン
トップレベルドメイン
国別コードトップレベルドメイン

country code Top Level Domain (ccTLD)

その名の通り、国毎に割り当てられたトップレベルドメイン。原則としてその国/地域に存在している個人/団体でないと取得出来ないが、広く開放する事で外貨獲得を狙う国もある(トンガ(.to)、ツバル(.tv)等)

ジェネリックトップレベルドメイン

generic Top Level Domain (gTLD)

国に縛られないトップレベルドメイン。ただし、それぞれに用途が定められている(商取引事業者(.com)、インフラ用(.net ただし現在は制限無し)等)。

スポンサー付きトップレベルドメイン

sponsored Top Level Domain (sTLD)

ごめんこれよく分からない。.comや.bizの、より用途を限定したTLD?

国際トップレベルドメイン

international Top Level Domain (iTLD)

国際的な政府機関用。国際連合本部(un.int)、ヨーロッパ連合(europa.eu.int; 現在はeuropa.euに移行済)、世界保健機関(who.int)等

特殊用途トップレベルドメイン

米国内機関(.gov(政府機関)、.mil(軍機関)、.edu(教育機関))或いは特殊用途用(.arpa(旧ARPANET逆引き用)、.example(例示用)、.localhost(その名の通りローカル。IPアドレス127.0.0.1)他)。

セカンドレベルドメイン

以下ccTLDが.jpのもの限定で。
他の国も似たようなもんだろうと思う。

属性型JPドメイン名

organizational type JP domain names

組織種別での分類。

営利法人(.co.jp)、多数者向けネットワークサービス(.ne.jp)、政府組織(.go.jp)、地方自治体(.lg.jp)等。

地域型JPドメイン名

geographical type JP domain names

地域(都道府県)での分類。

東京都(tokyo.jp)、福岡県(fukuoka.jp)等。

蛇足
タグ:Network WORD
posted by 天井冴太 at 02:59 | Comment(0) | TrackBack(0) | Networking | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2009年06月05日

JavaScriptの変数の面白い特性――グローバルな変数はundefined??

これは驚き。もしかしたら日頃JavaScript弄ってる人にとっては常識なのかもしれないけど、俺は凄く驚いた。

先ずは以下のコードを。


<html>
	<head>
		<script type="text/javascript">
			// <![CDATA[
			var hoge = 'hoge global';
			var piyo = 'piyo global1';

			if(piyo == undefined) {
				var piyo = 'piyo global2';
			}

			function f1() {
				var elem = document.getElementById('elem');

				elem.innerHTML = elem.innerHTML + '<br />' + piyo;
			}

			function f2() {
				var elem = document.getElementById('elem');

				elem.innerHTML = elem.innerHTML + '<br />' + hoge;
			}

			function f3() {
				var elem = document.getElementById('elem');

				if(hoge == undefined) {
					var hoge = 'hoge local';
				}

				elem.innerHTML = elem.innerHTML + '<br />' + hoge;
			}

			// ]]>
		</script>
	</head>
	<body>
		<p id="elem"></p>
		<script type="text/javascript">
			// <![CDATA[
			f1();
			f2();
			f3();
			// ]]>
		</script>
	</body>
</html>

で、この実行結果は、こうなる。


piyo global1
hoge global
hoge local

f1()は、続くf2()f3()との比較の為に書いているに過ぎない。ここで見て欲しいのはf2()f3()の実行結果の違いだ。

そう、グローバル領域で初期化している変数が、関数内ではundefiendと等価である、と評価されている

f1()

順に見てみる。先ずはf1()


var piyo = 'piyo global1';

if(piyo == undefined) {
	var piyo = 'piyo global2';
}

function f1() {
	var elem = document.getElementById('elem');

	elem.innerHTML = elem.innerHTML + '<br />' + piyo;
}

グローバル変数piyoを初期化。その直ぐあと、関数の外でpiyoundefinedか判定。当然、偽となるので改めて初期化されることはない。結果、f1()では最初に初期化した時の内容であるpiyo glocal1が出力される。

f2()


var hoge = 'hoge global';

function f2() {
	var elem = document.getElementById('elem');

	elem.innerHTML = elem.innerHTML + '<br />' + hoge;
}

単純にグローバル変数hogeを出力している。問題なくhogeの値であるhoge globalが出力されていることに注意。つまり、(当たり前のことだが)関数内からグローバル変数の値を評価できている。

f3()


var hoge = 'hoge global';

function f3() {
	var elem = document.getElementById('elem');

	if(hoge == undefined) {
		var hoge = 'hoge local';
	}

	elem.innerHTML = elem.innerHTML + '<br />' + hoge;
}

グローバル変数hoge(これはf2()で用いたものと同じ変数)を出力する前に、グローバル変数hogeundefiendでないかを評価、それが真ならば改めてhogeを(グローバルでとは別の値で)初期化している。そして、驚くべき事にこの評価式は真となっている。確かにグローバル領域で初期化しているのに!

f2()での結果を見ると、確かに初期化され、値を評価できているグローバル変数だが、f3()での結果によると、初期化されていないという評価を下されている事が分かる。言ってみれば、グローバル変数が、関数内ではundefinedと実際の値という2つの値を持っているかのようだ。

因みに、この動作は手持ちの以下のブラウザで確認した。すべでこの動作だった。(全てWindows用。Safariを除いて全て日本語版)

  • Mozilla Firefox 3.0.10
  • Opera 9.6.4 Build 10487
  • Safari 4 Public Beta (528.16)
  • Microsoft Internet Explorer 8.0.6001.18702

一体全体、これはどういう事なのだろうか。

タグ:javascript
posted by 天井冴太 at 05:09 | Comment(2) | TrackBack(0) | Study | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2009年04月26日

JavaScriptでhead要素を取得する方法

天井冴太的つれづれblog [天井の染み]: ffbadge.js - FriendFeedに登録しているサービスを一覧表示するブログパーツで公開しているffbadge.jsを作った時に嵌ったこと。

JavaScriptで、XHTML/HTMLbody要素を取得したい時には、こうする。


var hoge = document.body;

……って事は、head要素取得する時ってのはこうに違いない、と何の疑問もなく書いたコードがこれ。


var hoge = document.head;

hogeundefinedになって、どう頑張ってもhead要素が取得出来ない。何故だ……と思っていろいろ検索。 したらば、css + javascript の質問です。 javascript 中で css (外部ファイル) を読み込みたいと思っています。 そこで以下のような javascript を書いてみました。 var cs = docume.. - 人力検索はてなに書いてあった。


var hoge = document.getElementsByTagName('head')[0];

あー、document.headって無いのね……bodyがあるからheadも在るものとばっかり……

posted by 天井冴太 at 04:41 | Comment(0) | TrackBack(0) | Study | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する