カテゴリー
Amon2 perl

Amon2のロギングにLog::Handlerを使う

Amon2でログを取るにはLog::Minimalが推奨されている。

Log::Minimalが推奨されているけどファイルに書き出すのにコード書く必要があるっぽいので別のモジュールを探す。

Awesome PerlにLog::Minimalの他にはLog::DispatchとLog::Log4perlが掲載されている。ベンチマークのエントリーではCPAN本おすすめのLog::Handlerが良さそうだったので、試しに実装してみる。

Log::Handlerの特徴

Log::Handler

  • コンソールへのログ出力
  • 複数ファイルへのログ出力を設定可

他、DBIと絡めたり、メール送ったり、SOCKETで別サーバに送ったりも出来る。

Log::Handler::Examples - Examplesを読むと色々参考になる。

仕様

  • $ENV{'PLACK_ENV'}がdevelopmentかproductionかで切り分けて、開発時にはscreen(ターミナルへ出力)とdebugログ(ファイル)にも出力させるようにしておく。
  • $cにmethod生やしておいて、$c->log->info()で呼べる。debugだけは$c->debug()でも呼べるようにエイリアス化しておく。
  • ログファイルはとりあえずdebug.log、common.log、error.logとし、Myapp/var/log以下に保存する。
  • ロギングの設定は各モードで共有としておく。
  • warnまたはdieの時にはsignalを受け取ってログを吐くようにしておく。

該当コミット

https://github.com/clicktx/p5-App-Amozon/commit/aef903bb123094f9fd3a67a4be5f5a8d7cfd451d

使う

package Amozon::Web::C::Root;
use strict;
use warnings;
use utf8;

sub index {
    my ($class, $c) = @_;

    # debug
    $c->log->debug("debug message");
    $c->debug("debug message(alias)");

    # info
    $c->log->info("info message");

    # dump
    $c->log->dump($c);

    my $counter = $c->session->get('counter') || 0;
    $counter++;
    $c->session->set('counter' => $counter);
    return $c->render('index.tx', {
        counter => $counter,
    });
}
カテゴリー
perl

OS X (El Capitan)で PhantomJS+Selenium::Remote::Driver (Selenium::PhantomJS) を試す

PhantomJSのインストール

サクッと brew install phantomjs といきたいところだけど今現在(2015/12/15)まだパッケージがないらしい。

$ brew install phantomjs
phantomjs: This formula either does not compile or function as expected on OS X
versions newer than Yosemite due to an upstream incompatibility.
Error: An unsatisfied requirement failed this build.

公式バイナリをインストール

homebrew - El Capitan にPhantomJS 2.0をインストールする - Qiitaを参考に公式バイナリをダウンロードしてくる。

  • /usr/local/bin にインストールする
$ cp /path/to/phantomjs /usr/local/bin/
  • upxをつかってパッケージングし直さないと使えないっぽい
$ brew install upx
$ upx -d /usr/local/bin/phantomjs
$ phantomjs 
phantoms>

となれば動作OK

簡単なスクリプトを試す

#!perl
use v5.12;
use Selenium::PhantomJS;

my $driver = Selenium::PhantomJS->new();
$driver->get('http://www.google.com');
say $driver->get_title();
$driver->quit();
カテゴリー
perl

Perlの環境をperlbrewからplenvにしたらscraperコマンドがインストールされなくて困った

plenvをhomebrewでインストールしたから?

  1. 新しいユーザー作成
  2. gitでplenvインストール
  3. Web::Scraperインストール

やはりscraperコマンド使えない...。

$ find ~/ -name scraper
.cpanm/work/1437464088.4723/Web-Scraper-0.38/bin/scraper

ソースはあるようなのだが...。しかたがないので手動で設置。

scraper コマンドを作成

~/.plenv/shims に他のコマンドが置いてあるようなので、ここに設置。

$ cd ~/.plenv/shims
$ touch scraper
$ chmod 755 ./scraper

catしたscraperコマンドのコード

先程作ったファイル(コマンド)を編集する。1行目は #!/usr/bin/env perl に変更すること。

#!/usr/bin/perl
use strict;
use warnings;

use Config;
use Term::ReadLine;
use Data::Dumper;
use HTML::Entities;
use URI;
use Web::Scraper;
use YAML;

sub WARN() {
    return sub {
        warn $_->isTextNode
            ? HTML::Entities::encode($_->as_XML, q("'<>&))
            : $_->as_HTML(q('"&<>), "", {});
    };
}

my $print = sub {
    if ($ENV{PAGER}) {
        open my $pager, "|$ENV{PAGER}";
        print $pager @_;
    } else {
        print @_;

    }
};

my(@stack, $source);

my $stuff   = process_args($ARGV[0])
    or die "Usage: scraper [URI-or-filename]\n";

my $term    = Term::ReadLine->new("Web::Scraper");
my $scraper = scraper { run_loop($_[0], $term) };
   $scraper->user_agent->env_proxy;

my $result  = $scraper->scrape($stuff);

sub process_args {
    my $uri = shift;

    if (!-t STDIN and my $content = join "", <STDIN>) {
        $source = [ 'stdin' ];
        return \$content;
    } elsif ($uri && $uri =~ m!^https?://!) {
        $source = [ "URI", $uri ];
        return URI->new($uri);
    } elsif ($uri && -e $uri) {
        $source = [ 'file', $uri ];
        open my $fh, "<", $uri or die "$uri: $!";
        return join "", <$fh>;
    }

    return;
}

sub run_loop {
    my($tree, $term) = @_;
    while (defined(my $in = $term->readline("scraper> "))) {
        if ($in eq 'd') {
            $Data::Dumper::Indent = 1;
            warn Dumper result;
        } elsif ($in eq 'y') {
            warn Dump result;
        } elsif ($in eq 's') {
            $print->($tree->as_HTML(q('"&<>), "  ", {}));
        } elsif ($in eq 'q') {
            return;
        } elsif ($in eq 'c') {
            print generate_code($source, $stack[-1]);
        } elsif ($in =~ /^c\s+all\s*$/) {
            print generate_code($source, @stack);
        } else {
            my $res = eval $in;
            warn $@ if $@;
            push @stack, $in unless $@;
        }
    }
}

sub generate_code {
    my($source, @stack) = @_;

    my $code_stack = join "\n", map { "    $_" . (/;$/ ? "" : ";") } @stack;
    my($var, $stuff) =
        $source->[0] eq 'stdin'         ? ('$input', '\join "", <STDIN>') :
        $source->[0] eq 'URI'           ? ('$uri',   qq(URI->new("$source->[1]"))) :
        $source->[0] eq 'file'          ? ('$file',  qq(\\do { my \$file = "$source->[1]"; open my \$fh, \$file or die "\$file: \$!"; join '', <\$fh> })) :
                                          '...';

return <<CODE;
#!$Config{perlpath}
use strict;
use Web::Scraper;
use URI;

my $var = $stuff;
my \$scraper = scraper {
$code_stack
};
my \$result = \$scraper->scrape($var);
CODE

}

とりあえず scraperコマンドが使えるようになった。

カテゴリー
プログラミング 勉強会

FirefoxOSアプリハンズオンに行ってきた

Firefox OS アプリハンズオン supported by Gunma.web

2015-03-28(土)13:00 - 18:00
ハッシュタグ: #fxos #gunmaweb

今回はGunma.web初のスピンオフ勉強会となる、FirefoxOSのハンズオンに参加しました。

FirefoxOSで作るアプリはHTMLとJavaScriptで出来ている ≒ Webサイトという事で、開発に参加する敷居がとても低いのが特徴です。

アプリ作成に関して言えばネイティブコードでは作れないという、思い切りの良さ。JavaScriptで動いていても実行速度は早いというのも見逃せません。

また、ブラウザ(FireFox)さえあればすぐに開発が始められるという気軽さが非常に特徴的でした。

シミュレーターでの実行も早くてストレスフリー。作ったら動かして、変更したら動かして、、、というのもサクサクで快適。

実機

IMG_2260

IMG_2261

全員に貸出されました。環境によっては多少トラブルがあったようですが、自分の環境ではUSBケーブルで繋ぐだけですぐに使えました。

FirefoxOSのアプリは自分で使いたいものをサクッと作ったり、業務で必要な物を会社内でちょちょいと作ったり、小回りの効いたアプリ開発が出来そうです。

また、特別な開発環境が必要なわけではないので気軽にアプリ開発できるのも魅力です。あのサービス、アプリ化すっかな。

おみやげ

OPEN WEB BOARD
OPEN WEB BOARDを希望者全員に配布して頂きました!

ノベルティグッズ
Mozilla様とCodeIQ様からノベルティグッズも!

最後に

今回の勉強会は前回のGunma.webにお越しいただいた@ic_lifewood氏の提案で実現したものです。感謝。

また、遠方からMozilla、KDDIの関係者の方にお越し頂き、大変充実した勉強会になりました。改めてお礼申し上げます。ありがとうございました!

新たな方と交流できたり、新しい事にチャレンジできたり、大変充実した会でした!

IMG_2262

カテゴリー
jQuery 勉強会 雑記

Gunma.web#17 で話しました

2014/9/20に開催されたGunma.web #17で話してきました。

発表スライド

Vimの話 from Munenori Sugimura

コードはgithubに置いてあります。

jquery-vimize

webサイトをvim化するjQueryプラグインです。一応このブログに導入しているので動作確認出来ます。

コマンドはこの辺に書いてあります。

書いたキッカケ

もともと自分が書いたコードがあったのですが、ページトップに移動するコマンドがgだったのをとある方に「ggじゃないんですか?」って言われたのでちゃんと動くように書いてみました。

補足など

初めてのjQueryプラグイン作成なので勢いで書いた感じになっています。作法とかイマイチ分からないのですが、動けばいっか的な感じです。LTネタ思いついた時には1週間前だったのもあってあまり調べていません。

  • 移動はともかく / (or ?) で検索出来るの便利
  • 向いているサイトとあまり向かないサイトが有る
  • :cmdとgコマンドが使えるとやっぱりvimっぽい(気がする)

:cmdはスキなコマンドを追加できるようになっています。

今後

とりあえず :cmd を入力する時に画面には何も表示されないのでそれを直したいですね。あと、ブログのprev next に何かコマンド割り当てたい。

疑問

ところで、JavaScriptで enterキーの動作を他のキーで出来るように書けるのかな? oキーでリンク開けるようにしたい。

よく考えるとスマホファーストの昨今、時代遅れな感も...