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

Archive

Archive for the ‘未分類’ Category

表示で長い文字列を丸める!(自力篇)

2008/12/2 火曜日 16:37:01

なんか便乗。
mb_strimwidth関数なんてシラネーって時に自力でやってました。
それ以前にPHPってここまで考慮されてるんだなーと、標準関数の多さにびっくらこきました。

で、自力でやってた感じは文字のバイト数見たりいろいろして変換。

function FN_chktext($text, $byte){
	// HTMLタグを取除く
	$text = strip_tags($text);

	// 文字変換
	mb_internal_encoding("SJIS");
	$text = mb_convert_kana($text, "RNASKH");

	// 文字数取得
	$t_num = mb_strlen($text);

	if ($t_num > $byte){
		$text = mb_substr($text, 0, $byte);
		$text .= "..";
		$text = mb_convert_kana($text, "s");
	}
	return $text;
}

たまーに中途半端なところで切れたりして文字化ける始末で、面倒だったりします。
でもって、たぶん普通にmb_strimwidth使った方が早いです、はい。

下音タヌキ 未分類

iPhoneて携帯じゃないの?

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

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

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

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

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

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

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

下音タヌキ 未分類

いつのまにストリートビュー

2008/8/12 火曜日 15:02:53

流行に敏感なボクです。

ちょっと時代遅れ気味なのですが、Googleマップにストリートビュー機能が追加されました。
地図に表示されているその場所の風景が写真で上下左右見えちゃうわけです。
以下がサンプル。
GLatLngのところに、前前々回あたりのGoogleMap記事でのMap座標を記述すれば、その場所のストリートビューが表示されます。

<html>
<head>
<script src="http://maps.google.com/maps?file=api&v=2.x&key=*****" type="text/javascript"></script>
<script type="text/javascript">

var myPano;

function map() {
	var point = new GLatLng(**.******,**.******);
	panoramaOptions = { latlng:point };
	myPano = new GStreetviewPanorama(document.getElementById("pano"), panoramaOptions);
	GEvent.addListener(myPano,"error",NoFlash);
}

function NoFlash(errorCode) {
	if (errorCode == FLASH_UNAVAILABLE) {
		alert("FLASHに対応しておりません。");
		return;
	}
}
</script>
</head>
<body onload="map()" onunload="GUnload()">
	<div name="pano" id="pano" style="width: 500px; height: 300px"></div>
</body>
</html>

動的に、座標部分が変更できるとおもしろそうです。
・・・そんなふうに考えてた時期がボクにもありました。

下音タヌキ 未分類

システム運用は障害を未然に防ぐのだ

2008/7/3 木曜日 16:11:30

サロン系の服着てます。姜子牙です。そのせいか年齢相応に見られません。
若作りじゃないですよ?

システム運用って暇そうだなあ、そう考えていた時期が私にもありました。
しかし、それは最も理想的な形でありつつ、決して何もしていないわけではないというのが分かってきました。

運用者が忙しそうというのは、決して良いシステムではないのです。
定常的に行うような手作業が発生しているのは、それだけオペレーションミスの機会が多いということですし
「定型的な作業を自動化する」というシステム化そのものの目的を全う出来てない可能性もあるからです。

また、技術者のスキルという側面から見た場合、それは起こり得る障害に対して未然の防止が出来ていない可能性も高いのです。
(偉そうに言えるほど自分が出来ているわけでもないですが・・・)

とは言っても、全体をとても幅広く把握しつつ、且つその中で1つのミスを許されないなんて場合もあります。
物理面で言えば、サーバの機械部分、設置場所の温度などの環境、各種ケーブル類が抜けないようになっているかなど。
ソフト面では、OS・M/Wから開発されたアプリまで。それぞれが個々に不具合がないことと、組み合わせた場合にも
それぞれがかみ合わずに不具合にならないかなど、枚挙に暇がありません。
他にも外的要因としてセキュリティの甘さによるクラックとかとか。

一度全て想定しうる全てを書き起こそうとして、目次に当たる項目を列挙したことがあるのですが
項目だけで300行近くにまで達して断念したことがあります。
(仮に1システム用の運用資料として、1項目平均4ページとしたら1200ページに達する)
まあ、重複項目・不足項目がどれだけあるかは不明なため参考にすらならないかもしれませんが・・・。

これらを全ての対策を全て事前に施せば・・・と考えることはありますが
それをするほどの予算や時間があることはなく、またそんな想定を超えたことでシステムが止まることもあったりするのです。
聞いた話であればlsコマンドでサーバが停止したこともあるとのこと。(かなり特殊なケースだと思いますが)

大小様々なシステムが、社会インフラとして当然になりつつ・・・いや、もうなっているのかな。
それらの停止によるダメージは日に日に上がっていっているように思います。
しかし、それに対してシステムを止めずに動かし続けることを考えられる人が追いついていない、そんなことを感じます。

問題提起に留まってしまいますが、ほんの微力でもそれを改善できればなあ、と思い本エントリは書いてみました。

[姜子牙](*’-') < 「まだまだ勉強が足りないですねっ。」

はい、行ってきます。

姜子牙 その他, 未分類

ロジックとデザインの分離について

2008/5/30 金曜日 22:36:04

こんばんは。またまたチョコボールです。2日連チャンです。

今回はMVCという考え方におけるVとCのお話です。

自分は業務ではSmartyも使ってます。

Smartyを使う目的はコードの可読性向上、デザイナーとプログラマーの分業、デザインとロジックの分離などありますが、そういう意味において、値の加工はコントローラー側でおこなって変数や配列に格納してビュー側では極力表示だけ!
MVCモデルにおいてはこれが理想だと(勝手に)思ってました。

たとえば下記のような値段を表す変数があったとします。

$price = 1000000;

これをブラウザでは「1,000,000円」のように千の位単位で区切って表示させたい時、

コントローラー側で

$price = number_format($price);

のように加工してからビューに渡す。
こうすべきだと思ってました。

しかしこうしてしまった場合、後でデザイナーから「区切らなくていいよ」等の修正を依頼されたり、仕様が変更した場合など、結局プログラムを書いた側が修正することになり、二度手間で面倒なことになります。

普通に生のデータをビューに渡してテンプレート側で下記のようにコーディングした方が合理的です。

{$price|number_format}

見せる部分はできるだけデザインする側にお任せ。
完全に分業するとしたらそれが理想ですね。
かなり時間が経過した後に仕事を引き継いだ他のプログラマーが修正することになったとしても、コードを追わなくてもテンプレだけを変更すればいいですし。
プログラマーもデザイナーもSmartyを覚えなきゃいけない、というのは大変ですけど。。
(いや実際かなり大変です…)

日付表示に関してもロジック側でタイムスタンプ値のデータがあれば、タイムスタンプのままビューに渡してあげた方が修飾子のdate_formatでいろんなパターンで表示させられます。

できるだけ生のデータをビューに渡した方がデザイナー的には見せ方の選択が広がるわけです。

どう表示させるか(見せるか)というのは本来ビューの役割なので 極力ビュー側に任せた方がいいということですね。

チョコボール HTMLとか, PHP, Tips, 未分類

Apacheチューニング その2

2008/5/8 木曜日 10:26:00

ゴールデンウイークはどこが黄金なのか一度聞いてみたいです。姜子牙です。
休めるだけマシな方だと思ってます。

さて、サーバパフォーマンスチューニングApache編第二回となります。

今回は
2、待機プロセス数の変更について
です。

さて、今回の待機プロセス数の変更は以下より分身になぞらえて進めていきたいと思います。

待機プロセスとはなんだろう?と言うと、Apacheは実行ファイル自体は一つなのですが
実際に動き始めると、一人が親玉になって、分身を始めるのです。
その分身一人一人がアクセスしに来た人に対応して、データを返す処理をします。
(スレッドを使用すると一人が複数人の対応をしたりするのですが、ややこしくなるので割愛します)
ここで、アクセスに来るのを待ちつつ何もしていない分身を待機プロセスと呼びます。

まず仮に分身の数を極端に減らすとどうなるかと言うと、一度にたくさんのアクセスがあった場合に、Apacheはその段階で分身を始めます。でも分身には時間がかかるのです。アクセスしにきたユーザは、分身が完了して対応を開始してくれるまで「サーバからの応答を待っています」の状態で待たされることになります。つまり、アクセス数の増加に対応するためには(特に急激な増加は)、分身は常にたくさん居た方がいいわけです。

では逆に分身が多いとどうなるかと言うと、分身を維持するためのメモリが必要になります。もしサーバが持っているメモリ量を超えるほどApacheが分身を抱えてしまうと、SWAPが走り始めサーバ全体の処理が重くなります。もちろんアクセスしに来たユーザは遅いサーバの応答に待たされることになります。
メモリはApacheだけの物ではなく、その他のソフトも使用するため、Apacheだけを考えて分身の数を決めることはできません。

これらを踏まえて、実際のhttpd.confで設定する値を見ていきます。(今回はprefork.MPMの値に絞ります)

○StartServer
サーバ起動時の分身数。すぐに変更されるため、適当で良い。

○MinSpareServer
最少待機分身数。Apacheは常にこの数以上は待機している分身がいるように分身数を調整する。

○MaxSpareServer
最大待機分身数。Apacheは常にこの数以下の待機している分身になるように分身数を調整する。

○ServerLimit
最大稼働分身数。ユーザ対応をしている分身はこの数が上限になる。

※ServerLimit+MaxSpareServerが最大分身数になる。

○MaxRequestPerChild
分身一人がユーザ対応する件数。0だと無制限。ここで設定した回数のユーザ対応をするとその分身は消える。
(メモリリーク、徐々に使用可能メモリが減っていく場合、この周期を短くして対応する)

これらの値を調整しつつ、Microsoft Web Stress Toolを使用して、100人同時アクセスなどを再現し、
topコマンド等でサーバの状態を図り、再調整という流れでチューニングを行いました。

また、待機プロセス数の変更以外にDeflateモジュールを使用してコンテンツの圧縮転送も実施しています。(項目増えてるやん、という突っ込みはスルーの方向で)
プログラム側の変更を行わず、Apache側の変更のみでMINEタイプやUser-Agentを判定してコンテンツを圧縮して転送することができます。

Jpeg等の圧縮済み画像ファイルはDeflateモジュールを使用しても圧縮効果が薄いため今回Deflateの対象としているのは text/html text/planeのみとしています。
PHPとかどうなるんだろう?と思うかもしれないですが、サーバ側でPHPの処理が完了し、HTMLとして出力されたデータをこのモジュールが圧縮をかけるので、上記の指定でOKです。

ただ、圧縮処理なので回線への負荷は下げられるものの、CPU使用率は増えてしまいます。(回線の転送量は、圧縮レベル9で約1/3の転送量に下がった試験結果が出ています)

まだ、Apacheのチューニング方法はあるかと思いますが、今回はこのくらいで・・・。次回はMySQLの方に触れたいと思います。

[べきこ](´∀`) < 「せんせー、テストケースの内容がわかりません」
[姜子牙](#゚Д゚) < 「ググレカス」
[べきこ](´∀`) < 「日本語としてわかんないですけどー」
[姜子牙](;’-') < 「え・・・ちょっとまってね・・・」

はい、言ってみたいです。

姜子牙 未分類

AmazonAPIを使ってみよう Part3:モバイル用リンクの作成

2008/4/30 水曜日 18:43:13

こんにちわ。かーつんです。

今回はAmazonAPIの第三弾、モバイルリンクの作成です。

とはいえ、そんなに難しいわけでもないので、流し見してください。

まず、前回ごちゃごちゃと色々な情報をAmazonから引き抜いてきたのを思い出してください。

今回必要で且つ重要なのは、その一部分、『ASIN』です。

ASINはAmazon側で商品に一意になるように付与されています。

前回の説明から抜粋すると、以下の部分

["ASIN"]=>
string(10) "B0012EGL4M"

この値を利用すると、PC用だろうが、モバイル用だろうが、

関係なくAmazonの商品ページへのリンクが作成できます。

以下のパラメタをリンクタグのhrefに埋め込めばOK。

http://www.amazon.co.jp/gp/aw/rd.html
?ie=UTF8
&dl=1
&uid=NULLGWDOCOMO
&lc=msn
&a=[ここにASIN]
&at=[Amazonで取得したトラッキングID]
&url=%2Fgp%2Faw%2Fd.html

で、このリンクから商品ページへ移動し、

商品が購入された場合、ちょびっとですがAmazonからお礼が貰えます。

ここで注目すべきは『&at』の部分。

ここをうまく変えることが出来れば・・・

誰が作成したリンクで、

何がどれだけ売れてどれだけお礼が貰えてるか。

という履歴が残るので、

それをうまく利用するとサイト内のユーザに還元できる仕組みが作れます。

まぁ、トラッキングIDを取得する部分を考えないといけないので、

少々難しくなりますが・・・。

まぁ、とりあえずはこれでモバイル用リンクが作成出来たわけです。

是非皆さんのサイトでAmazonアソシエイトを活用してみてください。

 

以上。かーつんがお送りしました。

かーつん 未分類

RAMディスクとサーバフリーズ

2008/4/11 金曜日 12:14:35

サーバがフリーズしました。ご迷惑おかけしました。姜子牙です。
カーネルパニックだとかそんなチャチな代物ではなく、コンソールに何かを入力してもなんの応答もない状態にまで陥らせた手順をここに奉納したいと思います。

何をしようとしたのかと言うとサーバにRAMディスクを作成しようとしたのです。

RAMディスクとは?という方のためにWikiへのリンクを・・・ないですね。さらっと書けば、メインメモリ上にファイルを置けるようにするという技術・手法です。

通常ファイルを出力する先はHDDなどのディスク上(正確にはファイルシステム上)になるわけですがシビアな状況だとディスクのI/O速度じゃ間に合わない速さでファイルを読み書きしたいなんて場合が起こりえます。そんなときにメインメモリ上にファイルを置ける領域(ファイルシステム)の作成を行うのです。

そんな状況あるの?と言われると私が知っているのは、マルチプロセスプログラムくらいしか知らないです。5,6個のプログラムから共通のフラグなどを変更したり参照したりするときに使ったくらいでしょうか。(ディスク上で行うと、フラグの変更参照処理でやたら詰まるようになって全体の処理が遅くなったので使った)

RAMディスクの特性上、メインメモリの一部を使用するため、そのサイズを大幅に取るとメインメモリとして使用できる領域が
減ってしまいます。アプリ開発者としては処理速度向上に一役買う技術ですが、乱用は避けた方が良いです。

詳しい手順は下記。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/274useramdisk.html

さて、本題としてサーバをフリーズさせたその手順とはサーバが持っているメインメモリを遥かに超える量のRAMディスクを取ろうとしたのです。数MBオーバーとかそんなチャチな代物ではなく、「512GB」の容量取ろうとしちゃったんですね。メインメモリとSWAP足しても容量が足りてないです。

何を間違えたのかと言うと、lilo.confやgrub.confで指定する以下の部分(@IT引用)

ramdisk_size=65536

これ実はByte単位ではなく、Block単位(よくわからない場合、1=1024Byte=1KBと考えてください)なんですね。で、何も考えず

ramdisk_size=536870912

と指定し、Rebootし、mke2fsでファイルシステム作成するとinode作成のカウンタが途中でピタリと止まり、コンソールが一切応答なしという事態に・・・。

アンチパターンにすらならないものですが、みなさんもご注意を。

[のび](*゚Д゚) < 「なんかうちで更新してるファイルが変なんだけどサーバ設定合ってます?」
[姜子牙](;’-') < 「な、なに?」

はい、行ってきます。

姜子牙 未分類