OmniAICreator/Qiita-1.07M huggingface dataset:
HDDのヘッドパーキング無効化

##ヘッドパーキングとは？
一定時間ディスクへのアクセスが無いと，HDDのヘッドを自動的に外で待機させる機能．
HDDの低消費電力化が目的で，いわゆるアイドリング機能．

デメリットは，ヘッドの稼働が頻繁になって，寿命回数を3年を目安に迎えてしまうこと．

ヘッドパーキングを無効化すれば，寿命となる原因の一つを封じることができる．

##個人的な意見
個人的には，デスクトップPCで個人用途のHDDであれば，低消費電力化より，寿命を伸ばして手間とかを軽減するほうがメリットがあると思っている．

省エネで役立ちそうなのは大規模なデータセンターとかだけど，寿命縮めてまで採用するのか，って感じ．

NAS向けのIron Wolfまでヘッドパーキング有効になってたのは，何だろうなぁ．

個人向けのユーザーに一定周期で買い替えさせたいメーカーの思惑も見える．

CrystalDiskInfoでは，ロード/アンロードサイクル回数で今までのヘッドパーキングの回数を確認することができる．

※CrystalDiskInfoは生の値を10進数で表示させておくと便利．

ちなみに，WDの緑やSeagateのBarracudaだと，ロード/アンロードの寿命は30万回ほど．

ヘッドパーキング無効化して，4年以上使ってみたHDD
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232344/595bad23-896f-7371-7266-a35e18220194.png)

通電時間4年弱にしては，ロード/アンロードはかなり少ない．
ここ1ヶ月ほどエラーが出てるけど，致命的なものではないので，逆にこのままあとどのくらいもつか見守る．



#Seagate

SeaChestを使ってHDDの設定を書き換える．

https://www.seagate.com/jp/ja/support/software/seachest/#downloads
からSeaChest UtilitiesをDLしてインストール

```
SeaChest Utilitiesを起動
SeaChest_PowerControl --scan  #デバイスリストを取得
SeaChest_PowerControl -d ** --EPCfeature disable  #**にHandleを入れる
SeaChest_PowerControl -d ** --disableAPM  #**にHandleを入れる

なんちゃらis not supported on this device.みたいなメッセージが出たら，そのHDDは無効化できない．
```

出典：http://support.seagate.com/seachest/SeaChest_Combo_UserGuides.html

#Western Digital

wdidle3を使う．
wdidle3.exeをCドライブ直下とかに入れて，コマンドプロンプトを管理者権限で実行させる．
その後のやり方と，ツールのDLは下の公式リンクを参考にしてください．

出典：http://liliumrubellum.blog10.fc2.com/blog-entry-307.html



##HDDのメーカー関係なしに無効化するやり方(HDAT2)
ここでやる方法も，一度成功すれば，どのマシンで使ってもヘッドパーキング無効のまま使える．

```
0. マザーボードには対象のHDDを1台のみ接続しておくことを推奨
1. https://hdat2.com/download.htmlからHDAT2IMG_66.IMGをDL
2. Rufus等でUSBメモリに焼く
3. USBメモリからDOSを起動，"HDAT2", <Enter>
4. DM001というドライブを選択して<Enter>  #ここでリストにHDDがない場合は，別のSATA端子に挿し再度チャレンジ
5. "Commands Menu", <Enter>
6. "Commands/Feature Sets", <Enter>
7. "Advanced Power Management (APM) Feature Set", <Enter>, <Y>, <D>, <Enter>
8. <Esc>, <Esc>
9. "Device Configuration Overlay (DCO) Menu", <Enter>
10. "Modify", <Enter>
11. "Security Mode Feature", <Right Arrow>, <S>, <Y>
12. DOSから抜けるまで <Esc>
13. 電源オフ，以上！
```

出典：https://www.silentpcreview.com/forums/viewtopic.php?t=68760

##FREEZEの対処(HDAT2の場合)
HDAT2で最後に内容をsaveしようとしたらlockがかかって結局無効化できないことが多々ある．
使うマザーボードによっては，BIOS起動時にHDDのROMを書き換えられないようにHDDのROMをFREEZEさせる場合があるので，解決策として以下を試す． 

```
a. HDDを他のSATA端子に挿す．最後のチャネルで上手くいくことがある．
b. 電源オフ→SATAケーブルを抜く(NOT SATA電源)→電源オン→DOSを起動→SATAケーブルを挿す
c. HDAT2を起動→SATA電源ケーブルを抜く→30秒待つ→慎重にSATA電源ケーブルを挿す→30秒待つ→HDAT2を実行
　※電源のホットプラグは危険なので注意．私はこの方法で上手くいった．
d.他のマザーボードでHDAT2を試す．オープンソースなBIOS，corebootで上手くいくかテストを予定
```

出典：https://www.hdat2.com/hdat2_faq.html


##まとめ
ヘッドパーキングを無効化したほうがHDDが長持ちすると思う．(経験談)
HDDのファームウェアのバージョンや仕様が原因で，方法によっては無効化できないので色々試すしかない感じ．
例えば，SeagateのHDDでも機種によってSeaChestで無効化できるできないがある．

##ヘッドパーキングを無効化したHDD
Seagate, Iron Wolf, ST4000VN008, HDAT2
Seagate, Barracuda, ST8000DM004, SeaChest
Western Digital, WD Blue, WD30EZRZ-00Z5HB0, WDIDLE3
Cloud RunをCloud PubSubと組み合わせて無料枠の範囲でお試しで使うつもりが一瞬で課金発生してヒヤッとした話

先日公開したログ情報共有サービス[LogCrow](https://logcrow.firebaseapp.com/)の中で、ちょっとしたデータ分析用のバッチ処理を走らせるためにCloud Runを使ってみようとした時の話です。

## Cloud Runとは？

Cloud Runとは、任意のコンテナイメージをビルド・デプロイし、HTTPのリクエストや、Cloud PubSubをトリガーとしてコンテナに処理を実行させるサービスです。
中はKnativeベースで構成されています。マネージドKnativeサービスです。

https://cloud.google.com/run/?hl=ja

サーバレスシステムの基盤になるサービスの1つです。似たようなサービスとしてCloud Functionsがありますが、Functionsはコンテナイメージをデプロイするのではなく、コードをデプロイして動かすものであり、サポートされている言語やバージョンに制約があります。
今回Cloud Runを利用するに至ったのも、元々はCloud FunctionsでGoのプログラムを動かそうとしたのですが、どうしても依存ライブラリがGo1.12以上のバージョンが必要で、Cloud FunctionsのGo1.11という制約に当てはまらなかったためです。

Cloud Runには無料枠が提供されていてCloud Runが稼働時に利用したリソース量に応じています。
CPUなら最初の 180,000 vCPU 秒は無料、メモリなら最初の 360,000 GB 秒は無料、リクエスト数は200 万リクエストまで無料、NWは北米内の下り（外向き）は、1GB まで無料となっているので、ちょっとお試しする分には絶対に無料枠超えることはないだろうと思っていました。

https://cloud.google.com/run/pricing?hl=ja


## 試した仕組み

Cloud FunctionsでCloud StorageにファイルがアップロードされたことをトリガーにPubSubにメッセージを送信。
PubSubのサブスクリプションにCloud Runのエンドポイントにメッセージを発行するように登録。

![CloudRun_CloudPubSub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/6edda12c-7ac6-70a7-b83a-b5cf5dbc4178.png)


## 発生したこと

StorageにファイルアップロードしてCloud Runが実行されるところまでは問題なく実行されました。
試しに動かしていた際、一旦ここまで流れるところまで確認して詳細な実行結果まで見ていなかったのが問題でした。。

実行したCloud Runの実行結果が500(Internal ServerError)になっていました。

ファイルアップロードしなければ特に何も起こらないので問題ないと思って数日そのままで放置してました。すると、たまたま月末で、当月の課金額のレポートメールが来てびっくり。。
ちょっとしか使ってないはずのCloud Runの課金額があっという間に15,000円程に膨れ上がってました。。

よく見るとCloud Runによるリソースの消費量がすごいことに。。

![CloudRun_失敗.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/ae7fdc95-e943-e1f3-9443-fba8c088c079.png)


すぐにCloud Runの実行ログを見ると、多量のリクエストがやってきて、ひたすらに実行エラーを返し続けている状態に。

## 注意すべきポイント

原因はCloud PubSubがCloud Runからの500エラーのAckを受け取ってしまったために正常実行するまで何度も何度もリクエストを再送し続けていたためでした。。

PubSubのサブスクリプションをデフォルト設定で登録すると、以下のように処理が正常完了しなかった場合に再送するようになっています。

- レスポンスコードが異常である(200、201、202、204、102以外のレスポンスコードが返る)
- 応答(Ack)時間が10秒以内に返ってこない

さらに、正常処理出来なかったメッセージについては7日間は消えずに再送し続けます。

このような仕様のため、リクエストの嵐となったわけです。。
成功するまで実行してくれるのは便利な反面気をつけないと痛い目を見るので注意です。

万が一Cloud Runの処理に失敗したとしても再実行を最小限にとどめたい場合には、保持期間を調整することができます。
最短10分～最長7日の範囲で指定可能です。
gcloudのコマンドラインでsubscription登録する場合には以下オプションで指定します。

- --message-retention-duration

Cloud Runの処理が時間がかかるような処理の場合もデフォルトの10秒以内のAckだと時間オーバーする可能性があるので、処理時間の見込みに応じて、調整します。
最短10秒～最長600秒の範囲で指定可能です。

- --ack-deadline

その他のオプションは以下にあります。

https://cloud.google.com/sdk/gcloud/reference/pubsub/subscriptions/create

なお、もし連続したリクエストが発生してしまって、PubSubのpushを止めたい場合には登録したサブスクリプションを削除する必要があります。

## さいごに

利用する際にはドキュメントをしっかり理解してから使わないとダメですね。
今回無料枠を超える量の処理が走ってしまいましたが、Googleさんから最初に付与していただいた$300のクレジットの範囲で収まる被害で済みました。これには感謝です。
【CSS】要素の中央寄せ【備忘録】

中央寄せしなければならない時に、毎回調べてるので備忘録

##ブロック要素

``` sample.css
/* 色、幅、高さの記述は省略 */
.contentA{
  /* 親要素 */
  display: flex;
  align-items: center;
}

.contentB{
  /* 子要素 */
  margin: 0 auto;
}
```
```sample.html
<body>
  <div class="contentA">
    <div class="contentB"></div>
  </div>
</body>
```
###実行結果（赤が親要素、青が子要素）
<img width="800" alt="スクリーンショット 2020-02-04 22.22.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579280/8f2cf35f-2803-ecce-8eb3-225bca09b8b1.png">

##インライン要素
**インライン要素をdivで囲ってあげる**

```sample.css
/* 色、幅、高さの記述は省略 */
.contentA{
  /* 親要素 */
  display: flex;
  align-items: center;
}

.contentB{
  /* 子要素 */
  margin: 0 auto;
}

/* ボタンの位置設定は特になし */

```
```sample.html
<body>
  <div class="contentA">
    <div class="contentB">
      <input type="button" value="テストボタン">
    </div>
  </div>
</body>
```
###実行結果（赤が親要素、青が子要素（ボタン））
<img width="800" alt="スクリーンショット 2020-02-04 23.11.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579280/dd62c903-b9b9-d104-115a-d762735d549b.png">
DISMでMicrosoft Business Storeアプリを事前インストールする

Windows展開時に、ハードウェア管理などのOEMソフトウェアを事前にインストールしておくことがありますが、最近はユニバーサルアプリ化していてプリインストールの手順にちょっとコツがあるらしいのでメモ。
##ダウンロード
[ビジネス向けMicrosoft Store](https://businessstore.microsoft.com/ja-jp/store) でサインインしてダウンロード
パッケージ（.appxまたは.appxbandle）、依存関係パッケージ（.appx）、ライセンス（.xmlまたは.bin）をダウンロード。メタデータは必須ではない。
##インストール
監査モードで以下のコマンドを使ってインストール（オフラインなWimをマウントして実行してもいいかも）

```shell:cmd
dism /online /add-appxprovisionedpackage /packagepath:(パッケージファイル) /licensepath:(ライセンスファイル) /dependencypackagepath:(依存関係パッケージファイル)
```
展開後ローカルアカウント等を作成した際に、アプリが追加されていることを確認する。
##ネットワーク上のファイルを指定するとうまく入らない？
ネットワーク上のファイルをUNCパスで指定すると、一部インストールできないアプリがあった（Dismのエラー、パスが間違っています）。
構文は問題なかったが、依存関係パッケージが重複しているとエラーを起こす模様…？一回インストールした依存関係パッケージを含めないコマンドにしたら通った。「UNCパスはサポートされていません」のメッセージと関係しているかどうかは不明だが、ローカルに各ファイルを配置してからだと問題ないので、ネットワーク上からインストールするときは注意。cmdむつかしい

##っていうか
クライアント端末がWindows10 EnterpriseだったらグループポリシーやAppLockerで制御できるらしいし、Intuneから配信することも可能らしいので、環境によってはコマンドでのインストールは不要かも知れない。ユニバーサルアプリまわりでsysprep時にエラーを起こしやすいのでそっちのほうが無難。

##参考
[Preinstall Apps Using DISM](https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/preinstall-apps-using-dism?redirectedfrom=MSDN)
[組み込みの Windows イメージを含む Microsoft Store アプリを削除または更新した後で sysprep が失敗する](https://support.microsoft.com/ja-jp/help/2769827/sysprep-fails-after-you-remove-or-update-windows-store-apps-that-inclu)
社内環境で Docker for Windows を使うときにハマったこと

普段 Docker (for Linux) を利用している人が Docker for Windows を試したらドツボにハマったのでメモ。

## server gave HTTP response to HTTPS client => insecure registry を追加する

社内環境に立てた Docker Registry が HTTPS に対応していない場合、イメージを pull したときに以下のようなエラーが発生します：

```shell
ERROR: Get http://<社内レジストリ>:5000  http: server gave HTTP response to HTTPS client
```
このような場合、当該レジストリを insecure registry として登録すれば解決します。Linux の場合は `/etc/docker/daemon.json` を編集しますが、Docker for Windows の場合は [Settings] - [Docker Engine] で編集します：

```json:daemon.json
{
  "insecure-registries" : ["<社内レジストリ>:5000"]
}
```

このとき注意すべきことは、**プロコトルは記述しない**ということです。記述しても問題なく適用＆再起動できてしまうので注意してください。間違った設定のせいで Settings が開けなくなった場合はあきらめて再インストールしてください。

## dial tcp: lookup registry-1.docker.io: no such host. => プロキシを設定する

社**外**環境にある Docker Registory （公式など） から pull したときに以下のようなエラーが発生する場合があります：

```
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io: no such host.
```

そんなホストみつからないよ！といっていますが DNS の問題ではなく、プロキシが効いていないためのエラーです。そのため、[Settings] - [Resources] - [Proxies] でプロキシの設定を行います。プロキシサーバに BASIC 認証がかかっている場合は以下のように設定します。

```
http://<ユーザ名>:<パスワード>@<プロキシサーバ>:<ポート>
```

## 参考リンク

* [Deploy a plain HTTP registry](https://docs.docker.com/registry/insecure/)
* [lookup registry-1.docker.io: no such host](https://stackoverflow.com/questions/46036152/lookup-registry-1-docker-io-no-such-host)
ブラウザごとの URL 解決の挙動の違い

　初投稿です。

　最近 Chrome にしか対応していないウェブサイトを改修する機会があった。適当に Babe って polyfi ったが、IE11 に完全対応するのは厳しそうで、それは諦めたが、 Edge44 は初期状態でちょいバグるくらいの感じだったので対応を試みた。URL の解決関係でハマったのでメモしておく。趣味人なので間違っていたらご教授ください。

# URL コンストラクタの挙動が違う
　JavaScript では `new URL(url, [base])` の構文でベース URL を指定して URL オブジェクトを作ることができるが、url に空文字列を入れた場合の href の値が Chrome と Edge44 で微妙に違う。

```JavaScript:main.js
const myURL = new URL("", "https://example.com/index.html")
// Chrome だと myURL.href === "https://example.com/index.html"
// Edge   だと myURL.href === "https://example.com/"

const myURL = new URL("", "https://example.com/css")
// Chrome だと myURL.href === "https://example.com/css"
// Edge   だと myURL.href === "https://example.com/"

const myURL = new URL("", "https://example.com/")
// base がスラッシュで終わる場合は（偶然）返り値が一致する
// ともに myURL.href === "https://example.com/"

const myURL = new URL("..", "https://example.com/index.html")
// url に空でない文字を入れると挙動は一致する
// ともに myURL.href === "https://example.com/"

const myURL = new URL("https://example.com/index.html")
// ともに myURL.href === "https://example.com/index.html"

const myURL = new URL("https://example.com/")
// ともに myURL.href === "https://example.com/"
```

　「ベースURL」の意味からして、最初の例では Edge のように `https://example.com/` を返してほしいところだが、Chrome ではそうはならない[^1]。まるで空文字列を無視して（つまり base のつもりで入れたものを url として解釈して）いるようなふるまいを見せる。

```javascript
new URL("", "https://example.com/index.html")
new URL("https://example.com/index.html")
// Chrome では同じ内容の URL オブジェクトができる
```

# Chrome と空文字列の省略
　そういえば経験的に、Chrome は空文字列を勝手に無いものと扱うような雰囲気がある。たとえば以下のように適当な DOM オブジェクトを作るとする。

```javascript
const input = document.createElement("input");
input.setAttribute("type", "text");
input.setAttribute("value", data[i] || "");
input.required = flag===1 ? true : false;
```

　データが存在しなければ `value` の属性値に空文字列が入るわけだが、これを HTML に起こすとブラウザ間でけっこう差が出る。Chrome では `=""` ごと削除され、属性名だけがタグ内に残るが、Edge44 (EdgeHTML) では空文字列の存在がきちんと残される。ちなみに Firefox は属性値省略絶対殺すマンになる。最近出た Edge79 (Chromium) では Chrome と同じように表示されるので、レンダリングエンジンの問題だろう。

```html
<!-- Chrome, and Edge79 (Chromium) -->
<input type="text" value required>

<!-- IE11, Edge44 (EdgeHTML), and Firefox -->
<input type="text" value="" required="">
```

　HTML の属性名・属性値を省略できるか問題はややこしい、これ以上の追及はやめておくが、ともかくこのような具合で Chrome では URL コンストラクタの第一変数が抹消されてしまい、挙動がバグったのだと思われる。本来 URL() コンストラクタの第一引数に空文字列が入ることは想定されていない？　TypeError が出ても仕方がない場面だが、url も base もそれっぽい USVString なので一応動いてしまう。

# ほかのオブジェクト型
　気になったので開発者ツールのコンソールでいろいろ試してみたが、コンストラクタに空文字列を与えても無視されない。たとえば以下のペアは異なる結果が返ってくる。

```javascript
new Date("", "2")
// Thu Mar 01 1900 00:00:00 GMT+0900 (日本標準時)
new Date("2")
// Thu Feb 01 2001 00:00:00 GMT+0900 (日本標準時)

new RegExp("", "g")
// /(?:)/g
new RegExp("g")
// /g/
```

　なお Edge44 はまた違うふるまいをする。Chromium のお気持ち察し能力が高い。

```javascript
new Date("2")
// [date] Invalid Date: 
```

　うーん、結局ほんとうの原因が何かはよくわからないままだ。WHATWG の仕様書とか読めば解決するのかもしれないけど、読み方わからないのでいったんここまで。

2020-02-05: Edge44 (EdgeHTML) をちょっと訂正。

[^1]: つまりもともとの実装は、Chrome の不適切な挙動をもとに実装されていたということになる。
【学習メモ】基本情報技術者試験（N進数の計算）

n進数の計算方法の整理。
問題点、もっとスマートな方法などあればご指摘お願いします。

#10進数からn進数

整数：nで割って下から余りを並べる
少数：nを掛けて順に整数を並べる

###10進数から２進数

####例：10の２進数
10 ÷ 2 = 5 余り 0
5  ÷ 2 = 2 余り 1
2  ÷ 2 = 1 余り 0
1 ÷ 2 = 0 余り 1
逆から並べて　2進数 :1010

####例：357の２進数
357 ÷ 2 = 178 余り 1
178 ÷ 2 = 89 余り 0
89 ÷ 3 = 44 余り 1
44 ÷ 2 = 22 余り 0
22 ÷ 2 = 11 余り 0
11 ÷ 2 = 5 余り 1
5 ÷ 2 = 2 余り 1
2 ÷ 2 = 1 余り 0
1 ÷ 2 = 0 余り 1
逆から並べて　2進数:101100101

####例：6.375の２進数
整数部分
6 ÷ 2 = 3 余り 0
3 ÷ 2 = 1 余り 1
1 ÷ 2 = 0 余り 1
= 110

少数部分
１、少数部分が「0」になるまで2で掛ける
２、上から整数部分を並べる

0.375 ×　2 = 0.75
0.75  × 2 = 1.5　
0.5(1.5の少数部分） × 2 = 1.0(少数部分が0になったので終了）

110 + 011 = 2進数は110.011


###10進数から8進数
8進数
0 , 1, 2 , 3 , 4 , 5 , 6 , 7 , 10 , 11 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 20・・・
10進数を8で割っていき、余りを下から並べる（流れは2進数と同じ。２が８に変わった）

####240の８進数
240 ÷ 8 = 30 余り 0
30 ÷ 8 = 3 余り 6
3 ÷ 8 = 0 余り 3
8進数: 360

###10進数から16進数
16進数
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , A , B , C , D , E , F , 10 

####例:158の１６進数
158 ÷ 16 = 9 余り 14( =E )
9 ÷ 16 = 0 余り 9
16進数: 9E

####例:1375の１６進数
1375 ÷ 16 = 1360 余り 15( = F )
1360 ÷ 16 = 85  
85 ÷ 16 = 5 余り 5
5 ÷ 16 = 0 余り 5

#n進数から10進数

nのn乗が重み
nに重みを掛けていき、その結果を足し合わせていく。
例：２の重みは2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 , 612 , 1024・・・

###2進数から10進数
####例:1010の10進数
2進数に重みを掛けていく
1　×　8 = 8
0 × 4 = 0
1 × 2 = 2
0 × 1 = 0

掛けた結果を足し合わせる
8 + 2 = 10

####例:11001010の10進数
1 × 128 = 128
1 × 64 = 64
0 × 32 = 0
0 × 16 = 0
1 × 8 = 8
0 × 4 = 0
1 × 2 = 2
0 × 1 = 0

128 + 64 + 8 + 2 = 202

###8進数から10進数
####例:1427の10進数
1 × 512 = 512
4 × 64 = 256
2 × 8 = 16
7 × 1 = 7

512 + 256 × 16 × 7 = 791


###16進数から10進数
####例:5C7の10進数
C = 12

5 × 256 = 1280
12 × 16 = 192
7 × 1 = 7

1280 + 192 × 7 = 1479
シャッター音なしのカメラアプリを作ってみた

# 作るに至ったわけ

日本や韓国などではスマホ（ケータイ含め）で写真を撮影しようとするとシャッター音が鳴りますが、海外で販売されたスマホ（iPhone含め）はシャッター音は鳴りません。インスタなどでレストランなどの静かなところで撮影する時など、あの音が鳴ると気を使いますよね。マナーからだという意見もありますが、スクリーンショットもなる必要はありません。法律で決まってるわけでないので、徐々にこの慣習がなくなっていくといいのになと思います。

というわけで、iOS向けにマナーモード時はシャッター音がならないカメラアプリを作ってみました。

# 無音カメラを作る方法

- ビデオ撮影モードで静止画をキャプチャする方法

割とこの方法は一般的なようでぐぐると多く見つかります。ただ、静止画モードではないため解像度が劣ったりといろいろ制限があります。

- 逆位相の音を再生する方法

ノイズキャンセリングと同じ方法ですが、ジャストのタイミングで再生しないといけないため、難易度は高いようです。

- シャッター音のサウンドファイルを削除する方法

Jailbreakしかできません。
などなど。今回、どうやったかはまだ言えません。

# 審査を乗り越えるには

Appleの審査が通るまで約１ヶ月かかりました。基本的には、ユーザーに気付かないような録音、録画、撮影などは許可できないというもの。シャッター音を消すことはできませんと。特に、アプリ名からも連想させてはいけませんと。最初は「サイレントカム」っていう名前でした。

だって、AppStore見ると「無音カメラ」とかもろいってるアプリだってあるわけで、なんで？？？って感じでした。アプリの説明にも思いっきり書いてあるし、、神であるAppleが言うのだから仕方ありません。

未だ謎ですが、

- アプリ名には「無音」「サイレント」と言った連想するキーワードは入れない
- シャッター音をなるモードも用意する（今回のようにマナーモード以外はシャッター音鳴ります）

と言うのが今回の審査でわかりました。

# 使ったフレームワーク

- AVFoundation.framework

ちょっと面倒でしたが、たまたまみたサンプルがこれだったのと、撮影画面とかをカスタマイズできたほうがいいかなと思ったのが理由です。

# そしてリリース

C'zCam
https://apps.apple.com/jp/app/czcam/id585273753 

静か目、静かカメラ、静かカメ、、、というわけで、C'zCamです。
よかったら試してみてください。無料です。

# 参考

https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/avcam_building_a_camera_app
基本情報技術者　テクノロジ系　第8章 システム開発技術⑥



# テスト技法と評価

## ブラックボックステスト
入力値と出力値の対応関係が正しいかどうかを検証する手法です。

## 同値分割
代表となる数値を選んでテスト回数を減らす方法

仕様からデータを“⁠意味のあるグループ⁠”（同値クラス）に分類し，各グループから代表値を選ぶ技法です。

例えば、「20歳未満」という条件で行われる処理があるとき

その箇所を0歳から19歳まで20回テストする代わりに
15歳の場合のみをテストすることで大幅にテスト回数を減らすことができる。

## 限界値分析
同値クラスの境界値をデータとする手法

境界値分析(限界値分析)は、同値クラスの境界値付近には、バグが集中するという経験則に基づいている。
例えば、入力条件として「0以上99未満」のような範囲指定があるとき、設計書で「以下」と「未満」を取り違えたり
コーディングで「≧」と「＞」の記述ミスを犯したりという誤りが起こりやすい。

出力についても同値クラスの上限値や下限値は
経路分岐やロジックが正しいかどうかが端的に表れるポイントとなる。

## ホワイトボックステスト
プログラムの流れを検証する技法

## 命令網羅
対象プログラム中のすべての命令を必ず一度は実行すること。 
また、全命令のうちテストされた命令の割合を命令網羅率という。

## 判定条件網羅
プログラムの判定条件で
真と偽を少なくとも一回は実行する
ようにテストデータを作る。

## 条件網羅
プログラムの格条件で
真と偽を少なくとも一回は実行する
ようにテストデータを作る。

## 判定条件/条件網羅
上記二つを満たすように行う。

## 複数条件網羅
各条件の真偽の全ての組み合わせでテストデータを作る。

## 信頼度成長曲線
発見されたエラーの時間による累積推移のグラフ
ロジスティック曲線、ゴンペルツ曲線とも言います。

中盤で多く
序盤と終盤で少なくなります

このグラフと比べることで品質の良し悪しを見ます。

序盤で多すぎると品質が悪く
少なすぎるとエラーを見つけてないと判断できます。
【PHP】headerでリダイレクトしよう

#はじめに
開発はフレームワーク（Laravel）を使いまくり、その中身（PHP）のことはあんまりわかってなかったので、
その勉強も兼ねて、PHPだけでリダイレクト処理を作ってみたときに学んだことをまとめてみます。

#headerとは
生の HTTP ヘッダを送信する関数。
要するに、リダイレクトさせることができるPHP標準の関数です。笑

#使用例
例えば、フォームから投稿する時を考えます。
まず、投稿ページからフォームで_POSTを飛ばします。

```PHP:create.php
<form action="save.php" method="POST">
	<input type="text" name="post" value="">
	<input type="submit" name="送信">
</form>
```

そして、送った先でDBに接続して、保存の処理を行います。
こちらについては、またいつか詳細をまとめたいと思います！！
そして、headerで一覧ページ（index.php）にリダイレクトします。

```PHP:save.php

//DB接続して、保存の処理

header('Location: index.php');
exit;
```

雑ですが、このように使います。
ちなみにですが、exitは必須のようなので注意しましょう。

##外部サイトへリダイレクト
下記のように使用すると、URLを指定し外部のサイトに飛ばすことも可能です。

```PHP:
header("Location: http://www.example.com/");
exit;
```


以上です！！！
**ここまで読んでいただきありがとうございました！！
疑問、気になるところがございましたら、質問、コメントよろしくお願いします！！！**
pyenvとcondaで環境構築

# エラー pyenv: conda: command not found
となる場合

`conda --versions`
`pyenv: conda: command not found`




## 解決策　bashの設定ファイルに書き込む

```bash
echo 'export PATH="~/.pyenv/versions/anaconda3-5.2.0/bin/:$PATH"' >> ~/.bash_profile
source .bash_profile
```

fishはbash,zshとpathの書き方が違うようなので注意.今回はおとなしくbashを使い,sourceで読み込んだ.

# エラー conda activateできない
fishの設定ファイルに使うanacondaのバージョン(今回はpyenvで管理している)のpathを書き込む

```
echo "source (conda info --root)/etc/fish/conf.d/conda.fish" >> config.fish
conda --version                                                                                                           
conda 4.5.11
```

しかし,fishでセッションを切り替えたりするとよくcondaが使えなくなる.よくわからないけど以下のようにbashで設定ファイルを読み込むと治る.教えて偉い人.

```
bash-3.2$ source ~/.bashrc ~/.bash_profile ~/.bash_profile.pysave
```

# 環境構築の流れ
```
pyenv versions
pyenv local anaconda3-5.3.0
conda create -n job_opencv python=3.7.0
conda version
conda list
conda activate job_opencv
conda deactivate
```


# 参考サイト
https://org-technology.com/posts/fish-conda.html
https://qiita.com/Ryuichirou/items/bf3cf227a20e6300fa7a
https://qiita.com/taaaaak/items/2294d909bea910b1d818
https://qiita.com/najayama/items/5ae5fbe2c87568d98987
https://blog.mktia.com/how-to-install-anaconda-in-macos/
https://qiita.com/nsas454/items/c5bd3a535205d434234e
https://qiita.com/masatomix/items/b1a0ec216ea943c86a2a
https://qiita.com/ysdyt/items/5008e607343b940b3480
SwiftをGoogle Colabで実装するための準備

SwiftをGoogle Colabで実装する手順を紹介します。

大まかなSTEPは **４つ** です。

1. Colabを作成し、Google Driveに保存する
2. その他のアプリから、適当なエディタでファイルを開く
3. `"kernelspec":{"name":"python3","display_name":"Python 3"}` を `"kernelspec":{"name":"swift","display_name":"Swift"}` と書き換える
4. Google Colabで開き、Swiftコードの動作確認をする


![createColab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168714/47ab80c7-f1a3-ccc7-ef9f-8c19a90198c4.png)


![selectEditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168714/1da7d680-dd0c-2323-7b24-058b51cebc1c.png)

![tapEditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168714/b3a7515e-3ddd-d409-6740-b408a74719db.png)

![modifyCode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168714/adaee58c-ab61-4e1c-7f3a-9cf30697bc62.png)

![colab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168714/36d448c5-98d2-4228-db9a-db09d5a59c16.png)
AWS Amplify を日本語化してみた

# はじめに

このページでは Amplify の初期画面で作成した認証画面を日本語化するための方法をまとめました

※ 翻訳するメッセージについては以下のページを参考にさせていただきました。
https://www.aruse.net/entry/2019/03/25/225802

# 開発環境
* Windows 10
* nodist(nodeのバージョン管理)
    * node 12.13.0
* VSCode

# Amplify で多言語化対応する

## I18n で言語設定をしてみる

Amplify には I18n ライブラリが初めから用意されている。
そのためライブラリを import することで、多言語化対応することが可能ということがわかった。

【参考】
https://aws-amplify.github.io/docs/js/i18n

ということで、前回の投稿したソースコードを少し修正してみた。

``` main.js
import Amplify from "aws-amplify";
import { I18n } from "aws-amplify";
import aws_exports from "./aws-exports";

I18n.setLanguage("ja");
以下省略
```

これで日本語化完了したので、さあ実行してみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/6f77cb17-4df8-f2c9-7fe3-d1f609273127.png)
・・・世の中そんなに甘くなかったよ

sample で fr と書いているけれど、fr にしても変更しない・・・
ということは自分で何かしら定義しないといけないことがわかってきました。

## 自分自身の辞書を作成して設定する

リファレンスを読み進めると、以下の用なメソッドを見つける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/571c37ef-eda8-ced2-62f6-3c86ccc8ce85.png)

どうやら必要な言語については自分で辞書を作成して設定する必要があるらしい

```src/i18n/amplify/messages.js
export const messages = {
  ja: {
    "Back to Sign In": "サインイン画面に戻る",
    Confirm: "確認",
    "Confirm Sign Up": "サインアップの確認",
    "Confirmation Code": "確認コード",
    "Create Account": "新規登録",
    "Create a new account": "アカウントの新規登録",
    "Create account": "新規登録",
    Email: "メールアドレス",
    "Enter your code": "確認コードを入力してください",
    "Enter your password": "パスワードを入力してください",
    "Enter your username": "ユーザー名を入力してください",
    "Forget your password? ": "パスワードをお忘れの方 ",
    "Have an account? ": "アカウント登録済みの方 ",
    Hello: "こんにちは ",
    "Incorrect username or password": "ユーザー名またはパスワードが異なります",
    "Lost your code? ": "コードを紛失した方 ",
    "No account? ": "アカウント未登録の方 ",
    Password: "パスワード",
    "Phone Number": "電話番号",
    "Resend Code": "確認コードの再送",
    "Reset password": "パスワードのリセット",
    "Reset your password": "パスワードのリセット",
    "Send Code": "コードの送信",
    "Sign In": "サインイン",
    "Sign Out": "サインアウト",
    "Sign in": "サインイン",
    "Sign in to your account": "サインイン",
    "User does not exist": "ユーザーが存在しません",
    Username: "ユーザー名",
    "Username cannot be empty": "ユーザー名は必須入力です",
    "Username/client id combination not found.": "ユーザー名が見つかりません"
  }
};
```
※ フォーマットチェックをデフォルトのままで整形するとすごい悲惨な状態に・・・次までの課題とします
また上記メッセージについては冒頭のページを参考にさせていただきました。

```main.js
import Amplify from "aws-amplify";
import { I18n } from "aws-amplify";
import { messages } from "./i18n/amplify/messages";
import aws_exports from "./aws-exports";

Amplify.configure(aws_exports);
I18n.putVocabularies(messages);
I18n.setLanguage("ja");
以下省略
```
辞書を設定して日本語の辞書を使用する処理を追加して起動するとエラーが発生しなかったので、ページにアクセスをしてみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/34d8eaf9-4cf8-95ec-0bbc-5b3659cd469c.png)

日本語化されていることが確認できました！
翻訳する文言が足りなかったりすると英語が表示されたので、画面の確認作業は必要になりそうですね。。。:sweat_smile:

パスワードリセットのリンク先のページやエラー文言も無事翻訳されていました

# まとめ（翻訳するには）

Amplify では I18n というライブラリを用いて翻訳を行う
その際は以下の準備を行う必要がある

* 使用する言語の辞書マップを作成する
* どの言語を用いるか明確に定義する
[rubocop]　インデントを揃えるgem【初学者おすすめgem】

#概要
今回は効率よくインデントを揃えるgemの紹介をします。

プログラミングを学習してはや６ヶ月経ちました。
少しづつ転職も始め、ある企業様から私のgitをみてインデントがオカシイと非常にありがたいフィードバックを頂きました。
そこで**第三者からみて**コードの読みやすさの大切さに改めて気づきました。
##こんな人に読んでほしい！！
- 現在、プログラミングを独学またはプログラミングスクールで学び、転職しよう！って思っている方。
- インデントを効率よく揃える方法を知りたい！って思っている方。
- 綺麗なコードを書きたい！って方。


#綺麗なコードを書く重要性
エンジニアとして働くにあたり、
**他の人が読みやすいコードを意識する**必要性があると思いました。

##理由
（１）プロダクトの共同開発
（２）万が一、担当から外る or 担当のメンバーが増えた際に、プロダクトのスムーズな引き継ぎ
（３）バクが起きた際に、可読性が高いと解決できるスピードが早まる

※あくまで私が思い浮かんだ理由をあげました。もしかしたら他にも理由があるかも知れません。

以上の理由から、現場に入った後を考えると、他の人が読みやすいコードが重要性を増します。
今回は他の人が読みやすいコードにするための１つとして「インデントを揃える」をピックアップしました。

#rubocupとは？
RuboCopは、あなたのプロジェクトのrubyコードが「コーディング規約どおりに書かれているか」をチェックする静的コード解析ツールです。
その１つの機能として、インデントを揃えてくれます。

#使い方
##導入
```gemfile.
group :development do
  gem 'rubocop', require: false #追記
end
```
gemファイルのdevelopmentに**gem 'rubocop', require: false**を追記します。

その後にターミナルで
`$ rails bundle install`を忘れずにします。

##インデントを揃えよう
ターミナルで
`$ rubocop 修正したいファイル名`をすると自動修正されます。
【例】　`$ rubocop sample.html.erb`
これで修正されたと思います。
実行するとこのような感じで出ると思います。
<img width="771" alt="スクリーンショット 2020-02-04 22.28.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504349/44d35b59-c610-c8ba-a30d-3a08cbe71ab6.png">
出てきた内容を見ると、
`[Corrected] Layout/IndentationWidth: Use 2 (not 4) spaces for indentation.`
インデントを４つではなくて２つに修正しました。
こんな感じで実行後には、実行した内容を書いてくれてます。

rubocopは「ある程度」まで修正できます。どういう風に修正したらいいのかわからない場合はスキップされるみたいです。


#参考URL
[RuboCopをRailsオプションやLintオプションで使ってみよう](https://blog-ja.sideci.com/entry/2015/03/12/160441)
[公式ドキュメント](https://github.com/rubocop-hq/rubocop)
[【初心者向け】Railsの品質を上げるRuboCopのインストールと使い方！](https://kitsune.blog/rails-rubocop)

#最後に
まだまだ勉強不足なところがありますので、
アップデートできた知識は追加で記載していきます。

もし、何か修正点とかございましたらコメント等
大変恐縮ですが、宜しくおねがいします。
PostgreSQLでテーブルやビューの一覧を得て1行づつ処理したい

テーブルとビューの一覧を得る
-------------------------

`current_schema()` はしばしば `'public'` だと思いますが、適宜置き換えてください。

### テーブルの一覧を得る（見るだけなら `\dt` でもよい）

``` sql
SELECT table_name FROM information_schema.tables WHERE table_schema = current_schema() AND table_type='BASE TABLE';
```

### ビューの一覧を得る

``` sql
SELECT table_name FROM information_schema.tables WHERE table_schema = current_schema() AND table_type = 'VIEW';
-- もしくは
SELECT table_name FROM information_schema.views WHERE table_catalog = current_database() AND table_schema = current_schema();
```


### テーブルとビューの一覧を得る



``` sql
SELECT table_name FROM information_schema.tables WHERE table_schema = current_schema() AND table_type IN ('BASE TABLE', 'VIEW');
```

追記: 最初はtabale_typeを無視していたが、BASE TABLEとVIEWだけではないので、ちゃんと設定したほうが良さそう。 refs: [第37章 情報スキーマ - PostgreSQL 11.5文書](https://www.postgresql.jp/document/11/html/infoschema-tables.html)


### おまけ：テーブルorビューの定義を見る（SELECTするカラム名を覗きたいとき）

```
\d テーブル名
```

テーブル名やビュー名を1行づつ処理したい
------------------

`psql`の`-A -t`オプションをつけると、パイプで繋いでコマンドで処理できます。雑に権限つけたいときなど。

``` bash
DATABASE=データベース名
ROLENAME=ロール名
psql -U postgres -d $DATABASE -A -t -c "SELECT table_name FROM information_schema.tables WHERE table_schema='public'" \
  | xargs -I{} psql -U postgres -d $DATABASE -c "GRANT ALL ON {} TO $ROLENAME"
```
【Laravel】failed_jobsに入ったジョブをリランさせるSQL

Laravelでdatabaseキューを使っている場合、失敗したジョブは`failed_jobs`テーブルに入ります。
リラン（再実行）したい場合は、再度`jobs`テーブルに入れてあげればキューワーカーが再実行してくれます。

```sql
INSERT INTO jobs (
     queue
    ,payload
    ,attempts
    ,reserved_at
    ,available_at
    ,created_at
) SELECT 
	 queue
	,payload
	,0
	,null
	,UNIX_TIMESTAMP(now())
	,UNIX_TIMESTAMP(now())
   FROM failed_jobs
  WHERE id = X
;
```

上記のようなSQLで`failed_jobs`に入ったレコードを`jobs`に戻せます。

---
SQLを使わなくてもartisanコマンドを使えば同じことができます（@mindwoodさんありがとうございます）。

`php artisan queue:retry {ID}`
失敗ジョブをID指定で再実行

他にも

`php artisan queue:failed`
失敗ジョブの確認

`php artisan queue:retry all`
失敗ジョブをすべて再実行

`php artisan queue:forget {ID}`
失敗ジョブをID指定で削除

`php artisan queue:flush`
失敗ジョブをすべて削除

があります。
リモートデスクトップで接続したWindows7をシャットダウンする方法

# はじめに
リモートデスクトップの接続先がWindows10ならシャットダウンは可能だが、**Windows7ではログオフまでしかできません。**
ですが、下記のコマンドをコマンドプロンプト上で実行すればシャットダウンは可能です。

# コマンド
```
shutdown /s /t 0
```

 - 「-s」がシャットダウン（電源オフ）指示するオプション
 - 「-t」がタイムアウトでの実行を指示するオプション
SciPy 1.4 のソースビルドには pybind11 が必要

* 環境: Debian 10 (native/WSL), Python 3.8

普段 scipy を pip でインストールするときにソースビルドして [Intel-MKL とリンク](https://qiita.com/osanshouo/items/7a729aabf65a70ad6762) していたのですが, scipy 1.4 からビルドに失敗するようになりました. なんでかなと思ったら, [この issue](https://github.com/scipy/scipy/issues/11241) で述べられているように, scipy 1.4 から [pybind11](https://github.com/pybind/pybind11) が必要になったからでした. なのでアップグレード前にインストールします.

```terminal
$ pip3 install pybind11
$ pip3 install --upgrade --no-binary :all: scipy
```

これでできました.

```terminal
$ pip3 freeze | grep scipy
scipy==1.4.1
```

その他の要求については [公式のドキュメント](https://docs.scipy.org/doc/scipy-1.4.1/reference/building/index.html) を参照してください.
Tensorflow.Kerasモデルで TPU/GPU/CPU を自動的に切り替える

# はじめに

この記事は、TensorFlow.kerasを使用していたとき、ハードウェア情報（主にColaboratoryのランタイム情報）を読み取って、TPUとGPU（一応CPUも）を自動的に切り替えて実行できるプログラムを書く方法をまとめています。 ~~（手動でコメントアウトするのが面倒になってきたため）~~

大体、[公式サイト](https://cloud.google.com/tpu/docs)（Google Cloud, Cloud TPU Docs）掲載の[KerasとTPUでMNIST](https://colab.research.google.com/github/tensorflow/tpu/blob/master/tools/colab/keras_mnist_tpu.ipynb)を要約した内容です。tensorflow.kerasに慣れている方は、参照元を読んだほうがわかりやすいかもしれません。

補足・注意など

- 動作検証はColaboratory上で実施しています。
- たぶんtensorflow ver2にも対応しています。
- tensorflow.keras 用のコードです。（puer keras や tensoflow ではない）
- 記述（特に解説）に誤りがある可能性があります。

# TPU/GPU/CPUを自動的に切り替えるコード

```python
# ハードウェア情報取得
import tensorflow as tf

try:
  tpu = tf.distribute.cluster_resolver.TPUClusterResolver() # TPU detection
except ValueError:
  tpu = None
  gpus = tf.config.experimental.list_logical_devices("GPU")

if tpu:
  tf.tpu.experimental.initialize_tpu_system(tpu)
  strategy = tf.distribute.experimental.TPUStrategy(tpu, steps_per_run=128) # Going back and forth between TPU and host is expensive. Better to run 128 batches on the TPU before reporting back.
  print('Running on TPU ', tpu.cluster_spec().as_dict()['worker'])
elif len(gpus) > 1:
  strategy = tf.distribute.MirroredStrategy([gpu.name for gpu in gpus])
  print('Running on multiple GPUs ', [gpu.name for gpu in gpus])
elif len(gpus) == 1:
  strategy = tf.distribute.get_strategy() # default strategy that works on CPU and single GPU
  print('Running on single GPU ', gpus[0].name)
else:
  strategy = tf.distribute.get_strategy() # default strategy that works on CPU and single GPU
  print('Running on CPU')
print("Number of accelerators: ", strategy.num_replicas_in_sync)


# モデル作成やモデルロード、モデルコンパイル時に、with strategy.scope()で囲む
from tensorflow import keras
with strategy.scope():
    model = make_model()

```

特に難しいことは考えずに以下の２点を実行すれば、ハードウェアに応じて、TPU/GPU/CPUを勝手に切り替えてくれるようになります。

1. `import tensorflow as tf` 〜`print("Number of accelerators (略`までをコピペで貼り付ける
2. モデル定義やモデル読み込み部分を`with strategy.scope():`のスコープ内に入れる

# 解説っぽいなにか

- 優先度
    - プログラムのとおり「TPU > multi GPU > single GPU > CPU」の順で選択します。
- `tf.distribute.cluster_resolver.TPUClusterResolver()`
    - TPUのハードウェア情報を獲得します。TPUが利用できない環境ではエラーが発生します。
- `tf.config.experimental.list_logical_devices("GPU")`
    - GPUのハードウェア情報を獲得します。返り値はリストです。なお、"CPU"を与えれば、CPUの情報も取得できます。
- `if tpu:`以降
    - それぞれのデバイスの定義方法です。TPUとmultiGPUが特殊で、「こう書くものだ」と覚えてしまったほうが良いでしょう。
- `tf.distribute.get_strategy()`
    - ハードウェア情報を参照しているのではなく、インストールされているtensorflowがGPUに対応しているかを見ています。
    - つまり、実行時でなく、tensorflowインストール時に決まる値です（のはずです）。
    - GPUを搭載しているのに、上手く行かない場合はCUDAのインストール周りを見直しましょう（参考：[GPU support](https://www.tensorflow.org/install/gpu?hl=ja)）

# おわりに

この記事では、tensorflow.keras で、ハードウェアの状況に応じて、TPU/GPU/CPUを自動的に切り替える方法を解説しました。
tensorflow.kerasでTPUを活用して、より良いディープラーニングライフを。
Next.jsのルーティングでは、Linkコンポーネントを使ったほうが良い理由

#Next.jsでのルーティング方法
二つあります。
①

```
<a href="/about">About us</a>
```
②

```
<Link href="/about">
   <a>About us</a>
</Link>
```

#それぞれの動き

①のaタグでルーティングする場合、リロードしてしまいます。
②のLinkコンポーネントを使うと、リロードしないかつ同じインスタンスで遷移するので、明らかに①より早くなります。

下記のコードを使って試してみてください。
ChromeコンソールのNetworkタブを見れば、明らかに①の方がゴニョゴニョしているのが分かります。

```
import React, { Component } from "react";
import Link from "next/link";

class Home extends Component {
  render() {
    return (
      <>
        <div>
          <Link href="/">
            <a>Home</a>
          </Link>
          <Link href="/contact">
            <a>Contact</a>
          </Link>
          <Link href="/about">
            <a>About us</a>
          </Link>
          <Link href="/users">
            <a>Users</a>
          </Link>
          <a href="/">Home</a>
          <a href="/contact">Contact</a>
          <a href="/about">About us</a>
          <a href="/users">Users</a>
        </div>
        <h1>Hello</h1>
      </>
    );
  }
}

export default Home;
```
LDAPSを使用したRedmineとのAD連携設定

#注意
この記事は知識・経験ともに乏しすぎる新人SEが書いています:relaxed:

#イントロ
3月のMicrosoftのセキュリティアップデートに伴い、
「LDAP署名」、「LDAPチャネルバインディング」がデフォルトで有効化されることになりました。
↓
https://msrc-blog.microsoft.com/2019/10/02/ldapbinding/

影響を周知してるソフトウェアの中にはLDAP→LDAPSにすればいけるって書いてあるのもありました。
Redmineはどうなのか、検証したのでここに残しておきます。

#前提
・Windows Server 2016 Standard Editionを使用
・Redmineインストール済み
・サーバのローカルセキュリティポリシーを「LDAP署名必須」に変更　※
・レジストリから、「LDAPチャネルバインディング」を有効化　※

※のやり方は、ググったらでてきました！手抜きですみません！

#やってみましたよい！
Redmineのインストールが完了した後は、初期設定などもろもろ行って、、、
ログインが完了している段階です。

ホーム画面から、管理＞LDAP認証＞新しい認証方式に進みます。
そこで、入力画面が出てくるので、、、
↓
![redmine_LDAPS_設定値.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579450/fc5d6189-3464-cb2e-8f15-4050a2fbefc3.png)

こういった感じで入力します。
http://guide.redmine.jp/RedmineLDAP/#ldap_1
↑
LDAP認証に関するRedmineの公式サイト。
項目の入力内容についてはこれを参照。

#設定完了。テスト！
項目の入力が完了したら、
認証方式一覧の画面に戻り、今設定した認証方式の右側にある、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579450/c356a307-8245-b058-fe64-60c7180d6cac.png)
↑これの「テスト」をクリック

ここで
![ldaps_success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579450/336f7f5b-5572-5bef-6ca2-d74075f4329a.png)
↑これが表示されれば成功！

#結論
「LDAP署名」「LDAPチャネルバインディング」
こちら両方とも既定で有効化されたとしても、認証をLDAPSにすれば大丈夫そうです。
LDAP→LDAPSの変更については、項目の設定で、
「ポート番号」、「LDAP or LDAPS」を変更すればいいので簡単そう！

#ちなみに・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579450/c3c7c77e-7397-04c7-51d5-9d1e80e87d42.png)
↑
このエラーが出る場合
・対象ユーザーがADサーバで管理されていない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579450/18e5183e-237e-89ca-a37a-ab6531bc1560.png)

↑
このエラーが出る場合
・ポート番号が間違ってる（おそらく）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579450/ce77d6b4-3c7d-8114-6b9a-88b2e4b67cdb.png)

↑
このエラーが出る場合
・LDAPの署名を必須としている環境において認証方式がLDAPに設定されている。
$_ENV取得でエラーになった時に確認した設定まわり

php7.1からphp7.3にバージョンアップしたら
``$_ENV``というスーパーグローバル変数を使って環境変数を取得している箇所でエラーが起こるようになりました。

どうやら$_ENV自体が空で取得できていないようだったので、
調査してみたところ

``$_ENV``はphp.ini の ``variables_order`` という設定に ``E`` が含まれていないと使えない。ということでした。
含まれていないと $_ENV は単に空の配列になるようです。

> Comments for this page seem to indicate getenv() returns environment variables in all cases.
For getenv() to work, php.ini variables_order must contain 'E'.

https://www.php.net/manual/ja/reserved.variables.environment.php#107413


ということでphp.initの値を確認したら

```
variables_order = "GPCS"
```

となっていたのでEをつけたら読み込めるようになりました。

```
variables_order = "EGPCS"
```

そもそもENVは本番サーバなどでは推奨されないようです。
これは推奨としてphp7.3のデフォルト値なのか分かりませんが、パフォーマンスにも影響してくるようですね。
Fragmentによる画面遷移

1 Activity
Activityは、Fragmentを入れる入れ物のようなもので、紙芝居の外枠のようなもの
  

      public class MainActivity extends AppCompatActivity {
               @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);

               if (savedInstanceState == null) {
                    FragmentManager manager = getSupportFragmentManager();
                    FragmentTransaction transaction = manager.beginTransaction();
                    transaction.add(R.id.container, new FirstFragment());
                    transaction.commit();
               }     
      }
    }

２　１つ目のFragment

        public class FirstFragment extends Fragment {
          @Override
         public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_first, container, false);

    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Button btn1 = view.findViewById(R.id.button1);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentManager fragmentManager = getFragmentManager();

                if(fragmentManager != null){
                    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                    // BackStackを設定
                    fragmentTransaction.addToBackStack(null);

                    fragmentTransaction.replace(R.id.container, new SecondFragment());
                    fragmentTransaction.commit();
                }
            }
        });
    }
    }

ボタンを押すと、２つめのFragmentに画面遷移します。
3 SecondFragment

      public class SecondFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_second, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Button btn2 = view.findViewById(R.id.button2);
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // １つ前に戻る
                FragmentManager fragmentManager = getFragmentManager();
                fragmentManager.popBackStack();
            }
        });
    }
}

ソースはここ　https://github.com/Tetsuya922/Fragment_Start
NWスペシャリスト試験勉強方法のメモ

# はじめに
2019年度秋のネットワークスペシャリスト試験に合格しました。
ネットワーク未経験ですが合格することができたのでポイントをまとめておきます。

# 受けた人に関して
理系学部卒。社会人2年目のエンジニア。
業務はバックエンド寄りです。
業務でネットワークを触る機会はあまりありませんでした。

## IPA資格取得状況
2014年春　基本情報技術者取得
↓
2019年春　応用情報技術者取得
↓
2019年秋　ネットワークスペシャリスト取得

## 背景
IPA資格の取得をしている会社だったので。
高度試験であればどれでもよかったのですが、
ネットワークに苦手意識があったので克服するべくNWスペシャリストを選択しました。
あとは高度の中では一番使用する場面が多そうな知識体系なので。。

# 勉強方法
## 前準備
今までのIPA対策で、概要はふんわり理解していたものの、
深い内容に関しては理解していなかったので、試験勉強の前に本やWebサイトでネットワークそのものに関して学習しました。

[xTECH 図解で学ぶネットワークの基礎](https://tech.nikkeibp.co.jp/it/article/COLUMN/20070619/275208/)
毎日業務の合間に1、2ページ程度読んでいました。
2007年で古めの記事なのですが、ネットワークの中でも根幹技術に関するもので、
現代とそう差異はないので問題ありません。
図解が多く初心者でも理解しやすいのでオススメです。
なお、各セクションごとに修了テストがあるのですが、リンク先が死んでいるようです。。

[マスタリングTCP/IP 入門編　第5版](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP-%E5%85%A5%E9%96%80%E7%B7%A8-%E7%AC%AC5%E7%89%88-%E7%AB%B9%E4%B8%8B%E9%9A%86%E5%8F%B2-ebook/dp/B00MLUGZKG/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0tcp%2Fip&qid=1576989420&s=digital-text&sr=1-3)
暇なときに読み進めて、大体試験の1か月前に読み終わりました。
堅苦しい見た目なのですが、時代とともにネットワークの仕組みが変換する様子が知れて、
技術書に苦手意識がある自分でも読み切ることができました。
ネットワークの規格でIEEE802.xxなんてのがありますが、
1980年2月から規格を定める活動を始めたからこんな名前になっているんだな～とか、
背景を知ることができるので、暗記も少し楽しくなる気がします。

## 試験対策
### 午前Ⅰ
応用情報を同年春に取得していたため、免除でした。

### 午後Ⅱ
[過去問道場](https://www.nw-siken.com/nwkakomon.php)でひたすら過去問を解いていました。
試験前日の正答率は85%程度でした。

### 午後Ⅰ、午後Ⅱ
NW試験では有名なネスペ娘シリーズで過去問を解きました。

[ネスペの基礎力　－プラス20点の午後対策](https://www.amazon.co.jp/%E3%83%8D%E3%82%B9%E3%83%9A%E3%81%AE%E5%9F%BA%E7%A4%8E%E5%8A%9B-%EF%BC%8D%E3%83%97%E3%83%A9%E3%82%B920%E7%82%B9%E3%81%AE%E5%8D%88%E5%BE%8C%E5%AF%BE%E7%AD%96-%E5%B7%A6%E9%96%80-%E8%87%B3%E5%B3%B0-ebook/dp/B071SL8GTY/ref=cm_cr_arp_d_product_top?ie=UTF8)
[ネスペ30 知](https://www.amazon.co.jp/%E3%83%8D%E3%82%B9%E3%83%9A%E3%81%AE%E5%9F%BA%E7%A4%8E%E5%8A%9B-%EF%BC%8D%E3%83%97%E3%83%A9%E3%82%B920%E7%82%B9%E3%81%AE%E5%8D%88%E5%BE%8C%E5%AF%BE%E7%AD%96-%E5%B7%A6%E9%96%80-%E8%87%B3%E5%B3%B0-ebook/dp/B071SL8GTY/ref=cm_cr_arp_d_product_top?ie=UTF8)
[ネスペ 27 礎](https://www.amazon.co.jp/dp/477418067X/ref=sspa_dk_detail_1?psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEyUFdPVzI4NkNYTTI5JmVuY3J5cHRlZElkPUEwMzM2Njg2MTNGQ1IzVlVRTERCRSZlbmNyeXB0ZWRBZElkPUFKRjNFUlJKMlBPWk4md2lkZ2V0TmFtZT1zcF9kZXRhaWwmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)

順番はネスペの基礎力→ネスペ知→ネスペ礎　でしたが、知と礎はどちらが先でも問題ないと思います。
基礎力はNWに出るトピックを幅広く解説してくれているので、
プラス20点のために仕上げに解くよりは、一番先に読んで基礎知識を固めたほうが
過去問にスムーズに取り組むことができます。

ネスペ娘シリーズには、過去の受験者の回答例と、
どうしてその回答が正解/不正解なのか解説されているため、
回答に必要なポイントを押さえておくと、本番でも回答を作りやすいと思います。
過去問の数をこなすよりは、同じ問題を2週以上して、
模範解答に自力でたどり着けるようになった方が良いです。


# 所感
ネットワークと聞くと、どこも複雑に絡み合っていて手を出しづらい印象を受けると思うのですが、
勉強してみると階層が分かれているのでとても勉強しやすかったです。
最近の動向として、クラウドが主流になっているので
ロードバランサを使用したXFF等問題が午後問題で出てきていますが、
TCP/IPの基礎さえ押さえておけば難しい内容ではありません。

業務ですぐ使うものではなくても、ネットワークの知識を身に着けておくと
問題発生時にこのレイヤーで問題が起きていそうだから、
こういうアプローチができるな、この部署の人に聞こう等、
ざっくりとですが問題の切り分けができるようになるのでオススメです。
何なら合格までいかないにしても、ネットワークの知識はつけると楽しいので、ぜひ受験を。
【Unityエンジニアになる！】Unity・C#の勉強スタート

初投稿。
Unityエンジニアになるべく、Unity・C#の勉強を本格的にスタートしました。
前職では通信会社で法人営業をしており、プログラミングとは無縁でした。
しかし独学で少しプログラミングを勉強していました。

そんな私がこれまでどんな勉強をしてきて、これから何を学んでいくのか、
これから本格的にプログラミングを学んでいく前にメモを残しておこうと思います。


【プロフィール】
・４年制普通大学 商学部 ：経営学・競争戦略を勉強。
・学生時代にベンチャー企業でインターン ：中小・ベンチャー企業社長にインタビュー。
・大学卒業後通信会社に就職　：法人営業。
→各組織でプログラミングに触れた経験は０。


【独学で勉強してきたこと】
〜大学４年時〜
○カレンダー
2018.10~11 　　　　ProgateでHTML・CSS・JavaScript(jQuery)・Pythonを学習
2018.12~2019.01　 Python Djangoのチュートリアル（投票アプリの作成）
2019.02~03 　　　「Python3 Django2.0 入門 Pythonで作るWebアプリケーション開発入門」
　　　　　　　　　 （RSSリーダーアプリの作成）
○学んだこと
HTML・CSS・JavaScript（jQuery）の基礎 / BootStrapの基礎
pythonの基礎 / Djangoの基礎
Git/GitHub
コマンドプロンプト
（ネットでコマンドを調べてもMac・Linuxのものばかり出てきたので、WindowsPCに仮想マシン入れてUbuntu使ったりしてました）


〜社会人〜
○カレンダー
2019.05~07　　　「jQuery レッスンブック jQuery2.x/1.x 対応　ーソシム」
2019.08　　　　　　ProgateでSwiftを学習
　　　　　　　　　「たった2日でマスターできるiPhoneアプリ開発集中講座 XCode10 Swift4.2　
　　　　　　　　　　　ーソシム」
2019.10　　　　　「Unityの教科書 2D&3Dスマートフォンゲーム入門講座　ー北村愛美 著」
　 　 　 　　　　　　(サンプルアプリ６個)
2019.11　　　　　「ARKitとUnityではじめるARアプリ開発　ー薬師寺国安 著」(サンプルアプリ13個)
2019.12~2020.01　ARFoundationを触るもオクルージョン・人体検知がうまくできず挫折中

○学んだこと
JavaScript（JQuery）の基礎復習
Swiftの基礎 / Xcodeの基礎
Unityの基礎 / C#の基礎
Unity×ARkit
Unity×ARFoundation →挫折中


【これから学んでいくこと】
Unity・C#を使ってオリジナルアプリの作成
Git/GitHubを再勉強
（Blender?）
期間は、努力目標：2ヶ月、標準目標：3ヶ月

以上です。
Unityエンジニアになる！！
React + Jest + VS Code 環境でESLint の簡易設定をする


## ESLintとは
公式より、
> ESLint is a tool for identifying and reporting on patterns found in ECMAScript/JavaScript code, with the goal of making code more consistent and avoiding bugs.

<b>コードの一貫性を保ちバグを防ぐことを目的とした、JSコードのパターンを検知・報告ツール</b>、とのこと。類似のものにJSHintがある。

私はVSCode上でコードの間違いを報告して欲しかったので、初めて設定してみました。VSCode上で自動でリンティングするための最低限の設定になるので、とりあえず簡単に使ってみたい人の参考になればと思います。

最終的なファイル構成は以下の様になります。といっても`.eslintrc.js`を足すだけです。

```
.
├── .eslintrc.js
├── node_modules
├── package-lock.json
├── package.json
├── sample.js
└── tests
    ├── .eslintrc.js
    └── sample.test.js
```

## ESLintのインストールと設定

```console
$ npm install --save-dev eslint
```

インストールをしたら、トップ階層に設定ファイルを作成する。
(`$ npx eslint --init`コマンドでも設定ファイルを作成可能)

以下の様にES6を有効にして、node環境であることを設定する。

```..eslintrc.js
module.exports = {
    extends: ['eslint:recommended'],
    parserOptions: {
        ecmaVersion: 6,
    },
    env: {
        node: true,
    }
}
```

※ eslint:recommendedは推奨ルールを全て設定する。
有効になるルールは以下のリンク内でチェックがついているもの。
https://eslint.org/docs/rules/

※ プログラムが動く環境をenvとして定義する



この時点で以下の様に、特定のファイルに対してESLintを実行できる

```
$ npx eslint <filename>
```
エラーがなければ何も表示されない。


## Jest環境においてESLintを設定する

現状でJestでテストが書かれたファイルに対して、以下の様にLintしようとしても `'describe' is not defined` や `'it' is not defined`といったエラーが出ててしまう。

```
$ npx eslist jest.test.js  // エラーが出る
```

設定ファイルでenvの設定を追加することもできるが、プラグインがあるのでそれを使う。

```
$ npm install --save-dev eslint-plugin-jest
```

冒頭で作成したトップ階層にある.eslintrc.jsに設定を追加することもできなくはないが、テストプログラム以外も Jest Pluginの管理対象に入ってしまいあまり好ましくないので、以下のようにテストプログラム用に`tests`フォルダを作成してその配下に新しく.eslintrc.jsを作成する。

```tests/.eslintrc.js
module.exports = {
    plugins: ['jest'],
    extends: ['plugin:jest/recommended'],
}
```

※ testsフォルダ配下のコードもトップ階層にある.eslintrc.jsの影響を受ける。

最後にJestで書いたテストプログラムも正しくLintできればOK!

```
$ npx eslist sample.test.js
```

## VSCodeにESLintを組み込む
現時点だといちいちコマンドを打つ必要があるので、VSCodeで自動でチェックしてくれる様にプラグインを入れる。

VSCodeのExtensionから`eslint`を検索して、Dirk Baeumerさんのプラグインを入れる。
![スクリーンショット 2020-02-04 20.52.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125781/4c860479-39f4-aaab-77f9-4efb99ce16db.png)

以下の様にテキトーな文字を入れると、エラー表示してくれる。画面左下部にあるところにエラー数も表示されるの便利。
![スクリーンショット 2020-02-04 21.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125781/51b56caa-9e8b-c903-7d84-8d2d9aff59ab.png)


#### (Option) コードタイプ時ではなく、コード保存時にESLintが動く様に設定する

デフォルトだと、文字入力中にESLintが動き赤線が表示されてしまうが、VSCodeのUser setting (画面上部Codeタブ > preferences > setting) からESLintが動くタイミングを変更することができる。

eslint.runの値を `onType` => `onSave`　に変更することで、ファイル保存後に動くようになる。

![スクリーンショット 2020-02-04 21.05.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125781/c4927ec6-408e-b927-d571-e141c4b43ce3.png)
10分で作って注文する名刺

# 最初に
WEB系のプログラマの皆さんはかなりの割合で自分のホームページとか持っていると思います。
これを飲み会のときに「こんなページ作っているんですよ！」とか言うのあまりスマートではないな…
と思い立ち、自分で名刺を作ったので作り方を共有します。

# 作り方
## 用意するもの
・Googleのアカウント
・名刺の内容（自由）
・830円捻出可能なクレジットカード


## 1.名刺作成

ここに[テンプレート](https://docs.google.com/presentation/d/16-W6-9374-ZSe0mcGT-sMTzrFBDOzM6vON_IUFvifks/edit?usp=sharing)をおいておきます。
これを好きなようにコピーしてください。
サイズも規定のサイズ、アイコンなどもはみ出さない様になっています…

QRコードは下記のようなサイトで作成し、更新してください。

**QRコード[二次元バーコード]作成 【無料】**
https://www.cman.jp/QRcode/

私のサイトにリンクされてしまいます…

作成が終わったら、「ファイル」→「ダウンロード」→「PDF」でダウンロードしておいてください。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/af4460db-4cfb-6b4a-419f-b46b9d92b785.png">

```md:readme.md
枠ギリギリだとはみ出してしまって、修正を繰り返す事になります。
こちらで私は問題なかったのですが…問題ありましたらコメントいただければ助かります…
```

## 2.注文する
今回、私が利用したのは下記です。
<東京カラー印刷>
https://www.tcpc.co.jp

他のサイトだと色々とサイズが違うかもしれないので、
別途調べてみてください。

[ここ](https://www.tcpc.co.jp/price_tables/index/%E5%90%8D%E5%88%BA%E3%83%BB%E3%82%B7%E3%83%A7%E3%83%83%E3%83%97%E3%82%AB%E3%83%BC%E3%83%89)から下記のように選びました。

用紙サイズ：91x55mm（初期値）
用紙種類：特白アートポスト（初期値）
用紙の厚さ：180kg（初期値）
色数：片面フルカラー
条件：100枚　4営業日

```md:readme.md
400枚でもあまり変わらないのですが…
ミスが有ることをを考えて最初は少なく試したほうがオススメです…
私もTwitter アカウント名をミスりました…
```

この内容で注文します。

## 3.アップロードする

少し分かりづらいのですが、
右上のマイページをクリックします。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/8b625ee6-373b-8171-5ae8-c110a232a970.png">

その後、「購入履歴・ご入稿」をクリックします。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/c62f807f-9bf3-067d-b04e-584f5cf95cf5.png">


次のページから入稿を選択すればアップロードする画面にたどり着くかと思います…
（印刷済みであるため…画像がないので申し訳ないです）
先程、ダウンロードしたPDFをアップロードして完了です。

```md:readme.md
大変迷惑な話ですが、私はこのあと色々とはみ出していたため数回アップロードし直しました。
問題がある場合メールで連絡が来ます。
```


# 結論
こんな感じで到着します。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/af6edb2a-33ee-ae10-0856-8e5ae98d9ae6.png">
AWS ENI (Elastic Network Interface)について

## ENI (Elastic Network Interface) とは
VPC上で実現する仮想ネットワークインタフェースで、物理的な環境におけるNIC（Network Interface Card）のこと。NICの場合は、サーバーに複数枚挿すことで、サーバーが担う複数の役割に応じてIPアドレスを複数持たせたり、異なるセグメント間で1台のサーバーを動作させたりすることができる。

ネットワークインターフェイスには以下の属性を含めることができる。

- VPC の IPv4 アドレス範囲からのプライマリプライベート IPv4 アドレス
- VPC の IPv4 アドレス範囲からの 1 つ以上のセカンダリプライベート IPv4 アドレス
- プライベート IPv4 アドレスごとに 1 つの Elastic IP アドレス (IPv4)
- 1つのパブリック IPv4 アドレス
- 1 つ以上の IPv6 アドレス
- 1 つ以上のセキュリティグループ
- MAC アドレス

## ENI の基本
- インスタンスにアタッチしたり、インスタンスからデタッチしたり、別のインスタンスにアタッチしたりできる
- VPC の各インスタンスには、プライマリネットワークインターフェイス (eth0) と呼ばれるデフォルトのネットワークインターフェイスが存在する


## 参考
- [AWS ユーザガイド Elastic Network Interface](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-eni.html)
- [AWS Black Belt Online Seminar Amazon Elastic Compute Cloud](https://d1.awsstatic.com/webinars/jp/pdf/services/20190305_AWS-Blackbelt-EC2.pdf)
- [AWSのネットワークインターフェース「ENI」とは](https://business.ntt-east.co.jp/content/cloudsolution/column-14.html)
x86CPU の８つの汎用レジスタについてのまとめ

# この記事について
## この記事の対象者
Intel x86 CPU の汎用レジスタについてよくわからない方 or なまえの由来について知りたい方

多少雑な記事かもしれませんがお許しください><

# 本編？
Intel x86 CPU の汎用レジスタの引用
>RAX/EAX/AX/AL/AH : 「アキュムレータレジスタ」と呼ばれる。算術演算操作の結果が格納される。
REX/ECX/CX/CL/CH : 「カウンタレジスタ」と呼ばれる。シフトローテート命令とループ命令に使用される。
RDX/EDX/DX/DL/DH : 「データレジスタ」と呼ばれる。算術演算操作とI/O操作に使用される。
EBX/BX/BL/BH : 「ベースレジスタ」と呼ばれる。セグメントモードでのDS（後述）に格納されたデータを指し示すために使用される。
RSP/ESP/SP : 「スタックポインターレジスタ」と呼ばれる。スタックのトップを指し示すポインタ。
RBP/EBP/BP : 「スタックベースポインタレジスタ」と呼ばれる。スタックのベースを指し示すのに使用される。
RSI/ESI/SI : 「ソースレジスタ」と呼ばれる。ストリーム操作コマンド（たとえば MOV命令）でのソース（入力元）へのポインタとして使用される。
RDI/EDI/DI : 「デスティネーションレジスタ」と呼ばれる。ストリーム操作コマンドでの転送先（←英語でデスティネーションという. 出力先のようなもの）へのポインタとして使用される。
引用元：https://ja.wikibooks.org/wiki/X86%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9/x86%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3#%E6%B1%8E%E7%94%A8%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF_(GPR)

...らしいけど ... 
私「小難しくまとめたな、、、」

ということで、今回は軽く私がまとめます

## どんな感じか
| 64 bit | 32 bit | 16 bit | 8 bit | 8 bit |
|:------:|:------:|:------:|:-----:|:-----:|
|     RAX|     EAX|      AX|     AL|     AH|
|     REX|     ECX|      CX|     CL|     CH|
|     RDX|     EDX|      DX|     DL|     DH|
|        |     EBX|      BX|     BL|     BH|
|     RSP|     ESP|      SP|       |       |
|     RBP|     EBP|      BP|       |       |
|     RSI|     ESI|      SI|       |       |
|     RDI|     EDI|      DI|       |       |
名前は`16 bit` のやつがベースです
`16bit`のレジスタ名に`E`を付ければ`32 bit`レジスタ
`16bit`のレジスタ名の`R`を付ければ`64 bit`レジスタ

AX BX CX DXのレジスタは、XをLかHに書き換えることができます
AXを例にとると

```
|   AX|
|AH|AL|
```
このように、AHはAXの上位8ビット、逆に下位8ビットを参照したいならALという風です
これは、AX BX CX DXのどのレジスタにも言えることです。

## 32ビットレジスタの名前の由来
順に説明していきます

###AX
正式名称は「アキュムレータレジスタ」らしいですがよくわかりませんね
私もよくわかりませんが。どうやら計算の結果などが入るらしいです


###BX
正式名称は「ベースレジスタ」と呼ばれるらしいです
これは私もわからないので引用します
>セグメントモードでのDS（後述）に格納されたデータを指し示すために使用される。
https://ja.wikibooks.org/wiki/X86%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9/x86%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3#%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF

セグメントモード：わからん
DS:データのやつがあるところ（雑）

###CX
正式名））「カウントレジスタ」
ループとシフトローテート命令？に使われるらしいです
ループはloopニーモニックの荒れです
シフトローテート命令は、使ったことないです、、、

###DX
「データレジスタ」
計算と、IO操作に使われるそうです
AXとDXを使いたいときとか？わかんね

###SP
これは簡単です
~~スペシャル！！！~~
「スタックポインタ」です
現在のスタックがさしているアドレスが入ってます

###BP
これは、[SP]の親的な何かです
「ベースポインタ」
なんのベースかというとスタックのベース（最初のアドレス？）だと思います

###SI
「ソースレジスタ」
連続して読み込むときに使うらしいです
puts関数をアセンブラで書くときなどに使えるのではないでしょうか

###DI
「ディスとレーションレジスタ」？
SIとついの関係にあり、連続して書き込むときに使うらしいです

ほかにもレジスタはあります。