いてづきブログ

情シスでやってみたことの備忘録

clasp事始め

claspのインストールからpushできるようになるまで

ドキュメント&公式リポジトリ

github.com

インストール

公式ドキュメントに沿ってインストールを試みる

sudo npm i @google/clasp -g

するといきなりエラーが出てつまづく

...
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall rename
npm ERR! enoent ENOENT: no such file or directory, ...

READMEの下の方にトラブルシューティングがあるのでそれを読む。 Node version >= 6.0.0.とのことなので、トラブルシューティングに沿ってnodeのアップデートをする。

node -v # Check Node version
sudo npm install n -g
sudo n latest

アップデート後、再度インストールコマンドを実行することでclaspのインストールができた。

clasp -v
> 1.7.0

プロジェクト作成

既存のGASプロジェクトと紐付けることもできるみたいだけどまずはclaspでプロジェクトを作成してみる

clasp create


作成するプロジェクトのタイプを選択させられるのでとりあえずstandaloneを選択。 するとまたエラー。

User has not enabled the Apps Script API. 
Enable it by visiting https://script.google.com/home/usersettings then retry.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.


AppsScriptAPIをオンにしろと言われているので指示に従ってhttps://script.google.com/home/usersettingsにアクセスしてAPIをオンにして再度プロジェクトを作成する。

.clasp.jsonappsscript.jsonが作成された。 なぜかappsscript.jsonのtimezoneが"America/New_York"になっているがとりあえず気にしないことにする。

コードを書いて反映させる

この時点で既にGoogleドライブ上にGASプロジェクトは作られているみたい(?)
clasp pullすると空のmyFunctionが入ったCode.jsがダウンロードされてくる。

とりあえずログを出せるように書いてpushしてみる。

function myFunction() {
  Logger.log("hoge")
}


clasp openするとブラウザでGASのエディタが開き、ローカルで書いたコードが反映されていることがわかる。

次の課題

clasp runできない問題

clasp runしてローカルで実行しようとしたら認証スコープ定義しろみたいなエラーが出て実行できなかった。

Error: Local client credentials unauthenticated. Check scopes/authorization.

Logger.logしか書いてないので認証するところないと思うんだけど(ブラウザのGASエディタでは認証ダイアログも開かず問題なく実行できた)

ES6で書けるようにする

とりあえずES6で適当に書いてpushしたら書いたものがそのまま上がってしまって実行できなかったので(GASはES6記法未対応)何らか変換する部分は自分で用意する必要があるっぽい。

現時点だとローカルでGit管理できるということ以外一切のメリットがないのでもう少し環境整備する必要がある。

とりあえず今日はここまで

Going GAS: From VBA to Google Apps Script (English Edition)

Going GAS: From VBA to Google Apps Script (English Edition)

ぼっち演算子

ある日時フィールドstartについて、現在時刻より前かどうかを判定する必要があったが、そのフィールドがnilになる場合がある。


とりあえず正直に書いてみた。

def past?
  if start.present?
    start < Time.current
  else
    false
  end
end

これでプルリク出したらレビューでstart&.< Time.currentで書けるよと教えてもらった。

これはぼっち演算子と言われるもので「xxx が nil でないときにメソッドyyyを呼び出す」とのこと。
Rubyで使われる記号の意味(正規表現の複雑な記号は除く) (Ruby 2.5.0)

一応の注意点としてぼっち演算子で書いた場合、startがnilだとstart&.< Time.currentの返り値はfalseではなくnilになる。
しかし、Rubyは「false」と「nil」だけが false であとは全部 trueなので基本的には問題はなさそう。

冗長なコードが短くなってスッキリ。

def past?
  start&.< Time.current
end

attr_accesorとpublic_send

classのattrに対して下記のようなpublic_sendで値を設定できるらしい。


public_send("#{attribute_name}=", val)



ということは、obj.hoge=の`hoge=`はメソッドなのか?と思って呟いていたら、attr_*はhoge フィールドとhoge= メソッドを定義するものだと教えてもらえた。(ありがたや〜)
だからpublic_sendで呼び出せるというわけ。


リファレンスにもバッチリ書いてある。
ref.xaio.jp


なるほど〜。

mongoDB + Python3環境をDockerで作った

ちょっと大量のデータを扱うことになったのでmongoDBのセットアップをした。

 

当初はGAS+スプレッドシートでササッとやるつもりだったが、調べていくとデータの件数が数十万件を超えることが発覚したのでGASではさばききれない*1ためDBを立てることにした。

 

mongoDBにしたのは単に以前仕事で使ったことがあるから。

使う人がmacWindowsと両方いたからDockerで書いた。

 

mongoDBをDockerで使う方法についてはQiitaに投稿した。

 

 

DBはmongoDBに決めたあと、処理するスクリプトPythonで書くことにした。

ついでにPython3環境もDockerで作るかということでPython3とpymongoが入った環境を作った。

 

しかしPython自体は問題なく動かせるが、VSCodeでPylintしながら書こうとするとローカルにはpymongo入ってないので常にlintエラーが出続けてしまう。

試せてはいないけど、DockerでPylintのコンテナを立てて検証はそっちにさせればよさそう。

しかしその結果をVSCodeの問題タブに出そうとするとやはり拡張機能作ったりする必要がある気がする。

 

ひとまずPylintは諦めて書くことにした。

それほど大規模にはならないはずだから多分大丈夫…なはず。

 

一連のDocker環境はこちら

 

はじめてのMongoDB (I・O BOOKS)

はじめてのMongoDB (I・O BOOKS)

 

 

*1:処理時間5分の壁がきついし、数千件を超えたあたりからスプレッドシートが重すぎてまともに動かせなくなる

Rails g migrate覚書

既存のmodelにカラムを追加するやり方

 

rails g migration クラス名

 

クラス名は通常「行なう処理+テーブル名」になる。例えば、AddAgeToUsers(またはadd_age_to_users)となる。

 

生成されたマイグレーションファイルのchange内にadd_columnを書けばいい。

テーブル名は複数形で書く。

def change
  add_column :users, :age, :integer, default: 0, comment: '年齢'
end

add_column - リファレンス - - Railsドキュメント

 

出来上がったらdb:migrateを実行すればDBやmodelに反映される(modelにもコメントとしてフィールド情報が記載される)

RailsC#javaと違ってmodelにカラムの一覧をフィールドやプロパティで書かないので結構戸惑いますねー。

 

書き方が悪くてマイグレーションに失敗した場合、一旦下記コマンドをする必要がある*1

rails db:environment:set 

その後マイグレーションファイルを直して再度db:migrateを実行する。

 

 

Ruby on Rails 5アプリケーションプログラミング

Ruby on Rails 5アプリケーションプログラミング

 

 

 

*1:詳しい理由はググって

技術書典5に参加します

技術書典5でGAS本を頒布します。

技術本はおろか、同人誌さえ出したことがないのでわからないことだらけで四苦八苦してます。

 

当初はGASを網羅的に扱った本にしようかと思ってましたが、なにかテーマを決めたほうがいいなと思ってTwitterとかで話してた結果、当時ハマってた(?)クソ診断をテーマにすることになってしまいました。どうしたこうなった。

 

内容的にはGASからウェブフォームにPostしたり、IFTTT、Twitterとの連携について書いた本になる予定です。

 

サークルスペース「こ23」です。よろしくお願いします。

techbookfest.org

Slackのカスタム絵文字をLINEスタンプ風に表示するbotを作った

Qiitaに投稿しました。

 


ソースと使い方はこっち。


主な内容はQiitaに書いたので開発時点の苦労話でも。

 

トークンについて

いまひとつSlackのTokenの扱いがよくわからない。

もともと参考にしたやつではherokuにデプロイして各ユーザーのトークンを保存することでbotがユーザーとして振舞うみたいなコードになっていたけれど、このトークンがどこから取得されるのかがよくわからなかった。

 

なので、暫定的にOAuth Access Tokenを使ってユーザーのアイコンとユーザーを取得することでユーザー"のように"振舞っている。

 

また最初はLegacy Tokenを用いていたが、OAuth Access Tokenの方が明示的に権限スコープを制御できるのでこちらの方がいいと思う。

なお権限スコープを設定していないAPIを叩くとエラーが発生するのではなく、結果が取得できない(undefinedになる)。

これがわからなくてAPIの使い方が間違っているのかを1から調べなおしていた。

403エラー返してほしい…。

 

 

ユーザー名取得の謎

APIを用いてユーザー名を取得するとdisplay_nameとreal_nameが取得できる。

users.profile.get method | Slack

 

自分はdisplay_nameが入っていたのでそれを使っていたが、テストしてもらったユーザーから「名前がslack api testerになる」という報告を受けて調べたら、ユーザーによってはdisplay_nameが入っていたりいなかったりする。

なのでdisplay_nameがあればそれを使い、なければreal_nameを使う仕様とした。

 

どのような設定をするとこの現象が起こるのかはよくわからない。

 

 

おわりに

わからないことがあるまま動かしているのは危険ではあるが、自分の趣味のslackなのでひとまずはこのまま運用することにする。

 

Slackが絵文字を大きく表示する機能を実装してくれればいいだけなのに(ぁ

 

 

はじめてみようSlack 使いこなすための31のヒント

はじめてみようSlack 使いこなすための31のヒント