Windowsバッチファイルでping応答の違いで動作をかえる

Windowsバッチファイルで、指定IPアドレスから応答がなくなったら次の作業を実施する、という処理をやりたかったので作った。

普通にping実行時のERRORLEVELを見ればいいか、と思っていたが、試験した環境では応答があってもなくてもERRORLEVEL0だったので判別ができなかった・・・

調べたところ「otnx.jpのコマンド別/ping」に調査した結果と回避方法があったのでそれを使った。

ちなみにotnx.jpではfindで「bytes=32」を引っかけていたが、日本語環境だと「 バイト数 =32」になってしまう。しかし、バッチには日本語文字列を書きたくなかったので、その後ろにある「ms TTL=」の方を引っかけるようにした。

・停止待ちバッチファイル

応答がなかったら終了。
応答があったら3回繰り返す

@echo off

set COUNT=0

:error
set /a COUNT=COUNT+1
echo %COUNT%
if "%COUNT%" == "3" goto errorout
ping -n 1 IPアドレス | find "ms TTL=" > NUL
if ERRORLEVEL 1 goto notrespond
timeout /t 5  > nul
goto error

:notrespond
echo host stopped
goto end

:errorout
echo host not stop

:end

・起動待ちバッチファイル

ping応答があるまで待機する
3回繰り返してもping応答がなければ諦める

@echo off

set COUNT=0

:error
set /a COUNT=COUNT+1
if "%COUNT%" == "3" goto errorout
ping -n 1 IPアドレス | find "ms TTL=" > NUL
if ERRORLEVEL 1 goto error

echo host working
goto end

:errorout
echo host not working

:end

Windows上でperlを使って日本語ファイル名を操作する(メモ

slashdot.jpの「Perlはゾンビだ」に、日本語Windows環境において、perlを使って日本語ファイル名を操作する時の注意点がまとめられていたので、引用&備忘録化。

過去にperlスクリプトを作る際、ファイル内に書かれた日本語の操作に関することはWindows/Linuxで動作が共通化できたものの、「日本語ファイル名の取り扱い」について、Windows上での動作がいまいち分からず、面倒になり、NASに該当ファイル群を置き、Linuxで処理する、ということをしたことがある。

その時に受けた感じからすると、以下の解説は非常に納得がいくモノだった。

Anonymous Coward の書き込み (#2628619) 」より

コマンドラインからの引数取得とかファイル操作とかのたびに
@ARGV = map { decode(‘cp932’, $_) } @ARGV; とか
open my $fh, ”, encode(‘cp932’, $filename) or die $!; とか
@files = map { decode(‘cp932’, $_) } readdir($d); とか
if (-f encode(‘cp932’, $filename)) とか
mkdir encode(‘cp932’, $filename); とかソース全体にわたって書かなければならないこと。

これが面倒だと思わない奴はWindows上でPerlを本気で使ったことがないとしか思えない。少なくとも小飼弾はMac使っているようだし。つーか面倒だと思わないならそもそもどうして開祖が「怠惰はプログラマの美徳」とか言ってる言語なんか使ってるの?

56億7千万歩ほど譲ってこれは面倒ではないということにしても、Windows以外の環境への移植性がまったくない。Windows上でシステムロケールを変えただけで動作がおかしくなる。当然どんな環境で動くかわからないモジュール内では使えない。
まあいちおうこれには対処の方法があって、
use Encode::Locale;
@ARGV = map { decode(locale, $_) } @ARGV; とか
open my $fh, ”, encode(locale_fs, $filename) or die $!; とか
@files = map { decode(locale_fs, $_) } readdir($d); とか
if (-f encode(locale_fs, $filename)) とか
mkdir encode(locale_fs, $filename); とかさらに呪文を積み増しすればいいらしい。
MacやLinuxでこんなことわざわざしてる奴いないと思うけど。つーか忘れてもたいてい問題なく動くからWindows以外の環境で正しく書くのが超困難。だから結局Windowsに移植する奴が貧乏クジを引かされる。Windows上ですら、localeとlocal_fsが違う環境があるというバグを知らずに踏んでも気づかない。

しかし実はEncode::Locale;使ってもまだ不十分で、システムロケール(日本語版ならシフトJIS)で表せない文字を含んだファイル名が扱えない。いちおうWin32::Unicode::Fileというモジュールがあるようだが、ファイル読み書きをモジュール内で独自に行なっているので信じられないほど遅くて捨てた。Win32::Longnameというモジュールがちょっとはマシなようだが、どちらにしてもまたも移植性がなくなる。

自分で書くコードは上記の面倒じゃないことにした書き換えを「するだけで」済むとしても、File::compareのような超基本的モジュールすらいまだに非対応。

Perlでこのへんが改善される見込みはまったくなさそうなので、自分はPythonの勉強を始めた。

そして、(#2630401) より

> ・PerlをUTF-8ベース(CP65001)でPerlを動かす
> ことだと思います。

Console CPはファイル名で使われるコードページにはまったく影響を与えない。Encode::Localeでもlocale_fsとconsole_inとconsole_outが別々に定義されている(そう、APIレベルではコンソール入力と出力さえ異なる可能性がある)。Perlの仕様をまともにするためにあなたのような知ったかぶりバカをマサカリで殴って回るよりコストがかからないに違いないからPythonの勉強を始めたの。

> 普通のコマンドプロンプト(SJIS)ベースでは不可能。

Windowsにはコンソール入出力にもワイド文字APIがあり、それを使えば可能(リダイレクトやパイプが絡むとこっちの都合だけでエンコーディングを決められないけどそれはCygwinでも同じだし)。もちろん今あるPerlでは不可能だがそれは実装の手抜きにすぎない。そもそもCygwinはどうやってUTF-8文字を受け付けるコンソールを実現してると思ってるの?

> ・UTF-8 な cygwin の環境を構築し、その上で Perl を使う

Cygwinはパスの扱いが特殊すぎて、結局普通のアプリとパス名をやりとりする際にパスの変換/逆変換が必要なので、面倒だとか移植性ゼロだとかいう問題は何も解決しない。Perlがmsvcrt使うのやめて、UTF-8←→UTF-16LE変換を行ってワイド文字API呼び出して、Encode::LocaleはあたかもロケールがUTF-8であるかのようにふるまってくれるのが一番いいのだが、それを実現するために投入するコストを考えるとすでにまともな処理している言語の乗り換えにコストを振り向けたほうがどう考えても省エネ。

> ・@ARGVやファイル名を、スクリプト本体内のデータ処理と混ぜない

それを面倒と思わないなら以下略

RoundCubeは次の1.1でIE8とFirefox 3.6のサポートを切る

Webmailソフトの「RoundCube」に、version 1.0.1が出ていたのに気がついて、アップデート。

ついでに、「System Requirements」を確認・・・

Internet Explorer 6 (Windows 2000/XP) – not supported since Roundcube 1.1
Internet Explorer 7 (Windows XP) – requires legacy_browser plugin since Roundcube 1.1
Internet Explorer 8 (Windows XP/7) – requires legacy_browser plugin since Roundcube 1.1
Firefox 3.6 (Windows XP, Linux) – requires legacy_browser plugin since Roundcube 1.1

おや?
次のバージョン 1.1から、古いブラウザのサポートをやめるようです。

RoundCube 1.1から、内部で使用しているjQueryのバージョンを2.xに変更するようで、そのjQuery 2.xがこれらのブラウザをサポートしていない(jQuery 2.0 Releasedより)ということに起因する変更点である模様です。

とりあえずは、legacy_browser pluginを使うという、救済処置がIE6以外にはあるようです。

中華SoCベンダLeadcoretechからFDD/TDD-LTE対応のCortex-A7 6コアのLC1860が2014年Q3登場予定

最近、新製品の発表してないけど、どうするのかなぁ?と思っていた中華SoCベンダのLeadcore Technology(联芯科技有限公司)。
久々に新製品の発表をしていた模様

面向移动互联网及大数据联芯科技3S战略深耕4G市场 (2014/06/25)

5モード対応(TDD-LTE/FDD-LTE/TD-SCDMA/WCDMA/GSM)のスマートフォン向けSoCとして、LC1860というのを出す予定。
Cortex-A7 6コアで、4.0インチ~4.7インチクラスのスマートフォンをターゲットとしている。

2014Q3に製品がリリース予定とのこと。

され・・・どんな製品が出てくることやら?

Covia CP-F03aのランタイムをARTに切り替えてみた(失敗

Android 4.4にアップデートしたCovia CP-F03a。

そういえば、ランタイムをARTにしてみる、ってのをやってなかったな、と思い出したので、切り替えてみた・・・

・・・

Coviaロゴのまま起動してきません。

adb logcatしてみると↓のような感じのdex2oatコマンドのエラーがループしていました。

D/java.hwcomposer( 1475): FBDevice::post called 12 times [12 0 0 0 0 0 0 0]
E/art ( 1476): /system/bin/dex2oat failed: /system/bin/dex2oat –image=/data
/dalvik-cache/system@framework@boot.art –runtime-arg -Xms64m –runtime-arg -Xmx
64m –dex-file=/system/framework/core-libart.jar –dex-file=/system/framework/co
nscrypt.jar –dex-file=/system/framework/okhttp.jar –dex-file=/system/framework
/core-junit.jar –dex-file=/system/framework/bouncycastle.jar –dex-file=/system
/framework/ext.jar –dex-file=/system/framework/framework.jar –dex-file=/system
/framework/framework2.jar –dex-file=/system/framework/telephony-common.jar –de
x-file=/system/framework/voip-common.jar –dex-file=/system/framework/mms-common
.jar –dex-file=/system/framework/android.policy.jar –dex-file=/system/framewor
k/services.jar –dex-file=/system/framework/apache-xml.jar –dex-file=/system/fr
amework/webviewchromium.jar –oat-file=/data/dalvik-cache/system@framework@boot.
oat –base=0x60000000 –image-classes-zip=/system/framework/framework.jar –imag
e-classes=preloaded-classes
F/art ( 1476): art/runtime/gc/space/image_space.cc:148] Check failed: Genera
teImage(image_file_name) Failed to generate image: /data/dalvik-cache/system@fra
mework@boot.art
F/art ( 1476): art/runtime/runtime.cc:203] Runtime aborting…
F/art ( 1476): art/runtime/runtime.cc:203] (Aborting thread was not attached
to runtime!)
F/art ( 1476): art/runtime/runtime.cc:203] Dumping all threads without appro
priate locks held: thread list lock mutator lock
F/art ( 1476): art/runtime/runtime.cc:203] All threads:
F/art ( 1476): art/runtime/runtime.cc:203] DALVIK THREADS (0):
F/art ( 1476): art/runtime/runtime.cc:203]
F/libc ( 1476): Fatal signal 6 (SIGABRT) at 0x000005c4 (code=-6), thread 1476
(zygote)
I/DEBUG ( 1472): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *
**
I/DEBUG ( 1472): Build fingerprint: ‘BRCM/java_c_edn000_4Gb/java_c_edn000_4Gb:
4.4.2/KOT49H/539ABBBA:user/release-keys’
I/DEBUG ( 1472): Revision: ‘0’
I/DEBUG ( 1472): pid: 1476, tid: 1476, name: zygote >>> zygote <<< I/DEBUG ( 1472): signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- D/BootAnimation( 1736): movie(), j=0, 3, 79

現状、このCP-F03aは、初期化しても問題ない状態なので、さっさと初期化 

「adb reboot recovery」でRecoveryに入ってfactory reset!

で・・・正常起動後、再チャレンジするも、やっぱりロゴから先に進まない。

現状のCP-F03a用のAndroidでは、ARTランタイムは動かないようです。

あと、選択してしまったら、戻す方法はfactory resetのみのようです。 factory resetは、バッテリーを抜いて電源を切ったあと、 ボリュームUPボタンを押しながら、電源入れると Recoveryモードになるので、そこでfactory resetを選べばokです。


2014/07/02 追記

covia側でも、この件は把握済みとのこと。
オプション機能なので、対応は後回しだそうで。