Twitter検索の結果をIFTTTとGASでRSS配信

あるいは、スプレッドシートの情報をRSS配信する方法。

動機

Twitterの検索、見たい時に検索、tweetdeckのカラム作成して見たりslackへの投稿、IFTTTのメールダイジェスト機能で事足りるかもしれないが、RSSとして取得した方が見やすく処理しやすい場合も存在する。その場合には野良サービスを使用することになるが有名どころが特に無く、以前使用していたものは突然サービス終了して使えなくなった経験があるので、ある程度枯れていていきなりサービス終了になる危険性が無いものを使用してシステム構築をしておきたい。

プログラムを書くのも構わないが更新する必要が無い物にしておきたい。例えばLambdaのnodeバージョンを更新する手間すら省きたい(超重要)

そうなるとGoogleAppsScriptを使用したRSSの配信 + 自動化処理の定番のIFTTTを使用するのが個人的定番なので設定方法をまとめておく。

設定方法

IFTTTで以下のApplet作成
Twitter「New tweet from search」 => Google sheets「Add row to spreadsheet」

作成されたspreadsheeのGoogleAppsScriptに以下のコードを設定

// 公開 -> ウェブアプリケーションとして導入 -> 「全員(匿名ユーザーも含む)」で公開すること

function doGet() {
  var xml = createXml();
  // xml出力
  return ContentService.createTextOutput(xml)
    .setMimeType(ContentService.MimeType.XML);
}


function createXml() {
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var channel = createXmlChannel(spreadSheet);
  // 200 + 50 行まで抜き出し、200を超えている分は削除
  var rows = getRowsAndDeleteOdd(spreadSheet, 200, 50);


  for (var i = 0; i < rows.length; i++) {
    var item = createXmlItem(rows[i]);
    channel.addContent(item);
  }


  // rss 2.0形式で整形
  var root = XmlService.createElement('rss')
    .setAttribute('version', "2.0")
    .addContent(channel);


  var document = XmlService.createDocument(root);
  var xml = XmlService.getPrettyFormat().format(document);


  return xml;
}


function getRowsAndDeleteOdd(spreadSheet, count, spanCount) {
  var sheet = spreadSheet.getSheetByName('シート1');
  var range = sheet.getRange(1, 1, count + spanCount, 5);
  var rows = range.getValues();
  rows = rows.filter(function (r) { return r[0]; } );
  rows = rows.reverse();
  if (rows.length > count) {
    var delCount = rows.length - count;
    sheet.deleteRows(1, delCount);
  }
  return rows;
}


function createXmlChannel(spreadSheet) {
  var channel = XmlService.createElement('channel');


  channel.addContent(XmlService.createElement('title').setText(spreadSheet.getName()));
  channel.addContent(XmlService.createElement('link').setText(spreadSheet.getUrl()));
  channel.addContent(XmlService.createElement('language').setText('ja'));
  return channel;
}


function createXmlItem(row) {
  // IFTTTからの出力形式に合わせて変更
  var date = row[0];
  var title = row[1];
  var desc = row[2];
  var link = row[3];


  var item = XmlService.createElement('item');


  item.addContent(XmlService.createElement('title').setText(title));
  item.addContent(XmlService.createElement('link').setText(link));
  item.addContent(XmlService.createElement('description').setText(desc));
  item.addContent(XmlService.createElement('pubDate').setText(date));


  return item;
}

IFTTTのspreadsheetの制約は2000行を超えると新しいスプレッドシートが作成されてしまうので、200行を超えた段階で古いものから削除していく実装にしている。

あとはGoogleAppsScriptのメニューから

  1. 公開
  2. ウェブアプリケーションとして導入
  3. 「全員(匿名ユーザーも含む)」で公開

を実行して外部アクセスができるようにすれば完了です。生成されたURLをRSSリーダー等に食わせれば勝手に取得されるでしょう。feedlyから読み込みできるのも確認しました。

立川の夕飯をグループで食べるGoogleマップリストを作りました

行きたい店、普段からEvernoteでまとめるようにしていたけど管理が面倒になったのでGoogleマップにまとめたら便利だったという話です。

主に外出が面倒なので最小限の移動距離で物事を済ませられるメリットのために立川に住むことを決めたのですが、ちょっとだけの気分転換や新しい店開拓のために「行きたい店」を頭の中に蓄えていたのですが、量が多くなると忘れるのでEvernoteにまとめるようになっていました。

だけどAndroidをサブ機として持ち始めたらGoogleマップから「この場所行きましたよね」通知が届いて若干の恐怖を感じながらも確かに行ったわ、ついでだし口コミ投稿しちゃおとかやってたんですが、行きたい場所の管理とか出来ましたねそういえばこいつ。移したらすごい便利で、一覧性が高くて「機会があれば行こう」と思っていた場所が「割と近いのが判明したので行ってみるか」など変化がありました。みなさん行きたい場所はGoogleマップにまとめるようにすると特ですよ。

「行きたい」だとまだ行っていないので良し悪しが自分の中から出せないので「なんかいい店ないですか」の問いが発生したときに(1年に2回あるかないか)知ってる気がするけどマジで何も出ない、俺が今まで過ごしてきた人生とはと考えてしまうので夕飯を食べに行く時のありそうなパターンに合わせたマップも作成してみました。人生の事を考えるのは嘘なんですけどね。

立川のシュッと行ける夕飯食べるところ

温度感としては

  • なんか良いところない?
  • 集まって話すからラーメンは無しね
  • 駅近で
  • チェーン店か〜、いや、ダメじゃないんだけど
  • 別に気合い入ってなくても良いよ
  • ネタになる所じゃ無くて良いし
  • 赤提灯とかで良いでしょ
  • すぐ入れる所が良いな〜
  • そんな高くないところで!
  • そんな場所です
  • 一応行く前に電話すべし

といったところです。私自身が一番求めているお店でもあります。

作って思いましたが誰でも見られて活用できる状態は「一番」求められているわけではなく、「この人に聞けばわかる」という情報が一番求められていることだなと。いちいちそのリスト開く人なんていないし。それと自分としては「こいつはそういう事を知っているやつだ」という情報をあらかじめ発信して認知してもらえるのが一番のメリットだなと思いました。「調べるの面倒だし、そういえば詳しい人いたな」と誰かの記憶に引っかかってあいつが詳しいし聞こう、って思ってもらえるのが一番のメリットになるなと。なのでもうちょっといい店知りたかったら私に聞いてください。面倒なタイミングじゃなければウェルカムです。

それとGoogleマップに行きたい店まとめだしたらオススメのお店が表示されるのは割といいですね。オススメ度の根拠がわからないですが、普通に行きたいと思いました。

ドラム式洗濯機を買って3ヶ月が経った

Panasonic NA-VX7900L

ドラム式洗濯機を買ってからの生活の変化。

最初は洗濯を干す手間が面倒臭すぎてドラム式洗濯機を買おうと思い立ったものの、住んでいる部屋に合わせて買う必要がある大型のものなので脱衣所の向きとかで考えようとしてたら「そういえばこの家住んでいる期間長くない? 引っ越して生活しやすいところにしない?」となったので引っ越し。

引っ越してから実際にドラム式洗濯機を買うまでにうだうだと4ヶ月ぐらい経過して買いました。引っ越しするまでの期間は6ヶ月以上はかかったかなと思います。ドラム式洗濯機に費やしている時間長くないですか?

実際に買うときにはメーカー毎の差とかあんまり確認しないで「じゃあPanasonicで」と割と即決で買いました。決める時にはすぐ決める男です。

3ヶ月使用しての心境としては「絶対に買うべき」とは思うものの、「新しい面倒が出来た」となります。

以下面倒な点

  • 量が多いとシワッシワになる
    • 分けて少なめにするとシワが付きづらくなる
    • 主に外側に着るものがシワだと困る
    • 分けて少なめにして洗う
  • 白物と色物と洗ってしまい色移り
    • 以前の洗濯機でokでも色が移った
    • 白物と色物は分けるのが無難
    • 白T 3枚ダメにしました
  • 型崩れ/縮み
    • 形が重要な衣類は乾燥モードをかけると酷いことに
    • Gパンの丈が短くなる
    • 乾燥モードは使わないで別で洗って干す
    • リーバイス1枚ダメにしました
  • 埃が大量に出て毎回掃除
    • 乾燥モードを使うとその分埃がフィルターに付く
    • 掃除しやすい形状なので労力は少ないけど
    • 毎回はちょっと面倒

分けて洗濯するものができたので週1~2で洗濯していたのが今は週6で稼働してます。大体は干す必要が無いので楽なんですが回数はめちゃくちゃ増えましたね「ナイトモード」があるので時間気にせず洗濯できるので別に良いといえばいいんですが。埃は洗濯機の横に埃用のゴミ箱設置してすぐ捨てられるようにはしました。

あと洗剤はワンハンドプッシュがオススメです。基本衣類を入れてボタン押せば終わりな洗濯ですが、洗剤を入れるステップが

  • ボトル持って
  • キャップ外して
  • キャップで量測って
  • 入れて
  • キャップ閉じて
  • ボトル戻す

だったのが

  • ボトル持って
  • プッシュして
  • ボトル戻す

で終わります。そもそも自動投入型のドラム式洗濯機もありましたが値段が10万増えたので諦めました。
率先して楽してこう。

アタック ZERO(ゼロ) 洗濯洗剤 液体 ドラム式専用 ワンハンドプッシュ 本体 380g (衣類よみがえる「ゼロ洗浄」へ)
https://amzn.to/2LWOBSM

#このラジオがヤバい から見るラジオの楽しさってなんだろう

今日やりますね。
「今日は一日民放ラジオ番組三昧」
https://konoradiogayabai.com/special/
だいたいの放送局が中継していてすごいお祭り感が出ています。私はニッポン放送で聞こうかなと思っています。

元々は2月〜3月に実施した

NHKと民放ラジオ101局がタッグを組んでSNSのハッシュタグを使って、ラジオ全体を盛り上げてきた『#このラジオがヤバい』キャンペーン

https://konoradiogayabai.com
での引き続きの企画。

ハッシュタグだったりキャンペーンページ見てると番組単体の面白さが見えてきていいんですよね。ちょっと興味でてきてこの番組聴いてみようとか思える。

アプローチが凄く良いと思っていて、ラジオを聴く動機って

  • その人を知っている
  • どういう話をするんだろうって興味が出る
  • ラジオをやっていることを知る
  • 聴いてみる

ってことだと思っていまして、だけど興味が出ないと or ラジオをやっていると知らないと、聴くまでの動線が繋がらない。

その動線を簡単につなげてくれるのがこの企画だなぁと。

ピンポイントに面白くて熱を持っていて興味が出やすいラジオ番組を見つけることが出来るし、SNSで「俺こんな面白いラジオ聞いてるんだぜ」ってのを言う理由をつけてくれる。その投稿を見た人でラジオに興味がなくても「なんか面白そう」って思えて聴く動機になる。

「なんか面白そう」は人によって違うのは重々承知しているけども、ラジオを聴くことは面白いと思っているんですよ、私は。自分自身ラジオが面白いと思っているけどそれを言う理由が別になかった。だけどこの企画が始まって「俺こんな面白いもの知ってるんだぜ、ラジオって言うんだけど」を自慢したくなったのがこの記事を書いている理由です。私は面白いものを知っている事を自慢したいんだ。

ラジオを聴くっていうのは「人の会話を聴く」って事なんだけど、「自分が喋って相手に伝わる快感」とは真逆の行動をしていることになります。自分のことを喋るための状況を作るために仕方なく相手の話を聞く必要があるってだけで、基本的には「人の会話を聴く」ってのは苦痛なんですよね。

その苦痛な「人の会話を聴く」って事を好き好んでやる場面は最初に書いた

– その人を知っている

– どういう話をするんだろうって興味が出る

– ラジオをやっていることを知る

– 聴いてみる

ってことだと思っていまして

上記の条件が揃えば、その人を知っていて興味がある時に「人の会話を聴く」が苦痛じゃなくなる。

そして聴く事に慣れてくるとその人の考え方や会話のやり取り、その人の日常や気持ちを汲み取る楽しさが出てくる。それはもう本質的なコミュニケーションの意思疎通が上手く行ったときの、「相手の気持ちを理解できた時の喜び」を感じられるのがラジオの楽しさだと思っています。

「ラジオ」という括りでの面白さは書いた通りなんだけど、またさらにその中でお笑い芸人の番組だったら面白い話だったり、破天荒なミュージシャンなら普段の奇天烈な日常を楽しんだり、帯番組ならそのパーソナリティが取り上げるゲストの強調すべき部分の取り上げ方だったり、聞き方一つでバリエーション豊かな楽しみ方が出てくる。ラジオ好きだなぁ私は。

GoogleHomeの使いこなし

帰ってきた時の「ただいま」起きた時の「おはよう」、家を出る時の「行ってきます」寝る時の「おやすみ」で家の照明やテレビを操作、料理中のタイマーを設定したり出かける直前の気温や天気を聞いて服装を決めたり、買いたいもののメモをしたり集中する為の音楽や退屈な作業の暇つぶしにラジオを流したり、毎日使ってます。AmazonEchoも持っていますが、認識精度が気になってしまってGoogleHomeで統一してしまいました。

上記の自分の用途を実現するためにはGoogleHome単体だけでは出来なくて、以下の機器を追加で購入しています。ちなみに私の家は2LDKで、フルで使いこなそうとしたらこれらは必要になると思います。

部屋の割り当ては

  • 自室
  • 寝室
  • リビング

部屋の数分だけGoogleHomeを設置したいんですが、寝室とリビングは扉一つ隔てているだけなのでリビングまで声が届くので置いていません。なので現状は2つのGoogleHomeがあります。新品のGoogleHomeMiniがあるんですがまだ設置してないです。あと玄関にも起きたかったんですが電源が上手く引けなくて断念しました、運良く自室が近い間取りなので扉を開けっ放しにすることで玄関からの呼びかけにもきちんと認識してくれています。

リビング、寝室はすでにリモコンで電気の操作ができるので各部屋にスマートリモコンの設置、自室はリモコン操作が出来なかったのでIKEAのスマート照明に切り替えることでGoogleHomeからの操作ができるようにしています。Chromecastはテレビを消すためだけに付けてますね。それ以外に使っていないのでNature Remoに切り替えてしまっても良い気がする。。

声で照明を点けるコツとしては「付けっ放しにする」ですね。声で付け消しをするのは言い終わるまでの時間がかかるし、認識したあとに実際に照明が付くまでにラグがある。毎回付け消ししたいのであればスイッチに手を伸ばした方が早いし確実。自分が家に居る時には「全て付けっ放し」にして家から出かける時だけ/寝る時だけ「全て消す」と割り切った方が使い勝手がいいです。

それと玄関や廊下、トイレの照明は人感センサーを使用しています。玄関は帰ってきた時にすぐ照明が点いて欲しい場所なので声で操作している時間はもどかしいです。そこまで長時間居る場所ではないので、来た瞬間だけ点いてくれれば問題ないなと。IKEAのワイヤレスモーションセンサーがオススメですhttps://www.ikea.com/jp/ja/catalog/products/90383508/

具体的な1日の使いこなし方としては

  • 朝起きて「おはよう」
    • 登録しておいたルーティンの再生
      • すべての部屋の照明をON
      • 今日の天気
      • 交通情報
      • ニュースの再生
  • 朝食を食べながら「TokyoFMをつけて」
    • ラジオを再生してなんとなく聞き流す
  • 着替える時に「今日の天気は」
    • 気温と天気で今日の服装を決める
  • 着替え中に何か思いついたら「タスク追加 〇〇」
    • IFTTTであらかじめ設定していたAppletの実行
    • 〇〇の単語をメール送信してEvernoteに追加
    • あとで見返して思い出せるように
  • 靴を履きながら「行ってきます」
    • 登録しておいたルーティンの再生
      • すべての部屋の照明をOFF
      • テレビもOFF
  • 帰ってきたら「ただいま」
    • 登録しておいたルーティンの再生
      • すべての部屋の照明をON
  • リビングにたどり着いて「音楽流して」
    • さっきまで外で聞いていたSpotifyの途中から再生してくれる
  • 料理をしながら「〇〇分のタイマーをセット」
    • タイマーのセット
      • 何も触らないで時間を測れる便利さ
  • リビングでPS4を遊ぶかNetflixを見る
  • 一通り遊び/見終わる「テレビ消して」
    • テレビの電源を消す
  • 自室で作業をしながら「〇〇(ラジオ局)をつけて」
    • 集中しなくても良い作業の時の暇つぶし/集中するまで流し聞き
  • ベットに入って「おやすみ」
    • 登録しておいたルーティンの再生
      • すべての部屋の照明をOFF
      • テレビもOFF

大まかにはこんな感じです。かなり便利ですよ、GoogleHome


最近の開発環境

MacのTerminal.app、tmux、vim8を使用。使用言語はTypeScript、Webpack、Vue.js、Electron、フロントエンドの開発が主ですね。vimrc等は自分のdotfilesにまとめている。https://github.com/soramugi/dotfiles

流れとしては

  • Terminal.appを開く
  • tmuxが開く
  • Ctrl-s + v でペインの分割
  • 左側のペインでvimを開く
  • 右側のペインでgitのコミットやプロセスの起動
  • vim上でコード書いて
  • 別作業が発生すればCmd-t でタブ開いて作業

が基準。
vim上でコード書く流れとしては

  • fでファイル検索
  • Ctrl-lでファイルツリーの表示
  • ;でバッファの切り替え
  • Shift-kで検索(ag)
  • ALEでlintや型確認
  • Space-pでALEFix実行
  • 基本バッファで切り替え
  • :spで複数ウィンドウを開いて比較
  • vscodeでの実行が重かったのが原因でvimに
    • デバッガ接続しっぱなしで使い方が悪かったのかも?
  • tmuxは捨てようかと思っていた
  • :vs :termで同じような画面が設定できる
  • 作業中のvimウィンドウを間違えて閉じると:termで開いたウィンドウが詰めてくる、バッファ切り替えで:termが表示される場合がある
  • そうなるとウィンドウ切り替えの難易度が高いので全て閉じた方が早い
  • まだまだtmuxを使用した方が楽

だいたいこれで自分の作業は足りています。
vscodeも少し触っていたんですが、デバッガが便利に使用できるのはいいことだけど、どうしてもマウスを使わないと出来ない操作が出てきて面倒になりました。使い方が悪かったのかちょっと重かったのもあり。vimでのデバッガ環境は貧弱だとは思ってる。

dockerも使ったりはしているけどフロントエンド開発、webpack –watchぐらいしかしてないしdocker使う必要はないなと。

デバッガは正直あんまり使ってなくて、debuggerの文字列を挿入してchromeが対象行で止まったところでchrome上で確認する、ぐらいしか使っていません。その代わりにはテストコードを書くようにしているぐらい、ですね。コードの実行環境以外にまず初めにテスト書けるようにする環境整備の時間をしっかり取るようにしています。
デバッガがちゃんと便利に使えればテストコードいらない説が通るようになるんじゃないかなと思っています。テスト書く書かないの議論(?)が毎回出るのってテストはQAの仕事で、開発時にはデバッガ使えれば開発はできるやろ、の考えがあるからなのかなと。だけどテストコードは便利なので書きましょう。

立川シネマシティのトップ掲載数順はオススメ映画の法則

映画はめちゃくちゃ好きってわけではないんですが月に2回ぐらいは映画館で見ています。

「映画を楽しむぞ!」という心意気で見ているのではなく、映画の始まる時間が決まっているというのが重要で、予約をしてからその時間に合わせたスケジュールを組んで行動する必要があるのでダラダラするのを防ぐ事が出来るのが目的なのと、立川シネマシティは会員制度があり会員だと1300円で見られるので安くて気軽に見られるというのがあります。私は立川に住んでいるので歩いて行けますし。

映画を楽しむ事を重要視していないのでハズレの映画を見ても「つまらなかったな」と思うだけで別に良いんですが、どうせ時間を使うのであれば面白い映画を見たいという欲も少なからずあります。

何回か見ているとわかってくるんですが、立川シネマシティのトップページに掲載されている映画は大体面白い確率が高く、全然興味が無い映画でも「シネマシティが推しているんだから見てみよう」と思い実際に見てみると面白いものだった事が多くあります

左上から順に見てけば大体面白い

大体はトップページに乗っている映画を見れば面白いのですが、新しい映画の方が上映館数が多く割り当てられて少し古い映画は少なくなっていきオススメされる事はなくなっていくと思います。だけど見る側は古い映画と新しい映画は関係なく、どうせだったら面白い映画を見ておきたい。

という前置き(長い)の考えにより「立川シネマシティのトップ掲載数順はオススメ映画の法則」アプリケーションを作成しました


https://cinemacity-top.glideapp.io

表示するデータ元はGASで定期的に収集してSpreadsheetsに溜めてます。表示自体は Glide を使用。PWAアプリとして出力されるのでiPhoneのホーム画面にでも置いておくといつでも見られますね。


結果としては中々いいかなと思います。キングダム、全然興味なかったけど見に行こうかな。