ネットワーク表示のレスポンスを改善 – VMware

Windows Vista でネットワークを開いた時、なかなか検索が終わらない。Vista ではそんなもんだと思っていた。
しかし、原因は VMware の仮想 NIC だった。
VMware の仮想 NIC を無効にすると、ネットワークがすぐに表示されるようになった。

少し前、必要にせまられて中古ノートを購入した。
ハードディスクを交換してリカバリ領域を削除したため、ディスクに空きができた。
メモリも 1.5G に増設しているので、VMware をインストールする事にした。

その後、ネットワーク共有を有効にしても、再起動すると無効になってしまうトラブルが発生した。

仮想マシンのネットワークはブリッジ接続にしているので、ホストオンリーと NAT 用の仮想 NIC を無効にしたところ、無事に設定する事が出来た。

また、XP のパソコンがネットワークに表示されないため、以下の XP の更新を行った。

Windows Vista のネットワーク マップに Windows XP を実行しているコンピュータが表示されない

これを参考に、メインマシンの仮想 NIC を無効にして、最初に書いた問題は解決した。

どうも Windows の LLTD と VMware の仮想 NIC は、相性が悪いようだ。

4DESK 仮想デスクトップ – 便利なソフト

今まで以下の記事で紹介していた Dexpot を使用していた。

Dexpot 仮想デスクトップ – 便利なソフト

しかし、Windows Vista の Aero だと、デスクトップを切り替えたとき、IE や FFFTP の表示がおかしくなったりするので、Aero をオフにしていた。

Aero は無理かなー、と思っていたが、2ch の「仮想デスクトップについて話そう(・ω・)」で書いてあった「4DESK」を試してみた。

ちなみに韓国製のフリーソフトで、ソースは公開されていない模様。

機能としては、
・10個までの仮想デスクトップ
・ウィンドウのスナップ
・タスクトレイに常駐
・スキン選択可能(3種類)
と、多機能ではない。
逆に、設定は簡単で使いやすい。

Aero でも不具合は見られず、軽快に動作する。かなり快適だ。
今はスタートアップに登録して常用している。

Aero で仮想デスクトップを使いたい方にはお勧めしたい。

VMware に Vine 4.1 をインストール

次回のシステム開発に必要な環境を構築するため、Vine Linux 4.1 の仮想マシンを作成した。
RedHat系とは若干異なるため、少々手間取ったのでメモしておく。

1. VMwareToolsのコンパイルに必要なパッケージ

gcc
kernel-devel

2. Apache + PHP + PostgreSQL

apache2
mod_ssl-apache2
php
php-pgsql
php-domxml
php-apache2
postgresql
postgresql-server
(RedHat系の php-mbstring, php-gd は標準でインストールされる)

3. サービスの設定

apache2 (RedHat系の httpd)
postgresql

サービスやパッケージ名が異なるので、けっこうはまってしまう。
少し前にタイムトリップした感じになる。
レガシーな環境を作るにはいいかも。

Vista で VMwareServer

現在の開発マシンは、2年前に組み立てた物だが、既に非力なマシンと化している。
Athlon 64 x2 +4000 な格安マシンがあったので、今後の顧客サポートも考慮して購入した(ローンです…)。

当然、OSは Windows Vista Home Premium.
Aeroじゃないと話が合わない可能性が高いため。

なんとかVista環境に移行できないか検討していたが、VMwareがまともに動かないのがネックだった。

具体的には、ゲストのSAMBAにホストからアクセスできなかった。

いろいろ調べて、以下を参考に Vistaの設定を行った。

VMware on AMD Athlon 64 X2のブリッジ接続時の通信性能

画像(177x180)

ネットワーク接続

ローカルエリア接続のプロパティーで「構成」をクリック。

画像(180x161)

詳細設定で「TCPチェックサム オフロード(IPv4)」を「Rx 有効化」
(デフォルトは「Tx & Rx 有効化」だった。)

画像(180x161)

詳細設定で「UDPチェックサム オフロード(IPv4)」を「Rx 有効化」
(デフォルトは「Tx & Rx 有効化」だった。)

Vistaの場合、再起動しなくてもネットワーク設定の変更が有効となる。これは改良点と認める事ができる。

結局、このネットワークカード固有の問題だったようだ。

やっと環境移行のめどがついた。

Vista で VMware

この前から デスクトップの Vista への移行をテストしている。
ちょっと忙しいので、一日1時間程度しかできない。

あきらの開発環境で欠かせないのが VMware だ。
家も狭いので、ごろごろマシンを置けるはずも無く、便利に使っている。

せっかくなので無料の VMware Server を試してみた。

…ブリッジ接続でホスト・ゲスト間の通信が出来ない。
正確には SAMBA のゲスト名が解決されない。

ゲストは CentOS 5 で、アップデート済み。
そのままで Vista と繋がるはずだ。

ファイヤウォールやプロトコルを調べてもダメだった。

結局、アンインストールして VMware Player を試してみた。
2.0 から Vista 対応らしい。

おぉ!すんなり出来た!

VMware Server が正式に Vista 対応するまではこれで行こう!

fgetcsv の代替関数を改良

fgetcsv の代替関数を作成したが、どうも件数が一致しない。
原因は、最後の改行から EOF までを1行として入力していたからだった。

入力長が 0 で EOF だったら EOF として false を返すように改良した。

    
    // File Get CSV
    
    function fgetcsv( &$fh, $test = false ) {
        if ( feof( $fh ) ) return false ;
        
        $csv = '' ;
        
        while ( ! feof( $fh ) ) {
            $csv .= mb_convert_encoding( fgets( $fh ), 'UTF-8', 'SJIS-win' ) ;
            if ( ( ( preg_match_all( '/"/', $csv, $matches ) ) % 2 ) == 0 ) break ;
        }
    	
        if ( ( $csv == '' ) and ( feof( $fh ) ) ) return false ;  // <-- ここを追加
		
        $values = array() ;
        
        $temp = preg_replace( '/(?:x0Dx0A|[x0Dx0A])?$/', ',', $csv, 1 ) ;
        
        preg_match_all( '/("[^"]*(?:""[^"]*)*"|[^,]*),/', $temp, $matches ) ;
        
        for ( $i = 0 ; $i < count( $matches[ 1 ] ) ; $i++ ) {
            if ( preg_match( '/^"(.*)"$/s', $matches[ 1 ][ $i ], $m ) ) {
                $matches[ 1 ][ $i ] = preg_replace( '/""/', '"', $m[ 1 ] ) ;
            }
            
            $values[] = $matches[ 1 ][ $i ] ;
        }
        
        return $values ;
    }

fgetcsv の代替関数

fgetcsv は便利な関数だが、Windowsデータとの連携に問題がある。

WindowsからCSVをアップロードする場合、Shift-JIS がほとんどだと思われる。
一方、fgetcsv関数はロケール設定を考慮するため、システムのロケールとCSVファイルの文字コードが一致していないと正しく解析されない。

色々調べたが、レンタルサーバでもしっかり動かすため、代替関数を作成した。

あきらはメインコントロールのクラスに定義している。

    
    // File Get CSV
    
    function fgetcsv( &$fh, $test = false ) {
        if ( feof( $fh ) ) return false ;
        
        $csv = '' ;
        
        while ( ! feof( $fh ) ) {
            $csv .= mb_convert_encoding( fgets( $fh ), 'UTF-8', 'SJIS-win' ) ;
            if ( ( ( preg_match_all( '/"/', $csv, $matches ) ) % 2 ) == 0 ) break ;
        }
    	
        $values = array() ;
        
        $temp = preg_replace( '/(?:x0Dx0A|[x0Dx0A])?$/', ',', $csv, 1 ) ;
        
        preg_match_all( '/("[^"]*(?:""[^"]*)*"|[^,]*),/', $temp, $matches ) ;
        
        for ( $i = 0 ; $i < count( $matches[ 1 ] ) ; $i++ ) {
            if ( preg_match( '/^"(.*)"$/s', $matches[ 1 ][ $i ], $m ) ) {
                $matches[ 1 ][ $i ] = preg_replace( '/""/', '"', $m[ 1 ] ) ;
            }
            
            $values[] = $matches[ 1 ][ $i ] ;
        }
        
        return $values ;
    }

クラス内で以下の様に使う。

    $fh = fopen( $path ) ;

    while ( ( $data = $this->fgetcsv( $fh ) ) !== false ) {
        ...
    }

    fclose( $fh ) ;

参考サイト :
Perlメモ – 値に改行コードを含む CSV形式を扱う
EthnaWiki – php/Tips/csv

PHPで暗号化

パスワードをデータベースに保存する場合、MD5などの不可逆暗号を用いた方がセキュリティー上好ましい。
パスワードは再度入力されるものなので、暗号化した結果を比較すればよい。

それでは、口座番号などの個人情報をデータベースに保存する場合はどうだろう。

これは再度入力される性質のものではなく、保存しておく性質のものだ。
必要な時には表示させたい。

このようなときには Blowfish などの可逆暗号化を行う。

以下のような関数を準備しておけば便利だ。

function encrypt( $key, $text ) {
    srand() ;
    
    $iv_size = mcrypt_get_iv_size( MCRYPT_BLOWFISH, MCRYPT_MODE_CBC ) ;
    $iv = mcrypt_create_iv( $iv_size, MCRYPT_RAND ) ;
    
    return base64_encode( $iv . mcrypt_encrypt( MCRYPT_BLOWFISH, $key, $text, MCRYPT_MODE_CBC, $iv ) ) ;
}


function decrypt( $key, $base64 ) {
    $iv_encrypt = base64_decode( $base64 ) ;
    
    $iv_size = mcrypt_get_iv_size( MCRYPT_BLOWFISH, MCRYPT_MODE_CBC ) ;
    $iv = substr( $iv_encrypt, 0, $iv_size ) ;
    $encrypt = substr( $iv_encrypt, $iv_size ) ;
    
    return rtrim( mcrypt_decrypt( MCRYPT_BLOWFISH, $key, $encrypt, MCRYPT_MODE_CBC, $iv ), "" ) ;
}

CentOS 5 では、php-mcrypt パッケージが必要なのでインストールしておくこと。

sed でハマった!

EUC-JP の csv を SQL に変換しようとしました。

sed -e 's/^(.*)$/insert into table values(1);/' table.csv

前処理はしてあるので、これでOKのはずが、ぜんぜんダメ。

いろいろ考えて、どうも文字コードの問題らしいと推理しました。

LANG=ja_jp.EUC-JP sed -e 's/^(.*)$/insert into table values(1);/' table.csv

これでうまく行きました。

最近の Linux は UTF-8 なんですよー!