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ランキング - 投票する
2009年04月10日

グローバルIPってどうやって取得すれば良いんだろう?

ちょっとメモ代わりに。

現在とあるプログラムを作っているが、グローバルIPアドレスをどうやって取得すべきか悩んでいる。

使っている言語Javaなのだが、java.net.InetAddress.getLocalHost().getHostAddress().toString()だと、192.168.1.xxxといった感じのローカルのアドレスしか取得出来ない。

こことかここを見た感じでは、
外部サイトで出力→その結果を取得しアドレス部分以外(もしあれば)を除外する
という流れになるようだが、外部サイトが落ちる可能性を考えるとあまり使いたくない。自分だけが使うプログラムだというなら兎も角、配布を考えているものだしなぁ……

なんとか外部の力を借りずに取得する方法って無いモノかなぁ……

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

VMWare PlayerにWindows 7βをインストールする(ネットも音も大丈夫!版)

Windows 7ベータ版は、当初はMSDNやTechNetを通じて開発者向けに提供。一般ユーザー向けには、米国時間1月9日に提供を開始する。

という訳で、既に約1ヶ月も前にリリースされて……

米MicrosoftのWindows開発チームは,次期クライアントOS「Windows 7」のベータ版の一般ユーザー向けダウンロード提供を米国時間2009年2月10日まで延長すると発表した。

あと数日で公開終了するらしいMicrosoftの次世代OSであるWindows 7のβ版をVMWare Playerにインストールしてみた。

……本当は公開後の連休中に既に入手し、いろいろ頭ヒネリながらインストールしていたが、今更、もう少しで公開終了というとてつもなく微妙な時期にblogにまとめてみる。いやだってzeppelが書けって五月蝿いから……

Windows 7のダウンロード

という訳で、まずはMSのサイトからWindows 7を落としてくる。私がダウンロードした時には、英語版のWindows 7のページからダウンロードした。1/13からは日本語のページも公開されている。どちらもページ上部にダウンロードページへのリンクがあるので迷う事はないと思う。英語版のページでも日本語版のWindows 7を落とす事が出来る。

.NET Passportのアカウントが必要なので前もって取得しておく事。

ダウンロード前にプロダクトキーが表示されるので、忘れずメモるなり、そのページを保存するなりすること。

1つ、注意すべき点として、ダウンロードにActiveXコンポーネントを使用する仕様となっているようだ。その為IEで無ければダウンロード出来ない。私はFirefoxで落とそうとして往生した。全く何を考えてるんだ糞MSめ!私は直リンクの掲載されているページを教えて貰って、そこからダウンロードしたが、この方法はあくまで自己責任で。

ダウンロードしたWindows 7は、ISOイメージファイルとなっている。ならば仮想CD/DVDソフトが必要になりそうだが、その必要はない。実はVMWare Playerは仮想マシンのCD/DVDドライブにISOイメージを指定できる(方法は後述する)。

仮想ディスク、設定ファイルの生成

早速インストールへと進みたいところだが、ここで困った事が1つ。そう、VMWare Playerでは仮想ディスクを作製する事が出来ない。VMWare用の仮想ディスク、及び設定ファイルの生成を行う為に、以下のツールを用意する。

vmx-MakerはLZH書庫を適当なフォルダに解凍すればOK。
QEMUの方だが、今回必要なのはQEMU付属ツールのqemu-img.exeのみ、ダウンロードしたZIP書庫からqemu-img.exeのみを、これまた適当なフォルダに展開。

vmxMakerの設定のスクリーンショット(メイン画面) vmx-Makerを起動し、各種設定を入力する。
『仮想環境の名称』には適当な名前を。ここに設定した文字列がVMWare Playerのタイトルバー部分に表示される。
『ゲストOSの種別』にはwinVistaを入力。Windows 7はWindows Vistaのマイナーアップ版だと言うし、これが無難なところだろう。
『メモリサイズ』には512を指定してみた。搭載メモリ量に余裕があるのならば、MSが必要だと主張している1GB(=1024MB)を割り当てても良いだろう
『CD-ROMにISOイメージを割り当てる』にチェックを入れ、ダウンロードしたWindows 7のISOイメージファイルを指定する。
さらに、『サウンドカード』にはes1371を指定。残りはデフォルトのままとした。

vmxMaker設定スクリーンショット(仮想ディスク作成) 『ファイル生成』ボタンを押す前に、仮想ディスクのファイルを作成する。『仮想ディスクのファイル名』欄直下の『>>』ボタンを押下。表示される『仮想ディスクの作成』ウィンドウ、『qemu-imageの場所』にqemu-image.exeのパスを入力する。『仮想ディスクの容量』はお好みで。MSは16GB要ると言っているのでそれ以上で。『ファイル作成』ボタンを押すと、仮想ディスクファイルの保存先を選ぶダイアログウィンドウが表示される。任意の保存先を選択する。

仮想ディスクファイルの作成が終了するとメインウィンドウに戻ってくるので、ここで『ファイルの生成』ボタンを押下。vmxファイル(仮想ディスクファイル用の設定ファイル)の保存場所(仮想ディスクファイルと同じ場所にするのが妥当)を指定する。

さて、これで仮想ディスクのファイル(拡張子vmdk)と、その設定ファイル(拡張子vmx)を生成できたわけだが、ここで設定ファイルを手作業で編集する。これを行わないとネットへの接続、及び音の再生が出来ない。なお、この設定はWindows 7のインストール前に完了しておく必要があるようだ。

まず、ネットに繋がるようにするには以下を設定ファイルに追記する。


ethernet0.virtualDev="e1000"

次に、音を鳴らすようにするには以下を追記。


sound.present = "TRUE"
sound.autoDetect = "FALS""
sound.fileName = "Realtek High Definition Audio"

ここで、sound.fileNameの値は、PCのサウンドカード名を入れる。デバイスマネージャで確認できるので、それを記述する事。

Windows 7をインストールする

さて、Windows 7のインストールへと進む。VMWare Playerを起動し、設定ファイルを開く。設定ファイルでWindows 7のISOイメージを指定しているので、自動的にインストーラが起動する。

以下、幾つか注意が必要そうなインストール画面をSSを交えて解説する。

Windows 7インストーラの最初の画面 Windows 7インストーラ最初の画面。地域的な設定を行う画面だが、基本的に変更しなくて良い。精々キーボードの種類ぐらいだろう。

Windows7βインストール画面:2画面目 2画面目。『今すぐインストール』を選択する。内容的に1画面目と2画面目が逆なような気もするが、気にしてはいけないのだろう。多分。

Windows7βインストール画面:メモリ不足時 なお、ここでメモリが足りないと、何も情報の表示されないダイアログボックスが表示され、インストールが進まない。この画面が出たら一度インストールを中断し、設定ファイルのmemsizeの値を増やし再チャレンジする必要がある。

Windows7βインストール画面:インストールの種類選択 お決まりのライセンス条項表示を経て、『インストールの種類』画面へ。新規にインストールする為、『カスタム』を選択する。

Windows7βインストール画面:インストール先ドライブの選択インストール先ドライブの選択。パーティション操作を行う場合は『ドライブオプション』をクリックする事でその為のメニューを表示させる事が出来る。未フォーマットの状態の筈だが、そのまま『次へ』を選んでも何の問題もなくインストールが進行する。

Windows7βインストール画面:プロダクトキーの入力 ユーザー名とコンピュータ名の入力、パスワードの入力を経て、プロダクトキーの入力画面に。Windows 7を落とす直前に表示されていたプロダクトキーを入力する。

Windows7βインストール画面:ネットワークの場所の指定 ネットワークの場所の指定。仮想マシンの場合どうなるのか。いまいちハッキリしない為ここでは『パブリックネットワーク』を選択した。

Windows7βデスクトップ画面 この後しばらくすると、仮想マシンが再起動、Windows 7が起動する。無事デスクトップ画面が表示されたらインストール成功だ。

感想とか

VMWare Playerだと、外部ツールを用意したり設定ファイルを編集したりと少々面倒だ。単純にWindows 7がβ版で、しかも仮想マシンへのインストールという特殊な環境の為の面倒くささなのかもしれない。仮想ディスクや設定ファイルの生成は、VMWare Serverを使った方が楽だったのかもしれない。

『Windows 7は早い』という評判をあちこちで見かけるが、確かに早い印象を持った。仮想マシン上、しかもメモリを512MBMS推奨値の半分しか設定していないが、ストレスをあまり感じない。

Windows 7のインストール方法の紹介はこれで終わりだ。そのうちWindows 7の機能についての紹介記事を書くかもしれない。現在プライベートが少々ごちゃごちゃしている為、書けるかどうかアヤシイが。

参考にしたページ

1GB(=1024MB)を割り当てても良いだろう
当方2GBメモリ搭載マシンで1GB割り当て多ところ、インストールは無事完了したが、いざWindows 7を立ち上げようとしたらフリーズしたようになってしまった。
メモリが足りない
私の環境では、memsize="256"時にこの現象が発生した。
posted by 天井冴太 at 15:00 | Comment(0) | TrackBack(0) | OS | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2008年11月04日

結城浩さんの『新版暗号技術入門――秘密の国のアリス』無料プレゼントに応募してみる

『新版暗号技術入門――秘密の国のアリス』無料プレゼント応募はあと約二時間で〆切です。 http://d.hatena.ne.jp/hyuki...

という事なので、申し込んでみる。

結城浩さんの書籍新版暗号技術入門 秘密の国のアリスプレゼント企画。Twitter覗いてたら偶然見かけて、これは応募せざるを得ない、と。

しかし暗号っていいね。こう、ワクワクするね。

しかし、2008-10-29 - 結城浩のはてな日記によると、当選人数:7人2008-11-04 21:54 現在の応募数108名とのこと。あ……当たるのか……?

ワクワクする
実は、私のこの『天井冴太』というHNも本名を一種の『暗号化』した結果生まれたものと言える。
posted by 天井冴太 at 23:53 | Comment(0) | TrackBack(0) | Other | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
2008年06月29日

引っ越しとそれに伴う天井冴太のネット接続状況について

天井の染みの方にも書いたけど、一応こちらにも。


いやまぁ、タイトルの通りなんだが、東京転勤になった。正直大阪に1年しか居ないとは思わなかったぞこのやろう。

そんな訳で、
今週中程からネットに繋げない状態が発生するかもしれません
私にコンタクトを取ろうとしても返事がない可能性があります。ご了承ください。

いやま、そんな人が居るのかどうか知らないけど、一応、ね。

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

Visual Basic 6でMBCS文字列処理

VB6って文字列基本Unicodeなのね。C言語strlen()したときみたく、全角文字=2文字、半角文字=1文字で計算して欲しい。


Dim Str As String
Str = "全角Hankaku"

Debug.Print Len(Str)    '  9
Debug.Print LenB(Str)   ' 18

上のコードでLen()が文字列長を返す関数。LenB()はそのバイナリ版。Len()だと全角半角関係無く1文字と数えるし、LenB()だと1文字2バイト消費なんでLen()の2倍の値が返る

困ってたらVS6.0付属のMSDNライブラリLenMbcsと言う関数で実装例が載っている事を教えてもらった。勤務先でやった事だし、手元(自宅)にVS6のMSDNライブラリ無いんでうろ覚えだけど、確かこんな感じだった。


Public Function MidMbcs(ByVal str As String)
    MidMbcs = LenB(StrConv(str, vbFromUnicode))
End Function

おー、StrConv()スゴス。これって応用利かね?たとえばこんな感じで。


Public Function MidMbcs(ByVal Str As String, Start As Long, Optional Length As Long = &HFFFFFFFF)
    MidMbcs = StrConv(MidB(StrConv(Str, vbFromUnicode), Start, Length), vbUnicode)
End Function

つかこういう事するんならVBなんかよりC言語使った方がいい気がしてきた。

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