2006年11月20日月曜日

「Windowsはフォーマットを完了できませんでした」というエラーが出る


楽天で買った激安USBメモリ(512MB)がおかしくなってしまいました。



買った当日は普通に使えてたんですが、翌日、再度使おうとするとエラーが。
USBポートにUSBメモリを差し込むと認識はするんですが、アクセスすると「フォーマットしてください」と言われてしまいます。大して大事なデータは入れてなかったので指示に従ってフォーマットしようとするものの「Windowsはフォーマットを完了できませんでした」というエラーが出てしまってフォーマットができない。どういうことだ??




コマンドプロンプトからchkdskしてみると、「RAWデバイスではchkdskは使えません」みたいな感じのことを言われました。よくわからないけど、なんだかやばそうな雰囲気。。



ここで「Windowsはフォーマットを完了できませんでした」でググってみたところ、フロッピーディスクやハードディスクで同じような症状が報告されている。どうやらフォーマットが物理的におかしいらしいです。



HDDでの事例だったんですが、Disk Formatterというソフトを使えば物理フォーマットができるというので、さっそく試してみます。
http://buffalo.jp/download/driver/hd/format.html



インストールして起動し、USBメモリを選択。「物理フォーマットもする」をチェックしてフォーマットを実行すると、2分くらいでフォーマットが完了しました。
このままだとFAT16になってるようなので、マイコンピュータからUSBメモリをFAT32でフォーマット。すると今度はフォーマットが成功し、普通にデータの入出力ができるようになりました。ふぅ。



買った早々にぶっ壊れたかなー、と思って心配でしたが、復活して良かったです。めでたしめでたし。

2006年11月11日土曜日

apache2にmod_deflateを導入


mod_deflateを導入しました。
概要や導入方法は下記が参考になります。
http://www.atmarkit.co.jp/flinux/rensai/apache2_04/apache04a.html



上記ページの通りにapacheを再コンパイル、インストール。設定をして再起動。。。



IEからアクセスしてみると、体感で少し速くなってる気がします。
そしてdeflateのログを見ても圧縮されてる様子。
また、



http://www.port80software.com/support/p80tools



↑で調べてみても「is gziped.」と出ます。う~ん、意外とスンナリ導入できたなぁ。



、、、と思ったんですが、困ったことにhtmlの圧縮はされてるけれど、cssやrdf、xmlが圧縮されていません。
cssやrdf、xmlって意外とアクセスが多いので、これはぜひとも圧縮したいところ。というわけで設定を見直します。



httpd.confをいじっては試し、いじっては試し、、、で動作を確認していくと、@ITに書いてある設定方法がおかしいことがわかりました。



http://d.hatena.ne.jp/kudzu/20060720/1153412166



↑こちらのページでも指摘していますが、「SetEnv gzip-only-text/html 1」があると、「AddOutputFilterByType」で個別に圧縮対象のContent-Typeを指定してもすべてかき消され、text/htmlだけしか圧縮されなくなるようです。




いろいろ試してみましたが、正解はここに書いてある通り。
http://cvs.apache.jp/svn/httpd-docs/2.0/manual/mod/mod_deflate.xml.ja



「せっかちな人向けの簡単な設定例」をそのまんま使えばOKです。
最終的にこんな感じにしました。



<IfModule mod_deflate.c>
DeflateCompressionLevel 5
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rdf+xml

#DeflateFilterNote Input instream
#DeflateFilterNote Output outstream
#DeflateFilterNote Ratio ratio
#LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%) %{User-agent}i' deflate
#CustomLog logs/deflate_log deflate
</IfModule>



これでcssやjs、rdf、xmlなども圧縮されて転送されるようになりました。モチロン、gifやjpgなどの画像は圧縮されません。
あと、ブラウザごとに細かく設定しようかとも思いましたが、面倒なのでやめました(^-^A



mod_deflate、とりあえず今のところは軽快に動いているようです。手軽に導入できて回線リソースの節約になるので、時間のある人は試してみるといいかもしれません。

2006年11月7日火曜日

PEARのPagerクラスを使う


「前へ 1 2 3 4 5 6 7 8 9 10 次へ」



↑こういう感じのページナビゲーション、いわゆるページング処理を手軽に実装できるのがPEAR::Pagerです。実際使ってみたんですが、かなり便利です。



基本的な使い方は「pear pager」などでググると有用なページがいくつも見つかるのでそちらを参考にするといいと思います。というよりもむしろ実際に試して体で覚えるのがいいと思います。すごく簡単なので。



ちなみにこのページング処理、検索エンジン対策としてPATH_INFOにも対応できるといいな、、、って思っていたら、やってる方がいました。



http://project-p.jp/halt/anubis/blog_show/469



こちらを参考に実装してみました。



<?php

/*** pager.php ***/

//PATH_INFOから現在のページを取得
$tpath = explode("/", $_SERVER['PATH_INFO']);
array_shift($tpath);
if($tpath[0]){ $current_page = $tpath[0]; }else{ $current_page = 1; }


require('Pager/Pager.php');
require('Smarty/Smarty.class.php');

$smarty = new Smarty;
$smarty->template_dir = './smarty/template';
$smarty->compile_dir  = './smarty/template_c';


//ページング処理
$params = array(
    "perPage" => 5,
    "totalItems" => 100,
    'mode' => 'Sliding',
    'delta' => 2,
    'path' => 'http://localhost/pager/',
    'currentPage' => $current_page,
    'fileName' => '%d',
    'append' => false,
    'altPrev' => '前のページ',
    'altNext' => '次のページ',
    'altPage' => 'ページ',
    'firstPageText' => '最初',
    'altFirst' => '最初',
    'lastPageText' => '最後',
    'altLast' => '最後',
    'extraVars' => array("a" => 1),
    'showAllText' => 'show all',
    'importQuery' => true
    );
$pager = Pager::factory($params);
$navi = $pager->getLinks();
$smarty->assign("pageNavi",$navi['all']);

$smarty->display("pager.tpl");

?>



{** pager.tpl **}

<html>
<body>

{$pageNavi}

</body>
</html>


実は extraVars とか、いまいち動作がよく分からない変数があるんですが、その辺はあまり深く追求せずに使ってます。こういうのは自作しないでライブラリ使ったほうが絶対いいので、一度試してみる価値はあると思います。

2006年11月1日水曜日

MySQLのvarchar型はwhereやorderでは大文字小文字を区別しない


php+mysqlのウェブアプリ開発をしてて、where句でIDの検索をしても大文字小文字が区別されずに検索されてしまうことに気付きました。で、調べてみたところそういう仕様なんだそうです。全然知らなかった。。



http://www.physalis.net/ss/space/blog/5;jsessionid=C508160EDC0E3E5E1752A8EADA04D819



ふーむ、まったく知らなかった。



ちなみに解決策はvarchar型にbinary属性を指定すること。phpMyAdmin(2.7)だと「表示する」って項目のセレクトボックスにあります。こいつを選択してやればbinary属性付加が完了。検索で大文字小文字の違いが区別されるようになります。