アーカイブ: 2008年9月

全角文字のtrimで文字化け

パーマリンク 2008/09/30 17:42:12 著者: kumaold メール
カテゴリ: 仕事, プログラミング

ISPの管理画面の確認ページで、特定の記号群だけ文字化けする謎の症状があったので原因とその解決法を書いときます。


症状としては、テキストフィールドに「●, ☆, ◇, @, ¥, =」などの記号が入った状態で確認画面に進むと、それ以降の文字列が文字化けを起こしてしまいます。

ただし、全ての記号が常に文字化けするわけではなく「◆, □, ※, 〒, ≡」などは大丈夫で、文字化けする記号群でも文頭になければOKという怪しい状態です。


試行錯誤してみると、文字列の前後の全角スペース削除部分が問題のようです。


問題の一文のコード

$str = trim(trim($str), " ");   //前後のスペースを除去

意図としては、trim()では全角スペースの除去ができないので、第2引数に任意の文字列(" ")を指定することで対応できるという考え方です。


しかし、PHPのマニュアルのtrim()には特に何も書いてないのですが、おそらく第2引数がマルチバイト文字に対応してないものと思われます。


つまり・・・こんな感じです。

PHPの内部エンコード(mbstring.internal…)がEUC-JPになっている
     ↓
全角スペースの文字コードは0xA1A1(EUC-JP)
     ↓
trim()が文字列の前後の0xA1をマルチバイト文字だろうが削除
     ↓
EUC-JPの1面1区の記号群は0xA1から始まるので削られる。
     ↓
削られた文字が1byteずれて、文字化けする。

残念ながらmb_~シリーズのようなマルチバイト対応のmb_trim()はないようです。

そこで仕方なく自前のユーザ関数を作るしかないですね。

/*
 * マルチバイト文字列用trim
 */
function mb_trim ($str, $chars = "\s ")
{
	$str = mb_ereg_replace("^[$chars]+", "", $str);
	$str = mb_ereg_replace("[$chars]+$", "", $str);
	return $str;
}

※こちらの記事を参考にさせていただきました。
 ITのーと - PHP trimで文字化け
 ASH Multimedia lab. - 文字コード表


[改訂版] PHP ポケットリファレンス (Pocket reference)[改訂版] PHP ポケットリファレンス (Pocket reference)
大垣 靖男

技術評論社 2005-09-17
売り上げランキング : 153904
おすすめ平均

Amazonで詳しく見る

帯域制限発動!

パーマリンク 2008/09/28 22:00:00 著者: kumaold メール
カテゴリ: ネットワーク

昨日から大容量通信を連続して行っていたら、気付いたときからWEBブラウジングの際のレスポンス(応答速度)がやたらと悪いんです。


前々からYahoo!BBは規制のが多いので評判の悪いプロバイダといわれていましたが、今まで規制らしい規制に当たったことがなかったので半信半疑でした。

しかし、流石に1日で30Gも通信をしたら帯域制限に当たってしまうようです。


そりゃ当然かorz



さて、先日の常会でやっと市の光ファイバーについての説明があったそうです。

それによると、早くも事前申込受付が11月ごろからスタートするようなので、プロバイダ選定に取り掛からなければならないですね。

マイナーなところでもいいので極力規制や制限の少ないところがいいな。



超入門 インターネットプロバイダの選び方―初心者もつまずかない (Compu books)超入門 インターネットプロバイダの選び方―初心者もつまずかない (Compu books)
田中 章

すばる舎 2000-09
売り上げランキング : 900251

Amazonで詳しく見る
type="text/javascript">
type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

かしも温泉スタンド

パーマリンク 2008/09/27 20:00:00 著者: kumaold メール
カテゴリ: 日々の生活

いきなり朝晩寒くなってきました。
今朝も10度ちょっと上くらいで、こんな天気だと温泉に入りたくなります。

そこでほぼ1年ぶりに「かしも温泉スタンド」まで温泉を汲みに行ってきました。


しばらく使ってない300Lタンクを掃除し、軽トラにて小郷まで。


今日は時間も早かったおかげかそれほど混雑していませんでした。

ここから帰宅して揚水ポンプで風呂に入れるまで、1時間の苦労です。


いつしかまで加温された方はつるつる度が低いと言われてましたが、今では加温された方もそういうわけでもないようです。

これで毎週末は自宅温泉もありかな。

住所 岐阜県中津川市加子母小郷767 →Yahoo!地図 
営業時間 加温あり:8:00~20:00   加温無し:24時間営業
定休日 無休

料金 加温あり:100円/150リットル(50℃)
    加温無し:100円/300リットル
泉質 単純弱放射能泉



防除に灌水に便利で丈夫なローリータンク【送料無料】ローリータンク LT-300
type="text/javascript">
type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

CakePHPでphpinfo風の情報表示

パーマリンク 2008/09/25 15:55:28 著者: kumaold メール
カテゴリ: プログラミング, PHP, CakePHP

色々とググっている最中に、こんなものを見つけました。

CakePHP phpinfo()風に設定を表示-CakeInfo-


公開用テスト鯖に入れてみると、こんな感じになりました。

最初からある定数だけでなく、ディレクトリのパスや、存在するコントローラ、モデル、ビューやメソッド名などが一覧で把握できるので便利です。


これのCakePHP 1.2対応バージョン(beta)もリリースされています。

 


 

CakePHP ポケットリファレンス (Pocket Reference)CakePHP ポケットリファレンス (Pocket Reference)
株式会社ブルーオーシャン 岡田 佳典

技術評論社 2008-06-18
売り上げランキング : 25013
おすすめ平均

Amazonで詳しく見る
type="text/javascript">
type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

地元最大の液晶モニタ!?

パーマリンク 2008/09/24 19:24:45 著者: kumaold メール
カテゴリ: 仕事, PCサポート

今日は、地元の方の所へ26インチ液晶モニタの取り付け作業に行ってきました。


PC用の液晶ディスプレイとしては、今まで自分が直接見たことのあるものの中では間違いなく最大のものです。解像度は1920x1200で24と同じですが。


ちょっとこのモニタを見てくれ、こいつをどう思う?
すごく・・・大きいです・・・。 (自重w

普通のフルキーボード↑がこのサイズですから。


対角26インチ=66cmというのは、計算した限りでは横幅57cm/高さ32cmで下手なテレビよりも大きいくらいです。


つい1年前まで24インチでさえ夢のような大きさだったものが、この1ヶ月ほどのLCDの大暴落の影響で4万円台で手に入るというのはすごいですね。

24インチも3万円台前半まで落ちたんで、自宅メインマシンの19インチCRT(UXGA)の置き換えにそろそろ欲しいなぁ。


【送料無料】iiyama PLE2607WS-W1 25.5ワイド液晶 ProLite E2607WS(ホワイト)

データの片付けをしよう。

パーマリンク 2008/09/23 20:00:00 著者: kumaold メール
カテゴリ: メインPC

しばらくまともにPCを掃除してないので、色々とゴミが散らかっています。
(ソフトウェア的にも、物理的な意味でも)


とりあえずPCの内部的なデータを片付けただけで丸一日終わってしまいました。

実データが500GB超もあるとバックアップだけで一苦労です。
ファイルサーバのHDDコピーもいずれ取らなくては・・・


ここでひとつ、おすすめのクリーンアップ&デフラグソフトを紹介します。

PowerX PerfactDisk 2008というものですが、前作のバージョンよりも使いやすく多機能になり、クリーンアップ機能が追加されました。

Windows標準のデフラグソフトよりも効率よく高速に処理が完了します。

スケジューリングをして定期的にデフラグを実行するようにすればPCを常に快適な状態に保つことができます。


PowerX PerfectDisk 2008 ProPowerX PerfectDisk 2008 Pro

ネットジャパン 2008-05-22
売り上げランキング : 1151
おすすめ平均

Amazonで詳しく見る

第13回高蔵寺SE勉強会

パーマリンク 2008/09/21 23:00:00 著者: kumaold メール
カテゴリ: 仕事, 勉強会など

本日は第13回高蔵寺SE勉強会を行いました。

今回から日程とやることを相談してしっかり決めてから行うことになりました。


で、まずは宿題の方から。今回はこちらです。

◆上級者用

CakePHPの新しい機能を発見しよう

[言語]CakePHP
[お題]
CakePHPの機能で自分が使ったことのない機能を使ってみよう。


ということで、解説本で見たことしかなかったbakeを使ってみました。


ちょうど完全日本語化も完了していたので、比較的使いやすい感じです。

オプションで読み込むことのできるテンプレートのコントローラやビューも、手直しをすれば十分に使えるレベルにあるようです。

新規でコントローラなどのファイルを作成する際にでも使っていこうかと思います。



午後からの開発&発表の時間では、先日の合宿のアクセス統計の部分を何か分かりやすいグラフで表現できないかと探してみたところ、

amCharts』なるFLASHできれいなグラフを作成してくれるツールがありました。


これ、色々なグラフに対応しており、サンプルを見ると多機能さに驚きます。


今回は、その1つである「Pie & Donut chart」(通称、ampie。要は円グラフ)を使わせてもらいました。

あまりに多機能すぎて紹介できないので、こちらの解説ページなどを参考に。

//カウント用変数
$etc = 0;

//XMLファイルのヘッダ
$text  = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
$text .= '<pie>' . "\n";

//XMLファイルにデータを出力
foreach ($data as $key => $total) {
    //上位10件を表示
    if ($key < 10) {
        //アクセス元不明は除く
        if ($data['org'] != '') {
            $text .= '    <slice title="' . $data['org'] . '">' . $data['count_org'] . '</slice>' . "\n";
        }
    //その他を集計
    } else {
        $etc += $data['count_org'];
    }
}
$text .= '    <slice title="その他">' . $etc . '</slice>' . "\n";

//XMLファイルのフッタ
$text .= '</pie>' . "\n";

//XMLファイルを保存 (webroot/logs/access_host.xml)
if($text){  
    $fp = fopen('logs/access_host.xml', 'w') or die("Error!!\n");  
    fputs($fp, $text);  
    fclose($fp);  
}


先日書いた、アクセス元ホスト統計のデータをXML型式のファイルを介して渡してやります。

全件グラフにすると最後は細かい項目で埋め尽くされてしまうので、上位10件は個別、残りはその他としました。


で、その結果の出力が↓こちら。

注: 実際はFLASHなのでいろいろと動きます。


割と簡単に見やすい円グラフが作成できました。

まだオプションの項目がたくさんあるので、色々触ってみたいと思います。



グラフ活用の技術 データの分析からプレゼンテーションまでグラフ活用の技術 データの分析からプレゼンテーションまで
内田 治

PHP研究所 2005-03-16
売り上げランキング : 270587
おすすめ平均

Amazonで詳しく見る

色々メンテナンス

パーマリンク 2008/09/20 23:00:00 著者: kumaold メール
カテゴリ: 日々の生活

台風一過の晴天でいい天気だった(ちょっと暑い…)ので、久々に洗車をしました。


流石に1ヶ月もやってないと汚れがひどいので、全体を洗った後、掃除機でゴミを片付けてから車内も全部拭いて綺麗にしました。

洗車前後で比べるとかなり綺麗になった印象なので、いかにやっていなかったかがよく分かりました。(まあ天気的な都合があったとはいえ)


少なくとも月に1回は洗車すべきだな、と思いました。



なんか今の携帯、SH905iを使っているとどうも不安定なんですよ。

今日も夕方、電池が切れて充電しても起動後にフリーズしたり、画面が真っ白になって再起動を繰り返したり。

下手するともう起動してくれないのかと冷や冷やしながら電池パックを抜いたり試行錯誤したら不安定ながら起動してくれました。


データ消失が恐ろしくなったので、急遽携帯万能にてバックアップをしました。


携帯も多機能化しすぎてWindowsみたいになってきたのかも。。。



携帯万能 for Windows DoCoMo FOMA / SoftBank 3G用携帯万能 for Windows DoCoMo FOMA / SoftBank 3G用

トリスター 2007-10-05
売り上げランキング : 901
おすすめ平均

Amazonで詳しく見る

風が吹けばドライブが壊れる

パーマリンク 2008/09/19 23:37:06 著者: kumaold メール
カテゴリ: デジタルモノ, メインPC

なんかあれだけ騒いだ割にはあっけなく台風が通り過ぎてしまったようです。
もう少し風雨があるかと思ったら予想外でした。

加子母では総雨量5.5ミリ、最大瞬間風速11.7m@22:10で、何ともない量です。



さて、データコピーを頼まれたので久々にCDドライブを使ってみたら何故かまったくディスクを認識してくれません。

BIOSとOS上ではしっかり表示されているのに、認識がおかしいようです。

DVD/CDドライブなんて普通に使っていればそう壊れる品でもないのに・・・
流石にCore 2 Duo E4600(2.4GHz)の3.36GHz常用は厳しかったのかな?


次の買い替えは壊れる頃には程よく安くなるであろうブルーレイドライブにしようかと思っていましたが、予想外に寿命が短かったので仕方なく取りやめにします。



程よいドライブはないかと探していたら、いつの間にかLG電子も新型DVDドライブ出していたんですね。

GH22NP20』という型番なんですが、無駄にDVD±R 22倍速書込とかいう仕様なんですよ。どこに22倍速のメディアがあるんだよ、って言いたくなるほど。

ひとつ買ってみるかな。



LG Electronics Japan 22x Super Multi DVD/CD Rewriter ATAPI接続内蔵型ドライブ GH22NP20ブラック バルク GH22NP20BLLG Electronics Japan 22x Super Multi DVD/CD Rewriter ATAPI接続内蔵型ドライブ GH22NP20ブラック バルク GH22NP20BL

LG電子
売り上げランキング : 63189

Amazonで詳しく見る

JSPでデータベース

パーマリンク 2008/09/18 19:36:38 著者: kumaold メール
カテゴリ: 仕事, プログラミング, Javascript/Java

ここ数日間、苦労してJSPでデータベース操作はできないものかと調べてました。

なかなかネット上に新しい有効な方法が少なくて苦労しましたが、やっと簡単にDBに接続する方法を見つけました。


以前からJSPタグライブラリを使っているのでそれを前提として書きます。
(普通に書くと多分もう少し面倒になりそう)


まず、PostgreSQL用のJDBCドライバをダウンロード。

こちらのページの「JDBC4 Postgresql Driver, Version 8.3-603

これをJSTLなどと同様のディレクトリ(webapps/jsp/WEB-INF/lib)に置く。
ついでに「postgresql.jar」などとリネーム(しなくてもいい)

で、Tomcatを再起動。

service tomcat restart


これで下準備は完了。

肝心の処理内容のソースコードはこちら。

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
    <meta http-equiv=content-type content="text/html; charset=UTF-8">
    <title>JSPデータベース@タグライブラリ</title>
</head>
<body>

<%-- PostgreSQLデータベースに接続 --%>
<sql:setDataSource
    var="db"
    url="jdbc:postgresql://localhost/DBname"
    user="user"
    password="pass"
    driver="org.postgresql.Driver"
/>

<%-- SQLクエリを発行 --%>
<sql:query var="bbs" dataSource="${db}">
    SELECT * FROM bbs;
</sql:query>

<table border="1" cellspacing="0">
    <tr>
        <th>投稿ID</th><th>投稿者</th><th>投稿内容</th>
    </tr>
<c:forEach var="log" items="${bbs.rows}">
    <tr>
        <td>${log['id']}</td>
        <td>${log['name']}</td>
        <td>${log['post']}</td>
    </tr>
</c:forEach>
</table>

</body>
</html>


ここで全体の流れについて簡単な解説をしときます。
素のPHPでDBアクセスするときの流れにかなり近い感じです。


通常のcoreライブラリに加え、sqlタグライブラリをインクルード

<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>


初期設定をし、取得したデータソースをdbオブジェクトに格納する。
url には、「jdbc:postgresql://localhost/」に続けてデータベース名と入力。

<sql:setDataSource
    var="db"
    url="jdbc:postgresql://localhost/DBname"
    user="user"
    password="pass"
    driver="org.postgresql.Driver"
/>


SQL文を実行し、結果をbbsオブジェクトに返す。
sql="SQL文"として<sql:query />タグ内に書いても良い。

<sql:query var="bbs" dataSource="${db}">
    SELECT * FROM bbs;
</sql:query>


オブジェクトbbsのrowsを参照することで、1レコードを取り出すことができる。

あとはデータが連想配列になっているので、PHP同様にデータが取り出せる。

<c:forEach var="log" items="${bbs.rows}">
・・・
</c:forEach>

CakePHP 1.2でGROUP BY

パーマリンク 2008/09/16 19:53:48 著者: kumaold メール
カテゴリ: プログラミング, PHP, CakePHP

昨日無理矢理書いたアクセス解析集計ページのfind()の条件指定をもう少しスマートに書けないかと調べてみました。

まず、1.1との互換性の関係で古い書き方も許されていたため中途半端なfind()の条件指定になってしまったので、ここでひとつ統一したいと思います。


'fields'には、必要なフィールドを配列で区切って渡します。
'order'も同様、連想配列で分けて渡します。


今まで直接書けなかったGROUP BYですが、1.2 RC1(?)あたりから'group'という項目が追加されたようです。

そのおかげで'conditions'に無理に書いていたのが直接書くことができました。
 
 

$conds = array(
    'fields' = 'Host.org, COUNT(*) AS "Count__org"',
    'conditions' => 'GROUP BY Host.org',
    'order' => 'Count__org DESC'
);

これを新CakePHP 1.2流の書き方に直してみたのがこちら。

$conds = array(
    'fields' => array('Host.org', 'COUNT(*) AS "Count__org"'),
    'group' => 'Host.org',
    'order' => array('Count__org' => 'DESC')
);

訂正: groupに配列で値を入れるとエラーになります

断片的にSQL文の一部が隠れていたものが、スマートになりました。

知っていると得することも結構ありますね。
新リリース(次はRC3?)が出たら一通りの変更点を調べておくといいです。



CakePHP ポケットリファレンス (Pocket Reference)CakePHP ポケットリファレンス (Pocket Reference)
株式会社ブルーオーシャン 岡田 佳典

技術評論社 2008-06-18
売り上げランキング : 27145
おすすめ平均

Amazonで詳しく見る

開発合宿3日目

パーマリンク 2008/09/15 23:00:00 著者: kumaold メール
カテゴリ: 勉強会など, PHP

今日は二度寝する間もなく気づいたら8時半で、眠い中起きました。


合宿最終日、ということで今日こそそれなりに仕上げないといけません。

まずは持ち越し課題のデータ取得を、一覧ページを開いた時点でDBにデータが無かったら取得してくるようにし、自然に解析が出来るようにしました。


しかし解析データ追加ページでSQLエラーが出てしまいます。
データ追加自体はできているのでいいんですが、エラーが出ているというのはあまり気持ちのいいものではありません。


エラーを見ていると『duplicate key value violates unique constraint "ips_pkey"』と出て、何故か2重にINSERTが実行されてしまっている状況です。

一瞬出て消えるもう1つのエラーで存在しない「nextval(ips_id_seq)」とか実行されていることをみると、主キーがデフォルトのidでないのが原因のようでした。


そこでモデル内に主キーを設定する一文を追加し、解決しました。

var $primaryKey = 'ip';


最後に、解析・統計ができないと意味がないのでとりあえず実装してみました。


出力結果的にはこんなことがやりたかったわけですが、CakePHPには残念ながらそれが一発でできる関数がないんですよ。

アクセス元ホストアクセス数集計
OCN119
Yahoo! BB49
DION46


find('all')一覧出力+find('count')合計出力でfind('countAll')とか欲しいのに。

要はSQL文で GROUP BY の COUNT(*) すればいいだけなので、find('all')の条件式に無理矢理埋め込んでみました。

$conds = array(
    'fields' => 'Host.org, COUNT(*) AS "Count__org"',
    'conditions' => 'GROUP BY Host.org',
    'order' => 'Count__org DESC'
);


SQL文を直接叩いた方が綺麗な気がするが、まあ動くので良しとしよう。



改訂新版 SQLポケットリファレンス (Pocket reference)改訂新版 SQLポケットリファレンス (Pocket reference)
朝井 淳

技術評論社 2003-06-10
売り上げランキング : 37949
おすすめ平均

Amazonで詳しく見る

開発合宿2日目

パーマリンク 2008/09/14 23:00:00 著者: kumaold メール
カテゴリ: 仕事, 勉強会など

昨日(?)、夜3時過ぎに寝たおかげで寝覚めが悪い・・・


午前中は毎度の問い合わせは重いので、データのキャッシュの実装の下準備としてテーブル設計をし直しました。


総合的に判断した結果、アクセスログ、DNS逆引き、ドメイン情報の3つのテーブルにてリレーションを設定の上データを入れることにしました。


そこで1つ苦労した謎のエラー。これで1時間近く悩みました。

ドメイン情報を入れるテーブル名をCakePHP式に「domains」にすると、謎のエラーが出てfind()、save()などのテーブル操作が一切出来ませんでした。

プログラムやテーブル構造を疑いましたが原因は分からず、仕方なくテーブル名を変更することで解決しました。

おそらく、PostgreSQLの予約名か何かじゃないのかな~と思います。


午後の中間発表からは、ある程度の実データが無いとアクセス解析のしようがないのでデータ入力&検証でほとんど時間を潰しました。

あとは手動操作で1件ずつ取得しているホスト名をまとめて取得とかしたいなぁ

開発合宿1日目

パーマリンク 2008/09/13 23:00:00 著者: kumaold メール
カテゴリ: 仕事, 勉強会など

この13(土)~15(月・祝)の3連休、加子母の「ふれあいのかやた かしも」にて開発合宿のため来ています。

内容は、先日書いたブログのアクセス解析を中心にやろうと思います。

とりあえず今日はアクセス元の詳細解析までやろうと思いました。


手順としては、このようになります。

[IPアドレス]→DNS逆引き→[ホスト名]→WHOIS検索→[プロバイダ・組織名]


DNS逆引きは、PHPに便利な関数があってそれ1つで完了です。

$hostname = $gethostbyaddr ($IP);


WHOIS検索では、単純にホスト名を渡すだけでは駄目で、適切なドメイン名に直してから渡さないと検索ができません。

例: ※サブドメインは一部適当です。

test.yahoo.co.jp→ yahoo.co.jp
123.45.67.89.bbtec.net→ bbtec.net
proxy01.city.nakatsugawa.gifu.jp→ city.nakatsugawa.gifu.jp
sv02.metro.tokyo.jp→ metro.tokyo.jp


前者2つは通常規則通りco.jp/netなどの1つ前以降を切り出せばいいのですが、後者2つは地方公共団体ドメインで非常に苦戦しました。


これは、単純にtokyo.jpだけだと『東京ドメイン』という総称しか確定しません。
以下のような長いパターンが、固有のドメイン名になります。

metro/pref/city.県市名.jp
city/town/vill.市区町村名.県名.jp
metro/pref/city/town/vill.県市区町村名.lg.jp


そこで仕方なく、サード/フォースレベルドメインに上記の特定ワードが来たときのみドメインの切り出し範囲を変えるようにして何とか対応させました。


肝心のWHOIS検索部分ですが、シェルから実行した結果をもってきました。

$org = exec("whois -h whois.jp $domain | awk '/[cf]\. \[/ {print $3,$4,$5}'");


日本語で結果を取得するため、WHOISホストにwhois.jpを指定します。

定型パターンの結果を処理するため、awkにて正規表現でc./f.から始まる組織名の行のスペース区切り計算で3-5列目を抜き出すという処理を行っています。



とりあえず今日は詳細なデータ取得が出来るようになったので、良しとします。


毎度データを取りにいくと遅いので、明日はDBによるキャッシュを実装します。



Webドメインマーケティング―ヒットの裏にはオリジナルドメインがあった!Webドメインマーケティング―ヒットの裏にはオリジナルドメインがあった!
宣伝会議

宣伝会議 2008-03
売り上げランキング : 287185

Amazonで詳しく見る

Vistaにしようにも・・・

パーマリンク 2008/09/10 14:28:41 著者: kumaold メール
カテゴリ: 仕事

日頃からVistaは糞だとか言いつつも、サポートの関係である程度は操作できるようにしておかないと苦労するのでLet's noteにインストールすることにしました。

現在使用しているLet's noteは4世代前のCF-W2ですが、スペック的にはとりあえず実用レベルのPenM 1.2GHz/512MB/60GBなので問題はありません。


予想通り、問題なくインストールは完了しました。

もちろん怖いのでいつも通りのXP/Vistaデュアルブートですが。

しかし、XP用のドライバを強引に入れようとしたら、「…ブロックされました」とか出てくるので、仕方なくPanasonic公式サポートページを見てみました。

Windows Vista対応キットを提供しませんので、Windows Vistaにアップグレード後、次の機能が使用できなくなります。

  • ホットキー(Fn+Fxキー操作) ※画面の輝度調整ができなくなります。
  • 内蔵SDカードスロット
  • 内蔵モデム
  • ホイールパッドユーティリティ
  • ネットセレクター
  • SDユーティリティ
  • PC情報ビューアー
  • DMIビューアー
  • 無線LAN切り替えユーティリティ(CF-Y2C、W2Cシリーズ以降)
  • ・・・


・・・これはひどい

性能はとりあえず問題ないのにメーカーがソフトを提供してくれないとはorz

Vistaにしたけりゃ素直に買い換えろってことですか。


ますますVistaを(自主的に)使いたくなくなってしまった。



Windows Vistaの薬箱―トラブル回避のテクニックとセキュリティ対策Windows Vistaの薬箱―トラブル回避のテクニックとセキュリティ対策
永島 智二

九天社 2007-11
売り上げランキング : 192766

Amazonで詳しく見る

JSPの実体ファイル

パーマリンク 2008/09/08 22:28:10 著者: kumaold メール
カテゴリ: 仕事, プログラミング, Javascript/Java

PHPと違ってJSPはJavaが原型のコンパイラ言語なので、コンパイル後の実行ファイル?としてファイルが存在するわけです。

*.jspファイルを書き換えた場合、初回アクセス時に再コンパイルされるようです。

例えば、webapps/jsp/index.jsp にこんなファイルを作ったとします。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<html>
<head>
    <meta http-equiv=content-type content="text/html; charset=utf-8">
    <title>Untitled</title>
</head>
<body>

<% out.println("Hello, JSP!"); %>

</body>
</html>


すると、かな~り奥深い階層のこの場所に*.javaと*.classがあります。
拡張子的に想像がつくと思いますが、Javaのソースと実行ファイルです。

/usr/local/tomcat/work/Catalina/localhost/jsp/org/apache/jsp/

・index_jsp.java
・index_jsp.class

開いてみると、完全なJavaのソースファイルで、<% %>の外に記述されたhtmlなども1行1行out.write();で書き出していることが分かります。

Javaでこれは効率悪そうとか思いつつ、何か問題が起きたらこれを見れば分かりそうな気がします。
(そもそもJavaを先にやるべきだったか?)

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  private static java.util.List _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.AnnotationProcessor _jsp_annotationprocessor;

  public Object getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
  }

  public void _jspDestroy() {
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n");
      out.write("\n");
      out.write("<html>\n");
      out.write("<head>\n");
      out.write("\t<meta http-equiv=content-type content=\"text/html; charset=utf-8\">\n");
      out.write("\t<title>Untitled</title>\n");
      out.write("</head>\n");
      out.write("<body>\n");
      out.write("\n");
 out.println("Hello, JSP!"); 
      out.write("\n");
      out.write("\n");
      out.write("</body>\n");
      out.write("</html>");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}


これで何となくJSPに実行原理が分かった気がします。

コンパイラ言語でありながらインタプリタ言語のような感覚で扱えるのも内部的にこんな処理を入れているからですかね。



一番やさしいJSP & サーブレット入門塾 第2版 (DB Magazine SELECTION)一番やさしいJSP & サーブレット入門塾 第2版 (DB Magazine SELECTION)
山本 隆之

翔泳社 2008-03-19
売り上げランキング : 122492
おすすめ平均

Amazonで詳しく見る

ブログのアクセス解析

パーマリンク 2008/09/05 19:00:00 著者: kumaold メール
カテゴリ: 仕事

ブログのアクセス数も増えて落ち着いてきたので、試しに検索エンジンから来た人(=新規で来た人)の傾向をちょっと調べてみました。

方法は IPアドレス→DNS逆引き→WHOIS/JPRS にて


100件ほど全て手動で調べて見た結果、やはり仕事関係で解決法とか設定、コードとか載せてるおかげか個人: 企業: 他が7: 2: 1ほどの割合でした。

企業名は差し控えますが、情報通信・電気系からのアクセスが結構多いようです。
それと、某大手通信会社とその子会社からもやたらと多い。


公表しても差し支えのない公共団体など紹介しときます。

宇宙航空研究開発機構、農林水産省農林水産技術会議、埼玉県、青森県、沖縄県、北海道富良野市、新潟県南魚沼市、明治大学、徳島大学、京都産業大学、名古屋大学 など

なんか素晴らしいところからのアクセスが多々。先月あたりに書いた某ウイルス名で検索していると、あそこも感染したんだなw、とか思ってしまいます。


探してみてもPHPで作られた、ホスト名(IP)から組織名、プロバイダ名まで表示してくれる多機能なアクセス解析があまりないので、合宿で作ってみようかな。



アクセス解析 徹底活用術 ~ネットで売上を増やす!~アクセス解析 徹底活用術 ~ネットで売上を増やす!~
池上 正夫

毎日コミュニケーションズ 2008-02-23
売り上げランキング : 12481
おすすめ平均

Amazonで詳しく見る
by G-Tools

ApacheとTomcatの連携

パーマリンク 2008/09/03 23:05:27 著者: kumaold メール
カテゴリ: 仕事, サーバ関係, Javascript/Java

昨日のJSP環境構築では、外部に8080ポートを空けていない開発鯖ではテストが出来ない上に、別ポートというのは実用的ではありません。

そこでApacheとTomcatの連携をまとめときます。


現状、Apacheが80番ポート、Tomcatが8080番ポートで稼動しているので、JSPの場合だけ8080番ポートに回してやればいいわけです。

そこでリバースプロキシを使います。


元のApacheのディレクトリに入って、configureのオプションを変えてコンパイル。
--enable-module=proxy でプロキシモジュールの追加コンパイル。

./configure --enable-module=so --enable-module=rewrite --enable-module=proxy
make

Apacheを一時的に止めて、make installする

service httpd stop
make install

httpd.conf の適当なところに以下を追加し、Apacheの再スタート

vi /usr/local/apache/conf/httpd.conf
<IfModule mod_proxy.c>
    ProxyPass /examples/ http://localhost:8080/examples/
    ProxyPass /jsp/ http://localhost:8080/jsp/
</IfModule>
service httpd restart


これで、http://localhost/jsp/へのアクセスは内部的にはhttp://localhost:8080/jsp/として処理されるので外部からも問題なく使うことが出来る。


当面の間はjspディレクトリ内にて開発を行うことにするので、シンボリックリンクを作成しておくと便利かも。



10日でおぼえる JSP/サーブレット入門教室 第3版10日でおぼえる JSP/サーブレット入門教室 第3版
山田 祥寛

翔泳社 2008-04-11
売り上げランキング : 193079

Amazonで詳しく見る

次の言語はJSP

パーマリンク 2008/09/02 22:07:31 著者: kumaold メール
カテゴリ: サーバ関係, プログラミング, Javascript/Java

8月も終わりC言語もポインタ~構造体あたりまで一通りは扱うことが出来ました。

色々な言語に触れてみるという基本コンセプトのもと、9月からはまた別の言語をやろうということになりました。


そこで挙がったのがJSP(Javaサーブレット)です。
JSP自体の使用法としてはPHPに近いので取っ付きやすいというのもあります。

JSP実行環境を構築すればJavaも出来るので、今月はJSPとJavaに決まりました。


さて、まずは実行環境を整えないといけません。
今日の午後半分の時間を費やして、JSP環境構築を行いました。

参考にしたのはこちらのページです。

サーブレット/JSPサーバー構築(Tomcat6)


1.Java SE Development Kit(JDK)の導入

こちらからJava SE Development Kit 6 update 7のrpm版をDLする。

cd /usr/local/src
wget http://.../jdk-6u7-linux-i586-rpm.bin

ファイル名が長くURLのゴミが残っているのでリネームする。

mv '長い元のファイル名' jdk-6u7-linux-i586-rpm.bin

実行権限を付加した上で実行し、手順に沿って進めるとJavaが入る。

chmod +x jdk-6u7-linux-i586-rpm.bin
./jdk-6u7-linux-i586-rpm.bin

環境設定ファイルを開き、最終行に以下の内容を追加し、変更を反映させる。

vi /etc/profile
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
source /etc/profile

この状態でJavaのコンパイル及びJAVAプログラムの実行が出来る。

Javaソフトの開発を行うのであればここまでで十分だが、JSPを実行するにはTomcatのインストールと設定が必要になる。


2.Tomcatの導入

Tomcatにはバージョンがあるが、今回はTomcat6を使用する。

解凍し、展開したフォルダを直接移動させる。

tar xzf apache-tomcat-6.0.18.tar.gz
mv apache-tomcat-6.0.18/ /usr/local/tomcat

環境設定ファイルを作成する。

vi /etc/profile.d/tomcat.sh
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/usr/local/tomcat
export CATALINA_HOME=/usr/local/tomcat
export CLASSPATH=$CLASSPATH:$CATALINA_HOME/common/lib

Tomcat起動スクリプトを作成する。

vi /etc/rc.d/init.d/tomcat
#!/bin/bash
#
# Startup script for the tomcat
#
# chkconfig: 345 80 15
# description: Tomcat is a Servlet+JSP Engine.

# Source function library.
. /etc/rc.d/init.d/functions
source /etc/profile.d/tomcat.sh

start(){
    if [ -z $(/sbin/pidof java) ]; then
        echo "Starting tomcat"
        /usr/local/tomcat/bin/startup.sh
        touch /var/lock/subsys/tomcat
    else
        echo "tomcat allready running"
    fi
}

stop(){
    if [ ! -z $(/sbin/pidof java) ]; then
        echo "Shutting down tomcat"
        /usr/local/tomcat/bin/shutdown.sh
        until [ -z $(/sbin/pidof java) ]; do :; done
        rm -f /var/lock/subsys/tomcat
    else
        echo "tomcat not running"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        /usr/local/tomcat/bin/catalina.sh version
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status}"
esac

exit 0

Tomcat起動スクリプトに実行権限を付加する。

chmod +x /etc/rc.d/init.d/tomcat

Tomcatを起動させる。

/etc/rc.d/init.d/tomcat start

Tomcat起動スクリプトを自動起動に設定する。

chkconfig --add tomcat
chkconfig tomcat on


これでJSTの実行環境(仮)はほぼ構築完了!

JSPのドキュメントルートは /usr/local/tomcat/webapps/ になる。
開発テスト用にjspディレクトリを作成し、テストファイルを作成。

/usr/local/tomcat/webapps/jsp/test.jsp

<% out.println("Hello, JSP!"); %>

http://localhost:8080/jsp/test.jsp にアクセスし、表示されれば問題なし。


10日でおぼえる JSP/サーブレット入門教室 第3版10日でおぼえる JSP/サーブレット入門教室 第3版
山田 祥寛

翔泳社 2008-04-11
売り上げランキング : 193079

Amazonで詳しく見る

一六社で働くITエンジニアのブログ。

普段はWeb系システム開発と地元のPCサポートをやってます。いつの間にやら会社に8年目。
技術ネタ中心に日々の仕事と生活と趣味やらを気が向いたら書いてます。

2008年9月
 << < 現在> >>
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

検索

XMLフィード

16ブログ     blogging software