【Google Apps Script】Gunosyまとめに「はてブカウンター」をつける

f:id:misozui:20131104123018p:plain
一時期「はてブ」の拡張サービスにすぎないとか言われていたGunosyですが、個人的には最近は「はてブ」のホットエントリでチェックしていない記事がピックアップされるようになったと感じます。数字の裏付けはなくただの印象にすぎませんが。Gunosyまとめメールのクリック率は私の中では以前に比べて高くなりました。(それと比べるとはてなのマイホットエントリーは、前の晩に見たなー、という記事が多いです、当たり前なのでしょうけれども)。

ただ、Gunosyまとめのメールに「はてブウンター」がないのが不便に感じます。やはりいい記事だとブクマ数とかになりますし、あと他の人のコメントもみたいと思います。PCだとブラウザの拡張機能でチェックできるのですが、Androidだと無理です。

そこで、Google Apps Scriptを使って、Gmailで受信したGunosyまとめメールを、本文に「はてブウンター」を挿入して自分に送り返すようにしてみました。

スクリプト

正規表現で要素を取得して置き換えをしています(htmlメールのhtmlもDOMで操作できればもっと簡単にできるのだと思いますが)。

function forwardGunosyWithHatebu() {
  //受信トレイのスレッド取得
  var threads = GmailApp.getInboxThreads();
  for (var i = 0; i < threads.length; i++) {
    //スレッドのメッセージ取得(最初のメッセージだけ取得すればいいかも
    //しれないけど一応)
    var msgs = threads[i].getMessages();
    for (var j = 0; j < msgs.length; j++) {
      //差出人を判定してbodyを取得
      var msg = msgs[j];
      var from = msg.getFrom();
      if ((/noreply@gunosy.com/.test(from) && 
           msg.isUnread()) == false) continue;
      var body = msgs[j].getBody();
      //tr要素でループ
      var pattern_tr = /<tr>([\s\S]*?)<\/tr>/g;
      var tr;
      while (tr = pattern_tr.exec(body)){
        //記事元のurlを取得
        var pattern_url = /url=([\s\S]*?)&amp;p=/
        var urls = pattern_url.exec(tr[1]);
        if (urls == null) continue;
        //はてブカウンター
        var deurl = decodeURIComponent(urls[1]);
        var span = '<span style="float:right;padding-left:5px">'
        var span_hatebu = '<span style="float:right;padding-left:5px">' +
          '<a href="http://b.hatena.ne.jp/entry/' + deurl + '" target="_blank">' + 
          '<img alt="" src="http://b.hatena.ne.jp/entry/image/large/' +
          deurl + '"></a>'
        //要素の置き換え
        var oldtr = tr[1];
        var newtr = tr[1].replace(span, span_hatebu);
        body = body.replace(oldtr, newtr);
      }
   //自分にメール
      var mymailaddress = '<fill in your account>@gmail.com';
      var title = msg.getSubject();
      var opt = new Object();
      opt.htmlBody = body;
      GmailApp.sendEmail(mymailaddress,'Gunosy with はてブ FW:' + 
                         title,'',opt);
      msg.markRead();
    }  
  }
}

スクリプトの実行

Googleドライブでスクリプトを作成し、上記のコードを保存、スクリプトにトリガーを設定してあげれば完成です。トリガーといってもメール受信のイベントで起動させるようなトリガは(今のところ?)なく、日時によるイベントしか設定できません。しかも「7時30分」といった特定の時間に起動させる設定はできませんので、「午前7時から午前8時」といった時間帯で指定する必要があります(そうでなければ5分おきに起動するようにすることもできなくはないですが)。

遅くとも午前8時に受け取りたい場合は「午前7時から午前8時」に設定するとよいでしょう。ただしGunosyまとめメールの既定の配信時間は午前7時30分になっていますので、その場合、空振りをさけるために、配信時間を午前7時00分に変更する必要があります。

スクリプトの実行によって配信されたメールにはfacebookアイコンの横に「はてブウンター」がついています。
f:id:misozui:20131104123023p:plain

やってみてわかったこと

実際にGunosyまとめメールに「はてブウンター」をつけてみると、記事には軒並み2桁以上のブクマがついていました。冒頭の印象とは食い違うのですが、過去記事の掘り起こしとかもやっているのでしょうか。そのあたりは調べていないのでわかりませんが。

SQL ServerでSplit関数を実装する方法

SQL Serverの言語TSQLには標準でSplit関数が組み込まれていませんが、これを自作する方法が下記のサイトで紹介されていました。

http://ole.michelsen.dk/blog/split-string-to-table-using-transact-sql/

 

テーブル値関数の構造となっており、戻り値がテーブル型になっています。実行すると図のようになります。

 

上記のサイトで紹介されているSQL文ですが、このまま単純にコピペできて動作して便利!なのですけれども、再帰クエリや、COALESCEなんていうあまりなじみの薄い関数を駆使してものすごくコンパクトな記述になっており、はあ、すげえっすなとおもったしだいです。

 

テーブル値関数を使用するにはデータベースの互換性レベルが90以上で

ある必要があります。

http://technet.microsoft.com/ja-jp/library/bb510680(v=sql.105).aspx

【SQL整形】 : SQL Server Management Studio上でSQL整形をするアドイン 

"Poor Man's T-SQL Formatter"というSQL整形ツールがとても便利。SQLを整形するツールは他にもありますが、これはSQL Server Management Studio(SSMS)のアドインで、SSMSのエディタ上で動作しますので、SSMSを使用するなら重宝すること間違いありません! 

 

Poor Man's T-SQL Formatter

 http://www.architectshack.com/PoorMansTSqlFormatter.ashx

 

こんないけてないSQLも、

f:id:misozui:20130926124422p:plain

 

 ホットキーでいっぱつでこんな風に整形できちゃいます!!

f:id:misozui:20130926124423p:plain

 

CREATE VIEWのようなオブジェクト定義文も整形されているのがありがたいですね。

整形の方式は、カンマ位置やJOIN文の整形の仕方などいくつかオプションで設定可能。また、コマンドラインからの呼び出しで複数のファイルを一括で整形することもできます。

 

StackOverflowのこの記事で知りました。作者ご本人がアンサーで紹介しています。

http://stackoverflow.com/questions/401928/sql-formatter-for-sql-management-studio

もしも太陽が皇居にあったら

もしも直径が1,000万分の1の太陽が皇居にあったらそれぞれの惑星がどこに位置するのかをGoogle Mapにプロットしてみた。

↓↓↓

 https://googledrive.com/host/0B3U7aZ40AIAoci1LVUg1WTFGQ1E/index.html

(※ブラウザの設定でスクリプトが自動的に読み込まれない場合があります。)

 

太陽の直径は139.2mで皇居二重橋付近に置くとする。

このとき、水星は直径46cmで太陽から5.79m離れていて、軌道長半径で太陽を中心とした円を描くと、ざっくりと円の西側は山手線の範囲と重なる。南はお台場、東は錦糸町のあたりまでがおさまる。環状線で言うと明治通りの円に近い。太陽のミニチュアが皇居にあったらこのあたりは完全に灼熱の砂漠になる。

金星は直径1.21mで太陽から10.82km離れている。西は高円寺、自由が丘、東は葛西臨海公園のあたりまでが圏内になる。このあたりもまだ砂漠でなにも生えない。水星の倍近く太陽から離れているのになぜか水星より暑かったりする。

地球は直径1.27m で金星とほぼ同じ大きさ、金星から4kmほどしか離れていない。にもかかわらず、一転、ここには水と緑があふれる。さながら砂漠の中のオアシスのよう。なぜならこの一帯だけ都合よく雨が降り注ぐから。ちょうど低気圧と高気圧の境目に雨が降り注ぐかのようだ。地球が位置するのは、西は、西荻窪、二子新地、武蔵小杉のあたり。南は羽田空港。北は光が丘公園、高島平、東は市川のあたり。住宅密集地、団地、高層住宅地が多い。ドーナツ化現象のドーナツ部分にあたる。多摩川の西と東、江戸川の東と西で明暗がわかれる。

ここからまた痩せた土地が続く。火星は、地球から8km離れたところにある。直径68cm。ここにもかつての川の跡があるのではないかとも言われているが生命の痕跡は見当たらない。稲城、江田、新横浜、新座、浦和、津田沼のあたり。

さらに離れればもう氷土、終日氷点下の荒涼とした土地が延々と続く。木星は箱根、大田、潮来、勝浦のあたり。

土星は清水、小諸、那須塩原のあたり。

天王星は桑名、七尾、村上、山形。

海王星は西は明石、北は釜石のあたりになる。

もちろん実際の軌道は真円ではなく軌道面も傾いているのでこのようにはならないが。

100万倍の香川真司選手

地図で札幌駅と東京駅、東京駅と博多駅の3点を直線距離で結ぶとおよそ1720kmになる。サッカー日本代表の香川真司選手の身長は172cmということなので、香川選手の身長の100万倍の距離だ。
ところで人の細胞の大きさはだいたい10マイクロメートルくらい。1マイクロメートルは100万分の1メートルだからつまり10万分の1メートルだ。
ということは日本の本州に100万倍の香川選手が横たわった場合、体細胞はだいたい10mくらいになるということになる。結構大きいかんじがする。精子は60m、卵子は(香川選手にはないけど)100~150m。(以上、Wikipediaより)
卵子に比べて精子が大きいなと思ったら精子は尻尾を入れた長さで、頭だけだとそんなにない。この場合だと5mということになる。
http://www.mammo.tv/column/masanori_takano/20050613.html

『幸せの力』

昨夜、テレビで映画『幸せの力』を見た。映画公開時にも見ていたのだけれども、当時とは立場や環境が違うからか一層ぐっとくるものがあった。研修最終日に試験の結果を聞くウィル・スミスの表情は最高だった。
ただ途中で息子の手から離れ道に置き去りにされたキャプテンアメリカ、あれはどうなったんだろうか。あのシーンはその後あっさりと別のシーンに話が進んだけど、テレビ用の編集なのかああいうものなのか。映画でどうだったか覚えていない。
キャプテンアメリカの回収なくしてハッピーエンドとはみとめられないな。なぜキャプテンアメリカにシンパシーを感じるやのか自分でもわからないけど。ウッディ!助けて!

もし地球がバスケットボールのボールだったら

月の大きさはテニスボールくらい。 バスケットボールのボールの直径は24.5cmなので、それに月の直径の地球の直径に対する比率をかけると6.68cm。硬式テニスボールは直径6.35cm~6.67cmということなのでほぼ等しい。

ではバスケットボールのボールを地球、テニスボールを月とすると、テニスボールはバスケットボールのボールからどのくらい離れているか。これを街の人にインタビューをした様子が下の動画。


How Far Away is the Moon? (The Scale of the ...

多くの人がバスケットボールのボールのそばにあると予想しているものの、約7.4m離れたところにある、というのが正解。

7.4mというと、バスケットボールのコートの横幅が15mなので、その半分くらいか。これはなんかわかりにくいな。いいたとえがあればいいけど。

また、月の軌道は地球の公転面に対して約5度傾いているので、テニスボールはバスケットボールのボールの高さに対して最大で64cmくらい高い位置または低い位置にある。