<<20142016>>

2015-1-1[木]新年

あけましておめでとうございます。

去年中にやりきれなかったことを今年(中)はやり遂げたい...とぜんぜんひきづっててあらたまってないな。

お仕事は一昨年秋くらいからのスマフォ・ガチャアプリ系の下っ端仕事がまだ続いていて1つの作品に連続でここまで長く携わるのは初めてかも(さすがにもうそろそろ切れるだろうけど)。最初のリリースまでは激務で以後は緩急あるけど穏やかな進行で、ターゲット(技術)は今までの延長だけど仕事運び的には業種の違いを実感。

やっぱ納期に対する要求具合の違いは全体的にいろいろな局面で判断基準が違ってくるものですね(会社ごとのカラーもあるでしょうが)。
ROM(DISC orカートリッジ)のため1,2ヶ月前にfixしきらなければならないコンシューマ機とリリース後も継続してバグフィックスやゲームシステム(ゲーム性)を定期的に変更していくソシャアプリとでは... こんなにプログラミングの一般論が通用して(振りかざして)いるんだもんなぁ。なんてか…(愚痴になるのでやめとこ今日は)

と、ま、ぼちぼち生きてます。




2015-2-7[土] devian7 軽量インストール (続 vaio c1 に linux)

前回以降も、たまに ちびちび弄ってたりする vaio c1。 debian7 を入れてみてたのでベストにはほど遠いけれど作業メモ。
konalinux black で icewm や jwm に変えてみて それでもよいような、けどまだ いろいろ入って(常駐して)て重いような、で、結局 素から要りそうなものだけ入れるのがよさようかな、と。やってみるとpuppyよか軽い... 要りそうなものを入れてないせいかもしれないが、まあ、弄る気になれるレスポンスも大事と。
※ 言わずもがなだけどlinux unix の知識乏しい奴なので遠回りやヘマはありそう

インストール

前回のgrub4dosインストール済のC1環境なので、grub4dos の iso ファイル起動を用いて hdd より netinst (debian-7.7.0-i386-netinst.iso) をしてみた。と、いっても例によってCDドライブは見失うので、isoファイルを展開した usb メモリを別途用意&装着。grub4dosのmenu.lst に 以下を追加。

title netinst debian7
find --set-root /debian-7.7.0-i386-netinst.iso
map /debian-7.7.0-i386-netinst.iso (0xff) || map --mem /debian-7.7.0-i386-netinst.iso
map --hook
chainloader (0xff)
rootnoverify (0xff)

isoファイル起動にしたのは net経由のためPCカードスロットにCDでなく(無線)LANアダプタを繋げるためだったのだけど、インストール時に認識できず(というかその後もうまく認識させられず)、結局 電源ありのUSBハブを繋げてそこに USB-LAN とUSBメモリを装着してインストールした。
言語やキーボード・時間等は日本な選択をしておき、 ソフトウェアの選択 で 標準システムユーティリティー と laptop のを選択。bootローダの書込は無し。
(※ USBハブ無でもインストール時にLANを諦めてスキップすれば ソフトウェアの選択 で 標準システムユーティリティー 1択のみでインストール可能だったのだが手持ちのUSB-LANアダプタ認識できなかったので諦めた。後で(起動用isoはnetinstのまま) USBメモリ側に DVD版のisoを展開しておいてインストール試すとソフトウェア選択増えて入れれるようだったのでusbハブ使わずともinstallできたかもしれない)

grub4dos のmenu.lst に起動エントリを用意

title Debian 7 gui
root (hd0,7)
kernel /boot/vmlinuz-3.2.0-4-486 root/dev/sda8 ro acpi=off quiet vga=786
initrd /boot/initrd.img-3.2.0-4-486

また 通常(runlevel 2)のGUI起動以外に テキスト(CUI)のみの起動もしたいので

title Debian 7 text
root (hd0,7)
kernel /boot/vmlinuz-3.2.0-4-486 3 root/dev/sda8 ro acpi=off quiet vga=786
initrd /boot/initrd.img-3.2.0-4-486

のように runlevel 3 で用意.

コンソール環境にて

まずはコンソール環境で作業。su で root になって、/etc/sudoers に自分(ユーザ名)の設定を追加(viやemacsの使えない己は nano で)

#ユーザー名  (ALL:ALL)       ALL
ユーザー名   (ALL)NOPASSWD:  ALL

当初は上のコメント側の設定だったが、gui側で shutdown/reboot の設定(を楽)する都合パスワード無にした。多少心地悪いが 己の vaio c1 の使用具合や puppy等LiveCD系をインストールした場合を思えば許容範囲だろうとしとく。


メールとかbluetoothとかこの環境には不要なものが ちらほら動いてそうなので apt-get remove で削除.

sudo apt-get remove exim4 exim4-base exim4-config
sudo apt-get remove bluez bluetooth

(その他も何か削除したような気はするけど忘却)


テキストエディタとして nice editor(ne) をインストール。(nanoは一時しのぎ)

sudo apt-get install ne

utf8で多少なりとも win/dos系な操作の代物を使いたく(^Zがundoじゃなくsuspendで泣くけど... fgは覚えた)。


ファイラ fdclone(fd) もインストール。己には必須。すぐさま使いたい場合は

apt-get install fdclone

なんだけど昔から apt-get で入れた場合どうも全角表示が化けてしまうようで(utf8未対応でコンパイルされてる?)、ちゃんと使いたい場合はソースからインストール。
(今のdebianの場合) apt-get したソフトのファイルは主に /usr/ 下に置かれ、ローカルマシンでの野良インストールは/usr/local/ 下に置けばよさそうなので /usr/local/src/FD-3.01b にソース展開、著者サイトか付属の Install テキスト見ながらインストール。apt-get側と極力衝突したくないこともあり local 共通のconfigは /usr/local/etc に置くことにして make CONFDIR=/usr/local/etc でコンパイル。
fd2rc は 色とかsortとか pager/editor とか諸々好みで変更(済のを別マシンからコピー)。
追記: ncurses が入ってなけりゃ入れる必要あり( apt-get install libncurses5-dev )

※ sudo ってディストリ(設定)によって sudo -s したときのユーザが 自分自身のままだったり rootに変わったりするよう。ubuntu系?だと自分自身のままのようで、それに慣れてると root で ~ ディレクトリも変わってるのを忘れて作業してミスしたり、fdclone等 で /home/ユーザー名/.各種個人config が読み込まれず難儀したり... ということでfdcloneは共通側(usr/local/etc/fd2rc)に個人設定を反映してしのいだ。(sudoをどうにかできればよいのだろうけど よくわからず)


X無でも 日本語表示 したいので fbterm とフォント も install。

sudo apt-get install fbterm
sudo apt-get install unifont

実際には unifont だけでなく fonts-takao や fonts-umeplus 等他のフォントも入れているが 指定に使うフォント名調べるの面倒臭がってとりあえず unifont。で、

sudo fbterm -n unifont

と、すれば起動。1度実行すると ~/.fbtermrc が作られているので、その中のフォント関係を

font-names=unifont
font-size=16

に修正(sizeは好みでだけど unifontではこのサイズがスッキリみえるかなと)。
./fbtermrc は rootユーザーで作られてしまってるので、chown ユーザー名:ユーザーグループ名 ./fbtermrc しとく。あとは exit して再度 sudo fbterm すれば...なんだが sudo しないと使えないのも不便なので、

sudo chmod u+s /usr/bin/fbterm

してユーザーでも使えるように変更。この環境は すでにセキュリティ的なことは緩いので、お手軽設定でヨシとしとく。


キーバインド変更ソフトの"窓の憂鬱linux版"(mayu)もインストール。(これでダイアモンドカーソル使えるようにしておかないとnote系キーボードをようさわれん奴なので)
インストールは 以前同様

ただ今回の環境では窓の憂鬱 常駐(実行)状態で (あとでインストールする)Xを 起動すると、jpキーボード設定なのに usキーボード配置に化けるということが起きた。

試してみると scim,uim,ibus だと駄目だったが fcitx だと設定次第でちゃんとjpキーボード配置になったので fcitx を採用することにした。(fcitxのインストールは後述)

設定次第とは /etc/default/keyboard のキーボード設定で、該当部分を

XKBMODEL="jp106"
XKBLAYOUT="jp"
XKBVARIANT="OADG109A"

のようにすることで対応。XKBVARIANT="OADG109A"がミソのようで、こうすることでjpキーボード(OADG109A系)扱いになった。(逆に XKBMODEL は別のでも影響なさげ)

※当然 窓の憂鬱 か X どちらか起動しなけりゃ scim,uim,ibus でも問題無く。ググってみても他の窓の憂鬱使いで同様な問題起きてそうな人は見当たらないので 環境(C1)依存か己の何かの設定ミスかもしれず。

あと、非X環境での日本語入力は諦めた。
uim-fep なら結構楽にインストールできたけれど、fcitx使うので fcitx-fbterm をインストールしてみたのだがマトモに動作せず(画面壊れる)。 uimとfcitxって同居切替できるのか?よくわからず、あまり手間かける気にもなれず mayu 諦めるくらいなら fep諦めることに。

※実は、X起動後に 窓の憂鬱を起動すれば、usキーボード化けは起きないので そうすれば uim (やscim,ibus)を用いることはできるのだけど... X起動直後に自動で適切にmayu有効にする方法わからず断念 (runlevel 2,3でmayu起動タイミングを代え、gui時は .profile で sudo /etc/init.d/mayu start すればそれっぽくできたのだけど、WMのメニューから login し直した後に結局usキーボード化けしたりと 細々面倒で)。

※配布サイト見に行こうとしたら消失してる?模様(去年末はみれてたと思うのだけど)

icewm

GUIも使いたいので、まずは x をインストール。

sudo apt-get install xorg

次に window manager として icewm をインストール。

sudo apt-get install icewm

startx で起動、ログアウトでコンソールに戻ってくる。

jwm も入れてみたけれど 好みで今のところicewm.
jwmのほうが 2MBほど常駐メモリ少なそうだったり puppy のからみもあってカスタマイズの日本語情報は多そうだけれど、とりあえずは。

  • デフォルトinstall状態での見栄えは、icewm のほうがよさげ。(themeの選択肢も最初から多少あるし...結局デフォルトを選ぶのだけど)
  • テキストで設定ファイル弄るなら、xmlよりか普通のcfg系のほうが気が楽
  • IME関係とか wicd とかのタスクトレイに入るツールが、タスクトレイに入ってくれる(けど入ったり入らなかったり動作が不安定な面もあるけれど).
  • ウィンドウ左上アイコンのダブルクリックでウィンドウが閉じる

(jwm も設定いじればできる類かもしれないが未調査)

個人的には4つめの 左上アイコン・ダブルクリックでのcloseがツボだった。これ、win3.1時代(&以前)の窓閉方法なんだが、己は未だに使ってしまうことがあるため地味にありがたかったりする。MS って戦略的に大きな変更をたまにするけれど ものによっては"まだ維持してたの?!"とあきれるような細かい互換を維持し続けてたりするので... その類を他で実現されるとね。

icewm の環境設定として、/usr/share/icewm/ (ものによっては/etc/X11/icewm) より ~/.icewm へ preferences (や menu, toolbar 等)をコピー。
preferences で、描画を軽くするため OpaqueMove=0 OpaqueResize=0、マウスwheel有なら UseMouseWheel=1、network status の常時表示はいらないので TaskBarShowNetStatus=0 (CPU statusもイラないと思いつつ そちらは残す)。シャットダウン&再起動は

ShutdownCommand="sudo poweroff"
RebootCommand="sudo reboot"

予め sudoers でパスワード無しに設定しくことで、これですます(諦めた)。
menuやtoolbar 等の設定は他のソフトを入れたあとにでも好みで.

※ 色とかフォントは、theme 側の設定が使われるので preferences 側のを弄る意味無し。
※ ~/.icewm/ にコピーするとソレが優先して使われるので 弄るつもりのない定義ファイルはコピーしないほうが無難かもしれない。menu や toolbar は /etc/X11/icewm にあるものが実情に近そうで弄るならそちらのをベースにしたほうがよさそう。


基本的なソフトとして、ファイルマネージャとして rox, 軽量テキストエディタとしてleafpad、webブラウザとして iceweal,operaをインストール。

sudo apt-get install rox
sudo apt-get install leafpad
sudo apt-get install iceweasel

できればroxよりpcmanfmを使いたいところだけれどやはり重く。
rox は以前同様にワンクリックでなくダブルクリック動作に変更(roxのオプション設定で、ファイルウィンドウおよびピンボードの2箇所にある "シングルクリックで操作する" のチェックマークを外す)。デスクトップのアイコンをあまり使う奴じゃないのでその手の設定はせず。

エディタは素早い起動で高機能のものがあればだけど未調査。

webブラウザは firefox 常用なので iceweasel を一応入れたが激重。
opera をダウンロードしてインストール(dpkg -i opera_12.16.1860_i386.deb)してみると、iceweasel よりも 明らかに起動時間が短くて動作感もマシだったので、結局こちらを常用に。(iceweaselより軽いといってもツラい重さではあるので、少々 頁の見目が崩れても さらに軽い dillo か midori あたりを入れたほうがよさそう…に思うもやっぱ使わないか)


日本語入力としては 窓の憂鬱(mayu)との相性のこともあり fcitx で mozc を設定。

sudo apt-get install fcitx-mozc

anthy と mozc では変換効率とリソース負荷を天秤にかけて mozc を選択。
※ icewmとの相性?なのか fcitx,uim,ibus どれどもトレイ常駐関係がたまにおかしくなることがある(loginし直した時に多いかも?)。このへんは現状あきらめ。(scimはトレイに入らないのでかえって安定感あるような)

※ あと己はmayuでcapslock/EISU キーでダイアモンドカーソル出来るようにしているため、mozcの設定で EISU キーへの機能割り当ては全部削除したり、ことえりぽく muhenkanとhennkanでime off/onさせるように書き換えたりしてる。がこの辺は省略。(忘れそうなので Fcitx Config → Global Config → Hotkey → Activate input method に HENKANMODE, inactivate input Method に MUHENKAN を設定だけメモ)

slim

通常は起動時からguiを使うことにしたいので、 ログイン(desktop) manager として slim をインストール。

sudo apt-get install slim

/etc/slim.conf を弄り好みで設定を変更。

default_user    ユーザー名

ユーザー1人しかいないのだしデフォルトユーザー名を設定しておく。

sessions    default,icewm

sessions には実際にインストールしている wm だけに変更(選択肢文字列なだけで、選択しない限り関係ないけど、選択できてしまうのが面倒、と)

wm 切り替えることが早々無く自宅でしか使わないなら いっそ

auto_login yes

にして ユーザー名&password 入力無く起動出来るようにしとくのも手。

あと、ログイン画面の背景画を変えたい場合は

current_theme   my-theme

な感じで debian-joy の代わりに新規theme名をつける(debian-joy直接書きけるのでもよいだろうけど一応別にしておく)。
/usr/share/slim/themes/ ディレクトリ下で、debian-joy フォルダを my-theme フォルダにコピー。その中のbackground.pngを削除しておき、背景にしたい画像を background.png あるいは background.jpg で用意して掘り込む。
※ themeは既存でいくつかあるので 好みを選んで書き換えれば。


と runlevel 3 の場合は gui でなく cui(text)で起動したいので、slimを実行しないよう /etc/rc?.d への登録を変更する。
まず /etc/init.d/slim をエディタで開け

# Default-Start:   2 4 5
# Default-Stop:    0 1 3 6

のように該当行を書換(3をStartからStopへ移し)てセーブ。その後

sudo insserv -r slim
sudo insserv -v slim

を実行。


CUI専用環境での 日本語入力

GUI(X)を使わないCUI環境だけのdebian7インストールを(別途)行う場合は、fcitx に拘る必要ないので、uim-fep で 日本語入力を行えるようにできるだろう。

sudo apt-get install uim uim-anthy uim-fep

(ここでmozcでなくanthyなのは uim-fep試した時使ってたのがこれだった為)

CTRL-SPACE で fep o/off して変換おこなえるが、全角半角や変換・無変換等のキーは使えず別キーを使う必要がある。

コンソール環境では歴史的に新しめのキーやローカル(日本語)キーなんぞは仕様・ソフト的(ncursesやそれが参照するterminfo,termcap)に未対応のようなので仕方ないけれど...

逆に F13~F36(F63?) とか、実キーとしてはめったに無さそうなキーコードは存在してたりする。

ので、窓の憂鬱で、普通は使って無さそうなファンクションキーコードを流用して、例えば、全角半角キーなら F16、無変換なら F17、変換ならF18、かな ならF19、のようにキーコードを置換するようにし、日本語変換(エンジン)側のキー設定もそれに合わせて F16-F19を設定しておけば、コンソール環境でも日本語変換キーで変換が行えるようになるはず。(F16-F19で不都合ありそうなら番号ずらす)

.mayu の設定例として(漢字キー以外の変換無しの場合)

include "linux109.mayu"
keymap Global 
key Kanji = F16
key Muhenkan = F17
key Henkan = F18
key Hiragana = F19

(もし既存の .mayu に追加するなら Kanji,Muhenkan,Henkan,Hiraganaの4行を keymap Global の範疇に追記)

~/.uim で該当部分に

(define-key generic-on-key? '("F16" "ZENKAKUHANKAKU" "<Control> "))
(define-key generic-off-key? '("F16" "ZENKAKUHANKAKU" "<Control> "))

のように F16 を追記。

あと ~/uim.d/customs/ 下の *.scm 中の、"zenkaku-hankaku", "Muhenkan", "Henkan_Modo", "hiragana" のある定義に、日本語キーに対応する "F16","F17","F18","F19" を追記していけば大体意図通りになる

……ハズ、と思う。
(実際にはGUIあり環境下でいろいろ試してた時に ちょろっと設定して動かしたことがあるだけで、どの程度使い物になるかわかるほどには使っておらず。anthyでなくmozcの場合のキー設定はどうするのとか...)




2015-4-20[月] KEYEVENTF_EXTENDEDKEY

win で fltk のサンプルを動かしてるとキー入力全般で、拙作のキーバインディングソフトDiaKbdMouse経由でのカーソル移動がテンキー数字に化けてしまった。調べてみると fl_win32.cxx で WK_KEYUP/DOWN処理でlParamのbit24=拡張キーをみて、拡張キーじゃなかったら まさにそのようなキーが押されたようにする処理になっている。状況的に DiaKbdMouse側で設定足りてないせいだろうで ググれば まさにな頁発見。
みごとに KEYEVENTF_EXTENDEDKEY を設定していなかった。というか、キー種類みてKEYEVENTF_EXTENDEDKEY設定していたのを無くても動くやんで#if 0で省いてた...ダメだ>俺。てことで不精して全部にKEYEVENTF_EXTENDEDKEY付けた状態で対処。

しかし fltk でこんな処理をしてるってことはIBM拡張キーボードとは非互換かつ多少なりとも普及したテンキー付キーボードがあった?…ではなく、拡張キー扱いでない時の fltk でのキーコードは、単に (virtualでない) bios のキーコードと同じようなので、本来はそういう扱いをするものなんですかね。いままで KEYEVENTF_EXTENDEDKEY 付けてなくても困ってなかったから WK_KEYUP/DOWN処理で律儀にlParamのbit24見てるソフトは滅多にないと思うけれど... fltkなソフトを今まで使ってなかったとも言えるか。




2015-4-29[水] vs12 で openFramework をちょっと弄る

※追記:間抜けてました。以下は間違い、単にvs12指定してもvs11がinstallしてある環境だとそれが使われてただけの模様(新しいマシンに移行してvs12インストールしなかったらダメだった)

久しぶりに openFramework (のexample)をコンパイルしてみた。 ver0.8.4って vc12(Visual Studio 2013) に対応してたのですね。sln/vcxproj がvc11のものだから、てっきり以前の問題のあるままかと思ってしまってた。

一年程前にvc12で試した時(ver0.8.1|2前後?)は poco 等のc++系ライブラリの .lib のリンクでVCバージョンチェックに引っかかったり諸々エラー出て断念したのだけど(もちろんvc11はok) ... 0.8.4は vc11(2012)の sln/vcxproj をvc12で読み込んで実行できた。 (追記:vs11ないと駄目でした)

で、一つ一つsln開いてコンパイルするのは面倒なので、
  scripts/vs/setupCommandLine.cmd
をテキストエディタで修正、vs11向処理真似てvs12処理を追加すればいいけど、もっと安易に 110 を 120 に全置換するのでもok(当然vs11用処理がなくなる)。scripts/vsフォルダで

setupCommandLine.cmd 120 build both devenv

のように修正したバッチを実行すれば、ひと通りコンパイル出来る。

Drag&Drop example

oF では char文字列は概ね UTF8 扱いになっている。oFが利用しているライブラリの poco とか glfw とかが UTF8 で扱っいて それらに任せてる状態のようだけど。
ただUTF8未対応のライブラリも利用していて freeImage のファイル関係なんかがそれで、このため examples/utils/dragDropExample で、全角混じりのファイル名を drop したら壊れたファイル名になって画像が読み込めない。

正攻法で直すとするとファイル・アクセスはpoco系にまかせてオンメモリ状態のファイルから画像イメージを取り出す形にすればよいのだろうけど... freeImage には wchar_t*ファイル名のAPIも用意されてるので oF 側を修正するのがお手軽な感じ.

ofImage.cpp の template<typename PixelType> static bool loadImage 関数中の

    if(fif == FIF_UNKNOWN) {
        // or guess via filename
        fif = FreeImage_GetFIFFromFilename(fileName.c_str());
    }
    if((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsReading(fif)) {
        bmp = FreeImage_Load(fif, fileName.c_str(), 0);

        if (bmp != NULL){
            bLoaded = true;
        }
    }

#ifdef TARGET_WIN32
    extern std::wstring convertNarrowToWide( const std::string& as );
    if(fif == FIF_UNKNOWN) {
        // or guess via filename
        fif = FreeImage_GetFIFFromFilenameU(convertNarrowToWide(fileName).c_str());
    }
    if((fif != FIF_UNKNOWN) && FreeImage_FIFSupportsReading(fif)) {
        bmp = FreeImage_LoadU(fif, convertNarrowToWide(fileName).c_str(), 0);

        if (bmp != NULL){
            bLoaded = true;
        }
    }
#else
    略(前記元ソース)
#endif

な感じに修正.
(UTF8->UTF16 変換に convertNarrowToWide を使ったけれど、ヘッダに定義のなく多分static付け忘れかもしれない代物を流用するのはどうよ、とか、c++なのに 関数内でグローバル関数宣言するのどうよ、とか、あるけど とりあえず)

それと、winでのドラッグ&ドロップについては もう一つ問題があって、ドラッグされたファイルのパスのドライブレターが省かれてしまい同一ドライブ以外からのドラッグだとファイルが読めない状態になっている。

これは ofAppGLFWWindow.cpp の 関数 ofAppGLFWWindow::drop_cb の

    for(int i=0; i<(int)drag.files.size(); i++){
        drag.files[i] = Poco::URI(dropString[i]).getPath();
    }

の部分で Poco::URI(dropString[i]).getPath() が ドライブレターを取っ払ってしまうためで、とりあえず アルファベット1文字+':'で始まってたらローカルPC中のパスだろうとして

    for(int i=0; i<(int)drag.files.size(); i++){
#ifdef TARGET_WIN32
       if (isalpha(dropString[i][0]) && dropString[i][1] == ':') {
           drag.files[i] = dropString[i];
           continue;
       }
#endif
       drag.files[i] = Poco::URI(dropString[i]).getPath();
   }

な感じに修正することで 対処可能。

UTF-8 表示

char*はUTF-8だけれど、残念ながら表示については マルチバイト系全滅かもしれない。
ofDrawBitmapString関数 とか ofTrueTypeFont クラスとかの描画処理は char=1文字扱いの単純な処理での描画になっている。TTF処理では UTF-8 を Latin9な文字コードに変換しててハナっから CJKやる気無しな感じ。

元々 oF を vs12 で使いたかったのは(1年前 vs12購入した理由は)

#pragma execution_character_set("utf-8")

で幸せになれそうな気がしたためだけど、画面表示がこれじゃあ...

よく探してないので 別(addonとか)に あるかもしれないけれど。 お仕事でターゲット向けに作ってた文字列表示処理を思えば作れないものでもないだろうけれど。

正直 今は oF 以外に興味行ってるので、このへんで挫折です。




2015-7-5[日] 簡易類似画像判定のメモ

別件ググってて類似画検索のネタみかけて、だけど特定のモノを(綿密に)探すタイプで、どちらかというと大量のものを分類したいなあ...と、一応 以前 かなり簡易だけれど そういうものを作りかけて放置していたので それをネタに。

キッカケは忘れたけれど、以下のような近似画チェックを思いついて (でもこれは良くない例)

  1. 画像の全画素の輝度の平均と、画像を縦横2等分4分割した領域各々での輝度の平均を求め、各領域の平均と全体の平均を比べ、明るければ1 でなければ0 で4bitの値を作る.
  2. 4分割した各領域を対象に、先と同様に その領域の輝度平均と さらにそこを4分割した各領域の輝度平均を比較して 4bit *4エリアの16bitを得る.
  3. さらに同様に(16分割されてる)各領域を4分割して 4bit * 4*4エリア=64bitを得る.(場合によってはさらにもう一段階....)
  4. 広い順に上位に詰めて 4+16+64=84bit値を作り、その84bit値をキーにソートすればそこそこ同じ(類似)画像が近くに並ぶんじゃね?と(実際には輝度yだけじゃなく u,vも)

思いついた時はいいアイデアのような気がして作り始めたけれど多少面倒くさくて、実はもう似たようなものがあるかも、とググれば案の定、もっとシンプルで良いものがあった。

こちら等 で 紹介されてる Avarage Hash 法.

  • 画像を縦横8等分64分割し、分割された各領域の輝度の平均と、画像全体の輝度の平均と比べ、明るいか等しければ1、暗ければ 0で 64bit の値(ビットパターン)を得る。

画像を8x8サイズに縮小して上記のような64bit整数値(ビットパターン)を得るだけ。再帰する必要なんてなかった。
今どきの64bitCPUだと すこぶる低コストで画像同士の比較ができる。32bitCPUでも64を 32bit値 2つに分けて処理できる類なので かなり軽い。

(以下ビット演算慣れした人には釈迦に説法の類だけど)

画像 a と画像 b の 上記明暗の64ビットパターンを a.ptn と b.ptn とすると、排他的論理和(xor)を用いて

 uint64_t d_ptn = a.ptn ^ b.ptn;

のようにして差異のビットパターン d_ptn を得られる。xorの結果は違う部分のビットが1になっているので、d_ptn 中の 1 になってるbit数が少ないほど 類似している(可能性が高い)ということになる。

64bit値中の1のビットの数を数えるのは、今どきの64bit CPUだと、

 __popcnt64 (VC) や __builtin_popcountll (GCC)

でコンパイラがネイティブなマシンコードにインライン展開してくれたりする。
そういうネイティブのがなくてもこちらで紹介されてるpopcount(numofbits5) 処理で

unsigned popcnt64(uint64_t bits) {
   bits = (bits & 0x5555555555555555UL) + ((bits >> 1) & 0x5555555555555555UL);
   bits = (bits & 0x3333333333333333UL) + ((bits >> 2) & 0x3333333333333333UL);
   bits = (bits & 0x0f0f0f0f0f0f0f0fUL) + ((bits >> 4) & 0x0f0f0f0f0f0f0f0fUL);
   bits = (bits & 0x00ff00ff00ff00ffUL) + ((bits >> 8) & 0x00ff00ff00ff00ffUL);
   bits = (bits & 0x0000ffff0000ffffUL) + ((bits >> 16) & 0x0000ffff0000ffffUL);
   return (unsigned)(bits) + (unsigned)(bits >> 32);
}

な感じで結構高速に求められる。
ので 2枚の絵の類似判定の雰囲気は (a.ptn, b.ptn は画像ロード時に予め作成してるとして)

if (popcnt64(a.ptn ^ b.ptn) <= 類似とみなす差異ビット数)
    類似画像の処理
else
    別画像の処理

1回当たりのチェックがこれだけ低コストならば、数千(万)程度の画像数なら、総当りチェックしても 割りと実用的な(ガマンできそうな)速度になりそうで、試してみるとそこそこいい感じだった。

総当りして、違いが少ないもの同士をリンクしておいて、後でリンクされたグループ内で調整して並べなおして... 等ちょっとめんどくさいけれど。

※ 実のところ 総当りチェックせず単純にビットパターンでソートだけでも 結構よかったりする。同一とみなしたもの(8x8縮小画同士の差が0)が連続するだけでなく、画像の上のほうが一緒で違いが下のほうにしかない場合なんかも近くに並ぶので…… もちろん上側が違って下側が似てる場合などは離れてしまっているのだけど。
(※左上から右下へ横縦繰返でスキャンして64ビットを作ってる場合)

で、どの程度を近似とみなすか、が面倒、てか肝。 同一判定なら Average Hash 法の説明で書かれている7%ほど(64点だと 4,5個)でよいかもだろうけど、も少し増やすと同一ではないけどちょっと違う類似画像もひっかかりやすくなって....

それなりな結果が出てると欲が出てきてしまうもので、類似判定の精度上げるために、さらに以下のようなチェック等追加

  1. 画像のアスペクト比がある程度以上違えば別画像
  2. (以下、先にチェックした8x8ビットパターンのうち 違うと判定したビット以外の部分をさらにチェックする形で)
  3. yuvの y(輝度)だけでなく u, v についても8x8で同様にチェック
  4. u,vのビットパターンが オール1の時はモノクロ化画像なので考慮
  5. 輝度について 明るい部分のみ・暗い部分のみをそれぞれの輝度平均を用いて明暗ビットパターンを作ってチェック
  6. 輝度16x16ビットパターンも補助的に利用.
  7. ビットパターンの違いが少なくも多くもない微妙な場合は、(ビット化する前の)輝度ピクセル同士の差もチェック

等等 ごちゃごちゃ追加して 判定 重くなってくるわけですが。(の わりにはまだまだ誤判定有)

ちなみに 16x16パターンについては、同一画の判定としては8x8より精度よさそうだけど、類似物を集めるという面ではシビアになりすぎるのか分が悪い感じだった。ので補助的に利用。速度を思えば無しのほうがよさげだけど、この判定でマシになるケースもあるし、で。逆に4x4は荒すぎて結局8x8の判定便りになるぽいから あまり意味なく(でも最初にざっくりとしたソートするのに使ったかも)
※ そもそも8x8(16x16)縮小画での比較なので、近似/類似でなく ちゃんと同一を判定するのは困難なんだけども

こういう判定は面白いけれど難しい。いろいろサンプル食わして それなりな線を目指すのだけどサンプル違うとガラッと誤判定多かったりね、手間の割には精度よくならないわな。根本的に簡易なので、もっとよくしたいなら別のアルゴリズムにする/を併用する、ほうがよさそう。けどググって出てくる本格的な類似画判定のアルゴリズムは速度を思うと……(だし、そこまで気合入れて類似画分類処理を作りたいわけでもなく)


お試しプログラム

と、ま、以前 試しに作ってみてたコマンドライン・ツールは これ
win64用とwin32用 の exe のみ。
※追記2016-08-25: ソース同梱のzipに差し替えました。

指定したjpegファイル群を調べて、類似のあったファイル名だけ表示したり、全ファイルを類似情報を元に名前付けて copy や move するバッチ生成したり、類似順にファイルの日付を付直したり出来ます。
※いまどきの類似画検索/分類ツール使ったことないので使い物になるかは知らない


変換例。左or上がソース、右or下が類似並替結果。フォルダのキャプチャは縦横50%縮小してわかりにくいけれど、変換結果はバッチ出力して、名前付け替えてのコピー。

c

c


※画像は 株式会社ブリリアントサービスのフリー素材 (タイトル:ジュエルセイバーFREE URL:http://www.jewel-s.jp/) のものを使用。 jewel-s-free100j より適当に13枚を選んでα無 jpg画像にし類似画像の順番がバラけるよう適当に変名した。また うち1枚を、拡大、モノクロ化、文字書込、したものも追加。(ruig-smp.zip)


処理速度については、i7-3770(3.4GHz) mem32GB の win8.1x64 マシンで、適当に寄せ集めたjpeg画像自分で撮った写真や net で拾ったイラストや写真等)を HDD(3TB)に置いて win64用exeで試したところ、

画像10286 ファイル
内 類似画2473 ファイル
file読込27.9 秒
jpeg展開53.6 秒
並替準備5.1 秒
並替1.8 秒

と いう感じだった。
(続けざまに同じ変換をするとosのファイルキャッシュが効いて2回目のファイル読込2.2秒ほど)

並替準備――画像縮小してソート・キーになるビットパターン生成等――はちょい負荷あるが、 並替自体は 許容できそうな範囲(ただ類似画の量が多いともっと増える)、 主にjpg展開+ファイル読込に時間がかかっている模様。

jpg 展開は libjpeg-turbo を用いて、また、ある程度巨大画像については サムネール機能利用して処理短縮を図っているけどこの時間。(jpg は8x8ピクセルのブロック単位で扱う工程があって最後まできっちり展開せず処理端折って縦横8分の1(1/64縮小)の荒い画像を得ることができる。ただ王道な縮小と誤差はあるので、その誤差も無視できる程度に1/64画像が大きい――比較用8x8画よりも2桁ほど広い――場合のみ利用) (※libjpeg側のサムネール取得関数は1/8とは限ってないので も少し工夫あるのかもしれない)

単純に1スレッドでファイルごとに読込→展開→並替準備をシーケンシャルに繰り返し処理してるので、そのへん並列化できれば少しはマシになりそうな気はする。(劇的には無理だろうけど。ただ画像ビュワー等で自前でサムネール生成保存するような場合なら一緒に類似ソート・キーも保存しておけば そこそこ使えそうな手段な気もする)

あ、と、実際にソート結果を反映したrename(move)したりcopyしたりは生成したバッチで行うので それなりに時間かかります。




2015-7-18[土] n3150b-itx

Asrock n3150b-itx、IDEやFDDは無いけれど背面に プリンタ・ポートやら 232cポートやらがあって微妙にレガシー用途が想定されてるぽいのだけれど、組立ててみると今どきのM/Bでは当たり前?な4(or 8)ピン電源(atx12v)コネクタが盤上になかった。まあCPUの消費電力思えば無しでも当然か……
で、電力食いなグラボとかも無いので 24ピン・コネクタのほうも 4ピン外して 20ピンにしても当然、起動。ぉ

コレ、pen4より前の、かなり古い(十数年前の)メーカー製パソコンのMB置換にも使えるかも。
M/Bは一見普通なのに匣や電源周りの形状が特殊な奴とかね。試してないけど。

※ 古い atom M/B(D945gclf) は 4pin(12v)つなげないとダメだったけど、n3150 の前世代atom(j1900とか) はどうだったんだろ……ググって見つかるMB見る限り基本4pin無しのよう。こっちでもいいのか。

もっとも IDEやFDD接続無いしフロントパネルの類とかの接続も工夫か諦めが必要だし なにより古い電源は爆音ぎみなので、コストかけて苦労我慢してまで使えるマシンに復活させたい愛着ある古パソは……早々ないワナ。 (爆音回避でACアダプタ電源にでも取替えられるなら そもそもこのMBでなくてもよく)


と、今回 n3150b-itx は win8.1 機になった(たぶんwin10機になる予定)。
元々 家鯖(ubuntu)の置換目的で買ったのだけどこちら の記事での評価が気になったこともあり、 winを仮インストールして1時間程いじってたらいつの間にかアクティベートしてたという…… wan側つなげたまま lan内ファイル転送試したのが敗因だな。 まあ実質 常起動になってしまってた電気食いのwin機を置換させたい気もあったので結果オーライ。




2015-8-13[木] 中古 zx2000 に linux インストール

(遅延書込8/16. 実作業は先月)

先月 amazon で 3万円台だったのでつい 中古の HP zx2000(itanium2 workstation. メモリ1GB) を購入。osとかは無しだけど debian か何かlinuxは対応してるだろう、と到着してから探してみれば debian8 では丁度 IA64 はサポート打ち切られてたという... 他を探してみれば gentoo で新しめのisoイメージあったけれどその他は対応なかったり対応していても結構古そうだったりと面倒そう(NetBSDもFreeBSDもIA64はイマイチ)。

とりあえず debian7.8 と gentoo の CD image 焼いて試してみたところ、どちらも CD 起動途中でbeep音鳴らしてシステムLED赤に変えてリブート... ひょっとして zx2000 対応してないのか? (ちなみに dvdドライブついてたので最初dvdで試したが起動対象にもならなかった)

ググってみれば海外サイトで同じ症状の件がいくつか質問に上がっていた。どうも debian の場合 sarge(debian3.1) では動いてたようで etch(debian4) 以後ダメになったような(IDEドライバ?か何かぽい)話。 ただ、sarge から dist-upgrade してetchへの移行はできるようなので、 それを試してみて...

いろいろハマったが 結論をいえば sarge からupgradeしていかずとも debian 6(squeeze) を直接 CDでインストールすれば とりあえず動いた。(sargeからupgradeしていくと lenny(debian5) までは無問題だけど 5 から 6 への upgrade が困難、てかうまく行かなかった)

ただ debian 6 でも gnome 入れて立ち上げ、そこから logout した時に beep音&LED赤状態になってしまったので、コマンドラインのみにした状態。(ハングがなくても gnome環境すごく遅かったのでコマンドラインのみにしてただろうけど)

まあ予定の範囲の結果なんでよかったかな、と。(うるさいし邪魔なので当面 物置部屋のオブジェだけど...)


ちなみにgentoo のほうも古めの cd imageを用いたら beep&reboot なくプロンプトまでこぎつけた。(2007 年版(install-ia64-minimal-2007.0.iso))
ただ hdd (/dev/sd?) が見当たらず...で挫折。
(debian と違って gentoo はマトモに使ったことないので面倒でもあり)




2015-8-14[金] USL-5P で debian

ちょっと前にamazonで中古 USL-5P 入手。IO-DATAのUSB-HDD別付のNASで、 SH4 でメモリ64MB の linux 機器。2004~2010年くらいまで売られていた模様。

debian 化が流行ってたのは 2004-7年付近なんでしょうかね? 玄箱の流行りの頃でもあり、当時 玄箱HGユーザーだった身としては SH4に惹かれつつUSB経由でしかHDD繋げられないから遅そう(メモリ64MBしかないし)と思って今一歩な気分だったのだけど、今回は NASとして使う気無しなこともあり、HDDない分 玄箱より断然小さくて白い箱は 今なら Raspberry Pi とかに近い気分。比較するとちょう2つ分くらい。なかなか かわいいヤツです。

USL-5Pの debian 化のページはググれば わりと見つかるけれど、 たぶん LANDISKで漕ぎいでな~♪ の方が用意されたモノを使っている人が多いみたいなので、お手軽にそれを使わせていただきます。
さすがに今現在現役でサポートされてる状態ではなさそで、最終は etch なのかな。(まあSH4が debian で正式に対応されてるものじゃなし... と lennyやらsqueezeやらsidやらの対応をされててる方もおられる模様...己には難度高めそうなので そこまでは手を出せず)

基本的に こちら の方の手順でできた。もちろん他の方々の頁も参考。

てことで焼き直しだけれど、以下 自分用の作業メモ(実際に作業したのは数週間前)

家内lanでのみの ssh(telenet)接続しての ちょっとしたSH4お試し環境としての利用なので、(ファイル/web)サーバー立てたりとかはしないです。

debian(etch) インストール

CF(ディスク) の扱いを楽したいので そのへんは linux(mint) 機で作業。(webブラウザや telnet 接続は win機 使用)

  • まずUSL-5Pが普通に動くか確認、IPアドレスを控える。
  • USL-5Pを終了させて、USL-5P のガワを外して中の CFカードを取り出す。
    蓋の開け方は こちらの図解が有りがたかった。
  • linux(pc)機 で CFカードのイメージ作成. USL-5PのCFをCDリーダーに刺して linux でのドライブ名確認(ここでは/dev/sdb)。自動mountしたならumountしてから
     $ sudo dd if=/dev/sdb of=usl-5p-cf-image.img
    でイメージ作成。サイズは64か128MBらしい(うちのCFは128MBだった. 使われてるのは64MB分)
  • 元のCFカードを抜き、新しく用意した CFカードをlinux機につなげる。
    今回用意したCFは32GB。
     $ sudo dd if=usl-5p-cf-image.img of=/dev/sdb
    でイメージ書き込む。
  • 新しい CF を抜き、USL-5Pにセットして起動、ちゃんと動作するか確認する。
    ※作業的には他の作業準備もすませてからのほうが手間は少ないけれど、相性問題とかホントに32GBの使えるかわからなかったので先に確認した
  • USL-5Pを telnet対応版の ファームに更新する。
    このあたり等 から usl5p-telnetd-update.tgzをダウンロードして update.tgz に変名しておいて、管理者のwebページ経由でファーム更新。
  • 再起動したら 管理者で入って ユーザー追加.(user:landisk, pw:landisk)
  • telnetクライアントで USL-5Pに(名前でアクセスできなければ最初に控えたipアドレスで) 作ったばかりのユーザーでlogin してみる。
  • 大丈夫ならマシン終了して、CFカード抜いて、linux側につなげる。(自動mountされたらumountしとく)
  • gparted 等で未使用領域を (ここではCFが /dev/sdb として)
     /sdb2 を swap用(サイズ128MBくらい)
     /sdb3 を ext3 (残り全部)
    くらいにパーティショニング&フォーマット.
    インストールしようとしている環境が sda2:swap, sda3:ext3 前提なので気をつける。考えずに sda2:ext3 sda3:swap なんて逆にしてると後で苦労する(した)
  • sdb1,sdb3 をマウントする. 面倒なので自分のホーム当たりで hd1 hd3 をmkdirしといて
     $ mount /dev/sdb1 ~/hd1
     $ mount /dev/sdb3 ~/hd3
  • linux(pc)機にて このへん より、最新(最終)の base26-sh4-20070709-etch.tgz, landisk-tools-20070612.tgz をダウンロード、ホームに置く。
  • ~/hd3 をカレントにして
     $ sudo tar xvzf ~/base26-sh4-20070709-etch.tgz
    で解凍、debian26/ の全ての中身を ~/hd3直下に移動して、空になった debian26/フォルダを削除.
  • ~/hd3 をカレントで
     $ sudo tar xvzf ~/landisk-tools-20070612.tgz
    で解凍。
  • ネットワーク関係の修正。~/hd3/etc/ にある hostname, hosts, hosts.allow, network/interface, resolv.conf や ~/hd3/boot/ にある bootld.conf で、
     名前が landisk
     アドレスが 192.168.1., 192.168.1.80
    になっているあたりを自分の環境に合わせて修正。(必要に応じてその他も)
  • reiserfsでなくext3にしているなら ~/hd3/etc/fstab 中を ext3 に修正.
  • ※ もし、hdb2 を ext3, hdb3 を swap にしていたのなら、etc/ や boot/ で sda3 やhda3 を grep して修正( ~/hd3/etc/のlilo.conf, fstab, ~/hd3/boot の bootld.conf, kernelsw.conf あたり)
  • /etc/apt/sources.list を修正. debianサイトでは etch はarchiveに移動になっていたり、sh4(landisk)向けサイトも変化してたりなので
    deb http://iohack.osdn.jp/kogiidena/debian26/binary-sh4-etch/ ./
    deb-src http://ftp.riken.jp/Linux/debian/debian-archive/debian etch main non-free contrib
    に変更.(riken.jpとしてるところは 自分家から近いサーバーを選ぶ)
  • ~/hd3/boot の中身を ~/hd1/boot へ上書きコピー.
  • ~/hd3/etc/lilo.conf を ~/hd1/etc/lilo.conf に上書きコピー.
  • /dev/sdb1, /dev/sdb3 を umount して CF カードを linux(pc)機より抜く。用済みの ~/hd1 ~/hd3 ディレクトリは削除.
  • usl-5pにCFカード装着、起動、telnet で 再度ログイン.
    /sbin/lilo を実行、エラーがなければ再起動.
  • 自分で設定した 新しい固定アドレスを使って telnet でログインできれば ok.

あとは諸々install&設定していく。
自分用user作って ユーザー landisk は削除、 sudo やら ssh やら locale やら rsync やら gcc,g++,make,libncurses5-dev 等等 apt-get install して... fdclone とか ne とかコンパイルしたり ... ああ さすがにコンパイルはおそいわな。




2015-8-15[土] WinCE機で NetBSD6.5

MIPS系(x86系以外)CPUでの linux/unix環境ほしくて 中古でWinCE 機の Movile Gear II (MC-R730 と sigmarion初代)を入手してのを、やっとこさOS入れてみた。MC-R730 は CF と PCMCIA スロットあり、sigmarion は CF 一つなので基本的に MC-R730 を対象。

ググってみると WinCE 機の場合 linuxはかなり古いモノしかなさそうで、ただし NetBSD は今でも一応サポートされているようなので、これをお試し。

ググって見つかる各種サイトを参考に... 本家サイトでは

今となってはかなりメモリ少ないし(32MB)、GUIはハナッから あきらめ(そもそもインストーラで X 関係は None 扱いになってた)。

正直、linux以上に 知らないosなんで苦労多そう…てか躓きまくってる。WinCE側の事情がよくわかってないせいもあるけれど。


WinCE機では、WinCE環境で アプリ hpcboot.exe (かpbsdboot.exe) を実行し、そこから WinCEのRAM状態ぶっ壊して NetBSD を boot するようになっている。 (元dosモバ・ユーザー的には覚えのある手順)

WinCE環境をぶっ壊すので起動のたびにWinCE初期セッティングを要求される… が、公式をみれば SHIFT+Powerで初期セッティング飛ばせるとのことで そんなにひどくはなかった(多少煩わしいけれど)。

※ SHIFT+Powerてより 初期設定開始前からSHIFTが押されてないと駄目な感じ

また、すべての機種ではないけれど、CFから自動実行する仕組みがある場合もあるようで、運がよければ手間は省けるよう... だが、このへんは、ヒントにある方法で設定を幾つか試しても自動起動ならず...うまくいってません (公式の 対応機種表の boot の欄で *3 ついてるヤツが use hpcboot.exe となってるので、逆に他のYになってるのは自動起動可能なのかなと思ったのだけど…そうではないのか…)

iso ダウンロード

7.0はrc2とかrc3のようなので とりあえず 6.1.5 を試す。

ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-6.1.5/iso/

より取ってくるWinCE機用のisoファイルは、netbsd-?.?.?-hpc???.iso なヤツ。
WinCE機は ハンドヘルド・パーソナル・コンピュータってことで hpc が略称らしく、それに cpuアーキテクチャ名(arm,sh,mips)が付く

Mips機なので NetBSD-6.1.5-hpcmips.iso を取ってくる.

インストーラでインストール

配布されている iso イメージは、他機種と共通だったり移植当初の状況もあってか、CD(SCSI)から ディスク(CF)へのinstallを想定されている感じ。CDでなくても、2ドライブ構成が前提のよう。

ただWinCE機の場合は Boot セクタ不要(利用できず)で逆に DOS(FAT)パーティション必須なので、予めCF上に DOS(FAT)パーティションを切っておき、そこに install 元イメージを配置すれば 1ドライブ構成でも install できそう... てか出来た。

※ MC-R730 は2ドライブなので当初それでインストールしてたのだけど、手持ちのCF PCMCIAアダプタのせいか PCMCIA 側が不調でデカいtgzの展開でエラー多発だったので、1ドライブ・インストールに切り替えた

Windows機で作業する場合、win標準の"ディスクの管理"では CF(フラッシュメモリ)に対しパーティションを切れないので

  1. リムーバブルメディアにパーティションを切れるサードパーティ製のツールを使う
  2. Linux機があれば そちらの環境で gparted か何かでパーティションをきる
  3. NetBSD インストーラを用いて、初回はパーティションを切るためだけに使い、2回目に本体のインストールを行う

いづれかの方法を取る必要がある。

ここでは 3番目の方法でパーティションをきってみる。

なお今回 16GBのCFを用い、 MSDOS(FAT)領域 1GB、NetBSD 残り全部、のように割り当ててる。

※mc-r730 基準で書いたけど、結局不安定で実際は sigmarion でほぼinstall, lan関係からをmc-r730で作業した... というふうにインストールしたCFは、MIPS で kern-GENERIC 使うなら他の機種でも動く模様。WinCE側の hpcboot(pbsdboot)で適切に機種を設定する必要はあるけれど、netBsd環境自体に機種固有の設定は(あまり)なさげにみえる。といっても MC-R730 と Sigmarion初代 というどちらも Mobile Gear II な機種でしか試してないので他は未確認。

パーティション分けのためのインストーラ実行

(他の方法でパーティション分済ならこの作業は不要)

Win機で install 先 CF (16GB) を FAT フォーマット、unetbootin でダンロードした isoイメージ書込む。

※ isoイメージ書込めるならツールはなんなり。Win8 以降なら 標準でisoイメージ・マウントしてファイルとりだせるので初回パーティション切だけならこの方法で installationフォルダをCFにコピーするのも可。ただし、マウントしてファイル取り出すとファイル名が 大文字化されてしまうようで、本番のinstallでは不都合(ファイル見つからないエラー)なため、なんらかのiso書込ツールは必要。

WinCE機にそのCFを挿して、
ハンドヘルドPC アイコンを開けて
"メモリ カード 2" (1ドライブ機だと "メモリ カード") を開けて
"installation" フォルダ開けて
hpcboot.exe を実行。

入力欄にインストーラのディレクトリとファイル名を設定。

ディレクトリは

  • \メモリ カード2\installation\
    最後の \ は必須(ないとファイル見つからない).
  • ファイル名は
    netbsd.gz (デフォルトまま)
  • 機種名として
    NEC MC-R730 選択(今使ってるWinCE機の名前)

とりあえず他は変更せず、boot ボタンを押す。
プログレスバーが伸びていって途中で

Data in memory well be lost.Are you sure?
オンメモリなWinCE環境ぶっ壊すぞと聞かれるので Yes

No symbol and/or string table in binary.(no fatal)
気にせずOK

Push YES to boot.
"はい(Y)" 選んで コンソールなboot画面に突入。

テキストなメニューが出るので、

Installation messages in English を選択.(英語以上に他の言語わからんので)

install NetBSD to hard disk を選択.

minimam install を選択.(どうせ途中抜けなのでどれでもいいはず)

※ここで exit して sh に降りて fdisk でパーティション切るほうが実は早い...が自信なかったので そのまま続行.

hdd なパラメータ2つ(63,255)聞かれるけど、Enter 2回押してデフォルトですます。

MBR ・・・を選択。
WinCE機はDOSパーティション必須のはずだけど、このへん、WinCE機用にデフォルト設定が用意されてるようでないので(PC用と共通動作?)、 自分でDOSパーティションの指定をする。

2ドライブ構成だと、DOSパーティションは hpcboot.exe(pbsdboot.exe)を置くための少量でいいけれど、今回は install元cdイメージを書き込めるサイズは必要だし、ファイルやりとりに使うかもで、16GBあるからざっくり1GBほどを設定。

a: start 1MB: size 1024MB MSDOS
b: start 1025MB: size 残り全部 NetBSD
c: unused
d: unused

NetBSD のパーティションは設定しないとインストール継続できないのでそれも指定。
(この段階で、セクタ単位による DOS側の開始位置&サイズを控えても吉)。
x: 行でenterして次へ。

今回はパーティション分だけなんで、b: のデフォルト選び、その次も x:のデフォルト選んで

Please enter aname for your NetBSD disk[CF Card ]:
あとで付け直すことにして、ここではデフォルトのままenter.

yes or no で yes を選ぶと、パーティション分け&フォーマット開始。数回 continue待ちキー入力あり。

※ 正直、この段階での NetBSD側フォーマットは無駄だけど...自力fdisk回避したツケなんであきらめ。

インストール元の指定のメニューが出てきたら、ここで初回は終了、WinCE機電源off&CF抜く.

Win機にCFを指す。
一見正常そうにフォルダ開くかもしれないけれど、実際はぶっ壊れているので とっとと(quick)フォーマット、1GBになってたらOK。
(ええ試して駄目でした. DOSパーティションを縮小させるような器用なことはやってくれてません。ちなみに、NetBSD側で start位置をデフォルト以外のサイズ(2MBとか)にしていると開始位置も壊れてるので とっととフォーマットを即される状態)

本番インストール

CFのパーティション分が出来たら、本番インストール。

CFのフォーマット済のMSDOS領域に isoイメージを unetbootinで書き込み。

※ ツールは何でもいいけど、Win8のisoマウント経由だとファイル名が大文字化されてしまって不都合あるので、そのへんが大丈夫なツールを使う。

WinCE機にそのCFを挿して、
ハンドヘルドPC アイコンを開けて
"メモリ カード 2" を開けて
"installation" フォルダ開けて
hpcboot.exe を実行。
※ 1ドライブの Sigmarion だと 2なしの "メモリ カード"。以後も同様に機種によって読み替えて。

入力欄にインストーラのディレクトリとファイル名を設定。

ディレクトリは

  • \メモリ カード2\installation\
    最後の \ は必須. ないとファイル見つからない.
  • ファイル名は
    netbsd.gz (デフォルトまま)
  • 機種名として
    NEC MC-R730 選択(今使ってるWinCE機の名前)

とりあえず他は変更せず、boot ボタンを押す。
プログレスバーが伸びていって途中で

Data in memory well be lost.Are you sure?
オンメモリなWinCE環境ぶっ壊すぞと聞かれるので Yes
(Optionで "Safety Message" をoffにすればでなくなる)

No symbol and/or string table in binary.(no fatal)
気にせずOK
(Optionで "Safety Message" をoffにすればでなくなる)

Push YES to boot.
"はい(Y)" 選んで コンソールなboot画面に突入。 (Optionで "Pause Before Boot" をoffにすればでなくなる)

テキストなメニューが出るので、

Installation messages in English を選択.(英語以上に他の言語わからんので)

install NetBSD to hard disk を選択.

yes or no は yes を選択.

対象CFに間違いなけりゃ Hit enter to continue でキー入力.

minimam install か custom install を選択. custom の時は必要な物をマーク

※どうも うちのMC-R730はが不調なのかうまく展開できないことが多く... sigmarion だとそこそこ正常に展開できるけど comp.tgzなんかだとエラーでることもあるので、この段階では minimam install してひと通りすんだ後、後で手動で tgz 展開する手を使った。

hdd なパラメータ2つ(sectors[63],heads[255])聞かれるけど、Enter 2回押してデフォルトですます。

Edit the MBR partition table を選択。

a: start 1MB: size 1024MB MSDOS
b: start 1025MB: size 残り全部 NetBSD
c: unused
d: unused

b: の NetBSD を選んで active と install を Yes にする。

e:でセクター表示に切り替えて、MSDOS領域の開始セクタとサイズをメモする。( 開始2048セクタ 、サイズ 2097152セクタ)。

x: 欄でenterして次へ。

a: Set size of NetBSD partitions
b: Use existing partition sizes

は b (かaでデフォルトのままか、わかってる人なら都合で変更で)

で、その次の一覧では

a: ... FFSv1
b: ... swap
c: ... NetBSD partition
d: ... Whole disk
e: 空欄

となってる. NetBSD側でFAT領域アクセス出来るように e: の空欄を

MSDOS
start 2048セクタ    (4MB)
size  2097152セクタ (1023MB)

な感じに 先のMSDOSパーティション設定と同じセクタ数を記入する.
シリンダ境界が考慮されてるのかMB単位で指定するとfdisk側と同じ値にならなかったりするので注意... ええ、やってしまった。後でsh上で fdisk でサイズ表示確認して、その値を disklabel -e /dev/wd0 で編集して修正も可(viは苦手だ)

Please enter aname for your NetBSD disk[CF Card ]: MyNetBSD
ディスクに名前をつける。自分のだとわかるようにつけたほうがいいらしいけど、ここでは適当に MyNetBSD.

これで準備okなら yes or no 確認で yes 後、partition きったり format したりが行われる。途中 Hit enter to continue で確認待ちになるので 入力して継続。

Install from メニュー

Install from メニューに来たら、
 f: Unmounted fs
を選択。

Device: wd0e
File system   msdos
Base directory  (空欄)
Binary set directory  /binary/sets
Source set directory  /source/sets (元のまま)

に書き換える。(デフォルト設定は全然 WinCE実機向けじゃないわな)

※ ちなみにインストール元 pcmcia、インストール先 CF の2ドライブ構成でインストール試した時は、Device として wd1e を指定した。

※ 正直 Device 名がなかなかわからず困った。NetBSD(てかunix由来?)のお作法しらないので...インストール中のメッセージ等から wd とか rwd とかなんだろうけど(wd?とrwd?の関係がよくわかんね)、wd0,wd1がlinuxでのhda(sda),hdb(sdb),wd0aがhda1みたいだけど末のa,bが連番じゃなさそう... FreeBSDのだけどこのへんみると a,b,はルールがあるようで...

x:で続けると tgzファイルの展開や MAKEDEV all が行われ途中continue待ち入力有)、うまくいくと 次の Configure Menu が出る。

※ ここでエラーで Configure Menu まで辿りつけない場合は 手動でのファイルinstall を試みる(後述)

Install from メニューから先に進めない時の手動インストール

Install from メニューから先に進めない場合は、Exit Install System で抜けて sh に降りて手動で tgz 展開をしてみることにする. (うまく行ってたらここ不要)

こちら(hpcmipsみたいな環境でインストーラを使わずにNetBSDをインストールする)を大いに参考... てか 最初からこれに従ったほうがよいかも。

マウント&カレント変更

mount -t ffs /dev/wd0a /targetroot
mount -t msdos /dev/wd0e /mnt2
cd /targetroot

この段階のshは 人の入力考慮してくれてないので 上下キーによる履歴はおろか左右キーによるカーソル移動も出来ないので慎重に入力.

tgz 展開

tar xzfp /mnt2/binary/sets/kern-GENERIC.tgz
tar xzfp /mnt2/binary/sets/modules.tgz
tar xzfp /mnt2/binary/sets/base.tgz
tar xzfp /mnt2/binary/sets/etc.tgz
tar xzfp /mnt2/binary/sets/misc.tgz
tar xzfp /mnt2/binary/sets/text.tgz
tar xzfp /mnt2/binary/sets/man.tgz
tar xzfp /mnt2/binary/sets/comp.tgz

ログ出力無のほうがよいという話もありそ?だけど どちらでもエラーなる時は頻繁になった。一つのtar実行でファイル出力が終了するまで(hddアクセスランプが無明になるまで) 次のtarを実行しないほうがよさげ?なのかな。あと tar する都度 exit してメニュー戻って すぐ終了(Exit Install System)で sh に戻って、をしてたらマシな気がする...が exitした時点でおかしくなることもあり日によって状況違うので単にハード不安定が濃厚.

※ segmentation fault 等で進行不能なって再起動した場合は fsck -y /dev/wd0a でディスクチェック。


tgz 展開できたら

cd /targetroot/dev
./MAKEDEV all

する.

(この段階で fstab, rc.conf も編集しとくのも手かも)

umount /targetroot
umount /mnt2
exit

してインストーラのメニューに戻り、Configure Menu を選択。

Configure Menu

Configure Menu では

  • a: は network 関係.
    • PCMCIAのLanカードを挿す。己が使ったのは 古い10baseTな ne2000 互換のモノ。
    • 認識ログが出終わったところで、a:を選択
    • [ne0] デフォルトのまま
    • [manual] まま
    • DHCP  用途・環境次第。今回のは DHCP noで。
    • Domain  環境次第。わかんなかったらとりあえず空欄。
    • host name  環境に合わせて名付ける。(maba2 とか)
    • IPv4 number  環境に合わせて決める( 192.168.0.100 とか )
    • IPv4 Netmask  環境次第(0xffffff00 デフォルトまま)
    • IPv4 gateway  環境次第(192.168.0.1 とか)
    • IPv4 name server  環境次第(192.168.0.1 とか)
    • IPv6  環境次第(no で)
    • OKでよけりゃ Yes
    • continue待ちは入力して
    • /etc への設定は yesで
  • b: の timezone関係は asia 選んで asia/Tokyo 選んで enter 押して。
  • c: の シェルは好みで.( /bin/sh )
  • d: で root パスワードを設定。
  • g: で sshd を有効にするなら yes ... あとまわしするなら no.
  • ntpdに時間合わせ任せるなら h: で ntpd 有効(yes)にして、i: で boot 時に ntpd 開始するよう yes に ...
    だけど起動時にそもそも lanカードさせてるか怪しいので NO で.
  • (他も必要に応じて設定した後) x: Finished configuring で終了.

戻ってきたメニューで 終了を選択して sh に降りる。

対象パーティションをマウントする

mount -t ffs /dev/wd0a /targetroot
mount -t msdos /dev/wd0e /mnt2

この段階のshは 人の入力考慮してくれてないのでタブキー補完や上下キーによる履歴はおろか左右キーによるカーソル移動も出来ないので慎重に入力.

カレント移動して

cd /targetroot/etc

fstab を編集. (vi しかないのか...)
msdos(/wd0e)の行頭の#を外して有効にし、
CDドライブ(/cd0a)はないので 行頭に#を入れてコメントアウト.

rc.conf を編集.

rc_configured=YES

に変更して、

postfix=NO
sendmail=NO

追加.(このへんは こちら とか見よう見まね)

minimam install してて、他に入れたい tgz があれば このタイミングで展開.

tar xzfp /mnt2/binary/sets/misc.tgz
tar xzfp /mnt2/binary/sets/text.tgz
tar xzfp /mnt2/binary/sets/man.tgz
tar xzfp /mnt2/binary/sets/comp.tgz

等.
※展開中に segmentation fault 等で進行不能になって再起動した場合は
  fsck -y /dev/wd0a
でディスクチェック。

終わったら exit を実行し shから メニューに戻り、適当に電源offして WinCE再起動。

インストールしたての環境での設定

適当に電源終了して、WinCE再起動。
"メモリ カード2\instation\"の
  hpcboot.exe, pbsdboot.exe pbsdboot1.exe
を "メモリ カード2" 直下にコピー。

hpcboot.exe あるいは pbsdboot.exe を実行し、今度は ディレクトリ /, ファイル netbsd にして 自分の機種(NEC MC-R730)を選んで boot。

※本来は hpcboot.exe でいいはずなのだけど、うちのmc-r730では進行不能になった。PCMCIA側にCFさしてbootすると起動できたので、hcpbootでは "メモリ カード"を前提にしてるのかも。pbsdbootだと "メモリ カード2"でもちゃんとboot できたので MC-R730 ではこれを使った。

login: に来たら、root で入り、Configure Menu で設定した password を入力.

普段使うrootになれるユーザーを作成.

useradd -s /bin/sh -m -g users -G wheel ユーザ名
passwd ユーザ名
(新しいパスワードを入力)

まだまだ pkgsrc の install とか諸々していかないと駄目なんだろうけど...( pkgsrc の tar.gz 展開でsegmentation fault出まくりとかで)...くたびれたので一旦終了


mc-r730よりマシとはいえ やっぱり 不具合が出ないわけでもない sigmarion での作業時間を思うと、pc に NetBSD いれてそちらで CFにファイル展開とか極力 済ませてしまうのが無難かもしれない。 (ほんと こちらの言われるとおりにやってればこんな手間食わずにすんだかもしれない...)




<<20142016>>