OmniAICreator/Qiita-1.07M huggingface dataset:
real-time-Personal-estimation（学習編）

##前回まで 
前回の記事
https://qiita.com/asmg07/items/e3be94a3e0f0195c383b
前回はシステム導入について書いたので次は学習について書いていきます.
## プログラムのゴール
そういえば,プログラムのゴールを書いてないし決めてなかったのでとりあえず
ゴールを決めます.一応,今は学生で昔授業で作ったプログラムを改良したいなと思って
書いています.一応それが開発の理由です.
とりあえず,ゴールは乃木坂が好きなので,乃木坂個人判別分類器を作れたりしたらいいなｗ
余談でした.
## 学習の方法
余談は置いといてとりあえずは,使い方を覚えたいのでいろいろな人がやっているマスクを
しているか,していないかの画像を使ってやっていこうかなと思います.と言おうと思ったけどせっかくなので別のモデルをw

車のモデルを使ってやってみたいと思います.

せっかくなので自分でモデルを作ります.
乃木坂ちゃんたちを見たいよｗ
手順1 アノテーション
(1)画像作成
使うソフトは以下のものURLを載せておきます.
https://github.com/Microsoft/VoTT/releases
以下のデータセットを作っていきます.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/f4026617-f921-675b-86ed-1eef8b2219f9.png)
こんな感じで作っています.
(2)Yolo用のデータセットに変更
まぁいろいろやるんですけど参考サイトが参考になります.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/24665c74-b959-fe39-254a-c8503ffddc5e.png)
最後は結局こんな感じになります.
以下のサイトを参考にしています.
https://konchangakita.hatenablog.com/entry/2020/08/24/220000
(3)Yoloでの学習

学習については,今現在ローカル環境でやるか,Googleのやつを使うか検討中です.

いろいろ考えたあげく,とりあえずローカル環境でやってみようと思ってやってみようということにしました.
とりあえず1カテゴリでのデータセットでモデルを構築しました.なお,とりあえずでやってみたのでコマンドとかいろいろ間違ってるかもしれません.

```data.yaml
train: test/train/images
val: test/valid/images
nc: 1
names: ['yoda']
```
実行する為に使用したコマンド
```python train.py --data data.yaml --cfg yolov5s.yaml
```
学習している過程
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/16dee047-a424-f06e-496a-58f6d7f6dcec.png)
## 結果
学習後の結果はこのように出ました.
![results.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/07d677c8-1648-ceca-b204-32d08c90b843.png)
これってうまく学習できているのかな？
よくわかりません.多分できていないような気がする.
まぁモデルを作ったから試しに実行してみました.
```python detect.py --source ./inference/images/ --weights best.pt --conf 0.4
```
結果がこちら
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/a4cad3c3-34c5-ba8f-c801-455833f4b8bb.jpeg)
はい.失敗です.
まぁ学習データ10枚の1カテゴリでやったからそんなうまくいかないよね.
次はうまくいくように調整してやってみます.
## 最後に
今回はモデルの作り方から実行までやってみました.
次はモデルをうまく作るところに焦点を当ててやってみます.
現在日時を取得して、クリップボードにコピーするブックマークレット

現在日時を取得してクリップボードにコピーするブックマークレットです。

#目的

IMEを設定して「いま」や「きょう」などと入力することで現在の時刻や日付を取得する方法もあるのですが、ブラウザでメモを取るさいに整形されたフォーマットで現在日時を入力したかったのと、WindowsやMacなど環境が変わっても利用できるよう、ブックマークレットにしてみました。


```javascript:
javascript:{
	let copyListener = event => {
		document.removeEventListener("copy", copyListener, true);
		event.preventDefault();
		let clipboardData = event.clipboardData;
		clipboardData.clearData();
		const date = new Date();
		const Y = date.getFullYear();
		const M = ("00" + (date.getMonth()+1)).slice(-2);
		const D = ("00" + date.getDate()).slice(-2);
		const h = ("00" + date.getHours()).slice(-2);
		const m = ("00" + date.getMinutes()).slice(-2);
		const s = ("00" + date.getSeconds()).slice(-2);
		let txtNow = Y + "\/" + M + "\/" + D + " " + h + ":" + m + ":" + s;
		clipboardData.setData("text/plain", txtNow);
		console.log('現在時刻:' + txtNow);
	};
	document.addEventListener("copy", copyListener, true);
	document.execCommand("copy");
}
```
よく見かけるcreateElementを使うやり方ではなく、直接copyイベントを呼び出して、任意のテキストをクリップボードにコピーしているのが面白いかも。

#動作確認環境

Windows 10, Google Chrome バージョン: 85.0.4183.121 64ビット
OSX, Google Chrome バージョン: 85.0.4183.121 64ビット

#参考：
[Bookmarkletを作ろう(準備編）](https://qiita.com/kanaxx/items/63debe502aacd73c3cb8)
[javascriptで日付フォーマッタ](https://qiita.com/egnr-in-6matroom/items/37e65bb642d2e158804c)
[Create Bookmarklet (browser bookmark that executes Javsacript) to copy a given text to Clipboard
](https://gist.github.com/stefanmaric/2abf96c740191cda3bc7a8b0fc905a7d#gistcomment-2024326)
【Git】（定義）Git 作業 commitの名前の付け方

# Git作業について
色々現場の決め方などをどのように採用しているのかいくつか紹介していきましょう

### シンプル

ブランチ作業されている方に現場での作業の際にみんなに何の作業をしたのか変更をしたのかというのをcommit履歴を残すといいですね。

シンプルな方法は以下の通りになります

commitの際に

コミットする際は、最初は、「【画面名or機能名】画面名or機能名新規作成」
次回以降は

「【画面名もしくは機能名】変更内容の概要・・・（ここは何をしたのかを書いてもらえたら）」
という感じにしてもらってもいいですか？

例
「【新規登録画面】新規作成」
「【お客様画面】機能拡張」
「【お客様画面】バグ：表示が出ない問題の対応」

### 職場のチケット制を採用している場合

現場によっては、チケットというタスク管理ではよく使われているのですが、新しいチケットを発行した際にこちらを採用している場合があります。

チケット管理で対応している現場の主な方法は以下の通りになります

commitの際に

コミットする際は、最初は、「【画面名or機能名】チケットタイトル#チケット番号」
次回以降は

「【画面名もしくは機能名】変更内容の概要・・・（ここは何をしたのかを書いてもらえたら）#チケット番号」
という感じにしてもらってもいいですか？

例
「【新規登録画面】新規作成#チケット番号」
「【お客様画面】チケットタイトル#08011111」
「【お客様画面】バグ：表示が出ない問題の対応#01891141」

現場によっては書き方が違う場合があります。
プロジェクトリーダーの方やプロジェクトの方と相談してしっかりと決めていきましょう。

新人の方は慣れていない場合もあれば、ベテランの方でも前の現場に入ってた名残で間違える場合がありますが、コミュニケーションを取り合って、チームのまとまりを意識できるように現場を盛り上げられていけるといいですね。

---

## 関連記事

---

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１ WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中!!)

緩募


### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
https://twitter.com/sunstripe2011

#### プログラミングラボ
https://twitter.com/PLab2020

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

#### トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

### キャリア教育事業

#### 青空プログラミング
[![青空プログラミング100px.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/603d53ab-828b-645e-a415-1b6f158d7356.png)](https://actcoin.jp/project/detail.php?id=600)

[![ダウンロード (9).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/9bde9318-28c2-ce74-d4c5-326168061bcc.jpeg)](https://www.youtube.com/hashtag/%E9%9D%92%E7%A9%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

#### 広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集

## ネリム
https://nerim.co.jp/
配信事業などを映像コンテンツなどの制作しております

## ビヨンドXプロジェクト

[ビヨンドXプロジェクト全体会議](https://www.youtube.com/playlist?list=PLaR6-YWiGWkYhEHWnt8f1z-JC0g3nwwC9)
【Go】関数の書き方とか呼び出し方とか

# 内容
Go言語における関数の色々を忘れないように書いておきます。

## 関数の定義の仕方
```
func 関数名() {
// まとめたい処理を書く
}
```

## 関数の呼び出し方
```
関数名()
```

## 関数に値を渡す
```
関数名(値)
```

## 引数を受け取って使う
例

```
funk main() {
// catを引数として変数animalに渡している
  ask("cat")
}

funk ask(animal string) {
  fmt.Printf("%s/n", animal)
}
```
git lfs を使用していてファイルが不完全状態で復元される場合

git lfs を使用していて checkout のコマンドでFloder内にある削除したファイルが復元しない場合
下記のコマンドを試す

```
git lfs checkout Floder
```

ファイルがlfsで管理されているかを確認する場合は下記のコマンドで確認

```
git lfs ls-files
```
個人的プロキシ下Linuxの環境構築でつまづいたメモ

# プロキシ下でのインストール
プロキシを通す必要がある環境で何かインストールした時にエラーが出た場合、大抵プロキシに関係します。

###原因1.linux自体のproxy設定 
/etc/profileにhttp://<proxy>:<port>/をhttp_proxy,HTTP_PROXY,https_proxy,HTTPS_PROXY書く。
これは最初に設定してあることが多いので、あまり原因とはならない。

###原因２.sudo使用時は環境変数が引き継がれない
sudo install みたいな時は、 sudo -E install とすると環境変数を引き継ぐのでプロキシが通る。

###原因3. yum,wgetなどのproxy設定
/etc/yum.confにproxy=http://(proxy):(port)をかく
ReactNative for WebのTextInputでアウトラインを消す方法

# はじめに
ReactNative for WebのTextInputにてフォーカスした際に出てくる線(アウトライン)を削除したい。


![81998707-a6f61180-966c-11ea-9fd4-e7c02792c50c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18721/a40afe9a-2136-914d-4d5c-ad8e7ed7d45b.png)

## 解決策
`outlineWidth: 0` を指定すれば解決するがアプリだと落ちてしまうので以下の指定をすると良い

```
<TextInput
  style={{
    width: '100%',
    ...Platform.select({
      web: {
        outlineWidth: 0
      }
    })
  }}
/>
```
cusignal で convolution2d のメモ

## 背景

* 画像処理で大きめ画像(e.g. 16K)で, float32 で convolution したい(機械学習でいう Conv2D 相当) 
* 適用したい kernel もそこそこ大きめ 128x128 ~ 256x256 で, 数も 200 パターンくらいある
* scipy convolve だと, `method="direct"`(ナイーブな実装) だと途方もなく時間かかる(1 convolve 処理が 10 分経ってもおわらない)
  * fft だと CPU 1 コアで 3~4 秒くらい(scipy convolve はシングルコア実行)だが, 近似誤差が気になる. 
  * マルチスレッド化だとメモリも激しく使う. 

GPU(CUDA) で高速 convolution できる cusignal をお知らせいただきました. 

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">If you&#39;re performance limited with scipy.signal.convolve and have a GPU available, I encourage you to try cusignal.convolve - a GPU implementation of scipy.signal. <a href="https://t.co/YlBueOhD0v">https://t.co/YlBueOhD0v</a></p>&mdash; Adam Thompson (@adamlikesai) <a href="https://twitter.com/adamlikesai/status/1308049880531767297?ref_src=twsrc%5Etfw">September 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

ありがとうございます.

## cusignal Convolution 実装

2D の場合は fft はなしで direct(brute force)になります.

https://github.com/rapidsai/cusignal/blob/branch-0.16/cpp/src/convolution/_convolution.cu


## インストール

Linux だとたぶん手順どおりにすればインストールできます.

Windows 環境だと, こちらで試した限りでは conda 関連で cuda バージョン違いとかよくわからぬエラー出ました. :cry:


## performance

2080 Ti + 150W powerlimit

16K x 16K, 129x129 kernel で, 1 conv 処理あたり 8.5 秒でした. :tada:

GPU のメモリ消費は 5GB くらいでしたので, RTX 2070 のような 8GB mem GPU でもうまくいくと思われます.

## TODO

* [ ] CPU + C++ での convolution(float32) と比較する(XNNPACK とか, Pytorch/TensorFlow の Conv2D を使うとよさげか)
* [ ] CPU FFT convolve との誤差を調べる.
Apple Store ConnectにモジュールUpload時に出たエラーと解決法

#モジュールアップロード時に下記のエラーが出てUploadできなかった
##エラー番号
ITEMS-90685
ITEMS-90205
ITEMS-90206


##原因
下記のような感じでembedded frameworkを実装していたことが原因
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542614/dbc47d84-b63b-7196-f51a-66cfa8de98b8.png)


モジュールアップロード時に下記画像のようにframeworkのなかにframeworkがコピーされているせいでindentiferが被った
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542614/10b08705-e434-be44-bf4a-d2a1f534cbdb.png)



##解決法
[参考にさせていただいた記事](https://qiita.com/tomohisaota/items/6d1f0a2aea9d20ef2acb)
Build前に重複してるframeworkを消す
(Utilityのみ他のframeworkをimportしてないので対応しなくていい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542614/4a44109a-0107-f836-2cad-f31e1ed508cb.png)

```code
 cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"
 if [[ -d "Frameworks" ]]; then 
     rm -fr Frameworks
 fi
```

Upload時のモジュール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542614/ea1b0d05-9706-8640-34fc-d7715f2b189c.png)


Upload成功した！



##誤った解決法
上記の回答に１回でたどり着ければよかったのだが、断片的に調べた情報から誤った解決法をしたため、審査でクラッシュしてリジェクトされた

###frameworkのEmbedをDo Not ~にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542614/6e2e4e44-2b01-de81-3afd-73c26397791c.png)

###UploadはできたがメールでITMS-9056と帰ってくる

Build SettingのEnableBitcodeをNoにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542614/356bcb85-f5f8-c1d8-60c1-7d410a26da8a.png)

この対応で審査まで出せてしまうがクラッシュする。ローカル環境で再現しなかったのはおそらくキャッシュの問題で後にbranch変更したら再現した。
統計検定2級のアウトプットをしておきます。(文系卒向け)

先日統計検定2級を受験して、まんまと合格したので、アウトプットしておきます。

試験前のスペックをお話ししておくと、
・文系大学卒(大東亜帝国レベル)
・数Aの順列あたりで数学から目を逸らした人間
・微分積分やネイピア数シグマ関数などはもちろん初めまして

です。

学習期間は8月〜9月いっぱいの2ヶ月ほどです。
平日は2時間ほど、休日は4〜5時間ほど勉強していました。

参考図書は

【完全独習 統計学入門】
https://www.amazon.co.jp/dp/4478820090

【過去問】
https://www.amazon.co.jp/dp/4788925524

上記2冊です。

マセマも購入しましたが、読み進めるために別途学習が必要になる感じがしたので手をつけていません。



他には、webサイトやYouTubeから情報収集していました。

【統計WEB】
https://bellcurve.jp/statistics/course/

【hepokiki さん】
https://www.youtube.com/channel/UC9tSwKb74rWDHMCLT-AR-6Q

【Yuya.K_ASN さん】
https://www.youtube.com/channel/UCMQAtnp07Genb7egZNrmrLg

【探究学舎 さん】
https://www.youtube.com/channel/UCEK-5vX5I8rf1Bfcn_QCL4w

これらのサイト・チャンネルにはとてもお世話になりました。
ただ、YouTubeは集中力が散りますので、必要な時に必要な動画を見るだけにしましょう。
(私の場合、気がついた頃には千代の富士の引退会見を見に行っていました。https://www.youtube.com/watch?v=dfub-L9N84k)

自己管理能力に自信のない方は、書籍等で学習を進めるのが効率的かと思います。


学習フローとしてはこうです。

【1ヶ月目】
1週目：完全独習を一通り読む。
2週目：統計WEBを読む。
3〜4週目：もう一回統計WEBを読んで、練習問題を手を動かして解く。

【2ヶ月目】
1週目：過去問を一周する。
2週目：過去問2週目
3週目：過去問3週目
⬆︎いずれも、2018年11月の試験分は飛ばしておいて、最後の確認用に取っておきました。
4週目：残った回も解く&苦手な部分の克服

苦手分野は必ず克服しましょう。
私の場合は
スプレッドシートに大問と問題の種類を記入　→　ミスった部分のセルを色付けしておく →　2週目以降で解けた部分は色を取り除く
って感じで管理してました。
あとは、解答番号で何が1番確率が高いかを算出して、わからない時はこの番号を選ぼう、とか。コレは気休めですね。


こんな感じで対策をして、結果としては68点でなんとかパスできました。


私のような完全初学者の場合は2〜3ヶ月の学習が必要です。
理系の学生の方や、受験勉強で数学に触れていた方はもう少し早く合格ラインに届くと思いますよ。

これから受ける人は参考にしてみてください〜。
PHP開発環境を理解しながら構築！②

#はじめに
[前回](https://qiita.com/kyo_suke/items/25e1dc66d11d34c52267)はVSCodeとXAMPPをインストールできたので、今回からは実際にローカル環境で開発できる状態にしていきたいと思います。
まずはWebサーバの起動を忘れないようにまとめていきます
###やること
　・Webサーバの起動
　・起動できているか確認
###環境
　・Windows10 64bit
　・XAMPP v3.2.4
　・Apache v2.4.46
　・PHP v7.4.10
#XAMPPでのローカル開発環境構築
##①Webサーバの起動
###Webサーバとは?
　Webサーバとは、ユーザーが操作するWebブラウザ(Internet ExplorerやGoogle Chrome・Safari等)などのクライアントからの要求に応えて、Webページを構成するデータをクライアントに返すソフトウェアです。
####主なWebサーバ
　・Apache(アパッチ)
　・Nginx(エンジンエックス)
　・IIS(アイアイエス)

　が代表的。日本ではApacheが人気で、XAMPPでもApacheが使用されています。
###データベース管理システム(DBMS)とは？
　DBMSとはデータベースの操作を行う為のシステム。データベースから目的のデータを取り出し・追加・編集・削除したり、様々な処理を加えたりできます。
　そしていま最も利用されているDBMSはリレーショナルデータベース(RDBMS)で、テーブルという概念でデータの集合を格納し、各テーブルをリレーションによって関係付けることができる。MySQLやMariaDBはRDBMSです。
####MariaDB
　MariaDBはMySQLから派生したもので、使いやすさやパフォーマンスにおいてMySQLよりも優れていて今後もMariaDBが主流となっていくと思われます。XAMPPで使用されているのもMariaDB。(表記はMySQLとなっていて、本記事でもMySQLとして扱う)
###XAMPPでApache起動
　では実際に前回インストールしたXAMPPでApacheを起動していきます。
その前にインストールされているPHP・Apacheのバージョンを確認します。
　XAMPPを起動して右側の[Shell]を起動しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666516/6faeb09d-ca04-5775-73de-bd171c3a880e.png)
シェルが起動したら次のコマンドを打つと…

```markdown
●Apacheバージョン確認
　# httpd -v　
●PHPバージョン確認
　# php -v
```
するとそれぞれののバージョンが確認できます。

###Apache起動
それではApacheを起動していきます。
ApacheのActionにある[Start]を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666516/de07c46c-80dd-ab6c-7185-44d03512281c.png)
PID(s)、Port(s)の欄に数字が表示され、テキストエリアにもApacheが起動したことに関するメッセージが表示されていれば正常にApacheが動作しています。

いまいち実感がわかないと思うので実際にWebブラウザ上で確認してみましょう。
Webブラウザを立ち上げて下記のアドレスにアクセスしてみましょう。

```
http://localhost/
```
ダッシュボードが表示されれば正常に起動しています！お疲れ様でした！
XAMPPのバージョンがここでも確認できますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666516/5efcee96-9960-cd6f-2a1f-dbb2c1e1515f.png)

もしここでアクセスが拒否されてしまっていたらApacheがうまく起動できていません。
手順や設定等を見直して再度起動してみてください…。

####Apacheの停止
　XAMPPを開いてApacheのActionにある[Stop]を押すとApacheが停止します。
#まとめ
　今回はWebサーバの起動まで行いました。MySQLの起動は後日追記していこうと思います。
次回は実際にVScode上でPHPを書いてWebサーバで表示させるところまでまとめていきたいと思います。
　ここまでお読みいただきありがとうございました。

次記事：[PHP開発環境を理解しながら構築！③](https://qiita.com/kyo_suke/items/c4c623f7b60964729019)
Google ColabのGoogle Driveマウント認証コードが不要のケース

# 内容
Google ColabでGoogle Driveをマウントする時，認証コードいちいち入力するの面倒なんだが！
→Driveから新規作成すると不要になるよ！

# 認証コードが必要かどうか

[公式のチュートリアル](https://colab.research.google.com/notebooks/io.ipynb?hl=ja#scrollTo=u22w3BFiOveA)に以下のような記載があります。


> 注: ファイル ブラウザで [ドライブをマウント] ボタンを使用する場合、現在のユーザーのみに編集されたノートブックについては認証コードは必要ありません。

ローカルからドライブにアップロードしたファイル等は，おそらく「現在のユーザーのみに編集されたノートブック」かどうか判定できないので，認証コードが必要になる仕様なのだと思います。
（それにしたって，毎回やらせなくてもいいじゃん…と思いますが。）

# 解決策
Google Drive上から直接Colabratoryファイルを新規作成して作成したファイルについては，初めに一度マウントすれば，以降は自動的にマウントされます。
ランタイムを起動するたびにいちいち入力するのが面倒だと思う人は，この方法を使うしかないようです。
他の方法をご存知の方がいらっしゃったら教えてください。
git メモ書き

git reset --hard origin/dev-cai　　強制pull local上書き
 git push --set-upstream origin dev-test
git log --name-status
git stash apply stash@{0}
git checkout -b fix/#RPO-10 origin/dev
git log --merge --decorate --source -p　src/.../
git branch -d <branch名>　　localブランチ削除
git push --delete origin branch_name　-- remote ブランチ削除
git checkout -b issue/#RPO-36 origin/dev
git remote add github https://github.com/sh0ume1sa1/Waitsub.git -- new fetch/push source
標準入力した数値の左側に0を表示する方法

#環境
Mac
Ruby 2.6.5

#達成したいこと
標準入力した数値が、指定した桁数に満たなかった場合、左詰めで0を加える。
例）8桁の場合
3→00000003
12→00000012
1234→00001234

#解決法
printfメソッドを使用する。
最初の引数でフォーマットを指定し、それ以降の引数で与えられた文字列または数値をフォーマットに従って整形し、文字列を生成して出力します。
基本的なprintfメソッドの書式は以下の通り。
※実際描くときは[ ]は要りません。

    printf("%[フラグ][幅][.精度][指示子]", [文字列または数値])

フラグにはさまざまありますが、「0」を用いると、幅を指定する際に余った桁を「0」で埋めてくれます。幅は表示する数値の桁数を指定します。（精度は今回は指定しません）
指示子（与えられたデータの整形の仕方を指示）もいろいろありますが、整数を10進法で表示する場合は`%d`とします。

例えば、上記の例では以下のようになります。

~~~ruby
num = gets.to_i
printf("%08d",num) #フラグに「0」、幅に「8」、指示子に「%d」を入力

# num = 3の場合
#=> "00000003"
# num = 12の場合
#=> "00000012"
~~~
PyQt5をUbuntuで使うときにGUI周りでエラー (WSL2)

PyQt5をwsl2で使おうとしたらトラブったので備忘録．
日本語の記事は1つだけapt installしたら解決すると言っているがしなかったので．

# 前提
- PyQt5を使いたいです
- ここでの環境はwsl2上でのUbuntu18.04ですが，Ubuntuなら共通のはずです
- wsl(2)のGUI環境は構築済みとします．Xserver入れるとか．
    - もしここ知りたい方がいたら [WSL2の導入とGUI環境の構築とsshfsしたものもgnome-openしたい!!](https://qiita.com/momomo_rimoto/items/51d533ae9529872696ce) も併せてご覧ください．

# トラブル

```bash
$ main.py
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Aborted
```

# いろいろな日本語ページに書いてあること

```bash
sudo apt install libxkbcommon-x11-0
```

これだけではだめだった．これも必要です！

# 解決手段
まず，`libqeglfs.so`のありかを見つける．

```bash
find / -name libqeglfs.so
```
など．だけどこれ多分実行時間がしんどいかもしれない．
例えば

```bash
export QT_DEBUG_PLUGINS=1
```
としてデバッグモードとし，目的のPythonファイルを実行すると

```bash
Got keys from plugin meta data ("xcb")
QFactoryLoader::QFactoryLoader() checking directory path "/path/to/python/bin/platforms" ...
Cannot load library /path/to/python/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so: (libxcb-icccm.so.4: cannot open shared object file: No such file or directory)
QLibraryPrivate::loadPlugin failed on "/path/to/python/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so" : "Cannot load library /home/path/to/python/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so: (libxcb-icccm.so.4: cannot open shared object file: No such file or directory)"
```
みたいなものが最後の方に出てきます（Pythonへのパスは `path/to/python`に書き換えています）．

これが見つかったら，
https://forum.qt.io/topic/115732/could-not-load-the-qt-platform-plugin-xcb-in-even-though-it-was-found
などにあるように，

```bash
ldd /path/to/python/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so
```
をしてやるとよいです．見にくかったら`|grep "not found"`を追加してやってもよいです．

これで足りないものがわかるので，例えば自分は

```bash

$ ldd /path/to/python/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so | grep "not found"
        libxcb-icccm.so.4 => not found
        libxcb-image.so.0 => not found
        libxcb-keysyms.so.1 => not found
        libxcb-render-util.so.0 => not found
        libxcb-xinerama.so.0 => not found
        libxcb-icccm.so.4 => not found
        libxcb-image.so.0 => not found
        libxcb-keysyms.so.1 => not found
        libxcb-render-util.so.0 => not found
        libxcb-xinerama.so.0 => not found
```
だったので，

```bash
sudo apt install libxkbcommon-x11-0
sudo apt install libxcb-icccm4
sudo apt install libxcb-image0
sudo apt install libxcb-keysyms1
sudo apt install libxcb-render-util0
sudo apt install libxcb-xinerama0
```
をしたら動くようになりました．めでたしめでたし．
セマフォが溜まってサービス起動できない

（過去対応メモ）
Apacheなどのサービスが起動できなくなった場合、
排他制御に使われるセマフォが最大値まで積んでしまっている可能性がある。

ログには以下のようなメッセージが出る。
No space left on device: Couldn't create accept lock

セマフォの状態を確認する場合

```
# ipcs -s
```

ここで対象サービスのセマフォがたくさん積んでいたらあやしい。
このコマンドで1つずつセマフォを解放することができる。

```
# ipcrm -m <ID>
```

それよりもセマフォの最大値を増やした方が良いかもしれない。

```
最大値を確認
# /sbin/sysctl -a | grep sem
kernel.sem = 250	32000	32	128
（最大値は 128 という意味だったはず）

/etc/sysctl.conf に以下を追記
kernel.sem = 250 32000 32 256
（最大値を256に増やす場合）

反映・確認
# /sbin/sysctl -p
# /sbin/sysctl -a | grep sem
```
これで起動できなかったサービスが起動できるようになった。

## ディスク拡張したらセマフォが上限に達したケース
lvextend と resize2fs でディスク拡張したら以下のようなエラーが出てサーバが固まった。

```
Limit for the maximum number of semaphores reached.
You can check and set the limits in /proc/sys/kernel/sem.
```
```
Unable to resume LV-NAME (253:5)
Problem reactivating logical volume LV-NAME.
Releasing activation in critical section.
libdevmapper exiting with 1 device(s) still suspended.
```
kernel.sem を増やすのが良さそう。

```
# cat /proc/sys/kernel/sem
250     32000   100     144
```
kernel.sem のパラメータの意味はこんな感じ。
250  : セマフォ識別子あたりの最大セマフォ数
32000 : システム全体のセマフォ数
100 : セマフォコールあたりの最大演算子数
144 : システム全体のセマフォ識別子数

システム全体のセマフォ数 = セマフォ識別子あたりの最大セマフォ数 × システム全体のセマフォ識別子数
となるようにした方が良いのだろうか。

発生時の応急措置としてはこんな感じ？

```
セマフォを増やす。
# echo "750 288000 300 384" > /proc/sys/kernel/sem

デバイスの状態を確認する。
# dmsetup info

問題の発生しているデバイスは State が SUSPENDED になっていると思われる。

デバイスをアクティブにする。
# dmsetup resume
# dmsetup info
```

恒久対処としてはセマフォをしっかり増やした方が良いかと。

```
# sysctl -a | grep kernel.sem
# vi /etc/sysctl.conf

kernel.sem = 250 32000 100 144
↓
kernel.sem = 750 288000 300 384

# sysctl -p
# sysctl -a | grep kernel.sem
```
超初心者がSpring入門の本を完走したので、自分なりにまとめてみる

## はじめに
Springの本完走致しました!!
[本のURL](https://www.amazon.co.jp/dp/B07H6XLXD7/ref=cm_sw_r_tw_dp_x_v9rEFb70ZV0ZC)
私なりに、軽くまとめてみようと思います。
日本語が拙い部分があったり、知識が足りていない部分がありますが、読んでいただけるとありがたいです。

## 環境について
OpenJDK14.0.2
STS4?
Maven3.6?
あと、STSにLombokいれてました。

## DI(依存性の注入)
* インスタンスの生成
* インスタンスのライフサイクル管理

DIが主にこの２つをしてくれている。
DIをすること(利用する？)ことで、newでインスタンス生成して変数に入れ込むという手間が省けたり、
使い終わった変数に`null`を入れ忘れることの防止もできる。

## Autowiredについて
Autowiredをつけておくと、自動でインスタンスを生成してくれます。(DIの対象のアノテーションがついているクラスは自動生成されるらしい。)
シングルトンらしいので、エラーが起きやすかった気がします。
同じ型のBeanがDIコンテナに複数登録されている場合にエラーがおきるので気をつけてください。
回避するためには、`@Qualifier`をつかって名前(ファイル名)を指定してあげると回避することができる。

## GetMapping,PostMapping
GetMapping->指定したURLにGETリクエストでアクセスされた場合の処理(データを取得)
PostMapping->指定したURLにPOSTリクエストでアクセスされた場合の処理(データを登録)

## `@Data`
Dataアノテーションをつけるとgetter、setterを自動生成してくれる。(Lombokの機能)
仕様変更の際に、臨機応変な対応が取れる。

## バリデーション
フォームのクラスの各フィールドにアノテーションをつけるだけで、バリデーションの実装ができる。
[バリデーションについて](https://b1tblog.com/2020/02/02/spring-boot-4/)
↑このサイトに種類の説明書いてあります。
`@validated`をバリデーションをしたいmodelの引数につけるだけで、バリデーションが実行される。

## AOP(アスペクト指向プログラミング)
各クラスで共通する処理を抜き出して。まとめて管理すること。
Advice(処理内容),PointCut(実行場所),JointPoint(実行タイミング)
私が使っていた本では、コントローラーの実行時などにコンソールにメッセージを出すのに使っていました。どのコントローラーを実行してるかとか、表示してくれます。

## JDBC
Springで主にデータベースを取り扱うときに使う。

* insert(追加)
* update(更新)
* select(取得)(複数、1件)
* delete(削除)

登録、更新、削除 -> updateメソッド
データのカウント -> queryForObjectメソッド
１件取得のselect文 -> queryForMapメソッド
複数件取得のselect文　-> queryForListメソッド


応用
* RowMapper
RowMapperを継承して、実装する。
同じようなSELECT文がたくさんあるときなどに使うと、コードの可読性が上がる。Mapperのクラスの処理でSELECT文の結果をインスタンスにセットして、戻り値として返してくれる。

* BeanRowMapper
RowMapperを用意しなくても、実装可能。
機能的には、上と同じ
自動マッピングができる。
しかし以下のようにしなければ、ならない。
* カラム名　-> user_id(アンダースコアで区切る)(スネークケース)
* フィールド名 -> userId(2つ目の単語から大文字にする)(キャメルケース)

* ResultSetExtractor
ResultSetExtractor<List<T>>を継承して実装。
複数件のselect結果をオブジェクトにマッピングする場合に使う。
配列で、データを返してくれる。

* RowCallbackHandler
コールバック処理。処理を依頼して、その処理が終わった後に、結果を受け取り、次の処理が動き出す。データを取得してから、そのデータを次の処理に使いたい場合などに利用する。
たとえば...
ユーザー一覧画面から、CSVを出力するなど。
(CSVを出力するには、ユーザー一覧のデータが必要なので、取得してから、次の処理へ進む。)

* NamedParameterJdbcTemplate
SQL文に、?を用いて、引数を渡しているが、NamedParameterJdbcTemplateでは、：キー名で指定する。
SQL文に入れるパラメーターを設定するために、SqlParameterSourceクラスを使い、addValue()メソッドにキーと値をセットしていく。

## エラーについて
Modelからキーを指定すると、エラー内容の詳細を取得できる。
* ${status} -> HTTPのエラーコードが格納されている。
* ${error} -> HTTPのエラー概要が表示される。
* ${message} -> エラーメッセージが表示される。

共通のエラーページだけでなく、エラーのステータス毎に応じたテンプレートを適用することもできる。

## RESTについて
HTTPリクエストに対して、JSONなどを返すサービス。
REST用コントローラを作成、クラスに@RestContorllerをつける
@RestControllerをつけると、そのクラスのメソッドの戻り値を呼び出しもとに返す。
PUTメソッド -> @PutMapping
DELETEメソッド -> @DeleteMapping

## JUnitについて(SpringTest)
javaでテストを自動化できるライブラリ
テスト用のアノテーションをつけるだけで、テスト用のクラスになる。

@RunWith(SpringRunner.class) -> テストをどのクラスで実行するか指定できる。

@SpringBootTest -> SpringBootを起動してから、テストを始めてくれる。

@Sql -> 指定したSQLを実行した後の状態でテストされる。

コントローラのテストには、モックを利用してテストを行う。

@WithMockUserを使うことによって、Admin権限のみのページの表示のテストなどができる。

## 最後に
少し、内容の薄いまとめとなってしまったのですが、見返せるようにもう少し、理解を深めて改善していく努力をしたいと思います。

さいごまで読んでいただき、ありがとうございます。

誤字、脱字あったらコメントお願いします。
VSCodeのデバッガーがクラッシュするときの対処法

フロントエンドの開発をしています。

あるときから、[Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome)を使ったデバッグを行った際に、ルートページまでは表示できるが、ログインボタンを押下するとChromeのウィンドウがクラッシュするようになりました。

Debuggerが落ちるときの対処法についてです。

## 解決法
`settings.json`に`"debug.javascript.usePreview": false`を設定します。

例：

```
{
  "eslint.validate": ["typescript"],
  "debug.javascript.usePreview": false
}
```

今後の更新で改善される可能性はありますが、それまではこれで対応できます。

## 参考ページ
[Chrome window crashes · Issue #742 · microsoft/vscode-js-debug](https://github.com/microsoft/vscode-js-debug/issues/742)
[Visual Studio Codeをv1.46.1に戻した｜フィジカルモンスター｜note](https://note.com/physicalmonster/n/n2a8c6dface57)
Nuxt.jsを短期間でFirebaseにデプロイしてCircleCIで自動デプロイをするところまでを設定するマニュアル②自動デプロイの設定

# 楽をするのは良いことだ

ということで、[前回](https://qiita.com/KueharX/items/b2636c07e127514e4e39)の続きです。
今回はGitHubにリポジトリを作成し、CircleCIと連携、GitHubにプッシュするたびにFirebaseに自動デプロイされるようにする、という内容です。


# 環境

OSX Catalina
npm version6.14.6
node.js v12.18.4


# 構築

まず、GitHubにリポジトリを作成し、

![スクリーンショット 2020-10-04 18.17.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/a7250bed-da6f-f367-d917-3c0735b7e6ed.png)

前回Nuxt.jsで作ったsampleプロジェクトをGitHubにプッシュしておきます。


![スクリーンショット 2020-10-04 18.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/4b4721a9-b114-c518-6802-8acba71cae81.png)


これで一旦GitHubへの設定は終わりです。

では、GitHubとCircleCI、そしてCircleCIとFirebaseを接続していきましょう。

まずは[CircleCI](https://circleci.com/)の登録をすませてください。
これからGitHubとの連携をするのでGitHubのアカウントでログインすると良いでしょう。
すると連携をするかどうかを聞かれるので連携し、今回のプロジェクト、先ほどGitHubにプッシュしたリポジトリ(以上の例では)を連携してください。

次にCircleCIとFirebaseを連携するためにアクセスするためのトークンをFirebaseに生成して貰うために以下のコマンドをターミナルで実行してください。

```
$ firebase login:ci
```

するとコンソール参照用のURLとトークンが表示されるので、CircleCIのPipelineを開き、右上のProject Settingsをクリック、

![スクリーンショット 2020-10-05 14.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/22215539-e430-8f30-7285-19bca189c9ac.png)

すると環境変数を登録するEnvironment Variablesという欄があるので先ほど手に入れたトークンを`FIREBASE_TOKEN`という名前で以下のように設定してください。

![スクリーンショット 2020-10-05 14.21.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/ba195b41-dda2-e880-c48b-29221cef157a.png)


そして、プロジェクト直下に.circleci/config.ymlを作成し、以下のように作成してください。

```yaml:.circleci/config.yaml
version: 2
jobs:
  deploy_main:
    docker:
      - image: circleci/node:latest
    steps:
      - checkout
      - run:
          name: install firebase-tools
          command: sudo npm install -g firebase-tools
      - run:
          name: install nuxt
          command: npm install nuxt
      - run:
          name: build project
          command: npm run build
      - run:
          name: Deploy Firebase Hosting
          command: firebase deploy --token=$FIREBASE_TOKEN # --project [your-project-id] 仮にこのままプッシュしてfailedになってしまう場合はこのコメントアウトを外してあなたのFirebaseプロジェクトのIDを記入してプッシュしてみてください。

workflows:
  version: 2
  build_and_deploy:
    jobs:
      - deploy_main:
          filters:
            branches:
              only: main
```



そして試しにGitHubにプッシュしてみると・・・

![スクリーンショット 2020-10-05 14.25.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/f7f2f774-34fd-ab71-2a33-777d70af3014.png)

無事成功しました！

ひとまず以上のように設定することでプッシュするたびに自動的にデプロイされるようになりました。

時間があれば自動テストを追加したものも投稿したいですね。
ではこの記事はひとまずここまで。お疲れ様でした。
Tips: AIX tar コマンド :ファイル・サイズ 8GB 以上の操作が可能


いつの間にか AIX のtarコマンドのファイル容量制限がAIX 7.1 TL3 以降で無制限となっていました。

・tar コマンド
https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_71/t_commands/tar.html

> AIX® 7.1 (テクノロジー・レベル 2) 以前のリリースでは、ustar ヘッダー書式で最大 8 GB のファイル・サイズを指定できます。 AIX 7.1 (テクノロジー・レベル 3) 以降のリリースでは、このサイズは無制限 (2^64 -1) です。 


---

AIX 7.1 TL2 (制限があるAIX7.1TL3未満)の環境で 8GB 以上の tar 操作ができないことを確認します。

#### AIX 7.1 TL2 環境

```
# oslevel -s
7100-02-00-0000
```

#### 10GBファイルのtar操作失敗を確認

dd コマンドで 10GBのファイル(10GBfile) を作成

```
# dd if=/dev/zero of=10GBfile bs=1M count=10000
10000+0 records in
10000+0 records out
# ls -l
total 20480000
-rw-r--r--    1 root     system   10485760000 Feb 26 13:42 10GBfile
```

作成した 10GBfile でtar ファイルを作成

```
# tar -cvf 10GBfile.tar 10GBfile
tar: 10GBfile: file too large.
# echo $?
2
```

file too large で失敗しました。


---

では、AIX 7.2 TL3 (無制限となった AIX 7.1 TL3 以上) の環境で 8GB 以上の tar 操作が可能であることを確認します。


#### AIX 7.2 TL3 環境


```
# oslevel -s
7200-03-02-1846
```


#### 10GBファイルのtar操作成功を確認

dd コマンドで 10GBのファイル(10GBfile) を作成

```
# dd if=/dev/zero of=10GBfile bs=1M count=10000
10000+0 records in
10000+0 records out
# ls -l
total 20480000
-rw-r--r--    1 root     system   10485760000 Oct  4 15:56 10GBfile


```

10GBfileの tar ファイルを作成

```
# tar -cvf 10GBfile.tar 10GBfile
a 10GBfile 20480000 blocks
# ls -l
total 40960032
-rw-r--r--    1 root     system   10485760000 Oct  4 15:56 10GBfile
-rw-r--r--    1 root     system   10485770240 Oct  4 16:05 10GBfile.tar
```

10GB サイズのファイルでエラーなく tarファイルが作成されました。



---
(Option) tar コマンドでは圧縮されないので、gzip コマンドで圧縮をかけます。

```
# gzip 10GBfile.tar
# ls -l
total 19880
-rw-r--r--    1 root     system     10176308 Oct  4 16:07 10GBfile.tar.gz

```

元サイズの 0.097 % くらいになりました。



以上です。
パッケージ管理ツールであるnpmについて解説します

今回は、パッケージ管理ツールであるnpmについて解説します。

npmはNode.jsのパッケージを管理するものです。従って、まずはNode.jsが何者なのかを簡単に説明します。

##Node.jsとは
結論から言うと、サーバーサイドで動くJavaScriptです。
クライアント側とサーバー側で同じJavaScriptで書けることは、パフォーマンスの向上に繋がります。

##npmとは
npmの正式名称は Node Package Manager です。
つまり、Node.jsのパッケージを管理するツールです。

##代表的なパッケージ例

- Express
- promise
- async
- Socket.io

中でもExpressはNode.jsのWebアプリケーション開発で利用できるMVCフレームワークであるため、Webアプリケーションを効率的に開発することが可能です。

##npmの使い方
######動作確認方法
######実行するコマンド

```
npm --version
```

######表示された結果

```
6.14.8
```

######パッケージをインストールする方法

```
npm install パッケージ名
```

######パッケージの確認方法

```
npm list -g
```
解説:
-g をつけることで、使用しているコンピューター内の全てのパッケージを表示することができます。
逆につけない場合は、現在操作中のディレクトリ内にインストール済みのパッケージを表示します。

##最後に

npmの最新情報は公式ページに記載されているので、そちらを参考にしてみると良いかもしれません。
npmの公式ページ :  https://www.npmjs.com/


ここまで記事を読んでいただきありがとうございました。この記事をきっかけに、少しでもnpmを知るきっかけになれたら幸いです。今後もアウトプットを継続していきたいと思っておりますので、よろしくお願い致します。
laravel+nginxで特定のディレクトリのみにIPアドレス制限をかける方法

laravelとnginxでwebサーバーを立てている時、特定のディレクトリのみにIPアドレス制限をかけたいことってよくありますよね。:frowning2:
IPアドレス制限はlaravel側で行うこともできますが、laravel+nginxの設定で行う場合の設定例があまり見当たらなかったのでまとめました。

許可したいIPアドレスの数が1個なら、適当なところに

```php
if($_SERVER["REMOTE_ADDR"] !== "xxx.xxx.xxx.xxx"){
   abort(403);
}
```

とでも書いておけばいいのですが、数が増えるとちょっとめんどくさくなってきます。
もし追加のIPアドレスをサブネット単位で指定されたら。。。:joy:

## 前提となるlaravel+nginxの環境構築
Docker
Nginx
laravel

この記事の前提となるlaravel+nginx+dockerの環境構築は、こちらの@ucan-labさんの神記事が参考になります。

https://qiita.com/ucan-lab/items/5fc1281cd8076c8ac9f4

## 特定のディレクトリのみにIPアドレス制限をかけるlaravel+nginxの設定ファイル

設定に関係ないところは省いてますので、nginxの設定については、上記の神記事を参考にしてください。

```nginx.conf

    # 以下の2つがnginxでlaravelを動作させるための基本的な設定です。
    # 全てのリクエストをlaravelのrootであるindex.phpにリダイレクトする
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # .phpファイルをfastcgiで処理する
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # ここからが、本題であるディレクトリIP制限になります。
    # admin/ ディレクトリに制限をかける例
    location /admin/ {
        try_files $uri $uri/ /index.php?$query_string;
        # allow ip list
        allow xxx.xxx.xxx.xxx;
        allow yyy.yyy.yyy.yyy;
        deny all;
    }

```

## 設定のポイント

以下のlocation設定だけですと、/admin/以下のファイルをnginxがそのまま表示しようとするので、laravelとして動作しません。

```
    location /admin/ {
        allow yyy.yyy.yyy.yyy;
        deny all;
    }
```

なので、location内にindex.phpにリダイレクトする設定をもう一度書いてあげる必要がありました。

```
try_files $uri $uri/ /index.php?$query_string;
```

もちろん、サブネット単位での指定も可能です。

```
allow 192.168.1.0/24;
```

ただ、アプリケーション全体のセキュリティ設定が複数の箇所に分散することになりますので、/admin/ 以下のコントローラーやroute.phpなどに

/*

IPアドレス制限はnginx側で行ってますよ

*/

とコメントしておくと、**将来の自分**や引き継いだ**後任の人**が助かるでしょう。
え？そんなん普通どこでセキュリティ設定しているかわかるだろうって？

甘いね:cake:

### おわり

**以上でlaravelの特定のディレクトリにIPアドレス制限をかけることができました。**:relaxed:

### 合わせて読んでほしいlaravelセキュリティ関連の記事

laravelで連続ログインに失敗したらロックアウトをかけてセキュリティを更に高める方法
https://qiita.com/reopa_sharkun/items/7def0cc0a8647df10ade

この記事が参考になったら
:clap:↓ボタンを押して応援してね↓:relaxed:
OS Catalinaにアップデートした際に、Gitがつかえなくなった

## mojaveからCatalinaへ
いつも無視していたが誕生日も来たことだしOSアップデートするかと思い2020/10/04にOSのアップデートを行いました。


Gitが動かない...
下記のようなエラーが表示されました。

```
$ git fetch
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

## xcode-select --install
他の方のQiitaやブログを読むと下記コマンドで直る方もいるそうです。

```
$ xcode-select --install
```

参考
> [macOS CatalinaにしたらGitコマンドが動かなくなった](https://qiita.com/n0bisuke/items/3aebc4ab635030119f6c)


## 上記コマンドでエラーが出た場合
自分は上記コマンドにてエラーが出てしまいました。
> 「ソフトウェアアップデートサーバーから現在利用できないため、ソフトウェアをインストールできません」

上記のようなエラーメッセージです。
その際に、下記ブログの方にお世話になりました。
参考
> [xcode-select --installに失敗した](http://pokuwagata.hatenablog.com/entry/2018/11/04/210256)

`xcode-select --install`でやろうとしていたことを手動でApple公式サイトからダウンロードし対応する方法です。

1.[More Downloads for Apple Developers](https://developer.apple.com/download/more/)にアクセスし`Command Line Tools`を検索します。
2.自分の環境にあったものを探しダウンロードします。（beta版もあるので注意してくださいー）
3.ダウンロードしたら解凍しインストール
4.`git`コマンドを試してみる！

自分はこの方法で対応することができました！
Android11でTextToSpeechが動作しない時の対処法

##はじめに
急に開発で使用しているPixel3でTextToSpeechが動作しなくなった。
他の開発端末Xperia等では普通に動く。
TextToSpeechのonInitListenerで `status = -1`が返却される

##原因及び対処法
###原因： android 11の仕様

###対処法： AndroidManifest.xmlにINTENT_ACTION_TTS_SERVICEを追加
公式に以下のように書かれていました。
> Apps targeting Android 11 that use text-to-speech should declare TextToSpeech.Engine#INTENT_ACTION_TTS_SERVICE in the queries elements of their manifest:

マニフェストに以下のような感じで追加すると動くようになります。

```xml:AndroidManifest.xml
<manifest>
　　・・・
    <queries>
　　　・・・
        <intent>
            <action android:name="android.intent.action.TTS_SERVICE" />
        </intent>
    </queries>
</manifest>
```
React学習　Progate編　その１

注意！！

まったくの初心者なので、備忘録として書いています。
JSもプロゲートをかじった程度です。
間違いや非推奨の記述等ありましたら、ご指摘いただけると幸いです。
むろん、そのようなことが無いよう努めます。

Reactは、Javascript、のライブラリの一つでクライアントサイドを担います。つまり、HPの見た目に関わるということです。

マイルストーン

基本的な Reactの構文を理解していること
JSXを理解すること

今日の要約

ReactはJSのライブラリだけあって構文はほぼ同じ
ただ最初にReactのライブラリを読み込んで、ファイル内で関数を呼び出している

JSXとHTMLはよく似ている。
JSXはrender( )のreturnつまり戻り値のところに記述する。
それ以外の範囲はJSの文法に従う。
ただJSXでは要素をひとまとめにしないといけない。要素をdivタブで囲むのがいいみたい。imgタブなど/で閉じなければいけない。

大まかな手順

```js

//拡張子が .jsのファイルの先頭にReactをインポートする

import React from 'react';

//React.Compomentを継承するクラスを定義する
class クラス名 extends React.Component{
 render() {
   return (
     {/*JSX記述部分*/}
   );
 }
}

//クラスをエクスポートする
export default クラス名;
```
JSX内にJSを記述するには｛｝の中に記述。
属性やリンク先でも同様。
コメントアウトは｛/* */｝ cssとちょっと似てる。
たったn個のよくあるやり方 【Webスクレイピング編】

# はじめに
Webスクレイピングでたまによくあることのメモ。(適宜追加予定)

# 節子、それスペースやない、C2A0や！
BSで取ってきた文字列(line1)からパターンマッチやparseで項目を取り出そうと思ったらなぜかNone。
同じ文字列を自前で作って(line2)取り出すとこれはちゃんと取り出せる。なんやこれ・・・

```python
print(line1 == line2)
```

```console
False
```

しかたないので1文字ずつ比較。

```python
for (c1, c2) in zip(line1, line2):
    print(c1.encode(), end=', ')
    print(c2.encode(), end=' '+str(c1==c2)+'\n')
```

```console
:
b'\xc2\xa0', b' ' False
:
```

!?

これがかの有名なC2A0問題です(初めて知った)。いまだにあるんですねぇ、こういう問題。

C2A0問題とは：
HTMLで\&nbsp; (ノンブレークスペース)を使うと一見ただのスペースなんだけど実は違う文字コードが割り当てられてしまう問題。見ただけでは区別がつかない。(困)


Pythonでの処理例が見つからなかったのでメモ。

```python
line = line.encode().replace(b'\xc2\xa0', b'\x20').decode('utf-8')
```

こんな感じでC2A0を普通の半角スペースに変換してやりたいことはできるようになった。
(いったんencodeしなくてもできるんかな?)

# Selenium、ゾンビ作りがち

なぜかいつも使ってるSeleniumのスクリプトが意味のよくわからないエラーで終了するようになった。エラーメッセージでググっていろいろ対処したり調べたりしてもどうもうまくいかない。

ふと思ってプロセス見てみたら大量のゾンビがいた。

```console
% ps aux | grep chrome
:
(大量)
:
```

全部killしたら何事もなかったように動くようになった。
Seleniumでいろいろと試しながら作っているようなとき、driver.close()しないまま異常終了するとゾンビが残るので注意が必要ですね。(特にHeadlessで動かしてると気づきにくい)

# JavaScriptレンダリング後のソースを表示、保存したい

一般にJavaScriptで出力したソースはブラウザの「ソースを表示」機能では見れないのでもやもやするけど、以下の方法で表示、保存が可能。

- FireFoxの場合

描画後の画面で表示保存したい部分をマウス等で選択し、右クリック「選択した部分のソースを表示」。

- Chromeの場合


デベロッパーツールを開き、「Elements」タブに表示されるソースの保存したいタグを右クリック「Copy」- 「Copy element」してどっかに貼り付け。(全体を保存したければ先頭の&lt;html&gt;で実行すればおｋ)
Elixirのバージョンをローカルで切り替える。

インストールしてから`1.3.4`に切り替える例。

インストール可能なバージョンを確認します、

```bash
kiex list known

・・・
    1.3.0-rc.0
    1.3.0-rc.1
    1.3.1
    1.3.2
    1.3.3
    1.3.4
    1.4.0
・・・

```

バージョンを指定してインストールします。

```bash

kiex install 1.3.4
kiex use 1.3.4 --default

```
GCPのKMSで暗号化する方法

GCPのCloud Key Management Service(KMS)を使用したファイルの暗号化についての記事になります。本記事ではgcloudのインストールは省略させて頂きます。
[KMSの概要](https://cloud.google.com/security-key-management?hl=ja)

# Cloud Key Management Serviceとは
GCPで提供されている、暗号化などで使用する鍵を管理してくれるサービスです。
個人情報や認証情報など取り扱いが慎重なデータは暗号化をする事が多いと思います。暗号化をする際に考える悩む事として鍵の管理があります。暗号化で使用する鍵をKMSで管理する事で、鍵へのアクセスIAMで制限出来るので管理が楽になります。

# gcloudを使用した暗号化の方法
最初に暗号化をするファイルの作成をします。

```bash
$ echo Hello > sample.txt
$ cat sample.txt
Hello
```

### KMSに移動
ブラウザでGCPのWebコンソールを開き、セキュリティの暗号鍵に移動します。

|![image01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644751/1a0e57c6-8efe-c553-aade-4fe53a735784.jpeg)|
|:--|

暗号鍵をグルーピングするキーリングのリストが表示されます。画面上部の**キーリングの作成**から作成していきます。

|![image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644751/1ce9632c-00ff-cd0f-8b94-778655021b70.jpeg)|
|:--|

### KeyRingの作成
キーリングの名を入力して作成します。

|![image3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644751/6646bab0-baa3-4193-1c35-b99e13fe560e.jpeg)|
|:--|

### Keyの作成
鍵名を入力して作成をします。
鍵のローテーション期間の設定は標準で90日設定とされていますが、実施しない設定をする事も可能です。また、GCP側で作成した鍵を使用する事が出来ない場合は、自前で作成した鍵をインポートして暗号化や複合化に使用する事が出来ます。

|![image4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644751/d10edf64-5484-0ee0-8f22-4a109a8e86c9.jpeg)|
|:--|

作成した鍵をリストで確認する事が出来ます。

|![image4-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644751/627bb780-4cf4-df9a-3348-b0a89ac98b0f.png)|
|:--|

### 暗号化
gclodコマンドのkmsを使用して暗号化を行います。
{project}には、使用しているプロジェクトを入れてください。

```bash
$ gcloud kms encrypt --project {project} \
                     --keyring sample \
                     --key sample \
                     --plaintext-file sample.txt \
                     --ciphertext-file sample.enc \
                     --location global
```

### 複合化
複合化は以下で行う事が出来ます。

```bash
$ gcloud kms decrypt --project {project} \
                     --keyring sample \
                     --key sample \
                     --plaintext-file sample.txt \
                     --ciphertext-file sample.enc \
                     --location global
```

# Terraformを用いた鍵の作成
Terraformというインフラ構築のツールで鍵を作成したい場合は以下になります。

```tf
resource "google_kms_key_ring" "keyring" {
  name     = "sample"
  location = "global"
}

resource "google_kms_crypto_key" "key" {
  name     = "sample"
  key_ring = google_kms_key_ring.keyring.id

  lifecycle {
    prevent_destroy = true
  }
}
```
PowerShellでのCSV入出力

#はじめに
PowerShellを用いて、CSVを読み込み別フォーマットのCSVとして出力する方法。

#手順
Import-CSVを使用してCSVを読み込む。
Get-Contentを使用してもCSVの読み込みが行えるが、文字列としてに,(カンマ)が含まれているとずれてしまうのでImport-CSVを使用した方がよい。

```powershell
$csv_a = Import-CSV -Encoding Default "入力.csv"
```
PsCustomObjectとして読み込まれる。

```powershell
PS > $csv_a[0]

商品コード 商品名 個数 単価
---------- ------ ---- ----
0001       バナナ 10   100
```

データはJSON形式で管理しているっぽい。

```powershell
PS > $csv_a
:
BaseObject          : {@{商品コード=0001; 商品名=バナナ; 個数=10; 単価=100}, @{商品コード=0002; 商品名=レモン; 個数=20;
                       単価=50}}
```

<br>
項目数が想定と一致しているのか確認する。

```powershell
if ( $csv_a[0].psobject.properties.Name.Length -ne 4 ) {
    exit
}
```


中身がJSONなので、こんな書き方でも可能。

```powershell
if ( ($csv_a[0] -split ';').Length -ne 4 ) {
    exit
}
```

<br>
出力用の項目を指定しながら値をセット。

```powershell
[System.Array] $ExportDat = $null

foreach($line_a in $csv_a){

    $tmpDat = New-Object psobject

    $tmpDat | Add-Member -MemberType NoteProperty  -Name "名称" -Value $line_a.商品名
    $tmpDat | Add-Member -MemberType NoteProperty  -Name "金額" -Value ([int]$line_a.単価*[int]$line_a.個数)

    $ExportDat += $tmpDat
}
```

CSV形式で出力。

```powershell
$ExportDat | Export-Csv -NoTypeInformation "出力.csv" -Encoding Default
```


CSVを出力する際に、ヘッダを出力したくない場合にはExport-Csvを使わずにConvertTo-Csvで出力を行い、-skip 1でヘッダ行をスキップする。

また、ダブルクォーテーションを付与したくない場合には-replaceで置換を行う。

```powershell
$ExportDat  | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 |  % {$_ -replace '"',''} | Set-Content "出力.csv"
```

#終わりに
Cとかでがりがり組むのと比べて速度にちょっと難はあるけど、ちょっとしたデータの加工にはなかなか便利。
【GAS】「for文」いろいろ②forEach～３つの引数～

##つづき
[**「for文」いろいろ①for, for...of, for...in**](https://qiita.com/YasumiYasumi/items/2559c40db9f817898fdd) の続き
##概要
forEach文ってのもあって、for...of的な使い方や、for...in的な使い方もできちゃう。もちろんforEach的な使い方もある。
##まずは基本

`配列.forEach( function(e) { 何かしらスクリプト } );`
配列の要素を引数に関数が書けちゃう！何だか便利そう？
##for...of的な使い方

```javascript
function MarudeForOf() { 
   
  var array = [1, 2, 3, 4, 5]; 
   
  array.forEach( function(i) { 
    Logger.log(i); 
  }); 
   
  array.forEach( function(i) { 
    i = i * 5; 
    Logger.log(i); 
  }); 
   
}
```
配列の要素が順番に`function(i)`の引数に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/d3167814-4456-1f6b-815d-315e61c1a035.png)
[①]((https://qiita.com/YasumiYasumi/items/2559c40db9f817898fdd))のfor_ofと全く同じ結果。forEachである意味？
##for...in的な使い方

```javascript
function MarudeForIn() { 
   
  var obj = [{name:'first',  num:1}, 
             {name:'second', num:2}, 
             {name:'third',  num:3}, 
             {name:'forth',  num:4}, 
             {name:'fifth',  num:5}] 
   
  obj.forEach( function(i) { 
    Logger.log(i.name, 'は', i.num, 'です'); 
  }); 
   
  obj.forEach( function(i) { 
    i = i.num * 5; 
    Logger.log(i); 
  }); 
   
}
```
`引数.キー名称`で値が得られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/7feffea0-d8ce-04da-24f7-ba2eb71f228c.png)
２つ目の繰り返しでは、numの値に５倍している。
##forEach的な使い方
なにやらforEachには引数が３つあるらしいので、確かめてみた。

```java
function TestForEach() { 
   
  var array = [1, 2, 3, 4, 5]; 
   
  array.forEach( function(i, j, k) { 
     
    Logger.log("配列", k, "の", j, "番目の要素は", i);
     
  }); 
   
}
```
`配列「引数３」の「引数２」番目の要素は「引数１」`としてログを出したところ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/694e5899-2726-1ddc-205b-dc192c51ae20.png)
１つ目の引数は配列の要素、２つ目はインデックス、３つ目は配列そのものとなっている。

この仕組みを使って、なんとかforEach的なんじゃないかなって使い方を試したのがコチラ。

```javascript
function KorezoForEach() { 
   
  var obj = ['家康','秀忠','家光','家綱','綱吉'] 
   
  obj.forEach( function(name,generation,family) { 
     
    family[generation] = generation + 1 + '代目 徳川' + name; 
     
  }); 
   
  Logger.log(obj); 
   
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/aa51d4e9-e736-c320-2c52-6030fe390d95.png)
徳川ファミリーの名前が入った配列の、全ての要素に「〇代目 徳川」を追加することができた。

今はこんなだけど、覚えておけばいつか使うこともあるのかな（笑）
###おしまい
【Rails】HTTPステータスコードのシンボルとその意味の対応表(自分用）

毎回忘れる度に調べているので自分用にまとめました。

##　各番台のざっくりした意味
100~ ブラウザからのリクエストの継続を意味する。
200~ ブラウザの要求がサーバーで成功したことを意味する。
300~ リダイレクトを意味する。
400~ クライアント側にエラーがあり、リクエストが失敗したことを意味する。
500~ サーバー側にエラーがあり、リクエストが失敗したことを意味する。

##ステータスコードの意味とRailsのシンボル
自分がよく使うもののみ
putとpatch違い
putメソッドは更新というよりは置換
patchメソッドは既存のリソースを更新・変更・修正
詳しくは
https://qiita.com/murata0705/items/52538c08778c39a91ec2

|コード番号 |シンボル  |備考|意味  |
|---|---|---|---|
|200  |:ok  |getの時よく返す|ウェブページまたはリソースが期待どおりに動作している。|
|201 |:created |create,putなどの時これを返す | リクエストを受理して、新しいリソースを作った。 |
|202 |:accepted  ||サーバーがブラウザのリクエストを受け入れ、処理を行なっている状況|
|204 |:no_content|delete,patchなどの時これを返す|リクエストを正常に処理したものの、返すコンテンツがない時|
|304|:not_modified |キャッシュを使わせたい時|要求されたリソースが、最後にアクセスしてから変更されていないという意味。 |
|400 |:bad_request|リクエストボディの形がおかしい、バリデーションエラーなど |不正な構文、無効なリクエストメッセージフレーミング、または不正なリクエストルーティングの時|
|401 |:unauthorized |権限がない。|Authorizationヘッダが必要な場合。|
|403 |:forbidden |権限がない。401と違って認証が必要なわけではない。|リソースにアクセス権限がない。|
|404 |:not_found| |URLで表されたリソースが存在しない。|
|409|:conflict | すでに作成済のものを作成しようとしたりする時。| リクエストが現在のリソースと矛盾するので完了できない。 |
|422 |:unprocessable_entity|バリデーションエラーをより詳しく出したい時。|正常なリクエストが来たが、処理できなかったことを指す。|


##参考

https://qiita.com/terufumi1122/items/997e24dde87f807e3944

https://qiita.com/uenosy/items/ba9dbc70781bddc4a491

https://qiita.com/nesheep5/items/6da796f6ac628c430c36
draw.ioテーブルに列と行を追加する方法

図描画ツール`draw.io`でテーブルを作ったのですが、列や行の追加の方法が分からなかったので、ちょっと調査させていただきました。

↓ここにありました。

![キャプチャ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624898/e31ca772-3072-318e-f64f-aa5364db32b9.jpeg)

対象のテーブルを選択して、右のArrangeタブのTableエリアを操作すればできました
【Heroku】git push heroku masterでエラーが表示されたときの解消法

Herokuのデプロイ時にエラーがいくつか出たため、
その解決方法の助けとなれば幸いです。

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina


# 流れ
1 ターミナルでエラー確認
2 herokuのマイページにログインする
3 エラー箇所を調べる
4 エラーを解消する


# herokuのマイページにログインする
https://dashboard.heroku.com/apps こちらにログインしてください。
最初は確認画面が出ますが、そのままacceptで大丈夫です。
（念の為、翻訳して確認してください）

ログイン後、作成したアプリ名のリンクがあるのでクリックすると、
右側に「Latest activity」があり、
その下にデプロイのエラーが出ている場合、
Xマークが赤くついています。

その横の「View build log」に飛ぶと、詳しいエラーが記載されています。

以下実際にあったエラーを記載しますので、
参考にしていただければと思います。

# Precompiling assets failed.
## ターミナルでエラー確認

```:ターミナル
remote:  !
remote:  !     Precompiling assets failed.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
```
## herokuのマイページにログインし、エラー箇所を調べる
logの中盤ぐらいにあるので、Errorの文字を探してください。

```:heroku/ViewBuildLog
...

Uglifier::Error: Unexpected token: name (mapping). To use ES6 syntax, harmony mode must be enabled with Uglifier.new(:harmony => true).
       --
       
        ...
       
        18254 
        18255 
        18256 
        18257 
        18258 function initMap(){
           =>   let mapping
       
...
```

## エラーを解消する
今回の場合は、letの記述がES6 syntaxを使っておりエラーとなっていました。
解決策としては、
①

```rb:config/environments/production.rb
config.assets.js_compressor = :uglifier
↓
config.assets.js_compressor = :Uglifier.new(:harmony => true)
```
②

```js:app/aseets/application.js
function initMap(){
  let mapping
↓
function initMap(){
  var mapping
```

私の場合は①を試しましたが、エラーが解消できなかったため、②で解消しました。

# まとめ
もちろんエラーの文言をそのまま検索すれば大抵のエラーは解消できると思います。
しかし、個別で状況が違ってくると同じ解決方法では対処できないときもあるので、
様々な解決方法を知っておくのは大切だと考えています。
少しでも参考になれば幸いです。

またtwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら　https://twitter.com/japwork
IBM Cloud：マスター・アカウントの変更方法

# はじめに　（本記事は、2020年9月時点のものです）
IBM Cloudを長く利用していると、最初の契約時に登録した所有者（マスター・アカウント）を変更したいといったことが、たまにあります。
※アカウントオーナーのメール・アドレスを共有のものにしたいといった場合にも有効です。

====

<b>こちらに2025年度版の新しい記事がありますので、そちらもご参照ください。</b>

<b>IBM Cloud：マスター・アカウントの変更方法(2025年版)</b>
https://qiita.com/Riku_Nitta/items/39eb7397b5834904ade2

====

この記事ではその方法について記載いたします。
（尋ねられたので、docsより少し丁寧に書いてみました...)

ちなみに IBM Cloudのマニュアル上はこちらに記載があります。
[アカウントの所有権の移動](https://cloud.ibm.com/docs/account?topic=account-transfer)

マスター・アカウントの変更する場合は、大きく２つの種別があります。
① 既存のアカウントオーナーが存在する場合（自分がアカウント・オーナーの場合）
② 既存のアカウントオーナーが退職などで不在となり、ポータルにログインできない場合

どちらの場合も「ケース(Case)」を起票して実施いたします。
②のほうが、本人がいないため、「証明書の添付」など少し複雑になります。

### ① 既存のアカウントオーナーが存在する場合（自分がアカウント・オーナーの場合）

手順は以下になります。
1. 新しくアカウント・オーナーにしたいユーザの作成とアカウントへの招待
2. アカウント・オーナーで、アカウント・オーナー変更のCaseを起票

Caseをあげる前に、手順1でアカウント・オーナーを委任するユーザを作成して、そのアカウントに招待しておくと、手順2のケースでのやり取りがスムーズになります。

ユーザの招待の方法については省略いたします。
例えば、こちらの記事とかご参考にしてください。
[IBM Cloudでのユーザ招待、他ユーザへの多要素認証の要求設定](https://qiita.com/hisato_imanishi/items/424b18227d5f2b41386c)

手順1でアカウント・オーナーのユーザを招待した後、ケースを起票します。
ケースの内容は以下のような感じで大丈夫です。

<b>a) 「ケース作成」の画面で、「Account」を選択</b>

![スクリーンショット 2020-08-21 17.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239309/cefb089d-a9bb-a46a-d12d-6a62484a3562.png)

<b>b) 「アカウント変更依頼」のケースを作成</b>

以下の文面はあくまでも例ですので、本文は自分好みに変更してもらえればと思います。

![スクリーンショット 2020-08-21 17.09.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239309/7d55bdf2-b06d-659d-6f40-5475bd403707.png)

このあと、Case上で"承認（Approval）"プロセスがまわって、アカウント・オーナーが変更されます。基本的にはすぐに（掛かっても一両日くらいで）承認されると思います。
変更されましたら、必要に応じて、アカウント・プロファイルも変更してください。（必須ではありません）

ケースの作成は本人以外でも作成することは可能ですが、承認プロセスの途中で、アカウント・オーナーからの承認が求められる場合があります。その場合は、アカウント・オーナーの方にログインしていただき、"Approved"とCaseにインプットしてもらえればと思います。


### ② 既存のアカウントオーナーが退職などで不在となり、ポータルにログインできない場合

ちなみにアカウントオーナが退職などして不在な場合、基本的には上の手順と同じですが、以下の内容をケースに記載する必要があります。

a.会社の公式レターヘッド
b.会社の定款 (該当する場合)
c.当該個人がもう会社とは関係ないという記述
d.アカウント所有者を新しい所有者に変更したいという説明
e.新しいアカウント所有者の姓名
f.新しいアカウント所有者の E メール・アドレスおよび電話番号
g.会社の執行役員の署名
h.移動するアカウントのアカウント番号

過去実施したケースでは、c,d,e,f,g,h があれば大丈夫です。（e,f,hは①でも必要）
gについては、新しいアカウントオーナーの上司の承認メールをPDF化してケースに添付することでプロセスを進めることができました。このあたりは、ケース上のやり取りに従ってください。

以上となります。