いてづきブログ

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

rbenvで最新版のrubyがインストール出来ないとき

rbenvで最新版のrubyをインストールしようとした

rbenv install 2.6.1 && rbenv global 2.6.1


すると、エラーが出た。

ruby-build: definition not found: 2.6.1
See all available versions with `rbenv install --list'.

If the version you need is missing, try upgrading ruby-build:
  brew update && brew upgrade ruby-build

「2.6.1なんてねーよ」というエラー。 メッセージの通りrbenv install --listを実行してもリストに2.6.1がない。

なので、その下のメッセージに沿ってruby-buildをupdateする。

brew update && brew upgrade ruby-build

アップデートが終わったら再度rbenv install --listを確認して2.6.1があることを確認したので あらためてインストールとバージョンの確認。

# 2.6.1をインストール
rbenv install 2.6.1 && rbenv global 2.6.1
# 設定結果を確認
rbenv versions

Modelのアップデートでカラムを動的に変える

Railsの処理の中で、更新するカラムを動的に変えたい場合の書き方。
公式ドキュメント読んでもよくわからなかった(書いてなかった)のでメモ。

userhogeもしくはmogeのどっちかをfugaに更新したい場合、下記のように書く。

field = user.condition? ? :hoge : :moge
user.update(field => 'fuga')


メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

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


なるほど〜。