2010年5月14日金曜日

jqueryで自作クラス(プラグイン)を作成する

どうも、俺@仕事一段落中です。
今日は、前々から書こうと思っていたjQueryでの自作クラスの作り方について備忘録としてめもします。
(jqueryでは、クラスとは言わずに「プラグイン」と言うそうです。以降、プラグインと記します)

まず、ファイル命名規則についてですが基本的には
jquery.myplugin.js
とします。

プラグインの基本構造は
(function($) {
var val_1; // フィールド
var val_2; // フィールド
$.fn.myplugin = function(option) {
// 処理
}
}) (jQuery);
こんな感じです。
この例で行くと呼び出し側では
$("div#plugin_test").myplugin({val1:"value1", val2:"value2"});
こんな感じになります。

例えばすごく簡単ですが、
ボタンをクリックする度に現在時刻をHTMLに表示し、テキストボックスに入力された文字をそのボタンへ表示するプラグインを作成してみます。

1)呼び出し(html)側
<head>
<script type="text/javascript" src="./js/jquery-1.4.2.js">
<script type="text/javascript" src="./js/jquery.myplugin.js"></script>
</head>
<body>
<h1>MYPLUGIN</h1>

<input type="text" name="txt">
<input type="button" name="btn" value="push">
<!-- ここへ表示 -->
<div id="result"></div>
</body>
</html>

<script type="text/javascript">
$(function() {
// ボタンがクリックされたら
$("input[name=btn]").click(function() {
// id=resultへ時刻表示とテキストボックスの値をボタンへ表示させる
$("input[name=btn]").myplugin({dest:"result", value:$("input[name=tx]").val()});
});
});
</script>
こんな感じです。

2)プラグイン(jquery)側
(function($) {
var _option; // 値を保持するフィールド
var _dest; // 時刻の表示先ID
var _value; // テキストボックスの値
var _elem; // ボタンエレメント
/**
* コンストラクタ的なもの
* option はhtml側から渡された引数オブジェクト
*/

$.fn.increment = function(option) {
_option = $.extend({
_dest : option.dest, // 時刻表示先ID
_value : option.value, // ボタン表示値
_elem : this // 表示させるボタンエレメント
}, option);

draw();
}

function draw() {
// 日付を指定されたIDに表示させる
var date = new Date();
$("#"+_option._dest).html(date.toGMTString());

// ボタンの表示を変更
_option._elem.val(_option._value);
}

}) (jQuery);
こうです。

何となく理解できるでしょうか。。。
ちょっと例が悪かったです、、実際にコードを書いて試してみて下さい。


以上でぇぇぇす(´・ω・`)

2010年5月11日火曜日

phpで「send of xx bytes failed with errno=32 Brokenpipe in xxxx」というエラーが出る

どうも、俺@今日2度目の書込みです。
さっき出ました。
( ! ) Notice: fwrite() [function.fwrite]: send of 67 bytes failed with errno=32 Broken pipe in /usr/local/path/to/php/source/file.php on line 61
というエラー。

該当箇所のソースは
$written = fwrite($fp, $send_data);
です。

どうやら、phpでソケット通信をする際に
 1 $fp = fsockopen($host, $port);
2 if (is_resource($fp)) {
3 fwrite($fp, $send_data);
4 fclose($fp);
5 }
という事をよくやるかと思いますが、3行目の時点で接続先サーバから切断された場合、上記のようなエラーが出るようです。
この例で挙げたくらいのソースの実行速度で接続が切断されることは滅多にないと思います(というか防ぎようがない)が、一度接続したソケットポインタを使い回している場合などでは今回のエラーが発生する可能性がありますので、要注意(`・ω・´)



以上どぇぇぇぇぇぇす。

httpd.confで HostnameLookups off が効かない

どうも俺@仕事中です。
今日はapacheの設定ファイルhttpd.confに
HostnameLookups off
と書いているのにIP逆引きされてしまう場合の対処法について。

解決法はズバリ、httpd.confや.htaccessまたはその他apacheの設定ファイルのどこかに
allow from localhost
allow from example.co.jp
などドメインを書いていたらそれを削除!です。

または
allow from 127.0.0.1 # localhost
などと同一行にコメントでドメインを書いている場合もそうみたいです。

apacheのバージョンは2.2.8です。


ここに同じことが書かれてありました。
M.C.P.C.:APacheでHostnameLookups offでもログにホスト名が記録される場合

以上でえぇぇえぇす。

2010年4月22日木曜日

OpenFlashChart(php ver5)をちょっとカスタマイズ

どうも、俺@OpenFlashChartでグラフ作成中です。

Flashを使ったキレイなグラフ作成ライブラリOpen Flash Chartを使っています。
pythonとかperlとかjspからも呼び出せて、キレイなグラフを描画してくれるのでかなり使えるやつです。


僕はphpを使ってるので、アーカイブを展開して「/php5-ofc-library」以下のファイルを使ってグラフを作っているのですが、どうもこれが未完成っぽい。
未完成というより、「/php-ofc-library」以下にあるファイル(php4用)の方が色々充実しているみたいですね。

積み上げ棒グラフを作っているのですが、このサンプルにあるようにグラフ上部に凡例を出したいのに出せませんでした。
※php4版ではすぐ出せました。

というわけでphp5版の/OFC/Charts/Bar/OFC_Charts_Bar_Stack.phpをイジっちゃいましょう。

# vim /OFC/Charts/OFC_Charts_Bar.php
// set_keys()メソッドを作成
function set_keys ($keys) {
$this->keys = $keys;
}

# vim /OFC/Charts/Bar/OFC_Charts_Bar_Stack.php
// OFC_Charts_Bar_Stack_Keyクラスを追加
class OFC_Charts_Bar_Stack_Key {
function OFC_Charts_Bar_Stack_Key($color, $text, $font_size) {
$this->colour = $color; // `colour`なことに注意
$this->text = $text;
$this->font-size = $font_size;
}
}


呼び出し側では

<?php
$bar_stack = new OFC_Charts_Bar_Stack();
$bar_stack->set_keys(
array (
new OFC_Charts_Bar_Stack_Key($color, $text, $font_size),
new OFC_Charts_Bar_Stack_Key($color, $text, $font_size),
new OFC_Charts_Bar_Stack_Key($color, $text, $font_size)
)
);
のようにしてやればOKです。


OpenFlashChart(php版)は、最後のtoString()メソッドやprettyString()メソッドでセットされた値を単にjson_encode()して吐き出しているだけ
なので、どんな値をセットしてもjson形式でデータを出力してくれます。
あとは、ライブラリに用意されているswfファイルが読み取ってFlashグラフを作成している、という訳です。

ちゃんちゃん。

MySQLのデータをCSVで出力/入力

どうも、俺@始業しましたです。

ググればすぐ出てきますが、MySQLのデータを簡単にcsv(またはtsv)出力する方法のめもです。
出力
mysql> SELECT * FROM table_name
INTO OUTFILE "/tmp/out.csv"
FIELDS TERMINATED BY ',';
これで、/tmp/out.csvというファイルに`table_name`テーブルのデータをカンマ区切りで出力できます。
タブ区切りで、各項目を`"(ダブルクォート)`で囲む場合は、
SELECT * FROM table_name
INTO OUTFILE "/tmp/out.csv"
FIELDS TERMINATED BY '\t'
ENCLOSED BY '"';
と、ENCLOSED BY '"' を追加します。
テーブルを結合した結果をcsv出力し、改行コードは`\r\n`にするには
SELECT * FROM table_name
INNER JOIN join_table ON table_name.f_key = join_table.id
INTO OUTFILE "/tmp/out.csv"
FIELDS TERMINATED BY '\t'
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
と、LINES TERMINATED BY '\r\n'を追加します。

次にデータを入力する方法です。
これはmysqldumpで取得したデータをリストアするより高速に動作します。(たぶん)
mysql> LOAD DATA INFILE "/tmp/in.csv"
FIELDS TERMINATED BY ',';

もちろんタブ区切りの場合は、
LOAD DATA INFILE "/tmp/in.csv"
FIELDS TERMINATED BY '\t';
になります。
ダブルクォートや改行コードを指定してインポートする場合も、INTO OUTFILE構文のと同様です。

ただ、クライアントマシンとMySQLマシンが別サーバで接続されている場合は、
mysql> LOAD DATA LOCAL INFILE "/tmp/in.csv"
FIELDS TERMINATED BY ',';
と、`LOCAL`キーワードを指定します。


出力する方法
入力する方法


以上でぇぇぇえぇす。