Pornhubのコロナ応援無料トライアルキャンペーンに興味本位で登録したら悪質な抱き合わせ契約にハメ込まれて1万円カモられた話

タイトルの通り非常に恥ずかしく情けない話なのだけれど、ブロガーとして書かない訳にはいかないと思った。

Pornhubの無料トライアルキャンペーン

はてブトップでこの記事を見かけたのが悪夢の始まりだった。

興味本位でPornhubの有料プランの無料トライアルに登録してしまった。

有料プランの付加価値は低い

PornHubの有料プランは無料サイトとどういう差があるのか分からないくらい付加価値が低く、すぐに退会処理をして、まあこんなものかと終わったつもりでいた。

クレジットカード利用明細に不審な請求が

これも今回の件で後悔したことだけれど、私は毎月クレジットカードの利用明細を確認していなかった。

Pornhub有料プラン退会の2か月後にクレジットカードの利用明細を確認すると身に覚えのない請求が…。

f:id:fuyu77:20200516202631p:plain

MBI*PROBILLER.COMから39.97$の請求。いかにも怪しい。これが毎月3日の2か月分で1万円弱だ。

意図せず抱き合わせ契約にハメ込まれていた

https://www.e-honba.com/cancel/mbi-probiller

また課金が止まらないということは、退会処理をしたにも関わらず課金され続けていると思うのですが、おそらく抱き合わせ販売の分が
課金され続けているのだと思います。(抱き合わせを一緒に購入してしまうと別途退会する必要があるため)

当初不正請求かと思ったけれど、MBI*PROBILLER.COMというのはクレジットカード決済代行会社で、問題の本質はPornhubの有料プラントライアル申し込み時に意図せずBrazzersというポルノサイトの有料プランも同時に契約させられていたことにある。

今でもBrazzersに同時契約する旨の表示がどこにあったのかまったく覚えていないのだけれど、おそらく非常に目立たない形で書いてあったのだろう。

Brazzersの退会方法

Brazzersのサイトを詳しく見ても有料プランの退会方法は非常に分かりづらい。退会方法としては、上のリンク先からアカウント情報を入力して退会する。実際に退会完了するまでに入力フォームから5画面くらい遷移があり、非常に分かりづらい表示で何とか退会を阻止しようとしてくるので、慎重に先に進むボタンを押して、Probillerから退会完了のメールが届いたら退会完了だ。

得られた教訓

  • どんなに有名でも海外の有料ポルノサイトはこのように詐欺まがいの手法で稼ごうとしているので、絶対に有料プランに申し込んではいけない
  • クレジットカードの利用明細は毎月確認すべき
  • タダより怖いものはない

岡村記事振り返り ―誤解釈があった部分の整理と次回放送を聴いて―

前回の記事、はてブが沢山ついてフィードバックを多く貰ったけれど、今になって思うと一部誤解釈もあったので次回放送内容も踏まえつつ振り返ってみたい。

主要な解釈の間違い

まず全体的な趣旨の解釈として、矢部さんは殺伐とした炎上騒動をコンテンツ/ショー化された「公開説教」に昇華することで、岡村さんを守ることに多くの面で成功した、というものを採用したい。

まずこう書いたけれど、

公開後に確認した記事の「テレビ局関係者」の発言を見るに、矢部さんはかなり素に近い形で日頃から溜まっていた岡村さんへの不満を述べた部分が大きいようだ。私がナインティナインに詳しくなかったことや、「芸能人」に対する先入観があったことが誤解釈につながってしまった。

タイトルの「人の変わらない部分を変える必要はない」について

ブログにはタイトルに突っ込みどころがないと読まれない、タイトルに突っ込みどころがあるとタイトルだけ読まれてディスられるというジレンマがあるけれど、今回の記事も「いや、変わる必要はあるだろ」的なコメントが非常に多かった。

人の変わらない部分を変える必要はない ―ナインティナイン岡村隆史謝罪放送を聴いて― - あなたとあなたの話がしたい

この緩さは大事だと思う。緩さがあるから人は変わっていけもするので。岡村さんの反応の薄さは自分を守るためでもあるように思う。弱者コスプレの言葉があったけど若林とかそこ自認して成長できてる気がする。

2020/05/03 08:15

実のところこの方のコメントが私の感覚に近い。変わること自体が悪いという訳ではなくて、矢部さんの説教は別としてネット炎上のような極端な形で内面改革を強制しようというのはやはり違うだろうと。何か世間の論調として、変化は自発的意思を基礎とすべきという前提が無視されているような方向性を感じたので、その部分に異論を呈しただけで変化そのものを否定したかった訳ではない。

再び矢部さんとコラボした次回放送を聴いて

この回では前回と比べて大分岡村さんがリラックスしていて、冒頭の再謝罪の言葉でも、前回と比べるとかなり状況の整理が進んだ言い回しで、変わる必要についての決意を述べている。

少なくとも公のラジオで喋るプロとしての変化の意思については確かなものがあると見て間違いなさそうだ。

今回は岡村さんが普通に喋っているお蔭で通常のラジオのトークとして面白く聴ける。コンビの2人きりで話す機会も最近はほぼないとか、なかなか複雑な関係性だな、などと如何にもニワカ的な思いを馳せながら聴いていた。

人の変わらない部分を変える必要はない ―ナインティナイン岡村隆史謝罪放送を聴いて―

*1

ナインティナイン岡村さんがセックスワークと貧困に関する不適切発言を謝罪して、矢部さんが「公開説教」した回をradikoのタイムフリーで聴いた感想を書きたい。

矢部さんによる炎上緩和策としての「公開説教」

岡村さんが冒頭から沈痛な様子で謝罪の言葉を述べる中、突如矢部さんが乱入して今日は公開説教しに来たと宣言し、その後はほとんど矢部さん一人の語りが展開される流れだった。

この放送の内容については既にTwitter等で議論されているように様々な切り口で語ることができると思うけれど、私はまず全体的な趣旨の解釈として、矢部さんは殺伐とした炎上騒動をコンテンツ/ショー化された「公開説教」に昇華することで、岡村さんを守ることに多くの面で成功した、というものを採用したい。

そもそも岡村発言の何が悪かったのか

そもそもの前提として、岡村発言の何が悪かったかというのはそこまで簡単な問題ではない。思慮に欠けた不適切な発言というのは誰が見てもそうだけれど、リベラルの原理原則に立つならば、不謹慎だとか、不快だとかいうのはそれだけでは重大な問題ではなく、マイノリティの自由を抑圧する差別性が認められるかどうかが重要だろう。

一次ソースに当たることすらしていない藤田さんの雑な批判記事が起点というのも事態を厄介にしている。私も批判派の見解を読んで勉強はしているけれど、自分の中で岡村発言にどの程度重大な差別性があったのか、という点について納得のある理解に未だ達せられていない。

また、そもそもネット炎上は必ずしも「差別」に関する上に書いたような理解によって起きている訳ではないので、岡村発言の何が非難されているのか、というのは実のところ複雑で難しい問題だ。

そういった背景もあり、岡村さん本人は自分の発言の何が問題だったかということをほとんど理解できておらず、ただ世間の一部が激しく怒っている、反省している様子を見せねば、という曖昧模糊としたリスク回避意識によって、どこか腹落ちしていない様子だけれど、口調のトーンだけは沈痛な感じで謝罪の言葉を並べているという印象だった。

岡村さんを喋らせず逆に自分は無防備に喋る矢部さんの立ち回り

この状態は非常に危うい。ネットの炎上案件において、批判者は謝罪のタイミングで謝罪者の発言の粗を注意深く探し追撃の材料とする。何が悪かったか理解していない謝罪者は失言を重ねてしまう可能性が高い。

かと言ってラジオの枠をすべて空虚な謝罪の言葉で埋めるという訳にも行かないだろう。そこに矢部さんが現れて、ほとんど矢部さん一人が喋る「公開説教」を展開した。しかもガチガチに守りに入っている岡村さんとは対照的に、矢部さんは逆に随分と無防備に発言しているように感じられた。岡村さんだけではなく自身の発言も批判されるリスクについては気にしていないどころか敢えてそのリスクを取りに行っているかのように。

その結果として、放送後は矢部さんの発言は非モテ差別だとかそうじゃないとか、当初の岡村さんへの批判と無関係な部分にネット民の関心を拡散させることに成功している。

「関係性」や「人格」へのフォーカス

放送を通して、岡村さんの女性差別的側面については触れられているけれど、コロナによる不況とセックスワークについての該当発言の何が問題か(あるいは問題でないか)という部分についてはほとんど言及されていない。

その一方で、矢部さんから見た岡村さんとの関係性を、高校のサッカー部での出会いから芸能界での成功、岡村さんの鬱病での離脱、復帰後、と順を追って丁寧に掘り下げつつ、問題の本質は件の発言内容がどうとかということではなく、岡村さんの「根元(人格)」の幼さ、甘えにある、という物語付けを行っている。また岡村さんが不適切な言動を行う際の無意識性、意図しなさについても「天然」という言葉を何度も繰り返して強調している。

このことによって、言葉の言い回し上の不適切性にフォーカスするネット炎上の関心に、岡村さんのバックグラウンドへの想像、共感の文脈を付与することに成功している。

矢部さんが解決策として提案した「結婚」について

矢部さんは自身が結婚、子育てを経験したことによって、女性をリスペクトする気持ちが高まったと語り、岡村さんの「根元」の歪み、女性への忌避意識を変えるために、結婚してみてはどうかと提案する。

ネットでは話が一人歩きしている部分もあるけれど、矢部さんは岡村さんを「非モテ」だとは言っていない。現在進行形で恋人がいる可能性まで言及しつつ、結婚のように責任をもって深く女性と付き合った経験がないことが問題だと言っている。

これは既に方々で激しく議論されているように非常に問題含みの発言だ。

まずきちんとした水準のフェミニズム理解に基づいて言うのであれば、大野さんの見解が正しいだろう。ホモソーシャルの表れ、恋愛至上主義、家族至上主義、女性の聖女化…批判点はいくらでもある。

上掲の匿名ダイアリー等で議論されている高齢独身男性蔑視の問題もあるだろう。

一方で、女性と相互に信頼する親密な関係を築けた経験によって価値観が変わるというのは普通にあり得そうなことでもあって、かく言う私などもそういう経験をダイレクトに経ている身だ。結婚生活においては「ありがとう」と「ごめんなさい」が大事という話なども含めて、矢部さんのアドバイスはありがちなライフハック程度に捉えるのが良いのかなと思う。

岡村さんへのアドバイスとして有効かどうかは怪しい

では当の岡村さんへの提案としての有効性はどうか。これはかなり怪しい。ラジオを生で聴いてみると、岡村さんはこの矢部さんのアドバイスに対して気持ちの入らない様子で曖昧に部分的に迎合するような応答をしているだけだ。特に感銘を受けている様子も、逆に傷ついている様子も感じ取れない。実際のところはもちろん分からないけれど、放送の印象としては特にやる気を起こさせるようなアドバイスにはなっていないように聴こえた。そもそもの話として矢部さんが岡村さんに対して仕事以外のプライベートの部分が大事なんじゃないかと言ったように、本当に重要な助言は公開のラジオで伝えるものではないだろう。

別に変わらなくても良いのでは

結論として、放送を聴く限りでは矢部さんが岡村さんを変える有効なアドバイスを提供できていたという印象はまったくなかったし、そもそも岡村さんが人格を変える必要もなくないか?と思う。

元の不適切発言については、やはりマイノリティの自由を抑圧するような差別発言を公開するのは良くないという言説の効果に注目すべきで、それをしないのであれば各個人の内面がどうなっているかについては無関係な他人が踏み込んで良い領域ではないと思う。

矢部さんが語る結婚、子育てのような「正常な」ライフコースを辿ることで人として成熟し、生きやすくなるという発想を私は積極的に批判したい立場ではないし、人生にそういう側面は往々にしてあると思うけれど、そういうコースに乗れなかったら乗れなかったでその部分は受け容れてやっていくしかない*2

放送中に「天然」という言葉が繰り返されたことから示唆されるように、人には絶対に変わらない、変えられない性質もあると思う。その性質が他者にとって無益、あるいは逆に有害だったとしても、そういう部分にも自他ともに適当な折り合いを付けてやっていけたりするのもまた、ありがちな人のあり方ではないだろうか。

追記

[B! 炎上] 人の変わらない部分を変える必要はない ―ナインティナイン岡村隆史謝罪放送を聴いて― - あなたとあなたの話がしたい

ナイナイがコンビとして続くかどうかの瀬戸際だと認識しろ、誘った側の矢部から解散は言わないが、性格変えないかぎり一緒の仕事はきついって宣言。まあナイナイに興味がなければこのタイトルになるだろうけど。

2020/05/03 06:44

今回ラジオで厳しい言葉を次々とぶつけていたのは驚きましたが、これまで溜まりに溜まっていた矢部さんのホンネなのだと思いました

記事を公開した後に、矢部さんの説教は素の不満に近い的な情報を確認した。

wschldrnさん推察の通り私はナインティナインや芸能界については詳しくないので、その点についてはニワカがこの回の放送の情報だけを元に書いた記事という前提で読んでいただきたい。

記事のタイトルを翻すようだけれど、関係者からしたら変わってくれないと困るというのはありそうかなと思った。

追記記事

*1:2020/10/09追記。リンク切れのため、はてブページに差し替えた。

*2:もちろん一般的なライフコースが望ましいという前提自体万人に成立するものではない。

リモートワークはつらい(自己管理能力のない人間にとっては)

リモートワークが楽しいのは最初だけというツイートを見て、自分も最初はウッキウキでリモートワークを楽しんでいたなあと思い出す。

私の勤務先は元々リモートワーク可の会社だったのだけれど、しばらくやってみるとデメリットの方が大きく感じられて、私はコロナが流行る前はオフィス勤務をメインにしていた。

それが新型コロナの流行でまた毎日リモートワークと向き合わざるを得なくなっているのだけれど正直つらい。コロナが落ち着いたらリモートワークやめたい*1

とは言え今の状況でオフィス出社するわけにもいかないので、個人的に感じるリモートワークのデメリットと対策をまとめてみたい(対策不能のデメリットが多いのが厄介なのだけれど)。

ちなみに社内の他のメンバーを見るとリモートワークで効率的に仕事ができている人も多く、私のように性格的に自己管理能力が低い人間にとってはつらい面も多いという趣旨の記事になると思う。

仕事とプライベートの切り替えが難しい

これが一番大きい。しっかりとオン/オフを切り替えないと、極論すると深夜でも土日でも仕事ができてしまう。また逆に、業務時間中に寝てたりしても監視の仕組みがなければバレない。

こういった事態で起き得るダメな働き方、それは「学生のレポート提出」のように仕事をする、だと思う。つまり、「だりーな、やりたくねーな」と適当にサボりつつタスクを先送りにし、納期ギリギリになって徹夜で何とか帳尻を合わせると。20代前半の学生ならともかくこれを良い歳した大人がやってしまうと体調もメンタルも仕事のクオリティも大幅に悪化して厳しい。

対策

仕事をする「場所」(と仕事をしない場所)を決める

在宅勤務というのは一日中仕事をするという意味ではありません。

Googleのリモートワークアドバイス記事でも、オン/オフの切り替えに重点が置かれているように見える。

  • 働く時間を決める
    • キチンと終業時刻を決めて仮にタスクが終わらなくてもその時刻以後働かないようにすると良いかも知れない
  • 「仕事部屋」っぽい環境を整える
    • Googleの記事にも書いてあるけれど、寝室で仕事するのはダメ、絶対

個人的にもこの辺りが大事かなと感じている(実際にどの程度できるかはおいておいて)。

9:00~17:00でタラタラしてる奴がいて、(勤務終了宣言した後でも、しれっと)10:00~29:00にコードをPushしてくる奴もいる

この記事に書いてあるように、どの組織にも24時間を問わない驚異的なコミット量で結果を出すメンバーがいると思うけれど、そういう人たちに引け目を感じずに自分のペースを守ることが大事だ。

会社側の評価どうなるとかいう話もなくはないだろうけど、それとは関係なく「低パフォーマンスしか出せない自分へのストレス」みたいなものがあって、これを直視できないうちは、そのストレスが雪だるま式にふくれてる気がした。2月〜3月中旬くらい、だいぶそういうストレスを感じていた気がする。

これはたぶん本質的に危険で、どうにかしたほうがいい。とはいえストレス解消のためのアクティビティも軒並み封じられているから、何か方法を考える必要がある。
自分はそのストレスを、直視して、無視することにした。

その点でこの記事の内容は素晴らしいと思う。

難しいタスクにモチベを維持しつつ向き合うのが難しい

自分の現状のスキルの範囲内でできる仕事についてはリモートワークでもサクサクこなせるのだけれど、勉強や調査が必要な難しいタスクがアサインされると一気に現実逃避したくなる気持ちが高まる。

一人で家で仕事をしていると難題に向き合っていても誰も助けてくれない孤独感が不安を呼び、進捗の悪さに焦りをつのらせ泥沼のメンタルに…という悪循環に陥りがちだ。

対策

アメリカで働いている人でもリモートワークが得意な人とそうでない人がいますが、リモートワークが得意な人はほぼほぼ Quick Call をよくすることに気づきました。Quick Call というのは、1対1のビデオ(ビデオオフの場合もありますが)通話のことです。

Microsoftの牛尾さんが気軽に1on1 Mtgすると捗る的なことを書いていて、これは素晴らしい文化だと思った。自分一人だと難しいタスクでも他の人の知恵を借りれば難なく解決する場合も多い。

とは言え、気軽に1対1で通話で相談するには信頼関係の構築も必要かと思うので、その他にも社内チャットで窮状をアピールするとか、自分が困っていることを積極的に発信して人の助けを借りることが大事なのかなと感じている。

運動不足・食生活の悪化

座って仕事して寝るだけの生活を送っていると1週間くらいで深刻な運動不足に陥ってしまう。ここに食事もカップ麺とかしか食べないみたいな生活習慣が加わると体調が一瞬で壊滅する。

対策

リングフィット アドベンチャー -Switch

リングフィット アドベンチャー -Switch

  • 発売日: 2019/10/18
  • メディア: Video Game

Fit Boxing (フィットボクシング) -Switch

Fit Boxing (フィットボクシング) -Switch

  • 発売日: 2018/12/20
  • メディア: Video Game

あまりない。Switchで運動できるゲームとかは良いかも知れないけれど、これはこれで割と面倒くさい。何よりもコロナでまともに外出できないという縛りが非常に厳しい。

食事についても、楽に用意できて、長期的に体調悪化しない食べ物って何か良いものがあるだろうか。私はリモートワークでは牛乳を毎日大量に飲んでいるけれど、これやってたら健康診断でタンパク質の数値がまずいことになった。

人との会話不足

オフィスでできるような雑談ができないもの地味につらい。

会社の同僚で、特にプライベートレベルで親しくはないけれど、楽しく談笑できるみたいな、そういう距離感の人間関係がすごく大事なんだなとしみじみと感じている。

対策

あまりない。同居人がいれば最低限の会話はできる。

最近流行りの「リモート飲み会」はやってみれば分かるけれど、「常に全員に対して話さなければならない」縛りがあるので通常の飲み会とは性質が大きく異なる。逆に身内で2〜4人の小人数で集まって雑談する目的であればビデオチャットツールの活用も違和感ないかなと感じている。

ツイキャスとかの配信でネットのお友達との雑談を試みるという選択肢もあるけれど、ネットの人間関係はウェットな距離感がトラブルを呼びやすい。会社の知り合いくらいの礼節を弁えた距離感が日常的な雑談には好ましく感じる。

これらのデメリットはオフィス勤務の場合すべて自動的に解決される

オフィスに出勤していれば、オン/オフ切り替えも、口頭での仕事の相談も、最低限レベルの運動・食事の確保も、人との会話も、半自動的に提供される。

ちょっと出勤が面倒なだけで大事なことが全部勝手に整うわけだから出社というのは素晴らしい仕組みだなと。

繰り返しになるけれど、実際にはリモートワークで生産性も健康も両方維持できている人も多く、各個人の性格面での適性が大きく影響する働き方だと感じている。

仕事に対する考え方を変えるべきかも

いずれにせよ、上に紹介した記事の方も書いているように、パフォーマンスの低下にあまり神経質にならずにリラックスしてやった方が良いというのはありそうだ。

この記事では敢えてネガティブな面に注目したけれど、「自分の時間を楽しむ」という観点で、リモートワークには有効活用の余地が大いにある。

オフィスでの働き方とは、何か根本的にワークライフバランスへの考え方を改めるべきなのかも知れない。

*1:これは気持ちレベルの話で、実際には自身が感染源となる可能性まで考慮すると現今の情勢での外出には倫理的問題があり、オフィス勤務の再開は十分に事態が落ち着いてから判断すべきだろう。

Twitterのデータダウンロード機能を使ってみたら1GBのデータ量に圧倒されるも肝心の全ツイートのデータが欠けていた話

虚偽DMCA申請による凍結騒動

虚偽のDMCA申請によって複数アカウントが一斉に凍結され、そのうちの一部が数日後に凍結を解除される*1事件があった。

今朝メールを見てみたら、Twitterから「あなたが投稿した画像が著作権の侵害にあたると申請があったので削除した」と連絡がありました。

心当たりがないので一体どの画像?と情報を見てみたら、小学生の娘がカスタムキャストで描いた東方キャラの絵と、森が描いた東方「博麗霊夢」の絵が「著作権侵害」にあたるのだと言われました。

気になって調べてみましたが、記載のあった岐阜県の住所をGoogleマップで見ても険しい自然、山しかない。

法人登録もありませんでした。もちろん社名で検索してもまったく情報が出てきません。個人名にしたっておそらくは偽名でしょう。

これまでもTwitterの凍結を脅威に感じつつも、どこか素朴な印象として凍結されてもやむなしな言動をしたアカウントが凍結されているという感覚があったけれど、今回の事件には自分も何かのはずみで凍結されるかもと思わせるものがあった。

凍結されるとツイートデータの復元は困難か

Twitterは公式でデータダウンロード機能を用意しているけれど、凍結されると使えなくなるらしい。

f:id:fuyu77:20200222193605p:plain

またツイートを記録する外部サービスのTwilogも凍結されると非表示になる*2

突然凍結されたらツイートデータを喪失する可能性もあると考え、Twitterのデータダウンロード機能を利用してバックアップを取っておこうと思った。

1GB以上のデータ量に驚愕する

f:id:fuyu77:20200222195106p:plain

設定からデータダウンロードの準備を行い、しばらくすると準備完了の通知が届いたけれど、表示されたデータ量は何と1643MBで、1GB以上。

f:id:fuyu77:20200222195451p:plain

ダウンロードに2時間以上かかった。

データの全容

f:id:fuyu77:20200222200211p:plain

ダウンロードしたデータは、大量の謎のJSファイルと画像や動画が入っているディレクトリによる構成だった。

ツイート等のコンテンツはJSファイルにJSONの配列形式で入っていて、通常のツイートに加えてDMのメッセージやフォロー、フォロワー、いいね、リスト、モーメント、ミュート、ブロックから広告とのマッチング情報までありとあらゆるアカウント情報がダウンロードされていた。

しかし肝心のツイートのデータが一部欠けている

tweet.jsというファイルに入っているツイートの履歴を表示するビュワーがいくつかネット上に公開されていて、試してみたところ、Twitterを始めてから半年分のデータが欠落していた*3。無駄にデータが重い上に肝心の全ツイートのデータがないのでは話にならないではないか。

代替案

画面上部の「ログイン」より管理画面に入り、「ログのダウンロード」からダウンロードすることができます。
CSV(SJIS)、CSV(UTF8)、XML(UTF8)の3つのフォーマット・文字コードを選ぶことができます。

含まれる情報は、投稿ID、投稿日時、テキスト本文のみです。

TwilogCSVダウンロード機能があり、こちらは7MBのサイズでRTを含む全ツイートテキストがダウンロードできて「これこれ、こういうのでいいんだよ」という感じだった。

結論としては、Twilogにデータ連携して定期的にCSVダウンロードするのが良さそうだ。

*1:2020/02/22現在、森哲平さんはまだ凍結されている。

*2:凍結でTwilogのデータダウンロード機能が使えなくなるのかどうかは不明。

*3:どういうロジックで欠落しているのかは不明。

PuppeteerでWebスクレイピングが捗る ―株マップ.comの銘柄スクリーニング結果を取得する―

趣味の株式投資で投資対象の選定にクォンツ・リサーチ社が運営する株マップ.comの銘柄スクリーニングを便利に使わせて貰っているけれど、これまで

  1. ブラウザのブックマークからスクリーニング結果にアクセス
  2. 表の文字列を手元のテキストエディタにコピペ
  3. 正規表現で扱いやすいデータに置換
  4. 手元に保存しているデータとの差分をチェックし、新たに注目すべき銘柄がないか確認
  5. 上記のフローを複数のスクリーニング条件について確認

という作業に数分かかっていて、Webスクレイピングでの自動化を試みたいと思った。

GASでできそうだったが…

まずGoogle Apps Script(GAS)のUrlFetchApp.fetchでサクッとスクレイピングできそうだったので試してみたけれど、株マップ.comのスクリーニングの表はHTMLのレスポンスに含まれておらずJSで描画されているので、UrlFetchApp.fetchの機能では取得できなかった。

ちなみに今回は試さなかったけれど、PhantomJs Cloudを使えばGASでもできるらしい。

Puppeteerという選択肢

JSの描画に対応できる選択肢としてPythonまたはRubySeleniumを使えばできそうだと分かったけれど、Seleniumは昔触って割と面倒だった印象があり、若干躊躇していると

Python Webスクレイピング テクニック集「取得できない値は無い」JavaScript対応@追記あり6/12 - Qiita

取得だけなら簡単だけどidがとことん無かったりnth-childだと壊れやすいんだよなあ。Chromeなら今ならpuppeteer が楽チンでオススメ。

2018/02/22 19:54

ブコメでPuppeteerを推す声があったのでチェックしてみたところ

  • ヘッドレスChromeを操作するGoogle製のNode.jsライブラリ
  • npm i puppeteerするだけで動くので環境構築が簡単
    • その他のNode.jsライブラリと組み合わせたプログラムの機能拡張も容易
  • APIドキュメントが公式でキッチリ揃っている

お手軽、高機能、Google製の三拍子揃った便利ライブラリだった。

株マップ.comをスクレイピングするプログラム

使い方に慣れるのにそこそこ苦労したけれど、目的のプログラムを作ることができた。

$ node main.js
[
  '1720', '1805', '1814', '1847', '1882',
  '1887', '1888', '2768', '3023', '3228',
  '3254', '3284', '3294', '3388', '3408',
  '4004', '4042', '4215', '5021', '5101',
  '5288', '5351', '5391', '5702', '6463',
  '7525', '7940', '8002', '8020', '8031',
  '8053', '8091', '8354', '8570', '8591',
  '8604', '8928', '8935', '8999', '9504',
  '9810'
]

上のサンプルプログラムを実行すると、このようにスクリーニングされた銘柄の証券コードの一覧の配列が表示される。GitHubにアップした実際のプログラムでは、fsライブラリを使って手元に保存した証券コードの一覧と比較してスクリーニング結果に注目すべき更新がないか確認できるようにしている。

Puppeteerを使う上での注意点

Promise、async/awaitの知識は必須

APIドキュメントを見れば分かるように、ほとんどのメソッドがPromiseを返していて、メソッドはawaitを付けて呼び出すのが基本になるのでPromiseを用いたJSの非同期処理の仕組みは理解しておかないとPuppeteerを使いこなすのは難しい。

Promiseについては、『JavaScript Promiseの本』が分かりやすい。取り敢えずPromiseの仕組みをザックリ理解したら中間は読み飛ばしてasync/awaitの5章に進むみたいな感じでパパッと読み飛ばしてもPuppeteerを使う上では十分な知識が得られた。

ElementHandleの性質に注意

const elementHandle = await page.$('#example-id')
const elementHandles = await page.$$('.example-class')

のようにpage.$page.$$メソッドを用いてjQueryのような記法でElementHandleを取得できるけれど、このPuppeteer独自クラスのElementHandleは、JSの通常のNode(DOM)とは異なるので、例えばNodeのinnerTextプロパティでデータを取得するというようなことができない。

Nodeとして扱いたいときは、evalがついている方のpage.$evalpage.$$evalメソッドを使うと良い。

const text = await page.$('#example-id', (node) => node.innerText)
const texts = await page.$$('.example-class', (nodes) => nodes.map((node) => node.innerText))

こんな感じで、page.$evaldocument.querySelectorpage.$$evalArray.from(document.querySelectorAll) *1の結果が第2引数の関数の引数として渡されるイメージだ。より柔軟に書けるpage.evaluateメソッドもある。

GASと連携した定期実行も可能か

Google Cloud FunctionsでPuppeteerが使えるので、GASと連携してスクレイピングを定期実行して結果をメール通知というようなこともできそうだ。

*1:querySelectorAllで返るNodeListはArrayではないため、 Array.fromで変換して使いやすくしていると思われる。

オタクの原点としての一方的な愛とこき下ろし ―Amazonレビューの評価に惑わされて高級ヘッドホンを2つ買ってしまった話―

ビックカメラでヘッドホンを視聴

気に入って使っていたオーディオテクニカのATH-A500Xが壊れて片耳が聴こえなくなってしまったので、同じオーディオテクニカでヘッドホンを買い換えたいと思っていた。

年始の帰省帰りに名古屋駅近くのビックカメラに寄る機会があったので、ヘッドホンを試聴してみる。オーディオテクニカのヘッドホンに的を絞って手持ちのiPhoneに挿して聴き比べてみる。最初にビックカメラおすすめヘッドホンランキング的なコーナーにあるヘッドホンを聴いてみた(機種は確認しておらず不明)。音に迫力はあるものの低音がゴツ過ぎてちょっとキツい。

次に元々持っていたATH-A500Xに見た目が似ているヘッドホンを聴いてみる。これは素晴らしく感動的な音のように感じた。帰省帰りで荷物が増えるのは嫌だったので、機種をメモしてAmazonで買おうと思った。ATH-A900Zというらしい。

Amazonで評価をチェック

東京の自宅に帰ってからAmazonのATH-A900Zのページを見てみる。レビューの様子がどうも怪しい。

衰えましたよ、確実に

テクニカは往年のユーザーをなめてるね?分かるからねこーいうのは

開発スタッフはもう一度原点を見つめ直した方がいい。

低音寄りの方が受けがいいのだろうか、最近ほかのメーカーでもそうだが
マイナーチェンジがあると高い確率で低音が強まるだけな安易な調整が入るのがホントにいやだ。

何をトチ狂ったかしょーもないありきたりな低音寄りヘッドホンになってしまった、しかも特別チューニングも上手くない、こんな音オーテクでやる意味がない

まず前提に、私はこの商品を買っていません。
何故なら買う気前提で視聴した結果あまりの酷さに購入を中止したからです。

これ、アートモニターシリーズでやることか?
音の作り方が完全にポータブル用途です。

何だかボロッカスに言われているけれど大丈夫なのだろうか、もっと良いヘッドホンがあるのではないかと感じてしまった。

Amazonで検索し直してみたところ、評価が1万件以上も付いていてかつ高評価なヘッドホンがあった。

購入して後悔しない間違い無しのヘッドホンの一つだと思います。

生活が変わりました。「音楽」を楽しめるようになりなりました。

レビューもATH-A900Zと違って手放しの絶賛が多い。結局こちらを買うことにした。

届いたヘッドホンは…

届いたATH-M50xを聴いてみる。

…あれ?

期待したのと違う。クリアな音質だけれど、心に響いてくるものがない。

名古屋のビックカメラで試聴したATH-A900Zはもっと心に沁みる感動的な音を聴かせてくれた気がした。でもそれは思い出補正かも知れない…いや、ビックカメラ店内でiPhoneに挿して試聴した環境で、マイナス補正はあれどプラス補正とかあるか…?きっとあっちのヘッドホンの方が良かったんだ…でもこのヘッドホンも高いしもう一つ買うというのは…と葛藤しつつ、結局ATH-A900Zも買った。

ATH-A900Zを聴く

届いたATH-A900Zを、失敗だったらどうしようと不安になりながら聴いてみる。

ビックカメラで試聴したときと同じように、心に深く響く音が流れて来た。思い切って買い直して本当に良かったと思う。

ATH-A900ZのAmazonレビューを読み直す

ここでもう一度ATH-A900ZのAmazonレビューを読み直してみる。

こと前900に関してはフラットかつ高解像度な音を「長時間」ストレスフリーで聴けるということで紛れもなく名機だった

まずA900に求める事
・やや高音寄りフラットな密閉型
・フルサイズなボディを生かした音場
この二つがかなり重要で初代a900はこの条件を満たしていた

A900がなぜ評価されていたのか、正しく認識してほしい。

私はA900無印を使用しています。
A900の透き通る高音、他の音を邪魔しない上品な低音。高すぎない分解能が逆に有効に作用した高い汎用性。
そして何よりこの価格でこのレベルの音が出せるのかという衝撃を持って愛用していました。
A900Xが発売された時にも順当進化を認めながらも無印に愛着があり、無印がボロくなったら買おうという気持ちで今まで過ごしていました。
そして今、無印がボロくなってきていざXを買おうと思った時にZが発売していることを知り、意気揚々と店に向かった結果がこれでした・・・。

A900ZのZとは最高傑作という意味ではなく、もうこのシリーズは終わりだよという事なのですね・・・。
こんな出来では続編は無いと思います。Xを買えるうちに買いましょう。900シリーズのファンだけに悲しいな・・・。

音自体は悪くないんです。ただ、もう昔のA900の音では無いんです。

どうやらATH-A900→ATH-A900X→ATH-A900Zという順番にモデルチェンジしていて、酷評している人々は初代ATH-A900の長年の愛用者のようだ。愛着と期待が裏切られた怒りをATH-A900Zにぶつけている訳だ。

これは完全な相対評価で、「音自体は悪くない」がATH-A900と比べて…という話なので、そもそもATH-A900を知らない私がレビューの酷評を気にしすぎる必要はなかったという訳だ。

一方的な愛とディス ―オタクの原点―

それにしてもこのATH-A900ZのAmazonレビュー欄、読み返すほどに面白い。痛烈なディスと一方的な愛、謎のこだわり、それらをどこかポエティックに表現する感性、オタクの原点という感じだ。

ネガティブなフィードバックに神経質にならざるを得ないTwitterで、最近は歯に衣を重ね着している私からすると、彼らの様子はのびのびとしていて実に好ましく感じられる。私も今一度原点に立ち還ってみたいような気がした。現実にはもうあの頃には戻れないとしても。