dak ブログ

プログラミング、サーバーの設定のなどの備忘録。レゴの写真も。

flotでの日付の目盛

2012-05-25 00:16:00 | javascript
日毎のデータをflotでグラフ描画する際には、plot() の第3引数で xaxis の指定を行います。
日付モードにするには mode: "time" にし、表示形式を timeformat で指定します。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>日付の目盛</title>
<script type="text/javascript" src="flot/jquery.js"></script>
<script type="text/javascript" src="flot/jquery.flot.js"></script>
</head>
<body>
日付の目盛<br>
<div id="graph_area" style="width:600px;height:300px"></div>
<script type="text/javascript">
$(function () {
      var time = new Date();

      // x軸は日数
      var data1 = [[0, 3], [1, 8], [2, 5], [3, 13]];

      for (var i = 0; i < data1.length; i++) {
        // getTime() はミリ秒
        data1[i][0] = time.getTime() + data1[i][0] * 24 * 60 * 60 * 1000;
      }

      $.plot($("#graph_area"),
             [
              {
                  data: data1,
                      label: "UU",
                      lines: { show: true },
                      points: { show: true },
                      },
              ]
             ,
             {
                  xaxis: { mode: "time", timeformat: "%m/%d" },
             }
             );
  });
</script>

</body>
</html>
コメント (0) |  トラックバック (0) | 

flotでのクリックイベント

2012-05-21 16:22:43 | javascript
flotで、グラフの点をクリックしたときにその点の情報を表示させるようなサンプルプログラムです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>クリックイベント</title>
<script type="text/javascript" src="flot/jquery.js"></script>
<script type="text/javascript" src="flot/jquery.flot.js"></script>
</head>
<body>
クリックイベント<br>
<br>
<div id="graph_area" style="width:600px;height:300px"></div><br>
<br>
<div id="label_area"></div><br>

<script type="text/javascript">
$(function () {
  var data = [
    [0, 3, { label: "a" }],
    [2, 8, { label: "b" }],
    [3, 5, { label: "c" }],
    [1, 4, { label: "d" }],
    [2, 4, { label: "e" }],
  ];


  $.plot($("#graph_area"),
    [
      {
        data: data,
        lines: { show: false },
        points: { show: true },
      },
    ],
    {
      grid: { hoverable: true, clickable: true },
    }
  );


  $("#graph_area").bind("plotclick", function (e, pos, item) {
    if (item) {
      $("#label_area").html("label: [" + data[item.dataIndex][2].label + "]");
    }
  });
});
</script>

</body>
</html>


クリックイベントは、$("#graph_area").bind("plotclick", function (e, pos, item) {...}); で設定します。
グラフの点をクリックされた場合には item に点の値が設定されているので、item の値を使ってイベント処理を行います。

上記のサンプルでは、item.dataIndex でデータの位置を取得し、配列の第3要素のハッシュの情報を取得しています。
plot() の引数の描画データの { data: ... } には普通は [x, y] の配列を指定しますが、上記のサンプルのように 3 要素以上を指定しても動作に問題はないようです。

以下は、[2.0, 8] の点をクリックした直後の画面です。


コメント (0) |  トラックバック (0) | 

ファイルシステムをFAT32からNTFSに変更

2012-05-16 21:42:38 | コンピュータ
USB に限らずですが、ファイルシステムを(FAT32 から)NTFS に変換する方法です。

コマンドプロンプトで、

convert ドライブ名: /fs:ntfs

を実行すると、ファイルシステムを NTFS に変更できます。

時間を計測してはいませんが、2TB の USB2.0 外付HDD を10分程度で変更できました。
(購入したばかりで何も記録していないHDDですが)
コメント (0) |  トラックバック (0) | 

javascriptでグラフ描画

2012-05-15 23:52:31 | javascript
javascriptでグラフを描画する方法です。
jQueryベースのflotを使います。 描画したいデータの [x, y] のデータ列を data: に指定すれば、グラフを描画してくれます。


<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>折れ線グラフ</title>
<script type="text/javascript" src="flot/jquery.js"></script>
<script type="text/javascript" src="flot/jquery.flot.js"></script>
</head>
<body>
折れ線グラフ
<div id="graph" style="width:600px;height:300px"></div>
<script type="text/javascript">
$(function () {
var data1 = [[0, 3], [4, 8], [8, 5], [10, 13]];
var data2 = [[0, 0], [10, 20]];

$.plot($("#graph"),
[
{
data: data1,
label: "line1",
lines: { show: true },
points: { show: true },
},
{
data: data2,
label: "line2",
lines: { show: true },
},
]);
});
</script>
</body>
</html>



コメント (0) |  トラックバック (0) | 

rubyのCGIExtでのURLデコード

2012-01-15 22:42:06 | ruby
rubyでWebサーバのアクセスログを分析するのに、CGI.parse でリクエストパラメータをデコードするプログラムを書きましたが、CGI.parse は分析自体のプログラムよりも CGI.parse に時間がかかっていました。

そこで、「ruby CGI 遅い」で検索してみたところ、CGIExt が見つかったので、こちらを利用してみたところ、パラメータのデコードにかかる時間が大幅に短縮されました。
require 'cgi' の後に require 'cgiext' とするだけでよいのもプログラムの修正が少なくて便利です。

http://cgiext.rubyforge.org/

■CGIを利用した場合
●プログラム
#!/usr/local/bin/ruby

require 'cgi'
require 'time'

# HIRAGANA=にほん&KATAKANA=ニホン&KANJI=日本
paramstr = 'HIRAGANA=%e3%81%ab%e3%81%bb%e3%82%93&KATAKANA=%e3%83%8b%e3%83%9b%e3\
%83%b3&KANJI=%e6%97%a5%e6%9c%ac'

start_time = Time.now

1.upto(10000) do |i|
CGI.parse(paramstr)
end

end_time = Time.now
print("time: #{end_time - start_time}\n")

●実行結果
time: 0.466363


■CGIExtを利用した場合
●プログラム
#!/usr/local/bin/ruby

require 'cgi'
require 'cgiext'
require 'time'

# HIRAGANA=にほん&KATAKANA=ニホン&KANJI=日本
paramstr = 'HIRAGANA=%e3%81%ab%e3%81%bb%e3%82%93&KATAKANA=%e3%83%8b%e3%83%9b%e3\
%83%b3&KANJI=%e6%97%a5%e6%9c%ac'

start_time = Time.now

1.upto(10000) do |i|
CGI.parse(paramstr)
end

end_time = Time.now
print("time: #{end_time - start_time}\n")

●実行結果
time: 0.070527




コメント (0) |  トラックバック (0) | 

mysqlのnow()の更新時刻

2011-11-13 23:18:28 | mysql
mysqlでトランザクションを使用した場合のnow()の更新時刻を調べてみました。
トランザクションを使用した場合、now()の時刻はcommitの時刻ではなく、updateを受理した時刻になるようです。


mysql> create table test1 (
-> t datetime
-> );
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test1 set t = now();
Query OK, 1 row affected (0.00 sec)

mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2011-11-13 23:26:29 |
+---------------------+
1 row in set (0.00 sec)

mysql> select sleep(30);
+-----------+
| sleep(30) |
+-----------+
| 0 |
+-----------+
1 row in set (30.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test1;
+---------------------+
| t |
+---------------------+
| 2011-11-13 23:26:16 |
+---------------------+
1 row in set (0.00 sec)


コメント (0) |  トラックバック (0) | 

mysql の Lock wait timeout exceeded エラー

2011-09-08 22:51:30 | mysql
mysql で複数のプロセスから同時にテーブルを更新しようとした場合に、Lock wait timeout exceeded エラーが発生する場合があります。

タイムアウトするまでの秒数は、innodb_lock_wait_timeout で設定されている秒数となります。
デフォルトでは50秒のようです。

mysql> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50 |
+--------------------------+-------+



コメント (0) |  トラックバック (0) | 

mysqldumpが使えない場合のデータダンプ方法

2011-08-15 22:27:54 | mysql
mysqldump では -w オプションでダンプするレコードの条件を指定することができますが、例えば複数のテーブルを組み合わせた条件を指定することはできません。
他にも view の実データをダンプしたい場合に、mysqldump で view を指定すると、view のテーブル定義がダンプされるだけです。

このような場合に、select 文で insert/replace 文を生成するのはいかがでしょうか。

mysql> select * from test_dump;
+---------+---------+
| int_col | str_col |
+---------+---------+
| 1 | abc |
| 2 | a'b'c |
+---------+---------+

$ cat dump.sql
select
concat(
"replace into test_dump set"
, " int_col = ", int_col
, ", str_col = ", quote(str_col)
, ";")
from
test_dump
;

$ cat dump.sql | mysql -s DB名
replace into test_dump set int_col = 1, str_col = 'abc';
replace into test_dump set int_col = 2, str_col = 'a\\'b\\'c';


quote() を使えば、文字列を ' で囲んで、エスケープが必要な文字をエスケープして出力してくれます。
コメント (0) |  トラックバック (0) | 

splitコマンドで行単位で分割する方法

2011-08-10 21:04:49 | linux
splitコマンドでファイルを分割する際に、-C オプションを使うと、指定バイト数を超えないところで、行単位でファイルを分割することができます。

$ cat test.txt
abc
defgh

-C 7 を指定して、行単位で7バイト毎に分割します。
$ split -C 7 test.txt
$ ls x*
xaa xab
$ cat xaa
abc
$ cat xab
defgh


-C ではなく -b オプションを指定すると単純にバイト単位で分割されます。

$ split -b 7 test.txt
$ ls x*
xaa xab
$ cat xaa
abc
def
$ cat xab
gh

コメント (0) |  トラックバック (0) | 

mysqlで文字列のキャラクタセットを変更する方法

2011-07-09 21:55:34 | mysql
mysqlで文字列のキャラクタセットの違いによるエラーが発生した場合の対処方法です。

テーブルのキャラクタセットが ascii で、文字列のキャラクタセットが utf8 の場合、strcmp('http://test.com/', url) とすると、エラーがでます。

`url` varchar(220) character set ascii collate ascii_bin default NULL,


mysql> select charset('http://test.com/');
+-----------------------------+
| charset('http://test.com/') |
+-----------------------------+
| utf8 |
+-----------------------------+


Illegal mix of collations (utf8_general_ci,COERCIBLE) and (ascii_bin,IMPLICIT) for operation 'strcmp'


この場合、cast() で文字列のキャラクタセットを変更することで、エラーがでなくなります。

strcmp(cast('http://test.com/' as binary), url)

または、文字列のキャラクタセットを _キャラクタセット で指定します。

strcmp(_binary 'http://test.com/', url)



コメント (0) |  トラックバック (0) | 

grepでパターンをファイルで指定する方法

2011-07-02 22:51:53 | linux
grepで検出したいパターンを以下のようにファイルで指定することもできます。

grep -f {パターンファイル} {ファイル}

パターンファイルは1行1パターンで指定します。

$ cat pat.txt
http://abc.com/
http://abc.com/def/
http://abc.com/def/ghi/

$ cat test.txt
http://abc.com/DEF/

$ grep -f pat.txt test.txt
http://abc.com/DEF/

コメント (0) |  トラックバック (0) | 

mysqldumpでレプリケーション用にデータをダンプする方法

2011-06-19 22:11:10 | mysql
mysqlでレプリケーションのスレーブ用にデータをダンプするのに、mysqldumpコマンドで--master-dataを指定すると、ダンプファイルにレプリケーション位置を指定するmaster_log_file、master_log_posを設定するSQLも出力されます。

$ mysqldump --master-data DB名 テーブル名

出力ファイルには以下のように master_log_file と、master_log_pos を指定するSQLが出力されています。

--
-- Position to start replication or point-in-time recovery from
--

CHANGE MASTER TO MASTER_LOG_FILE='.000650', MASTER_LOG_POS=458955379;

コメント (0) |  トラックバック (0) | 

rubyのString#splitで分割文字列も取得する方法

2011-06-11 20:29:49 | mysql
rubyのString#splitの第1引数に指定する分割パターンは、通常は戻り値の配列に含まれません。

戻り値の配列で分割パターンを取得するには、分割パターンを(...)で指定します。

irb(main):001:0> "abc,def,ghi".split(/(,)/)
=> ["abc", ",", "def", ",", "ghi"]
コメント (0) |  トラックバック (0) | 

mysqldumpでテーブルをロックしながらダンプする方法

2011-06-10 22:49:32 | mysql
mysqldumpでテーブルをダンプする際に、--lock-all-tables オプションを指定すると、すべてのテーブルをリードロックした状態でダンプを行います。

$ mysqldump --lock-all-tables db table1 table2

ロック対象は、全DBの全テーブルです。
mysqldumpの対象ではないテーブルへの書き込みはブロックされます。

そのため、レプリケーションの設定を行う際に、マスターのデータをダンプしてスレーブに登録するような場合には、--lock-all-tables を指定してダンプするのがよさそうです。


--lock-tables オプションの場合には、指定されたテーブルがダンプされている時間帯だけリードロックされるようです。

$ mysqldump --lock-tables db table1 table2

table1 をダンプしている間は、table2 への書き込みが可能です。



コメント (0) |  トラックバック (0) | 

mysql でテーブルの更新時刻を取得する方法

2011-05-27 21:14:52 | mysql
mysql でテーブルの更新時刻は、information_schema DB の tables テーブルの UPDATE_TIME で取得することができます。

mysql> select table_schema, table_name, update_time from information_schema.tables where table_schema = 'DB名' and table_name = 'テーブル名'\G
+--------------+------------+---------------------+
| table_schema | table_name | update_time |
+--------------+------------+---------------------+
| DB名 | テーブル名 | 2011-05-27 20:52:59 |
+--------------+------------+---------------------+
1 row in set (0.01 sec)
コメント (0) |  トラックバック (0) |