2018年02月24日

atpagesから移行

atpagesに置いていた内容をXdomainに移行。
http://www53.atpages.jp/usoinfo2/ だったURLは、http://xdomain.usoinfo.info/ に置き換えてアクセスしてください。

land.to も危ないかなあ。。。
posted by usoinfo at 09:48 | Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2018年02月09日

@pages閉鎖

@pagesが今月末でサービスを終了するとのこと。
ブログ以外の部分のコンテンツの移行を検討中。
posted by usoinfo at 06:43 | Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2017年08月10日

Orange Pi Zero + BMP180/BME280 でデータ計測

I2C経由で気温や気圧が取れる、BMP180とBMP280というチップを買った。Orange Pi Zero に繋いで、データを取ってみる。
OrangePiのOSはARMBIAN 5.31 stable。

買ったのは、
全部合わせて1000円ほど。他に必要なものは、ハンダと半田ごて。

まずハードウェア側の整備。
OrangePi本体のI2Cポートはピンが出てないので(RaspberryPiは出ているのだが…)ピンヘッダを半田付けし、BMP180/BME280モジュールは付属してくるピンヘッダを半田付け。
--
OragePi 1 - VCC BMP180
OragePi 3 - SDA BMP180
OragePi 5 - SCL BMP180
OragePi 9 - GND BMP180
--
をジャンパーケーブルで結線する。
IMG_20170810_154343s.jpg
こんな感じになった。

次いでソフトウェア側の整備。
/etc/modprobe.d/fbdev-blacklist.conf にblacklistを2行追加してreboot。
aptitude install i2c-tools libi2c-dev をインストール。

# vi /etc/modprobe.d/fbdev-blacklist.conf
--
blacklist pcf8591 ←この行追加
blacklist bmp085 ←この行追加
--
# reboot

# aptitude install i2c-tools libi2c-dev
i2cdetectしてみると、モジュールが見えた。
# i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
そして、センサー値の取得は、https://www.blackmagicboxes.com/?p=608 に掲載されているデータ取得用のプログラムを使用。
デバイスが、/dev/i2c-1 ではなく、/dev/i2c-0 で見えているので、プログラムを一部書き換え。

char *bus = "/dev/i2c-1";

char *bus = "/dev/i2c-0";
そしてコンパイルして実行。
# gcc -g -Wall -Wextra -pedantic -std=c11 -o bme280_p bme280_p.c
# ./bme280_p -a
Temperature in Celsius : 26.07 C
Temperature in Fahrenheit : 78.92 F
Pressure : 1006.47 hPa
Relative Humidity : 0.00 %RH
見えた!カンタン!!!

この例で繋いだのはBMP180だったので湿度は取れていないが、同じようにBME280を繋げば、湿度も取れる。
気圧のデータを、muninに取ってみた。グラフ出力サンプルはこんな感じ。

pressure_withjma_1-day.png

緑のラインはBMP180の計測値、青のラインは最寄りの気象台が発表している1時間毎の気圧。
こうしてみると、ほぼ一定の誤差で、気圧の変動は気象台の計測値を完全にトレースしている。まあ、当然と言えば当然だが、わざわざ自前で気圧を測らなくても、気象庁のデータで十分だろうということが分かってしまった……。

しかし、たかだか数百円で、カンタンにデータが取れるようになったので、これはなかなかいいんじゃなかろうか。夏休みの自由研究とかに向いているのではなかろうか?
タグ:OrangePi
posted by usoinfo at 16:00 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2017年08月06日

BIOSしか起動しない KVI-70B を回復

今更、激安中華タブでもないと思うのだが、誰かの役に立つかもしれないので、ジャンクのKVI-70Bを回復させた作業記録。
当然ながら保証なんてクソくらえ壊れて上等、自己責任の参考資料である。

特に使い道もなかったのだが、恵安のKVI-70Bの中古が送込3000円で売られてたので買った。但し書きに、「BIOSは起動するがOS起動不可」と書いてあったため、ジャンク品相当ではあろうが、BIOSまで上がるのならなんとかする方法はあると思い、値段に釣られて買ったのである。

で、品物が届いたので電源を入れてみたが、確かにBIOSのPOST画面は出るしBIOS Setupにも入れるが、Windowsは起動しない(起動すると画面が乱れて固まる)。ブート失敗後は、回復オプションが出てくるので、ストレージがハードウェア的に壊れてるとかいうことはなさそうだが……。
多分、回復オプションとかリカバリーとかがあると思って、UEFI shellから起動を試みたり、USBからのブートを試みるが、起動しない。いろいろと試してBIOSの設定を変えているうち、うっかりBIOS設定でUSB3.0を切ったら二度とUSBデバイスを認識しないカラダになってしまった。
外付けキーボードを挿しても認識しないので、何の操作もできなくなってしまった。USB3.0を切ってはダメです。あはは!!!

普通のデスクトップやノートのマザーボードだったら、CMOSクリアをかけてBIOSをリセットすればいいんだが、タブレットではどうにもならない。やむを得ず、殻を割る。KVI-70Bは、両面テープなどは使われておらず、簡単に割れた。
IMG_20170723_171148s.jpg

バッテリーを空にしたり、バッテリーからの給電線を切断したり、3日ほど放置したりしたが、BIOS設定はリセットされない。
万策尽きた、と思ったが、5年以上前に、BIOSをぶっ飛ばした時にチップに無理矢理BIOSを書き込むために、フラッシュROMライタを買っていたことを思い出した。これでBIOSを吸い出せばなんとかならないだろうか。

ボードを眺めていると、Winbond W25Q64FWSというチップがあった。これがBIOSに違いない。が、ボードにがっちり実装されていて取り外せそうにない。どうしよう、、、と思ってぐぐっていると、ICテストクリップというものがあることを発見。チップを脇から挟んでROMライタまで結線するというアイテムだ。
早速クリック。

ROMライタは古いものなので、WindowsXP 32bitのドライバしかないので、読み書きする用に別のマシンにXPを新たにインストールし、準備を整えているうちに、テストクリップが届いた。
IMG_20170806_082411s.jpg
IMG_20170806_103149s.jpg

チップを挟んで、BIOSを吸い出す。一旦Eraseして、BIOSを書き戻し、起動。が、設定は変わらず、キーボードは認識しない。BIOSの設定自体がフラッシュROMに書き込まれているのか?なんてこった。BIOSファイルのバイナリダンプを眺めてみるが、どこが設定値なのか分かるはずもない。多分、どこか1バイトを書き換えればいいのだろうが、どこだか分からん。くそう、メーカーがBIOSファイルを1つでも公開してればなあ……。手詰まり。再び、万策尽きた。

未練がましく、チップを覆っているセロハンを剥がしてみると、ボード上に "EM_I8170_V3.1" の刻印があったので、ぐぐってみると、EMDOOR EM-I8710というタブレットがあり、これは REEDER W7iC というタブレットと等価であって、W7iCのBIOSファイルが見つかった。
ダウンロードしてみると、BIOSとおぼしきReederW7iCBIOS_V1.6.8.binも8192KB。これ焼けばいけるかも!?ということで(起動できなくなってもROMライタだから怖くないし)、フラッシュROMにこのBIOSを書き込む。
IMG_20170806_103327s.jpg
ezp2011-2017-08-06.PNG

起動してみると、、、おお、キーボードが認識されている!起動画面とか充電画面は Reeder W7iC らしきものに変わってしまっているが、これでいけそうだ。

もう元々の中身を回復するのは諦めて、WindowsのMediaCreationToolで Windows 10 Home 32bit のインストール用ブートUSBを作り、Windowsパーティションをぶっ飛ばしてクリーンインストールを実施。成功。

不明なデバイスが大量にあるが、これを順次解決していく。
Windows Updateを全て当てた後、メインボード関係のドライバとして、(多分互換だとおぼしき)Iconia Tablet8 W1-810から、8.1用の「Platform Installer ドライバー」をダウンロードして入れる。これでI2C関係の不明なデバイスが解決された。
次いでKionixからKXTJ9-KXCJ9-KXTJ2 Driverをダウンロードして入れる。これで3軸傾きセンサーが解決された。(回転方向が反対になってるが、後で解決する)

後はカメラとタッチパネルだが、これはメーカー、ベンダーのドライバがない。
カカクコムのBBSに、吸い出したドライバーを発見したのでダウンロード。解凍してUSBメモリでKVI-70Bに持って行き、!マークのデバイスを「ドライバーの更新」でローカルから探して当てる。
タッチパネルはこのままではどうもタッチが狂っているので、SileadTouch.fwを取得。zipを解凍したら、SileadTouch.fw を C:\Windows\System32\Drivers の下にコピーし、デバイスマネージャーからタッチパネルのドライバーを一度アンインストール。再起動すると不明なデバイスになるので、ドライバーの更新で当て直して、解決。
センサーの回転方向が反対になるのは、レジストリ値 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ROOT\SENSOR\0000\Device Parameters\kxfusion に 00,00,00,01,01,00,02 と書き込む。解決。
regファイルはこう。Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ROOT\SENSOR\0000\Device Parameters\kxfusion]
"Orientation"=hex:00,00,00,01,01,00,02

不明なデバイスに1つ残っている(カメラのセンサー?)が、これは解決法が分からなかった。

が、これで、概ね普通に使用可能なWindows10になったと思われる。
IMG_20170806_164759s.jpg

ストレージの残りが2Gもないので、果たして何かに使えるかと言うと、微妙だが……。
あと本体あっつい!
タグ:KEIAN KVI-70B
posted by usoinfo at 17:25 | Comment(0) | Windows | このブログの読者になる | 更新情報をチェックする

2017年07月26日

PHPでIPアドレス+ネットマスクに適合するかチェック

あるIPアドレスが、ネットワークアドレス/ネットマスク長にヒットするかどうかを検査したい。ソースアドレスでアクセス制限したいとかいう時によくあるアレである。
IPv4だけのときは、ip2long/long2ipでマスク長のビット演算をして比較すればよかったが、昨今IPv6も普通にあり得るのでそっちにも適用しなくちゃいけない。
IPv6は128ビットなので、longでは検査できないので、inet_ptonを使って検査するルーチンを書いてみた。

Github はこちら。
https://github.com/usoinfo/php_ipaddrmask_test

function ipaddr_mask($src, $mask)
{
$iarr = str_split($src);
$marr = str_split($mask);
$ret = false;
for($i=0;$i<count($iarr);$i++){
$ret .= $iarr[$i] & $marr[$i];
}
return $ret;
}

function ipaddr_compare($srcaddr, $netaddr, $netmask)
{
if( !$netmask && ($pos = strpos($netaddr,"/")) !== FALSE ){
$netmask = intval( substr($netaddr, $pos+1) );
$netaddr = substr($netaddr, 0, $pos);
}

$addr = inet_pton($srcaddr);
$comp = inet_pton($netaddr);

$len = strlen($addr)*8;
if($netmask > $len) $netmask = $len;

$mask = str_repeat('f', $netmask>>2);
switch($netmask & 3){
case 3: $mask .= 'e'; break;
case 2: $mask .= 'c'; break;
case 1: $mask .= '8'; break;
}
$mask = pack('H*', str_pad($mask, $len>>2, '0') );

return ipaddr_mask($addr, $mask) == ipaddr_mask($comp, $mask);
}

/*

使用法サンプル
$srcaddr = "192.168.1.12";
$netaddr = "192.168.1.0";
$netmask = 24;
$r = ipaddr_compare($srcaddr, $netaddr, $netmask);
echo $srcaddr." compare ".$netaddr."/".$netmask." => ".($r ? "match" : "unmatch")."\n";

$srcaddr = "25ef:91:c540:1:a00:27fa:fce1:28c";
$netaddr = "25ef:91:c540:1::0";
$netmask = 64;
$r = ipaddr_compare($srcaddr, $netaddr, $netmask);
echo $srcaddr." compare ".$netaddr."/".$netmask." => ".($r ? "match" : "unmatch")."\n";

実行結果
192.168.1.12 compare 192.168.1.0/24 => match
25ef:91:c540:1:a00:27fa:fce1:28c compare 25ef:91:c540:1::0/64 => match

*/

タグ:PHP
posted by usoinfo at 18:06 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2016年07月30日

ホストマシンの仮想化支援機能(VT-x/AMD-V)が使用できません。

Visual Studio 2015 Community をインストールしたら、その後、VirtualBoxのVMが起動できなくなった。実行しようとすると「ホストマシンの仮想化支援機能(VT-x/AMD-V)が使用できません。」とメッセージが出る。
しかし、BIOSの設定では、VT-xは有効になっている。

これは、Hyper-Vが有効になったせいらしい。
「コントロールパネル」-「プログラムと機能」-「Windowsの機能の有効化または無効化」で、Hyper-Vのチェックボックスをオフにして再起動したら解決。
20160730-01.png
困るぜ。仕事が出来なくなるところだった。
タグ:virtualbox
posted by usoinfo at 07:15 | Comment(0) | Windows | このブログの読者になる | 更新情報をチェックする

2016年03月20日

同じUSBデバイスが複数ある時にデバイスを識別する

全く同じUSBデバイスが複数繋がっている時、特定の1つを指定するにはどうすればいいか困っていた。
ベンダーID・プロダクトIDが異なっていればudevでデバイス名を固定すればいいのだが、同じだとどうやら固定できなさそう。そもそも/dev配下にデバイスとして見えないものはどうすればいいのか。
具体的にはUSB温度計が複数繋がっている時。
USBのデバイス番号で読み取り先の温度計を指定できるものの、USBのデバイス番号は毎回変わるので、決め打ちで一意に指定できない。

lsusbでUSBデバイスの接続状況が見られるわけだが、'lsusb'だとバス・デバイス番号・デバイスIDが、'lsusb -t'だと、カスケードされたハブの接続とその先のデバイス番号が分かる。
そこで、例えば
+PCのUSBポート
|
+---ハブ1--+--エレコムのカメラ
| +--USB温度計
|
+---ハブ2--+--バッファローのカメラ
+--USB温度計

こんな感じに機器が繋がっているならば、

”エレコムのカメラと同じハブに繋がってるUSB温度計”
”バッファローのカメラと同じハブに繋がってるUSB温度計”

という特定の仕方をすれば、USB温度計のデバイス番号が一意に求められる(別にカメラじゃなくても、ベンダーID・プロダクトIDが違っていれば何でもいいけど)。
よって、まず lsusb -t の出力でツリー構造を分析して、ルートからどうハブを経由しているかとデバイス番号を紐付けして、その結果をlsusbの出力でデバイス番号とベンダーID・プロダクトIDを紐付けすれば、”エレコムのカメラと同じハブに繋がってるUSB温度計”が分かるようになるだろう。

ということで、lsusb -tとlsusbの出力結果を解析して、接続されている場所・デバイス番号・デバイスIDを列挙するコードをPHPで書いてみた。

https://github.com/usoinfo/usb_device_list

初めてgithubを使ってみた。
使い方のサンプルは、 sample.php にあります。
タグ:PHP USB
posted by usoinfo at 10:26 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2015年05月12日

Debian Jessie で、シャットダウン・再起動するときsshdが終わらない

sshで接続したままDebian Jessieをシャットダウンか再起動すると、サーバー側のsshdがコネクションを切らないまま終了するので、クライアント側がいつまでも繋がりっぱなしでうざい。
rc0 rc6 でsshdをkillするようにして、とりあえず回避。
これDebianのバグなんじゃないかなあ?よくわからんけど。

/etc/init.d/ に killsshd 等適当な名前でスクリプトを作成。
runlevel 2345 では何もしない、06では kilall sshd するだけ。
#! /bin/sh
### BEGIN INIT INFO
# Provides: killsshd
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: kill all sshd process
# Description: kill all sshd process
#
### END INIT INFO
#
# Author: usoinfo
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin

case "$1" in
start)
;;
stop)
killall sshd
;;
status)
;;
*)
echo "Usage: /etc/init.d/killsshd {stop}"
exit 1
;;
esac

exit 0
適当に有効化。aptitude install psmisc (※killallコマンドが入ってなければ入れる)
chown root:root /etc/init.d/killsshd
chmod 755 /etc/init.d/killsshd
update-rc.d killsshd defaults
reboot、shutdownの時は、killall sshdされるので、サーバー側から接続が切られるはず。
タグ:Linux Debian jessie
posted by usoinfo at 09:00 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2015年05月08日

玄箱にDebian Jessieをインストール

Squeeze化しカーネルを2.6.39.4にして使っていた玄箱だが、Jessieがリリースされたのを機に、追い付いておくことにした。

と言っても、HDL-GXRでWheezy/Jessieを動かすよりは簡単に済んだ。玄箱は、正式にカーネルに取り込まれているので、カーネルソースをいじらなくてよいので。
よって、Weezy用は3.2系logtermの3.2.68、Jessie用は最新のstableである3.19.6を選択した。

基本的な作業は、3.x系のカーネルをコンパイルして(参照記事)、debootstrapでrootfsを作成(参照記事)、玄箱からディスクを取り出して別のPCにマウントし、ブート環境を整えた上で、作ったカーネルとrootfsを展開した。
作ったrootfsとカーネルを一応置いておく。

Wheezy向け
rootfs kurobox-rootfs-wheezy.tar.bz2
kernel kurobox-kernel-3.2.68.tar.bz2
lib kurobox-lib-3.2.68.tar.bz2
config kurobox-config-3.2.68.txt

Jessie向け
rootfs kurobox-rootfs-jessie.tar.bz2
kernel kurobox-kernel-3.19.6.tar.bz2
lib kurobox-lib-3.19.6.tar.bz2
config kurobox-config-3.19.6.txt

インストール手順
1. ハードディスクのパーティションを切る
Linuxの動いているPCにHDDを接続して、
(※接続したHDDはsdbの想定)
/dev/sdb1 MontaVista Linux (100M〜お好みで)
/dev/sdb2 swap (256M〜お好みで)
/dev/sdb3 Debian (残り全部)

sdb1,sdb3はext3でフォーマット、sdb2はmkswapする。
玄人志向のページからファームウェアアップデート Ver1.02をダウンロードし解凍、中のimage.zipを解凍して、tmpimage.tgzを /dev/sdb1 に展開する。(この段階で玄箱MontaVistaが動くようになるはず。つまり第1パーティションに玄箱オリジナルのLinuxが入ればいいので、通常の初期化手順を実行しても良い、はず。)

2. ブート環境の整備
玄箱/玄箱HG 用 ubuntu 12.04 LTS imageより、kuro-bootsel2.20080419.tar.gzubuntu-precise-installer.zip をダウンロード。
ubuntu-precise-installer.zip を解凍し、u-boot-1.2.0-hd.ram.bin uloader-2.4.17_mvl21-sandpoint.oをsdb1:/boot に置く。
kuro-bootsel2.20080419.tar.gz を解凍して、install.shの内容を手作業で実行。
# mount /dev/sdb1 /mnt (※接続したHDDはsdbの想定)
# cp u-boot-1.2.0-hd.ram.bin /mnt/boot
# cp uloader-2.4.17_mvl21-sandpoint.o /mnt/boot
# mkdir -p /mnt/boot/tools
# cp kuro_swread kuro_morse /mnt/boot/tools/
# cp kuro_bootsel2.sh /mnt/etc/init.d/
# chmod 755 /mnt/etc/init.d/kuro_bootsel2.sh
# pushd /mnt/etc/rc.d/rcS.d
# ln -s ../init.d/kuro_bootsel2.sh S15kuro_bootsel2.sh
# popd
# cp kuro_boot.conf /mnt/etc/
sdb1:/etc/init.d/kuro_bootsel2.sh を次のように変更。
101行目から
if [ ! -f $2 ]; then
/bin/echo "Kernel does not exist."
/boot/tools/kuro_morse F $AVR
return 0;
fi
init_avr

# if [ ! -f $2 ]; then
# /bin/echo "Kernel does not exist."
# /boot/tools/kuro_morse F $AVR
# return 0;
# fi
if [ -f $2 ]; then
/sbin/insmod $1 kernel=$2 $3
else
echo /sbin/insmod $1 $2 $3
/sbin/insmod $1 $2 $3
echo /sbin/init 6
/sbin\/init 6
fi
init_avr
している内容は、ubuntu-precise-installer-kuroBOX.sh の sed -e "101,105 s/^./#/" -e "110 s/^./#/" ... と同じ。
sdb1:/etc/kuro_boot.conf を次のように変更。
# kuro_bootsel config file (2008-04-01)
#
# "bootdefault"
# 1: Linux, 2-9: See below
bootdefault=2

(略)

# Menu entry No.2
#
menu2="Debian"
loader2="-f /boot/uloader-2.4.17_mvl21-sandpoint.o"
kernel2='uboot=/boot/u-boot-1.2.0-hd.ram.bin'
option2=''
している内容は、ubuntu-precise-installer-kuroBOX.sh の sed -e "s/^#bootdefault=1$/bootdefault=2/" ... と同じ。

3. rootfs,kernel,lib を展開
カーネルをsdb1へ、rootfsとlibをsdb3へ展開する。
# mount /dev/sdb1 /mnt
# tar xvfj kurobox-kernel-XXXXXX.tar.bz2 -C /mnt/boot
# umount /mnt
# mount /dev/sdb3 /mnt
# tar xvfj kurobox-rootfs-XXXXXX.tar.bz2 -C /mnt
# tar xvfj kurobox-lib-XXXXXX.tar.bz2 -C /mnt
# umount /mnt
4. ハードディスクを玄箱に接続してブート
eth0はdhcpでアドレスを取得。電源投入から3〜5分くらいで、sshd が上がりアクセス可能になる。はず。
ユーザー名root、パスワードkuroadmin でログインできる。
続きを読む
posted by usoinfo at 06:54 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2015年05月05日

HDL-GXRでJessieを動かす。

前記事で、HDL-GXRでWheezyを動かしたが、こっちが本命、Jessie。Jessieはつい先日出たばかりだが、Debianの過去バージョンの捨て去り方は急すぎるというか、もう少し余韻を残してくれてもいいんじゃないか。ミラーサイトからイメージが消えるの早い早い。

というわけで、HDL-GXRでJessieを動かした。
Jessieのカーネルは3.16番台のようなので、3.16.7 をコンパイルし、debootstrapでrootfsを作成。
やった内容は、Wheezyとほぼ同じなので割愛。前記事の3.2.68を3.16.7に、wheezyをjessieに読み替えれば大体合っている。

作ったカーネルとrootfsを。簡単なまとめはこちら。使用は自己責任で。
patch hdl-gxr-kernel-3.16.7.patch
config hdl-gxr-config-3.16.7.txt
kernel hdl-gxr-kernel-3.2.68.tar.bz2
lib hdl-gxr-lib-3.2.68.tar.bz2
rootfs hdl-gxr-rootfs-wheezy.tar.bz2
(Wheezyと同じく、eth0のアドレスはDHCPで、アクセスはsshで、ユーザー名root、パスワードはolpadminです。)

最新のstableカーネル3.19.6を使おうと思ったんだが、うまく動かせていない。何がいけないのかわからない。続きを読む
posted by usoinfo at 16:44 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする