<<前の5件次の5件>>

2014-12-21[日] VAIO C1 に linux

前回(小メモリ起動)のDSLの影響で、VAIO C1 VR/BP (2001年くらいのモバイルPC) を引っ張り出してきて linux を入れてみた。(懲りてない)

win98me,win2k 動く実機として残してるのでそれを削除する気はなく、余っているHDD領域を(w2k上で)複数のパーティション切り直して領域確保。win2kインストール時に適当に拡張パーティションに入れてしまっていたため、新規空領域も拡張パーティションのみ。基本パーティションのようなmbrによる起動はできない… が、たしか grub4dos を使えば何か出来るはず(うろ覚え)、とそれを当てに。

HWスペックは Crusoe 600MHz(ざっくり Pen2/Celeronの半分(300MHz)くらいの実力)、メモリは標準から+128MB増設して256MB(有効240MB)、HDDは120GBに換装済。画面は横長 1024x480、ちと特殊。640x480では動くだろうけど1024x480はディストリ(ドライバ)次第。

PCカードスロット、USB1.0ポート、メモリースティックが1つづつあるが、外付けでブート可能なのは sony純正の PCカード接続のCDROM くらいなのだが(ひょっとすると純正FDDも可能かもだが未確認)、os/ディストリ側がこれのドライバー対応してないと正常にos起動できない(起動は始めるが起動したプログラム自身がCDを見つけられない)。ググると大昔の日本製ディストリのいくつかは対応してたらしいが...(今回試した中で正常にOS起動できたのはCorePlusだけ)

今回インストールしてみたのは、 puppy 5.71jp, konalinux 2.3 black(2014-10-12), DSL4.4JP, Tiny CorePlus 5.1ja

当初は前回のこともあり DSLをメインに考えてたのだけど...
結果として 一番使い物になるのは(少しもっさりだけど) Puppy だった。
kona black はこのマシンじゃ超重量級。
DSL, CorePlusはインストールでき動作は軽くはあるけれどpcカードの認識がいまいちだったり画面解像度640x480のままではつらく。(ドライバー見つけてきて入れれたら出来るのだろうけど)

以下、諸々の作業メモ.

grub4dos のインストール

HDDインストールした linux を選択して起動するために grub4dos を使うので、ググって 見よう見まね(特にこちらのサイト とか)。

うちのc1の環境は C:にwin98me(fat32), D:にwin2k(ntfs)ですでに boot.ini での選択になってる。

grub4dos より をダウンロードし解凍。
解凍されたフォルダ直下にある grldr を C:\ にコピーする。

テキストエディタで c:\boot.ini の最後に

c:\grldr=grub4dos

を追加。(vista以降は別方法で面倒だけど,まC1にvista以降いれないだろうし)

c:\menu.lst を作成。(grub4dosは他に検索するパスもあるけど、不精してくルートに配置)
動くかどうかの確認用としては同梱されてた menu.lst を使うのでもよいけれど、余計な記述も多いので、ざっくり

default /default

title restart win
rootnoverify (hd0,0)
chainloader +1

title command line
commandline

title reboot
reboot

title shutdown
halt

のように menu.lst を作成.
※改行コードがunix系(lf)でないといけないので、それ対応のエディタで編集。

再起動して、OS選択メニューで grub4dos の項目があり、選択して menu.lst 内容が出てきたらok.

あとはosインストールしたら項目を menu.lst に追記していく.
(各項目はtitleだけでなく空行も区切りとして使われてるようなので記述するときは不精しすぎないようにと)

※ restart winの(hd0,0) はもちろんハード構成/パーティション構成による。(最近のwinは先頭にシステム予約済みのパーティション作られること多いし、note pc によっては先頭に回復パーティション置いてるのもあったり)

CD + 補助ドライブ(USBメモリ)による CDブート

CD起動は先にも書いた通り特殊なドライブのため、CorePlus以外は失敗してるが、こちらのインストール方法を用いれば、モノによっては起動できるかもしれない。

.isoファイルをCDに焼き、その.isoの中のファイルをUSBメモリにすべてコピーしておき、CD&USBメモリをマシンに装着。

CD起動したプログラムが、CDというか必要なファイルを探す動作として接続されているドライブを順繰りに舐め、USB メモリも認識されれば、そこから必要なファイルが読み込まれるだろう、という塩梅。

仕組み的にUSBメモリでなくてもよいだろうが(こちらはHDDでやられてる模様)、path構成変えずにとなるとUSBメモリがお手軽かと(USBメモリ認識しないようならHDDで)。

参考にしたサイトは Puppy で行っていたが、己のC1でも konalinux, DSL の起動ができたので、割と通用する手なのかもしれない。

grub4dos によるCDイメージのブート

当初はインストールしたosの起動用としか考えていなかったが、grub4dos はCDの中身をhdd(fat/ntfs)にコピーして置いたものも起動できるようだ。(つまりCDなくてもlinuxインストール可能。よくよく思えば bootセクタのないパーティションからos起動するのと同じようなことか)。また iso ファイル起動も条件しだいでは可能とのこと。

残念ながら isoファイル起動は条件にあわないようで駄目だったが、CDからコピーしたファイルでの起動は割と成功した。

ただ、ディストリごとに kernel,initrd ファイル&適切にパラメーラを設定しないと駄目なので結構面倒ではある。(個々の設定は後述)

PLoP Boot Manager によるUSBブート

前記の方法で一応USBブート可能だろうが、もっとお手軽にブータブルUSBメモリを簡単に起動出来ないものかと探せば、こちら で紹介のPLoP Boot Manager というもので出来る模様。
実際 DSL で試すと確かに起動(初回一発. 試したのはplpbt-5.0.14)。ただ相性個体差があるのか、何度も試してると結構 ブート途中でハングることも多く…というか起動しきることが稀で不安定。起動できてしまえば大丈夫だが……(出来ないよりはマシと思うが出来ない限り徒労感も)

PLoP は grub4dos から起動するようにした。まず ダウンロードしてきて展開、直下にある plpbt.bin を c:\ にコピー。 c:\menu.lst に

title PLoP Boot Manager 
find --set-root /plpbt.bin
kernel /plpbt.bin

を追加。

起動可能 USB は win機で何かしかのソフト(UNetbootin とか Rufus とか)で書き込んで用意。

Puppy Linux 5.71 jp のインストール

PuppyLinux5.71jp の CD(iso) の中身を、c:\puppy571 にコピー。

c:\menu.lst に

title [LiveCD image] Precise Puppy 5.71 jp
find --root-set /puppy571/vmlinuz
kernel /puppy571/vmlinuz pmedia=cd pfix=fsck acpi=off
initrd /puppy571/initrd.gz

を追記しておいて、grub4dos より起動、sda9 に full インストール。ext2。もちろんこのときbootローダは組み込まない。(すでにgrub4dos使ってるので)
あとパーティション設定で500MBほどの swap パーティションは用意してる。(他のlinuxでも使われるものだし)

インストールしたものを起動するために c:\menu.lst (/mnt/sda1/menu.lst) に

title Puppy Linux 5.7.1 jp
root (hd0,8)
kernel /boot/vmlinuz root=/dev/sda9 pmedia=atohd acpi=off

を追加。

今回の中では一番インストールでトラブルがなかった。(他をやった後なので手順に慣れてきてたのもあるだろうけど)
試していないが、CD+USBメモリの方法でも出来るだろうし、PLoPも調子よけりゃ行けそうな気はする。

実際に使う上でも今回の中では一番使い出はあると思う。
何もしなくても 1024x480 使えてるし USB-LANアダプタ(LUA-U2-GT)や無線LANのPCカード2枚(WLI-CB-G54S, DWL-G630)自動認識してくれたし。

Puppy で気に入らないのは(たぶん大抵のWinユーザーが思いそう)ファイラ(ROX)のシングルクリック動作だけど、これはちょっと設定変えればよい。

デスクトップのアイコンの"ファイル"を右クリック、"ROX-File"→"オプション設定"を選んでダイアログ表示、ファイルウィンドウおよびピンボードの2箇所にある "シングルクリックで操作する" のチェックマークを外す。

他にも画面が狭いので、フォント小さくしたり、guiのテーマ控えめのにしたり小さくできそうなところ小さくしたり。

それでも、(start)メニュー微妙に長くて少し画面はみ出しちょっと面倒。(.jwmrc から ヘルプ消して対処... 他のソフトインストールしたら復活、別途雛形管理されてるんか...)

その他、puppy には限らず他でもそうだけど、不意に電源きれたりあるいは正常でも電源が切れるタイミングか何かの影響で、タマに起動時のファイルチェックで怒られる。ext2にしたことをちょっと後悔(でもスペック的にext3躊躇)。
(蓋閉め電源管理をちゃんと設定してない(できる?できない?)のも悪いのだけど...[追記]acpi=offで蓋閉電源offしないようなので追加)

konalinux 2.3 black のインストール

画面 1024x480 や PCカード無線LAN,USB-LANの認識は大丈夫だったが、試すなら激重承知で……

CDの中身をhddにコピーしての起動は (C:\kona23bk\ に入れたとして)

title [LiveCD image] konalinux 2.3 black
find --set-root /kona23bk/live/vmlinuz
kernel /kona23bk/live/vmlinuz boot=live quiet config acpi=off locales=ja_JP.UTF-8 timezone=Asia/Tokyo live-media-path=/kona23bk/live
initrd /kona23bk/live/initrd.img

ただし、この方法で起動した場合、HDDインストールが行えない。
どうも起動ドライブを対象外にするのにパーティション単位でなくドライブ全体を弾くようでインストール対象のドライブが全く現れず中断するしかない状態。
ので HDD にインストールする場合は他の方法を選択。己はCD+USBメモリを実行。(PLoPは未確認)

HDDにインストールしたものを起動するには(sda7 に入れたとして)

title konalinux 2.3 black
root (hd0,6)
kernel /boot/vmlinuz-3.2.0-4-486 ro root=/dev/sda7 quiet locales=ja_JP.UTF-8 timezone=Asia/Tokyo acpi=off
initrd /boot/initrd.img-3.2.0-4-486

をc:\menu.lst に追記。

startメニュー開けるだけでも激遅。メニューでのアイコンの使用を全部やめるとマシになるが、その他 UI軽くするような設定に変えても焼け石に水といったところ。

DSL4.4jp のインストール

HDDに CD の中身をコピーしての場合(C:\DSL44JP に入れたとして)

title [LiveCD image] DSL 4.4 jp
find --set-root /DSL44JP/boot/isolinux/linux24
kernel /DSL44JP/boot/isolinux/linux24 vga=786 boot=live quiet dma=on noscsi lang=ja acpi=off knoppix_dir=/DSL44JP/KNOPPIX knoppix_name=KNOPPIX
initrd /DSL44JP/boot/isolinux/minirt24.gz

(HDD のインストールをするときは Bootローダ書込をしないでおく)

HDD インストールしたものを起動する場合は (hda8 に入れたとして)

title DSL4.4jp
root (hd0,7)
kernel /boot/linux24 root=/dev/hda8 quiet vga=786 dma=on noscsi lang=ja acpi=off

/dev/sdaN でなく /dev/hdaN であることに注意。
(※これ気付かずにエラく時間くった。kernel2.4の時分はhd(ide),sd(scsi)厳密に区別してたんだよなあ、と)

usb-lanはokだったけど 画面は640x480、pcカード無線LANは使えず. ドライバーとか探せばなんとかなるかですが、そこまでは手を付けず。

Tiny CorePlus 5.1ja のインストール

CD内容hddコピーしての起動はまだ成功せず、でHDDへのインストールは CD起動して行った(PLoPでusb起動できれるかもだが未確認)。
hddインストールでは CD(c)からFrugal(f)でパーティション(2)にext2でいろいろ有り有りでインストール。

HDDにインストールしたCorePlusの起動には (hda11にインストールしたとして)

title TinyCorePlus 5.1 ja
root (hd0,10)
kernel /tce/boot/vmlinuz quiet xvesa=640x480x24 dma=on tz=JST-9 notuc acpi=off lang=ja_JP.UTF-8 kmap=qwerty/jp106
initrd /tce/boot/core.gz

を c:\menu.lst に追加。

実際には CDからhddインストールするときに boot マネージャ有にしておき生成された /tce/boot/extlinux/extlinux.conf に設定されてるパラメータをみて 必要そうなのをコピペしてる(たとえば waitusb=5:UUID="…" とか)
※ インストーラでsda11に対してboot書込したときは sda1 のbootフラグがoffにされてしまうので、インストール終了後 fdisk で sda1 のbootフラグをonに戻しておく.(a でpartition 1 を選んで w での書き込み忘れず)

画面は640x480、手持ちの 無線LAN PCカードはデフォルト状態ではHW認識が微妙でマトモに使えなかった。usb-lan は最初から差しとけば使える。このへんは調べりゃなんとかなるかもしれないが... 気力ないのでブートできただけでヨシとしてる。

雑感

Puppy みなおした、てか、正直 kona black の重量級ぷりにびっくりだった。考えてみればスペック的には当然で、むしろ Puppy がようがんばっとんなぁ、なんだけど。wm等環境の差が大きいのかねえ。(jwm だってそれなりに凝ってるとこあるからも少し軽いのだってありえそうだけど)

P3-600MHz あれば kona 選択するだろうけど、Crusoe 600MHz な VAIO C1 では Puppy が一番手間いらずで使いやすいかな、と。(win2kがベターとかいうのは野暮)

DSL や TinyCore はドライバーとかの都合がつけばよいかも。
メモリ256MB積んでるから Puppy 選べたが、C1 VR標準の128MBだったらこっち頑張ってたかもしれない (ただ DSL はもう更新止まってるし 古くて apt-get 機能しないので魅力半減)...いや不毛なんで やっぱり早々に諦めてるかな




2014-12-14[日] 24MBマシンで起動できそうなディストリ?

(遅延書込12/20)

以前弄った後しまいこんで忘れてたDynabookGT475を発掘。 486DX(75MHz), 24MB(8+16MB), HDD540MB, 640x480(16bit色? 8bit色かも), win98は動いたことあるけどwin95でさえシンドいスペックなので弄るのは不毛だが、24MBで動くGUIなディストリあるかな、と無理ゲー承知、余計な気を起こして弄っていて……外装プラスチック折れる剥がれるHDD昇天、と経年劣化物は丁寧に扱えとの教訓。(躊躇なく捨てれる)

と、ま、当初の目標は失われたけど、インストール準備のためにvirtualboxで試した時のメモ.

VirtualBox は mem 24MB vram 1MB(640x480x16想定) HDD500MB 古チップ諸々低スペックに設定 (CPUが速い(i7)のは諦める)。
当然今どきのディストリは駄目だろうしオンメモリ系LiveCDも試すまでもなく(と思いつつ kona, puppy tinycore試す. もちろん駄目)

十数年前か下手すりゃ前世紀のディストリかなと思いつつ、

は起動。(他にもあるだろうけど2つ見つかったしマシン壊れたので打ち止め)

DSLは kernel 2.4系を採用したknoppix(debian)派生で最低 486DX 16MBで動くらしい。GUIは jwm (と fluxbox)採用。4.4jpは2008年製(本家最新はdsl-4.11.rc2(2012年) )。

NetBSD 6.1.5 は2014年(最新)のモノので 試しみた(ておくれ)版ではjwm。 配布されてるISO をみてると懐かしいHW(≒厳しいスペック)用が多々あったので試す気になった。

ということで思ってたよりも新しいディストリで見つかった(内部的に相応という考え方もありそうな…)
起動できたといっても辛うじて、だけど。

DSL は軽めのアプリ1つ動かすのがせいぜいか(OS起動直後のTorsmo の表示で RAM Usage 11.5M/20.9M)。 エディタ(leafPad)で日本語入力できたりはする。 Dillo でWeb 1(,2)頁 みれる、が次の頁開けると固まる。 firefox は立ち上がらない(64MB環境にしたら立ち上がる)。 LiveCDからHDDインストールするとコピー途中でハングしたりする(32MB環境にすれば可。あるいは boot時のinstall であれば 24MB環境でも可)。

NetBSD のほうはそれよりも重め。xtermでのただのキー入力でさえ重い(32MBならそんなことなく... IMEをMozcより軽量のにすればマシになる?)

と 24MB で動いたといってもi7デスクトップ機なので.
当初のnoteよりは数倍スペックのいい P2-400MHz mem256MB hdd10GB でDSL試すと、やっぱ、もっさり。特にHDDアクセスの遅さは効くなあ。(逆算すると当初のは…)

こういうのみると、Puppy や TinyCore 等がオンメモリ主体の設計で快適さを得ようとするのは理にかなってるよなあ、と納得。(今回の趣旨には合わないけれど)

DSL4.4jp インストールメモ.

わすれっぽい自分のため...

VRAM 1MB(640x480 16bit色想定)にしていたため、デフォルト(vga=normal 800x600)では 正常起動できず、bootパラメータとして dsl vga=785 (640x480 16bit)を与える必要あり。

起動時の boot: で "install" を入力すればインストールを行えるが、なまじ日本語化されてるため 英字なCUI環境では文字化けして読めない…… liveCDでの質問項目をメモ。

  • インストールに先だって、linuxパーティションは少なくとも320MBのサイズを作成しておかなければなりません.
    Linuxパーテイションを作成しますか(作業の最後には必ず[write]メニューを実行すること)(y/n)? y
    ※予め設定していないなら ここでyで設定. 設定済みなら n でよく.
  • インストール先パーティションを入力してください.(EXAMPLE: hda2): hda1
    ※ パーティションの切り方しだい
  • マルチユーザーによるログインをインストールしますか(y/...)? n
    ※ yesにすると起動時にuser&password入力. no にすると 起動時入力無しでデフォルトユーザ(dsl)で自動ログイン
  • ext3ジャーナルファイルシステムを使用しますか(低速マシンでは推奨しません)(y/n)? n
    ※ yes だと ext3, no だと ext2 になる.
  • /dev/hda1 上のデータを破壊しますが、やめるなら最後のチャンスです!! 続けますか (y/..)? y
  • ブートローダーをインストールしますか? (y/...): y
  • [G]rub あるいは[L]iloのどちらのブートローダーを使用しますか? (g/l)(grub推奨): g
  • 直ちにリブートしますか? (y/...): y

リブートして初回はrootとデフォルトユーザdslのパスワード設定、 大小英数混ぜて5~8文字を入れる。

その後、途中でエラー。vga の件だろうで、
 $ sudo nano /boot/grub/menu.lst
で編集、title DSL の次行中の vga=normal を vga=785 に変更してセーブ終了、再起動してHDDブートok。

今時のlinux環境に比べると機器の自動判定は(少)なく vgaやマウスは適切に設定する必要あり。実機だとマウスは ps/2 なりシリアルなり(usbなり)繋げてるのを正確に。VirtualBox だと usb有設定にしてusbマウス使っていても、エミュ内では usbマウスoff, ps/2マウスonじゃないと駄目かも。




2014-11-2[日] カラーキャリブレータ(ColorMunki Photo) を使ってみた

前々回 、色調整についてググっていて気になったのが色キャリブレーション機器。安いのなら1万円台からあって興味そそられてしまう。少し前にデザイナさんと色味のやりとりで手間取ったことがあったりしたので(ディスプレイのRGB輝度を適当に下げすぎてたのがまずかった)...
職業柄多少まともに色みえてたほうがよいだろうで、少し高いけど(仕事用だし) X-Rite ColorMunki Photo(カラーモンキー・フォト) を購入。

まずは付属ソフトで

ググると ColorMunki Photo は機器性能はいいけれど付属ソフトがゴミ、と評されていてフリーソフトの argyll(CMS) & dispcalGUI を使うのが定番の模様。
なんだけど、そもそも何をどうしたらいいかわからない色キャリブレーション初心者としては、まずは付属ソフトをwin機にインストールしての使用と導入解説ムービー視聴。

付属ソフトのキャリブレーション操作は、1作業1画面で図入りで何するか示してくれるので(ページごとに機器操作のムービー・ヘルプもある)、なんなくディスプレイのキャリブレーションは簡単に行えた。(プリンターはまだ試してない)

解説ムービーは、簡単に原理や必要性を解説していて、見ておいて よかったと思う。(ただプリンターのキャリブレーションの説明みてると面倒くさそうに思えて後回しに...)

流れとしてはカラーキャリブレータをつないでソフトの指示にしたがって

  • 調整目標の色温度とか輝度を選択
  • カラーキャリブレータ自身のキャリブレーションを行う
  • (照明を反映する場合は、ディスプレイの横において環境光を計測)
  • カラーキャリブレータをディスプレイの上からぶら下げ画面の所定の箇所に設置
  • 基準となる白(輝度)を計測しながら、ディスプレイ側のRGB(色温度)や輝度・ハイライトを操作して基準値になるべく一致させる. (ノート等ディスプレイ側の調整が出来ない場合はスキップ)
  • あとは色々な色をキャリブレータが計測
  • 色プロファイル生成

といったところ。
大雑把な流れはdispcalGUIでも同じようになる(機器キャリ&ディスプレイキャリが2回に増えるけど)。
"カラーキャリブレータ自体のキャリブレーション"がちょっとした肝か。 付属ソフトではわかりやすく指示されるけど、 dispcal(GUI)でそのこと気づかずにドはまりしたのは(ググると)己だけではなさそうで... (ちゃんと英語読めって話でした)
(他にもキャリブレータをディスプレイに設置するときに裏蓋開け忘れを注意されるのもよかった。まさに開け忘れてた奴なので... 開けた穴の先にセンサーぽいものをみて遅まきながらダイヤル回して4つ切り替えてる意味を意識した)

で初心者向けな操作はまあまあよいのだけど... 評判が悪いのは生成される色プロファイルの出来のほうなので、目的からすればとっとと dispcalGUI を使うが吉、と。

argyll CMS & dispcalGUI

argyll CMS は コマンドラインツール群からなる カラーマネージメントシステム(CMS) 。(現在ver.1.6.3)
dispcalGUI は argllCMS 中のキャリブレーションツールの dispcal を(メインに)GUI化したもの。(現在ver.2.5)

argyll と dispcalGUI は別プロジェクトのようなので配布は別々、だけど dispcalGUI の Zero Install 版でインストールすれば両方設定されるようでお手軽。 dispcalGUI は他に standalone 版があり、こちらは単体インストール版でargyllを別途インストールする必要がある.(linuxしか試してないけど多分)

※ Zero Install は、カタログ・タブを開くと複数の(Unix系な)オープンソースソフトの一覧がありそれらをインストール・削除・更新を管理できるツールのよう。OS標準のアプリ・インストールは行わず(c:\Program Files\とか /Apprication/とかに入れず)管理してる模様。

Zero Install 版で win8.1(x86), os x(10.9), linux(Mint17. ubuntu14.04用をインストール) とも動作した。
winはドライバーのインストールを別途行わなくてはならないのでちょっと面倒。 (付属ソフト入れたwin機はそのままで、他の32bit win機で試しただけなのでx64環境とかドライバの入れ替え等は未挑戦。macも付属ソフト入れては試してないので、入れてた場合はドライバーの切り替えとか何か手間はあるはず。※追記:Win x64ではwin起動オプション画面で"ドライバー著名を無効"にする必要がある模様. こことか参照)
win機でのインストールとかドライバーあたりの話とかはここの方とかググれば何人か書かれておられるかたがいるので、それらを参考にすれば、と。

なお Linux Mint 17(Ubuntu 14.04) では、

sudo apt-get install argyll
sudo apt-get install dispcalGUI

でインストール可能だったが、バージョンが古く(argyll 1.5.1, dispcalGUI 1.7.1)、バグなのかColorMunki Photo未対応なのか途中でエラー終了し使えなかった。(将来に期待)

※正常に動作してるようにみえ、計測値の差が大きくてエラーといった感じで中断されるので、差が小さくなるようディスプレイ設定変えて何度も試したけど駄目...よくよく見るとエラーメッセージあってなさそで... apt-get remove してプロジェクトのサイトの最新版を入れたらすんなり動作、だった。
※ gnome-color-manager でのキャリブレーションもそのargyllを使うため同様のエラーで駄目だった。
※ 当初、ハードの外れを引いたのかと思った(今でもその可能性あるかもだけど そう思いたくはない)


dispcalGUI の使いかたは、 JJs氏が書かれている Argyll CMS & dispcalGUI導入編使いこなしガイド with ColorMunki Photo 実践編 メイン設定画面編 (やキャリブレーション関係) あたりが大いに参考になる。あと インクジェット放浪記カラーマネージメントCOLORMUNKIで遊ぼう。モニター編1 ,2 とか (プリンタ編1 ,2, スキャナ編 興味深く)。 また こちら の dispcal (非GUI)で ColorMunki Photo を使う例は、dispcalの動作の流れを知るにはよいかも(バージョン違いで若干現状と違うようだけど)。 その他ググって見つかったサイト諸々を参考、先人に感謝。

上記のサイトを見ながらいろいろ試行錯誤、正直適切な設定ができてるかわからないけれど、しないよりはよくなったと思う。とくにデュアルモニタなんかはわかりやすい。 でもって、前々回の古ノートPCは劇的にマシになった(経年劣化激しい液晶なのであくまで"マシ"なんだけど)


己のヘマを吐いておくと最初に書いたように機器自身のキャリブレーションをちゃんと認識してなかった。 "Set the ColorMunki sensor to calibration position and press OK to calibrate the instrument."("ColorMunkiのセンサーをキャリブレーション位置に設定して、計器をキャリブレートするために[OK]を押してください") と書かれた機器のキャリブレート準備待ちのメッセージをよく読まずに画面計測準備待ちだと思ってMunki Photoのダイヤルを下向き(画面計測用)にして[OK]しても先進まねーと(愚)
ここでは ColorMunki Photo のダイヤルを 機器キャリブレート用の下斜めの位置に設定してからダイアログの[OK]をクリックすればよいだけだった。
しばらくすれば "Place the instrument on the test window and click OK to continue." のダイアログが出るので ColorMunki Photo のダイヤルを下(画面計測用)にし、所定の矩形(灰色)の上に ColorMunki Photo を設置して[OK]。
計測で少々時間たった後、もう一度同様に 機器のキャリブレーションと 画面の計測設置をすればあとは結果待ち&結果がよければ[install profile] をクリックしてカレントの色プロファイル設定できる。


カレントのプロファイルの設定は win,mac ではそれでよさそうだが、linux では xには反映されるが gnome-color-manager のカレント設定は変更されないので、これについては自分でする必要がある。 といっても、システム設定→色、でキャリブレートしたディスプレイの[プロファイルの追加]を選び、出てきたプロファイル一覧から先ほど生成したプロファイルを選んでカレントに設定するだけ。

あと dispcalGUI 計測時にカレントの色プロファイルの影響受けてないか気になったが、起動時に x直接初期化してるようで gnome-color-manager のプロファイル設定は無視された状態になり問題なかった。(良くも悪くもgnomeアプリじゃないから当然か)




2014-10-13[月] linux Mint(Ubuntu)で 窓使いの憂鬱 を使いダイアモンドカーソル

linux でも win や mac 同様にダイヤモンドカーソルを使いたいので、キーバインディングソフトの「私家版 窓使いの憂鬱 for linux & Mac (Darwin) 対応版」 を使用させてもらってる。

といってもlinux入PCはディスプレイ繋げず置物化していて、(格安)noteの設定のために数ヶ月ぶりに立ち上げてみればダイヤモンドカーソルが効かなくなっていて... なんぞ設定変わった?

と、ま、そんなこともあり、linux Mint 17(Ubuntu 14.04系) で窓使いの憂鬱をダイヤモンドカーソルで使用するためのメモ.

ざっくり やったことは

  • IME で CapsLock/英数(EISU)キー を使用しない用にする
  • 窓使いの憂鬱 for linux & Mac のダウンロード
  • ソースをコンパイルして インストール
  • 自動起動用スクリプトの設定
  • ダイヤモンドカーソルな定義をした ~/.mayu ファイルの作成
  • 再起動

な感じ。

IME の設定

キー配置的に CAPSLOCK/英数キー をダイヤモンドカーソルする拡張キーにしたい。

IME で 英数キー が使われていると不味いので、IME の設定(プロパティ)で英数キーを使ったものをすべて削除か別のキーに割り当て直しておく。

例えば Mozc なら

"(スタート)メニュー"→"設定"→"Mozcの設定"→"一般"→"キー設定の選択"の処の"詳細"→(各種キー設定)

あたり. (複数のIME入れてるならそれぞれ対処... 面倒なので己はAnthy削除してMozcだけにしてる)

mayuのダウンロード、コンパイル、インストール

http://www42.tok2.com/home/negidakude/ から mayu-0.12.1.tar.gz をダウンロード.

適当なフォルダで展開(tar xvzf mayu-0.12.1.tar.gz)し、そのディレクトリに移動(cd mayu-0.12.1).

その中に入ってる README(or INSTALL) テキストを参考に作業...だけど2011-11年以降の環境の変化でそのままでは駄目な場合があり、ググれば幾つかのサイトで対処方法が公開されているのでそれらも参考。

まずライブラリをインストール.
sudo apt-get install g++ libboost-regex-dev libboost-dev libudev-dev libusb-1.0-0-dev

ubuntu系だし起動時から使うので
/etc/modules の最後に uinput の1行追加.
※README に書かれている update-modules はすでに廃止されたコマンドのようで無かったが、実行しなくてもよさげ(?)

./configure は こちら等にあるようにエラーでるので
./configure --with-boost-libdir=/usr/lib/x86_64-linux-gnu/
にして実行(x64用. 32bitなら別のディレクトリ)

make するとエラー出るので先のサイトに書かれてるように msgstream.h の setp を this->setp に置換(3箇所)してから
make
そして
sudo make install

自動起動

こちら で公開されてる定番のスクリプトを使わせてもらう。
サイトにあるスクリプト部分をコピペして(自分のユーザー名に書換える部分は書換えておいて) /etc/init.d/mayu にセーブ、実行可能に変更.
...なんだが、どうもubuntuの変更か何かの影響でエラーで動かなくなった模様。

ググると対処されてる方がおられて、こちらの頁.
そこに書かれてるスクリプトをコピペすれば...だけどタブ消えてたりちょっと面倒そうだったので、必要な変更箇所だけ抜き出して、元のスクリプトに反映.
具体的には元のmayuスクリプトの最初の1行を

#!/bin/bash
# Start/stop the mayu daemon.
#
### BEGIN INIT INFO
# Provides: mayu
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: mayu
# Description: Enable service provided by root
#
### END INIT INFO

に置き換えた.

/etc/init.d/mayu ができたら ([追記] update-rc.dの指定違い等修正)

sudo /sbin/insserv -v mayu

あるいは

sudo update-rc.d mayu start 17 2 3 4 5 . stop 17 0 1 6 .

で自動起動されるように設定.
(どうも update-rc.d の引数無視されてデフォルト設定か BEGIN INIT INFO の内容か何かで設定されるようにみえる)

ダイヤモンドカーソルな定義ファイル

ダイヤモンドカーソル、てか、vz系の操作を元に 設定してみたキー (ここでの ^ はCapsLock/英数キーの意)

^E^X^S^D(上下左右) ^A^F(単語移動) ^R^C(頁移動) ^H(BackSpace) ^G(Delete)
^QF(検索) ^QA(置換) ^QS(行頭) ^QD(行末) ^QR ^QC(ファイル先頭/末移動)
^T(HOME) ^V(END) ※vzと違うけど楽にHOME/ENDしたく
^TAB(CapsLock/英数) ※念の為

書いてみた定義ファイルの内容は以下

include "linux109.mayu"

keymap2 Q2
key *r = C-HOME
key *c = C-END
key *s = HOME
key *d = END
key *f = C-F
key *a = C-H

keymap Global
mod mod0 = !Eisuu
key M0-e = Up
key M0-s = Left
key M0-d = Right
key M0-x = Down
key M0-r = PageUp
key M0-c = PageDown
key M0-h = BackSpace
key M0-g = Delete
key M0-a = C-Left
key M0-f = C-Right
key M0-t = Home
key M0-v = End
key M0-q = &Prefix(Q2)
key M0-TAB = Eisuu

こいつを ~/.mayu でセーブ.

"置換"(^QA)はソフトによって結構キー違うものなので定義しないほうが無難かもだが、GEditが MS(VS)系を踏襲した CTRL-H だったのでそれを設定してる.

HOME,ENDの扱いはmacよりWinと同様のことが多そうなので そのあたりは素直に設定。なのでmacと違い^t ^v の必要性ないけれど自分が使うかもで用意(いらなければ削除)。^TABでの英数(CapsLock)キー動作は...自分で使うことはほぼ無さそうだけど念の為用意.


ひと通り設定がすんだら、再起動、問題なければ CapsLock/英数キーでダイヤモンドカーソルできるはず.




2014-10-12[日] 古noteでlinux ―― linux(gnome) で経年劣化した液晶モニタの黄色具合の改善

少しはマシな実機でlinux環境を常設したく、ちょっと前にヤフオクでOS無のジャンク扱いな core2duo(1.6GHz) 2GB の古ノートPC(FMV s8245)を入手。 外装禿げてるし画面もキーも黄ばんでるけど バッテリィは電源抜いても即落せずそれなりに持つし、 送料手数料込 4000円位の7歳児としてはまずまず。 (core i系はまだ高くなりやすいけど、core2duo は64bit使えて性能の割に安く入手しやすい感じ)

とりあえず linux Mint 17(cinnamon) の64bit版をインストール、すんなり動作。あっけない。

で、まともに使えてると気になるのは画面の黄色具合。
液晶は種類によるけれど経年劣化で黄色がかってくるモノがあり、 そういうのを承知で入手したが、いざ触りだすと結構気になってくる。
モノクロ写真を壁紙にすると セピアぽくなるのは味があるっちゃあるけれど。

BIOSみてもディスプレイのRGBを調整するような項目はなく、 Win の(Graphics Card)メーカー製ドライバ/ユーティリティのようになんらかの色味調整機能が、linuxでも何ぞないかなとみてみれば、

 "(スタート)メニュー"→"設定"(または"システム設定")→"色(カラーマネージメントの設定)"~

がそれっぽい。(他の gnome環境でも gnome-color-maneger がinstallされてたらたぶんそれ)

が、用意されたプロファイル(iccファイル)を選択できるが、直接色を調整する機能はなさそうだ。(キャリブレーション機器があればそれを使っての設定はできる模様)

ただ、プロファイルの一つに Blue(Bluish.icc) というのがあり設定すると画面が青みがかる。
通常用らしき D65(Gamma6500k.icc) と見比べると、VCGT という項目でのガンマのパラメータが違い、緑や赤が低い値になっている模様。 (VCGT は Video Card Gamma Table らしい. グラボのガンマ・パラメータを設定するもののよう)

つまり、今の液晶のへたり具合を補正するような icc ファイルを用意できればよさそうだ。 iccファイルを覗くと vcgt というタグがあるようでそこにガンマテーブルぽい値も見受けられる。 (ただ たいていのiccファイルにはvcgtタグは入ってなくて一部ディスプレイ用のiccファイルに入ってる模様。 カラーマネージャの解説されてるページからすると、そもそも vcgt タグは正式なものじゃなくメーカー(apple)拡張のようだ)

で、iccファイルを作成するツールがあれば(あるいは直接rgb調整できるようなツールがないか)、とググってみたけれど、よさそうなものをみつけられず。
最近のwinやmacの場合、標準で(目視)キャリブレーションできるらしいし、フリーソフトもあるみたい(このへん検索で見かけただけで動作未確認)。linux でも argyll とか lprof とかそれっぽいものはあるけれど使いかたよくわからず断念(キャリブレーション装置を使った例はあるけれど)。

きっと他にも何かあるだろうと思いつつ、そんな厳密なことやりたいわけじゃないし探すのも疲れたので、icc ファイルを弄ってなんとかならないか画策。

Gamma6500k.icc , Bluish.icc のバイナリみてると、vcgtタグ自体はいろいろな形式ありそうだけど、この2ファイルに限れば、わりと単純なテーブル(2バイト符号無整数を256個3チャンネル分)のようなので、簡易にr,g,b別に線形で設定するプログラム作ってガンマテーブル書き換えてみたところ、すんなり出来た感じ。

(cソース)

いや、すんなりは嘘か。パラメータや名前の設定具合が気に喰わないのか、作ったiccファイルをimportしても反応無かったりマシン再起動したら有効になる場合があったりと微妙な挙動だけれど、とりあえず変更したプロファイル(iccファイル)を1つ設定できた。
線形なんで途中の階調のバランス合ってないところあるし当然全体に輝度下がるので暗くはなってるけれど、元よりは大分マシな見栄えにはなったので吉としとく。(視野角で色の見え方違う件もあるし あまり拘ってもしかたない状態)


と、このネタ書いてる途中で、xgamma -gamma で設定かえると元の色バランスに上書きされるのに気づいた。ということは、vcgtなパラメータを書き換えてるということなのだろうか。
しかも xgamma、よくよくみると -rgamma -ggamma -bgamma というオプションがあって、r,g,b別設定すれば調整できそうだ...orz

(まだ適切なパラメータ設定をまだ見つけられてないし、起動時にxgammaを実行させる手間もあるので、iccファイルで出来る現状のほうがベター、と思おう)


(追記) これのためではないが結局 カラーキャリブレータを購入した ので、それでiccファイルを作成した。劇的にマシになった。




2014-6-20[金] 古PC に 軽いlinux を入れる

P3-800 世代に kona linux

あいかわらずタマに軽いOS(ディストリ)をインストールしたりして遊んでいる。
といっても たいていは virtualbox で動かすだけで、気になったのがあったときだけ P3-800MHz(i810)マシン(NetVista)でお試し。

最近のお気に入りは konalinux (v2.3 2014-06-03|12付近)。
OS側使用メモリ量が少なく抑えられて (black版で60MB前後, light版80MB前後)、 このクラスの古PCなのに まともな体感で操作できる。もちろんスペック相応の非力さを感じる面はあるけれど、最新のfirefox 入れて動くし使っていられるくらいにはいい感じ。 (軽いと言われるディストリでも、このスペックだと結構つらいモノが多いのよ)

軽さというならば TinyCore Linux(TinyCorePlus) のほうが頭一つ抜けてる感じだけど、 live-cd ベース オンメモリ運用前提で用意された範囲外のことをしようとすると手間が大きく(てか やれてない)、 その点 konalinux はHDDインスールのdebian環境で普通に apt-get 等できるので普段の延長で弄れて遊び甲斐あり。(いや、すぐ放置になるのだけど)

選ぶ kona のエディションは、メモリが384MB以上あれば full(-i386)版、256MB以上あれば light(lite)版、それ以下(でも192MBほしい) なら black版、 といったところだろうか。もう数世代後のスペックのマシンなら リッチなWMのエディション選ぶのも。

firefox を常用してるので、最終的には firefox (や Libre Office) が最初から入ってる full版を選択した。
iceweasel(というか古いリビジョンのfirefox) では使いたいアドオンがバージョン不一致で使えないことがあり(己の場合 All-in-One Sidebar)、black版 や light版 にfirefoxを野良インストールするのも面倒になったので結局(メニュー登録する方法調べるの億劫になり)。

※手持ちの NetVista は CD-drive かつ USB ブートのできない機種だったので、full版を入れるため一時的に 3口のIDEケーブルさしてDVD接続でしのいだが(電源はIDE->USB変換機器のものを流用)、CD|FDD で boot してから USB 起動するツールもあるようなので、なんとでもなりそう。

※ konalinux の配布物はバージョン名が同じ(2.3)まま ちょくちょく差し替わっているので、ダウンロード時期によって微妙に状況変わってることあり。

P2-400 世代

で、最近、親戚のとこの古いデスクトップPCが2台ほど巡り巡ってウチにやってきた。
電源いれてみれば 2台とも P2-400MHz(当然 slot) メモリ512MB前後 ... 15年前後前のスペックか?
そして、かなり、うるさい。

デスクトップでも静音電源が当たり前になって久しかったので... 昔は こんなうるさかったんだよなあ。 P3-800のNetVistaも音してるけど、一応静音タイプの代物で、十数年前のPCの常識で思えば静かな部類だったのだと再確認。

とりあえず HDD 換装して kona linux いれてみることにするが、80GB とか 120GB のHDDが認識されない... どうやら 32GB が最大の頃の代物らしい。10GBや30GBのHDDを繋ぐと認識(80,120GBでもジャンパで32GBに設定すれば使えたはず)。
ついでに騒音半減した感じ。
10,30GB-HDD は 静音が当たり前になりだした80,120GBの世代より音はしてるのだけど、6.4,8GBに比べれば結構静かになっていた模様。 すっかり忘れてる。

さて、肝心の kona linux だけど... もっさり。
win98 や win2k だとストレスのなくまともな体感で動くのだが... winアクセラレータが効くかどうかが大きいとは思うけれど、 さすがにこのスペックだと今どきのosやアプリはつらいわな。

と、 TinyCore Linux を動かすと win98やwin2k に匹敵する体感。さっすが。
ウィンドウ描画等UIレスポンスがよいのだけど、特にドックが滑らかに動くのが好印象の鍵なんだろうな。
(そうはいっても firefox を立ち上げるともっさりだったけど... それは win2k でも同様だろうで)

この世代については、下手なことせず win98/win2k 動かしてるほうが幸せ、でも GUI有 linux 動かしたいなら TinyCore Linux (TinyCorePlus) あたり...というのが己の結論。(自分でチューンできる技量のないものとしては)
win2k については こちらでおもしろそうな改造されてるので、気力あれば結構楽しめそうな状況あり(気力なし)。

てな具合に弄ってみたはいいけれど、スペック低いし騒音がつらいので、箱だけ残して中身(電源やM/B)は手持ちの余りパーツで置き換えよう ... と思ったのだが、 そこはメーカー製パソコン、一見汎用パーツのようで、そのままじゃあ換装できない要素が細々あり、結局、粗大ゴミになりそうな結末。
(収穫は 256MB DIMM を NetVistaに流用できたことか)




2013-9-22[日] PCKeyboardHack, KeyRemap4MacBook でのダイヤモンドカーソル(^QF 有)設定

バッテリー妊娠で放置してた macbook を復活中(バッテリー新調)。実質win7機としてしか使ってなかったのだけど今度こそmac(osx)をそれなりにさわろうかと(未だにmacよくわからん)。macbookは昔買ったlate 2008 な奴なので今更すぎますが新しいの買うまでには至らず。メモリ8G,ssd250G にしたのでまだなんとかなるかな、と。osx10.8 や win8 (win7入れ直してwin8upgrade) にしたはいいけど、まず、何より辛いのはキーボード。普段PCのテンキーレスキーボード(フルキーボードからテンキーだけ無くしたタイプ)常用、それがないならダイヤモンドカーソル(VZ系)配置必需、という自分でも少し困った生態ですが抜けられず、で、windows環境については自前ソフトで対処だけど mac 側はさて...

といっても mac 側の選択はやっぱり PCKeyboardHack, KeyRemap4MacBook のインストールがベストの模様。以前だって入れてましたが、その能力を発揮できていなかったようで(ソフトが発達した面もありそうだけど)、今回本気で設定してみたら、ダイヤモンドカーソルで^QFとかの 2 ストロークキーも使えて、かなり幸せでした。

ということで、以下、PCKeyboardHack, KeyRemap4MacBook の設定メモ.

※[追記] PCKeyboardHack は OS X 10.8 用以降は"Seil"に、KeyRemap4MacBook は OS X 10.9用以降は "Karabiner" に変名された模様.

※[追記] ( こっち ) で 窓使いの憂鬱 を使ってlinuxのダイヤモンドカーソル対応してみた

日本語キーボードを接続する場合

PCKeyboardHack で、For Japanege の 3つをチェックする(Enable NFER Key on PC keyboard. Enable XFER Key on PC keyboard, Enable KAATAKANA Key on PC keyboard).
これで、日本語キーボード(JP106系) をつなげた時に、スペースの並びの、無変換キー、変換キー、右COMMANDキーとして使える.

※ 無変換キー=IME off 変換キー=IME on なので 全角/半角キーは使うこと無く. 無理に全角/半角キーを使うことは考えず、むしろ、このほうが楽なので、windows 環境も 無変換を IME off にすることにした.

ダイヤモンドカーソル関係

実は KeyRemap4MacBook の Change Key の項目に Diamond Cursor 等各種変更があるので、好みのがあればそれを使うのが吉... だけど好みにあうのがなかったので自分で private.xml を書くことに.

やりたいことは、他の修飾キーによる動作を壊さずに、別途CapsLockキー同時押しでダイヤモンドカーソル移動等VZ系の基本操作すること(簡易に実現できる範囲のみ用意)

まず CapsLockキーを別のキーにするには PCKeyboardHack で、
CapsLock→Change Caps Lock にチェックをし、keycode を 右CTRLキー(62) にする.
(macbookでは 右CTRLキー がついてないので右CTRLを拡張キー扱いにしても影響少ないだろうと想定)

CapsLock については、これだけでなく、macos本来のキー設定でCapsLockを無効にする必要があるらしいのでそれも行う.
システム環境設定
→キーボード(アイコン)
→キーボード(タブ)
→修飾キー...
→キーボードを選択(変更したいキーボードを選ぶ)
→CapsLock キーを アクションなしに変更.
キーボードごとに設定できるので、必要なだけ設定する.
(※と書いたけど、新規追加したキーボードのCapsLock無効化忘れてても右CTRL化してるような…)

次に private.xml の作成.
作ってみた private.xml は これ.

設定方法は KeyRemap4MacBook の Misc & Uninstall(タブ) の Open private.xml を開けて、作ったものを上書き. Change Key(タブ) で ReloadXML して項目が現れたら必要な物をチェック.

作ってみた設定項目は、(以下ここでの ^ は右Ctrlの意)

Control_R Diamond Cursor ^E^X^S^D(上下左右) ^A^F(単語移動) ^R^C(頁移動) ^H(BS) ^G(DEL)
Control_R-Q ^QF(検索) ^QA(置換) ^QS(行頭) ^QD(行末) ^QR ^QC(ファイル先頭/末移動)
Control_R-T/V ^T(HOME) ^V(END) ※vzと違うけど楽にHOME/ENDしたく
Control_R-Z/W ^Z(undo) ^W(redo) ※ お試し. (vzだと1行ロールup/downだけど)
PC Application to FN Key WinキーボードのAppsキーをmacのFNキー扱いにする

生成するキーは標準のテキストエディタ準拠。
それなりにはなったのだけど、macでの(追記:編集キーを使うと) PageUp/PageDown Home/End 等のデフォルト動作が windows とは違う習慣になっていてちくちくとつらい(移動じゃなくてスクロールだけって何それ ... 行頭/行末/頁移動/ファイル先頭末移動、がことごとくwinと違ってた)
(追記:mac側は 頁移動=単語移動(OPTION+←→), OPTION+PageUp/PageDown, 行頭移動=COMMAND+←, 行末移動=COMMAND+→, ファイル先頭移動=COMMAND+HOME,ファイル末移動=COMMAND+END, 検索=COMMAND+F, 置換(アプリで違うけど標準のエディタでは)=OPTION+COMMAND+F)

作成にあたってはググっていろいろ参照…ちゃんと控えてなかった。まあ 2 ストロークキー以外は難しいことはなかったです。
2 ストロークキー関係はあまり情報なさそうで、一番役立ったのは こちら。(あと、VZ化されてるこちとか)
見よう見まね、やった結果は先の private.xml にありますが、ほんとうにこれでよいのかは自信なし。少なくともうちでは動いてるということで。

(追記: 2ストロークキーの設定では参考元にあるように config_only を使用。使わずオーソドックス?な方法だとたしかに "キーリピートが止まらない" 症状でした。ただ VK_CONFIG_SYNC_KEYDOWNUP_???? の使い方がよくわからずウマく設定できず、他の方の2ストロークキーの設定で使われてる VK_CONFIG_FORCE_ON/OFF を真似ねてみたところ希望の動作になりました。
あと、private.xmlの定義順で2ストローク用キー(Q)より先に1ストロークのキー(SDEXAFRC)が定義されていると2ストローク目のキー(SDEXAFRC)が1ストロークのキーとして処理をされてしまうようで、Qの定義を先に行なっています)

 AppsキーをFN にするのは一見 PCKeyboardHack で出来そうに思えたけど変更元となるAppsキーが一覧にないので、KeyRemap4MacBook で試してみたら意図通り動いてくれた、といった代物. (実際使うことがあるかというと ... 音量操作は便利かも、と使うようになった)(追記: Apps キーを使うには PCKeyboardHack でチェックマーク付けて有効にしておく必要あり) [追記] 使ってなかったら...いつの間にか機能しなくなっていた模様(OSバージョンアップ付近?)

※他の方の設定みてるとアプリケーション別とかの対応をされてたりして、結構高度なカスタマイズできるようですが、そこまでの気合はなく.

※ 編集キーの役割が違うので配置的にPCキーボードに拘る必要ないけれど、キータッチ感のために変える値打ちはある……が、テンキーレスキーボード、リアフォ 91U を繋ぐと右側の日本語キーボード配置な記号群が英語キーボード準拠に化ける。数字キー部分の記号は日本語準拠なので解せない。FILCOの茶軸やFujitsuの8769 を繋ぐと問題なく入力できたのでそちらを使えばいいのだけど、ちと敗北感あり。

※追記:そもそも己がダイヤモンドカーソル使うようになったキッカケが、むかーし FM-11(OS-9)とPC98(DOS)を使ってたからで、違う文化圏のマシンを触る限り二十ウン年前と問題はかわらんし解決方法もまた……なんですが、どうせ覚えるなら emacs やら vi(m) のほうが幸せだったかもな、です(今更その気はないけれど)。unix系osは生き続けemacs,vimユーザーも新規ユーザーがいるわけですが、 DOS(CP/M) 系の操作は Windows に殺されたので、未だにダイヤモンドカーソルに拘ってる人はおそらく40代付近以上……滅んだ操作体系で 小指痛くなることもあるけれど 左手のみですむ移動操作は(特に左利きには) それなりに幸せかもとは、言っておこう。

テキストエディタ物色中

さて、最低限キーボードを触る気になれるようになったけれど、問題は常用できそうなテキストエディタがあるか……まだ物色中。

決定打は今のところなし。Windowsではなんだかんだで秀丸(VisualStudio風キーカスタマイズ)に慣れすぎて……全角空白可視化したいしvz由来のスタック型カット&ペースト必需だし tsv,csv モードもなるべくほしくetc…(後半わがままなのは自覚. 正直エディタを使いこなせてるかというと?な奴だし)

NxWineで秀丸 は 思いの外動いてくれて良さげだったけれど、細かい不具合はあるにはあるし、キー操作でタブ切り替えると窓のフォーカス離れるのでいちいちマウス操作することになり今は諦め。(他の商用winエミュソフト使えばマシなんだろうか?)

性能的には sublime text 2/3 がよさそうだけどシュアウェア購入に見合うかは微妙. この金額払うのなら秀丸で使ってる機能がほぼほしいと思ってしまい…(スタック型カット&ペーストはありそ?なくてもスクリプトでなんとかなりそうな気配だけど tsv,csvモードは無さそ?。アウトライン表示とかはどうだろ). win,mac,linux 用があるのは魅力だけど(ああwin版はime入力窓が追従せず離れて表示されるのは嫌状態).

フリーのだと mi, TextMate2, komodo edit あたりか.

mi は日本人作者だしシンプルでとりあえず使う分にはよさげ……キーカスタマイズが部分的なのでもう少し設定できればと思う(理解が足りてないだけ?)

komodo edit はIDE的要素つよくてテキストエディタとしてはちょっと重め、だけどこれもオープンソースだし win/mac/linuxあるのは魅力か.

TextMate2 は元々商用でそこそこ評判がよかったものがオープンソース化したものらしく高機能、だけどごちゃごちゃしてる感じ、でも日本語の解説頁はままありそう……あ今ググってこれみたらデフォルトでスタック型カット&ペーストできた。これは俄然興味わいてきた

……もうしばらく右往左往してます。




2013-6-16[日]

前回の影響もあって、windowsで動くCコンパイラの機能を比較した頁、

  C言語機能の比較

を書いてみた。ざっくり kr,c90,c99,c11 およびvc・gcc拡張の機能を試してる。
C++目的で初めてC部分だけで挫折したちょっと情けないものだけれど、一応 c/c++互換機能と非互換機能をわけてみたりしてるので C++ 的にも意味はあると思う。




2013-5-26[日] c++03コンパイラの機能実装の比較

昔 ow や dmc のc++の(文法)実装状態をチェックしてる表をみたことあったなあ、と探してみれば、すぐみつかる.

http://cmeerw.org/prog/freecpp/

最終更新が2006で、それ以前のコンパイラの比較だけれど、チェックプログラムのソースが公開されていたので、ow 含むそれらよりも新しい(ヴァージョンの)コンパイラで試してみた。

もとより網羅されてるわけでないし今時のc++11世代のコンパイラの比較としては不十分だけど(SFINAEのチェックもなさげ)、owやdmcが以前よりよくなっているかを見る分には、と。

dmc 8.56ow 1.94.7.1 tdmclang3.1 (+mingw462)vc8vc9vc11bcc 5.5.1
1digraphpassfail[c]passpassfail[c]fail[c]fail[c]fail[c]
2alternative tokenspasspasspasspassfail[c]fail[c]fail[c]fail[c]
3new style castspasspasspassfail[c] / 実質passpasspasspasspass
4boolpasspasspasspasspasspasspasspass
5bool conditionpasspasspasspasspasspasspasspass
6mutablepasspasspasspasspasspasspasspass
7explicitpasspasspasspasspasspasspasspass
8typenamepasspasspasspasspasspasspasspass
9covariant returnpasspasspasspasspasspasspasspass
10arrow operator returnpasspasspasspasspasspasspassfail[c]
11overload enumpasspasspasspassfail[c]fail[c]fail[c]pass
12nested class fwd declpasspasspasspasspasspasspasspass
13friend namespace classpasspasspasspasspasspasspasspass
14class name injectionpasspasspasspasspasspasspassfail[c]
15friend name injectionfail[e]passpasspasspasspasspassfail[e]
16static const intpasspasspasspasspasspasspasspass
17delete constpasspasspasspasspasspasspasspass
18return voidpasspasspasspasspasspasspasspass
19new scopingpasspasspasspasspasspasspasspass
20if stmt condpasspasspasspasspasspasspasspass
21switch stmt condpasspasspasspasspasspasspasspass
22while stmt condpasspasspasspasspasspasspassfail[c]
23for stmt condpasspasspasspassfail[c]fail[c]fail[c]fail[c]
24defarg scopefail[c]fail[c]passpasspasspasspassfail[c]
25namespace enumpasspasspasspasspasspasspasspass
26namespace templatepasspasspasspasspasspasspasspass
27namespace template funcpasspasspasspasspasspasspasspass
28using namespace templatepasspasspasspasspasspasspasspass
29template non typepasspasspasspasspasspasspasspass
30explicit template instantiationpasspasspasspasspasspasspasspass
31template default allpasspasspasspasspasspasspasspass
32template default dependent argpasspasspasspasspasspasspasspass
33template template argpassfail[c]passpasspasspasspasspass
34template function explicitpasspasspasspasspasspasspasspass
35new template specializationpasspasspasspasspasspasspasspass
36partial template specializationpasspasspasspasspasspasspasspass
37partial ordering class templatespasspasspasspasspasspasspasspass
38member template classpassfail[c]passpasspasspasspasspass
39member template functionpassfail[c]passpasspasspasspasspass
40bad allocfail[e]passpasspasspasspasspasspass
41bad typeidfail[e]passpasspasspasspasspasspass
42throwing destructorpasspasspasspass (c++11fail[e])passpasspasspass
43koenig lookuppassfail[c]passpasspasspasspasspass
44two phase lookuppasspasspasspassfail[e]fail[e]fail[e]fail[e]
45empty base optpasspasspasspasspasspasspassfail[e]
46return value optpasspasspasspasspasspasspassfail[e]
47static assertionspassfail[c]passpassfail[c]fail[c]passfail[c]
48right angle bracketsfail[e]passpasspasspasspasspassfail[e]
49func predefinedpasspasspasspassfail[c]fail[c]fail[c]fail[c]
50hex float literalpassfail[c]passpassfail[c]fail[c]fail[c]fail[c]
51long longpasspasspasspasspasspasspassfail[c]
52restrictfail[c]fail[c]fail[c]fail[c]fail[c]fail[c]fail[c]fail[c]
53variable arraypassfail[c]passpassfail[c]fail[c]fail[c]fail[c]
54dynamic sizeofpassfail[c]passpassfail[c]fail[c]fail[c]fail[c]
55empty macro argumentpasspasspasspasspasspasspasspass
56enum trailing commapasspasspasspasspasspasspasspass
57flexible array memberpasspasspasspasspasspasspasspass
58compound literalfail[c]fail[c]passpassfail[c]fail[c]fail[c]fail[c]


補足

  • いずれもwin用32bit版コンパイラ. win8でコンパイル&実行.
  • fallにつけてる[c]はコンパイル出来なかった場合、[e]は実行結果で0以外を返した場合、を表してる.
  • 4.7.1tdm は mingw 4.7.1 tdm版.
  • clang v3.1 はllvm公式のmingw用バイナリを、本家 mingw g++4.6.2 の環境に上書きしたもの。
  • 元表にあるow1.6やdmc8.4.5は試していない(インストールしてない)ので元表をみてください.
  • vc8は元表にもあるけれど return void の結果が違ってる.
  • 47,48のみ必要ならば c++11 をコンパイルするオプションをつけている.(他はつけていない. 実はclangの不具合回避)


結果に fail があるチェックについて

  • 1 digraph: 交代記号( '{' が'<:'等) が使えるか.
  • 2 alternative tokens: and や and_eq のような記号の交代予約語が使えるか. ※ iso646.h(ciso646) で同様のものが#define定義されてる
  • 3 new style casts: const_cast<T>(t)のようなc++からのキャストが使えるか。clang が fail になっているのは本題とは別の virtual void A::f(); の実体が定義されていないことによるものでソースを実体定義に修正すれば問題なくパス。(このエラーは clangの挙動でも問題無いと思うけど、他のコンパイラがコンパイルできていることが興味深いかも)
  • 10 arrow operator return: メンバーのoperator->()の返型がT*,T,T&でない場合にコンパイルできるか.
  • 11 overload enum: enum型を基本整数型とは別型として関数オーバーロードできるか?
  • 14 class name injection: クラス名インジェクションが機能してるか ※このソースだと B() : ns::A() {} でなく B::B() : A() {} になっているところ.
  • 15 friend name injection: friend名インジェクションが機能してるか ※class内friend 定義したものはクラス外(非friend)で定義されたものよりも名前検索の順位が低く、またそのことは引数のマッチよりも優先される...ってことかな。
  • 22 while stmt cond: while の条件式でローカル変数を定義できるか
  • 23 for stmt cond: for の条件式(2文目)でローカル変数を定義できるか
  • 24 defarg scope: デフォルト引数スコープの扱いに関するテスト. ow はメンバー関数のデフォルト引数は関数宣言側ならOKだが定義側だとNGのようで、また、関数内での外部関数宣言ではデフォルト引数が使えない模様。bcc5.5.1 はデフォルト引数の問題でなく static const 変数の扱いが定数でないためのfailで、static const int c=3;の代わりに struct B に先立ち enum {c=3}; を定義すれば ok.
  • 34 template template arg: template<template<class T> class T1> のような template template 引数を使えるか
  • 38 member template class: クラス・メンバーとしてclass テンプレートが使えるか. ※ow1.9 はクラス定義内では使えるが、クラス定義外でtemplateを2回使う記述はNG.
  • 39 member template function: クラス・メンバーとして関数 テンプレートが使えるか. ※ow1.9 はクラス定義内では使えるが、クラス定義外でtemplateを2回使う記述はNG.
  • 40 bad alloc: new が メモリー不足の時に bad alloc を投げるか. ※ dm 標準では行えてないが stlport のようにライブラリ実装で対処可能.
  • 41 bad typeid: Typeidの引数が不正だった場合 bad_typeid を投げるか.
  • 42 throwing destructor: デストラクタ中に例外を投げることができるか. ※ clang++ 3.1 では通常は問題ないが -std=c++11 をつけでコンパイルすると実行時にハングした.
  • 43 koenig lookup: koenig lookup(ADL) が機能してるか. (関数呼出で、その引数の型が定義されている namespace から関数名をみつけられるか)
  • 44 two phase lookup:スコープ違いで同名のある関数の呼出が正しく行われるか
  • 45 empty base opt: 継承元class(struct)にメンバー変数が無い時0バイトにオプティマイズするか
  • 46 return value opt: クラス変数を返す時、コピーを発生させないようオプティマイズするか (VCはオプティマイズ指定しないとコピーになる)
  • 47 static assertions:[c++11]: static_assert があるか
  • 48 right angle brackets:[c++11]: templateで閉じカッコ2つを 空白を入れずくっつけて >> と記述して大丈夫か
  • 49 func predefined:[c99, c++11]: 関数名文字列 __func__ が使えるか
  • 50 hex float literal:[c99, c++11]: 16進数浮動小数点表記が使えるか
  • 51 long long:[c99, c++11]: long long を使えるか ※ bcc5.5.1は __int64 ならある
  • 52 restrict:[c99]: restrict 指定が使えるか. ※ c++11には入らなかった機能.
  • 53 variable array:[c99]: 動的ローカル配列が使えるか. ※ c++14に入るかもらしい(?)
  • 54 dynamic sizeof:[c99]: 動的ローカル配列に対するsizeofが機能するか ※ c++14には入らない.(c++のsizeofはあくまでコンパイル時に決定できるモノのみ)
  • 55 empty macro argument:[c99]: 空のマクロ引数を許容するか ※ bcc はこのソースでは大丈夫だが、引数が1つの場合 NG
  • 58 compound literal:[c99, c++11]: (struct A){1, 2} のような構造体リテラル表記できるか.

bcc 5.5.1 を表に加えるんじゃなかった...面倒増えてしまった(いや本当はpassしてるのもひと通りみたほうがよいくらいだけど)
vc が overload enum、two phase lookup あたりを修正しないのは、互換性がらみなんでせうかね? (既存の巨大ソースだと意図せず依存してそうな場合もありえそうだし).




2013-5-21[火] open watcom v2

年始くらいに某2chスレで 年末に2.0でるかも(ソースはニューズグループ)、とか書かれていて、けれど、watcom のサイトのデイリービルドみてもちっとも進んでなさそうで、ほんとかしら、と首をかしげてたのですが、今日、検索しててみかけました。

https://github.com/open-watcom

どうやら open watcom v2 を非公式にフォークしてたらしい。 リポジトリ覗くと、24時間以内の更新とかあって、そこそこ活動してそうな雰囲気。 といってもスタッフ的にお二人の名が書かれていたのでこじんまりとしたものなんだろうけど。

v2 ってことは Version 2 todo list の内容を目指しているのでしょうかね。どうなんだろ。watcom c++ の実装自体は c で書かれていて結構大変そうにも思いますが... まあちょっと楽しみです。




2013-5-20[月] stlport 5.2.1 for dmc,Open Watcom

今更ながら(現実逃避がてら) stlport 5.2.1 を Open Watcom 1.9 や dmc 8.56 に対応してみてた。ow のほうはそれなりになった気もするが dm のほうはリンカのこともあっていまいちかも。(何か根本的に見逃しているような気もする)

前回 stlport いじってたのが3年前……時間立つのは速いなあ。5.2.1がrelease最新版のままで開発自体は進んでなくもないけれど、vcでさえ面倒臭そうだったのと、watcom への対応を思うと古いコンパイラへの対応が残っているほうが無難そうに思えて結局5.2.1。(追記: 最近の開発版のほうはどうもunix系でc++11対応のg++のみなのかも. vcはおろかmingwもだめそう)

面倒くさいといえば付属のbuild環境も面倒で無視した。手抜きでバッチでコンパイル。ow,dmc以外にコンパイル試したのは vc(7.1,9,11), mingw g++4.7.1tdm版(32bit/64bit), bcc5.5.1。(ああ mingw 64bit対応が一番マトモな作業かもしれない……動作確認不十分だけど)

作業の参考にと pointer_specialization.txt「コンフィグレーション マニュアル」 をいつものごとく翻訳サイトの訳を手直ししたりしてみたが……コンフィグは内容古くて実際には結構廃止されてたり追加されてたりするようで少し徒労感有り。

と、ま、モノは stlport521dmow2.zip(txt)
(追記5/31: clang3.1(+ming4.6.2) の設定を追加)




2013-5-19[日] optlink のコンパイル

仕事が一段落したので放置していた諸々に手をつけねば、だけど、忙しい最中の現実逃避の残滓を先に…とグダグダ。現実逃避で dmc や ow で遊んでたのですが、dmc ってc++としてはowよりよさげだけどリンク時にハングしたり-gでデバッグ付でまともに動かせなかったりと optlink がかなりネック。交代のリンカ探すもデバッグ機能対応してるやつなんてそうそうなく…で灯台下暗し。optlink 自体がオープンソース化されてたようで dm856c よりも新しいソースがコミットされてた。コンパイルして使うとハングとか -g の具合が改善されてる模様。(といっても -g付きでちょっと大きいリンクすると Error 168: >64K Global Types の刑なのは変わりませんが)

とりあえず、コンパイルメモ
  https://github.com/DigitalMars/optlink
より ソースを入手 (己はzipをダウンロード). また
  http://www.robpol86.com/index.php/ImageCFG
より imagecfg.exe というツールをダウンロード。

 コンパイルには dmc と vc(9) が必要。(express版 でいけるかは未確認)。 vc の nmake と ml(マクロアセンブラ) あたりを使っているよう。
 dmc は必ず ドライブのルートに
    \dm
としてインストールされていること.( \dm にインストールしていない場合は、 別途インストールするか、win7以降ならば mklink /d \dm \hoge\hage\dm 等でリンクするなりして)

dmcとvcのパスを通し(vcvars32.bat 実行後 set path=x:\dm\bin;%path% をするなり)、 imagecfg.exe をパスの通ったところに置いておく.(不精して dm\bin に掘り込んだ)

ダウンロードしたzip を \dm があるドライブの適当なフォルダに解凍。 (gitで取得のほうが普通か?). 一応 開発者と同じ状態にするならば
   \cbx
というフォルダを用意してそこに展開.

その中の
   build_optlink.bat
を実行(他のバッチは気にしない)、コンパイルに成功していれば
   optlinkc\os2link\objnt\link.exe

ができているので、dm\bin に上書きコピー。


追記 dmd 2.063 (及びそれに対応するdmc.zip)付属のlink.exeは2013/04 の修正が反映されたバージョンになったようで、わざわざコンパイルしなくてもよくなった。




2012-12-14[金] boost::container で俺俺アロケータ

これは C++ Advent Calender 2012 14日目 の記事です。

C++11やboostをまだロクに使っていない人間なので、雰囲気を掴むために boost1.52 の boost/container フォルダを一寸覗いてみました。 new,delete等メモリーアロケート のコストを無視できないターゲットを扱うことも多いので、俺俺アロケータを渡してみたいってのもあり。 C++11仕様でアロケータが今までより楽にかけるようだし、scoped_allocator_adaptor も何か使えそうですし.

※いまだvc9をおもに使ってるので(vc12も使いますが)、C++11の記述はさけてます.

boost::container

boost::container ですが、C++11で仕様拡張された vector,list,map,set,deque 等のコンテナの機能を C++03コンパイラでもなるべく使えるようにした互換コンテナ群+α です。 C++11 で増えたコンテナ(array, unorderd_map 等)については すでにboostに実装があるためか(?) boost::container には含まれていません。詳しいことは こちら とか他のサイトにあたってください。

将来的にどんどん変わっていく部分も多々あるでしょうが、とりあえず boost_1_52_0/boost/container/ フォルダで wc してみると、41ファイル 27613 行(detailフォルダ含)。 実際には container 外のboostヘッダをいろいろinclude しているので実質はもっと大きいです(map,set(tree)等は boost::intrusive のものを使っているようです)。 (ちなみに boost_1_52_0/boost/ では 8779ファイル 約172万行、やっぱりデカいです)

boost/container/ 直下にあるファイルは

allocator_traits.hpp std::allocator_traits 互換
string.hppstd::string 互換
vector.hppstd::vector 互換
deque.hppstd::deque 互換
list.hppstd::list 互換
map.hppstd::map・std::multimap 互換
set.hppstd::set・std::multiset 互換
scoped_allocator.hppstd::scoped_allocator 互換
scoped_allocator_fwd.hpp(scoped_allocator の最小宣言)
slist.hpp古のslist の拡張版
stable_vector.hpp vector<T*>で要素を別途アロケートのvector
flat_map.hppvector< pair<KEY,VALUE> > 風実装で mapインターフェースを持つコンテナ
flat_set.hpp(上記の std::set 風実装)
container_fwd.hppboost::container
detail/ 詳細実装のファイル群

(ptr_container のような)既存のstdコンテナを継承して拡張(メンバー関数追加)とかではないです。 (といっても boost::intrusive 等 boost内の他のライブラリはよく使われています)

次に、いくつかコンテナについて。

vector

ざっくりメンバー変数の部分だけ抜き出してみて、

template <class Allocator>
class vector_alloc_holder {
    struct members_holder : public Allocator {
        pointer     m_start;
        size_type   m_size;
        size_type   m_capacity;
    }
}
template <class T, class Allocator>
class vector : vector_alloc_holder<Allocator>;

(SGI版派生等)他の実装だと全てポインタで管理していることが多いですが、この実装はsize,capacityを個数で持っています(個人的にはデバッグ時にメンバー変数で見れるので好み)。

Allocatorは、(非static)メンバー変数がない場合に実質 0バイトになるよう struct の継承元になっています。
stlの実装では 多少の差違はあれ Allocator は (非static)メンバー変数になっていることが多いですが、 C++03 の場合 static メンバー変数で持つのも有りだったようで、実際そうなっていたコンパイラもありました。
C++11 では scoped_allocator_adaptor のこともあるし Allocator は (非static)メンバー変数必須のようです。

ということで C++11なら

// 1回 N個 アロケートするだけの Allocator
template<typename T, unsigned N>
class SampleAllocator1 {
public:
   typedef T value_type;
   SampleAllocator1() { }
   T* allocate(unsigned n) { assert(n == N); return reinterpret_cast<T*>(buf_); }
   void  deallocate(T*, unsigned) { }
   bool operator == (SampleAllocator1 const & ) const { return false; }
   bool operator != (SampleAllocator1 const & ) const { return true; }
private:
   typedef double buf_t;
   buf_t   buf_[(N*sizeof(T)+sizeof(buf_t)-1) / sizeof(buf_t)];
};
//typedef std::vector<int, SampleAllocator1<int,1024> >  Int1024Vector;
typedef boost::container::vector<int, SampleAllocator1<int,1024> >  Int1024Vector;
Int1024Vector  g_intVec;

みたいな真似をしても大丈夫のはず...と書いたけど上記はたぶん boost::container に依存しています.
(ターゲット環境で mallocの準備前に(固定サイズの)コンテナを使いたい...こともあった)

list

実装は boost::intrusive の定義も多く面倒なので、かなり端折って (boost::container としてでなく) ありそうな list 実装のメンバーの雰囲気として以下 (すみません、後付で boost::container からめたはいいけど対処しきれず...)

class Node_Base {
    Node_Base* next_;
    Node_Base* prev_;
};
template<typename T>
class Node : Node_Base {
    T     value_;
};
template<typename T, class A >
class List : A {
    ListNode_Base root_;
    size_t        size_;
};

かなりいい加減ですが、メモリーの雰囲気がわかれば...

map,multimap, set, multiset

map,set は たいてい赤黒木 実装のようで、boost::container では boost::intrusive を使ってるようです。
で、これも メモリーの雰囲気だけ...

class Node_Base {
    Node_Base* left_;
    Node_Base* right_;
    Node_Base* parent_;
    bool       balance_;
};
template<typename T>
class Node : Node_Base {
    T     value_;
};
template<typename T >
class Tree : A {
    Node_Base root_;
    size_t    size_;
};


List や Map は 渡された アロケータをそのまま使うのではなくて、allocator のメンバーの

template <class U> struct rebind { typedef allocator<U> other; };

を用いて、 T でなく Node<T> の allocator を使っています。 また、allocator への要求は通常 1個単位になると思います。

ということで、list や map の俺俺アロケータとしては、ノードサイズ固定のメモリーをプールしておく、というのが考えられます。

template<unsigned B, unsigned N>
class SampleAlloc2 {
public:
    SampleAlloc2() {
        for (unsigned i = 0; i < N-1; ++i)
            buf_[i].link = &buf_[i+1];
        buf_[N-1].link = NULL;
        root_ = &buf_[0];
    }
    void* allocate(unsigned n) {
        assert(n == 1 && root_);
        Link*   p = root_;
        root_ = p->link;
        return p;
    }
    void  deallocate(void* t, unsigned n) {
        if (t) {
            assert(n == 1);
            Link*   p = reinterpret_cast<Link*>(t);
            p->link   = root_;
            root_     = p;
        }
    }
private:
    union Link {
        Link*   link;
        char    b[B];
    };
private:
    Link*       root_;
    Link        buf_[N];
};
enum { ELM_SIZE = 32 }; // コンテナのノードを含んだ要素のバイト数.
enum { MAX_SIZE = 16 };
template<typename T>
class SampleAllocator2 : public SampleAlloc2<ELM_SIZE,MAX_SIZE> {
    typedef SampleAlloc2<ELM_SIZE,MAX_SIZE> base_type;
public:
    typedef T value_type;
    SampleAllocator2() {BOOST_STATIC_ASSERT(sizeof(T) <= ELM_SIZE);}
    T* allocate(unsigned n) { return reinterpret_cast<T*>(base_type::allocate(n)); }
    void  deallocate(T* t, unsigned n) { base_type::deallocate(t, n); }
    bool operator == (SampleAllocator2 const & ) const { return false; }
    bool operator != (SampleAllocator2 const & ) const { return true; }
};
// list
typedef SampleAllocator2<int>  IntAllocator;
typedef boost::container::list<int, IntAllocator > IntList;
// map
struct cstr_less {
    bool operator()(const char* l, const char* r) const { return strcmp(l,r) < 0; }
};
typedef std::pair<char const* const,int> smpPair_t;
typedef SampleAllocator2<smpPair_t> SmpPairAllocator;
typedef boost::container::map<const char*, int, cstr_less, SmpPairAllocator >	StrIntMap;

※ 要素(ノード)サイズ(ELM_SIZE)が直うちでみっともないですが、とりあえずは。

deque

(実装面倒なのと、ターゲットであまり使わないし... いえ、時間切れ. 後日に何か)

string

std::stringは(C++03では)ライブラリごとに結構実装がばらけています(EffectiveSTL に載ってるのとか)。 c++11 で縛りがきつくなったので多少にかよってくるかもですが、それでもいろいろできそうです。

最小限としては vector と同様の内容になりそうですが... boost::container::string から端折って抜き出してみると

 struct long_t {
    size_type      is_short  : 1;
    size_type      length    : (sizeof(size_type)*CHAR_BIT - 1);
    size_type      storage;
    pointer        start;
 };
 struct short_header {
    unsigned char  is_short  : 1;
    unsigned char  length    : (CHAR_BIT - 1);
 };
 struct short_t {
    short_header   h;
    value_type     data[UnalignedFinalInternalBufferChars]; 
                   // UnalignedFinalInternalBufferChars ≒ (sizeof(long_t)-sizeof(short_header))/sizeof(value_type)
 };
 union repr_t {
    long_raw_t  r;
    short_t     s;
 };

long_t は長い文字列でアロケータを用いる場合で、sizeof(long_t)-α 以内におさまる短い場合は short_t のようにして領域をバッファとして使い動的確保せずにすませる、という工夫がされています。 64bit CPUだと、vector互換でもsizeof(ポインタ)*3=24bytesになりますし、結構ありがたい実装です。 (最近作ってた 俺俺string がまさにこのタイプだった... もうboostのでよく)

※ メモ: ビットフィールドは エンディアン問わず、先に書かれたものが低アドレスに配置される.

stable_vector, flat_map, flat_set

stl コンテナの代用品でなく、vector 実装をベースにした特化版。
stable_vector は、vector<T*> と要素を別途アロケートしたもの。(boost::ptr_vectorの類似品?)
flat_map,flat_set は、vector<T> (mapはT=pair<KEY,VALUE>) にソート状態で登録して、インターフェースがmapやsetになったもの。
各自で俺俺コンテナを作ってそうな類なので(ええ作ってました)、boost にあると楽になりそうです。 (できれば stable_vector を flat_map 化したものもあればうれしいところ)

詳しいことは他のサイトにあたってください。

scoped_allocator_adaptor

C++11 で増えた アロケータです。

scoped_allocator_adaptor を用いれば、例えば map<string,int> のようなコンテナで、ローカルなアロケータをstringとmapで共通で使えるようにできます。
※ 内側のコンテナ(この場合 string)のコンストラクタとして、デフォルトコンストラクタでなくアロケータを引数にとるコンストラクタが使われるようになります。

アロケータをコンテナのメンバーにするので、当然メモリー使用量も増えます(とくに内側のコンテナは数が多くなりやすく)。 ので、コンテナのメンバーにするアロケータはポインタだけにし、実装はさらにその先に用意、といった感じにすることになると思います。

詳しいことは こちら のサイトとかみてもらったほうがいいです。

正直なところ一見ではよくわからず、試してみてなんとなく納得の状態です。

以下、試してみたソース.

#include <stdio.h>
#include <boost/container/map.hpp>
#include <boost/container/string.hpp>
#include <boost/container/scoped_allocator.hpp>
#include <boost/foreach.hpp>

// mapで解放しないこと前提に、スタックで解放無視の簡易アロケータ.
template<unsigned N>
class SampleAlloc3 {
public:
    SampleAlloc3() : size_(0) { }
    void* allocate(unsigned n) {
        assert(size_+n <= N);
        void* p = ptr(size_);
        size_ += n;
        return p;
    }
    void  deallocate(void*, unsigned) { /*dummy*/ }
private:
    typedef double buf_t;
    void*       ptr(unsigned n=0) { return (char*)buf_ + ((n + sizeof(buf_t)-1) & ~(sizeof(buf_t)-1)); }
private:
    unsigned    size_;
    buf_t       buf_[N / sizeof(buf_t)];
};

// map<string,int> のメモリー
template<unsigned SAMPLE_ALLOC3_SIZE>
class Hoge {
public:
    Hoge() : strIntMap_(std::less<String>(), MapAllocator(StrIntPairAlloc(&smpAlc3_))) {}
    void insert(const char* name, int val) {
        //strIntMap_[String(name, &smpAlc3_)] = val;
        strIntMap_.emplace( name, val );
    }
    void printAll() {
        BOOST_FOREACH(StrIntPair p , strIntMap_)
            printf("%s = %d\n", p.first.c_str(), p.second);
    }
private:
    typedef SampleAlloc3<SAMPLE_ALLOC3_SIZE> Alloc;
    template<typename T>
    class SampleAllocator3 {
    public:
        typedef T value_type;
        // SampleAllocator3() : alc_(0) {}  // デフォルトコンストラクタは用意しないほうが安全.
        SampleAllocator3(Alloc* alc) : alc_(alc) { }
        template<typename U> SampleAllocator3(SampleAllocator3<U> const& r) : alc_(r.detail_get_ptr()) { }
        T* allocate(unsigned n) { return reinterpret_cast<T*>(alc_->allocate(n*sizeof(T))); }
        void  deallocate(T* p, unsigned n) { alc_->deallocate(p,n*sizeof(T)); }
        bool operator == (SampleAllocator3 const & ) const { return false; }
        bool operator != (SampleAllocator3 const & ) const { return true; }
        Alloc* detail_get_ptr() const { return alc_; }
    private:
        Alloc*      alc_;
    };
    typedef boost::container::basic_string<char, std::char_traits<char>, SampleAllocator3<char> >   String;
    typedef std::pair<const String, int>    StrIntPair;
    typedef SampleAllocator3<StrIntPair>    StrIntPairAlloc;
    typedef boost::container::scoped_allocator_adaptor< StrIntPairAlloc >           MapAllocator;
    typedef boost::container::map<String, int, std::less<String>, MapAllocator >    StrIntMap;
private:
    SampleAlloc3<SAMPLE_ALLOC3_SIZE>    smpAlc3_;
    StrIntMap                           strIntMap_;
};

void sample3()
{
    Hoge<1024>  hoge;
    hoge.insert("xyz", 1);
    hoge.insert("abcdefghijklmnopqrstuvwxyz", 2);
    hoge.insert("1234567890", 3);
    hoge.printAll();
}

emplace, emplace_back、単に(コピー)コンストラクタの頻度さげるだけじゃなくて、今回のような場合まさに必須の類でした。
共通で使うアロケータ(SampleAllocator3)には デフォルトコンストラクタをつけちゃダメ、というのを実感。
( デフォルトコンストラクタつけてると insertや push_back 使ってもコンパイル通るため... ハマりました)

おわりに

遅刻したうえに、 グダグダな内容ですみません。
(当初の目論見からずれまくり...そもそも deque 調べるため boost::container 見始めたはずが)

例に挙げたソースのとおり allocator の記述に関してはすごく楽でした。 が、boost::contaneier を std:: にかえて vc12 でコンパイルすると全く×だったので boost::contaneier に結構依存していると思います。

時間の余裕なくなってるので、たぶん後日 補足修正書くことになりそうですが...

おつきあいいただきありがとうございました。


15日目は、@yohhoy さんです。


追記: コンパイル試したときのソース



2012-12-12[水] サイト分割

このサイトのプログラミング以外のページをこっちに移した。いろいろ思惑あれど遅々として進まず、けれど年越す前には何かしとこうと... というか、c++ advent calendar に参戦申込(12/14) しちまってたのでその前に多少なりとも、で。(肝心のネタをどうしよう... )




2012-10-27[土] Win8pro インストール

Win8の1200円のアップグレード版をダウンロードした勢いで(サブ機だし)Win7引き継ぎでインストールしたはいいけれど不安定になって結局更地で再インストール中。(OSのインストールは楽ちんになっても各アプリ側が面倒この上なく)

引き継ぎインストール、最初はそこそこいい感じに移行できたように思ったけれど、使いだすと引き継げてるもの・引き継げてないものがあってチグハグだった。

特にWindowsエクスペリエンス計測の このコンピューターの評価 がエラーで動かなかったときは唖然...
原因は、ユーザー環境変数 tmp, temp 。これらの内容は win7 での値が引き継がれていたが 指していたパス(=Ramdisk)は win8には引き継がれないため パス不正のため不具合に化けた模様。

[追記] Win8 設定完了前に メインでつかってる Win7機がお亡くなりになったため win8に強制移住。HDDが生きてたので被害は少ないけれど、元環境のアプリを起動できないのはやっぱり面倒。

[追記2] iPad mini を購入したら一気に win8 熱が冷めてしまった。片手で持ててそこそこ広いってのは思いのほか重要だった模様。寝ころんでpdf読んで寝落ちするのはある種幸せです。




2012-6-3[日] LaVieLight に Win8rp をインストール

久しぶりにサブノートPCを持ち歩こうと思いたち、Win8cp を試しに入れて放置しっぱなしだった LaVie Light BL350/D を復活中。 丁度 Win8 Release Preview が公開したてだったので更地にしてインストールすることにした。

マシンのほうは Atom な netbook の範疇だけど、1366x768 ドットある奴なんで一応 Metoro も大丈夫(なので Cp 版インストールできてた。非力な Atom だけど 1.5GHz 2コア(HT x4) だし、メモリは2GBにHDDはSSD120GBに換装済みなので、それなりに使える感じ)

インストール前に、まず、Microsoft アカウント(Live ID)の氏名欄を 英数のみに変更。

Win8 はPCのユーザー設定で MSなクラウドサービスと連動前提の設定と、そうでない(従来タイプの)設定を選べるが、CP 版時に いろいろ試したく 連動のほうを選んだら、Microsoftアカウント情報に登録してある氏名の“名”の文字列でユーザーが作られてしまったのだった。本名を漢字で設定したままだったから c:/users/本名 な漢字フォルダが作られしまい、古いツールを使う機会もあるプログラマとしては腹立たしい状態だったので、今回はアカウント情報のほうを変えておくことで対処。(CP版のときはこの段階でかなり萎えて余り使わず放置)

更地からなので ISOイメージをDVDに焼いて USB-DVD でインストールした。 途中でプロダクトID を聞かれたので、Webインストール版を実行して手順に従って操作している途中で表示されたプロダクトID を用いた。(この方法でよかったのか不明だがとりあえず動いてる)。

当然インストール開始時には以前インストールしたwindowsの情報は引き継がないほうを選んだのだけど、インストール後デスクトップを選んでみれば壁紙無し単色でタスクバーが縦置き状態……これWin8のデフォじゃないよね? CP版で設定していた己の設定ぽいので、アカウントに紐付された情報が一部あるのかも。

とまOS自体は結構すんなりインストールできたと思うけど、メール設定でミスってしまったようで(ExChangeどうこう持ってないのに選択してしまってエラーは出たと思う)、スタート画面でMailを選ぶとタイトルのみ項目のないアプリが立ち上がるだけ…Metroなアプリってどこで諸設定できるのか……よくわからず放置中。
(間抜けてた。メール画面で右サイドメニュー(右下か右上あたりにマウスカーソル持って行ったら出る奴)の"設定" を選べばメールの設定できた。右サイドメニューの5項目の名前かわらないから、てっきり全体で共通のものかと思ってたらメトロアプリごとに内容は変わってて、デスクトップアプリのメニューバーみたいなものだったのね)

その他アプリのインストールについては、CP版より更にスタートボタン破棄の方向が強められてる感じ。 CP版のときは、タスクバーに新規ツールバーとして

C:\users\(ユーザー名)\AppData\Roming\Microsoft\Windows\Start Menu\Programs

を登録すれば簡易なプログラムメニューとして使うことができたけれど、RPではアプリをインストールしても そもそも このフォルダにアプリのショートカット等は作られず、Metoroなスタート画面にドバっとアイコンが現れる状態。元の(start-プログラムメニューでの)フォルダ構成無視なんで一気にスタート画面がゴミ溜めと化す。全くスタート画面を使わなくてすむならそれでもいいけれど、立ち上げ時に必ず来るしね……しかたないので、右クリックで不要なものをマークして一気にピン止めを外した(ちょっと面倒)。

※ 全部が全部じゃなくて一部(susie)は従来のメニューに現れるものもあった(たぶん START-プログラム・メニューへの登録が今のwinの作法に則っていないのかも)

 

インストールしたプログラムでまともに動かなかったのは TortoiseSVN(1.7.7)。 チェックアウトしたりTortoiseSVNのメニューが閉じられるときにクラッシュする。 それだけでなく Exproler(タスクバー) が不安定になって ゴミ箱を空にしようとしたり タスクバーを自動に隠す設定をやめようとしたらハング(即再起動するが)。
Tortoise??? の仕組みからいって、新規OSでいきなり動かなくてもしかたないとは思うが、使えないのはちょっとつらい。

とりあえず TortoiseSVNをアンイストールして再起動で元に戻ったけれど、最初 アンイストール後シャットダウンで終了して電源ボタンで起動しなおしたら OS不安定のままだったので結構あせった。2,3回やっても変わらずで。再起動を選んだところ"更新します"みたいなメッセージでて再起動後ゴミ箱空にしてもハングしなかったので一安心だけど。Win8からの高速なブートや終了のための仕組みの影響なんでしょうかね。

追記: またゴミ箱空にしたらハングするようになった。FireFox(12)も終了するたびにクラッシュレポータが表示される。 どうやら今度は Google日本語入力が原因だった模様。設定をMS IMEに切り替えたらゴミ箱空にできたしFireFoxも正常終了、googleIMEに切替るとまたハング...うーシステム拡張的なものは結構引っかかる感じなのかな。




2012-2-29[水] pyukiwiki 0.2.0

月末に作業締め日がある場合、さて閏年でよかったと思うべきか... はどうでもよく。

このサイトに使っている pyukiwiki 共同開発版は一時開発が止まってたけどまた再開していたようで v0.2.0p1 が出てたので更新してみた。

wikiプログラムの更新だけでサイト自体のリニューアルというわけではないけれど。でも微妙な修正をちょこちょこ、どうせspamしか書き込まないのだからcommentは無しにしたり(少し寂)、無理にblog風にすることもないなで昔のtop頁に戻したり。 (もう少しいじってからとか思うもその状態で2週間放置だったり。)

pyukikwikiの更新のほうは、久しぶりすぎて、いろいろ細かいこと忘れていてすごく手間取った。自分の改造やプラグインの事情が記憶の彼方なのは当然として、使用した環境じゃ CRLF だとcgi(perl)が動いてくれないことに中々気づかなかったり(本来なら年始に移行するつもりが)

0.1.9あたりから utf-8 専用板が用意されてるようなので、utf-8 版にしようと思ったのも一手間。頁等のutf8へのコンバータプラグインが用意されているけれど、さすがに 0.1.7では駄目のようで一旦 euc(従来)版 の0.2.0環境に移行する必要があり... コンバートだけだからと compact 版を使ったところ動かなかったり(full版は動いてくれた)

改造|自前のpluginの辻褄合わせは微妙に面倒だけどしかたなし。editは改造しなくてもよくなってたけど、calender2とか改造に依存したサイトになってるので... 入れ替える時面倒なので結局 改造プラグインは名前を変えて対処したり。

スキンは 0.1.7で使ってたのがほぼ無変更で使えたのでそのまま. うち向きの仕様も増えてるっぽいので ほんとは 0.2.0 のをベースに作りなおしたほうがいいのだろうけど。

と、pyukiwiki共同開発サイト 見に行ったら 0.2.0p2 のアナウンスが出てた模様。 compact版はやっぱり配布内容がおかしかった模様. (p2にしようかと思うもダウンロードは3/1予定... とりあえずp1のままで)




2011-11-11[金] C++11 を忘れたい、3年くらい

ポッキーの日、と言われてすぐになんのことか思え出せなかった虚け者です...いや、覚えていなくてもいいと思うけれど おすそ分けのポッキー食べたんだからちょっとくらいは覚えておこう>己。で連鎖的に C++11 を思い出す、けど、まともな処理系がでてくる2,3年後までは知らずにすませていたかったというか忘れたい。今 C++ 03 で(ライブラリを)作るものにとっては非常に目の毒です。(と、ま、ただの生存証明)




2011-1-6[木] stlport.org

ひさしぶりに www.stlport.org を見に行ったら消失していて焦ってしまう。 といっても sorceforge にも頁があるので…

というより http://stlport.sourceforge.net/Home.shtml が公式ということか? 左サイドのメニューをちゃんと認識していなかった。 いまさらながらhistoryFAQを見てなんとなく納得。 (放置してた旧サイトのドメインが消失したってだけのことでいいのかな)

あとFAQみて4.6系はいまいちな状態でv4の最後の綺麗な版が4.5.3だったことを知る。dmc用公式 stlport が4.5.3どまりなのはそのへんもあるのかと連想。

現在の最終の公式リリースは 5.2.1(2008) のままだけど、開発版のソースをみると、メジャーバージョン(#define)は 6 になっていた(6に向けての開発中)

C++0xを考慮してるし、あまりに古い仕様のコンパイラは対象外にしていってるよう。 さすがに、メンバー関数テンプレートのサポートは必須扱い、stdint.hも利用してるしで、互換のためにごちゃごちゃしていた記述が省かれたり単純になったりですっきりしてきている。(v4→v5 時ほどではないのだろうけれど)


それと 以前 気になっていた type_traits の ライセンスの "Academic Free License ("AFL") v. 3.0" はやめたようで、(STLport共通の)緩いライセンスに変わった模様。type_traitsだけでなく他のファイルでも "AFL v.3.0" のものは無くなっていた。(以前 そのライセンスの.makファイルのあった buildフォルダごと無くなっている:)

ライセンスについては LICENSE ファイルが同梱されているので、それを確認、と。

[1/8追記] どうも http://stlport.com/ がある模様。消失じゃなくて移転ということなのか?
[5/22追記] 単に一時的に失効してただけみたいでstlport.orgも復活している模様




2011-1-1[土]

あけましておめでとうございます。今年もよろしく。

去年は人生の節目のようなことがあった反面、 総じてグダグダな一年だったので来年はもっと頑張る予定。 いや今年はも少し頑張るです(数え年は気になる)


といったところであいかわらずgdgdだけど、年末に自宅PCを win7(64)に移行した。 vista64 のwindows updateでエラー80070024が出て更新できなくなり、 ググって見つかる試せる解法はすべてダメであとはMSにメールするしかないパターンのようなので…いっそ更地インストール。 動作環境を残しての移行なので、PC崩壊からの移行にくらべれば楽ではあるけれど、時間は掛かるし動作環境復元できないものもやっぱりあるので、毎度のことながら消耗はげしい。

また、そこそこ環境整い、さて年賀状印刷しようとしたら、今度はプリンタ(Canon MP640)がエラー6C10 で動作できず。検索でみつかるモノを見ると、基本、メーカー修理するしかなさそうだ。年末年始修理受け付けてないようなので後日。しかしまだ半年経ってなくてあまり使ってないのに…いやプリンタは使用頻度が低すぎるのがまずいのだろうけど。ああ6C10で引っかかる頁はMP640以外もあるのでCanonの機種はエラーコードを継続しているのだなあ、と当たり前といえばそうだけれど妙に感心してしまった。




<<前の5件次の5件>>