※ パクレゼルヴではWeb開発エンジニアを大募集中!詳細はこちら

Archive

Archive for 2008/8

新規開発と保守  

2008/8/30 土曜日 0:12:53

ぞっす!
のびーにょです

タイトルについてです。

個人的には新規開発より保守の方が長くやっています。

あたりまえですね。

新規で2,3か月かけて作ったものをさらに改良して1年、2年と運用していくわけですから。

で、僕は初めて仕事したときも当然保守から入りました。

いろいろなサイトをやりました。

サービス開始から5年も6年もたっているサイトや、オープンしたてのサイト等など

担当(修正、保守)したサイトの数は20や30ではありません。(微々たる修正も含めて、ですけど・・・)

色々なサイトのソースを見て思ったのが、最初は
『これはないわ・・・』
って思いました。

今は少し変わって、
『何でこんな状態になるんだろう?』
です。

そもそも想定していたものとは違う形でサイトが発展していくと、初期の設計から逸脱した物になっていくものです。
それは往々にしてありえることなので問題ない(しかたない)事だと思います。
昔はこのあたりを見て『これはないわ・・・』って思ってたわけです。

何かしら理由があってそうせざるを得なかった場合というのは、長く運営していればいるほどありえる話です。

そして今思うこと
『何でこんな状態になるんだろう?』
です。

そもそも想定していた物と違ったり、システムの根幹にかかわるような変更が入った段階で作り直すべきだと僕は思います。

WEBの世界は流れが非常に速いと思いますし、流行ったり廃れたりするのも非常に頻繁に起こることだと思います。

ならば短い期間で(1年なら1年、2年なら2年)でフルリニューアルを行うのも一つの手かな、と思います。

設計が古臭かったり、新しい技術を使えばもっと色々なことができたり、楽にできたり、代替案があったり・・・
色々あると思います。
エンジニアとしては新しい技術等は色々試してみたかったりするものですしね。

ただ、長く使っていればそれだけソースは枯れてきますし、ノウハウもたまってきます。(バッドノウハウがほとんどでしょうが・・・)

初期のころの想定通りにサイトが発展していけば、逆にリニューアルする必要はないのかも知れません。(デザイン的な物は別として)

ただ、いちエンジニアとしての意見だと、『自分で設計してみたい。』と誰もが思うでしょう。

そして、そのチャンスに巡り合えた時、『保守しやすいように作ろう』と思う人が多いと思います。
(特に保守をやってから新規開発を初めてやる場合)

ただ、与えられた環境や状況により、それは叶わないこともあるでしょう。

でも、なるべくがんばってください。

あなたが2,3ヵ月で作り上げた物を、誰かは1年、2年と保守をするのです。

あなたのかけた時間以上を誰かはそのサイト(システム)に費やすのです。

使いやすい。
わかりやすい。
親切な設計だ。

そう言ってもらえるようなシステムを僕は組んでいきたいと思います。

ま、どう組んだってわかりやすさや使いやすさは人それぞれなんですけどね。

のびーにょ システム

雷とフレームワーク  

2008/8/29 金曜日 21:15:51

二日連続で失礼します。
チョコボールです。

昨日の天気は荒れに荒れてましたね。。
今も荒れてますが。。
長時間雷鳴りっぱなしの豪雨!
住まいは東京の西の方なのでモロに影響受けました。。

PCが壊れるとまずいので家帰ってからずっとPCの電源抜いてました。
というのも、落雷で家電製品が壊れた…なんて話をよく聞くからです。

一か月ほど前、近所で落雷があり、同じアパートの住人がPCの電源が立ち上がらなくなった…と悔やんでいました。
その時、自分は家にいましたが、危険を感じて電源引っこ抜いていたので運よく無事でした。。

ここまで落雷が多いと、雷サージ対策をしなきゃまずいって気持ちになってきます。
今度電気屋に行った時は絶対買おう。。

昨日から久々にCakePHPを触ることになりました。
弊社コマースシステムの管理機能追加です。

現在のCakePHPのバージョンは1.2ですが、弊社のシステムはバージョン1.1で構築したもの。

ほぼ初心者の頃、いきなりCakePHPを触っていた自分はDB関係のデータ取得等はメソッドを使いまくっていたのでSQLになかなか慣れませんでした。
他人が書いたSQL文中のJOINという文字を見るとどうなってるか分からず、拒絶反応を起こしてしまう…というようなひどい状態が続いていました。
テーブルを結合してデータを取ってきてくれたりするCakePHPのアソシエーション機能は非常に便利ですが、理解しないままこれを利用しているといつまでたってもSQLについて詳しくなれません。。

SQLはできるだけベタに近い状態で書いた方がフレームワークを理解していない人でもすぐ理解でき、保守は楽だと思います。
無駄なSQLをたくさん流すと負荷がかかって遅くなりますし。。
処理が重くなるところはできるだけ簡素で効率のいいSQLを書きたいものです。

一通りWEBアプリケーションに精通している方達はこのようなフレームワークを使った方が高速に開発できると思います。

CakePHPの好きなところはすごく好きなんですけどね。。
システムとして見るとかなり勉強にもなります。

パフォーマンス性や保守性を重視するか、高速開発を重視するか…。

ただ間違いないと思うことは、処理が重いシステムは誰も嫌がる…とういことです。

MoriMoriMoriMori MySQL, PHP, Tips, データベース

文字列が最初に現れる場所を見つける?【strpos】  

2008/8/28 木曜日 17:05:58

チョコボールです。
最近、天気が悪すぎてほんと嫌になっちゃいます。
なかでも困るのは洗濯物!
どこのコインランドリーも人で溢れ返っています。
コンランドリーを利用するか部屋干しにしようか梅干しにしようか迷っています。

今日はphpの基本的な標準関数であるstrpos関数、
「文字列が最初に現れる場所を見つける」について。

例えば

$str = 'Hello! I am Nancy. Hello! I am Keiko.';

という文字列があり、【I】が最初に現れる場所を見つけたい時、

$pos = strpos($str, 'I');

この返り値$posは整数型の【7】になります。

普通に$strの頭から数えるとスペースも含めると8文字目になりますが、1文字目を0、2文字目を1、3文字目を2…
という風に数えるので7です。

文字列が見つからない場合はFALSEを返します

…が!

文字列が見つかったかどうかで評価する時は===演算子、!==演算子を使わなければ期待した動きをしてくれません。

例えば、とある文字列を含むならある処理をしたい、という場合、

if($pos != false){

ではなく…

if($pos !== false){

を使わなければいけないということです。

文字列が文字の先頭に見つかった場合、返り値が0になり、

if($pos != false){

だと、この分岐に入ってくれません。

※詳細⇒PHPマニュアル、論理型について

strpos関数は「文字列が最初に現れる場所を見つける」という用途よりも、
「ある文字列が他の文字列内に含まれているかどうかを調べる」時によく使われているような気がします。
上の例で言うと、$strの文字列中に文字列【Nancy】が含まれているかどうかを調べたい時とかです。

当然preg_match等の正規表現で調べることもできますが、
strpos関数を使う方が高速且つメモリ消費も少ないのでこっちを使った方が怒られずにすみ、幸せになれます。
演算子は===演算子や!==演算子を使いましょう!
理由は先に述べた通りです。

$needle = 'Keiko';
$pos2 = strpos($str, $needle);

if($pos2 === false){
	echo '$str文字列中に' . $needle . 'は含まれていません。';
}else{
	echo '$str文字列中に' . $needle . 'は含まれています。';
}

あるいは

$needle = 'Keiko';
$pos2 = strpos($str, $needle);

if($pos2 !== false){
	echo '$str文字列中に' . $needle . 'は含まれています。';
}else{
	echo '$str文字列中に' . $needle . 'は含まれていません。';
}

第二引数$needleに空文字が入ってくる可能性がある場合は、
strpos関数でエラーをはいてしまうので、

if(strlen($needle) > 0){

等で分岐する処理を入れる等して工夫しましょう。

MoriMoriMoriMori PHP, Tips

アクセスログ  

2008/8/25 月曜日 11:27:10

はいどうも
のびーにょです

表題のとおりなんですけど、皆さんアクセスログってどう処理してます?

僕の場合はシステム側でDBに取るようにしてます。

オーバーヘッドとか色々考えなきゃだめな部分ありますけど、割と便利です。

まず、Apacheの標準のアクセスログだとPOSTの値がとれません。

※こんな方法もあったりしますが
http://neta.ywcafe.net/000607.html

で、僕はアクセスすべてをDBに保存しています。
レコード数が多くなりすぎたりすると処理に時間がかかってしまいますので月別、週別でアーカイブしていったり、場合によっては日別でテーブルを分けるなどの処理が必要ですが・・・
以下bash

#!/bin/bash
mysql -uユーザ名 -pパスワード rutty_test -hホスト << EOT
ALTER TABLE access_log RENAME AS access_log_`date +%Y_%m_%d`;
CREATE TABLE \\`access_log\\` (
  \\`id\\` int(11) unsigned NOT NULL auto_increment,
  \\`access_date\\` datetime NOT NULL,
  \\`carrier\\` enum('DOCOMO','EZWEB','SOFTBANK','OTHER')NOT NULL default 'OTHER',
  \\`u_id\\` int(11) unsigned default NULL,
  \\`jb\\` varchar(255) NOT NULL,
  \\`parameter\\` longtext,
  PRIMARY KEY  (\\`id\\`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

EOT

とかのBASHを日別とか週別とか月別とかで実行してやればテーブルのサイズはそんなに大きくなることはないと思います。

フレームワークとか使っているならPOSTとかGETで受け取るものはすべてラッピングできると思うので、そこでDBにほりこんでおけばすべての値を得ることができると思います。

アクセスログをDBに入れておくと何が嬉しいか

集計するとき楽なんですよね。

ちなみに上にあるアクセスログのテーブルのカラムの一つ”jb”ってのは僕の使っているフレームワークののページ名です。
それ集計するだけで日別の各ページのアクセス数がとれるのですごく楽です。

携帯メインなのでキャリアの情報も格納しておけばさらにキャリア別でとれるし。

さっきのBASHを少し変えて、1週間前のテーブルなら削除するとかの処理入れておけばDBもそんなに大きくならなくていいかなーと思います。
集計結果を保存しておくテーブルは当然別につくり、cronとかで日別集計、週別集計、月別集計のバッチ組んでやれば古いデータは必要ないですし、CDなりDVDなりに焼いてやればHDDも圧迫しませんし。
POSTの値も保存できるので作ったアプリケーションの障害時に何が原因かってのも追えますしね。
結構お勧めです。

のびーにょ Apache, MySQL, Tips, データベース

iPhoneて携帯じゃないの?  

2008/8/20 水曜日 10:19:59

流行に遅れないボクです。

iPhoneが発売されて、それなりにたちました。
iPhoneはフリーダムに戦ってます。
他の携帯メーカーは、キャリアの出したガッチガチに固められた仕様、いろんな要望を元に開発してると思うんです。
だけど、iPhoneは、SoftBankの回線を使っているだけで、他はSoftBankのロゴすらついていないApple仕様。

フリーダムだから完全じゃなくていいんです。
便利な時代になって、ネットでファームウェアアップデートできちゃうものですから。
iPhoneなんかはファームウェアが上がる度に、機能が増えていく。

携帯メーカーはこれがないんです;;
アップデートって言っても、ただのバグ修正。
微々たる新機能は、次の機種で・・というのが一般的ですね。
半年に新機能がポンポン出てきては、最近の割賦2年縛りなユーザーにとって厳しいものがあります。

携帯ももっとフリーダムにして、各メーカーの独自性とか出してもらいたいですね。
そうしちゃうと、各機種の仕様の違いによりいろいろ問題が出てくるデメリットが大きく開発者としては泣いちゃいますけど。

もっとエコにいきましょう。
Eco Idea!

下音タヌキ 未分類