以上、GetWindowLong 関数より。
Windows APIに明るい人は気付いているかもしれないが、この文章内のGetClassLongPtr
、正しくはGetWindowLongPtrである。ご丁寧にリンク先もGetClassLongPtrなお陰で、ものの見事に引っかかって長い事悩んでしまった。Microsoftめ……時間返せ……
そもそも、MSDN ライブラリの文章、誤謬や脱字の類が多すぎないか?
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | 31 |
TwitterのAPIを叩いて遊んでみた。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な文字列を返すプログラムSOME_UTF8_OUTPUTが在るとすると……
SOME_UTF8_OUTPUT | nkf -s
……とすればいいことになる。
まぁいちいちパイプ処理書くのは面倒だけど、リダイレクトしてエディタで確認するのに比べたら万倍ぐらいマシだろう。なんなら確認用バッチファイルを用意するなり、DOSKEYでエイリアスを設定するなりすれば良いだろうし。
nkfを使用した。Windowsネイティブなものも在るので、Cygwinを持っていなくても問題ないだろう。nkfは未だにメンテされ続けているらしく、少々驚いた。文字コード変換ツール「nkf」の最新版が公開 | パソコン | マイコミジャーナルに拠ると、2009年1月20日の更新で全角片仮名と半角片仮名の変換が可能になった模様。どうにも憶えられないので簡単にまとめてみた。
ちょいちょいと調べた結果だから、微妙に間違い在るかも。もしあったら誰ぞフォローよろしく。
| 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)他)。
これは驚き。もしかしたら日頃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を初期化。その直ぐあと、関数の外でpiyoがundefinedか判定。当然、偽となるので改めて初期化されることはない。結果、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()で用いたものと同じ変数)を出力する前に、グローバル変数hogeがundefiendでないかを評価、それが真ならば改めてhogeを(グローバルでとは別の値で)初期化している。そして、驚くべき事にこの評価式は真となっている。確かにグローバル領域で初期化しているのに!
f2()での結果を見ると、確かに初期化され、値を評価できているグローバル変数だが、f3()での結果によると、初期化されていないという評価を下されている事が分かる。言ってみれば、グローバル変数が、関数内ではundefinedと実際の値という2つの値を持っているかのようだ。
因みに、この動作は手持ちの以下のブラウザで確認した。すべでこの動作だった。(全てWindows用。Safariを除いて全て日本語版)
一体全体、これはどういう事なのだろうか。
天井冴太的つれづれblog [天井の染み]: ffbadge.js - FriendFeedに登録しているサービスを一覧表示するブログパーツで公開しているffbadge.jsを作った時に嵌ったこと。
JavaScriptで、XHTML/HTMLのbody要素を取得したい時には、こうする。
var hoge = document.body;
……って事は、head要素取得する時ってのはこうに違いない、と何の疑問もなく書いたコードがこれ。
var hoge = document.head;
hogeがundefinedになって、どう頑張ってもhead要素が取得出来ない。何故だ……と思っていろいろ検索。
したらば、css + javascript の質問です。 javascript 中で css (外部ファイル) を読み込みたいと思っています。 そこで以下のような javascript を書いてみました。 var cs = docume.. - 人力検索はてなに書いてあった。
var hoge = document.getElementsByTagName('head')[0];
あー、document.headって無いのね……bodyがあるからheadも在るものとばっかり……
ちょっとメモ代わりに。
現在とあるプログラムを作っているが、グローバルIPアドレスをどうやって取得すべきか悩んでいる。
使っている言語はJavaなのだが、java.net.InetAddress.getLocalHost().getHostAddress().toString()だと、192.168.1.xxxといった感じのローカルのアドレスしか取得出来ない。
こことかここを見た感じでは、
外部サイトで出力→その結果を取得しアドレス部分以外(もしあれば)を除外する
という流れになるようだが、外部サイトが落ちる可能性を考えるとあまり使いたくない。自分だけが使うプログラムだというなら兎も角、配布を考えているものだしなぁ……
なんとか外部の力を借りずに取得する方法って無いモノかなぁ……
Windows 7ベータ版は、当初はMSDNやTechNetを通じて開発者向けに提供。一般ユーザー向けには、米国時間1月9日に提供を開始する。
という訳で、既に約1ヶ月も前にリリースされて……
米MicrosoftのWindows開発チームは,次期クライアントOS「Windows 7」のベータ版の一般ユーザー向けダウンロード提供を米国時間2009年2月10日まで延長すると発表した。
あと数日で公開終了するらしい、Microsoftの次世代OSであるWindows 7のβ版をVMWare Playerにインストールしてみた。
……本当は公開後の連休中に既に入手し、いろいろ頭ヒネリながらインストールしていたが、今更、もう少しで公開終了というとてつもなく微妙な時期にblogにまとめてみる。いやだってzeppelが書けって五月蝿いから……
という訳で、まずは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のみを、これまた適当なフォルダに展開。
vmx-Makerを起動し、各種設定を入力する。
『仮想環境の名称』には適当な名前を。ここに設定した文字列がVMWare Playerのタイトルバー部分に表示される。
『ゲストOSの種別』にはwinVistaを入力。Windows 7はWindows Vistaのマイナーアップ版だと言うし、これが無難なところだろう。
『メモリサイズ』には512を指定してみた。搭載メモリ量に余裕があるのならば、MSが必要だと主張している1GB(=1024MB)を割り当てても良いだろう。
『CD-ROMにISOイメージを割り当てる』にチェックを入れ、ダウンロードしたWindows 7のISOイメージファイルを指定する。
さらに、『サウンドカード』にはes1371を指定。残りはデフォルトのままとした。
『ファイル生成』ボタンを押す前に、仮想ディスクのファイルを作成する。『仮想ディスクのファイル名』欄直下の『>>』ボタンを押下。表示される『仮想ディスクの作成』ウィンドウ、『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のインストールへと進む。VMWare Playerを起動し、設定ファイルを開く。設定ファイルでWindows 7のISOイメージを指定しているので、自動的にインストーラが起動する。
以下、幾つか注意が必要そうなインストール画面をSSを交えて解説する。
Windows 7インストーラ最初の画面。地域的な設定を行う画面だが、基本的に変更しなくて良い。精々キーボードの種類ぐらいだろう。
2画面目。『今すぐインストール』を選択する。内容的に1画面目と2画面目が逆なような気もするが、気にしてはいけないのだろう。多分。
なお、ここでメモリが足りないと、何も情報の表示されないダイアログボックスが表示され、インストールが進まない。この画面が出たら一度インストールを中断し、設定ファイルのmemsizeの値を増やし再チャレンジする必要がある。
お決まりのライセンス条項表示を経て、『インストールの種類』画面へ。新規にインストールする為、『カスタム』を選択する。
インストール先ドライブの選択。パーティション操作を行う場合は『ドライブオプション』をクリックする事でその為のメニューを表示させる事が出来る。未フォーマットの状態の筈だが、そのまま『次へ』を選んでも何の問題もなくインストールが進行する。
ユーザー名とコンピュータ名の入力、パスワードの入力を経て、プロダクトキーの入力画面に。Windows 7を落とす直前に表示されていたプロダクトキーを入力する。
ネットワークの場所の指定。仮想マシンの場合どうなるのか。いまいちハッキリしない為ここでは『パブリックネットワーク』を選択した。
この後しばらくすると、仮想マシンが再起動、Windows 7が起動する。無事デスクトップ画面が表示されたらインストール成功だ。
VMWare Playerだと、外部ツールを用意したり設定ファイルを編集したりと少々面倒だ。単純にWindows 7がβ版で、しかも仮想マシンへのインストールという特殊な環境の為の面倒くささなのかもしれない。仮想ディスクや設定ファイルの生成は、VMWare Serverを使った方が楽だったのかもしれない。
『Windows 7は早い』という評判をあちこちで見かけるが、確かに早い印象を持った。仮想マシン上、しかもメモリを512MBとMS推奨値の半分しか設定していないが、ストレスをあまり感じない。
Windows 7のインストール方法の紹介はこれで終わりだ。そのうちWindows 7の機能についての紹介記事を書くかもしれない。現在プライベートが少々ごちゃごちゃしている為、書けるかどうかアヤシイが。
memsize="256"時にこの現象が発生した。『新版暗号技術入門――秘密の国のアリス』無料プレゼント応募はあと約二時間で〆切です。 http://d.hatena.ne.jp/hyuki...
という事なので、申し込んでみる。
結城浩さんの書籍、新版暗号技術入門 秘密の国のアリスのプレゼント企画。Twitter覗いてたら偶然見かけて、これは応募せざるを得ない、と。
しかし暗号っていいね。こう、ワクワクするね。
しかし、2008-10-29 - 結城浩のはてな日記によると、当選人数:7人
で2008-11-04 21:54 現在の応募数108名
とのこと。あ……当たるのか……?
天井の染みの方にも書いたけど、一応こちらにも。
いやまぁ、タイトルの通りなんだが、東京転勤になった。正直大阪に1年しか居ないとは思わなかったぞこのやろう。
そんな訳で、
今週中程からネットに繋げない状態が発生するかもしれません。
私にコンタクトを取ろうとしても返事がない可能性があります。ご了承ください。
いやま、そんな人が居るのかどうか知らないけど、一応、ね。
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言語使った方がいい気がしてきた。
名前:天井冴太 (AmaiSaeta)