広告

2014年7月27日日曜日

VBScriptでUTF-8等の文字コード変換を行うためのポイント

VBScriptやClassic ASPでUTF-8等のShift_JIS以外の文字コードを扱いたい場合があります。
ただVBScriptはShift_JISを前提として作られているため、それ以外の文字コードを扱うにはADODB.Streamオブジェクト等を使う必要がありますが、その際のつまづきやすいポイントを紹介します。


■UTF-8の文字コードをデコードする例


例えば、UTF-8の文字コードをデコードするには以下の様な処理が必要です。

Dim oUTF8
Set oUTF8 = CreateObject("ADODB.stream")
With oUTF8
    .Open
    .Type = 1 'adTypeBinary
    .Write(baUTF8)
    .Position = 0
    .Type = 2 'adTypeText
    .Charset = "UTF-8"
    strUTF8 = .ReadText()
    .Close
End With


ここでポイントになるのはStream.Writeメソッドです。


Write メソッド
パラメータ Buffer 書き込むバイトの配列を含むバリアント型 (Variant) の値を指定します。 ...







上記のとおり、Writeメソッドの引数としてバリアント型にbyte配列を格納して渡して上げる必要がありますが、そもそもVBScriptでは明示的にbyte配列を記述することはできません。

VBScriptでbyte配列を作り出す方法は以下を参考にして下さい。

Windows系SEの日記: VBScriptでbyte配列を扱う方法



2014年7月23日水曜日

VBScriptでbyte配列を扱う方法


ADODB.streamをVBScriptから呼び出す場合等、VBScript(あるいはClassic ASP)内でbyte配列を扱いたい場合があります。

Write メソッド
パラメータ Buffer 書き込むバイトの配列を含むバリアント型 (Variant) の値を指定します。 ...







例えば、上記のWriteメソッドの引数としてバリアント型にbyte配列を格納して渡して上げる必要がありますが、そもそもVBScriptでは明示的にbyte配列を記述することはできないため、工夫が必要になります。


■Microsoft.XMLDOMを使ってbyte配列を作る


方法はいくつかあると思いますが、一番手っ取り早いのはMicrosoft.XMLDOMを使う方法です。

Microsoft.XMLDOMのHex形式の文字列("1A0FB3"のような形式)をバイト配列に変換する機能を使って、例えば以下のように関数化します。

Function HexToBArray(Hex)
     With CreateObject("Microsoft.XMLDOM").createElement("aaaa")
         .DataType = "bin.hex"
         .Text = Hex
        
HexToBArray= .NodeTypedValue
     End With
End Function


あとは、この関数の戻り値をVBScriptのバリアント型の変数に格納しておけば、別の関数の引数として使うことが出来ます。

2014年7月21日月曜日

CPUってどんな仕組みで動いてるの?という人にオススメの2冊

プログラムはそこそこ書けるけど、そもそもコンピュータとかCPUってどういう仕組で動いてるの?という人は意外と多いと思います。

私もそうでしたが、CPUやコンピュータのハードウェアよりのアーキテクチャに関する書籍はかなりハードルが高いものが多いです。もう少し取っ付きやすい本はないかな?という人にオススメするのが以下の2冊です。

CPUの創りかた

CODE コードから見たコンピュータのからくり



■CPUの創り方:目次


1 はじめの一歩のその前に
2 LED
3 デジタル回路の基礎の基礎
4 リセットとクロック回路
5 ROMを作る
6 CPUの設計準備
7 1bitCPU(らしきもの)
8 ALUとプログラムカウンタ
9 命令デコーダ
10 全回路図
11 動作確認



■CODE:目次


親友
コードと組み合わせ
点字とバイナリコード
懐中電灯の解剖学
角を回って見る
電信とリレー
私たちの10個の数字
10に代わるもの
ちょびっとずつビットで
論理とスイッチ〔ほか〕


上記の目次からもわかりますが基本的には2冊は似た構成です。論理回路の説明から入り、究極的には論理回路の組み合わせによりCPUが出来上がるということがわかりやすく記述されてます。

またCPUが機械語をどのように解釈して動くのかということも腹に落ちると思います。

2冊の違いは、CPUの創り方は実際に簡易4bitCPUを作ってみようというテーマなのでハードウェアに重点を置いているのに対して、CODEはより論理的な説明に重点をおいている感じでしょうか。

 
 私自身、ハードウェアやCPUの仕組みを知りたいなと思いながらもなかなか取っ付き易い書籍が見つからなかったのですが、上記の2冊は取っ掛かりとしてオススメできます。




2014年7月20日日曜日

最初の仕事はVB6で開発支援ツールの実装【SE業務経歴振り返り】

一応十数年SEをやってきましたので、いろいろな仕事を経験しました。読者の方の何らかの気づきなればと思い、過去の業務経験を振り返ってみたいと思います。


■最初の仕事はVB6で開発支援ツールの実装


SEとして初めて担当したのは、主にC言語で記述された超巨大システムでした。
とはいえ社会人1年目のSEがいきなりシステム全体を把握できるはずもないので、私が担当したのは開発作業をいかに効率化するかという仕事でした。

現在は、アジャイル開発などで必要なドキュメントを減らしていく方向ですが、このシステムはガチガチのウォーターフォール型開発です。とにかく設計書や試験項目表等、作成するドキュメントも大量になります。

そこで私は少しでもドキュメント作成の工数を減らせるよう、C言語のソースコードを解析して、Excelの試験項目表等のドキュメントを自動生成するツール作成を担当しました。

確かVB6で実装したと思います。C言語のソースコードを構文解析するんですが、コンパイラのような大げさなものではなく、ソースコード内の特定のキーワードやカギカッコ、改行等を元に、必要なドキュメントをExcelファイルとして自動的に作成する、というようなツールだったと思います。


■学んだ技術はVB6とOfficeオートメーション


技術的には、VBからExcelのオートメーション機能を使ってExcelを操作する仕組みで実装しました。

とにかく最初の仕事で、まわりにVBやExcelオートメーションについて詳しい人もあまりいなかったので試行錯誤かつ自己流開発でした。


■COMという技術に興味を持つ


この仕事でVB6やオートメーション技術の背景にはCOMというテクノロジーがあるらしい、ということがわかり、以下のような本を読んだりして自分なりに色々勉強しました。



とは言えCOMという技術は、当時の自分には理解しきれませんでした。今から思うと例えば以下の様なもっとCOMの定番の本を読んでいればもう少し理解が深まったかなという気もします。




2014年7月19日土曜日

IEアドオン(ブラウザ ヘルパ オブジェクト・BHO) をIE11拡張保護モードで動作させる情報源まとめ

Windows8及びIE11は更にセキュリティが強化され、拡張保護モードという概念が追加されています。
そのためブラウザ ヘルパ オブジェクト(BHO)で実装されたIEアドオンは、拡張保護モード有効時では動作しません。正確に言うと、IEから読み込まれることすらしません。

既存のIEアドオンを拡張保護モード有効時に動作させるための情報源をまとめておきます。


■拡張保護モードについて


英語ですが、拡張保護モードについてはこの記事が一番網羅的でわかり易いと思います。
Understanding Enhanced Protected Mode - IEInternals - Site Home - MSDN Blogs


MSサポートチームの人がもう少し噛み砕いたのがこちらの記事。
Blogs - Japan IE Support Team Blog - Site Home - TechNet Blogs



■ ブラウザ ヘルパ オブジェクト(BHO)について


そもそもIEアドオンをどのようにBHOで実装するかはこの記事が参考になります。

Visual Studio 2005 によるブラウザ ヘルパ オブジェクトのビルド

Microsoft Visual Studio 2005 と Active Template Library (ATL) を基に、C++ を使用して BHO を開発する内容になっていますが、Visual Studio 2008でも同様に作成できました。


■拡張保護モード有効時に IEアドオンを読み込ませるには?


Supporting enhanced protected mode (EPM) (Windows)
Loading ActiveX controls when EPM is active ...

にも記載されていますが、拡張保護モード有効時にIEアドオンを読み込ませるには、COM component categoryにAppContainer互換を示すGUID(59fb2056-d625-48d0-a944-1a85b5ab2640)を登録する必要があります。

具体的な登録方法(レジストリ操作)は

BUG: Component Category Registry Entries Not Removed in ATL Component

が参考になりました。


■アドオンがIEに読み込まれることと正しく動作することは別問題です


当然ですが、上記のCOM component categoryを正しく行ったとしても、アドオンがIEに読み込まれるようになるだけです。読み込まれたIEアドオンが、より制限された実行環境であるAppContainer内で正しく動作するかはまた別の問題であり、動作確認が必要です。想定通り動作しなかった場合はコード修正が必要になりますので注意して下さい。




2014年7月18日金曜日

会社にかかってくる迷惑電話を4パターンに分類、対処法をまとめてみた

SEとして会社勤めをしているわけですが、面倒なのが会社にかかってくる不動産投資等の営業電話の対応です。

このいわゆる迷惑電話を4パターンに分類し、それぞれ私がどのように対応しているかをまとめてみました。


■電話にでると直ぐ営業を始める


一番多いのが電話に出ると、いきなり名前も確認せず「〇〇会社の方を対象に営業のご挨拶をさせて頂いております」等と営業トークを始めるパターン。
この場合、私宛への電話であることを確認し、「不要です」と電話を切ってます。


■いない人宛に電話を取り次ぐよう求められる


「〇〇様お願いします」等と、いない人へ代わるように求められるパターン。おそらく古い名簿を元に電話をかけていると思われます。
いない人には代われないので、「そのような者はおりません」と返していると大概向こうから切られます。


■実際にいる人に電話を取り次ぐよう求められる


実際に実在する人に代わるように言われるパターンも有ります。明らかな営業電話を取り次ぐのも芸がないので、営業電話と思ったらとりあえず 「〇〇は本日一日不在です」と返してます。

これで大体向こうから切ってきますが、時々何時なら居ますか等と食い下がってくる営業もいます。その場合は、「予定はお伝えしかねます。電話があった旨伝言しておきますので、会社名、お名前、ご用件を教えていただけますでしょうか」と言うと、大抵はじゃあ結構ですと切られます。

その人にとって必要な電話の可能性も0ではないので、電話があった旨だけはその人に念のため伝えています。怪しい電話がその人にとって必要な電話だった経験はありませんが。


■役職名で取次を求められる


ちょっと面倒なのが「部長様お願いします」等と役職名のみで取次を求められるパターンです。この場合、「なんという名前の部長でしょうか?」と名前を確認します。大抵は向こうも名前は知らずにかけてきているので、何か適当な事をごちゃごちゃ言ってきますので、「こちらの電話からはお取次ぎできかねます」と言って電話を切ってます。


■まとめ


この手の営業電話は、「今忙しいので…」「興味ないので…」等と相手にできない理由を説明しようとすると「じゃあ何時なら大丈夫ですか?」「興味が無い人にこそ話を聞いて欲しい」等と食い下がられる場合があります。

相手にしない理由を相手に話す必要はないので、「不要です」とバッサリ切るのが一番効率的だと思います。

2014年7月16日水曜日

VBScriptフリーズ時にまず確認すべきポイント

VBScriptで記述したバッチ処理がフリーズするトラブルが発生することがあります。この際にまず確認すべきポイントを紹介したいと思います。


■WScript.ShellのExecメソッド標準出力バッファ4KBの罠


もしフリーズが発生するVBScript処理内に


Set WSHShell = CreateObject("WScript.Shell")
Set oExec = WSHShell.Exec("cscript scriptworker.vbs")

こんな感じで、Execメソッドを使っていれば、まず間違いなく標準出力(あるいはエラー出力)のバッファあふれによるフリーズの可能性大です。

Execメソッドでの標準出力及びエラー出力のバッファサイズが4KBのため、大量に処理結果が出力されるとバッファが一杯になり処理がブロックされてしまいます。

■解決策


マイクロソフトのサイトにあるとおり、

Hang When Reading StdErr/StdOut Properties of WshScriptExec Object








StdOut及びStdErrプロパティから標準出力結果を適宜読み出してあげればOKです。


■デッドロックが発生する可能性もあり


以下のブログ
へたれたプログラマの憂鬱 WSHのExecメソッド

によると、StdOut及びStdErrプロパティから標準出力結果を適宜読み出すだけでは、場合によってはデッドロックを引き起こす可能性もあるとのこと。

現場ではそのようなケースに遭遇したことはないですが、運悪くそのケースにハマった場合は標準出力をリダイレクトしてファイルに吐き出す等の対応が必要になります。


2014年7月15日火曜日

ダンプ解析の勉強の取っ掛かりにオススメの書籍「Windowsダンプの極意 エラーが発生したら、まずダンプ解析!」

SEやプログラマーであれば、いざというときのトラブル解析にダンプ解析くらい出来るようになりたいと思うのではないでしょうか。私もダンプ解析について勉強したいと思いながら、なかなか手頃な書籍が見つかりませんでした。

そんな時に見つけたダンプ解析に関する書籍が「Windowsダンプの極意 エラーが発生したら、まずダンプ解析!」です。ダンプ解析のイメージを掴むのに非常に役に立ったので紹介します。




■目次

目次はこんな感じ(Amazonより抜粋)です。

第1章 ダンプ解析とは
第2章 解析に必要なOSの知識
第3章 デバッガのインストールと設定
第4章 ダンプファイルの種類と取得方法
第5章 実際に開いてみる
第6章 スタック
第7章 条件分岐
第8章 ケース別調査方法
第9章 踏み込んだ調査
第10章 よく使用するコマンド

基本的には、ダンプ解析に最低限必要なOSの知識と、例題を元にした実際のダンプ解析の実例の紹介という内容になっています。


■豊富なダンプ解析例がこの本の一番の売り


この例題を元にした豊富なダンプ解析例がこの本の一番の売りです。
Amazonのレビューでは「例題がわざとらしすぎ」という意見もあります。確かに私もこんな都合のいいダンプは実際にはないよ、と思う時もありましたが、ダンプ解析の方法を理解する上では、多少不自然であってもわざとらしい例のほうが理解しやすいという側面もあるのです。例題のわざとらしさはあまり気にしなくていいと思います。

また解析例も豊富です。ヒープやプールのメモリ破壊からスレッドのデッドロックまで様々な例が挙げられており、大抵のトラブルケースがカバーされてます。


■おわりに


 ダンプ解析興味があるけど、どこから手を付けていいかわからないというSE/プログラマーの方への取っ掛かりの一冊としてオススメします。




まずはこの本でダンプ解析の雰囲気を掴んでから、更に以下の様なダンプ解析の類書を読むといいでしょう。



またダンプ解析にはWindows OSそのものの知識も必要ですから、OS周りのコーディングに関する以下の書籍に挑戦するのもいいと思います。


2014年7月11日金曜日

Amazonインスタント・ビデオ ストアでSilverlightが使われてる件

knakaガジェット情報: Amazonインスタント・ビデオ ストアでもれなく1,000円分クーポンプレゼントのキャンペーン中【2014年7月22日(火)まで】

knakaガジェット情報: Kindle本(無料本可)を買うとAmazonインスタント・ビデオ ストアで使える200円分のクーポンキャンペーン中

等で、Amazonの動画サービスをたまに使ってるんですが、動画配信にSilverlightが使われてるんですね。



Silverlightは昔、少し触った経験があります。

といっても、私の主な仕事は業務システム開発なので、検証したのは上記のような動画配信ではなく、GUIで大量データが扱えるか、とかサーバとの通信方式をどのように実装すべきかといったのようなことでしたが、結局その後特に仕事で使うチャンスがなかったです。

動画配信の分野では今でもSilverlight使われてるんですかね。




2014年7月8日火曜日

WebアプリケーションでOfficeファイルを作成する業務要件を実装する際の注意点

 Webアプリケーションの業務要件で
  • サーバ上でExcel等のOfficeファイルを生成し、ブラウザからダウンロード可能とする
というのがよくあります。

 この業務要件を実現するために、サーバサイドの開発言語(ASP.NET等)からOfficeオートメーションを使って実装している場合がありますが、マイクロソフトのサポート外の実装方式になりますので注意して下さい。


 詳細は、以下のサイトで詳しいですが、

 http://support.microsoft.com/kb/257757/ja http://blogs.msdn.com/b/office_client_development_support_blog/archive/2012/04/12/1-office.aspx


 Officeオートメーションはクライアントアプリケーションから使われることを前提とした設定となっているため、場合によってはエラーや警告ダイアログを表示する場合があります。サーバから使われている場合、ダイアログが表示されてしまうと、そのダイアログを誰もクローズしないため、その後の処理がブロックされてしまうというのが一番の問題のようです。


■解決策は?


 解決策は

http://blogs.technet.com/b/sharepoint_support/archive/2014/05/07/office.aspx

の内容を参考にするか、サーバサイドでの動作が保証されたサードパーティ製品を使うということになります。

2014年7月6日日曜日

任意のフォルダにドライブ名を割り当てるコマンドSUBST

 時々、ドライブ名がハードコードされたアプリケーションの動作確認や解析を依頼されることがあります。この際面倒なのが、動作確認環境に対応するドライブ名(例えばZ:等)がない場合です。


 対応するドライブが存在しないとアプリケーションが正常動作しないので、何らかの方法でドライブを作成する必要があるわけですが、実際にドライブを作るのは面倒ですし、環境によっては作成できない場合もあります。

 このような場合、 SUBSTというコマンドを使うことで任意のフォルダをドライブとして割り当てることが可能です。

例えば、以下の様なFドライブが存在しない環境で



E:\temp\F_driveフォルダをFドライブとして使う場合は、コマンドプロンプトから

subst F: E:\temp\F_drive

とすることでFドライブが作成されます。


なお再起動することで、作成されたドライブはなくなります。手動で削除する場合は、

subst F: /D

と/Dオプションを使えばOKです。