OmniAICreator/Qiita-1.07M huggingface dataset:
VRChat用VRoidアバターを暗いところでも明るくなるようEmissionの一括設定を行う

# はじめに
VRChatをやっていて、暗い場所でも明るく表示されるアバターを綺麗だなと思ったことはありませんか？
私のVRChat用アバターは、[VRM Converter for VRChat](https://booth.pm/ja/items/1025226)でVRoidモデルから変換して作っていますが
この場合、マテリアルにデフォルトで設定されているVRM/MToonシェーダーの**Emissionの設定**を変更することで、暗い所でも明るくすることができます。

しかしながら設定の際には、マテリアルの数だけシェーダーのEmissionの設定変更をしなければならず、これを手作業でやるのは少々面倒です。
そこで今回は、Emissionの設定を一括で変更できるツールを作成しました。

この記事ではその使用手順を説明します。

# 注意事項
- プロジェクトのバックアップを取ることを推奨します。
- 本手順で発生した如何なる問題に対してshoshoiは責任を負いかねます。
- **マテリアルのシェーダーをVRM/MToon以外に設定している場合、このツールは使用できません。**

# パラメータのコピー手順
この記事では、Unity 2019.4.31f1とVRChat SDK3-Avatarsを使用して手順を説明します。

## アバターの準備
Emissionの設定変更をする対象のアバターを準備します。VRoid（VRM）をVRChatアバターに変換するまでの流れは、以下の記事を参照ください。

VRMからVRChatへアップロードする流れ - Qiita
https://qiita.com/100/items/7315fe3a7eb75732ae43

## VRoidAvatarSetupUtilsの導入
1. 以下のURLから最新版（右上の赤いボタン）を入手します。  
https://jirko.booth.pm/items/3232745
2. ダウンロードしたファイルを展開（解凍）します。
3. 中に入っている**unitypackage**ファイルを、**Assets**にドラッグ＆ドロップし「import」します。
![new_capture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/286c3e31-4e4f-1928-0aeb-1d9ae84e5c35.png)


## Emissionの設定
VRoidAvatarSetupUtilsでEmissionの設定を行います。

1. 上の**VRoidAvatarSetup**メニューから**MToon Emission Setup**を選択します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/45f6078f-6a50-68b7-f3e1-bbeedec76161.png)

2. ダイアログウィンドウが開くので、Target Avatarに設定を適用するアバターをドラッグアンドドロップします。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/f1e30a17-4296-bb8e-09d7-dd21194b5e03.png)

3. 中央の**Load**ボタンを押してプリセットをロードします。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/b65b43cb-b5de-f192-2ba5-bfee911adf63.png)

4. リストから設定を適用するマテリアルを選択します。Allを押すと全て選択し、Clearを押すと全て選択解除します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/2d88fb69-e7ef-23ce-e6b1-227c94df1b73.png)

5. Setを押して設定を適用します
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/4cf32a63-b9a1-4445-1189-dba9dae0280b.png)

以上で手順は完了です。

こんな感じに明るくなります。
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1945857/ec145b4c-bcf1-15a1-e03c-127702259d65.png)


# 不具合報告
[GitHubのIssue](https://github.com/shoshoi/VRoidAvatarSetupUtils/issues)または[Twitter](https://twitter.com/shoshoi_sho)までご連絡ください。

# 参考リンク

https://note.com/suzutsuk1/n/n7039f612de19

https://note.com/frontendpict/n/nc3a92597809c

https://qiita.com/yokra9/items/a44b9aab5ff7bdfa5b9b
コピペで練習 git ファイルの変更と戻し

````
# クローン
git clone https://github.com/tatsujihatanaka/lookaround.jp.git

# フォルダへ移動
cd lookaround.jp/

# 状態確認と以前の練習の後始末
git status
git branch -a
git branch -d -r origin/test
git push --delete origin test

# ブランチの作成・確認・削除
git branch test
git branch -a
git branch -d test
git branch -a

# ブランチの削除切替と切替
git checkout -b test
git branch -a
git checkout main
git branch -a
git checkout test

# 未追跡（untracked)ステージング前のファイル
# ファイルの追加・変更・戻し
touch test.txt
mkdir test
touch test/test.txt
sed -i -e 's/パノラマ</パノラマ test</g' views/index.php
git status
git clean -dn
git clean -df .
git status
git clean -dn
git checkout .

# 追跡（tracked)ステージングされたファイル
# ファイルの追加・変更・戻し
touch test.txt
mkdir test
touch test/test.txt
sed -i -e 's/パノラマ</パノラマ test</g' views/index.php
git status
git add .
git status
git rm -r --cached .
git status
git clean -dn
git clean -df .
git status
git reset --hard
````
コード設計と入力のチェック

# コードとは？
氏名、商品名とは別に```識別番号みたいなもの```。
同じ名前があっても確実に識別できる。
これを用いると```システムの活用する上で様々な利点```がある。

# コード設計のポイント
システムが扱うであろう```データ量の将来予測```などを行って適切な桁数や割り当ての規則を定める必要がある。
少なすぎると将来足りないことがある。また多すぎると扱いずらい。
　
# コードの種類
### 順番コード
データの発生順やアイウエオ順に一連番号をつけたもの

### 区別コード
* 対象を一定のブロックに分け、その範囲でつけた一連番号
* 項目の類似性に基づいた分類を区別するように付与したコードです。1000番台、2000番台というように、分類を数値で区別することもあります。またそれぞれの分類の中では順番コードを付加することがあります。

区分コードは、類似する項目が近くにあり、探し当てやすいことや、処理するプログラムや人の分業がしやすいという特徴があります。
出典 https://basics.k-labo.work/2017/10/26/%E3%82%B3%E3%83%BC%E3%83%89%E8%A8%AD%E8%A8%88/

### 桁別コード
* 各桁に大・中・小分類などの意味を持たせたもの
* コードの桁ごとに意味をもたせたコードです。学生番号の例では、先頭4方が入学年度、次の1桁が学科、末尾4桁が学生の通し番号を表す、といった付与の仕方です。

桁別コードは、複数の欄は区切り記号を要することなく、一つのデータで複数種類の意味を扱えるのが特徴です。

出典 https://basics.k-labo.work/2017/10/26/%E3%82%B3%E3%83%BC%E3%83%89%E8%A8%AD%E8%A8%88/

### 表意コード
内容を表す略号

### 合成コード
各種のコードを組み合わせたコードです。例えば、自動車登録番号は、地域を表す表意コード、普通乗用車や小型乗用車などの種類を表す区分コードなどを組み合わせた合成コードです。
出典 https://basics.k-labo.work/2017/10/26/%E3%82%B3%E3%83%BC%E3%83%89%E8%A8%AD%E8%A8%88/
# チェックディジット
誤入力を判定するためのコードへ付加された数字のこと。
例えば９６１２３４の場合
この数を足してそれを１０で割った値をコードの最後の数にする。
すると9612345になる。
これを読み取るときに９６１２３４を足して１０で割ったら５になるかを判定する。
これで最後の数と計算された値が一致したらコードの読み取りが成功する。

# 入力ミスを判定するチェック方法
システムの誤動作や内部エラーを引き起こす元となる。
チェックディジットもチェック方法も一つ
それ以外を紹介する。
## チェック方法の種類
### ニューメリックチェック
コードの中に文字などの数字として扱えないものが含まれていないかをチェックする

### シーケンスチェック
データが```一定の順序で並んでいるか```をチェックする。

### リミットチェック
データが適正な範囲内にあるかをチェックする

### フォーマットチェック
```データ形式が正しいか```をチェックする。

### 照合チェック
登録済みでないコードの入力を防ぐために```表中に登録されているかを照合```する。

### 論理チェック
販売数と在庫数と仕入れ数の関係によって```その項目の値に矛盾がないか```をチェックする

#### 気づき
関係に矛盾が生じる値の場合はダメなのか。

### 重複チェック
```重複して複数個登録```されていないかをチェックする。

# 問題２の気づき
8000*1.2^3よりも桁が大きくなければならない。
26^n >= 8000*1.2^3の関係式が成り立てばいい。
なので
選択肢の中から小さい数字から代入していけば答えが求まる。
計算がわからない。

# 出典

https://gihyo.jp/book/2022/978-4-297-12375-8

https://gihyo.jp/book/2020/978-4-297-11781-8
iPadのSwift Playgroundsだけでswift初心者の高校教師がアプリの開発に挑戦してみる　＜その7＞

https://qiita.com/kerikerijy/items/83ff1c7fb3f4311813a5

# Appの配信にはやはりMacが必要

だいぶ更新が滞っていましたが、実は10日くらいで実装は終わり、6月の初旬には席替えアプリの開発を一旦完了していました。

前回の記事にも載せたモックアップ動画のように、席替えの結果をアニメーションで見せる部分の実装は今回は見送りました。アプリの更新で実装するかどうかの検討課題とします。

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

で、記事の更新にこれだけ時間が経ってしまったのは、Appの開発はiPadのSwift Playgroundsだけで出来ても、Appの配信にはやはりMacが必要だったからです。。。

# Appの配信のためにMacでしか出来ない作業

整理しておくと、Appの配信のためにMacでしか出来ない作業は以下の1つだけです。

- スクリーンショットの作成
iPhone 6.5インチ、iPhone 5.5インチ、iPad（第3世代）12.9インチ、iPad（第2世代）12.9インチの計4パターンのスクリーンショットが必要なので、どうしてもXcodeのシミュレーターが必要になってきます。

当初は以下の作業も必要でMacでしか出来ないと思っていたのですが、

- Certificate(証明書)の作成
Macのキーチェーンアクセスが必要です。

- Provisioning Profileの作成

なんと、iPadのSwift Playgroundsから直接App Store Connectにアップロードする場合は、この作業を手動で行う必要がなくなります。これはとても嬉しい誤算でした。どうやら、iPadのSwift Playgroundsが勝手にやってくれるみたいです。

# iPadのSwift Playgroundsでアプリを開発すると良い事

iPadのSwift Playgroundsで開発したアプリのプロジェクトをMacにAirDropで送って開いてみると、以下のように表示されました。

![CD1AC751-F398-435E-B1E8-133CDEDFA1DE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/d1bfeef2-a22a-0a9e-c44e-d8526e55a4cc.png)

ということは、Xcodeからアプリをアップロードする場合でも、iPadのSwift Playgroundsで開発したアプリのプロジェクトの場合、作業を簡略化することが出来るみたいです。

要するに、iPadのSwift Playgroundsで作ったプロジェクトを利用する場合は、Apple Developer ProgramでApp IDのIdentifierを登録して、その時に指定したBundle IDさえあればオッケーということになります。

この辺りの知識はほとんどなかったので、とてもややこしくて混乱しましたが、以下の記事などを参考にして何とかして理解しているフリをして乗り切りました。。。

https://www.musen-connect.co.jp/blog/course/product/ios-ble-dev-provisioning-profile/

https://zenn.dev/miyataka/articles/64083d85c5bbca

# 何とか無事に辿り着いたアプリの配信

ということで、何とかMacを入手して、iPadのSwift Playgroundsで開発したアプリのプロジェクトをMacにAirDropで送って、Xcodeのシミュレーターで動作させてスクリーンショットを撮りました。

これで準備は全て整ったので、以下の通りApp Store Connectでアプリの配信準備を完了することができました。

![7CE5F0D2-BDF7-4976-AE1E-69AE056B708D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2661763/636e053c-d6a5-3956-7696-b545e8834790.jpeg)

無事にApp Storeで配信できていることを確認しました。


以下の記事をサポートページとしているので、もし興味があればダウンロードして使ってもらえると嬉しいです！

https://qiita.com/kerikerijy/items/e99e21d4d665f841ac7a?1

ところで、このiOS App「カンタン席替え」を配信するためMacを入手するまでに結構時間がかかったので、その間に実は暇つぶしがてらもうひとつアプリを開発していました。

そのアプリの配信を例にして、今回の記事では書かなかったiPadでiOS Appを配信するための作業を次回の記事でまとめたいと思います。

https://qiita.com/kerikerijy/items/b8ee7cff4a0fc6a79652?1
初参加コンペの感想(On going)

#### 今回はsignateの学生コンペにチームで参加した感想を書いていこうと思います。

## 参加したコンペ
Signate Student Cup2022に3人のチームで参加しました。
[コンペのリンク](https://signate.jp/competitions/735)

##  コンペ内容
海外求人情報のテキストデータを使って職種判別するアルゴリズムの構築。
テキストデータを元に四種類の職種に属するか判定する感じです。(1. data scientist 2. ML Engineer 3. Software Engineer 4. Consultant)
BERTとかWord2Vecなどを使ってモデル構築してアンサンブル学習させて提出しました。

## 課題
- スコアデータが少なくてなかなか精度上がらなかった。
- 学習のデータ数が少ない

大体これらが原因で精度向上妨げてた
あと
- チームメイトのファイル管理が絶望的


## 初コンペの感想
なんだ、コンペってこんな簡単なんだ。

って言えるような優秀な人間ならよかったな笑
まず最初に、自然言語処理は勉強したことのない分野でめちゃめちゃ面白かった。文字をベクトル化したりそれの合計で平均とって判定したりと面白い技術で溢れてるなと。
コンペ自体の感想としては、コンペの流れとかはわかるけどモデルの実装の仕方とか自分でコードを書き上げていくコード力が圧倒的に足りないって感じたな。チームメイトがかなりフォローしてくれた部分もあって結果的には銀メダルはいけそうだけど、結果以上に今の自分に足りないものを見つけられた気がする。多分1人でコンペ挑んでたら挫折してやめてたと思う。優秀なチームメイトには頭がありません。

## 次回目標


次は今回の経験をもとに別の初心者向けのコンペ1人で挑んでみようと思う。 
今気になってるのはNishikaの不動産コンペ、個人的に不動産好きだからあり・・・
https://www.nishika.com/competitions/34/summary
ArduinoとSimulinkでモデルベース開発　入出力

# この記事について
ArduinoとMATLAB/Simulinkによって、スイッチでLチカ
ソフトウェアとハードウェアの準備ができていれば1時間程度で終了できると思う。

# モデルベース開発とは
シミュレーションによって問題を潰してから実機開発をする手法のこと
WEBで「MBD V字」と検索すれば、全体的な流れが見えてくる。

# ツール
・MATLAB/Simulink2022a
・Simulink Support Package for Arduino Hardware(アドオン)
Simulink Support Package for Arduino Hardwareのインストールは記事末尾の参考記事のところを見てください。


# 大まかな流れ
1. モデル作成
2. シミュレーション
3. 実機で動作確認

# やること
スイッチOFF：LEDが点灯
スイッチON ：LEDが消灯

# 部材
・Arduino MEGA
・ブレッドボード
・ジャンパー線(オス-オス)
・タクトスイッチ
・抵抗 10kΩ、1kΩ
・LED × 2
・USBケーブル
・電池ボックス
・単三電池 × 4

# モデル作成
![33071.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410837/27ebf8fa-1c5c-9284-1bc1-548ef33a454e.jpeg)

# モデル作成
1. Simulinkを起動し、空のモデルを生成
2. ライブラリブラウザー 
   →imulink Support Package for Arduino HardwareのCommon
   →Digital Input と Digital Outputを配置し接続
3. Commonly Used Blocks
   →Scopeを配置し接続
![タイトルなし.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410837/7217e5d9-f26a-28fc-e4e8-f62d79033b56.jpeg)
4. 終了時間を Inf に設定
 
# ハードウェア設定
1.ハードウェア設定を開く
![タイトルなし1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410837/1149dba8-40c2-22db-aff6-e1aa70e73b16.jpeg)

2. PCとArduinoMEGAを接続
ハードウェアボードでArduino MEGAを選択
※このあとで接続が上手くいかない場合は、COMをManually SelectでCOM番号を選択すると接続されます。COM番号はデバイスマネージャーから探せます。
![タイトルなし2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410837/ec4a798f-85a3-35ab-f710-845c28f3da55.jpeg)

3.ハードウェアタブから接続されたIOに変更し、IOを使って実行をクリック
![タイトルなし3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410837/87cba1a5-2aa4-87a8-ec66-574dcf43816f.jpeg)

4.実行結果
スイッチOFF：LEDが点灯
スイッチON ：LEDが消灯
が確認できた
![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410837/79aad9c6-2b5c-6cec-5053-899339c8e4ee.gif)

# 実機動作
1. ボード上で実行に変更し、ビルド、デプロイを起動をクリック
ビルドプロセスが正常に完了しましたと表示されれば問題ない
![タイトルなし4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410837/a645ea58-2f1c-dd68-5d22-226782fc7f48.jpeg)

2.電池ボックス＋側をVin端子に、―側をGND端子に接続
3.実機動作確認
シミュレーションと同じ動作をしていればOK！！
![ダウンロード (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410837/e17288d5-b919-fe17-1de6-43163764e471.gif)
お疲れ様でした！


# やってみて思ったこと
・シミュレーションと実機動作が一致して感動した！！！
それこそ、高校生の時にPICマイコンでLチカしたときぐらいに
こうゆうことは、モチベーションを維持しながら楽しくできるので続けていきたい。

・gifがあまりにも見えにくくて、見てくれる人に対して申し訳ない。
動画を埋め込むのにtwitterかyoutubeでリンク入れるかな


# 参考記事
https://qiita.com/Carter/items/cc7faa5084aa4a69f4e7
https://qiita.com/juraruming/items/cd5be0f238af35a5d362
どちらも丁寧に書かれていますので参考にしてください！
Oktaを初期設定からReactログインページ実装まで

# Oktaを初期設定からログインページ実装まで

Okta　Developerの設定から、React でのサンプルページの実装まで。

## OktaのコンソールとCLIが使えるようになるまで

### Okta Develop への登録

今ではOkta Developerがあるので、開発者はトライアルの類いは使う必要はないです。
（Okta CLIの `okta register` からでも登録できそうですが、この記事内では実際に試した手順にて）

1. [Home | Okta Developer](https://developer.okta.com/)を開く。
1. 右上の[Sign Up]ボタンを押下、あとは画面に従い登録を進める。
1. 登録したメールアドレスにメールが届くので、 Activate ボタンを押下する。
1. ブラウザで。Oktaの管理者コンソールが開かれる。
1. いったんサインアウトなどした場合は、[Home | Okta Developer](https://developer.okta.com/) から右上[Sign in to Okta]ボタンを押下、画面に従いサインインする。

### Okta CLI インストール

1. [Getting Started | Okta CLI](https://cli.okta.com/manual/)を開く。
1. Installation セクションの内容に従い、 Okta CLI をインストールする

### Okta API トークンの取得

Okta CLIに登録するためのトークンを発行する

[https://developer.okta.com/docs/guides/create-an-api-token/main/](https://developer.okta.com/docs/guides/create-an-api-token/main/)

1. Oktaコンソール、左メニューで[Security]>[API]を選択
2. [Tokens]タブを選択
3. [Create Token] ボタンを押下
4. 名前を任意でつけて、 [Create Token]を桜花
5. Token Valueをコピーして、保存する（トークンの値はこの機会でのみ取得できる）

### Okta CLIでのログイン

1. コンソールで `okta register` を実行
1. 対話で登録。URLは `https://{Oktaのコンソール右上のアカウント名をポップアップしてドメイン名をCopy to clipboard}`
```sh
Okta Org URL: ※URL（e.g. https://dev-12345678.okta.com)
Okta API token: ※Okta API トークン
```

---

## Reactプロジェクトの作成
### プロジェクトの作成、開発サーバで実行

```sh
okta start react
cd react
yarn
yarn start
```

### 動作確認

1. [localhost:3000](http://localhost:3000) をブラウザで開き、 Okta-React Sample Project サイトを開く
1. ウェブサイトで Login 押下
1. Okta のログインページに遷移するので、ログインする
1. Okta-React Sample Project サイトに戻る。自分の名前がサイト内に表示される事を確認する。
1. サイトの Profileを開き、IDトークンの情報が見ることができることを確認する

この時点では Messagesページは正しく開けないので、次の手順でリソースサーバを起動する。

### リソースサーバのクローンと実行

1. サイトルートに戻り、 Node/Express Resource Server Example を開く。Githubのページが開くので、Readeの手順通りに実行する
```sh
git clone https://github.com/okta/samples-nodejs-express-4.git
cd samples-nodejs-express-4/
yarn
```
1. `okta apps` コマンドを実行。okta-react-sampleクライアントのIDを取得する。
1. testenv  を保存。 ISSUERは https://ドメイン/oauth2/default 、SPA_CLIENT_ID は前述手順のクライアントID
```ini
ISSUER=https://ドメイン/oauth2/default
SPA_CLIENT_ID=クライアントID
```
1. yarn resource-server  実行、 http://localhost:8000/ でjson形式のメッセージが表示されることを確認する
1. Okta-React Sample Project サイトの Messages を開く。メッセージが正常表示されていることを確認する
人事のおじさんプログラミングを学ぶ Day4「確認ダイアログボックスの表示～変数・定数・条件分岐」

書籍『確かな力が身につくJavaScript「超」入門 第2版』に沿って、
確認ダイアログボックスの表示～変数・定数・条件分岐（else if）までやってみた。
だんだん文脈が出てきて、面白さが増してきました。
![2022-08-20 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/84060f1b-e401-2516-4621-73dd22376766.png)
![2022-08-20 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/4c003531-b03b-f8f5-845b-ee42c50e2957.png)
ssh で no mutual signature supported エラー

Ubuntu22.04 から、とあるホストに ssh でアクセスしようとすると

```
$ ssh -i hatehate.pem hogehoge@hagehage.example.com
```

以下のようにエラーが出るようになった。
```

sign_and_send_pubkey: no mutual signature supported
hogehoge@hagehage.example.com: Permission denied (publickey).
```

今回は ssh-rsa を使えるようにしてみる。
なお、ssh-dss などの場合は以下の ssh-rsa を該当のプロトコルに直す。


# 全体の設定変更をするには

/etc/ssh/ssh_config を以下のように書き換える。

```
    SendEnv LANG LC_*
    HashKnownHosts yes
    GSSAPIAuthentication yes
    HostKeyAlgorithms ssh-rsa
    PubkeyAcceptedKeyTypes ssh-rsa
```
↓
```
    SendEnv LANG LC_*
    HashKnownHosts yes
    GSSAPIAuthentication yes
```

# 自分が使うときだけの設定を変更するには

~/.ssh/config に以下を追加する。

```
Host hagehage.example.com
  HostKeyAlgorithms ssh-rsa
  PubkeyAcceptedKeyTypes ssh-rsa
```

# 今回一度だけ接続する場合

以下のようにして接続する。

```
$ ssh -o 'PubkeyAcceptedKeyTypes +ssh-rsa' -i hatehate.pem hogehogeu@hagehage.example.com
```

(2024/10/25 追記：)

# command-line line 0: no argument after keyword "pubkeyacceptedkeytypes"

これが出るときは、

HostKeyAlgorithms パラメータも追加する。

```
ssh -oHostKeyAlgorithms=+ssh-rsa -oPubkeyAcceptedAlgorithms=+ssh-rsa  -i hatehate.pem hogehoge@hagehage.example.com
```
SwiftUIのTextにマークダウンを使用する

SwiftUIではmarkdownがサポートされているため、テキストを太字にしたり、リンクを組み込んだりすることができます。

# 使い方
```swift
var body: some View {
    VStack {
        Text("**Hello, world!**")
        Text("[Apple](https://www.apple.com/)")
        Text("~~striked through~~.")
    }
}
```

<img width="400" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663839/312ad2c1-c950-db54-c72d-284c406f9806.png>

# リンクの色を変更する
`.tint`を使用することでリンクの色を指定することができます。

```swift
Text("[Apple](https://www.apple.com/)")
    .tint(.red)
```
[C#] OracleでLOB(BLOB/CLOB/NCLOB)型を使用するときはOracleCommand.InitialLOBFetchSizeを指定する

NCLOB型を使用するとSELECTのパフォーマンスがあり得ないぐらい落ちた。

ググると下記のイシューを発見。LOBのプリフェッチで解決するらしい。（LOBのプリフェッチはデフォルトで無効になっている）

https://github.com/rsim/oracle-enhanced/issues/1755

`OracleCommand`の`InitialLOBFetchSize`プロパティーに`-1`を指定すると、LOB列をプリフェッチしてくれるのでNVARCHAR2型と大差なくなる。

https://docs.oracle.com/cd/E16338_01/win.112/b66456/OracleCommandClass.htm#BABEGDHA
ユーザーインタフェース

システムと利用者の間に立って、お互いを仲介するもの。
入力をどう受け付けるか、どう表示するかなど。
いかにユーザ側の視点に立って、これらユーザインタフェースの設計を行うかが重要になる。

# CUIとGUI
## CUI
文字を入力することによって命令を与え処理させる。
しかしコンピュータの知る```コマンドを入力しなければ操作```できない。

## GUI(Graphical
```誰でも簡単に画面のアイコンやボタン、マウスなどをつかって操作```命令を伝える。
グラフィカルな操作方式。

# GUIで使われる部品
以下の部品を使うことで操作画面を作ります。
### ウィンドウ
```アプリケーションの基本領域```でこの上に部品を配して、操作画面を作ります。

#### 気づき
画面表示においての土台なのか。

### メニューバー
アプリケーションを操作するための```項目が並んだメニュー```。

### プルダウンメニュー
```クリックすると下に垂れ下がる```メニューのこと。

#### 気づき
メニューバーの項目をクリックすると下に垂れ下がって表示される。

### テキストボックス
```文字入力用```の矩形領域

### チェックボックス
```選択肢を複数操作```したり、```特定の項目をON/OFF```させたりする用途に使う。

### ラジオボタン
```選択肢の中から一つだけ```を選ばせたい時に使う。

#### 気づき
これは使えそうだ。

# 画面設計時の留意点
* ```左から右```、```上から下```への流れで移動させる。
* 画面の```配色にはルール```を持たせる。
* 選択肢が多かった場合は、```グループ分け、階層化```などをする。
* ```エラーメッセージを表示```させ、対処法などを書く。
* 画面の```レイアウトや入力パターンを共通化```させる。
* 画面の```操作方法の説明（画面）```を用意する。

# 帳票設計時の留意点
* 各帳票の```基本レイアウトを共通化```。
* ```関連する項目は隣接```した場所に配置。
* 記載する```情報は最小限```に留める。

# 問題を解いた時の気づき
### 入力原票
財務システムなどに入力する元となるデータが書かれた伝票のこと。
    出典 https://kotobank.jp/word/%E5%85%A5%E5%8A%9B%E5%8E%9F%E7%A5%A8-6991

出典 https://gihyo.jp/book/2020/978-4-297-11781-8
Go modules環境で同一module内の他ファイルを読み込む

## 概要
Goで別ファイルの変数や関数を読み込む実装をしようとした際に苦戦したため備忘録として投稿する。
今回は`GOPATH`でなく`Go Modules`を使用する

## 初期のファイル構成
### ツリー
```
.
├── main.go
└── unify
    ├── const.go
    └── func.go
```

### ファイル
`go_plactice`がモジュール名で`unify`が読み込み先のフォルダ名である。
`main関数`内で読み込んだ定数と関数を出力している。

```main.go
package main

import (
	"fmt"
    "go_plactice/unify"
)
func main() {
    fmt.Println(unify.Hoge);
    fmt.Println(unify.Hello("関数"));
}
```

```const.go
package unify

const Hoge = "定数"
```

```func.go
package unify

func Hello(name string) string {
    message := "Hello " + name
    return message
}
```


## モジュール作成
カレントディレクトリで以下のコマンドを叩きモジュールの初期化を行う。
モジュール名は任意である。

```
go mod init go_plactice
```

### 作成されるmod
モジュール名が`go_plactice`になっていることが確認できる。

```go.mod
module go_plactice

go 1.18
```
### ツリー構造
モジュールの初期化を行った後のツリー構造である。

```
.
├── go.mod
├── main.go
└── unify
    ├── const.go
    └── func.go
```

## tidy
必要であれば以下のコマンドを叩く。
今回は不要であるが、パッケージ等をインストールしたい場合などは使用する。

```
go mod tidy
```

### ツリー構造
上記コマンドを叩くと`go.sum`が作成される
```
.
├── go.mod
├── go.sum
├── main.go
└── unify
    ├── const.go
    └── func.go
````
## 確認
最後に`main.go`を実行すると、読み込んだ先のファイルの定数と関数が使用できていることが分かる。

```
% go run main.go
定数
Hello 関数
```

## 参考サイト
https://go.dev/doc/tutorial/create-module
https://go.dev/doc/tutorial/call-module-code
【TypeScript】Cannot read properties of undefined (reading 'push')が出たときの対処方法

# はじめに
昔にこのエラーを何回か出したことがあり、つい最近その時のメモ書きを発見したため良い機会だと思い清書することにしました。
他の方の参考になればと思います。

## ちなみに
エラーが出たのは下記のようなソースコードです。※簡略化しています。
```tsx
let numberArray: number[];
numberArray.push(1);

// Consoleに出ているエラー
// ERROR TypeError: Cannot read properties of undefined (reading 'push')
```

# 結論
原因は定義だけしてArrayオブジェクトを入れていないのが原因でした。
そのため初期化タイミングで新しい空配列を入れることで解決！
```tsx
let numberArray: number[] = new Array();
numberArray.push(1);
```
2分でPCにWebリモコンを実装できるライブラリ「rcjs」でラズパイ操作してみた 

Raspberry PIでIoT製品のプロトタイプをしてると、ディスプレイに繋げずにラズパイを操作したい状況が出てきます。

そんな時のために使えるお手軽Webリモコンを実装できるnpm形式のpackage「rcjs」を開発して、webリモコンを作ってみました。

**※npmには既にrcjsというパッケージが存在していますが、今回作ったものは僕のGithubからでのみnpm installできます。**

## 使い方
### Install
```bash
npm install --save TakutoYoshikai/rcjs
```

```javascript:index.js
const Remocon = require("rcjs");

const remocon = new Remocon();

remocon.addButton("button title", function() {
  //do something
});

remocon.start(3000);
```

do somethingのところに好きな処理を実装します。shellコマンドをexecしても良いし、JavaScriptで実装しても良いです。

ラズベリーパイだと、電源コードを抜いてシャットダウンする方法をあまり使いたくないと思うので、shutdownコマンドを遠隔で実行できるようにしてみたいと思います。

```javascript:index.js
const Remocon = require("rcjs");

const remocon = new Remocon();

const execSync = require("child_process").execSync;

remocon.addButton("シャットダウン", function() {
  execSync("shutdown -h now");
});

remocon.start(3000);
```

### 実行
```bash
# shutdownコマンドはroot権限が必要なのでsudoをつける
sudo node index.js 
```

ローカルIPアドレスを調べて、`http://<local ip address>:3000/` にアクセス

![S__13402140.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149717/f2a45a13-47ed-1b3a-75c4-a6c4c95b3c2a.jpeg)

このボタンを押したらシャットダウンされる。
同じLAN内だったらローカルネットワーク通信で遠隔操作可能。

リポジトリ: https://github.com/TakutoYoshikai/rcjs
Qiita投稿記事が100本になったので振り返ってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/a0b07188-0dba-f9fd-ef14-73503f9210b8.png)

この記事投稿が100本目となるため振り返ってみます。

①投稿することの効果
②投稿を続けることの効果
③投稿の際に気を付けていること
④投稿の際に気を付けないようにしていること


# ①投稿することの効果

## わかりやすく書く/残すようになった
 **「他人に見られて恥ずかしくないように」** という気持ちから、前提や意図をちゃんと表現するようになり、最低限のドキュメントクオリティを保って残すことが出来たように思います。Qiita用に作業エビデンスも取得するようになりました。

逆に、投稿せず個人用メモとしてローカルに書き殴っていた場合、たぶん利活用は出来ないレベルのう○ちを量産していたかもしれません。


## ちゃんと調べるようになった
記事を書くにあたり **（ある程度）内容に責任を持たねば**、という意識が芽生え、結果的に製品マニュアルやナレッジを調べてから行動するようになりました。

結果的に、良く知らないコマンドをそのまま打ってデータが吹っ飛ぶような事故は減ったように思います。

## もう一歩取り組むようになった
書き、残し、調べ、記事を完成させてみると、**「あの設定が違ったらどうなるんだろう」「別の手法も採用できるのではないか」「そもそもこうすれば楽になるのでは」と思索が一歩進む**ことが多く、その結果、よりよいソリューションが閃いたり一段深い知識(沼)に触れたりするなどの効果も得られたように思います。


<br>
<br>

# ②投稿を続けることの効果

## 投稿数/閲覧数がモチベーションとなる
投稿数は知識量、閲覧数は承認欲求に自己換算して、おちこんでる時には心の支えにしたりしています（正しいqiitaの使い方ではないかもしれません）。

特に投稿数についてはGoogle Analyticsを利用するとより全体的に把握できたのでおすすめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201787/966b0315-936c-120d-44e6-857f4f9ec9c2.png)


## 投稿自体が思い出になる
よっぽどのギークでなければ、記事投稿の背景にはその当時のお仕事があり、わざわざ記事にするほど楽しい／苦しいお仕事だったはずです。

私の場合は2017年から投稿を続けており、見返してみると当時のことが思い出されますが、**それぞれの記事は苦しいプロジェクト活動ではなく、技術に収斂したギリギリ直視できる内容**であり、辛い過去を上手に思い出さないようにする記録／記憶方法の一つの手法かなと思います。


## 周囲に影響を与える（？）
私はQiitaアカウントや自投稿について社内公開していないので、プロジェクトメンバの意識向上に役立った、みたいなケースはないのですが、それでも誰かの役に立ったこともなくはないのかなぁと自惚れたりしています。

ただ、過去に一度だけ、**プロジェクトメンバが私の記事を参考に「こうやったら出来ました！」と言ってきた**ことがあり、「あんまり技術ブログの個人投稿を鵜吞みにするんじゃないよ」って答えたこともありました。
（Qiitaはgoogle検索でhitしやすいのも良い ~~(悪い)~~ ところでもありますよね）


## マークダウンに慣れる
Qiitaはマークダウンで記事を書くので、すっかり慣れ、マークダウンに対する恐怖はなくなりました。
（自社で利用する機会は皆無ですが）


<br>
<br>

# ③投稿の際に気を付けていること

## ハマったら絶対投稿する
こちらのハマったは大失敗（≠熱中）したら、です。

何故かうまくいかず、よくわからないエラーメッセージにうなされ、縋る思いで検索した技術ブログに救われた経験は誰しもが一度は体験していることでしょう。

そんな一助になれたら、という意味と、将来への自分の自戒を込めて積極的に投稿するようしています。


## 鮮度の高いうちに投稿する
投稿のモチベーションは興味、驚き、伝えたさ、といったところだと思います。
それらは時間経過によって少しずつ失われていき、最終的には投稿することの義務感に替わり、（私の経験上）嫌々投稿するか投稿を諦めるかになります。

ですので、何かが終わったら熱と記憶の冷めないうちに書く、というのも気を付けています。
（議事録とかも同じですよね）


## 見やすいか、分かりやすいか、利用しやすいか
これは記事の書き方の話になってしまいますが、以下のようにメリハリをつけるようにしています。

**見やすいか**：見出しや強調を使ってパラグラフ・センテンスが見やすいようにする
**分かりやすいか**：必要な場合は構成図や表を作成して理解を促進できるようにする
**利用しやすいか**：コードブロックなどを利用してコピペ箇所などを目立つようにする

:::note warn
ただしコダワリが過ぎると執筆時間がかかるので、あくまで気持ち程度に行っています。
:::



<br>
<br>

# ④投稿の際に気を付けないようにしていること

## 投稿頻度
こちらは諸説ありますが、Bのほうなので気にしていません。
（実力を付けたい場合、本とか資格取得の方が私は向いているからです）

`A:記事を投稿するために、勉強する。結果として実力が付く`
`B:作業記録として、記事を投稿する。結果として記録が共有される`


## 内容の被りの存在
被っている内容があったとしても気にしていません。

どんな作業においても100%同じ環境になることはまずなく、どうやっても機器環境、パッケージバージョン、アプリやコマンドの書き方、そして作業者の先入観がMIXされるとオリジナリティが出てくるものです。

その結果として発生する微細な違いが意外とハマりどころになったり、あるいは貴重な経験になったりするため、そのポイントが表現されていれば「自分の記事」ということになるのではないかと考えています。

もちろん **完全なコピー記事はNG**ですが。


## 内容のレベル
アカデミックなペーパーを書くのであれば、格式高く内容のレベルを考える必要があると思いますが、ここはQiitaなので内容のレベルはいろいろあって良いかと思います。なので、「技術仕様の説明」、「触れてみた」、「チートシート」、はたまたこのような「ポエム」まで、色々囚われずに書いて良いと思います。

もちろん **1行記事や完全にITに関係ない内容はNG**ですが。


# 最後に
そもそも自宅で調べた内容を会社で確認するためにQiitaという手法を取ったことが始まりになるのですが、よもやここまで続くとは思っていませんでした。引き続き適度に頑張れ私。
【Rails】devise 管理者が他のユーザーの新規登録ができるようにする

# 【Rails】devise 管理者が他のユーザーの新規登録ができるようにする

### devise

deviseを使用してユーザー登録機能を実装した際に、管理者としてログインをし他のユーザーの新規登録ができるようにしたいとします。
しかし、そのままの状態で新規登録をしようとするとroot_pathにリダイレクトされてしまい新規作成画面に遷移できません。

## rails g devise:controllers users

本来deviseのコントローラーはGem内に記述されているため編集することはできません。
しかしdeviseのユーザー登録機能はregistrations_controller.rbで定義されているため、このファイルをどうにかしなくてはいけません。
そこで、このcontrollerをオーバーライドしてカスタマイズをしていきます。

まずはオーバーライドするためのファイルを作成します。
```
$ rails g controller users/registrations
```
これで編集するファイルapp/controllers/users/registrations_controller.rbが作成できます。

それではこのファイルを編集していきます。
```ruby:registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
    prepend_before_filter :require_no_authentication, :only => [ :cancel]
    prepend_before_filter :authenticate_scope!, :only => [:new, :create ,:edit, :update, :destroy]
          （省略）
end
```
これでログイン中でもログインユーザーが登録できました。
C# のコンソールアプリケーションでフォームを使う方法 【Visual Studio】

## 環境
 - Visual Studio 2022 Community
 - .NET 6.0
 
## 前提条件
単一のプロジェクトではなく，ソリューションの中にコンソールアプリケーション(以下，コンソールアプリ)のプロジェクトが保存されている．

## はじめに

コンソールアプリのプロジェクトでは，フォームデザイナを使うことができない．「新しい項目の追加」ダイアログにも項目がない．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230846/2cffbb46-8cf7-decd-1b8d-929a4f3eeaef.png)

手打ちでフォームを作成するのは面倒くさいので代替案．

## 1. フォームアプリケーションのプロジェクトを追加

ソリューションに新しいプロジェクトとして「Windows フォーム アプリ」のプロジェクトを追加する．このプロジェクトにフォームを作成しておく．このときフレームワークのバージョンやターゲットOSなどは，既存のコンソールアプリのプロジェクトに揃える．

フォームとのデータのやり取りは，一番簡単な方法はフォームのクラスに `Public` 修飾子のメンバ変数を用意して使うこと．

## 2. プロジェクト参照の追加

コンソールアプリのプロジェクトに「プロジェクト 参照」として，フォームアプリのプロジェクトを追加する．

## 3. コンソールアプリでフォームを使う

まずメイン関数を修正する．(C# 10.0 の新しい記法は使用不可)

```Project.cs
using FormApp; // フォームアプリのプロジェクト名

namespace ConsoleApp // コンソールアプリのプロジェクト名
{
    internal class Program
	{
        // この属性をメイン関数の前に記述．
        [STAThread]
        static void Main()
        {
            // フォームを初期化して表示
            Form1 form = new();
            form.ShowDialog();

            // フォームのインスタンスを破棄
            form.Dispose();
        }
    }
}
```

## おまけ. 見た目を綺麗にする

 - XP Visual スタイルを有効化．(デフォルトだとWindows 98のような見た目)
 - 高DPI環境でのスケーリング対応

コンソールアプリに「アプリケーション マニフェスト ファイル」を追加．デフォルトで色々書かれてると思うので以下の2箇所のコメントアウトを外す．

```xml:app.manifest
 <!-- アプリケーションが DPI 対応であり、(以下略) -->

  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
      <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
    </windowsSettings>
  </application>


  <!-- Windows のコモン コントロールとダイアログのテーマを有効にします (Windows XP 以降) -->

  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          processorArchitecture="*"
          publicKeyToken="****************"
          language="*"
        />
    </dependentAssembly>
  </dependency>
```
文字列演算子　＜＜　の意味

たまに出てくるこれ　　　　`<<`

どういう意味なのか？

`<<`　演算子といい、
配列で自身の末尾に破壊的に値を追加してくれます。

下の文で確認します。


```rb
class Food
  @@foods = [ ]
  def self.input
    puts "料理名を入力してください"
    name = gets.chomp
    puts "カロリーを入力してください"
    calory = gets.to_i

    food = Food.new(name, calory)
    @@foods << food
  end
end

```

`@@foods`に`food`の値を追加しています。
わかりやすくいうと、`@@foods`に`food`の`name`と`calory`の値を追加しているということです。
RailsでVueRouterでブラウザバックすると白い画面になる(Vueが読み込まれない)

# はじめに

この記事は2022年2月にまとめていた「細かいつまずいたことをメモしておく(2月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Vueを読み込んだページから別のページに移動して戻るボタンを押すと白い画面になってしまいVueが読み込まれなくなってしまった

# 解決方法

`application.js`に`turbolink`が設定されていることを思い出して切ることで解決した

```js:javascript/packs/application.js
# 以下をコメントにする
// Turbolinks.start()
```

# 参考

https://www.fuwamaki.com/article/4
SageMaker Training JobでUploadingでエラーになる

 # はじめに

この記事は2022年2月にまとめていた「細かいつまずいたことをメモしておく(2月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

SageMaker Training JobでUploadingのタイミングでエラーになっていた
CloudWatchのログをみると以下のエラーがでていた

```
[FATAL tini (7)] exec train failed: No such file or directory
```

# 解決方法

これはSageMakerのファイルパスが正しく設定されていないのが原因

Dockerfileに以下を追加した

```Dockerfile:Dockerfile
ENV PATH="/opt/program:${PATH}"
```

ちなみに出力先は`/opt/ml/model`になるので出力ファイルはすべてこの中に書き出すようにする

# 参考

http://www.matsuoka-peoffice.com/blog8/
SageMaker Training Jobでdocker run image trainがエラーになる

# はじめに

この記事は2022年2月にまとめていた「細かいつまずいたことをメモしておく(2月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Training Jobをカスタムイメージで利用したところ以下のエラーが発生した

```
$ docker run -v $(pwd)/test_dir:/opt/ml --name sagemaker --rm ${image} train
[FATAL tini (7)] exec train failed: No such file or directory
```

# 解決方法

ローカルで動かす場合は以下のように変更したところ動くようになった

```
$ docker run -v $(pwd)/test_dir:/opt/ml --name sagemaker --rm ${image} ./train
```
僕が考えた最強の開発ディレクトリ構成

````
C直下に、4種の開発フォルダを作る

C
├─DevEnv
│└─環境名
│  └─環境バージョン
├─DevStudy
│  └─テーマ
│    └─試した事
├─DevTools
│  └─ツール種類
│    └─ツール
├─DevWorks
│    └─テーマ
│      └─試した事
└─（その他）

実例

C
├─DevEnv
│└─node
│  └─node16
│└─xampp
│  └─xampp8
├─DevStudy
│└─git
│  └─git01
│└─typescript
│  └─01
├─DevTools
│└─java
│  └─pleiades
└─（その他）

````
SageMakerでファイルを保存するときPermission Deniedになる

# はじめに

この記事は2022年2月にまとめていた「細かいつまずいたことをメモしておく(2月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

SageMakerでCSVファイルをPandasで出力する以下のコードで権限エラーが発生した

```
try:
    os.makedirs('/opt/ml/processing/output/data')
except:
    pass
df_processing.to_csv('/opt/ml/processing/output/data/df_processing.csv')
```

# 解決方法

原因はコンテナのユーザーがrootになっていることだった
ユーザーを変更することで解決した
DockerコンテナのRailsにvuetifyをいれたがno moduleになる

# はじめに

この記事は2022年2月にまとめていた「細かいつまずいたことをメモしておく(2月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

コンテナで作成したRails環境にyanr installで`vuetify`をいれたがなぜか`no module`エラーが発生した

# 解決方法

Webpakcerのキャッシュが効いているのかインストールがうまくされていなかった
`docker-compose build --no-cache`をして`yarn install`したら読み込まれるようになった
Node(vue)にyarn add axiosしたのにno moduleエラーがでる

# はじめに

この記事は2022年2月にまとめていた「細かいつまずいたことをメモしておく(2月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Node.js(Vue)に`axios`をいれるため`yarn add axios`として呼び出したところインストールしているはずなのに`no module axios`とエラーが出た

# 解決方法

```
import axios from "axios";
↓
import axios from 'axios';
```

と変更したらなおった。原因は謎ではあるがこういうパターンもあるみたい
Railsのdevice_auth_tokenでActionController::InvalidAuthenticityTokenがでてしまう

# はじめに

この記事は2022年2月にまとめていた「細かいつまずいたことをメモしておく(2月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

device_auth_tokenを利用したところ`ActionController::InvalidAuthenticityToken`というエラーがでた

# 解決方法

`Application_controller.rb`に`protect_from_forgery`を追加したら200が返ってきた

# 参考

https://techtechmedia.com/invalid-authenticity-token-api/
Letter Opnerでメールは送信できているが確認ができない

# はじめに

この記事は2022年2月にまとめていた「細かいつまずいたことをメモしておく(2月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

LetterOpnerでメールの送信が行われているのは確認ができているが、受信が行われていなかった

# 解決方法

ApplicationMailerを継承していないことが原因だった

```
class TestMailer < ActionMailer::Base
↓
class TestMailer < ApplicationMailer
```

としたところメールが送られるようになった
Docker Compose V2 をとりあえず入れてみた

# Docker Compose V2 をとりあえず入れてみた

## 前提
- `docker run --d hello-world`を動かすことができる

## 僕の認知は遅かった。
`docker-compose`コマンドを僕は知らない状態でdockerに触れました。
少し調べてみると、V1 と V2 なるものがあり、V1は2023年にはなくしていきた方向らしいですね。
そら、`docker-compose`と打つのと`docker compose`とでは、打ちやすさに雲泥の差がありますよね。（本当にそこなのか？）
`doc` `tab` `com` `tab` で入力したいものです。

詳しいことはよくわかっていないけれど、とりあえず最新の方がいいっしょ。（一応ちゃんと調べます）
時代は変わるものだ。精神で入れていきます。（本当にそれでいいのか。）

## Docker Compose V2 インストール
1. まずはプラグインを入れる場所の確保
    ```
    sudo mkdir -p /usr/local/lib/docker/cli-plugins
    ```
1. 次にプラグインをDL
    ```
    sudo curl -SL https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
    ```
1. そしてDLしたプラグインを使えるようにするために実行権限を付与
    ```
    sudo chmod a+x /usr/local/lib/docker/cli-plugins/docker-compose
    ```
これだけだというのか...！

## エイリアス作成
### 前提
- WSLをVS Codeで開ける（別にVim等でも可。お好きなエディタで修正して保存できれば。）
- .bash_aliasesが読み込まれる設定を.bashrcで行われている（WSL Ubuntuは初期でそうなっていました。）

とりあえずコマンドラインでtabしても出てこないことに気づいたので、エイリアスだけ作っておこうと思いました。
1. ホームディレクトリへ移動
    ```
    cd
    ```
1. VS codeでファイル修正
    ```
    code .bash_aliases
    ```
    下記のように書いて保存
    ```.bash_aliases
    # Docker の独自エイリアス
    alias d='docker'
    alias dc='docker compose'
    alias dcps='docker compose ps'
    alias dcud='docker compose up -d'
    alias dcudb='docker compose up -d --build'
    alias dce='docker compose exec'
    alias dcl='docker compose logs'
    alias dcd='docker compose down'
    alias dcbnc='docker compose build --no-cache'
    ```
    ```
    ctrl + s
    ```
1. 確認する
    再度グインして、上記コマンド一覧を行ってみる

確認出来たらOK。
```
d
```
だけで`docker`なのは快適すぎて、もう無理だ。
コマンド忘れそう。
ありがとうございました。
DockerのRailsコンテナがログ(logger, puts)を表示しない

# はじめに

この記事は2022年2月にまとめていた「細かいつまずいたことをメモしておく(2月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

DockerコンテナでRails環境を構築したところ`logger.debug`や`puts`を行っても標準出力が行われなかった

# 解決方法

puma.rbで標準出力が`log/puma.stdout.log`にリダイレクトしていた

```rb:config/puma.rb
# stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
unless ENV.fetch("RAILS_ENV", "development") == "development"
  stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
end
```

変更することで出力できた

# 参考

https://jpdebug.com/p/1087438
シナリオテストと心理

シナリオテストについて学んだ内容を記載します。

シナリオテストとは、ユースケーステストと同義として使われます。
ユースケーステストとは、ブラックボックステストの技法の１つで、
ユースケースシナリオを実行するテストケースのことです。

ユースケースシナリオには、そのシナリオの登場人物がいます。
これをアクターと呼びます。
ユースケース図に出てくる棒人間(スティックマン)のことですね。


とある人から聞きましたが、ここに心理を組み込んだストーリーテーリング手法というものが、
このシナリオテストには有効だそうです。

この「ストーリーテーリングってなんぞや？」て思われますよね？
詳細は以下のリンクに読みやすそうな記事があったので添付だけしてざっくりとだけ記載します。
https://digitalidentity.co.jp/blog/business/story-telling.html

ざっくりいうと、
【アクター(および現システムor業務)の現状】
【アクターの心理】【アクターの行動】
【アクターやシステムの結果、反応】
の４つの起承転結からなります。
これによって相手に伝わりやすく、共感しやすいシナリオとなるために、
その機能が本当にその人にとって要求しているものなのか、判断する材料になります。
結果、ユースケースがより洗練されたものになるそうです。


わたしはこれを【ユースケースマインドモデリング】と呼んでたりします。
人の要求の裏に隠された心理、Whyについて引き出すために具体的な小説シナリオを考えるわけですので。
これは小さな勉強会で実際に実験的にやってみたことがありますが、
実験前と実験後では、考えられるユースケースが結構違ってより洗練されたものになりました。
（ちなみにこの勉強会の時、同席させたエンジニアでない職種の方が、大学で心理学を専攻されてたからか、
このユースケースマインドモデリングのディスカッションは非常に盛り上がりました。）


さて、前置きが長くなりましたが、次の記事でシナリオテストに本題を戻します。
./bin/webpack-dev-server: Permission deniedが時々起きる (chmod・chownが効かない)

# はじめに

この記事は2021年1月にまとめていた「細かいつまずいたことをメモしておく(1月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

なぜかファイルが権限で読み込めなくなる現象が時々おき
。一回治ると以降起きないが、Gitからダウンロードしたときにコンテナをあげると起きたり、起きなかったり

Dockerfileで`chmod +x ./bin/webpacker-dev-server`をしても同じエラーがでてしまいchown, chmodが効いていない

# 解決方法

これはローカルにある./bin/webpacker-dev-serverがコンテナのユーザーが変更されていたので起きていた
変更が起きたタイミングはWSL2のフォルダをWindowsのデスクトップにダウンロードしてからWSL2ni再度戻したときでした
また、Gitに権限がrootになっているファイルををあげていたのでクローンも当然root権限になっていた

権限を変更する必要がある

```
$ sudo chmod -R ユーザー名:グループ名 ./*
```
モデル駆動

先日、エリックエヴァンスの読書会を開催した際に、
第３章のモデル駆動について様々な意見が出たので、そのことについて記事を書きたいと思います。

実は上記の読書会以外にも、
自分が主催でやっているICONIX手法でやってるモデリング勉強会(SOLIDなどの原則も含む)があるんですが、
エヴァンス書籍で書かれてる内容はよくよく考えてみたら、結構無意識にやっている内容でした。

だからドメインモデルと実装が解離しないようにしようって発想は
「え、、そんなん当然に思うことじゃない？？」ってなってましたが、
実際の業務では、ドメイン分析を行う方、設計を行う方、実装を行う方が分断されてしまってるんだとか。

あとは仕様変更が入った際に実装だけを修正して、
それがドメインモデルが変わらない、影響しないようなものであればいいんだけども、
ドメインモデルの構図が変わるような仕様変更だった場合、実装と解離してしまい、
結果的にそれが何度も続くと、何のためにオブジェクト指向で作ったの？ていうくらい
保守性の欠如したものになってしまうんだとか。

それに対する対処法は書籍には特に具体的には書かれてなかったから、
そこに対する心構えとか、対策法、そもそも設計とドメインモデルの違いって？みたいなディベートをやってました。


※以下は書籍を通して皆で出し合ったものと、個人的見解が含まれますので、絶対的な正解ではありません。
※またドメインモデルって言いにくいから、独断と偏見で【分析クラス図】と書いてしまいます。
分析段階でのクラス図って意味でね(^_-)-☆


まずは結論の項目から。
【アジャイルはドキュメントよりも動くもの重視って文献を誤解している】
【１回目のモデルで完璧を目指そうとしてはいけない。かといってテキトーな名前もNG】
【そもそもモデラーと開発者を分けてはいけない。全員でなるべくモデリング、全員で開発まで担当。】


確かにアジャイルではドキュメントは最小限に、動くものを最優先て提唱されてますが、
だからと言って分析クラス図などのドキュメントをおろそかにしろ、とは言ってないです。
新しい仕様変更が分析モデルの構図を変えないといけないような場合には、
今あるモデルに追加して対処しようってよりは、崩れるのが当たり前( ･´ｰ･｀)　くらいの心構えで
迅速にモデリングをすべきだなあと。
（もちろん構成がほとんど変わることなく追加で対応できるものもあるとは思いますけど）


現に実体験として自分たちのモデリング勉強会で
「図書館の貸出返却システム考えよう！！
ますは貸し出しの際の貸し出し担当をやってくれる図書館スタッフである【司書さん】はシステム化の管理対象だけども、
返却する際には、複数の蔵書をバラバラに返すことおあるから、
その返却の際の司書さんが誰なのかまでは面倒だから管理対象から外したモデルを考えよう！」
て作ったモデルと、

「今度は返却の際に、返却担当する司書さんが誰なのかまで管理対象にしてみよう！！」て作ったモデルは
劇的にドメインモデル図の構成が変わりました。

だいぶ端折りますが、前者では返却明細と貸出明細は一緒のクラスにまとめてしまってOKだったけども、
後者では返却明細を分けてあげないと表現できませんでした。

最初はまとめてしまってたクラスでも、仕様が変わると分けないと単一責務違反になってしまうケースなんて
他のモデルでもざらにありました。


こんな感じで仕様変更が入る度、素早いタイミングで作ったものを壊しては作って
を繰り返して、さらにはその都度非機能部分まで変わる可能性あるから設計モデルまでも猛烈なスピードで
変化を求められてしまう。
これはめっちゃ心理的にしんどいなあ汗と感じました。

だからエヴァンス本で言ってることは、私個人としては
「壊すことを恐れるな。捨てることを恐れるな」て思えました。

何度も何度も破壊しては創造を求められるわけだから、
確かにモデルを中心に議論して実装に落とし込むってのはあるけども、
最初から完璧な名前などを目指さなくていい。
意思疎通が図れればいい。
モデルを作ることを目的としてはいけない。
モデルを作るのはあくまでも【顧客や開発者含むチーム全体の意思疎通のため】。


つまりまとめると、
最初からモデルを創りこみすぎない。かといってテキトーなわかりにくい命名はやめる。
そして、神クラスが発生しないように責務を単一になるようにしておく。
分析モデルの段階で求められるのは、カプセル化高凝集。

そして何より大切なのは開発者だけでなくチーム全体で対話をすること。
そしてWhyが伝わらないってことが起きないように
チーム全体で実装まで行うこと。

これがモデル駆動設計の章で言いたかったことなんじゃないかなと思いました。
てなわけで～～
理屈ではわかっていても、体験を伴わないとダメな気がするんで、今度モデリングの祭りをやってきます！！
　
おわり
PHPのプログラムをDockerで立てたhttpdで動かしてみた

# はじめに
PHPを使い始めたこともあり、サンプルレベルのプログラムを動かす環境を構築してみました。

# 検証に使用した環境
OS：MacOS Monterey 12.3.1
Docker：Docker Desktop for Mac 4.7.1
PHP：7.2

# DOCKER公式のphpイメージをプルする
まず、イメージを取得します。
当初は、[httpdのイメージ](https://hub.docker.com/_/httpd)でやろうとしていました。
しかし、デフォルトでPHPは入っておらず、拡張が必要でした。

PHPとhttpdだけが必要な場合は、[PHPのイメージ](https://hub.docker.com/_/httpd)が良いとのこと。

DockerHubのページを参考にPHPとhttpdがセットになったイメージを取得します。

```shell
% docker pull php:7.2-apache
```

# 定義ファイルを作成
docker composeでコンテナを作るため、定義ファイルを作成します。

httpdを80番ポートで受け、公開するPHPソースをvolumesで指定します。

```yaml
version: "3"

services:
  dcloud:
    build: ./
    image: php:7.2-apache
    ports:
      - "80:80"
    volumes:
      - "$PWD/src:/var/www/html"
```

定義ファイルを作成したら、コンテナを起動します。

```shell
% cd ~/workspace/docker/php_apache/
% docker-compose -f docker-compose.yml up -d
Creating network "php_apache_default" with the default driver
Creating php_apache_dcloud_1 ... done
```

コンテナが起動したら、ブラウザからアクセスしてみます。

```
http://localhost/sample.php
```

意図した内容が出力されていれば成功です。

# 参考文献
https://hub.docker.com/_/httpd

https://hub.docker.com/_/php/
Railsで複数選択可能なチェックボックスから受け取ったパラメータがnilになる

# はじめに

この記事は2021年1月にまとめていた「細かいつまずいたことをメモしておく(1月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

https://web-camp.io/magazine/archives/18333

https://www.tom08.net/2016-09-16-175901/

この記事を参考に複数選択可能なチェックボックスを作成した

chackboxで`multiple`をつけると配列で値を受け取れるのだが、`params.require`で値を受け取れると`nil`になってしまった

# 解決方法

以下のようにしたところ解決した

```erb:test.html.erb
    <div class='d-inline text-nowrap ml-1'>
      <label class='fw-normal'>
        <%= f.check_box :color, {multiple: true}, '青色', nil %>
          青色
      </label>
    </div>
    <div class='d-inline text-nowrap ml-1'>
      <label class='fw-normal'>
        <%= f.check_box :color, {multiple: true}, '黄色', nil %>
          黄色
      </label>
    </div>
```

```rb:test_controller.rb
def notebook_params
    notebook_params = params.require(:notebook).require(:size, 
      :width)
    notebook_params[:color] =
      params.require(:notebook).permit({:color => []})[:color]
```

```rb:notebook.rb
  serialize :color, Array

  before_save do
    self.color.split(',').map{ |m| m.delete('[]"\\')} if attribute_present?("color")
  end
```

これで配列にして保存ができるようになった。パラメータの取得が特殊になっている
【Ruby】putsの戻り値はnil

rails consoleで以下のメソッドを試したところ混乱したので、備忘録として書き留めます。

```
$ rails c

?> def palindrome_tester(s)
?>   if s == s.reverse
?>     puts "palindrome"
?>   else
?>     puts "not palindrome"
?>   end
?> end 
=> :palindrome_tester

>> palindrome_tester("racecar")
palindrome
=> nil

>> palindrome_tester("asdfg")
not palindrome
=> nil
```

上記の"=> nil"の部分が毎回出力されるのが不明だったのですが、putsは文字列を出力した後、nilを返しているだけでした。
RailsからMySQLへのアクセスでAccess denied for user 'root'がでてしまう

# はじめに

この記事は2021年1月にまとめていた「細かいつまずいたことをメモしておく(1月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

RailsコンテナからMySQLに接続しようとすると`Access denied for user root`エラーが発生

# 解決方法

`database.yml`の`username`を`root`にしたところ解決した
また`webpackerコンテナ`から`rails db:create`してエラーにもなっていた

2点を直したところ接続ができた
SageMakerのドメインが削除できない

# はじめに

この記事は2021年1月にまとめていた「細かいつまずいたことをメモしておく(1月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

SageMakerを削除したときユーザープロファイルを削除したのに`ドメイン削除ボタンが押せない`
コンテナイメージをアタッチしたエラーがずっと表示されておりそれが原因かもしれない

# 解決方法

CLIから削除するとうまくいった

```
$ aws sagemaker delete-domain --domain-id [ドメインID] --region [リージョン(ap-northeast-1など)]
```

AWS CLIがない方はそれをいれるところからやってみてください
discord.py 2.0.0ついにリリース

2022/8/18、12時ごろ、ついに[discord.pyのバージョン2.0.0](https://pypi.org/project/discord.py/)がリリースされました。
# 主な変更点
# `pip install discord.py[speed]`
というのができたらしい？


## `app_commands`の追加
スラッシュコマンドのこと。
これは僕の前の記事や、他の記事もいろいろ出ているのでググればわかる。

## `cog`の非同期化
`client.load_extension`や`client.add_cog`が非同期になった。
`on_ready`の実行時に`await client.add_cog`とする。
## `Intents`の必須化
`client=discord.Client()`に`intents=Intents.なんか=True`として`intents=intents`とする。
## `discord.ui.View`
主に、ボタンやセレクトメニュー、テキストインプットの実装。
これもさまざまな記事が書かれているので省く。
## `Componets`
これはまだよくわからない。
ボタンの配置などを制御するらしい。
## `Paginator`
おそらくdiscord.py 1の時に[buttons](https://pypi.org/project/buttons/)というパッケージがあったからか、追加された。
## エラーログ
on_errorかどこかで指定するらしい。
ドキュメント参照
# 参照
https://github.com/Rapptz/discord.py
https://pypi.org/project/discord.py
https://discordpy.readthedocs.io/en/latest/
https://discord.gg/dpy
コピペで練習 typescript 

```
# npm 初期化
npm --version
npm init # package.json 作成

# typescript インストール
# -g オプションは使いたくない
npm install --save-dev typescript # package-lock.json 作成

# greeter.ts 作成
# greeter.html 作成
# https://qiita.com/Futo_Horio/items/de182639b7e4261c9606

# パス指定で実行
./node_modules/.bin/tsc --version  # tsc バージョン確認
./node_modules/.bin/tsc --init     # tsconfig.json 作成
./node_modules/.bin/tsc greeter.ts # コンパイル

# npm run は使い物にならない
npm run --version      # npx バージョン確認
npm run tsc --version  # tsc バージョン確認
npm run tsc --init     # 動作しない
npm run tsc greeter.ts # 動作しない

# npx は使える
npx --version      # npx バージョン確認
npx tsc --version  # tsc バージョン確認
npx tsc --init     # tsconfig.json 作成
npx tsc greeter.ts # コンパイル

# greeter.html を開いてみる
```
VPN接続している際にWSL2でgit cloneができない

# はじめに

この記事は2022年1月にまとめていた「細かいつまずいたことをメモしておく(1月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

WSL2(Ubuntu20.04)でGitLabにVPNをつないでアクセスしようとするとタイムアウトになってしまう

# 解決方法

以下のコマンドを叩くとmtuが設定されて接続されるようになる

```
$ sudo ip link set eth0 mtu 1200
```

毎回設定するのは大変なので`.bashrc`の最後に追加するとよい
Railsでパラメータを付与してアクセスしたときにエラーになって処理が始まらない

# はじめに

この記事は2021年11月にまとめていた「細かいつまずいたことをメモしておく(11月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

URLにauth_tokenというパラメータを付与して、アクセスする処理を行っていたのですが、なぜかエラーが発生してしまう
before_actionも動いていないようだった

エラーは以下のように出ていた

```
ActionController::BadRequest: Invalid request parameters: Invalid encoding for parameter:
```

# 解決方法

調べたところ日本語をパラメータとして渡していたのが原因だった
これはブラウザに起因するもので、URLのエンコードが正しくない場合に起こるそう

https://qiita.com/toshichanapp/items/7291a32b6712815ec253

試しにlocalhost:3000?auth_token=testなどでアクセスしたら問題なく動いた
tokenにはアルファベットしか利用しないため日本語をやめてこのままにした
もし日本語を使うならエンコードが必要そう
Rspecで再帰的なテストでallowの値を都度変更したい

# はじめに

この記事は2021年11月にまとめていた「細かいつまずいたことをメモしておく(11月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# やりたいこと

以下のようなモデルのメソッドをテストします

ランダムな文字列をlogin_idにしてユーザーでそのログインIDを利用している人がいるかを検索
1. いなければlogin_idを返す
2. いた場合は再度unique_login_idを呼び出す

```rb:test.rb
def unique_login_id
    login_id = SecureRandom.alphanumeric(6).downcase
    return login_id if User.find_by(login_id: login_id).blank?

    unique_login_id
end
```

ここで2のすでにログインIDが利用されている場合のテストに困りました

```rb:test_spec.rb
  describe 'unique_login_id_assign' do
    subject(:result) { test.send(:unique_login_id) }

    let(:test) { create(:test) }
    let(:login_id) { 'test_id' }

    before do
        user = create(:user)
        user.login_id = login_id
        user.save
    end

    context '作成した共通IDがログインIDと重複しているとき' do

      it 'ユニークな共通IDを返すこと' do
        allow(SecureRandom).to receive(:alphanumeric).and_return(login_id)
        expect(result).to eq login_id
      end
    end
```

この方法だとallowが常に同じものを返し続けるためループし続けてしまいます
1回目はログインIDが重複して2回目に重複しないIDをlogin_idに入れたいです

# 解決方法

以下の記事を見つけました

https://shingo-sasaki-0529.hatenablog.com/entry/how_to_use_rspec_mocks

この記事によるとand_returnで複数の値を返せるようになるとのこと

```rb:test2_spec.rb
user = User.new
allow(user).to receive(:name).and_return('たろう', 'じろう', 'さぶろう')
user.name # たろう
user.name # じろう
user.name # さぶろう
user.name # さぶろう
```

これをうまく利用して以下のテストに変更しました

```rb:test_spec.rb
  describe 'unique_login_id_assign' do
    subject(:result) { test.send(:unique_login_id) }

    let(:test) { create(:test) }
    let(:login_id) { 'test_id' }

    before do
        user = create(:user)
        user.login_id = login_id
        user.save
    end

    context '作成した共通IDがログインIDと重複しているとき' do

      it 'ユニークな共通IDを返すこと' do
        allow(SecureRandom).to receive(:alphanumeric).and_return(login_id, 'unique_login_id')
        expect(result).to eq login_id
      end
    end
```

ちなみにモデルSpecのプライベートメソッドは`send`を使うことで呼び出せます
お母さんでもわかる「・」中点について


## はじめに
私はHTMLでリストを書くときに、キーボードで入力する「・」と「list-style-type: disc」を指定する違いがわからずどっちでもいいじゃんと思いながら記述していました。
しかし明確な使い分けがあったので共有したいと思います！

## その使い分けとは
![スクリーンショット 2022-08-20 13.17.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782070/208126a2-b317-8ba3-1040-5cf3f112a600.png)
![スクリーンショット 2022-08-20 13.20.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782070/cf3607e9-42b1-b31a-c4e4-c8eace72b7a4.png)

それは「list-style-type: disc」を指定することにより、改行位置を統一させることができる（2枚目の写真）ことです！
直接「・」を入力した方が簡単で記述も減りますが、見やすさで比べたら明らかに統一されている方がいいです！

## 具体的な書き方

```index.html
<ul>
   <li>aaa</li>
   <li>bbb</li>
   <li>ccc</li>
</ul>
```
```style.css
ul {
  list-style-type: disc; /* 中点 */
  list-style-position: inside;　/* ul範囲に中点を入れる */
  text-indent: -18px;　/* 上記だけでは改行が揃わないためインデント幅を指定する（必要に応じて大きさ変更） */
  padding-left: 18px;　/* -18px左によっているのでpaddingで調整 */
  }
```
## まとめ
コードを記述しているときに「どっちでもいいや」というものはほとんどないと思う。
そんな中自分は、「どっちも変わらないと思うから楽な方で記述しよう」という考えを持っていたので、なぜこんな書き方をするのかを怠らず考えていきたい。
Railsのform_withでフォーム入力をして登録してもリダイレクトされない

# はじめに

この記事は2021年11月にまとめていた「細かいつまずいたことをメモしておく(11月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

form_withを使って、ユーザーを作成し成功するとログイン画面にredirectされるはずなのにリダイレクトされなかった
renderも効いていなかった

# 解決方法

form_withは`local: trueオプション`をつけないと`Ajax`になってしまい、HTMLがレンダリングされないのが原因だった

# 参考

https://kimuraysp.hatenablog.com/entry/2017/07/08/233754
RubocopでRails/UniqueValidationWithoutIndex: Uniqueness validation should be with a unique index.

# はじめに

この記事は2021年11月にまとめていた「細かいつまずいたことをメモしておく(11月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

indexを以下のように張った

```rb:staff_number.rb
def up
  add_index :staff_number, :employee_code
end

def down
  remove_index :staff_number, :employee_code
end
```

Rubocopを走らせたところ以下のエラーが発生した

```
Rails/UniqueValidationWithoutIndex: Uniqueness validation should be with a unique index.
```

エラーの内容をみるとインデックスをユニークにすると治りそうなのでユニークにしたが治らず

```rb:staff_number.rb
def up
  add_index :staff, :employee_code, unique: true
end

def down
  remove_index :staff, :employee_code
end
```

# 解決方法

エラーをよく見ると

```
validates :employee_code, presence: true, uniqueness: { scope: :staff }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```

scopeのところで参照しているがそこにindexが張られていないことが原因であると気づいた。
そこで、stuff_numberとstuffモデルをつなぐ、stuff_idにindexを張る

```rb:stuff_number.rb
def up
  add_index :staff, [:employee_code,:staff_id] unique: true
end

def down
  remove_index :staff, [:employee_code, :staff_id]
end
```

これでうまくいった
Railsで子モデルが作成されず、モデル名_idがないといわれる

# はじめに

この記事は2021年11月にまとめていた「細かいつまずいたことをメモしておく(11月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

以下のコードがあります

```
class_room.build_member(number: row[:number])
```

rowはExcelファイルをhash形式にした各行を表しています
ここで、`class_room`を`save`すると`member_id`がないというSQLエラーがでました

# 解決方法

原因は、row[:number]がinteger型で送られてくるのに対して、numberカラムのバリデーションでstringになっていたことから
memberの作成ができずに、(エラーは起きるが)class_roomが作成されるため、参照するmemberがないので怒られていた

```
class_room.build_member(number: row[:number].to_s)
```

とすることで解決した
【Tableau Data Saber挑戦記】区間ごとにデータがどれくらい存在しているか（度数）をみたいとき〜ヒストグラム〜

# はじめに
時々、無性にヒストグラムを作りたくなるときってありますよね？（導入が雑になってきている！？）
昨今、学習指導要領の変更で小学生の英語必修化やプログラミング必修化が取り沙汰されてたりしますね。それ以外でも実は絶妙に大事な動きがあったりします。
自分は大学に入ってからヒストグラムを習いましたが、実は地味に少し前にヒストグラムや箱ひげ図といったデータの見方や統計に関する知識の習得が中学生の指導要領に追加されました。「データドリブン」という言葉が本当に身近になってきています。今後もデータの扱いに関する要領が追加される動きは加速するでしょう。
ということは、今の子供たちは将来当たり前のようにそれらを使い、プレゼンし、語りかけてくるわけです。
こういった方面の知識を無視して仕事するわけにもいかないだろうと思い、今回のテーマにしました。

ちなみに実際に僕は社内で他部署の方に詰問されて「Twitterのインプレッション数の中央値が下がり気味である」ことを指摘された際に、tableauではなくスプレッドシートでしたがインプレッション数を1万impごとの区間のヒストグラムにして、impの下がり傾向を説明し、理解していただいたことがあります。（以前に比べて低いimpの投稿数が全体的に増えてきている的な趣旨）

# ヒストグラムとは
ご存じの方もいらっしゃるかと思うのであまり深くは触れないないですが、こちらの記事を見ていたらけたらと思います。

https://backlog.com/ja/blog/what-is-a-histogram/

例えば100点満点のテストをしたとして、50〜60点台の生徒が◯人いた、60〜70点の生徒が△人いた、といったことを区間を設定して、何人その区間にいるか（度数、頻度）を可視化できるようにするものです。

例）

実際に作る
こちらの動画を見てください。1分もしないです。

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

ヒストグラム化したいデータを選んで右クリックで[作成]>[ビン]を選んでビンのサイズを設定すれば概ねできたようなものです。


ビンとは、サンプルデータをグラフ用に並べ替えるために使用する、等間隔の区間のことです。
動画では身長2.5cmごとに区間を区切るということでビンのサイズに2.5と入力しています。

動画にもありますが、あとはデータを「連続」にし、メジャーを「カウント」にすればこうなります↓


以上、お粗末さまでした。


【Tableau Data Saber挑戦記】の最初の記事はこちら
こちらもぜひ

[【Tableau Data Saber挑戦記】1. はじめます](https://qiita.com/hetare/items/d55a7dda34f3b0e9073b)

https://qiita.com/hetare/items/d55a7dda34f3b0e9073b
Rspecでリダイレクトしてしまうので何故リダイレクトしているのか原因がわからない

# はじめに

この記事は2021年10月にまとめていた「細かいつまずいたことをメモしておく(10月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 解決方法

```
flas[:alert]
```

を標準出力で表示すれば原因のデバックができる
Windows11にしたらパソコンが普段通りに使えなくなった

# はじめに

この記事は2021年10月にまとめていた「細かいつまずいたことをメモしておく(10月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

## ブルースクリーン多発

Windows 10 Insider Preview 10.0.22478.1012 (rs_prerelease)
をインストールしたこと起動不可に。とりあえずインストールを戻しました。

## VSCodeのターミナルがおかしい

いつもPowershellでcmdコマンドでコマンドプロンプトを立ち上げるが、なぜかコマンドが効かない。
普通にPowershellを開くと問題なくできる。

コマンドプロンプトもなぜかcondaコマンドが効かない。普通に立ち上げるとできる。

設定を同期したうえでVSCodeをインストールしなおしたところできるようになった

## ビルドの期限が切れていますと表示がでる

ビルドの期限が切れます ビルドの期限が切れるとのことでアップデートしてもブルースクリーンになってしまた
 そこで、devチャンネルからbetaチャンネルに乗り移ったところ解決

なぜかdevしか選択できなかったので以下のサイトを参考に変更した

https://wpteq.org/windows/post-73080/

検索窓で「レジストリ エディタ」を開いて設定が可能