かずきち。の日記

サーバサイドエンジニアのつぶやき

【リポジトリあり】こんなに簡単なの?Google Firebaseを使って、さくっと拡張現実アプリを作る!【イベント】


引用:
http://firebase.google.com/

Google Firebaseは知っていますか?

Gmail・GoogleMaps・YouTubeといったメジャーなGoogleサービスをご存じの方は多いでしょう。
しかしGoogleプロダクトには日本人があまり知らないようなサービスがあります。
そのひとつに2011年にGoogleによって買収された「Firebase」というサービスがあります。

ja.wikipedia.org
引用:
https://ja.wikipedia.org/wiki/Firebase

このサービスはモバイルアプリケーションを開発するサービスで、複数のGoogleサービスと連携することで開発がしやすいのが特徴です。
しかもユーザー数が一定に達するまでとにかく無料で開発できるのも特徴です。
Googleが持っている数々のAPIを利用して、誰でも簡単にアプリが開発できます。


Googleが持っているモバイルアプリケーション開発プラットフォームにFirebaseがある

Firebaseとはウェブアプリ開発のプラットフォームでユーザー数が見込めるまで無料で自由にアプリを作らせてくれます。

firebase.google.com

無料なのでたしかにAPIのコール数などは制限があり、月に20万回・5GBまでなど制限はあります。
でも個人で開発している分にはお金はほぼかからないと言っていいでしょう。
(以前、誤爆してGoogleから万単位の請求が来たことがありますが…)

今回は拡張現実を作る簡単なアプリを作成

github.com

GitHubでGoogle ARチームがソースコードを公開していますので、拝借してコンパイルしていきます。
java,C#,JavaScript,C++,Objective-Cが主な使用言語です。

こんなマーカーが作成できました。
あとはこいつをFirebase上のアプリで読み取っていきます。

www.youtube.com

こんな具合に特殊なカメラを通してマーカーを撮影すると、マーカーの上に拡張現実が登場します。
興味ある人はgithubからコードを借用してぜひ作ってみてください。

オンライン飲み会でビンゴ大会をしたい!GoogleAppsScriptを利用してビンゴ大会を実装する!ビンゴ後の賞品発送まで!

オンラインでビンゴ大会がしたい

飲み会を盛り上げてくれるビンゴ大会。
結婚式や忘年会で催されることも多い。
しかしコロナが始まり、一時期話題になったリモート飲み会も普及しつつあります。
今回はビンゴ大会をオンラインでやる仕組みをさくっと構築していこうと思います。

スプレッドシートを利用してビンゴカードを作る

まずはスプレッドシートをビンゴカードに改造するためのメニューUIを作っていきます。
「ファイル」「編集」「表示」とある一番右に「ゲーム準備」というメニューバーが追加されていると思います。
こいつを押すと、ゲーム開始です。

押すと瞬時にこのようなビンゴカードが発行されます。
数字は自動で機械で割り振ります。
不正ができないように7列にカード発行日時のタイムスタンプを記録するので、不正にカードを再発行しても時間が記録され

とはいえ、時間を書き換えられると意味がないので…

セルの編集権限を自分だけにします。
これでビンゴカードを発行した時間は他人にはいじれなくなります。

あとは通常通りにビンゴ大会のビデオ会議をやっていきます。

「3」…「24」...「37」...

と続けて行くといつかビンゴが出ます。
自動でビンゴ判定のプログラムが走りますので、ビンゴ達成の人には商品発送リンクが表示されます。

他の人は別の番号のビンゴカードが割り振られているので、ゲーム続行です。
これで商品がなくなるまでビンゴを続けます。
そして当選者はビンゴの景品を受け取るリンクが発行されますので、

からビンゴ大会の景品やSNSアカウントを聞き出します。
あとはこちらで商品を用意して送付もしくはAmazonで他人あてに商品を払い出せばよいです。

こんな具合に賞品の到着を待ってもらいましょう。
これでGASを使って飲み会が盛り上がるツールが作れます。

最後にビンゴ大会を行うコードを記載しておきます。
/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00028/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数
  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('ゲーム準備');

  // メニューに追加するボタン
  menu.addItem('ビンゴカードを生成', 'generate_bingo_card');

  // メニューを画面に追加する
  menu.addToUi();
}


function generate_bingo_card() {
  //A1を直接指定する場合
  SpreadsheetApp.getActiveSheet().getRange("A1").activate();

  // ビンゴに使用する数字をしまっておく配列
  let bingo_numbers = [];

  // ビンゴは左列から1-15/16-30/31-45/46-60/61-75の範囲の値が入る。
  // それぞれの値を用意しておく
  for (let i = 0; i < 5; i++) {

    bingo_numbers[i] = [];

    for (let j = 1; j <= 15; j++) {

      // ビンゴに使う数字は1列目なら0 * 15 + 1-15、2列目なら 1 * 15 + 1-15、3列目なら 2 * 15 + 1-15・・・
      bingo_numbers[i].push(i * 15 + j);

    }
  }

  // 結果書き込み用の配列
  let values = [];

  // ビンゴカードの数字を1行ずつ作成する
  for (let i = 0; i < 5; i++) {

    values[i] = [];

    // 1列ごとに1-15/16-30/31-45/46-60/61-75のいずれかが入る
    for (let j = 0; j < bingo_numbers.length; j++) {

      // 乱数をもとに配列のkeyを指定する
      // 最大値は残っている数字の数だけ
      let key = Math.floor(Math.random() * bingo_numbers[j].length);

      // 結果用配列に入れる
      if (i == 2 && j == 2) { // 中心部分はFREEとする
        values[i].push('FREE');

      } else {
        values[i].push(bingo_numbers[j][key]);
      }

      // 一度使った数字は使えないので削除する
      bingo_numbers[j].splice(key, 1);
    }
  }

  Logger.log(values);

  // スプレッドシートの取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // アクティブシートの取得
  const sheet = ss.getActiveSheet();

  // アクティブセルの取得
  const active_cell = sheet.getActiveCell();

  // アクティブセルの行番号を取得
  const active_row = active_cell.getRow();

  // アクティブセルの列番号を取得
  const active_col = active_cell.getColumn();

  // 書き込み範囲のrangeを取得。アクティブセルから5行と5列だがvaluesのlengthを取っている
  const range = sheet.getRange(active_row, active_col, values.length, values[0].length);

  // セルへ値書き込み
  range.setValues(values);

  // セルの幅を調整する
  for (let i = active_col; i < active_col + values[0].length; i++){
    sheet.setColumnWidth(i, 100);
  }

  // セルの高さを調整する
  for (let i = active_row; i < active_row + values.length; i++){
    sheet.setRowHeight(i, 100);
  }

  // テキストを調整する
  range.setFontSize(20); // フォントサイズを指定
  range.setHorizontalAlignment('center'); // 水平方向の位置を指定
  range.setVerticalAlignment('middle'); // 垂直方向の位置を指定
  range.setBackgroundRGB(255,255,255); // 背景色を指定
  range.setBorder(true,true,true,true,true,true,"RED", SpreadsheetApp.BorderStyle.SOLID_THICK); // 罫線の指定

  var start = sheet.getRange("C3");
  start.setBackground("red");

  var timerange = sheet.getRange('B7'); //書き込み先の範囲
  let date = new Date();
  timerange.setValue(Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss')); // 引数の値をセルに入力
}

function bingoCheck(){
    var ss = SpreadsheetApp.getActiveSpreadsheet();
  
  //シート名は置き換えてください
  var sh = ss.getSheetByName("シート1");
  
  //A1セルの背景色を取得する
  var bgColorA1 = sh.getRange(1,1).getBackground();
  //B1セルの背景色を取得する
  var bgColorB1 = sh.getRange(1,2).getBackground();
  //C1セルの背景色を取得する
  var bgColorC1 = sh.getRange(1,3).getBackground();
  //D1セルの背景色を取得する
  var bgColorD1 = sh.getRange(1,4).getBackground();
  //E1セルの背景色を取得する
  var bgColorE1 = sh.getRange(1,5).getBackground();
  //A2セルの背景色を取得する
  var bgColorA2 = sh.getRange(2,1).getBackground();
  //B2セルの背景色を取得する
  var bgColorB2 = sh.getRange(2,2).getBackground();
  //B3セルの背景色を取得する
  var bgColorC2 = sh.getRange(2,3).getBackground();
  //B4セルの背景色を取得する
  var bgColorD2 = sh.getRange(2,4).getBackground();
  //B5セルの背景色を取得する
  var bgColorE2 = sh.getRange(2,5).getBackground();
  //C1セルの背景色を取得する
  var bgColorA3 = sh.getRange(3,1).getBackground();
  //C2セルの背景色を取得する
  var bgColorB3 = sh.getRange(3,2).getBackground();
  //C3セルの背景色を取得する
  var bgColorC3 = sh.getRange(3,3).getBackground();
  //C4セルの背景色を取得する
  var bgColorD3 = sh.getRange(3,4).getBackground();
  //C5セルの背景色を取得する
  var bgColorE3 = sh.getRange(3,5).getBackground();
  //D1セルの背景色を取得する
  var bgColorA4 = sh.getRange(4,1).getBackground();
  //D2セルの背景色を取得する
  var bgColorB4 = sh.getRange(4,2).getBackground();
  //D3セルの背景色を取得する
  var bgColorC4 = sh.getRange(4,3).getBackground();
  //D4セルの背景色を取得する
  var bgColorD4 = sh.getRange(4,4).getBackground();
  //D5セルの背景色を取得する
  var bgColorE4 = sh.getRange(4,5).getBackground();
  //E1セルの背景色を取得する
  var bgColorA5 = sh.getRange(5,1).getBackground();
  //E2セルの背景色を取得する
  var bgColorB5 = sh.getRange(5,2).getBackground();
  //E3セルの背景色を取得する
  var bgColorC5 = sh.getRange(5,3).getBackground();
  //E4セルの背景色を取得する
  var bgColorD5 = sh.getRange(5,4).getBackground();
  //E5セルの背景色を取得する
  var bgColorE5 = sh.getRange(5,5).getBackground();

  //ログを確認
  Logger.log(bgColorA3);

  //縦列ビンゴ判定
  if (bgColorA1 === "#ff0000" && bgColorA2 === "#ff0000" && bgColorA3 === "#ff0000" && bgColorA4 === "#ff0000" && bgColorA5 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }

  if (bgColorB1 === "#ff0000" && bgColorB2 === "#ff0000" && bgColorB3 === "#ff0000" && bgColorB4 === "#ff0000" && bgColorB5 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }

  if (bgColorC1 === "#ff0000" && bgColorC2 === "#ff0000" && bgColorC3 === "#ff0000" && bgColorC4 === "#ff0000" && bgColorC5 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }

  if (bgColorD1 === "#ff0000" && bgColorD2 === "#ff0000" && bgColorD3 === "#ff0000" && bgColorD4 === "#ff0000" && bgColorD5 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }

  if (bgColorE1 === "#ff0000" && bgColorE2 === "#ff0000" && bgColorE3 === "#ff0000" && bgColorE4 === "#ff0000" && bgColorE5 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }
  
  //横列ビンゴ判定
  if (bgColorA1 === "#ff0000" && bgColorB1 === "#ff0000" && bgColorC1 === "#ff0000" && bgColorD1 === "#ff0000" && bgColorE1 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }

  if (bgColorA2 === "#ff0000" && bgColorB2 === "#ff0000" && bgColorC2 === "#ff0000" && bgColorD2 === "#ff0000" && bgColorE2 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }

  if (bgColorA3 === "#ff0000" && bgColorB3 === "#ff0000" && bgColorC3 === "#ff0000" && bgColorD3 === "#ff0000" && bgColorE3 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }

  if (bgColorA4 === "#ff0000" && bgColorB4 === "#ff0000" && bgColorC4 === "#ff0000" && bgColorD4 === "#ff0000" && bgColorE4 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }

  if (bgColorA5 === "#ff0000" && bgColorB5 === "#ff0000" && bgColorC5 === "#ff0000" && bgColorD5 === "#ff0000" && bgColorE5 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }

  //斜め列ビンゴ判定
  if (bgColorA1 === "#ff0000" && bgColorB2 === "#ff0000" && bgColorC3 === "#ff0000" && bgColorD4 === "#ff0000" && bgColorE5 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }

  if (bgColorE1 === "#ff0000" && bgColorD2 === "#ff0000" && bgColorC3 === "#ff0000" && bgColorB4 === "#ff0000" && bgColorA5 === "#ff0000"){
    SpreadsheetApp.getUi().alert('ビンゴおめでとうございます。\n景品発送手続きに入りますので、\n https://docs.google.com/forms/d/e/1FAIpQLSdd97i9-F6QU3LCMTMf0PU_xaq--eQ3eI32BRXuu5p9q_7TRQ/viewform?usp=sf_link\nにアクセスして、発送先を登録してください。1人につき、応募は1回のみです。');
  }
}

プログラムの序盤ではビンゴカードの発行。
終盤ではビンゴ判定が行われています。
興味ある人は是非オンラインビンゴ大会をやってみてください。

【コードあり】GoogleAppsScript×Slackで更新情報などのデータを自動でどんどん書き込んでいく【34行】


Slack使っていますか?

slack.com
引用:
https://slack.com/intl/ja-jp

Slackはビジネスに特化したチャットツールです。
プライベートだとLINEを使うことが多いですが、ビジネスだとSlackを使用する機会が多いです。
今回はSlackを自動投稿するプログラムを作っていこうと思います。
毎日の定型業務を自動化していきます。

まずはコード
function postSlackbot() {
  //SlackAPIで登録したボットのトークンを設定する(Slackのtokenを発行してもらうこと)
  //https://xxx.slack.com/oauth?client_id=5478609054929.5530505855681&scope=chat%3Awrite&user_scope=&redirect_uri=&state=&granular_bot_scope=1&single_channel=0&install_redirect=install-on-team&tracked=1&team=1のページからアクセストークンを発行してもらう
  let token = "xoxbから始まるSlackトークン";
  //ライブラリから導入したSlackAppを定義し、トークンを設定する
  let slackApp = SlackApp.create(token);
  //Slackボットがメッセージを投稿するチャンネルを定義する
  let channelId = "自身のChannnelID";
  //Slackボットが投稿するメッセージを定義する
  let message = "SlackボットによるGASからの投稿メッセージです。"
  //SlackAppオブジェクトのpostMessageメソッドでボット投稿を行う
  //slackApp.postMessage(channelId, message);

  var query = 'label:〇〇だより';
  var start = 0;
  var max = 1;

  var threads = GmailApp.search(query,start,max);
  var messageThreads = GmailApp.getMessagesForThreads(threads);

  var data = [];

  for(let messages of messageThreads){
    var data_raw = [
    messages[0].getSubject(),
    messages[0].getPlainBody()
    ];
    data.push(data_raw);
    
    Logger.log(data[0][0]);
    Logger.log(data[0][1]);
  }
}

以上がプログラムからSlackに送信するためのコードです。
ここのコード中では、自身のChannnelIDは日本語で記入されていますので、この箇所を自身のものに変更していきます。

slackのトークン取得

api.slack.com

にアクセスして自身のチャンネルに投稿するためのxoxb-から始まるアクセストークンを取得します。

次にチャンネルIDを差し替えます

auto-worker.com

チャンネルIDを指定して、特定のチャンネルに投稿します。
フジテレビは8チャンネルじゃなないですが、料理に関することはrecipeチャンネルみたいに自分の好きなIDに変えます。
自身でSlackのチャンネルIDの調べ方がわからないという方は上記のリンクをみてください。
あとはトリガーを設定して、自動でSlackに書き込めば完璧です。

活用事例

Slackに投稿できる内容ならなんでも良いのですが、自動化のインパクトが得られる内容がいいでしょう。
毎月発生するもの、毎週発生するもの、毎日発生するもので、デジタル媒体で情報を取得できるものがいいです。
日経平均の株価でも良し、毎日の東京のYahoo天気の内容でも良いです。
あとはこのコードをそのままコピーしてちょこっと改変すれば、動きますので興味ある人はいじってみてください。

【コードあり】リモートワークでも自動報告!GoogleAppsScriptでさくっとSlackBotを作っていく!【25行】


引用:
https://pixiin.com/work/419/

映画「A.I.」はご存知ですか?

人間と人工知能が共存する世界で人間が絶滅後でもロボットは動き続け、本来感情が芽生えるはずではないAIと人間の人工知能のあり方を考えさせられる映画です。
これには一つ、人間の大きな目標が掲げられています。

「人間が死んでも」

です。

人間の場合、遺書などで遺産相続を決めますよね?
でもぶっちゃけ私が死んだら、遺産相続はすべてコンピュータで自動で処理をすればいいわけです。
でも多くの人間がプログラムを記述できないので、「お金を払って」、いろんな作業を人にしてもらうのです。

家を掃除してくれる家政婦だって、ルンバがあったら必要ないですし、
料理を作ってくれる家政婦だって、自動調理器があれば必要はないです。
   駅に立っていた駅員だって、SuiCaがあれば駅員は必要ないです。

人間は歴史上今まで人手で行っていたものを、なんとかして自動化してきた歴史があります。
ただこれって日本人の雇用の問題と大きく関わって来るので、なんでもかんでも自動化すると雇用を奪います。
自動運転が普及したら、タクシー運転手がいなくなるのが目に見えるのはこうゆうことです。

今回はslackというビジネスチャットを自動化していきましょう


まずslackを簡単に説明するとビジネス版チャットツールです。
LINEはプライベートで「人」     をキーにしてトークルームが展開されますが…
slackは会社で    「プロジェクト」をキーにしてトークルームが展開されます。

例えば…
「2023年度予算」
「震災対策」
「事務用品補充」
などといった、用途によってトークルームが立てられると思っていただいていいです。
その中であるのはやはり報告業務です。

「2023年度予算」で言えば、「来年度の予算の見積もりの進捗」
「震災対策」   で言えば、「乾パンの賞味期限の報告」
「事務用品補充」で言えば、「ボールペンの在庫数の管理」

などです。
それを日本人の場合、「人間がやる」という意味がわからんことをしています。
ここを自動化していきます。

昨今はリモートワークが主流になったおかげで業務を人間がやっているか?機械がやっているか?なんてわからんのです。

わかりやすく言うと…
ドアマンか?

引用:
https://heapsmag.com/doorman-job-professionals

自動ドアか?

引用:
https://himeji-nabco.jp/

みたいなもので。
人間は目に見える部分はこの作業は〜〜さんがやってくれていると理解できます。
でもどうですか?
今はリモートワークで本当に人間がその作業をしているかなんてわからないのが現状です。

毎日、終業間際に上司に作業報告をするbotが動いていれば、「この部下は真面目に作業をして、毎日報告までしてくれるな」ということになります。
しかし最近はメールで報告するだけではなく、slackやLINEといった様々なコミュニケーションツールが登場しましたので、もしも自動化するなら様々なツールを自動化しなくてはいけないのです。
今回はその中でもslackを自動化しましょう

ライブラリID
1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bq

こいつがGASからSlackを司るライブラリです。

こんな具合にスクリプトIDを貼りつければ準備完了です。
雪山に行く時にノーマルタイヤだとスリップするので、スタッドレスタイヤを履いたと思っていただければいいです。
このスクリプトIDというのは無数に存在していて、世界中の開発者が便利なツールをどんどん開発しています。

ではコード本体
function postSlackbot() {
  //SlackAPIで登録したボットのトークンを設定する
  let token = "自分のSlackトークン";
  //ライブラリから導入したSlackAppを定義し、トークンを設定する
  let slackApp = SlackApp.create(token);
  //Slackボットがメッセージを投稿するチャンネルを定義する
  let channelId = "Slackのチャンネルトークン";
  //Slackボットが投稿するメッセージを定義する
  let message = "SlackボットによるGASからの投稿メッセージです。"
  //SlackAppオブジェクトのpostMessageメソッドでボット投稿を行う
  slackApp.postMessage(channelId, message);

  //ここからニュース指定
  const sheet1 = SpreadsheetApp.openById("自分のスプレッドID").getSheetByName("シート名");
  const value1 = sheet1.getRange('A2:D2').getValues();
  console.log(value1[0][0]); // 日付
  console.log(value1[0][1]); // ソース
  console.log(value1[0][2]); // タイトル
  console.log(value1[0][3]); // URL

  let message2 = value1[0][0]+value1[0][1]+value1[0][2]+value1[0][3];

  //ここからセキュリティ記事に変更
  slackApp.postMessage(channelId, message2);
}

実行結果はこのとおりです。

確かにGASを通じてSlackに投稿ができました。

まだエクセルで消耗しているの?Pythonのpandasなら簡単にかっこいいネットワーク図を書けるのに

エクセルでグラフを書くのは時代遅れ

日本の技術は金太郎飴を量産しているように感じる。
学生の学習指導要領も変化はしていると言えど、そこまで新しくはなっていない。
でも世の中にはどうやってグラフを書いているんだろうと言うものが数多くある。
その一つにネットワーク図がある。

昨今はソーシャルメディアが発達していて、口コミ・人のつながりが妙に重要視されている。
誰がこの情報を発信して、SNSの中心には誰がキーマンとしているのか?はマーケティング戦略上非常に重要である。
また会社内部においても、社員の関係図を分析すると、誰が重要人物かわかるのである。
今回は名刺等の人脈ネットワークを用いて、人間関係をPythonで可視化していく。

使用するのはPythonのpandasで作っていく


www.youtube.com

pandasというのは数値計算等をプログラミングベースで行うppuython のモジュールである。
エクセルで手作業でグラフを作るのと異なり、一度コードを書いてしまえば1秒以内に複雑なグラフを作成してくれる。
データ処理速度・処データ上限・再利用性はエクセルの比べ物にならない。

データサイエンス分野ではこのようなグラフが用いられることが多いが、エクセルではこんなグラフは書けないのでPythonの力を借りていきます。

ネットワークはベクトル形式で表せる

n×m次元の人間関係のの方向は高校2年生の数学で習ったベクトルを使用して表すことができる。

誰々が好き、度の本が好きといった人間の嗜好はベクトル形式で表すことができ、
同様にどの料理が好き、どの本が好きといった嗜好もベクトル表示ができる。

A = [0 1 2; 1 0 3; 2 3 0];
node_names = {'A','B','C'};
G = graph(A,node_names)

A・B・Cがそれぞれ人間だとして、プログラムで書くとこのように表せる。
顧客の嗜好・社員の嗜好などを可視化するのはとてもおもしろいので、興味ある人はぜひpandasをいじってみて欲しい。
これは自身のTwitterのフォロー・フォロワー関係を可視化するとこのようなネットワーク図になる。


pandasの勉強にはキノコードが良い

今はYouTubeでいくらでも学習動画が落ちていて、中でもこのチャンネルがわかりやすい。

www.youtube.com

自分も動画見て3時間位勉強したら使えるようになったので非常におすすめのチャンネルである。

GoogleColabの稼働時間を延長させていたら、CHAPCHAが登場し始めた


ChatGPTをGoogle上のPythonで構築する

最近はオンライン上でプログラミング環境が作れるので便利である。
一時期前だとパソコンが古くなった時、壊れた時はパソコンの買い換えが必要だったが、最近はオンライン上にプログラミングリソースを持てる

GoogleColabはオンライン上のPython

colab.research.google.com

ここにアクセスするとGoogle上でPythonコードを動かすことができる。
過小スペックのパソコンでもGoogleに接続さえすれば、すごいマンパワーで計算をしてくれる。

ただ利用規約にそって使用をしないと計算が止まる

research.google.com

非常に便利であり、私もよく使用しているが別に悪いことはしていなくても長いセッションは切られてしまう。


本当に料金なしで利用できるのですか?

はい。Colab は料金なしでご利用いただけます。

話がうますぎるように思えます。なにか制限事項があるのではありませんか?

ファイル ホスティング、メディア配信、または Colab とのインタラクティブなコンピューティングに関連していない他のウェブサービスの提供
トレントのダウンロードまたはピアツーピアのファイル共有への関与
リモート デスクトップまたは SSH の使用
リモート プロキシへの接続
暗号通貨マイニング
サービス拒否攻撃の実行
パスワードの解読
複数アカウントの使用による、アクセスまたはリソース使用量の制限の回避
ディープフェイクの作成

だそうだ。確かに計算量さえ購入すれば、仮想通貨マイニングできてしまう。
結局Googleに支払っている料金以上に不正に儲けようとする安易な手段を使うのはだめなようだ。

GoogleColabのランタイムを延命して90分ルールを回避する方法


GoogleColabの90ルールを回避する

GoogleColabratoryはGoogle上で実行できるPython環境です。
プログラミングを開始するので、最大の山場は何かというと「環境構築」です。

昨今はプログラミング環境をオンライン上で構築してくれるサービスがありまして、
10年前のようにapt-getやbrewコマンドを叩いてオンライン上からモジュールなどを自分で用意する必要がなくなりました。
パソコンを買えばプログラミングができるというのは間違いで、パソコンを買って、プログラミングができる環境を自分で作って、プログラムソースを書いて初めてプログラムは動きます。

一般に思われるのがパソコンを購入すればプログラミングはできるという考えです。
自動車を買えば、車の運転ができるのか?と言うとそれは間違いで…
自動車を買っても、免許の更新に行かなければ自動車には乗れませんし、ガソリンを補充しないと車は走りません。
免許が失効したり、ガソリンがなければ動かないのです。

プログラミング環境をオンラインで構築してくれるGoogleColabは便利

colab.research.google.com

便利っちゃ便利なのですが、90分間手を動かさないと忘れるという問題があります。

実行中プログラムやimportされたパッケージ、使用した変数
インストールしたパッケージ
! pip install などでインストールしたパッケージ
GoogleColabへアプロードしたファイル
GoogleColabがマウントしたGoogleドライブ

をがっつりGoogleは忘れるので、プログラマーは悩みます。
金曜日にプログラムが完成したとしたら、月曜日にはいろいろ忘れているので…
ゼロからプログラムを修正するという不毛な作業があります。
上司からもなんで金曜日にプログラム完成したのに、また月曜日にいじってるの?とか聞かれますが…
それにはGoogleColaboratoryの90分ルールが影響しているので、忘れてしまいます。
それは困るのでパソコンを閉じても裏でプログラムを実行状態にして、時間稼ぎをします。

時間を計測するプログラムを無駄に走らせて、時間稼ぎをする
import time
for i in range(0, 100000000000, 1):
    time.sleep(1)
    print(i, "秒経過")

Googleのこのルールを無効化するためにsleepを入れて制限を回避します。
これでパソコンを閉じてもプログラムは走り続けて、90分ルールを無効化することができました。

はてなブログサイドバーでembedさせた過去記事のカードの空白を消すCSS

はてなブログのサイドバーでembedされたURLの空白を消す

はてなブログのサイドバーではURLをembedさせることができます。
しかし謎な仕様でカードの下に空白エリアができてしまいます。
なので、CSSを上書きしして、hatena-citetionのエリアを「none」にしていきます。

/** カード部分の表示範囲 **/
iframe.embed-blogcard{
   display: block; width: 100%; height: 190px; margin: 10px 0px;
   max-width:98% !important;
}

/** カード下のURLの範囲 **/
cite.hatena-citation{
    display:none;
}

これではてなブログの記事をemdedさせた際の空白を消すことができました。

ChatGPTを1ヶ月課金導入してみた感想…継続するべきか?しないべきか?無料版との違いは?

ChatGPTを1ヶ月「課金」して使ってみた

openai.com
引用:
https://openai.com/blog/chatgpt

ChatGPTを世間を賑わせているが、ChatGPTには有償課金版が存在する。
無料版との違いは事前学習をさせられるというものである。

早い話が、「YouTubeの課金」=広告が消せる
     「Amazonの課金」=商品が早く届く

みたいなもので、ChatGPTに強化して、より早いエンジンで使用できるというものである。

kazukichi0914.hatenablog.com

この記事のようにChatGPTに人格を載せて回答をしてもらえる。
有名人と話したい、歴史上の偉人と話したいというニーズをみたせて、タイムマシンに載ったようである。
今まで総理大臣と話したり、歴史上の人物と話せて楽しかった。

ChatGPTはお金がかかる

月に20$で使えるのだが、より高速に、よりビッグデータで話させるにはOpenAIに課金をする必要があるのだ。

月に20ドル支払えば誰でもChatGPTをカスタマイズできる。
私は過去の偉人や有名人の学習データを ChatGPTに学習させておしゃべりしてもらった。

国会答弁でChatGPTが質問

news.yahoo.co.jp

国会答弁でChatGPTは質問をしたようだが、ChatGPTは回答する「側」に搭載したほうがいい。
質問側に搭載をしてもあまり人工知能は役に立たない。
むしろChatGPTは回答側に実装するべきである。

AI化する方は質問側じゃなくて、回答側だろう

人工知能は内部で、何層にも思考を重ねている。

ディープラーニングの何層も何層も思考を重ねて回答を得る。
だから国会で質問をする側ではなく、回答側にChatGPTを導入すると面白い。
この政策は高齢者優遇だな、女性軽視だなとかを総合的に判断して回答をしてくれる。

ChatGPTはお金がかかる

ChatGPTは「無料」みたいな印象を持たれているが、カスタマイズして使うためにはOpenAIに課金する必要がある。
月に20$と比較的安いが、どれくらいの情報を学習させるか?どのようなモデルで回答させるか?によって料金が異なる。
なのでエンジニアの多くはこの枠でいかに生産性が高いプロンプトを投げられるかが鍵になる。

プロンプトとはChatGPTに話しかける言葉である

一時期前は「ぐぐる」=うまくGoogleで検索ワードを入れることが重要視されたが、これからはいかにChatGPTに投げかけることが正しい指示出しをできるかが重要である。
それを行う人間をプロンプトエンジニアという。

dev.classmethod.jp
引用:
https://dev.classmethod.jp/articles/how-to-design-prompt-engineering/

プロンプトエンジニアとはChatGPTから良い答えを引き出すためのチューニングを行う人である。
ChatGPT3.5には3550億のパラメタが存在していると言われている。
話す口調であったり、質問している地域、年齢など回答を決定づける要因がたくさんあるわけだ。

OpenAIのChhatGPT、GoogleのBERTを比較しても言語モデルのパラメータ数は大きく異なる。

組織にChatGPTを導入することは知識量と課金のトレードオフ

優秀な回答を得るためにはChatGPTに思いっきり課金して、ファインチューニングをしまくればいい回答が得られる。
ファインチューニングとは、

zero2one.jp

ChatGPTを使う人用にカスタマイズすることである。
自動車を運転する人によって座席の位置を変えたり、ハンドルの高さを変えるよなもので、ChatGPTをカスタマイズすることをファインチューニングという。
ChatGPTに課金をするここのChatGPTのファインチューニングをある程度できるようになるので、できる範囲が広がって面白い。

私はGoogle上のPython環境でChatGPTを使用しているが、クラウドで行うので自分のパソコンのリソースを使わなくていいのが魅力である。
一応ChatGPTは使用しようと思うが、ChatGPTを使ってどうやってマネタイズするか?の真価が問われるのである。

kazukichi0914.hatenablog.com

kazukichi0914.hatenablog.com

kazukichi0914.hatenablog.com

kazukichi0914.hatenablog.com

GoogleColabでChatGPTを使って、乃木坂46の堀未央奈が我が家に遊びに来てくれたので、おしゃべりをしていく


引用:
https://www.gifu-np.co.jp/articles/-/86698

乃木坂46の中では堀未央奈が好きなので、ChatGPTに堀未央奈情報を機械学習させていく
# 質問応答
print(index.query(" あなたの名前を教えて下さい。"))

私の名前は、堀未央奈です。

# 質問応答
print(index.query("乃木坂46に入ったきっかけはなんですか?"))

乃木坂46に入ったきっかけは、西野七瀬が推しメンとして参加することをきっかけにしました。星野みなみと仲が良く、コンビで「みなみおな」として親しまれていたこともありました。また、元SKE48松井玲奈とも親交が深いということもありました。

# 質問応答
print(index.query("辛いときはどうやってリフレッシュしていましたか?"))

辛いときは、友達と一緒にディズニーランドに行ったり、かき氷デートをしたり、焼き肉を食べに行ったり、イルミネーションを見に行ったり、ハンバーガーを食べに行ったり、お寿司を食べに行ったり、またはCDを聴いてリラックスしたりしてリフレッシュしていました。

# 質問応答
print(index.query("お仕事が休みのときはどんなことをするんですか?"))

私は休みの日は、友達と遊ぶことや、家族と一緒に過ごすことが多いです。また、新しいことに挑戦したり、趣味を楽しんだりするのも好きです。

# 質問応答
print(index.query("どんなことに挑戦しましたか?"))

乃木坂46は、シングルリリース、番組収録、イベント出演、交換留学生としての兼任、ディズニーランドへの連れて行き、かき氷デート、焼き肉を食べに行くなど、さまざまなことに挑戦しました。

# 質問応答
print(index.query("どことの交換留学生だったんですか?"))

SKE48松井玲奈が2014年4月から2015年5月まで交換留学生として兼任していたということです。

# 質問応答
print(index.query("松井玲奈さんとはどんな思い出がありますか?"))

松井玲奈さんとの共通の思い出として、ディズニーランドへ連れて行ってもらったことがあり、また『乃木坂って、どこ?』では松井が好きな寿司ネタを白身魚と挙げると、堀が松井の顔の小ささを特徴にちなみ「イクラみたい」と返すなど親密な間柄であることがあります。また、かき氷デートをしたり、ハンバーガーを食べに行った仲でもあります。さらに、松井玲奈さんのCDを購入したり、「世界中の隣人よ」や「Route

# 質問応答
print(index.query("堀さんは乃木坂を卒業しましたが、その時の心境を教えて下さい。"))

堀さんは乃木坂46を卒業した時、悲しみと寂しさを強く感じていました。彼女は、仲間との思い出を大切にしていましたが、それを離れることになってしまったため、悲しみを強く感じていました。また、彼女は乃木坂46での経験を大切にしていたため、卒業することによって、彼女の人生が大きく変わってしまうことを恐れていました。彼女は、乃木坂46での自分の成長を大切にしていたため、卒業を決断し

# 質問応答
print(index.query("卒業後はどんなことにチャレンジしましたか?"))

卒業後、西野七瀬は、女優、モデル、歌手、ラジオパーソナリティなど、様々な分野で活躍しています。また、芸能界以外では、若月佑美が若月自身の持ち芸・宴会芸である「箸くん」の後継者に指名された2018年12月24日(23日深夜)放送の『乃木坂工事中』で、西野はその後継者として活躍しています。

# 質問応答
print(index.query("これからチャレンジしたいことを教えて下さい。"))

私がこれからチャレンジしたいことは、新しいスキルを学ぶことです。例えば、新しい言語を学ぶことや、新しいプログラミング言語を学ぶことなどです。また、新しい技術を学ぶこともできます。例えば、新しいデザインツールを使ってウェブサイトを作成することや、新しいソフトウェアを使ってプロジェクトを管理することなどです。

# 質問応答
print(index.query("堀さんはあまり頭が良くないという印象でしたが、勉強は得意でしたか?"))

堀さんの勉強に関する情報は提供されていませんが、彼女が他のメンバーと親交が深いことや、元SKE48松井玲奈とディズニーランドへ連れて行ってもらった事があることなどから、彼女は勉強を得意としていると推測できます。さらに、彼女が2020年から2021年にかけてリリースした楽曲の多くが、詩的な歌詞や深いメッセージを持っていることからも、彼女が勉強を得意としていると考えられます。

# 質問応答
print(index.query("そういうことだったんですね。少し話を変えて特に気に入っているファッションなどがあれば教えて下さい。"))

堀未央は、カジュアルなスタイルが好きで、ジーンズやTシャツ、スニーカーなどをよく着ています。また、西野七瀬とのコンビで「みなみおな」として親しまれているため、おしゃれなコーディネートをしていることも多いです。特に、「世界中の隣人よ」「Route 246」「僕は僕を好きになる」「明日がある理由」「Wilderness world」などのミュージックビデオでは、カジュアルなスタイルを取り入れたコーディネートをしています。

# 質問応答
print(index.query("みなみおなの由来とかあるんですか?"))

みなみおなの由来は、乃木坂46の1期生である星野みなみ西野七瀬の名前を組み合わせたものです。2人は親しく、コンビで「みなみおな」として親しまれています。

# 質問応答
print(index.query("みなみおなでどんなお仕事をしたことがありますか?"))

みなみおなは、番組の企画で2人の休日を紹介したことがあります。また、2014年5月19日(18日深夜)放送の『乃木坂って、どこ?』で、松井と「お寿司を食べに行く」という約束をしているという会話中、堀が好きな寿司ネタを白身魚と挙げると、松井が「イクラが一番好き」と応じると、堀は松井の顔の小ささを特徴にちなみ「イクラみたい」と返すなど、親密な間柄であるこ

# 質問応答
print(index.query("今日はいろいろとお話を聞かせていただきありがとうございました。"))

ありがとうございました。お話を聞かせていただき、ありがとうございました。