0

はてなブックマークを全文化してEvernoteに保存するhatebte公開しました

タイトルのまんまですが、はてなブックマークを全文化してEvernoteに保存するhatebte(ハテブテ)を公開しました。
インプットがはてなブックマークEvernoteに分散されてしまってて困ってる人やEvernoteの検索をバリバリ使いたい人には便利なサービスかもしれません。
hatebteに必要情報を登録して後はいつも通りブックマークしていけば数時間したらEvernoteにも全文化して保存されていきます。
もともと自分用に作ってたやつを焼き直したサービスなんで見た目も機能も地味です。

ちなみにこの語感の悪いサービス名はHatena Bookmark to Evernoteを無理やり略したものです。

0

skipfishインストールメモ

Googleは米国時間3月19日、オープンソースのウェブセキュリティスキャナ「skipfish」を公開した。ウェブアプリケーションをスキャンして、セキュリティホールの有無を調べられるものだ。
 skipfishでウェブアプリをスキャンすると、ブラインドSQLやXMLインジェクションといった「巧妙な仕掛け」を含む脆弱性の有無が確認できると、Googleの開発者Michal Zalewski氏はskipfishのwikiで述べている。
 skipfishは対象サイトへの再帰的クロールと辞書ベースの調査を実行し、その結果を表示したインタラクティブなサイトマップを作成する。脆 弱性がある場合には強調表示する。また、skipfishが作成する最終レポートは、セキュリティ評価の判断材料として利用できる。
http://japan.cnet.com/news/sec/story/0,2000056024,20410794,00.htm

とりあえず設置したのでメモ。
# wget http://skipfish.googlecode.com/files/skipfish-1.18b.tgz
# tar xvzf skipfish-1.18b.tgz
# cd skipfish
# make
cc -L/usr/local/lib/ -L/opt/local/lib skipfish.c -o skipfish -O3 -Wno-format -Wall -funsigned-char -g -ggdb -D_FORTIFY_SOURCE=0 -I/usr/local/include/ -I/opt/local/include/ \
http_client.c database.c crawler.c analysis.c report.c -lcrypto -lssl -lidn -lz
 
See dictionaries/README-FIRST to pick a dictionary for the tool.

これでとりあえずインストール完了です。

このままでは使えないので使用する辞書をdictionariesから選びます(ここではdefault.wl)
# cp dictionaries/default.wl skipfish.wl

で、実際に動かしてみる。
http://localhost/hogeの脆弱性をチェックしてレポートをvar/www/html/logに保存するサンプル
./skipfish -o /var/www/html/log http://localhost/hoge
-o 結果をここで指定したディレクトリに吐き出してくれる
ディレクトリは空である必要がある。

ベーシック認証を突破したい時
-A (ユーザー名):(パスワード)

500件〜2000件/秒アクセスするので要注意。
必ず自分でテスト環境で行うこと。

0

成長するエンジニア

”諦めた時が終わる時。
諦めなければ終わらない。
いつまでも結果が出ない努力は、努力する向きが違っている。”

久しぶりに自分のTumblrを見てたらこんな名言をクリップしてた。
ベタベタでけっこう使い古された言葉だけど、この短い文に大事な事が集約されてる気がする。
1行目2行目は大学生の頃に友人にも言われた言葉でもある。芸人になるのを諦めない的な話だったと思う。
スケールはだいぶ小さいけど、コードを書いてる時システムを設計してる時にぴったり当てはまる。時間的な問題は解決できないかもしれないけど難易度的なものは諦めなければ何でも解決できる。加えると、以前誰かがやったことのあるやつは必ずできる。
それを簡単に諦める人間にエンジニアとして成長する見込みなし。

3行目は常に意識しておかないと流されてしまう。
最適な努力する方向性というのは自分のやりたい事、信念に従って決めるものであって、他人(会社)が決めるものではない。
その他人が決めたゴールに向かって努力するのは、成長を妨げたり鈍化させたりする。ここでいうところの「向きが違う」場合が多い。
フォームばっかりだったり、CMSばっかりだったりと会社の業務内容と自分の実力の枠を越えることはあまりない。
他人からから提示される努力目標は、怒られない為の努力であったり、ルールに沿う為の努力であったりというのも多い。しかも、業務に関連するものに限られてるくるので視野も狭くなりがち。最悪視野が狭くなってる事にも気づかない事もある。
ルールが常に正しいわけでもないし、怒られたからといって自分が悪いとは限らない、空気を読まないことが悪いわけでもない。
これでも成長はするが、そんな後輩が会社にいたとしても脅威を感じない。

  • 自分が正しいと思ったものを作る事。
  • 会社に目標を定めてもらわず、自分で目標を定める事。
  • 誰にも負けない事。
  • 会社に雇われていたらその期待値を上回る事。

普段書かない内容を書くと纏まらなくなったけど要はこういう事。
別にエンジニアじゃなくても当てはまると思う。

0

HTML::Featureのユーザーエージェントが設定できない件

本日もperlネタ。
ブログやニュースサイトから本文だけ抽出したい時に非常に便利なcpanモジュールにHTML::Featureというものがあります。
設計も非常に秀逸で本文を抽出するロジック(エンジン)もモジュールで選ぶことができます。

use HTML::Feature;my $url = "http://hogehoge.com/blog/entry01.html";my $f = HTML::Feature->new(
 
engines => [
'HTML::Feature::Engine::LDRFullFeed',
'HTML::Feature::Engine::GoogleADSection',
'HTML::Feature::Engine::TagStructure',
],
user_agent => 'hogehoge bot',
);
 
my $res = $f->parse($url)->text;
print $res;

本来は、これだけで本文が取得できる… はずが、PODの通りユーザーエージェントを指定すると実は下記のようなエラーが返ってきます。
Can't locate object method "user_agent" via package "LWP::UserAgent" at /usr/lib/perl5/site_perl/5.8.8/HTML/Feature/Fetcher.pm line 23.

内部で使ってるLWP::UserAgentに渡す際にエラーがでてるようです。
LWP::UserAgentではユーザーエージェントを指定するのにuser_agentではなくagentと指定するのでその通りに、Fetcher.pmを少し書き換えます。

# $fetcher->user_agent( $config->{user_agent} );

$fetcher->agent( $config->{user_agent} );

これで再度実行すると問題なくhogehoge botというユーザーエージェントが相手のサーバーログに残ります。

user_agentの指定は必須ではないけど、デフォルトではlibwww-perl/#.###というユーザーエージェント名になってしまいます。
サーバーによってはユーザーエージェントがlibwww-perl/#.###だとリクエストを受け付けないこともあるので独自のユーザーエージェント名を指定しておきます。

0

Perl 5.8.xのUTF8フラグ

最近5年ぶりに本格的にperlを書いてるんだけど、ほんと楽しい。
webアプリ作るのはPHPが一番簡単&早いと思うけど、perlは、”There’s more than one way to do it”と言われる通り色んなやり方があって完成するまでのプロセスが楽しめる言語だと思う。

ただ、他の言語でもよくある問題だけど、perlのUTF8は扱いにくい。
よくわからず書いていると必ず出くわす以下のエラー。
Wide character in print at scraper.pl line 12.

久々にperlを書いてるとUTF8フラグとるのは、Encode::encode? Encode::decode?って時があるのでまとめとく。
他にも色々やり方はあるけど、一つだけです。

perlのデフォルトでは以下は6となります。
print length("モダン");
lengthはバイト数を返すのであながち間違いではないけど、見た目も気持ち悪いし内部的にUTF8で動いてないみたいです。

3を返す為には、下記の通りにします。
use utf8;
print length("モダン");

このuse utf8で内部もutf8で動きます。
use utf8を使うとperlの内部で動いてるutf8にutf8フラグというものがつきます。

ただ残念なのがuse utf8を使うと以下のコードでエラーがでます。
use utf8;
print "モダン";
→Wide character in print at scraper.pl line 12.

これはソース直書きのprint対象の文字列(モダン)にutf8フラグがついているのが原因です。

私の場合はスクリプトにはすべてuse utf8をつけて、出力の際にEncodeモジュールを使ってutf8フラグを除去して出力させています。
encodeという言い方がややこしいけど、utf8除去することがencode、逆にutf8フラグを付与する場合はdecodeとなります。
use utf8;
print Encode::encode("utf8", "モダン");

DBに保存させる時は、utf8フラグを除去して保存してくれます。
DBから値を取得した時もutf8フラグは除去されたままなので、encodeモジュールなしで出力します。

0

perlでMeCabを使う

久しぶりにMeCabをいれることになったけど超絶簡単になっててびっくりした。
yumでインストールできます。

yum mecab mecab-devel ipadic
ipadicは辞書です。辞書がないとmecabは機能しません。
一昔前までeucだのsjisだとutf8だの言ってたけど、yumで入れるとutf8の辞書ができ上がっています。

perlで弄る為にcpanモジュールもインストール。
cpanのシェルでインストールするとコケるので、無理やりインストール。
force install Text::MeCab

途中で辞書のエンコーディングは何か聞かれるのでデフォルトのutf-8を選択

これでperlからmecabを使う準備が整いました。

#!/usr/bin/perl
 
use strict;
use warnings;
use utf8;
use Text::MeCab;
 
my $m = Text::MeCab->new();
my $text = "このブログは俺のメモです。";
  
for (my $node = $m->parse($text); $node; $node = $node->next) {
print $node->surface, "\t", $node->feature, "\t", $node->cost, "\n";
}

実行するとこんな感じです。

この 連体詞,*,*,*,*,*,この,コノ,コノ -664
ブログ 名詞,一般,*,*,*,*,* 7643
は 助詞,係助詞,*,*,*,*,は,ハ,ワ 7663
俺 名詞,代名詞,一般,*,*,*,俺,オレ,オレ 11792
の 助詞,連体化,*,*,*,*,の,ノ,ノ 12160
メモ 名詞,サ変接続,*,*,*,*,メモ,メモ,メモ 14654
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス 17196
。 記号,句点,*,*,*,*,。,。,。 13806
BOS/EOS,*,*,*,*,*,*,*,* 12270

残念ながらこのままでは「俺のメモ」が分解されてしまいます。
一つの単語として認識させるにはユーザー辞書に登録する必要があります。
登録の仕方はこの記事を参考にしてください。