OmniAICreator/Qiita-1.07M huggingface dataset:
文字列から特定文字を除去する(SPSS Modeler データ加工逆引き2-1)

# 文字列から特定文字を除去（文字列置換）

![スクリーンショット 2022-06-15 17.44.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f3f29e74-a468-1d71-8f9b-3d1abf00119b.png)

この記事は以下のブログをもとに作成されています。詳しく解説されていますのでご覧ください。

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-02/

## 1.想定される利用目的
・カンマを含んだ文字列の金額を計算できるようにする
・設備保守記録から特定文字列を利用する際に特殊記号を整える

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/replace.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-06-15 17.44.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/497b5fe3-09bc-3a8c-238e-c9e93a4269d5.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-06-15 17.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/70eb6d6a-4554-fb77-25ca-455569ce65a2.png)

b.[フィールド作成]ノードを編集します。「Modelerデータ加工Tips#02」で説明されている通り、カンマ=[","]を文字なし=[""]に置換える[replace（文字列1,文字列2,フィールド）]を利用します。
![スクリーンショット 2022-06-15 18.22.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1c892477-a627-0a79-ce67-01e1047abbba.png)

式ビルダーの文字列関数を利用すると簡単に入力できます。
![スクリーンショット 2022-06-15 18.24.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1485c2a7-08b2-44ca-1ad6-b5043b37eede.png)

c.文字列を計算可能な整数に変換します。関数は[to_integer(フィールド)]です。
![スクリーンショット 2022-06-15 17.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5cfa131e-eab8-fa2e-ab9b-f23a86abed33.png)

d.[テーブル]を確認します。
![スクリーンショット 2022-06-15 17.57.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/78cd1f94-d9cd-580d-fc40-9ccf8956c12d.png)

e.二つの関数を組み合わせて一度に元フィールドを[置換]ノードで置換えます。
![スクリーンショット 2022-06-15 18.25.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a3004c4f-394d-a85c-e5bf-45cb833bab24.png)


f.[テーブル]を確認します。
![スクリーンショット 2022-06-15 17.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d2952338-e7cc-1db4-7adf-d230fe04cf29.png)

#### 注意事項

CHAR:Character(文字)は、バッククォートで囲む
STRING:Strings(文字列)は、ダブルクォートで囲む

## 4.参考情報

#### よく使う「日付と時間」関数

https://qiita.com/Makimaki2020/items/35ab02a7375325e678c1

#### 正規表現

https://qiita.com/kawada2017/items/c0480bc2b3dcc9cd7be6

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
TypeError - no implicit conversion of nil into String エラーの解消

# エラーの状況
```ruby
class XXX
 def XXX
  content = ''
  content << @user.name
  return content
 end
end
```
空のstringクラスのcontentに、@user.nameで取得した値（今回の場合はnil）を結合して、そのcontentを返すメソッドをあるモデルに定義したが、`TypeError - no implicit conversion of nil into String` が発生した。nilからstringへの暗黙の変換はないとのこと。

# TypeErrorとは
リファレンスから引用。

>メソッドの引数に期待される型ではないオブジェクトや、期待される振る舞いを持たないオブジェクトが渡された時に発生

contentのメソッド<<にnilが渡されていることが原因か？

# Stringのインスタンスメソッド <<
```ruby
# 例
content = ''
content << "tomato"
p content
# => "tomato"
```
引数で与えられた文字列を破壊的に連結するメソッド。
引数には文字列か０以上の整数を渡すことができる。

# エラー解消方法 nilガード
上記より、contentのメソッド<<にnilが渡されていることがエラーの原因である。
nilガードを用いて、引数に渡すオブジェクトがnilの時は空の文字列を渡すようにする。
```ruby
class XXX
 def XXX
  content = ''
  content << @user.name ||= ''
  return content
 end
end
```
nilガードとは、@user.nameがnilやfalseでない場合は@user.name、@user.nameがnilの場合は　||=　の右側の値を代入するもの。

# エラー解消までの流れ
1 エラー文をググる(TypeErrorやno implicit conversion of nil into String)
2 nilを渡してはいけないところで渡していることが原因と当たりをつける
3 デバッグなどで@user.nameがnilであることを確認する
4 Stringメソッド<<をググる
5 メソッド<<にはnilを渡せないことがわかったためnilガードを用いる

# 参考URL
https://docs.ruby-lang.org/ja/latest/class/TypeError.html

https://docs.ruby-lang.org/ja/latest/class/String.html#I_--3C--3C
日付の列から曜日の列を作成する(SPSS Modeler データ加工逆引き1-3)

# 日付の列から曜日の列を作成（曜日算出）

![スクリーンショット 2022-06-14 12.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c4eb432a-3a03-74bb-2ec0-1f8bd204fc48.png)

## 1.想定される利用目的
説明変数として利用するために日付から曜日フィールド(列)を作成する

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/weekday.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-06-14 12.54.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/871bfa45-b518-2fa5-016c-30f3024c0b58.png)

①入力するデータは以下の通りです。
![スクリーンショット 2022-06-14 12.58.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b0e2a4b5-2bc6-e2be-59bc-29d7d97c143f.png)

②[フィールド作成]ノードを編集します。[datetime_weekday(フィールド)]で日付から曜日を作成します。1が日曜日で2が月曜日、7が土曜日を意味します。
![スクリーンショット 2022-06-14 12.59.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cafdbd4b-95d8-9e07-3c5a-6f0779c5497b.png)

式ビルダーの日付関数を利用すると便利です。
![スクリーンショット 2022-06-14 13.01.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8946a59a-b17e-8fd0-55f4-ef4ca46bfc16.png)

③曜日を数字から文字でラベリングするために、[データ型]で一度メンバーを認識します。はじめて利用するときには赤枠の値の読み込みボタンを使って、値のメンバー（青枠）を確認します。
![スクリーンショット 2022-06-14 13.04.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3f05c226-7229-4fe3-cf62-f17da4ee6039.png)

④[データ分類]ノードで[1]を[1_日曜日]にラベリングします。
![スクリーンショット 2022-06-14 13.13.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2c980ef5-ad66-ecb9-1454-2ff44bc373d1.png)

[データ分類]ノードは以下の記事で詳しく解説しています。

https://qiita.com/416nishimaki/items/794fab983057aeb17280

[テーブル]を確認します。曜日の算出とラベル付けが出来ています。
![スクリーンショット 2022-06-14 13.29.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f94f0786-33d5-bab6-d445-1825fcc90ca8.png)

#### 注意事項

[データ型]はストリームが出来てしまえば不要ですが[データ分類]ノードがメンバーを認識するのに必要です。
また[データ分類]がうまく動作しないときには[元の値]と[新しい値]の双方が空白にする行を重複させていないか確認してください。



## 4.参考情報

#### 曜日判定を解説している記事

https://qiita.com/kawada2017/items/c41f443e5246d331bea1#5m-%E6%9B%9C%E6%97%A5%E5%88%A4%E5%AE%9Amodeler%E7%89%88

#### よく使う「日付と時間」関数

https://qiita.com/Makimaki2020/items/72e3b774039327fa4ac4

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
２つの日付の列から差の列を作成する(SPSS Modeler データ加工逆引き1-4)

# ２つの日付の列から差の列を作成（日付の差）

![スクリーンショット 2022-06-14 15.58.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/31d2b377-710e-71a1-2c78-3977866fae40.png)


## 1.想定される利用目的
・入会日から存続期間を求めるなどの特徴量を作成する
・部品が設備に取り付けられてから検査対象になるまでの期間を求める

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/daysdifference.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-06-14 17.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4b0f87ed-b6d1-d0ee-e09a-a22e6846c0e0.png)

①入力するデータは以下の通りです。
![スクリーンショット 2022-06-14 17.52.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8bb22e07-957b-2b40-4fc4-a3952d425909.png)


②[フィールド作成]ノードを編集します。[date_days_difference(フィールド1,フィールド2)]でフィールド1からフィールド2までの日数を返します。
![スクリーンショット 2022-06-14 17.56.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bce56f75-9960-406f-8619-f8c2bd0b5da8.png)

式ビルダーの日付関数を利用すると便利です。weeks,months,yearsのバージョンもあります。
![スクリーンショット 2022-06-14 17.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0933176b-255d-ccc7-6a03-e4847ee57921.png)

③対象日が欠損値nullの場合には対象日を今日[@&#xFFF0;today]に置換えます。
![スクリーンショット 2022-06-14 17.58.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c0584979-7c7e-bba3-77a3-c4eae8c3b527.png)

[置換]ノードは以下の記事で詳しく解説しています。

https://qiita.com/416nishimaki/items/8c0b22ba0e79c32f94e1

[テーブル]を確認します。欠損値を考慮した経過日数が計算されています。
![スクリーンショット 2022-06-14 18.03.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/acddf2d3-b92c-7d0e-bd8f-daa4b927ecb1.png)


#### 注意事項

date_days_differenceを年(years)や月(months)に変更して扱う時には注意が必要です。浮動小数点が現れるため整数化したくなりますが、[経過月数整数化]のように誤差が生じます。

![スクリーンショット 2022-06-14 18.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cdeba50d-5bc3-a263-8a27-d1465c55fe70.png)


対処方法として[経過月数整数化2]は以下の記事の方法で作成しました。サンプルストリームにも含めています。

https://qiita.com/kawada2017/items/c41f443e5246d331bea1#7m-%E5%B9%B4%E6%9C%88%E3%81%AE%E5%B7%AE%E3%81%AE%E8%A8%88%E7%AE%97modeler%E7%89%88



## 4.参考情報

#### よく使う「日付と時間」関数

https://qiita.com/Makimaki2020/items/72e3b774039327fa4ac4

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
日付の列から年月の列を作成する(SPSS Modeler データ加工逆引き1-2)

# 日付の列から年月の列を作成（年と月の文字列結合）

![スクリーンショット 2022-06-14 17.47.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a0ace8ab-3427-e8d9-0163-b2353f5f29d2.png)


## 1.想定される利用目的
年月を集計する際のキーとなるフィールド(列)を作成する

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/startstring.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-06-09 17.54.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/67e0928f-823e-46a1-c0da-fbf389b51ad2.png)

①入力するデータは以下の通りです。
![スクリーンショット 2022-06-09 18.47.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/322dcf59-0db3-8501-fc4d-41cbda710ef3.png)


②[フィールド作成]ノードを編集します。[to_string(フィールド)]で日付を文字列に変換してから前方7文字を抽出します。
![スクリーンショット 2022-06-09 17.55.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c34edad7-6230-af03-c538-be0ab8599d8f.png)

式ビルダーの文字列関数を利用すると便利です。
![スクリーンショット 2022-06-09 17.56.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/56f82417-83a9-6707-c548-e388683d3c12.png)

③先頭４文字と先頭から6番目から2文字のふたつを[><]で文字列結合する方法もあります。
![スクリーンショット 2022-06-09 17.56.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/016887c3-1fec-c074-5477-4935ad4446c4.png)

式ビルダーの文字列関数を利用すると便利です。
![スクリーンショット 2022-06-09 17.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1802de4e-f22d-e898-004a-e26a4baa789f.png)

[テーブル]を実行するとふたつのフィールドが出来ています。
![スクリーンショット 2022-06-14 13.33.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a2d64e9b-bca6-3e57-73bb-994a7a299018.png)



#### 注意事項

逆引き1-1で取り上げた年月日の分解を利用する方法がありますが、以下のように[><]で単純結合すると桁ずれしソート時に問題が生じます。

![スクリーンショット 2022-06-09 18.33.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fcdaca2f-c9e9-9269-3989-5eea413a68c9.png)

12月が1桁多くなっています。

![スクリーンショット 2022-06-09 18.31.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6ce6bd84-fcf0-9184-beca-05f5b226de18.png)

条件文で1桁月の場合には[0]を挿入して結合するようにします。

![スクリーンショット 2022-06-09 18.33.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ac6196e6-601e-d3ef-a889-d4ed2898115a.png)

正しく作成されました。
![スクリーンショット 2022-06-09 18.36.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d8696592-8eb0-ef38-0531-50be97048464.png)

＊桁ずれも含めた上記ふたつのバージョンもサンプルストリームに含まれています。

## 4.参考情報

#### よく使う「文字列」関数

https://qiita.com/Makimaki2020/items/35ab02a7375325e678c1

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee
日付の列から年/月/日の列を作成する(SPSS Modeler データ加工逆引き1-1)

# 日付の列から年/月/日の列を作成（年月日を分解する）

![スクリーンショット 2022-06-14 17.43.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1a27a42e-210e-25d3-48ef-50c1317c1df0.png)

## 1.想定される利用目的
年や月や日で集計する際のキーとなるフィールド(列)を作成する

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/datetime_year.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-06-09 12.56.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/eab6a822-81ea-a70b-3aba-010efe25d4e7.png)

①入力するデータは以下の通りです。
![スクリーンショット 2022-06-09 13.00.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d1311abf-5af9-07fc-341c-3351b228abc4.png)

②[フィールド作成]ノードで以下のように日付関数を利用します。
![スクリーンショット 2022-06-09 12.59.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/993f099d-e0ea-d9b5-e02b-9a2228c689fd.png)

式ビルダーの日付関数を利用すると便利です。
![スクリーンショット 2022-06-09 13.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f96799fb-c1d3-ba99-feed-d3f94ffae80a.png)

③日付から[月]を取り出す関数は　datetime_month(日付) です。

④日付から[日]を取り出す関数は　datetime_day(日付) です。

⑤分解した要素を再結合する場合は以下の通りです。

![スクリーンショット 2022-06-09 12.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2c2887d6-a08c-0f31-c4cb-bc50aaac6359.png)

[デーブル]ノードを実行します。分解と統合が出来ています。
![スクリーンショット 2022-06-14 13.31.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d5f1568e-5460-5ed8-7677-f42b57a4fea6.png)


#### 注意事項

入力時点でストレージが[日付]で設定してあります。
![スクリーンショット 2022-06-09 12.58.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7ba4acb1-0cd8-6b31-ab62-61ae2e8bd3cd.png)

[データ型]タブで日付はカレンダーのアイコン（＝日付のストレージとして扱われています）。もしも文字列で日付が読み込まれていた場合には[to_date(フィールド)]関数で日付にストレージを置換しておけば問題なく利用できます。

![スクリーンショット 2022-06-09 13.37.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/dd8dc17e-d1ae-de14-1855-cbdf083ee1db.png)

サンプルストリームには日付ストレージを利用せず文字列のまま処理するバージョンも準備しています。
![スクリーンショット 2022-06-09 13.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/85bed0f9-2fef-4161-1f07-f2297ff5cee8.png)


## 4.参考情報

#### 日付や時刻を年,月,日や時,分,秒に分解したい場合

https://qiita.com/Makimaki2020/items/72e3b774039327fa4ac4#%E6%97%A5%E4%BB%98%E3%82%84%E6%99%82%E5%88%BB%E3%82%92%E5%B9%B4%E6%9C%88%E6%97%A5%E3%82%84%E6%99%82%E5%88%86%E7%A7%92%E3%81%AB%E5%88%86%E8%A7%A3%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88

#### タイムスタンプの年、月、日、時、分、秒の分解　

https://qiita.com/kawada2017/items/0546580314f5b67408b1#4m-%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E3%81%AE%E5%B9%B4%E6%9C%88%E6%97%A5%E6%99%82%E5%88%86%E7%A7%92%E3%81%AE%E5%88%86%E8%A7%A3modeler%E7%89%88

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
php で csv を読み込む上での備忘録

# はじめに

仕事で Laravel 内でcsv を読み込むコードを作成したのでその上で知ったことに関して備忘録代わりにこちらで記載しておきます。

# Shift-JIS な CSV を読み込む

windows 向けを前提とした CSV の場合、 **Shift-JIS**  の CSV を扱うことになるかと思います。

その際、php 側は utf-8 で動いているような状態であるなら、当然ながら文字コードの変換が必要になります。

php において文字コードの変換の手法はいくつか存在しますが、保存されているファイルを読み込むような場合においては、以下の様に書くことで一行で文字コードの変換フィルターをかけたうえで読み込むことができます。

```php
$path = '(本来のCSVファイルのパス)';
$file = new \SplFileObject('php://filter/read=convert.iconv.cp932.utf-8/resource=' . $path);
```

```php://filter``` については **php 入出力ストリーム** で検索をすると、```read```に設定するフィルタの記法については **php 変換フィルタ** で検索するとより深い理解が得られます。

# BOM 付き UTF-8 な CSV を読み込む

BOM 付き UTF-8 の CSV は一般的なエディタや excel で扱っている間は普通のCSVと同じように表示されますが、実際に php 上でファイルを読み込む場合には BOM を処理する必要があります。

たとえば、以下の様なデータを用意し、

```
id,name,age
1,"山田 太郎",34
2,"田中 花子",42
3,"佐藤 博之",51
```

何の処理もせずに以下の様にファイルを読みだしてみるとします。

```php
$file = new \SplFileObject(Storage::disk('local')->path('tmp_csv/' . $privateFilename));
$file->setFlags(
    \SplFileObject::READ_CSV |
    \SplFileObject::SKIP_EMPTY |
    \SplFileObject::READ_AHEAD
);
$header = $file->fgetcsv();
```

このように読み込んだ $header をログに出力してみると以下の様になります。

```php
array (
  0 => '�﻿﻿id',
  1 => 'name',
  2 => 'age',
)
```

内容を見てわかる通り、先頭の3バイトの BOM の記載が一緒に読み込まれることで、一つ目の文字列が余計な記載が付いた文字列として認識されます。

こちらについては単純に、以下の様に BOM を除去することで対応が可能です

```php
$header[0] = preg_replace('/^\xEF\xBB\xBF/', '', $header[0]);
```

UTF-8 以外の文字コードで BOM が存在する場合、BOM となる先頭部分が UTF-8 のものとは変わりますので、扱う文字コードの BOM を確認したうえで除去を行ってください。
【JavaScript】オブジェクトの同じ階層の別のキーの値を取得する【json】


課題
-

以下のようなオブジェクトがあるとします。
```javascript
const obj = {
  "data": [
    {
      "first_name": "田中",
      "last_name": "太郎"
    },
    {
      "first_name": "鈴木",
      "last_name": "次郎"
    },
    {
      "first_name": "佐藤",
      "last_name": "三郎"
    }
  ]
}
```
オブジェクトの同じ階層の別のキーの値を取得したい。
例えば、`田中`という値から、`太郎`という値を取得


解決方法
-

```javascript
const keyword = "田中"
const result = obj.data.filter(x=>x.first_name==keyword).map(x=>x.last_name)[0]??null;
console.log(result);
// 太郎
```

一般化 & 関数化する
```javascript

const find = (data, keyword, key1, key2) => {
  return data.filter(x=>x[key1]==keyword).map(x=>x[key2])[0]??null;
}

find(obj.data, "田中", "first_name", "last_name")
// 太郎
```
Swiftではじめに学ぶ「変数と定数」

## 変数と定数とは
<strong>プログラムに登場する値を記憶しておく入れ物、つまり一時的な保管庫</strong>のことです。
ある処理の結果を、この変数や定数に保存しておけば、後々その結果を使いたいタイミングで呼び出して再利用することができます。

ちなみに変数や定数に値を入れることを、<strong>「値を代入する」</strong>と言います。
そして文字通り、<strong>変数には何度でも値を代入することができ、定数には１度だけしか値を代入することができない</strong>ルールがあります。</strong>ですので、プログラム上で確定している値に定数を使えば今後の処理で誤って別の値が代入されることこともないので安心です。つまり上手く使い分けることで、安全で可読性の高いプログラムが書けるようになります！

表記の仕方は下記のようです。
```swift:
var number = 123 //変数numberに値「123」を保存している
let age = 16     //定数ageに値「16」を保存している
```
・「var」は変数を、「let」は定数を指します。
・それぞれの後ろにある「number」と「age」は、任意で決められる変数や定数の名前です。これをつけることで、何の値なのか分かりやすくします。

### 変数名と定数名をつける時のルール
適切な名前の共通認識を作るための公式ガイドライン「API Design Guidelines」というものがあります。
* 基本的にアルファベットと数字を使う。（ひらがなや漢字、⚠️などの絵文字も使える）
* 変・定数名はlower camel caseの記述方式で書く。
　「userName」小文字で書き始め、単語ごとに大文字で区切る書き方をする。
* 型は、upper camel case方式で書く。
　「CamelCase」のように大文字で始まりとする書き方。
* あいまいさの解消に必要な単語は全て含める。
* 一般的でない単語は避ける。
* 略語は避ける。

https://www.swift.org/documentation/api-design-guidelines/

## 変数と定数の宣言方法
新たな変数や定数を値を定義することを、変数や定数を「宣言する」と言います。
宣言するには、それぞれ下記のように書きます。
```swift:変数の宣言
var 変数名: 型名
```
```swift:定数の宣言
let 定数名: 型名
```

### Swiftの基本的な型
上で出てきた「型名」では、代入されるべき値が文字なのか数字なのかといった、代入される値の型を決めています。

```swift:Swiftの基本的な４つの型
//文字列　String型
let string: String = "tomato"  //文字列は”で囲む

//整数　Int型
let int: Int = 1 

//浮動小数点型　Double型
let double: Double = 0.1

//真偽値型　Bool型
let bool: Bool = true  //trueかfalseのどちらか
```

⚠︎指定した型と代入する値の方が異なると、コンパイルエラーになります。
（例えばInt型の定数に文字列を代入する　など）


### 型推論
変数や定数の宣言をすると同時に値を代入すると、値から型を推測してくれます。
この文脈から決定してくれる仕組みを「型推論」と言います。

```swift:型推論
let a = 123   //Int型の定数
let b = "abc" //String型の定数
```

### 型の確認方法
省略された型を確認する方法もあります。
type(of: 式)　を使うことで実行した時に式の型を返してくれます。
```swift
let a = 123
type(of: a) //Int.type
```

XcodeにはQuick Helpというプログラムの編集中に変数や定数の型を確認する機能があります。


## さいごに
初心者が学んだことをまとめてみました。
誤認している箇所などあれば教えていただけると嬉しいです。
Swagger-UIでプルダウンでYAMLファイルを切り替える (API_URLS)

## 概要
下記のように１つのサービスで複数のAPIが存在する場合、
定義書(yamlファイル)を１つのSwagger-UIで扱えないか調べたのでメモする。

```
例) サンプル
・① サービス運営API 
  ※ サービス運営側のスタッフがアクセスする管理用のAPI

・② 企業管理API
  ※ 契約企業のスタッフがアクセスする管理用のAPI

・③ 店舗管理API
  ※ 契約企業の各店舗のスタッフがアクセスする管理用のAPI

・④ フロントAPI
  ※ 一般ユーザーがアクセスするホームページやアプリ用のAPI
```

## 準備
Swagger-UIを使うため、docker-compose.yamlファイルを用意する。
```yaml: docker-compose.yaml
version: '3'
services:
  # Swagger (API仕様書)
  swagger-company:
    image: swaggerapi/swagger-ui
    volumes:
      - ./service.yaml:/usr/share/nginx/html/service.yaml  # サービス運営API
      - ./company.yaml:/usr/share/nginx/html/company.yaml  # 企業管理API
      - ./shop.yaml:/usr/share/nginx/html/shop.yaml        # 店舗管理API
      - ./front.yaml:/usr/share/nginx/html/front.yaml      # フロントAPI
    environment:
      API_URL: service.yaml
    ports:
      - "8081:8080"
```
dockerコンテナを起動する。
```bash
$ docker-compose up -d
```
ブラウザでアクセスしてみる。
```bash
$ open http://localhost:8081
```
![スクリーンショット 2022-06-22 10.40.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142279/46e99d32-2bca-c1e1-e7a7-68564a937ef0.png)
「company.yaml」に書き換えて「Explore」ボタンを押すと切り替えできるようです。
![スクリーンショット 2022-06-22 10.40.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142279/c14137bf-d56b-14e3-a206-c8c22e4f11ab.png)
切り替えはできるが、YAMLファイルを知らないと使い難いですね（＾＾；）

## 各APIをプルダウンで切り替えできるようにする
ドキュメントを見てみると「`URL`」以外に「`URLS`」というものが存在するようです。
https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md
![スクリーンショット 2022-06-22 10.43.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142279/73222964-9fe0-96ee-7bd4-d08b2a73c42f.png)
そこで、「`API_URLS`」を追加してみる。
```yaml: docker-compose.yaml
version: '3'
services:
  # Swagger (API仕様書)
  swagger-company:
    image: swaggerapi/swagger-ui
    volumes:
      - ./service.yaml:/usr/share/nginx/html/service.yaml
      - ./company.yaml:/usr/share/nginx/html/company.yaml
      - ./application.yaml:/usr/share/nginx/html/application.yaml
      - ./front.yaml:/usr/share/nginx/html/front.yaml
    environment:
      API_URL: system.yaml
      API_URLS: '[{name: "サービス運営API ", url: "service.yaml"},{name: "企業管理API", url: "company.yaml"},{name: "店舗管理API", url: "shop.yaml"},{name: "フロントAPI", url: "front.yaml"}]'
    ports:
      - "8081:8080"
```
dockerコンテナを再起動してみるとプルダウンが表示されるようになりました。
```bash
$ docker-compose down
$ docker-compose up -d
```
![スクリーンショット 2022-06-22 10.46.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142279/e07740d8-62cf-29f3-a41d-4928eaea3a9f.png)
※ URL入力がプルダウンに切り替わりました

![スクリーンショット 2022-06-22 10.47.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142279/a840967f-a42d-c97f-b15e-c2ba020358b4.png)
※ 定義したURL一覧が表示されて簡単に切り替えられるようになりました

## まとめ
知らないだけで、便利なパラメータがあるんですね...

以上
正規表現の活用法を学ぶ

# はじめに
正規表現は活用できると文章処理作業の効率UPにつながります！  
基本的な正規表現を身に付けて  
正規表現を活用していきましょう！

## 正規表現の基礎  
下記、携帯番号の正規表現を例に
それぞれの働きを見ていきましょう！ 
 
携帯番号の正規表現　`^0[789]0-\d{4}-\d{4}$` 
 
＾：ハット…直後の文字が行の先頭であることを指定したいときに使用  
[]:角括弧…角括弧内のいずれかの文字一文字を表す
\d：バックスラｄ…半角数字一文字
{n}:波括弧…直前のパターンをｎ回繰り返す  
$:ダラー…直前の文字が行の末尾であることを指定したいときに使用  

### 実際に正規表現を使ってみよう！  
テキストエディタ（例）
```java:sample.txt
suzuki 080-1111-1111
sato 070-2222-2222
yasuda 090-3333-3333

080-4444-4444 tanaka
070-5555-5555 yamada
090-6666-6666 tagawa
```

１.`grep`コマンドを使用して、携帯番号を抽出を試みますが…
```java:
# grep -P '^0[789]0-\d{4}-\d{4}$' sample.txt
```
２．抽出結果なし
```java:
# 
```
理由は`sample.txt`の中身は、行の先頭も末尾も数字４桁の行がないため
指定した正規表現ではヒットするものがありませんでした。　　


３．再度、正規表現を修正してコマンド実行 <font color="Red">(先頭の「＾」削除)</fon>
```java:
# grep -P '0[789]0-\d{4}-\d{4}$' sample.txt
```

４．抽出成功！
```java:
suzuki 080-1111-1111
sato 070-2222-2222
yasuda 090-3333-3333
```
末尾が数字４桁の３行のみ抽出に成功しました。

#### 正規表現可視化ツール **<font color="Blue">Regulex</fon>**
イメージしにくい正規表現を可視化するツールです。
**<font color="Blue">Regulex</fon>**　は
わかりにくい表現を可視化してくれます。
ぜひ一度使ってみてはいかがでしょうか。
Laravel test実行時にはconfig:cacheは要注意

# はじめに
Laravelでtest実行した際にconfig:cacheが原因で全データが消えてしまった

# version
```json:composer.json
       "laravel/framework": "5.5.*",
```

# 原因
config:cacheを実行すると、.envのキャッシュが生成されてしまう

phpunitで以下のとおり`APP_ENV`を変更していたとしても、
キャッシュの値が優先して使用されてしまう

```xml:phpunit.xml
        <env name="APP_ENV" value="testing"/>
```

テスト時に、databaseをrefreshするため、
開発中のデータが全て消えてしまいました

# 対策

キャッシュされているconfigを削除

```bash
php artisan config:clear
```

# さいごに
開発環境では、`config:cache`はしない
mac起動後の初回gitコマンドで表示されるエラーの解消

mac起動後の最初のgitコマンド実行時にこのようなエラーが表示されるときの解消方法

```
Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionSentinelHostApplications for extension Xcode.DebuggerFoundation.AppExtensionHosts.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
```

```
Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionPointIdentifierToBundleIdentifier for extension Xcode.DebuggerFoundation.AppExtensionToBundleIdentifierMap.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
```

### 解決方法

ここに情報がありました。
https://developer.apple.com/forums/thread/703233

### 以下抜粋

Remove CommandLineTools
```
sudo rm -rf /Library/Developer/CommandLineTools
```

Reinstall CommandLineTools
```
xcode-select --install
```

Select CommandLineTools
```
sudo xcode-select -s /Library/Developer/CommandLineTools
```
BizRobo!_Excelのセル値を検索し、値を取得する(名前付き範囲設定)

###処理概要###
今回、商品マスタ(下記の図)から商品コードを検索し、単価を取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/4b325441-4a6f-b2fd-8f1e-292c5debaa63.png)


###設定方法###
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/03dfbffb-2965-60c8-86af-2bc3cc24fcba.png)
割愛しております。

①「カレントウィンドウの設定」
　→ウィンドウビューに商品マスタが表示されるように設定します。

②「トライステップ」
　→後続の③「名前付き範囲選択」でExcel内に検索したい値が存在しなかった際に
　「名前付き範囲選択」がエラーとなるため「トライステップ」を設定します。

③「名前付き範囲選択」
　→Excelのセル値を検索するように設定します。
　
　・アクションタブ
　　範囲名を分かりやすくするために「自動」から「名前付き」に変更し、「商品情報」という名前を付けています。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/bc8dbfdf-2614-6e16-bd35-94745449ec8a.png)

　・エラー処理タブ
　　②の「トライステップ」に処理が遷移するようにThenを「次の代替手段を試行」、
　　次のステップを「(直近のトライステップ)」に変更します。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/391b862d-74ee-e861-0936-e554f2b3b2d3.png)

　・ファインダータブ
　　値を検索する範囲、使用を「一致するセル」、セルパターンを「検索したい値が格納されている変数」を設定します。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/bce88971-f2ed-f33d-1149-f13e52fe2cdb.png)

　・値が検索できた状態
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/896bc927-304c-0f45-66d3-5b5c2b746930.png)

④「セル値抽出」
　→③で検索できた行の単価を取得できるように設定します。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/fd1774d9-cf95-032c-9b13-e155d183b48b.png)
　
　設定された内容の確認
　・アクションタブ
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/40251fd0-d39c-dbfa-5a43-3e36acf7c254.png)

　・ファインダータブ
　　範囲が上記③で設定した「商品情報」の場所から列がオフセット2(商品コードの列から右へ2列)が設定されています。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/0d14a071-b59c-c698-4253-8663a8fea46b.png)

⑤エラー処理
　→③の「名前付き範囲選択」でエラーになった際の処理を設定します。
　例では「変数の割当」でエラーフラグを設定してます。


###まとめ###
「名前付き範囲選択」を使用すると特定セルを基準に値を取得することができるので、
覚える必要があるステップだと感じました。
BizRobo!_リストを使用して変換

###現在、BizRobo!の勉強中…###
業務でBizRobo!を使用することになり、
[BizRobo!PORTAL](https://portal.bizrobo.com/ja)や社内で用意されているコンテンツで、日々勉強しています。

その中でこんな機能があるんだと思ったものを紹介します。
その機能はコンバータの「リストを使用して変換」というものです。
この機能は下記のようなテーブルで
国名から通貨を取得するような時に使用することができます。

|国名|通貨|
|:---:|:---:|
|日本|円|
|アメリカ|ドル|
|中国|元|

以降の設定では「国名」を「変数の変換.国名」に設定し、
該当する「通貨」を「変数の変換.通貨」に変換するものになっています。


###設定方法###
１．ステップのアクションで値を設定する箇所でコンバータを選択します。
　　例では「変数の割当」ステップを使用しています。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/42b78611-0bca-7531-fe21-26073abf19dd.png)

２．変数を取得の修正を行うために「編集マーク」をクリックします。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/55a256de-3c87-e303-dbd8-f4aa4174b23e.png)

３．変数に変換したい変数を選択し、「OK」をクリックします。
　　例では「変数の変換.国名」を選択しています。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/1d1f0a51-81ba-5cbd-309b-52bbb4a5218b.png)

４．「変数の割当」ステップのコンバータから「＋」をクリックし、
　　その中の「リストを使用して変換」をクリックします。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/8f5cde1b-ee84-ed74-bba8-e97bb071404e.png)

５．変換に「変換したい項目=(半角イコール)変換後の項目」を入力します。
　　例では「日本=円」「アメリカ=ドル」「中国=元」と入力しています。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/36eade92-4025-3204-3a24-e36b22a9a73d.png)
　　また、変換したい項目が変換の項目にない場合の処理方法も設定することができます。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/496780d5-4154-7219-e03e-287988be2766.png)

７．「リストを使用して変換」の設定を終えたら、「OK」をクリックします。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/2aa8e6f3-b489-d8e6-a009-8721a5ca8967.png)

８．変換後の項目を格納する変数を選択します。
　　例では「変数の変換.通貨」を選択しています。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/7a1a527a-6b04-222a-94bc-e17d67708faf.png)

９．エンドステップをクリックし、処理できていることが確認してください。
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127851/0a5a7b85-19e1-7adf-8f8a-024313cb460f.png)


###注意点###
ほとんど更新のないテーブルの変換は本機能が使えるかと思いますが、
頻繁に更新があるようなテーブルで本機能を使用すると
ロボットファイルのメンテナンス頻度も上がるので注意が必要です。

頻繁に更新があるようなテーブルを参照する場合は
外部でExcel等でファイルを作成し、そちらを参照する方がいいと思います。
Cross Object formula:　参照関係がない場合の数式

回答例の英文として利用したい。

You will not be able to do that with a simple Formula field unless you created a custom Lookup(WorkOrder) field on the Quote object and pysically connect the 2 records to each other.  

With your current data maodel and object relationships as they are you'll need Flow or custom Code.


QuoteオブジェクトにカスタムLookup（WorkOrder）フィールドを作成し、2つのレコードを物理的に相互に接続しない限り、単純な数式フィールドでこれを行うことはできません。

現在のデータマオデルとオブジェクトの関係をそのまま使用するには、フローまたはカスタムコードが必要になります

[Cross Object formula:](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDqIZ)
ScaffoldMessenger エラー 解決方法

# 初めに
ScaffoldMessengerを使い、全画面に戻った際にSnackBarでアラートを表示しようとした際に、エラーが出た為、解決した方法を記述します。

# 解決方法

## エラー内容
ScaffoldMessengerを使うときは``context``に依存する為、なんかすごく大変ぽいです。
自分はこのここ理解できず、``ScaffoldMessenger``を使った方法では解決できませんでした。
```
FlutterError (Looking up a deactivated widget's ancestor is unsafe.
At this point the state of the widget's element tree is no longer stable.
To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.)
```

## 解決：　Fluttertoastパッケージを使う
``Fluttertoast``を使う事で、context等の難しいことは考えず、今回の処理を行うことができます!

### Fluttertostの追加
コマンドで下記を実行
```
flutter pub add fluttertoast
```

### コードを記述
``ScaffoldMessenger``の記述を下記のコードに書き換えればOKです!
```
Fluttertoast.showToast(
        msg: "This is Center Short Toast",
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.CENTER,
        timeInSecForIosWeb: 1,
        backgroundColor: Colors.red,
        textColor: Colors.white,
        fontSize: 16.0
    );
```
``gravity``の部分を変更すればメッセージの表示位置を変更したり、``backgroundColor``で背景色を変更もできるの、公式を参考にいじってみてください。
[参考URL]
https://pub.dev/packages/fluttertoast

# 終わりに
Twitterでも情報発信しておりますので、ぜひフォローお願い致します!
https://mobile.twitter.com/tatsuki_kt
pythonnetでPythonからDLLを呼び出す

今回は以前に業務でPythonファイルからC#DLLを使用しないといけない場面があったのでその時の備忘録です。

# DLL
今回は例として以下のようなコードのDLLを使用します。
```test.cs
public class Test
    {
        public static int Addiction(int a, int b)
        {
            int num;
            num = a + b;

            return num;
        }
            
    }
```
簡単な足し算をするプログラムです。
今回はインスタンス化しなくても呼び出せるように静的メソッドを定義しています。

# Python
Python 3.7.8

使用するDLLが32bitの時はPythonも32bitを使用するようにしてください。64bitのPythonでは32bitのDLLを使用することはできません。
## ライブラリ
題にも書いた通り、pythonnetを使用します
```bash
pip install pythonnet
```
## 実行ファイル
```test.py
# 以下3行でDLLの読み込み
import clr
clr.AddReference("読み込むDLLのパス")
from Test import Test

# TestクラスのAddictionメソッドを呼び出す
a = Test.Addiction(3, 5)
print(a)
```

# 実行してみる
```bash
python test.py
```
8と出力されれば問題なく動作しています。
【PHP】期間を指定すると、月初と月末を返してくれる関数を作ったよ

# 環境
php 8.0
# この記事の内容
開始年月YYYY-mmと終了年月YYYY-mmを渡すと、月初日と月末日を配列で返す関数をPHPで作りました。
```php:例
//例えばこんな値を渡すと
$from = '2021-04';
$to = '2022-03';

//こんな配列が返ってきます
[
    ['2021-04-01','2021-04-30'],
    ['2021-05-01','2021-05-31'],
    ['2021-06-01','2021-06-30'],
    ['2021-07-01','2021-07-31'],
    ['2021-08-01','2021-08-31'],
    ['2021-09-01','2021-09-30'],
    ['2021-10-01','2021-10-31'],
    ['2021-11-01','2021-11-30'],
    ['2021-12-01','2021-12-31'],
    ['2022-01-01','2022-01-31'],
    ['2022-02-01','2022-02-28']
]
```
# コードはこちら
詳しい説明は省略します。
```php:sample.php
class Period() 
{
		public function getPeriods($from, $to)
		{
				//from月の初日
			  $firstDayOfDateFrom = $from . '-01';
				//fom月の最終日
			  $lastDayOfDateFrom = date('Y-m-d', strtotime(substr($dateFrom, 0, 7) . 'last day of this month')); 
			
			  $array = [[$firstDayOfDateFrom, $lastDayOfDateFrom]];
			
			  if ($from == $to) {
			  //指定期間が1ヶ月のみだった場合
			      return $array;
			  } else {
			      $dateArray = Period::createMonthlyPeriod($array, $firstDayOfDateFrom, $to);
			      return $dateArray;
			  }
		}
		
		private static function createMonthlyPeriod(&$dateArray, $firstDayOfPreviousMonth, $dateTo)
		{
				//指定期間の最後の月でなくなるまで再帰
				if (substr($firstDayOfPreviousMonth, 0, 7) !== $dateTo) { 
		        $firstDayOfNextMonth = date('Y-m-d', strtotime($firstDayOfPreviousMonth . '+1 month'));
		        $lastDayOfNextMonth = date('Y-m-d', strtotime(substr($firstDayOfNextMonth, 0, 7) . 'last day of this month'));
		        $dateArray[] = [$firstDayOfNextMonth, $lastDayOfNextMonth];
		        Period::createMonthlyPeriod($dateArray, $firstDayOfNextMonth, $dateTo);
		    }
		    return $dateArray;
		}
}		
```
力技でねじ伏せた感は否めませんw

別の方法あったらぜひ教えてください！
VSCode上のターミナルでkubectl execで接続したshell上でctrl+Pが効かない問題を解決する


こちらの問題(https://github.com/kubernetes/kubectl/issues/1011)

kubernetesのコンテナにアタッチしてshell等を操作するときにctrl+Pが効かない。
「ctrl+P ctrl+P」のシーケンスがdetachに予約されているためらしい。
Dockerでは「--detach-keys」等のオプションでキーバインドを変更すれば解決するらしいがkubernetesではまだの様子。

少々強引だがiTermとVSCodeでの解決方法をそれぞれメモしておく

# iTermの場合
iTermの場合、iTerm全体でのキーバインドの設定ができるのでそこでctrl+Pを↑(カーソルキーの上)に対応するエスケープシーケンスに設定する。
キーバインドの設定ではカーソルキーを直接指定はできないのでエスケープシーケンスになる。
上キーとなるエスケープシーケンスは「\033[<N>A」でNに数字を入れるとN行になる。今回は一回なので「\033[A」となる。
iTermで設定するときはエスケープ部分は不要なので「[A」になる。
「Preferences->Keys->Key Bindings」を開いてキーバインドを追加する。
- Keyboard Shortcutを「ctrl+P」
- ActionをSend Escape Sequence
- Esc+を[A
これにより「ctrl+P」で上キー的な動作になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100838/fd8c5b36-1fe0-ca19-8d96-e88186fe0e55.png)

多分ターミナル上のすべての「ctrl+p」の動作を上書きしてしまうのでshellでの上キーの代わり以外で「ctrl+P」を使っている人は注意。多分大丈夫だと思うが。


# VSCodeのIntegrated Terminalの場合
自分はVSCode上のターミナルで作業するのでVSCode上でのターミナルでも解決したかった。
解決方法は同じでエスケープシーケンスを使う。
VSCodeでもターミナルにエスケープシーケンスを送れるのでこれを利用する。
ちなみに単純に「ctrl+P」を「cursorUp」にしてもだめだった。

下記設定を追加することで解決方法した。
```
 {
    "key": "ctrl+p",
    "command": "workbench.action.terminal.sendSequence",
    "args": { "text": "\u001b[A" },
    "when": "terminalFocus"
  }
```
VSCodeでは\u001bの形式で書く必要がある。
これでVSCode上のターミナルでkubernetesのコンテナにアタッチしても「ctrl+P」が上キー的な役割を果たせる様になった。


# 直近の問題
VSCode上のターミナルでtmuxを使うとtmuxのプレフィックスがVSCodeで吸収されてしまう。
Emacs系の拡張を使っていて、それをDisableにすると問題ないことは確認している。
自分のキーバインドに問題があるのも事実だがどうにかターミナル上だけ無視できないものか。
パンくずリストの作成 breadcrumbs

# 導入
パンくずリストの導入にはgretelというgemが便利。
```
gem 'gretel'
```
```
% bundle install
```
```
% rails g gretel:install
```
上記のコマンドで、configディレクトリ直下にbreadcrumbs.rbが作成される。

# パンくずリストの作成
例として、トップページ→投稿一覧→投稿詳細という階層のリストを作成する。
```ruby
crumb :root do
 link "Top", root_path
end

crumb :post_index do
 link "投稿一覧", posts_path
 parent :root
end

crumb :post_show |post| do
 link "投稿詳細", post_path(post)
 parent :post_index
end
```
対象のviewファイルに下記のように記載する。
```erb
<% breadcrumb :post_index %>
<% breadcrumb :post_show, @post %>
```

# 作成イメージ
[![Image from Gyazo](https://i.gyazo.com/c4c081a7d6707cb939c3dc9ca07d993d.png)](https://gyazo.com/c4c081a7d6707cb939c3dc9ca07d993d)
PowerBIでIBM CloudのDB2データを取得する

Power BIをIBM Cloudで稼働しているDb2に接続時、以下のような動きや現象で悩まされた事はありませんでしょうか？

<ul>
<li>Power BIがSSLで接続しようとしない</li>
<li>そもそもSSLで接続する設定が分からない</li>
<li>IBM提供のDb2ドライバーを使っているのに「DataSource.MissingClientLibrary: IBM DB2: 固定名 'IBM.Data.DB2' を持つデータベース プロバイダーが見つかりません」エラーで接続しない</li>
</ui>

IBM提供のドライバーを用いた場合、構成ファイルmachine.configの修正が必要でしたので、
実例として、C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config
を管理者権限のあるエディターでDbProviderFactoriesの部分を探し、近くにある「IBM DB2 .NET Data Provider」行のinvariant="IBM.Data.DB2.11.5.0"というような、バージョン部分を消し"IBM.Data.DB2"だけにし、保存します。

詳しい設定手順を弊社ブログで解説しました。
[https://alpcom.co.jp/blog/20220622/](https://alpcom.co.jp/blog/20220622/?utm_source=Qiita&utm_medium=post&utm_campaign=yas&utm_id=20220622)

構成ファイルmachine.configの修正には下記情報を参考にしました。
[Issue connecting Power BI Desktop to IBM DB2 database](https://community.powerbi.com/t5/Desktop/Issue-connecting-Power-BI-Desktop-to-IBM-DB2-database/td-p/108990)
【ServiceNow】San Diegoリリース　Flow Desginer「Try flow logic」について

ServiceNowの新バージョンであるSan Diegoが正式にリリースされました。
FlowDesignerの新機能である「Try flow logic」についてまとめました。

## Try flow logicとは
フローロジック内でエラーが発生した場合でも、フローの実行を継続できるようにする機能です。
javascriptのtry catch文と同じイメージで良いかと思います。

今までは自作アクションの中にtry catch文を実装していましたが、
今回のバージョンアップを機に、ローコードで実装できるようになりました。


Try flow logicを使用する場合、
既存のフローロジックであるIfやFor Eachと同様に入出力の指定は不要です。

またTryブロック内でエラーが発生した場合は、エラーとなったアクションのステータスが「Completed (error caught)」となります。

詳しくは製品ドキュメントを参照してください。

https://docs.servicenow.com/ja-JP/bundle/sandiego-application-development/page/administer/flow-designer/concept/flow-logic-try.html


## Try flow logicの使い方

①Actionフィールドの「＋」ボタン> Flow Logicをクリック> Tryをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/45a7080e-9e10-31ca-6ab9-3d4834843cd7.png)

➁Tryノードの中の+ボタンをクリックして、Tryブロック内で実行したいAction/ Flow Logic/Subflowを選択します。
　thenの横にある+ボタンをクリックして、Tryブロック内でエラーが発生した場合に実行する処理を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600769/e53df095-9963-7da5-f0a3-4e53335eba33.png)

## Try flow logicを有効的に使用する想定ケース
**OOTBのAction/ Flow Logic/Subflowを使用する場合**
カスタムで作成したアクション等には自前でエラー処理を追加することができますが、
OOTBのアクションに処理を追加することは推奨されていません。

ただ想定外のエラーが発生する可能性はあるので、
その対応策としてTry flow logicを使用すると効果が見込まれます。


**外部システムと連携する場合**
フローの中で外部システムとの連携をする場合、
ネットワークエラー等が発生するとレスポンスが返ってこない場合があります。
Try flow logicを使用して対策を立てておくことができます。
SwiftUI それぞれのView間で値を共有したい!!

# はじめに

SwiftUIではそれぞれのView間で値を共有するには、**<span>@</span>EnvironmentObject**を使用します。
今回のサンプルコードをビルドしたものがこちら
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/88f212c1-fd9b-14d0-9b26-bac46dc1ea1f.gif)

それぞれのViewで値を共有出来ているのが分かりますね!!

早速コードを見ていきましょう!!

### 1.共有したい値を定義する

```swift:ShareValue
import SwiftUI

class ShareValue: ObservableObject {
    
    @Published var isOn = false
    
}
```
EnvironmentObjectの使用するためには、classを**ObservableObject**に準拠させます。
値が更新された際にデータを受け取るために、**<span>@</span>Published**を付けるのも忘れずに行います。

### 2.値を共有したいViewを作成!!

```swift:FirstView
import SwiftUI

struct FirstView: View{
    
    @EnvironmentObject var shareValue: ShareValue
    
    var body: some View {
        HStack{
            Toggle(isOn: $shareValue.isOn) {
                Text("FirstView")
            }
            Text(shareValue.isOn ? "true" : "false")
        }        
    }
}
```
共有したい値を持ったクラスを **<span>@</span>EnvironmentObject**を使い定義します。

あとは共有したいViewを必要分用意します。(サンプルだと3つ作成)

### 3.ContentViewでまとめてViewを表示する!!

```swift:ContentView
import SwiftUI

struct ContentView: View {
    
    @StateObject var shareValue = ShareValue()//インスタンス生成
    
    var body: some View {
        VStack {
            FirstView()
            SecondView()
            ThirdView()
        }
        .environmentObject(shareValue)//重要です!!
    }
}
```
**<span>@</span>StateObject**でインスタンスを生成し、**.environmentObject(shareValue)**のモディファイアを宣言する事で、値を共有する事が出来ます!!

今の所この書き方が一番スマートだと思われるので、紹介しました!!

以上です!!
言語処理100本ノック解いてみた（4,5）毎朝やってますわ

## 問題４
```python
import re
string = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
re.sub('[-=+,#/\?:^.@*\"※~ㆍ!』‘|\(\)\[\]`\'…》\”\“\’·]',"",string)
strarr = string.split(" ")
arr = [1, 5, 6, 7, 8, 9, 15, 16, 19]
dict_res = {}
for i in arr:
  dict_res[i] = strarr[i-1][0]
for i in range(len(strarr)):
  if i+1 not in arr:
    dict_res[i+1] = strarr[i][:2]
print(dict_res)
"""　実行結果：{'Al': 15,
 'Ar': 18,
 'B': 1,
 'Be': 11,
 'C': 2,
 'Cl': 17,
 'F': 5,
 'H': 0,
 'He': 9,
 'K': 8,
 'Li': 10,
 'Mi': 14,
 'N': 3,
 'Na': 13,
 'Ne': 12,
 'O': 4,
 'P': 6,
 'S': 7,
 'Si': 16}"""
```
見た目悪いからordereddict　使おう。
```python
import collections
collections.OrderedDict(sorted(dict_res.items()))

"""実行結果：OrderedDict([(1, 'H'),
             (2, 'He'),
             (3, 'Li'),
             (4, 'Be'),
             (5, 'B'),
             (6, 'C'),
             (7, 'N'),
             (8, 'O'),
             (9, 'F'),
             (10, 'Ne'),
             (11, 'Na'),
             (12, 'Mi'),
             (13, 'Al'),
             (14, 'Si'),
             (15, 'P'),
             (16, 'S'),
             (17, 'Cl'),
             (18, 'Ar'),
             (19, 'K'),
             (20, 'Ca')])"""
```
## 問題５
```python
input_str = "I am an NLPer"
def bigram(string):
  alphabet = [string.replace(" ","")[i:i+2] for i in range(len(string)-1)]
  word = [string.split()[i:i+2] for i in range(len(string.split())-1)]
  return alphabet, word
a,w = bigram(input_str)
print(a,w)
#実行結果：['Ia', 'am', 'ma', 'an', 'nN', 'NL', 'LP', 'Pe', 'er', 'r', '', ''] [['I', 'am'], ['am', 'an'], ['an', 'NLPer']]
```
Convert a FetchXML query to a query expression with the FetchXmlToQueryExpressionRequest message.

Execute the FetchXML query
You can execute a FetchXML query by using either the Web API or the Organization service.

Using Web API
You can pass a URL encoded FetchXml string to the appropriate entityset using the fetchXml query string parameter. More information: Use custom FetchXML.

Using Organization service
Use the IOrganizationService.RetrieveMultiple method passing an FetchExpression where the Query property contains the FetchXml query.

The following code shows how to execute a FetchXML query using the Organizations service:



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654080/cc9786d1-7d7e-a5a4-4fec-c11434802cfe.png)
amazon S3についてアウトプット

# 勉強前の知識
S3っていうファイルを保存しておく場所。
写真とか文書とかを入れておいて、HPで公開したりすることが出来る。

# S3の概要
S3（Simple Storage Service）：データを安全に、無制限に保存できるオブジェクトストレージサービスのこと。
ストレージ作成時、EBSのようにデータサイズを考える必要はなし。

**S3の特徴も以下が挙げられる。**

**・柔軟なストレージ機能**
⇒自動で容量を追加してくれる

**・高耐久／高可用**
⇒すべてのオブジェクトに対して99.999999999% (9 x 11)の耐久性を実現でき、99.99% のオブジェクトの可用性を提供するよう設計されている。

**・低コストによる運用が可能**
⇒保存されている容量とリクエスト数、データの転送料金など使用した分だけ料金が追加されていく。
　一定時間たったら削除するなどの設定もできるので、低コストでランニングできる。

**・静的ファイルの配信**
⇒保存したオブジェクトをHPで公開することが出来る

# オブジェクトを暗号化する方法
S3のオブジェクトは４つの方法で暗号化することが出来る。

**・SSE-S3**
一言でいうとAmazon S3で処理／管理される鍵を使った暗号化。
AWSのリソースを使って暗号化するよって意味。
暗号化方式は：AES-256

**・SSE-KMS**
AWS KMSが管理するカギを使った暗号化
誰がどのカギでアクセスするかを管理することができ、ログに残せたりすることが出来る。
S3と同じくAWSのサービスで管理するが、KMSはユーザーコントロールが出来たりと少し詳細に管理することが出来る。

**・SSE-C**
AWSの外でユーザーが完全に管理するデータキーを使ったサーバーサイドの暗号化
暗号化するためのキーやユーザーもAWSに格納する前に定めて、S3内で暗号化する。
データをAWSに送信するためには常に暗号化キーが必要になるため、HTTPSを使用する必要がある。

**・クライアントサイドの暗号化**
クライアントがS3に保存する前に暗号化してS3に送信する。
KMS/S3/CはS3内で暗号化してきたが、今回はクライアント自身が暗号化してS3に保存するイメージ

# 勉強してみて
純粋にS3は便利な機能だなっていう印象。
わざわざEC2インスタンスでサーバーを立てずにWEBでオブジェクトを見れたりストレージ機能を持ったりで便利だなーって感じた。
SAAの試験でも暗号化方式は問題として出てくるので、しっかりと抑えなければ。。
Community tools for Microsoft Dataverse ツール

XrmToolBox

Many of the most popular ones are distributed in the XrmToolBox. XrmToolBox is a Windows application that connects to Dataverse, providing tools to ease customization, configuration and operation tasks. It is shipped with more than 30 plugins to make administration, customization or configuration tasks easier and less time consuming.

The following is a selected list of community tools distributed via the XrmToolBox that you can use with Dataverse.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654080/ccf09e65-259e-1add-08a0-1254d26d8388.png)
Tool	Description
Attribute Manager	Used to rename/delete/or change the type of the column.
Early Bound Generator	Generates Early Bound Tables/Choices/Actions. Uses CrmSvcUtil from the SDK, and shows command line used to create the classes.
Export to Excel	Easily export records from the selected view/fetchxml to Excel.
FetchXML Builder	Create and test FetchXml Queries
Metadata Browser	Browse metadata from your Dataverse environment
Plugin Trace Viewer	Investigate the Plug-in Trace Log with easy filtering and display possibilities
User Settings Utility	Manage users personal settings in bulk
PCF Builder	Easily create, build and test your custom control using Power Apps Component Framework
SQL 4 CDS	SQL 4 CDS allows you to use standard SQL syntax to query and manipulate your data and metadata in Dataverse
Dataverse Custom API Manager	Create, update and get 360° View of Dataverse Custom APIs

引用：https://docs.microsoft.com/en-us/power-apps/developer/data-platform/community-tools
Rubyの条件分岐の使い分けについて

条件分岐を実装するシチュエーションがあり、使い分けの定義が曖昧だったのでいろいろ調べてまとめてみました。
基本的な内容です。

# 条件分岐とは
「〜な時〜な処理をする。」というものです。点数が80点以上であればgreat、60〜80点であればgood、60以下であればbadみたいな感じで結果に応じた処理を行うものです。
## if文
```if 条件 then 処理 end```のような感じで書きます。条件がtrueの時に処理が実装されます。
```
if score >= 80
  puts "Great"
elsif score >= 60
  puts "Good"
else
  puts "Bad"
end
```

## unless文
```unless 条件 then 処理 end```のような感じで書きます。条件がfalseの時に処理が実装されます。ifの逆バージョンです。
```
unless score >= 60
  puts "合格"
else
  puts "不合格"
end
```

## case文
```case 評価する式　when 条件 処理 end```のような感じで書きます。最初で評価する式を定義して後から条件ごとに処理を実装します。
```
case score
when 80..100
  puts "Great"
when 60..80
  puts "Good"
else
  puts "Bad"
end
```

# なぜ使い分けるのか
使い分ける理由は「**可読性**」と「**処理速度**」です。
二分岐なのか多分岐なのかといった条件のパターンや条件式がandやorで繋ぐ複雑なパターンなのかとなどの評価の仕方によってベストプラクティスは異なります。
※ 実際にベンチマークテストを行ったわけではありません。

## ifを使うべきタイミング
- 条件式が複雑なタイミング
- 処理が一行だけの場合（後置if）

## unlessを使うべきタイミング
- 条件式が複雑かつ、条件式（ifを使う際）にnotが入る時
- 処理が一行だけの場合（後置unless）

## caseを使うべきタイミング
- 条件式がシンプルなもの

# おまけ
if文の可読性を高めるテクニックとして**ガード節**があります。これは、「条件に当てはまるものを早期リターンさせることで可読性を高めるテクニック」です。以下の記事が分かりやすく解説しておりますので是非参考にしてみてください。

https://ichi-station.com/%E3%82%AC%E3%83%BC%E3%83%89%E7%AF%80%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6/
mac のターミナルで hosts ファイルを書き換える方法

# はじめに
mac で hosts ファイルを書き換える方法です。 
mac のターミナルでも iterm2 でもなんでも問題ないです！

# hosts ファイル書き換え
以下のコマンドを実行します。
```
$ sudo vi /etc/hosts
```
すると、
```
Password:
```
と出るので、お使いの PC のパスワードを入力します。
以下のような画面が出てきます。
```
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
```
こちらを編集するために、「i」とキーボードで打つと INSERT モードに切り替わり編集できます。
IP アドレス + 半角スペース + ホスト名を入力します。
```
111.111.111 example.com
```
入力したら、「esc」ボタンを入力し、INSERT モード終了。

保存する場合は
```
:wq
```
やっぱり辞める場合は
```
:q
``` 
強制終了
```
:!q
```
【Jest】【React Testing Library】Property 'toBeInTheDocument' does not exist on type 'JestMatchers<HTMLElement>'.解消法【Next.js】

::: note warn
[こちらのコメント](https://qiita.com/P-man_Brown/items/a868c5079b71206bf227#comment-1efaa072ab99c8f97d10)をご確認ください。
:::

## 状況
JestとReact Testing LibraryでNext.jsのテストを実行していたところ、以下のようにエラーが発生しました。

![スクリーンショット 2022-06-22 午前8.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/33b40496-829f-7112-0a2e-8ebbde9d77b8.png)


## 解消法
以下のコマンドを実行することで解消しました。

```
$ yarn add -D  @types/testing-library__jest-dom
```

![スクリーンショット 2022-06-22 午前8.18.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/567d308c-cb8c-8348-b7f8-cbbf7eac9824.png)

## 参考

https://github.com/testing-library/jest-dom/issues/45

https://github.com/testing-library/jest-dom/issues/442

https://github.com/testing-library/jest-dom/pull/460
CloudTrail のログを Athena で検索

CloudTrail でログを取得する設定を施す。
CloudTrail の「Event history (イベント履歴)」　をを選択して、「Athena テーブルを作成」 をクリック。CloudTrail のログを保存しているバケットを選択する。
Athena に行く。
上記により作成されたテーブル名（cloudtrail_logs_aws_cloudtrail_logs_xxxx のようになっているはず）を選択する。「テーブルをプレビュー」をクリックすると、10件表示される。SQL を適切に変更すれば、自分の知りたい情報を得ることができる。

（一例）
イベント名の数
```
SELECT COUNT(DISTINCT eventname) FROM "default"."cloudtrail_logs_aws_cloudtrail_logs_xxxx" AS "Number of eventnames";
```
イメージ作成
```
SELECT * FROM "default"."cloudtrail_logs_aws_cloudtrail_logs_xxxx" WHERE eventname = 'CreateImage';
```

（参考）
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/cloudtrail-logs.html
（参考：AWS の Youtube ビデオ）
https://www.youtube.com/watch?v=xe2GSs1Tkyo
（SQL の参考）
https://aws.amazon.com/jp/premiumsupport/knowledge-center/athena-tables-search-cloudtrail-logs/?nc1=h_ls
Dynamics 365で合計や数式をつかってデータを計算する（Excelテンプレートを使う）

## はじめに
ユーザーが画面上の一覧金額を合計したい、計算したいときに毎回計算式を組まずとも
あらかじめ計算テンプレートとして登録すれば、すぐに計算できる便利な機能があります。

Dynamics 365で合計や数式をつかってデータを計算する（Excelテンプレートを使う）
Excelテンプレートをつかって合計行やグラフを表示する

## 完成イメージ
ユーザーがレコード追加した行の合計を、画面上ではなくExcelテンプレートをつかって実現。
（画面上に表示したいときはPower Automateで集計行を用意し合計表示すればよい。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/81ea7578-d729-60dc-1851-5cd67cade238.png)

Excelダウンロードすると合計が確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/d281828a-89b6-2915-4bac-16ee1393f857.png)


## やりたいこと
テーブルの合計金額を表示したい。(ユーザーが任意のタイミングで更新しても自動で集計する)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/6acb6f4e-a956-8f96-6ff1-8ccc6998b07d.png)


### うまくいかないケース
Excelテンプレートに一覧の下に合計行を作成しても、ダウンロードしたExcelテンプレートには反映されていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/d9b0a6da-6f02-5c24-026b-bfc89849e03f.png)


### うまくいったケース
別シートで合計行を表示することで、関数設定した行の合計ができた。
これでユーザーが何行も更新しても、合計シートを見ることで勝手に合計された金額を確認できる。


 レコードに300円追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/81ea7578-d729-60dc-1851-5cd67cade238.png)

Excelテンプレートからダウンロードすると1行追加確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/6ebc0f8e-879a-2437-cf9c-98bf91f66473.png)

別シートで合計行を用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/d281828a-89b6-2915-4bac-16ee1393f857.png)

以上

### 参考
https://docs.microsoft.com/ja-jp/dynamics365/marketing/manage-excel-templates

https://docs.microsoft.com/ja-jp/dynamics365/sales/manage-excel-templates?tabs=SE
ActiveAdminのラジオボタンの初期値をセットする方法


# 概要
checkboxであれば、`input_html {value: :enabled}`で初期値をセットできた(はず)ですが、
radiobuttonだとうまくいかなかったのでnewアクション内で初期値をセットしました。

# コード
```
ActiveAdmin.register Sample do
  controller do
    def new
      @sample = Sample.new
      @sample.show_flg = Sample.show_flgs[:enabled]
    end
  end

  form do |f|
    f.inputs do
      f.input :show_flg, as: :radio, collection: Sample.show_flgs_i18n.invert
    end
    f.actions
  end
```