OmniAICreator/Qiita-1.07M huggingface dataset:
Ajaxのソースコード

実務でJavaのシステムで実装したAjaxのソースコードを自分用にメモとしてまとめました。

まずはJavaScriptでイベントを作成し、通信する。

```
$('#button').click(function() {
	var req = new XMLHttpRequest();
	var url = 'コンテキスト以降のURL';
	req.open('GET',url);
	req.send();

	req.onreadystatechange = function() {
		if (req.readyState === 4 && req.status === 200) {
			let info = (req.responseText)?JSON.parse(req.responseText):null;
			if (info) {
				console.log(info);
			}
		}
	}
});
```

指定したURLのサーブレットを作ってJSONデータを返す。

```
// レスポンス用JSON文字列生成
String resData =
	"{\"mojiretsu1\":\"" + "mojiretsu1" +
	"\",\"mojiretsu2\":\"" + "mojiretsu2" +
	"\",\"mojiretsu3\":\"" + "mojiretsu3" +
	"\"}";

// レスポンス処理
response.setContentType("text/plain");
response.setCharacterEncoding("utf8");
PrintWriter out = response.getWriter();
out.println(resData);
```

文字列はtry,catch構文でデータベースに接続してデータベースから取ってきたり、サーブレットで生成したりする。

以上です。
ユーザ作成の自動化


ユーザ作成の自動化
※ユーザー名と同じ名前でパスワードを作成します。
※初回ログイン時にパスワード変更を求めます。

使い方

```
sh user_add.sh ユーザ名 グループ名
```

```user_add.sh
#!/bin/sh

if [ $# -ne 2 ]
then
   #標準出力を標準エラー出力に変更。まぁ好み次第で不要でもOK。
   echo "パラメータがユーザ名とグループ名でない" >&2
   exit 100
fi

USER_PASS=$1
GROUP_INFO=$2

grep ${GROUP_INFO} /etc/group

if [ $? -ne 0 ]
then
  groupadd ${GROUP_INFO}

fi

useradd ${USER_PASS} -g ${GROUP_INFO}

echo ${USER_PASS} | passwd --stdin ${USER_PASS}

passwd -e ${USER_PASS}


````

https://qiita.com/momoken/items/bc8236da4396751d8553
Salesforce：メール不達処理機能の挙動について

Salesforceからメールを送信した際、不達(バウンス）になることがあります。

理由は様々だと思いますが、主に以下が考えられます。
　①宛先メールアドレスが誤入力で間違えている
　②宛先メールアドレスが既に無効となっており、使えない
　③SPFの問題
　　※Salesforceからメールを送る際、SalesforceはFromに指定されているメールアドレスに成り代わって送信を行っています。そのため、メールサーバーによっては、「**なりすまし**」と判断されてしまいブロックされることがあります。
<br>
そこで、Salesforce標準で備わっている「メール不達処理機能」を使用し、エラー検知を試してみました。
<br>
メール不達処理機能とは・・・
>不達処理を使用すると、営業担当は受信者にメールが配信されなかった場合に把握できます。
>また、永続的な配信障害が発生した場合は、無効なメールアドレスを持つリード、取引先責任者、または個人取引先を把握することもできます。
https://help.salesforce.com/s/articleView?id=sf.emailadmin_bounce_enable.htm&type=5

<br>
【メール不達処理機能の仕組み】

①本文内に小さい画像ファイルを埋め込んで送信

②受信者がメールを開いた際に画像をダウンロードすることで開封を検知

<br>

【メール不達処理機能の挙動】
リード、取引先責任者、または個人取引先のレコード画面で、メールの開封ステータスが表示されるのですが、
不達の場合は２種類の挙動があります。

・存在しないドメインのメールアドレスに送った場合→「**未開封**」のまま
・無効なメールアドレスに送った場合（存在するドメイン）→「**不達**」になる
　　　　　　　　　　　　⇓
「不達」となっているものはレポートなどで一覧表示できます。


:::note alert
注意！
ワークフローのメールアラートで自動送信したメールについては、不達処理機能の対象外
　※リード、取引先責任者、または個人取引先に紐づかないため
:::
<br>
では、存在しないドメインに送った場合や、ワークフローのメールアラートで送りたい場合は検知する方法がないのか・・・？
と言われれば、そんなことはありません！以下で検知が可能です。

:::note info
設定画面より、「エラーが発生したメールを送信者に返す」を有効化することで、送信者のメールアドレスに不達のエラーメール（バウンスメール）を通知することが可能。送信者は不達のメールの詳細を検知できる。
　※送信元のメールサーバのセキュリティが厳しいとバウンスメールを受け取れない場合もあるので、テストして動作確認することが重要です。
:::



まぁ、色々対策しても防げないものは防げないです・・エラー理由はたくさんありますからね・・(´・ω・`)
運用に余裕があれば、メールログでの確認をした方が正確です・・・！

また、Salesforceユーザ宛に送信したメールが、そもそもメールログにすら表示されていないものに関しては、「メールの検証」（メールアドレスが有効化どうか）が完了していないことが原因の可能性がありますので、以下ご参考に。
https://help.salesforce.com/s/articleView?id=000393009&type=1

以上！不達管理で困ってる方にお役に立てれば。。。:runner_tone2:
【RSpec】Doorkeeperを使用したAPIのリクエストテスト

doorkeeperのgemを使用していて、リクエストテストでアクセストークンが必要な場合のやり方

##環境
Ruby 3.0.2
Rails 6.1.4.1

##Factoryの作成
アクセストークンをFactoryで擬似的に作成。
factories下に```applications.rb```と```access_tokens.rb```を作成


```spec/factories/doorkeeper/applications.rb
FactoryBot.define do
  factory :doorkeeper_application, class: 'Doorkeeper::Application' do
    sequence(:name) { |n| "Application #{n}" }
    redirect_uri { 'https://アプリのURI/callback' }
  end
end
```

```spec/factories/doorkeeper/access_tokens.rb
FactoryBot.define do
  factory :doorkeeper_access_token, class: 'Doorkeeper::AccessToken' do
    transient do
      user { build :user }
    end

    association :application, factory: :doorkeeper_application
    resource_owner_id { user.id }
    expires_in { 2.hours }
    scopes { 'read public' }
  end
end
```


```ruby
RSpec.describe "Api::V1::Attendances", type: :request do
  let!(:user) { create(:user) }
  let!(:oauth_app) { create(:doorkeeper_application) }
  let!(:access_token) { create(:doorkeeper_access_token, application: oauth_app, user: user, scopes: 'read') }
  let!(:headers) { { 'Authorization': "Bearer #{access_token.token}" } }
  
  describe "GET /api/v1/abc" do
    subject { get '/api/v1/abc', headers: headers }

    it '200を返すこと' do
      subject
      expect(response).to have_http_status 200
    end
  end
end
```

####注意
テスト環境でマイグレーションするのを忘れないこと！

##参考

https://qiita.com/tabakazu/items/450723e9cb7a33f1e159

https://qiita.com/kat0/items/8fde72309d087b81dec8
【Unity入門】ゲーム開発ができるUnityをインストール

# はじめに
ゲーム開発ができるUnityを使い始めるにあたって行った内容メモ

## Unityの説明
- ゲームやツールを開発できるC++で作成されたゲームエンジン
- 非常に幅広いプラットフォームに使用できる
    - iOSやAndroidのようなスマホ向けアプリ
    - Windows、MacOS、Linux向けのデスクトップアプリ
    - PlayStationやXbox、WiiUなどの家庭用ゲーム機
- ゲームエンジンであると同時に、開発用プラットフォームでもある。
    - ゲーム制作用の補助ツールやビジュアルプログラミングツールなどが含まれる。
- 2Dゲーム, 3Dゲームどちらも作ることができる。
- 直感的にゲームを作ることができる。
- AssetStore（アセットストア）が提供されている。

### ◆ ゲームエンジン
- ゲーム開発における一般的な処理（映像処理や音響処理など）を効率よく実装できるツール
- よく使われる処理が共通化されているため、実装作業の工数を減らすことができる。
- プログラミング言語の知識が浅いクリエイターでもゲーム開発が進められるように作られている

### ◆ ビジュアルプログラミングツール
- 直感的な操作を用いてコーディングレス開発を行うツール

### ◆ AssetStore（アセットストア）
3Dモデルなどのゲームデータを購入できる場所（有料販売だけでなく、無料配布されている）
下記例 

- 3Dモデル（人型、ロボット、クリーチャー）
- キャラクターのイラスト
- アイコン画像
- 音楽
- エフェクト
- プログラム処理

## 無料で利用する条件
個人利用（ただし過去 12 か月の収益や調達した資金が 10 万米ドルを下回る方が対象）
無料のUnityプラン「Personal」

## ダウンロードとインストール
Unityを公式ページ（https://unity3d.com/jp/get-unity/download） から「Unity Hub をダウンロード」を押してダウンロード。
↓
インストール
↓
（UnityHubを日本語化する）
Preferences > Appearance > Languages

## 使い始めと試しにテンプレートで新しいプロジェクトを作ってみる
UnityID作成
↓
「Personal」を選択
↓
インストール > 「エディタをインストール」 ※結構時間かかる
↓
新しいプロジェクト作成
↓
テンプレートを選ぶ
↓
テンプレートをダウンロード
![スクリーンショット 2021-11-26 16.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243269/cfe313e7-7a9b-ffbd-3e7b-ad70de40c759.png)
↓
プロジェクト作成
↓
しばらく経過するとUnityが起動し
作成したプロジェクトを開く
※ ここでUnityとUnityHubは別アプリなのかと気がつく

## Unityを日本語化する
日本語化は「UnityHub」から行う。
UnityHubを起動し、「インストール」 > 「アイコン」をクリック > 「モジュールを加える」> 言語パック「日本語」を選んでチェックを入れ > 「インストール」
↓
Unity再起動 ※再起動しないと表示されない
↓
Unity > Preferences > Languages > 「English」→「Japanese」に変更 ※ Unityを再起動する
※ 上記はMacの場合

## Unityの説明

![スクリーンショット 2021-11-26 16.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1243269/c3f9e965-7f0f-c83e-7c4d-51d35ccf5998.png)

| 画面（枠の色） | 説明 |
|:---------------------------------|:------------|
| シーン（赤）                       | オブジェクトなどを配置する画面。マウスのドラッグなどで画面を回転することができる。|
| インスペクタ（黄色）                 | シーンやオブジェクトのプロパティを表示 | 
| ヒエラルキー（緑）                  | 左側の画面：現在編集しているシーンに存在しているオブジェクトの一覧  | 
| プロジェクト（水色）<br/> コンソール  | 下部の画面：今開いているプロジェクトの構成。<br/> シーンやパッケージ等のフォルダが表示される。 | 

## 役に立つカメラ視点の操作方法
上の方のボタンを教えてもできそうだけど、効率を考えると覚えたが良さそう。
（Blenderを調べたときも誰かが似たようなこと言っていた）
※たまたま見つけただけなのでオブジェクトのアップのショートカットは不明
※ 2点ドラッグも目のアイコンになるけどよくわからん

| 操作 | 方法 |
|:---------------------------------|:------------|
| 中心を支点に回転     | option（手から目のアイコンに変化する） + ドラッグ|
| 拡大 と 縮小         | 2点で上下スライド（スクロールの時のやつ） | 
| カメラ視点移動       | option + command + 1点ドラッグ | 
| オブジェクトのアップ  | ヒエラルキーのオブジェクトダブルクリック | 

## 最後に
所感、Blenderのときは実行できないのでつまらなかったが、こっちは実行できるので面白かった
discordの開発コミュニティに突撃して尚も解決しなかったvuetifyの不具合

# はじめに
はじめまして！
フロントエンジニアのふぁると申します。

【Twitterリンク】
https://twitter.com/@fal_engineer

# さっそく
タイトルに挙げている不具合について、書いていこうかと思います。

# 問題の内容
vuetifyには、インプットボックスにcounter propsを指定してやる事で、入力中の文字数がインプットボックス右下に表示される、という機能があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1869061/2b2d6cca-39ca-9592-1fef-0ba2f9a398c9.png)
これはテキストボックス、テキストエリアといった括りに関わらず、テキストを入力出来るフィールドであれば同様です。
また、counter propsにbool値ではなく数値を渡してやることで、最大文字数を表示しながら入力中の文字数をカウントすることも出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1869061/666915ec-5fb7-397e-1038-873dad12d106.png)

このcounter機能は、「npm run dev（開発サーバー立ち上げのnpmスクリプト）」時や、「npm run storybook（コンポーネントカタログの立ち上げのnpmスクリプト）」時は正常に動いていたのですが、<font color="red">「npm run generate（本番デプロイ用のnpmスクリプト）」時のみ正常に動作しなくなる</font>といったものでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1869061/41f08a37-8a5b-b1cd-09d1-890affbf0d5f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1869061/25f48a39-e67f-8c28-4ac6-2a1ace25db87.png)
全てのcounter入力文字数が、最大文字数の表示/非表示に関わらず<strong>「１」</strong>に固定されてしまっています。

# 問題解決に向けて起こした行動
この問題が発覚するころには開発もほぼ終盤で、全てのインプットフィールドを変更する、といった選択肢はありませんでした。
かといって、すべてのインプットフィールドの入力文字数を表示する箇所が謎に「１」に固定されたままリリースなんてことも絶対に嫌でした。

## 同様の問題は起きていないか
同様の問題が他でも起き、issueに挙げられているようなら解決法もすんなりと発覚するはずです。
しかし、日本語はおろか、英語で検索を行っても同様の問題が起きている事は確認出来ませんでした。

## ライブラリが壊れている......？
まず行ったのは、node_modulesを削除 -> npm installを再度行うといったものです。
これにより解決すれば、ライブラリのインストール時等に何かのライブラリが壊れていたということになります。
しかし、問題は解決しませんでした。

## Vuetifyとかみ合わせの悪いライブラリが存在する......？
可能性は薄いかと思いましたが、draggable関係のライブラリや、認証系、広告系等、何かVuetifyとかみ合わせの悪いライブラリがあるのでは......？と疑いました。
しかし、丸三日かけて様々なライブラリをuninstallする組み合わせを試してはビルドを繰り返すも、問題は解決しませんでした。

## いっそ開発チームに直接聞いてやろう
Vuetifyのdiscordの開発コミュニティに単身突撃しました。
当時は日本語で質問するためのタグがあることを知らなかったので、頑張って開発コミュニティで英語で聞いてみました。
Google翻訳を使って長文を英訳すると訳のわからない文章になったようで、「？」とのレスポンスをいただきます。
どうにかニュアンスだけでも伝わらないかと、**「Develop mode is ok! But production mode build time counter broken!! Help!!!」**のようなハチャメチャな文章と共に設定ファイルやコードを投稿しました。
しかし、レスポンスいただいた内容を全て試すも、一向に問題は解決しませんでした。

## 最後の手段
nuxtプロジェクトを作り直し、コンポーネントやライブラリ、設定ファイルを一つずつコピーしていきました。
どれも膨大な量だったため、相当面倒な作業であることが予期されていたので、こちらは最後の手段として据えていました。
新規プロジェクトに色々移行し始め、npm run generateするも、まあ普通にcounterは表示されます。
このまま治ってしまったら、今までの苦労はなんだったんだと思わなければいけないところです。

**むしろもう、それだけは本当に、勘弁してください。**

そして作業を続ける事、三時間後......

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1869061/a859f202-71cf-a2d8-b753-bb3003b974ac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1869061/5bbfb44b-0029-2739-b8ec-c1d1371a244b.png)

### 再現できた！！！！！

# 問題の原因

storybookを起動したときに、npmのログが大量に出て、処理が落ちてしまうことがあったため、ログを出さないようにしている箇所が原因だったようです。
もっと早く最後の手段を取れば、と思うとともに、babelの設定によってはcounterに不具合が起こるってどういうことなんだ......と思った日でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1869061/5a631a3e-0dcc-db71-3452-0618317636fe.png)
Couchbase Lite機能解説：添付ファイル

## はじめに

Couchbase Liteは、標準のJSONデータ型をサポートするだけでなく、画像、音声、ビデオ、PDFファイルなどを含むバイナリデータもサポートします。JSONドキュメントは、「添付ファイル」と呼ばれるバイナリデータに関連付けることができます。なお、ドキュメントは、複数の添付ファイルまたはBLOBに関連付けることができます。

## 添付ファイル操作API

ここでは、バイナリデータである添付ファイルを作成、および取得する方法について説明します。

開発者は、添付ファイル（BLOB）を作成するためにBLOB APIを使用します。

### 添付ファイル作成


以下は、添付ファイルを作成するSwiftコードの例です。




```swift
 let mutableDoc = MutableDocument.init(id: "user::priya")
 if let profileImage = UIImage(named: "profile.jpg"), let imageData = UIImageJPEGRepresentation(profileImage, 0.75) {
   let blob = Blob(contentType: "image/jpeg", data: imageData)
   mutableDoc.setBlob(blob, forKey: "image")
 }
 // … Add other properties
 mutableDoc.setString("user", forKey: "type")
 mutableDoc.setString("Priya", forKey: "name")
 mutableDoc.setString("priya.rajagopal@couchbase.com, forKey: "email")
 do {
   try? db.saveDocument(mutableDoc)
 }
 catch {
   print("Error in saving document : (error)")
 }
```

#### 内部表現
ドキュメントがCouchbase Liteで作成されると、内部的には次のようになります。

```json
{
  "email": "priya.rajagopal@couchbase.com",
  "image": {
   "length": 3888349,
   "digest": "sha1–4xlj1AKFgLdzcD7a1pVChrVTJIc=",
   "content_type": "image/jpeg",
   "@type": "blob"
  },
 "type": "user",
 "name": "Priya",
 "id": "user::priya",
 "rev": "1–1c8502034001b333cc469fe8c4c39e112eedf8a3"
}
```


### 添付ファイル取得

以下は、既存の添付ファイルを持つドキュメントから、添付ファイルを取得するSwiftコードの例です。


```swift
 if let doc = db.document(withID: "user::priya") {
     let blobValue = doc.blob(forKey:"image")?.content
     // use the blobValue
 }
```
 

## 添付ファイル仕様

### 保存場所とサイズ

Couchbase Liteでは、添付ファイルは、対応するドキュメントを含むCouchbase Liteデータベースインスタンスに保存されます。これは、添付ファイルへの参照を保持する関連メタデータを含むドキュメントとは別に保存されます。同じ添付ファイルが複数のドキュメントで共有されている場合、添付ファイルの1つのインスタンスのみがデータベースに保存されます。

Couchbase Liteでは、添付ファイルのサイズに制約はありません。添付ファイルがCouchbase Serverと同期されないことが保証されている限り、添付ファイルのサイズは問題となりません。

## Couchbase Serverと同期した場合の制約

### 保存場所とサイズ

Couchbase Serverでは、添付ファイルは対応するドキュメントと同じCouchbase Serverバケットに保存されます。これは、添付ファイルへの参照を保持するメタデータを含むドキュメントとは別に保存されます。同じ添付ファイルが複数のドキュメントで共有されている場合、添付ファイルの1つのインスタンスのみがバケットに保存されます。

JSONドキュメントに1つ以上の添付ファイルを添付できます。ドキュメントに関連付けることができる添付ファイルの数に厳しい制限はありません。ただし、添付ファイルのメタデータはドキュメントの拡張属性に保存されるため、添付ファイルの数は、ドキュメントごとに許可される同期メタデータのサイズによって制限されます。添付ファイルのメタデータは100〜200バイトの範囲をとり、同期メタデータのサイズはドキュメントあたり1 MBに制限されているため、ドキュメントに関連付けることができる添付ファイルの数には実際的な制限があります。

添付ファイルの最大サイズは20MBです。これは、Couchbase Serverのドキュメントサイズの制限によるものです。

### 同期の条件とプロセス

レプリケーションプロトコルは、添付ファイルが更新された場合にのみ添付ファイルを同期するように最適化されています。これは、関連付けられたJSONドキュメント内の他のデータが更新された場合でも、Couchbase Liteクライアントによってプッシュまたはプルされないことを意味します。

関連するすべての添付ファイルが正常に同期されるまで、ドキュメントはSync GatewayまたはCouchbase Liteによって永続化されません。そのため、関連するドキュメントがない孤立した添付ファイルとして存在する時間が生じる可能性があります。その後の同期で、添付ファイルが既に保持されていることが認識され、ドキュメントのみが同期されます。

### Sync Gateway APIとの併用

添付ファイルをCouchbase Liteクライアントで利用するだけでなく、Sync Gateway APIから利用（作成・変更）することが可能です。ただし、この場合、添付ファイルの内部表現に違いが生じます。そして、異なる方法で作成されたデータ間の整合性を保つために、開発者が考慮しなければならない要素が生じます。

詳しくは、以下のブログを参照してください。

https://blog.couchbase.com/store-sync-binary-data-attachments-blobs-couchbase-mobile/
[初心者向け]卒論(Word)の変更履歴をgitで管理しよう

# はじめに
- 変更履歴を保存せずにWordファイルに内容を上書きするのは**危険**である。
- 内容を消した状態で保存すると元に戻せない。Wordファイル自体を消してしまうと元に戻せない。

## あまり望ましくない対策
- Wordの**校閲ツール**で変更履歴を保存
    - 共同編集する校閲ツールとしては非常に優れているが、いくつか欠点がある。
    - (おそらく)**複数回前の履歴一覧**を見ることができない。
    - Wordファイル自体を消してしまうと**元に戻せない**。
    - 図表番号が反映されない**バグ**がある。
- バージョンごとに**新しいファイル名で保存**する。
    - `卒論_1章_ver1.docx`、`卒論_1章_ver2.docx`、...みたいな感じ
    - 保存する**手間**がかかる。**容量**がひっ迫される(Dropbox等の保存容量が制限されているクラウドストレージを用いている場合は困る)。
        - 非常に**細かい変更履歴管理**をしづらい(ファイル数が増えるため)
    - **何を変更したのか**メモできない。.txtファイル等で**別途管理**する必要がある。
- Google Driveの変更履歴を利用
    - ファイルごとの管理はできるがフォルダごとの管理はできない(はず)
        - 測定データを含むフォルダ全体を巻き戻したい場合、ファイル一個一個につき処理を行う必要がある。

## 今回紹介する方法
- **`GitHubデスクトップ`**というアプリで**変更履歴管理**を行う。
    - 変更履歴はgitで管理
    - GitHubでオンライン上に変更履歴を保存する。**PCが壊れた時の対策**。
- **共同編集は校閲ツール**で行う
    - 変更前のファイルと変更を加えるファイルを用意(ファイルは2個で済む)。
        - 両方とも変更履歴を停止する。
    - `変更内容の組み込み`機能を用いて変更内容を反映。

# 環境構築
## GitHubアカウントの作成
- [アカウント作成](https://qiita.com/ayatokura/items/9eabb7ae20752e6dc79d)を参考に行う。

## GitHubデスクトップのインストール・設定
- [インストール方法](https://docs.github.com/ja/desktop/installing-and-configuring-github-desktop/installing-and-authenticating-to-github-desktop/installing-github-desktop)を参考にインストールを行う。
- GitHubデスクトップを起動し、[認証方法](https://docs.github.com/ja/desktop/installing-and-configuring-github-desktop/installing-and-authenticating-to-github-desktop/authenticating-to-github)を参考にGitHubアカウントへのログインを行う。

## 変更履歴を管理するフォルダの指定
- [リポジトリの作成](https://docs.github.com/ja/desktop/installing-and-configuring-github-desktop/overview/creating-your-first-repository-using-github-desktop#creating-a-new-repository)の`新しいリポジトリの作成`を行う(`チュートリアルリポジトリの作成とクローン`ではない)。Local Pathは変更履歴を管理したい**卒論の入っているフォルダを指定**する。
- [リポジトリのアップロード](https://docs.github.com/ja/desktop/installing-and-configuring-github-desktop/overview/creating-your-first-repository-using-github-desktop#creating-a-new-repositor)の`パート4: リポジトリを GitHub に公開する`を参考にして、先ほど作ったリポジトリをGitHub上にアップロードする。
    - **`Keep this code private`にチェックがついていることを確認**する。ついている限りほかの人から見られることはない。

## Wordの変更履歴を見れるようにする設定
- [設定]()を参考にtikaとJavaのインストールを行う。

# 変更履歴記録の流れ
- 添削してもらったWordファイルをコピーして`ファイル名_base.docx`、`ファイル名.docx`の二つのファイルを作る。
    - 編集するのは`ファイル名.docx`である。
    
## Git側
- Wordである程度変更を加える。
- GitHubデスクトップを開く
- Summaryをクリックして今回の変更内容を簡潔に述べる。
    - Changes内の任意のファイルをクリックすると変更内容が表示される。
        - Historyで過去の変更履歴を見れる。
    - Commit to masterで変更内容をPCのリポジトリに保存。
- 定期的に中央上のPush originでGitHub上に変更履歴をアップロード。
    - Repository>View on GitHubで実際にアップロードされていることを確認できる。
- 提出できる状態になるまで以上の流れを繰り返す。」

## Word側
- 提出できる状態になったら、Wordの校閲ツールの中から`ファイルを比較`を選び、`ファイル名_base.docx`、`ファイル名.docx`を比較する。
- これによって変更内容がWordの校閲ツールに反映されたため、提出する。

# 詳細(おまけ)
## gitでできること
- 変更履歴をCommitの形で管理
- 変更内容をChanges上で見やすい形で見ることができる
- 初版からすべての変更履歴を簡単にHistoryからみることができる。
- Revert Commitで変更履歴の巻き戻しが可能。
- Branchで複数の方向の変更を行う場合でも対応可能。
- Mergeで複数人、複数の方向の変更をまとめることが可能。
Github desktopでOfficeの変更(diff)履歴を表示する

# 初めに
- Word,Excel,Powerpointはバイナリファイル(xmlを圧縮したデータのため)なので、通常は変更内容(diff)の表示はできない。それでは不便なのでgit上でdiffを表示するために必要な手段を述べる。
- 環境
    - Windows
    - GitHub Desktop
        - GitHubとの連携が初心者でも簡単にできるため。また、自動的に更新されることが便利なので用いる。

# アプリのインストール
## tika
- https://tika.apache.org/download.html から`tika-app-{バージョン}.jar`の最新バージョンをダウンロード。`{バージョン}`は最新のバージョンに置き換える。
- `C:\\Program Files\\`にtikaフォルダを作り、`tika-app-{バージョン}.jar`を入れる。

## java
- https://www.java.com/download/ie_manual.jsp からダウンロード、インストール。**再起動する**。

# 設定の記述
- リポジトリのあるフォルダ内に`.gitattributes`ファイルを作り、以下の内容を記載。
    - これはWord,Powerpoint,Excelの拡張子のファイルがある場合にはtikaを使ってdiffを表示するということを指定している。

```
*.doc diff=tika
*.docx diff=tika
*.ppt diff=tika
*.pptx diff=tika
*.xls diff=tika
*.xlsx diff=tika
```

- リポジトリのあるフォルダ内に`.gitignore`ファイルを作り、以下の内容を記載。
    - Wordを開いて作業中は未保存のデータが一時的に保存される。これがあるとGitで変更履歴の記録を行うことができないので、無視する設定を行う。

```
~*
```

- リポジトリの`.git/config`ファイルの最後に以下の内容を追加。
    - これはtikaを指定したときに実行されるコマンドを指定する。`{バージョン}`は実際に使うバージョンに置き換える。

```
[diff "tika"]
  binary = true
  textconv = java -Dfile.encoding=UTF-8 -jar 'C:\\Program Files\\tika\\tika-app-{バージョン}.jar' -t
```

# 参考リンク
https://medium.com/@mbrehin/git-advanced-diff-odt-pdf-doc-xls-ppt-25afbf4f1105
Houdini19 Karma 初見所感・備忘録・Tips

# Houdini19 Karma 初見所感・備忘録・Tips

Houdini19でネイティブレンダラーのKarmaが大幅に更新されたので、備忘録も兼ねて所感やTipsを記載致します。

![E_MotionGraphics_06_01_00012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/3f8de56c-d75c-84f4-084f-e908808ba523.png)

## 全体的に良くなったと感じたポイント
* ROPから「Karma」ノード一つでKarmaを呼び出せるようになったところ。（勿論LOPでの細かい調整も可能）
* 各種パラメータやUIが、従来のHoudiniの作業感覚及び従来のネイティブレンダラーであるmantraの作業感覚で扱えるように調整・改善されているところ。

上記2点のアップデートにより、従来のHoudiniの作業感覚そのままで自然とKarmaが扱えるようになったように感じます。

## 全体的に気になったポイント
Karma……というよりKarmaに付随する要素ですが、大量に追加されたマテリアル関係のノード群にRedshiftの「RS Material Brender」ノードのような、シンプルに強力で使いやすい便利ノードが無いのが少し気になりました。

## KarmaCPU・初見所感

* 端的な触り心地はmantraの強化版といった感じ。
* レンダリング速度はmantraと比べるとそこそこ早くなっている。
    * SSSや透過物のようなモノのレンダリング速度はmantraから大幅に改善されているように感じます。
* 従来のHoudiniのマテリアルがほぼそのまま使用できるので、従来環境との共存や段階的な移行もし易いです。

総じてmantra同様に堅実で確実な印象です。ただし昨今の強力な高速レンダラーに比べると速度面では歯がゆい感じなので、mantraから早くはなりましたが、更に何倍か早くなって欲しいところです。

## KarmaXPU・初見所感
* レンダリングが早い。
* モダンなレンダラーのレンダリング速度。
* 強力なレンダラーですが現状はアルファ版なので注意。ざっと触っただけでも**Houdini19.0.383**の場合、KarmaCPUと下記の違いがありました。
    * 頂点カラーが反映されない。
        * KarmaCPUで問題なく頂点カラーが反映されているものでも、KarmaXPUでは現状そのままでは反映されない。
        * 19.0.460では問題なく頂点カラーが反映されるようになっているという情報有り（未検証）。
    * 「Layer mix」等の一部のマテリアルノードが反映されない。
    * SSS等の設定が反映されない。

総じて速度面ではモダンなレンダラーに比肩する強力さを感じました。また、ネイティブレンダラーなので**Houdiniをインストールするだけで使用可能＆Houdiniの仕組みの延長で使用可能&Houdiniの思想の延長で使用可能** という点も極めて強力に感じました。

一方、アルファ版なので上述したような問題点も生じましたが、これは開発が進むに連れて改善されることでしょう。

## Tips
* **Optix Denoiser は依然として強力**
    * 下記画像は「pixcel Samples」を「9」という低い値にしていますが、Optix Denoiserをオンにするだけでノイズを大きく軽減できています。
![211129_karmaXPU_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/5526d3f0-b97a-184d-daa7-5acdcda66ec5.png)
ただし、Optix Denoiser は強力ですが、強力ゆえにこのデノイズ感が逆に気になるという場合もあるので、適宜使いわけが必要です。
上記画像の場合、「pixcel Samples」を低めにしているのでKarmaCPUでもそこそこ高速でレンダリングできますが、KarmaXPUだとこれ位の画像は1コマ数秒でレンダリングできます。

* **AOV設定**
    * AOVは下記画像のように各タブの中で設定できます。ここら辺の使用感はmantraとあまり変わりません。
![211129_karmaXPU_04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/a6e89477-786b-4519-8b55-05d42a1c4e2a.png)

* **マテリアルの変更が反映されない場合**
    * 下記画像の様に「Restart Render」をクリックすると大体解決します。 
![211129_karmaXPU_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539096/0cf76263-50c2-d6a1-0a17-1bd3486607fc.png)
ただし、XPUはまだアルファ版だからかこれで解決しない場合もあります。その場合は Karma Viewport を再度開き直す等の対応が必要になります。**Karma Viewport を再度開いても状況が改善されない場合は、タイムラインをシークして別のフレームを表示すると高確率で最新のマテリアル情報が反映されます。**



## 参考になる資料等
タイムリーなことに、SideFX社公式チュートリアルにHoudini19環境でのKarmaやマテリアル設定に関する一連のチュートリアルが投稿されましたので記載致します。
[KARMA | A BEAUTIFUL GAME](https://www.sidefx.com/tutorials/karma-a-beautiful-game/)

## おわりに
Houdini19でKarmaは大分強化され、将来性も期待できるものになったと個人的には思います。
とはいえ、Houdiniのレンダリング周りの資料やTipsは依然として少ないように感じましたので、今回はKarmaについて簡単な所感やTipsを紹介させて頂きました。
如何だったでしょうか？　少しでも皆様のHoudiniの勉強のお役に立てたのなら幸いです。

最後までお目通し頂きありがとうございました。
RDS ストレージの自動スケーリングの注意点

## ストレージの自動スケーリング

RDSのストレージ量の管理は自動スケーリングに任せっぱなしでした。
自動スケーリングの条件は
>- 使用可能な空き領域は、割り当てられたストレージの 10% 未満です。
- 低ストレージ状態は 5 分以上続きます。
- 最後のストレージ変更、あるいはインスタンスでストレージの最適化が完了してから少なくとも 6 時間経過しています。

参考：[Amazon RDS ストレージの自動スケーリングによる容量の自動管理](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_PIOPS.StorageTypes.html#USER_PIOPS.Autoscaling)

となっており、「最後のインスタンスでストレージの最適化が完了してから少なくとも 6 時間経過しています」が落とし穴になり得ます。
ストレージを新たに割り当てた直後に再度大量にストレージを消費した場合、スケーリングできずに"STORAGE_FULL"の状態になってしまい、動作しなくなります。
その際は[こちらのドキュメント](https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-out-of-storage/)を参考に対応するしかなさそうです
After Effects 波形ワープ　波を作る。

完成品
![波.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/13a54888-557d-0fcb-ce96-23894e5c1c0b.gif)


#■波形ワープ　エフェクト
四角のシェイプを作り。
波形ワープのエフェクトをつける。

下記のように設定
![スクリーンショット 2021-11-29 16.04.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/22d366ba-3353-439b-6d30-73898a06759f.png)

するとこうなる。
![スクリーンショット 2021-11-29 16.04.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/aee2c4ad-4148-1260-8807-db3eb95d0735.png)

#■タービュレントディスプレイをかける。
波の動きが若干水っぽくなる。

下記のように設定。
![スクリーンショット 2021-11-29 16.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/f6b1570d-5b48-a9f0-fd70-7ee3004b5a88.png)

###▼チョークをかける。
かどを滑らかにしてより水っぽく
18

###▼複製。
複製して
どちらかのエフェクトを全部外す。
command + shift + E

下にずらし隠す。
![スクリーンショット 2021-11-29 16.22.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/ce75591c-ae90-c44d-eb93-efddfe06fdee.png)

###▼プリコンポーズ
二つをプリコンポーズして
プリコンポーズしたものを複製。
色変更
ドロップシャドウ片方にかける。
ドロップシャドウかかってないやつを上にずらす。

![スクリーンショット 2021-11-29 16.43.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/7ced6a88-372e-5b5c-4a6a-df4368a3f2b0.png)

二つの波をプリコンポーズして完成。

参考Youtube
https://www.youtube.com/watch?v=SP6O_sdJFzY&t=622s
MySQL: sql_mode=only_full_group_byについて

まずはエラー文章をご覧ください。

```
Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘dbnam.tablename.columnname’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
```

ローカル環境で、上記のようなエラーが出ることがあります。
これはselect文の書き方が間違っている、というようなエラーです。

SQL文に、
group by （色々） という書き方で書いてしまうと、そんな書き方は許可されてないそうです。
MySQL5.7以降は、そういうのを許可してないみたいです。

`sql_mode=only_full_group_by`

このような機能がデフォルトでオンになっています。
なので、どうするかというと`sql_mode`を空っぽにしておけば良いです。

```
#docker-compose.yml
~~（中略）〜〜
  ### MySQL ##################################
  mysql:
    image: mysql:5.7
    command: --max_allowed_packet=32505856      # Set max_allowed_packet to 256M (or any other value)
    environment:
      MYSQL_ROOT_PASSWORD: xxxx
      MYSQL_DATABASE: xxxxxxdb
      MYSQL_USER: xxuser
      MYSQL_PASSWORD: xxxxxxxxxxxx
    volumes:
      - mysql-database:/var/lib/mysql
    ports:
      - 43306:3306
    networks:
      - backend
    command: --sql_mode="" ←コレ
```

ドッカーを落として上げてみたいなことをします。

```
$ docker-compose down
$ docker-compose up -d
```

コレでこのエラーは回避できます。

参考リンク：
http://muchag.undo.jp/archives/3487
「DNS_PROBE_FINISHED_NXDOMAIN」の切り分け

chromeで「このサイトにアクセスできません」と書かれている下`DNS_PROBE_FINISHED_NXDOMAIN`と書いてあった場合の切り分け備忘録。
AWSでの構築前提。

##1.ALBのDNS名へのアクセスを試す
これでアクセスできれば2.へ進む
アクセスできないならALBより先の切り分けを行う

##2.NSレコードの状態を見る
こうなればNSレコードが消えているのでドメイン管理している先を確認

```
$host -tNS testapp.com
Host testapp.com not found: 3(NXDOMAIN)
``` 
こうなるとドメインに問題がない為Route５３のレコードにNSレコードが登録されているか確認する

```
$host -tNS testapp.com
testapp.com name server ns-xxx.awsdns-xx.org.
testapp.com name server ns-xxx.awsdns-xx.com.
testapp.com name server ns-xxx.awsdns-xx.net.
testapp.com name server ns-xxx.awsdns-xx.co.uk.
```
[JavaScript]onloadイベントについて

# onloadイベントとは
HTMLページに含まれるすべてのリソースの読み込みが完了したら発生するイベント。


# onloadの書き方

基本的な```onload```イベントの書き方は以下となる。

```javascript
window.onload = funcrion(){
    //　処理内容
}
```

上記のように```window```を指定すると、HTMLページに含まれるすべてのリソースが読み込まれた後に処理内容で指定された処理が実行される。
また、```window```の部分に「```img```」などのHTML要素を指定することもできる。この場合、指定された要素の読み込みが完了した時点で処理が実行される。

さらに、```addEventListener```を使って以下のように書くこともできる。

```JavaScript
window.addEventListener('load',function(){
    // 処理内容
})
```
この2つの違いとして、同じ要素に複数のイベントハンドラーを設定することができるかどうかです。
```onload```の場合は上書きされるため、最後に設定された処理だけが実行される。一方で、```addEventListener```は上書きされないため、設定されたすべての処理が実行される。
EC-CUBE4：ヨーダ記法と代入演算子の組み合わせ

まずはEC-CUBEのソースコードのサンプルをご覧ください。

```php
if ( null !== $response = $this->shoppingService->checkOrder($flowResult)) {
    return $response;
}
```
最初にnullが来てて、突然何かをreturnするだけしてて、なんだかよく分からない感じ。

##解説
「ヨーダ記法」は、「BはAである」と倒置法でしゃべるスターウォーズのヨーダから来ている、らしい。

```php
if( true == $val ){}
```
代入演算子とは、変数に値を代入するアレ。

```php
$val = 123;
```
関数の実行結果を返す。

```php
$num = 123;

----
$val = $this->check($num);

private function check($num)
{
  if ( 123 == $num) {
    return true;
  }
}
----

log_info($val); //true
```
厳密には違うけど、上記を組み合わせると、
↓だいたいこんな感じになる。

```php
if ( true == $val = $this->check($num)) {
  return $val;
}
```

比較演算子は、右辺と左辺の計算が終わった後に実行されるので、
変数に代入するのとnullの判定を同時に書けるっぽい。

後ろに比較演算子を持ってくるよりかは見やすい
・・・ような気がする。
terraformが実行可能か速攻で実験したい場合の手順

# 概要
時々、localでterraformの動きを確認したいことがあります。
その時に早く実験を開始できる方法を書いておきます

# AWSの設定をする。
ターミナルでterraformは実行すると思いますが、ターミナル上でのAWSの設定がそのままterraformのデプロイ先になります。
`~/.aws/config`や環境変数を利用してaws cliが叩けるようにしておきます。

そこで、以下のコマンドで現在のユーザーを確認しておきます。

```
aws sts get-caller-identity
```

ユーザーを間違えて、商用アカウントなどにデプロイしないように注意しましょう

# terraformのファイルを記述

適当な場所にディレクトリを作ります。
その中にファイルを作っていきます。

必要なのは2つのファイルです

```hcl:provider.tf
provider "aws" {
    region = "ap-northeast-1"
}
```

```hcl:iam.tf
resource "aws_iam_group" "test" {
  name = "testgroup"
}
```

IAM User Groupの作成で動作確認するのがおすすめ。

# terraform init

`terraform init`で初期設定をおこないます。`aws provider`など勝手に設定してくれます。

# 適用

以下の順番で

* `terraform fmt`でフォーマットを整える
* `terraform valid`で変なとこがないか見ておく
* `terraform plan`で適用内容を確認
* `terraform apply`で適用し、実行できたことをaws consoleなどで確認する。

# 後片付け

* `terraform plan --destroy`で適用内容を確認
* `terraform destroy`で適用し、リソースがなくなったことをaws consoleなどで確認する。
サーバーでファイル開いたら文字化けする場合

日本語ファイルをvimで開く場合に
文字を打ち替えたいのに、文字化けしちゃってて編集できないよぉぉ〜ってなる。悲しい。

##回避方法
Linuxの `vim` で `xxxx.yaml` などの日本語文字化けを防ぐには `vimrc` を設定しておきます
プロジェクト直下にて

```sh
$ vi ~/.vimrc
（viエディタが開くので、--INSERT--モードにして、下記の2行を貼り付ける）

set encoding=utf-8
set fileencodings=iso-2022-jp,sjis,utf-8

Ctrl+C （コマンド入力モードにして）
:wq! （保存して終了）
```
初期設定のファイルをプロジェクト直下？に作っておく。
そうすると文字化けしなくなります。
umaskの設定について

umask設定についてよくわからなかったので調査

https://pg.mnztech.work/dokuwiki/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E6%A7%8B%E7%AF%89/RHEL8/42.%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-umask%E9%96%A2%E9%80%A3

結論から
umaskの値をデフォルトから変更したい場合は
「/etc/profile」と「/etc/bashrc」両方のumask値を変更する必要あります！！
※SSHログイン時に/etc/bashrcは実行されない。
※原因はわかりました。shopt -q login_shell
.bashrcに記載があった。
こんなコマンドわかんねぇーって飛ばしていたらこいつだった。
俺いつも読み飛ばしたものが犯人だったこと多数。この性格治らないかなぁ。。。


https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/displaying-the-default-umask_assembly_managing-the-umask

コンソールログインとsshログインの時にbash実行方法が異なっていることがわかりました。

詳しくは
https://qiita.com/ikkyu193/items/5c9a87b22fdf7697422e
わかりやすいです。
サーバーの隠しファイルが見たい場合

ファイルのリスト表示をする時によく使うLL

```
$ ll   　　　//← ls -l と同じです
```
しかし`.env`とか`.htaccess`が見えない。
見えてないと、時間をロスしてしまうので、
隠しファイルがみたい場合は、隠しファイルごとみるようにする。

```
$ ls -a
```
または

```
$ ls -la
```

`ls -la`が使い勝手良さげです。
TypeScript で Cloneメソッドを実装する(浅いコピー)

TypeScriptでCloneメソッドを実装しようとしたら、手こずってしまったので備忘録で書き残しておきます



```ts
// Shallow clone example

interface Constructor<M> {
  new (...args: unknown[]): M;
}

class Bear {
  /** born on */
  public readonly bornOn: Date;

  constructor(params: { bornOn: Date }) {
    this.bornOn = params.bornOn;
  }

  public clone() {
    const constructor = this.constructor as Constructor<this>;
    return new constructor(this);
  }
}

class PetBear extends Bear {
  /** name */
  public readonly name: string;

  constructor(params: { bornOn: Date; name: string }) {
    super(params);
    this.name = params.name;
  }
}

const bear = new Bear({ bornOn: new Date("1858-10-27") });
const pooh = new PetBear({
  bornOn: new Date("1921-08-21"),
  name: "Red shirt Pooh",
});
const clonedBear = bear.clone(); // const clonedBear: Bear
const clonedPooh = pooh.clone(); // const clonedPooh: PetBear

console.log(clonedBear);
console.log(clonedPooh);

```

https://www.typescriptlang.org/play?#code/PTAEGUAsEMBtYPYHdQGNEDsCmosA9oBbAB1iwFgAoKgSwwBcsAnAM2lRwGEEMBnepgFdU9BEwA8AWQB8oAN5VQobCgAUAOk3QmAc14AuUIIwBrDMgwBtALoBKQ5IDcVAL5Uq6aL16gAQlm15RVBgACpQ0AAjMQxQHlBQ4GDiQUjYGlRQJgCAEx5YAE8omIB5DEMAEWhGZ2pKJVQefiERMVVibSIDeWKmDDLK6pwXWyD6pVB6SBpedWi+stAAXlAOpi650oxapTc6pRS0jLRMLFVRhXGGpvo0G5bRJmXJ6dnGvgFhR9AvUG4Ph5icRTGbSHYTbL0QR9ZRYFDvZpfNog3i2cF7PYeWBeHwABSw9H8gXwjAwOR8RKelyUYQiGCIOESyVS6Uy2WgeQwhWUDMMzToOlqwQRn1aTHanUI3TkvX65VAVRqPMIWD5AgFoBGYwmoF4gmIzAl6ylaOCShR6npKueaw2Vqw6Nc7koIqiASeKxUfndqhl8zlhi9irOACIAIwADgArBGALRhgAMsYATAB2EOjEa1V3EBAISDPL34wk+6mygawlDB1ThgCcybDsYTcYbGYANMF7YYQwAlLA5XXTJi3XF5yAhjuULMeG4nHj9ynPSLu9ToefnbOztfYHKj-M2ser04b50IhBkdSIHSqbcL92ml1Nc9YS8Ia+33djh9AA
Rustの関連型とジェネリクス

この記事はEAGLYS Advent Calendar 2021の2日目の記事です。

# モチベーション

タイトルの２つの違いがどうにも分かりづらかったので、自分なりに解説します。

[https://doc.rust-jp.rs/rust-by-example-ja/generics/assoc_items.html](https://doc.rust-jp.rs/rust-by-example-ja/generics/assoc_items.html)

# 簡単なまとめ

|  | 実装できる回数 | 型パラメタ |
| --- | --- | --- |
| ジェネリクス | 1回以上 | 必要 |
| 関連型 | 1回 | 不要 |

# 関連型

まず、 `IntPack` に `Pack` トレイトを実装して標準出力します。関連型を使った場合は以下です。

```rust
use std::fmt::Debug;
#[derive(Debug)]
struct IntPack(i32);
trait Pack {
	type A;
	fn get(&self)->Self::A;
	fn set(&mut self,content:Self::A)->();
}

impl Pack for IntPack {
	type A = i32;
	fn get(&self) -> Self::A {
		self.0
	}
	fn set(&mut self, content: Self::A)->(){
		self.0 = content;
	}
}

fn debug<A:Pack+Debug>(a:A){
	dbg!(a);
}

fn main() {
	let int_pack = IntPack(10);
    debug(int_pack);
}

```

ジェネリクスを使った場合はIntPackの`i32` にしか実装しないことがわかっているのに、型パラメタを指定しなければなりません。ジェネリクスの場合、複数の`Pack<A>`の実装がコードに存在しうるからです。

```rust
use std::fmt::Debug;
#[derive(Debug)]
struct IntPack(i32);
trait Pack<A> {	
	fn get(&self)->A;
	fn set(&mut self,content:A)->();
}

impl Pack<i32> for IntPack {
	fn get(&self) -> i32 {
		self.0
	}
	fn set(&mut self, content: i32)->(){
		self.0 = content;
	}
}

fn debug<A:Pack<i32>+Debug>(a:A){
	dbg!(a);
}

fn main() {
	let int_pack = IntPack(10);
    debug(int_pack);
}
```

型`A`についてだけ`Pack`トレイトが実装されることがわかっている場合、関連型は有用です。

# ジェネリクスの強みは？

関連型の場合、一回しか`Pack`トレイトを実装できません。これは関連型というよりは、トレイトの仕様です。複数実装すると `impl Pack for IntPack {~}` が衝突します。

```rust
use std::fmt::Debug;
#[derive(Debug)]
struct IntPack(i32);
trait Pack {
	type A;
	fn get(&self)->Self::A;
	fn set(&mut self,content:Self::A)->();
}

impl Pack for IntPack {
	type A = i32;
	fn get(&self) -> Self::A {
		self.0
	}
	fn set(&mut self, content: Self::A)->(){
		self.0 = content;
	}
}

// conflicting implementations of trait `Pack` for type `IntPack`
impl Pack for IntPack {
	type A = i64;
	fn get(&self) -> Self::A {
		self.0
	}
	fn set(&mut self, content: Self::A)->(){
		self.0 = content;
	}
}

fn debug<A:Pack+Debug>(a:A){
	dbg!(a);
}

fn main() {
	let int_pack = IntPack(10);
    debug(int_pack);
}
```

ジェネリクスの場合、複数回実装が可能です。`impl Pack<A> for IntPack {~}` のAが異なれば、それは異なる実装になるので、実装が衝突することはありません。

```rust
use std::fmt::Debug;
#[derive(Debug)]
struct IntPack(i32);
trait Pack<A> {	
	fn get(&self)->A;
	fn set(&mut self,content:A)->();
}

impl Pack<i32> for IntPack {
	fn get(&self) -> i32 {
		self.0
	}
	fn set(&mut self, content: i32)->(){
		self.0 = content;
	}
}

impl Pack<i64> for IntPack {
	fn get(&self) -> i64 {
		self.0 as i64
	}
	fn set(&mut self, content: i64)->(){
		self.0 = content as i32;
	} 
}

fn debug<A:Pack<i32>+Debug>(a:A){
	dbg!(a);
}

fn debug64<A:Pack<i64>+Debug>(a:A){
	dbg!(a);
}

fn main() {
	let int_pack = IntPack(10);
    debug(int_pack);
}
```

# まとめ

関連型とジェネリクスの使い分けは

- 複数回実装可能だが、型パラメータを指定しないといけないのがジェネリクス
- 一回しか実装できないが、型パラメータを指定しなくてよいのが関連型

と言えます。
EC2に直接ファイルを置きたい | SCPコマンド

EC2に何かファイルを直接置きたい、と思った時の手順です。

例えば nuxt で何かを作ってbuildした後に、それをアップロードするやり方です。
「gitでできるじゃん」、とおもうかもですが、そういう通常パターンが通じなかった場合のやり方。

##ビルド

```sh
$ npm run build
```
#デスクトップで作業する

プロジェクトのdistにかき出されたファイルを、デスクトップに移動する
（移動しなくても良いんだけど、今から何を上げるのか、上げたのか、わかりやすいので）

```sh
$ mv /Users/YOURNAME/nuxt_project/dist/ /Users/YOURNAME/Desktop/dist
```
デスクトップに移動＋そこに存在するのか確認する。

```sh
$ cd /Users/YOURNAME/Desktop
$ ls -l
drwxr-xr-x   7 YOURNAME  staff       224 Feb 24 14:33 dist
```

##テスト
はじめてで不安な場合は、まず練習用に、空のテキストをアップロードして試しましょう。
間違っておかしな場所に上がっちゃっても、ノープロブレムなファイルを用意します。

```sh
$ touch test.txt
```

##フォルダを圧縮する（tar.gzコマンド基本形）
test.txtを圧縮する場合はコレ

```sh
$ tar zcvf test.tar.gz test.txt
```
distフォルダを圧縮する場合はコレ

```sh
$ tar zcvf dist.tar.gz dist
```

##.ssh/config
アップロードのコマンドを打つ前に ssh でログインできる状態にしておく。
.ssh の config をやっておけば鍵や、bastion（踏み台サーバー）も通過できます。

.ssh/config を開いて設定をしておきます。sshログインできるか先に確認すること

秘密鍵`x.pem`を同じフォルダに放り込んでおいて下さい。

```
Host x-web-1
  HostName x.x.x.x
  User ecx-user
  Port 22
  IdentityFile ~/.ssh/x.pem
  ProxyCommand ssh -W %h:%p x-bastion

Host x-bastion
  HostName x.x.x.x
  User ecx-user
  Port 60xxx
  IdentityFile ~/.ssh/x.pem
```

##アップロードする（SCPコマンド基本形）
もっかい`pwd`で自分がデスクトップをみているのを確認して、

```
$ pwd
/Users/YOURNAME/Desktop
```
対象ファイルがデスクトップにあることを確認して、

```
$ls -l
```
こちら↓
`scp （対象ファイル） (対象サーバー)：（ディレクトリ）`

★test.txtを圧縮したやつをおくには

```sh
$ scp test.tar.gz x-web-1:/var/www/html
```

★distを圧縮したやつをおくには

```
$ scp dist.tar.gz x-web-1:/var/www/html
```

##EC2にログインして移動する。
ログイン

```
$ ssh x-web-1
```

移動する

```
$ cd /var/www/html
```

##解凍する（基本コマンド）

```
$ tar zxvf test.tar.gz
$ tar zxvf dist.tar.gz
```
解凍するとその階層に「test.txt」または「dist」ディレクトリが置かれます。

##アップロードした圧縮ファイルは削除する
何回かやってると、ゴミが溜まっちゃうのでこまめに消す。

```
$ rm -r test.tar.gz
$ rm -r dist.tar.gz
```

ファイル名がそのままでは、domain-name.com/dist/になってしまい、カッコ悪いので

```
$ mv dist special-contents
```
↑これでディレクトリ名は書き換えられます（最初から名前を変えてアップしたほうがスマートなのでは・・）

これでディレクトリがちゃんときれいになってるか確認

```
$ ls -l
```

作業終了

```
$ exit
```

##注意点
このやり方だと、もし`git`で監視してる場所を書き換えると `diff` が出てしまい、
`git pull`ができなくなるので、必ず`git`監視外の部分でやる。
そもそも `git` コマンドを使わないでアップロードする、というのが邪道ですが。
doxygen 備忘録

この記事は、2021/11/29に記載


#doxygenとは
コードの中に、クラスや関数、変数などにとある規則に従って説明をつけることで、HTMLやWordなどにシステムの設計書を”ペッ”て吐き出す便利なツール

###目次
・ダウンロードとインストール
・doxygenの設定
・コメントの定義、種類
・最後に


##ダウンロードとインストール
[doxygen](https://www.doxygen.nl/download.html)←リンク
Window 版なので、サイト中央の「ソースディストリビューション」からダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/ba053beb-19db-b51d-1fa0-7b9ba5ec870a.png)

インストールの手順は下記のサイトを参考に行うと良いかと、、、

https://tracpath.com/works/development/doxygen_beginers_guide/

##doxygenの設定
基本は下記のサイトを参考に設定した。
ここでは、最低限必要な個所を赤く囲っている

https://qiita.com/wakaba130/items/faa6671bd5c954cb2d02


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/566bb612-9ea3-4978-759e-f5897a0ece81.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/0dffe182-cbc9-f51d-0d1c-58b36fd48b8d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/47374dc1-b6cc-04df-8878-78458a3af459.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/c3e00bb5-a83c-4cd8-da8f-4a872fe0fbbe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/db780f87-8dc9-bd6c-0297-b86597a5e439.png)
エディタの環境による。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/4762e301-5104-ada4-1695-80e5d69b79cc.png)
除外したいフォルダ名を記載する。ビルドでDebugやReleaseフォルダが作られてしまう為、除外リストに追加した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/0ff08fa1-01dc-c860-1c67-ae233cb850e2.png)

「Run doxygen」をクリックするとプロジェクトディレクトリに下図のようなファイルなどが生成される。
「Doxyfile」は設定ファイルであり、こちらを共有すれば他の人も同じ設定でドキュメント出力できる。
また、「rtf」フォルダの『refman.rtf』はWordでも開ける形式になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/29cd0224-8610-687e-da40-29c8ec38537f.png)

##コメントの定義、種類
コメントの書き方は、先程の設定方法を参考にさせていただいた記事にもコメントの記載方法が記されていたが、ドキュメントコメントでもdoxygenは対応している為、一部だけ参考にさせていただいた。

https://qiita.com/wakaba130/items/faa6671bd5c954cb2d02

ドキュメントコメントは以下のサイトを参考にしている。

https://www.tairax.com/entry/Csharp/Document-Comment

###ファイル名へのコメント
@fileと@briefだけでもドキュメントに反映されます．

```C#
/**
* @file ファイル名.h
* @brief 簡単な説明
* @author 作成者
* @date 作成日
* @details 詳細な説明
*/
```

###関数へのコメント
\<remarks>はなくてもドキュメントに反映されます．

```C#
/// <summary> 関数の簡単な説明</summary>
/// <param name="a">引数aの説明</param>
/// <param name="b">引数bの説明</param>
/// <returns>　戻り値の説明 </returns>
/// <remarks>詳細な説明</remarks> 
bool function(int a, int b) {
    b = a + 3;
    return true;
}
```
###クラス、プロパティ、変数のコメント
####基本\<summary>でくくり説明を書けば伝わる

##最後に
ドキュメントコメントはコード内でも、関数や変数の説明が記載されている為、ドキュメントの書き起こしとコード説明の一石二鳥になる為、
積極的にドキュメントコメントを使う方がいいと思う。
Mariadb がインストールできない

#環境
Centos

#問題

Mariadb をインストールしようとしたところ以下のエラーが発生しました。

```
dnf module -y install mariadb:10.3

Waiting for process with pid 713 to finish.
Last metadata expiration check: 0:00:03 ago on 2021年11月29日 03時12分52秒.
Error: 
 Problem: problem with installed package mysql-server-8.0.26-1.module_el8.4.0+915+de215114.x86_64
  - package mysql-server-8.0.26-1.module_el8.4.0+915+de215114.x86_64 conflicts with mariadb-server provided by mariadb-server-3:10.3.28-1.module_el8.3.0+757+d382997d.x86_64
  - package mariadb-server-3:10.3.28-1.module_el8.3.0+757+d382997d.x86_64 conflicts with mysql-server provided by mysql-server-8.0.26-1.module_el8.4.0+915+de215114.x86_64
  - package mariadb-server-3:10.3.28-1.module_el8.3.0+757+d382997d.x86_64 conflicts with mysql-server provided by mysql-server-8.0.21-1.module_el8.4.0+589+11e12751.x86_64
  - package mysql-server-8.0.21-1.module_el8.4.0+589+11e12751.x86_64 conflicts with mariadb-server provided by mariadb-server-3:10.3.28-1.module_el8.3.0+757+d382997d.x86_64
  - cannot install the best candidate for the job
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
```


#原因

conflicts with ということからmysql と競合しているということが書いてあるみたいです。

#対処策

インストール済みのmysql を確認します。

```
rpm -qa | grep -i mysql
mysql-server-8.0.26-1.module_el8.4.0+915+de215114.x86_64
zabbix-server-mysql-5.0.17-1.el8.x86_64
mysql-errmsg-8.0.26-1.module_el8.4.0+915+de215114.x86_64
php-mysqlnd-7.2.24-1.module_el8.2.0+313+b04d0a66.x86_64
zabbix-web-mysql-5.0.17-1.el8.noarch
mysql-common-8.0.26-1.module_el8.4.0+915+de215114.x86_64
mysql-8.0.26-1.module_el8.4.0+915+de215114.x86_64
```

Mysql を削除します。

```
dnf remove mysql* 
```
削除した後、再びインストールを試みたらできました。
pydantic で利用可能な型を追加する

## はじめに

pydantic という便利な validation ライブラリが python にはありますが、こちらでは validation 可能な型が限られています。それを他の型を拡張しないといけない時があったので、メモがてらまとめました。

## どうやるのか

* https://pydantic-docs.helpmanual.io/usage/types/#custom-data-types

このあたりに詳しく書かれていますが、重要なのは `__get_validators__` と、そこで yield される関数たちです。pydantic で validation を行う時には、まずは、 `__get_validators__` が呼ばれます。これは、ジェネレータになっていて、記された実際の validation 関数を返し、一つ一つ実行していきます。

## 実際にやってみる。

上記の例を題材に、日本の郵便番号の validator を作ってみます。なお、実際に動かした環境は以下の通りです。

* Python 3.9.7
* pydantic 1.8.2



```python
import re

from pydantic import BaseModel


class PostalCodeJP(str):
    @classmethod
    def __get_validators__(cls):
        yield cls.postal_code_should_be_string
        yield cls.remove_hyphen_if_exists
        yield cls.postal_code_length_should_be_7
        yield cls.postal_code_should_be_numeric_string

    @classmethod
    def postal_code_should_be_string(cls, v: str):
        if not isinstance(v, str):
            raise TypeError('postal code should be string')
        return v

    @classmethod
    def remove_hyphen_if_exists(cls, v: str):
        if '-' in v:
            v = v.replace('-', '')
        return v

    @classmethod
    def posta_code_length_should_be_7(cls, v: str):
        if len(v) != 7:
            raise ValueError('postal code should be 7 length string')
        return v

    @classmethod
    def postal_code_should_be_numeric_string(cls, v: str):
        regex = r'[0-9]+'
        if not re.fullmatch(regex, v):
            raise ValueError('postal code should be numeric string')
        return v


class PostalCodeValueObject(BaseModel):
    postal_code: PostalCodeJP
```

それでは `__get_validators__` の一番上から順番に ValidationError を発生させてみます。まずは、郵便番号に文字列以外を用いた場合

```python
p = PostalCodeValueObject(postal_code=1111111)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pydantic/main.py", line 406, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for PostalCodeValueObject
postal_code
  postal code should be string (type=type_error)
```

次に `-` を除いた文字列が 7 文字以外になっている場合

```python
p = PostalCodeValueObject(postal_code='111-11111')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pydantic/main.py", line 406, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for PostalCodeValueObject
postal_code
  postal code should be 7 length string (type=value_error)
```

最後に、全ての文字が数字文字列以外になっている場合

```python
p = PostalCodeValueObject(postal_code='111-111l')  # 最後の文字が L の小文字になっている
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pydantic/main.py", line 406, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for PostalCodeValueObject
postal_code
  postal code should be numeric string (type=value_error)
```

## まとめ

* pydantic で validation に用いる型を追加したい場合を記しました。
* `__get_validators__` に validation したい関数を yield する。
* 公式ドキュメントには重要なことが書かれているので、よく読もう。
MAGeCKをMacにインストールしたときのメモ

CRISPR screenの解析パッケージであるMAGeCKをinstallしようと思ったが，以下のwikiの手順通りに進めてもうまくいかなかった

https://sourceforge.net/p/mageck/wiki/demo/#the-first-tutorial-starting-from-read-count-tables

http://tatsuomano.com/wordpress/2019/01/06/mageck/

具体的にはzip fileをdownloadしたあとにsetup.pyを実行しようと思ったが，エラーになるというものだった．

解決策
作成者のgithubからcloneを作ったらうまくいった

https://github.com/davidliwei/mageck

なんで初めうまくいかなかったのかよくわかってない
Ubuntu20.04 で US キーボードに変更

今まで、Ubuntu + ThinkPad X230(日本語キーボード) の環境に、
「トグルキー操作なしで日本語入力を」
https://qiita.com/nanbuwks/items/d53911b0b8bfd8c6c548
の設定を入れて使っていました。

新たにUSキーボード仕様のPCを入手したのでこれを活用すべく設定をしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0d05ca51-dddf-6fd1-31a2-bf0388c98b3a.png)

# Ubuntu でキーボードレイアウトを設定するには

イマドキの Ubuntu ではどうやって設定する仕組みになっているのかな？
カンタンにできるのかと思ったが、結構コツがいる。

今回は以下の順番で設定しました。


1. コンソールでの US キーボード設定
- GUIでの US キーボード設定
- 日本語変換モードキーの割当設定
- おまけ NumLockを起動時から有効にする

今回は、1.2.4.の方法を説明します。
3.については長くなったので別記事で。

「Ubuntu20.04 + US キーボードで日本語入力を非トグル操作」
https://qiita.com/nanbuwks/items/87bdef2c4e7416ffcfb6

# 環境

- Ubuntu 20.04 JTS Japanese
- Iiyama 15GSX8050-i7-YFB (Clevo P151SM) 
- Mosc 2.23.2815.102
- IBus 



# コンソールでの US キーボード設定

```

$ sudo dpkg-reconfigure keyboard-configuration
```

Generic 105-key PC (intl.) を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/023879a9-a1b4-c53f-90ed-95220ac900a6.png)

ちなみに、Generic 104-key PC  を選択したら、バックスラッシュや縦棒のキーが無反応になった。

その後、以下のように進めていく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/aa86ce67-56d1-7f67-c2df-b5ac5e32c474.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5fbccdaf-20db-10a5-ac8b-eddcf5b3a9ad.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6720b11d-107f-3a54-a311-cf188e297aa9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1cd4563b-919b-9d55-c501-c60c32d71804.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4a426a9b-c464-cf60-b588-f5a19d23c8ab.png)

# GUIでの US キーボード設定

「設定」-「地域と言語」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2270f100-35d4-32d2-d8e0-a74bb2bb228d.png)

日本語を削除してから「+」マークを押し、「英語(US)」を追加、一番上に配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/109aa221-b1eb-a191-c0f7-ed1a56ee4785.png)

その上で、画面右上のインジケータの「あ」や「Ａ」をクリックして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/47881f91-92db-4c4d-8851-23c7da186784.png)


英語(US)を選び、「en」に表示を一旦変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e91cbe09-e4f6-179e-c2da-adcf1dbf04a1.png)

再度クリック、「日本語(Mosc)」を選び、「あ」にすると、キーボードレイアウトが反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/83eed90b-48ad-6ad6-08c8-42dfccafaa9d.png)



# おまけ NumLockを起動時から有効にする

USキーボードとは直接関係がありませんが、今回のPCはテンキー付きノートPCなので以下のようにして NumLock を起動時にONにするようにしました。

```

$ sudo apt-get install numlockx
```
sysPassをOpenID ConnectでSSOできるようにする

sysPassってタグでサジェストされなかったのですが、あまり使っている人いないのでしょうか。

皆さんの会社ではパスワードの管理どうしていますか?

シンプルウェイでは可能な限り公開鍵認証やシングルサインオンに集約するようにしていますが、クライアントから預かるアカウントとか、どうしてもそれではまかないきれないパスワードってのが出てきてしまっています。

現在シンプルウェイではISMSの取得を目指していて、アカウント管理というのも課題の一つになっています。

そこで今回[sysPass](https://www.syspass.org/)というオープンソースアプリケーションを利用することにしました。

sysPassを選んだ理由は

* 社内でアカウント情報をシェアできること
* シェアできる範囲が設定可能であること
* オープンソースであること
* シングルサインオンできること

です。

(同じようなアプリケーションでは[Passbolt](https://www.passbolt.com)というのもあります。こちらのほうが認証がGPGでよりセキュアだったり、UIがGmailっぽかったりと、個人的にはこちらを推したいところですが、ディレクトリサービスと連携する場合は有償版になってしまうのでsysPassで妥協しました)

-----

さて本題ですが、sysPassにはBasic認証で認証したアカウントをそのままアプリケーションの認証に使うような機能があるようです。

これを mod_auth_openidc と組み合わせたら OpenID Connect で SSO できそうだなぁと思って、試行錯誤した結果うまくできたのでまとめたいと思います。

最初に mod_auth_openidc のセットアップが必要ですが、その説明は割愛します。[このあたり](https://heartbeats.jp/hbblog/2017/08/mod-auth-openidc.html)が参考になるでしょう。

シンプルウェイはGoogle Workspaceを使っているのでGoogleをIdPとして設定しておきました。

mod_auth_openidc で認証したら環境変数に認証情報が入ってくるので、これをつかってBasic認証に見せかけます。

変更するファイルは2つだけです。

sysPassのルートディレクトリにある index.php の define() のあとに下記のような行を追加します。

```index.php
define('APP_ROOT', __DIR__);
define('APP_MODULE', 'web');
```

↓

```index.php
define('APP_ROOT', __DIR__);
define('APP_MODULE', 'web');

if (!empty($_SERVER['OIDC_CLAIM_email']) && !empty($_SERVER['OIDC_CLAIM_sub'])) {
  $_SERVER['HTTP_AUTHORIZATION'] = 'Basic ' . base64_encode($_SERVER['OIDC_CLAIM_email'] . ':' . $_SERVER['OIDC_CLAIM_sub']);
}
```

OIDC_CLAIM_ の部分は mod_auth_openidc で設定するプリフィックスなので、カスタマイズしている場合は読み替えが必要です。

sysPassのBasic認証ログインはIDとパスワードをそのままローカルのユーザーテーブルに突き合わせて認証するようなので、OpenIDの認証情報からパスワードに相当するものを割り当てなければなりません。

上の例では sub を使ってしまっていますが、Googleの場合は数字で構成されているのであまりよろしくはないですね。気になる方は email・sub・ソルトを組み合わせてハッシュ値をパスワードにするなど工夫してもいいかもしれません。

続いて lib/SP/Services/User/UserService.php の createOnLogin() 関数を下記のように書き換えます。

```UserService.php
    public function createOnLogin(UserLoginRequest $userLoginRequest)
    {
        $userData = new UserData();
        $userData->setLogin($userLoginRequest->getLogin());
        $userData->setName($userLoginRequest->getName());

```

↓

```UserService.php
    public function createOnLogin(UserLoginRequest $userLoginRequest)
    {
        $userData = new UserData();
        $userData->setLogin($userLoginRequest->getLogin());
        $userData->setName($userLoginRequest->getLogin());
```

Basic認証だとユーザーテーブルのnameに相当する情報がないので、自動アカウント作成時にこれはNULLになりますが、データベースの制約でそれを許可していないのでエラーになってしまうようです。ここをログインIDをデフォルト値として使うよう変更します。

(これおそらくsysPassのバグだと思うんだよなぁ。せっかくOSSなので、時間ができたらちゃんと調べてコントリビュートとしたいところ)

最後にsysPassでBasic認証ログインと自動アカウント作成を有効にしておきます。デフォルトグループとデフォルトプロファイルも設定しておかないとエラーになるようなので、これも合わせて設定しておきます。

![config.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219010/e30d9720-ff7b-801b-1a20-c52535773554.jpeg)


これらの変更を行うと

1. sysPassへアクセス
2. IdPにリダイレクト
3. 認証して帰ってくるとsysPassのログインフォームが表示される
4. ID/パスワードは入力せず、そのままログインボタンを押す
5. ログイン完了

という動きになります。
GitHubのプライベートリポジトリをクローンする際にエラーが出たら

#エラー内容

```
Cloning into 'private-repository'...
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
```
パスワード認証のサポートが2021年8月13日に終わったので、代わりにアクセストークンを仕様してくださいという内容でした。

##パスワードをアクセストークに変更して再度挑戦
```
git clone https://{ユーザー名}:{トークン}@github.com/{ユーザー名}/{リポジトリ名}.git
```

このようにパスワードからアクセストークンへ仕様が変わったので、アクセストークンをどこかにメモしておくといいかもです。
New Relicを導入する事となったきっかけ

**New Relicさんとの馴れ初め**
所謂サイトのパフォーマンスが低下する、サイトが停止する、という出来事が頻発して路上で頭を抱えていた時にNew Relicさんが目の前に現れて優しく手を差し伸べて来ました。

**悩まされていたシステムの構成**
所謂web三層構造のシステムでプラス別システムのDBやファイルサーバーへも参照に行く構成。
パブリッククラウドとオンプレデータセンターのハイブリッド構成。
クラウドとデータセンター間はインターネット回線を足回りにしたVPN接続。

**何に悩まされていたか**
登場人物が多い。
被疑箇所が多い。

**多いとどうして悩まされていたか**
登場人物（サーバー）が多いと調査の為のログ収集行為だけでも大変です。
被疑箇所が多いと調査の(ry

**登場人物が多いと**
ログを突き合わせてみて問題があった時刻に何が起きたのか推測する行為が大変です。
（サーバーの時間がずれていれば時系列が狂ってしまう事も）

**被疑箇所が多いと**
アプリが悪いの？ネットワークの遅延じゃない？DBのパフォーマンスが劣化した？
アプリケーション開発者とインフラ管理者とDB管理者の「お前のところの責任だろ？」のおしくらまんじゅう状態となります。

**皆んなで協力する為にも**
その時、どこで、何が起きていたかを一貫して観測できるツールの必要性を欲していました。

**New Relicさんと出逢って助かった事**
New Relic APMを利用したサイト稼働中のパフォーマンスモニタリングが可能となった事。
（ボトルネックがロジックなのか、ロジック内のSQLなのか、外部システムからの応答なのか）
全ての登場人物、被疑箇所となるポイントを一元管理できるようになった事による運用・観測の効率が上がった事。

**New Relicさんとの今後の付き合い**
クラウドリフト、クラウドシフト、マルチクラウド、はたまたオンプレに戻ろう、システムのロケーションが多様になった事で、監視サーバーどこに置く？どこで監視する？監視サーバーにデータ送る為に穴あけするの？それともそれぞれのロケーションに監視サーバー置くの？なんて課題が出て来ました。
いやいや、New Relicさんがいるじゃない。という事で、監視サーバーをクラウドシフトならぬNew Relicシフトにしている最中です。

拙い文章にお付き合いくださってありがとうございます。