tag:crieit.net,2005:https://crieit.net/tags/%E3%83%9E%E3%83%B3%E3%82%AC/feed 「マンガ」の記事 - Crieit Crieitでタグ「マンガ」に投稿された最近の記事 2022-09-25T11:27:24+09:00 https://crieit.net/tags/%E3%83%9E%E3%83%B3%E3%82%AC/feed tag:crieit.net,2005:PublicArticle/18294 2022-09-18T16:37:31+09:00 2022-09-25T11:27:24+09:00 https://crieit.net/posts/PHP-6326cabb4a630 なにも知らない PHP スクレイピング。マンガ カウンティング <h2 id="preface"><a href="#preface">preface</a></h2> <p>うっかり <a target="_blank" rel="nofollow noopener" href="https://github.com/kuz-sysadmin/ksphp-en/">1995 -2002 くらいまで</a>の<a href="https://crieit.net/posts/BBS-programming">掲示板</a> / <a target="_blank" rel="nofollow noopener" href="http://f16.aaacafe.ne.jp/~stwalker/">文化</a>に興味をもってしまった(スレッドフロート型掲示板という言葉が英語なのか日本語なのかという疑問がきっかけだった。)ことから Perl という古語を自習していて、並列して <a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/news/report/2015/12/1401">PHP</a> についてのことも知りたいとおもい( 2001 以降、perl + c 言語製 2 ちゃんねる から、PHP 5 製ふたばちゃんねるの<a target="_blank" rel="nofollow noopener" href="https://github.com/futoase/futaba-ng">ソースコード</a>からのフォークで <a target="_blank" rel="nofollow noopener" href="https://news.ycombinator.com/item?id=7639238">4 chan</a> 、<a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/2019_El_Paso_shooting">8 chan</a> と推移するため)、まずベーシックなスクレイピングするプログラムを書いてみる。</p> <p>Rf. <a target="_blank" rel="nofollow noopener" href="https://scrapbox.io/004040/はじめてのあやしいわーるど:システム">はじめてのあやしいわーるど:システム</a><br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/VVuPIOWj--s">【ゆっくりネット史解説】4スレ目~あやしいわーるど~</a><br /> くずはすくりぷと Rev.0.1 Preview 9 (2000.9.3)<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/7m3tu">https://rentry.co/7m3tu</a><br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/ukw3f/">https://rentry.co/ukw3f/</a><br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/ssno4">https://rentry.co/ssno4</a></p> <p>あめぞう歴史<br /> <a target="_blank" rel="nofollow noopener" href="http://history.amebbs.com/">http://history.amebbs.com/</a></p> <hr /> <p>PHP は、バージョンが違うとまるで別物のように思えるので、バージョンは 8 系とする。apache などの web サーバーは必要ない。</p> <p>要約すると、<br /> PHP scraping<br /> で検索すると表示されたページ。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.utakata.work/entry/php/webscraping-with-php-html-parser">https://www.utakata.work/entry/php/webscraping-with-php-html-parser</a><br /> ここに掲載しているコードをコピペで実行してみたら、理解できました。PHP 全く知らなかったですが。</p> <p>以下は、実は <a href="https://crieit.net/posts/Bank-6249a7b59dfd9">漫画Bank / La « mangabank.org » a disparu.</a> という記事(ない)からの続きになっています。</p> <h2 id="PHP 8 インストール for debian"><a href="#PHP+8+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB+for+debian">PHP 8 インストール for debian</a></h2> <pre><code>sudo apt install -y gnupg2 ca-certificates apt-transport-https software-properties-common lsb-release </code></pre> <pre><code>echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list </code></pre> <pre><code>wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add - </code></pre> <pre><code>sudo apt update </code></pre> <pre><code>sudo apt-get --no-install-recommends install php8 </code></pre> <p>とすることで、<a target="_blank" rel="nofollow noopener" href="https://ja.getdocs.org/how-to-install-php-8-1-and-set-up-a-local-development-environment-on-ubuntu-22-4?amp=1">apache 抜きで PHP8 がインストールされる</a>かもしれない。<br /> されないかもしれない。そこは追求する必要があって、まだこれで完璧というとこまで到達できない。バージョン管理の phpenv があるらしいのでいずれはそれで。</p> <p>パッケージマネージャーは、<a target="_blank" rel="nofollow noopener" href="https://ja.m.wikipedia.org/wiki/Composer">composer</a> というものがあるので、バージョン 2 系のものを使う。なぜなら、php-html-parser というモジュールを使いたいからで、composer2 では無事にインストールできたから。</p> <p>スクレイピングについては、色々と常識と非常識があって、それらは考慮したいが、知らない、知る前にやってしまう、やってしまった方がいいこともある。というスタンスで、できるだけ非常識にならないように、<a href="https://crieit.net/posts/4daedd75f0cec1b328d4e661d9337bd3">非常識のキョクホクのサイト</a>をスクレイピングしてみる。</p> <p>さて。</p> <p>composer 2 自体のインストールは、省略。これもまた、どうするのがベストかわからない。簡単な方法でできればよし。できなければ深掘りしていくことになるが、インストールはできないということはないはず。</p> <p>php-html-parser のインストール。https://github.com/paquettg/php-html-parser</p> <pre><code class="terminal">~$ composer require paquettg/php-html-parser </code></pre> <p>php-html-parser とは jQuery のような感じで、html を扱うものだと思う。<br /> そういうものは、いろんな言語であって、go だと <a target="_blank" rel="nofollow noopener" href="https://pkg.go.dev/github.com/PuerkitoBio/goquery">goquery</a>、Lua だと <a target="_blank" rel="nofollow noopener" href="https://craigbarnes.gitlab.io/lua-gumbo/#examples">lua-gumbo</a>、Nim だと <a target="_blank" rel="nofollow noopener" href="https://github.com/GULPF/nimquery">nimquery</a>、julia だと <a target="_blank" rel="nofollow noopener" href="https://github.com/JuliaWeb/Gumbo.jl">Gumbo</a> とかで、それぞれ自分自身を解説するとき jQuery みたいなやつだからーとだけかいてあることが多いために使い方を調べるのには苦労する。<br /> だけれども、一度どこかでその無限に時間を浪費するかのような道通ると、どこかで別のに出会っても、多少違うがほとんど同じという経験をする。おそらくそのために解説が省かれるのだと思う。だいたいおなじなので、どれかで分かりやすい解説が見つかれば一通りやってみるのがいい。</p> <p>つまりは、html のタグとかタグ内の要素だとかで検索してずるずるっと引っ張ってきて、タグで挟まれたテキストを抽出したり、タグを付け足したりということをするためのものだ。<br /> 全然わからなければ、正規表現のようなもので代用することもある程度可能なので、正規表現に無限に時間をかける道も通っておいたらいいのかもしれない。</p> <p>たとえば、ながいながい html ドキュメントに、</p> <pre><code class="html"><a href="http://example.com/">リンク</a> </code></pre> <p>みたいな箇所がたくさんあって、これらをずるっと全部抜き出して、配列に入れて吟味したい場合に<code>find("a")</code>みたいにして a タグのものすべてを簡単にひっぱってこれるといいね、ということを満たすもので、タグの中の attribute <code>href</code> で判別して、それが含まれるもの全部をひっぱってくるとかの用途に使う。</p> <pre><code class="php">$url_1 = "https://search.brave.com/search?q=kadokawa+川上"; $dom = new Dom(); $dom->loadFromUrl($url_1, $options); $element_a = $dom->find('a'); // a tag のリンクのエレメント全部を配列 $element_a に集める foreach($element_a as $index=>$link){ echo $index . ' ' . $link->{'href'} . "\n\n"; } </code></pre> <hr /> <p>だいたい用途が同じものの場合はドキュメントが省略されるので、だいたい同じもののドキュメントがあれば参考にする。<br /> <a target="_blank" rel="nofollow noopener" href="https://simplehtmldom.sourceforge.io/docs/1.9/manual/creating-dom-objects/">Simple HTML DOM documentation</a></p> <h2 id="scraping.php"><a href="#scraping.php">scraping.php</a></h2> <pre><code class="php"><?php require_once __DIR__ . '/vendor/autoload.php'; use PHPHtmlParser\Dom; use PHPHtmlParser\Options; $options = new Options(); $options->setEnforceEncoding('utf8'); $url1 = 'https://13dl.me/list/popular/'; function scrape($counter,$options,&$element_a){ $titles = array(); $next = ""; foreach($element_a as $line){ if(preg_match('/title/',"$line")) { $div = $line->find('div'); if(preg_match('/div/',"$div")) { $titles[] = $div->text; }else{ if(preg_match('/Next/',"$line")){ $attr = 'href'; $next = $line->$attr; } } }else{ ; } } unset($element_a); foreach($titles as $xxxx){ $counter ++; echo $counter . " title :" . $xxxx . "\n"; } unset($titles); return array("$next",$counter); } $counter = 0; while($url1 != ''){ if(preg_match('/http/',"$url1")) { try { $dom = new Dom(); $dom->loadFromUrl($url1, $options); $element_a = $dom->find('a'); list($url1,$counter) = scrape($counter,$options,$element_a); unset($element_a); unset($dom); } catch (Exception $e) { $e->getMessage(); } } else { die('stop:' . $url1); } } die('End.'); ?> </code></pre> tomato tag:crieit.net,2005:PublicArticle/18201 2022-05-30T01:28:42+09:00 2022-06-09T21:40:45+09:00 https://crieit.net/posts/why `_why` <p><a href="https://crieit.now.sh/upload_images/cdb45b7bb89840a83fd1f2cbd91754396294082c08e91.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cdb45b7bb89840a83fd1f2cbd91754396294082c08e91.jpg?mw=700" alt="http://poignant.guide/book/chapter-6.html" /></a><br /> Why’s (Poignant) Guide to Ruby <a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/Why's_%28poignant%29_Guide_to_Ruby">:wikipedia</a></p> <blockquote> <p>The book is unusual among programming books in that it includes much strange humor and many narrative side tracks which are sometimes completely unrelated to the topic. Many motifs have become inside jokes in the Ruby community, such as references to the words "chunky bacon". The book includes many characters which have become popular as well, particularly the cartoon foxes and Trady Blix, a large black feline friend of why's, who acts as a guide to the foxes (and occasionally teaches them some Ruby).</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/_why">https://rentry.co/_why</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://crieit-net.translate.goog/posts/why?_x_tr_sl=ja&_x_tr_tl=en&_x_tr_hl=ja&_x_tr_pto=wapp">translate to</a></p> <p>13年前に<a target="_blank" rel="nofollow noopener" href="http://www.slate.com/articles/technology/technology/2012/03/ruby_ruby_on_rails_and__why_the_disappearance_of_one_of_the_world_s_most_beloved_computer_programmers_.html">ネット自殺</a>した(ネットダンシャリ?自殺って言うと自殺みたいだけど、ネット上の自分の痕跡を消し去るということの比喩としてだから、生物的に死んだというわけじゃないけど、<a target="_blank" rel="nofollow noopener" href="https://www.urbandictionary.com/define.php?term=infosuicide">インターネット上での痕跡を自ら消し去ったこと</a>について "dead" とか "death" とか形容される。つまり、逆に言うとそれ以前がかなりアクティブでいきいきとして活動している感じが影響を与えていたアーティストであり)、Ruby プログラマー<code>_why</code> のことをたまたま昨日知って(xpath や html の parse について調べていて <a target="_blank" rel="nofollow noopener" href="https://github.com/hpricot/hpricot">Hpricot</a> というパーサーがあることに気がついて、なんだろう?と思ったから)、朝までずっと <code>_why</code> こと<strong>why the lucky stiff</strong> の事と、別件で片手キーボード( frogpad などの片手で全てタイピングできる仕様のキーボードについて)のことをネットで追っていて、起きてからずっと <code>_why</code> が書いた、彼が消し去った彼の本のコピー(再配布可能、商用利用可能のデータだから第三者によってサルベージされて公開されているが、あくまでも <code>_why</code> 自身は彼の過去ワークはすべて消し去って音信不通となっているような感じ) を読んでいた。<br /> 日陰にひきこもって、冷めたコーヒーを飲みつつ。</p> <p>とても暑いので、ネコも洗って乾かした。</p> <p><a href="https://crieit.now.sh/upload_images/2d71bdeb21c54ea55e353d52f24a5ea66298d97a21927.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2d71bdeb21c54ea55e353d52f24a5ea66298d97a21927.png?mw=700" alt="why the lucky stiff" /></a></p> <p><strong>why the lucky stiff</strong> については知らなかったが、知ったことでいろいろ謎だったことがつながった。</p> <p>ここ最近古本で取り寄せた、<a target="_blank" rel="nofollow noopener" href="https://www.oreilly.co.jp/community/blog/2009/04/unidentified-popular-figure.html">ぶ厚めのオライリーの Ruby 本について、なんでこんなインディーよりのグラフティみたいな挿絵が一枚入ってるのかな?と思ってたが、やはりそれはよく見るとwhy the lucky stiff の絵だった。</a><a target="_blank" rel="nofollow noopener" href="https://github.com/shoes/shoes-deprecated">shoes という GUI があるらしいこと</a>は知っていて、それも もともと <code>_why</code> によって作られていた。</p> <p>しかし、Ruby について全く知らなかったので、だいたい 2009 年くらいまでの本を取り寄せて Ruby 関係の本は 5 冊になったが、どれも「仕事で使える達人の」?とかいうのは範囲ではなく、選んだのは言語の詳細のリファレンスとか、サンプルのコード見て雰囲気だけつかめそうなものだったので逆に薄く濃いものだったためか、なんとなく言語周辺のカルチャーを感じさせるものだった。2009 年くらいのとしたのは、<a target="_blank" rel="nofollow noopener" href="https://jp.quora.com/naze-Ruby-ha-kihon-teki-ni-shi-nde-iru-node-shou-ka">その頃まではたぶんなんでも Ruby で、という流行りがあったのだろうと推定</a>していたからだけども、これも根拠なくそんな気がしたからというだけだ。</p> <p>(最初に、何も知らずに注文する本を選んで、<a target="_blank" rel="nofollow noopener" href="https://www.fukkan.com/fk/CartSearchDetail?i_no=68323271">恋するプログラム-Rubyでつくる人工無脳<br /> 秋山智俊</a> ... 2005 年 、<a target="_blank" rel="nofollow noopener" href="https://tatsu-zine.com/books/esoteric-language-programing-in-ruby">Ruby で作る奇妙なプログラミング言語 原 悠</a> ... 2008 年 、<a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/初めてのRuby-Yugui/dp/4873113679">初めての Ruby Yugui</a>(キリン) ... 2008 年初版2014年初版第十刷、という順で届いて、半年くらいたって、<a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/プログラミング言語-Ruby-まつもと-ゆきひろ/dp/4873113946">プログラミング言語 Ruby David Flanagan</a> ... 2009 年、一番最近で、<a target="_blank" rel="nofollow noopener" href="https://tatsu-zine.com/books/ruby-under-a-microscope-ja">Ruby のしくみ</a> 2014年 。そして、どれもちゃんと読んでないけど、どれも的確に良いと思う。注意散漫でチラチラとしか読めてないので、他の本のこともしらないけれど、これから Ruby ってどんな言語がゼロから知りたいって場合は、<a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/初めてのRuby-Yugui/dp/4873113679">初めての Ruby</a> が一冊あればいいんじゃないかと思っていた。 )</p> <p><code>_why</code> の本 <strong>Why’s (Poignant) Guide to Ruby</strong> <a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/Why's_%28poignant%29_Guide_to_Ruby">:wikipedia</a> は漫画で、面白そうな物語になっていて 2003 年から 2007 年あたりまでの作品のような感じ(全く確かではない)。ネット上にいろいろ ( 愛されて ) 保存 ( 保管 ) されてて、ダウンロード可能になっている。</p> <p><a target="_blank" rel="nofollow noopener" href="http://www.aoky.net/articles/why_poignant_guide_to_ruby/expansion-pak-1.html">本の中に登場</a>する <a target="_blank" rel="nofollow noopener" href="https://www.ruby-lang.org/en/news/2004/12/26/ruby-182-released/">Ruby の最新版は 1.8.2 だから ...</a></p> <p><strong>why the lucky stiff</strong> ( = <code>_why</code>) は、理由は不明だが 2009 年 8 月 19 日に、すべての著作を消したと言われていて、2009 年という時代背景を日本で起こったことでふりかえってみると、リーマンショックの約一年後で winny 騒動の裁判で</p> <blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://internet.watch.impress.co.jp/docs/news/320251.html">「 2009 年 10 月 8 日、大阪高等裁判所は、一審の京都地裁判決を破棄し、金子に無罪を言い渡した」</a></p> </blockquote> <p>文言は<a target="_blank" rel="nofollow noopener" href="https://ja.m.wikipedia.org/wiki/Winny事件">wikipedea :Winny 事件</a> から。</p> <p>インディーゲーム cave story</p> <blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://ja.m.wikipedia.org/wiki/洞窟物語">「 2008 年10月3日、ニンテンドー・オブ・アメリカのプレスリリース、および開発者のサイトにおいて、海外向けにWiiウェア版の配信が発表された(日本国内での配信は未定)。2010 年 9 月には、北米向けにニンテンドーDSiウェア版の配信が発表された。」</a></p> </blockquote> <p>などが、日本で起こったこと。マイケル・ジャクソンというスターが亡くなったのも 2009 年らしい。そんな 2009 年。</p> <p><strong>「ホワイの(感動的)Rubyガイド」青木靖 訳</strong><br /> <a target="_blank" rel="nofollow noopener" href="http://www.aoky.net/articles/why_poignant_guide_to_ruby/index.html">http://www.aoky.net/articles/why_poignant_guide_to_ruby/index.html</a></p> <p>epub download<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/vkr8s">https://rentry.co/vkr8s</a></p> <p>mislav によるサルベージ版 github<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/mislav/poignant-guide">https://github.com/mislav/poignant-guide</a></p> <blockquote> <p>On August 19, 2009 Why the Lucky Stiff removed every trace of his work from the Web, including this book: the Poignant Guide to Ruby.<br /> I've salvaged the book from the Internet archive and re-published it. The original work was under the Attribution-ShareAlike license.</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="http://poignant.guide/">http://poignant.guide/</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://archive.org/details/TheSoundtrackToWhyspoignantGuideToRuby/Chap2-ThisBookIsMadeofRabbitsAndLemonade.mp3">https://archive.org/details/TheSoundtrackToWhyspoignantGuideToRuby/Chap2-ThisBookIsMadeofRabbitsAndLemonade.mp3</a></p> <blockquote> <p>The soundtrack to "why's (poignant) guide to ruby" tutorial that was taken offline. The Internet Archive's version is still available here:<br /> <a target="_blank" rel="nofollow noopener" href="http://web.archive.org/web/20070704022347rn_1/poignantguide.net/ruby/">http://web.archive.org/web/20070704022347rn_1/poignantguide.net/ruby/</a><br /> <a href="https://crieit.now.sh/upload_images/8e1388e35819258a7f29f54bb60c0cb862995c2c4201f.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8e1388e35819258a7f29f54bb60c0cb862995c2c4201f.jpg?mw=700" alt="image" /></a></p> </blockquote> <p>実際おもしろい。少し自分をマイノリティーサイドに表現していて、完全に人と上手に付き合えないという性質を告白した上で、ストーリーが進んでいく。まだ最初の方しか読んでいないけど。一人もくもくと創造していく創作物という感じ。インディーズ game のような雰囲気で、一体どんなこと考えているんだ?という好奇心がうまれる。</p> <blockquote> <p>Chapter 2: Kon'nichi ha, Ruby -d: How Books Start<br /> One problem here. I don’t get along well with people. I don’t hold hands very well.</p> </blockquote> <p><a href="https://crieit.now.sh/upload_images/28be8148925559ca3b5fa789b28246a762942a15142b0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/28be8148925559ca3b5fa789b28246a762942a15142b0.png?mw=700" alt="chapter 3: Regular Expressions" /></a></p> <p>Ruby についてほとんど知らないので、ストーリーの流れでプログラムの言語を教えるという作りで(それは、<a target="_blank" rel="nofollow noopener" href="https://www.fukkan.com/fk/CartSearchDetail?i_no=68323271">恋するプログラム</a> もやや近い)、おそらくいちばん最初に読むべき内容であって、よく知らないと、その本自体の情報にいきつかないので、存在が見えないという幻の本かもしれないし、いまちょうどいい。絵がすごくかわいい。</p> <p>![Chapter5:The Mechanisms of Name-Calling]<a href="https://crieit.now.sh/upload_images/f494e07d32c008e3cc2788ef2c4141a16294074cea432.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f494e07d32c008e3cc2788ef2c4141a16294074cea432.gif?mw=700" alt="Chapter5:The Mechanisms of Name-Calling" /></a>(poignant.guide/images/my.daughters.organ-2.gif)</p> <p>紙の本も出ていて、<a target="_blank" rel="nofollow noopener" href="https://www.lulu.com/search?adult_audience_rating=00&page=1&pageSize=10&q=_why+the+lucky+stiff">Lulu からのオンデマンド</a>か、海外発送の古本かというところ。紙で欲しい。2 冊くらい。</p> <hr /> <p><a target="_blank" rel="nofollow noopener" href="https://www.smashingmagazine.com/2010/05/why-a-tale-of-a-post-modern-genius/">Diogo Terror may 15, 2010<br /> _Why: A Tale Of A Post-Modern Genius</a></p> <blockquote> <p>QUICK SUMMARY ↬ Why the Lucky Stiff was one of the brightest and most inspiring programmers in activity. He became famous through a series of blogs and through the incredible amount of open-source projects that he maintained over the course of more than seven years.</p> </blockquote> <hr /> <p><a target="_blank" rel="nofollow noopener" href="https://viewsourcecode.org/why/index.html">_why's Estate</a></p> <blockquote> <p>Hey, welcome to my collection of why the lucky stiff links. Everything _why has published on the internet should be accessible from here. It works sort of like a museum that sells maps. Many of his abandoned writings are mirrored locally here, and everything else is through external links. To download the Estate perhaps for local viewing, get why.zip (5.8 MB).</p> </blockquote> <hr /> <p><a target="_blank" rel="nofollow noopener" href="https://viewsourcecode.org/why/hacking/theLittleCodersPredicament.html">The Little Coder's Predicament</a> by why the lucky stiff june 10, 2003</p> <hr /> <p><strong>Why The Lucky Stiff Documentary</strong><br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/64anPPVUw5U">youtube</a></p> <blockquote> <p>This is the documentary about Why The Lucky Stiff, an artist and software innovator who disappeared from the Internet in 2009, taking down all his code and artwork ("infosuicide"). Ten years in the making, this documentary presents a portrayal of the artist, his influence and the possible reasons behind his disappearance.<br /> Years later, _why released more art and his own explanation for his disappearance, streamed live to printers connected to the Internet. A very innovative artist, he will be missed but his art lives on.<br /> <a href="https://crieit.now.sh/upload_images/b15dc4072f9409de3f764fbb67f3aeb86295716a1a548.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b15dc4072f9409de3f764fbb67f3aeb86295716a1a548.png?mw=700" alt="Why the lucky stiff documentary" /></a><br /> <a href="https://crieit.now.sh/upload_images/94ff30484741e50986ea1b96099faf25629571191b8e3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/94ff30484741e50986ea1b96099faf25629571191b8e3.png?mw=700" alt="Why the lucky stiff documentary" /></a></p> </blockquote> <p>このドキュメンタリーの冒頭とラストに出演しているのは Ruby の Nokogiri(XML / HTML パーサーで web<br /> スクレイピングに使われる) <a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/Nokogiri_%28software%29">:wikipedia</a> の作者 Aaron Patterson と思われる。Nokogiri と同等の用途に使われてい(た)るもののうちの一つ <a target="_blank" rel="nofollow noopener" href="https://github.com/hpricot/hpricot">Hpricot</a> のオリジネーターが <code>_why</code> だから対比としてキャスティングされているのかもしれない。</p> <hr /> <p>ところで、ほんとうにチャプター 8 "Heaven's Harp" は存在しないんだろうか?<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/mislav/poignant-guide">https://github.com/mislav/poignant-guide</a></p> <blockquote> <p>Chapter 8: Heaven's Harp was never recovered. I suspect _why started drawing it, but never finished or published.1</p> </blockquote> <hr /> <p>_why 's github mirror<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/whymirror/">https://github.com/whymirror/</a></p> <hr /> <p>Madison Ruby 2013 CLOSURE by Steve Klabnik<br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/MaWHVceDbFo">https://youtu.be/MaWHVceDbFo</a></p> <p>Why The Lucky Stiff Documentary に出演していた 2 ブロックモヒカンのひとの「この男を知っていますか ?」というところから始まるトーク。<br /> 何を話しているかは、python で読める。<br /> <img src="https://rentry.co/7e5gz/png" alt="https://rentry.co/7e5gz" /></p> <h4 id="CLOSURE"><a href="#CLOSURE">CLOSURE</a></h4> <p><a target="_blank" rel="nofollow noopener" href="https://www.dropbox.com/s/c0n2dljz8anih62/CLOSURE.pdf?dl=0">https://www.dropbox.com/s/c0n2dljz8anih62/CLOSURE.pdf?dl=0</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://blog.sinakhalili.com/posts/closure/">Book review: CLOSURE by why the lucky stiff | Sina's blog</a></p> <p>このブックレヴューは python と Ruby で協力して読んでみよう。</p> <pre><code class="ruby">html = `curl -s 'https://blog.sinakhalili.com/posts/closure/'` require 'oga' list_p = [] doc = Oga.parse_html(html) doc.css('p').each_with_index {|x,index| if x.text != "" && x.text.match?(/^\w/) list_p << "#{x.text}" elsif x.text.match?(/^\(/) list_p << "#{x.text}" else # p x.text end } require 'pycall/import' include PyCall::Import pyfrom 'googletrans',import: :Translator translator = Translator.new list_p.each_with_index {|lines,index| lines.sub!(/^s*/,'') lines.to_s.gsub!(/\.\s*/,'') # p lines puts begin translated = translator.translate(lines,dest='ja') puts "#{index} #{lines}" puts "#{index} #{translated.text}" rescue => evar p $! end } </code></pre> tomato tag:crieit.net,2005:PublicArticle/17966 2022-02-04T21:49:20+09:00 2022-02-06T23:26:22+09:00 https://crieit.net/posts/d31bd6bca80198716bb2f002a715f976 タイトルから書籍情報を探す。 <p>データを詰め込んだデータベースから、本のタイトルを取り出して、もしあれば著者名を取り出して、国会図書館のNDL サーチで、タイトルを検索して、これかな ?? という書籍情報をデータベースに詰め込むプログラム。</p> <p>何をするためかというと、タイトルしかわからないマンガコミックの出版社の情報や、ISBN など詳細をたどって得るため。ISBN からタイトル情報へ行き着くものはあるが逆のものは知らないため。</p> <p>それ以上説明は省くが、こちらからさかのぼっていくと、きっとわかる。<br /> <a href="https://crieit.net/boards/manga-B/fc4a0259928ca001b58935ddd7cbb322">https://crieit.net/boards/manga-B/fc4a0259928ca001b58935ddd7cbb322</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://note.com/haywhnk/n/n5195d2660f53">さかのぼる</a></p> <pre><code class="ruby">require "faraday" require "faraday/net_http" require "net/http" require 'nokogiri' require 'sqlite3' require 'time' require 'date' class NdlSearch def get_book_info(title, creator = nil) data = [] query = { :mediatype => 1, :cnt => 100 } query[:title] = title query[:creator] = creator if creator if creator == '' puts "::::::::::::::::::::::::::::::::::::" puts 'author :??' end puts print "query :#{query}" puts response = ndl_get('/api/opensearch', query) xml = Nokogiri::XML(response.body) xml.remove_namespaces! items = xml.xpath('//item') unless items.any? then puts puts 'ndl has no item' data << {"totalResults"=>"0"} else #pp items.to_s items.each do |item| #puts #puts "item :", item book = {} threads1 = [] # concurrency item.children.each do |c| threads1 << Thread.new { key = c.name next if key == 'text' val = "#{c.content}" label = c.attribute("type") if label label = "#{label}".gsub(/^dcndl:|^dcterms:/,'') book[label] ||= [] book[label] << val unless book[label].include?(val) val = "#{label}:#{val}" end book[key] ||= [] book[key] << val unless book[key].include?(val) } end threads1.each{ |thr| thr.join } book = book.map {|key,val| [key, val.join(',')]}.to_h data << book end end data end private def ndl_get(path, pram) con = Faraday.new(:url => 'https://iss.ndl.go.jp') do |f| f.request :url_encoded #f.response :logger f.adapter :net_http end con.get path, pram end end #DB SQL =<<EOS create table tbl_bookdata ( id INTEGER PRIMARY KEY AUTOINCREMENT, book_title text, url text, author text, creatortranscription text, volume text, seriestitle text, publisher text, isbn text, date text, W3CDTF integer, mangathank_title text, ex_id integer, tags text ); EOS count = 0 new_db = SQLite3::Database.open("bookdata_fbay_py_3.db") #new_db = SQLite3::Database.open("bookdata_fbay_py.db") db = SQLite3::Database.open("../gotest/fbay_python3.db") #db = SQLite3::Database.open("fbay_python3.db") #new_db = SQLite3::Database.open("bookdata.db") #db = SQLite3::Database.open("mangathank_new.db") #new_db.execute(SQL) temp_author = '' temp_title = '' $index = 0 db.execute("select id from tbl_manga order by id desc limit 1 ;") do |data| $index = data[0].to_i print "last id : '#{$index}'" puts end looptimes = $index new_db.execute("select id from tbl_bookdata order by id desc limit 1 ;") do |data| count = data[0].to_i end start = count + 1 #threads = [] #m = Mutex.new (start..looptimes).each do |api| # (0..4).each do |pac| fiber = Fiber.new do if count >= looptimes - 1 then break end # threads &lt;&lt; Thread.new { # m.synchronize{ count += 1 puts puts "::::::::::::::::::::::::::::::::::::::::" print 'id:',count,' ' search_data = db.execute("select book_title,author,title,id,tags from tbl_manga where id ='#{count}' ;") if search_data.empty? then puts 'empty' end *book_data = search_data.pop #book_data[0] #=> book_title #book_data[1] #=> author #book_data[2] #=> title #book_data[3] #==> id #book_data[4] #==> tags mangathank_title = book_data[2].to_s.gsub(/\'/, "\'\'") tags = book_data[4].to_s.gsub(/\'/, "\'\'") puts book_data[2] if book_data[2] == "null" then p count pp book_data # new_db.execute(&quot;insert into tbl_bookdata (book_title, author, mangathank_title, ex_id, tags ) values('book_title:nothing','author:nothing','#{mangathank_title}','#{book_data[3]}','#{tags}');&quot;) new_db.execute("insert into tbl_bookdata (id, book_title, author, mangathank_title, ex_id, tags ) values('#{count}','book_title:nothing','author:nothing','#{mangathank_title}','#{book_data[3]}','#{tags}');") else author_data = book_data[2].to_s.slice(/((?<=\[).*?(?=\]))/) #puts "author_dat:#{author_data}" if author_data != nil author_data.gsub!(/\ x\ /,' ') author_data.sub!(/((?<=[\p{Hiragana}\p{Han}\p{Katakana}])x(?=[\p{Hiragana}\p{Han}\p{Katakana}]))/,' ') author_data.gsub!(/\(|\)/,"\(" =>' ',"\)"=>'') author_data.gsub!(/×/,' ') author_data.gsub!(/\ &/,' ') end if /(\ )/.match(author_data) then #/(\S+$)/.match(author_data) #person = /(?<=['\ '])\S.*$/.match(author_data) #str_array = person.to_s.split str_array = author_data.to_s.split person = str_array.pop else person = author_data.to_s end print("author_data: ", author_data , " person: " , person) puts num = book_data[2].to_s.slice(/((?<=第)\d+(?=巻|卷$))/) #num = /((?<=第)\d+(?=巻$))/.match(book_data[0].to_s) #book_data_0 = book_data[0].to_s.sub(/((?=第).*巻)/,'') book_data_0 = book_data[2].to_s.gsub(/((?=第).*(巻|卷))/,'') book_data_0.gsub!(/((?=第).*話)/,'') book_data_0.gsub!(/(.(?<=\()文庫版(?=\)).)/,'') book_data_0.gsub!(/(.(?<=\[)文庫版(?=\]).)/,'') book_data_0.gsub!(/文庫版/,'') book_data_0.gsub!(/フルカラー版/,'') book_data_0.gsub!(/カラー版/,'') book_data_0.gsub!(/(.(?<=\()完(?=\)).)/,'') book_data_0.gsub!(/(.(?<=【).*(?=】).)/,'') book_data_0.gsub!(/(.(?<=\[).+?(?=\]).)/,'') book_data_0.lstrip! book_data_0.rstrip! if book_data_0 == temp_title then if str_array then person = temp_author end else temp_title = book_data_0 temp_author = person end if num != nil then num = num.to_i book_data_0 += ' ' + num.to_s end puts #puts book_data[0] puts book_data_0 puts ndl_search = NdlSearch.new onemore = 'true' while onemore == 'true' do res = ndl_search.get_book_info( book_data_0,person ) onemore = 'false' # puts res[0] if res[0] == nil then puts "res: empty" book_data_0.gsub!(/\'/,"\'\'") puts book_data_0 # new_db.execute(&quot;insert into tbl_bookdata (book_title, author, mangathank_title, ex_id,tags ) values('#{book_data_0}','#{author_data}','#{mangathank_title}','#{book_data[3]}','#{tags}');&quot;) new_db.execute("insert into tbl_bookdata (id, book_title, author, mangathank_title, ex_id,tags ) values('#{count}','#{book_data_0}','#{author_data}','#{mangathank_title}','#{book_data[3]}','#{tags}');") onemore = 'false' else done = false res[0..99].each_with_index do |book,index| if done == true then break end not_book = false book.each do |key, val| if key == "extent" then puts "#{key}:#{val}" if /ビデオ|DVD|dvd|ディスク/.match?(val) then not_book = true puts '' puts 'SKIP' break end end end if not_book == true then next end if book != "null" then # puts &quot;res:#{book}&quot; # puts &quot; :#{index}&quot; book.each do |key, val| # puts &quot;#{key}:#{val}&quot; if key == 'totalResults' then #puts #print "no match title name #{person} ",book_data[3],' ' book_data_0.gsub!(/\'/,"\'\'") #puts book_data_0,person,mangathank_title unless str_array.nil? then if str_array.size > 0 then person = str_array.shift puts print "#{person} ?" puts puts onemore = 'true' #sleep 3 break else # new_db.execute(&quot;insert into tbl_bookdata (book_title, author, mangathank_title, ex_id,tags ) values('#{book_data_0}','#{author_data}','#{mangathank_title}','#{book_data[3]}','#{tags}');&quot;) new_db.execute("insert into tbl_bookdata (id, book_title, author, mangathank_title, ex_id,tags ) values('#{count}', '#{book_data_0}','#{author_data}','#{mangathank_title}','#{book_data[3]}','#{tags}');") onemore = 'false' #sleep 10 break end else # new_db.execute(&quot;insert into tbl_bookdata (book_title, author, mangathank_title, ex_id, tags) values('#{book_data_0}','#{author_data}','#{mangathank_title}','#{book_data[3]}','#{tags}');&quot;) new_db.execute("insert into tbl_bookdata (id, book_title, author, mangathank_title, ex_id, tags) values('#{count}', '#{book_data_0}','#{author_data}','#{mangathank_title}','#{book_data[3]}','#{tags}');") onemore = 'false' end break end if key == 'title' then temp_author = person puts "☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆" puts " #{count}" puts "" puts "#{key}:#{val}" title = val.to_s.gsub(/\'/, "\'\'") new_db.execute("insert into tbl_bookdata (id, mangathank_title, ex_id, tags ) values('#{count}', '#{mangathank_title}','#{book_data[3]}','#{tags}');") new_db.execute("update tbl_bookdata set book_title = '#{title}' where id = '#{count}';") elsif key == 'author' then puts "#{key}:#{val}" author = val.to_s.gsub(/\'/, "\'\'") new_db.execute("update tbl_bookdata set author = '#{author}' where id = '#{count}';") elsif key == 'creatorTranscription' then puts "#{key}:#{val}" creatortranscription = val.to_s.gsub(/\'/, "\'\'") new_db.execute("update tbl_bookdata set creatortranscription = '#{creatortranscription}' where id = '#{count}';") elsif key == 'volume' then volume = val.to_s.gsub(/\'/, "\'\'") new_db.execute("update tbl_bookdata set volume = '#{volume}' where id = '#{count}';") elsif key == 'link' then url = val new_db.execute("update tbl_bookdata set url = '#{url}' where id = '#{count}';") elsif key == 'publisher' then puts "#{key}:#{val}" publisher = val.to_s.gsub(/\'/, "\'\'") new_db.execute("update tbl_bookdata set publisher = '#{publisher}' where id = '#{count}';") elsif key == 'ISBN' then puts "#{key}:#{val}" puts "" puts "☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆" isbn = val.to_s.gsub(/\'/, "\'\'") new_db.execute("update tbl_bookdata set isbn = '#{isbn}' where id = '#{count}';") elsif key == 'seriesTitle' then puts "#{key}:#{val}" seriestitle = val.to_s.gsub(/\'/, "\'\'") new_db.execute("update tbl_bookdata set seriestitle = '#{seriestitle}' where id = '#{count}';") elsif key == 'date' then puts "#{key}:#{val}" published_date = val.to_s.gsub(/\'/, "\'\'") new_db.execute("update tbl_bookdata set date = '#{published_date}' where id = '#{count}';") elsif key == "W3CDTF" then puts "#{key}:#{val}" puts "" w3cdtf = val.to_s.gsub(/\'/, "\'\'") new_db.execute("update tbl_bookdata set W3CDTF = '#{w3cdtf}' where id = '#{count}';") else #new_db.execute("update tbl_bookdata set author = '', creatortranscription = '', volume = '', url = '', publisher = '', isbn = '', seriestitle = '' ;") onemore = 'false' done = true end end else onemore = 'false' puts "error" mangathank_title = book_data[2].to_s.gsub(/\'/, "\'\'") # new_db.execute(&quot;insert into tbl_bookdata (author, mangathank_title, ex_id ) values('#{author_data}','#{mangathank_title}','#{book_data[3]}');&quot;) new_db.execute("insert into tbl_bookdata (id, author, mangathank_title, ex_id ) values('#{count}','#{author_data}','#{mangathank_title}','#{book_data[3]}');") end end end end end # } # } end fiber.resume # threads.each {|th| th.join} end </code></pre> tomato tag:crieit.net,2005:PublicArticle/17926 2022-01-08T17:13:44+09:00 2022-02-02T15:37:34+09:00 https://crieit.net/posts/4daedd75f0cec1b328d4e661d9337bd3 ある一つのサイトについての <h1 id="現在"><a href="#%E7%8F%BE%E5%9C%A8">現在</a></h1> <p>漫画BANK についての <a href="https://crieit.net/posts/BANK">お思い出</a> あるいは、</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/dauuricus/items/6c5fcbfa802e40ebc68b">https://qiita.com/dauuricus/items/6c5fcbfa802e40ebc68b</a></p> <p>の記事からの続き</p> <p>U.S. court orders Google to disclose manga piracy site operator<br /> KYODO NEWS KYODO NEWS - Nov 15, 2021 - 18:21<br /> <a target="_blank" rel="nofollow noopener" href="https://english.kyodonews.net/news/2021/11/328f513cedd6-us-court-orders-google-to-disclose-manga-piracy-site-operator.html">https://english.kyodonews.net/news/2021/11/328f513cedd6-us-court-orders-google-to-disclose-manga-piracy-site-operator.html</a></p> <p>その例のサイトに掲載されている数 62,597 。(2022年 1 月 8 日調べ。1 月 9 日現在では 62,662 。)</p> <p>これは、サイトの中にあるページの URL を数えた現時点で数えられた数。</p> <p>マンガのタイトルから出版社情報を割り出して sqlite に tbl_bookdata として記録して、</p> <pre><code>sqlite> select publisher,count(*) from tbl_bookdata group by publisher having count(*)>50 order by count(*) ; </code></pre> <p>50 件以上のコンテンツを、その例のサイトに公開されている出版社を見てみる。出版社情報の割り出しは、精度は高いが完璧ではない。</p> <pre><code class="sqlite3">sqlite> select publisher,count(*) from tbl_bookdata group by publisher having count(*)>50 order by count(*) ; ハーパーコリンズ・ジャパン|51 アース・スターエンターテイメント,泰文堂|52 小学館,ジェネオンエンタテインメント|54 エイベックス・ピクチャーズ|55 学習研究社|61 東映ビデオ,東映|63 フレックスコミックス,ほるぷ出版|64 マーベラスエンターテイメント,ポニーキャニオン|64 フロンティアワークス|67 エンターブレイン,角川グループパブリッシング|71 朝日新聞出版|78 エンターブレイン|83 ヒーローズ,小学館クリエイティブ|85 ワニブックス|98 アース・スターエンターテイメント|99 マイクロマガジン社|100 コロムビアミュージックエンタテインメント|101 エイベックス・マーケティング|104 ノース・スターズ・ピクチャーズ,徳間書店|107 ハーレクイン|109 エニックス|110 実業之日本社|112 アスキー・メディアワークス,角川グループパブリッシング|115 キングレコード|117 東宝|120 朝日ソノラマ|124 TOブックス|125 富士見書房,角川グループパブリッシング|126 キルタイムコミュニケーション|132 祥伝社|134 ホビージャパン|136 幻冬舎コミックス,幻冬舎|143 潮出版社|176 ポニーキャニオン|178 宙出版|182 一迅社,講談社|197 オーバーラップ|198 バンダイビジュアル|209 バップ|218 アニプレックス|223 新書館|229 リイド社|237 マッグガーデン|248 冬水社|253 メディアファクトリー|258 アルファポリス,星雲社|262 徳間書店|269 一迅社|310 ぶんか社|350 竹書房|392 角川書店|433 新潮社|461 角川書店,角川グループパブリッシング|477 少年画報社|640 芳文社|645 日本文芸社|788 双葉社|1322 スクウェア・エニックス|1605 白泉社|2962 秋田書店|2983 KADOKAWA|3370 小学館|7163 集英社|7785 週刊誌 未分類|10405 講談社|10975 </code></pre> <p>週刊誌を除く、コミックの発行年をわかる範囲で見ると ...</p> <pre><code class="sqlite">sqlite> select distinct(date),count(date) from tbl_bookdata group by date order by date; </code></pre> <p>データ入力に表記ゆれがあって修正が必要なのと、他にデータの精度を上げることにしてプログラムを修整しはじめると日付が変わった。</p> <p>ボード という機能があるようなので、続きはそちらに。</p> <p>「ある一つのサイトについての」 ボード<br /> <a href="https://crieit.net/boards/manga-B">https://crieit.net/boards/manga-B</a></p> <p>修正後にデータをまた収集するのにかなりの時間がかかる。</p> tomato tag:crieit.net,2005:PublicArticle/17925 2022-01-08T16:27:09+09:00 2022-01-11T21:08:15+09:00 https://crieit.net/posts/bbb085470b763b7e8bcb423f4b235d64 スキャンレーション <h1 id="scanlation について"><a href="#scanlation+%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">scanlation について</a></h1> <p>スキャンレーション( scanlation )で検索すると、その言葉の定義から、ガイドラインやチュートリアル、または役割名称や、その広報的なサイトの情報がたくさんある。</p> <p>今は活動していないスキャンレーションのグループ名と、そのプロファイルのページのデータベース (sqlite file)。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.mediafire.com/file/qlse91vdwyletgx/scanlation-g.db/file">https://www.mediafire.com/file/qlse91vdwyletgx/scanlation-g.db/file</a><br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/85947479-df01-7dac-fbb4-f6d8dc21aed8.jpeg" alt="IMG_20211113_140504_811.jpg" /></p> <p><a target="_blank" rel="nofollow noopener" href="https://www-mangaupdates-com.translate.goog/aboutus.html?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=nui">https://www-mangaupdates-com.translate.goog/aboutus.html?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=nui</a></p> <p>過去に翻訳されたタイトルのオリジナルの和名とそれ以外の対照を作りたい場合は有効かもしれないし、そうでもないかもしれない。</p> <p>著作権がらみで問題のあるコンテンツのダウンロード情報や、データ自体は含まないと宣言されているサイトから全てのスキャンレーショングループのプロファイルページの所在を抽出してから、各プロファイルページにアップデートしてアーカイブされている翻訳済みの漫画の英語タイトルを抽出すれば、プロファイルされたスキャンレーションングループについては、全ての翻訳漫画タイトルを知れるということになる。<br /> 抽出の方法はグループのプロファイルページの所在、 プロファイルページ内にある翻訳したシリーズ名、日時という順にたどると効率が良さそう。</p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/zbtnk/png">1: タイトルを考えるのが面倒な scanlation groups counter プログラム Python link</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/nekon/png">2: a , b<br /> 2つのデータベースをマージする Lua プログラムサンプル link</a> :[ 依存関係 lsqlite3 https://github.com/LuaDist/lsqlite3/blob/master/examples/smart.lua]</p> <p>1.1.1.1<br /> <a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/1.1.1.1">https://en.m.wikipedia.org/wiki/1.1.1.1</a></p> <p>スキャンレーションは海賊サイトのエコシステムの一環で、フェーズとしてはオンラインでの海賊配信の水際に位置していると考えられる。<br /> 2次創作漫画画像を作るために、漫画をスキャナーでスキャンする必要があるわけだが、漫画を入手してスキャンし、アップロード ① してダウンロードアドレスを告知する ② ということをしているというところが、ボトムで、スキャンレーションの作業のエントリーポイントにもこの行程が不可欠。<br /> スキャンしてアップロード ① する人は必ずしもスキャンレーションチームにしかいないわけではないが、アップロードされたスキャン済み画像をダウングレード ③ して海賊配信 ④ していたり、スキャン画像をクリーンアップして翻訳、タイプセットして、翻訳版の海賊配信サイトにアップロード ⑤ していたりと、それぞれに直接関係があったり無かったりするのだろうけども、スキャンレーションという枠では、ひとまとまとまり情報として関係性が見える。例えば、このグループがここ ④ へアップロード ⑤ した等。</p> <p>④ のサイト群については、正当な方法(カドカワ的に「インターネット上の海賊版対策に関する検討会議 第9回会合 平成30年10月15日 議事録[^0]」)similarweb<sup id="fnref:12"><a href="#fn:12" class="footnote-ref" role="doc-noteref">1</a></sup><sup id="fnref:8"><a href="#fn:8" class="footnote-ref" role="doc-noteref">2</a></sup> <sup id="fnref:9"><a href="#fn:9" class="footnote-ref" role="doc-noteref">3</a></sup>で横並びに見えるもののことを主に指すようだが、ボトムアップから見るとすると、行為とモチベーション度に着目する<sup id="fnref:10"><a href="#fn:10" class="footnote-ref" role="doc-noteref">4</a></sup>とスキャンレーションのサイドからたどると動線も把握できる。スキャンレーションのさらに二次コピーなどが ④ に回収されて公開されている場合もあるだろう。トラフィックの大きさは、配信自体の技術に左右されるので、着目される経済的損失について語られるのはトラフィックの大きな上流の方のことだと思われる。漫画 BANK は ④ に含まれる(すでにアップロードされて海賊配信されているサイトからの画像流用)。</p> <p>これは想像なのでイマジネーションは図にした方がいい。</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/ed3db1b5-2e40-1584-b6a3-4ba59ce3704f.png" alt="oie_1I69MA5YrCfZ.png" /></p> <p><a href="https://crieit.now.sh/upload_images/a4659321b5cc94fb81afc1c7163b2a6761dd7319f33e1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a4659321b5cc94fb81afc1c7163b2a6761dd7319f33e1.png?mw=700" alt="image" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://fanlore.org/wiki/Scanlation_Process#General_Process">https://fanlore.org/wiki/Scanlation_Process#General_Process</a></p> <p>参考: https://kknews.cc/comic/moz43xz.html</p> <p><a target="_blank" rel="nofollow noopener" href="https://kknews-cc.translate.goog/comic/moz43xz.html?_x_tr_sl=zh-CN&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=nui">https://kknews-cc.translate.goog/comic/moz43xz.html?_x_tr_sl=zh-CN&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=nui</a></p> <p><a target="_blank" rel="nofollow noopener" href="http://onepiece.ria10.com/Entry/3752/">http://onepiece.ria10.com/Entry/3752/</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://www.similarweb.com/ja/website/mangapanda.onl/">https://www.similarweb.com/ja/website/mangapanda.onl/</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://www2.accsjp.or.jp/thanks/thanks39.php">https://www2.accsjp.or.jp/thanks/thanks39.php</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://www.neliti.com/publications/326921/accuracy-of-english-indonesian-scanlation-of-detective-conan-manga-as-compared-t">https://www.neliti.com/publications/326921/accuracy-of-english-indonesian-scanlation-of-detective-conan-manga-as-compared-t</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/scanlation-titles/png">3: link</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/zbtnk/png">1:link</a> / <a target="_blank" rel="nofollow noopener" href="https://rentry.co/nekon/png">2:link</a> / <a target="_blank" rel="nofollow noopener" href="https://rentry.co/scanlation-titles/png">3:link</a> とプログラムにせっせと、動いてもらって 3 をポチッとしてから翌日起きて、途中で止まってると思ってたら、朝になっても昼前まで止まらない量のデータをせっせと書き込んでいた。<br /> カウンターは 106000 を越えていて、なんか無理しているなぁと思いつつ、そのわきで次のプログラムを書きはじめて、</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/2393c94a-9848-b7d1-d308-367fa26659d2.png" alt="oie_png (1).png" /></p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/oytah/png">4:link</a> を書いた。</p> <p>たぶんこれも明日もお昼までうごいているんではないか。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.oreilly.co.jp/books/9784873113487/">https://www.oreilly.co.jp/books/9784873113487/</a></p> <p>漠然とした中での目的としては、翻訳された(おそらく勝手に)漫画のタイトルからオリジナルのタイトルを知りたいのと、その他の言葉でのタイトルを眺めたいので、そうするとどうやって組み上げたらいいのかなということをやってみたい。</p> <p>ということで、まずスキャンレーショングループが過去から現在まで翻訳したシリーズになった(単行本とかのことだと思われる)ものをカウントアップするために、まずグループのリストを作る。これが <a target="_blank" rel="nofollow noopener" href="https://rentry.co/zbtnk/png">1:link</a> のコード。<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/zbtnk/png">1:link</a> でできたリストのなかには、グループについてのプロファイリングされた個別のページのアドレスがあり、このプロファイリングされたページ上にグループの翻訳したシリーズがリストアップされている。<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/zbtnk/png">1:link</a> で作れるデータベースを複数足し合わせるのが <a target="_blank" rel="nofollow noopener" href="https://rentry.co/nekon/png">2:link</a> のコード。なぜ、Lua なのか、コンパクトで速いから。同じように他の言語で書いて同じような速度かもしれないが、コードを見れば、見える通りのことなのでシンプル。遅くはない。</p> <p>hy (clojure lisp 風 Python) 言語に合わせて <a target="_blank" rel="nofollow noopener" href="https://rentry.co/nekon/png">2:link</a> と同じものを Lua の Lisp 風言語 <a target="_blank" rel="nofollow noopener" href="https://github.com/bakpakin/Fennel/blob/main/reference.md">fennel</a> に直してみると</p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/fennel/png">2:link fennel</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/dauuricus/items/37b80ddab68777414753">Vim</a> だとプラグインを設定しないとちょっと難しい感じだけど、<a target="_blank" rel="nofollow noopener" href="https://kakoune.org/">kakoune</a> だとデフォルトで色分けはしてくれる。どうなってるんでしょう。<a target="_blank" rel="nofollow noopener" href="https://qiita.com/dauuricus/items/c0023fb476c5f708292e">vis editor</a> も。</p> <p>プロファイルされたページのシリーズタイトルを足し合わせて記録していくのが 3:link のコード。Python だが hy 言語。今のところ hy で書くメリットは分かりやすさ。<br /> SQLite のバインドも Python 独自のものなので、select して execute されて戻ってくるデータが空のときどうやって空のデータを比較できるのかというところが言語とバインドによって違うので、そこは注意しなくてはいけない。Lua の場合は、空の場合は素通りで、値を判定する式自体を無視するよう、そのことを分かっていたらシンプル。</p> <p>例えば、</p> <pre><code class="lua">local smt1 = "SELECT id FROM tbl_scanlation ORDER BY id DESC LIMIT 1 ;" local last1 = 0 for id in db1:urows(smt1) do last1 = id end </code></pre> <p>これは Lua バインドで sqlite3 データベースの tbl_scanlation というテーブルのデータの中の primary キー連番 id 番号の最後の int 値を取り出す式を実行して last1 に代入したい箇所だが、テーブルの中にデータが入ってなければ <code>local last1 = 0</code> で初期化している値が入る。 nil とか -1 とかにはならない。python や Ruby 、 go や nim など、またそれぞれ違うので、いろんな別の言語にて書き換える場合は、<strong>無い場合</strong>どういう値が入るのかよく調べなければいけない。SQLite3 自体では返ってくる値は決められているが、その値に対する値は、バインドによって書き換えられて処理されているようなので。</p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/scanlation-titles/png">3:link</a> で出来上がるデータベースの件数は三万件くらいだろうかと思っていたが、10 万件以上だった。SQLite の場合は扱える数はそれ以下のはずだが、無理でもできるとこまででいいのでがんばってもらう。</p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/oytah/png">4:link</a> の様子。お昼になっても終わっていない。<br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/736d3cbd-136e-d509-7247-54a18c2061ff.png" alt="Screenshot_20211120-113635.png" /></p> <p>一週間くらい経ってる気がするが、VALID データが 96,426 。つまり、中国、韓国、日本の漫画がスキャンレーショングループによって、それだけの数は翻訳されている。<br /> sqlite3 database file<br /> <a target="_blank" rel="nofollow noopener" href="https://we.tl/t-xUEh2MPRcF">https://we.tl/t-xUEh2MPRcF</a></p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/27ec591c-9a79-c606-7259-195d0f4161f3.png" alt="Screenshot_20211211-143003_kindlephoto-66542057.png" /></p> <div class="footnotes" role="doc-endnotes"> <hr /> <ol> <li id="fn:12" role="doc-endnote"> <p>資料7 https://www.kantei.go.jp/jp/singi/titeki2/tyousakai/kensho_hyoka_kikaku/2018/kaizoku/dai9/gijisidai.html <a href="#fnref:12" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:8" role="doc-endnote"> <p>https://en.globes.co.il/en/article-similarwebs-controversial-route-to-wall-street-1001376912 <a href="#fnref:8" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:9" role="doc-endnote"> <p>These Chrome extensions spy on 8 million users 31 Mar 2016 https://mweissbacher.com/2016/03/31/these-chrome-extensions-spy-on-8-million-users/ <a href="#fnref:9" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:10" role="doc-endnote"> <p>https://www.reddit.com/r/scanlation/about/ <a href="#fnref:10" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> </ol> </div> tomato tag:crieit.net,2005:PublicArticle/17923 2022-01-07T12:34:32+09:00 2022-01-31T21:18:21+09:00 https://crieit.net/posts/BANK ある一つのサイト についての <h1 id="思い出"><a href="#%E6%80%9D%E3%81%84%E5%87%BA">思い出</a></h1> <p>過去 6 ヶ月間、ひたすらひとつの違法マンガサイトを見ていた。</p> <p>ずっと見ていたのは公開されたマンガコンテンツではなく、サイト運営者が作ってるデータをひたすら見ていたので、11 月の 4 日、15 時くらいにサイトをたたんだのを確認した。<sup id="fnref:100"><a href="#fn:100" class="footnote-ref" role="doc-noteref">1</a></sup></p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/e0ec8e48-727f-bf85-14b5-bb3ff3625497.png" alt="Screenshot_20211104-164634.png" /></p> <p>おそらくこの翻訳記事 2021年11月04日 14時00分</p> <blockquote> <p>Manga Publisher Wants to Sue Huge Piracy Network, Needs Google's Help * TorrentFreak<br /> <code>https://torrentfreak.com/manga-publisher-wants-to-sue-huge-piracy-network-needs-googles-help-211101/</code></p> </blockquote> <p>注) 'Shueisha’s application and proposed orders/subpoenas can be found here (1,2,3,4 pdf)' の書類が興味深い。</p> <p><a target="_blank" rel="nofollow noopener" href="https://gigazine.net/news/20211104-manga-shueisha-googles-piracy-mangabank/">https://gigazine.net/news/20211104-manga-shueisha-googles-piracy-mangabank/</a></p> <p>が公開されたことで、サイト運営者が違法性を自認して、サイト閉鎖を決定したのではないかと思われる。</p> <p>2021.12月中頃、mangabank.org とはまた別のドメインで再開している。<br /> 画像ファイルのあるアドレスのドメインを whois したところ、cloudflare の管轄のホストではなさそうな感じ。</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/119a01df-c5bf-ba57-9f8d-50947320e8ec.jpeg" alt="Screenshot_20211230-001601.jpg" /></p> <hr /> <p>過去に書いたこのような記事は、当時、宣伝につながらないように配慮して明記しなかったが、全て漫画 BANK についてのことだった。</p> <p>以下、2021年11月04日 以前</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/dauuricus/items/563cbcc9776f66cb672e">https://qiita.com/dauuricus/items/563cbcc9776f66cb672e</a></p> <p>6 月の時点では 5 万ページぼどだと思っていたが 10 月には 6 万ページ以上あることがわかった。</p> <p>この 6 万ページというのはマンガコンテンツの漫画の総ページ数のことではなくて、URL のことで、そのひとつの URL に 30 点から 300 点ぐらいの画像ファイルの URL が埋め込まれている。<br /> その画像一枚が、漫画のスキャン画像ファイルの一点に相当する。</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/592fa176-0e08-7dd1-4769-4baef444ba24.png" alt="Screenshot_photo-586353998.png" /></p> <p>画像点数にすると、空想すると数えたことないおおきな数になるので、いずれいつか数えようと数えなかったが、その 6 万ページについては 著者 / 漫画のタイトル / 公開されていた URL / アップデート日時の情報 / 付与されていたタグ のデータのセットを記録した。</p> <p>スキャン画像のファイルが漫画 BANK の見ているページに読み込まれるようにページのソースの中に URL が埋め込まれていて、観測した限りのその URL は、全てが cloudflare がホスティングしているドメインだった<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">2</a></sup> ( 2021年 7月の調べ )</p> <p>これが全てではないが、数千のアドレスから集計すると、こちらのドメインに収束した。</p> <pre><code>0 ssl.appx.buzz 1 ssl.asiax.cloud 2 ssl.stagingy.store 3 ssl.lsw.buzz 4 ssl.advx.cloud 5 ssl.appuru.store 6 ssl.lss.buzz 7 ssl.remon.store 8 ssl.lsq.buzz 9 ssl.lsb.buzz 10 ssl.appsx.cloud 11 ssl.lsh.buzz 12 ssl.raichi.store 13 ssl.lsr.buzz 14 ssl.akaax.com 15 ssl.axax.cloud 16 ssl.lsk.buzz 17 ssl.lsy.buzz 18 ssl.zqap.cloud 19 ssl.skyly.cloud 20 ssl.akax.cloud 21 ssl.zmqx.cloud 22 ssl.lssaq.cloud 23 ssl.lsm.buzz 24 ssl.nexc.store </code></pre> <p>参照: 🥝<a target="_blank" rel="nofollow noopener" href="https://zenn.dev/kurocat/articles/55565f019754cb">ページの中から lazy load の画像 URL を抽出する。</a></p> <p>画像の著作権情報<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">3</a></sup>と、公開されている cloudflare のドメインの画像ファイルアドレスのリストがあれば、すんなり停止できるのだろうなと<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">4</a></sup>考えていたが、ずいぶんとほったらかしているな、あれ ? ゼンゼンナニモシナイノ ? と不思議に思えた。<br /> たしか 2019 年<sup id="fnref:0"><a href="#fn:0" class="footnote-ref" role="doc-noteref">5</a></sup>までサイトブロッキング<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">6</a></sup>しかない!<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">7</a></sup> という主張さえあったのだが<sup id="fnref:7"><a href="#fn:7" class="footnote-ref" role="doc-noteref">8</a></sup>、その前にどこまでどうしたのかは、主張からはさっぱりわからないので、「どこまでどうできるのか」がずっと気にかかっていた。</p> <p>サイトブロッキング法制化、中間まとめは先送り<br /> 浅川 直輝 日経 xTECH/日経コンピュータ<br /> 2018.09.20<br /> <a target="_blank" rel="nofollow noopener" href="https://xtech.nikkei.com/atcl/nxt/column/18/00001/01044/">https://xtech.nikkei.com/atcl/nxt/column/18/00001/01044/</a></p> <p>朝日新聞デジタル<br /> 海賊版サイト対策、まとまらず 検討会議は無期限延期に<br /> 上田真由美 川本裕司 2018年10月16日 0時10分<br /> <a target="_blank" rel="nofollow noopener" href="https://www.asahi.com/articles/ASLBH5W88LBHUCLV00L.html">https://www.asahi.com/articles/ASLBH5W88LBHUCLV00L.html</a></p> <p>過去のしりきれとんぼになっている<strong>インターネット上の海賊版対策に関する検討会議 第9回会合 議事録</strong>を読んでいると <strong>とりまとまらない</strong>報告となった理由が熱くて面白かった。「両論併記をしない」という主張についての理由が議事録には残っている。</p> <p><a href="https://crieit.now.sh/upload_images/1ad698b79781afe59ebc1f9702c5222161dd706b56a71.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1ad698b79781afe59ebc1f9702c5222161dd706b56a71.png?mw=700" alt="image" /></a></p> <p>Rf.インターネット上の海賊版対策に関する検討会議 第9回会合 議事録</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.kantei.go.jp/jp/singi/titeki2/tyousakai/kensho_hyoka_kikaku/index.html">https://www.kantei.go.jp/jp/singi/titeki2/tyousakai/kensho_hyoka_kikaku/index.html</a></p> <hr /> <blockquote> <p>Mangabank “Suffers DDoS Attack” & Disappears Following Legal Action<br /> November 9, 2021 by Andy Maxwell</p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://torrentfreak.com/mangabank-suffers-ddos-attack-disappears-following-legal-action-211109/">https://torrentfreak.com/mangabank-suffers-ddos-attack-disappears-following-legal-action-211109/</a></p> <p>注) 'A declaration filed with the court by Shueisha ( pdf ) contains a copy of Cloudflare's response to the DMCA subpoena filed earlier this year.' のところが興味深い。</p> <p><a target="_blank" rel="nofollow noopener" href="https://torrentfreak-com.translate.goog/mangabank-suffers-ddos-attack-disappears-following-legal-action-211109/?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=nui">翻訳</a></p> <p>漫画 BANK のアップロードして公開されていたタイトル名には命名規則があり、文字列抽出して、タイトルから検索して、間違った書籍情報をひっぱってくるものを選んでよくみると、簡単な間違いをしているものがあった。そして、これは間違いようなさそうなスペル間違いだったりなので、なにか、その前の段階 ? のもとで間違っていて、改正すると整合がとれないので、そのままにしているのではないかと思われた。<br /> なにと比べるのか。<br /> つまり、コピーしてきて、世の中では、そのタイトル名が通用していて、それは、オリジナルのタイトルからすると間違っているが、ファイル名としては正しいというような場合が考えられる。</p> <p>つまり、コピーなのだと思う。自らスキャンして、自らファイル名をつけて、アップロードしてるわけではないという場合、そうなるかなと思う。<br /> そう考えると、そのファイル名で、普通に検索すると、同じ間違ったタイトル名がひっかかるので、そいうことなのだ。</p> <p>だとするならば、なんらかの理由で漫画をスキャンしてアップロードする人間がいて、それを告知する、そしてそのデータを加工するなどする人間がいるというエコサイクルのなかで、ネット上のアップロードファイルから回収されたものを展示しているということになるので、そのセレクトセンスによって傾向がみられるということである。<br /> かなり古い漫画も選ばれていて、そのタイトルを知っているということは特徴的でもある。</p> <p>とはいえ、興味は運営者が誰なのか...というところには全く無く、データがどうなってんのかな? どういう風に作ってるのかな? 全部のデータはいくつあるのか知るにはどういうアプローチでやるのかなというところに重点があり、ではどこから来たデータで、どういうモチベーションで出てきたファイルなんだろうかということに疑問をもちはじめた。</p> <p>なんらかのモチベーションで日本の漫画をスキャニングし、ネットワークにアップロードする行為から始まり、ローカライズ(翻訳)し、漫画の言語を替えて、きれいに文字をのせて公開する一連のことを、<a href="https://crieit.net/posts/bbb085470b763b7e8bcb423f4b235d64#fn:10">スキャンレーション</a>と呼んでいるらしい。</p> <p><a href="https://crieit.net/posts/4daedd75f0cec1b328d4e661d9337bd3">ある一つのサイトについての 現在</a> へつづく</p> <p>せきららなコード(ちょっと古くなってるけど、今の状況に合わせて少しだけ修正したら使える)</p> <p><a target="_blank" rel="nofollow noopener" href="https://kuroca.hatenablog.com/">https://kuroca.hatenablog.com/</a></p> <hr /> <div class="footnotes" role="doc-endnotes"> <hr /> <ol> <li id="fn:100" role="doc-endnote"> <p>2021/11/17 はこんな状況 https://pastebin.com/fTcHK0ti <a href="#fnref:100" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:5" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/kurocat/articles/eb233dc31bb285">違法と思われるマンガ Thank(仮称)の HTML の構造をよく確認する</a> <a href="#fnref:5" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:4" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/dauuricus/items/cd7143f84ad03fe17752">本の ISBN 情報なしに、本の題名から書籍データを抽出したいということ。</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:6" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://www.nikkei.com/article/DGXMZO3631981010102018CR8000/">権利侵害記事、保存も違法 東京地裁が米社に仮処分 2018年10月10日</a> <a href="#fnref:6" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:0" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://www.kantei.go.jp/jp/singi/titeki2/tyousakai/kensho_hyoka_kikaku/index.html">インターネット上の海賊版対策に関する検討会議</a> <a href="#fnref:0" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:1" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://internet.watch.impress.co.jp/docs/special/1128898.html">海賊版サイトをブロッキングするための5つの手法 Internet Society 日本支部 2018年6月22日</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:2" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://xtech.nikkei.com/atcl/nxt/column/18/00001/00469/">カドカワ川上量生社長が語る、サイトブロッキングの必要性 浅川 直輝 日経xTECH/日経コンピュータ</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:7" role="doc-endnote"> <p><a target="_blank" rel="nofollow noopener" href="https://www.sankei.com/article/20190114-NB33HYAHTZOORB6CZY7BGLQ36M/">海賊版「ブロッキング」法制化断念 政府、広告抑制など総合対策で対応 2019/1/14</a> <a href="#fnref:7" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> </ol> </div> tomato