.screenrc をリロードする

  .screenrc を弄っていて、設定を確認するたびに、quit していましたが、再読み込みすることが出来たらしい。

  エスケープ (デフォルトだと C-a) した後に、下記コマンドで OK です。

:source $HOME/.screenrc

  ちなみに、:source ~/.screenrc だと NG でした ($HOME じゃないと駄目)。

PHP カンファレンス 2007 レポート

  2007-09-01 に PHP カンファレンスが大田区産業プラザ (PiO) で行なわれました。
  自分が見たプログラムの内容をメモしておいたので簡単にまとめます。また、まとめながら調べたことも一緒に記述しています。

  なお、間違いがあるかもしれませんが、その際は教えていただけるとありがたいです。

- PHPカンファレンス2007プログラム概要
  http://www.php.gr.jp/seminar/20070901/prog.php

1. 基調講演「PHP の今とこれから 2007」

PHP 4.3/4.4 の利用率は 75% 程度

PHP 5 について

PHP 5.2 について

PHP 5.3 について

  • 本来は予定にはなかった
  • 2008/01 以降にリリースか?
  • PHP 6 までのつなぎのバージョン
    • Unicode サポート以外の新機能が入るかもしれない
  • ICU (国際化) 拡張
    • IBM が開発している国際化用のライブラリ
  • OpenSSL で OpenID がサポートされる
  • 名前空間も?

PHP 4.4/5.1/5.2/6.0 のベンチマーク

  • php-5.x.x/Zend/bench.php を使用
  • PHP 5.2 が今のところ一番早い

セキュリティーについて

PHP 6.0 について

  • Unicode 対応
    • ICU 3.4 をエンジンとする
    • 内部的には UTF-16
    • echo strlen('日本語'); // -> 3
    • mbstring は不要になるか? (微妙な状況)
    • エンコードの検知の精度がまだ低い
  • レガシーコードの削除
    • register_globals
    • magic_quotes_*
    • safe_mode
    • zend.ze1_compatibility_mode
  • MySQLND (MySQL Native Driver)
    • libmysql の代替ライブラリ
    • PHP 5/6 をサポート (PHP 6.0 には標準バンドル。PHP 5.3 にも?)
    • MySQL 4.1 以上をサポート
  • 新しいガベージコレクタ

Namespace (名前空間)

2. 大規模サイトの構築・運用ノウハウ (仮題)

  • ウノウ、GREE の CTO 対談
  • サーバマシンは統一する
  • テーブルは JOIN しない

ウノウの場合

GREE の場合

  • スライド中に「GREE に入りたい」のサブリミナル効果
  • ページビュー、サーバ台数、ユーザ数など (非公開っぽいので省略)
  • フレームワークはもちろん Ethna
  • TEXT を外に出す

     +-----+----------+
     | UID | 名前     |
     +-----+----------+
     |  7  | すなおか |
     +-----+----------+
        ↑
        ↓
+----+-----+-------------+
| ID | UID | 内容 (TEXT) |
+----+-----+-------------+
|  1 |  7  | ほげほげ... |
+----+-----+-------------+

  • テーブル (DB) を分割する

                            +----+-----+---------+
+-----+----------------+    | ID | UID | 内容    |
| UID | パーティション |    +----+-----+---------+
+-----+----------------+    |  1 |  7  | ...     |
|  7  |              1 | → +----+-----+---------+
+-----+----------------+
|  9  |              2 | → +----+-----+---------+
+-----+----------------+    | ID | UID | 内容    |
                            +----+-----+---------+
                            |  2 |  9  | ...     |
                            +----+-----+---------+

  • JOIN しない
  • 正規化がんばらない
  • 本番機への投入は rsync

3. PHP Framework Update

symfony

1590597869

  • 間もなく 1.1 のベータリリース

CakePHP

Piece Framework

  • ステートフルでセキュアな Web アプリケーションフレームワーク
  • 個別のライブラリだけを使用することもできる
  • Piece IDE のデモ (現在は Eclipse のプラグイン)
    • ウィザード式の画面がビジュアルに作成できる (楽しい)
    • 出力は YAML

Ethna

  • 今後の方向性
  • いろいろ直したいところとか

4. PHP at Yahoo!

Y! について

  • 13 億 3800 万ページビュー
  • 1960 万アクティブユーザ ID
  • 2007/08 現在 140 サービス

Y! と PHP の関係

  • PHP 界隈で有名な人が在籍
  • PHP のバグはまず Y! 社内にレポートされる (PHP に独自のパッチを当てているため)
  • 当初は FreeBSD 2.1 上の独自システムで構築
    • Web サーバ: Filo Server -> Apache (1996 年)
    • DB: フラットファイル -> MySQL (1998 年)
    • yScript -> PHP (2002 年)
  • Oracle も使うよ
  • FreeBSD、Apache、PHP には独自のパッチを当てている
  • C++ で書かれたライブラリを PHP 拡張から呼び出す
  • 日本ではフロントエンドはほとんどが PHP

なぜ PHP を採用したか

  • Web 用の言語
  • 高いパフォーマンス
  • 大きなコミュニティ
  • ライブラリが充実している、拡張性がある
  • ツールが豊富 (IDE、プロファイラ、デバッガ)
  • トレーニングコストが低い

現在の PHP

  • フレームワークはほとんど使っていない
    • HTML ページ: 5% PHP
    • ヘルパー (ヘッダ出力など): 50% PHP
    • ビジネスロジック: 100% PHP
    • コア: C/C++
  • PHP は最低限でビルド

$ ./configure --disable-all

  • 必要なモジュールは共有モジュールとしてインストール
    • 不必要な依存性を下げる
    • メモリの使用量を下げる
    • 再コンパイルが不要
    • しかし、Apache 起動時に若干のオーバーヘッドが

PHP 5 への移行について

  • 日本では 4.4 系がメイン
    • 2007 年末までに 5 系へ
    • 2008 年には 5.2 系へ移行する

セキュリティについて

  • 開発ルール・プラットフォームの整備による開発
  • Scanmus
    • Rasmus が開発した XSS 検出ツール
  • open_basedir を設定
  • allow_url_fopen = Off、allow_url_include = Off
    • 必要があれば libcurl を利用
  • safe_mode = Off
  • display_errors = Off
    • しかし log_errors = On でログには残す
  • error_reporting = E_ALL
  • ユーザからの入力値はフィルタリングする
  • PHP 5.2.0 からのフィルタ拡張を利用する
    • Y! から PHP コミュニティに還元した拡張
    • Y! 社内では PHP 4 でも利用できるように PHP 自体にパッチを当てている
  • CSRF 対策は Crumb (セッション追跡用の秘密情報) を利用

パフォーマンス

  • APC を利用 (Rasmus が携わっているため)
    • xdebug + WinCacheGrind・KCacheGrind
  • PHP 拡張の開発
    • C/C++ に PHP を埋め込んで利用することも (Web アプリではない)
  • セッションの利用を避ける
  • Cookie を利用して画面遷移に必要な情報は POST で (hidden) で埋め込む
  • r3 (テンプレート管理ツール) を開発
    • 日本語の解説がある (どこだろう?)
  • OSS のフレームワークのはあまり利用しない
    • 汎用的すぎてパフォーマンスに問題があるので
  • 実装はエンジニアに委ねる
    • プロダクトに特化した独自のフレームワークを利用している場合も
    • トップページ専用の CMS とか
  • Smarty はオーバーヘッドが Y! では無視できないので利用しない
  • symfony は使い始めた
    • Yahoo! Bookmarks
    • del.icio.us
    • Yahoo! Answers (Yahoo! 知恵袋)
    • いろいろカスタマイズしている
  • CakePHP
    • 検討中
    • ただし、利用実績も予定もなし

まとめ

  • 5 年ほど PHP を使っている
    • いろいろカスタマイズしている
  • PHP 拡張を多用している
  • OSS のフレームワークはあまり使っていない
    • symfony は使い始めた
  • IDE は使っていない
  • CVS を使っている

5. ライトニングトーク

  • 人が多すぎで 6F から 2F に移動

モバイル開発における PHP の利用方法と Tips

  • 資料
  • 携帯サイトと PC サイトの違い
  • PEAR Net_UserAgent_Mobile
  • 文字コード
    • sjis-win、eucjp-win を利用する
    • DB は cp932
  • 絵文字
  • Cookie は使えない

Usagi Project

  • OpenPNE 2.4系の派生プロジェクト
  • PHP ライセンス
  • いっしょに開発しませんか

PEAR DB_DataObject 開発ケーススタディ

  • DB をまたぐテーブルの結合をサポートした
  • テスト重要

PHP で画像処理をしてモテようかなと思って

PHP プログラマのための恋愛術

  • ふつうに恋愛論
  • PHP の話は出ない

code なにがしについて

  • 資料PDF
  • ググれといわれない場を
  • みんな優しい

ケータイキット for Smarty について

  • モバイルサイトに特化した Smarty
  • モバイルサイト開発の問題点を解消
  • 個人利用は無償

PHP でシェルを作る

  • /dev/null T シャツ
  • PHP で書かれた phsh を開発
    • もうじき公開? -> 公開されました
  • ログインシェルにもできる
  • eval で処理してるっぽい
  • シェルは偉大

6. スペシャルセッション

  • Piece IDE のデモのリベンジ
  • 基調講演の続き
    • 開発体制
    • ユーザ会など

以上、大雑把ですがまとめてみました。講師のみなさんありがとうございました。
懇親会にも出席していろいろな方と名刺交換・お話ができて充実した一日でした。

最後に戦利品です。

1. Yahoo! JAPAN さんに頂いたメモパッド

メモパッド

2. Asial さんに頂いた時計

時計

3. アイデアマンズさんに頂いた LED

LED

zsh でログイン時に screen を起動する方法

  ~/.zlogin に以下を記述する。

if [ ! "$WINDOW" ]; then
    exec screen -S main -xRR
fi


  ログイン直後にいつも screen を打っていたのですが、これで楽になりました。

- 追記 (2007-08-21)
  コメント欄で情報をいただいたように、他のホストにログインすると screen が二重起動する件ですが、以下のようにして対処できそうです。

if [ $TERM != "screen" ]; then
    exec screen -S main -xRR
fi


  ただし、Solaris の場合は terminfo に screen の記述がないので上記設定ではうまくいきません。

  結局メインで使うマシンのみに、一番上の設定をしてそれ以外のマシンは手動で screen を打つという運用でカバーすることにしました。

Vim を 256 色で使いたい

  以前ターミナルを 256 色にしたのですが,せっかくなので Vim も 256 色で使いたいと思って以下のようなスクリプトを書きました.

#!/usr/bin/env perl

use strict;
use warnings;

my $fg = "\x1b[38;5;";
my $bg = "\x1b[48;5;";
my $rs = "\x1b[0m";

my $color = 0;

for (my $row = 0; $row < 32; ++$row) {
    for (my $col = 0; $col < 8; ++$col) {
        print get_color($color);
        $color++;
    }
    print "\n";
}

sub get_color {
    my ($color) = @_;
    my $number = sprintf '%3d', $color;
    return qq/${bg}${color}m ${number} ${rs} ${fg}${color}m${number}${rs} /;
}


  さて,こいつは何をするかというと,使っているターミナル上で何番の番号が何の色かを表示するものです.
  自分の環境では以下のようになります (クリックして大きくなります).

  

  この番号はそのまま Vim の色指定の番号になります.
  つまり ctermfg とか ctermbg とかに,表示された色を見ながら番号を指定することができます.
  例えば,上記スクリプトで表示された色番号 21 を使いたい場合は,以下のように設定する感じですね.

hi diffAdded    ctermfg=21


  こうやって設定して vim -d をしたサンプルです.淡い色も使えていい感じです.

  

dig の出力に色をつける dig-color

  dig の出力に色をつける dig-color というのを作ってみました.
  リソースレコードタイプは A/NS/CNAME/SOA/MX のみにしか対応していませんので,そのほかのタイプが必要であれば追加してください.

#!/usr/bin/env ruby

colors = {
    "section" => "02;01",
    "comment" => "37",
    "normal"  => "00",
    "A"       => "32",
    "NS"      => "34",
    "CNAME"   => "36",
    "SOA"     => "33",
    "MX"      => "31",
}

IO.popen("dig " + ARGV.join(" ")) { |io|
    io.each_line { |line|
        color = colors["normal"]
        if line =~ /^;;.+SECTION:$/
            color = colors["section"]
        elsif line =~ /^;/
            color = colors["comment"]
        elsif line =~ /^(.+\s)(SOA|NS|A|MX|CNAME)(\s.+)$/
            color = colors[$2]
            # レコードタイプのみに色を付ける場合
            #line = sprintf "%s\e[%sm%s\e[00m%s\n", $1, colors[$2] ,$2, $3
        end
        printf "\e[%sm%s\e[00m", color, line
    }
}


- 出力例 (この色が見やすいかどうかは……)
  


- 追記
  Perl で書き換えてくれた方がいました.

- dig の出力に色をつける dig-color(perl版) | cafe chantant blog
  http://www.cafechantant.com/blog/2007/07/04/dig-%e3%81%ae%e5%87%ba%e5%8a%9 ...

MySQL 4.1.22 用の Tritonn パッチをテストしてみる

  Solaris 10 に MeCab と Senna と MySQL をインストールする …… 失敗 の続きです.

  MySQL 4.1.22 用の Tritonn パッチがリリースされたので,テストです.

- mir the tritonn - MySQL 4.1対応版リリース
  http://d.hatena.ne.jp/mir/20070412/p1

  前回も少し書いたのですが,Senna の MySQL パディングは Tritonn という別プロジェクトになっています.
  当初は,MySQL 5.0.x 用のパッチのみの提供でしたが,今回 MySQL 4.1.22 用のパッチがリリースされました.

  まず,MeCab,Senna 本体のインストールをします.インストールは [2007-03-24-1] と同じです.
  Senna は 1.0.4 にバージョンアップして,Solaris 10 では UINT_MAX の未定義のエラーは出なくなっています.

  次に,Tritonn パッチをダウンロードして,MySQL にパッチを当てます.

- SourceForge.jp: Project File List
  http://sourceforge.jp/projects/tritonn/files/

$ tar -zxvf tritonn-1.0.2.mysql-4.1.22.senna-1.0.4.tar.gz
$ tar -zxvf mysql-4.1.22.tar.gz
$ cd mysql-4.1.22
$ patch -p1 < ../tritonn-1.0.2.mysql-4.1.22.senna-1.0.4/mysql-4.1.22.senna.diff

  configure を再生成します.

$ libtoolize -c -f
$ aclocal
$ autoheader
$ automake -c -a -i
$ autoconf
$ touch sql/sql_yacc.yy

  次に configure をします.
  configure の際には,--with-senna と --with-mecab をオプションに追加します.

$ ./configure --prefix=/usr/local/mysql \
              --with-extra-charsets=all \
              --without-readline \
              --enable-assembler \
              --with-low-memory \
              --with-senna=/usr/local/senna \
              --with-mecab=/usr/local/mecab/0.9
$ make

  うーむ.[2007-03-24-1] と同じエラーでした.

sql_yacc.cc: In function `int yyparse(void*)':
sql_yacc.cc:22059: error: expected primary-expression before "__attribute__"
sql_yacc.cc:22059: error: expected `;' before "__attribute__"
make[4]: *** [sql_yacc.o] Error 1

- ちなみに MySQL 5.0.37 では
  まったく問題なく行きました!

$ mysql -uroot -p test
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.37-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM (c1)) ENGINE = MyISAM DEFAULT CHARSET ujis;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t1 VALUES ("すもももももももものうち");
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES ("生麦生米生卵");
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO t1 VALUES ("東京特許許可局");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM t1 WHERE MATCH(c1) AGAINST("特許");
+----------------+
| c1             |
+----------------+
| 東京特許許可局 |
+----------------+
1 row in set (0.00 sec)

  ということで,MySQL 5.0.37 で使っています.検索は想像以上に高速です.

  また,折をみて,MySQL 4.1.22 用は試してみたいと思います.

PuTTY + screen の表示を 256 色にする方法

  Solaris 10 で PuTTY + screen の表示を 256 色にする方法です.

1. ncurses のインストール

  ncurses をインストールしていない場合はインストールします.
  ncurses をインストールすると,xterm-256color という terminfo がインストールされます.
  
- ref.: ncurses のインストール方法
  http://install.pocari.org/ncurses.html

2. xterm-256color のシンボリックリンクを張る

  xterm-256color は /usr/local/share/terminfo にインストールされるので,これを Solaris 標準の terminfo ディレクトリの /usr/share/lib/terminfo にシンボリックリンクを張ります.

# ln -s /usr/local/share/terminfo/x/xterm-256color /usr/share/lib/terminfo/x/xterm-256color

3. screen を --enable-colors256 オプションをつけてコンパイルする

  Soalris 10 の場合は,screen 4.0.3 は make に失敗するので以下のパッチをどうぞ.

--- misc.c-orig 2003-12-05 22:45:41.000000000 +0900
+++ misc.c      2007-02-11 18:40:32.987599000 +0900
@@ -613,7 +613,7 @@
    */
 # endif /* NEEDSETENV */
 #else /* USESETENV */
-# if defined(linux) || defined(__convex__) || (BSD >= 199103)
+# if defined(linux) || defined(__convex__) || (BSD >= 199103) || defined(__sun__) || defined(__sun)
   setenv(var, value, 1);
 # else
   setenv(var, value);

4. screen の設定をする

  ~/.screenrc に以下の設定を追加すします.

## http://frexx.de/xterm-256-notes/
# erase background with current bg color
defbce "on"
# do not use 'screen-bce'
term xterm-256color

5. PuTTY の設定をする

  [PuTTY 設定] - [ウィンドウ] - [色] から「xterm 256 色モードで使うことを許可する」にチェックを入れます.

  注) [PuTTY 設定] - [接続] - [データ] の「端末タイプを表す文字列」を「xterm-256color」にしてもいいのですが,この設定をした PuTTY で xterm-256color がない環境にログインした場合に表示が崩れるので,.zshrc などで設定したほうがいいような気がします.

6. 確認

  The 256 color mode of xterm のページから 256colors2.pl をダウンロードします.
  screen を立ち上げてから,ダウンロードした 256color2.pl を実行します.
  以下のようにきれいに 256 色表示ができたら,OK です.

  

- via: qootas.org/blog - 256 colors: putty + vim + screen
  http://qootas.org/blog/archives/2006/03/256_colors_putt.html

- ref.: The 256 color mode of xterm
  http://frexx.de/xterm-256-notes/

Solaris 10 に MeCab と Senna と MySQL をインストールする …… 失敗

  まず,MeCab のインストール.
  MeCab 0.8.1 と共存したいので,/usr/local/mecab/0.9 にインストールすることにします.

- MeCab 0.95

$ tar -zxvf mecab-0.95.tar.gz
$ cd mecab-0.95
$ ./configure --prefix=/usr/local/mecab/0.9
$ make
# make install

- ipadic 2.7.0

$ tar -zxvf mecab-ipadic-2.7.0-20060707.tar.gz
$ cd mecab-ipadic-2.7.0-20060707
$ ./configure --prefix=/usr/local/mecab/0.9
$ make
# make install

  ここで MeCab にパスを通しておく

$ export PATH=${PATH}:/usr/local/mecab/0.9/bin
$ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/mecab/0.9/lib
$ export LD_RUN_PATH=${LD_LIBRARY_PATH}

  次に Senna のインストール.こちらは /usr/local/senna にインストールします.

- Senna 1.0.2

$ tar -zxvf senna-1.0.2.tar.gz
$ cd senna-1.0.2
$ ./configure --prefix=/usr/local/senna
$ make INCLUDES=-I/usr/local/mecab/0.9/include

  とここで,以下のエラーが出ました.

store.c: In function `sen_fse_open':
store.c:75: error: `UINT_MAX' undeclared (first use in this function)
store.c:75: error: (Each undeclared identifier is reported only once
store.c:75: error: for each function it appears in.)
make[2]: *** [store.lo] Error 1
make[2]: Leaving directory `/home/suna/workspace/src/senna-1.0.2/lib'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/suna/workspace/src/senna-1.0.2'
make: *** [all] Error 2

  どうも UINT_MAX が定義されていないようです.とりあえず,lib/store.c に以下のパッチを当てました.
  #include <limits.h> を付け加えただけです.

--- store.c-orig        2007-03-14 15:48:35.000000000 +0900
+++ store.c     2007-03-15 21:57:30.308187817 +0900
@@ -19,6 +19,7 @@
 #include "inv.h"
 #include "store.h"
 #include <string.h>
+#include <limits.h>

 /* fixed sized elements */


  もう一度 make します.

$ make INCLUDES=-I/usr/local/mecab/0.9/include
# make install

  以下のような warning がたくさん出ましたが,とりあえず make が終了しました.

../config.h:86:1: warning: "_FILE_OFFSET_BITS" redefined

- MySQL 4.1.22

$ tar -zxvf mysql-4.1.22.tar.gz
$ cd mysql-4.1.22

  ここで Senna から提供されている 4.1.20 用のパッチを当てようとしたのですが,2ind パッチでうまく当たらないファイルがあった (sql/item.h) ので 4.1.22 用のパッチを作りました.ついでに 2ind でない方のパッチも 4.1.22 用に新しくしました.

o mysql-4.1.22.senna.diff
o mysql-4.1.22.senna.2ind.diff

$ patch -p1 < ../mysql-4.1.22.senna.diff
$ patch -p1 < ../mysql-4.1.22.senna.2ind.diff (2ind パッチを当てる場合)

  configure を再生成します.
  senna に含まれるドキュメント (doc/INSTALL.JA) には

bison 1.75, autoconf 2.59, automake 1.8(aclocal 1.8)以上が必要です

  のような記載がありますが,実際はこれらに加えて,libtool も必要です.

$ libtoolize -c -f
$ aclocal
$ autoheader
$ automake -c -a -i
$ autoconf
$ touch sql/sql_yacc.yy

  次に configure をします.
  configure の際には,--with-senna と --with-mecab をオプションに追加します.

$ ./configure --prefix=/usr/local/mysql \
              --with-extra-charsets=all \
              --without-readline \
              --enable-assembler \
              --with-low-memory \
              --with-senna=/usr/local/senna \
              --with-mecab=/usr/local/mecab/0.9
$ make
# make install

  ちなみに,MySQL バインディングは Tritonn という別プロジェクトになったみたいです.
  MySQL 5.0.36/5.0.37 の場合は Tritonn からパッチがリリースされています.

- Tritonnプロジェクト ~ MySQL+Sennaによる全文検索 ~ - Tritonnプロジェクト
  http://qwik.jp/tritonn/

  とりあえず,インストールはこれで完了です.
  動作確認はまた後日.

- 追記
  うまくいったと思ったら,MySQL の make でエラーが出てました.

sql_yacc.cc: In function `int yyparse(void*)':
sql_yacc.cc:22272: error: expected primary-expression before "__attribute__"
sql_yacc.cc:22272: error: expected `;' before "__attribute__"

  うーむ.これについてもまた後日調べるとします.

SunOS 5.10/5.11 の in.telnetd に欠陥が

- SunOS 5.10/5.11 in.telnetd Remote Exploit by Kingcope
  http://www.st.ryukoku.ac.jp/~kjm/security/memo/2007/02.html#20070212_SunOS

  SunOS 5.10/5.11 の in.telnetd にリモートから認証なしでログインできる欠陥が見つかったということです.
  カンタンに手作業で入れてしまいます.

  手元の Solaris 10 1/06,06/06 でも再現しました.
  とりあえずの対策は in.telnetd を disable にすることでしょうか.

# svcadm disable telnet

  以下の記事も参考に

- ref.: SunOS 5.10/5.11 in.telnetd に認証迂回の脆弱性
  http://diary.sytes.net/solaris/?20070212#12-1

- 追記 (2007-02-21)
  パッチが出ました
o 120068-03 SunOS 5.10: in.telnetd patch
o 120069-03 SunOS 5.10_x86: in.telnetd patch

elxl0 を full duplex にする方法

- 注意:
  以下の情報は,正確なものではありません.この設定をしても,スイッチを確認すると harf duplex でしか通信していませんでした.
  解決策は末尾に追記しています.


  Solaris 10 で elxl0 なインタフェースを搭載した機械との scp がやたら遅いので調べてみました.
  

1. まず,インタフェースの確認.

$ ifconfig elxl0
elxl0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
       inet 192.168.1.xxx netmask ffffff00 broadcast 192.168.1.255

2. モジュールの情報を確認

$ modinfo | grep elxl
133 f9a36000   58e8  39   1  elxl (3Com 90XX LAN driver 1.34)

  elxl は 3Com の NIC ということがわかります.

3. 現在の通信方式と接続速度を確認

$ kstat -p :::duplex :::ifspeed
elxl:0:elxl0:duplex     harf
elxl:0:elxl0:ifspeed    0

  通信方式は半二重方式で,接続速度は 0 (???) ということがわかりました.
  これを全二重方式 (full duplex) で接続速度を 100000000 (100M) にしてあげればよさそう.

4. man を見てみる

$ man elxl
Devices                                                  elxl(7D)

NAME
     elxl - 3Com Ethernet device driver

SYNOPSIS
     /kernel/drv/elxl

    :

FILES
     /dev/elxl                       Special character device
     /kernel/drv/elxl.conf           Configuration file for  elxl
                                     driver

  /kernel/drv/elxl.conf が elxl の設定ファイルということがわかりました.

# vi /kernel/drv/elxl.conf

#ident  "@(#)elxl.conf  1.4 00/07/17 SMI"
#
# Copyright (c) 1998, by Sun Microsystems, Inc.
# All rights reserved.
#
# Driver.conf file for the 3Com 3C90x
#
# To force full duplex operation, uncomment the following line:
full-duplex=1;
#
# To force half duplex operation, uncomment the following line:
#full-duplex=0;
#
# To force 10Mbps operation, uncomment the following line:
#speed=10;
#
# To force 100Mbps operation, uncomment the following line:
speed=100;


  これで OK...と思ったら大間違いです.この設定をするとインタフェースが起動しなくなります.
  ですので,先に下の 5 を行うのがいいでしょう.

  注: ndd でテストしてみるのが王道でしょうが,なぜか elxl は ndd で値をセットできませんでした...?

5. 3c90xcfg.exe で通信方式と通信速度を変更する

  3c90xcfg.exe というのは 3Com の NIC の DOS 用 診断プログラムです.
  これをダウンロードしてきて,Boot 可能な FD にコピーして DOS で起動します.

- 3c90x2.exe (含 3c90xcfg.exe)
  ftp://ftp.3com.com/pub/nic/3c90x/3c90x2.exe

  診断プログラムで通信方式を full duplex に,通信速度を 100M に設定します.

6. ブートして確認

  うまくいけば,ちゃんとブートしますので,ここで通信方式と通信速度を確認してみます.

$ kstat -p :::duplex :::ifspeed
elxl:0:elxl0:duplex     full
elxl:0:elxl0:ifspeed    100000000

  無事,全二重方式で 100M に設定されました.もちろん scp も劇的に改善しています.
  環境は Solaris 10 x86 でした.

- ref.: Re: Full duplex with elxl0: 3Com 90XX LAN driver on Solaris x86
  http://www.dbforums.com/showpost.php?s=f058de31a8eb53479a1effb026633668&p= ...


- 追記
  上記の情報は,正確なものではありません.この設定をしても,スイッチを確認すると harf duplex でしか通信していませんでした.

  解決策は単純に /kernel/drv/elxl.conf の speed のみを 100 に設定すれば OK です.

# vi /kernel/drv/elxl.conf

#ident  "@(#)elxl.conf  1.4 00/07/17 SMI"
#
# Copyright (c) 1998, by Sun Microsystems, Inc.
# All rights reserved.
#
# Driver.conf file for the 3Com 3C90x
#
# To force full duplex operation, uncomment the following line:
#full-duplex=1;
#
# To force half duplex operation, uncomment the following line:
#full-duplex=0;
#
# To force 10Mbps operation, uncomment the following line:
#speed=10;
#
# To force 100Mbps operation, uncomment the following line:
speed=100;


  上記手順 5 の 3c90xcfg.exe を使った通信方式と通信速度を変更は必要ありません.

  この設定をしても,kstat の表示は harf duplex のままですが,スイッチで確認すると問題なく full duplex になっています.

$ kstat -p :::duplex :::ifspeed
elxl:0:elxl0:duplex     harf
elxl:0:elxl0:ifspeed    0

  おそらく,ドライバの表示が間違っているのではないかと思われます.