らいむぎばたけ

つかまえなくてだいじょうぶ

天気予報は前日との差分を知りたい

天気予報で今日が何度かを見ても「で、昨日より暑いの?寒いの?」となるので、差分を取って GAS で Slack に通知することにした。

やりたいこと

  • 今日の 12:00 頃の気温と前日の 12:00 頃の気温の差分が知りたい
    • 12:00 頃はごはんを食べた後のお散歩で一番外に出る可能性が高いから
  • 気温差分の通知は朝欲しい
    • 着替える前に知りたいから
  • 前日の気温は実績値でほしい

OpenWeatherMap の Free plan で事足りそうなのでこれを使うことにした。

openweathermap.org

取得したい値

OpenWeatherMap の使い方

OpenWeatherMap でアカウント登録して、API Key を作成して、取得したい地点の緯度経度が分かれば良い。緯度経度は自分で調べても良いが Geocoding API - OpenWeatherMap で調べることもできる。

秩父麦酒とイチローモルトが好きなので、緯度経度は西武秩父駅にした。

curl "https://api.openweathermap.org/data/2.5/weather?lat=35.9899&lon=139.0833&units=metric&appid={API_KEY}"
{
  "coord": {
    "lon": 139.0833,
    "lat": 35.9899
  },
  "weather": [
    {
      "id": 800,
      "main": "Clear",
      "description": "clear sky",
      "icon": "01n"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 1.17,
    "feels_like": -1.33,
    "temp_min": 0.86,
    "temp_max": 1.97,
    "pressure": 1026,
    "humidity": 38,
    "sea_level": 1026,
    "grnd_level": 996
  },
  "visibility": 10000,
  "wind": {
    "speed": 2.21,
    "deg": 254,
    "gust": 2.3
  },
  "clouds": {
    "all": 0
  },
  "dt": 1705414807,
  "sys": {
    "type": 2,
    "id": 73731,
    "country": "JP",
    "sunrise": 1705355605,
    "sunset": 1705391536
  },
  "timezone": 32400,
  "id": 1864637,
  "name": "Chichibu",
  "cod": 200
}

やったこと

// OpenWeatherMap の URL を生成する
function buildUrl(apiName) {
  const apiKey = PropertiesService.getScriptProperties().getProperty('OWM_API_KEY')
  const lat = 35.9899
  const lon = 139.0833
  return `https://api.openweathermap.org/data/2.5/${apiName}?lat=${lat}&lon=${lon}&units=metric&appid=${apiKey}`
}

// OpenWeatherMap の API を叩いてレスポンスを JSON で返す
function callApi(apiName) {
  const url = buildUrl(apiName)
  const response = UrlFetchApp.fetch(url)
  return JSON.parse(response)
}

// 今の気温 (実績値) をとってくる
function fetchCurrentTemp() {
  const json = callApi("weather")
  return json["main"]["temp"]
}

// 気温を保存しているセルを取得する
function getTempCell() {
  return SpreadsheetApp.getActiveSpreadsheet().getSheetByName("temp").getRange("A1")
}

// 今日の気温 (実績値) を保存する (cron で毎日 12:00 頃に実行する)
function saveTodayTemp() {
  getTempCell().setValue(`${fetchCurrentTemp()}`)
}

// 前日の実績気温をとってくる
function getYesterdayTemp() {
  return getTempCell().getValue()
}

// 当日 12:00 の予報の気温をとってくる
function fetchTodayForecastTemp() {
  const json = callApi("forecast")

  const today = new Date()
  const year = today.getFullYear()
  const month = today.getMonth() + 1
  const date = today.getDate() + 1

  const forecastUtcTime = Date.parse(`${year}-${month}-${date} 03:00:00 GMT`) / 1000

  const forecast = json["list"].find((item) => {
    return item["dt"] === forecastUtcTime
  })

  return forecast["main"]["temp"]
}

// 通知するメッセージを生成する
function buildMessage(todayForecastTemp, yesterdayTemp) {
  const tempDiff = Number.parseFloat(todayForecastTemp - yesterdayTemp).toFixed(1)
  const sign = (tempDiff > 0) ? '+' : ''

  return `今日は昨日と比べて ${sign}${tempDiff} 度だよ!`
}

// Slack に通知する
function sendSlack(message) {
  const token = PropertiesService.getScriptProperties().getProperty('SLACK_TOKEN')

  UrlFetchApp.fetch("https://slack.com/api/chat.postMessage", {
    method: "POST",
    payload: {
      token: token,
      channel: "#general",
      text: message,
      username: "name",
      icon_url: "https://example.com/icon.png",
    }
  })
}

// 気温差分を Slack に通知する (cron で毎日 08:00 頃に実行する)
function reportTempDiff() {
  const todayForecastTemp = fetchTodayForecastTemp()
  const yesterdayTemp = getYesterdayTemp()

  sendSlack(buildMessage(todayForecastTemp, yesterdayTemp))
}

あとは saveTodayTempreportTempDiff をトリガーに登録しておわり。

さむいね

OpenWeatherMap では体感温度の取得もできるので、もしかしたら体感温度のほうが良いかもしれない。そのうち考える。

なお、アプリの名前は天気予報ということでモネになりました。

ラヴィット!を見ている

ラヴィット!見る前にこれだけ押さえとこう!ラヴィット!内輪ネタ総まとめ - オルソンブログ*1 の影響でラヴィット!をかれこれ一年半くらい見続けている。

元々、お笑い芸人やバラエティ番組にはそんなに興味はなくて、なんならあまり好きなほうではなかった*2。 コロナ禍に入ってから相席食堂を知り*3 、それからテレビ千鳥を知り、千鳥についてはおもしろいなと思うようにはなっていた。それでも、それ以外のお笑い番組の類はあまり好きではなかった。

ラヴィット!、最初の頃は見逃しても特に気にしていなかったのだけど、最近は毎日見ることが体に刻まれていて、見られない時は TVer のお世話になっている。TVer × ラヴィット!のすごいところは当日のお昼にはオープニングがもう見られるようになっていることと、広告が異常に少ないところ。なんで? DAIGOも台所を見ると、ウッドワン〜〜〜〜の CM を無限に見続けることになるんだけど、ラヴィット!は CM が圧倒的に少ない。TBS が少ないのか、ラヴィット!が少ないのか、どういうロジックであの CM を組んでいるのだろう。

そして、ラヴィット!を見るようになってから結構元気になった。最近ちょっと体調を崩していたんだけど、その間もラヴィット!のおかげでなんとか生きていた気がする。ラヴィット!はいいぞ。わたしの中でのラヴィット!は、まんがタイムきららみたいなものである *4

ラヴィット!のオープニングを見終わると 9 時くらいになっているので、そのタイミングで仕事をはじめて、本編は Tver で見ることが多い*5。朝バタバタしているときは、お昼ごはんを食べながらオープニングを見る。ラヴィット!にハマりだしてから、アニメを見るタイミングが中々無い。土曜は土曜で夜明けのラヴィット!がある。忙しすぎる。

ここから先はラヴィット!を知らない人には何を言ってるか全くわからないかもしれない。ここまでも何を言ってるか全くわからなかったかもしれない。

クジャク〜〜〜!!!!

ラヴィット!で好きな人たち

山添、小田さん、アインシュタインさっくん、舘様、なすなかにしモグライダー...いや、名前をあげることは難しい。たぶん全員好きだと思う。書き上げたメンバーを見る限り火曜日が好きなんだと思う。たまにレギュラー以外の人でこの人いやだなあ、こわいなあと思うことはあるのだけど、それでも笑わせてくれる番組だ。シーズンレギュラーで出てくる坂のメンバーも突然オカリナを吹いたり、太田にキレはじめたりするし意味が分からなくて良い。

ラヴィット!を見てから見る相席食堂のおもしろさ

ラヴィット!を履修してから、改めて相席食堂を見ると今までと違った楽しみ方ができる。今まで相席食堂はよく知らないお笑い芸人っぽい人が相席してる番組で、ロケに行ってる人たちを見るというより千鳥の二人を見ていた感じがある。ラヴィット!に出ている人たちの回を改めて見ると、今までより楽しい気持ちで見ることができる。特に思い出すのは、男性ブランコ平井がかつてのバイト先を訪れているシーン。胸にぐっとくるものがあった。

アインシュタインのプチプラ変身メイク!

自分が使っている &be はこの人がプロデュースしてるのか...ということを知ることもできた。&be 製品を使う度に一瞬頭を過ぎって元気になる。すごい。それはさておき、稲ちゃんと河北さんのボケ * 2 を瞬時に捌く、奇跡のお笑い王子様河合ゆずるがしごできすぎる。

インディアンス田渕の既視感

インディアンス田渕、見てると元気になりますね。なんかどこかで見たことあるなあとずっと思っていたんだけど、最近わかった。これだ。インフラエンジニアの教科書 2 だ。

最近よく見るゲスト

最近はコンビ名がわからないのだけど、社長と大富豪が強い池田さんを応援している。あとマユリカ阪本が AD さんとうまくコミュニケーションをとれないのも良い。AD さんだけじゃないかも。とにかく頑張ってほしい。いや、このままでいてほしい。それと令和ロマン M1 優勝おめでとうございます。

ラヴィット!ロック 2023

www.tbs.co.jp

今年あったラヴィット!ロックもオンラインで視聴した。本当ただのお遊戯会*6なんだけど、それがよかった。ラヴィット!ロックのセトリのプレイリストを作って、車でたまに聞くのだけどウェザナイッは最後まで聞けるし、おもむろにドン・キホーテのテーマ曲がかかる。ペアーズもちゃんと配信があったのがよかった。協賛にペアーズがいたのもよかった。ペアーズの CM に真悠ちゃんが出ているのもいい。

music.youtube.com

それと先日、Love it Wednesday feat. 梅田サイファーも配信が始まったのでプレイリストに追加した。配信おめでとうございます。

music.youtube.com

きつねがこわい

きつねは淡路がやばいはずなんだけど、あの淡路の横で平然としている大津が一番こわい。徹夜で麻雀して体調崩してロケに来ないのも良い。ラヴィット!ロックを最後にアニマルパラダイスを見ていない気がするのだけど、ゴールデンラヴィット!ではやるのだろうか。

今年のもっとも忘れられないラヴィット!

基本こういうものに投稿したり、懸賞応募とかはしないほうなんだけど、これはなんか書きたくなった。ちなみに、生放送が終わったあと芝さんがコットンのきょんとはハイタッチしてたんだけど、西村からのハイタッチには気づいていないのか無視していて、西村がちょっと寂しそうにしていたように見えたのが胸にくるものがあった。西村にもやさしくしてあげてほしい。

おわり

最近文章を書くリハビリのためにブログを何本か書いていたけど、これは支離滅裂すぎてあまりリハビリになっていない気がする。本当はまだ書きたいことがたくさんあったけれど、意味がわからなくなりすぎるのでここまでにした。

さて、今年のゴールデンラヴィット!では何が起きるのだろうと、今からワクワクしている。小田さんは一体どうなってしまうのだろう。きつねと BE:FIRST の LEO が後から出演メンバーに追加された。うれしい。山添がいないことがただただ残念。ワンチャン何らかの形で出てきてくれないかな。

男性ブランコ、レギュラーになってから発言回数が少なくなっている気がして心配している。このままだとショーゴにならないか心配*7。ただ、発言回数が少ない浦井さんというのも哀愁漂っていて良いので、このままでも良いのかもしれない。

最後に、嶋佐の年末ジャンボが当たりますように。そして那須さんが元気になりますように。

*1:「見る前にこれだけ押さえとこう!」と書かれているけど、文章量も多いし内輪ネタも多く、見る前に押さえることはまずできない。最初は読んでも全く意味がわからないけれど、いくつかの単語は頭の中に残る。頭の中にインデックスは貼られるような感じ。ある程度ラヴィット!を見るようになってからまた読むと「あ〜これがあれね!」と理解が進む。そしてかれこれ一年半近く見るようになってから読むと復習ができる。まるで技術書のよう。すごい

*2:吉本新喜劇ついては例外

*3:これも誰かが Twitter でおもしろいと書いていて見始めた

*4:きららが好きな人、怒らないでください

*5:おおよそオープニング 1h, 本編が 1h の 2h 構成になっている

*6:最近のラヴィット!はかくれんぼをしたり、かけっこやじゃんけん大会をしていて小学生度が増していて良い

*7:ショーゴ、ヨリ戻ってよかったね

テストケースでちゃんと例示用のものを使う

テストや何らかの資料を書くときに、ちゃんと例示用のものを使いたいので備忘録。

ドメイン

URL やメールアドレスをテストするときに gmail.com とか hoge.com を使わない。xxx *1 も使わないように気をつけたい。

使って良いのは RFC2606 で定義されているこのあたり。

  • example.com
  • example.net
  • example.org

参考

IP アドレス

自分で IP アドレスに関してテストを書いたことは無いけれど一応。IPv4, IPv6 共に RFC で定義されている。

  • IPv4
    • 192.0.2.0/24
    • 198.51.100.0/24
    • 203.0.113.0/24
  • IPv6
    • 2001:db8::/32

参考

電話番号

例示用のものは (おそらく) 無い。なので、現時点で割当されていないものを選択するしか無いと思っている。今後の割当状況によっては割当される可能性は 0 ではないが、とりあえずは現時点では以下のものが使えると思う。

携帯電話

  • 0900 から始まる任意の番号

0A00 (A は 0-9 の任意の数字) から始まる番号にすれば大体大丈夫だと思う。ただし 080 については 0800 (着信課金機能) とも被るため、意図して 080 にしたいということがなければ 0900 を使うと良さそう。080 を使いたい場合は、以下の参考を確認した上で選択する。

固定電話

  • 0300 から始まる任意の番号

ざっと見たところどの市外局番であっても市内局番の頭の数字をこうしておけばいいというのは見つけられなかった。地域を固定したい需要がなければ基本は東京で良いと思うので 0300 から始まる番号にすれば大体大丈夫。特定の市外局番にしたい場合は、以下の参考を確認した上で選択する。

参考

ただし、あくまで、電話番号については “現時点での使用不可” という認識でいないといけない。むずかしい。

*1:アダルトサイトがち