アーカイブ: 2008年11月

fgetcsvでの文字化け

パーマリンク 2008/11/30 23:56:20 著者: kumaold メール
カテゴリ: プログラミング, PHP

宿泊案内ネットのデータ移行作業を担当することになったので、現行鯖のDBからCSV形式で取り出したデータを新形式に加工した際の苦労をひとつ。


普通にCSV形式のデータを読み込んで、PHPで整形したりする場合よく使うのがこんな感じでexplodeによる切り分けなわけです。

$row = explode(',' $csv);

しかし今回は、データ中にもカンマ(,)が入っているフィールドがあったため、見事にデータが分断されてしまいました。

そこで元からCSVの展開専用の関数fgetcsvを使えばその辺もしっかり対応しているわけですが、見事なまでの先頭文字の文字化け。

三重県→O重県、山口県→R口県、etc... (→ひどい例


そこでこのfgetcsvの使用前に、これを付けるといいらしい。

setlocale(LC_ALL, 'ja_JP');

まあ若干改善されてはいるものの、まだ文字化け箇所がありました。

どうもいろいろ探ってみると、PHP4→PHP5あたりの仕様変更バグ?とか何とか。



結局のところ、こちらにあった改良版のfgetcsv_regにて無事解決しました。

相変わらず、マルチバイト関係では何かと問題があるなぁ。

<?php
    /**
     * ファイルポインタから行を取得し、CSVフィールドを処理する
     * @param resource handle
     * @param int length
     * @param string delimiter
     * @param string enclosure
     * @return ファイルの終端に達した場合を含み、エラー時にFALSEを返します。
     */
    function fgetcsv_reg (&$handle, $length = null, $d = ',', $e = '"') {
        $d = preg_quote($d);
        $e = preg_quote($e);
        $_line = "";
        while ($eof != true) {
            $_line .= (empty($length) ? fgets($handle) : fgets($handle, $length));
            $itemcnt = preg_match_all('/'.$e.'/', $_line, $dummy);
            if ($itemcnt % 2 == 0) $eof = true;
        }
        $_csv_line = preg_replace('/(?:\r\n|[\r\n])?$/', $d, trim($_line));
        $_csv_pattern = '/('.$e.'[^'.$e.']*(?:'.$e.$e.'[^'.$e.']*)*'.$e.'|[^'.$d.']*)'.$d.'/';
        preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
        $_csv_data = $_csv_matches[1];
        for($_csv_i=0;$_csv_i<count($_csv_data);$_csv_i++){
            $_csv_data[$_csv_i]=preg_replace('/^'.$e.'(.*)'.$e.'$/s','$1',$_csv_data[$_csv_i]);
            $_csv_data[$_csv_i]=str_replace($e.$e, $e, $_csv_data[$_csv_i]);
        }
        return empty($_line) ? false : $_csv_data;
    }
?>


参考にしたサイト



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

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

Amazonで詳しく見る

データ移行メモ

パーマリンク 2008/11/28 23:52:31 著者: kumaold メール
カテゴリ: 仕事, サーバ関係

開発鯖から本番鯖へのデータ移行に取りかかったので方法のメモ書き。


データバックアップ(データディレクトリにw権限がない場合)

gzip -rc Foldername > Filename.gz

データリストア(圧縮ファイルは消える)

gunzip Filename.gz


データベースの移行には、pg_dumpコマンドにて。
このコマンドを使うと一発でフィールド構造やデータなどを一発移行できます。


DBデータバックアップ(互換性などのため、-O -d オプションを推奨)

pg_dump DBName | gzip > Filename.gz

DBデータリストア(あらかじめDBを作成しておく)

gunzip -c Filename.gz | psql DBName -h Hostname -U Username


こんな感じで比較的短時間のうちにデータ移行が完了しました。

あとは問題が無いかチェックして、最後の手直し。




PostgreSQL完全機能リファレンス―実行例を通して「理解」を深める。PostgreSQL完全機能リファレンス―実行例を通して「理解」を深める。
鈴木 啓修

秀和システム 2006-11
売り上げランキング : 103511
おすすめ平均

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

完成までもう少し!

パーマリンク 2008/11/27 23:25:53 著者: kumaold メール
カテゴリ: 仕事, サブカルチャー

早いもので11月もそろそろ終わろうとしています。

しばらく前から開発に取り組んでいる「美容室案内ネット一六社」も、あと最後の手直しだけというところで急に別の仕事で忙しくなるとは・・・


来週中くらいには完全に本番環境に移行して、正式稼動できるように頑張ろ。

type="text/javascript">
type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

毎度の富山水汲み

パーマリンク 2008/11/24 23:39:15 著者: kumaold メール
カテゴリ: 日々の生活

7月ごろにも書いたように、毎年富山の滑川近くまで汲みにいっている水が切れたので冬の到来前にまたまた富山まで出向いてきました。

天候と凍結も心配されましたが、なんとか午前中は雨に降られずいけました。


飛騨古川と神岡の境の数河峠はいつもすごい!

真冬には平気で2m以上は積もるという場所なんで、先日の雪で明らかに30~50cm近くは積もったであろう痕跡が。

この辺の住民は下手すると1日中外出不能になりそう。



帰りは富山IC-小矢部砺波JTC-飛騨清見IC-高山西IC-せせらぎ街道にて。


途中の標高1,113mの西ウレ峠あたりでは、雨だった天気も雪に変わり路面にまで積もり始めました。あと1時間も通過が遅かったら通れたかどうか。

実に冬の天気は変わりやすいというのが実感できた1日でした。




type="text/javascript">
type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">

初雪と冬対策

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

まあ予想通り、見事な冬景色になっていました。

道路の雪は解けていましたが、ベランダには2cmほど積もっています。



昨夜急遽、寒い中でスタッドレスタイヤに交換をしました。

タイヤはブリヂストンのBLIZZAK REVO1 155/65R13を新品購入しました。

ネット通販だと4本送料無料で、市販値よりも安いので助かります。


今までが古すぎたタイヤだったためか、パワステが超軽くなって驚きでした。


最近寒すぎるとバッテリの電圧低下で、しばらくエンジンを回してからでないと車載PCが立ち上がらなくなっているので、何か対策を考えないと・・・


08年製 4本希望の方:送料無料  【4本希望で送料無料 】BS:ブリザックREVO1 155/65R13 1本価格

明日は初雪!?

パーマリンク 2008/11/18 19:17:25 著者: kumaold メール
カテゴリ: 日々の生活

どうも明日あたりから急に寒気が流れ込むそうで、山地とかでは雪が降る可能性も十分にあるとか。

今日の昼間にもあられが降ってきたので、いよいよ初雪か!?

スタッドレスタイヤも早めに調達しといてよかった。

(見出し)
岐阜・西濃、中濃の山地や飛騨北部では、18日夜から20日にかけて降雪
となり、標高の高い所では積雪となる見込みです。積雪や路面凍結などによ
る交通障害に注意して下さい。

[雪の予想]
 18日12時から19日12時までの24時間降雪量は、多い所で、
 飛騨地方
  山地  40センチ  
  平地  10センチ
 美濃地方
  山地  30センチ


気象庁の雪に関する岐阜県気象情報 第2号より


初雪のふる日初雪のふる日
こみね ゆら

偕成社 2007-11
売り上げランキング : 58569
おすすめ平均

Amazonで詳しく見る

第17回高蔵寺SE勉強会

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

#またまたブログを丸1週間分まとめて投稿します。


本日は、第17回高蔵寺SE勉強会を開催しました。

今回は、events.php.gr.jpにてに募集を行ったところ、13人ほど集まりました。
遠方から来てくださった皆様、どうもありがとうございました。


まずは宿題。
今回はカレンダーヘルパーを作って(改造して)みようということでしたが、久々に張り切ってすべて1からコーディングをしてみました。


苦労したところは言うまでもなく曜日の移動機能。
これのおかげでコーディング量とバグが大幅増加で半日以上要しました。

そのほかは、表示形式を変えたり、CSSでデザインを変更しやすいようなカスタマイズ性の高いつくりを意識して作りました。


設置サンプルはこちら

[CalendarHelper]

<?php
/**
 * CalendarHelper
 *
 * @modifiedby      $LastChangedBy: kuma $
 * @lastmodified    $Date: 2008-11-15 23:00 $
 */
class CalendarHelper extends AppHelper
{
    /*
     * タイトル部の出力フォーマット指定
     */
    var $titleFormat = "%d年%d月";
    
    /*
     * 日付の出力フォーマット指定
     */
    var $dayFormat = "%d";
    
    /*
     * 曜日の出力フォーマット指定 ("Sun", "Mon", "Tue", ...)
     */
    var $weekFormat = array("日", "月", "火", "水", "木", "金", "土");
    
    /*
     * CSSの曜日別クラス名指定 ("sunday", "monday", "tuesday", ...)
     */
    var $className = array("sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday");
    
    /*
     * 週の開始曜日オフセットを指定 (デフォルト[日~土] 0, 0 ~ 7)
     */
    var $weekOffset = 0;
    
    /*
     * 各種作業領域
     */
    var $outData = "";
    var $todayId = "";
    
    /*
     * 指定した1月分のカレンダーを生成
     * @param int $year 西暦年
     * @param int $month 月
     * @return string カレンダーHTML
     */
    function makeCalendar($year = null, $month = null)
    {
        //日付が存在するかチェック。未指定なら今日の日付
        if (!checkdate($month, 1, $year)) {
            $now = getdate();
            $year = $now['year'];
            $month = $now['mon'];
            
            $today_flg = true;
        }
        
        //月の最初の日の曜日を取得
        $week = date('w', mktime(0, 0, 0, $month, 1, $year));
        $dayTmp = 1;
        
        //カレンダー生成の元となる配列を生成
        do {
            $calendar[$week] = $dayTmp;
            $week++;
            $dayTmp++;
        } while (checkdate($month, $dayTmp, $year));
        
        
        //以下、カレンダー実体の出力
        $this->outData = '<table class="calendar">' . "\n";
        $this->outData .= "<caption>" . sprintf($this->titleFormat, $year,$month) . "</caption>\n";
        
        //曜日列の表示
        $this->outData .= "<tr>";
        for ($i = 0; $i <= 6; $i++) {
            //曜日の順序調整
            $weekTitle = $this->weekFormat[($i - $this->weekOffset + 7) % 7];
            $this->outData .= '<th class="weektitle">'. $weekTitle . "</th>";
        }
        $this->outData .= "</tr>\n";
        
        //日付部分の出力 (以下、1行ごとに一度バッファに溜める)
        $weekTmp = "<tr>";
        //オフセット分差し引いたところから、データの終端かつ右端まで繰り返す
        for ($i = (0 - $this->weekOffset); $i < $week || ($i % 7 != 0); $i++) {
            //当該日付が存在すれば表示
            if (isset($calendar[$i])) {
                //本日表示フラグがあれば本日チェックをする
                if (isset($today_flg)) $this->_todayCheck($calendar[$i]);
                $weekTmp .= sprintf('<td class="%s"%s>%s</td>', $this->className[($i + 7) % 7], $this->todayId, sprintf($this->dayFormat, $calendar[$i]));
            } else {
                $weekTmp .= "<td></td>";
            }
            //次の曜日が指定曜日なら改行
            if (($i + 1 + $this->weekOffset) % 7 == 0) {
                //データチェック&挿入
                $this->_insertRow($weekTmp . "</tr>\n");
                //バッファをクリア
                $weekTmp = "<tr>";
            }
        }
        //データチェック&挿入
        $this->_insertRow($weekTmp . "</tr>\n");
        $this->outData .= "</table>\n";
        
        //ビューに出力内容を返す
        return $this->output($this->outData);
    }
    
    /*
     * 1行のに有効データがあれば連結 (無駄な空欄防止)
     * @param string $weekTmp 1行分の作業データ
     */
    function _insertRow($weekTmp)
    {
        if (trim((strip_tags($weekTmp))) != "") {
            $this->outData .= $weekTmp ;
        }
    }
    
    /*
     * 本日の日付であればCSS用にidタグを付加
     * @param int $today チェックする日付
     */
    function _todayCheck($today)
    {
        $now = getdate();
        if ($now['mday'] == $today) {
            $this->todayId = ' id="today"';
        } else {
            $this->todayId = "";
        }
    }
}

?>

[View]

//今月のカレンダーと本日を強調(色彩はCSS)
<?php
    e($calendar->makeCalendar());
?>

//2008年1月のカレンダーを表示
<?php
    e($calendar->makeCalendar(2008, 1));
?>

//2008年1月の曜日を右に2日移動したカレンダーを表示
<?php
    e($calendar->makeCalendar(2008, 1, 2));
?>


午後からはほとんど発表中心で進行しました。

今回は外部ゲストの方にも発表していただき、新しいことも色々と学ぶことができました。

発表内容はこんな感じ。

  • CakePHP開発事例の紹介
  • CakePHPとテスト
  • CakePHPで携帯サイトを作るためのテクニック


そのあとはLT(ライトニングトーク)を行いました。

  • CakePHPでAjax入門
  • CakePHPとFlashの連携
  • CakePHP簡単問合せフォームの作り方
  • CakePHPの多言語化対応


このうち、CakePHPの多言語化対応については、いままでのCakePHP日本語化などの経験から苦労した点や、ポイントなどについて発表させていただきました。


やはり、外部の方がいると新鮮でいろいろな意見を聞くことができてよかったです。

今後とも開催実績を積み重ねて、多くの人に来てもらえると嬉しいです。

また開発合宿みないなのもやりたいなぁ。

BIOS通過が遅い謎現象

パーマリンク 2008/11/11 23:44:47 著者: kumaold メール
カテゴリ: 仕事, PCサポート

DELLのDimension 4400の起動時に、画面が固まって何も操作できないまま長く待たされるという問い合わせを頂き、原因を調査してみました。


実際に見てみると、確かにDELLのロゴ画面が出た状態のまま1分間近くまったく応答がありません。しかし、待ちさえすれば動作は問題ないです。

quick bootなどが無効になっていないかなど、設定をどう操作しても一緒でした。


POST画面が出る前に固まってしまうので、これは何か特別な問題があるとは察しがつきましたが、原因がわからず昨日は引き上げました。



古い機種なのでググっても情報がほとんど無く、BIOSのアップデート情報を見た見たらバージョン"A05"の修正内容にこんなものを見つけました。

1. Fixed issue where system would hang if certain USB mass storage devices including some USB based digital cameras were attached at power on.

(意訳)
USBベースのデジカメなどを含む、USB大容量記憶装置が電源投入時に接続されているとハングする問題を修正


そういえば各種メディアドライブ内蔵のCanon MP610プリンタが接続してあったな~と思って、電源を切って再起動すると見事に的中でした。

結局BIOSがA04だったの最新のA06にアップデートして解決しました。


しかしこの世代のマシンで未だにBIOS更新がフロッピーからしか無理とは。

やっぱDELLはコスト削減でサポートには苦労するなぁと思った日でした。




(独自仕様のパーツさえなければ色々楽なんだがなぁ・・・)

なぜデルコンピュータはお客の心をつかむのか ― 顧客サポートNo.1の秘密を探るなぜデルコンピュータはお客の心をつかむのか ― 顧客サポートNo.1の秘密を探る
宇井 洋

ダイヤモンド社 2002-07-12
売り上げランキング : 135110
おすすめ平均

Amazonで詳しく見る

地デジのFNS混信

パーマリンク 2008/11/09 23:47:07 著者: kumaold メール
カテゴリ: 地デジ

先日から地デジの付知中継局に予備免許が交付され、試験放送が開始されましたが、見事にSFN混信にはまってしまいました。


元々、瀬戸(名古屋)本局の電波を受信していて、チャンネルプランが発表された際にもどうせ1Wなんで大丈夫だろとか侮っていたらはっきりと影響が・・・

確かに、もとから山岳反射電波をメインに受信している環境では、126usのガードインターバルがあったところで実質的にはほぼ無意味です。


しかし、このまま来年まで待つのはもったいないので、何か考えないと。

 

ch略称放送局名瀬戸ch付知ch
1THK東海テレビ2121レベル低下
2NHK-ENHK教育1313良好
3NHK-GNHK総合2024良好
4CTV中京テレビ1919レベル低下
5CBC中部日本放送1818始終ブロックノイズ
6NBN名古屋テレビ2222レベル低下
8GBS岐阜放送3032元々混信




地デジ (楽)完全ガイド―これ1冊でデジタル放送が即わかる! (マキノ出版ムック)地デジ (楽)完全ガイド―これ1冊でデジタル放送が即わかる! (マキノ出版ムック)

マキノ出版 2008-06
売り上げランキング : 64899
おすすめ平均

Amazonで詳しく見る

定額給付金の支給金額が

パーマリンク 2008/11/08 22:57:29 著者: kumaold メール
カテゴリ: ニュース批評

定額給付金、1人1万2000円で最終調整 高齢者と18歳以下加算(日経ネット)

自民、公明両党は7日、追加経済対策に盛り込んだ総額2兆円規模の定額給付金について、1人あたり1万2000円を支給する方向で最終調整に入った。

65歳以上の高齢者と18歳以下の子どものいる世帯には1人あたり8000円を上乗せする方針だ。


まあ、貰える物は貰っとこうということで、+8000円の基準なんだが・・・

単純に年齢だけの区切りであれば、給付日時点で18歳以下ってことなら、学生で無くとも無条件で加算してもらえるってことなんだろうか。


誕生日が2月27日の自分としては、久々に早生まれで得した気がする。


追記
 正式に基準日が2009年2月1日に決定したようです。(゜Д゜)ウマー


創聖のアクエリオン創聖のアクエリオン
岩里祐穂 菅野よう子

ビクターエンタテインメント 2005-04-27
売り上げランキング : 730
おすすめ平均

Amazonで詳しく見る

痛いニュースのAmazonネタが秀逸すぎたのでパクリ)

第15回高蔵寺SE勉強会

パーマリンク 2008/11/02 21:06:31 著者: kumaold メール
カテゴリ: 仕事, 勉強会など

第16回高蔵寺SE勉強会を開催しました。

まず、宿題の方はこちら。

写真を解析して何か作ってみよう

[言語]JavaScript・PHPなど
[お題]
写真を解析して何か作ってみよう。各自のアイディアにお任せです!
例)写真から顔の部分を検出する。写真から季節を判別する。など・・・。


某笑い男のアレみたいなことできたらなぁ~とか思ってましたがレベル高すぎ!

仕方なく諦めて画像の色解析ライブラリを使ってみただけの手抜きです。


PHP Classesにて配布してあるColor extract クラスという、画像中の頻出色を簡単に抽出できるライブラリを使用してみた"だけ"です。

<?php
//セキュリティ上ファイルアップロード部は省略

//Color extract クラスライブラリを読み込む
include_once('./lib/colors.inc.php');

$ex = new GetMostCommonColors();
$ex->image = $filename;
//Get_Colorメソッドで解析・集計
$colors = $ex->Get_Color();

//最大表示数
$how_many = 12;
$colors_key = array_keys($colors);

?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta http-equiv="Cache-Control" content="no-cache">
        <title>第16回高蔵寺SE勉強会宿題 - 画像解析</title>
    </head>
    <body>
    <form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" enctype="multipart/form-data" method="post">
        <input type="file" name="img" size="45">
        <input type="submit" value="画像解析!">
    </form>
    
    <table>
        <tr>
            <td>
                <table border="1" cellspacing="0" cellpadding="3">
                <tr>
                    <th width="30">色</th>
                    <th width="50">回数</th>
                    <th width="70">色の値</th>
                </tr>
                <?php for ($i = 0; $i <= $how_many; $i++): ?>
                    <tr>
                        <td bgcolor="<?php echo $colors_key[$i]; ?>" width="16" height="16"></td>
                        <td><?php echo $colors[$colors_key[$i]]; ?></td>
                        <td><?php echo $colors_key[$i]; ?></td>
                    </tr>
                <?php endfor; ?>
                </table>
            </td>
            <td>
                <img src="<?php echo $filename; ?>">
            </td>
        </tr>
    </table>
    
    </body>
</html>


実装してみたものがこちら

最初は順調にできていたアップロード部分も、エラー処理を追加するうちに何故かうまくいかなくなってしまいました。

原因を調査したところ、ファイルを判断している部分で、JPEG画像のContent-typeを「image/jpeg」だけでなく「image/pjpeg」も許可しないと駄目でした。


どうもプログレッシブJPEG(e-Words)らしいのですが、アップロードされると全てpjpegとして扱われるってことなのか?




次回の第17回勉強会は、events.php.gr.jp掲載されました!

今回はやや規模を拡大して、CakePHPの初心者・入門者向け講座を開催します。
参加してみたい方は是非申し込みをどうぞ。

寒くなってきました

パーマリンク 2008/11/01 17:00:00 著者: kumaold メール
カテゴリ: 日々の生活

なんか今週に入ってから急に寒い日が続いています。

今までは朝晩だけ肌寒かったのが、日中も日が射してない日は寒いです。


深夜になると5℃近くなることも増え、いよいよ冬だなぁという実感がします。

例年通りだと今月下旬あたりには初氷が見れるかも?


朝起きるのがだんだんつらくなってきたのが嫌だなぁ。。。


リモートデスクトップが繋がらなかったメインマシンのWindowsも寒い中で入れなおして復旧、こたつでリモートデスクトップ (゚д゚)ウマー


☆【送料無料】カジュアルこたつ幅90cm

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

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

2008年11月
 << < 現在> >>
            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ブログ     blog tool