OmniAICreator/Qiita-1.07M huggingface dataset:
Salesforce初心者に知ってほしい！Salesforce設定で特に気をつけること3選～

※今回の内容は動画でも解説しています

https://www.youtube.com/watch?v=sdUM25Jod6Q


<iframe width="560" height="315" src="https://www.youtube.com/embed/sdUM25Jod6Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


本橋孝昭です

私は今まで様々なSalesforce環境で設定してきました。
その際に
・ここは特に気をつけてほしい
ということがたくさんありました

今回は
・Salesforce設定で特に気をつけること3選

について説明します
Salesforceをはじめてつかう人（特にシステム管理者の人）に知ってほしいことをまとめました
初心者向けの内容ですので最後までご確認ください


### 1.Salesforceユーザ削除はできない（一度作成したユーザデータは残り続ける）

最初の内容はこれです
Salesforceにログインするためにはユーザ作成が必要です
しかしながら、一度作成したユーザは削除することは出来ないです
（無効化という設定をすることは可能です）


※参考ヘルプ

ユーザの削除
＞Salesforce では、ユーザを無効化することはできますが、完全に削除することはできません
https://help.salesforce.com/s/articleView?id=sf.deactivating_users.htm&type=5


なので、Salesforceユーザを誤って作成してしまうと、そのユーザデータがSalesforceにずっと残り続けてしまうことになります

（例えば調査のためSalesforce環境にダミーユーザを作成した場合、ずっとその環境にはダミーユーザがデータとして残り続けます。）

なお、ユーザ作成の方法はTrailhadなどに記載されています
ぜひご確認ください

新規ユーザの追加
https://trailhead.salesforce.com/ja/content/learn/modules/lex_implementation_user_setup_mgmt/lex_implementation_user_setup_mgmt_adding_users


### 2.レコードは削除させないように権限をしぼる（最悪誤って削除されてもゴミ箱からはやめに復元する）

次の設定はこれです

レコード削除をして一定期間たつとそのデータは復元できなくなります

なので、まずは削除できる権限のユーザを絞り込みましょう
こちらはプロファイルからオブジェクトごとの削除権限を抜くことが可能です


また、もしも万が一レコードを誤って削除した場合も
・削除されたレコードはゴミ箱に一定期間保管されている
という状態のはずなのでゴミ箱から復元することで対応可能です

なお、ゴミ箱の保存期間については通常15日ですがサポートに問い合わせれば30日に延長することも可能なようです


「Extended Recycle Bin Retention (ごみ箱保存期間の延長)」を有効にする

＞この機能は、ごみ箱のデータの保存期間を15 日から 30 日に延長します。
https://help.salesforce.com/s/articleView?id=000387160&type=1

また、Salesforceシステム管理者はデータのバックアップを定期的に取得することをおすすめします

データのバックアップのベストプラクティスはヘルプで紹介されています

参考
Salesforce データのバックアップのベストプラクティス
https://help.salesforce.com/s/articleView?id=000386692&type=1

データエクスポートサービス: ユーザインターフェスを使用して、データを手動または定期的にエクスポートします。「Salesforce からバックアップデータをエクスポートする」。
データローダ: API を使用して、データを手動でオンデマンドエクスポートします。「データのエクスポート」。
レポートのエクスポート: レポートを使用して、データを手動でオンデマンドエクスポートします。「レポートのエクスポート」。


### 3.　カスタム項目作成の際はAPI参照名をきちんとしたものにする

最後に章かいするのはこちらです
カスタム項目作成はSalesforceなら早ければ１分で出来てしまう作業ですね

なので、Salesforceが好きであればあるほど、どんどん項目作成をしたくなってしまうと思います

しかしながら、カスタム項目を作成する前に気をつけてほしいのはAPI参照名です

こちらについて、通常何もしないと「Field1__c」のようなものになってしまうのですが、こちらご注意ください。

このAPI参照名、後からだとなおしにくいので、項目の表示ラベルに合わせて作成することをおすすめします

では、なぜ項目のAPI参照名を「Field1__c」のようなものではなくきちんとしたほうがいいのでしょうか？

例えば「税率」のような項目を作成する際は「TaxRate」などです

もしも商談オブジェクトに
金額（Amount）に税率の計算をしたい場合
数式項目は
Amount * (1 + TaxRate__c)
になりますね
（数式項目で項目を計算式に入れる際は項目の表示ラベルではなく項目のAPI参照名になります）

これは、後から計算の数式を見返せば

「なるほど、これはTaxRateは税率なのでなにやら金額の税率計算をしているものだ」
と直感で分かります

しかしながら、これがもしも「Field1__c」のような場合、
数式項目は
Amount * (1 + Field1__c)
になりますね。

これでは直感的に数式の計算結果が何か分かりにくいし、あとで
「本当に税率項目のAPI参照名はField1__cなのか？」と見返す必要があるかもしれないですね

これはAPI参照名をきちんとしたほうがいい例のほんの一例です

他にもいろいろありますが、とりあえずカスタム項目作成時は、最低でも
「API参照名はちゃんとしたほうがいいんだな」ということは覚えておいてください

（似たような話でカスタムオブジェクト作成時のAPI参照名もきちんと設定したほうがいいですね。とにかくAPI参照名は作成時からきちんと設定しましょう！）


いかがでしょうか
他にも気をつけたほうがいいものがあることを知っている人は、ぜひコメントお待ちしてます！
【Kotlin】既存のData Classにチェック項目を付与する

# はじめに
既存のデータクラスにチェック項目を付与する方法について解説。
結論を言うと、ジェネリクスを用いてデータクラスを作成すればよい。

# 方法
Personデータクラスを作成。
```Person.kt
data class Person(
	var id: String,
	var name: String
)
```

このクラスにチェック項目を付与するために、CheckDataデータクラスを作成。
```CheckData.kt
data class CheckData<U>(
	var isChecked: Boolean,
	var data: U
)
```

以下のような形で使用可能。
```Kotlin
val personCheckList = listOf(
	CheckData(false, Person("01", "sakurai")),
	CheckData(false, Person("02", "akimoto")),
	CheckData(true, Person("03", "umezawa"))
)
```

ジェネリクス`<U>`を用いることで、Personデータクラス以外のクラスにもチェック項目を付与することが可能になる。
差分のみRuboCopの検査をする

pre-commitでRuboCop検査をしたいが、手を加えていない既存のコードに足を引っ張られたくはなかったため、差分のみでRuboCop検査できる方法を探した。検索に出てくるのは差分のみと言いつつ、"差分のあったファイル全体"にRuboCop検査をするものであり、期待するものではなかった。

PRで差分のみに対してRuboCop違反を自動でコメントしてくれるReviewdogがある。これをローカルで飼えば、期待する動きになるのではないかと思い試したところ、期待通りだったので記録しておく。

ReviewdogのインストールはMacを使っているためHomebrewで行う。
```shell
brew install reviewdog/tap/reviewdog
```
コンテナでRuboCopを動かす場合に使える、関連GemをアプリケーションのGemfile.lockのバージョンでインストールする場合のメモ。
```shell
gem install -N rubocop:$(ruby -ne 'print $& if /^\s{4}rubocop\s\(\K.*(?=\))/' Gemfile.lock) \
               rubocop-rails:$(ruby -ne 'print $& if /^\s{4}rubocop-rails\s\(\K.*(?=\))/' Gemfile.lock) \
               rubocop-performance:$(ruby -ne 'print $& if /^\s{4}rubocop-performance\s\(\K.*(?=\))/' Gemfile.lock)
```
これはReviewdogの[action-rubocop](https://github.com/reviewdog/action-rubocop)でそういう設定ができたので、インストール部分を参考にさせてもらった。

実行は"差分のあったファイル全体"のRuboCop検査の結果をReviewdogに食わせるだけ。

```shell
git diff --cached --name-only |\
grep -e '\.rb$' -e 'Gemfile$' -e 'Rakefile$' -e 'config\.ru$' -e '\.gemspec$' |\
xargs rubocop |\
reviewdog -f=rubocop -fail-on-error -diff="git diff --cached" -reporter=local
```

差分のファイルの取り方はもっといい方法があるかもしれない。
findコマンドでできるいろいろな検索方法

# findコマンドでできるいろいろな検索方法

find コマンドで使用できるいくつかの主要なオプションを以下にまとめました。

## ファイル名による検索:

**`-name`**：指定したファイル名のファイルを検索するオプション

```bash
find /path/to/dir -name "filename"
```

## パス名による検索:

**`-path`**：指定したパス名パターンに一致するファイルを検索するオプション

```bash
find /path/to/dir -path "path_pattern"
```

## ファイルサイズによる検索:

**`-size`**：指定したサイズのファイルを検索するオプション

```bash
find /path/to/dir -size [+|-]size[cwbkMG]
```

## ファイルタイプによる検索:

**`type`**：指定したファイルタイプのファイルを検索するオプション

```bash
find /path/to/dir -type [bcdpfls]
```

## ファイルの更新日時による検索:

**`mtime`**：指定した日数以内に更新されたファイルを検索するオプション

```bash
find /path/to/dir -mtime [+|-]days
```

## ファイルの所有者による検索:

**`-user`**：指定した所有者のファイルを検索するオプション

```bash
find /path/to/dir -user "username"
```

## ファイルのグループによる検索:

**`-group`**：指定したグループのファイルを検索するオプション

```bash
find /path/to/dir -group "groupname"
```

## ファイルの権限による検索:

**`-perm`**：指定したパーミッションを持つファイルを検索するオプション

```bash
find /path/to/dir -perm mode
```

# 複数の検索条件を組み合わせた検索:

```bash
find /path/to/dir -name "*.txt" -type f -size +1M -mtime -7
```

この検索では、以下の条件で指定している。

- **`/path/to/dir`** ディレクトリ以下にある
- ファイル名が **`.txt`** である
- ファイルタイプがファイルである (**`type f`**)
- ファイルサイズが 1MB 以上である (**`size +1M`**)
- 更新日時が 7日前以降である (**`mtime -7`**)
mingw64 windows インストール

```batch
@echo off

set repo_owner=niXman
set repo_name=mingw-builds-binaries
set unzip_path=C:
set url=https://www.7-zip.org/a/7z2201.exe
set installer_file=7z2201.exe

set "SEVENZIP_EXE=C:\Program Files (x86)\7-Zip\7z.exe"
if not exist "%SEVENZIP_EXE%" (
  echo 7zip is not installed, downloading installer...
  curl -L -o %installer_file% %url%
  echo Installing 7zip...
  start /wait %installer_file%
)

echo Retrieving latest release information...
for /f "usebackq tokens=2 delims== " %%G in (`curl -s https://api.github.com/repos/%repo_owner%/%repo_name%/releases/latest ^| findstr "browser_download_url"`) do set url=%%~G

if not exist "%unzip_path%" mkdir "%unzip_path%"

for /f "tokens=*" %%F in ("%url%") do set zip_file=%%~nxF

if not exist "%zip_file%" (
  echo Downloading %zip_file%...
  curl -L -o %zip_file% %url%
)

echo Extracting files to %unzip_path%...
"%SEVENZIP_EXE%" x "%zip_file%" -o"%unzip_path%"

echo %unzip_path%\mingw64\bin
setx PATH "%unzip_path%\mingw64\bin;%PATH%" /M

echo Done!
```

Thanks to niXman

https://github.com/niXman/mingw-builds-binaries
【断念】Swift Package Managerに依存するcocoapodsのライブラリを作る

失敗の記録として残しておきます。

# 経緯
Amplifyを使用したライブラリを作成し、それをcocoapodsのライブラリとして配布することを考えました。
Amplifyの最新版(2.x)はSwift Package Manager(以下SPM)からしかダウンロードできないため、cocoapodsライブラリインストール後に、SPMの依存関係を解決するというアプローチが良さそうに思い調査をはじめました。

# やったこと
## cocoapodsライブラリの作成
`pod lib create 名前` で作成する方法では、開発対象のライブラリがPods以下に入ってしまいSPMの依存関係を、思ったように追加することができませんでした。
そこで [こちら](https://medium.com/@jeantimex/create-your-own-cocoapods-library-da589d5cd270)で紹介されているように、まずライブラリ部分をframeworkとして作成することにしました。

frameworkとして作成することでSPMの依存関係もかんたんに追加することができました。

## ライブラリを利用する側
### cocoapodsの依存関係を解決
以下のように依存関係を追加しpod installしました。
```
pod 'MyLib', :git => 'git@github.com:hoge/mylib.git', :tag => '0.0.3'
```

インストール自体は問題なくできますが、当然SPMでインストールされるAmplifyの依存関係が解決されていないので、
`import Amplify` しているところで、 `No such module 'Amplify'` とエラーになってビルドできません。

### post_installでSPMパッケージへの依存を追加
そこで以下のようにpost_installでSPMの依存関係を追加しました。post installするとXcode上は期待通りSPMの依存関係が追加されていました。

```
post_install do |installer|
  installer.pods_project.targets.each do |target|
    # 参考
    # SPMパッケージを追加
    # https://github.com/CocoaPods/CocoaPods/issues/10049#issuecomment-819480131
    if target.name == "MyLib"
      project = installer.pods_project
      pkg = project.new(Xcodeproj::Project::Object::XCRemoteSwiftPackageReference)
      pkg.repositoryURL = "https://github.com/aws-amplify/amplify-swift"
      pkg.requirement = {
                kind: "upToNextMajorVersion",
                minimumVersion: "2.0.0"
      }
      ref = project.new(Xcodeproj::Project::Object::XCSwiftPackageProductDependency)
      ref.package = pkg
      ref.product_name = "Amplify"
      ref2 = project.new(Xcodeproj::Project::Object::XCSwiftPackageProductDependency)
      ref2.package = pkg
      ref2.product_name = "AWSAPIPlugin"
      ref3 = project.new(Xcodeproj::Project::Object::XCSwiftPackageProductDependency)
      ref3.package = pkg
      ref3.product_name = "AWSCognitoAuthPlugin"
      target.package_product_dependencies << ref
      target.package_product_dependencies << ref2
      target.package_product_dependencies << ref3
      project.root_object.package_references << pkg
      project.save
    end
  end
end
```

しかしビルドしてみると依然として `No such module 'Amplify'` エラーになってしまいます。
この状況をどうしても解決することができず、今回は SPMに依存する cocoapodsのライブラリを作ることを諦めました。

podプロジェクトでないプロジェクトをワークスペースに追加して、同じようにAmplifyの依存を追加した場合は利用できました。
podプロジェクト以下のターゲットにSPMでインストールする依存関係を追加した場合にうまく動かないようです。
path系も同じように見えるんですけどね。。
podのxcconfigが怪しいかなぁとも思ったのですが、解決できませんでした。

何か知っていたら教えていただけると助かります。

# 参考
https://forums.swift.org/t/possible-to-use-spm-packages-from-cocoapods-pods-project/53187
https://github.com/CocoaPods/CocoaPods/issues/10049#issuecomment-819480131
https://medium.com/@jeantimex/create-your-own-cocoapods-library-da589d5cd270
z-index

# z-index
z-index は CSS のプロパティで、位置指定要素とその子孫要素、またはフレックスアイテムの z 順を定義します。より大きな z-index を持つ要素はより小さな要素の上に重なります。

# 出典
https://developer.mozilla.org/ja/docs/Web/CSS/z-index

# 感想
これでポップアップを実現させているのか。
Power Virtual AgentsからPower Automateを呼び出してOutlookにメールを送付する

### はじめに

前回、[Power Virtual AgentsとPower Automateを連携する](https://qiita.com/k-kimino/items/e0d678ac21a4c2edfc3e)でPower Virtual AgentsからPower Automateを呼び出すところまで確認できたので、次は実際にメールを出してみます。

### 手順

ひな型は前回までにできているので、Power Automateの中身を変えるだけです。
![Sendmail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/6f3a7bfe-0c1d-60f3-6686-f3604d6bb7b1.png)
![Sendmail2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/3462e309-90b1-9faf-d83c-754bd2e533d2.png)
実際に送られてきたメールはこちら
![Sendmail3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/dfd9b708-9a33-f059-c5ac-54d7d7f8fa57.png)

躓きポイントは変数。Power Virtual Agentsでメールの本文をチャットに書いてPower Automateに渡しているのですが、画面上だと変数の作り方が中々見つからないんですよね。そこで[マイクロソフトのドキュメント](https://learn.microsoft.com/en-us/power-virtual-agents/authoring-variables#create-a-variable)を確認すると質問を作成すると自動で作成されますとのこと。逆に言うとそれ以外の変数の作成方法がない？ぽいです。。

### まとめ

段々とやれることが増えてきました。実用的になるまであと一歩ですかね。
PHP 配列の要素を区切り文字を指定して連結する implode

# 概要

- PHPにて配列要素の文字列を連結する方法をまとめる。

# やりたいこと

- 下記のような配列があったとする。

    ```php
    $array = ['foo', 'bar', 'hoge', 'fuga'];
    ```

- 下記の様に配列の要素を`/`で区切り、一つの文字列にしたい。

    ```
    foo/bar/hoge/fuga
    ```

# 方法

- PHPの組み込み関数`implode`を使う。
- 下記のように第一引数に区切り文字を、第二引数に配列を入れると連結した文字列を返す。

    ```php
    implode(区切り文字, 配列);
    ```

- 今回の場合は下記の様になる。

    ```php
    <?php

    $array = ['foo', 'bar', 'hoge', 'fuga'];

    $result = implode('/', $array);

    echo $result;
    // foo/bar/hoge/fuga
    ```

- 区切り文字は何でもいい。
    - カンマとか

        ```php
        <?php

        $array = ['foo', 'bar', 'hoge', 'fuga'];

        $result = implode(',', $array);

        echo $result;
        // foo,bar,hoge,fuga
        ```

    - 半角スペースとか

        ```php
        <?php

        $array = ['foo', 'bar', 'hoge', 'fuga'];

        $result = implode(' ', $array);

        echo $result;
        // foo bar hoge fuga
        ```

- ちなみに区切り文字の指定は任意で、特に指定しなければ区切り文字なしで連結だけ行われる。

    ```php
    <?php

    $array = ['foo', 'bar', 'hoge', 'fuga'];

    $result = implode($array);

    echo $result;
    // foobarhogefuga
    ```    

# 参考文献

https://www.php.net/manual/ja/function.implode.php
シェルスクリプト　～基本・繰り返し＆条件分岐～

# 簡単なシェルスクリプト

１～100の数値のうち偶数の数値をechoさせる
簡単なことだけど色々詰まってるよね。

## ステップ１　1～100の数値を出力させる。

　while文を使用し1～１００まで出力させる。

```bash
#!/bin/bash
while [ $i -le 100 ]
  do
echo $i
i=$((i+1))
done　
```

　

## ステップ2 
- if分を使い２で割り切れるときという条件を付ける
    
  -eqは演算子で左辺と右辺が等しい時ということ。
```bash
if [ $(( i % 2))  -eq 0 ]
then
	echo $1
fi

```
whilie文とかは普通にdo doneなのに、if文の終了がfiというのは？
とおもったけどfinishの省略か…

## ステップ3

　二つを組み合わせる
```
#!/bin/bash

i=1
while [ $i -le 100 ]
do
	if [ $((i % 2)) -eq 0 ]
	then
		echo $i
	fi
	i=$((i+1))
done
```
ElixrDesktopのAndroidでpackage名の変更方法

# 困ったこと

AndroidのPackage名を変更したい

https://github.com/elixir-desktop/android-example-app

```diff_java
- package io.elixirdesktop.example
+ package com.kitune330.app
```

# 対応

1\. *.ktの移動
任意のpackageにBridge.ktとMainActivity.ktを移動する。
（この時、activity_main.xmlとの整合性が合わなくてエラーになる時があるが、gradle.buildをsyncしなおしたり等をして、頑張って整合性を合わせる）

2\. native-lib.cppの修正
「cpp/native-lib.cpp」のL160あたりにある下記を変更したpackage名に合わせる
```diff_c_sharp
- Java_io_elixirdesktop_example_Bridge_startErlang(
+ Java_com_kitune330_app_Bridge_startErlang(
```


3\. build.gradleの修正
「app/build.gradle」のapplicationIdをpackage名に合わせる
```diff_gradle
defaultConfig {
-    applicationId 'io.elixirdesktop.example'
+    applicationId 'com.kitune330.app'
```
https://github.com/elixir-desktop/android-example-app/blob/master/app/build.gradle#L19

4\. AndroidManifest.xmlの修正
4-1. L3あたりにあるpackageをpackage名に合わせる
```diff_xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="io.elixirdesktop.example"
+    package="com.kitune330.app"
```
    
4-2. L20あたりのandroid:authorities
```diff_xml
-    android:authorities="io.elixirdesktop.example.fileprovider"
+    android:authorities="com.kitune330.app.fileprovider"
```

4-3. L30あたりのandroid:name　も同時に変更する
```diff_xml
-    android:name="io.elixirdesktop.example.MainActivity">
+    android:name="com.kitune330.app.MainActivity">
```

https://github.com/elixir-desktop/android-example-app/blob/master/app/src/main/AndroidManifest.xml#L3
Pull Requestで意識していること

## どんな記事？
`Pull Request`（以後`PR`）で自分がレビュイのときに意識していることをまとめてみました。
PRだけじゃなくSlack等のテキストベースコミュニケーションでも同じようなことを意識してやっているので、リモートワーク環境でコミュニケーションを円滑に進めたい、進めにくいなと感じている方の参考になれば幸いです。

## タイトルをわかりやすく書く
このPRで何を実装／修正したのかを「簡潔に」書きます。
レイアウト修正のPRだと下記のようなタイトルにしています。
`A画面で説明文の文字数が最大のときにレイアウトが崩れないようにした`
Slackで例えると書き出しを
`B画面の実装について`
みたいにして、どういう要件なのかをまず読み手に意識してもらう、ということが大事かなと。

## 概要にWhy＝要件を書く
このPRはどのような要件・なぜ・課題の対応なのかを書いています。
要件やIssueをおざなりにしてしまうと、レビュアにとってもなぜこのような変更なのか、等の質問コメントで無駄なコミュニケーションが発生してしまいがちです。
具体的には、下記のように書いています。
`A画面の説明文がMax文字数のときにテーブルレイアウトを突き破って表示崩れを起こしてしまう事象修正のため`
Slackでは具体的な依頼内容を書くイメージです
`PRDの要件を元に実装してみました、下記イメージで問題ないか確認お願いします`

## 参照／例示コード等はコミットハッシュリンクを使いプレビューされる形にする
GitHubのコードリンクURLは「コミットハッシュリンク」を貼り付けることでIssue/PR等ではリンク先のコードがプレビュー表示される形にできます。
こんな感じですね。
`https://github.com/bayobayo0324/sample/blob/399cd2e13ffbdcd20f28c402625ee05192220ec9/package.json#L2-L7`
![スクリーンショット 2023-04-27 18.08.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231246/5c576ad2-a051-bb1d-74fc-d5ceef6f325f.png)
ただのURL文字列リンクよりも一瞬でレビュアに伝わります。
リンク開いて、元のPRに戻って、という手間が省けるのでレビューがラクになりますよね、私はこの形でリンク貼られて自分がラクだと思ったことがあるので、相手にも同じ気持ちになってほしくてこれをはじめました。

また、`/blob/main/package.json#L2-L7`とかだと、`main`が別の人の変更マージされてしまったときに、自分が見せたかった状態と違うコードとなってしまう可能性もあります。
コミットハッシュリンクなら確実に自分が見せたいコードを見せることができると同時に、レビューにかける時間も少なくできるので、一挙両得ですね😌

Slackではコードプレビューされないので、そのままURLリンク貼るとか、コード以外では上記の実装した画面のキャプチャを貼ったり、過去のSlack発言を参照してほしいならそのリンクを添えたりですね。
要は（プロダクトコードに限らず情報も）ソースURLをきちんと貼って参照しやすくしましょうってことです。

## レビュー依頼前にセルフコメントで意図を補足する
コードコメントに残すほどではないけど、なぜこのような修正になっているのか？
あるいは、PRに関係なさそうなファイルに変更が入っているのはなぜなのか？
というときに、対象ファイル、対象コードにその意図をコメントしておくことがあります。
こんな感じです。
![スクリーンショット 2023-04-27 18.38.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231246/5c13388b-f29a-a457-b374-9610ba29d1a5.png)
これも、レビュアとのやりとりをできるだけ少なくしたいのと、レビュー対象を正しく絞っておきたいという意図があります。
「そこは今回の肝じゃないんですが、、、」というやりとりが発生してしまうことが結構あると思っていて、レビュイもそうですが、レビュアにとっても悲しいことですよね🥲

## まとめ
色々書きましたが根底にある意識は下記になります。
* **意図を正しく伝えることによるコミュニケーションの円滑化**
* 自分の既知は相手の既知とは限らない

自分がレビュー（or 確認・返信）してほしいところはどこで、どういう意図があってその変更をしているのか、また何を参考にしたのかや、変更することによって視覚的に変わる箇所はどこなのか、レビュアやSlackの相手に**的確に**、**素早く**確認＆判断してもらうために、GitHubやSlack等のツールで使える便利機能に頼りながら色々工夫している、という感じです。
また、自分が知っていること、プロジェクト参画者ならきっと知っているであろうことも、実は相手が知らないことである可能性もあるので、前提として改めて記載しておくことも重要だなと思っています

## 終わりに
いかがだったでしょうか？
フルリモートワーク環境が当たり前になって3年以上経っているので、既に意識して実践しているよーという方も多いかもしれずで、今さら感は否めなかったかもしれません。
が、こうやって書き出してみることで、自分でも無意識やおざなりになってしまっているかも、、、という部分も改めて意識付けできたので良かったと思います。

最後まで読んでいただきありがとうございました😌
C#における変数のデータ型類型を表にまとめた

## 概要
変数のデータ型の分類について、分かりづらい説明が多いように感じた。
そこで、intやstringなど各データ型を実際にChatGPTに分類してもらうことで、理解を深めてみた。

## 類型表

| データ型  | プリミティブ型/非プリミティブ型 | カスタム型/非カスタム型 | 組み込み型/非組み込み型 | 複合型/非複合型 | 値型/参照型 |
|-----------|-------------------------|-------------------|---------------------|---------------|-------------|
| int       | プリミティブ型             | 非カスタム型           | 組み込み型             | 非複合型           | 値型         |
| char      | プリミティブ型             | 非カスタム型           | 組み込み型             | 非複合型           | 値型         |
| string    | 非プリミティブ型             | 非カスタム型           | 組み込み型             | 非複合型           | 参照型       |
| JArray    | 非プリミティブ型             | 非カスタム型           | 非組み込み型             | 複合型           | 参照型       |
| enum      | 非プリミティブ型             | カスタム型             | 非組み込み型           | 非複合型           | 値型         |
| delegate  | 非プリミティブ型             | カスタム型             | 非組み込み型           | 非複合型           | 参照型       |
| struct     | 非プリミティブ型             | カスタム型             | 非組み込み型           | 複合型             | 値型       |
| class    | 非プリミティブ型             | カスタム型             | 非組み込み型           | 複合型             | 参照型         |

## プリミティブ型
>プリミティブ型は、プログラミング言語において最も基本的なデータ型で、言語のコア部分に組み込まれています。これらはメモリ上で効率的に表現され、通常、算術演算や論理演算などの基本的な操作が可能です。C#では、int、float、double、char、boolなどがプリミティブ型にあたります。
これらの基本データ型は、言語の設計上、newキーワードを使わなくてもインスタンスを作成できるようになっています。これはプログラミングにおいて一般的に頻繁に使われるデータ型であるため、簡潔な記述を可能にすることで可読性や使いやすさが向上するからです。
出典: ChatGPT

なるほど。newしなくてもインスタンス生成できるのは、単に便宜上の理由なのか。

## カスタム型
>カスタム型は、プログラマが独自に定義するデータ型で、他の型を組み合わせたり、独自のメソッドやプロパティを持つことができます。C#では、class、struct、enum、delegateなどがカスタム型になります。カスタム型を使用することで、問題領域に適した抽象化を提供し、コードの再利用性や保守性を向上させることができます。
出典: ChatGPT

## 組み込み型
>組み込み型は、プログラミング言語に組み込まれているデータ型で、言語の標準機能として提供されます。これらの型は、プリミティブ型だけでなく、言語が提供する基本的な型も含む場合があります。C#では、プリミティブ型に加えて、string、Array、List、Dictionaryなどが組み込み型にあたります。
出典: ChatGPT

サードパーティー製のクラスは組み込み型といわないみたい。例えばJSON.NETライブラリのJArrayなど。

## 複合型
>複合型とは、他のデータ型を組み合わせて作られるデータ構造のことです。簡単に言えば、複数のデータをひとまとめにして扱えるようにするデータ型です。これに対して、単純な数値や文字などを表現するデータ型は「非複合型」と呼ばれます。
例えば、家族の名前を一覧にして保存したい場合、複合型の一種である「配列」を使うことができます。配列は、同じデータ型の複数の要素を順序付けて格納することができます。この場合、家族の名前を文字列型（string）の配列として保存できます。
複合型の他の例には、リスト（List）、辞書（Dictionary）、タプル（Tuple）などがあります。これらのデータ構造を使うことで、複数のデータを効率的に扱い、コードをシンプルに保つことができます。
出典: ChatGPT

## 値型/参照型
>C#のデータ型は、値型と参照型に分類されます。
値型は、変数が直接データを保持する型です。値型の変数が別の変数に代入されると、データのコピーが作成されます。プリミティブ型のほとんどや、struct、enumが値型にあたります。
参照型は、変数がデータへの参照を保持する型です。参照型の変数が別の変数に代入されると、データへの参照がコピーされますが、データ自体は共有されます。参照型の変数が変更されると、他の参照型変数も影響を受けることがあります。C#では、class、string、Array、List、Dictionary、delegateなどが参照型にあたります。
値型と参照型の違いは、主にデータの扱い方に関連しており、値型はコピーされたデータが独立しているため、一方の変数が変更されても他方に影響を与えません。一方、参照型ではデータが共有されているため、一方の変数が変更されると、他方も影響を受けることがあります。これらの違いを理解することで、適切なデータ型を選択し、効率的で安全なコードを書くことができます。
出典: ChatGPT
node-sassとdart-sassの差分比較


## はじめに

以下の環境で`node-sass`から`dart-sass`に移行しました。
- React18 
- Javascript
- yarn パッケージマネージャ

しっかり移行できたか確認したいので、 node-sass・dart-sassの両方で`scss`のファイルをcssにビルドして 差分を比較します。


## 手順

1. まず、プロジェクトに両方のパッケージをインストールしてください。

    ```bash
    npm install node-sass
    npm install sass
    ```

2. 次に、SCSSファイルをそれぞれのコンパイラでビルドするための npm スクリプトを追加してください。`package.json`ファイルに以下のように記述します。

    ```json
    {
      "scripts": {
        "build:node-sass": "node-sass input.scss output-node-sass.css",
        "build:dart-sass": "sass input.scss output-dart-sass.css"
      }
    }
    ```

    上記のコードでは、`input.scss`を入力ファイル、`output-node-sass.css`と`output-dart-sass.css`をそれぞれのビルド結果として出力しています。適切なファイル名に変更してください。

3. それぞれのスクリプトを実行して、CSSファイルを生成します。

    ```bash
    npm run build:node-sass
    npm run build:dart-sass
    ```

4. 生成された2つの CSS ファイルを比較します。差分比較ツール（例：`diff`コマンド、VSCode の比較機能、またはオンラインツールなど）を使用して、`output-node-sass.css` と `output-dart-sass.css` ファイルの違いを見つけます。

    ```bash
    diff output-node-sass.css output-dart-sass.css
    ```

    差分がなければ、移行が正常に行われています。もし差分がある場合は、問題を特定し修正してください。主に、関数の使用方法や Dart Sass で非推奨になった機能に注意してください。

    これらの手順に従って、node-sass と dart-sass で生成された CSS ファイルの差分を比較し、移行が適切に行われているか確認できます。


## 複数のファイルを一括で行いたい場合

1. プロジェクトに両方のパッケージをインストールしてください。

    ```bash
    yarn add node-sass
    yarn add sass
    ```

2. 次に、`package.json`ファイルに、全ての SCSS ファイルをそれぞれのコンパイラでビルドするための Yarn スクリプトを追加してください。

    ```json
    {
      "scripts": {
        "build:node-sass": "node-sass scss/ -o dist-node-sass/",
        "build:dart-sass": "sass scss/ dist-dart-sass/"
      }
    }
    ```

    上記のコードでは、`scss/`ディレクトリ内のすべての SCSS ファイルを入力として、それぞれのビルド結果を`dist-node-sass/`と`dist-dart-sass/`ディレクトリに出力しています。適切なディレクトリ名に変更してください。

3. それぞれのスクリプトを実行して、CSSファイルを生成します。

    ```bash
    yarn run build:node-sass
    yarn run build:dart-sass
    ```

4. 生成された `dist-node-sass/` と `dist-dart-sass/` の両ディレクトリにある CSS ファイルの差分を比較します。差分比較ツールを使用して、それぞれのファイルの違いを見つけます。

    Unix系OSであれば、`diff`コマンドを使ってディレクトリ内のファイルを再帰的に比較することができます。

    ```bash
    diff -r dist-node-sass/ dist-dart-sass/
    ```

    もし差分がある場合は、問題を特定し修正してください。主に、関数の使用方法や Dart Sass で非推奨になった機能に注意してください。

    これらの手順に従って、`scss/`ディレクトリ内の全ての SCSS ファイルを node-sass と dart-sass でビルドし、生成された CSS ファイルの差分を比較して、移行が適切に行われているか確認できます。
【速報】【v23.4】「Windows - レガシ」プロジェクトの利用可能期間延長？

# 「Windows - レガシ」プロジェクトの利用可能期間が延びたかもしれません

### はじめに

- v21.10 までの UiPath のプロジェクトはNETフレームワーク 4.6.1 のランタイムで動作していましたが、同フレームワークのサポート終了予定（※）にあわせて、新しく『Windows』と『クラスプラットフォーム（MACでも動作する）』というNETフレームワーク 6 のランタイムプロジェクト作成が（v21.10より）可能となりました。
- 「Windows レガシ」とは、NETフレームワーク 4.6.1 のランタイムプロジェクトを指します。
- 本記事は既存のレガシプロジェクトのマイグレーションを急ぐように注意喚起するものではありません。レガシプロジェクトのマイグレーションツールは v22.10 でリリースされており、同バージョンの延長サポートの期限（※）となる2025年10月までレガシプロジェクトは動作します。
***※：v23.4 のリリースに伴いアップデートがあるため後述します。***

### UiPath のプロジェクトについて

UiPath のプロジェクトのランタイムは3種類あり、新規プロジェクト作成時に「対応OS」欄から指定できます。
|プロジェクト（対応OS）	|ランタイムライブラリ	|動作環境|
|:--:|:--:|:--:|
|Windows – レガシ	|.NET 4.6.1	|Windows（32 bit）|
|クロスプラットフォーム	|.NET 6	|Windows Linux MacOS (64 bit)|
|Windows	|.NET 6	|Windows（64 bit）|

（対応OS 参考）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/20bc083e-c65e-859d-6b27-93637710d8b6.png)

:::note
「対応OS」は v21.10 より Studio の新規プロジェクト作成時に指定できます。（Studio X は v22.10 より可）
:::

### ↓↓↓本題：v23.4 のリリースで何がどうなった(@_@)↓↓↓

***ポイント①：*** v22.10 以降、Studio 起動時に画面上部に表示されるようになった警告文がやわらかくなった
-
（v22.10）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/6fe9f872-9312-aa89-2e9d-8266cd79ad43.png)
（v23.4）
![Windows-レガシプロジェクトの新規作成は、今後段階的に廃止されます.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/00dd4128-f4f5-1bdc-a7a2-4636a669dae2.jpeg)

:::note
「Windows - レガシ」プロジェクトの新規作成は、今後段階的に廃止されます。
:::

***ポイント②：*** 「Windows - レガシ」プロジェクトの新規作成が***できる！！***
-
![Windows-レガシプロジェクトの新規作成は、今後段階的に廃止されます2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/537d1f35-5c54-3f3c-1ed0-adc58fa3705f.jpeg)

:::note warn
半年前のリリースノートでは、v23.4 より「Windows - レガシ」プロジェクトの新規作成はできなくなるとアナウンスされていた
:::

***ポイント③：*** 非推奨化予定の予定バージョンの記述が変わった
-
![Windows-レガシプロジェクトの新規作成は、今後段階的に廃止されます4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/fc7a7180-4b3e-d059-b4bf-8cc910e11fb2.jpeg)

https://docs.uipath.com/ja/overview/other/latest/overview/deprecation-timeline#studio

:::note
「現時点で特定のリリースに対して予定されているわけではございません。」
:::

この時点で、v23.4 の延長サポート終了まで「Windows - レガシ」プロジェクトが使える（サポートされる）のは確定ですね(*^▽^*)
➤ ***2026年4月27日***

![Windows-レガシプロジェクトの新規作成は、今後段階的に廃止されます3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/b5ce9350-459d-251a-e321-8ad757865831.jpeg)

:::note warn
- 本記事はレガシプロジェクトのマイグレーションを急ぐように注意喚起したり、移行に向けた検討や作業着手の延伸等を勧めるものではありません。
- 「Windows」および「クロスプラットフォーム」プロジェクトが標準となっていくことに変わりはありません。
- 標準パッケージで構築可能なワークフローの新規開発などは徐々に移行していくことが望ましいと考えます。
:::

以上 お読みいただきありがとうございましたm(_ _)m
RT3052のJTAG

RT3052を使ったもモジュールでJTAGのピンがあるターゲットがあったので、元祖MBA 雪豹のurjtagを試してみました。ネットを調べてもあまり適切な情報がありません。

EJTAGの14ピンはあったのですが、TDOが切り離されていたので、ジャンパーをはってつなぎました。

![ejtag.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f6ca4e09-2c83-afc8-04e2-31a8d2647588.jpeg)

プルアップ抵抗も実装されていなかったのですが、とりあえずそのままにしました。

urjtagでdetectしても認識されません。一日考えて思い出しました。FreeBSDが起動するとPinctlでJTAGのピンをGPIOにしていました。このためU-Bootで止めておく必要がありました。

設定なのですがurjtagにはralinkの設定はないので同じmipsリトルエンディアンのadm5120の物を使います。

CFIのU-Bootを読んでみます。

```
$ ./jtag 

UrJTAG 0.10 #1502
Copyright (C) 2002, 2003 ETC s.r.o.
Copyright (C) 2007, 2008, 2009 Kolja Waschk and the respective authors

UrJTAG is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
There is absolutely no warranty for UrJTAG.

WARNING: UrJTAG may damage your hardware!
Type "quit" to exit, "help" for help.

jtag> cable ft2232
Connected to libftd2xx driver.
jtag> detect
IR length: 5
Chain length: 1
Device Id: 00010011001101010000001001001111 (0x000000001335024F)
  Unknown manufacturer!
chain.c(149) Part 0 without active instruction
chain.c(200) Part 0 without active instruction
chain.c(149) Part 0 without active instruction
jtag> include admtek/adm5120/adm5120
ImpCode=01100000010000010100000000000000 60414000
EJTAG version: 3.1
EJTAG Implementation flags: R4k ASID_8 MIPS16 NoDMA MIPS32
Processor entered Debug Mode.
jtag> readmem 0x1f000000 0x50000 uboot.bin
address: 0x1F000000
length:  0x00050000
reading:
addr: 0x1F050000
Done.
jtag> q
```

読み込みにはけっこう時間がかかります。uboot.binの中身を確認したところ、ちゃんと読めているようです。

detectflashで認識できているので、焼けるのではないかと思われますが、こんど試してみます。
PHP on ECS Fargate でメモリリーク


# 事象
PHPをECS（Fargate）上で動かすシステムを構築しましたが、メモリリークが発生していました。

そこで、よくある手法である **pm.max_requests** をセットしてphpのプロセスを再起動させました。

ところが、プロセス再起動して一時的にメモリは解放されますが、下図のようにすぐにまたメモリリークの水準ラインにもどってしまいました。
これは、php側が原因ではないと推測。
![メモリリーク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2348676/b1aa01aa-7126-2709-de26-d14bc6fa043f.png)

いろいろググったところ、HTTPS通信を行う際にはNSSライブラリを参照しており、このNSSにバグがあって、**dentryキャッシュ** が肥大化するらしいことを発見

↓参考
https://qiita.com/ldr/items/4b39fdcb8fae7d09f406

> ＜NSSとは＞
> Network Security Services (NSS) は、SSLをサポートするオープンソース暗号化ライブラリのセットです。
> cURLなどの複数のLinuxツールはNSSを使用して、信頼されるSSL通信を確認します。

> ＜dentryキャッシュとは＞
> dentry キャッシュは、 RAMより低速なHDDやSSDなどの、二次記憶装置からのディレクトリエントリの読み取りをキャッシュしておき、高速化するものです。
> ファイル名やディレクトリの階層構造、またディレクトリ名とinode情報を関連付けるもの（構造体）。

# 対策

以下の記事を参考にしました。
https://blog.nomadscafe.jp/2014/01/tmpfile-and-dentry-cache.html

対策として、以下の **vm.drop_caches** を使う方法があるそうなのでやってみたところ
```
echo 2 > /proc/sys/vm/drop_caches
```
以下エラーで怒られました。
```
bash: /proc/sys/vm/drop_caches: Read-only file system
```
どうやらホスト上でルートとして実行する必要があるらしく、Fargate（Docker：ゲスト）なので、ダメっぽいです。
https://discuss.linuxcontainers.org/t/how-to-drop-caches-inside-a-container/3200

次に試したのが **tmpfs** を使う方法で、tmpfsだと、dentry cacheは溜まらないそうです。
以下のコマンドを試しました
```
export TMPDIR=/dev/shm
```
すると、dentryキャッシュが99%のところで増加がとまりました。
なので、この方法を採用しようと思いました。

具体的には、phpの設定ファイル **www.conf** の最後に以下コードを追記して、再デプロイしました。
```
env[TMPDIR] = "/dev/shm"
```
やっとメモリリークが止まりました。

以上

# 参考サイト
https://blog.nomadscafe.jp/2014/01/tmpfile-and-dentry-cache.html
https://discuss.linuxcontainers.org/t/how-to-drop-caches-inside-a-container/3200
https://hiboma.hatenadiary.jp/entry/20140212/1392131530
ボストン住宅価格データセットの「黒人の割合」は本当は黒人の割合じゃない！？

回帰分析のサンプルデータセットとして非常によく使われているボストン住宅価格のデータですが、昨今、これが問題視されているという話を聞きました。このデータセットには黒人の割合という項目が説明変数として含まれているのですが、これが問題だというわけです。sklearnからは近々削除されるようです。

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_boston.html

まーたポリコレかよ、データはデータなんだからそれはそれとして受け入れろよ、という感想を私も最初持ったのですが、ちゃんと調べたらどうやら違うようです。

結論から言って、このボストン住宅価格データセットは**黒人割合の説明変数におかしな加工をしておりそれがデータ分析方法として正しくない**ということらしいです。さらに言えばよくある解説で「黒人の割合」と説明されるカラムの値は実際には黒人の割合とは言えないと解釈して良いと思います。

# データセットの元ネタ
前提として、このデータセットは1978年に出された大気汚染の度合いと住宅の価値を関係性を調べることを目的とした論文が元になっています。論文では大気汚染の度合いのほかに住宅価格を決定しうる要因として色々な説明変数を用意してそれら変数変数と住宅価格の相関関係について論じている感じです。ちなみにその論文は以下から誰でも読めます。

https://www.researchgate.net/publication/4974606_Hedonic_housing_prices_and_the_demand_for_clean_air

# 説明変数:「黒人の割合」の真実
その説明変数のうちの一つに黒人の割合が使われています。問題は黒人の割合が使われていること自体よりも、割合の数値を素直にそのまま使わず、加工を施したものを説明変数にしていることにあります。**黒人の割合を`B`とすると、説明変数としてデータセットに含まれるのは`(B - 0.63)^2`を計算した値になっている**のです。

この変換はグラフにすると0.63を頂点とする下に凸な二次曲線であり、黒人の割合が0.63の時に最小値0をとりそこから黒人の割合が0方向に行っても、1方向に行っても増加するという形状です。例えば**真の黒人の割合`B`が0.83でも0.43でもデータセットの値は同じ0.04**なのです（正確にはデータセットの値はこれを定数倍している）。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354612/865e14cb-df03-6e0d-07a7-0ef7688ce5d5.png)

# 問題点
このデータセットを使ったデータ分析には大きく二つの問題が生じている考えています。一つ目はデータセット自体の問題と、このデータセットを使ったデータ分析の解説（記事、講座等）の問題です。

## データセット自体の問題
データセット自体の問題として、まずこの`B`に対する変換に根拠が乏しいという点があります。論文には、住宅価格は白人にとって黒人が望ましくない隣人であるとするなら黒人の割合が上がるにつれて下降する、しかし黒人が極端に多ければそれはそれで市場の分離によって価格が上がるはず、と書いてあります。論文はこの件に関係する別の論文を引用しているのですが、そこでは価値の最低値を示す黒人割合が存在するということは言ってないようですし、当然その傾向が二次式で近似できるという根拠もありません。

さらに実際の黒人の割合`B`がデータセットからわからないのも問題です。先ほどの例のようにこの変換は異なる2つの`B`の値を同じ値に変換してしまいます。よってデータセットの値から元の黒人割合を逆算することはできません。**データセットの値がこのような不可逆な変換によって元の値がわからないようになっているのは問題です**。その変換が妥当であるかどうかが怪しい場合はなおさらです。

## 解説の問題
このデータセットは回帰分析の入門解説などでサンプルデータとして非常によく取り上げられていますが、多くの解説がこの`(B - 0.63)^2`のカラムを「黒人の割合」と呼称しています。しかし、よく考えればわかるように**これを「黒人の割合」と呼ぶには大いなる語弊がある**と思います。真の黒人の割合`B`と`(B - 0.63)^2`ではそもそも大小関係が一致しません。黒人の割合から導いた数値であることは確かですが、単純に「黒人の割合」と言われたら値が大きければ大きいほど割合が大きいのだと考えるのが普通なので、この呼称は正しいとは言えないと思います。

この値の意味を正しく表現するのは難しいですが、あえて言うなら「黒人と白人の混合度の逆数」といった感じですかね。中心だと値が0でそこから白人だけの街になっても黒人だけの街になっても値が上昇するからです。まあ0を取るのが`B=0.63`のときであることや二次式であることの根拠がない以上この表現も正しいとは言えない気がしますが。結局「黒人の割合から計算した値」みたいに呼ぶしかないかもですね。

解説ではこの変換式を示してあることも多いですが、全く示してないことも多々あります。このカラムを「黒人の割合」と呼称しながら変換式を示さないのは当然問題だとして、変換式を示してあってもその変換の意味するところについて解説するものはほぼなく、やはり問題だと思います。この変換は数値の意味を根本的に変える変換であり、式だけ載せれば良いというものではないはずです。

# まとめ・感想
以上のように、ボストン住宅価格のデータセットを使った分析にはポリコレを除いたとしても大いなる問題が含まれているということで、使うべきではないという流れがあります。代わりにカリフォルニアの住宅価格のデータセットを使うのが良いらしいです。

https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_california_housing.html#sklearn.datasets.fetch_california_housing

というか、データ分析やる人なら誰でも知ってると思われる有名データセットがこんな大きな問題を抱えているのに今まで誰も気づかずにみんなで使ってたってことになると、ほんとにデータ分析ってどうとでも騙せるんだろうなあとか思ってしまいますね。まあネットの記事とかが適当なだけで、プロなら実はみんな知ってた事実なのかもしれないですけど。みんな使ってるからOKという常識を疑うことがいかに難しいかを思い知りました。

# 参考
大体この記事を参考にしました。

https://medium.com/@docintangible/racist-data-destruction-113e3eff54a8
ElixirDesktopの起動時に発生する、SQLite3のエラー対応について

# 参考
https://qiita.com/the_haigo/items/0fd907d24fdde1905aa2

https://qiita.com/GeekMasahiro/items/ab76383f8aed5f8732d6

# 困ったこと

上記を参考に新規プロジェクトAndroidで動かそうとしたら、SQLite3が起動時にエラーを吐いた

# 原因

SQLite3の初期ファイル作成時のPathがダメだった。
上記で言うapplication.exに記載されている、下記でPath.joinをする時に　/ が入っていると起動時にこける。（実際に試したLocal環境ではlib/todo_app.ex相当の箇所）
なければ起動する。

```diff_elixir
    Application.put_env(:elixir_desktop_app, ElixirDesktopApp.Repo,
-     database: Path.join(config_dir(), "/database.sq3")
+     database: Path.join(config_dir(), "database.sq3")
    ) 
```


Path.join/1としては / があろうが無かろうが同じ挙動になっているのに謎
```elixir
iex(13)> path1 = Path.join(["aaa", "bbb"])
"aaa/bbb"
iex(14)> path2 =Path.join([path1, "database.sq3"]) 
"aaa/bbb/database.sq3"
iex(15)> path3 =Path.join([path1, "/database.sq3"])
"aaa/bbb/database.sq3"
```

# 対応

上記に記載されている / を消す

上記記事では
> Supervisor.start_childでエラーが発生しうまくいきませんでした。

と書かれているが、この対応で起動するようになった

https://github.com/elixir-desktop/desktop-example-app/blob/main/lib/todo_app.ex#L27
累積和（記述 python）

### ■ 前提条件

値：1,5,9,7,5,3,2,5,8,4

出力：[2:7]の区間の値を出す

#### ● 非累積和で実装
```python
# === 非累積和
tmp = []
arr = [1,5,9,7,5,3,2,5,8,4]
for i in range(2, 8):
    tmp_i = arr[i]
    tmp.append(tmp_i)
    
print(sum(tmp)) # 31を出力
```
#### ● 累積和で実装
```python
###### ============= 累積和

arr = [1,5,9,7,5,3,2,5,8,4] # 10個要素　
s = [0] * 11 # arr より１つ多い 配列要素を作成する

for i in range(10):
    s[i + 1] = s[i] + arr[i]
    
# 累積和　同士で　演算して解を出す
print(s[8] - s[2]) # s[8] 37 - s[2] 6 = 31 
```
#### ● 累積和ループ表
-------------------------

ループ回数 , 配列sの値 , 配列aの値
0:  s0  0  |  a0  1

1:  s1  1  |  a1  5

2:  s2  6  |  a2  9
 
3:  s3  15 |  a3  7

4:  s4  22 |  a4  5

5:  s5  27 |  a5  3

6:  s6  30 |  a6  2

7:  s7  32 |  a7  5

8:  s8  37 |  a8  8

9:  s9  45 |  a9  4 

10: s10 49 |  

-------------------------
ffmpegでmp4にアスペクト比を維持したままサイズを変換しようとしたら、無理だった。

# ffmpegでmp4にリサイズする
## 経緯
動画投稿系サイトを作った時に、重いんで動画を変換する機構を作ることになった。
mp4が対応ブラウザが多いのでそのフォーマットを選んだ。
mp4では横幅縦幅が2の倍数にならなければいけない制限があるらしい。
アスペクト比を維持したままリサイズすると、このエラーにぶち当たった。

## 起こった問題
以下のコマンドを実行すると２の倍数にしてくれ的な問題が起きる。
※横幅か縦幅に-1を指定すると、他方に合わせてアスペクト比を維持したまま変換してくれる。

```bash:bash
## エラーが起きるコマンド
ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4
## こんな感じのエラーが起きる(一部抜粋)
## [libx264 @ 0xa3b85a0] width not divisible by 2 (1000x369)
```

## 対策
-1ではなく-2にする。
※横幅か縦幅に-2を指定すると、他方に合わせてアスペクト比を維持したまま変換してくれて、２の倍数になる。

```bash:bash
ffmpeg -i input.mp4 -vf scale=-2:720 output.mp4
```
win11でアプデしたら右クリックで新規ファイル作れなくなった

「うお、Windows11アプデきてるやん…しよ」
「よし、アプデ完了…あれ、エクスプローラーの右クリックで新規ファイル作れなくなった…Orz」
　ということで、win11でアプデしたら右クリックで新規ファイル作れなくなった の解決方法 を話します。

# TL;DR
1.レジストリエディターを起動する(win+r して regedit など)
2.`コンピューター\HKEY_CLASSES_ROOT\.txt` を開く
3.もし、なければ、新規 => キー から ShellNew という名前のキーを作る
4.ShellNew内に、右クリックして、新規 => 文字列値 から NullFile という名前の Reg_SZ を作る
5.ShellNew内に、右クリックして、新規 => 展開可能な文字列値 から ItemName という名前の Reg_EXPAND_SZ を作る
6. ItemName を右クリックして、修正 => 値のデータ に以下を入力
`@%SystemRoot%¥system32¥notepad.exe,-470`

## 以上です
　お疲れ様でした。

# 環境
エディション	Windows 11 Home
バージョン	22H2
OS ビルド	22621.1635
エクスペリエンス	Windows Feature Experience Pack 1000.22641.1000.0

# 余談
アップデートをしたら、Bluetoothマウスが動かなくなりました。
別のマウスがあったので事なきを得ましたが、非Vimmerの皆さんは慎重に。
【iOS】CI/CD環境にてerror: Signing for "" requires a development team.のエラー対応方法

## 困ったこと
Bitriseを使ってCI/CD環境（fastlane matchを使ったmanual code sign）を構築してビルドしたところ、CocoaPodsでインストールしたSDKに`Signing`が設定されてなくビルドに失敗しました。

`error: Signing for "LineSDKSwift-LineSDK" requires a development team. Select a development team in the Signing & Capabilities editor. (in target 'LineSDKSwift-LineSDK' from project 'Pods')
`

#### 環境
Xcode 14.1
cocoapods 1.11.3
fastlane 2.212.1

## 解決方法
こちらを参考にさせていただきました。

https://github.com/CocoaPods/CocoaPods/issues/11402

Podfileに以下の処理を追加することでプロジェクトのビルド設定を更新します。

- プロジェクトの開発チームIDを取得

- バンドルターゲットのビルド設定を更新
`installer.pods_project.targets`を使用して、プロジェクト内のすべてのバンドルターゲットのビルド設定を更新。

```ruby:Podfile
post_install do |installer|
    dev_team = ""
    project = installer.aggregate_targets[0].user_project
    project.targets.each do |target|
        target.build_configurations.each do |config|
            if dev_team.empty? and !config.build_settings['DEVELOPMENT_TEAM'].nil?
                dev_team = config.build_settings['DEVELOPMENT_TEAM']
            end
        end
    end
    
    installer.pods_project.targets.each do |target|
        if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
            target.build_configurations.each do |config|
                config.build_settings['DEVELOPMENT_TEAM'] = dev_team
            end
        end
    end
end
```

## おわりに
ほかにもやり方はありそうでしたが、私の場合はこの対応で解決できました。
IBM Cloud: 認証用passcodeの取得方法

IBM Cloud CLIやClient VPN for VPC等を利用する際には、認証のためにpasscodeが必要となることがある。本稿では、passcodeの取得方法をまとめてみた。


# 方法1: passcode取得用のURLを直接参照する方法

- IBMid利用時
    - ` https://iam.cloud.ibm.com/identity/passcode` にアクセスし、IBMidの認証を経て以下の画面にてpasscodeを入手。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/98cd3eb0-e5b2-134a-d09f-cf2a94afdb20.png)

- App IDとの連携時
    - App IDとの連携時には、App IDごとにrealm_idが割り振られている。
    - ` https://iam.cloud.ibm.com/identity/passcode?realm_id=<Realm ID>`にアクセスし、該当のIdPにおける認証を経て、passcodeを入手。
        - 認証画面の例（App IDに内包されているCloud DirectoryをIdPとして利用した際の例）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/638055e8-054c-66d0-f693-a008595bd6cb.png)
        - passcodeの取得 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/be809d58-bbf6-6b95-5a2b-8b164f48870d.png)

# 方法2: IBM Cloudポータルにログインした後、取得用のURLを参照する。

1. IBM Cloudポータルにアクセスし、それぞれで認証を行い、ログインを完了させる。
    - IBMidの時は、`https://cloud.ibm.com`
    - App ID連携時は、`https://cloud.ibm.com/authorize/xxxxx/<Realm ID>`
2. ログイン完了後、` https://iam.cloud.ibm.com/identity/passcode`にアクセスする。

# 方法3: IBM Cloudポータルにログインした後、UIからpasscodeを取得する。

1. IBM Cloudポータルにアクセスし、それぞれで認証を行い、ログインを完了させる。
    - IBMidの時は、https://cloud.ibm.com
    - App ID連携時は、`https://cloud.ibm.com/authorize/xxxxx/<Realm ID>`
2. UIのメニューからpasscode情報を取得
<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/b4c8e7a2-7393-7ef6-94aa-db8011425349.png">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/1f4ea191-af61-7f6c-aa4b-c7c93b9c63a1.png)


補足

- 上記のUI上の表示が、App IDを使っていても`IBMid`と書かれてしまっている・・・が、passcodeの値としては問題なく使える。）
- App ID連携時でも、上記の方法で表示されたCLIのsnippertでログインすることが可能。


```txt:App ID連携時のCLIログイン
$ ibmcloud login -a https://cloud.ibm.com -u passcode -p xxxxxxxxxx -r jp-tok
API endpoint: https://cloud.ibm.com
Authenticating...
OK

Targeted account xxx (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) <-> xxxxxxx

Targeted region jp-tok


API endpoint:      https://cloud.ibm.com
Region:            jp-tok
User:              xxx@xxx.xxx.xxx
Account:           xxx (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) <-> xxxxxxx
Resource group:    No resource group targeted, use 'ibmcloud target -g RESOURCE_GROUP'
CF API endpoint:
Org:
Space:
```
戦争映画はSIerの激ヤバ現場に似ている

私は映画が好きです。
特に戦争映画に惹かれます。
私は軍人でも自衛官でもなくただのSEなのですが、戦争映画の登場人物たちにとても自己投影してしまいます。
それは、戦争映画とSIerの激ヤバ現場に共通点があるからかもしれません。
そう思い立ってこの記事を投稿します。

## 紹介する映画
https://www.amazon.co.jp/1917-%E5%91%BD%E3%82%92%E3%81%8B%E3%81%91%E3%81%9F%E4%BC%9D%E4%BB%A4-%E5%AD%97%E5%B9%95%E7%89%88-%E3%82%B8%E3%83%A7%E3%83%BC%E3%82%B8%E3%83%BB%E3%83%9E%E3%83%83%E3%82%B1%E3%82%A4/dp/B088QJDB24

今回紹介する映画は『1917』です！
私は今まで200本以上映画を観ているのですが、この映画はそのなかでも1,2を争うほど大好きな映画です。
【あらすじ】
第一次世界大戦真っ只中の1917年のある朝、若きイギリス人兵士のスコフィールドとブレイクにひとつの重要な任務が命じられる。それは一触即発の最前線にいる1600人の味方に、明朝までに作戦中止の命令を届けること。この伝令が間に合わなければ味方兵士全員が命を落とし、イギリスは戦いに敗北することになる――。刻々とタイムリミットが迫る中、2人の危険かつ困難なミッションが始まる・・・。

## 共通点
今回の記事の執筆のために、改めて映画を見直しました。映画を観ながら、自分の過去や先輩・同期から伝聞した話を頭でさらい、共通点をメモしていきました。
映画のストーリー順に共通点を挙げていきます。ネタバレ嫌な人はここでストップです。


#### いきなり召集、派遣先の仕事の詳細は教えてもらえない
→上長から言われた説明が真実だったためしがない。ヤバい案件を詳細に説明すると拒否されるから？

#### ドイツ軍が占領地を戦略的撤退、追いかけたら罠だが別部隊がそれを知らずに追跡
→仕様が刻々と変化している。最新の仕様はマネジメントの一部が知っていてそれをマネジメント同士でさえ共有していない。もちろん末端は知らない。

#### 電話線をドイツ軍が切ったので、無線で連絡が取れない
→必ずしも最新機器で効率よく作業できるわけではない。キャプチャをコピーアンドペースト。

#### 任務を遂行するのは通常部隊だが、たまに少人数で行動
→大抵の案件は5人などまとまった人数で同じプロジェクトに派遣されるが、顧客の都合でたまに単独で派遣される

#### 「いつになったら補充兵が来る」
→空いている人員などいない

#### 「今は何曜日だ？」
→休日出勤しすぎると曜日感覚が消える

#### ドイツ軍撤退後の塹壕に罠が仕掛けられている
→離任したエンジニアの残したスパゲッティーコードにバグがあって、総合テストフェーズやリリース後に発覚する。誰も読めない。

#### 遠くから戦闘機で自軍とドイツ軍が戦ってるのが見える
→すし詰めのオフィスの隣の島の別プロジェクトが炎上している様子が見える

#### 仲間が途中で死ぬ
→さすがに物理的に○されることはないが、責任感強くて優しい人ほどヤバ案件に心を傷めて離脱する。そして何も知らないのに自分が最古株になってしまった。

#### 沼にハマった車を力技でみんなで押す
→データ移行を手作業で土日に実行。移行用のプログラムを組む時間が惜しい

#### 乗り合わせた同僚と打ち解け、心配される
→たまに会った同期の案件が酷すぎて引く

#### 「なんでやつらは降伏しない？」
→やめたら契約違反で損害賠償……

#### 突撃の直前で上官が泣く
→本番リリース前日にプレッシャーでPLが一睡もできない

#### 大佐が早く出撃したがる
→リリース日を延ばせないのでテストが不十分でも上長が早く次の工程へ進みたがる

### しんどいことはたくさんあるけれど、なんとか仕事はやり遂げようとする。公共性の高いシステムだと尚更
→結局これがすべて


### 相違点
念のため、戦争映画とSIerの激ヤバ現場の相違点を挙げます。

#### 転職できない
ここが一番大きいかもしれません。
総力戦の時代は健康な男性はほぼ強制的に召集されます。
「この現場しんどいし自分に向いていないんで残業なしのホワイトな職場に転職します」なんてことはできないです。
SEはスキルがあって需要があればできます。

#### 国同士で戦う
これもないです。そもそもお客様と戦闘とかないです。
でもひどい現場だと、お客様と「言った言わない」の泥沼の争いになることもあります…。

#### 生死をかけた戦いをする
これも重複してしまいますが、命懸けでドンパチはやらないですね。銃を撃ち合うSEとか聞いたことないです。
でも、精神的ストレスで暴飲暴食や病気になってしまう方もいます。激ヤバ現場は健康からは程遠い存在です。




ここまで読んでくださりありがとうございます。
少しでもクスッと笑っていただけたら、そして私の大好きな映画に興味を持っていただけたら嬉しいです！
Bot Framework のことを調べる旅メモ (C#編)

# Bot Framework のことを調べる旅メモ (C#編)

※執筆途上のメモです

## Windows 版の Visual Studio 2022 をセットアップ

Windows 10 に、Windows 版の Visual Studio 2022 をセットアップしました。

## Bot Framework v4 SDK Templates for Visual Studio

以下をダウンロードして、VSIX Installer を起動して Visual Studio 2022 にインストールします。

- https://marketplace.visualstudio.com/items?itemName=BotBuilder.botbuilderv4

## 新規プロジェクト

新規プロジェクトで Bot Framework のテンプレートを選択して前進。
Lightning Web Components Basics >  Add Styles and Data to a Lightning Web Component


+ [Lightning Web Components Basics >  Add Styles and Data to a Lightning Web Component](https://trailhead.salesforce.com/content/learn/modules/lightning-web-components-basics/add-styles-and-data-to-a-lightning-web-component)

# We can't find the '{name}' attribute in the selector.html file.

+ [Can't find the '{name}' attribute in the selector.html file error message](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PkD91)

:::note
According to this video, 

I should put the code "<b>{name}</b>" in between 

<main class="main" > and <c-list onproductselected={handleProductSelected}></c-list>

Then it worked.

I will keep my post for those who have the same problem in the future. 
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a89448fc-cefd-9b67-bd7e-9bbffd77abcc.png)

+ [How can I fix "We can't find the '{name}' attribute in the selector.html file"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jd1Jb)

:::note
you can solve this error by following steps first go to manage playground delete all the playground expect the one one you are using for this challenge in your case its (MY TRAILHEAD PLAYGROUND 1) then go to vs code then again author org then deploy in default org then come back to challenge page, click on  3 dots present side of the playground you will see the another playground expect the one your using select that and connect the org then verify the challenge . 
:::

+ [Add Styles and Data to a Lightning Web Component (in the lightening app builder there is no product card and selector where did i find)](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007cmOHnSAM)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2c4c0be6-ff7d-49e2-285e-33eb615fded5.png)

+ [ENOTDIR: not a directory, scandir '\force-app\main\default\lwc\selector.html'.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KAeyf)

:::note
I ended up deleting the files and the LW page and starting over. I can now see the Selector component! Thank you for your help! 
:::


# Create Lightning Web Components

+ [【未解決】https://s3-us-west-1.amazonaws.com/sfdc-demo/ebikes/electrax4.jpg image is not showing on the Bike Card App page](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MZwGS)


:::note alert
<Error>
<Code>AllAccessDisabled</Code>
<Message>All access to this object has been disabled</Message>
<RequestId>26A93N26MDWEDH8H</RequestId>
<HostId>YdGf88CXWuu5qWP/sO5vS+9ULUgEpAvn25qVb6Jl5eq+jn8R1a/mc2WW8sPWEywhd73BTaBijVU=</HostId>
</Error> 
:::
Spring BootでTailwind.cssを使う

Spring Boot + Thymeleafという構成で、CSSを書くときにTailwind.cssを使う方法を記載します

# はじめに
https://blog.tericcabrel.com/web-application-springboot-thymeleaf-tailwindcss/

この記事の内容は、ほぼこの記事の転記です
英語を読むのが面倒な方向けに書きました

# 前提
すでにSpring Bootを使用したプロジェクトの作成および、HTMLの記述は済んでいることを前提とします

この記事は、上記の作業が済んだ上で「TailwindでCSSを記述したい」となった時の行動を想定しています

# 導入方法
## Tailwindをインストールし、初期設定を行う
以下のコマンドを実行する
```sh
npm init

npm i -D tailwindcss

npx tailwindcss init
```

Tailwindを適用するために、contentを以下のように書き換える
```js:taiwind.config.js
module.exports = {
  content: ["./src/main/resources/templates/**/*.{html,js}"],
  theme: {
    extend: {},
  },
  plugins: [],
}
```

ルートディレクトリ配下にstylesディレクトリを作成し、以下のようにinput.cssを生成する
```css:styles/input.css
@tailwind base;
@tailwind components;
@tailwind utilities;
```

## 実際にCSSを当てる

HTMLにTailwindの記法で、CSSの定義を書き込む
```html:tailwind.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>Tailwind</title>
  <link rel="stylesheet" th:href="@{/css/main.css}" />
</head>
<body>
  <p class="text-blue-700">Tailwindを入れたよ！</p> <!-- text-blue-700はTailwindの記述 -->
</body>
</html>
```

以下のコマンドを実行し、HTMLの定義から、実際に反映するCSSが作成する
```sh
npx tailwindcss -i styles/input.css -o ./src/main/resources/static/css/main.css
```

これで、CSSが反映された状態になるので、あとは起動して見た目を確認するだけでOKです！

# 注意点
以下のように新しい定義を記載した際には、再度以下のコマンドを打ち込む必要があります
```html:tailwind.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>Tailwind</title>
  <link rel="stylesheet" th:href="@{/css/main.css}" />
</head>
<body>
  <p class="text-blue-700">Tailwindを入れたよ！</p>
　　　　<p class="text-green-500">内容を更新したよ！</p> <!-- 新しい記述 -->
</body>
</html>
```
```sh
npx tailwindcss -i styles/input.css -o ./src/main/resources/static/css/main.css
```

編集するたびにコマンドを打つのが面倒な場合、以下のコマンドを打てば、自動でCSSを生成し続けてくれます
```sh
npx tailwindcss -i styles/input.css -o ./src/main/resources/static/css/main.css --watch
```
【Mantine】カレンダーの土曜日を青文字にする（v6対応版）

先日、[【Mantine】カレンダーの土曜日を青文字にする（v5対応版）](https://qiita.com/goqsystem_nagaoka/items/8afe0f0f476d031f02a6)という記事を書きましたが、3月にリリースされたv6にアップデートしてみたところ、propsから`dayStyle`が削除されて`getDayProps`を使えとのことだったので、今回はv6でカレンダーの土曜日を青文字にする方法を紹介します。

> DatePicker (previously Calendar) component no longer supports dayClassName and dayStyle props – use getDayProps instead

https://mantine.dev/changelog/6-0-0/#mantinedates-breaking-changes

## 前提
Mantineのバージョンについて 6系 を前提としています。

## 結論
最終的なコードとしては下記のようになりました。

```tsx
<DatePicker
  getDayProps={(date) => {
    if (date.getDay() === 6) {
      return {
        sx: (theme) => ({
          color: theme.colors.blue,
        })
      }
    }

    return {}
  }}
  firstDayOfWeek={0}
  weekendDays={[0]}
  monthLabelFormat="YYYY年MMM"
  locale="ja"
  value={value}
  onChange={setValue}
/>
```
前回と比較して行数は増えたものの、複雑さがなくなり可読性が高くなったと思います。  
![スクリーンショット 2023-04-27 22.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359978/b35d6b33-7b02-4124-6513-a10485ab81ba.png)
簡単に差分を紹介していきます。

### 週始めの曜日設定
`string`だったのが、`number`に変わりました。

```diff:週始めの曜日設定
- firstDayOfWeek="sunday"
+ firstDayOfWeek={0}
```
↓ここの設定
![firstdayofweek.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359978/ec85bcd3-86bd-4d14-b0b4-39f5ab773a3f.png)
### カレンダー上部の年月表示Label設定
`labelFormat`から`monthLabelFormat`に変わりました。

```diff:Label設定設定
- labelFormat="YYYY年MMM"
+ monthLabelFormat="YYYY年MMM"
```
↓ここの設定
![label.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359978/45b33154-28ed-15d7-ff6a-e998fccb0630.png)
### 文字色設定
わざわざ、同月外の文字色(`outside`)や選択された場合の文字色(`selected`)を意識する必要がなくなりました。（指定できないから、`getDayProps`では青文字対応できないかと思っていたのでびっくりしました。）

```tsx
// v6
getDayProps={(date) => {
  if (date.getDay() === 6) {
    return {
      sx: (theme) => ({
        color: theme.colors.blue,
      })
    }
  }

  return {}
}}
// =======================
// v5
dayStyle={(date, modifiers) => {
  if (date.getDay() !== 6 || modifiers.outside === true) {
    return {}
  }

  const color = modifiers.selected ? 'white' : 'blue'
  return { color }
}}
```
## その他
v6へのアップデートにより`@mantine/dates`のコンポーネントがだいぶ追加されているので、v5で利用されていた方は一度確認してみてはどうでしょう。
![date_components.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359978/8b93f9db-53e1-267f-c632-d7820138f8ca.png)


## 参考リンク
- [Change log Version 6.0.0](https://mantine.dev/changelog/6-0-0/#mantinedates-breaking-changes)
- [DatePicker](https://mantine.dev/dates/date-picker/)

## 最後に
### GoQSystemでは一緒に働いてくれる仲間を募集中です！
ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site/?qiita=ca5a473f2f9dbcf21ff7