電算倶楽部 富山県のコンピュータ社会人サークル

富山県、特に滑川市、富山市、魚津市周辺で活動している社会人サークルです。

ビエンナーレで見るマイコン

群馬県吾妻郡中之条町で行われる2年に1回の美術祭、中之条ビエンナーレに行ってきました。美術の世界も刻々と変化をしているようで、今年はマイコンを使った作品がいくつも見受けられました。かいつまんで紹介したいと思います。

気温センサーによる照明と音響の調整

井出貴史/サマヨラ
https://nakanojo-biennale.com/artist/takafumi-ide

人が倉庫に入ることで色が変化する藁です。 f:id:s-densan:20190917230306j:plain 外気温と、深さ5cmの地温を測り、どちらの気温が高いかで照明の色と音響を変化させます。 入り口にディスプレイが配置されており、その裏にArduinoと思われるマイコンが設置されていました。

f:id:s-densan:20190917230331j:plain

センサーでシャボン玉を生成

O2 LAB
https://nakanojo-biennale.com/artist/o2-lab

建物に人が入ると自動でシャボン玉が飛ぶ作品です。 f:id:s-densan:20190917230509j:plain 建物の入り口にあるセンサーで人の出入りを検知し、シャボン玉のリングをモータで動かしていました。 おそらくマイコンで制御している想定ですが、裏を覗きましたが、マイコン本体は確認できず。 なおシャボン液の補充は手動のようです。 f:id:s-densan:20190917230533j:plain

踊るロボットたち

ボタンを押すことで踊るロボットたち。裏側にはむき出しでRaspberry Piが配置されていました。 起動信号はLAN経由で受信し、3つのサーボモータで出力しているようです。

f:id:s-densan:20190917230554j:plain f:id:s-densan:20190917230606j:plain

音の鳴るモノ

様々なモノにパイプが付いており、そこからモノの音が聞こえてくる作品。 ただ音を鳴らすだけなのでマイコンが必要というわけではないのですが… f:id:s-densan:20190917230634j:plain

裏側を覗き込むとマイコンが設置されていました。安価なので単純な機能としても使いやすいですね。残念ながら機種は不明です。 f:id:s-densan:20190917230656j:plain

街角の電光掲示

こちらはビエンナーレではないのですが、街角で見かけた電光掲示板です。
裏を覗き込むとRaspberry Piがおいてありました。なお、電光掲示板は写真の通り表示がおかしなことになっています。そりゃ雨ざらしですしね。。。

f:id:s-densan:20190917230717j:plain f:id:s-densan:20190917230744j:plain

おわりに

芸術作品は人それぞれ捉え方が違うと思いますが、ITの目線でみると更に違った目線で作品を鑑賞できます。これも楽しみ方の一つではないでしょうか。
中之条ビエンナーレは9/23(月)まで。お時間のある方はぜひ行ってみてください。

なお、マイコンは裏側や下側から覗かないと見えない位置に配置されていたわけですが、それを写真に撮っている姿は想像しないように。

おまけ。こんなのもありました。なんでScratch… f:id:s-densan:20190917230817j:plain

Excel購入方法まとめ

最近、富山県立大学リカレント教育を受けさせていただいています。 その中で必要になってきたのがExcelです。

会社では毎日のように使っているExcelですが、自宅では使うことがないため購入していませんでした。 とりあえず教育期間の3ヶ月だけExcelを使えるようにしたい。ということで安くExcelを使う方法を調べてみました。

要件

  • Excelが使える(WordやPowerPointは不要)
  • 講義で使うため、講師と操作が統一されている方が良いためMicrosoft以外のOfficeは不可
  • 基本的な表計算・統計機能が使えればよく、最新機能は不要
  • 安定して使うためローカルにダウンロードできるもの
  • マクロは使えればいいが必須ではない
  • とりあえず3ヶ月使えれば良い

一覧

買い方は色々あるようですが、お得かなと思ったものをリストアップしてみました。

買い方 製品名 支払い方式 3ヶ月分価格(税抜) マクロ使用可否
お名前ドットコム Office 365 Business サブスクリプション 2,700円(900円/月)
OneDrive経由で契約 Office 365 Solo サブスクリプション 1,684円(初月無料、842円/月)
Excel 2019 単品購入 Excel 2019 買い切り 約15,000円
Microsoft Office Online Microsoft Office Online 無償 0円 不可

お名前ドットコムから購入する方法は、Business版がついてくる割に月当たり900円で格安です。 OneDrive経由のものは初月無料がいいですね。 Excel 2019は長期的に見れば一番安く済みます。 Microsoft Offline Onlineは機能制約が大きくインターネット環境が必須ですが無料です。 どれも一長一短で悩ましい…

結局…

OneDrive経由で契約しました。1ヶ月なら無料。その間にMicrosoft Office Onlineを評価してみようかと思います。 Online版が使えれば無料で乗り切れます。ケチくさいですね。

PC購入のための仕様の見方講座

遅くなりましたが8月の定例会を10日に実施しました。 2020年1月でWindows 7のサポートが終了するということでメンバー内でPCの購入需要があり、 パソコンの仕様について解説+購入時のコツの講座をやってみました。

Raspberry PIを持っていたので、「これがCPUで~」とかやってみたのですが反応はいまいち。やっぱりその場でノートパソコンを分解してみせたほうが良かったか…

せっかくなのでその時使った資料を掲載します。ほぼ私の偏見でできています。


基礎知識 PCの構成

知っておいたほうがいい基本用語

ハードウェア

人間の体との対応も記載。 ラズベリーパイで実際に見てみよう。

コンピュータの5大要素

https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE5%E5%A4%A7%E8%A3%85%E7%BD%AE

  1. 演算装置
  2. 制御装置
  3. 記憶装置
  4. 入力装置
  5. 出力装置
項目 5大要素 人間に例えると 説明
CPU 演算装置・制御装置 脳(思考能力) 最近はGPU機能も持っている
GPU 演算装置・制御装置 脳(思考能力) グラフィックスに特化。AIの計算にも。
メモリ 記憶装置 脳(短期記憶能力) 処理を行うデータを一時的に記憶しておく場所。よく机の上に例えられる。
ストレージ(HDD・SSD) 記憶装置 脳(長期記憶能力)
マウス・キーボード 入力装置 目、耳、鼻など
ディスプレイやスピーカー 出力装置 顔、声など
マザーボード - 骨格 USBの数や搭載できるCPU・メモリの種類などが決まる。

ソフトウェア

  • OS オペレーティングシステムの略。 基本ソフトウェア。 Windows/Mac/Linux/Android/iOSなど OSが異なれば基本操作も対応するハードウェアも異なる。動作するアプリケーションも異なる。 ゲーム機でいうとSwitchとPlayStationのような違い。

  • アプリケーション OSの上で動くソフトウェア。 私達がソフトウェアというと主にこれを指す。 メモ帳/ペイント/Internet Explorer/MS Officeなど。

買うときに何をチェックしますか?

私なり。

  • 形状
    • デスクトップ : カスタマイズしやすい、排熱機構を備えれば熱を持つ高性能なCPU,GPUが使える
    • ノート : 持ち運びできる、キーボード
    • タブレット : 持ち運びできる、画面
  • サイズ ノートパソコンやタブレットを買うなら重要
    • 画面サイズ
      • ノート
        • A4サイズで12インチほど。それより大きいと持ち運びでちょっと重いかも。
      • タブレット
        • 片手で持つなら8インチ、きれいに動画などを見るなら10インチ
    • 解像度 : 1920x1080(フルハイビジョン)あればきれい。
    • 重量
  • OS : 主に以下の3種類から選ぶ。こだわりなければWindows
    • Windows : 汎用。動作するアプリケーションが多い。
      • Windows 10 Home 最新バージョン (Professionalとかあるけど必要ないかな)
    • Mac : iOSと相性が良い、(使ったことがないのでよくわかりません)
    • Linux : 無料、サーバ用途にも使える、知識が必要
  • ストレージ
    • HDDかSSD
      • HDD : 大容量、安価。回転するため発熱、振動、騒音あり。SSDに比べて低速。
        • 特別なことをしないのであれば200GBくらいで十分かと。
        • 2TBあたり
      • SSD : 中容量、HDDよりは高価。最近は安くなってきている。発熱、振動、騒音小。高速。
      • 併用という考え方
        • メインをSSDにすると起動時早い。
        • 写真や動画はHDDにして節約する。
    • 内蔵か外付けか
  • メモリ
    • サイズ : 4~8GB
    • メモリ規格 : DDR4が最新 あまり気にしなくてもいいと思う
  • CPU
    • メーカー : 主にIntelAMDだけど主流はIntel(以下、Intelを前提に記載)
    • 種類
      • Core i シリーズ。後半に続く数字が大きいとスペックが高い。 Core i 3 が標準くらい。Core i 7はハイスペック。
      • Pentium 安価なCPU。私はこれで妥協した。
      • Celeron もっと安価なCPU。
      • Core mシリーズ ノート用の発熱の少ないモデル。
    • コア数 : 並行処理に適しているか。通常使用なら2~4くらい。
    • 世代 : 現行は9。Core i5-9600
    • 発熱 : ノートパソコンの場合、発熱が少ないものを選んだほうがいいかもしれない。Core Mシリーズ。
  • インターフェース
    • 画面 : 外部TVに写すならばHDMI
    • 有線機器(マウスやキーボード) : USB2.0 / USB3.1 / USB Type c(最新)
    • 無線機器(ヘッドホン、無線対応マウス) : Bluetooth
    • メモリーカード : メジャーはSDカード、SDXCに対応しているか(64GB以上のSDカード読み書き)
  • ネットワーク
  • アプリケーション : Office製品とセキュリティソフトの有無をチェック
    • Officeと書いてあっても、MS Officeでないことも。注意。
    • 無料のOfficeもある。ちょっとした資料作りで使いたければあえてMS Officeはいらない。
    • セキュリティソフトも無料のものもある。
      • Avastなど
  • 金額
    • 価格ドットコムを活用する

キャッシュレス入門講座

キャッシュレス・消費者還元事業の開始が目前となり、またQRコード決済の普及がニュースとなる今日このごろ。 キャッシュレス決済について知りたいとの需要がありましたので、7月の定例会で扱いました。

キャッシュレス決済の分類

支配方法と、媒体でマトリクスを作ってみました。 キャッシュレス=無尽蔵にお金を使えてしまう=怖い、という印象がちらほら聞こえますが、意外と後払い方式って少ないんです。

媒体 \ 支払い方式 前払い方式 後払い方式 即時支払方式
商品券
図書券
磁気カード・
ICカード
テレフォンカード
図書カード
Kyash
各種クレジットカード 各種デビッドカード
接触型IC Suica
楽天Edy
nanaco
Quick Pay
iD
コード Amazonギフト券
スマートフォン
アプリ
PayPay
楽天Pay
LINE Pay
ゆうちょPay
銀行Pay
Origami Pay

参加者にアンケート

参加者5名(富山県在住4名、オーストラリア在住1名)に、主に使用しているキャッシュレス支払い方法についてアンケートを取ってみました。

キャッシュレス決済方法 人数(うち、富山県在住) 割合
クレジットカード 6人(5人) 100%
デビッドカード 1人(0人) 17%
ポストペイ非接触ICカード 2人(2人) 33%
プリペイド接触ICカード 1人(1人) 17%
QRコード決済 1人(1人) 17%

クレジットカード以外はあまり普及していませんね。 富山県ではあまり必要性を感じないのでしょうか。

オーストラリアではデビッドカードがよく使われるらしいですよ。

キャッシュレス決済の何がお得か

キャッシュレスへの意欲を高めるべく、あらためてキャッシュレス決済のメリットを挙げてみました。 想像通りですが、皆さんポイント還元に興味があるようでした。

利用者から見たメリット

  • ポイント還元 PayPayの20%還元キャンペーンが記憶に新しい
  • 現金を持ち歩かなくて良い(軽量化、紛失盗難のリスク減)
  • 後払い方式の場合、お金が無くても買い物ができる
  • 自動で家計簿をつけられる
  • 付随する各種サービス 特にクレジットカードには支払い以外の特典が多くつく。
    • 旅行保険
    • ETCカード発行
    • 空港ラウンジ利用
    • 割引サービス(施設使用料、ガソリン、映画など)

小売から見たメリット

  • 現金輸送コスト減
  • 金保有リスク減(強盗など)
  • 客層の拡大
  • インバウンド集客

金融機関から見たメリット

  • ATM管理コストの減 ATMはコンビニ向けの簡単なもので約200万円らしいです…しかも警備やメンテナンス費用がかかります。

国から見たメリット

  • 脱税防止
  • 訪日外国人の支払手段にできる
  • 犯罪抑止 現金は犯罪組織やテロ組織の資金として使用されがちとのこと。
  • 貨幣流通コスト減

富山でおすすめするキャッシュレス決済

私のおすすめするキャッシュレス決済は、QRコード決済クレジットカード(またはクレジットカード式のプリペイドカードやデビッドカード)の併用です。

QRコード決済は競争が激しく、各社で競ってキャンペーンを行っています。 しかし、富山でQRコード決済が使えるのは薬局・コンビニが多く、スーパーや飲食店、衣料品店をカバーすることができません。 そこで、QRコードが使えないクレジットカード等で補います。 ここ数年でクレジットカードが使えるスーパーが増えましたしね。

QRコード決済体験

参加者みんなで一緒にQRコードアプリを設定してみました。 今回使ったのはOrigami Pay。割引がわかりやすく、常時2%オフになります。 銀行口座やクレジットカードを設定しなければならず、導入のハードルが高いようでしたので、今回の会は導入の良いきっかけになったようです。

終わりに

絶対必要、というわけでもなく、なかなか進まないキャッシュレス決済。今回扱ったように色々とメリットがあります。 是非皆様もキャッシュレス決済を導入し、お得なお買い物を体験してみてください。

Zoomで国境を超えてみる

先日、7月の定例会を実施しました。さて今回は富山では5人、遠隔地で1人の参加でした。 その遠隔地ですが、なんとオーストラリア! 先日まで富山に住んでいましたが、ご家庭の都合でオーストラリアに引っ越しされました。

f:id:s-densan:20190731210125p:plain
7,000km

直線距離で約7,000kmです。

zoomとは

無料1で使える会議室システムです。インターネットさえあればいつでもどこでもビデオチャットができます。 https://zoom.us/jp-jp/meetings.html

昔からこういうのあるよ、と思われるかもしれません。 lineでもビデオ通話ができますしね。 zoomには以下のような特徴があります。

簡単に参加

アプリのインストールは必要ですが、参加者はアカウントの登録は必要ありません2。 主催者が発行するurlをクリックするだけで参加できます。

パソコンでもスマホでも

ビジネスで使うパソコンはもちろん、スマホでも使用できます。 外回り中に会議なんてこともできるかも。

安定した接続

比較したわけではないですが、安定しているらしいです。 環境は違いますがlineやdiscordのビデオチャットでプツプツだった記憶があります。

実際使ってみた感想

富山県とオーストラリアで接続してみました。

f:id:s-densan:20190731210203j:plain
Zoom

お互いスマホです。富山県側は5人居るのでちょっと窮屈ですね… なお、富山県側は公共wifi、オーストラリア側は自宅のwifiからの接続です。

良かったこと

あらかじめ主催側はアカウントを作っておき、参加者にはアプリのインストールをしておくよう伝えておきました。そのため、当日は会議室を作成してurlをslackで通知し、そこにアクセスしてもらうだけでした。特に迷うポイントはありませんでした。

接続状況は良好でした。さしたる遅延もなく、スムーズに会話できます。音質や画質が悪いとも感じませんでした。とても7,000km離れているとは思えないです。

今ひとつだったこと

接続機器にスマホを使ったのですが、画面が小さいことと、マイクの集音が位置により偏ることが問題でした。 外部マイクやプロジェクターがあればいいですね。

終わりに

関東ではオリンピックの影響でテレワークが流行っていますが、地方ではいまいち盛んではありません。 しかし、テレワーク自体は働き方を改善する手段として希望する意見がチラホラと聞きます。 zoomは無料で使用できます。まずは体験してみてはいかがでしょうか。


  1. 無料の場合は機能制限があります。

  2. 主催者はアカウント登録が必要です。

Raspberry Pi復活作戦

せっかく買ったのに結局使わずじまいで、ふとしたきっかけに出てくることってありませんか?私はよくあります。
例えばちょっと背伸びして買ったおしゃれな服。例えば年に1回しか作らない麻婆豆腐のために買った賞味期限切れの豆板醤。
せっかくのポテンシャルを無駄にしてしまっている彼らですが、見つけたら是非役立ててやりたいものです(豆板醤はともかく)。
そして最近新たに机のそこから出てきたものがあります。そう、Rasberry Pi Zero Wです。

近年のマイコンブームの火付け役であるRasberry Piですが、買ったはいいものの特に作りたいものがなくて放置された方も多いはずです。しかし、最近はIoTブームで小型コンピュータによるセンシングが企業でも盛んに行われるようになりました。
いまこそRaspberry Piを復活させて一儲け会社に寄与して地域と社会の役に立てるチャンスです。

f:id:s-densan:20190716204025j:plain
Raspberry Pi Zero W

セットアップ

ということで早速セットアップしました。セットアップ方法は他に詳しいサイトがたくさんあるので他を参考にしてください。
画面からでもセットアップできますが、今回はコマンドを使ってセットアップしました。
コマンドだと、メモしておけば2回目以降のセットアップは半自動化できます。画面を使ったセットアップにはないメリットです。

参考までに私のセットアップメモを晒しておきます。

cd ~/

HOSTNAME="(秘密)"
GIT_USERNAME="(秘密)"
GIT_EMAIL="(秘密)"

# アップグレード
sudo apt -y update
sudo apt -y dist-upgrade
sudo apt -y autoremove
sudo apt autoclean
# sudo apt -y install unattended-upgrades
# インストール
sudo apt -y install git
sudo apt -y install vim
sudo apt -y install i2c-tools

# raspi-config
# GPUメモリ割:16
sudo raspi-config nonint do_memory_split 16
# Wi-Fi国:日本
sudo raspi-config nonint do_wifi_country JP
# SDカードの拡張
sudo raspi-config nonint do_expand_rootfs
# 言語:日本語
sudo raspi-config nonint do_change_locale ja_JP.UTF-8
# タイムゾーン:東京
sudo raspi-config nonint do_change_timezone Asia/Tokyo
# I2C:有効(0が有効)
sudo raspi-config nonint do_i2c 0
# SPI:有効(0が有効)
sudo raspi-config nonint do_spi 0
# ホスト名
sudo raspi-config nonint do_hostname ${HOSTNAME}


# pip インストール
sudo apt -y install python3-distutils
wget https://bootstrap.pypa.io/get-pip.py 
sudo python3 get-pip.py 
rm get-pip.py

# pythonライブラリ
# python2の場合はpython-smbus
sudo apt -y install python3-smbus
sudo python3 -m pip install transitions
sudo python3 -m pip install smbus2


# git設定

git config --global user.email ${GIT_USERNAME}
git config --global user.name ${GIT_EMAIL}

終わりに

まずはセットアップまで終わりました。配線もちょっとしていますがまともに動いていません。
次はキャラクタディスプレイをいじっていこうかと思います。

SlackとLINEを連携する(3) Slack→LINE

前回はLINEからSlackへ通知できるようにしたので、今回はSlackからLINEへ通知できるようにします。

新しくGoogle Apps Script(以下GAS)ファイルを作成してプログラムを作っていきます。

長いので要点だけ解説します。

ソースコード

/**
 * @fileoverview Slackのgeneralチャンネルに通知されたメッセージをLINEボットに転送する。
 * @author smp
 */

// LINEトークン
var LINE_TOKEN = "(秘密)";
// LINEチャンネルアクセストークン
var LINE_ACCESS_TOKEN = "(秘密)";
// LINEメッセージプッシュ用APIのURL
var LINE_MESSAGE_PUSH_URL = "https://api.line.me/v2/bot/message/push";
// SLACKトークン
var SLACK_TOKEN = '(秘密)';
// GoogleドライブディレクトリID
var GOOGLE_DRIVE_DIR_ID = '(秘密)'
// LINEユーザ一覧ファイル名
var LINE_USER_LIST_FILENAME = 'LineUserList.json';

/**
 * @summary Postリクエスト処理。
 * Slack Outgoing WebhookからPOSTで通知された場合に実行する関数。
 * イベントに含まれるチャンネル名、ユーザ名、本文をLINEに通知する。
 * @param e Slackから通知されるメッセージ
 */
function doPost(e) {

  // 1.各種情報を取得
  // (1)チャンネル名
  var chName = e.parameter.channel_name;
  // (2)ユーザ名
  var userName = e.parameter.user_name;
  // (3)本文
  var text = e.parameter.text;
  // (4)Slackトークン
  var slackToken = e.parameter.token;

  // 2.メッセージの組み立て
  var msg = 'Slack投稿通知\n' +
    'チャンネル : ' + chName + '\n' +
    '発言者 : ' + userName + '\n' +
    '内容 : ' + text;

  // 3.送信
  switch (slackToken) {
    case SLACK_TOKEN:
      pushToLine(msg);
      break;
    default:
      // do nothing
  }
}

/**
 * @name LINEへメッセージ送信
 * @summary LINEユーザ一覧ファイルにある宛先へメッセージを送信する。
 * @param {string} text 本文
 */
function pushToLine(text) {
  // LINEユーザ一覧を読み込む。
  var lineUserList = getLineUserIdList();

  // 全LINEユーザに対して繰り返し処理を実行する。
  for (i in lineUserList) {
    var lineUserId = lineUserList[i];
    try {
      pushToLineOneUser(text, lineUserId);
    } catch (err) {
      console.log(err);
    }
  }
}

/**
 * @name LINEへメッセージ送信(1ユーザ)
 * @summary 指定したメッセージを、指定したLINEユーザID宛に送信する。
 * @param {string} text 本文
 * @param {string} lineUserId LINEユーザID
 */
function pushToLineOneUser(text, lineUserId) {

  // ヘッダデータ作成。
  var headers = {
    'Content-Type': 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN,
  };

  // POSTリクエストデータ作成。
  var postData = {
    'to': lineUserId,
    'messages': [
      {
        'type': 'text',
        'text': text,
      }
    ]
  };

  // 送信データを作成。
  var options = {
    'method': 'post',
    'headers': headers,
    'payload': JSON.stringify(postData)
  };

  var response = UrlFetchApp.fetch(LINE_MESSAGE_PUSH_URL, options);
  return response;
}
/**
 * @name LINEユーザID一覧取得
 * @summary LINEユーザ一覧ファイルからLINEユーザIDの一覧を取得する。
 * @returns LINEユーザリスト
 */
function getLineUserIdList() {
  var jsonData = readJson(LINE_USER_LIST_FILENAME);
  var userIdList = [];
  // ユーザ一覧作成
  if (jsonData.list) {
    for (var i in jsonData.list) {
      userIdList.push(jsonData.list[i].userId);
    }
  }
  return userIdList;
}


/**
 * @name Google Drive内ファイル取得
 * @summary Google Driveのディレクトリパスとファイル名から、ファイルを取得する。
 * 存在しない場合は新しく作成する。
 * @param {string} dirId ディレクトリID
 * @param {string} fileName ファイル名
 * @returns ファイルオブジェクト
 */
function getGoogleDriveFile(dirId, fileName) {
  var dir = DriveApp.getFolderById(dirId);
  var file = dir.getFilesByName(fileName);
  if (file.hasNext()) {
    // 存在する場合
    return file.next();
  } else {
    // 存在しない場合
    return dir.createFile(fileName, '');
  }
}



/**
 * @name jsonファイル読み込み
 * @summary jsonファイルをGoogle Driveから読み込む。
 * jsonファイルを読み込み、パースして返す。
 * jsonファイルがない場合、新しくjsonファイルを作成する。
 * @param {string} jsonPath Google Drive内jsonファイルパス
 * @returns {object} 読み込んだjsonデータ
 */
function readJson(jsonPath) {
  var file = getGoogleDriveFile(GOOGLE_DRIVE_DIR_ID, jsonPath);
  var content = file.getBlob().getDataAsString();
  if (!content) {
    // ファイルの内容が空の場合
    return {};
  } else {
    var json = JSON.parse(content);
    return json;
  }
}

Postリクエスト受信と制御

今回もメッセージ受信にはdoPost関数を使用します。 ただし、引数eにはLINEからのメッセージではなくSlackからのメッセージが格納されています。

まずはeからLINEに通知したい各種情報を取得します。 今回はメッセージ用にチャンネル名、ユーザ名、本文を取得しました。 また、送信元が正しいか確認するためにSlackトークンも取得しておきます。

function doPost(e) {

  // 1.各種情報を取得
  // (1)チャンネル名
  var chName = e.parameter.channel_name;
  // (2)ユーザ名
  var userName = e.parameter.user_name;
  // (3)本文
  var text = e.parameter.text;
  // (4)Slackトークン
  var slackToken = e.parameter.token;

  // 2.メッセージの組み立て
  var msg = 'Slack投稿通知\n' +
    'チャンネル : ' + chName + '\n' +
    '発言者 : ' + userName + '\n' +
    '内容 : ' + text;

  // 3.送信
  switch (slackToken) {
    case SLACK_TOKEN:
      pushToLine(msg);
      break;
    default:
      // do nothing
  }
}

LINEへ通知

LINEへの通知データの中にはLINEのユーザIDが必要です。 そのため、getLineUserIdList関数を作りGoogle DriveのLineUserList.jsonから情報を取得します。

取得したすべてのLINE IDに対しループさせ、メッセージを送ります。

function pushToLine(text) {
  // LINEユーザ一覧を読み込む。
  var lineUserList = getLineUserIdList();

  // 全LINEユーザに対して繰り返し処理を実行する。
  for (i in lineUserList) {
    var lineUserId = lineUserList[i];
    try {
      pushToLineOneUser(text, lineUserId);
    } catch (err) {
      console.log(err);
    }
  }
}

確認

ウェブアプリケーションとして導入し、Slackのgeneralチャンネルにメッセージを投稿するとLINEに届きました。

課題

これで一通りSlackとLINEのメッセージのやり取りができるようになりました。しかしまだ以下のような課題があります。

  • ログをファイルとして保存しておきたい。画面からの確認はタイムラグがある(?)し、ちょっと使いづらい。
  • LINEで同時にブロック・ブロック解除すると、LineUserList.jsonに反映されない場合がある(競合している)。

対処したらまた記事にします。