週1回、アメブロをバックアップしています

なぜ?

私の嫁がアメーバブログ(アメブロ)をやっているのですが、つい最近までバックアップを一切取っていませんでした。まだ始めてから1年くらいしか経っていませんが、ほぼ毎日更新しています。ですので、このデータが消えたらきっと立ち直れないだろうなぁ、というくらいの記事数になっています。

データが消えると言っても、ブログ管理者が、「システム障害発生。バックアップから復旧しようとしましたが、失敗しました。ごめんなさい、てへっ。」と釈明するような事があるとは思っていませんし、「規約違反により、あなたのブログは削除されました。ご愁傷様です。」いう背筋の凍る告知を受ける事もないと思っています。

私が心配しているのは、3歳の息子が嫁のスマホを勝手にいじってブログ閉鎖してしまうだとか、嫁が誤操作して違う記事を消してしまうといったケースです。

結局、自分でスクリプトを組みました

そういう訳で、ブログ記事をバックアップしてくれるツールを探してみたのですが、ピンとくるものが見当たりませんでした。有償のブログバックアップサービスなどもありましたが、追加のランニングコストをかけてまでやるのは、あまり気が進みません。

なので、自分でツールを作る事にしました。以下が、実際に作ったスクリプトです。

<?php
function get_blog_rss($max, $url) {

    if (ini_get('allow_url_fopen')) {
        $rss = simplexml_load_file($url);
    } else {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $xml_raw = curl_exec($ch);
        $rss = simplexml_load_string($xml_raw);
    }

    $cnt = 0;
    foreach ( $rss->channel->item as $item ) {
        $cnt += 1;
        $pubDate = strtotime($item->pubDate);

        if (strpos($item->title, 'PR:', 0) === FALSE) {
            $filename = basename($item->link) . date('.YmdHi', $pubDate) . ".webarchive";
       # webarchiverのインストールが別途必要です
            system("/opt/local/bin/webarchiver -url {$item->link} -output {$filename}");
            print("[". date('Y-m-d', $pubDate). "] " . $item->title . " -> " . $filename . "\n");
        }

        if ($max <= $cnt) {
            break;
        }
    }

    return $list;
}

# 最近のPHPは、タイムゾーン指定が必須です
date_default_timezone_set("Asia/Tokyo");

# 最大バックアップ記事数と、RSSのURL(xxxxは、アメブロのアカウント)を指定します
get_blog_rss(10,'http://feedblog.ameba.jp/rss/ameblo/xxxx/rss20.xml');

PHP 5.5.30で動作確認しています。このスクリプトを動かすには、webarchiverというツールを、(MacPortsなどを使って)別途インストールする必要があります。
ターミナルから、以下のコマンドを入力すると動きます。

#"/path/to/"は、スクリプトの配置先パス
php /path/to/rss_archiver.php

このスクリプトでは、アメブロのRSSから最近の記事一覧を取得して、各記事を、SafariのWebアーカイブ形式でMacのハードディスクに保存しています。

Webアーカイブは、Safariで直接表示できます。ページのテキストや画像がそのまま1つのファイル(正確にはバンドル)にまとめられているので、ファイル管理も楽チンです。

プログラマーの目線で見ると、アメブロって扱いづらいですね。RSSくらいしか使えるAPIがありません。

 

今のところ、イメージ通り使えてます

私は、これを週1回、手動で起動する運用にしています。スケジュールを組んで自動起動させることもできるのですが、バックアップがきちんと取れている事を随時確認できるので、実は手動のほうがお手軽かつ確実だったりします。

このツールを、Macアプリ・Windowsアプリ化して広くリリースすべきでは?とも思ったのですが、私自身はこのスクリプトでイメージ通りの運用ができているので、思いとどまっています。リクエストあれば、ご連絡ください。

 

頓挫した超小型ドローンプロジェクト「Zano」のBackerだった私

超小型ドローンプロジェクト「Zano」の頓挫

クラウドファンティングサービスを提供しているKickStarterで、4億円以上の出資を獲得した超小型ドローンプロジェクト「Zano」が、2015年11月に頓挫しました。

Kickstarterは、フリーランス記者のMark Harrisさんに、Zanoプロジェクトが頓挫するまでの経緯をまとめて、記事にして欲しいと依頼しました。その記事がこちら

実は私、このプロジェクトのBacker(出資者)でした。2万円出資して、見返りに超小型ドローンを1台もらう予定でしたが、頓挫により、手元には何も残らないことが確定しました。ああ、悲しい。

プロジェクトの失敗が投資につくまとう当然のリスクであることは、Backerになる前から理解していました。でも、頓挫を知った時はとてもショックでした。なぜそう感じたのか?そこを深く考えた時、少し見えてきたものがあります。

「寄付」と「購入」

クラウドファンディングに出資するBackerには、「寄付」と「購入」の2つのマインドが混在しています。「寄付」は、直接的な見返りを求めないでお金を渡す行為。対して、「購入」は見返りを貰う前提でお金を渡す行為です。

今回の私は、「寄付」ではなく「購入」のつもりでした。もしこれが、応援したいという気持ちからの「寄付」であれば、特に落ち込むこともなかったと思います。

では、なぜ「購入」のつもりになったのか?表面的な見方をすれば、「2万円投資する見返りに、Zano本体を1台送ります」というプランを選択したからと言えますが、失敗する可能性がある事は理解していたので、そのプランをそのまま鵜呑みにした訳ではありません。

「購入」しようと思った理由

決め手となったのは、デモ動画でした。とても滑らかにスイスイと自在に動く超小型ドローンを見て、「お金さえあれば、すぐにでも量産できるんだ!」と勝手に思い込んでしまったのです。

一般的な製品開発プロセスは、「商品企画」→「試作」→「量産準備」→「量産」です。消化できてないプロセスが多い程、失敗リスクが大きいです。まだ「試作」中のプロジェクトよりも、後は「量産」を残すのみというプロジェクトの方が、失敗リスクが少ないということです。私はデモ動画を見て、Zanoプロジェクトは「量産」を残すのみなのだ、と勘違いしてしまったため、「購入」同然だと思ったわけです。

残念な現実

ですが、Markさんの記事によると、実態は違ったようです。試作機は、基本的な飛行性能の品質が不十分で、まだ「試作」が終わっていない状況。「量産」にかけるべき出資金を、試作開発で使い込んでしまったようです。(他の用途でも使っているようですが、ここでは割愛)

冷静に考えれば、デモは何回でも撮り直しできるし、”編集”という魔法も使えるから、デモ動画では試作機の本当の品質は評価できないですよね。
もし、投資する前に私がそこを理解できていれば、「寄付」のつもりでもっと少額のプランを選んでいたと思います。2万円という安くない金額をすんなり出せたのは、「購入」するマインドだったからです。

Backerには批判的な姿勢が必要

トヨタ生産方式や失敗学でしきりに言われている、「現地・現物・現人」の大切さを改めて感じました。そこまでしないと、本当の事実は掴めないのだと。
とはいえ、クラウドファンディングの世界では、プロジェクトオーナーと面識もなく、直接会話できる関係にもないのが普通なので、それが難しい。できることといえば、批判的な目でデモや資料に目を通し、疑わしい点があれば、別の情報ルートから裏を取ることくらいでしょうか。クラウドファンディングの出資者には、そういう姿勢が必要なのだろうと思います。
「寄付」のつもりなら、プロジェクトオーナーの言い分を鵜吞みにしても良いと思います。Facebookでいう「いいね!」みたいな感じで、気軽に。

おわりに

今回は、私にとって初めてのクラウドファンディングでした。手元には何も残りませんでしたが、いい教訓は得られたので2万円は安い授業料だったと思います。同じ開発者として、Zanoのプロジェクトオーナーには同情しています。頓挫するまでの間、大変な苦労をしたことだろうと思います。再起に期待。

AppleのHealth Kitへの違和感が解消

第7回講演会「情報工学が切り開く医療分野」に参加してきました。
医療の最前線で研究に従事している篠原先生から、情報工学のポテンシャルについて貴重な話をたくさん聞くことができ、とても有意義でした。

その中で、iOS8以降でリリースされているHealthKitの話題もあり、私が今まで持っていたHealthKitに対する違和感をきれいに解消してくれました。

なぜAppleが?

初めてAppleがヘルスケア機能(HealthKit)をリリースしたとき、私は、医療機器メーカーでもないのに、なぜAppleがこの分野に?という違和感を持っていました。Apple Watchの付加価値を少しでも上げる為に、半ば強引に参入したのかな…なんてことを勝手に想像していました。しかし、そこにはもっと大きな意味が含まれていたようです。

医療分野における機械学習の限界

例えば、マンモグラフィーや超音波検査などにより得た乳がんの診断画像を大量に集めて、機械学習させて、がんの有無を画像認識により自動検出したいとします。(乳がん検査は、肉眼では判定しづらいのが現状のようです)この場合、乳がん患者とそうでない人たち双方の診断画像が大量に必要です。

乳がんの発生確率は10万人のうち50人くらいだそうなので、裏を返すと、陽性の診断画像を50人分集める為には10万人にアクセスする必要があります。

とはいえ、陰性の9万9950人の診断結果をどこから取得するのでしょうか?乳がん検査はメタボ検診のように義務化されていないなので、任意で受診する人が10%いたとしても、残り9万人については、受診データ自体が存在しません。

機械学習や画像認識の技術がどれだけ進んでも、そのベースとなるインプット(ビッグデータ)を集められないので、結果が出せないわけです。

Nを確保できる可能性がある

そんな状況の中で、AppleがHealthKitをリリースしました。
iPhone, Apple Watchは医療機器ではないので、質問票に回答したり、脈を測ったり、軽い運動をさせて加速度センサーで測ってみたりと、できることには限りがあります。

しかし、利用者数が他の医療機器と比べて圧倒的に多いので、病院に行かない多数の健常者から、大量の診断データを収集確保できる可能性があります。(専門用語的に言うと、「Nを確保できる」)今まで、そんな事ができるデバイスは存在しませんでした。

そこまで理解して初めて、HealthKitはAppleがやるべきなのだと納得できました。

人工知能は、コンピューターウィルスと同じくらい誤解されている

人工知能がスーパーマリオをクリア

人工知能を使って、スーパーマリオをクリアする動画が公開されています。

NEATと呼ばれる遺伝アルゴリズムを使っているのですが、1000行足らずのコードでキレイに実装されており、とても感心しました。

「人工知能」という言葉が招く誤解

最近、人工知能に高い関心が寄せられ、ニュースのトピックによく上がるようになってきました。(車の自動運転や、音声認識で会話するSiriなど)

ただ、「人工知能」という言葉は誤解を招きやすいと思います。その言葉の響きは、「いずれ人間の仕事がなくなる」「自分の意思で動く」など、とかく妄想を掻き立ててくれるのですが、実際にやっていることは統計を取って、尤もらしい方を選ぶだけです。

例えば、MarI/Oはこんな感じで動いています。

目指すゴール

クリアするまで右に進み続ける。コインやアイテムを集めることはしない。

戦略

1. 右矢印は、ずっと押し続ける。他のボタンは「ランダムに」押したり押さなかったりする。これを、数千回繰り返しプレイする。(当然、こんな雑なやり方では、数千回程度繰り返したところでクリアできない)

2. 各プレイを見てみると、ゴールにより近づけたプレイとそうでないプレイがある。ゴールにより近づけたプレイに共通する操作(何秒後にどのボタンを押すか?)を見つける。

3. もう一度1からやり直し。ただし、他のボタンはただ「ランダムに」押すのではなく、見つけた特徴をまねして操作する。過去のどのプレイよりもゴールに近づき、まねるべき特徴がなくなったら、再び「ランダムに」押したり押さなかったりする。

これをひたすら鬼のように繰り返していると、いつかゴールに着く気がしますよね。

右へ倣え!前例を探せ!それがなかったら・・・ダメモトでやってみるしかない!

なんか、人工知能ってすごい保守的で残念な社員みたいです。(笑)

ですが、この残念な社員には素晴らしいポイントが2つあります。

・徹底的に前例を探してくれる

・タダ同然で働いてくれる

どちらも、人工知能に限った話ではなくコンピューター処理全般に当てはまります。人の限界を超えるビッグデータを、極めて正確かつ高速に捌けるコンピューターだから実現できるのです。

人工知能は、人間の仕事を駆逐する?

「人間が今やっている仕事は、いずれ人工知能に置き換わる」という風説がありますが、実際にそうなると私も思っています。

付け加えるなら、それは、何も人工知能に限った話ではないということです。コンピューターの応用分野が広がると共に、人間の仕事がなくなる状況は昔からある事です。セルフ方式のガソリンスタンドやネットバンキングなどがいい例です。

さらに言うと、「全ての」仕事が人工知能に置き換われるとも思っていません。

保守的で残念な社員だけで構成された会社は、時代の流れについていけないからです。しかし、この会社に優秀な社員(=生身の人間)が1人加わり、残念な社員達(=人工知能)を上手にコントロールできれば、優秀な社員1人分よりもずっと良い仕事が期待できます。

 

人工知能を研究中の私は、人工知能をこんな風に捉えています。

netshが難しいと感じる方には、NCSwitchがオススメ

WindowsタブレットやPCを日常的に持ち歩いていると、IPアドレスなどのネットワーク設定を頻繁に切り替える必要があります。移動する度に設定をいじるのは面倒なので、簡単にできる方法を探している方も多いのではないでしょうか?

簡単にできる方法をネットで調べてみると、「netsh(ネットシェル)使えばできるよ!」という記事がよくヒットします。netshはWindowsの標準機能の一つで、様々なネットワーク設定の取得・設定ができる”コマンドラインツール”です。

コマンドラインツールとは、「コマンドプロンプト」からコマンド(命令文)と呼ばれるテキスト入力を介して実行されるツールのことです。マウスは使わず、キーボード入力のみでコントロールします。コマンドプロンプトの作法やコマンドの使い方など、要求される予備知識が多く、初心者向けの機能ではありません。

コマンドプロンプト
コマンドプロンプト

 

「難しいことはしたくない。ただ、ネットワーク設定を簡単に切り替えたいだけなんだ!」という方には、netshよりもNCSwitchをオススメします。

ウィザード画面から簡単に操作できますし、ネットワーク設定以外にも、デスクトップの壁紙など、あわせて切り替えたい様々な設定(netshがサポートしていない設定)にも対応しています。

しかも、一度保存したネットワーク設定は、そのネットワークに再接続したタイミングで”自動的に”復元します。netshでバッチを組んだ場合、接続ネットワークが変わる都度、作ったバッチを手動で実行する必要があります。

難しいことはしたくないという方は、NCSwitchを使いましょう。

[Windows Tips] ネットワークの場所とは? 〜ホーム(プライベート)、パブリック、社内(ドメイン)〜

”ネットワークの場所”とは、Windows Vista以降から導入されている概念です。主に、ラップトップやタブレットを持ち運ぶユーザーのセキュリティ向上を目的としています。

PCを初めてネットワーク接続した時、Windowsはネットワークの場所を尋ねてきます。
ネットワークの場所の確認ダイアログ<Windows 7の場合>
接続するネットワークを予めカテゴリ分けしておくと、下記のようにセキュリティ向上に役立てることができます。

  • 自宅のネットワークに接続するとき

このPCに格納されている写真や書類などのファイルを、他のPCからアクセスできる(共有ON)

  • 外出先の無線ネットワーク(Wi-Fi・3G/LTEなど)に接続するとき

他のPCからこのPCが見えない為、不審者やウィルス感染したPCなどがファイルを覗くことはできない(共有OFF)

この仕組みは、「共有の詳細設定」と「Windowsファイアウォール設定」を、ネットワークの場所毎に保持することで実現しています。Windowsは、ホーム(プライベート)、パブリック、社内の3セットの設定を常に保持しており、現在接続しているネットワークのカテゴリに応じて、適用する設定を使い分けているのです。共有の詳細設定<Windows 7の場合>Windowsファイアウォール設定<Windows 7の場合>

 

ちなみに、Windowsは一度つないだネットワークを覚えているので、ネットワーク接続の都度、毎回同じことを尋ねたりはしません。LANケーブルの形や、無線ネットワークの規格(Wi-Fi)はどこでも同じなのに、個々のネットワークをどうやって見分けているのでしょうか?

インターネットは、小さなネットワークの集合体です。ネットワーク毎に、その管理者が必ずいます。

例えば、あなたがインターネット接続プロバイダと契約して自宅でインターネットをしている場合、ネットワークは2つ存在しています。プロバイダのネットワークと、あなたのネットワークです。

インターネットは小さなネットワークの集合体

 

 

通信相手があなたのネットワークの外にいる場合、ルーターと呼ばれる機器を経由して通信する必要があります。Webやメールを使う場合、通常、通信相手はあなたのネットワークの外にいます。

Windowsは、ネットワークに必ず1台は存在している、このルーター機器のシリアル番号(MACアドレスと呼ばれており、世界共通でユニークな番号)を使って、ネットワークを識別しているのです。

ちなみに、私が開発したNCSwitchも同じ仕組みでネットワークを識別しており、Windowsの各種設定を自動的に切り替えしています。Windowsの標準機能では、今回説明した通り一部の設定(共有の詳細設定、Windowsファイアウォール設定)しか切り替えできませんが、ネットワークと関係の深い設定は、他にも沢山あります。(IPアドレスなどのTCP/IP設定、プロキシサーバー、既定のプリンタ、ネットワークドライブ、音量、ドメイン・ワークグループなど)

NCSwitchを使えば、これらの設定もまとめて切り替えることができます。ネットワーク接続する度にWindowsの設定をいじっているような方に、特にオススメです。(NCSwitchのダウンロードはこちら

 

デスクトップを拡大して、文字を大きくできるWindowsアプリ

Windowsタブレット向けに、デスクトップを拡大して、文字を大きくできるWindowsアプリを試作しました。

YouTubeに紹介動画をアップしましたので、ぜひご覧ください。(YouTubeサイトから評価して頂けると嬉しいです)

https://www.youtube.com/watch?v=d_vKx7c5TPw

このアプリを使えば、デスクトップのどの部分でも、拡大表示できるようになります。右クリックメニュー、拡大できないWebページ、画面の文字が小さいWindowsソフトなどなど、なんでも拡大します。

実は、Windowsには標準で「拡大鏡」という、同等の機能を実現するアプリが既にあります。にもかかわらず、このアプリを作りました。
タブレットの拡大/縮小操作といえば、2本指(親指と人差し指)で行う「ピンチ操作」が最も直感的で操作しやすいのですが、「拡大鏡」はそうなっていません。(身体障害のある方にも使えるように、とか、いろいろなデバイスで使えるように・・・とか、そういう理由があっての事だろうと思います)
このアプリは、ピンチ操作で、デスクトップ領域のどこでも直感的に拡大できます。

私は特に視力が低いわけではありませんが、マウス操作前提で作られたソフトウェア(つまり、大半のWindowsソフト)を指で操作しようとすると、いつもイライラします。特に、右クリック(Windowsタブレットの場合は長押しタップ)で表示するコンテキストメニューがそうで、メール本文の作成中に、「メールを保存する」と「メールを送信する」が並んでメニュー表示されていると、指が震えて一時保存できません。
「拡大鏡」よりも手軽で、必要な時にサクッと使えるアプリが欲しくなったので、作ってみました。

ああしてほしい、こんな機能も欲しい・・・などなど、教えていただけると嬉しいです。