FreeBSD 10.0-RELESE

『紅白歌合戦と日本人』(筑摩選書)なんて本を読んでみた。年末高齢のやつである。まさに高齢 ですな。

昔のNHKの親分が、もう紅白は止めにしようと言って、一時はフェードアウトのフェーズに 入りかけた事もあるそうだけど、いまだにしぶとく生き残っている。いつまで続くか見ものだな。

紅白で謳われた曲の時代背景が書いてあって、興味深く読みましたよ。おいらの記憶に 残ってるのに、みゆきさんが、黒4ダムから中継で謳ったやつね。プロジェクトXのテーマ曲だったな。 市井の人を讃えるというので、大ブレークしたな。

おいら的には思いでに残る曲として、ちあきなおみさんの『喝采』がある。若かりし頃、 北海道へ開拓に行ったおり、場末のスナックのジュークボックスに入っていたんで、よく 聞いたものだ。これとセットで思い出すのが、生クリーム。コーヒーを頼むと、必ず、生クリームが 入った壷が出てきた。もう、お好きなだけ入れて下さいってばかりに、どーんと盛ったやつがね。 何と言う贅沢だったんだろう。県民ショーに登場ですかね。

本を読めない人は、こちら とか 紅白歌合戦の窓をぞうぞ。

喝采はいつだったか、窓で調べたら、1972年だった。故郷を離れて就職し、すぐに北海道へ 開拓に行ったんだな。古い話だ事。

yum update error

今年に入ってから、Fedoraでの yumがエラーを吐くようになってしまった。エラーステータス127 って何やねん? 日を置いてやってもやはりエラーですよ。

わけわかめだったんで、ぐぐってみたら SELinuxが悪さしてるよーですって。解決法は

sudo setenforce 0
sudo yum update

のように、SELinuxを停止してからupdateするんですって。パケフィルター行く手を阻まれて いるから無効にしちゃえってのと一緒ですな。更にぐぐったら、 SELinuxを無効化する なんていう詳しい説明が出てきた。

上記を探してる時に出てきたyumさんがらみのやつ。何かの拍子にパッケージがぶつかって しまったら、どうするの。管理情報はバークレーのDBかなにかに格納されてて、素人には 手が出せない。そんな時の非常用コマンドがあるそうな。 package-cleanup ってのがそれらしい。詳しくはmanで。

       --cleandupes
              Scan  for duplicates in the local RPM database and clean out the
              older versions.

このあたりですかね。更に詳しくは、

[sakae@fedora ~]$ emacs /usr/bin/package-cleanup
  :
import sys
sys.path.insert(0,'/usr/share/yum-cli')

from yum.misc import setup_locale
from utils import YumUtilBase
import logging
import os
import re
import yum.depsolve # For flags

from yum.Errors import YumBaseError
from rpmUtils import miscutils, arch
from optparse import OptionGroup
  :

つらつらと見てくとrpmdbなんて言う単語が出てくるけど、この正体は? 深い不快Pythonの森に分け入って いかないと、正体を暴けないの? そう、yum家はPython族の手厚い庇護の下に成長してきました。

が、去年、yum家の親分と言うか主開発者が交通事故で亡くなり、維持が困難になりつつあるようです。 他の勢力からは、動作が遅いって陰口を叩かれているみたいですしね。

それで、Fedoraの22世代あたりで、新興勢力がyum家を押しのけて、正式採用されるんではと、 盛んに噂されてますよ。Python族って言わないで、Python系yum一家って表現を変えれば、 ほら、山口組系...何とかと一緒なヤクザな世界じゃないですか。恐いですねぇ、 余り近寄らない方が身の為です。

システムの基幹になる部分をPythonに任せるってのは、問題かも知れません。いや大問題だな。 FreeBSDが昔、Perlべったりな蜜月状態を保っていて、気軽にPerlの新バージョンが使えない ってのがあった。 FreeBSDの開発陣は、苦労に苦労を重ね、Perl Freeなシステムに書き換えたいきさつが あります。

Fedora陣も早くPythonべったりから、脱却してくださいな。そうでなきゃ、Python3の推進が 進みませんぜ! あの人が嘆いていますよ。

setup FreeBSD 10

先週出たFreeBSD 10.0 の投入準備をしてる。

pureは新しくなってたので入れてあげた。どうせemacsから使うんだとばかり、emacs24も 入れた。

そしたら、いろいろなやつを引き連れて来る事来る事。何でgccを引き連れてくるんだよう? それはね、emacsっちゃ、GNUの代表的な製品な訳さ。gccの機能をべったりと使っている もんだから、gccじゃなきゃコンパイル出来ない。そしてgccのライブラリーの一部を 自身に取り込んでいる。だからお供を連れてきてるのさ。(余り本気にしないように)

ちなみにFreeBSD10のコンパイラーは、clangになりました。

[sakae@fb10 ~]$ cc -v
FreeBSD clang version 3.3 (tags/RELEASE_33/final 183502) 20130610
Target: i386-unknown-freebsd10.0
Thread model: posix

後はこまごました、screenとか、w3m,sudo,wget,git,lv あたりですかね。版がPCBSDの それより大分上がっていたぞ。

日本語関係って事で、jmanとその原稿を入れようとしたら、pkgにはなっていなかった。 自分でコンパイルしろとな。こりゃ大変だ。

大変と言えば、ghc関係がごそっと抜け落ちていたぞ。やっぱりgcc使いまくりで問題を 起しちゃったんですかね?

5日程経ってから再度カタログを調べてみたら、大分増えていた。ああ、 カタログの作り方は、下記のようにします。いちいち、pkg searchじゃ面倒ですから。

[sakae@fb10 ~]$ w3m -dump http://pkg.freebsd.org/freebsd:10:x86:32/latest/All >CATLOG1
[sakae@fb10 ~]$ wc -l CA*
   21656 CATLOG
   22691 CATLOG1

リリースに間に合わなかったんですかね? 追加された物の中にghcも混ざっていた。

root@fb10:~ # pkg install ghc
Updating repository catalogue
The following 1 packages will be installed:

        Installing ghc: 7.6.3_2

The installation will require 655 MB more space

72 MB to be downloaded

Proceed with installing packages [y/N]: n

展開すると655Mって、浮世離れした容量だな。 真面目に使おうと思うとcabalさんに頼っていろいろなモジュールを追加するはめになるし。 そしたら更に容量が増えるよ。学者さん御用達だから、下々の事は これっぽちも考えていないのね。fedoraに入っているんで、入れるのは止そう。 DISKがもったいない。使うアプリによってOSを選ぶって事で良いですかね。

そういう使い方こそ、浮世離れしてまっせ。

X Windows

ついでにXも入れておこうとしたんだ。難しいのはいいんで、twmとxinitがあればいいかな。 入れて、startxしようとしたら、肝心要のXが無いと言う。追加でxorg-7.7を入れようと したら、先住のxfree86がらみとバッティングするとか言われて、同居してくれなかった。

しょうがないので、いの一番にxorgを入れるか。それには、今入ってるpkgを一度 綺麗さっぱりと消すのが手っ取り早いな。それにはどうする。/usr/localと/var/db/pkgを 強引に消すか。それって、暴力的過ぎないかい! 平和裏に解決しましょ。

pkg delete -a -f

フォースの力(-f)を借りて、みんな(-a)消えてくれ。リポジトリィーがまだ海外に しか無いみたいで、DLに時間がかかったよ。早く、国内設置をきぼんぬ。

で、Xを起動したらマウスもキーボードも効かない。なんだいこれってんで、ハンドブックを みたら、/etc/rc.confに

hald_enable="YES"
dbus_enable="YES"

vmware_guest_vmblock_enable="YES"
vmware_guest_vmhgfs_enable="YES"
vmware_guest_vmmemctl_enable="YES"
vmware_guest_vmxnet_enable="YES"
vmware_guestd_enable="YES"

を書いておくとな。ああ、vmware何とかは、open-vm-toolbox-cmdを入れた時の おまじないです。誤利益あるか知らんけど。haldを使いたく無かったら、自分でxorg.confを 生成すればいいのかな? 面倒だからやらないけど。.xinitrc も、面倒かけずにさくっと 設定してます。

vmware-user-suid-wrapper &
emacs -r -g 80x42+0+0 &
twm

勿論、.twmrcにも、emacsを起動するメニューを付けておきました。

文字化け

普段Xは上げないので、PuTTYからリモートログインしてCUIの世界に生きている。問題発覚。 ログインした端末からw3mとかすると文字化けするんだ。可笑しいなあってんで、PCBSDの 端末から入ると、綺麗に日本語を表示する。Xを上げてその上からemacs-w3mしても綺麗に 表示するし。。更に調べるってんで、一度ログインした端末から他のマシンや自分自身に sshすると化ける。

これは、PuTTYが何か悪さしてると(初回ログイン時のネゴ・ミスとか)予想して、TeraTermからログインしてみると、こちらも 綺麗に表示してくれる。これって、どゆ事?

PuTTYの設定は、他のマシンへ接続する時のものをそのまま使っていたんだけど、若しやと 思って見直してみた。そしたら、設定カテゴリーの変換の所がUTF-8になってた。ここを UTF-8(CJK)にしてみた。 そしたら、文字化けが解消した。これで大丈夫かと思っていたら、screenコマンドで新たに 生成した画面からw3mを使うと、やはり文字化け。問題はscreenに移った訳だ。

昔の設定に書いたおいた、

bind 'u' eval "encoding utf8" "stuff 'export LANG=ja_JP.UTF-8\012'"
bind 'e' eval "encoding euc" "stuff 'export LANG=ja_JP.EUC-JP\012'"

これを活用してあげますかね。PCBSDでは、こんな使い分けしなくても問題無かったんだけどね。 世の中、Changeしてるんだね。ちなみに、上記を活用するには、prefix+eとかします。 やれやれ、お疲れさん。

ちなみに、UTF-8(CJK)のCJKって、中国、日本、韓国の意味だよね。文字コードの世界じゃ、 CJKって同じカテゴリーで仲良くやってるのね。これにベトナムを加えて、 CJKV日中韓越情報処理なんていう本まで 出てるってのに、現実世界ではいがみ合ってる。

ちなみに、この本の原著者はアドビの人。 彼からしたら、東方見聞録の研究成果みたいなものなのかな。極東って言い方もあるな。 PDF 千夜一夜にも取り上げられているよ。

chicken

TVの旅番組で、寒うなぎなんてのをやってた。熱い時は勿論、寒い時も食べて寒さに打ち勝って 下さいってね。食べたいのは山々なんだけど、高くて手が届かないよーーーー。 ってんで、親子丼で我慢しましょって話になった。まあ、妥当な線だわな。

という事で、2011年にやった、chickenとeggsをやってみる事にした。gaucheはfedoraに 入ってるから避けてね。gambitって手も一瞬思ったんだけど、鰻の代替に親子丼はうってつけ。 日本食ブームですからね。

心配したccがclangってのもどうやら乗り越えて、玉子がいろいろとやってきましたよ。

[sakae@fb10 ~/src]$ chicken-status 
abnf ............................................................ version: 6.1
advice .......................................................... version: 0.3
 :
utf8-srfi-13 .................................................. version: 3.3.9
utf8-srfi-14 .................................................. version: 3.3.9

utf8-srfi-13は、fmtモジュールに釣られて入ってきたものです。ああ、肝心な本尊の確認を 忘れておったわい。

#;1> ,r
Features:

  chicken           chicken-4         chicken-4.8
  clang             csi               data-structures
  dload             extras            files
  freebsd           hygienic-macros   irregex
  irregex-is-core-unit                little-endian
  lolevel           manyargs          module-environments
  ports             ptables           srfi-0
  srfi-1            srfi-10           srfi-11
  srfi-12           srfi-13           srfi-14
  srfi-15           srfi-16           srfi-17
  srfi-2            srfi-23           srfi-26
  srfi-28           srfi-30           srfi-31
  srfi-39           srfi-4            srfi-46
  srfi-55           srfi-6            srfi-6
  srfi-61           srfi-62           srfi-69
  srfi-8            srfi-88           srfi-9
  srfi-98           syntax-rules      unix
  utils             x86

Machine type:           x86
Software type:          unix
Software version:       freebsd
Build platform:         clang
Installation prefix:    /usr/local
Extension path:         /usr/local/lib/chicken/6
Include path:           (/usr/local/share/chicken)
Symbol-table load:      1.38
  Avg bucket length:    1.84
  Total symbol count:   4154
Memory: heap size is 2099294 bytes with 1449755 bytes currently in use
nursery size is 262144 bytes, stack grows downward
Command line:           ("csi")

clangサポートも有りますって、どゆ事?

pkg

新しいpkgシステムになったんで、少々その方面の探検をしときます。適当にmanを漁ると 関連ファイルが出てきた。落としてきたpkgファイルがキャッシュされてるのね。場所は、

[sakae@fb10 ~]$ du -sh /var/cache/pkg/All/
457M    /var/cache/pkg/All/

直接触っちゃだめってんで、コマンドが用意されてるのは容易に想像が付く。yumと瓜ふたつですから。

NAME
     pkg clean -- Cleans the local cache of fetched remote packages.

SYNOPSIS
     pkg clean [-anqy]

DESCRIPTION
     pkg clean is used to cleanup the local cache of packages downloaded from
     remote repositories.  It removes packages that have been superseded by
     newer versions, and any packages that are no longer provided.

あと、/var/db/pkgの下にあるsqlite3のファイルとxmlファイルね。xmlの方は何だか分からんかったけど、他の やつは、名は体を表すっていうぐらいすっきりな名前が付いてた。 そのうちの一つを見てみる。

[sakae@fb10 /var/db/pkg]$ sqlite3 local.sqlite
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> SELECT * FROM sqlite_master;
table|packages|packages|2|CREATE TABLE packages (id INTEGER PRIMARY KEY,origin TEXT UNIQUE NOT NULL,name TEXT NOT NULL,version TEXT NOT NULL,comment TEXT NOT NULL,desc TEXT NOT NULL,mtree_id INTEGER REFERENCES mtree(id) ON DELETE RESTRICT ON UPDATE CASCADE,message TEXT,arch TEXT NOT NULL,maintainer TEXT NOT NULL, www TEXT,prefix TEXT NOT NULL,flatsize INTEGER NOT NULL,automatic INTEGER NOT NULL,locked INTEGER NOT NULL DEFAULT 0,licenselogic INTEGER NOT NULL,time INTEGER, manifestdigest TEXT NULL, pkg_format_version INTEGER)
index|sqlite_autoindex_packages_1|packages|3|
table|mtree|mtree|4|CREATE TABLE mtree (id INTEGER PRIMARY KEY,content TEXT NOT NULL UNIQUE)
  :
trigger|options_insert|options|0|CREATE TRIGGER options_insert INSTEAD OF INSERT ON options FOR EACH ROW BEGIN INSERT OR IGNORE INTO option(option) VALUES(new.option);INSERT INTO pkg_option(package_id, option_id, value) VALUES (new.package_id, (SELECT option_id FROM option WHERE option = new.option), new.value);END
trigger|options_delete|options|0|CREATE TRIGGER options_delete INSTEAD OF DELETE ON options FOR EACH ROW BEGIN DELETE FROM pkg_option WHERE package_id = old.package_id AND option_id = ( SELECT option_id FROM option WHERE option = old.option );DELETE FROM option WHERE option_id NOT IN ( SELECT DISTINCT option_id FROM pkg_option );END

上のやつが、マスターテーブルってやつらしい。sqlで生きていくのに絶対に必要になるテーブル類の登録情報。 OSで言うとファイルシステムみたいなものかな。

sqlite> .schema
CREATE TABLE packages (id INTEGER PRIMARY KEY,origin TEXT UNIQUE NOT NULL,name TEXT NOT NULL,version TEXT NOT NULL,comment TEXT NOT NULL,desc TEXT NOT NULL,mtree_id INTEGER REFERENCES mtree(id) ON DELETE RESTRICT ON UPDATE CASCADE,message TEXT,arch TEXT NOT NULL,maintainer TEXT NOT NULL, www TEXT,prefix TEXT NOT NULL,flatsize INTEGER NOT NULL,automatic INTEGER NOT NULL,locked INTEGER NOT NULL DEFAULT 0,licenselogic INTEGER NOT NULL,time INTEGER, manifestdigest TEXT NULL, pkg_format_version INTEGER);
CREATE TABLE mtree (id INTEGER PRIMARY KEY,content TEXT NOT NULL UNIQUE);
CREATE TABLE pkg_script (package_id INTEGER REFERENCES packages(id) ON DELETE CASCADE ON UPDATE CASCADE,type INTEGER,script_id INTEGER REFERENCES script(script_id) ON DELETE RESTRICT ON UPDATE CASCADE,PRIMARY KEY (package_id, type));
CREATE TABLE script (script_id INTEGER PRIMARY KEY,script TEXT NOT NULL UNIQUE);
CREATE TABLE option (option_id INTEGER PRIMARY KEY,option TEXT NOT NULL UNIQUE);
CREATE TABLE option_desc (option_desc_id INTEGER PRIMARY KEY,option_desc TEXT NOT NULL UNIQUE);
  :
CREATE TRIGGER options_update INSTEAD OF UPDATE ON options FOR EACH ROW BEGIN UPDATE pkg_option SET value = new.value WHERE package_id = old.package_id AND option_id = ( SELECT option_id FROM option WHERE option = old.option );END;
CREATE TRIGGER options_insert INSTEAD OF INSERT ON options FOR EACH ROW BEGIN INSERT OR IGNORE INTO option(option) VALUES(new.option);INSERT INTO pkg_option(package_id, option_id, value) VALUES (new.package_id, (SELECT option_id FROM option WHERE option = new.option), new.value);END;
CREATE TRIGGER options_delete INSTEAD OF DELETE ON options FOR EACH ROW BEGIN DELETE FROM pkg_option WHERE package_id = old.package_id AND option_id = ( SELECT option_id FROM option WHERE option = old.option );DELETE FROM option WHERE option_id NOT IN ( SELECT DISTINCT option_id FROM pkg_option );END;

そして、こちらがそのアプリケーションと言うかファイルと言うか。 (SQLの世界じゃ、テーブルがファイルに相当だもんなあ)いろいろなテーブルが有りますなあ。トリガーって、何か 起きた時にそれに付随してやる動作だったかな。ごちゃごちゃしてるんで、どんなテーブルが 有るかだけでも、さっと確認しておきましょ。

sqlite> .tables
annotation           options              pkg_script
categories           packages             pkg_shlibs
deps                 pkg_annotation       pkg_shlibs_provided
directories          pkg_categories       pkg_shlibs_required
files                pkg_directories      pkg_users
groups               pkg_groups           script
licenses             pkg_licenses         scripts
mtree                pkg_option           shlibs
option               pkg_option_default   users
option_desc          pkg_option_desc

雰囲気からして、pkgの処理はsqlになるべく任せてしまいましょって感じがするけど、 どうなんでしょ。そんなの、ソース嫁。

/usr/sbin/pkgは、/usr/local/sbin/pkgをロードする為の仕掛けなのね。実体は、pkgに なっているという2段ロケット方式。ソースのお取り寄せも面倒なので、バイナリーに 直接当たってみます。

[sakae@fb10 /usr/local/sbin]$ strings pkg | grep SELECT
(SELECT %s FROM %sdeps AS d WHERE d.package_id=p.id)
(SELECT %s FROM %sdeps AS d WHERE d.origin=p.origin)
(SELECT %s FROM %spkg_categories AS d WHERE d.package_id=p.id)
(SELECT %s FROM %sfiles AS d WHERE d.package_id=p.id)
(SELECT %s FROM %soption JOIN %spkg_option USING(option_id) AS d WHERE d.package_id=p.id)
(SELECT %s FROM %spkg_directories AS d WHERE d.package_id=p.id)
(SELECT %s FROM %spkg_licenses AS d WHERE d.package_id=p.id)
(SELECT %s FROM %spkg_users AS d WHERE d.package_id=p.id)
(SELECT %s FROM %spkg_groups AS d WHERE d.package_id=p.id)
(SELECT %s FROM %spkg_shlibs_required AS d WHERE d.package_id=p.id)
(SELECT %s FROM %spkg_shlibs_provided AS d WHERE d.package_id=p.id)
(SELECT %s FROM %spkg_annotation AS d WHERE d.package_id=p.id)

同様にしてINSERTを探してみたけど無かったぞ。pkg-staticに有るかなあ。考えてみるに、テーブルへの 追加だ削除とかは、pkgが提供してるライブラリィ類もいじられる可能性が有るから、静的に なってないと、困っちゃうなーーん、と、山本リンダ風。

[sakae@fb10 /usr/local/sbin]$ strings pkg-static | grep INSERT
  :
INSERT INTO deps (origin, name, version, package_id) VALUES (?1, ?2, ?3, ?4)
INSERT OR IGNORE INTO categories(name) VALUES(?1)
INSERT OR ROLLBACK INTO pkg_categories(package_id, category_id) VALUES (?1, (SELECT id FROM categories WHERE name = ?2))
INSERT OR IGNORE INTO licenses(name) VALUES(?1)
INSERT OR ROLLBACK INTO pkg_licenses(package_id, license_id) VALUES (?1, (SELECT id FROM licenses WHERE name = ?2))
  :

想像通りでした。(DROPとかUPDATEとかのSQL文も埋め込まれていたぞ。)

ここで、一つ提案します。 Fedora系もfreeBSDのpkgシステムをパクッって行ってください。そうすればオイラーも楽 出来ますから。なんせ、最近は記憶減退ぎみですんで。

TODO

ここまで、駆け足でFreeBSD 10-RELEASEをいじってきたけど、これから先何をやるか?

コンパイラがclangになったんてんで、その方面で何かしたいな。たまたま見てたのに、 MinCamlをLLVMに対応させました なんてのがある。これはもうやってみる鹿。果たして糞石から逃れられるか? みんな自前の仮想CPUを作るのは、糞石から逃れる為だったりして。糞石ってi386の事ね。 最近ARMがもてはやされているけど、オイラー的には、こやつも糞石の仲間だと思うぞ。

pureを入れた時に、釣られてperlやpythonが入ってきた。3大LLのrubyが抜けているな。rubyも 入れておくかな。どうせ入れるならruby21だよなと思って調べてみると、portsにもなって いないんです。これはまた、どうした事でしょう? python33は有ると言うのに! 是非、あの人に頑張って欲しいものです。

だめなら、FreeBSD10ではDtraceが有効になっているそうなので、dtraceを有効にしたruby21でも 作ってみたいものです。勿論、その利用目的は、あの人を鼓舞させる為だったりしますが。