プログラマでありたい

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

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を使って垣間見たスマホの未来

Node.jsのWebスクレイピングモジュール 『cheerio-httpcli』の使い方その1 cheerioでhtmlの要素指定

 少し間が空きましたが、cheerio-httpcliの使い方です。cheerio-httpcliは、HTMLパーサーであるcheerioに、文字コード変換のiconvを組み合わせたHTTPクライアントモジュールで取得したコンテンツの文字コードを良しなにUTF-8に変換してくれます。HTMLの解析&取得自体はcheerioのラッパーなので、DOM指定でHTMLの要素を取得するといったことが簡単に出来ます。cheerioを上手い感じに補っているので、cheerio-httpcliはWebスクレイピングに最適なモジュールとなっています。

cheerioのDOMセレクト機能



 cheerio-httpcliを見る前に、生のcheerioの機能を見てみましょう。そこでまず、基本中の基本であるHTML中から任意のタグを指定して取得するDOMセレクトの機能です。この部分については、cheerioのGithubページにマニュアルがあるので、そちらを見ながらです。

cheerioの基本的な構文

 cheerioのDOMセレクターの基本的な構文は、以下のとおりです。

$( selector, [context], [root] )

selectorは、取得対象の指定。contextは、範囲指定。rootは、どのhtmlタグを親とするかです。何も指定しない場合は、通常htmlタグになるでしょう。selectorとcontextの関係が解りにくいので、実例をみてみましょう。

var html = (function() {/*
        <ul id="fruits">
          <li class="apple">Apple</li>
          <li class="orange">Orange</li>
          <li class="pear">Pear</li>
        </ul>
*/}).toString().match(/\/\*([^]*)\*\//)[1];

var cheerio = require('cheerio'),
    $ = cheerio.load(html);

console.log($('.apple', '#fruits').text());
//=> Apple

console.log($('ul .pear').attr('class'));
//=> pear

console.log($('li[class=orange]').html());
//=> Orange

 selectorについては解るのですが、contextについては直感的ではないような気がしますね。上記1番目の#fruitsを指定している例だと、id="fruits"のモノに限定して検索しています。一方で、2番めの例ではselectorでul .pearで指定して、.attrメソッドで、そのclassの属性を出力するようにしています。3つ目の例は、classがorangeのliタグを検索しています。個人的には3番目が一番直感的で使いやすいです。id指定であれば、ul[id=fruits]でいけますね。

 それでは、ulタグの中のliタグといった指定の仕方はどうするのでしょうか?悩んだのですが、下記のような書き方で指定できました。単純にスペースで区切れば良いのですね。

console.log($('ul li[class=orange]').text());
//=> Orange
属性表示&操作用メソッド


 ここで、属性を表示する為のメソッドを確認してみましょう。
いろいろありますが、スクレイピング用途であれば.attr以外は使わなさそうですね。他に挙げるとしたら、.removeClass等で不要なクラスを一括削除して抽出しやすくするくらいだと思います。

メソッド 概要
.attr( name, value ) 属性取得と設定メソッド。nameのみの場合は取得、設定したい場合はvalueを指定
.prop( name, value ) プロパティの取得と設定メソッド。(input checkbox等の)状態を取得したい場合はnameのみ指定。
.data( name, value ) data属性の取得と設定メソッド
.val( [value] ) input, select, and textarea属性用
.removeAttr( name ) 属性削除
.hasClass( className ) クラスを持っているか true/false
.addClass( className ) クラスの追加
.removeClass( [className] ) クラスの削除
.toggleClass( className, [switch] ) 条件に一致したクラスの追加or削除
.is( selector )  
.is( element )  
.is( selection )  
.is( function(index) )  

まとめ



 ざっとですが、cheerio-httpcliの核の1つであるcheerioによるhtmlの要素抽出の仕方が解りました。今回の一連の調査・実験は、AWS Lambda+Node.jsでどこまでクローラー/Webスクレイピングの実行基盤を作れるか試しています。今回のような基本的なスクレイピングに始まり、動的サイトや巡回型のクローラーを作ってみようと考えています。次は、cheerio-httpcliから実際のサイトの取得を試してみます。Lambdaとは何ぞやという人は、下記の本をよろしくお願い致します。数ヶ月遊び倒せるくらいサンプルを載せております。



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

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



参照:
GitHub - ktty1220/cheerio-httpcli: iconvによる文字コード変換とcheerioによるHTMLパースを組み込んだNode.js用HTTPクライアントモジュール
GitHub - cheeriojs/cheerio: Fast, flexible, and lean implementation of core jQuery designed specifically for the server.

Amazonプライム・フォト(cloud drive)で、写真のバックアップ。或いはAmazonプライムが凄い

 動物園のカバの方が、もう少し活発に動いているのではないかと思われるくらい、怠惰に過ごしているゴールデンウィークです。時間があるので色々とやろうとしているのですが、気がつけば寝てばかりという現実ありますよね。そんな中で唯一生産的なことをしたのが、自宅のMac miniに入れた写真の整理です。

ホームメディアサーバーとしてのMac mini



 以前紹介しましたが、我が家のMac miniはメディアサーバーとしての役割を果たしています。テレビやホームシアターシステムにつないで、音楽や映画を流すためです。が、AmazonプライムにプライムビデオやPrime Musicがついたことで、その役割はほぼFire TVに奪われました。

データの保管先としてのMac mini



 そんな状況で、残された役割はデータの保管先としてのMac miniです。iPhoneとNexusのバックアップ先として利用しています。以前は、プライベートの開発や収集したデータのバックアップ際にも利用していました。しかし、それらの殆どがクラウドもしくはサービス上に保存されている為、バックアップすべきデータとして重要なのは写真だけということに気が付きました。ということで、Mac miniにためられた写真の保管先の検討です。
 一部のデータは、AWS S3に保存されアーカイブ化されています。自動実行するように設定していなかったので、今回自動化しようとしました。が、考えてみると、S3上に置いた写真データは一度も見返したことがなかったです。また、Amazon Primeに入っていると、cloud driveの機能の一部としてAmazonプライム・フォトが容量無制限で使えます。ということで、Amazonプライム・フォトに鞍替えすることにしました。

Amazonプライム・フォトの設定



 Mac版を利用しましたが、設定は簡単です。インストーラーをダウンロードして、アプリインストール後にサインアップするだけです。そして、任意のファイルをアップロードします。

インストーラーからインストール。ダブルクリックするだけです。
f:id:dkfj:20160505123218p:plain

アカウントの設定。Amazonのアカウントです。
f:id:dkfj:20160505123227p:plain

アップロード対象の設定。好きなものを選びます。私は写真のみを対象としましした。
※スクリーンショットはサブのMabbook Airの設定時のものです。
f:id:dkfj:20160505123231p:plain

アップロードが開始したら、後は待つだけです。
f:id:dkfj:20160505123235p:plain

アップロード済みのものは、Webからも閲覧できます。
f:id:dkfj:20160505123222p:plain

Amazonプライムについて



 改めて最近のAmazonプライムの拡充っぷりは凄いと思います。ビデオと音楽が聴き放題で、写真の保存も無制限。月一冊まで、Kindle本も無料で読めます。特典が配送が速いだけだった時代に比べると、隔世の感があります。
 年会費3,980円でこのサービスは素直に凄いと思います。囲い込み完了したら、米国みたいに値上げするという話もありますが、その時はその時に損得を考えれば良いでしょう。