OmniAICreator/Qiita-1.07M huggingface dataset:
Excelの「名前の定義」の「名前」で使える文字列・使えない文字列は何？

# Excelの「名前の定義」で使える文字列・使えない文字列は何？

## 前置き

記事の名前の通り、Excelの「名前の定義」の「名前」で使える文字列・使えない文字列は何なのかを示します。
ちなみに、自分がExcelの名前でエラーが起きたときは、以下のキャプチャで示すダイアログが出ました。
![2021-12-03_18h33_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452291/143f639c-98bb-69c6-d7ae-a1b2b995be70.png)

正しいとは思うのですが、「他の無効な文字」って何なんだろう？と思ったのがきっかけです。
ちなみに「他の無効な文字」について、Microsoftから情報は提供されていなさそうでした。

## 大体分かればいい人向け

以下の記事が詳しかったです。
<http://office-qa.com/Excel/ex209.htm>

記号系はほぼ駄目みたいです。（文字数に上限とかあったりしたんですね）

## 詳しく知りたい人向け

1つ目のリンクの記事から、2つ目のリンクのリポジトリにたどり着きました。
各文字について、どのように使うとOK・NGなのかが表形式で並んでいます。
<https://contexturesblog.com/archives/2017/12/07/what-are-the-rules-for-excel-names/>
<https://github.com/MartinTrummer/excel-names/>

このように網羅的に調べていただけてるのはありがたい限りです。
先人の知恵は偉大でした。
実際に自分が活かすことは無いと思いますが・・・
【ゲームQA】レビューのチェックリスト

Hello！私はモンストやコトダマンといったゲームのQAを担当しています。
今回はレビューについて記載していこうと思います。


QAが行うレビューは大きく分けて2種類です。

- 仕様書のレビュー
- テストケースのレビュー

他にはコードのレビューがありますが、あまり経験が無いので(:wink:)今回は割愛します。

## 仕様書のレビュー
仕様書のレビューを行い、仕様策定段階で仕様の検討漏れを指摘することで、
後工程の実装やテストの段階で発見した際に比べ、修正コストを格段に抑えることができます。
つまり、仕様書のレビューは"コスパ"が良い活動なのです。

- - -

### ▼観点リスト
- そもそもなぜこれを実装するのか？
- いつ使用するのか、頻度は？
    - 特定の期間、キャラ、コラボ限定か？
    - 普段使いするのか？
    - 今すぐ使わない仕様まで盛り込まれていないか？
- いつリリースするのか？
    - アップデートメンテ明け直後か？
        - アップデート前に〇〇している人は？
            - 引き継ぐとどうなる？
        - 新規ユーザーはどうなる？
    - 時限の仕組みがあるか？
        - 事前はどうなる？
        - 事後はどうなる？
        - またぎの瞬間はどうなる？
    - 解析対策は必要か？
        - 情報初出はいつか？
- 他の機能とどのように組み合わせて使用するか？
- 発生/発動するタイミングは？
    - 競合するものがあるか？
    - 優先度は？
- お知らせ・ヘルプはどうするか？
- 障害発生時、取り返しがつくか？
    - 補填が可能か？
    - 機能を塞ぐことが可能か？
- 今後の拡張予定・構想は？
- テストツールが新規で必要か？
- スクショを撮れるタイミングがあるか？（バイラルしそうか？）
- Androidのバックキー（戻るボタン）を押したときの戻り位置は？
- 本実装による影響範囲は何か？
　
 
- - -
大抵、その機能単体の仕組みは考えられていても、
他の機能と競合した際の処理については網羅できていないことが多いです。
仕様書に書いていないことは何か？を念頭に考えていきましょう。

その為の資料作りとして、QAは既存機能の裏仕様や歴史（この組み合わせはNG、実はこんな背景があったんですよ。。等）も含め、網羅的に知識を溜めて行く必要があります。


## テストケースのレビュー
仕様書を元にテストケースができたら第三者にレビューしてもらいます。
レビュアーは企画、エンジニア、デザイナーの方でも良いですが、
必ずQAからはレビューをもらうとよいです。
- - -

### ▼観点リスト
- このテストの方針は何か？
    - 要件（大事なところ）を捉えているか？
    - バグを検出するためのテストなのか、動作保証をするためのテストなのか？
- 各テスト項目について、なぜこのテストをするのか、理解できる書き方になっているか？
- テストが全て実施できそうか？
    - テストデータの準備はできているか？
    - 工数を鑑みて優先度付けがされているか？
- 仕様書記載の仕様について全て、テスト項目があるか？
- 正常系だけでなく、異常系のテスト項目があるか？
    - 無効な値、境界値のテスト項目があるか？
    - エラー処理について、期待値が正確に記載されているか？
- 環境系（OSや特殊な端末固有の機能）の考慮があるか？
- 影響範囲のテストに関して、抜け漏れがないか？
- 期待値が曖昧でないか？（正しく動作すること、等）
- 状態遷移や他の機能との組み合わせについて、種類が網羅できているか？
    - 同時期に実装されるものも考慮しているか？
- 無駄なテストがないか？
    - データQA時にすべきテストまで含まれていないか？
    - 同値分割は適切か？
- 類似の機能のテストケースと比較して、抜け漏れがないか？
    - 過去の不具合事例がカバーできているか？
- テストケースのテンプレート（標準観点）に追加できそうな項目はあるか？

- - -


テストケースについては、各チームで標準観点といったテンプレートのようなものがありますが、
レビューに対する観点も、忘れずにブラッシュアップしていきたいですね。


▼参考にさせて頂きました
https://qiita.com/ktanizaki/items/e6266899263e8f26b5e4
http://jasst.jp/symposium/jasst18kansai/pdf/S3B-1.pdf
https://qualab.jp/materials/q_te.140528.color.pdf
Scratch歴4年がみつけたScratchの最強の勉強方法

#はじめに
今回は、Scratchを4年以上やってきて、Scratchの最強の勉強法を見つけたので共有したいと思います。
#注意
- 私が見つけた「最強」です。全員に適用するわけでないです。（これを実際に実践しても再現性は１００％ではありません）
- 勉強法とは、Scratchですごいプログラム、作品を作る方法のことです。

#結論

1.作りたいものを見つける
2.実装したいプログラムを考える、調べる
3.他の人のすごいプログラムを解読する

#理由
##作りたいものを見つける
まずは作りたいものを見つけることです。基礎文法は最低覚えるとしても、作るものを見つけないとモチベがもたないので先に作りたいものを見つけます。
##実装したいプログラムを考える、調べる
作りたいものが見つかったら、実際にプログラムを作ります。やっぱり教えてもらうんじゃなくて自分で考えることも大事です。どうしてもわからないときは教えてもらう、教えてもらえそうな人がいない場合は次へ。
##他の人のすごいプログラムを解読する
Scratchは他のプログラミング言語に比べて解説記事などの情報は少ないですが、リミックスというシステムがあったり、バックパックなど、他人のプログラムを使いまくれるようになっています。
ただそのまま使うのはよくないですが、クレジットなどに書き込めばScratchだと使えるので、良いですね。

#まとめ
1.作りたいものを見つける
2.実装したいプログラムを考える、調べる
3.他の人のすごいプログラムを解読する

の三つが大事。
AWS Amplifyコンソールでフロント側のビルド＆デプロイをする際、"AWS"から始まる環境変数名は定義できない

Amplifyコンソールからデプロイしようとしたところ、「保存してデプロイ」押下しても反応がなくデプロイが始まらない現象が発生したので調べてみました

# 開発者ツールで確認してみた

開発者ツールで確認してみると、`https://amplify.ap-northeast-1.amazonaws.com/apps/xxxxxxxx`というAPIでエラーが発生していました。

詳細を確認したところ、`Environment variables cannot start with the reserved prefix \"AWS\".`というエラーメッセージでした。

↓のようにAWS関連の環境変数であることが分かるように"AWS_XXXXX"のような名称で登録していたために引っかかってしまったようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/df364b6a-c7fb-0d81-125d-f3092664a6fc.png)

リファレンス見ても特に書いてない気がしますが、AmplifyコンソールがデフォルトでAWSから始まる環境変数を定義しているからですかね？
https://docs.aws.amazon.com/amplify/latest/userguide/environment-variables.html

# 対策

環境変数の名称を"AWS"から始まらない名称に変更しました。


# 最後に

エラーが起きてることくらい画面に出してほしいですね。。
ビルドしてるのかな？って感じで10分くらい待ってみたり、3回くらい登録しなおしたりしてしまいました。
neosでlogix その12

#概要

niosでlogixやってみる。
to strノード、使ってみた。

#写真

![2021-12-03 08.52.11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/71f8608d-8f9f-bbe9-23f5-df87c1d147c4.jpeg)

#To String Float

```
Inputs
 	Float	V
 	String	Format
 	IFormatProvider	FormatProvider
Outputs
 	String	*
```

以上。
mix phx.server したときの[error] Can't find executable `mac_listener`の対処法

macOSをMonterey 12.0.1に更新した直後、mix phx.serverしたところ、

```
[error] Can't find executable `mac_listener`
[warn] Could not start Phoenix live-reload because we cannot listen to the file system.
You don't need to worry! This is an optional feature used during development to
refresh your browser when you save files and it does not affect production.
```
というエラーが出ました。
elixirforumで調べて解決に至ったので、その手順を共有します。
以下スレッドを参考にしました。↓
[Could not compile file system watcher for mac](https://elixirforum.com/t/could-not-compile-file-system-watcher-for-mac/17432/9)

### 解決手順
1. xcode-select --installを実行
2. mix deps.compile file_systemを実行

### 他にも不具合がありそうですが、、、
この手順であっさり解決しました。
でも今後また何かあるかもしれません。
[Deep Discovery Inspector] 仮想アナライザのインポートのコツ

# はじめに

こんにちは。
今回はトレンドマイクロのセキュリティ製品「Deep Discovery Inspector」の「仮想アナライザ」のインポート方法をご紹介したいと思います。
仮想アナライザとは、DDIの機能の一つでDDI上でWindowsの仮想マシンをサンドボックスとして動かす機能です。


# 仮想アナライザの手順

ざっくりとした概要と手順です。
詳しくは公式のドキュメントを参照してください。

- ストレージの接続設定をIDEにして作成する
- Windowsの仮想マシンを作成して設定する
- Administratorユーザを有効化し自動ログイン設定をする
- Officeをインストールする
- CDドライブの自動再生を有効にする
- シャットダウンしてOVAファイルを書き出す
- アップロードツールでアップロードする

![スクリーンショット 2021-12-03 181040.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1983877/4c22c010-1e87-9ae5-5fa0-ab10996694af.jpeg)

# 仮想アナライザのインポート時に躓いた点
## Windowsのビルド

仮想アナライザはWindowsのビルドが指定されています。
ビルドが間違っているとインポート作業が10分程度で終了して弾かれてしまいます。

https://success.trendmicro.com/jp/solution/1114745

Windowsの過去のビルドを手元に用意しておくことが重要です。

## 仮想マシンのディスク容量

仮想マシンの容量が足りないとインポートを開始して約1時間後に躓きます。
インポート前にWindows仮想マシンのディスク容量が十分か確認しましょう。

## Virtual Analyzer Image Preparation Toolでの注意点

### 必ず作成した仮想マシンのクローンを作成してから試す

ツールを動かすと仮想マシンにファイルの配置や、操作が加えられるため元の仮想マシンイメージは大切に保管しておくことを強くお勧めします。

### 何度もツールを通さない
本当に出力されたOVAファイルが正常か確認することがあるかと思われますが1回通した後もう一回通すとエラーになるケースがありました。
また、数回ツールに通すと仮想マシンのストレージ容量がひっ迫してしまい、仮想マシンが動かなるケースがありました。
コピー元のVMにて引っかかった部分を修正し、クローンを作成して再試行することをお勧めします。

# サポートに質問するときのポイント

## DDIのログを優先して見てもらう

DDIから吐き出されたログは暗号化されており、サポートの方に解析してもらう必要があります。
「DDI側でインポート時にどの部分で躓いたか」と質問することでスムーズに話が進みました。
最低限必要なファイルを提出し、DDIのログを優先して確認して頂くことをお勧めします。
（Virtual Analyzer Image Preparation Toolのログは暗号化されていないためvBoxManageコマンドや、Windowsのスクリプトが読める方であれば原因を追究できるかもしれません）


# おわりに

法人向けのセキュリティ製品ということもあり、躓いたときのナレッジが少なかったため書かせていただきました。
何かの参考になれば幸いです。
Jetson XavierNXにNVMe SSDを増設し高速化



Jetson xavierNXはM.2に対応しており、NVMe SSD を使用できます。
NVMe SSDを用いることで、実行プログラムをSSD上で全て実行できるため高速化を行うことができます


[Jetson Hacks](https://www.jetsonhacks.com/2020/05/29/jetson-xavier-nx-run-from-ssd/)にあるスクリプトを利用することで、
現状の環境を簡単にSSDに移すことができたのでその手順について説明します。


## SSDの取り付け

今回は以下の500GBのSSDをJetson XavierNXに拡張しました。
[WESTERNDIGITAL ウエスタンデジタル 内蔵SSD 500GB](https://www.amazon.co.jp/dp/B09J8FNGBZ/ref=cm_sw_r_tw_dp_NCN581K09HPJCV523P8Y)
![IMG_5837.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/8de2b59a-bef4-5212-6c74-49a8985ea874.jpeg)

取り付けた外部SSDが正しく認識していることを確認します。

```
fdisk -l
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/cb417669-7fea-8d43-51ab-87a75df36cf5.png)

/devnvme0n1に500GBのSSDがマウントされていることが確認できます。
もしここで表示されていない場合は、取り付けがうまくできていないので確認してみてください。


## SSDのパテーションの作成

SSDをetxt4でフォーマットし、パテーションを作成していきます。
パテーション作成しておくことで、予備の領域を残しておきます。
##### 後に実行するコマンドは、パテーションを作成することを前提としています。
##### そのまま実行したい場合は必ずパテーションを作成しておく必要があります。

ここからはGUI上で操作していきます。
まずdiskアプリを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/1d847c1a-a9d3-d4bf-798a-93478e47c1da.png)

500GBのディスクが確認できます。
右上の設定項目からFormat Dsikを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/f424c252-983e-ab7d-be34-7ca05c9fe7d8.png)

compatible with modern systems..に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/ee1805ff-bb99-b7e8-a51d-35e9b57791a2.png)

確認されるので、formatを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/7189656f-4321-f5b8-2851-05c4a6c026d3.png)

### パテーションの作成

+マークを選択し、パテーションのサイズを作成
今回はとりあえず16GBに設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/a9e92375-d098-4714-7218-a5667151c5ab.png)

作成するvolumeの好きな名前を決める
今回はxaviernx500で入力し、create
パスワードを聞かれたら入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/531d7225-46ee-4915-d533-10a39fe7264f.png)

以下のようにできていれば成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/a028db99-8fa1-d797-cab8-ffa2a758069f.png)


## SSDへの移行

次にgithubのrootOnNVMe を使用します。
https://github.com/jetsonhacks/rootOnNVMe

以下のコマンドを実行するだけで、

* SDカードのルート以下にある全てのファイルをSSDに移動させる。
* サービスのセットアップを行う。これにより、.serviceファイルが正しい場所にコピーされ、起動スクリプトがインストールされてrootがSSDに設定されます。


```
git clone https://github.com/jetsonhacks/rootOnNVMe
cd rootOnNVMe
./copy-rootfs-ssd.sh
./setup-service.sh
sudo reboot
```

実行途中の画面
128GBを移行するのにだいたい40分くらいかかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/3874035e-f993-0b09-9dd9-5155162578e9.png)

これで、再起動を行うと/dev/nvme0n1p1がルートディレクトリになっています。
 /dev/mmcblk0にSDカードが認識されています。

## 性能確認

hdparmでメモリの読み出し速度を確認したところ10倍以上の速度がでていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/da492ad7-15db-9271-3624-48f04fa5ff65.png)

##　まとめ

簡単にSDカードからSSD上に移行することができました。
vmstatのソースコードを読もう　パート①

#vmstatのランキュー（r）やブロック（b）などはどのファイルから取得しているんだろう。。。。
って思って調べてみました。

ソースコード
https://gitlab.com/procps-ng/procps

#「r」と「b」は「/proc/stat」の「procs_running」「procs_blocked」

```stat.c
if ((b = strstr(bp, "procs_blocked ")))
        sscanf(b,  "procs_blocked %llu", &llnum);
    info->sys_hist.new.procs_blocked = llnum;

    llnum = 0;
    if ((b = strstr(bp, "procs_running ")))
        sscanf(b,  "procs_running %llu", &llnum);
    info->sys_hist.new.procs_running = llnum;
```

#swpdは「/proc/meminfo」の「SwapTotal」と「SwapFree」から

```meminfo.c
    if (mHr(SwapFree) < mHr(SwapTotal))
        mHr(derived_swap_used) = mHr(SwapTotal) - mHr(SwapFree);
    else
        mHr(derived_swap_used) = 0;

    return 0;
```
C#でカノジョをつくる（3日目）

お疲れ様です。たなしょです。
今日は配列などのデータ構造や名前空間などの構造化について学びました。
この辺からC#特有の文法が出てきて面白かったです。

## 配列
今まで学んだ言語と同じなのでここも記載は割愛します。
配列→多次元配列→ジャグ配列の流れはどの入門書でも定番の流れですね。

## クラス、メンバー、enum
ここもJavaと同じなので記載は割愛します。
マイクロソフトが作ったJavaと言われているだけあってこの辺の記載はJavaと似ていました。
後一点気になったのが、

```c#
enum 年号
{
    明治, 大正, 昭和, 平成, 令和
}
```
C#は日本語を正常に読み解てくれるんですね。
2バイト文字だと文字化けが怖いので```NENGO```にして中の値も```meiji```に変更したほうがいいと思うんですけど…。

## タプル
分解と組み合わせるとスワップが簡単にできるのは確かに便利だなと思いました。

```c#
static void Main()
{
    int a = 10, b = 20;
    (a, b) = (b, a);
    Console.WriteLine($"{a} {b}");
}
```
それ以外は目新しい文法は特になかったです。

## if, switch, goto
どの言語でも共通している部分が多いので記載は割愛します。
goto文は極力使ってはいけませんよーというのはどの言語でも常套句です。（プロジェクトのコーディング規約でも「gotoは使用禁止」と記載があるんですよね。）
僕がgoto文を使ったのはC言語でOSかコンパイラを作った時ぐらいですかね。

## while, do~while, for, foreach
どの言語でも共通している部分が多いので記載は割愛します。
foreach文をまともに使えるようになったのはPHPを書き始めた時です。for文でしこしこ配列の値を取得していたらレビューで全て指摘対象になり、泣く泣く修正しました。いい思い出です。

## 可変長引数（パラメーター配列）
これはすごく便利だなと思いました。
普通なら一旦配列に値を代入しないといけないです。

```c#
static void Main()
{
    int a = 1, b = 2, c = 3, d = 4, e = 5;
    int[] tmp = new int[] { a, b, c, d, e };
    int max = Max(tmp);
}

static int Max(int[] a)
{
    int max = a[0];
    for(int i=1; i<a.Length; i++)
    {
        if (max < a[i])
            max = a[i];
    }
    return max;
}
```

可変長引数（パラメーター配列）を使うと配列を宣言しなくて済むので、可読性が上がりそうです。

```c#
static void Main()
{
    int a = 1, b = 2, c = 3, d = 4, e = 5;
    int max = Max(a, b, c, d, e);
    Console.WriteLine($"{max}");
}

static int Max(params int[] a)
{
    int max = a[0];
    for (int i = 1; i<a.Length; i++)
    {
        if(max < a[i])
            max = a[i];
    }
    return max;
}
```

## 名前付き引数
本来関数の引数を変更するときは、直前で宣言した変数に値を代入します。

```c#
int i = 0;

// 返り値で4が欲しい
i = 2;
int sq = Square(i);

static int Square(int a)
{
    return a * a;
}
```
名前付き引数を使えば関数の直前で代入しなくても問題ありません。
```i: 2```のように使います。

```c#
```c#
int i = 0;

// 返り値で4が欲しい
int sq = Square(i: 2);

static int Square(int a)
{
    return a * a;
}
```

## 例外処理
こんな風にcatch文を記載できるんですね。Javaでもできるんですかね？

```c#
catch (Exception e) when (e is FormatException || e is DivideByZeroException)
```
上記のように書くと```FormatException ```と```DivideByZeroException```ときにcatch文の処理に入ります。

それ以外は特に目新しい項目がないので記載は割愛します。
久しぶりにtry-catch-finally文を書きました。PHPだとDB処理の部分でしかtry文を書かないんですよね。

## 名前空間
C#でよくみる```namespace```についてです。
本の最初の方に「ディレクトリのようなもの」と書かれていましたがまさにその通りでした。
namespaceを定義することでこの中にあるclassなどは定義したnamespaceに属します。
エイリアスを付けられるみたいなのですが、いまいち内容がわかりません。

## 定数
ここも既知などで記載は割愛します。
最近Go言語でCLIツールをよく書くのですが、そこでもがっつり定数を使ってます。大事ですね。
ソースコードが見やすくなります。

## 最後に
色々とソースコードを写経したことで簡単CLIツールなら作れるぐらいにはコードが書けるようになりました。
条件分岐なども一通り学んだのでこれで[Atcoder](https://atcoder.jp/?lang=ja)にも参加できますね！
明日も引き続きよろしくお願いします。
認知症フレンドリーなリテールテックについて考える

私は認知症を専門とする精神科医です。
普段は訪問診療を行っているのですが、創りたいものを作れるようになりたくて2021年10月からプログラミングの勉強を始め、Qiitaにも記事を書くようになりました。

このアドベントカレンダーはリテールテックがテーマですので、私が専門とする認知症分野におけるリテールテックについてご紹介しようと思います。

#認知症リテールテックの現状まとめ記事
はじめに偉そうなことを書きましたが、認知症リテールテックについてはこちらの記事によくまとまっています。

https://designing-for-dementia.jp/design/008_casestudy_shopping/

上の記事のはじめに、小売業界が高齢者のニーズに関心を持っていないと感じる高齢者が多いと書いてありますが、**認知症の人に関してとなると、さらに配慮がされていない**というのが現状ではないでしょうか。

しかし、認知症の状態にある人は現時点で600万人いると考えられており、小学生の人数と変わりありません。
さらに、少子化で子どもは減り続け日本の人口も減り続けますが、認知症の人の人数は2060年まで増え続け1000万人を超えるという推計もあります。
つまり、**認知症の人というのは巨大なマーケットだ**と考えることが出来ます。

現状も認知症を大きなマーケットと考えている企業はありますが、これは認知症予防の観点からが多くサプリメントの広告をみかける方も多いと思います。
しかし、認知症の最大のリスク因子は加齢であり、認知症にならないためには年を取らないようにする必要があります。
現状の技術では、認知症にならないという意味での予防は不可能なのです。
詳しくは、こちらの記事に書いていますのでよろしければご覧ください。

https://note.com/naokiuc/n/n64ed25b6d33d

#求められているのは認知症フレンドリーなサービス

求められているのは認知症フレンドリーなサービスです。
認知症フレンドリーという言葉を聞いたことがない方が多いと思いますが、いわゆる「ユーザーフレンドリー」という意味での認知症フレンドリーです。
認知症フレンドリーについてはこちらの書籍をお勧めします。

https://www.iwanami.co.jp/book/b378375.html

認知症フレンドリーなサービスが求められているのは小売り分野だけではありません。
複数の企業に認知症フレンドリーなサービスを考えてもらうことが認知症フレンドリー社会につながると考え、福岡では「福岡オレンジパートナーズ」というコンソーシアムを作りました。

https://www.city.fukuoka.lg.jp/hofuku/dementia/health/00/04/orangepartners/fukuokaorangepartners.html

書籍「認知症フレンドリー社会」の中にもあるように、現状は認知症対処社会であり認知症の人が起こす問題に対処するという考え方をして「徘徊するからGPSをつけよう」といった技術の使い方をしていますが、**認知症の人が生活しやすくするにはどういう技術が必要か**という視点をエンジニアの方たちにも持っていただければと考えています。
Python3でCGIチャレンジ4　dictionary型でファイル読み書き

#作業フォルダ
ps4

#作業

##index.htmlの作成

```html:index.html
<html>
<head><meta http-equiv="content-type" charset="UTF-8"></head>
<body>
  <form action="/cgi-bin/dictWrite.py" method="POST">
   入力1<input type="text" name="foo">
   入力2<input type="text" name="bar">
   <input type="submit">
  </form>

<!-- ここから追記 -->
  <form action="/cgi-bin/readFile.py" method="POST">
    <input type="submit" value="ファイル内容表示">
   </form>
<!-- ここまで追記 -->
</body>
</html>
```

##cgi-binフォルダの作成

##dictWrite.pyの作成。cgi-bin配下に作成。

```python:dictWrite.py
import csv
import cgi
import cgitb
cgitb.enable()

print("Content-Type: text/html")
print()   

form = cgi.FieldStorage()

#辞書型の文字列作成
d = {'foo': form['foo'].value, 'bar': form['bar'].value}

with open('dict.csv', 'a', newline="", encoding='UTF-8')  as f:

  # 要素順の指定
  fieldnames = ['foo', 'bar']

  # writerオブジェクトを作成します.
  writer = csv.DictWriter(f, fieldnames=fieldnames, delimiter=",", quotechar='"')

  # writeheaderでヘッダー出力（追記なのでしない）
  # 新規のときだけ出力する条件は要調査
  # writer.writeheader()

  # writerowで1行分を出力します.
  writer.writerow(d)

print('書き込み完了')
```

##readFile.py作成。cgi-bin配下に作成。

```python:readFile.py
import csv
import cgi
import cgitb
cgitb.enable()

print("Content-Type: text/html")
print()   

# ファイルクローズが不要になる書き方
with open("dict.csv") as f:

  reader = csv.DictReader(f, delimiter=",", quotechar='"')

  for row in reader:
    print(row['foo'], row['bar'],'<br>')
```

##ターミナルでコマンド実行して、ローカルでCGIサーバーを起動する。

```
python -m http.server --cgi 8000
```

##ブラウザで確認

[http://localhost:8000]

#結果
初期画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401158/efa81ae8-6f17-c086-b205-be70b74472d0.png)

入力して送信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401158/d3626ed9-a893-d99b-ad71-3f5c77da2b96.png)

ファイルの状況
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401158/938ffadf-ab90-63ff-286a-29a41222b5a4.png)

ファイル内容表示ボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401158/9acdce4d-a612-af0d-ae06-f1cbf025d8f2.png)

#理解したこと

- ファイルクローズが不要になるファイルの開き方
- CSVパッケージの存在
- CSVファイルの読み書き
- dictionary型の取り扱い

#情報源
Googleで「Python3 辞書型 ファイル読み書き」で上から順に試した。
初心者による初心者のためのPython

#はじめに
今回2回目の投稿ですが最近授業でやっているPythonについて書こうと思いました。Pythonは10月くらいに始めたばかりでまだまだ初心者です。ちょっとずつやっていく中で「これよく見るな〜」と思った関数について書いていこうと思います。pythonのバージョンは3.8.8です。
#print()
print()はよく使う関数です。

```halloworld.py
print("Hallo World")
print(20)
```
画面に文字列や数値などを表示させたいときに使います。
#input()
これはキーボードからの入力を受け付ける関数です。

```name.py
name=input("名前を入力してください")
print(name)
```
「名前を入力してください」など入力して欲しい内容を指示する文も書くこともできます。
#str()とint()
```year.py
year=19
print("私の年齢は"+str(year)+"です。")
```
```count.py
count=input("何個ですか？")
print("個数は"+str(10+int(count))+"です。")
```
str()は数値などを文字列に変換します
int()はstr()の逆のことを行います
#len()
```odd.py
odd=[1,3,5,7,9,11]
print(str(len(odd)))
```
リストや文字列の要素数が取得することができます。
#終わりに
今回Pythonでよく見るものとして関数について少しですが書かせてもらいました。正直まだ自分も初心者なので全然わかっていないのですがこれから勉強していきたいと思います。少しでも参考になれば嬉しいです。ありがとうございました。
AWS Amplify Studioを触ってみる


「AWS Amplify Studio」という機能の発表がありましたので、Amplifyのキャッチアップ自体もまだまだにもかかわらずとりあえず触ってみました。

https://www.publickey1.jp/blog/21/awswebaws_amplify_studioaws_reinvent_2021.html

以前に作成したアプリがあったので、開いてみたところ、「Studioを起動する」というボタンが出現していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/dc9aada2-3b1c-5b62-7ca7-e4fdca45c6a8.png)

クリックすると、以下のような画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/9e293805-5238-c757-225c-6d302e4338ad.png)

試しにDataを触ってみます。
目玉はUI libraryなのでしょうが。。。

#### Data

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/13f967b3-6afe-107a-73f6-9b759bb08d71.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/39fd2634-dfee-1726-1ce6-6e1180316e23.png)

クリックするとこのような画面となりました。
右上の`Deploying...`というところをクリックすると、プロビジョニングの進行状況が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/2dec14a9-4dd2-6849-32ac-b244ee72a0ed.png)

こんな感じに定義したのち、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/4f085a91-1f5b-cf7d-3f40-d77b0b32c555.png)

`Add a relationship`というところおからリレーションを設定してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/de5a8f31-c026-12fc-1663-8415b0da39cd.png)

こんな風に設定出来るんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/4217478e-e543-8a40-b57e-570c86be81cf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/ee7bba93-94b9-28e4-5e1d-191852aacec5.png)

`Deploy`をクリックすると再度Deploying..となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199673/55bd2a7c-36c7-8057-5c3c-9a58e71128be.png)

Deployが終わると当然環境も作成されていました。
GUIツールが導入された事により、一段とAmplifyでの開発の敷居が下がったと思います。
日本語ドキュメントの充実等、まだまだな部分はありますが今後に期待です。
Python エラー "string index out of range"

##エラー
```string index out of range```

##原因
リストの範囲外のインデックスを指定した。

##例
```
l = [a,b,c]
print(l[3])

Traceback (most recent call last):
  File "./Main.py", line 2, in <module>
    print(l[3])
IndexError: list index out of range
```
30代会社員がVR技術者検定試験に合格した話

# はじめに
当初はG検定を書こうと思ったのですが、
他にも書く方がいそうなので、
VR技術者検定に合格した話を書きます！

私、普段は全然VRと関係ない仕事をしていて、
SIerで社内SEとして、インフラエンジニアをしています。
（Linuxサーバやネットワーク設計、プロビジョニング等）

# VR技術者検定って？

日本バーチャルリアリティ学会の主催する、VR技術に関する試験です。
セオリーコースでは、VR機器がVRを実現するために必要な体の認知に関する内容が中心で、
アプリケーションコースでは、VRコンテンツに関する内容になっています。

https://vrsj.org/events/seminar/

私は今回「セオリーコース」を受けましたので、セオリーコースの話です。

# まずは忘れずに申し込む（枠が埋まる前に）
とりあえず人気ということで、まず申し込んでしまいました。
2021/4/22に、申し込み開始の案内が来たので即申し込み！
「日本バーチャルリアリティ学会」からのメール案内を受けるように設定しておくと、
忘れずに申し込めるので良いと思います。

# 講義受講推奨
実は6/19にセオリーコースに関係する講義があったので講義受講が推奨だそうです。
でも私は（諸事情により）受けられなかったので、講義は受けないで試験に臨みました。

# どうやって勉強するか？
まず教科書を買ってください。
これです。

「バーチャルリアリティ学」
https://www.amazon.co.jp/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6-%E8%88%98-%E6%9A%B2/dp/4904490053/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3%E5%AD%A6&qid=1638522391&sr=8-1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93702/14b5d140-d338-a3cf-d06b-37476e21493a.png)

さて、試験は7/17。
実は6/19の講習が開催されるというお知らせを見て
「勉強しないとまずい…！」と
背中を押されてやっと勉強を始めましたｗ

だから勉強期間は1か月です。
仕事しながらなのでなかなか大変。

学生を終えて10年以上経つのでこの手の学術的な試験は久々でした。

# まず一通りザーッと教科書は読む
まず教科書を読みました。
試験範囲は教科書の全部ではなくて、半分くらいです。
試験範囲は、今年（2021/7/17）実施分については、1～4章が対象でした。
※アプリケーションコースは5～8章。
　実は、まさに12月に講習・試験が実施されるそうです。すっかり忘れていました…。

# 頭に定着させるには過去問
同時並行して過去問も解きました。
平日は教科書を読み、土日に過去問を解く形にしました。

わりと過去問から出題されます。
定着させるためにも、過去問を何度も解きなおしましょう。
私は3周くらいやりました。

過去問は公式サイトに公開されています。
https://vrsj.org/events/seminar/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93702/134c3d38-b74f-526b-0066-f8dcdba8f69d.png)

コースは注意してくださいね。
私、最初アプリケーションコースの問題を解いてしまっていて途中で気付きました。。。

なお、第8回以前は若干今と雰囲気が違うように見えたので、
私は第10～17回のセオリーコースを3周解くことにしました。

# ただただ解くのではなくて分からない問題の周辺知識を吸収する
過去問を暗記するように解くだけだと、新しい問題には対応できません。

過去問だけの暗記ではさすがに合格は難しいと思うので、
過去問にない問題も解けるように、
不明箇所は教科書に戻って理解して、理解を深めると良いと思います。

# そして当日試験に臨んだのだが…
実は初のリモート開催らしく、トラブルが発生しました。

試験開始が10:30なので11:00までにログインして試験を初めてくださいと通知が来ていたのに、
通信エラーで試験が開始できない…！

さすがにめちゃめちゃ焦りました。

どうしてーーー

これまでの１か月の勉強の苦労返してーーーー

と思いながら11:00を過ぎて沈没…。


と思ったのですが、どうやら、システムトラブルらしく、後日再試験となり、
無事合格できました。

合格した人の点数を見ていると、普通に100点の人もいて、
すごいなーと思います。
私は8割ちょっとだったと思います。

そこまで簡単じゃないと思うんですけどね。

# バーチャルリアリティ検討の認定証が来た
というわけで晴れて認証を頂けました。
次はアプリケーションコースを（来年かな）受けてみようと思いました。

# 何か効果あるの？
とりあえず履歴書には書けます。

VR業界外の人がVRで仕事をするには、少しでもVRに興味があることを示すために
この資格は有益かなと思ってます。

口頭で「私はVRに興味があります。毎日ニュースも見ています。」よりは、
「私はVRが好きです。VR機器を持っていてVRワールドを開発、モデリングもしていて、
VRでイベント開催をして、しかも技術者認定資格も持ってます」
の方がインパクトありますよね（笑）

# まとめ
もしVRやメタバースに興味がある方はぜひ受けてみて下さい！

それではまたーひら吉でした。
Python でけたたましくアラート音を鳴らしまくる

## 目的
バッチ処理が完了した際や，常駐型プログラムの異常検知時など，注意を引きたいときにアラート音を鳴らしまくりたい  

## 1回だけ音を鳴らす

```python
print('\a')
```

## 連続で音を鳴らす

```python
import sys
import time

for _ in range(10):
    sys.stdout.write('\a')
    sys.stdout.flush()
    time.sleep(0.15)
```

鳴らす回数，スリープ間隔はお好みで．

### なぜこんなややこしいのか

```python
print('\a' * 10)
```

ではいかんのか？
-> いかんのです．

バッファにまとめて標準出力される都合上，全ての音がまとめて一回だけ鳴ります．
面倒でも1回ずつ書き込み&出力すれば連続で音が鳴りまくります．
ZXing-android-embedded QRコードリーダーの、RegisterActivityResultとKotlin対応

スマホで簡易にQRコードリーダーを動かしたいとき、ZXingというのがあります。それを含むパッケージに、https://github.com/journeyapps/zxing-android-embedded というのがあります。この秋に、それがRegisterActivityResult対応し、Integratorとか機能をDeprecateしました。

それを取り込むのにひと手間あったので、ここへ記録。

1.zxing-android-embedded は、Javaコードしか提供していません。Kotlinほしい。Android StudioでそのSampleをコンバートすりゃいいのですが。ネットで調べた限り、まだ誰も載せていないので、以下にKotlinでのスケルトン載せておきます。これだけ。非常にSimple。

2.以前動いていたコードが、もう動かない、原因を調べたところ、ManifestでActivity属性で、android:noHistory="true"　という変更をしたのが邪魔していた。なんでか、理解していない。誰か教えてくれ。

```Kotlin
import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanOptions
...
val barcodeLauncher = registerForActivityResult(ScanContract()) { result ->
    if (result.contents != null) {
          読み取ったQRコードテキストの処理
     } else {
          失敗処理
　　 }
val options = ScanOptions()
options.setOrientationLocked(false)
barcodeLauncher.launch(options)
```

あとはbuild.gradleに、以下。    
```
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
```
また、Manifestに、以下を追加。
```
        <activity
            android:name="com.journeyapps.barcodescanner.CaptureActivity"
            android:screenOrientation="fullSensor"
            tools:replace="screenOrientation" />
```
情報技術科必見！！クラウドワークスで簡単にお金が稼げる！？

#はじめに
　皆さんおはこんばんにちは:wave:ところで皆さんは家から出ずにお金を稼いでみたいと思いませんか？？そんな皆さんに朗報です。クラウドワークスを利用すればパソコン１台でお金が稼げます。ここではクラウドワークスの説明から使い方までを紹介していきたいと思います。

##クラウドワークスとは？
　クラウドワークスとは[株式会社クラウドワークス](https://crowdworks.co.jp/)が運営しているクラウドソーシングサービスで、オンライン上で在宅ワーカーと仕事発注者のマッチング、業務の遂行、報酬の支払いまでを一括で行うサービスです。仕事の内容は以下の通りです。
> 
  - アプリケーションの開発
  - ホームページ作成・webデザイン
  - 動画・映像編集（Youtubeなど）
  - ネーミング・アイデア
   - ネーミング・キャッチコピー募集
  - ライディング・記事政策
  - 事務作業
   - 質問・アンケート
   - データ作成・入力
  - 翻訳・通訳
  - ３D－CG作成
 >

クラウドワークスの仕事はお金が稼げて勉強にもなるので情報技術科には一石二鳥です:relaxed:

##使い方
　はじめにクラウドワークスのサイト、もしくはスマートフォンのアプリから会員登録を行います。

　　　　　　　　　　　　　　　　![Screenshot_20190923-173524_Yahoo-146x300.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301737/6c9e97a0-7600-97da-9a86-3737be221a81.jpeg)

　ユーザー名やパスワードを入力し本登録を行います。登録が完了したら早速仕事を探していきます。【仕事を探す】を選び自分がやりたい仕事を選びます。初心者にはアンケートやExcelを使うデータ入力がおすすめです。

　　　　　　　　　　![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301737/3573dda6-dedb-ec56-f88d-e348cc3b4bf5.png)

　気になる仕事があれば応募をして仕事を行っていきます。大きな仕事になればなるほど報酬は上がりますがそれなりのスキルと時間が必要となってきます。一方、簡単なアンケートは５分から１０分ほどで終わり、報酬が１円～３０円ほどになっています。
　
　試しに一番簡単なアンケートの仕事をしてみました。

　　　　　　　　　　　　　　　![sumaho.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301737/67cb179a-c3f9-99c6-b685-694e74a90967.png)



　少し長めのアンケートで１５分ほどかかりました。報酬は１６円でしたが手数料として２０％がひかれるので１３円になりました。

　　　　　　　　　　　　　　　　![Screenshot_20211203-161512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301737/58350bff-1c41-03ee-9a09-ac17d47a7d96.png)


##まとめ
　クラウドワークスは報酬金から手数料がひかれるため、仕事１個当たりの単価が低いです。私みたいに家から出たくない人や対面での仕事が苦手な方には向いていますが、普通にアルバイトをしたほうが確実に儲かると思います。簡単にお金が稼げるなんてそんな虫のいい話はありません。**皆さんアルバイト頑張りましょう**；；
[vue]methods

###methodの使い方
（クリックなどの）イベントをすると発火/実行する
####基本的な書き方
```html
<p>{{ counter }}</p>
<!-- v-on:〇〇="メソッド名" -->
<button @click="counterMethod"> *1 </button>

<script>
data: {
  counter: 0,
},
methods: {
  // ↓ counterMethod () {　と省略して書ける
  counterMethod: function() {
    this.counter += 1
　 }
}
</script>

```

####methodsの追記
htmlに書くときはどちらの書き方でも大丈夫
引数が必要な場合は（）必須

```html
ok <button @click="counterMethod"> *1 </button>
ok <button @click="counterMethod（）"> *1 </button>
```
Goのsync.Mutex

研究で[quic-go](https://github.com/lucas-clemente/quic-go)を使っていて、`sync.Mutex`というのが出てきて使い方を調べたのでメモ。

## そもそもmutexとは

> In computer science, a lock or mutex (from mutual exclusion) is a synchronization primitive: a mechanism that enforces limits on access to a resource when there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy, and with a variety of possible methods there exists multiple unique implementations for different applications.

([Lock (computer science) - Wikipedia](https://en.wikipedia.org/wiki/Lock_(computer_science))より引用)

コンピュータサイエンスをかじったことがある人なら聞き覚えがあると思いますが、mutexはマルチスレッドプログラミングにおいてあるリソースへのアクセスを制限するロック機構のことです。並列処理においてあるリソースに一度に一つのスレッドしかアクセスできないようにします。

## sync.Mutexの使い方
ググったら[A Tour of Go](https://go-tour-jp.appspot.com/concurrency/9)が出てきて、これを見たらだいたい使い方がわかりました。

試しに以下のようなコードを書いて挙動を確認しました。

```main.go
package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	l := Lock{}

	go l.lockWhile(10)

	fmt.Println(time.Now().Clock())
	l.exclusiveHello()
	fmt.Println(time.Now().Clock())
}

type Lock struct {
	m sync.Mutex
}

func (l *Lock) exclusiveHello() {
	l.lock()
	fmt.Println("hello")
	l.unlock()
}

func (l *Lock) lock() {
	l.m.Lock()
}

func (l *Lock) unlock() {
	l.m.Unlock()
}

func (l *Lock) lockWhile(n int) {
	l.lock()
	time.Sleep(time.Second * time.Duration(n))
	l.unlock()
}
```

実行すると以下のようになります。

```bash
❯ go run main.go 
16 45 39
hello
16 45 49
```

`l.lockWhile(10)`は非同期に実行しているので`l.exclusiveHello()`がすぐに実行されそうな気もしますが、`sync.Mutex`によるロックをかけているので`l.lockWhile(10)`が終わるまで`l.exclusiveHello()`の中身が実行されていません。ちゃんと10秒経っていますね。

もちろん`l.lockWhile(3)`にすれば3秒ごに`hello`が出力されます。

```bash
❯ go run main.go
16 50 57
hello
16 51 0
```

## sync.Mutexの中身
`sync.Mutex`の中身を見るとこのように書かれています。

```mutex.go
// A Mutex is a mutual exclusion lock.
// The zero value for a Mutex is an unlocked mutex.
//
// A Mutex must not be copied after first use.
type Mutex struct {
	state int32
	sema  uint32
}
```

書いてある通り、値が0ならアンロック状態のmutex(=利用可能)みたいです。

実際に`Lock()`を見てみると、

```mutex.go
// Lock locks m.
// If the lock is already in use, the calling goroutine
// blocks until the mutex is available.
func (m *Mutex) Lock() {
	// Fast path: grab unlocked mutex.
	if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) {
		if race.Enabled {
			race.Acquire(unsafe.Pointer(m))
		}
		return
	}
	// Slow path (outlined so that the fast path can be inlined)
	m.lockSlow()
}
```

`if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked)`の部分でロック状態の確認とロックを行なっていますね。
もしロックされていたら最後の`m.lockSlow()`が呼び出されてロックが解放されるまで待つ処理に移るみたいです。こちらの処理はちょっと複雑になっていましたが、面白そうなので今度読んでみようと思います。
業務で良く使用するショートカット


# 業務で良く使用するショートカット
今年度は新卒の方2人と作業をすることが多くありました。
共同で作業しているとあまりショートカットを使用していない場面があったので、便利な機能を使って欲しいと思い自分がよく使う機能を纏めます。
自分が加工作業でよく使うテキストエディタのサクラエディタがメインです。VScode等は下にリンクを張っています。
特に自身がよく使うエディタの検索や移動だけでも覚えておくと作業が非常に楽になると思います。

## サクラエディタ
### 移動系
#### Ctrl + 矢印
単語ごとに移動します
#### Home or End
行頭、行末に移動します
#### Ctrl + Home or End
ファイルの先頭、末尾に移動します

### 検索系
#### 検索 Ctrl + F
検索ウィンドウが出ます
正規表現での検索もチェックボックスをチェックすることで可能です。
また、検索した後F3,Shift+F3で移動ができます
#### 置換 Ctrl + R
置換ウィンドウが出ます
#### グレップ検索 Ctrl + G
グレップ検索ウィンドウが出ます。
複数ファイルを対象に文字列検索ができます。

### その他
#### 保存 Ctrl + S
いつもの奴①
#### 元に戻す Ctrl + Z
いつもの奴②です。 Ctrl+YでCtrl+Zで戻した内容を戻すこともできます。
#### 保存 Ctrl + N
新規ウィンドウ
#### 矩形選択 Shift + F6
縦で削除したいときや追加したときに使用します。
#### マクロ記憶 Ctrl + Shift + M
Ctrl+Shift+Mを押した後、次のCtrl+Shift+Mを押すまでの動作を記憶します。
下記のマクロ実行と合わせて使用します。

#### マクロ実行 Ctrl + Shift + L 
上記で記憶した内容と実行します。
このgifは[1行飛ばして4文字削除する]を記憶して実行させています。
4文字等と聞くとできることの範囲が狭いように聞こえますが、行頭移動などと組み合わせるととても便利です。
法則性がある処理がしたいが、全体置換や矩形選択では解決できないときによく使用します。

![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289347/7ddf6c23-ed1e-a88e-dcc9-dd31e1146263.gif)


## +α(Windows)
### Alt+Tab
アクティブウィンドウの変更
### Win + 矢印キー
ウィンドウの移動 
マルチモニターで作業している場合特に使うようにしたいショートカットです。
### Ctrl + Shift + N
エクスプローラーウィンドウでフォルダ作成
F2でフォルダの名前変更も可能です。
### Win + Shift + S
画面キャプチャ
チャットでのやり取りでは、画像があるだけでわかりやすくなることも多いです。
### Win + V
Ctrl+Vで貼り付けができるのは有名ですがWin+Vでも貼り付けができます。
画面キャプチャ画像が何枚も必要な時などは便利です。
Win+Vではコピーした内容がクリップボードに記憶されており、違う内容でコピーした後も前回のコピーした内容を呼び出すことができます。

## 他のエディタで自分が参考にしたもの
Eclipse : https://qiita.com/arai-wa/items/c2eb7387b5bf37b4ace4
VScode : https://qiita.com/TakahiRoyte/items/cdab6fca64da386a690b
Excel  : https://qiita.com/aqril_1132/items/cfa3b1e147bd4a413943
rails グループ機能を多対多で実装

テックアカデミーの卒業課題でオリジナルアプリを製作中
実装済みもアプリの主な機能は下記の通り
・ユーザ登録機能
・ログイン機能
・ユーザプロフィール
・投稿機能
・フォロー、フォロワー
・投稿のお気に入り
・グループ機能

【グループ機能に取り入れたい機能】
・グループの作成、編集、消去
→グループ名
・グループへの参加
・参加グループでのチャット機能 (未実装)

【グループ機能の実装手順】
1 ER図の作成
![スクリーンショット 2021-12-03 16.46.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321592/c80e467b-74cd-6be8-05ce-64f9c22aae58.png)
2 グループの作成「ユーザ(users)とグループ(groups)を１対多で作成」
→投稿機能を参考に作成
3 グループへの参加「ユーザ(users)とグループ(groups)を多対多で作成」
→中間テーブルとして「group_users」を作成
・joinings(ユーザが参加しているグループ一覧)
・joineds(グループの参加ユーザ一覧)
の一覧を実装
4 参加グループでのチャット機能
→現在試行錯誤中

グループの作成自体は「一対多」と「多対多」の応用で割と簡単に実装できたが、参加グループでのチャット機能の実装に苦戦中。
macの再起動後、SourceTreeのgit操作でエラーが発生する

##　困ったこと
macを再起動した際、再起動前に成功していたSourceTreeのgit操作が失敗するようになります。
その際に以下のエラーメッセージが出力されます。

``` 
Please make sure you have the correct access rights
and the repository exists.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
```

OS：macOS Big Sur
SourceTree: 4.1.3
SSH鍵はgithubに登録済み
SourceTreeとgithubのアカウント連携も済
リモートリポジトリも登録済
ターミナル上でgitコマンドを使った接続は成功する

## 原因
SSH鍵にパスフレーズが設定されている場合に発生するようです。
詳しくは以下記事にて解説されております。原因特定の際に大変助かりました。
https://qiita.com/yuki153/items/0ad5cb02faf3ecdcf903

## 対処法
上記記事の中でも解説頂いておりますが、.ssh配下のconfigファイルに以下の1行を追加する事で解消しました。

```
UseKeychain yes
```

これによって、再起動後でもSourceTreeにて問題なく実行できるようになるはずです。

誤り等あればご指摘頂けますと幸いです。
ajaxでControllerに飛ばした処理がDELETEだけ動かない

#はじめに
　この前、ajaxを使用し、画面内でデータ更新を行う処理を作成しました。
　その際、新規(CREATE)と更新(UPDATE)の処理は動くのに削除(DELETE)の処理だけなかなか動かずに時間を取られてしまったので備忘録です。

#結論
　結論から先に言います。
　新規や更新処理の時にエラーチェックで使用していたRequestの判定を削除処理でも使いまわした結果、削除処理では使用していなかった引数のチェック処理が勝手に走っていたため、インスタンスエラーが起きていました。

　原因をいろいろ探しまわった時に、DELETE処理はajaxのPOSTでは飛ばないというような記述があり、データの飛ばし方に拘っていた結果、気づくのが遅れた初歩的なミスでした。

　ちなみに返ってきていたエラーは422エラーでした。
　動き自体は正しいのですが、Request処理が内部的に処理できなかったためこのエラーが返ってきていたのかなあと思います。

#コード

　新規・更新処理時に使っていたコードがこれです。

```javascript:hogehoge.js
// 新規・更新
$.ajax({
	url: "hogehoge/update",
	type: "POST",
	dataType: "json",
	data:{
	Id: document.getElementById('Id').value,
	Nm: document.getElementById('Nm').value,
	hoge: document.getElementById('hoge').value
	}
	}).done(function(result) {
	    // 成功時
        // 完了メッセージ表示
	    var message = '更新が完了しました。';
        console.log(message);

	}).fail(function() {
	    // 失敗時
        // エラーメッセージ表示
	    var message = 'エラーが発生しました。';
        console.log(message);
	});
```
```PHP:web.php
Route::post('hogehoge/update', [HogehogeController::class, 'updateHogehoge']);
```
```PHP:HogehogeController.php
public function updateHogehoge(HogehogeRequest $request) {

    DB::connection('db')->beginTransaction();
    try {
        $DATABASE= new DATABASE();
        $DATABASE->fill([
                'ID' => $request->ID,
                'NAME' => $request->NAME,
                'HOGEHOGE' => $request->HOGEHOGE,
            ]);
        $DATABASE->save();

        // コミット
        DB::connection('db')->commit();

        return true;

    } catch (Exception $ex) {
        // ロールバック
        DB::connection('db')->rollback();

        return false;
    }
}
```

　これらのコードは動きました。

---

　削除処理時に使っていたコードがこれです。

```javascript:hogehoge.js
// 削除
$.ajax({
	url: "hogehoge/delete",
	type: "POST",
	dataType: "json",
	data:{
	Id: document.getElementById('Id').value
	}
	}).done(function(result) {
	    // 成功時
        // 完了メッセージ表示
	    var message = '削除が完了しました。';
        console.log(message);

	}).fail(function() {
	    // 失敗時
        // エラーメッセージ表示
	    var message = 'エラーが発生しました。';
        console.log(message);
	});
```
```PHP:web.php
Route::post('hogehoge/delete', [HogehogeController::class, 'deleteHogehoge']);
```
```PHP:HogehogeController.php
public function deleteHogehoge(HogehogeRequest $request) {

    // レコード削除
    DATABASE::where('ID', '=', $request->Id)->delete();

    // コミット
    DB::connection('db')->commit();
}
```

　これらのコードが422エラーを返していた訳ですね。
　このコントローラーのプロシージャで受け取った際に、requestのエラーの判定をHogehogeRequestで行っていたのですが、削除の際、不要になって削っていたNmやHogehogeといった引数(?)の判定もHogehogeRequest内で行っていました。
~~　だって主キーだけで削除できるんだから他の渡しても意味ないじゃん……。~~

　とどのつまり、このHogehogeRequestを指定せずに普通のRequestを指定すれば良かったわけですね。

---

　直すとしたら……

> public function deleteHogehoge(**_HogehogeRequest_** $request) {

　ここを……

> public function deleteHogehoge(**_Request_** $request) {

　こんな感じ……？


#さいごに

　結局のところ、凡ミスには気を付けようねってことですね。
Pypi（pip）とcondaのPythonライブラリを両方同時にアップデートする方法

#前置き
condaでインストールされたライブラリをアップデートするためには`conda update ライブラリ名`で可能です。
そして、condaでインストールされたすべてのライブラリをアップデートするためには`conda update --all`で可能です。

しかし、これによりアップデートされるのはcondaでインストールされたライブラリのみであり、pipでインストールされたライブラリはこれではアップデートができません。

pipでインストールされたライブラリをアップデートするためには`pip install -U ライブラリ名`とする必要があります。しかしpipでインストールされたライブラリを一気にすべてアップデートする方法はありません。

一応、`pip-review`というpipのアップデートを一気に行う手法もありますが、これを使うとcondaでインストールされたライブラリもpipでアップデートされるために、大変なことになることが多いです。

そこで、pipでインストールされたライブラリと、condaでインストールされたライブラリをそれぞれ適切にアップデートするPythonコードを書きました。

#コード
```Python:py_lib_update.py
import re
import subprocess

#pip list -oでアップデートが必要なライブラリを確認
pip_list_comm = 'pip list -o'
print(f'\nRunning command: {pip_list_comm}\n')
pip_list_raw = subprocess.run(pip_list_comm, stdout=subprocess.PIPE, shell=True).stdout.decode('utf-8')
pip_list_libs = re.split('\r|\n', pip_list_raw)

#pip listすると「-------」以降にライブラリが羅列するので、そこの行数を確認
pip_list_start_lineno = [pip_list_lib.startswith('-') for pip_list_lib in pip_list_libs].index(True) + 1

#アップデートが必要なライブラリをlist化
pip_update_libs = set([re.split('\s+', lib)[0] for lib in pip_list_libs[pip_list_start_lineno:] if not lib.isspace() and lib])
#print(pip_update_libs)

#pipでアップデートが必要なライブラリがあったら
if len(pip_update_libs) > 0:
    #一つの文字列に
    pip_update_libs_str = ' '.join(pip_update_libs)

    #pip install -U ライブラリ名でアップデート
    pip_update_comm = f'pip install -U {pip_update_libs_str}'
    print(f'Running command: {pip_update_comm}\n')
    subprocess.run(pip_update_comm, shell=True)

#すぐ容量が肥大化するのでpipのキャッシュを削除
pip_cache_purge_comm = 'pip cache purge'
print(f'\nRunning command: {pip_cache_purge_comm}\n')
subprocess.run(pip_cache_purge_comm, shell=True)

#condaのライブラリをアップデート
conda_update_comm = 'conda update --all -y'
print(f'\nRunning command: {conda_update_comm}\n')
subprocess.run(conda_update_comm, shell=True)

#まじですぐに容量が肥大化するのでcondaのキャッシュを削除
conda_clean_comm = 'conda clean --all -y'
print(f'\nRunning command: {conda_clean_comm}\n')
subprocess.run(conda_clean_comm, shell=True)
```

実行するには

```
python py_lib_update.py
```
とするだけです。

#注意点
ライブラリをむやみに全て一気にアップデートすると、今まで動いていたコードが急に動かなくなることがあります。
自己責任でお願い致します。

一応WindowsとLinuxでの動作確認をしておりますが、それ以外については行っていません。

疑問点などございましたらコメントください。
サービスアカウントを借用で使う

GCPでサービスアカウントの権限を用いてgcloudコマンドやgsutilコマンドをローカルマシン等から実行する際、どうやっていますか？


# よくあるサービスアカウントの使い方
サービスアカウントキーを用いて認証するという方法がよく用いられています。

#### 手順1.作成済みサービスアカウントのキーを作成しダウンロード

```
gcloud iam service-accounts keys create key.json --iam-account=sa-hoge@PROJECT_ID.iam.gserviceaccount.com
```

#### 手順2.ローカルの実行環境でGOOGLE_APPLICATION_CREDENTIALS環境変数の設定(ダウンロードしたキーのパス指定)


```
# Linux
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/key.json"

# Windows
set GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/key.json"
```

#### 手順3.コマンドの実行 

```
gcloud hogehoge
```

## サービスアカウントキー取扱注意
一見簡単な方法ではありますが、サービスアカウントキーをダウンロードするというのはリスクを伴います。

ローカル端末にキーをダウンロードしますので、その管理が個人に依存することになります。
誤ってgitリポジトリにキーファイルを上げてしまったりなどすると、それを取得した第三者からリソースにアクセスされてしまうという事故が起こりえます。

公式ドキュメントでも、サービスアカウントに与える権限を最小限にすることや、gitへのコミットが行われないように設定するなどといった対応が言及されていますが、キーの流出を根本的に解消するものではありません。

# サービスアカウントの借用
借用とは、一時的に特定のサービスアカウントに成りすましてコマンドを実行することです。この方法を使うことで、上記の手順のようにGOOGLE_APPLICATION_CREDENTIALSを指定する必要がなく、そもそもサービスアカウントキーを作成すること自体が不要になります。


#### 手順1.ロールの設定
サービス エージェントにサービス アカウント トークン作成者のロール（`roles/iam.serviceAccountTokenCreator`）を付与します。
以下のコマンドで、gcloudコマンドを実行するユーザー( `my-email@email.com` )が、サービスアカウント(`sa-hoge@PROJECT_ID.iam.gserviceaccount.com` )のトークンを作成できるようになります。

```
gcloud iam service-accounts add-iam-policy-binding \
    sa-hoge@PROJECT_ID.iam.gserviceaccount.com \
    --member='user:my-email@email.com' \
    --role=roles/iam.serviceAccountTokenCreator
```

#### 手順2.コマンドの実行
コマンドに `--impersonate-service-account`を付けるだけでOKです。

```
gcloud hogehoge --impersonate-service-account=sa-hoge@PROJECT_ID.iam.gserviceaccount.com
```

# まとめ
鍵などの機密情報がうっかり漏れてしまった、というのはGCPに限らず耳にする話かと思います。
そういったことが起きないように検討する様々な方法も、「そもそも鍵を作らない」に勝ることはないでしょう。
「うっかり」や「万が一」を起こさないためにも、使ってみることをお勧めします。



# 参考
[クラウドサービスとして認証する | Cloud IAM のドキュメント | Google Cloud](https://cloud.google.com/docs/authentication/production)
[サービス アカウントの権限借用の管理 | Cloud IAM のドキュメント | Google Cloud](https://cloud.google.com/iam/docs/impersonating-service-accounts)
proxy環境下でboto3を使いたい

タイトル通りの覚書です。

```python
import boto3
from botocore.config import Config

#-- 1.proxy definitions
proxy_definitions = {
    'http': 'http://xxxx.com:xxxx',
    'https': 'https://xxxx.com:xxxx'
}

#-- 2.set config
my_config = Config(
    region_name='us-east-1',
    proxies=proxy_definitions
)

#-- 3.boto3 client
client = boto3.client('kinesis', config=my_config)
```

1でプロキシアドレス入力して，2で設定をして，clientを呼び出すときにconfigを引数として入力。
リージョン名もConfig内で指定可能。
自然とコンフォートゾーンを抜け出す仕組み作り


### はじめに
この記事は弥生 Advent Calendar 2021の[4日目](https://qiita.com/advent-calendar/2021/yayoi)の記事です。
弥生の開発組織としての取り組みや文化において、コンフォートゾーンからラーニングゾーンへ促す仕組みがいくつか取り入れているなと思ったので、それを記事にしてみました。

### 自己紹介
- はじめまして、弥生でプロジェクトマネージャーをしている飯田といいます。弥生に入社して5年目になります。
- 自分に甘々な性格ですが、あれこれ工夫して半年で12キロ痩せれたことが最近のトピックです。リモートワーク中心なので妻以外に気付かれないですが。。

### 弥生のプロジェクトマネージャーのお仕事
まずは簡単に弥生PMの代表的な仕事を紹介します。

- プロジェクト・プロダクトの目標達成にフォーカスしたマネジメントを行う
- マーケティング部門、カスタマーサービス部門とも調整したうえで、より実現性の高い（遅れない）ロードマップを策定し、その実現のためにあらゆる手段を講じる
- 開発本部組織改善の検討・策定を実行し、成果を出すこと
- 開発本部員エンゲージメントに対する取り組みで成果を出すこと
    
### 弥生の開発のいま
弥生の開発本部はいま大きな転換期を迎えています。私が所属するのは新サービスを開発する部署です。この部署はお客さまのために新たなサービスを世に送り出すことを目的に立ち上がった部署になります。2年前に数名から立ち上がり、今では50名を超える体制となりました。しかし、お客さまにより素晴らしい製品体験をしてもらうためには、組織としてはもちろん、個々のスキルを上げていくことも非常に重要な要素になります。

###  コンフォートゾーンとは
この言葉を知っていますでしょうか？ビジネス書などでもたまに見かけると思いますが、居心地のいい快適な環境を意味します。
たとえば、毎日決まった業務をこなす仕事、長い付き合いで楽な人間関係などそれほど刺激がないかわりにリスクを感じることがない場所で、それがコンフォートゾーンです。
ただし、これらの環境は成長するうえでは必ずしもいいとはいえません。ひとはある程度のストレスを感じる環境に置かれた方が高い能力を育み発揮することができると言われています。でも楽で居心地のいい場所にい続けたいのは本能ですよね。楽な道と大変な道があれば楽な道を選ぶのは当たり前だと思います。
### ラーニングゾーンとは
適度なストレスと高い学習効果が得られる環境のことで、人間が磨かれるのはまさにこの環境だと言われています。
適度なストレス環境に身を置くことは決して難しいことではないとも言われています。日常生活においてもわずかな視点の切り替えによって成長のチャンスを得ることが可能です。例えば気になるイベントを見つけたら迷わず参加ボタンを押す、これもコンフォートゾーンから抜け出す方法のひとつかと思います。
弥生でもよく業務中にITイベントに参加することも多いです。最近ではAWS関連のイベントに参加するメンバーが多いと思います（ちなみに参加結果のレポート提出などは不要です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182561/8ca0cf59-552f-1741-57eb-78944bb24f3b.png)


### 適度な負荷：学びを促す人員配置
弥生にはこのコンフォートゾーンを抜け出してラーニングゾーンへ進むための仕組みがいくつか組み込まれています。例えば人員配置です。
私個人の入社してからの配置異動を例にとります。

 - 1年目：情報システム部門で契約・請求関連のシステムを担当
 - 2年目：製品サービス部門に移籍し、弥生販売を担当
 - 3年目：弥生販売に加えてデスクトップアプリ共通機能を担当
 - 4年目：新サービス開発部門へ移籍、同部門の統括リーダーと共に組織戦略を策定し、アーキテクチャチームとインボイス制度対応チームを同時に立ち上げ。また、製品サービスと基幹システムをつなぐ認証認可サービスを担当
 - 5年目：前年から引き続き、認証認可サービスを担当　←いまここ

弥生では、慣れてきたら新しいことをどんどんやってもらうという文化があります。
当然、本人適性や組織観点も考慮しますが、けっこう希望したプロジェクトに携わることができます。ただ、上記のように1年でそのプロジェクトに慣れて成果を出すのは普通に考えるとまぁまぁ大変かなと思います。
しかし、弥生のプロジェクトは前任者の引継ぎ・伴走がしっかりしているし、過去の経緯や目的はチケットに記載されているので、これまでの背景や段取りを知ることにもそれほど苦労をしません。
弥生はチケットでタスク管理を実施しており、基本、全てのプロジェクト作業はチケットを見ればわかるようになっています。ときおり、数年前のチケットをみて、当時の成果物や経緯を確認することがありますが、知りたかったことについて、よくわからないで終わるということは基本ありません。

### DevAX：学びの機会
また、弥生はエンジニアにも学習を奨励していますし、そういった機会を積極的に設けるような取り組みがあります
直近ではDevAXというAWSハンズオンワークショップを実施しました。全8回のワークショップを毎週水曜日に終日開催する、一過性で終わらないものです。しかも100名規模での開催というAWS内でも類のない規模で開催されました。詳細は弥生の勉強会イベント「もくテク」で紹介する予定なのでぜひご参加ください。

https://mokuteku.connpass.com/event/230189/

### AWSアカウントの無償提供：学びのハードルを下げる
また、最近ではAWSアカウントの無償貸し出しも開始しました。自分が自由に使える環境で利用料を気にせず、学習したいという欲求はエンジニアの皆さんはだれしも抱えているかと思います。当然、マイニングしないでね、みたいなざっくりルールはありますが、基本は個人が自由に業務に関係なくAWSを触れる環境を提供しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182561/03e07c89-324b-74d1-1590-6fd46dfd21be.png)

### 大事なのはスモールステップ
大切なのは最初のステップを小さく、そして継続して学習できる仕組み作りかと思います。
開発本部の組織改善、エンゲージメントを高めるためにいくつもの取り組みをどんどん実施し、最終的にお客さまにいいサービスを届けることにつなげていきたいと思います。
興味を持った方はよかったら下記を見てみてください。

### 弥生では一緒に働く仲間を募集しています。
https://herp.careers/v1/yayoi/_tikn9A1AYth
コンテナの「生成・起動」と「停止」と「破棄」


# [概要]
コンテナの「生成/起動/停止/破棄」の、
よく使うコマンドを記載する
※使うコマンドが増えれば、更新しきます

# [作業]
Dockerは起動している前提


##[コンテナの生成/起動]
docker-composeを使用する前提ですが、
docker-compose.ymlが配置されている層で、以下のコマンドを実行してコンテナを起動

```ruby:terminal
#コンテナを生成・起動する
docker-compose up

#コンテナを生成・起動する (バックグラウンド)
docker-compose up -d
```
コンテナの生成と起動を、実行してくれている


##[コンテナの停止]

通常通りに、起動したコンテナを以下のコマンドで停止しましょう
**「ctrl + c」で抜ける(停止する)ことが可能**です

もし、上記が不可能！という場合や、バックグラウンドで起動している場合、以下を実行する

1, 新しくターミナルを立ち上げる
2, 以下のコマンドを実行する

```ruby:terminal
#実行しているコンテナ一覧を表示するコマンド
docker ps
```
3, 起動されているコンテナIDを確認する

```ruby:terminal
CONTAINER ID   IMAGE               COMMAND                  CREATED       STATUS         PORTS                    NAMES
60567ff2049d   localserver_flask   "flask run --host 0.…"   6 hours ago   Up 2 seconds   0.0.0.0:8080->8080/tcp   localserver_flask_1
```
4, コンテナIDが確認できたので以下を実行する

```ruby:terminal
docker container stop CONTAINER ID
```

5, 再度、上記２を実行して起動中のコンテナを確認する

```ruby:terminal
ONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
※表示されていないので、起動していないことが解る！！！！

**[補足]**
6, ちなみに以下のオプションをつけることで。コンテナが「停止中/起動中」も含めて、全て確認することが確認できる。
　※ここで重要なのは、上記4で実行したのはコンテナを停止しただけで、破棄はされていないこと。

```ruby:terminal
docker ps -a
```

```ruby:terminal
CONTAINER ID   IMAGE               COMMAND                  CREATED        STATUS                     PORTS                    NAMES
60567ff2049d   localserver_flask   "flask run --host 0.…"   6 hours ago    Exited (0) 5 minutes ago                            localserver_flask_1
5841d726350e   server_flask        "flask run --host 0.…"   2 months ago   Exited (255) 7 hours ago   0.0.0.0:8080->8080/tcp   server_flask_1
```


##[コンテナの破棄]
###コンテナIDを指定して破棄する場合
以下のコマンドを実行する

```ruby:terminal
docker container rm CONTAINER ID
```

###コンテナ（停止中）を全て破棄する場合

```ruby:terminal
docker container prune
```



### 参考
https://neos21.net/blog/2019/02/20-01.html
【新人必見】ココでストレス感じるよエンジニア😭【睡眠指導あり】

ＩＴ業にはストレスがいっぱいです。

立場によっても違いますし、
各開発工程で感じる不安も全く違います。

じぶんなんて…って落ち込む前に
こちらをみて『こんな不安を感じてるんだ…』って
客観視してみましょｂ
https://kokoro.mhlw.go.jp/brochure/supporter/files/stresstaisyo22-it.pdf





判決とかもあるので
非常に役立ちます。
systemd環境でMySQL8のrootパスワードを初期化する方法

# Amazon Linux2で、MySQL8を運用していて軽くハマったので備忘録
rootのパスワードが分からなくなってリセットしようとググると、ほとんどの記事が「mysqld_safeで起動しなおして云々」というモノなのだが、systemdを採用しているディストリビューションだと「mysqld_safe」がインストールされないらしい。
そこで、もうちょっと調べて見つけた解決方法。

```bash
[root@hostname ~]# systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
[root@hostname ~]# systemctl restart mysqld
[root@hostname ~]# mysql -u root
```

これでrootでログイン出来るので、rootのパスワードを削除します。

```bash
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> UPDATE user SET authentication_string=null WHERE User='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql>
```

次に、パスワードの再設定を行いますが、先程の「--skip-grant-tables」が設定されたままだと、パスワードの再設定が許可されていません。
なので、環境変数を削除した後にmysqldを再起動します。

```bash
mysql> exit
Bye
[root@hostname ~]# systemctl unset-environment MYSQLD_OPTS
[root@hostname ~]# systemctl restart mysqld
[root@hostname ~]#
```

再起動完了後に、再びmysqldに接続しパスワードを再設定します。

```bash
[root@hostname ~]# mysql -u root
mysql> ALTER USER 'root'@'localhost' identified BY '設定するパスワード';
Query OK, 0 rows affected (0.00 sec)

mysql>
```

パスワード変更コマンドを実行した時に、

> Your password does not satisfy the current policy requirements

とエラーが出た場合は、パスワードポリシーが厳しいので怒られています。
おそらく「最短8文字、ローマ字小文字、ローマ字大文字、数字、記号、すべて混在」というポリシーになっているかと思います（頑張ってください）。

これで、systemd環境のMySQL8でルートのパスワード変更が出来ると思います。
Xcode13 × SwiftUIにおけるNCMB SDKの初期化処理

Xcode13（iOS 15）になって、SwiftUI周りの挙動が変わっています。特に変わったのがアプリの初期化のタイミングで、WindowGroupのonChangeが呼ばれるのが遅くなってしまいました。

元々NCMBの初期化をWindowGroupのonChangeにて行っていたのですが、これだとアプリ起動時に認証やデータ取得を行っていると、初期化前に実行されるようになってしまいます。

そこで初期化のタイミングをinitに移すのをお勧めします。

## NCMB Swift SDKのインストール

Xcode13になって、SDKのインストール法も変わっています。

Xcodeにて次の操作を行います。

プロジェクト選択 → PROJECTでプロジェクトを選択 → Package Dependencies で `+` を押す

![ScreenShot__2021-12-03_15_01_29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/6566a1fe-688b-ae24-dd4f-b2f5840f6eb1.jpeg)


これで依存パッケージをインストールするダイアログが出るので `https://github.com/NIFCLOUD-mbaas/ncmb_swift.git` を入力してインストールします。

![ScreenShot_ 2021-12-03 15.01.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/987ac72a-1578-6084-c862-c2fe8cb589f9.png)


## SDKのインポート

(アプリ名)App.swiftファイルにてSDKをインポートします。

```swift
import NCMB
```

## 初期化する

Appではinitが初期化のタイミングで呼ばれるので、ここでNCMBの初期化処理を行います。関数名は init です。

```swift
@main
struct NCMBDemoApp: App {
    init() {
        // APIキーの設定とSDK初期化
        NCMB.initialize(applicationKey: "YOUR_APPLICATION_KEY", clientKey: "YOUR_CLIENT_KEY")
    }
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```

## まとめ

NCMBが初期化されていない状態で実行すると `emptyApplicationKey` というエラーメッセージが出ますので注意してください。もし、そのエラーメッセージが出た場合には、初期化タイミングの問題かも知れませんので、この記事を参考に修正してみてください。

[イントロダクション (Swift) : クイックスタート(Swift UI App版) | ニフクラ mobile backend](https://mbaas.nifcloud.com/doc/current/tutorial/quickstart_swift_ui.html)
composer require エラーが出る


composer dump-autoload



comoserupdate時

```

  [ErrorException]                                              
  The use statement with non-compound name 'Log' has no effect  

```

って出る。

app/Http/helper.php　で use Log;

をやっている場合エラーになる。
オリジナル関数を作っている場合、

よってこの行をコメントアウトしよう。