プログラマでありたい

おっさんになっても、プログラマでありつづけたい

完全版!!ジュンク堂書店池袋本店2015年コンピュータ書売上げランキング

 2015年度のジュンク堂書店池袋本店のコンピュータ書の売り上げランキング。作って公開するの忘れてました。座談会レポートで一部公開されていますが、全部版です。

2015年4月ランキング



 話題になった関数型プログラミング本。情熱は凄い。

4月順位 タイトル 書影リンク
1 スッキリわかるJava入門 第2版 スッキリわかるJava入門 第2版 (スッキリシリーズ)
2 たった一日で即戦力になるExcelの教科書 たった1日で即戦力になるExcelの教科書
3 SQL実践入門 SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)
4 機械学習プロフェッショナルシリーズ 深層学習 深層学習 (機械学習プロフェッショナルシリーズ)
5 人工知能は人間を超えるか 人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)
6 関数型プログラミングに目覚めた! IQ145の女子高校生の先輩から受けた特訓5日間 関数型プログラミングに目覚めた!IQ145の女子高校生の先輩から受けた特訓5日間
7 Android Studioではじめる簡単Androidアプリ開発 Android Studioではじめる 簡単Androidアプリ開発
8 理論から学ぶデータベース実践入門 理論から学ぶデータベース実践入門 ~リレーショナルモデルによる効率的なSQL (WEB+DB PRESS plus)
9 Pythonエンジニア養生読本 Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)
10 リーダブルコード リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
11 はじめてのiOSアプリ開発 Swift対応版 TECHNICAL MASTERはじめてのiOSアプリ開発Swift対応版
12 機械学習プロフェッショナルシリーズ オンライン機械学習 オンライン機械学習 (機械学習プロフェッショナルシリーズ)
13 スッキリわかるJava入門 実践編 第2版 スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)
14 Photoshopペイントメソッド Photoshopペイントメソッド
15 入門React 入門 React ―コンポーネントベースのWebフロントエンド開発
16 やさしいJava 第5版 やさしいJava 第5版 (「やさしい」シリーズ)
17 機械学習プロフェッショナルシリーズ 機械学習のための確率と統計 機械学習のための確率と統計 (機械学習プロフェッショナルシリーズ)
18 スッキリわかるサーブレット&JSP入門 スッキリわかる サーブレット&JSP入門 (スッキリシリーズ)
19 Javaパフォーマンス Javaパフォーマンス
20 マスタリングTCP/IP 入門編 第5版 マスタリングTCP/IP 入門編 第5版

2015年5月ランキング



 シェル本というジャンル、根強い人気。

5月順位 タイトル 書影リンク
1 たった一日で即戦力になるExcelの教科書 たった1日で即戦力になるExcelの教科書
2 人工知能は人間を超えるか 人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)
3 スッキリわかるJava入門 第2版 スッキリわかるJava入門 第2版 (スッキリシリーズ)
4 リーダブルコード リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
5 機械学習プロフェッショナルシリーズ 深層学習 深層学習 (機械学習プロフェッショナルシリーズ)
6 デジタル原型師養成講座 デジタル原型師養成講座 プロとして通用するフィギュア作成技法
7 シェルプログラミング実用テクニック シェルプログラミング実用テクニック (Software Design plus)
8 誰のためのデザイン? 増補・改訂版 誰のためのデザイン? 増補・改訂版 ―認知科学者のデザイン原論
9 HTML5&CSS3デザインブック HTML5&CSS3デザインブック (ステップバイステップ形式でマスターできる)
10 その数式、プログラムできますか? その数式、プログラムできますか?
11 わかりやすいJavaEE ウェブシステム わかりやすいJavaEEウェブシステム入門
12 インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門 インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門
13 本格ビジネスサイトを作りながら学ぶWordPressの教科書 Ver.4.X対応版 本格ビジネスサイトを作りながら学ぶ WordPressの教科書 Ver.4.x対応版
14 スッキリわかるサーブレット&JSP入門 スッキリわかる サーブレット&JSP入門 (スッキリシリーズ)
15 スッキリわかるJava入門 実践編 第2版 スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)
16 機械学習プロフェッショナルシリーズ オンライン機械学習 オンライン機械学習 (機械学習プロフェッショナルシリーズ)
17 Pythonエンジニア養生読本 Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)
18 現場のプロが教えるHTML+CSSコーディングの最新常識 現場のプロが教えるHTML+CSSコーディングの最新常識 知らないと困るWebデザインの新ルール4
19 図解 コレ1枚でわかる最新ITトレンド 【図解】コレ1枚でわかる最新ITトレンド
20 ハッカーの学校 ハッカーの学校

2015年6月ランキング



 エクストリームプログラミングの改訂版は嬉しかった

6月順位 タイトル 書影リンク
1 Dockerエキスパート養成読本 Dockerエキスパート養成読本[活用の基礎と実践ノウハウ満載!] (Software Design plus)
2 たった一日で即戦力になるExcelの教科書 たった1日で即戦力になるExcelの教科書
3 人工知能は人間を超えるか 人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)
4 エクストリームプログラミング エクストリームプログラミング
5 スッキリわかるJava入門 第2版 スッキリわかるJava入門 第2版 (スッキリシリーズ)
6 10年戦えるデータ分析入門 10年戦えるデータ分析入門 SQLを武器にデータ活用時代を生き抜く (Informatics &IDEA)
7 リーダブルコード リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
8 インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門 インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門
9 JavaScript入門教室 第3版 10日でおぼえるJavaScript入門教室 第3版 (10日でおぼえるシリーズ)
10 人工知能 人類最悪にして最後の発明 人工知能 人類最悪にして最後の発明
11 誰のためのデザイン? 増補・改訂版 誰のためのデザイン? 増補・改訂版 ―認知科学者のデザイン原論
12 マスタリングTCP/IP 入門編 第5版 マスタリングTCP/IP 入門編 第5版
13 Jenkins実践入門 改訂版 改訂新版Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)
14 スッキリわかるサーブレット&JSP入門 スッキリわかる サーブレット&JSP入門 (スッキリシリーズ)
15 HTML5&CSS3デザインブック HTML5&CSS3デザインブック (ステップバイステップ形式でマスターできる)
16 Fireworksレッスンブック CS6 Fireworksレッスンブック Fireworks CS6/CS5/CS4対応 (-)
17 機械学習プロフェッショナルシリーズ 深層学習 深層学習 (機械学習プロフェッショナルシリーズ)
18 伝わるデザインの基本 伝わるデザインの基本 よい資料を作るためのレイアウトのルール
19 ハッカーの学校 ハッカーの学校
20 シェルプログラミング実用テクニック シェルプログラミング実用テクニック (Software Design plus)

2015年7月ランキング



 人工知能本で上位独占

7月順位 タイトル 書影リンク
1 人工知能は人間を超えるか 人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)
2 人工知能 人類最悪にして最後の発明 人工知能 人類最悪にして最後の発明
3 リーダブルコード リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
4 たった一日で即戦力になるExcelの教科書 たった1日で即戦力になるExcelの教科書
5 スッキリわかるJava入門 第2版 スッキリわかるJava入門 第2版 (スッキリシリーズ)
6 機械学習プロフェッショナルシリーズ 深層学習 深層学習 (機械学習プロフェッショナルシリーズ)
7 おうちで学べるセキュリティのきほん おうちで学べるセキュリティのきほん
8 エクストリームプログラミング エクストリームプログラミング
9 データ解析の実務プロセス入門 データ解析の実務プロセス入門
10 Dockerエキスパート養成読本 Dockerエキスパート養成読本[活用の基礎と実践ノウハウ満載!] (Software Design plus)
11 スッキリわかるJava入門 実践編 第2版 スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)
12 Unityで神になる本。 Unityで神になる本。
13 HTML5&CSS3デザインブック HTML5&CSS3デザインブック (ステップバイステップ形式でマスターできる)
14 10年戦えるデータ分析入門 10年戦えるデータ分析入門 SQLを武器にデータ活用時代を生き抜く (Informatics &IDEA)
15 本格ビジネスサイトを作りながら学ぶWordPressの教科書 Ver.4.X対応版 本格ビジネスサイトを作りながら学ぶ WordPressの教科書 Ver.4.x対応版
16 CSS3開発者ガイド 第2版 CSS3開発者ガイド 第2版 ―モダンWebデザインのスタイル設計
17 スクラム 仕事が4倍速くなる”世界標準”のチーム戦術 スクラム 仕事が4倍速くなる“世界標準”のチーム戦術
18 伝わるデザインの基本 伝わるデザインの基本 よい資料を作るためのレイアウトのルール
19 インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門 インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門
20 いちばんやさしいWordPressの教本 4.x対応 第2版 いちばんやさしいWordPressの教本 人気講師が教える本格Webサイトの作り方 第2版 WordPress 4.x対応 (「いちばんやさしい教本」シリーズ)

2015年8月ランキング



 暗号化本が一番売れているということに、ちょっと希望を見出した

8月順位 タイトル 書影リンク
1 暗号技術入門 第3版 暗号技術入門 第3版 秘密の国のアリス
2 最速の仕事術はプログラマーが知っている 最速の仕事術はプログラマーが知っている
3 人工知能は人間を超えるか 人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)
4 文系で知っておきたいプログラミングとプログラマーのこと 文系でも知っておきたいプログラミングとプログラマーのこと
5 よくわかるHTML5+CSS3の教科書 第2版 よくわかるHTML5+CSS3の教科書【第2版】
6 たった一日で即戦力になるExcelの教科書 たった1日で即戦力になるExcelの教科書
7 機械学習プロフェッショナルシリーズ 深層学習 深層学習 (機械学習プロフェッショナルシリーズ)
8 人工知能 人類最悪にして最後の発明 人工知能 人類最悪にして最後の発明
9 スッキリわかるJava入門 第2版 スッキリわかるJava入門 第2版 (スッキリシリーズ)
10 Unity5 3D/2Dゲーム開発実践入門 Unity5 3D/2Dゲーム開発実践入門 作りながら覚えるスマートフォンゲーム開発
11 リーダブルコード リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
12 ヘルシープログラマ ヘルシープログラマ ―プログラミングを楽しく続けるための健康Hack
13 おうちで学べるセキュリティのきほん おうちで学べるセキュリティのきほん
14 Unreal Engine 4で極めるゲーム開発 Unreal Engine 4で極めるゲーム開発:サンプルデータと動画で学ぶUE4ゲーム制作プロジェクト
15 機械学習プロフェッショナルシリーズ 確率的最適化 確率的最適化 (機械学習プロフェッショナルシリーズ)
16 機械学習プロフェッショナルシリーズ 異常検知と変化検知 異常検知と変化検知 (機械学習プロフェッショナルシリーズ)
17 ハッカーの学校 ハッカーの学校
18 ファンタジー背景画 パーツ編 ファンタジー背景画 パーツ編
19 マスタリングTCP/IP 入門編 第5版 マスタリングTCP/IP 入門編 第5版
20 HTML5&CSS3デザインブック HTML5&CSS3デザインブック (ステップバイステップ形式でマスターできる)

2015年9月ランキング



 Node.jsのクローラー本登場。自著のライバルだけど、いい本だと思う。

9月順位 タイトル 書影リンク
1[http://amzn.to/1W5cXaK:title= 暗号技術入門 第3版] 暗号技術入門 第3版 秘密の国のアリス
2 データサイエンティスト養成読本 機械学習入門編 データサイエンティスト養成読本 機械学習入門編 (Software Design plus)
3 人工知能は人間を超えるか 人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)
4 JS+Node.jsによるWebクローラー/ネットエージェント[開発テクニック] JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック
5 リーダブルコード リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
6 スッキリわかるJava入門 第2版 スッキリわかるJava入門 第2版 (スッキリシリーズ)
7 Effective Modern C++ Effective Modern C++ ―C++11/14プログラムを進化させる42項目
8 あなたの知らない超絶技巧プログラミングの世界 あなたの知らない超絶技巧プログラミングの世界
9 最速の仕事術はプログラマーが知っている 最速の仕事術はプログラマーが知っている
10 ゲームグラフィックス 2015 ゲームグラフィックス 2015 CGWORLD特別編集版
11 たった一日で即戦力になるExcelの教科書 たった1日で即戦力になるExcelの教科書
12 人工知能 人類最悪にして最後の発明 人工知能 人類最悪にして最後の発明
13 機械学習プロフェッショナルシリーズ 深層学習 深層学習 (機械学習プロフェッショナルシリーズ)
14 たのしいインフラの歩き方 たのしいインフラの歩き方
15 ネットワークエンジニアの教科書 ネットワークエンジニアの教科書
16 人工知能入門 人工知能入門
17 PHPはどのように動くのか? PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石
18 Unity5 3D/2Dゲーム開発実践入門 Unity5 3D/2Dゲーム開発実践入門 作りながら覚えるスマートフォンゲーム開発
19 HTML5&CSS3デザインブック HTML5&CSS3デザインブック (ステップバイステップ形式でマスターできる)
20 機械学習プロフェッショナルシリーズ 異常検知と変化検知 異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

2015年10月ランキング



 岩波データサイエンス!!

10月順位 タイトル 書影リンク
1 岩波データサイエンス Vol.1 岩波データサイエンス Vol.1
2 PHPはどのように動くのか? PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石
3 暗号技術入門 第3版 暗号技術入門 第3版 秘密の国のアリス
4 人工知能は人間を超えるか 人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)
5 たった一日で即戦力になるExcelの教科書 たった1日で即戦力になるExcelの教科書
6 スッキリわかるJava入門 第2版 スッキリわかるJava入門 第2版 (スッキリシリーズ)
7 プログラマ脳を鍛える数学パズル プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問
8 データサイエンティスト養成読本 機械学習入門編 データサイエンティスト養成読本 機械学習入門編 (Software Design plus)
9 機械学習プロフェッショナルシリーズ 深層学習 深層学習 (機械学習プロフェッショナルシリーズ)
10 Docker実践入門 Docker実践入門――Linuxコンテナ技術の基礎から応用まで (Software Design plus)
11 人工知能 人類最悪にして最後の発明 人工知能 人類最悪にして最後の発明
12 ITエンジニアのための機械学習理論入門 ITエンジニアのための機械学習理論入門
13 メタプログラミングRuby 第2版 メタプログラミングRuby 第2版
14 リーダブルコード リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
15 サイバーセキュリティプログラミング サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考
16 JS+Node.jsによるWebクローラー/ネットエージェント[開発テクニック] JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック
17 セキュリティコンテストチャレンジブック セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方-
18 スッキリわかるJava入門 実践編 第2版 スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)
19 さよなら、インタフェース さよなら、インタフェース -脱「画面」の思考法
20 Pythonライブラリ厳選レシピ Python ライブラリ厳選レシピ

2015年11月ランキング



 Amazon Web Servers実践入門。いい本だよ!!

11月順位 タイトル 書影リンク
1 人工知能は人間を超えるか 人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)
2 Amazon Web Servers実践入門 Amazon Web Services実践入門 (WEB+DB PRESS plus)
3 深層学習 深層学習 Deep Learning (監修:人工知能学会)
4 岩波データサイエンス Vol.1 岩波データサイエンス Vol.1
5 データサイエンティスト養成読本 機械学習入門編 データサイエンティスト養成読本 機械学習入門編 (Software Design plus)
6 たった一日で即戦力になるExcelの教科書 たった1日で即戦力になるExcelの教科書
7 ITエンジニアのための機械学習理論入門 ITエンジニアのための機械学習理論入門
8 暗号技術入門 第3版 暗号技術入門 第3版 秘密の国のアリス
9 進化計算と深層学習 進化計算と深層学習 -創発する知能―
10 プログラマ脳を鍛える数学パズル プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問
11 サイバーセキュリティプログラミング サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考
12 機械学習プロフェッショナルシリーズ 深層学習 深層学習 (機械学習プロフェッショナルシリーズ)
13 徳丸浩のWebセキュリティ教室 徳丸浩のWebセキュリティ教室
14 ハッカーの学校 ハッカーの学校
15 SwiftではじめるiPhoneアプリ開発の教科書 Swift2&Xcode7対応 Swiftではじめる iPhoneアプリ開発の教科書 【Swift 2&Xcode 7対応】 (教科書シリーズ)
16 スッキリわかるJava入門 第2版 スッキリわかるJava入門 第2版 (スッキリシリーズ)
17 HTML5&CSS3デザインブック HTML5&CSS3デザインブック (ステップバイステップ形式でマスターできる)
18 ビジュアル版 コンピューター&テクノロジー解体新書 コンピューター&テクノロジー解体新書 ビジュアル版
19 HTML5&CSS3モダンコーディング HTML5/CSS3モダンコーディング フロントエンドエンジニアが教える3つの本格レイアウト スタンダード・グリッド・シングルページレイアウトの作り方 (WEB Engineer’s Books)
20 リーダブルコード リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

2015年12月ランキング



 API本は、もう少し色々と出てきて欲しい。

12月順位 タイトル 書影リンク
1 APIデザインケーススタディ APIデザインケーススタディ ~Rubyの実例から学ぶ。問題に即したデザインと普遍の考え方 (WEB+DB PRESS plus)
2 メタプログラミングRuby 第2版 メタプログラミングRuby 第2版
3 人工知能は人間を超えるか 人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)
4 スッキリわかるJava入門 第2版 スッキリわかるJava入門 第2版 (スッキリシリーズ)
5 入門Python3 入門 Python 3
6 ビジュアル版 コンピューター&テクノロジー解体新書 コンピューター&テクノロジー解体新書 ビジュアル版
7 たった一日で即戦力になるExcelの教科書 たった1日で即戦力になるExcelの教科書
8 暗号技術入門 第3版 暗号技術入門 第3版 秘密の国のアリス
9 プログラマ脳を鍛える数学パズル プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問
10 アニメCGの現場 2015 アニメCGの現場 2015 CGWORLD特別編集版 (Works books)
11 深層学習 深層学習 Deep Learning (監修:人工知能学会)
12 あなたの知らない超絶技巧プログラミングの世界 あなたの知らない超絶技巧プログラミングの世界
13 Amazon Web Servers実践入門 Amazon Web Services実践入門 (WEB+DB PRESS plus)
14 インフラエンジニア教本 Volume2 インフラエンジニア教本2――システム管理・構築技術解説 (Software Design別冊)
15 インフラ/ネットワークエンジニアのためのネットワーク・デザインパターン インフラ/ネットワークエンジニアのためのネットワーク・デザインパターン
16 リーダブルコード リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
17 岩波データサイエンス Vol.1 岩波データサイエンス Vol.1
18 データサイエンティスト養成読本 機械学習入門編 データサイエンティスト養成読本 機械学習入門編 (Software Design plus)
19 ITエンジニアのための機械学習理論入門 ITエンジニアのための機械学習理論入門
20 ランディングページ・デザインメソッド ランディングページ・デザインメソッド WEB制作のプロが教えるLPの考え方、設計、コーディング、コンテンツ制作ガイド

感想



 今年は、ランキングに載れるように頑張ります。
一方で、技術書の市場の大きさが決まっているなかで、技術の細分化で1冊あたりの売上が下がっている現状。
出版社としても著者としても辛いんだろうなぁと思います。

cheerio-httpcliを使って、Amazonのほしい物リスト(Wish List)から商品コード(asin)を抜き出す

 40手前の手習いで、cheerio-httpcliの使い方学習中です。
サンプルコードを読んで動作はなんとなく解ったので、次は欲しいデータを取得することで習熟していこうと思います。今回は、公開されたAmazonの欲しい物リスト(wish list)から、Amazonの商品管理コードであるasinを抜き出してみます。


欲しい物リスト(ウィッシュリスト)の構造



 ウィッシュリストは、個々に一意のIDが振られているので(公開設定されているのであれば)ログイン不要で取得できます。例えば、私のウィッシュリストは下記のようなURLになっています。最後のランダムな英数字の部分が、ウィッシュリストのIDです。

http://www.amazon.co.jp/gp/registry/wishlist/3G4653SB32HMZ/

 ウィッシュリストの中身に目を向けてみると、1ページあたり25件づつ表示されます。リストが25件以上ある場合は、ページ番号のボタンで表示されジャンプすることができます。そして最終ページ以外は、「次へ」のボタンがクリックできるようになっています。
f:id:dkfj:20160518074522p:plainf:id:dkfj:20160518074531p:plain

 今回は、一覧中からリンクのaタグを取得し、その中のhref属性からasin、title属性からタイトルを取得します。そして、次のページがある場合は再帰的に取得するようにしてみます。
 一覧中のaタグは複数あるのですが、h5タグの下のclassがa-link-normalのaタグを取るという指定の仕方が良さそうです。
f:id:dkfj:20160518075615p:plain
 「次のページ」は、xPathを取得すると、このような構造になっています。

//*[@id="wishlistPagination"]/span/div/ul/li[7]/a

f:id:dkfj:20160518075626p:plain
id:wishlistPaginationから辿って、直前のliタグがa-lastというクラスを持っているaタグを取ってくるというやり方でできそうです。

cheerio-httpcliを使って、欲しい物リストを取得するコード



 下調べが出来たので、cheerio-httpcliを使って取得するコードを書いてみます。ここまで調べておけば、要素の取得は簡単にできます。

'use strict';

/**
 * Amazonのほしい物リスト(公開)からASINを取得
 *
 */


var client = require('cheerio-httpcli');

var base = 'http://www.amazon.co.jp';
var url = 'http://www.amazon.co.jp/gp/registry/wishlist/3G4653SB32HMZ/';

function getWishList(url) {
  //console.log('getWishList: '+url);
  client.fetch(url).then(function (result) {
    var $ = result.$;
    $('h5 .a-link-normal').each(function () {
      var element = $(this);
      var href = element.attr('href');
      var title = element.attr('title');
      var array = href.match(/(\/dp\/+)(.{10})/);
      var asin = array[2];
      if (asin) console.log(asin);
    });
    var next = hasNextPage($);
    if (next)  getWishList(base+next);
  })
};

function hasNextPage($){
  //console.log($('div[id=wishlistPagination] .a-last a').attr('href'));
  return $('div[id=wishlistPagination] .a-last a').attr('href');
};
getWishList(url);

 しかしまぁ、JavaScriptっぽい書き方でないので、皆さま是非添削してこう書くのだよと教えてください。

Node.jsのWebスクレイピングモジュール 『cheerio-httpcli』のサンプルソースを読み解く

 不定期連載、Node.jsのcheerio-httpcliによるWebスクレイピング講座です。今回は具体的なcheerio-httpcliの使い方をみていきましょう。cheerio-httpcliが公開されてるGithubリポジトリには、豊富なサンプルがあります。サンプル例としては下記の通りで2016年5月現在で11本もあり、これを読んでると一通りの使い方が解ってきます。ということで、サンプル読みながら紹介してみます。

2ちゃんねる検索サンプル



 1つ目のサンプルは、2ちゃんねる検索のサンプルです。特定のワードを入れて、その検索結果を表示するという形です。

まず2ちゃんねるの検索部分がどうなっているかです。サイト上は、下記のとおりです。シンプルですね。
f:id:dkfj:20160514164719p:plain

 HTMLのソースは次のような形になっています。

<div style="display: inline; margin-left: 2.0em;">
	<form method="get" action="http://find.2ch.net/" style="display: inline;">
		<input type="text" name="q" value="" style="width: 16em; height: 1.00em;" id="fulltext-keyword">
		<input type="hidden" name="ita" value="">
		<button type="submit" value="">【新】全文検索</button>
	</form>
	<form method="get" action="http://dig.2ch.net/" accept-charset="UTF-8" style="display: inline;">
		<input type="text" name="keywords" value="" style="width: 16em; height: 1.00em; display: none;" id="thread-keyword">
		<input type="hidden" name="Bbs" value="">
		<button type="submit" value="">スレタイ検索</button>
	</form>
</div>

※見辛いので、適当にインデントをつけました。

 それでは、cheerio-httpcliのソースを見てみましょう。まず検索部分です。

var word = 'ぬるぽ';


var client = require('../index');

client.fetch('http://www.2ch.net/')
.then(function (result) {
  return result.$('form').eq(0).submit({
    q: word
  });
})

http://www.2ch.net/のフォームの一つ目に、『ぬるぽ』という単語を設定してサブミットボタンを押しています。HTMLのソースをみると、【新】全文検索とスレタイ検索があるので、ここで利用しているのは【新】全文検索の方ですね。検索ワードを入れるinput type="text"の名前が、qなのでそこにwordを入れています。なお、requireの部分は、Git等でソースとサンプルをまとめてダウンロードして展開した以外は、下記のように指定します。

var client = require('cheerio-httpcli');

次に取得した結果に対する処理です。先に実行結果をみてみましょう。検索結果の中から、title,url,timestampをJSON形式で出力しています。

[ { title: '【DMM/角川】艦隊これくしょん〜艦これ〜6208隻目 [無断転載禁止]©2ch.net',
    url: 'http://wc2014.2ch.net/test/read.cgi/gameswf/1463111858/294',
    timestamp: '2016-05-13 21:36:28.08' },

〜中略

  { title: '【テレ玉】TVSアニメ専門スレ45【テレビ埼玉】 [転載禁止]©2ch.net',
    url: 'http://yomogi.2ch.net/test/read.cgi/asaloon/1443865196/142',
    timestamp: '2016-05-06 21:01:38.4' },
  { title: '歴史秘話ヒストリア「愛と悲しみの大奥物語」★2©2ch.net',
    url: 'http://nhk.2ch.net/test/read.cgi/livenhk/1462533366/167',
    timestamp: '2016-05-06 20:35:22.01' } ]
終了します

 これを出力しているコードは下記のとおりです。
htmlのソースと比べると、classがboxのdivタグの中から、aタグを抽出しているようです。

f:id:dkfj:20160514215641p:plain

.then(function (result) {
  var $ = result.$;
  var results = [];
  $('.box').each(function () {
    var $a = $(this).find('a').eq(0);
    results.push({
      title: $a.text().trim(),
      url: $a.attr('href'),
      timestamp: $(this).find('.timestamp').text().trim()
    });
  });
  console.info(results);
})

 aタグの抽出の部分が、黒魔術に見えます。

var $a = $(this).find('a').eq(0);

findでaタグを指定して、その後のeqで絞り込んでいます。cheerioのメソッド説明によると、eqは下記のとおりです。

Reduce the set of matched elements to the one at the specified index. Use .eq(-i) to count backwards from the last selected element.

マッチした一つ目の要素のみ取得しているということのようです。使いこなすと便利そうですね。

 2ちゃんねる検索のサンプルで、検索ワードワードを入れて結果一覧から取得するというスクレイピングの基本的な動作が解りました。特に検索結果からの抽出の部分は参考になります。

要素の多段絞込



 後はサンプルの中から、使いそうな記述の仕方をピックアップします。まず、要素の絞込の仕方です。これは、例えば、特定のタグの下のものを選んで、再度絞り込むというやり方です。一度で抽出するという方法もありますが、2回に別けた方がよい場合もあります。ということで、sync.jsの例を見ていきましょう。sync.jsは同期リクエストのサンプルですが、要素の絞込があったのでピックアップします。

$('.b_algo').each(function () {
    // 各検索結果のタイトル部分とURL、概要を取得
    var $h2 = $(this).find('h2');
    var url = $h2.find('a').attr('href');
〜省略〜

 ソースを見ると解るのですが、まずh2タグを抽出し変数に代入しています。次に、代入した変数から再度絞り込んでいます。こう書くと解りやすいですね。この辺りの書き方が、スクレイピングしていて個々人の癖が出る部分だと思います。

不要な情報の削除



 次はタグの中から不要な情報の削除です。私は、あまりこういった方法を使わないのですが、読んでて成る程なぁと思いました。上手く使えば、分岐処理とかが不要になるので効率的になります。この例は、hatena-keyword.jsというはてなのキーワード抽出のサンプルにあります。

var $ = result.$;
  $('#updatekeywords ul li .name').each(function () {
    // NEW!は邪魔なので削除
    $('.new', $(this)).remove();
    console.info('* ' + $(this).text());
  });

Cookie情報の取得



 ログイン後のセッションを維持するために、Cookieを使う場合が多いです。スクレイピングで、ログイン後のページを参照する場合は、ログインしてCookieを取得するといったことが必要です。そのサンプルも、facebook.jsにあります。

client.fetch('http://www.facebook.com/')
.then(function (result) {
  console.info('ログインフォームを送信します');
  return result.$('#login_form').submit({
    email: username,
    pass: password
  });
})
.then(function (result) {
  console.info('クッキー', result.response.cookies);
  console.info('ユーザー名を取得します');
  console.info(result.$('._2dpb').text());
})

感想



 cheerio-httpcliは、サンプルが充実しています。どのサンプルもシンプルでありながら、スクレイピングに必要な要素が散りばめられています。今回じっくりと読むことで、だいたいの使い方が理解できました。ということで、ぜひ読んで動かしてみてください。

シリーズ目次:
Node.jsでスクレイピングするならば
AWS Lambdaでcheerio-httpcliを実行する
Node.jsのWebスクレイピングモジュール 『cheerio-httpcli』の使い方その1 cheerioでhtmlの要素指定

See Also:
『Rubyによるクローラー開発技法』を書きました
アプリケーションエンジニア向けのAWS本を書きました
『Amazon Web Services パターン別構築・運用ガイド』を書きました

Kindle Paperwhiteの7,300円引きセール中。6,980円で買えるぞい!!

 2012年11月に買ったKindle Paperwhite。3年以上毎日酷使をしてたのですが、最近故障してしまいました。原因は何となく解っていて、風呂場で無防備に読んでたり、水たまりに落としたりが原因でしょう。ということで、新しいものを買い直そうと検討していました。

Kindleの選択肢



 KindleというかAmazonのモバイルのガジェットとしては、大きく2つの選択肢があります。タブレット系のFireタブレットと、Eインク系のKindleです。前者はAndroidをカスタマイズしたカラーのタブレットで、後者は白黒だけどバッテリーの持ちが良いというのが特徴です。スマホは常に持ち歩いているので、もう一台持つとしてらやはりKindleが良いです。あと補足すると、Kindle端末は本を読むことしかできないのがメリットです。スマホやタブレットだと途中でTwitterやFacebookに切り替えてしまったり、また外部からの通知が来て中断されたりします。Kindle端末は、それが無いのがメリットですね。

 ちなみにFireタブレットの一番安いモデルである、Fireタブレット 8GBは8,980円です。更にAmazonのプライム会員であれば、クーポンコードの『PRIMEFIRE』を入れると4,000円引きの4,980円で買えます。私は、家の風呂でプライムビデオを見る時に重宝しています。

Fire タブレット 8GB、ブラック

Fire タブレット 8GB、ブラック

Kindleの種類



 Kindleは、現行4機種あります。無印の『Kindle』、主力モデルの『Kindle Paperwhite』、少し前の上位機種『Kindle Voyage』、最近発売された最上位機種『Kindle Oasis』。主な違いは、下記のとおりです。

  Kindle Kindle Paperwhite Kindle Voyage Kindle Oasis
値段※ 8,980円(4,980円) 14,280円(10,280円) 23,980円 35,980円
画面解像度 167ppi 300ppi 300ppi 300ppi
内蔵ライト なし あり-LED 4個使用 あり-LED 6個使用
明るさの自動調整機能付き
あり-LED 10個使用
明るさの均一性が向上
ページおくり タッチスクリーン タッチスクリーン タッチスクリーン
ページめくりボタン付き
タッチスクリーン
ページめくりボタン付き
バッテリー 数週間 数週間 数週間 数か月(バッテリー内蔵カバー装着時)

※カッコ内の値段は、プライム会員向けの価格

 違いが解りにくいのですが、値段の差が大きいですね。簡単にこう考えてみてください。無印とそれ以外は、画面の解析度が倍以上違う。PaperwhiteとVoyageの違いは、ページ送りにボタンが使えるかどうか。VoyageとOasisの違いは、周りの人に凄いと言われるかどうかの違い。
 ということで、私はPaperwhiteで満足できます。

3GモデルかWifiモデルか



 Paperwhiteを買うとして、3GモデルとWifiモデルどちらが良いのでしょうか?これ実は、コンテンツのダウンロードの利便性の問題ではなく、複数のデバイス間のページ同期の問題です。コンテンツのダウンロードは、頻度が少ないのでWifiでも3Gでも、実はそれほど気になることはありません。複数のデバイスで本を読む場合は、ページ同期の問題が出てきます。
 私の場合は、iPhoneのKindleとKindle Paperwhiteを使い分けています。前者は、数分の待ち時間。後者は数十分以上のまとまった時間があるときです。そういった時に、Kindle Paperwhite側が3Gで常に同期していれば無駄な時間がなくなりありがたいです。一方で、Kindel端末でしか読まないよという人にとっては、3Gはほぼ不要でしょう。

結論



 Kindle Paperwhiteの3G版を買い直します。せっかくなので、今度は白色にしてみます。初代に較べてページめくりのスピードも速いらしいので、楽しみです。ちなみに、どうせまた風呂で使うので、3年間の延長保証、2,970円も付けました。落下・水濡れにも対応とのこと。
f:id:dkfj:20160515160508p:plain

 クーポンコード『PAPERW7300』の適用もお忘れなく!!
f:id:dkfj:20160515160757p:plain

Kindle Paperwhite Wi-Fi 、ホワイト、キャンペーン情報つきモデル

Kindle Paperwhite Wi-Fi 、ホワイト、キャンペーン情報つきモデル

See Also:
人生に必要なのは、鼻毛カッターではないだろうか?

はてなブログにAmazonアソシエイトのMobile Popoverを設定する

 趣味がブログの私は、朝起きてAmazonのアフィリエイトの結果を見るのが日課となっています。儲かる儲からないじゃなくて、どういう反響があったかの確認方法の1つにコンバージョンというのは重要です。
※儲かれば嬉しいけどw

 ブログのアクセス解析をみていると、このブログもモバイル経由で見ている人が増えてきています。その割合は、2014年は25〜30%だったのですが、2015年は30〜35%と5%ほど比率が上がっています。その反面、Amazonのコンバージョン率は1.5%くらい下がっています。つまりモバイルユーザに対する訴求がうまく出来ていないということです。

Amazonのモバイル専用ウィジット Mobile Popover



 恐らくAmazonとしても、その辺りは課題なのだと思います。モバイル向けのコンバージョンを上げる為の施策として、AmazonはMobile Popoverというサービスを展開しています。これ何かというと、モバイルでAmazonのリンクを検知するとポップアップで大きく表示するというものです。一見すると邪魔に思えますが、使ってみるとそれほど違和感がなかったです。
f:id:dkfj:20160515135642j:plain

 ということで、このブログにも設定してみました。

はてなブログにMobile Popoverの設定をする



 このブログは、はてなブログを利用しています。はてなブログの場合、レスポンシブデザインのテーマを利用していない限りPC用とモバイル用を別々に設定します。Mobile Popoverは、当然モバイル用に設定します。まず管理画面のデザイン設定から、モバイルアイコンを選択します。

f:id:dkfj:20160515143233p:plain

 ヘッダーもしくはタイトル下に、Amazonのアソシエイトの管理画面から取得したMobile Popoverのコードを貼り付けます。コードは、こんな感じのものです。
※必ず自分のコードを取得して貼り付けてくださいね。

<script type="text/javascript">
  amzn_assoc_ad_type = "link_enhancement_widget";
  amzn_assoc_tracking_id = "dkfj-22";
  amzn_assoc_placement = "";
  amzn_assoc_marketplace = "amazon";
  amzn_assoc_region = "JP";
</script>
<script src="//z-fe.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&Operation=GetScript&ID=OneJS&WS=1&MarketPlace=JP"></script>

貼り付けるコードは、Amazonアソシエイトの左メニューにあるMobile Popoverから取得できます。
f:id:dkfj:20160515143655p:plain

リンク先のコードをコピペするだけです。
f:id:dkfj:20160515143703p:plain

ブログのカスタマイズ



 ブログの改善という意味では、もっと根本的に検討しないといけないことが沢山あります。一番大きいのは、はてなドメインから独自ドメインに変えてから、検索経由の激減です。

f:id:dkfj:20150102132843p:plain

 ペナルティ的な問題点はなさそうなので、一つ一つ自分で改善してスコアを上げていくしかなさそうな感じです。そういった意味で、ページの表示速度改善などJS,CSS等も検討しないといけないところです。また、https化などもしたいのですが、はてな側の制約を回避する方法も検討する必要があります。独自ドメインということで、自前でサイト構築というのも1つなのですが、過去資産の活用という意味ではリダイレクトを捨てるのも大きな決断が必要です。
 このブログも、最盛期は月あたり8万以上のアクセスがあったのですが、今は毎月2万前後です。抜本的に何とかしたいとなぁというところです。時間がないので、お金払って誰かにお願いするのも1つなのかもしれませんね。

人生に必要なのは、鼻毛カッターではないだろうか?

 東京ビッグサイトに3日間出勤中です。りんかい線に乗るために座れないよと思ってたら、有楽町線で豊洲まで行けばいいことに気が付きました。そのお陰で得た時間で1つ有益な話をしましょう。それは、鼻毛カッター!

鼻毛カッター



 私が今まで買ったガジェットの中で、『想像以上に満足したもの』のベスト3に入るのが鼻毛カッターです。パナソニックは、少し気取ってエチケットカッターと言っていますが、日立の場合はズバリ鼻毛カッター。鼻にいれて5秒くらいバリバリしてると、綺麗サッパリ剃れます。掃除の為に中に溜まった毛をみると、ビックリするぐらい太いのや、細かい毛まで沢山入っていて爽快です。そんなことを半月に一度ほど楽しんでいます。そんなこんなでもう7年くらい使っています。

blog.takuros.net

鼻毛カッターと衝撃の開発秘話



 そもそも何故私が鼻毛カッターに興味を持ったのか。キッカケは、@naoya_itoさんの記事を見てです。
d.hatena.ne.jp

 そして最近紹介された開発秘話

twitter.com

 その衝撃の開発秘話です。これは是非よんで欲しいので、敢えて内容は紹介しません。ただ小見出しを見てください。世界のパナソニックのWebサイトでこんなに熱く面白い記事が読めるとは思いませんでした。

  • 鼻毛はなぜ必要なのか。
  • 鼻毛が出ていると仕事ができないと思われる?
  • 鼻毛処理の研究に、人生をかける。
  • 奥から生えている鼻毛も逃さない。
  • 剃り味が良すぎてもダメ。
  • 開発チームから鼻毛が消えた。
  • 人工の鼻毛を開発。
  • 安心して鼻毛を剃ってもらうために。
  • 鼻毛カッターで、体中の毛を剃った。
  • 鼻毛だけじゃない、耳毛も剃れる。
  • 鼻毛の処理方法が間違っていると、化膿する可能性も。
  • 鼻毛処理に掃除機の技術をプラス。
  • 私と鼻毛は「切っても切れない関係」ですね。

 そして、最後の結論が秀逸すぎます

鼻毛は、コミュニケーションを破壊する魔物。

人工の鼻毛を開発してまで作った鼻毛カッター。納得の使用感です。

感想



 あなたの人生に、鼻毛カッターは必要ないですか?

パナソニック  エチケットカッター   グレー ER-GN50-H

パナソニック エチケットカッター グレー ER-GN50-H

See Also:
替え刃もあるよ。Panasonicの鼻毛カッター

Googleの狙う未来

 前回、Nexus 5Xを使ってみてgoogle恐ろしいと感じたというエントリーを書きました。

Nexus 5Xを使って垣間見たスマホの未来

最近Publickeyさんを見てたら、GoogleのCEOであるサンダー・ピチャイのブログの翻訳を解りやすく解説した記事があり、いろいろと腑に落ちました。

www.publickey1.jp

スマホ普及後の世界



 スマホの普及率が6割を超えて、必要とする人にはほぼ行き渡っている状況です。次は、AppleWatchなどいわゆるウェアラブル・コンピュータと呼ばれるモノに広がろうとしています。ただし、根本的には一人の人間が同時に扱えるデバイスは1つしかありませんし、一人あたりに割り当てられた時間は1日24時間しかありません。スマホ普及時は、電車や外出先など今までタッチできなかった隙間時間にインターネットができる(⇒広告を配信できる)という大きなアドバンテージがありました。その時間はスマホによって既に埋められたので、例えウェアラブル機器が普及しても、今後は機器間での時間の奪い合いにしかなりません。そしてGoogleの戦略としては、そこを全て抑えるという方向に進んでいるというのが、Googleのレターでよく解りません。
※上記の文脈でいうとメーカー等が、せいぜい60億か70億人という先が見えている人に対してではなく、桁が2つや3つ違うモノに対するインターネット(IoT)に関心がいくのは当然に帰結なのでしょうね。

感想



 この手の話を考えると、結局人の時間をどれだけ専有できるかになってきます。そして、それは広告の話に帰結します。雑な考え方すると広告費というパイを、普及数×占有時間で割っていくという図式です。最後は、広告モデルってどんなに強力なんだよと絶望して終わります。

See Also:
Nexus 5Xを使って垣間見たスマホの未来