フォントサブシステム

最近 Xorg7.1 を入れることになったので フォントの現在について勉強をかねて調べてみました
こんなにややこしい フォントをとりまく世界
Xコアフォントシステム 従来の X のフォント管理 Emacs や Gnome1 に使われている? ビットマップフォントを扱う libXfontにより提供 Xモジュールである Load “freetype” などすれば TrueTypeフォントも読み込める
XFS (X Font Server) Xコアフォントシステムと扱えるフォントや管理形式は基本的に同じだが ネットワーク経由でフォントを管理できる xfsデーモンが常駐したフォントサーバでフォントを一元管理 xftパッケージを別途インストールする
XFT1 TrueType フォントを扱うための拡張 フォントのアンチエイリアスも可能 本体は libXft 別途 FreeTypeライブラリをインストールする必要がある xorg.confに Load “xtt” もしくは Load “freetype” が必要
XFT2 + Fontconfig Xとは独立したフォントシステム FontConfigによりアプリケーションからのフォント要求を解決し libXftで TrueType処理する 悲しいことに
ここ
によると OpenOffice.org は FontConfig対応していないらしい

XFT2 + Fontconfig が理想だけど アプリケーションが対応する必要あるため 結局 Xコアフォントシステムも整備する必要があり フォントの管理が面倒になっています

Fontcontig によって処理されてる フォントのパラメータ
family 文字列 フォントファミリー
familylang 文字列 フォントファミリーの言語体系
style 文字列 フォントの太さや形の名称
stylelang 文字列 スタイルの言語体系
fullname 文字列 フォントファミリー+スタイル
fullnamelang 文字列 フォントファミリー+スタイルの言語体系
slant 数値 italic もしくは oblique もしくは roman
weight 数値 light medium demibold bold black
size 実数 フォントサイズ
width 数値 normal もしくは expanded
aspect 実数 アスペクト比
pixelsize 実数 ピクセルサイズ
spacing 数値 等幅 倍角 半角 など
foundry 文字列 フォントのグループ名称
antialias 2値 アンチエイリアスの有無
hinting 2値 ラスタ処理を行なうときヒント情報を必要とするか
hintstyle 数値 ヒント情報のスタイル情報
verticallayout 2値 縦書きかどうか
autohint 2値 通常のヒント情報か自動ヒント情報か
(自動ヒント情報は FreeTypeの機能)
globaladvance 2値 文字によらないフォント共通設定を利用するか
file 文字列 フォントのファイルパス
index 数値 ファイルのインデックス値
ftface 文字列 利用されているフォント構造体のクラス名
rasterizer 文字列 どのラスタ化手法が使われているか
outline 2値 アウトラインフォントか
scalable 2値 スケールフォントか
scale 実数 スケール係数
dpi 実数 表示サイズ
rgba 数値 unknown rgb bgr vrgb vbgr none
minspace 2値 行間を詰めるか
charset 文字列 言語体系
lang 文字列 利用可能な言語リスト(RFC-3066形式)
fontversion 数値 バージョン
capability 文字列 レイアウトオプション
embolden 2値 太字を生成できるか

一口にフォントといっても 様々なパラメータがあります Fontconfigではこれらのパラメータを検索条件として フォント解決ができるわけです

gdb インストール

gdb (GNU Debugger) のインストールログです

まず ビルド用のディレクトリに移って

> tar -xzf gdb-6.6.tar.gz
> cd gdb-6.6
> ./configure --prefix=/usr/local --target=i686-linux-gnu
> make

特に問題なく

> su
# make install

インストールバイナリは i686-linux-gnu の接頭辞が付いてるので

# cd /usr/local/bin
# ln -s i686-linux-gnu-gdb gdb
# ln -s i686-linux-gnu-gdbserver gdbserver
# ln -s i686-linux-gnu-gdbtui gdbtui
# cd /usr/local/man/man1
# ln -s i686-linux-gnu-gdb.1 gdb.1
# ln -s i686-linux-gnu-gdbserver.1 gdbserver.1
# ln -s i686-linux-gnu-gdbtui.1 gdbtui.1

あと 余談ですが gdbには make uninstall がありません

カテゴリー: gdb

便利補助ツール complete (tcsh)

tcshのプログラマブル補完
tcsh の complete コマンドでシェルの補完機能をカスタマイズできるので概要を紹介します通常シェル(bashやtcshなど)では 「第1引数は コマンドを補完」「第2引数以降は ファイルパスを補完」するのが一般的です。 tcshでは complete コマンドによりこの補完動作をカスタマイズできます。
completeコマンドの一般的な書式は以下のとおりです

complete コマンド 補完方式/パターン指定/補完リスト[:補完リストの絞り条件]/[後置文字/]

補完方式 補完を実施するための条件を指定します p(引数の位置) や n(直前の引数のパターン) などが指定可能です
パターン指定 補完方式に対する目的語です pに対しては番号や*で指定します や nに対しては文字列で指定します
補完リスト 実際に補完される候補リストを指定します (文字列 文字列 …) のように直接文字列を指定したり f(ファイルパス) d(ディレクトリパス) u(UNIXアカウント) などの指定が可能です
補完リストの絞り条件 補完リストに対して絞り条件を指定できます 例えば テキストファイルだけを候補にしたいなら *.txtといった書き方です
後置文字 補完が完了した場合に直後に置く文字列です デフォルトは 半角空白 です
complete file 'p/1/f/'
fileコマンドの第1引数にファイルパスが補完されます
complete cd 'p/1/d/'
cdコマンドの第1引数にディレクトリパスが補完されます
complete basecolor 'p/1/(red blue green)/'
basecolorと入力した次のワードが red か blue か green かの候補が補完されるようになります (basecolorというコマンドは存在しません)
complete echo 'p/1/s/'
echoコマンドの第1引数にシェル変数名が補完されます

tcshの場合 補完候補を表示するには Ctrl+D です
completeの設定を解除するには uncomplete コマンド です

K8V Pro 3rd Eye マザーボードの GbE-LANを Linux2.6系で使う

検証環境

下記の環境で オンボード GbE-LAN の動作を確認しました

CPU Turion64 MT-37 (Socket754)
マザーボード K8V Pro 3rd Eye
NIC VIA Velocity
OS Linux kernel 2.6.11

kernel 2.6.11 では VIA6122 がサポートされていないようで ABIT社提供のドライバを入れました
ドライバはソースコードが提供されていて修正が必要でした 備忘録を兼ねてここにまとめます

ABIT社からドライバを取得

ABIT社のホームページ
から 「マザーボード」「ダウンロード-ドライバ」を選択します

ドライバ選択
続いて マザーボードを選択

ドライバ選択
マザーボード選択
GbEのドライバを選択してダウンロードします

ドライバ選択
ドライバは圧縮ファイルになっていて展開すると linux のディレクトリが
見えるのでこれを Linux上に転送します

ドライバ選択

velocityget.tgz なるファイルがありますが これが ABIT社提供のソースコードです
Linux上で解凍すると 以下のようなファイルが確認できます

root@localhost 1.19 # ls
Makefile        velocity_desc.h  velocity_proc.h   velocityget.ko
kcompat.h       velocity_mac.h   velocity_proc.o   velocityget.mod.c
linux.txt       velocity_main.c  velocity_stats.h  velocityget.mod.o
velocity.h      velocity_main.o  velocity_wol.c    velocityget.o
velocity_cfg.h  velocity_mii.h   velocity_wol.h
velocity_dbg.h  velocity_proc.c  velocity_wol.o

linux.txt の解説ファイルを読むと root 権限にて make installすればよいとのこと

root@localhost 1.19 # make install
head: `-1' option is obsolete; use `-n 1' since this will be removed in the future
make -C /lib/modules/2.6.11/build SUBDIRS=/root/admin/via6122/1.19 modules
make[1]: Entering directory `/usr/src/linux-2.6.11'
head: `-1' option is obsolete; use `-n 1' since this will be removed in the future
  CC [M]  /root/admin/via6122/1.19/velocity_main.o
/root/admin/via6122/1.19/velocity_main.c: In function `velocity_suspend':
/root/admin/via6122/1.19/velocity_main.c:2503: error: 関数 `pci_save_state' に対する引数が多すぎます
/root/admin/via6122/1.19/velocity_main.c: In function `velocity_resume':
/root/admin/via6122/1.19/velocity_main.c:2540: error: 関数 `pci_restore_state' に対する引数が多すぎます
make[2]: *** [/root/admin/via6122/1.19/velocity_main.o] Error 1
make[1]: *** [_module_/root/admin/via6122/1.19] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.11'
make: *** [default] Error 2
root@localhost 1.19 #

実際には kernel2.6系でエラーが出ます
原因は kernel2.6系では PCIデバイス固有の情報を 退避/復帰 させる
pci_save_state() pci_restore_state() の仕様が変更されているためです

ソースコードの修正

修正範囲はそれほど大きくないので パッチを提供するよりは
直接エディッタで修正したほうが早いです

velocity_main.c その1

修正前はこんな感じです

   2493 static int
   2494 velocity_suspend(struct pci_dev *pcid, u32 state)
   2495 {
   2496     PVELOCITY_INFO pInfo = pci_get_drvdata(pcid);
   2497     struct net_device *dev = pInfo->dev;
   2498     unsigned long flags;
   2499
   2500     netif_stop_queue(dev);
   2501     spin_lock_irqsave(&pInfo->lock, flags);
   2502
   2503     pci_save_state(pcid, pInfo->pci_state);
   2504
   2505 #ifdef ETHTOOL_GWOL
   2506
  

以下のように修正加えます

   2493 static int
   2494 velocity_suspend(struct pci_dev *pcid, u32 state)
   2495 {
   2496     PVELOCITY_INFO pInfo = pci_get_drvdata(pcid);
   2497     struct net_device *dev = pInfo->dev;
   2498     unsigned long flags;
   2499     /* modified for kernel2.6 */
   2500     int i;
   2501
   2502     netif_stop_queue(dev);
   2503     spin_lock_irqsave(&pInfo->lock, flags);
   2504
   2505     /* modified for kernel2.6 */
   2506     /* pci_save_state(pcid, pInfo->pci_state); */
   2507     /* save to pci_dev.saved_config_space directly... */
   2508     for ( i = 0; i != 16; i++ )
   2509         pcid->saved_config_space[ i ] = pInfo->pci_state[ i ];
   2510     pci_save_state(pcid);
   2511
   2512 #ifdef ETHTOOL_GWOL
  

velocity_main.c その2

修正前はこんな感じです

   2530 static int
   2531 velocity_resume(struct pci_dev *pcid)
   2532 {
   2533     PVELOCITY_INFO pInfo = pci_get_drvdata(pcid);
   2534     unsigned long flags;
   2535     struct net_device *dev = pInfo->dev;
   2536
   2537     pci_set_power_state(pcid, 0);
   2538     pci_enable_wake(pcid, 0, 0);
   2539
   2540     pci_restore_state(pcid, pInfo->pci_state);
   2541
   2542     mac_wol_reset(pInfo->pMacRegs);
  

以下のように修正加えます

   2537 static int
   2538 velocity_resume(struct pci_dev *pcid)
   2539 {
   2540     PVELOCITY_INFO pInfo = pci_get_drvdata(pcid);
   2541     unsigned long flags;
   2542     struct net_device *dev = pInfo->dev;
   2543     /* modified for kernel2.6 */
   2544     int i;
   2545
   2546     pci_set_power_state(pcid, 0);
   2547     pci_enable_wake(pcid, 0, 0);
   2548     /* modified for kernel2.6 */
   2549     /* pci_restore_state(pcid, pInfo->pci_state); */
   2550     pci_restore_state(pcid);
   2551     /* restore from pci_dev.saved_config_space directly... */
   2552     for ( i = 0; i != 16; i++ )
   2553         pInfo->pci_state[ i ] = pcid->saved_config_space[ i ];
   2554
   2555     mac_wol_reset(pInfo->pMacRegs);
  

動作確認

下記のように動作確認を行います

root@localhost 1.19 # make install
head: `-1' option is obsolete; use `-n 1' since this will be removed in the future
make -C /lib/modules/2.6.11/build SUBDIRS=/root/admin/via6122/1.19 modules
make[1]: Entering directory `/usr/src/linux-2.6.11'
head: `-1' option is obsolete; use `-n 1' since this will be removed in the future
  CC [M]  /root/admin/via6122/1.19/velocity_main.o
  LD [M]  /root/admin/via6122/1.19/velocityget.o
  Building modules, stage 2.
  MODPOST
  LD [M]  /root/admin/via6122/1.19/velocityget.ko
make[1]: Leaving directory `/usr/src/linux-2.6.11'
mkdir -p /lib/modules/2.6.11/kernel/drivers/net
install -m 644 -o root velocityget.ko /lib/modules/2.6.11/kernel/drivers/net
/usr/sbin/depmod -a || true
root@localhost 1.19 #
  

モジュールのコンパイルとインストールは成功しました

root@localhost deer # modprobe velocityget
root@localhost deer # ifconfig eth0 192.168.0.3 up
root@localhost deer #
root@localhost deer # ifconfig eth0
eth0      リンク方法:イーサーネット  ハードウェアアドレス **:**:**:**:**:**
          inetアドレス:192.168.0.3 ブロードキャスト:192.168.0.255 マスク:255.255.255.0
          inet6アドレス: fe80::250:****:****:****/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:142 errors:0 dropped:0 overruns:0 frame:0
          TX packets:108 errors:0 dropped:0 overruns:0 carrier:0
          衝突(Collisions):0 TXキュー長:1000
          RX byteUse of uninitialized value in scalar chomp at /home/deer/.emacs.d/mapae-0-10-20051017/mapae.pl line 514.
Use of uninitialized value in scalar chomp at /home/deer/lisp/mapae.pl line 514, <> line 271.
s:7073 (6.9 Kb)  TX bytes:7727 (7.5 Kb)
          割り込み:10 ベースア?Use of uninitialized value in scalar chomp at /home/deer/lisp/mapae.pl line 514.
疋譽?:0xb800

root@localhost deer #
root@localhost deer # lsmod
Module                  Size  Used by
velocityget            52768  0
nvidia               3917116  12
root@localhost deer #
  

モジュールのロードに成功しました 通信できることまで確認します

root@localhost deer # rmmod velocityget
root@localhost deer # ifconfig eth0
eth0: error fetching interface information: デバイスが見つかりません
root@localhost deer # lsmod
Module                  Size  Used by
nvidia               3917116  12
root@localhost deer #
  

モジュールのデタッチも正常に行われることを確認します

インストール

velocitygetモジュールは カーネルモジュールです
Linuxデストリビューションにより設定方法は異なりますが
Gentooベースの環境で /etc/modules.autoload に書き加えました

#
# Note that this file is for 2.6 kernels.
#
# Add the names of modules that you'd like to load when the system
# starts into this file, one per line.  Comments begin with # and
# are ignored.  Read man modules.autoload for additional details.

# For example:
# 3c59x
velocityget
nvidia
  

再起動してネットワークが使えていれば完了です

最新の情報1

最新のカーネルソースでは velocitygetのドライバが提供されているので上記作業は不要です (Linux kernel 2.6.17 で確認)

最新の情報2

VIA Velocity のドライバはどうやら IEEE802.1Q VLANで通信ができない模様
こちらの環境でも確認しました (Linux kernel 2.6.19.1 で確認)
いろいろ確認したのですが
・0x8100 TPID での受信が不可能のようだ
・0x9100 TPID に変更すると通信できた (include/linux/if_ether.h の修正が必要)
・もしくは ここの情報ページにて カーネルパッチが公開されています