SlideShare ist ein Scribd-Unternehmen logo
1 von 1
Downloaden Sie, um offline zu lesen
Hachioji.pm #5
「最近いいなと思ったもの」 @norry_gogo

前回のHachioji.pmで「今度のGWに作りたいと思っているもの」として「TwitterのリストのTL内に含まれるURLを自動的にRead it later
に流し込む」というのを課題にしてみました
CPANモジュールガイドを参考に、部品を組み合わせるように手軽に「動くもの」が作れる感覚を楽しめました!
初めてのPerl第5版で、言語仕様や色々な書き方やショーカット等のPerlっぽさを知り、CPANモジュールガイドで部品を使って組み立てる
そんなこんなしている内に「あ、そういうことね」とか「あ、こうも書けるのか」とか、ジワジワと手応えを感じてきます

この2つのバイブルを使って脱ビギナーっていうのが、自分の経験からして良い感じと思いました!    (と、シレっと脱ビギナー宣言w)
引き続きの課題は「目指せ中級者!」として、続・初めてのPerlやモダンPerl入門等を参考にして行きたいです!

CPANモジュールガイド++
初めてのPerl第5版++


※下記は今回の課題での成果物で、cronで定期実行させてます
#!/usr/bin/env perl                                                        sub get_list_statuses {
                                                                             my ($list, $page) = @_;
use 5.010;                                                                   my $statuses;
use strict;                                                                  my $success = 1;
use warnings;                                                                eval {
use Net::Twitter;                                                                $statuses = $nt->list_statuses({
use URI::Find;                                                                       user => $list->{user},
use Web::Scraper;                                                                    list_id => $list->{list_id},
use LWP::UserAgent;                                                                  per_page => 200,
use YAML;                                                                            page => $page,
use Scalar::Util 'blessed';                                                          since_id => $list->{since_id}
use Encode;                                                                      });
                                                                             };
my $config_uri ='/home/norry/hachioji.pm/5/config.yaml';                     if (my $err = $@) {
my $config = YAML::LoadFile($config_uri);                                        die $@ unless blessed $err && $err->isa('Net::Twitter::Error');
# ---                                                                            $success = undef;
# lists:                                                                     }
# - list_id: 25141045                                                        return ($statuses, $success);
# list_name: perl                                                          }
# since_id: 74264112124801024
# user: norry_gogo                                                         sub find_uris_from {
# read_it_later:                                                             my $text = shift;
# apikey: **********                                                         state @uris; @uris = ();
# password: ********                                                         state $finder = URI::Find->new( sub {
# username: ********                                                             my ($uri, $orig_uri) = @_;
                                                                                 push @uris, $orig_uri;
my $nt = Net::Twitter->new(                                                      return $orig_uri;
   traits       => [qw/API::REST API::Lists/],                               });
);                                                                           $finder->find($text);
my $read_it_later = URI->new('https://readitlaterlist.com/v2/add');          return @uris;
my $ua = LWP::UserAgent->new;                                              }

for my $list ( @{$config->{lists}} ) {                                     sub expand_uri {
   my $page = 1;                                                             my $uri = shift;
   my $start_since_id = $list->{since_id};                                   my $res = $ua->head($uri);
   my $new_since_id = $start_since_id;                                       return undef unless $res->is_success;
  LOOP_PAGE:                                                                 return $res->request->uri;
   while (1) {                                                             }
      my ($statuses, $success) = get_list_statuses($list, $page);
      $new_since_id = $start_since_id unless $success;                     sub get_html_title {
      last LOOP_PAGE unless @$statuses;                                      my $uri = shift;
      for my $status (reverse @$statuses) {                                  state $scraper = scraper {
         my @uris = find_uris_from($status->{text});                            process 'title', 'title' => 'TEXT';
         for my $uri (@uris) {                                               };
            my $expand_uri = expand_uri($uri);                               my $html;
            next unless $expand_uri;                                         eval {
            my $html_title = get_html_title($expand_uri);                       $html = $scraper->scrape(URI->new($uri));
            next unless $html_title;                                         };
            $read_it_later->query_form(                                      return undef if $@;
                apikey => $config->{read_it_later}{apikey},                  return "-- No title --" unless $html->{title};
                username => $config->{read_it_later}{username},              return $html->{title};
                password => $config->{read_it_later}{password},            }
                url     => $expand_uri,
                title => sprintf "[TW]%s@%s / %sn",
                               $list->{list_name},
                               $status->{user}{screen_name},
                               $html_title,
            );                                                             感想:
            my $res;                                                       ・良い点
            eval {                                                          →自動的に流し込んでおいてくれるのは気持ち良い
                $res = $ua->head("$read_it_later");
            };                                                             ・悪い点
            next if $@;                                                     →リストの追加等が設定ファイルへの追記という手作業になる
            if ($res->is_success) {                                         →リスト上のURLを無条件に流し込むので、情報源として有用でないデータ
                printf "[TW]%s@%s / %s (%s)n",                              を削除するコストの方が大きいという本末転倒な時もある
                     $list->{list_name},
                     $status->{user}{screen_name},                         ・課題
                     encode('utf-8', $html_title),                          →ロケタッチやInstagram等、情報集めとしての目的とは外れるものをスル
                     $expand_uri;                                            ーできる様にしたい
            }                                                               →あるいは…やっぱり、人力での選別を挟みたい
         }
         $new_since_id = $status->{id} if $new_since_id < $status->{id};   と、言うことで。。。
      }                                                                    自動で流し込んでくれるが実用的ではない…という結果↓↓↓
      $page++;
   }                                                                       このままではあまりにもアレ過ぎるので、
   $list->{since_id} = $new_since_id;                                      TL上にURLの展開情報が出てワンボタンでAPI通信してくれるようなオレオレ
}                                                                          Twitterクライアントを作りたい!っていう課題に発展させようと思います!

YAML::DumpFile($config_uri, $config);                                      やってみて見えること、これとイタチゴッコしていきますw

Weitere ähnliche Inhalte

Was ist angesagt?

Drupal8 DBに保存して読み込む
Drupal8 DBに保存して読み込むDrupal8 DBに保存して読み込む
Drupal8 DBに保存して読み込むiPride Co., Ltd.
 
Wb osaka 20120623
Wb osaka 20120623Wb osaka 20120623
Wb osaka 20120623Miho Ishida
 
J query element.key
J query element.keyJ query element.key
J query element.keysayoko miura
 
2012 keynote-2
2012 keynote-22012 keynote-2
2012 keynote-2kmiyako
 
Repository pattern in swift
Repository pattern in swiftRepository pattern in swift
Repository pattern in swiftnaoty_bot
 
PHPerのためのSwift入門
PHPerのためのSwift入門PHPerのためのSwift入門
PHPerのためのSwift入門Tomoki Hasegawa
 
大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向azuma satoshi
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~leverages_event
 
PHP classの教室
PHP classの教室PHP classの教室
PHP classの教室Yusuke Ando
 
Zend Db Table拡張説明資料
Zend Db Table拡張説明資料Zend Db Table拡張説明資料
Zend Db Table拡張説明資料co-hey japan
 
CodeIgniterのページングに関して。
CodeIgniterのページングに関して。CodeIgniterのページングに関して。
CodeIgniterのページングに関して。Takatsugu Ishikawa
 
Start printf 6_takarakasai
Start printf 6_takarakasaiStart printf 6_takarakasai
Start printf 6_takarakasaitakara kasai
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック良太 増子
 
Developments in The Qt WebKit Integration
Developments in The Qt WebKit IntegrationDevelopments in The Qt WebKit Integration
Developments in The Qt WebKit Integrationaccount inactive
 
Gen-Template-for-Perl
Gen-Template-for-PerlGen-Template-for-Perl
Gen-Template-for-Perlnasneg
 

Was ist angesagt? (19)

jQuery勉強会#2
jQuery勉強会#2jQuery勉強会#2
jQuery勉強会#2
 
Drupal8 DBに保存して読み込む
Drupal8 DBに保存して読み込むDrupal8 DBに保存して読み込む
Drupal8 DBに保存して読み込む
 
Wb osaka 20120623
Wb osaka 20120623Wb osaka 20120623
Wb osaka 20120623
 
J query element.key
J query element.keyJ query element.key
J query element.key
 
2012 keynote-2
2012 keynote-22012 keynote-2
2012 keynote-2
 
Repository pattern in swift
Repository pattern in swiftRepository pattern in swift
Repository pattern in swift
 
PHPerのためのSwift入門
PHPerのためのSwift入門PHPerのためのSwift入門
PHPerのためのSwift入門
 
大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向大ざっぱにオブジェクト指向
大ざっぱにオブジェクト指向
 
test
testtest
test
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
 
PHP classの教室
PHP classの教室PHP classの教室
PHP classの教室
 
Zend Db Table拡張説明資料
Zend Db Table拡張説明資料Zend Db Table拡張説明資料
Zend Db Table拡張説明資料
 
Okinawapm#3
Okinawapm#3Okinawapm#3
Okinawapm#3
 
Ci tutorial
Ci tutorialCi tutorial
Ci tutorial
 
CodeIgniterのページングに関して。
CodeIgniterのページングに関して。CodeIgniterのページングに関して。
CodeIgniterのページングに関して。
 
Start printf 6_takarakasai
Start printf 6_takarakasaiStart printf 6_takarakasai
Start printf 6_takarakasai
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック
 
Developments in The Qt WebKit Integration
Developments in The Qt WebKit IntegrationDevelopments in The Qt WebKit Integration
Developments in The Qt WebKit Integration
 
Gen-Template-for-Perl
Gen-Template-for-PerlGen-Template-for-Perl
Gen-Template-for-Perl
 

Andere mochten auch

Andere mochten auch (20)

Artes no enem 2009 prova 01
Artes no enem 2009 prova 01Artes no enem 2009 prova 01
Artes no enem 2009 prova 01
 
Foundup
FoundupFoundup
Foundup
 
Machado de Assis
Machado de AssisMachado de Assis
Machado de Assis
 
Niigem 9
Niigem 9Niigem 9
Niigem 9
 
Test document
Test documentTest document
Test document
 
Chicago tribune 10-06-03
Chicago tribune 10-06-03Chicago tribune 10-06-03
Chicago tribune 10-06-03
 
Presentation1
Presentation1Presentation1
Presentation1
 
Vem comigo nesta viagem!
Vem comigo nesta viagem!Vem comigo nesta viagem!
Vem comigo nesta viagem!
 
Meireles, Vinci, C. Bach, por uma interpretação vocal
Meireles, Vinci, C. Bach, por uma interpretação vocalMeireles, Vinci, C. Bach, por uma interpretação vocal
Meireles, Vinci, C. Bach, por uma interpretação vocal
 
Práctica calificada ciencias
Práctica calificada cienciasPráctica calificada ciencias
Práctica calificada ciencias
 
Motivacao Palestra
Motivacao PalestraMotivacao Palestra
Motivacao Palestra
 
Apocrifa epistola lui ieremia
Apocrifa epistola lui ieremiaApocrifa epistola lui ieremia
Apocrifa epistola lui ieremia
 
Windows 7
Windows 7Windows 7
Windows 7
 
Abilità Tecnologia
Abilità TecnologiaAbilità Tecnologia
Abilità Tecnologia
 
Practica uno
Practica unoPractica uno
Practica uno
 
Trafico de animais rodrigo-kayn+ú-rafael-henrique
Trafico de animais rodrigo-kayn+ú-rafael-henriqueTrafico de animais rodrigo-kayn+ú-rafael-henrique
Trafico de animais rodrigo-kayn+ú-rafael-henrique
 
Pres
PresPres
Pres
 
Women with low-energy_fracture_should_be_investiga
Women with low-energy_fracture_should_be_investigaWomen with low-energy_fracture_should_be_investiga
Women with low-energy_fracture_should_be_investiga
 
Musculos
MusculosMusculos
Musculos
 
What i learned in caribbean civ
What i learned in caribbean civWhat i learned in caribbean civ
What i learned in caribbean civ
 

Ähnlich wie Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]

WordPress のキャッシュ機構
WordPress のキャッシュ機構WordPress のキャッシュ機構
WordPress のキャッシュ機構katanyan
 
MTで学ぶセキュアプログラミング@MT Tokyo
MTで学ぶセキュアプログラミング@MT TokyoMTで学ぶセキュアプログラミング@MT Tokyo
MTで学ぶセキュアプログラミング@MT Tokyo純生 野田
 
PHP Object Injection入門
PHP Object Injection入門PHP Object Injection入門
PHP Object Injection入門Yu Iwama
 
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~Akabane Hiroyuki
 
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。Hishikawa Takuro
 
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのかSecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのかHiroshi Tokumaru
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発Shinzo SAITO
 
Perl と人生(Perl and Life)
Perl と人生(Perl and Life)Perl と人生(Perl and Life)
Perl と人生(Perl and Life)Mayumi Ishikawa
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話infinite_loop
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかShohei Okada
 
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
最近つくったrecent_zombies -  Perlで始めるTwitterタイムライン分析最近つくったrecent_zombies -  Perlで始めるTwitterタイムライン分析
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析Masahiro NAKAYAMA
 
"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6risou
 
Livesense tech night immutable-js at a glance
Livesense tech night   immutable-js at a glanceLivesense tech night   immutable-js at a glance
Livesense tech night immutable-js at a glanceYuta Shimakawa
 

Ähnlich wie Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの] (16)

WordPress のキャッシュ機構
WordPress のキャッシュ機構WordPress のキャッシュ機構
WordPress のキャッシュ機構
 
MTで学ぶセキュアプログラミング@MT Tokyo
MTで学ぶセキュアプログラミング@MT TokyoMTで学ぶセキュアプログラミング@MT Tokyo
MTで学ぶセキュアプログラミング@MT Tokyo
 
PHP Object Injection入門
PHP Object Injection入門PHP Object Injection入門
PHP Object Injection入門
 
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
 
俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。俺のフックがこんなに簡単なわけがない。
俺のフックがこんなに簡単なわけがない。
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
 
Currying in perl
Currying in perlCurrying in perl
Currying in perl
 
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのかSecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
 
CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発CakePHP+Smartyハイブリッドによるラクラク開発
CakePHP+Smartyハイブリッドによるラクラク開発
 
Perl と人生(Perl and Life)
Perl と人生(Perl and Life)Perl と人生(Perl and Life)
Perl と人生(Perl and Life)
 
traitを使って楽したい話
traitを使って楽したい話traitを使って楽したい話
traitを使って楽したい話
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
 
Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料Yahoo!ボックスAPI Hackathon向け資料
Yahoo!ボックスAPI Hackathon向け資料
 
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
最近つくったrecent_zombies -  Perlで始めるTwitterタイムライン分析最近つくったrecent_zombies -  Perlで始めるTwitterタイムライン分析
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
 
"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6
 
Livesense tech night immutable-js at a glance
Livesense tech night   immutable-js at a glanceLivesense tech night   immutable-js at a glance
Livesense tech night immutable-js at a glance
 

Hachiojipm #5 LT資料 [テーマ:最近いいなと思ったもの]

  • 1. Hachioji.pm #5 「最近いいなと思ったもの」 @norry_gogo 前回のHachioji.pmで「今度のGWに作りたいと思っているもの」として「TwitterのリストのTL内に含まれるURLを自動的にRead it later に流し込む」というのを課題にしてみました CPANモジュールガイドを参考に、部品を組み合わせるように手軽に「動くもの」が作れる感覚を楽しめました! 初めてのPerl第5版で、言語仕様や色々な書き方やショーカット等のPerlっぽさを知り、CPANモジュールガイドで部品を使って組み立てる そんなこんなしている内に「あ、そういうことね」とか「あ、こうも書けるのか」とか、ジワジワと手応えを感じてきます この2つのバイブルを使って脱ビギナーっていうのが、自分の経験からして良い感じと思いました! (と、シレっと脱ビギナー宣言w) 引き続きの課題は「目指せ中級者!」として、続・初めてのPerlやモダンPerl入門等を参考にして行きたいです! CPANモジュールガイド++ 初めてのPerl第5版++ ※下記は今回の課題での成果物で、cronで定期実行させてます #!/usr/bin/env perl sub get_list_statuses { my ($list, $page) = @_; use 5.010; my $statuses; use strict; my $success = 1; use warnings; eval { use Net::Twitter; $statuses = $nt->list_statuses({ use URI::Find; user => $list->{user}, use Web::Scraper; list_id => $list->{list_id}, use LWP::UserAgent; per_page => 200, use YAML; page => $page, use Scalar::Util 'blessed'; since_id => $list->{since_id} use Encode; }); }; my $config_uri ='/home/norry/hachioji.pm/5/config.yaml'; if (my $err = $@) { my $config = YAML::LoadFile($config_uri); die $@ unless blessed $err && $err->isa('Net::Twitter::Error'); # --- $success = undef; # lists: } # - list_id: 25141045 return ($statuses, $success); # list_name: perl } # since_id: 74264112124801024 # user: norry_gogo sub find_uris_from { # read_it_later: my $text = shift; # apikey: ********** state @uris; @uris = (); # password: ******** state $finder = URI::Find->new( sub { # username: ******** my ($uri, $orig_uri) = @_; push @uris, $orig_uri; my $nt = Net::Twitter->new( return $orig_uri; traits => [qw/API::REST API::Lists/], }); ); $finder->find($text); my $read_it_later = URI->new('https://readitlaterlist.com/v2/add'); return @uris; my $ua = LWP::UserAgent->new; } for my $list ( @{$config->{lists}} ) { sub expand_uri { my $page = 1; my $uri = shift; my $start_since_id = $list->{since_id}; my $res = $ua->head($uri); my $new_since_id = $start_since_id; return undef unless $res->is_success; LOOP_PAGE: return $res->request->uri; while (1) { } my ($statuses, $success) = get_list_statuses($list, $page); $new_since_id = $start_since_id unless $success; sub get_html_title { last LOOP_PAGE unless @$statuses; my $uri = shift; for my $status (reverse @$statuses) { state $scraper = scraper { my @uris = find_uris_from($status->{text}); process 'title', 'title' => 'TEXT'; for my $uri (@uris) { }; my $expand_uri = expand_uri($uri); my $html; next unless $expand_uri; eval { my $html_title = get_html_title($expand_uri); $html = $scraper->scrape(URI->new($uri)); next unless $html_title; }; $read_it_later->query_form( return undef if $@; apikey => $config->{read_it_later}{apikey}, return "-- No title --" unless $html->{title}; username => $config->{read_it_later}{username}, return $html->{title}; password => $config->{read_it_later}{password}, } url => $expand_uri, title => sprintf "[TW]%s@%s / %sn", $list->{list_name}, $status->{user}{screen_name}, $html_title, ); 感想: my $res; ・良い点 eval {  →自動的に流し込んでおいてくれるのは気持ち良い $res = $ua->head("$read_it_later"); }; ・悪い点 next if $@;  →リストの追加等が設定ファイルへの追記という手作業になる if ($res->is_success) {  →リスト上のURLを無条件に流し込むので、情報源として有用でないデータ printf "[TW]%s@%s / %s (%s)n",   を削除するコストの方が大きいという本末転倒な時もある $list->{list_name}, $status->{user}{screen_name}, ・課題 encode('utf-8', $html_title),  →ロケタッチやInstagram等、情報集めとしての目的とは外れるものをスル $expand_uri;   ーできる様にしたい }  →あるいは…やっぱり、人力での選別を挟みたい } $new_since_id = $status->{id} if $new_since_id < $status->{id}; と、言うことで。。。 } 自動で流し込んでくれるが実用的ではない…という結果↓↓↓ $page++; } このままではあまりにもアレ過ぎるので、 $list->{since_id} = $new_since_id; TL上にURLの展開情報が出てワンボタンでAPI通信してくれるようなオレオレ } Twitterクライアントを作りたい!っていう課題に発展させようと思います! YAML::DumpFile($config_uri, $config); やってみて見えること、これとイタチゴッコしていきますw