SlideShare uma empresa Scribd logo
1 de 13
Baixar para ler offline
「画像ダウンローダー」を作る際に
  気をつけたいいくつかのこと

     2012-09-28 LT-thon@YAPC::Asia2012

               発表者:@ turugina
What is 「画像ダウンローダー」
●   NOT 「画像検索システム等用のクローラー」
What is 「画像ダウンローダー」
●   BUT 個人で愉しむために画像をダウンロードする
    ツール
    –   ex) 某巨大掲示板の二次元画像板のスレから
code
●   画像ダウンロードツールを作る過程で色々な知
    識・技術が身に付く
    –   HTTP 関連 (LWP::UserAgent, HTTP::Lite,...)
    –   ファイル関連 (File::Spec, Path::Class, ...)
    –   コマンドラインオプション解析 (Getopt::*,...)
    –   永続化 / データベース (Tie::Persistent, Storable,
        DBI, DBD::SQLite, …)
    –   並行処理 / 排他制御 (threads, Coro, AnyEvent)
Agenda
●   ① 汝、紳士たれ
●   ② 画像だと思ったら HTML だった、しにたい
●   ③ \ Be on your guard! /
●   ④ 貪欲に、貪欲に
●   その他細々したもの
① 汝、紳士たれ
●   ダウンロード先のサイトに迷惑をかけない
    –   同じ URL から何度もダウンロードしない
        ●   → Tie::Persistent によるなんちゃって KVS でダウンロード
            済み URL を永続化
        ●   → でも量が増えてきたら素直に DBI/DBD::SQLite
    –   コネクションをキャッシュする
        ●   → $ua->conn_cache(
            LWP::ConnCache->new ( total_capacity => undef ) );
    –   できれば1サイト 1 コネクションで済ませる ( 古い? )
② 画像だと思ったら(以下略
●   ヘッダをチェックする
    –   my $res = $ua->mirror($url, $file);
        unlink($file) if $res->header('Content-Type') =~
        m/text/i;
●   たまに image/jpeg とか言いつつ HTML を返し
    てくる奴が ...
    –   → Imager に食わせてエラーになったら消すとか
③Be on your guard!
●   見たくない画像から身を守る
    –   サイトのブラックリスト( Og**sh とか Ro**en とか )
    –   もしダウンロードしてしまったら
        ●   →URL とファイルのハッシュ (md5/SHA1 等 ) をブラックリス
            トに登録して削除
             –   Digest::MD5 、 Digest::SHA1
    –   ダウンロード前に URL チェック、ダウンロード後にハッ
        シュチェックで 2 重のガード
④ 欲望に忠実に貪欲に、貪欲に
●   並行処理
    –   fork() ...?
    –   use threads; use Thread::Queue;
         ●   固定数のワーカスレッドを立てて Queue から URL を流し込
             む
    –   use POE; …?
    –   use Coro; use Coro::LWP;
    –   use AnyEvent; use AnyEvent::HTTP;
        use Coro; use Coro::AnyEvent;
細々
●   use Clipboard; で「画像 URL を含むテキストを
    コピー&ペースト」の「ペースト」の部分を自動化
●   コマンドラインオプションを付けたい→ Getopt::*
●   win32perl ではファイル操作時の文字コードに注
    意
    –   「 . ニーソ フォルダを作ってその中に画像をダウンロー
        ドしようとしたらカレントフォルダに変な名前のファイル
        が!!」
おまけ
●   use threads; 版と同じ処理内容のスクリプトを
    Python で書いてみたら
    –   コードは若干短く
    –   処理速度は若干速く
    –

    –

    –   なりました ...orz
        ●   くやしい!でも ..( ビクンビクン
ご清聴ありがとうございました

Mais conteúdo relacionado

Mais procurados

RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成弘毅 露崎
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤTakashi Hoshino
 
OCaml でデータ分析
OCaml でデータ分析OCaml でデータ分析
OCaml でデータ分析Akinori Abe
 
My misstake on Ansible’s lineinfile module
My misstake on Ansible’s lineinfile moduleMy misstake on Ansible’s lineinfile module
My misstake on Ansible’s lineinfile moduleYukiya Hayashi
 
PHP matsuri 2013 Windows Azure Storage SDK for PHP
PHP matsuri 2013 Windows Azure Storage SDK for PHPPHP matsuri 2013 Windows Azure Storage SDK for PHP
PHP matsuri 2013 Windows Azure Storage SDK for PHPTakeshi Sakurai
 
エコなWebサーバー
エコなWebサーバーエコなWebサーバー
エコなWebサーバーemasaka
 
Nuxt.js + microCMS + netlify
Nuxt.js + microCMS + netlifyNuxt.js + microCMS + netlify
Nuxt.js + microCMS + netlifyogawatti
 
ファイルサーバ構築
ファイルサーバ構築ファイルサーバ構築
ファイルサーバ構築Takashi Noboru
 
分散データベース gun について調べた
分散データベース gun について調べた分散データベース gun について調べた
分散データベース gun について調べたkeisunagawa
 
CouchDB JP & BigCouch
CouchDB JP & BigCouchCouchDB JP & BigCouch
CouchDB JP & BigCouchYohei Sasaki
 
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計maebashi
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化についてAimingStudy
 
フレッシャーズのためのパケット解析入門
フレッシャーズのためのパケット解析入門フレッシャーズのためのパケット解析入門
フレッシャーズのためのパケット解析入門彰 村地
 
10分で分かるデータストレージ
10分で分かるデータストレージ10分で分かるデータストレージ
10分で分かるデータストレージTakashi Hoshino
 
データベースのお話
データベースのお話データベースのお話
データベースのお話Hidekazu Tanaka
 
Webサーバ構築で心がけるべき二つのこと
Webサーバ構築で心がけるべき二つのことWebサーバ構築で心がけるべき二つのこと
Webサーバ構築で心がけるべき二つのことTrinityT _
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?ogawatti
 

Mais procurados (20)

RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
 
Mysql casial01
Mysql casial01Mysql casial01
Mysql casial01
 
Openresty
OpenrestyOpenresty
Openresty
 
10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ10分で分かるLinuxブロックレイヤ
10分で分かるLinuxブロックレイヤ
 
OCaml でデータ分析
OCaml でデータ分析OCaml でデータ分析
OCaml でデータ分析
 
My misstake on Ansible’s lineinfile module
My misstake on Ansible’s lineinfile moduleMy misstake on Ansible’s lineinfile module
My misstake on Ansible’s lineinfile module
 
PHP matsuri 2013 Windows Azure Storage SDK for PHP
PHP matsuri 2013 Windows Azure Storage SDK for PHPPHP matsuri 2013 Windows Azure Storage SDK for PHP
PHP matsuri 2013 Windows Azure Storage SDK for PHP
 
エコなWebサーバー
エコなWebサーバーエコなWebサーバー
エコなWebサーバー
 
Nuxt.js + microCMS + netlify
Nuxt.js + microCMS + netlifyNuxt.js + microCMS + netlify
Nuxt.js + microCMS + netlify
 
ファイルサーバ構築
ファイルサーバ構築ファイルサーバ構築
ファイルサーバ構築
 
分散データベース gun について調べた
分散データベース gun について調べた分散データベース gun について調べた
分散データベース gun について調べた
 
CouchDB JP & BigCouch
CouchDB JP & BigCouchCouchDB JP & BigCouch
CouchDB JP & BigCouch
 
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化について
 
フレッシャーズのためのパケット解析入門
フレッシャーズのためのパケット解析入門フレッシャーズのためのパケット解析入門
フレッシャーズのためのパケット解析入門
 
10分で分かるデータストレージ
10分で分かるデータストレージ10分で分かるデータストレージ
10分で分かるデータストレージ
 
Sphinx/reST
Sphinx/reSTSphinx/reST
Sphinx/reST
 
データベースのお話
データベースのお話データベースのお話
データベースのお話
 
Webサーバ構築で心がけるべき二つのこと
Webサーバ構築で心がけるべき二つのことWebサーバ構築で心がけるべき二つのこと
Webサーバ構築で心がけるべき二つのこと
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?
 

Semelhante a Yapcasia2012 ltthon

JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)l_b__
 
OpenNebula on Ubuntu
OpenNebula on UbuntuOpenNebula on Ubuntu
OpenNebula on Ubuntuautumnalsky
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例maebashi
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門hiro nemu
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1Ryosuke IWANAGA
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.jsishiki-takai
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門sandai
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルMasahito Zembutsu
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドToru Tamaki
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜Taro Matsuzawa
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成Izumi Tsutsui
 
20121115 fukuoka sublime0_kuroneko
20121115 fukuoka sublime0_kuroneko20121115 fukuoka sublime0_kuroneko
20121115 fukuoka sublime0_kuronekoKohki Nakashima
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む2bo 2bo
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入Yu Nobuoka
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門じゅん なかざ
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Etsuji Nakai
 
LingrBotを作ってみた/ ownCloud+Andoroid+Picasa+Flickr連携/Chromecast をLinuxで遊ぶ
LingrBotを作ってみた/ ownCloud+Andoroid+Picasa+Flickr連携/Chromecast をLinuxで遊ぶLingrBotを作ってみた/ ownCloud+Andoroid+Picasa+Flickr連携/Chromecast をLinuxで遊ぶ
LingrBotを作ってみた/ ownCloud+Andoroid+Picasa+Flickr連携/Chromecast をLinuxで遊ぶKenichiro MATOHARA
 
DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築Yoshihiro Mizoguchi
 

Semelhante a Yapcasia2012 ltthon (20)

JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)
 
OpenNebula on Ubuntu
OpenNebula on UbuntuOpenNebula on Ubuntu
OpenNebula on Ubuntu
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
 
たのしいNode.js
たのしいNode.jsたのしいNode.js
たのしいNode.js
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
 
20121115 fukuoka sublime0_kuroneko
20121115 fukuoka sublime0_kuroneko20121115 fukuoka sublime0_kuroneko
20121115 fukuoka sublime0_kuroneko
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
WindowsでMySQL入門
WindowsでMySQL入門WindowsでMySQL入門
WindowsでMySQL入門
 
PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門PHP開発者のためのNoSQL入門
PHP開発者のためのNoSQL入門
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
 
LingrBotを作ってみた/ ownCloud+Andoroid+Picasa+Flickr連携/Chromecast をLinuxで遊ぶ
LingrBotを作ってみた/ ownCloud+Andoroid+Picasa+Flickr連携/Chromecast をLinuxで遊ぶLingrBotを作ってみた/ ownCloud+Andoroid+Picasa+Flickr連携/Chromecast をLinuxで遊ぶ
LingrBotを作ってみた/ ownCloud+Andoroid+Picasa+Flickr連携/Chromecast をLinuxで遊ぶ
 
DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築
 

Último

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 

Último (9)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 

Yapcasia2012 ltthon

  • 1. 「画像ダウンローダー」を作る際に 気をつけたいいくつかのこと 2012-09-28 LT-thon@YAPC::Asia2012 発表者:@ turugina
  • 2. What is 「画像ダウンローダー」 ● NOT 「画像検索システム等用のクローラー」
  • 3. What is 「画像ダウンローダー」 ● BUT 個人で愉しむために画像をダウンロードする ツール – ex) 某巨大掲示板の二次元画像板のスレから
  • 5. 画像ダウンロードツールを作る過程で色々な知 識・技術が身に付く – HTTP 関連 (LWP::UserAgent, HTTP::Lite,...) – ファイル関連 (File::Spec, Path::Class, ...) – コマンドラインオプション解析 (Getopt::*,...) – 永続化 / データベース (Tie::Persistent, Storable, DBI, DBD::SQLite, …) – 並行処理 / 排他制御 (threads, Coro, AnyEvent)
  • 6. Agenda ● ① 汝、紳士たれ ● ② 画像だと思ったら HTML だった、しにたい ● ③ \ Be on your guard! / ● ④ 貪欲に、貪欲に ● その他細々したもの
  • 7. ① 汝、紳士たれ ● ダウンロード先のサイトに迷惑をかけない – 同じ URL から何度もダウンロードしない ● → Tie::Persistent によるなんちゃって KVS でダウンロード 済み URL を永続化 ● → でも量が増えてきたら素直に DBI/DBD::SQLite – コネクションをキャッシュする ● → $ua->conn_cache( LWP::ConnCache->new ( total_capacity => undef ) ); – できれば1サイト 1 コネクションで済ませる ( 古い? )
  • 8. ② 画像だと思ったら(以下略 ● ヘッダをチェックする – my $res = $ua->mirror($url, $file); unlink($file) if $res->header('Content-Type') =~ m/text/i; ● たまに image/jpeg とか言いつつ HTML を返し てくる奴が ... – → Imager に食わせてエラーになったら消すとか
  • 9. ③Be on your guard! ● 見たくない画像から身を守る – サイトのブラックリスト( Og**sh とか Ro**en とか ) – もしダウンロードしてしまったら ● →URL とファイルのハッシュ (md5/SHA1 等 ) をブラックリス トに登録して削除 – Digest::MD5 、 Digest::SHA1 – ダウンロード前に URL チェック、ダウンロード後にハッ シュチェックで 2 重のガード
  • 10. ④ 欲望に忠実に貪欲に、貪欲に ● 並行処理 – fork() ...? – use threads; use Thread::Queue; ● 固定数のワーカスレッドを立てて Queue から URL を流し込 む – use POE; …? – use Coro; use Coro::LWP; – use AnyEvent; use AnyEvent::HTTP; use Coro; use Coro::AnyEvent;
  • 11. 細々 ● use Clipboard; で「画像 URL を含むテキストを コピー&ペースト」の「ペースト」の部分を自動化 ● コマンドラインオプションを付けたい→ Getopt::* ● win32perl ではファイル操作時の文字コードに注 意 – 「 . ニーソ フォルダを作ってその中に画像をダウンロー ドしようとしたらカレントフォルダに変な名前のファイル が!!」
  • 12. おまけ ● use threads; 版と同じ処理内容のスクリプトを Python で書いてみたら – コードは若干短く – 処理速度は若干速く – – – なりました ...orz ● くやしい!でも ..( ビクンビクン