‘解決’ カテゴリーのアーカイブ

hid.libをリンクしようとしたときにLNK2001エラーになる問題

MUDFでドライバ開発中なのですが、hid.libを使いたくて、sourcesにhid.lib追加、internal.hにHidsdi.hのインクルード記述をしてみたところ、ビルド時にLNK2001エラーが発生。

結局はHidsdi.hがCソースなのでextern "C"{}で囲ってやればOKというお話です。

extern "C"{
#include <Hidsdi.h>
}


Windows 7でファイル所有者と書き込み権限をコマンドプロンプトから操作する

多分Vistaも同じだと思うのだけど、HDDを別のマシンに移した際、アクセスできない・消せないファイルが大量にあったので、それらをまとめてコマンドプロンプトからコマンドで再帰的に処理すべくやったことと注意点のメモ。

Program Files以下のフォルダ・ファイルの所有権を自分のPCの管理者に変更する
takeown /F "Program Files" /R /A

Everyoneに対してフルコントロール権限を与えて、誰でも編集できるようにする
icacls "Program Files" /grant Everyone:(F) /T

注意しないといけないのは、フォルダを辿るときに、NTFSのJUNCTIONも辿ってしまうので、ジャンクションは先に消しておいた方がいいかも。
そうしないとうっかり現行のシステムファイルを消しかねない。
というか実際、現行システムのACL書き換えをやらかした。
まさに「FドライブのUsersフォルダの権限を書き換えていたら、いつのまにかCドライブの権限を書き換えていた…!」という状態。
怖い怖い。

ジャンクションかどうかの確認は、コマンドプロンプトからdir /aとかで。

シンボリックリンクも同じかな。どっちも使われているみたいなので注意。


SafariのkCFErrorDomainCFNetwork error 303.

iPhone用のWebサイトを作っていてSafariで発生した
Operation could not be completed. (kCFErrorDomainCFNetwork error 303.)
というエラー。

ページを読み込む途中で上記のエラーで止まってしまうので悩んでいたのですが、Proxyが問題でした。

というか、サーバがTransfer-Encoding: chunkedで送信してきた場合に、Proxyの挙動が仕様と異なる場合に起こるようです。TCPコネクションの問題かな…?

Transfer-Encoding: chunkedになるのは主にサーバからPHPとかで動的にページ書き出す場合ですね。

サーバ側でContent-Lengthを返すようにするか、Proxyを外すかってところですかね。

Fiddler使う際には注意。


iPhoneのSafariでtouchendイベントを使うときの注意

iPhone用のドラッグアンドドロップで操作できるWebアプリを作っていて、うっかりはまったtouchendの挙動についてのメモ。

最初に書いたコードはこんな感じでした。

function touchhandler(e) {
    var x = e.touches[0].pageX;
    switch (e.type) {
        case 'touchstart':
            break;
        case 'touchmove':
            break;
        case 'touchend':
            break;
    }
}

document.getElementById('sample').addEventListener("touchend", touchhandler, false);

このプログラムではtouchendの処理が実行されません。

というのもまぁ、気づけば簡単なことなんですが、最後の指をスクリーンから離してtouchendのイベントが発生するときは、もうスクリーンに触ってないのでe.touches[0]がundefinedになるんですね…

なので、touchendのときは、引数で受け取ったe.touchesは注意しましょうという話。

今回参考にさせていただいたのは以下のサイト。

flashcast:フリーで働くITエンジニア集団のブログ: ipod touch用のWeb Applicationを作成してみる(canvasでお絵かき編)

SitePen

Web開発参考サイト – iPhone 3G DevWiki


Windows 7でSynergyを使おう


※2012年4月20日追記

Macを含めないなら、Microsoft The Garageで公開されているMouse without Bordersがかなり便利です。
Microsoft download from The Garage: Mouse without Borders – Next at Microsoft – Site Home – TechNet Blogs

一番下にあるDownload Nowからダウンロードできます。

特に設定らしい設定も不要で、双方向にマウス・キーボード操作ができ(Synergyは片方向)、UAC上でも問題なく操作できます。Synergyのようにホストとクライアントの区別もありません。

あと、そんなに使う用事があるのかはわかりませんが、すべてのマシンで同時に同じ操作をさせることもできます。

おすすめです。

ライセンス版で数週間早く入手したものの、結局パッケージ版が発売されてからインストールしました。Windows 7。

XPの入っていたノートPC(Panasonic Let’snote R5)にWindows 7 Professionalをインストールしたので、とりあえずメインPCから操作できるようにしようと、Synergyをインストールするも…手動で起動すれば動作するものの、自動起動すると動作せず。管理権限で実行してサービスに登録しても動作せず。というか、繋がってはいるみたいなんですけどね。サーバ側のマウスがどこかに行ってしまうので。

で、synergyは2006年に更新が止まって、Vistaも対応していないし、何か後継があるハズ…と思って英語のWikipediaを見たら、synergy-plusというフォークプロジェクトがあったんですね。

Google先生も、「synergy」で検索したら、「もしかして synergy-plus」くらい出してほしいところですが…

32bit版、64bit版もあるので、7から64bitに乗り換えた人も安心ですね。

plusを入れる前に、一度synergyを入れていたので、設定情報を引き継いでくれているようです。といっても必要な設定項目はHost Nameの設定だけですけど。

とりあえずsynergy-plus-1.3.4-Windows-x86-r1.exeをダウンロードしてインストール。今回はクライアント側(操作される側)として使います。

やっぱり色々問題ありました…

  • ログイン画面では入力ができない
  • UACになると操作はできない

あぁ、微妙…というか、大して改善されてないですね…

自動ログインにしてWindows7のUACも無効にしてしまえばいいのかなぁ…複数ユーザ使いたい場合はどうしようもないしなぁ…

Vistaでの対策は以下のページ参照。

Fixing Problems with Synergy on Windows Vista :: the How-To Geek

Windows 7でUACを無効にするには以下のサイト参考。

Disable User Account Control(UAC) For Administrators Only :: the How-To Geek

ざっくり日本語版での対応を説明すると、

スタートメニューの検索からsecpol.mscと入力して実行。ローカルポリシーのセキュリティオプションから、「ユーザー アカウント制御: 管理者承認モードでの管理者に対する昇格時のプロンプトの動作」をダブルクリックして、「確認を要求しないで昇格する」を選択。

らしいですよ?試してないですが。

結論としては、今後に期待…

2011年3月20日追記

すっかり追ってなかったのですが、synergy-plusは本家synergyとマージして開発がバリバリ進んでいるようですね。

http://synergy-foss.org/

今は安定版の1.3系列と、ベータ版の1.4系列、ゼロから(from scratch)書きなおす2.0系列があるようです。それぞれの機能やサポート状況は別の機会に調べてエントリーします。

ロードマップ – Synergy


ARToolkitのセットアップメモ

ARToolkitで開発してみようと思い立ったのでセットアップの自分メモ。

工学ナビ – 「攻殻機動隊」「電脳コイル」の世界を実現! – ARToolKitを使った拡張現実感プログラミング

工学ナビの中の人の研究と周辺 ゼロからはじめるARToolKit on VisualC++ 2008 Express Edition

VC++ 2008 Express EditionでARToolkitをビルドしてみる – やざわラボ Wiki

Visual C++ 2008 Express Editionを使ったのですが、1番目のサイトの情報そのままで大体はOK。

サンプルの実行は3番目のサイトにあるように、「デバッグ」-「新しいインスタンスを開始」でsimpleLiteとか実行できます。

うっかりハマったのは、Dataフォルダの置き場所。というか、実行したいサンプルのそれぞれのオプションに

「デバッグ」-「作業ディレクトリ」 – ARToolkit/binの絶対パス

を書かないとダメだったんですね。さもなくば、ARToolKit\examples\simpleLiteの下にDataフォルダ置いてください。

あと、DSVLはバイナリが公開されているので、ダウンロードしてくれば自分でビルドする必要なし。


PythonでMIDI出力をしてみる

既存のPythonで作ったWindowsアプリケーションにMIDI出力を組み込む用事があったので、実験してみました。

参考サイトはこちら。

sulume blog» ブログアーカイブ » python で MIDI を使う

MIDIIO.dllというのはおーぷんMIDIぷろじぇくとで公開されているMIDIメッセージ入出力用ライブラリです。

これもダウンロードして、pyファイルと同じ場所に置いておきます。

で、ソースコードはこちら。

import ctypes
import time

midiiolib = ctypes.windll.LoadLibrary(r".\MIDIIO.dll")

c_deviceName = ctypes.create_string_buffer(32)

midiiolib.MIDIOut_GetDeviceName(0, c_deviceName, 32)
midiout = midiiolib.MIDIOut_Open(c_deviceName.value)

c_mess = ctypes.create_string_buffer(3)
c_mess.value = '\x90\x3C\x64'

midiiolib.MIDIOut_PutMIDIMessage(midiout, c_mess.value, 3)

time.sleep(3)

midiiolib.MIDIOut_Close(midiout)

説明することもあまりないですが、8行目のMIDIOut_GetDeviceNameで、MIDI出力の先頭のデバイスの名前を先に取得します。

で、その名前を使ってMIDIOut_Openで出力デバイスを開きます。

11~12行目ではノートを作成します。とりあえずドの音でも鳴らしておきます。この辺もMIDIIO.dllに入っていたドキュメントのサンプルと同じ。

あとはMIDIOut_PutMIDIMessageで出力するだけです。

ちゃんと閉じておかないと、次回音が鳴らなかったりする(オープンに失敗します)ので、MIDIOut_Closeで閉じておきましょう。

実験として、ちょっと長いデータを指定してみる。

import ctypes
import time

midiiolib = ctypes.windll.LoadLibrary(r".\MIDIIO.dll")

c_deviceName = ctypes.create_string_buffer(32)

midiiolib.MIDIOut_GetDeviceName(0, c_deviceName, 32)
midiout = midiiolib.MIDIOut_Open(c_deviceName.value)

notes = ['\x90\x3C\x64',
         '\x90\x3E\x64',
         '\x90\x40\x64',
         '\x90\x41\x64',
         '\x90\x43\x64',
         '\x90\x45\x64',
         '\x90\x47\x64',
         '\x90\x48\x64']

c_mess = ctypes.create_string_buffer(3)

for note in notes:
    c_mess.value = note

    midiiolib.MIDIOut_PutMIDIMessage(midiout, c_mess.value, 3)
    time.sleep(0.5)

time.sleep(1.0)

midiiolib.MIDIOut_Close(midiout)

和音を鳴らしてみるテスト。

import ctypes
import time

midiiolib = ctypes.windll.LoadLibrary(r".\MIDIIO.dll")

c_deviceName = ctypes.create_string_buffer(32)

midiiolib.MIDIOut_GetDeviceName(0, c_deviceName, 32)
midiout = midiiolib.MIDIOut_Open(c_deviceName.value)

notes = ['\x90\x3C\x64',
         '\x90\x40\x64',
         '\x90\x43\x64']

c_mess = ctypes.create_string_buffer(3)

for note in notes:
    c_mess.value = note

    midiiolib.MIDIOut_PutMIDIMessage(midiout, c_mess.value, 3)

time.sleep(3.0)

midiiolib.MIDIOut_Close(midiout)

とりあえずこれだけできれば満足なので終了。


ネットワークドライブからデータを全部バックアップする

TeraStationのHDDが1台故障したので、交換を前に中身を全部バックアップする必要がありました。

ちなみに以前同じような症状でRAID崩壊させたことがあるので今回は慎重に…

共有フォルダのルートがたくさんあるので、それをいかに簡単にコピーするかがキモ。

共有フォルダ自体はコピーしようとドラッグアンドドロップすると、ショートカットが作られてしまう。

やりたいことは、PCを使ってLAN内のNASからデータを全部コピーして、ローカルに接続してあるUSB HDDにバックアップすること。

で、robocopyコマンドというのが便利っぽいので使ってみた。使ったOSはWindows Vista。標準コマンド?

まずは対象のフォルダ名一覧の取得から。

C:\> net view \\NAS

みたいにすると、フォルダ一覧が文字情報として取れます。

で、robocopy。

robocopyでフォルダをバックアップ/同期させる - @IT

どうやらrsyncみたいに使えるよう。

C:\> robocopy /mir \\NAS\dir1 C:\Backup\dir1

という感じで書けば対象ディレクトリの中身をミラーリングコピーしてくれます。

ちなみに受け側ディレクトリは作っておかなくても勝手に作ってくれます。

というわけで、先ほどのnet viewの結果を流し込んだコマンドリストを作ってbatファイルに保存して、実行。

全部きれいにバックアップできました。

今xcopyって推奨されてないんですね。知らなかった。


FON2202をFailSafeモードで復旧させる

前回FON2202にカスタムファームを入れようとして失敗して、何もできなくなっていた状況の続き。ファームウェアを強制的に上書きする方法がありました。

前回:FON2202のファームウェアのビルド : blog.loadlimit – digital matter –

lostmanさんにコメント欄でFONの復旧方法を教えていただいたので実践。
作業は概ね以下の通り。

(鬱とSEと)コンピュータ: FON2202のFailSafeモード

Failsafe Mode – FON Wiki Beta

Wikiでは有線をおすすめされているので、有線で試してみました。
というより、無線でやったらなぜか成功しなかったので…

  1. とりあえず電源が入っている場合は、ACアダプタを外してください。
  2. LANケーブルをPCとFONのCOMPUTERポートに直結します。他は何も繋がず。
  3. FONの底面にある赤いボタンを先の細いもので押します。
  4. 押しながらACアダプタを繋ぎます。
  5. 15秒くらいそのまま待って、ボタンを離します。
  6. IPはDHCPで配られます。配られるまで1分以上かかるかも。気長に待つ。
  7. ランプが色々光ったあと、POWERとWIRELESSが同時にオレンジで点滅するようになったらFailsafeモード突入成功。

ちなみに配られるIPは192.168.1.x/255.255.255.0なので、他のネットワークアダプタが同じ範囲を使っていないか注意。

IP取得成功するとこんな感じ。

Ethernet adapter ローカル エリア接続:

        Connection-specific DNS Suffix  . : lan
        IP Address. . . . . . . . . . . . : 192.168.1.193
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 192.168.1.1

で、 http://192.168.1.1/ にアクセス。

ユーザ名とパスワードを求められるので、ユーザ名に「admin」、パスワードに本体裏のシリアル番号(S/N)を入力。

あとはフォームにtar.gz形式のファームウェアファイルを指定して送信するだけ。30分ほど待つと勝手にFONが再起動して、復旧できます。

DEVELOPERファームに復旧したので、再度再起動してSSH接続成功!やー、シリアル接続するハメにならなくて良かった。

以下も参考。

FON2202にDEVELOPERファームを入れてSSHアクセスできるようにする : blog.loadlimit – digital matter –


RAID構成のHDDのファームウェアを更新する

今となっては過去の話となりつつあるSeagateのファームウェア問題。

参考:SeagateのBarracuda 7200.11などにアクセス不能になる不具合

自宅のサーバがちょうどこの問題のど真ん中で、SeagateのBarracuda ES.2 1TBを4台使ってRAID 5を構成しているのでした。で、このHDDのファームウェアを更新しようというのが今回の話。

再起動のタイミングで条件が揃うとHDDが起動できなくなるバグなので、問題が発覚してからなるべく再起動しないようにビクビクしながら使ってたのですが、さすがにWindows Updateが溜まってきて限界に。

とりあえずバックアップ用のHDDを用意しました。家に転がってた1TBと500GBのHDDに分割して全部退避できました。

ちなみにRAIDはハードウェアRAIDで、カードは3ware Escalade 9500S-4LP。

手順は色々なところで解説されていると思うので、ざっくりと。

とりあえず公式
Seagate ナレッジ ベース

まず、3wareの管理画面から各ユニットのシリアルナンバーを調べてメモ。

で、それをシリアル番号確認ユーティリティに突っ込む。

見たところ、家の環境では4台中2台が問題のあるHDDだった模様。同じ店で同時に買ったんですけどね。

アップデート用のISOをダウンロードして、CD-Rに焼く。

チップセット統合のRAIDなら、そのままファームウェアアップデートできると読んだので、とりあえず更新する必要のないRAID以外のシステムドライブを物理的に外して、CDからブート。

アップデートツールからはRAID以下のHDDを認識せず…

まぁ、何となく予想はしていたので、RAIDからHDDを外して一台ずつオンボードのSATAに接続してアップデートする方針に。

HDDをRAIDカードから外す関係上、外した状態で一度でもRAIDカードに通電したらRAIDが崩壊すると思ったので(一台ずつなら許容範囲と言えなくもないけど、復旧必要になってしまうので)、RAIDカード自体を先にPCIスロットから外します。

で、HDDを一台マザーボード上のSATAポートに差して、CDアップデータ起動。

これでファームウェアのアップデート自体は成功したので、残りの対応が必要なもう一台もアップデート。

アップデート不要と言われた2台はアップデートせずにそのまま残しておきました。

で、RAIDカードのSATAポートとHDDの対応が変わらないようにケーブルを接続し直して、PCIスロットに戻して起動。

成功ー。何もなかったかのようにRAIDはそのまま起動しました。