OmniAICreator/Qiita-1.07M huggingface dataset:
Lenovo IdeaCentreのSSD換装後、OSの起動が遅くなる問題の対処法

同じ症状にあった人のために記録しておきます。Qiita初投稿です。
## 問題
Lenovo IdeaCentreのM.2のSSD(256GB)の容量が足りなくなったため、新しいM.2 SSDを用意してクローンをつくり、換装した結果、PC立ち上げ時に

\>>checking media presence...... 
\>>media present...... 
\>>start pxe over ipv4 on mac: 2c-fo-5d-1c-25-06

という表示が出て、しばらくしてからOSが起動するようになった。
待てば起動するが、起動に時間がかかるのはストレスなので、解消したい。

### 問題のデバイス
* PC
Lenovo IdeaCentre T540 Gaming 90LW0018JP
* SSD
CFD CSSD-M2P1KDRV74A(1TB)


エラーメッセージについて調べると、「OSの入っているSSDが認識されておらずOSが起動できていない」という症状の人の記事が出てきて自分の状態とは異なる（時間がかかるが起動自体はする）。
その記事を見るとSSDの接触不良で認識されていないか、BIOSでのブート優先順位が低くなっていることが問題とされていた。
    （接触不良を疑い、PCケースを開けてみたら、固定用ピンが刺さりきっていなかったので深く刺しなおしたが、改善しなかった）

### BIOSの状態
![PXL_20240724_091230208.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3845638/0e34c005-b83c-a1dc-e514-3afc99e2df7f.jpeg)
下から４つ目の、「M.2Drive 1」の項目にあるので、認識されているが、
![PXL_20240724_090630580.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3845638/0895ad5b-a8ea-bb09-8411-8815753bddcf.jpeg)
ブート順を確認すると、SSDが認識されていなかった。

再度ネットで様々なキーワードで検索をすると
https://bbs.kakaku.com/bbs/K0001099357/
このようなBBSが出てきた。そこに記載の対処法を行ったところ、上手くいった。

## 対処法
1. PCの電源ボタンを押したあと、F1キーを連打してBIOSを起動
2. Startupのタブを開き
CSM [Enable]、
BootMode：[Auto] 、
Boot Priority :[UEFI First]
に変更
3. F10を押してセーブ

以上です。

## おわり
初めてパーツ交換をしたのですが、パソコンって難しいですね。
「休憩」も取らずに椅子に座り続けているのですか？


# はじめに
何事も集中していると思わず休憩を取らずにのめりこんでしまいます。
休憩を取る時間が無駄と感じる人もいるでしょう。

しかし、これから何年、年十年働いていく中で、その状態は保ち続けることはできるでしょうか？

休憩時間を定期的に確保し、休憩中に何をするのかを意識することで1日を通して集中力を保てるようにする。そして1週間、1か月、1年間集中できる状態を保つことができれば、さらに生産性は上がるかもしれません。

# 休憩を取る意味
休憩を取る意味は、「長期的に集中力を保つ」ためです。短期的で爆発的な集中力の発揮は大きな疲労を引き起こし、反動に長時間の休憩が必要となります。また、ストレス等も蓄積されるでしょう。

### 定期的に休憩をはさむことで
- 疲労感を感じにくくする
- 休憩するまでの時間内でできる限り進めようと意識できる
- 達成感を少なくすることで、次の業務にすぐ取り掛かれる
- 仕事が終わった後、自分の時間のための余力を残せる
- あえて中途半端なところで終わることで、早く続きをやりたいと思わせる

# どのくらいの頻度で休憩を設けるのか
#### 「ポモドーロ・テクニック」を用いる
作業と休憩を繰り返し行う時間管理の一つ。
（ポモドーロとはイタリア語でトマトを意味し、考古学者であるイタリア人のフラチェスコ・シリロ氏が、トマト型のキッチンタイマーを使って時間を計測していたことが由来だそうです）

 #### 手順
 1. タイマーを25分セットする
 2. 作業する
 3. 作業が終わったら5分休憩
 4. 休憩が終わったら再び25分間作業する
 5. これを繰り返す

 人によっては、
 - 作業時間が25分なのは短いor長い
- 休憩時間が5分なのは短いor長い
という人もいるでしょう。

こちらは自分に合った時間間隔で区切るのがいいと思います。
（私は30分作業して3分休むようにしています。）

一番大事なのは長期的に集中力を保つことです。

## 休憩中に何をするのか
何をすべきなのかの前に、してはいけないものを挙げます。
・スマホを見る
・パソコンを見る
・区切りがいいところまで作業を続けようとする
・毎回ずっと椅子に座り続ける

これらは休憩時間を確保しても脳や体を休憩することができないので控えましょう。

### 休憩中にすること
#### ストレッチ
長時間椅子に座り続けることで筋肉が硬直し、血流が悪くなります。血流をよくすることで脳に血液が回るようになり、疲労軽減につながります。
自分の好きなストレッチ方法を見つけるといいでしょう。

#### ベランダに出る
室内で仕事をしている人は外の空気を吸う頻度も少なくなるでしょう。日光を浴びることは、脳内にセロトニンが分泌させ、「心身のリラックス、脳を活発に働かせる、平常心を保つ」等の効果があります。日光を浴びながら外の新鮮な空気を吸うことは気分も晴れ晴れするでしょう。

#### 瞑想
作業中は常に頭を回転させるため、様々な情報であふれてしまいます。瞑想をすることで、「頭をスッキリさせる、不安やストレスを軽減する」といった効果が見込めます。呼吸だけに集中して脳内を整理しましょう。

#### ウォーキング
ストレッチ同様、血行のめぐりを良くすることは頭を働かせるうえでも非常に重要なことです。「水を取りに行く、配達物を取りに行く」など理由は何でも構いません。椅子から立ち上がり、体を動かしてみましょう

#### ヒーリングミュージックを流す
ヒーリングミュージックをかけることで、作業中で興奮状態にある脳を休ませることができます。ヒーリングミュージックによって自律神経を整えることで心身リラックスした状態で再び作業にもどることができるでしょう。

# まとめ
定期的に休憩を取ることで一日を通して集中力を継続することができます。
**「やるべきことに集中する」** ことが普段の生活をより良いものにするでしょう。
ぜひ休憩のとり方を意識しながら作業に取り組み、一緒に集中力を高め、生産性を高めていきましょう。
OpenSSLのコマンドでPBKDF2の鍵導出を実行した時のメモ

OpenSSLのコマンドで試しにPBKDF2で鍵導出を実行してみたので、その時のメモを残します。

# 環境

+ CentOS Linux release 8.5.2111
+ OpenSSL 1.1.1k FIPS 25 Mar 2021

```console:実行結果
[root@centos85 ~]# cat /etc/redhat-release
CentOS Linux release 8.5.2111
[root@centos85 ~]# openssl version
OpenSSL 1.1.1k  FIPS 25 Mar 2021
[root@centos85 ~]#
```

# 鍵導出のコマンドの実行

以下のコマンドを実行すると、パスワード（ここでは`yourpassword`）から`aes-256-cbc`で使用可能な共通鍵（鍵「`key`」と初期化ベクトル「`iv`」）を表示してくれます。

`openssl enc -aes-256-cbc -pbkdf2 -pass pass:yourpassword -P -md sha256`

```console:実行結果
[root@centos85 ~]# openssl enc -aes-256-cbc -pbkdf2 -pass pass:yourpassword -P -md sha256
salt=4B6D989F614DEDFB
key=86F535A3CB11DDEC09E2B1524006199D95151732E43A039C227CEEB1FBA52A10
iv =68D7B84381398488CFDCA6A4DDEBD816
[root@centos85 ~]# openssl enc -aes-256-cbc -pbkdf2 -pass pass:yourpassword -P -md sha256
salt=204B7B8AB553E815
key=883680B2426E5FA8B9C0F752B0D196749DB0230E4D8E21034DF473DD3D7B1C7E
iv =DCE99157A9374512FB8EBD70380F5F79
[root@centos85 ~]#
```

鍵の長さは、`aes-256`なので`256bit`、16進数で`64文字`となります。

2回実行したところ、1回目と2回目で結果が変わりました。
これはるソルト（`salt`）が毎回ランダムに生成されるためです。

試しに、`-S 1`を指定して、ソルト（`salt`）を`0123456789ABCDEF`に固定してみます。

`openssl enc -aes-256-cbc -pbkdf2 -pass pass:yourpassword -S 0123456789ABCDEF -P -md sha256`

```console:実行結果
[root@centos85 ~]# openssl enc -aes-256-cbc -pbkdf2 -pass pass:yourpassword -S 0123456789ABCDEF -P -md sha256
salt=0123456789ABCDEF
key=3952DC98696C83051FAEDBBD38FB208D3BE1E8E71309ABBD9694AFB8C7F08CE8
iv =8DDA03BDBC205E8E385515F94BA8541F
[root@centos85 ~]# openssl enc -aes-256-cbc -pbkdf2 -pass pass:yourpassword -S 0123456789ABCDEF -P -md sha256
salt=0123456789ABCDEF
key=3952DC98696C83051FAEDBBD38FB208D3BE1E8E71309ABBD9694AFB8C7F08CE8
iv =8DDA03BDBC205E8E385515F94BA8541F
[root@centos85 ~]#
```

今度は2回実行して、同じ結果が返ってきました。

次に`-aes-256-cbc`を`-aes-128-cbc`に変更して実行してみます。

`openssl enc -aes-128-cbc -pbkdf2 -pass pass:yourpassword -P -md sha256`

```console:実行結果
[root@centos85 ~]# openssl enc -aes-128-cbc -pbkdf2 -pass pass:yourpassword -P -md sha256
salt=EC0D585631D7A744
key=7826152218FA9F6361245B75C5FB3499
iv =51369A23624F6F6E4D13604E8ECF9F91
[root@centos85 ~]#
```

鍵の長さは、`aes-128`なので`128bit`、16進数で`32文字`となりました。

---

以上
Stormworks で任意の方位にヨー制御するときのアレ

何番煎じかわからないが、思いついたので書く
# 前提
①初心者
②敵への方位が分かっている
　→PHYSICS SENSORかGPSを使って自分の位置を、
 　レーダーやスタビ付きカメラ等で敵の位置を取得して、三角関数つかって方位を出そう

# 救助しろよ
敵の方位が分かっている状態で、その方位に合わせてミサイルを飛ばしたいとする。
一番最初に思いつくのはミサイルにコンパスなりPHYSICS SENSORなりを積んで、出力が方位に合うようにヨーをPID制御するってやつ。
ここで問題なのは、真南にいる敵に誘導できないということ。（真南は＋0.25と-0.25の境目なので、PID制御できない）
# じゃあどうするか
敵の方位が北(=0)になるように、コンパスの出力を補正する

これだけ。

たぶんこれでいける。今のところ問題はでてない
Windows ServerからEC2へのファイル転送でハマった権限問題を解決してみた


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [はじめに](#Chapter1)
1. [準備](#Chapter2)
1. [基本概念](#Chapter3)
1. [実装・手順](#Chapter4)
1. [まとめ](#Chapter5)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# はじめに
## ・背景
オンプレのWindows ServerからAWSのEC2にec2-userにてファイルを送りたかった。
しかし、userAにて送信対象のフォルダが作成されていたため、ec2-userでは権限で拒否されてしまいハマったので解決方法をシェアします。
## ・目的
ec2-userを使用してSCPコマンドでファイルを転送しようとして起きた権限エラーが発生し、どう解決したか紹介します。
## ・対象読者
同じようにファイル転送で苦戦してる人やAWS初心者。

## ・補足
ec2-user以外のuserAでもファイル送信は可能です。
しかし、userAにてファイルを転送しようとするとuserA専用の鍵の発行をしなければならないので、今回はec2-userにてファイル送信をする方針としました。

<a id="#Chapter2"></a>
# 2. 準備
## ◇必要な環境・ツール
・Windows Server 2022 Datacenter
・AWSアカウント
・EC2インスタンス（Linux）
・SCPコマンド

## ◇前提条件
・AWS CLIがインストール
・S3バケットの用意
・EC2インスタンスの作成と設定
・S3バケットの作成
・オンプレサーバからEC2へのscpの許可

<a id="#Chapter3"></a>
# 3. 基本概念
## ◇キーワードの説明
・SCP（Secure Copy Protocol）：安全にファイルを転送するためのプロトコル。
・EC2（Elastic Compute Cloud）：AWSの仮想サーバー。
・S3（Simple Storage Service）：AWSのストレージサービス。
## ◇基本的な流れや構造
・EC2でS3をマウントし、オンプレのWindows ServerからEC2にファイルを送る。

<a id="#Chapter4"></a>
# 4. 実装・手順
## ◇イメージ図
![S3夜間バックアップ_qiita用.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3845301/260788c2-834a-b60a-f5af-3ebb66520aeb.png)


## ◇実装・手順
・ステップ1: EC2インスタンスの設定
EC2インスタンスを作成し、SSH接続できるように設定します。
詳細な設定手順はこちらを参照してください。
- [Amazon EC2(Amazon linux)のファイルサーバ構築](https://qiita.com/u-bayashi/items/77e0ae1bdb4efa193b23)

・ステップ2: S3をEC2にuserAユーザでマウント
[S3 バケットをEC2 インスタンスにマウントする](https://qiita.com/seikida/items/a8c93d05c4d264cf2bab#ec2%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A)
```
# userAでログインして以下のコマンドを実行
mount-s3 [バケット名] [任意のDir]/ --allow-delete
```

・ステップ3: Windows ServerからSCPコマンドでファイルを転送しようとすると権限エラー発生
```
scp -i /path/to/key.pem file.txt ec2-user@<EC2_IP>:/mnt/s3bucket
# -> 権限エラー発生
```

・ステップ4: ec2-userで同じS3バケットをマウント
```
# ec2-userでログインして以下のコマンドを実行
mount-s3 [userAでマウントしたやつと同じバケット名] [任意のDir]/ --allow-delete
```

・ステップ5: SCPコマンドでファイルを転送
```
scp -i /path/to/key.pem file.txt ec2-user@<EC2_IP>:/home/ec2-user/s3bucket
```

ステップ6: 同じバケットを別のユーザでマウントできることを知り、権限エラーを解消

<a id="#Chapter5"></a>
# まとめ
◇この記事の要点
・Windows ServerからEC2へのファイル転送の方法と権限問題の解決
・S3をマウントしてのファイル管理

◇学んだこと
・同じS3のバケットをEC2の別ユーザへ紐づけられること

<a id="#reference"></a>
# 参考文献
- [Amazon EC2(Amazon linux)のファイルサーバ構築](https://qiita.com/u-bayashi/items/77e0ae1bdb4efa193b23)
- [S3 バケットをEC2 インスタンスにマウントする](https://qiita.com/seikida/items/a8c93d05c4d264cf2bab#ec2%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A)
【ギリギリ合格シリーズ】勢いだけでAWS Certified Solutions Architect - Associate(SAA-C03)受けたら落ちた話

AWS Certified Solutions Architect - Associate(SAA-C03)を受けて来ました。

https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

# １回目
## 勉強量

#### Udemy
割とちゃんと解いた（全部じゃないけど）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/aefb4693-bfc6-cf46-a091-e6ca9bd9a055.png)


#### 書店で購入した参考書

まずAWSについて知識が皆無だったので、たくさん買って読み漁りました。
ただし環境は触ってません。

書籍一覧TODO

### 理解度

・インフラの実務経験なし。
・新しい演習問題を解くたびに、知らないサービス名とか出てくる。
・解いた問題はちゃんと不正解の選択肢についても調べたので自信があったが、物量に自信がない。

## 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/d81b9ab9-205c-f5d9-def3-5259d2593f06.png)

落ちました。
ということで、二週間後もう一度受けてきます！

### 手応え

全部わからないみたいなことはなかったです。
勉強した範囲は正しかった感触なので、次は物量を増やして守備範囲を広げる方向にしようと思います。
ただし最小限勉強にしたいです。

## 次受けるまでにすること予定

・Udemy全部解く

# ２回目

## 勉強量

#### Udemy

全部解いた

### 理解度

・Udemyは全部解いたけど、全部を完璧にしたわけじゃないので、まだちょっと不安

## 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/7ac932de-4fd6-4c06-7ba5-5004d42d58eb.png)

あっぶないｗ
しかも2週間じゃなく少し時間が空いてます。
ただ短期間で集中できたように思います。

Udemyすごい。模試を解いてサービス覚えて、あとは反復あるのみ！
Meta Llama 3.1 8Bモデルを使った自然言語処理：初心者のための完全ガイド

## はじめに

こんにちは！この記事では、Meta社が開発した最新の大規模言語モデル「Llama 3.1 8B」の使い方を、初心者の方にも分かりやすく解説します。自然言語処理の世界に一歩踏み出す準備はできていますか？一緒に学んでいきましょう！

## 目次
1. Llama 3.1モデルの概要
2. 環境設定
3. transformersライブラリを使ったモデルの利用
4. テキスト生成の実践
5. まとめと次のステップ

## Llama 3.1モデルの概要

Llama 3.1は、Meta社が開発した多言語対応の大規模言語モデル（LLM）です。8B、70B、405Bのパラメータサイズがあり、今回は8Bバージョンを使用します。

主な特徴：
- 多言語対応（英語、ドイツ語、フランチ語、イタリア語、ポルトガル語、ヒンディー語、スペイン語、タイ語）
- 128,000トークンのコンテキスト長
- テキストと軽度のコード生成が可能

## 環境設定

まず、必要なライブラリをインストールしましょう。以下のコードを実行して、最新版のtransformersライブラリをインストールします。

```python
# transformersライブラリの最新版をインストール
!pip install --upgrade transformers
```

次に、必要なライブラリをインポートし、CUDA関連の設定を行います。

```python
# 必要なライブラリのインポート
import transformers
import torch

# CUDA関連の設定
torch.backends.cuda.enable_mem_efficient_sdp(False)
torch.backends.cuda.enable_flash_sdp(False)

# transformersのバージョンを確認
print(transformers.__version__)
# 4.43.0以上であることを確認してください
```

## transformersライブラリを使ったモデルの利用

Llama 3.1 8Bモデルを使用するために、transformersライブラリのパイプライン機能を利用します。以下のコードでモデルを読み込み、テキスト生成の準備を行います。

```python
# モデルのパスを指定
model_id = "/kaggle/input/llama-3.1/transformers/8b/1"

# テキスト生成パイプラインの作成
pipeline = transformers.pipeline(
    "text-generation",  # タスクの指定
    model=model_id,  # モデルのパス
    model_kwargs={"torch_dtype": torch.bfloat16},  # モデルの精度設定
    device_map="auto"  # デバイスの自動選択
)
```

このコードの各部分を詳しく見ていきましょう：

- `model_id`: Llama 3.1 8Bモデルのファイルパスを指定しています。
- `transformers.pipeline()`: テキスト生成タスク用のパイプラインを作成します。
- `model_kwargs`: モデルの精度をbfloat16に設定し、メモリ使用量を抑えています。
- `device_map="auto"`: 利用可能なGPUを自動的に選択します。

## テキスト生成の実践

モデルの準備ができたら、実際にテキスト生成を試してみましょう。以下のコードを使って、簡単な質問に対する応答を生成します。

```python
# テキスト生成の実行
response = pipeline("Hey how are you doing today?")

# 生成されたテキストの表示
print(response[0]['generated_text'])
```

このコードでは：

1. `pipeline()`関数に質問文を入力します。
2. モデルが質問に対する応答を生成します。
3. 生成されたテキストを表示します。

生成されたテキストは、モデルの応答の質や自然さを確認するのに役立ちます。

## まとめと次のステップ

おめでとうございます！これでLlama 3.1 8Bモデルを使ったテキスト生成の基本を学びました。ここからさらに探求できることがたくさんあります：

1. 異なるプロンプトや設定でテキスト生成を試す
2. 生成されたテキストの品質を評価する方法を学ぶ
3. モデルのファインチューニングについて調べる
4. 他の言語でのテキスト生成を試す

Llama 3.1は強力なツールですが、責任を持って使用することが重要です。適用される法律や規制、およびMeta社の利用規約を常に遵守してください。

自然言語処理の世界は広大で刺激的です。この記事が皆さんの学習の第一歩となれば幸いです。質問やコメントがあれば、ぜひKaggleのディスカッションセクションでお聞かせください。楽しいコーディングを！

## Kaggleノートブック

https://www.kaggle.com/code/makimakiai/jp-llama-3-1-8b-quick-start
ジンバルモーター、SimpleFOCで動かす(8) - BLDCモーター2個接続

# はじめに

[前回の](https://qiita.com/8ga3/items/29c241aa43adbf6908d1)の続きです。

7回目で終わるつもりでしたが、記録しておきたい事象があったのでもう少し続けます。

Arduino Uno R4にBLDCモーターを2個接続してみます。

# 接続図

これまでモーターがひとつではこのように接続していました。（電流センサは一旦外しています。）

![BLDC_SimpleFOC_AS5600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/fc481c46-e237-f3de-40cb-9ae2ba4667e7.png)

２個接続する場合はこのようになります。

![BLDC_SimpleFOC_BLDCx2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569302/10f2b776-3909-6b4d-901a-d5930300902b.png)

今回はArduino Uno R4とモータードライバとの接続について書きます。I2Cの磁気エンコーダについては次回になります。

# Arduino Uno R4のタイマ

モータードライバへの信号出力にPWMをつかっています。Arduinoのピンソケットの番号に **〜** 記号がついている場所が、PWM対応となってます。

しかし、R4になってからプロセッサがRenesas RA4M1になったため、実際には **〜** 記号がないピンソケットでもPWMが使えます。

**Renesas RA4M1グループ ユーザーズマニュアル ハードウェア編** を確認します。PWMにはタイマが必要です。SimpleFOCはAGTとWDTは使えません。GPT32とGPT16が使用できます。

* 32 ビット汎用 PWM タイマ(GPT32)× 2チャンネル
* 16 ビット汎用 PWM タイマ(GPT16)× 6チャンネル
* 低消費電力非同期汎用タイマ(AGT)× 2チャンネル
* ウォッチドッグタイマ(WDT)

GPTには出力がAとBの2個あります。ここで使用しているSimpleFOCMiniはPWM x3で制御しますが、AとBを同時に使用不可の制限があります。（PWM x6のモータードライバの場合はハイサイドとローサイドを一組にして同じPWMのAとBをつなぐことで、デッドタイムをハードウェアで自動的に管理してくれるようです。）

# Arduino Uno R4とモータードライバSimpleFOCMiniとの接続

Arduino Uno R4のソケットが、具体的にRA4M1のどこにつながっているか調べてみました。下の表になります。デジタルのソケットはMinimaとWi-Fiではかなり違いました。アナログは同一でした。

|Arduino<br>Socket|Minima<br>I/O Port|Minima<br>Channel|Minima<br>Output|Wifi<br>I/O Port|Wifi<br>Channel|Wifi<br>Output|Motor<br>Driver|
|:--:|:----:|:-:|:-:|:----:|:-:|:-:|:-:|
|D0  | P301 | 4 | B | P301 | 4 | B |
|D1  | P302 | 4 | A | P302 | 4 | A | 2 |
|D2  | P105 | 1 | A | P104 | 1 | B |
|D3  | P104 | 1 | B | P105 | 1 | A |
|D4  | P103 | 2 | A | P106 | 0 | B |
|D5  | P102 | 2 | B | P107 | 0 | A | 2 |
|D6  | P106 | 0 | B | P111 | 3 | A | 2 |
|D7  | P107 | 0 | A | P112 | 3 | B |
|D8  | P304 | 7 | A | P304 | 7 | A |
|D9  | P303 | 7 | B | P303 | 7 | B | 1 |
|D10 | P112 | 3 | B | P103 | 2 | A | 1 |
|D11 | P109 | 1 | A | P411 | 6 | A | 1 |
|D12 | P110 | 1 | B | P410 | 6 | B |
|D13 | P111 | 3 | A | P102 | 2 | B |
|A0  | P014 |   |   | P014 |
|A1  | P000 |   |   | P000 |
|A2  | P001 |   |   | P001 |
|A3  | P002 |   |   | P002 |
|A4  | P101 | 5 | A | P101 | 5 | A |
|A5  | P100 | 5 | B | P100 | 5 | B |

普通にGPIOやSPIなどを使う分には、Arduinoライブラリが違いを隠蔽してくれるので気にする必要はなかったと思います。

ところが、モータードライバへPWM出力するためにはタイマ・チャンネルが被らないようにしなければなりません。先に書いたとおり、同じチャンネルのAとBは同時に使用できません。

Minimaの場合、D2・D3・D11・D12がチャンネル1に割り当てられています。 **Wi-Fiと同じようにD11・D12にチャンネル6を、どうしてMinimaでは使ってくれなかったのか不思議です。** 当初、基板の **〜** 記号どおりにモータードライバとつないでいたら全く動かずかなり悩みました。

ここではモータードライバ1はD9・D10・D11を使用し、モータードライバ2はD1・D5・D6を使用しました。MinimaとWi-Fiモデルのいずれも同じ構成ができるはずです。（Wi-Fiモデルは持ってないので未確認）

# コード

ドライバのインスタンスに、デジタルのソケット番号を引数にセットします。第4引数はEnableピンはどこを使ってもいいと思います。あとの初期化とloop関数での使い方に変わりはありません。

```cpp
BLDCMotor motor1{7, 26};
BLDCMotor motor2{7, 26};
BLDCDriver3PWM driver1{11, 10, 9, 8};
BLDCDriver3PWM driver2{6, 5, 1, 0};
```

# さいごに

次回はI2Cマルチプレクサをつかって磁気エンコーダを2個つなげます。

https://qiita.com/8ga3/items/61e19205d9f533660afa
エンジニア未経験者が陥る「分からないところが分からない」からの脱却思考術

## はじめに
　皆さん、こんにちは！文系×未経験エンジニアのpurpleです。
　この記事では、特にエンジニア未経験の方がより効率よく「分からない」を解消し、成長速度をぐっと伸ばすための思考法の1つを紹介します。

　会社でエンジニア研修を受け、多くの知識のインプット・アウトプットを繰り返していると、大量に「分からない」という実が生まれます。
その分からないを無くすために先輩や同期に質問をするとき、こうなった経験はありませんか？

　**「分からないところが分からない…！何を聞けばいいんだ…。」**

　私も、研修の中で「分からないところが分からない」となり、悶々と1人で悩んで時間を潰したり、衝動的に先輩や同期に聞いてその方たちの多くの時間を私の疑問解消に消費させてしまいました。
 この状況から脱出したい！自分で分からないところが分かるようになりたい！
 そう思ったときに使える思考術を自分の経験からお伝えします！


## 「分からないことが分からない」からの脱却思考術
 考える手順は大きく分けて**5つ**です。
 
 　1. 分かっていることを言語化して書き出す
 　2. 分かっていないことを書き出す
 　3. 分からないことをタイプ別に分類する
 　4. タイプ別に適した検索エンジンで検索する
 　5. 検索しても分からなかったことを抽出する

 では、手順を1つずつ具体的に見ていきましょう。
 今回は下記のコードが分からない、という仮想事例と共に説明していきます。
 今分からないことがある方は、この記事を見ながら実際に思考法を実践してみても良いかもしれません。
 ```java
 import java.util.*;
 
 public class Main {
    public static void main(String[] args) {
        System.out.println(number(2, 4));
    }

    public static int number(int x, int y) {
        return x * y;
    }
}
```

###### 1. 分かっていることを言語化して書き出す
 分からない状態に陥っているのは、知識量が少ないからではなく、分からないことが多い、あるいは分かることと分からないことが入り混じって混乱しているだけのことも多くあります。
 まずは、現状分からないことに対して「これは分かる」という部分を書き出しましょう。
 
![分かること](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812591/557cabf3-5da9-b98c-2c24-6651b8b247fa.png "分かること")


###### 2. 分からないことを言語化して書き出す
 分からないことをとことん書き出しましょう。

 ![分からないこと](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812591/1797505a-bbd5-145b-f2cc-f0e6dc3821b7.png "分からないこと")


 ###### 3. 分からないことをタイプ別に分類する
 分からないことを出し終えたら、それをタイプ別に分類しましょう。
 例えば、「単語の定義や役割が不明」「コードの解読(処理の流れ)が不明」「使い方が分からない」「その他」など自分の出した分からないことにカテゴリを作って、タイプ別に分けましょう。

 ![分類](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812591/51420168-6e98-9432-5173-be1bfca33f61.png "分類")


###### 4. タイプ別に適した検索エンジン・検索方法で調べる
 単語が分からないなら「〇〇（分からない単語）とは」とGoogleで検索をかけて調べてみる、処理の流れやコードの解読が難しい場合はChat GPTにコードを投げて解説をしてもらうなど、調べたいものの属性に合う方法で調べてみましょう。
 もし調べた場合は、ソースと調べて理解できたこと、逆に理解できなかったことを書き出しましょう。


 ###### 5. 検索しても分からなかったものを抽出する。
 検索しても解決できなかったもの、検索して新たに出てきた分からなかったことを再度まとめましょう。
 同時に、分からないものに対して、
 　1. 何が知りたいのか（どこまで分かればOKなのか）
 　2. どのソースで調べてどこまで理解できて、どこで理解が止まっているのか
 をまとめましょう。
 この2点をまとめることで、同期や先輩に質問をする際に、**何がどの粒度で知りたくて、どこまで理解が進んでいるのか**ということを、端的に伝えることができます。
 ここまで出来たら、いざメモ帳をもって質問に行きましょう！


 ## まとめ
 ここまで、分からないところが分からないを解消する思考法についてお伝えしてきました。
 最初にもあった通り、分からないところが分からない状態は、分からないことが多くて複雑になってしまったことで発生している場合も多くあります。
 なので、上の方法を使うことで、自分の現状を整理して他人に伝えやすくし、効率よく疑問を解消できるようになるのではと思います。

 ちなみに、本日紹介した思考法は
 　1. What：何が（どこが）分からないのか
 　2. Why：なぜ分からないのか（単語が不明だから分からないのか、など）
 　3. How：どうしたら解決できるのか（どう検索すれば解消できそうか、など）

 という「クリティカルシンキング」の思考法に沿って考えたものになります。
 興味のある方はクリティカルシンキングについても調べてみると、より良い思考法を自分で思いつくかもしれませんね。

 うまく自分の現状を整理して、「分からないところが分からない」を脱却し、上手に人に分からないを説明できるようになっていきましょう！
 最後まで見ていただき、ありがとうございました！
【COLOR ME】お気に入りボタンとグローバルメニューのお気に入り商品数の表示を連動させる

＜＜　問題　＞＞
カラーミーショップを使って制作したECサイトの改修で下記を追加したが
<ul>
    <li>①商品ごとのお気に入りボタン（商品詳細ページ）</li>
    <li>②お気に入りアイコン（共通ヘッダー）</li>
    <li>③お気に入りアイコン右上にお気に入り商品数を表示</li>
</ul>
ページの再読み込みをしないと③が増減しなかった。

![スクリーンショット 2024-07-25 17.46.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819304/ba48729f-fc2c-ae26-5414-028832cca94e.png)
※イメージ

■ 実現したいこと
①のクリックと③の数字を連動させたい。
（お気に入りボタンのクリックで数字を増減させたい）
<hr>

＜＜　原因　＞＞
カラーミーショップの独自タグは正しいお気に入りの商品数を表示しない。
<hr>

＜＜　解決　＞＞
単純に、お気に入りボタンのクリック時に③の数字を取得して+1,-1するようにした。

```
  $(document).ready(function() {
    $('.favorite-button').click(function() {
      var $button = $(this);
      var favNumberElements = $('.favorite-nmb');
      var favNumber = parseInt(favNumberElements.first().text());

      // アニメーションをリセット
      $favoriteBub.stop(true, true);

      if ($button.hasClass('fav-items')) {
        $button.removeClass('fav-items');
        favNumber--;
      } else {
        $button.addClass('fav-items');
        favNumber++;
      }

      // favNumberが0なら非表示に
      favNumberElements.css('opacity', favNumber === 0 ? '0' : '1');

      // すべての.favorite-nmb 要素に新しい数値を設定
      // レイアウト上PC,SPそれぞれに同要素を設置していてもOK
      favNumberElements.text(favNumber);
    });
  });
```

<hr>

:::note info
自分では試していませんが、Cookieからちゃんとした数字を取得して表示する方法もあるみたいです。
その他のカスタマイズについても参考にさせていただきました。
参考）https://naeco.jp/colorme-fav-custom
Workato：PythonコネクタでSQLite3を利用する

# はじめに

WorkatoのPythonコネクタはsqliteのモジュールに対応しており、コード上でSQLite3データベースを利用することが可能です。

Workatoには [SQL Collection by Workato](https://docs.workato.com/features/collection.html)や[SQL Transformations](https://docs.workato.com/features/sql-transformations.html)があり、これらのコネクタ上でSQLを利用したデータ処理（加工・抽出）が可能ですので、通常においてはPythonコネクタでSQLite3を使う必要性は低いのですが、契約プランによる制限があり通常利用できない場合や、これらのコネクタで要件を満たさないデータ処理を行う際に有効です。

なお、WorkatoのPythonコネクタは nobody ユーザーとして実行されるため、書き込み可能なディレクトリは `/tmp` のみに制限されています。また、最も手軽な方法はインメモリデータベースを利用することですので、今回はインメモリデータベースとしてSQLite3を利用することになります。

# 手順
## １．Pythonコネクタをレシピ上へ追加します。

## ２．追加したPythonコネクタのOutputに `result` フィールドを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/2fd68a90-e46b-28c3-51ca-64a3571ea82c.png)

ここでは、文字列型でresultを追加していますが、戻り値が明確であればそれに合わせてスキーマを定義されることをお勧めします。

## ３．追加したPythonコネクタのCodeへ以下のコードを入力します

```python
import sqlite3

def main(input):
  connection = sqlite3.connect(':memory:')
  cursor = connection.cursor()
  create_query = """
CREATE TABLE users (
 id INTEGER,
 age INTEGER NOT NULL,
 name TEXT NOT NULL,
 PRIMARY KEY (id)
);
  """
  cursor.execute(create_query)
  
  insert_query = """
INSERT INTO users
 VALUES
 (1, 20, 'Alice'),
 (2, 30, 'Bob'),
 (3, 40, 'Carol');
  """
  cursor.execute(insert_query)

  select_query = """
SELECT
 *
FROM users
  """
  cursor.execute(select_query)
  print(cursor.fetchall())
  
  return {'result': True}
```

# 実行結果

Test recipeなどでレシピを実行すると、次の通りSQLiteでSELECT文を実行した結果を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/4ae1e26e-4fd0-6e57-a518-b6595ac2386d.png)


# 注意事項

WorkatoのPythonコネクタは、実行時間とファイルサイズに制限があります。

https://docs.workato.com/ja/connectors/python.html#limitations

- 使用できるスクリプトは、最大 1 MB です。この制限を超えるサイズのスクリプトは、たとえ動作したとしても、メモリーの問題が生じる可能性があります。
- アクションは 30秒 後にタイムアウトします。


また、コンテナに割り当てられたメモリは256MBが上限であり、かつスワップが無いため、メモリの上限を超えないよう注意する必要があります。
```
MemTotal:         262144 kB
MemFree:          238176 kB
MemAvailable:     238176 kB
Buffers:               0 kB
Cached:             7564 kB
SwapCache:             0 kB
Active:            12632 kB
Inactive:           3784 kB
Active(anon):       8852 kB
Inactive(anon):        0 kB
Active(file):       3780 kB
Inactive(file):     3784 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:          8852 kB
Mapped:             7564 kB
Shmem:                 0 kB
```

※Pythonコネクタのメモリは以下のコードをPythonコネクタ上で実行することで確認が可能です。

```Python
import subprocess

def main(input):
  result = subprocess.check_output(['cat', '/proc/meminfo'])
  return {"result": str(result).split('\\n')}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/60daeb4d-ecf1-4c8b-c0f2-90fe7fe5c479.png)

# 関連情報

本記事作成にあたり、以下URLに掲載のコードを参考にさせていただきました。

https://blog.amedama.jp/entry/sqlite3-in-memory-issue
【勉強会資料】Ruby メモリ管理 プログラミング

社内で勉強会をしたときのスライド資料です。

なぜメモリリーク・枯渇が発生するのか？ 低レイヤーからアプリケーションレイヤー（Ruby）に渡って仕組みを説明します。

<script defer class="speakerdeck-embed" data-id="76dcc3fd3ca34a3dbadf3d2685464b58" data-ratio="1.7772511848341233" src="//speakerdeck.com/assets/embed.js"></script>
【勉強会資料】日付と正規化

社内で勉強会をしたときのスライド資料です。

文字列や日付等、ソフトウェア内部で表現が混在すると障害につながるケースの対策について書いています。

<script defer class="speakerdeck-embed" data-id="72e8b965e1e84069a0b0d8b0f1b4d4c8" data-ratio="1.7772511848341233" src="//speakerdeck.com/assets/embed.js"></script>
atlasざっくりメモ

# 概要

atlas のコマンドの用途がイマイチ分からなかったのでメモ

- https://github.com/ariga/atlas

# dev-urlで指定するDev Databaseとは

atlasがコマンドの内容を検証するために使う

- https://atlasgo.io/concepts/dev-database

# 各コマンドの意味

- `schema inspect` DBのスキーマを指定した形式で出力する
    - すでにあるDBからexportする形で使う？
- `schema diff` fromとtoの差分を出力する（sqlファイルも指定できる）
    - バージョン型のマイグレーションファイルを生成する（applyで適用）
- `schema apply` urlにtoで指定したスキーマを適用する
    - `--dry-run` スキーマがどう変更されるか確認
    - `--auto-aprove` 確認せず適用
    - オプションなし 選択できる
Dockerについて簡単に理解したい

## はじめに
こんにちは！
今回は、なにかもよくわからずに使っていたDockerについてしっかり理解を深めていければと思い記事を投稿しようと思います！
間違い等ありましたらご指摘いただけますと幸いです。

## Dockerとは何？
まずDockerとは簡単にいうと軽量で高速に動作するコンテナ型仮想環境用のプラットフォームです。
ちなみに私は最初聞いたとき全く意味が分かりませんでした。
実際にDockerを使用しつつ、ベテランのエンジニアの方に教えてもらい何となくのイメージで理解できてきたかなという状態ですが共有できればと思います。

![スクリーンショット 2024-07-22 224322.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3669426/6c7fbef6-d51f-0ae9-671b-7cbbc0d884b3.png)

よく見る図かと思いますが、今回はDockerを理解するときに色のついた部分だけを意識するとわかりやすかったので上図のような色合いにしました。

Dockerを使用すると何がいいのか、使用しない場合はどういう状態なのかについて説明できればと思います。
上図をイメージしてもらった上で、下記の文を読んでいただければわかりやすいかもしれません。

**Dockerを使用しない場合**
・アプリケーションが依存するライブラリやツールを手動でインストールし、バージョン管理も行う必要がある
・同じサーバー上で複数のアプリケーションを動かすとき、それぞれのアプリケーションに独自のゲストOSを持つ必要がある

```java: たとえ話
あなたが家族のために別々のキッチンを用意したとします
イタリア料理のためのキッチン 中華料理のためのキッチン 和食のためのキッチンを作ります
それぞれのキッチンには専用の道具/材料/調味料が揃っていて他の料理に影響を与えません
しかし各キッチンを維持するためには大きなスペースとリソースが必要です
電気代や水道代も多くかかり 管理が非常に大変です

```
つまり、各アプリケーションのためにゲストOSを用意する必要があるため、リソースの消費が増え管理が複雑になるということです

**Dockerを使用する場合**
・依存関係の管理が簡単になる
・軽量なコンテナを使用して。同じホスト上で効率的に複数のアプリケーションを実行できる
・リソースの消費も少ない

```java: たとえ話
Dockerを使用すると 各料理のために個別の調理スペース(コンテナ)を提供できます
これらのコンテナは軽量で必要な材料や道具がすべて揃っており 他の料理と混ざることはありません
しかもコンテナはすぐに作成・削除できリソースの消費も最小限です
一つのキッチン(ホストOS)上で効率的に複数の料理を作ることができます

```

Dockerを使用すると、いちいちOSを持つ必要がなくなりホストOSの上でそれぞれのコンテナが必要な分だけリソースを使用できるということです

## Dockerについてのまとめ
改めてDockerとはコンテナ型仮想環境用のプラットフォームでアプリケーションやその動作に必要なものをまとめて「コンテナ」という単位で管理するためのツールです。
このコンテナには、ソフトウェアが動作するために必要な環境を含んでいます。

**メリット**
・開発者が自分のPCで作成したアプリケーションが、どこでも同じように動作する
→開津発環境と本番環境での動作の違いをなくすことができる
・コンテナは軽量で起動が早いので、アプリケーションをすぐにデプロイできる
・同じホストで複数のコンテナを効率的に動かすことができるため、サーバーのリソースを効率よく使い、多くのアプリケーションを同時に実行できる
・アプリケーションの負荷に応じてスケールを調整できる

## さいごに
以上が簡単なDockerについての説明になります。
こうして色々理解していくと、かなり便利なものだなと感動しました。これからも使用していこうと思います。
LaravelでReCaptcha v2のテストをスキップする方法

以下の二つを `.env.testing` に追加する。
```tex:.env
NOCAPTCHA_SITEKEY=6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI
NOCAPTCHA_SECRET=6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
```

```php:config/no-captcha.php
<?php

return [
    'secret'  => env('NOCAPTCHA_SECRET', 'no-captcha-secret'),
    'sitekey' => env('NOCAPTCHA_SITEKEY', 'no-captcha-sitekey'),
]
```

# 注意
ReCapche v3の場合は別途キーを発行して使う必要がある。

# 参考文献

https://developers.google.com/recaptcha/docs/faq?hl=ja

https://stackoverflow.com/questions/49014874/how-do-i-fake-a-recaptcha-in-a-unit-test
Hugo多言語環境でのnoindex問題

# 概要
[Hugo](https://gohugo.io/)で作ったサイトのページが`noindex`のせいでGoogle検索に登録されなかったので、`noindex`を外す方法を調べてクロールされるようにしました。

# 問題が起こったサイト
Hugoの[dot-org](https://themes.gohugo.io/themes/dot-org-hugo-theme/)テーマで作成してFirebaseで[公開](https://www.transfabrica.com/)したものです。多言語化しています。

# Google Search Console Teamからのメール
>ページ がインデックスに登録されない新しい要因
>Search Console で、貴サイトのいくつかの ページ がインデックスに登録されていないことが検出されました。以下がその要因となっています。
>>noindex タグによって除外されました

調べてみると、public/index.htmlだけ
```
    <meta name="robots" content="noindex">
```
が入っています。

# 原因調査
dot-orgでは[```.Params.noindex```を見て```noindex```を入れる](https://github.com/cncf/dot-org-hugo-theme/commit/d98c8af67bc50f9e27de76e826156424d23e74bd)ようになっていますが、```.Params.noindex```は指定していません。

[productionかどうかを見ているテーマもある](https://qiita.com/kengrasshopper/items/89734881da7702a1a72d)ということですが、dot-orgのソースを見ても見当たりません。

Hugoのソースを見ると、[alias.html](https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/alias.html)という組込みテンプレートで```noindex```を入れていることがわかりました。多言語環境のpublic/index.htmlに使われるもののようです。
[redirectだけのページだから```noindex```でいいんだ](https://discourse.gohugo.io/t/noindex-complaint-by-google/49038)という議論もありますが、ちゃんと追えていません。

# 対応

[alias.htmlをカスタマイズ](https://github.com/gohugoio/hugo/issues/11720)して```noindex```の行を消したところ、クロールされるようになりました。
【Rails】【Ruby】Fileクラスのwriteメソッドとbinwriteメソッドについて

Rails初学者のアウトプット兼備忘録です。
間違いや補足等あればご指摘いただけると幸いです。

今回はFileクラスのwriteメソッドとbinwriteメソッドについてまとめます。

# そもそもFileクラスとは？
Rubyでファイルを扱うには、Fileクラスを使う必要があります。
Fileクラスに対してメソッドを指定することで、ファイルの作成や書き込み等行うことができます。
Fileクラスにも様々なメソッドがありますが、今回はwriteメソッドとbinwriteメソッドに限定して違いなどをまとめます。

# writeメソッドとbinwriteメソッドの違い
まず、writeメソッド、binwriteメソッド共にファイルにデータを書き込むメソッドです。
違いとしては、文字列を書き込むか、バイナリーデータ(画像や音声などの非テキストデータ)を書き込むかというところです。

**writeメソッド-ファイルに文字列を書き込むのに適している
binwriteメソッド-ファイルにバイナリーデータを書き込むのに適している**

# 使い方

```controller.rb
 File.write("ファイルの場所", "ファイルの中身")
　　File.binwrite("ファイルの場所", "ファイルの中身")
```
上記のように使うことで、ファイルに書き込むことができます。
次にRailsにおいて、ユーザー画像を編集するというような具体例を示します。
```users_controller.rb
def update
    @user = User.find(params[:id])
    @user.name = params[:name]
    @user.email = params[:email]

    if params[:image]
      @user.image_name = "#{@user.id}.jpg"
      image = params[:image]
      File.binwrite("public/user_images/#{@user.image_name}",　image.read)
    end
```

ifで画像が送信されているか判定し、変数imageに対しreadメソッドを用いることで画像データを取得しています。

以上、Fileクラスのwriteメソッド、binwriteメソッドの違いや使い方についてまとめました。
間違いや「もっと効率的なやり方があるよ！」などのアドバイスがあれば、是非ご指摘ください！
【Unity】AddForceを使うときはApplyRootMotionを切っておきましょう

表題の通りです。
RigidBodyのAddForceを使ったキャラ移動を作ろうとした際に、AddForceで斜めに飛んでくれないなぁと思っていたら、ApplyRootMotionがONになっていたからでした。
初歩的なことの見落としで引っ掛かってしまった( ^ ^ ; )
LaravelのFeatureテストでうまくいかない時に試してみること

# 例外が出ていないか確認コードを入れてみる
```php:魔法の三行
if ($response->exception) {
    dd($response->exception);
}
```

Controllerのメソッドをテストするためにリクエストを投げても、そのメソッドにそもそも辿り着いていなさそうなエラーが出ている時があった。
具体的には、会員登録ページの「登録ボタンの遷移」テストをしているときに、意図している仮登録完了後のページに遷移していなかったのだ。

```php:
public function test_登録処理テスト_バリデーション()
{
    $name = FakerFactory::create()->unique()->regexify('[A-Za-z0-9]{10}');
    $request = new Request([
        'name' => $name,
        'email' => FakerFactory::create()->unique()->email(),
        'password' => FakerFactory::create()->password(),
        ...
    ]);

    $response = $this->post('/register', $request->toArray());
    $response->assertStatus(302);
    $response->assertRedirect('/auth/pre_complete'); // ここでエラーが発生

    // データベースにユーザーが登録されたことを確認
    $this->assertDatabaseHas('users', [
        'name' => $name,
    ]);
}
```

```tex:出力
❌ 登録処理テスト_バリデーション 910 ms
 ┐ 
 ├ Failed asserting that two strings are equal.
 ┊ ---·Expected 'https://xxx/auth/pre_complete'
 ┊ +++·Actual 'https://xxx'
```

しかしエラーらしきものは出ていないし、トップに飛ぶようなリダイレクト処理も出ていない。
そんな時はリクエストを投げた直後くらいに上の3行を挟んでみると、以下のような隠れエラーが出てきた。

```
Illuminate\Session\TokenMismatchException {#1032
  #message: "CSRF token mismatch."
```

どうやらCSRFトークンエラーが出ていたようだ。
POST時にCSRFトークンチェックを外すようにして解決。

# ReCaptchaのテストを飛ばしたい
以下の二つを `.env.testing` に追加する。
```tex:.env
NOCAPTCHA_SITEKEY=6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI
NOCAPTCHA_SECRET=6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
```

```php:config/no-captcha.php
<?php

return [
    'secret'  => env('NOCAPTCHA_SECRET', 'no-captcha-secret'),
    'sitekey' => env('NOCAPTCHA_SITEKEY', 'no-captcha-sitekey'),
]
```

# 参考文献

https://developers.google.com/recaptcha/docs/faq?hl=ja
108日目 前職を振り返る社畜L

## 🔍まえおき
ネタが思いつかない…ので、前職の話をしていきます。

## 🔍なにをしていたか
検査員として検査センターで勤務していました。

### 🔎何するの？
病院や保健所、学校検診とかその他いろいろな場所から来た血液、尿などの検体の検査をしていました。

## 🔍転職のきっかけ
端的に言ってしまうと人間関係のトラブルです。~~あと超絶ブラック~~
転職を決意した私は、雰囲気で興味のあったSEになるため、
SEの知識0の状態で、SEになるため転職活動を始めました。

## 🔍SEまでの冒険記
### 🔎職場探し編
何もわからないのだから、何をすれば転職できるのかもわからない！
あるのはやる気だけ！とりあえず「**未経験OK**」って書いてるし…必要なのはパッション！
安直に考えた私は前職を辞めず、思い立った初日、求人に電話をかけました。

### 🔎勉強編
何も考えずに応募した私…
「**ITパスポートか基本情報どちらか合格してください**」
という指示に対して、基本とかついてるし基本情報のほうがきっと簡単‼と思った私は
「**基本情報取ります‼**」
と即答…ここからが大変でした…

仕事をしながら半年ほどかけて基本情報になんとか合格した私は、
念願のSEになることができました。

## 🔍転職してどうなったか
元々考えながら仕事をするのが好きだったので、トライ＆エラーを繰り返す今の仕事はとても楽しいです。
今までは正確にマニュアル通りの仕事をする必要があった反動もあるのかもしれません…

## 🔍どんな人が向いている気がするか
これは私が特殊なのかもしれませんが…
**ゲームをして温まるのが好き、言い換えるとストレスを感じてイライラするのが好き**
という人は向いていると思います。
まだまだ新人ですが、意味わからな過ぎて逆に楽しくなってきている自分がいますｗ
Next.js14でChakra UIの導入方法

# はじめに
現在フリーランスでコーダーとして活動している[@6zin6]("https://qiita.com/6zin6")です。

今回はNext.js14でChakra UIの導入方法を自分のメモとして残しておこうと思います。

# 環境
* Next.js - 14.2.5
* React - 18

# 導入方法
## 1. Chakra UIのインストール
[Chakra UIの公式ドキュメント]("https://v2.chakra-ui.com/getting-started/nextjs-app-guide")に沿って、Next.jsにインストールします。
プロジェクトにルートディレクトリに移動し、ターミナルに下記コマンドを入力します。
```bash
npm i @chakra-ui/react @chakra-ui/next-js @emotion/react @emotion/styled framer-motion
```

## 2. Providerを設定する
appディレクトリ直下に「providers.tsx」を新規作成し、下記コードを記述する。
```tsx
'use client'

import { CacheProvider } from '@chakra-ui/next-js'
import { ChakraProvider } from '@chakra-ui/react'

export function Providers({ children }: { children: React.ReactNode }) {
    return (
        <CacheProvider>
            <ChakraProvider>
                {children}
            </ChakraProvider>
        </CacheProvider>
    )
}
```
## 3. layout.tsxを編集する
appディレクトリ直下にある「layout.tsx」の内容を以下のように書き換える。

```tsx
import { Providers } from './providers'

export default function RootLayout({
  children,
}: {
  children: React.ReactNode,
}) {
  return (
    <html lang='ja'>
      <body>
        <Providers>{children}</Providers>
      </body>
    </html>
  )
}
```
以上。

:::note warn
Chakra UIのコンポーネントやスタイルを適用する際は適用するファイルの先頭に'use client'と記述しなければならない。（クライアントサイドコンポーネントに変換する必要があるため）
CDK DynamoDBのtableはv1とv2で初期billingmodeが異なる

v1はデフォルトprovisioned

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_dynamodb.Table.html#billingmode

>billingMode?
Type: BillingMode (optional, default: PROVISIONED if replicationRegions is not specified, PAY_PER_REQUEST otherwise)


v2はデフォルトondemandです

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_dynamodb.TableV2.html#billing

>billing?
Type: Billing (optional, default: Billing.onDemand())
The billing mode and capacity settings to apply to the table.


基本ondemandのほうが嬉しいですね
provisionedは明示的に設定するものなので
Amazon BedrockからLlama 3.1を使ってみる

新しいAIモデルが出たらとにかく触ってみたい系エンジニアです。

難しい性能云々は別の方が詳しく見てくれていると思いますので、そちらでご確認をお願い致します。

# 簡単操作方法

こちらの方が詳しく書いてくださっているのでご参照ください。

https://qiita.com/zumax/items/9b0f9e0ed1b57474a72f

追加されたところから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/53bf3bc8-4513-e4f1-3598-116f626932bb.png)

チャットをしてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/88bf0191-3be4-0265-ec55-7dd6eeb8573a.png)

「モデルを選択」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/0bb82388-a740-6667-63ed-df1468603815.png)

「Llama 3.1」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/9895c567-b57f-3668-2242-b5144325bfed.png)

せっかくなので比較モードに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/efa6ca1d-38cc-207f-27c6-51e1f18ef4dc.png)

# 結果

Llama 3.1はや～い！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/ed7ce33f-5b89-a04f-ed2a-b44508a28dc1.png)

上記の質問は正解が良く分からなかったので、違う質問も
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/2defcf21-0cb1-e4f9-cacf-e40cb63d7540.png)

Llama 3.1は、理系な回答でした。
Claude 3 Opusは、国語的な回答でした。

# 次回予告

次は、以下を参考にさせてもらい、記事の要約をしてもらおうと思います。

https://qiita.com/takuma818t/items/88b0005dd5cfcc55b42a
セクションを折りたたむ

以下のようにセクションを折りたたみ可能にしたい。すぐに設定方法を忘れてしまうので、覚えを残します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ccd49834-fb7e-5d9d-652a-65caf5eff560.png)


まずは、セクションにマウスのカーソルを持って行って、左側の「セクションの編集」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e31533aa-383d-e700-6537-bd746f2d5a8a.png)

今度は右側の一番下。「セクションの折りたたみを可能にする」を有効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/05ab729d-d4c8-93e0-5eab-3158b2924c81.png)
新機能紹介：BigQuery の CHANGES 関数でデータ変更履歴を効率的に追跡！

こんにちは。codepoet です。

### はじめに

プレビュー機能として「CHANGES関数」が追加されました。この関数を使うことで、特定のテーブルのデータ変更履歴をSQLクエリで簡単に取得できるようになります。

従来、データ変更履歴の追跡は、トリガーや外部システムを用いた複雑な仕組みが必要でしたが、CHANGES関数を使えば、SQLクエリだけで実現できるため、開発効率が大幅に向上します。

本記事では、CHANGES関数の概要、使い方を解説していきます。

### 目次

1. [CHANGES関数とは？](#CHANGES関数とは？)
1. [CHANGES関数の使い方](#CHANGES関数の使い方)
1. [まとめ](#まとめ)
1. [参考文献](#参考文献)

### CHANGES関数とは？

CHANGES関数は、指定したテーブルの、特定の期間におけるデータの変更履歴を返すテーブル関数です。返されるテーブルには、変更前のデータと変更後のデータ、変更日時などが含まれます。

**主な特徴**

* **シンプルなSQL:** SQLクエリだけで変更履歴を取得できるため、複雑なコードを書く必要がありません。
* **柔軟な期間指定:** 任意の期間の変更履歴を指定できます。
* **変更内容の特定:** 変更されたカラムや、変更前の値と変更後の値を特定できます。

### CHANGES関数の使い方

CHANGES関数の基本的な使い方は以下の通りです。

```sql
CHANGES(
  TABLE table,
  start_timestamp DEFAULT NULL,
  end_timestamp)
```
シンプルですね。

- `table_name`: 変更履歴を取得したいテーブルの名前を指定します。
- `start_timestamp`: (省略可) 変更履歴を取得する開始時刻を指定します。NULL を指定すると、テーブル作成以降のすべての変更が取得されます。
- `end_timestamp`: 必須。変更履歴を取得する終了時刻を指定します。**現在の時刻から10分以上前** の値を設定する必要があります。**最大で1日間の範囲**を指定できます。

### CHANGES関数の例

`Produce` というテーブルに対して変更を行い、CHANGES関数で取得される変更履歴を出力します。

```sql
-- テーブルの作成
CREATE TABLE mydataset.Produce (
  product STRING,
  inventory INT64
)
OPTIONS(enable_change_history=true);

-- 2行のデータを挿入
INSERT INTO mydataset.Produce
VALUES
  ('bananas', 20),
  ('carrots', 30);

-- 1行のデータを更新
UPDATE mydataset.Produce
SET inventory = inventory - 10
WHERE product = 'carrots';

-- 1行のデータを削除
DELETE FROM mydataset.Produce
WHERE product = 'bananas';

-- 10分待ってから、すべての変更履歴を取得
SELECT
  product,
  inventory,
  _CHANGE_TYPE AS change_type,
  _CHANGE_TIMESTAMP AS change_time
FROM
  CHANGES(TABLE mydataset.Produce, NULL, TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 601 SECOND))
ORDER BY change_time, product;
```

出力結果:

![Screenshot 2024-07-25 15.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665456/0b8903d0-a3e6-680b-d0cd-edfe51db1219.png)

**ポイント**:

* テーブルの変更履歴を取得するには、**`enable_change_history` [オプション](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#table_option_list) を `TRUE`** に設定する必要があります。**このオプションを有効にすると、課金が発生する可能性があるので注意**してください。(料金の詳細については、BigQueryの[ドキュメント](https://cloud.google.com/bigquery/docs/change-history?hl=ja#pricing_and_costs)を参照してください)
* 取得できる変更履歴は、**テーブルの時系列制限期間**に依存します。


**利用シーン**

* **データ監査:** データの変更履歴を監査し、不正な変更や誤操作がないか確認する。
* **データ復元:** データが誤って削除された場合、変更履歴からデータを復元する。
* **データ分析:** データの変更パターンを分析し、意思決定に役立てる。
* **デバッグ:** アプリケーションの不具合の原因を特定するために、変更履歴を調べることで、問題発生時の状況を把握する。

### まとめ

CHANGES関数は、データの変更履歴を詳細に追跡できる機能です。
ただし、CHANGES関数の利用には、パフォーマンス、コスト、データの保持期間など、いくつかの注意点もありますので、ユースケースに合わせて、CHANGES関数を活用してみてください。

### 参考文献

* [CHANGES関数に関する公式ドキュメント](https://cloud.google.com/bigquery/docs/reference/standard-sql/table-functions-built-in#changes)
Instapyでログインできない件について

InstaPyでログインができず長い時間はハマってしまったので、解決策のリンクを張っておきます。
また、InstaPyはseleniumを使用しているため、直接seleniumを使用することもできるようです。
以前私がseleniumでログインするソースを作成したものがあるため、そちらのリンクも張っておこうと思います。
## x-pathの変更

https://stackoverflow.com/questions/68623885/instapy-doesnt-login-into-account

## Cookieを許可するボタンを押しておく

https://github.com/InstaPy/InstaPy/issues/5837

## seleniumを直接使用してログイン

https://qiita.com/fishyamamoto/items/3bc909051d13207f885d

## 基本的なソースは以下のリンク

https://docs.kanaries.net/de/topics/Python/instapy

以前私は自動フォロー・いいね機能を作成したのですが、Instagramの仕様変更により、使い物にならなくなりました。
そのため、以前から気になっていた、InstaPyを使用し、再度作成を試みようと思います。
ログイン画面は変更はあまりなさそうなので、以前のソースをそのまま使用できるかと思います。
これから、ソースを載せていきますので、ぜひご覧ください。
AWSCDKでALBをTLS1.3に対応させる

タイトル通りです。
AWS **CDK** を使ったコードでAWSの **ALB** をTLS1.3に対応させましょう、というお話です。
たったそれだけなので記事にするほどでもない気がしますけど、少し困ったことがあって載せることにしました。

## 気になること困ったこと
元々TLSを指定していない場合の初期値は一体何が設定されるの？
試してみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491285/41a04e6a-177b-53d3-c449-0ca96902aee9.png)
[ELBSecurityPolicy-2016-08]
ずいぶん古いポリシーがセットされるんだな、という印象。

ちなみにコンソールから一覧を選択するとTLS1.3では推奨は[ELBSecurity-TLS13-1-2-2021-06(推奨)]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491285/46bb47e7-36c0-9810-052e-9633dd032c9a.png)

推奨が指定省略時のデフォルトじゃないんだぁ、という感想。
cdkライブラリが古いのかもという疑いもあって20240724の最新にアップデートした状態でこれでした。

## 何に直す
じゃあ直さなきゃならないですねとなったとき、
>sslPolicy: elbv2.SslPolicy.???

ここでインテリセンスによって表示される一覧を見てもどれ選べばいいのかさっぱりなわけです。
というかなんでこんなにたくさんあるの？と思ってそもそも違いは何？ということで
リファレンス[AWS CDK 2.150.0](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_elasticloadbalancingv2.SslPolicy.html)によると暗号スイートの含み方やTLS1.0～TLS1.2のいずれにも対応するか、つまり後方互換をどうするか？という選択なのかなと解釈しました。

ということはデフォルトで設定されていた今までの設定は何なの？ということも気になるわけで。
[ELBSecurityPolicy-2016-08]はSslPolicyの一覧のどれに対応するかを調べたかったけど、直接対応しているように思えなかったので、レスポンスから状態を判断することにしました。
このようなツールを使って調べています。

pythonで
>sslyze --tlsv1_3 [hostname]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491285/f719cccc-8472-5297-5dcf-e306f75a28a0.png)

適当なターミナルで
>nmap --script ssl-enum-ciphers -p 443 [hostname]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491285/f921ec7d-67d7-32b9-1797-28f968155303.png)

ツールの使い方は省略します。適当にpip installやaptやyum使ってください。
このツールの結果からはTLS1.0~TLS1.2に対応していることといくつかの暗号スイートに対応していることがわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491285/73966c5d-0811-fb1f-c68e-5db0aebfd78d.png)
こいつではないか！
全ての暗号を含むので過剰かもしれませんが少なくとも以前のものは含むので互換性はありそうです。
これならこれまでのユーザーを含めても互換性保ちつつTLS1.3にも対応できるのではないかと思い設定することにしました。


## 修正結果
```
import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
～～省略～～

    const alb_backend_server = new elbv2.ApplicationLoadBalancer( ...
    ～～省略～～

    const listener_backend = alb_backend_server.addListener('Listener', {
      protocol: elbv2.ApplicationProtocol.HTTPS,
      port: 443,
      sslPolicy: elbv2.SslPolicy.TLS13_10,  // <---追加したコード
      defaultAction: elbv2.ListenerAction.fixedResponse(404, {
        contentType: 'text/plain',
        messageBody: 'NotFound',
      }),
    });
```

デプロイ後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491285/0ce3aee2-6b20-d963-24de-a9f893bce70f.png)
あ、そうか推奨はTLS1.2とTLS1.3だから推奨設定ではないんだな


## おまけ
少し調べましたが推奨設定にするSslPolicyがどれかわかりませんでした。
なんかないような気がするけど、そうなの？誰か教えてください。


## 経緯と感想
個人情報が流出しただのサイバー攻撃受けただの、世の中が騒がれています。
「うちの製品はセキュリティ大丈夫なの？」とか聞かれませんか？
説明してもわからないくせに～と思いながら対応してあげているんじゃないでしょうか。

さて、そう思いながらも私も知らないことけっこう多くて組んだインフラがTLS何まで対応しているのか正直ちゃんと考えていませんでした。
考え直す良い機会になったと同時にTLSの歴史についても少し学べて良かったです。

## 環境
Windows 11 Pro
Node v18.18.2
AWS CDK 2.150.0
実習ROS 2 目次

ROS 2のハンズオン教材「実習ROS 2」の目次のページです。  
テーマごとに解説ページへのリンクを記載しています。  
リンクのないページについては、今後順次公開予定です。

## 導入

- [コンセプト](https://qiita.com/s-kitajima/items/09a9e3885bf83b1f8c05)  
  ROS（ROS 1, ROS 2共通）と、ROS 2のコンセプトについて説明します。

- インストール  
  ROS 2のインストール方法について説明します。

### 入門

#### 基礎編

- [Pub&Sub通信](https://qiita.com/s-kitajima/items/5a4d7f06413120010e6b)  
  ROSのデータ通信の基本となるPublish/Subscribe通信を行うノードをC++で作成、実行します。

- [Service通信](https://qiita.com/s-kitajima/items/29607ff86a656e4d6099)  
  クライアント/サーバ型の通信方法であるService通信を行うノードをC++で作成、実行します。

- [ROS 2 Launch 1：概要](https://qiita.com/s-kitajima/items/3b17d1c4a248299cc026)  
  複数のノードをまとめて起動する方法であるlaunchというシステムについて説明し、簡単な実行例を示します。

- [ROS 2 Launch 2：応用](https://qiita.com/s-kitajima/items/ef113900656aa2ba4f59)  
  launchシステムで使用できる応用機能の一部を説明します。

- [ROS 2 tools](https://qiita.com/s-kubota/items/e9d69b44d6659d44e95c)  
  デバッグ等に使用できるCLI上でのコマンド、GUIツールについてまとめています。

- [ROS 2 Logger](https://qiita.com/s-kitajima/items/42bf046f4a3de95147d8)  
  ROS 2で情報をターミナルに出力するログシステムについて説明します。

- [ROS 2インタフェース](https://qiita.com/s-kubota/items/b17bce1c5f2cfe8a93b9)  
  ROS 2のデータ通信インタフェースについて説明し、使用方法を示します。

- [カスタムROSメッセージ](https://qiita.com/s-kubota/items/eeaa1914055415d5792b)  
  自作のROS 2メッセージ型を定義し、使用する方法について説明します。

#### 可視化編

- [urdfを記述する1](https://qiita.com/esol-h-matsumoto/items/13e5f278244fd6b576c6)  
  ロボットを記述するフォーマットであるURDFの概念と、基本的な書式を説明します。

- URDFを記述する2  
  URDFで様々な色や形のlink、可動jointを記述します。

- xacroを使う1  
  URDFを効率的に記述する方法であるxacroを利用して、定数、数式・条件式を記述します。

- xacroを使う2  
  xacroのマクロ機能のうち、モジュール、インクルード、変数を利用したxacroを記述します。

- tf2 broadcast, listen  
  tf2の概要とbroadcast, listenの方法を説明します。

- joint_stateをpublishする  
  joint_stateをROS 2ノードからpublishし、Rviz上のロボットを動かす方法を解説します。

### 上級

#### 発展編

- [Action通信](https://qiita.com/s-kitajima/items/6f9f544010d49fdbe1d5)  
  クライアント/サーバ型で、実行中の情報をフィードバックして受け取れる通信方式であるActionを解説、実装します。

- [ros2 paramを使う1](https://qiita.com/s-kitajima/items/995de6d937a9a938a495)  
  ROS 2ノードに与えるパラメータの概念、CLIツール、基本的な与え方について説明します。

- ros2 paramを使う2  
  ROS 2ノードで扱えるパラメータの型の種類や、YAMLファイルからパラメータを与える方法について説明します。

- rosbag2を使う  
  ROS 2でトピックを保存、再生する手段であるrosbag2について解説します。

#### ROS 2追加要素編

- Componentを使う  
  ノードを共有ライブラリとしてビルド、実行するComponentという概念を説明し、これを用いたノードを実装します。

- Lifecycleノード  
  ノードの状態遷移を表現できるLifecycleという仕組みを説明し、これを用いたノードを実装します。

- QoSを設定する  
  ROS 2の通信品質を決定しているQoSという概念と、それらを設定する方法を説明します。

#### 開発環境編

- [CMakeLists.txtとpackage.xmlの書き方](https://qiita.com/s-kitajima/items/3f4c7f2dd2d9e5e5a792)  
  2つのファイルの役割や、書式について説明します。

- ROS 2パッケージのディレクトリ構成  
  ROS 2のワークスペース及びパッケージのディレクトリ構成について説明します。

#### UI編

- Qtを使う1  
  QtでGUIを作成し、作成したGUIをROS上で動かして画面に表示する方法を説明します。

- Qtを使う2  
  QtでGUIの応答処理を実装する方法を説明します。

- QtでPub&Subする  
  QtとROS 2を組み合わせて、GUIからトピックを扱う方法を説明します。
グラボの取り付け方

今日はデスクトップPCにグラボを取り付けた。下記ページを参考にして進めた。
https://nyanswer.com/graphic-mount/

グラボをPCに取り付けた後、補助電源用のケーブルをグラボに挿す必要があるらしい。
今回RTX2080Tiというグラボを取り付けたが、8ピンを挿すところが2箇所あった。最初、この2箇所に8ピンを挿したつもりだったが、GPUは認識されなかった。どうやら二股になってるケーブル一本を2箇所に挿したのが良くなかったらしい。なので8ピンのケーブル2本をそれぞれ挿した。
そしてGPUのドライバーをインスールしてPCを再起動したら、無事にGPUが認識された。
スプレッドシートでコピーしたものをJavaScriptで配列にする

スプレッドシート（Excelや、Googleスプレッドシート）で範囲をコピーし、他のアプリで貼り付ける際に、貼り付け先によってはTSV（Tab-Separated Values）の形式で貼り付けられます。

TSVでは、タブ文字は1つ右のセルへの遷移、改行文字は1行下への遷移を意味します。セル内にタブ文字や改行文字を含む場合は、セルの文字列を「"」（ダブルクォーテーションマーク）で挟みます。セル内にタブ文字と「"」、または改行文字と「"」を同時に含む場合は、文字列内の「"」は「""」に置換されます。

今回、TSVをJavaScriptで配列にパースするコードが見つからなかったので、自作してみました。

```
const TSV={}
TSV.parse=function(tsv){
	const result=[[``]]
	let row=0
	let column=0

	const regExp=/^\t|^\n|^"([^"]|"")*"|^[^\t\n]*/g
	while(tsv){
		switch(tsv[0]){
			case`\t`:
			result[row][++column]=``
			break

			case`\n`:
			column=0
			result[++row]=[``]
			break

			case`"`:
			let[extracted1]=tsv.match(regExp)
			extracted1=extracted1.replace(/^"|"$/g,``)
			extracted1=extracted1.replaceAll(`""`,`"`)
			result[row][column]=extracted1
			break

			default:
			let[extracted2]=tsv.match(regExp)
			result[row][column]=extracted2
		}
		tsv=tsv.replace(regExp,``)
	}
	return result
}
```
ECSでCannotPullContainerErrorが発生した場合の対処法（ダイジェスト不一致）

## 状況

一意のコンテナタグを使用してデプロイを更新していた時に
ECRからコンテナイメージをPullするときに以下のエラーが発生しました。
![て.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179263/d8196ab2-1b6d-fa93-28a0-8569ed4807f8.png)
## 原因
ECSの方で、イメージタグではなく、以前のコンテナダイジェストを利用してデプロイをしていたことにありました。

そのため、イメージタグは同じでも、新しくECRにPushしたコンテナはデプロイ対象とはならず、**存在しないダイジェストのコンテナイメージ**を引っ張ってこようとしてエラーになってしまっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179263/1482302e-903a-34af-0df3-c4720578cb0f.png)
※ダイジェストが一つ目の画像のエラーの中にある数字と違う

## 解決策
サービス定義の設定から「新しいデプロイを強制」をONにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3179263/ad65f8a0-e102-2ca3-a8fa-ca2822deceb6.png)

これにより、一意のイメージタグによるデプロイを実施している場合でも、ECRにPushされるとデプロイが実施されるようになります。

## 参考
[コンソールを使用した Amazon ECS サービスの更新](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/update-service-console-v2.html)

[ECR に保存しているコンテナイメージを更新後、ECS サービスにて更新を行いデプロイを実施しましたが反映されません。](https://support.serverworks.co.jp/hc/ja/articles/18852812638361-ECR-%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E6%9B%B4%E6%96%B0%E5%BE%8C-ECS-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AB%E3%81%A6%E6%9B%B4%E6%96%B0%E3%82%92%E8%A1%8C%E3%81%84%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%82%92%E5%AE%9F%E6%96%BD%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8C%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93)
リモートデスクトップ接続　ローカル→ADユーザー　備忘録

# 背景
会社の方針でネット接続する際はAD参加してとのお話。今までリモートデスクトップ接続し、ローカルアカウントで作業していた。そこでADユーザーに切り替えることにした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/737ae6d8-d3d3-2be0-4f11-7261fd0e155e.png)

# ADユーザーでログインするまでの手順
１．ADドメインの管理者にAD申請し、ユーザーを作成してもらう。このときにuser,Passをもらう。
２．リモートデスクトップ接続でローカルユーザーにログイン
<b>３．ローカルにログインしながら、ADユーザーのパスワード変更し、一度ログオフ。
４．クライアント側の設定変更</b>
５．ADユーザーの新規設定パスワードでログイン

特に３，４番がトリッキーだったのでその点をPick upして説明する。
## ローカルにログインしながら、ADユーザーのパスワード変更

参考にしたのはこちらの記事。
https://it-study.info/rdp-password-error/

リモートデスクトップ接続でパスワードを変更するときは
```
ctrl + alt + Fn + →
```
でログイン画面に入ることができる。ctrl + alt + deleteだとクライアントPCのほうでログイン画面に戻ってしまうので注意。

## ４．クライアント側の設定変更
３の作業が終わり、ログインできるかと思えば
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/58159f54-a8c6-7ae7-9611-8689ebf60e2b.png)
このようなエラーが起きた。
「資格情報は機能しませんでした。」とのことだったのでクライアント側にリモートのPCに入る際にアクセスするのが許可されず起こったのだろうと推察。
以下の記事を見て対応を行った。
https://www.projectgroup.info/tips/Windows/comm_0156.html

Windows10対応の記事だがWindows11でも同様の方法で解決ができた。
１．Windowsキー＋R
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/23eb6991-1cbd-3bca-bba2-1d20c5bc93a7.png)

２．ローカルグループポリシー　エディターが開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/445bde7d-1ec0-03d2-c15a-809bbc200466.png)

コンピューターの構成＞管理用テンプレート＞システム＞資格情報の委任で上図の画面まで行けるはず。

３．「NTLMのみのサーバー認証で保存された資格情報の委任を許可する」をクリック

:::note warn
何もしてない人は「未構成」となっているはず。上図は設定済みなため「有効」となっている。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/692c1864-12b3-5d18-0c81-a77c15438cbb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661566/41e2464f-8629-87b3-73f7-76fc12fcdfb2.png)

ラジオボタン「有効」を押す>サーバーを一覧に追加>TERMSRV/*を入力欄に入力>OKボタン

これできたら、エディターは閉じてOK。

４．コマンドプロンプト（管理者権限）で入る。
管理者でコマンドプロンプトに入ってください。
「gpupdate /force」と入力してEnter を押下します。
しばらく待ち、「正常に終了しました」と表示されたら画面を閉じる。

# これでログインを試みる

これで「お使いの資格情報は機能しませんでした」とはならないはず。
上手くいかなければ別のエラーへの対処が必要だろうと思われる。

詳しい操作の意味は参照先にゆだねる。

# (追加)プロキシの通し方
手間取ったがこれでいけた
```
PS C:\Windows\System32> netsh winhttp set proxy proxy-server="http=10.〇〇〇.〇〇〇.〇〇〇:8080"

現在の WinHTTP プロキシ設定:

    プロキシ サーバー:  http=10.〇〇〇.〇〇〇.〇〇〇:8080
    バイパス一覧     : (なし)
```