トップ «前の日記(2011-09-02(Fri)) 最新 次の日記(2011-09-04(Sun))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2011-09-03(Sat) 台風は何処へ?

重複削除

二つのデータ(空行を含め、同じ行が複数回存在しない前提)から、重複する行を削除するスクリプト。
箇条書きで短く、ある程度メジャーなデータは、 これ( 出典)くらいしか思いつかなかった。

$ cat first
日本国憲法目次
 ・ 第1章 天皇(1条−8条)
 ・ 第2章 戦争の放棄(9条)
 ・ 第3章 国民の権利及び義務(10条−40条)
 ・ 第4章 国会(41条−64条)
 ・ 第5章 内閣(65条−75条)
 ・ 第6章 司法(76条−82条)
 ・ 第7章 財政(83条−91条)
$ cat second
 ・ 第4章 国会(41条−64条)
 ・ 第5章 内閣(65条−75条)
 ・ 第6章 司法(76条−82条)
 ・ 第7章 財政(83条−91条)
 ・ 第8章 地方自治(92条−95条)
 ・ 第9章 改正(96条)
 ・ 第10章 最高法規(97条−99条)
 ・ 第11章 補則(100条−103条)

まず first を出力し、最終行のハッシュ値を保存する。
それから second で同じハッシュ値の次行以下を出力する。

<?php
$oldfile = 'first';
$newfile = 'second';
 
$file = fopen($oldfile, 'r');
for ($line = fgets($file); ! feof($file); $line = fgets($file)) {
        print $line;
        $l2 = $line;
}
fclose($file);
$last_hash = hash('md5',$l2);
 
$file2 = fopen($newfile, 'r');
$is_same = 0;
for ($line = fgets($file2); ! feof($file2); $line = fgets($file2)) {
        if ($is_same == 0) {
                if ($last_hash == hash('md5', $line))
                        $is_same = 1;
        } else {
                print $line;
        }
}
fclose($file2);
?>

で、その実行結果。

日本国憲法
目次
 ・ 第1章 天皇(1条−8条)
 ・ 第2章 戦争の放棄(9条)
 ・ 第3章 国民の権利及び義務(10条−40条)
 ・ 第4章 国会(41条−64条)
 ・ 第5章 内閣(65条−75条)
 ・ 第6章 司法(76条−82条)
 ・ 第7章 財政(83条−91条)
 ・ 第8章 地方自治(92条−95条)
 ・ 第9章 改正(96条)
 ・ 第10章 最高法規(97条−99条)
 ・ 第11章 補則(100条−103条)

最終行末に改行文字がない可能性を考えると、rtrimしてからhashすべきか、 とかmd5で十分か、 とか同じ行が複数回出た場合を考えれば行を数える方がいいか、 とかも浮かばなくはない。
が、一旦ここまで。

JSONことはじめ

PHPマニュアルとか、 ちょっと古いかもしれないサイトとかを参考にもげもげ。

まずはデータをJSON形式にエンコード。

<?php
$my_ar = array(
    array(
        'name' => 'さとう',
        'url'  => 'http://www.kuzuore.com/'
    ),
    array(
        'name' => 'でない誰か',
        'url'  => 'http://example.com'
    )
);
$encode = json_encode($my_ar);
echo $encode;
?>

読めないデータができた。

[{"name":"\u3055\u3068\u3046","url":"http:\/\/www.kuzuore.com\/"},\
{"name":"\u3067\u306a\u3044\u8ab0\u304b","url":"http:\/\/example.com"}] 

で、今度はそれをデコードして、配列に戻す。

<?php
$jdata = '[{"name":"\u3055\u3068\u3046","url":"http:\/\/www.kuzuore.com\/"},
 {"name":"\u3067\u306a\u3044\u8ab0\u304b","url":"http:\/\/example.com"}]' ;
 
$decode = json_decode($jdata);
print_r ($decode);
?> 

一応うまくいったらしい。

Array
(
    [0] => stdClass Object
        (
            [name] => さとう
            [url] => http://www.kuzuore.com/
        )
 
    [1] => stdClass Object
        (
            [name] => でない誰か
            [url] => http://example.com
        )
 
)

json_decode関数の二つ目の引数が、ちょっと気にかかったが、それは後で悩むことにする。

初BOT

Web上から特定の場所( スラッシュドット の最下行近く)の発言を拾って、Twitterに流すだけ。
工夫したところは、既出を避けた点くらいか。

最初に参考にした サイト。 認証モジュールは、 abraham/twitteroauth から借りる。アーカイブから Oauth.php と twitteroauth.php を同じディレクトリに。

Twitter の開発者サイトで、適当に登録。
そこからOAuthのサイトに行って、あれこれやって、各種キーをゲット。
キーは設定ファイルに格納しておく。

フロントエンドはシェルスクリプトでやった。
既出を避けるために、既に送信した呟きは特定ファイルに貯めておく。
wget で取ったWebから特定行を抽出し、sedでタグを抜き、新規ファイルに格納する。

発言が既出かどうかを確認し、既出でなければ追記するとともに、Twitterに 送信する。
一つの*.php に色々書きすぎて、50行もないのに何がなんだかになってしまった。
機能分割は、次回の課題にするか。


リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。

index.htmlは ここから。