Ubuntu で DesktopNotification

via http://d.hatena.ne.jp/sugyan/20101003/1286035489

おぉ。こんなことできるのね。Ubuntuの場合は apt で libgtk2-notify-perlをインストールすれば Log::Dispatch::DesktopNotification のバックエンドとして Log::Dispatch::Gtk2::Notify が動く。(正確にはさらに Gtk2::Notify が呼ばれているみたい)


mysql memo

初めてのPHP & MySQL 第2版 を読んだ自分用メモ。PHP の部分はスルー。途中から抜けが多いけど本にはしっかり書いてあるよ!

connect

mysql -h host -u user -p

mysql command

command
paramter:意味
quit
none:コマンドラインユーティリティを終了
use
database name:使用するDBを指定する
show
table name / database name:利用可能なテーブルやデータベースなどのリストを出力する
describe
table name:テーブルの列の説明を出力する
status
none:データベースのバージョンとステータスを表示する
source
file name:指定ファイルからコマンドを実行する
利用可能なデータベースを表示する
SHOW DATABASES;
使用するデータベースを指定する
USE mysql;

DB管理

ユーザ作成
GRANT ALL PRIVILEGES ON *.* TO 'user'@'hostname' IDENTIFIED BY 'password'
DB作成
CREATE DATABASE store;
USE store;
テーブルの作成
CREATE TABLE books (
title_id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(150),
pages INT,
PRIMARY KEY (title_id)
);
CREATE TABLE authors (
author_id INT NOT NULL AUTO_INCREMENT,
title_id INT NOT NULL,
author VARCHAR(125),
PRIMARY KEY (author_id)
);
NOT NULL
「空」の状態を許可しない
AUTO_INCREMENT
主キーが自動生成される
PRIMARY KEY
主キーフィールドになる列を指定

テーブルにデータを追加

INSERT INTO table COLOMNS(列名) VALUES(値);
  • 数値はクォートしない
  • 文字列は必ずクォートする
  • 日時と時刻は必ずクォートする
  • 関数はクォートしない
  • NULLはクォートしない
INSERT INTO books VALUES(1, "Linux in a Nutshell", 112);
INSERT INTO authors VALUES(NULL, 1, "Ellen Siever");
INSERT INTO authors VALUES(NULL, 1, "Aaron Weber");

テーブル定義の操作

テーブル名の変更
ALTER TABLE table_name RENAME new_table_name;
列のデータ型の変更
ALTER TABLE authors MODIFY author VARCHAR(150);

author_id 列の後に author 列を配置。 FIRST を指定すると、その列はテーブルの最初の列になる

ALTER TABLE authors MODIFY author varchar(125) AFTER author_id;
列の追加
ALTER TABLE table_name ADD column_name DATA_TYPE;

AFTER column_name か FIRST で列を追加する場所を指定できる

列名の変更
AFTER TABLE table_name CHANGE new_column_name old_column_name varchar(125);
列の削除
ALTER TABLE table_name DROP COLUMN column_name;
テーブル全体の削除
DROP TABLE table_name;

SELECT

SELECT column_name FROM table_name [WHERE] [ORDER];
  • WHERE クエリから返される結果を限定できる
  • ORDER BY データをソートできる
WHERE
SELECT * FROM books WHERE title = "Classic Shell Scripting";
SELECT books.pages FROM books WHERE title = "Classic Shell Scripting";
  • AND/OR を使うことで複数の条件を指定できる
  • 「table_name.colomn_name」の形式が好ましい
ORDER BY
SELECT * FROM authors ORDER BY author;
SELECT * FROM authors ORDER BY author DESC;
テーブルの結合

user_id と title_id の組み合わせに purchase_id を割り当てる purchases テーブルを作成してデータを追加する SQL

CREATE TABLE purchases (
purchase_id int NOT NULL AUTO_INCREMENT,
user_id varchar(10) NOT NULL,
title_id int(11) NOT NULL,
purchased timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (purchase_id)
);

INSERT INTO `purchases` VALUES(1, 'mdavis', 2, '2005-11-26 17:04:29');
INSERT INTO `purchases` VALUES(2, 'mdavis', 1, '2005-11-26 17:05:58');

著者名、ページ数、著者を一覧表示するクエリを作成する SELECT 文

SELECT books.*, author FROM books, authors WHERE books.title_id = authors.title_id;
  • books.*, author の部分は、 books テーブルからは全フィールドを選択するが、authors テーブルからは author だけを選択することを示している
  • WHERE books.title_id = authors.title_id の部分は、title_id で二つのテーブルを連結している
JOIN ON
SELECT 列 FROM テーブル JOIN 結合対象テーブル ON (条件);
SELECT * FROM books JOIN authors ON (books.title_id = authors.title_id);
  • 自然結合と同じように使うことができる
  • 名前で自動的にマッチングする代わりに、結合する列を指定できる
エイリアス

テーブル名の後に AS と記述し、その後ろにエイリアスを指定する

SELECT * from books AS b, authors AS a WHERE b.title_id = a.author_id;

UPDATE

UPDATE books SET pages = 476 WHERE title = "Linux in a Nutshell";

DELETE

DELETE FROM authors WHERE author_id = 1;

LIKE / % / _

  • % はワイルドカード
  • _ は1文字とマッチする
SELECT * FROM authors WHERE author LIKE "%b%";
SELECT * FROM authors WHERE author LIKE "Aaron Webe_";

論理演算子

WHERE 節のなかでは、AND / OR / NOT を使用できる

  • 著者が"Ellen Siever"ではないレコードを全て返す
SELECT * FROM authors WHERE NOT (author = "Ellen Siever");
  • 書籍と著者情報を返す
SELECT *
  FROM books, authors
 WHERE title = "Linux in a Nutshell"
   AND author = "Aaron Weber"
   AND books.title_id = authors.title_id;
  • 著者名が"Aaron Weber" または ""Ellen Siever" というレコードを全て返す
SELECT *
  FROM books, authors
 WHERE (author = "Aaron Weber"
    OR author = "Ellen Siever")
   AND books.title_id=authors.title_id;

このクエリの括弧は重要。 AND 条件で authors テーブルと books テーブルを結合する前に、著者名の OR 条件を明確にする必要がある

データベース設計

リレーショナルデータベース
  • 複数のテーブルを格納する機能がある
  • 別々に格納されたテーブルに関係がある場合、共通のキーによって両方のテーブルを結合することができる
  • 新たなデータベースを設計する際、どの項目を「主キー」にするかは重要な作業
  • 主キーは必ず一意でなければならない
リレーションシップのタイプ
  • 1対1のリレーションシップ
   [users]     [ship]
     User ------ User
     First       Address
     Last        City
                 State
                 Zip
  • 1対多のリレーションシップ
(ry
  • 多対多のリレーションシップ
(ry

正規化

  • データを構成する列の関連性を割り出して効率的にまとめる作業
  • 列の論理的な関係性に基づいてデータを分割しデータの重複を最小限にする
正規化されていないテーブル
  • 住所変更等に対応するのは大変
User ID First name Last name Address Phone Title Author1 Author2 Pages When
Mdavis Michele Davis Linksway, Fx Pnt 414-352-4818 Linux in a Nutshell Ellen Siever Aaron Weber 112 2007/9/3
Mdavis Michele Davis Linksway, Fx Pnt 414-352-4818 Classic Shell Scripting Arnold Robbins Nelson Beebe 576 2007/9/3

正規化の形式

第1正規形

条件

  1. 同じような列を繰り返し定義しない(e.g. Author1, Author2)
  2. 全ての列は値は1つだけ含んでいること
  3. 一意に行を識別する主キーがあること

正規化後

User ID Fitst name Last name Address Phone Title Pages When
Mdavis Michele Davis Linksway, Fx Pnt 414-352-4818 Linux in a Nutshell 112 2007/9/3
Mdavis Michele Davis Linksway, Fx Pnt 414-352-4818 Classic Shell Scripting 576 2007/9/3
Title Author name
Linux in a Nutshell Ellen Siever
Linux in a Nutshell Aaron Weber
Classic Shell Scripting Arnold Robbins
Classic Shell Scripting Nelson Beebe
User ID First name Last name Address City Stat Zip code Phone Title Pages Date
Mdavis Michele Davis 4505 N, Linksway FxPnt MN 55114 414-352-4818 Linux in a Nutshell 112 2007/9/3
Mdavis Michele Davis 4505 N, Linksway FxPnt MN 55114 414-352-4818 Classic Shell Scripting 576 2007/9/3
第2正規形
  • 第1正規形が水平方向の行に対するデータの冗長性に対処するが、第2正規形は垂直方向の列に対するデータの冗長性に対処する
  • 第2正規形のデータを作成するには、既にそのテーブルが第1正規形でなければならない
  • 複数の行を横断して値が繰り返される列を全て特定する必要がある(そのような列は別のテーブルに切り離し、元のテーブルの主キーで参照する)
  • テーブルのなかに、主キーに依存しない属性がないか検討する方法がある

正規化後(Users Books Authors Purchases に分割された)

  • books テーブル
Title_ID Title Pages
1 Linux in a Nutshell 112
2 Classic Shell Scripting 576
  • authors テーブル
Author_ID Author name
1 Ellen Siever
2 Aaron Weber
3 Arnold Robbins
4 Nelson Beebe
  • authors テーブルと books テーブルをつなぐ book_author テーブル
Title_ID Author_ID
1 1
1 2
2 3
2 4
  • Users テーブル
User_ID First name Last name Address City State Zip code Phone
Mdavis Michele Davis 7505 N. Linksway FxPnt MN 55114 414-352-4818
  • Purchase テーブル
Purchase_ID User_ID Title_ID When
1 Mdavis 1 2007/9/3
2 Mdavis 2 2007/9/3
第3正規形
  • 第1正規形と第2正規形のルールに正しく従ってきた場合、そのまま第3正規形に適合している場合がある
  • 第3正規形ではテーブルのなかから、主キーに完全に依存せずテーブル内のほかの列に依存するデータを探す
    • Purchase テーブルでは、住所の構成要素とユーザーは直接関係無いと考えることができる
      • つまり、住所は郵便番号に、郵便番号は都市に、都市は州に依存している
  • 第3正規形では、多くのテーブルが作成されることとなるが、正規化をどこで止めるかは自分次第
  • すくなくとも第2正規形には適合させた方がよい

データ型

[]内は省略可

フィールドタイプ 説明
INT[(M)] 整数(Mは最大表示幅) 997
FLOAT[(M,D)] 少数(最大M桁、小数点以下D桁) 3.14142
CHAR(M) 文字列(M文字:最大255) 「テスト」
VARCHAR(M) 文字列(M文字:最大255文字、MySQL 5 では 約 65000文字) "testing 1.2.3"
TEXT or BLOB 65535文字までの文字列 "All work and no play makes Jack a dull boy."
DATE YYYY-MM-DD 2003-12-25
TIME HH:MM:SS 11:36:02
  • books テーブルの列のデータ型
フィールド名 データ型
Title_ID INT
Title VARCHAR(150)
Pages INT
  • authors テーブルの列のデータ型
フィールド名 データ型
Author_ID INT
Title_ID INT
Author VARCHAR(100)

データのバックアップとリストア

データベースファイルのコピー
  • Linux : /var/lib/mysql
  • MySQLサービスを停止してからファイルコピーをする
  • バックアップしたディレクトリにあるファイル全てを置き換える必要がある
mysqldump
  • SQL 文がテキストファイルに出力される
  • 出力されたファイルには、データベースオブジェクトの再構築や、データの復元に必要なコマンドが含まれている
  • 単一テーブル、単一データベース、または全データベースのどれをバックアップするかについてパラメータを指定できる
  • バックアップしたいオブジェクト名に続けて > と記述してファイル名を指定すると、出力結果がファイルに出力される

store というデータベースをバックアップ & リストア:

$ mysqldump -u user -p store > my_backup_of_store.sql
$ mysql -u root -p -D store < my_backup_of_store.sql

authors テーブルだけをバックアップする:

$ mysqldump -u root -p store authors > authors.sql

全データベースをバックアップ & リストア:

$ mysqldump -u root -p --all-databases > my_backup.sql
$ mysql -u root -p < my_backup.sql

テスト用などに、データベースの状態を空の状態(構造のみ)で出力する:

$ mysqldump -u root -p --no-data store > structure.sql

データだけをバックアップ:

$ mysqldump -u root -p --no-create-info store > data.sql
mysqlimport
  • CSV形式のデータを取り込みたい場合に便利

インデックス

  • インデックスを使用するには事前に定義しておく必要がある
  • インデックスに含まれたデータはソートされている
  • なぜすべてインデックス化しないのか
    • ディスク容量の限界
    • 膨大で包括的なインデックスを作成・メンテナンスするのは非効率
    • インデックスに含まれるデータが大きすぎると読み取りに時間がかかる

インデックスが使用されるタイミング

  • WHERE 節
    • SELECT * FROM authors WHERE author = 'Ellen Siever'; というクエリは、利用可能な場合に author 列のインデックスを使う
  • ORDER BY 節
    • SELECT * FROM contacts ORDER BY author; というクエリは、利用可能な場合に author 列のインデックスを使う
  • MIN MAX 関数
    • MIN 関数や MAX 関数で指定される列にインデックスがある場合、そのクエリではインデックスが使われる

インデックスの作成

  • 簡単なインデックスの作成
    • UNIQUE という指定によって author という列にインデックスが作成される(ただし、全てのインデックスが一意とは限らない)
CREATE UNIQUE INDEX authind ON authors (author);

複数列のインデックス

  • 2つ以上の列でもインデックスを作成できる
  • 複数列を使うユニークインデックスは、列の値を組み合わせることで一意性を確保する
  • インデックス列としてふさわしいのは、WHERE 節で使用されそうな列
    • 確実に使用される特定の列の組み合わせであればよい
  • 複合インデックスの列は、頻繁に使われる列が先に来るように並べる
  • インデックスの先頭の値だけを使う場合でも、複合インデックスによるクエリの実行速度をあげる
  • プライマリインデックスは1つのテーブルに1つだけ作成できる
    • ユニークインデックスは好きなだけ作成できる

EXPLAIN

EXPLAIN の出力には、どのようにクエリが処理されたかについて細かい情報が含まれる

EXPLAIN SELECT * FROM authors WHERE author = 'Arnold Robbins';

構造化テキストのエスケープ

こんな風に処理すればいいのかな

もっと改良の余地はありそうだが…ぐぬぬ

use common::sense;
use HTML::Entities;

our %re = (
    uri   => qr{(http://[\S]+)}, # FIXME
    reply => qr{(\@[0-9A-Za-z_]+)},
    hash  => qr{(\#[0-9A-Za-z_]+)},
);

our $regex = qr/$re{uri}|$re{reply}|$re{hash}/;

my @tweets = (
    "See: http://x.xx/@\"style=\"color:pink\"onmouseover=alert(1)//",
    q{http://j.mp/dankogai @dankogai こうですか? #XSS わかりません <script>alert('XSS')</script>
http://twitter.com/search?q=a&r=b#@"onmouseover="alert(location.href)"/},
    q{http://j.mp/dankogai @dankogai こうですか? #XSS わかりません <script>alert('XSS')</script>
http://twitter.com/search?q=a&r=b#@"onmouseover="alert(location.href)"/ twitpic! http://twitpic.com/2r2umf},
);

for my $tweet (@tweets) {
    say '<div>';
    say make_link($tweet);
    say '</div>';
}

sub make_link {
    my $text = decode_entities(shift);

    my $html = '';
    for my $token (split $regex, $text) {
        if ($token =~ /^$re{uri}/) {
            if ($token =~ m!http://twitpic\.com/(\w+)!) {
                my $encoded = encode_entities($1);
                $html .= qq{
                    <a href="http://twitpic.com/$encoded">
                        <img src="http://twitpic.com/show/thumb/$encoded"></a>};

            } else {
                my $encoded = encode_entities($token);
                $html .= qq{<a href="$encoded">$encoded</a>};
            }

        } elsif ($token =~ m!^\#(.+)$!) {
            my $hash_ent = encode_entities($1);
            my $hash_tag = encode_entities($token);
            $html .= qq{<a href="http://search.twitter.com/search?q=%23$hash_ent">$hash_tag</a>};

        } elsif ($token =~ m!^\@(.+)$!) {
            my $user = encode_entities($1);
            $html .= qq{<a href="http://twitter.com/$user">\@$user</a>};

        } else {
            $html .= encode_entities($token);

        }
    }

    return $html;
}

exit;

__END__

git で fatal: cannot copy というエラーが出た

こんなエラー

$ git init
fatal: cannot copy /usr/share/git-core/templates/info/exclude to /tmp/foo/.git/info/exclude

このエラー出た人は他にいるのかなぁ。

原因

  • /usr/share/git-core/templates 以下のファイルから読み取り権限がなくなってた
  • おそらく apt-get upgrade したときに変更された(?)

解決策

こんな風にパーミッションを変更してやればよい

# cd /usr/share/git-core/templates
# find | xargs chmod +r

vim で perl -c を通らない変更は保存しないようにする方法

Emacs 使ってる人に dis られた挙句涙目で散々調べまわって苦労した。

まずはインストール

cpanm Vi::QuickFix

http://www.vim.org/scripts/script.php?script_id=896

.vim/ftplugin/perl_synwrite.vim

この二つを真(1)に書き換える

let s:default_perl_synwrite_qf = 1
let s:default_perl_synwrite_au = 1

.vimrc に追記

これは各自お好きなように。

" quickfix
map <silent><C-c> :cn<CR>
map <silent><C-l> :cl<CR>

vim 再起動して

use strict;
use warnings;
use 5.12.1;
say $foo;

を :w で書き込もうとすると

Global symbol "$foo" requires explicit package name at - line 7.
- had compilation errors.

shell returned 255

Press ENTER or type command to continue

と出て保存できない。yatta.


cpanm Test::TCP しておく

Test::TCP 1.03 が出てるので上げておくといいと思います。 Test::TCP 1.02 をテストで使うモジュールをインストールすると、 ~/.cpanm/build.log に

cannot open port: 10033 at /home/foo/perl5/perlbrew/perls/perl-5.12.1/lib/site_perl/5.12.1/Test/TCP.pm line 117.

と出てテストが通らないが、バージョン上げることで解決可。


perlbrew の環境で daemontools を使うためのメモ

既出かもしれないけれど。

perlbrew で構築した環境で /usr/bin/perl と ~/perl5 のバージョンが違う場合

run スクリプトで環境変数を export してあげないと perlbrew の利点を活かしきれない。ちなみに bash を中心に扱っているので、自分の環境に合わせて読み替えてください。

run にどう書くか

perlbrew init したときに ~/.bashrc に追記した source の行があるはずなのでそれを辿って export を run にコピペしてやればよい。

手元の環境では
$ cat ./bashrc
..snip...
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi
source /home/foo/perl5/perlbrew/etc/bashrc

$ cat /home/foo/perl5/perlbrew/etc/bashrc
export PATH=/home/foo/perl5/perlbrew/bin:/home/foo/perl5/perlbrew/perls/current/bin:${PATH}
よって、 run ファイルは
$ cat /etc/service/chirp/run
#!/bin/sh

cd /home/foo/chirp
export PATH=/home/foo/perl5/perlbrew/bin:/home/foo/perl5/perlbrew/perls/current/bin:${PATH}
exec setuidgid foo perl chirp.pl

としておく。これで perlbrew switch したバージョンを使えるようになる。

※ $^V を表示するテストスクリプトを走らせて確認しておくことで、嵌ることを回避できる


epoll を使ったエコーサーバ的な何かを書いてみた

イベント駆動で書くと

クラウド破産を回避できたり、自宅サーバを守れるというメリットがあるらしいので、どうせなら epoll を使ってみようということで。

http://d.hatena.ne.jp/odz/20070507/1178558340http://alpha.mixi.co.jp/blog/?p=76 と man が参考に。某所経由で id:koizuka 氏にいろいろ教わり助かりました。

nginx 速すぎで大変悲しい結果に。

ソース

http://d.hatena.ne.jp/odz/20070507/1178558340 の勝手 fork です。問題/間違い等あれば連絡いただければありがたいです。エラー処理は省略気味。

ベンチマーク

それぞれ debian 上で epoll_sample, nginx, Apache2 を実行。nginx, apache2 ともに apt-get install で持ってきて設定はデフォルトのまま。

epoll_sample
# ab -n 10000 -c 50 http://localhost:8080/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        
Server Hostname:        localhost
Server Port:            8080

Document Path:          /
Document Length:        7 bytes

Concurrency Level:      50
Time taken for tests:   20.125 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      710142 bytes
HTML transferred:       70014 bytes
Requests per second:    496.91 [#/sec] (mean)
Time per request:       100.623 [ms] (mean)
Time per request:       2.012 [ms] (mean, across all concurrent requests)
Transfer rate:          34.46 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        3   46  12.6     46     117
Processing:     9   48  13.8     48     241
Waiting:        0   32  15.2     35     239
Total:         32   95  23.2     94     244

Percentage of the requests served within a certain time (ms)
  50%     94
  66%     96
  75%     99
  80%    101
  90%    109
  95%    135
  98%    168
  99%    178
 100%    244 (longest request)
nginx
# ab -n 10000 -c 50 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        nginx/0.6.32
Server Hostname:        localhost
Server Port:            80

Document Path:          /
Document Length:        151 bytes

Concurrency Level:      50
Time taken for tests:   22.493 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3627602 bytes
HTML transferred:       1513171 bytes
Requests per second:    444.58 [#/sec] (mean)
Time per request:       112.465 [ms] (mean)
Time per request:       2.249 [ms] (mean, across all concurrent requests)
Transfer rate:          157.50 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        3   54   9.6     53     128
Processing:    33   57  11.1     54     139
Waiting:        7   46  12.1     46     134
Total:         64  112  15.2    107     230

Percentage of the requests served within a certain time (ms)
  50%    107
  66%    111
  75%    113
  80%    114
  90%    119
  95%    146
  98%    171
  99%    182
 100%    230 (longest request)
Apache2
# ab -n 10000 -c 50 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache/2.2.9
Server Hostname:        localhost
Server Port:            80

Document Path:          /
Document Length:        45 bytes

Concurrency Level:      50
Time taken for tests:   31.275 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3204993 bytes
HTML transferred:       452115 bytes
Requests per second:    319.74 [#/sec] (mean)
Time per request:       156.377 [ms] (mean)
Time per request:       3.128 [ms] (mean, across all concurrent requests)
Transfer rate:          100.07 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       46   74  16.8     70     194
Processing:    51   81  16.9     81     211
Waiting:        3   52  28.2     53     172
Total:        138  155  20.2    149     401

Percentage of the requests served within a certain time (ms)
  50%    149
  66%    153
  75%    156
  80%    158
  90%    169
  95%    198
  98%    230
  99%    238
 100%    401 (longest request)

twitter のおすすめユーザーを Firefox + Adblock Plus の環境で非表示にする

Adblock Plus -> 設定 -> 追加 で要素非表示フィルタに

twitter.com###recommended_users

を追加して有効にすればよい


テンプレートエンジン Text::Xslate について

速いと噂の Xslate

ですが、実際どう使うのかという点ではまだまだ明文化されたものが少ないと思ったので http://xslate.org/intro.html を書いておきました。記事では、イテレーションをはじめ知っておくと便利な dump フィルタ、 mark_raw() がテーマになっています。近々トップページからリンクされる模様。

サンプルコードは id:gfx さんの手が入っているので安心のクォリティ。サンプルを見れば特に英語自体は読まなくても大丈夫です。

参考 - これくらい速いよ!

benchmark


« 8 »