‘Windows’ タグのついている投稿

Let’snoteで画面のコピーのショートカットを無効にする

Let’s noteで、Ctrl+Alt+F7(F8の場合もあり)を押した時に、スクリーンショットが撮影されてpcinfo.bmpというファイル名でマイドキュメントフォルダに保存されます。

WinShotとショートカットが被りますし、減色されて256色ビットマップで保存されるので、正直全くいらない機能です。

というわけで無効にする方法です。

スタートメニューからPanasonic→PC情報ビューアーと開いて、その中にある画面コピーの項目を右クリックします。ちなみに左クリックしてしまうと、また無駄にキャプチャが撮影されるだけなのでご注意ください。

WS000033

右クリックして表示したメニューから、プロパティを選択します。

WS000034

ここでショートカットキーが設定されているかと思いますので、バックスペースなどを押してショートカットキーの割り当てを削除すればOKです。

WS000035


EclipseにCDTを入れたらexpandUsingDeclarationsAndRemoveObjectsで落ちる

最近のADTはかなり便利で、いちいちcygwinだのndk-buildだのを呼ばなくても直接Eclipseの中からビルドができるようになっています。
ただ、僕の環境がアップデートを繰り返していたからなのか、Window→Preferences→AndroidにNDKの項目がありませんでした。ADTは21で最新になっているのに。
結局これはADTとAndroid Native Development Toolsを両方一旦削除して再インストールすることで直りました。

ところが、プロジェクトを開いた瞬間にEclipseがJavaVMごと落ちて、以降起動しない現象に陥りました。
どうもCDTのせいらしいです。

# JRE version: 6.0_24-b07
# Java VM: Java HotSpot(TM) 64-Bit Server VM (19.1-b02 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# j  org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics.expandUsingDeclarationsAndRemoveObjects([Lorg/eclipse/cdt/core/dom/ast/IBinding;Lorg/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData;)[Lorg/eclipse/cdt/core/dom/ast/IBinding;+0

eclipse.iniに

-XX:-UseCompressedOops

を追加すると良いと書いてあったのを見つけて、末尾に追加したら解決しました。

Bug 333227 – Oracle Java 6 update 23 crashes when running Eclipse CDT (64-bit version of CDT & JRE) [see comment 7 for workaround]

UseCompressedOopsのオプションについては以下のサイトが詳しいです。

UseCompressedOops オプションのデフォルト値 – めざせ!金持ち父さん


Android開発で3G回線速度を再現する

ネットワークを利用するAndroidアプリを開発していると、回線速度が遅い場合の処理を気にしない訳にはいかなくなります。

開発中はWi-Fiで接続しているから気付かなかった問題が、SIMの入った実機では頻発するなんてこともあります。

通信の内容確認と、速度の制限のために、PCのProxyを経由して通信するようにします。Wi-FiのProxy設定はICS(4.0)から可能です。

設定済みのネットワークであれば、長押しして設定画面を表示します。

image

プロキシ設定を手動にして、ホスト名にPCのIPアドレスを入力します。

image

PC側にはFiddlerを入れます。

Fiddler側の設定はこちらにまとめています。
Androidエミュレータの通信をFiddlerで見る : blog.loadlimit – digital matter –

Android実機からFiddler経由で接続できるようになったら、速度制限を試してみます。

メニューのRulesから、Performance→Simulate Modem speedsにチェックを入れると、「モデムの回線速度」をエミュレートできます。

WS000027

ただ、モデムなので遅くて最近のネットワークとしては使い物になりません。動画ダウンロードに数時間かかるとかザラです。

ここから速度を調整します。

Rules→Customize Rulesを開きます。デフォルトではメモ帳でJSファイルが開きます。

image

request-trickle-delayという行を探します。

		if (m_SimulateModem){
			// Delay sends by 300ms per KB uploaded.
			oSession["request-trickle-delay"] = "300";
			// Delay receives by 150ms per KB downloaded.
			oSession["response-trickle-delay"] = "150";
		}

ここで1KBごとに実行する遅延時間を設定することができます。request-trickle-delayがアップロードの遅延時間、response-trickle-delayがダウンロードの遅延時間です。数字が小さいほど高速になります。

デフォルトの設定ではアップロードが1KBで300msの遅延なので、3.33KB/s、27.3kbpsくらいです。ダウンロードは54.6kbpsくらいです。1024*(1000/150)*8/1000=54.6133..(kbps)ですね。

例えば好意的に見て3Gが1500Kbpsで上下通信できるとすれば、delay値は5.33、小数を切り捨てて「5」としておきます。5msの遅延ではあまり違いがわからないかもしれないので、僕は単純にそれぞれ30と15にしています。

編集が終わったらJSファイルを保存して閉じます。これで遅いネットワークが再現できます。

Fiddlerを使えば、他にもAutoResponder機能で、レスポンスを全部定義してサーバ代わりにしたり、通信自体にブレークポイントを設定してネットワークが応答しなかった場合の処理の確認も可能です。

追記(2013/06/13)

エミュレータの場合はnetspeedオプションをつけることで、速度を指定できます。

emulator.exe -netspeed umts

とすれば、3G回線速度がエミュレーションされます。

その他の速度についてはこちら。

Using the Emulator | Android Developers

ディレイも設定できるので、

emulator.exe -netdelay umts -netspeed umts

という感じで起動すれば良いかと思います。


PythonのpsutilでUDPポート監視

Windows上で特定のUDPポートがオープンになっているかを確認するのにPythonのpsutilを使ってみました。psutilはWindowsでもLinuxでも同じように使えるので、移植も簡単です。

要はZabbix agentみたいなものを作りたかったのです。

netstatコマンドで同じことをしようとすると、言語ごとに表示内容が変わったりするのを自力で整形する必要があるので、一元的に管理できるのは助かります。

インストールは
easy_install psutil
だけでOKです。

psutil – A cross-platform process and system utilities module for Python – Google Project Hosting

公式サイトを見てもらえばわかるのですが、psutilは本当に強力で、CPUの使用率からメモリ、ディスクスペース、ネットワークインターフェイスの状態、プロセスの優先度設定、停止、再開など色々なことが簡単にできます。

以下はPyDHCPLibで動いているプログラムがUDP67番ポートをListenしているかを確認するコードです。

import psutil
import re
found = False
iter = psutil.process_iter()
for p in iter:
    if re.search("python", p.name) != None:
        connections = p.get_connections(kind='udp4')
        for con in connections:
            if con.local_address == ('0.0.0.0', 67):
                found = True
                print p
                break
    if (found):
        break

あと、オフライン環境のマシンにもインストールさせたいのでeggファイルを用意します。eggファイルの形式では公開されていないので、easy_installでインストールしたものをコピーしてきます。eggファイルはpython\Lib\site-packages\psutil-0.4.1-py2.7-win32.eggにあります。

pydファイルも含まれているので、ファイルひとつだけコピーしてきて、

easy_install psutil-0.4.1-py2.7-win32.egg

でインストールできます。


hg cloneでcertificate verify failed

httpsのリポジトリからcloneしようとしたらSSLのverifyエラーが発生しました。

PS C:\repo> hg clone https://repository.sample.com/hg/test/ C:\repo\test
abort: error: _ssl.c:490: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

環境はWindows、サーバのSSL証明書はオレオレ証明書です。

解決策はさっくりとverify無視すればOKです。

    --insecure          do not verify server certificate (ignoring
                        web.cacerts config)
PS C:\repo> hg clone https://repository.sample.com/hg/test/ C:\repo\test --insecure

Warningは出ますが、これで使えます。

push/pull時もinsecure付けないといけないのは難点ですね。

ちゃんと解決する方法は公式ドキュメントに書いてあるっぽいのですが、気力なくなってしまったのでそのうち…

CACertificates – Mercurial


WinSerでnode.jsをWindowsのサービスにする

そんな用途がある人は相当少ないとは思うのですが、仕事柄、ニッチな要求ばかりがやってきます。

さて、node.js用に書かれたプログラムを、Windowsでサービス登録してバックグラウンドで自動実行する方法です。

WinSer: node.js applications as windows services

npmコマンドでインストールできます。

npm install winser

実際のプログラムをサービス化するにあたって、package.jsonを作成しておく必要があります。package.jsonのnameがそのままサービス名として登録されます。他の項目はどうでもいいです。

コマンドプロンプトを管理者権限で実行します。

C:\> chcp 437

日本語環境の場合、chcpコマンドでコマンドプロンプトを英語モードにしないと、
You must run this tool as an administrator
というエラーが出ます。

そして、自分の作ったプログラムのディレクトリに移動して、
C:\path\to\node_modules\.bat\winser.cmd -i
でサービスに登録されます。

cmdファイル経由ではなく、
node.exe C:\path\to\winser\winser -i
でもOKです。

ちなみに、サービス自体はnssmが登録します。

NSSM – the Non-Sucking Service Manager

ファイアウォールを通す場合は、nssmを指定します。


ISW11FをADBドライバで認識させる方法

Eclipseで開発をするときに、Arrows Z(ISW11F)がPCから認識しなくて困っていました。

PCからはFujitsu Mass storage USB Deviceと認識されてしまう場合の対処法です。

まずはドライバダウンロードします。
http://spf.fmworld.net/oss/usb_driver/isw11f/index.html

解凍したらReadme.txtは必ず読んでください。

インストール前に確認するべき項目は次の通り。

  • C:\Users\(ユーザー名)\.android\adb_usb.iniがあるか
  • 上記adb_usb.iniに「0x04C5」という行があるか(なければ行追加)
  • 端末がUSBデバッグになっているか

それとPCでデバイスマネージャーを起動しておきましょう。

これでUSBで端末を接続して、問題なくFujitsu HSUSB Deviceという項目が出現すればいいのですが、出現せず、下の画像のようになる場合があります。

WS000015

基本的には、すでに誤認識されてしまっているデバイスを削除してやればいいのですが、Fujitsu Mass storage USB Deviceの2行を削除しても、再接続すると元に戻ってしまいました。

なので、このデバイスの親ごと消す必要があります。作業は端末を接続したままで行います。

「ユニバーサル シリアル バス コントローラー」の下の「USB 大容量記憶装置」を右クリックして、削除します。ただし、複数デバイスがある場合は以下のように、デバイスマネージャーの表示を、「デバイス(接続別)」にしてやると、目的のデバイスがグループ化されるので、間違えずに消せるようになります。

WS000011

消したあとは、一度端末を外して、再度USBで接続すると、自動的にドライバのインストールが始まります。

WS000013

こうなれば成功です。ドライバーが見つかりませんと表示されますが、デバイス自体は認識されています。

WS000014

あとは、このFujitsu HSUSB Deviceを選択して、ドライバの更新をして、先ほどダウンロードして解凍したドライバファイルを選択すればAndroid Composite ADB Interfaceとして認識されます。

WS000016

ちなみにMass storage USB Deviceを直接「ドライバーの更新」すれば良いという情報があったのですが、試そうとしたら64bitドライバがない旨のメッセージが出て、進めませんでした。

今回はこちらのサイトが参考になりました。

AndroidがUSBデバッグで接続できない場合(USBストレージとしてしか認識されない場合) | コラビットの中の人


Windows版PHP 5.4.0でAPCを使う

まずはAPCをダウンロードします。

downloads.php.net/pierre/

php_apc-3.1.10-5.4-vc9-x86.zip (2012-04-11 23:46 -0700)
をダウンロードしました。

展開すると、ntsとtsのフォルダが作成されます。使っているPHPがNon Thread Safe版かThread Safe版かによって使う方を決めてください。

それぞれのフォルダの中に、php_apc.dllがあるので、phpがインストールされているフォルダのextフォルダにコピーします。

その後、php.iniを開いて
extension=php_apc.dll
を追加し、Apacheを再起動すればOKです。

ちなみに、dllのバージョンを見ると、5.4.1RC1-devと書かれていました。

phpinfo()ではこのようになります。特に問題なく使えているようです。

WS000000


Mouse without Bordersでルータを超える

Microsoft The Garageから提供されたMouse without Bordersは、Synergyのような、一台のキーボードとマウスで、他のPCを操作できるソフトウェアです。

Microsoft download from The Garage: Mouse without Borders – Next at Microsoft – Site Home – TechNet Blogs

これがかなり便利で、複数のPCを使う人にはぜひおすすめしたいところです。

Synergyと比べて、優れている点はこんなところです。

  • 人に勧められるレベルの簡単さ
  • UAC対応
  • ファイルのコピーがスクリーン間でドラッグアンドドロップでできる
  • 2台のPCのどちらのマウス(キーボードでも可)を使っても、双方向に操作できる
  • 1台のマウス(キーボードでも可)で複数のPCに、同時に同じ操作をさせられる
  • スクリーンの位置設定なども自動的に同期してくれる
  • ログイン前でも操作可能

Windowsキー+Lでのロックは、SynergyでもMouse without Bordersでも同じように両画面ロックしてしまうみたいですね。

インストール方法はこちらを参考にしてください。

窓の杜 – 【NEWS】Microsoft、複数PCでマウス・キーボードをLAN共有する「Mouse Without Borders」

で、今使っているLANの中に、もう一台ルータがいて、その中でまた別のネットワークを構築しているのですが、そのネットワーク内にあるPCと、外側のPCとでMouse without Bordersを使ってみました。

ちなみにWINSはない環境です。

image

Mouse without Bordersはコンピュータ名で接続先PCを特定するため、コンピュータ名からIPが特定できないといけません。

まず、それぞれのPCのhostsファイルに相手のIPを記述します。

PC1 C:\Windows\System32\drivers\etc\hosts
192.168.0.10 PC2

PC2 C:\Windows\System32\drivers\etc\hosts
172.16.10.1 PC1

ルータにはファイアウォールなどは入れていないので、これだけの設定でPC2からPC1への接続はできます。もしPC2からPC1を操作するだけなら、これで十分です。

双方向操作や、PC1からPC2を操作する場合はもう少し設定が必要です。

Mouse without BordersはデフォルトではTCPで接続するようになっています。使われるポート番号は15100と15101です。これをルータでアドレス変換してあげる必要があります。

AirStationでの設定はこんな感じです。

image

ちなみに15101だけでも接続できました。15100は何に使っているのか謎です。

これでルータは通るようになりましたが、192.168.0.10がどこを指すのか、PC1にはわかりません。

ですので、静的ルーティングを設定します。

管理者権限でコマンドプロンプトを開いて、
> route -p add 192.168.0.0 mask 255.255.255.0 172.16.10.2
とすればOKです。-pオプションは永続化です。

これで快適に2台のPCを操作できるようになりました。


PHPからarpテーブルを参照する

PHPからarpコマンドを実行してLAN内のMACアドレスとIPアドレスの変換テーブルを参照できるようにしてみました。単純に結果を正規表現にかけているだけです。

ちなみにひとつのMACが複数のIPを持つ場合には対応していません。それと、arpの性質上、頻繁にキャッシュクリアされるので、用途によっては注意が必要です。

<?php

$table = array();
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    exec('arp -a', $output); // for Windows
}
else {
    exec('/usr/sbin/arp -a -n', $output); // for Linux(debian)
}
foreach ($output as $line) {
    if (preg_match('/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*([0-9a-f]{2}[\-:][0-9a-f]{2}[\-:][0-9a-f]{2}[\-:][0-9a-f]{2}[\-:][0-9a-f]{2}[\-:][0-9a-f]{2})/i', $line, $matches)) {
        $ip = $matches[1];
        $mac = strtoupper(str_replace(array('-', ':'), '', $matches[2]));
        $table[$mac] = $ip;
    }
}

var_dump($table);

結果

array(2) {
  ["123456789ABC"]=>
  string(13) "192.168.0.1"
  ["0003FFFFFFFF"]=>
  string(15) "192.168.131.254"
}

Linuxのarpコマンドがarp -aで実行するとすごく遅いので、原因を調べていたら、デフォルトではIPアドレスからDNSの逆引きをしているということでした。-nオプションを付けることで、DNSリクエストを送らなくなるので一瞬で表示できます。