vscodeのsnippetでrubyのクラスをファイル名を元に自動でセットする

確かatomではrubyのsnippetを使ってクラスを書くときに、ファイル名から自動で生成してくれたと思うのですが、 vscoderuby snippetではクラス名は ClassName 固定でセットされています。
これが煩わしいので、独自のsnippetsを書いて対応しました。

やり方

vscodeのコマンドパレットで snippets と打ち、次に言語選択でrubyを指定すると、 ~/Library/Application Support/Code/User/snippets/ruby.json が生成されます。

   "Class definition from filename": {
        "prefix": "class",
        "body": [
            "class ${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}",
            "\t$0",
            "end"
        ],

こんな感じのsnippetを定義すればokです。  

foo_bar_baz.rb ファイルでcla と打つと(classと打たなくても、途中まででsuggestionされる) 以下が自動で入力されます。

class FooBarBaz
  
end

メデタシ、メデタシ。

少し解説

参考) vscode-rubyの定義
vscode-ruby/ruby.json at main · rubyide/vscode-ruby

ファイル名

公式ドキュメントに利用可能な変数定義が記載されています。
拡張子は不要なので、 TM_FILENAME_BASE を利用します。
Variables

passcalcase

passcalcaseへの変換ですが、非常にわかりにくいのですが、公式ドキュメントにEBNFで使えると書いています。 要は正規表現にマッチする値に対して、各種変換処理が利用できるとのことです。
Grammar#

おまけ:既存のsnippetsを非表示にする方法

ドキュメントを読んでいて気づいたのですが、不要なsnippetsを非表示にする方法の記載がありました。 Can I remove snippets from IntelliSense?

やり方は、コマンドパレットから Insert Snippetを選んで、 非表示にしたいsnippet名を入力し、非表示アイコンを押すだけ。
 

この情報がどの設定ファイルに書き込まれているのかは不明。 syncの対象になっているかなどは気になるところ。

anyenvからasdfに移行(M1 Mac)

豊富なプラグインとshellの起動が短くなるという話を聞いて asdf を入れてみました。
anyenvはshellの起動の度にワンテンポ待つ(約1秒ほど)のが少し気になっていました。

Installation

以下に、環境ごとに記載されています。
Getting Started | asdf

私はmacにhomebrewで入れています。

問題点

asdf自体のinstallはうまくいきましたが、ruby3.1のinstallでエラーとなりました。

asdf install ruby 3.1
BUILD FAILED (macOS 11.2 using ruby-build 20211227)

Inspect or clean up the working tree at /var/folders/xv/rr7v71pn1pb3rf8nj76ws6wr0000gn/T/ruby-build.20211230074811.55722.HM6BgF
Results logged to /var/folders/xv/rr7v71pn1pb3rf8nj76ws6wr0000gn/T/ruby-build.20211230074811.55722.log

Last 10 log lines:
    from /private/var/folders/xv/rr7v71pn1pb3rf8nj76ws6wr0000gn/T/ruby-build.20211230074811.55722.HM6BgF/ruby-3.1.0/lib/fileutils.rb:219:in `block in mkdir_p'
  from /private/var/folders/xv/rr7v71pn1pb3rf8nj76ws6wr0000gn/T/ruby-build.20211230074811.55722.HM6BgF/ruby-3.1.0/lib/fileutils.rb:211:in `each'
   from /private/var/folders/xv/rr7v71pn1pb3rf8nj76ws6wr0000gn/T/ruby-build.20211230074811.55722.HM6BgF/ruby-3.1.0/lib/fileutils.rb:211:in `mkdir_p'
  from ./tool/rbinstall.rb:218:in `makedirs'
    from ./tool/rbinstall.rb:331:in `prepare'
  from ./tool/rbinstall.rb:432:in `block in <main>'
   from ./tool/rbinstall.rb:1127:in `block in <main>'
  from ./tool/rbinstall.rb:1124:in `each'
    from ./tool/rbinstall.rb:1124:in `<main>'
make: *** [do-install-all] Error 1

 

makedirs のエラーなのでディレクトリの作成で失敗している可能性がありそうです。 logが以下に出力されているとのことで読んでみます。

/var/folders/xv/rr7v71pn1pb3rf8nj76ws6wr0000gn/T/ruby-build.20211230074811.55722.log

 
すると、permisson deniedとのこと。

/private/var/folders/xv/rr7v71pn1pb3rf8nj76ws6wr0000gn/T/ruby-build.20211230074811.55722.HM6BgF/ruby-3.1.0/lib/fileutils.rb:240:in `mkdir': Permission denied @ dir_s_mkdir - /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Users (Errno::EACCES)

 
該当ディレクトリを見ると、symlinkでした。

$ll /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
lrwxr-xr-x  1 root  wheel    14B  8 29 14:29 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk@ -> MacOSX11.3.sdk

$ls -al /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/
total 32
drwxr-xr-x  8 root  wheel   256 12 30 07:56 ./
drwxr-xr-x  6 root  wheel   192  8 29 14:29 ../
-rw-r--r--  1 root  wheel   127  3 16  2021 Entitlements.plist
-rw-r--r--  1 root  wheel  4512  3 16  2021 SDKSettings.json
-rw-r--r--  1 root  wheel  3691  3 16  2021 SDKSettings.plist
drwxr-xr-x  4 root  wheel   128  3 16  2021 System/
drwxr-xr-x  3 rochefort  wheel    96 12 30 07:56 Users/
drwxr-xr-x  7 root  wheel   224  3 16  2021 usr/

解決方法

とりあえず権限付与。

sudo chown $(whoami) /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk

これ、CommandLineTools のversionが変更する度にやらないといけなさそう。。

anyenv

anyenv消しても良いですが、一旦保険のために、shellでの読み込みだけコメントアウトしています。 問題なければ、uninstall & .anyenv を削除予定

Configuration

Configuration | asdf.

.tool-versions に各種versionを記載すれば自動で読み込んでくれます。
rubyもnodeも1ファイルに書けるのがメリットのようです。

従来の.node-version、.ruby-version を使いたい場合

legacy_version_file というoptionが用意されています。 Configuration | asdf.

$HOME/.asdfrc に以下のように書けば、anyenv同様の .node-version、.ruby-version などを読み込んでくれます。

legacy_version_file = yes

メンバー全員の環境を強制できない場合は、これを入れておくのが良さそうです。
 

どのversionでどのファイルを読み込んでるかは、currentコマンドで確認できます。

$ asdf current
nodejs          14.15.4         /Users/rochefort/work/apps/qiita_advent/.node-version
ruby            3.1.0           /Users/rochefort/work/apps/qiita_advent/.ruby-version

その他

global 設定。

$ asdf global ruby 3.1.0

SodaStreamMapというサイトを作った

先日、Sodastream(Genesis v2)を購入し - rochefort's blog 、soda lifeを満喫している毎日なのですが、ガスが無くなると、ガスシリンダーの交換が必要になります。  

Sodastreamのガスシリンダー交換

交換方法は、オンラインで申し込むか、取扱店舗に行って交換してもらうかの2つの方法があります。 オンラインだと、2000円 + 送料(2490円)が掛かりますが、お得便という「2本の交換を3回」行うのを一括で支払うというものがあり、この場合は送料が無料となります。
オンラインのやつはお得ではあるのですが、こんなに必要かどうかもよくわからないので、一旦店舗で交換をやってみようと考えています。

Sodastreamの取扱店舗検索

ソーダストリーム sodastream|お取扱店舗
こちらを見てみると結構あります。うちの近所にもありそうなのですが、、、 見づらい。
 

作ったもの

こんなんgoogle mapで住所入れてピン立てるようにした方が圧倒的に見やすいやろ、と思ったのでscrapeして作ってみました。

sodastream-map
f:id:rochefort:20210206201252p:plain

 
いつものようにRubyでscrape。Geocoding で住所から位置情報を付与。
あとは、GoogleMapで表示するだけ。フロントエンドは、無駄にNuxt.jsを使ってます。

はまりどころ

Nuxt.js での GoogleMap利用には、それなりに嵌まりました。

Nuxt.jsでGoogle Mapsを利用する - rochefort's blog