好きなものだけ書く。ポジティブに。

好きなことを楽しく。プログラミング、写真、音楽、ガジェットとか。

Apex で権限セットグループに権限セットを追加する

複数の権限セットが存在していて複数をグルーピングして権限セットグループで管理したいケースがそれなりにあります。 Apexで操作したいケースはあまり多くないかもしれませんが、パッケージ開発モデル で開発しているとそれなりに有り得そうです。

同じ組織で開発している複数のパッケージの場合は権限付与などはシンプルにしたいものです。

皆と違うユニフォームでチームに入れていない様子のイラスト
権限が無い時は悲しい気分になりますよね

権限セットグループをApexで自動で付与したい

例えばパッケージをインストールした時に InstallHundler というインターフェースでApex処理を実行する事ができます。

その中で新規の権限セットを既存の権限セットグループに追加できたら便利ですね。

普通にオブジェクト的に操作できた!便利〜

PermissionSet ps = [SELECT Id, DeveloperName FROM PermissionSet WHERE Name = 'psName'];
PermissionSetGroup psg = [SELECT Id, DeveloperName FROM PermissionSetGroup WHERE DeveloperName = 'psgDeveloperName'];
PermissionSetGroupComponent psgc = new PermissionSetGroupComponent(PermissionSetId=ps.Id, PermissionSetGroupId=psg.Id);
insert psgc;

なければ作るようにしたかったのでこんな感じのメソッドを作りました

  private void appendPermissionSetToGroup() {
    PermissionSet ps = [SELECT Id, Name FROM PermissionSet WHERE Name = 'psName'];
    PermissionSetGroup psg = [SELECT Id, DeveloperName FROM PermissionSetGroup WHERE DeveloperName = 'psgDevName'];
    PermissionSetGroupComponent[] psgcList = [
      SELECT Id
      FROM PermissionSetGroupComponent
      WHERE PermissionSetId = :ps.Id AND PermissionSetGroupId = :psg.Id
    ];
    if (psgcList == null || psgcList.size() == 0) {
      PermissionSetGroupComponent psgc = new PermissionSetGroupComponent(
        PermissionSetId = ps.Id,
        PermissionSetGroupId = psg.Id
      );
      insert psgc;
    }
  }

macOS Ventura で外部ディスプレイの解像度がおかしくなってぼやけた時の戻し方

MacBook Airに接続したディスプレイの解像度がうまく設定されなくて泣いているおじさんの画像

おつかれさまです!のぶじゃすです。2022/10/25 に macOS の新バージョン Ventura (13.0.0) がリリースされましたね

macOS の設定画面で Ventura がインストールされているスクリーンショット
早速Venturaをインストールしてみました

M2 Macbook Air にインストールし、色々ためしています。ステージマネージャの左側におさまってる感じが可愛くて好きです。

OSアップデートしたらシステム設定をポチポチ触るのが好きなのですが、今回ディスプレイをポチポチしてたら解像度?が下がってしまったのかボヤけてしまい、戻し方がわからず四苦八苦しました。今回偶然直し方を見つけたので書いておきます。(きっとバージョンアップで直るんだろうなー)

ボヤケてしまった前後のスクリーンショットを並べている画像
なんということでしょう

私の場合は、接続したばかりの時はきれいに表示されていて解像度をポチポチしていたら戻らなくなってしまったという現象です。「そもそもボヤケている」みたいなパターンは今回の対応とは別ではないかと思います。

だめだったこと

  • 他の解像度をひたすら選択する→解像度は変わるけど望むサイズ感に調整出来ない
  • PC再起動、放置

やりかた

特に難しいことはないです。結論だけ先に書いておくと、ミラーリングして解像度をモニター側に合わせてミラーリングを解除すると元の状態にもどる という挙動でした。

「使用形態」の右側にあるプルダウンから内蔵ディスプレイをミラーリング

内蔵ディスプレイをミラーリングするスクリーンショット

主ディスプレイか拡張ディスプレイで使用していると思いますが、「内蔵ディスプレイをミラーリング」を選択してください

解像度設定をディスプレイの方に変更

解像度をディスプレイの方に変更するスクリーンショット

ミラーリングするとMacBook側の解像度になると思いますので、ディスプレイの方に変更してください。これを変更した時点でボヤけはなくなると思います。私はここにたどり着いた時に「おっ?戻せるかも?」となりました。

ミラーリングを停止する

ミラーリングを停止するスクリーンショット

はじめに変更した「使用形態」の右側にあるプルダウンから「ミラーリングを停止」を選択してください。

私はこれで直りました。もし困っている人がいたらこれで直るといいなあ

Venturaになってなくなってしまったのか?画面サイズ・・・

Venturaになって外部ディスプレイの画面サイズ?文字サイズ?を選択する機能がなくなってしまったように見えます。どこかに隠れているのでしょうか?内蔵ディスプレイにはあるのに外部ディスプレイには見当たりません。接続の方法やケーブルなどなにか条件があるのかもしれませんがわかりません・・・

ディスプレイの文字のサイズを選択出来る素敵な機能のスクリーンショット
どこいってしまったん

きれいに表示されるようになったのでOK!

とにかく元に戻せたので大きな問題はないのですが、はじめはディスプレイ買い替えか、ぐらい想像していました。今みてみると解像度の選択状態がグレーと青でなにか違う状態のような気がします。なんなのでしょう。怖いのでしばらくクリックはしないでおきます。

解像度の選択状態が青とグレーで違うので何かが違うかもしれないスクリーンショット
解像度の選択がちょっと違う・・・?

これからも快適にLGの4Kディスプレイを使ってYouTubeが見れそうでよかったです。

amzn.to

サウナーは ARCH KISARAZU に1回行っておけ。プライベートサウナxグランピングの体験は唯一無二。

4/28, 29 にARCH KISARAZUに行ってきました。あまりにも最高の体験だったし、是非サウナーには行ってほしいです。

プライベートサウナと露天水風呂が野外で間取りも最高な写真
プライベートサウナと露天水風呂。間取りも最高

広いテントの写真
テントの中は空調が効いていてまさにグランピング

外気浴スペースにリラックス出来る椅子が設置されている写真
外気浴スペースもリラックス出来る椅子が設置されています

BBGコンロの上でお肉と野菜が焼けている写真
晩ごはんのBBQは野菜もお肉もたっぷり

夜空の中の水風呂の写真
膝をたためば4人は入れる露天水風呂

サウナ部屋と水風呂が目の前にうつっている写真
サウナと水風呂の間取りも最高。目の前ですぐ水風呂

PSEマークの貼ってあるMISA社のサウナストーブの写真
MISAのサウナストーブ。PSEマークももちろんついてます!

朝ごはんの目玉焼きとバゲットの写真
朝ごはんはガスコンロで作りました

greenarch.jp

一泊二日しました。結局合計で8セットぐらいしました。

後悔は妻をサウナ沼に引き入れられなかった事です。時期的なものもあり、野外の水風呂はなかなか冷たかった(おそらく夜中は体感11度ぐらいでした)です。上級サウナー向けでした。妻は水風呂には片足しか入れませんでした。

夫婦やカップルなら一緒にサウナ、水風呂に入れるのはサウナグランピングの魅力ですね。

この記事下書き保存して投稿が遅くなってしまいました。書いているうちにサウナに行きたくなってきたのでホームサウナの東名健康厚木センターいってきます。

よいサウナライフを!

【うめぼし食え】なとりの梅スッキリが終売!?悲しい。ネクスト梅スッキリを探せ!

のぶじゃすです。以前なとりの梅スッキリが大好き大好きな記事を書きました。

www.y-i.jp

気づいたときにはどこにも売っていない

公式で明確に終売という記事は見つけられませんでした。もしかしたらリニューアルして復活してくれたりするのかもしれません。頼みますなとりさん。

しかし終売という記事や発言がチラホラ

acceliv.com

もう友達が作れません。絶望です。

ネクスト梅スッキリを探して

色々な梅のお菓子を探しています。いくつもの梅のお菓子、おやつを試してみていますがまだネクスト梅スッキリは見つかっていません。

今日は私が色々試した中で、梅スッキリほどではないが、好きなお菓子を紹介しようと思います。大体どれかしらをもぐもぐしています。

上間菓子店 スッパイマン 甘梅一番

沖縄の上間菓子店が販売しているスッパイマン 甘梅一番です。

これはスーパーやコンビニで以前はよく見かけました。最近あまり見ない気がしますが。

黒糖の甘みがありつつ梅の酸っぱさが際立つお菓子です。無限に食べられます。

村岡食品工業 梅しば

梅しばです。THE梅しばといえば村岡食品工業さん。みなさんも一度は見たことがあると思います。

梅しばスゴイ好きで小さい頃から沢山たべています。美味しい。酸っぱい。ストレスが発散されます。

食べながら仕事が出来ないのと少し価格が高いのが玉に瑕。

味楽乃里 国内産 カリカリ梅

こちらも梅しばと近いですが少し違います。カリカリ梅。

先日、成城石井で見つけて買ってみました。今BLOGを書きながら食べていますがとても美味しいです。

梅しばに比べると少しさっぱりしていて何個でも食べられるカリカリ梅です。しっかり酸っぱい。

カリカリ梅も色々なメーカーから出ていますがはちみつ梅など甘めの味付けが多いなか正統派のカリカリ梅です。

中野物産 おしゃぶり昆布梅

梅そのものではないのですが、これ1日1袋食べてます。梅昆布も色々ためしたのですが、中野物産さんが一番バランスが良くて美味しいです。

昆布の適度な固さ。梅の風味の強さ。適度なサイズ感。あのペリペリ剥がす感じがワクワクしますね。

これからも梅おつまみ、梅お菓子探していきます

新しいものを見つけたら買って食べてみます。オススメがある方は飼って食べるので、是非教えて下さい!

勇気がいるやつ買ってみます

今BLOGを書いていてチャレンジングなやつを見つけたので買ってみます

量やばくね・・・?中野物産さんの25倍の量。1gあたり中野物産さんは約13円のところ7円!?

美味しかったら1ヶ月分いける・・・

アクセスありがとうございます🙇‍♂️

ここまで読んでいただき誠にありがとうございました。もしこの記事が面白いと思って頂けたら はてブ や、 Twitterのフォロー していただけると大変喜びます😊

Rails7 で button_to の data-confirm の挙動が変わって data.confirm から form.data.confirm に変わってました

おつかれさまです!のぶじゃすです。

最近Rails7でWebアプリケーションを開発しているのですが、削除の処理などの後戻りができないときや、事前に確認が必要な処理を書く際にブラウザのconfirm機能を使って確認ダイアログを出す処理を出したい場面がありました。

Rails7でこの機能の処理が変わってしまっていてハマりました。今回はある程度詳細な理由も調べてみました。

想定以上にアタフタ困ってしまった動画はこちら

実は動画撮影中にこの変更にハマってしまいました。まんまとハマって困りまくり焦りまくりの動画はこちらです。面白かったら高評価おねがいしますw


www.youtube.com

Rails7より前の button_to で confirm を出す方法

Railsでは button_to などで簡単にconfirmを出す機能がありました。

<% button_to "削除", any_path(any), { method: :delete, data: { confirm: "本当に削除してもいいですか?" } } %>

のように書くことで確認ダイアログが表示されていました。

Rails7 ではこれだと出ない

Rails7ではこの方法では確認ダイアログが表示されず、そのまま処理されてしまいます。これでは簡単に削除できすぎてしまいます。

そこでいくつか調べた所、 解決策を見つけました。

Rails7 で button_to で confirm を出す方法

<%= button_to "削除", rabbit_weight_path(@rabbit, weight), { method: :delete, form: { data: { turbo_confirm: "本当に削除しますか?" } } } %>

data: { confirm: "確認" }form: { data: { turbo_confirm: "確認" } } に直す事で正しく表示されます。

挙動としてはこれで正しくなりましたがなぜなのかはよく分かりません。どういう処理でこれが動作しているのか少し調べてみました。

2023/02/15 追記: form をつけなくても confirmturbo_confirm にすると動く

id:JunichiIto さんにコメントを頂きました。ありがとうございます!

該当のPull Requestはこちらです Make data-turbo-confirm work with multiple submitters inside a form by feliperaul · Pull Request #564 · hotwired/turbo · GitHub

このPull Requestがmergeされた Turbo 7.2 (turbo-rails 1.3) 以降では <form data-turbo-confirm="xxx" でも動きますが、 <button data-turbo-confirm="xxx" のようにbuttonタグに設定する形でも反応してくれるようになりました。

具体的にはこんな感じです

<%= button_to "削除", rabbit_weight_path(@rabbit, weight), { method: :delete, data: { turbo_confirm: "本当に削除しますか?" } } %>

これはありがたいですね。出力されたHTMLを見た時に見つけやすくなりますし、1つのformの中で複数のボタンがある場合で別のconfirmを出したい場合などにも使いやすそうです。

form: でくくると何が起こるのか

button_to の第3引数で form: { data: を設定するとそれ自体が form タグで囲まれます。そして form タグのアトリビュートに data-turbo-confirm が設定されます。

具体的には

erbに下記のように書くと

<%= button_to "削除", rabbit_weight_path(@rabbit, weight), { method: :delete, form: { data: { turbo_confirm: "本当に削除しますか?" } } } %>

HTMLとしてはこのようにレンダリングされます。

<form data-turbo-confirm="本当に削除しますか?" class="button_to" method="post" action="/rabbits/1/weights/2">
  <input type="hidden" name="_method" value="delete" autocomplete="off">
  <button type="submit">削除</button>
  <input type="hidden" name="authenticity_token" value="..........................." autocomplete="off">
</form>

そしてどうやってconfirm処理が動いているのか

Rails7ではturboが動いているため、以前のバージョンと変わったようです。

ということで turbo のコードを読んでみましょう。

  1. confirm 処理を探して読んでみた
  2. form_submission.ts にそれっぽいコードを見つけました
  3. FormSubmission というクラスでは formElement を constructor で受け取ります
  4. confirmationMessagedata-turbo-confirm を探します
  5. needsConfirmation では confirmationMessage が存在した場合に true を返します
  6. needsConfirmationtrue の場合には confirmMethod が発火します
  7. confirmMethod ではJavaScript標準(ブラウザ標準?)の cofirm 処理を動かしています

この辺りの処理です

github.com

正しい対応っぽいので大丈夫そう

コードをざっと読んでみた所、特におかしな所はなく想定されている挙動のようだったのでこれで安心して開発が進められます。

アクセスありがとうございます🙇‍♂️

ここまで読んでいただき誠にありがとうございました。もしこの記事が役に立ったらはてブや、Twitterのフォローしていただけると大変喜びます😊

それではよいRails7ライフを!

Rails で多対多のリレーションをした時に、joinレコードも同時にnew & save したい

おつかれさまです!のぶじゃすです。

最近よくRails7でコードを書いています。modelsを作っていく中でどうしても多対多のモデルになることがあります。

多対多のリレーションをするときには中間モデル(join モデル)を作る必要があるのですが、create時に中間モデルも一緒にcreateする必要があります。自動でcreateされると思っていたのですが、されなくて困りました。色々試して解決できた&あまり明確に書いてある記事が見当たらなかったので備忘録的にBLOG書いておきます。

サーバの線につまづいて転びそうになる人のイラスト
モデル周りはよく躓きますよね

  • 今回使用したバージョン
  • うさぎと親が多対多
    • models/rabbit.rb
    • models/breed.rb
    • models/user.rb
  • has_many :through関連付け
  • 元々のうさぎ新規作成機能
    • controllers/rabbits_controller.rb#create
  • 間違った方法
  • 正しい方法
  • 最終的な controller は current_user.save にしました
    • controllers/rabbits_controller.rb#create
  • アクセスありがとうございます🙇‍♂️
続きを読む

html.erbファイルをVisual Studio CodeでAuto FormatするのはERB Formatter/Beautifyがよさそう

最近Rails7でコードを書いているのですが、 Visual Studio Code(以下VSCode)でhtml.erbファイルを編集する場面が多いです。Rails7のRails Wayでやっていてhtml.erbでturboで書いている場合はJSよりはhtml.erbを編集する機会が増えるのではないかと思っています。

VSCodeでhtml.erbを書いているとAuto Formatしてほしくなります。インデントとか空行とかあまり意識せずに勝手に整えてほしいですよね。

結論

いくつか調べたのですが、結局 ERB Formatter/Beautify というVSCodeのExtensionが今の所良さそうでした。

marketplace.visualstudio.com

必要な設定

setting.json

  "files.associations": {
    "*.html.erb": "erb"
  },
  "[erb]": {
    "editor.defaultFormatter": "aliariff.vscode-erb-beautify"
  },
  "vscode-erb-beautify.useBundler": true

Gemfile

gem 'htmlbeautifier'

私は group :development doend の間に書いています。productionには不要ですからね。

Prettierでやりたかったけどイマイチでした

rubyとかはPrettierでフォーマットしているのでhtml.erbも一緒にできないかなと思ったのですが私には合いませんでした。

Prettier でフォーマットするには、 html.erbhtml として扱う必要があります。erb用のparserは多分無い。

setting.json にこんな感じで設定すればhtmlとしてフォーマットしてくれます。

"files.associations": {
   "*.html.erb": "html"
}

しかし、erbとしてハイライトしている部分とかがハイライトされなくなります。

ハイライトが動作していなくてerb独自コードが白色で書かれているスクリーンショット
<% とかが真っ白ですね。。。

eslint にも eslint-plugin-erb ってのがあるみたい

これは試していないです。 ERB Formatter/Beautify で満足いかない所があったりしたらまた試してみようと思います。

www.npmjs.com