ck_fm0211のブログ

書きたいことを書く。

ギガ活プロモコードの操作を楽にするLINE Botを作成した

はじめに

以前、povo2.0のプロモコードをGASで管理するという記事を書いた。 ck-fm0211.hatenablog.com

とりあえずの運用としては成立はしていたが、スプレッドシートからプロモコードをコピーしてpovoアプリに貼り付けるというのがなかなか面倒だった。

  • スマホスプレッドシートに記載された文字列をコピーするというのがまず面倒。
  • 使用済みのチェックをつけるのが面倒。
  • 300MBのものを使おうとして誤って24h無制限のコードを使ってしまう(未遂)

など、地味ではあるがちょっとした課題があった。

これらを解決するため、LINE Botを実装した。
LINE Botを作ってみたかったというのも理由の1つ(それが大半な気もする)。

LINE Bot概要

以下のことを実現したかった。

  • スプレッドシートにあるプロモコード一覧から、利用したい容量を指定するとそれに合致する、最も利用期限が近いプロモコードを1つ取得する。
  • プロモコードを取得したあと、それを使用済みにするかどうかが選択できる。
  • いま所有しているプロモコードの内訳が取得できる。

特に「コードの取得→使用済みにする」がLINE上でタップするだけで完結するというのが重要だった。

実装したもの

YouTubeに使用イメージの動画をupしてみた。これもやってみたかったからやっただけである。


www.youtube.com

実装環境

以前作成したスプレッドシートと連携するので、そのままGoogle Apps Script(GAS)で実装した。
GASでLINE Botをつくれるというのに少し感動した。

実装の流れ

ざっくり以下の流れで実装。

  1. LINE公式アカウントを作成する
  2. LINE Developersで新規プロバイダを作成する
  3. Google Cloud Platform(GCP)アカウントを取得し、プロジェクトを作成する
  4. GASでコードを書く
  5. GASのデプロイURLをLINE側のWebhookURLに設定する

LINE公式アカウントを作成する

LINE Botを作るには公式アカウントを開設する必要がある。
以下のURLからアカウントを作成した。認証済みアカウントにする必要はない。 www.linebiz.com

LINE Developersで新規プロバイダを作成する

Botは基本的にLINEのMessaging APIで操作する。これを利用するためにLINE Developersで新規プロバイダを作成した。 developers.line.biz

Google Cloud Platformアカウントを取得し、プロジェクトを作成する

GASで doPost doGet を実装することになるが、これらのログはGASのコンソール画面から確認できない。
代わりにGCPのCloud Loggingを利用する必要がある。
このあたりの記事を参考に設定した。 www.hidetoshl.com ryjkmr.com

GASでコードを書く

書くだけ。

実装ポイント1: 入力の簡易化

今回はユーザー(自分と妻)からの入力を簡易にしたかったので、LINE Messaging APIのクイックリプライを多用した。 developers.line.biz

クイックリプライ
クイックリプライ

呼び出しだけ適当なメッセージを送信し、あとはクイックリプライだけでBotとやりとりをするような仕組みにした。

実装ポイント2: シート内検索

スプレッドシートからプロモコードを取得するのには QUERY 関数を利用した。
SQLに慣れている自分としては、スプレッドシート内の検索は QUERY 関数を使うのが一番わかりやすかった。
また、機能として所有しているプロモコード内訳を出すのにも GROUP BY が使えるので便利だった。

実装ポイント3: ユーザーを絞り込み

LINE Botは非公開ということが(たぶん)できない。そのため、今回作ったBotは世界中の誰でも利用しようと思えばできてしまう。
それでは困るので、利用できるユーザーを自分と妻だけになるようにした。
Botがメッセージを受け取ると userId という値が取得できるので、その値が想定された値かどうかを確認するようにした。
実装する際にはごにょごにょして値を確認したが、以下のやり方がスマートかもしれない。 neos21.net

GASのデプロイURLをLINE側のWebhookURLに設定する

GASのコードをデプロイ(=公開?)し、発行されたURLをLINE側のWebhook URLとして設定した。
LINE Developersのプロバイダ設定から行った。

コード

github.com

おわりに

LINE Botの作成は思っていた以上に簡単だった。無料でここまでできるっていうのがすごい。Google様々だなと感じた。
Slack Botとかも似たような感じで作れそうなので、業務で使えるようなものを作ったりするのも楽しそうだなと思った。
なんにせよ、こういう便利Botってアイディア先行だと思うので、こういうのあったら便利だなあみたいなものを見つけていきたい。

povoのプロモコード管理についてはこれで一段落したかなという感触。
たまにキャンペーンで得られる特殊なプロモコードがあるので、そういうのをLINEから登録できたらいいのかなと思ったりもする。

追伸

povoのプロモコードのおかげで、回線を切り替えてから1ヶ月の携帯料金がゼロ円で運用できている。すごい。
「ギガ活のために買い物する」というのは本末転倒だが、普段の生活でギガ活になり得るものがある人は是非povoの利用をおすすめする。
具体的には「ローソンが家の近くにある喫煙者」がベストマッチだと思う。ローソンでau PAYを使ってタバコを買うだけで300MBのプロモコードが貰えるので。

ギガ活で得たプロモコードをスプレッドシートで管理するGASを書いた

はじめに

今月から携帯電話のプランをpovo2.0に変更した。 povo.jp

ほとんどフルリモートワークで家にいることが多く、外に出てもそれほどスマホで通信しない(ドラクエウォークをするくらい)。
そのため月の通信量も3GBもあれば十分だろうと判断した。
povo2.0は基本料がゼロ円で、データ通信量をトッピングという形で追加していく。

月に3GBくらいの利用量だと、 3GB(30日間)で990円というトッピングをつけることになる。
また、ちょっと遠出したり、イベントがあって今日はスマホをたくさん使う、みたいなときはデータ使い放題(24時間)で330円というトッピングもあり、利用状況に応じて柔軟に設定できそうだなと思ったので契約した。

使いはじめて早速、ギガ活で無料通信量をもらったのだが、そのためのプロモコード管理がちょっと面倒だった。
ちょっとでも楽をするためにGoogle Apps Script(GAS)を書いたのでここで紹介する。

ギガ活

実装内容の前にギガ活とはなんぞやという話。

povo2.0の真価はプラン設定の柔軟さだけではなく、ギガ活というキャンペーンにあると思っている。 povo.jp

公式ページからの引用。

ギガそのものを購入する体験とは違う新しいギガのチャージ活動です。
#ギガ活でもらう。#ギガ活でさがす。#ギガ活であたる。
日常のあらゆる接点の中でギガを受け取ったり、探したりできるような世界を目指しています。

要は、ポイントカードにポイントを貯めるように、無料で使える通信量を貯められる、という感じ。
その条件も「ローソンでau Pay(コード決済)で500円以上の決済をする」というようなもので、喫煙者の自分としてはタバコ一箱買うだけで300MB(3日間)がもらえる。
生活スタイルと合致すれば、ほぼゼロ円で運用ができてしまう。

報酬の通信量はプロモコードという形でメールが送られてくるのだが、そこにいくつか不便な点が。

  1. 条件達成から即時プロモコードを貰えるわけではなく、一定期間で達成した分がまとめてメールで送られてくる。
  2. プロモコードには有効期限があり、概ね発行の翌月末が設定されている(と思われる)

そのため、1週間に何度も条件を達成するとまとめてプロモコードが送られてきて、そのうちどれを利用してどれが未使用かがわからなくなってしまう。
これを解決したいがためにGASを書いた。*1

実装内容

処理の流れとしては以下の通り。

  1. Gmailでメールを受信し、その際 00_ギガ活 というラベルを付ける
  2. GAS(タイマー起動)で上記ラベルがついているメールを取得し、そこから正規表現でプロモコードを抽出する
  3. 抽出したプロモコードをスプレッドシートに書き込む
  4. 処理したメールに 00_ギガ活/処理済み というラベルを付ける

できたコードが以下。

/**
 * ギガ活のメールからコードを抽出し、スプレッドシートに書き出す
 */

// スプレッドシート
const sheet = SpreadsheetApp.getActive().getSheetByName('コード一覧');

/**
 * 本体
 * 1. ギガ活のラベルがついたメールを抽出
 * 2. メール本文からプロモコードと利用期限を抽出
 * 3. スプレッドシートに記入
 * 4. 処理したメールに処理済みラベルを付与
 */
function getPromotionCodes() {
  
  console.log("[START]メール取得");
  // 検索条件に該当するスレッド一覧を取得
  let threads = GmailApp.search('label:00_ギガ活  -label:00_ギガ活/処理済み');

  console.log("[START]スレッド処理");  
  // スレッドを一つずつ取り出す
  threads.forEach(function(thread) {
    // スレッド内のメール一覧を取得
    let messages = thread.getMessages();
    
    // メールを一つずつ取り出す
    messages.forEach(function(message) {
      // メールからコード値と利用期限を抽出する
      let values = extractCode(message)
      // メールを処理しているのにプロモコードが取れなかったらアラート
      if(values["codes"].length === 0){
        console.log("[ERROR]データ抽出");
        throw new Error("プロモコードの抽出に失敗しました")
      }
      // スプレッドシートに書き出す
      console.log("[START]スプレッドシート書き込み");
      writeSheet(values)
    });

    // スプレッドシートに条件付き書式を設定
    console.log("[START]条件付き書式更新");
    upsertConditionalFormatRule()    

    // スレッドに処理済みラベルを付ける
    console.log("[START]ラベル追加");
    let label = GmailApp.getUserLabelByName('00_ギガ活/処理済み');
    thread.addLabel(label);
  });
}

/**
 * メール本文からプロモコードと利用期限、メール受信日を抽出
 * 抽出する際、プロモコードは<strong>タグの中にあるため、html形式のbodyから正規表現で抽出する
 * 入力期限は「コードの入力期限」というメッセージのあとに記載されているため、プレーンテキストのメールbodyから抽出する
 */
function extractCode(message){
  let body = message.getBody();
  let plainBody = message.getPlainBody();

  let ret = {};

  // 形式:300MBXXXXXXXXX
  let codes = body.match(/([1-9]{1}[A-Z0-9]{13})(?=.*<\/strong>)/g);
  ret["codes"] = codes;
  // 入力期限
  let limitDate = plainBody.match(/(?<=コードの入力期限\n*)20[0-9]{2}\/[0-9]{2}\/[0-9]{2}/g);
  ret["limitDate"] = limitDate;
  // 受信日
  let receiveDate = message.getDate();
  ret["receiveDate"] = receiveDate;
  return ret;
}

/**
 * スプレッドシートに書き込む
 */
function writeSheet(values){
  // 処理日
  const today = new Date();

  // 最終行を取得
  let lastRow = sheet.getLastRow() + 1;

  // セルを取得して値を転記
  let index = 0
  for(let code of values["codes"]){
    sheet.getRange(lastRow + index, 1).setValue(today);                  // 記入日
    sheet.getRange(lastRow + index, 2).setValue(values["receiveDate"]);  // メール受信日
    sheet.getRange(lastRow + index, 3).setValue(code);                   // プロモコード
    // sheet.getRange(lastRow + index, 4).setValue(email[1]);            // 容量 ※コードの仕様がわからんと入れられない
    sheet.getRange(lastRow + index, 5).setValue(values["limitDate"]);    // 使用期限 
    sheet.getRange(lastRow + index, 6).insertCheckboxes();               // 使用済みチェックボックス
    index += 1;
  }
}

/**
 * スプレッドシートに条件付き書式を設定する
 * 条件:使用済み列(F列)がTRUE(チェックON) 書式: グレーアウト
 */
function upsertConditionalFormatRule(){
  let conditionalFormatRule = SpreadsheetApp.newConditionalFormatRule()
  .whenFormulaSatisfied('=$F1=TRUE')
  .setBackground('#B7B7B7')
  .setRanges([sheet.getRange(1,1,sheet.getLastRow() + 1, 6)])
  .build()
  let conditionalFormatRules = sheet.getConditionalFormatRules();
  if(conditionalFormatRules.length > 0){
    // 既存の条件付き書式と差し替え
    conditionalFormatRules.splice(conditionalFormatRules.length - 1, 1, conditionalFormatRule);
  }else{
    // 初回起動時には条件付き書式がないので直接push
    conditionalFormatRules.push(conditionalFormatRule)
  }
  // 条件付き書式を設定
  sheet.setConditionalFormatRules(conditionalFormatRules);
}

これをGASのトリガーで一日2回動かしている。
で、スプレッドシートは以下のような形で作成。プロモコードと有効期限、使用したかどうかのチェックボックスを用意した。
普段の運用としては、通信量をチャージしたいなと思ったらこれを開いてプロモコードをpovo2.0アプリに入力、最後にチェックボックスをチェックする。

f:id:ck_fm0211:20220326220429p:plain
ギガ活プロコード管理用スプレッドシート

まだ運用開始して日数が少ないため、プロモコードの正規表現のパターンがこれであってるかどうかが怪しい気もする。
これについてはしばらくは様子を見ながら運用する。

おわりに

とりあえず気軽にできるということもありGmail→GAS→スプレッドシートの仕組みを作った。
スプレッドシートよりもnotionの方が使いやすいかなという気もしているので、そっちにそのうち移行するかもしれない。
また、「利用期限が7日以内になっているものがある場合にLINEに通知する」というGASも書いた。
これもそのうち記事にするかもしれない。というか明日には書いてるかも。

なお、この記事を読んでpovo2.0いいなと思った方がいれば(そんな人がいれば)、申込時に以下の紹介コードを入力すれば、データ使い放題(24時間)が自動で適用されたり、購入したデータトッピングに応じてプロモコードを追加で貰えたりするそうなのでよかったら使ってください。
L11MWBXE

povo.jp

2022/03/27追記

「利用期限が7日以内になっているものがある場合にLINEに通知する」というGASも書いた。
これもそのうち記事にするかもしれない。というか明日には書いてるかも。

記事にするのが面倒だったのでGitHubに上げることで供養。

github.com

*1:Androidスマホだと管理用アプリもあったりする。自分はiPhoneなので利用できないが。。rironriron.web.app

『博報堂スピーチライターが教える 5日間で言葉が「思いつかない」「まとまらない」「伝わらない」がなくなる本』を読んだ

はじめに

本屋でたまたま見かけて読んでみた。

自分は理系男子のテンプレ通り、しゃべるのが得意ではなく自分の考えを発するのも苦手なほうだと自負している。
最近は「自己開示って大事だな」と考えることもあり、プライベートなことを多少話したりもするけれど、「話す」という行為自体が得意じゃないと思っている。
仕事でも「ちょっと企画考えて持ってこいよ」的な仕事の振り方をされることもあり、そんなときにどう考えたらいいか、まとめたらいいかを模索していたときにこの本を見かけた。

本自体はだいぶ前に入手していたけれど、なんだかんだで積んでたのをようやく読んだ。
なので仕事には今のところ活かせていない。

読書メモ

本書は食品会社の広報部で働く山崎大が、広告会社に勤める和田先生と1週間に渡って、メールで「言葉が思いつかない」「考えがまとまらない」「うまく相手に伝えられない」といった相談をし、その対策方法を教わる、というストーリー仕立ての本。
全部で25個のメソッドが紹介されている。

目次は以下。

はじめに 「思いを言葉にする力」、持っていますか?
Day1 頭の中にあるものを知る
Day2 考える習慣をつける
Day3 論理的に発想する力をつける
Day4 真に伝わる表現力を磨く
Day5 言葉に説得力を持たせる
おわりに SNS時代だからこそ、忘れてはいけないこと

Day1〜Day5まで、

  1. 言葉がパッと思いつくようにする脳トレをする
  2. 自分の頭で考えるクセをつける
  3. 論理的に話をすすめるテクニックを身につける
  4. 表現のパターンを学ぶ
  5. 説得力(相手を惹きつける、話にリアリティをもたせる)を付ける方法

について解説されている。1〜2は日々のトレーニングで、3〜5は実践という感じ。
脳トレ」の中にある「形容詞をやめてみる」「実況中継してみる」は日頃の生活でも試してみようと思った。たしかに、なんて言えばいいかわからなくなったとき「やばい」で逃げてた気がする。

2、3にある内容は、普段から意識せずにやっていることもあるようにも思う。
が、やっていることが言語化されたことで「なぜこうしているか」がはっきりした気がする。もちろんやったことないことも書いてあるので試してみよう。弁証法なんかは普段の業務でも使えるやり方だと思う。

4、5にある内容は「相手の心をどう動かすか」ということが書いてある。
仕事の上では「正確に伝える」ということが重視されているのでそれほど登場機会はないだろうが、いざ自分の考えを通したいタイミングで使えると効果的だろうな。ちゃんと覚えて使えるようになっておきたい。

5の中で「街にあふれているリアルな言葉に注目してみよう」というのがある。
今はコロナ禍で外出を控えていたり、そもそもリモートワークで外に出る機会がかなり減ってしまっているので、そういう「雑多な情報」を仕入れる場が少なくなってしまっている。
そんな状況なので普段目にするニュースとかも自分の趣味嗜好に合わせたものとなってしまっているので、それ以外のチャンネルをなにか作ったほうがいいかもなと思った。
とりあえず朝起きたらテレビをつけてニュース/ワイドショーを流す、みたいなことやってみようかな。それかAlexaにニュースを読み上げてもらうとか。

その他

「おわりに」に書いてある、

特にここ5、6年前からは「同じ日本語を話しているのだろうか」と思うくらい、言葉を「思いつき」「まとめ」「伝える」ことが苦手な学生が増えてきました。

というのが、本書の出版年からすると自分がどストライクな年代だったのでドキッとした。

家のネット回線速度を可視化した

はじめに

以前ブログにも書いたけれど、今住んでいるマンションのネット環境がそれほど良くない。

ck-fm0211.hatenablog.com

VDSLなので最大100Mbpsで、これからのネット社会を生き抜いていくには少し不安がある。
なのでマンションの理事会に「光回線ひこうぜ」を提案したいのだが、マンションのデフォルトインターネット回線もあるので、現状をきちんと測定した上で提案に持っていきたい。

というわけで家のインターネット回線速度をモニタリングすることにした。

結果

結論から。 f:id:ck_fm0211:20220223192925p:plain こんな感じになった。まだ測定をはじめて数日なのでなんとも言えないが、意外と安定している。
DL/ULが荒れているところはどうも接続していた測定用サーバの調子が悪かった模様。

仕組み

speedtestのcliがあったのでこれを使うことにした。 www.speedtest.net

測定器としてはiPhoneの母艦(今はもうこういう使い方しないのかな)になっているmac mini late 2014を利用。
ここでcronで5分間隔でスクリプトを動かし、Google Spreadsheetへデータを送り、それをGoogleデータポータルでグラフにしている。

また、mac miniは有線/無線両方使える状態なので、それぞれタイミングを少しずらして測定している。

speedtest -f json -s ${SERVER_ID} -I ${NETWORK_INTERFACE_ID}

Google Spreadsheetへの登録はpythonで実行している。シートの末尾に追記するっていうスクリプトを書くのにちょっと悩んだけど、わりと簡潔に書くことができた。

# -*- coding: utf-8 -*-

import os
import sys
import csv
import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = [
    'https://spreadsheets.google.com/feeds',
    'https://www.googleapis.com/auth/drive'
]

SERVICE_ACCOUNT_JSON_PATH = os.getenv('SERVICE_ACCOUNT_JSON_PATH') # GCPサービスアカウントのキー
SPREADSHEET_KEY = os.getenv('SPREADSHEET_KEY') # 操作したいスプレッドシートの名前を指定する
WORKSHEET_NAME = os.getenv('WORKSHEET_NAME') # シートを指定する

credentials = ServiceAccountCredentials.from_json_keyfile_name(SERVICE_ACCOUNT_JSON_PATH, scope)
client = gspread.authorize(credentials)

if __name__ == "__main__":

    filename = sys.argv[1]

    spreadsheet = client.open_by_key(SPREADSHEET_KEY)
    worksheet = spreadsheet.worksheet(WORKSHEET_NAME)

    data = []

    with open(f'output/{filename}', encoding='utf-8', newline='') as f:
        for cols in csv.reader(f, delimiter='\t'):
            worksheet.append_row(cols, value_input_option='USER_ENTERED') # dataを最終行に挿入

今後

いまはmac miniで自宅で契約している楽天ひかりの速度を測定している状態。
上述の通りマンションデフォルトのインターネット回線もあるので、それの測定もしたいと思っている。ラズパイ買うか。

データポータルでダッシュボード化したものの、「もっとこういう表現したいんだよなあ」みたいなのがある。
できるのかはわからないけど、ここはもっと改善したい。

Appendix

雑に書いたコード。雑すぎる。 github.com

『自分でやった方が早い病』を読んだ

はじめに

たまたま見かけたブログ記事を読んで共感し、そこで紹介されていた本を読んだ。 liginc.co.jp

ここ数年はお客様企業にて常駐(現在はリモートワーク)し、その中でお客様・他社メンバーまぜこぜの1チームで活動している。
直近、リーダー格のお客様社員が体調を崩し数日間勤務できない状況があった。
実質No2ポジションだった自分が暫定リーダー的に振る舞う必要があったが、それがまた色々と苦労した。
自分しかできない業務(知識・スキル・権限などいろいろな理由)があったり、チーム内外の質問が自分に集約されたり、最近JOINしたメンバーのオンボーディングのフォローをしたり。
「俺がいないとだめだなあキミタチは」みたいな自尊心の高まりは感じたけど、チームとしては明らかに不健全だなと感じたのでなんとかしなきゃと思い、とりあえず書籍に頼ろうと思ったところでこの記事(本)に出会った。

読書メモ

現場の第一線で活躍してきた人が、いざ部下を持つような立場になったとき陥りがちな「自分でやったほうが早い病」について、

  • その状態が続くと何が困るか/克服するとどんないいことがあるか
  • なぜそんな状態になってしまうのか
  • どうしたら克服できるか/再発しないようにできるか

を解説している本。
「どうしたら克服できるか」について、テクニック的な話というよりはメンタルの持ちようについての記載が多い。
テクニック面は同著者の↓の本に記載されているそうなので、こちらも読んでみたい。

目次は以下。

はじめに 「自分でやったほうが早い」という病の恐ろしさ
第1章 病が進行すると「孤独な成功者」になる
第2章 病を克服すると「幸せな成功者」になれる
第3章 病の根本にある「自分さえ良ければ」という考え方
第4章 「自分でやったほうが早い病」への処方箋
第5章 「自分でやったほうが早い病」が再発しないために
おわりに 「自分でやったほうが早い」の正体は「自分でやったほうが遅い」

読みながらとったメモ

  • キーワードは「利他主義
    • 「自分でやったほうが早い」は「利己主義」である
    • 自分自身が最速で成果を上げることができるだけで、チーム・組織としての成果は小さい
      • プレイヤーとしては良いが、リーダーとしてはいまいち
      • チームでレバレッジを効かせて、1人で1の成果を上げるのではなく、5人チームなら5人で100の成果を上げるのがリーダー・マネージャーの仕事
    • 老子の言葉:「飢えている人に魚をとってあげれば、一日は食べられるけれど、魚のとり方を教えれば、彼は一生食べることができる」
  • イエローハット創業者の鍵山秀三郎氏の言葉:「人間には3つの幸せがある」
    1. してもらう幸せ
    2. 自分でできる幸せ
    3. してあげる幸せ(させていただく幸せ)
    4. 1,2は利己主義。3は利他主義
    5. 誰かの力になる、誰かを助けてあげることで、相手以上に自分自身が幸福を得られるということ
    6. マネージャーは「してあげる幸せ」を知っている人。これは「自分でできる幸せ」よりも大きなものであると実感できるはず。
  • 「任せる」のゴールは「任せたら自分は一切何もしなくていい」状態。
    • この状態に至るには困難がたくさんあるはず。1度任せたから終わりということにはならない。
      • 仕事をこなすことが目的ではなく、仕事を通じて部下の成長を促すのが目的になる。
      • 人に動いてもらう・育てるというのは時間がかかるもの。中長期的な視点をもって取り組まなければならない。
    • ディレクションだけ自分がやり、実作業を周りの人や部下に任せる、というのは「自分でやったほうが早い」状態
      • 必要なのは責任も同時に渡すこと。
  • 「任せる」ためには自分自身の人間的成長が不可欠。テクニックだけではダメ。
    • 部下を変えるのではなく、自分が変わる。我慢ではない。
    • 変わるためには師を得るのが良い。
      • 周りにいなければ有名人・著名人でも良い。その人の考え方に共感できるかどうかが重要。

感想

「自分でやったほうが早い」は「利己主義」である

は衝撃だった。「みんなのために身を粉にして働いているんだ」と思っていたけど、その実は自分のためだったのか。確かにそうかもしれない。
チーム・組織のことを考えると全体のレベルアップを図るほうが良いし、結果的に自分が楽をしたり別のことにチャレンジしたりもできる。

また「任せるのは大変。長い道のりである」というのも、言われてみれば確かにそうだった。
よく、ちょっと任せてみてうまく行かないからあいつに任せるのはやめよう、みたいなことがあったりするけど、それはあまりにも短気だったようだ。
中長期的に人を育てる、という感覚で接する必要がある。
そのためには自分自身が変わる必要がある。変わろうとする必要がある。
先日、職場の方のツテで聞いた↓の話を思い出した。
speakerdeck.com

あとどうでもいいけど、「してあげる幸せ」という話は槇原敬之の「僕が一番欲しかったもの」を思い出した。


www.youtube.com

郵便受けに投函されたらSlack/LINEに通知してみた[Qiita補足]

タイトルの通り。Qiitaを書いたのでその補足とか。

qiita.com

利用サービス

お金回りとかをちょっとまとめてみる。

分類 サービス名 月額料金 資料
IoTデバイス SORACOM LTE-M Button Plus 基本料金: 110 円 / 月
従量課金: 1送信当たり 0.3~0.4円 (月に300回の送信で約80円 = 80円/300回 = 約0.27円)
ご利用料金 - 特定地域向け IoT SIM
よくある問い合わせ - データ通信量はどのくらいですか
プラットフォーム SORACOM Func 無料
※1リクエストあたり0.00198円
※月間 50,000 リクエストまで無料
SORACOM Funk のご利用料金
プラットフォーム GCP Cloud Functions 無料
※200 万回の呼び出しのほかに、400,000 GB 秒、200,000 GHz 秒のコンピューティング時間と、1 か月あたり 5 GB のインターネット下りトラフィック(外向きトラフィック)まで無料
Cloud Functions - 料金

ランニングコストは月200円もしないくらいに落ち着きそう。

ソースコード

GitHubに上げた。

github.com

環境変数でSlackのトークンやチャンネル名、LINEのトークンを指定するようにしてある。 環境変数env.yamlに書いて、デプロイするときにそれを読み込ませている。

FUNCTION_NAME=notify_from_mailbox
gcloud functions deploy ${FUNCTION_NAME} \
--region asia-northeast1 \
--runtime python39 \
--trigger-http \
--allow-unauthenticated \
--env-vars-file=env.yaml \
--memory 128MiB

Slackの通知設定

Qiitaの方では参考サイトをそのまま貼ったけど、こっちではもう少し詳しく書く。リンク先が消えるかもしれないし。

アプリの作成

Slackのアプリ作成ページからCreate New Appを押下。 https://api.slack.com/apps このとき、仕事で使っているWorkSpaceの情報も統合されていて、そっちで作成したアプリが表示されていて焦った。 何を見て判断しているかわからないけど、複数アカウントが紐付けられてしまっている模様。

権限設定

メニューからOAuth & Permissionsを選択。 Scopesから必要な権限を選択。今回はchat:writeだけでOK。

ワークスペースへインストール

メニューからInstall Appを選択し、ワークスペースへインストールする。 そうするとトークンが発行されるので、そのトークンを使って実装すればOK。

LINEの通知設定

Qiitaの方では参考サイトをそのまま貼ったけど、こっちではもう少し詳しく書く。リンク先が消(ry

アクセストークンの発行

LINE Notifyのページでログイン

https://notify-bot.line.me/ja/

右上からマイページへ移動し、トークンを発行ボタンを押下する。

トークン名と、通知先トークルームを選択して発行ボタンを押下。 ※先に「LINE Notify」とLINE上で友だちになっておき、通知に使いたいトークルームを作成しておくとスムーズ。

これでトークンが発行されるので、そのトークンを使って実装すればOK。

SORACOM LTE-M Button Plusの設定でハマったこと

SIM登録

soracom.github.io

バイスが到着してまずやることとしてSIM登録をしろというのがあった。 言われたとおりにやろうとしたけど、そもそもSIMカードなんてもらってませんけど???となって焦った。

SORACOMのコンソールで登録済みのSIMのページを見たらどうやらすでに登録済みだった模様。なんでやねん。

配線

soracom.jp

離れた時に “ON” (= SORACOM LTE-M Button Plus が動作)する組み合わせ

磁気センサー部の「灰」と「赤」のケーブルを SORACOM LTE-M Button と接続します。これにより、磁気センサーのセンサー部と磁石部が離れた時にセンサーが “ON” となります。

とあったのでその通りに配線してみたけど通知が飛ばず。

近づいた時に “ON” (= SORACOM LTE-M Button Plus が動作)する組み合わせ

磁気センサー部の「灰」と「白」のケーブルを SORACOM LTE-M Button と接続します。これにより、磁気センサーのセンサー部と磁石部が近づいた時にセンサーが “ON” となります。

まさかどっちかのケーブルが断線してる??と思い、試しに逆向きの配線にしてみたら通知が飛んだ。 ということはケーブルは全て生きてる・・・まさか!で「赤」「白」をつないだら通知が飛ぶようになった。 初期不良かドキュメントの間違いか・・・・いずれにしても焦らせやがってこのやろうと悪態をついていた

・・・

という記事を書いているところで気がついたのだけれど、

A: お手元のセンサー部のケーブル色が「赤・白・灰」における動作

B: お手元のセンサー部のケーブル色が「茶・白・灰」における動作

と、コードの組み合わせがそもそも2種類あった模様。そして手元にあるのは「茶・白・灰」のパターン。

B: お手元のセンサー部のケーブル色が「茶・白・灰」における動作

離れた時に “ON” (= SORACOM LTE-M Button Plus が動作)する組み合わせ

磁気センサー部の「茶」と「白」のケーブルを SORACOM LTE-M Button と接続します。これにより、磁気センサーのセンサー部と磁石部が離れた時にセンサーが “ON” となります。

仕様どおりだった。SORACOMさん申し訳ありませんでした。

まとめ

とりあえず運用開始してみたけどどうなるかな。
ポストの中にコードがむき出しで配置されているので、そのうち大きい荷物とか入れられたときに断線しそうな気はしている。 なんらかの対策をしないといけないな。

『データサイエンス100本ノック(構造化データ加工編)』をやってみた(SQL)

データサイエンス100本ノック(構造化データ加工編)をやってみたのでその感想など。
データエンジニアを(一応)名乗っているので、それなりにできないとまずいかなと思い挑戦。
いうてパイプライン作る側の人なのでゴリゴリの分析SQLを投げたりするわけではないのだけれど、分析基盤のユーザーの気持ちを少しでも分かりたいなと思ったので。

ちなみに挑戦したのはSQL版。いずれ他言語もやってみよう。
github.com

準備

READMEに書いてあるとおり、

git clone [Repository URL] ※
cd 100knocks-preprocess
docker-compose up -d --build

でOK。ちなみに止めるときは↓。

# 一時中断のとき
docker-compose stop
# 再開するとき
docker-compose start

# 完全に終わりたいとき
docker-compose down

ローカルPCでやらなくてもGoogle Colabとかでやる方法もある。 qiita.com

感想など

金曜の終業後〜日曜日の計3日間で終わった。結構なボリュームだと思ったが、まあこんなもんか。



普段の業務で「こういうときどうしたらいいんだろう?」みたいなのがたまにあったりするけど、その回答が見つけられたように思う。

例:
- 時系列データに対して日付をずらしながら集計するには?
- カテゴリごとにランダム抽出するには?
- 欠損値はどう扱う?



DBはPostgreSQLなので、方言とか「そんな関数あったんかい!」みたいなのはあるけどまあそこは本質ではないのであまり気にしない。
SQLでどう表現すればいいんだろう?を悩む感じだった。



データ型がまばらなのもリアルでいいなと思った。日付データがINT型だったりVARCHAR型だったり。
実際の業務でもそういうの結構あったりする。
E-R図があるので、設問によっては参照しないとどうしようもなかった。メタデータって重要。



たまに標準偏差とか第一四分位数とか統計用語出てくるあたりはさすがはデータサイエンティスト協会って感じ。
そのへんの知識とか正しい理解とかが足りてないかなと思うところもあるので、いずれ勉強したいなあ。





チームメンバーとかが増えたときとか、これを使ってその人のスキルレベルを測ることもできそうだなと思った。
そうでなくてもオンボーディングに組み込むとかも良さそう。

ちなみにデータサイエンティストのスキルチェックリスト(ビジネス力・データサイエンス力・データエンジニアリング力)もあったりして、これまた有用そうだなと思った。 github.com