OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptの命名規則早見表（と記法）

JavaScriptを書く時に、命名規則について「あれどうだったっけ」となった時に参考になれば幸いです。
※ 業務であれば、チームなどによってルールが決まっていることもありますので、この限りではありません。

# Javascriptの命名規則

|記法|記法名|例|
|---|---|---|
|コンポーネント名|アッパーキャメルケース|UserForm|
|変数名|ローワーキャメルケース|sampleFunction|
|定数名|スネークケース|API_URL|
|メソッド名|ローワーキャメルケース|addNumber|
|プロパティ名|ローワーキャメルケース|userName|
|クラス名|アッパーキャメルケース|MyCar|

## おまけ： 記法について

|記法|説明|例|
|---|---|---|
|アッパーキャメルケース|先頭と言葉の区切りは大文字、それ以外は小文字|UpperCamelCase|
|ローワーキャメルケース|先頭は小文字、言葉の区切りは大文字、それ以外は小文字|lowerCamelCase|
|スネークケース|すべて大文字で、単語ごとにアンダースコアでつなぐ|THIS_IS_SNAKE|
【Django】設定ディレクトリをわかりやすく・みつけやすく

#はじめに
Djangoの開発・実装の際に，どうしてもアプリケーションが多くなってしまうことがあります．こんな状態のプロジェクト構成だと設定ファイルを探すときも，ちょっとだけめんどくさいですよね．ディレクトリ名さえ覚えていれば，アルファベット順なわけですし，探せばそりゃ見つかるんです．それでも**「探す作業」自体が嫌い**な私はそれすらめんどくさいんですよね…
そこで，この設定ディレクトリが**「絶対一番上にある」**っていう状態にしておくことで，探す手間をなくします．かなり簡単な話なので，みなさんも是非使ってみてください．

#結論
**設定ディレクトリの名前を「_config」にする**ことで，このディレクトリが一番上に表示されます．

```sh:プロジェクト構成例
.
├── _config # プロジェクトの一番上に設定ディレクトリ
├── app1
├── app2
└── app3
```

# 実装手順
この記事でお伝えしたことを実際に自分のDjangoプロジェクトに取り入れようと考えてくれる方に向けて，実装手順も載せておきます．

## 前提
Python3，Djangoはインストール済みであると想定します．バージョンは何でもいいと思いますが，私は以下の環境で実装しました．

Python: 3.8.5
Django: 3.2.8


## 初めからDjangoのプロジェクトを開発する場合

```sh
$ mkdir <projectName>
$ cd <projectName>
$ django-admin startproject _config .
```

## 開発中のDjangoプロジェクトに反映する場合
すでに開発しているDjangoプロジェクトがある場合は，元の設定ディレクトリ名（「settingDirName」だとする）を「_config」にしてやる必要があります．

```sh:プロジェクト構成
.
└── <settingDirName> → _config
```

```diff:./manage.py
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<settingDirName>.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', '_config.settings')
```

```diff:./_config/settings.py
- ROOT_URLCONF = '<settingDirName>.urls'
+ ROOT_URLCONF = '_config.urls'
- WSGI_APPLICATION = '<settingDirName>.wsgi.application'
+ WSGI_APPLICATION = '_config.wsgi.application'
```

ここからの設定はWSGI・ASGIを活用するなら設定の変更が必要ですが，そうじゃない場合は変更しなくても大丈夫なはずです．

```diff:./config/asgi.py
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<settingDirName>.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', '_config.settings')
```

```diff:./config/wsgi.py
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<settingDirName>.settings')
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', '_config.settings')
```

#まとめ
今回の記事の発想は研究室の後輩から教わったものなのですが，こういう少しの手間でできる感じがとても良いなと思いました．冒頭でも言ったように，Djangoプロジェクトの開発をしているとゴチャゴチャしてしまうことがあるので，他の方の記事にもあるようなベストプラクティスを活用したいですね．

※ご意見や疑問点などお待ちしております！

#追記
この記事の内容を応用してDjangoプロジェクト構成の提案をする記事を書きました．
是非合わせてご覧下さい!

[【Django】プロジェクト構成を「設定」「ユーザ管理」「アプリケーション」の3つに分ける](https://qiita.com/masaoguchi/items/d9955a4c642dba6b0871)

#参考
[Django ベスト・プラクティス](https://qiita.com/F_clef/items/687e79691d3aa961cbd7)
[Qiitaの投稿で設定値の変更などの差分を分かりやすく書く方法](https://qiita.com/tech31/items/fdb207a895a91c528de6)
file_get_contents(): SSL operation failed に対処した

APIで月次データを取得しているPHPプログラムがエラーを吐くようになりました。

```:ログ
file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed {"exception":"[object] (ErrorException(code: 0): file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed at /var/www/html/xxx.php:35)
```

エラーは`file_get_contents()`でAPIを叩いている箇所で起こっています。

```php:PHP
$json = file_get_contents("https://example.com/api/v1/get/$code", false, $context);
```

同じことを`curl`で行うと成功するので、API提供元の不具合では無さそうです。

```
curl -s https://example.com/api/v1/get/999
```

以下のようにして、サーバ証明書の検証をしないことで回避できそうですが、これは最後の手段としたいです。

```php:PHP
$context = stream_context_create([
    'ssl' => [
        'verify_peer'      => false,
        'verify_peer_name' => false
    ]
]);
$json = file_get_contents("https://example.com/api/v1/get/$code", false, $context);
```

まず疑うべきは証明書の有効期限切れです。
API提供元は **Let's Encrypt** を使っています。
そういえば、**Let's Encrypt** が使用しているルート証明書が9月30日に期限切れになっていたことを思い出しました。
このAPIは月末近くに発動するので、今回その影響を受けた可能性が高いです。

そこで`ca-certificates`パッケージを最新にしたところ、解消されました！

```:CentOS7
yum -y update ca-certificates
```
【mt4/mql4】ショートポジション（売りポジション数）カウント処理



# はじめに
<!-- 発端や概要を記載 -->
システムトレードプログラマのmt4/mql4のメモノートです。
初心者向けの簡単なトピックから公開していきます。
.noteでEAそのものも公開していますので良ければそちらも見てください。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [処理内容](#処理内容)
1. [mql4ソースコード](#mql4ソースコード)

<!-- 各チャプター -->
<a id="#処理内容"></a>
# 処理内容
今のショートポジション数を確認したい場合の処理になります。
ショートということで「売り」です。「SELL」です。「ベア」です。
のポジションがいくつあるかをカウントするコードです。

使いどころとしては
・最大ポジション数を制限したいとき
　→ポジションがあるなら追加エントリーしない。とか

・買い売りのどちらの処理を行えばいいかの判定のとき
　→買いシグナルが出たので、売りポジションがあるなら決済する。とか
　
ですかね。
そんな時はこのコードでショートポジション数を算出してください。

<a id="#mql4ソースコード"></a>
# mql4ソースコード

こちらが関数側のソースです。呼び出し側の前に記述されている必要があります。

```C++:test.mq4
//+------------------------------------------------------------------+
//| ショートポジション数を取得      ShortPositionCnt
//|  code by KOUSHIROU
//|  https://note.com/mt4_coder                 
//+------------------------------------------------------------------+

input int MAGIC = 12345;//マジックナンバーを設定

int ShortPositionCnt()
{
	 int sells=0;
	 for(int i=0;i<OrdersTotal();i++)
	 {
		 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
		 {
			 if(OrderType()==OP_SELL) sells++;
		 }
	 }
	 return(sells);
}
//+------------------------------------------------------------------+
```


こちらは呼び出し側の例
呼び出したいタイミングに合わせてOnTick()、OnInit()とかOnTimer()の中で記述してみてください。
SPosCntの中にポジション数が入ります。

```C++:test.mq4
int SPosCnt = ShortPositionCnt();
```

取引所によっては、高頻度でアクセスしたりするとエラーではじかれたりします。
そんなときはsleepなどで間をあけるようコーディングしてみてください。

皆様の手助けになりますように。
間違いなどあればご指摘いただけると助かります。
以上です
ECS Execする時のコマンドをちょっと簡単にする

# 使用方法
```bash
aws-ecs-exec Sample-Cluster task-id container-name
```

# bash関数
```bash
function aws-ecs-exec() {
  command aws ecs execute-command --cluster $1 \
    --task $2 \
    --container $3 \
    --interactive \
    --command "/bin/sh"
}
```

# 説明
毎回コンテナに入るときのコマンドをぐぐりながらやってたので、bash関数化したら楽かなと思いました。
subnetの指定はいるんだっけ？とrun-taskとごっちゃになったりしてたので。。

`--command "/bin/sh"`この箇所は動いているDockerイメージによって変わると思うので適宜変更してください。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs-exec.html
ハロウィンで遊びながらスクラッチ（scracth）を学ぶ！キャラクターの作成（２回目／全１０回）

さあ２回目です。


青の「中を見る」をクリックすると見れます。

登場人物を決めました。

・主人公の猫
・悪の大王（ボスキャラ）
・悪の使い（子分）
・パンプキン爆弾



スプライトにキャラクターを追加しました。スプライトのアイコンを選択して、
中上に「スクリプト」－「コスチューム」－「音」の順でタブがある。

その「コスチューム」をクリックすると、キャラクターの作成画面になります。

どんなストーリーになるかな？？


https://programingo.com
【mt4/mql4】ゼロパディング（前ゼロ / zero padding / ゼロ埋め）処理


# はじめに
<!-- 発端や概要を記載 -->
システムトレードプログラマのmt4/mql4のメモノートです。
初心者向けの簡単なトピックから公開していきます。
.noteでEAそのものも公開していますので良ければそちらも見てください。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [処理内容](#処理内容)
1. [mql4ソースコード](#mql4ソースコード)

<!-- 各チャプター -->
<a id="#処理内容"></a>
# 処理内容
ゼロパディング (英: zero padding) またはゼロ埋めは、文字で数値を表す際に、書式で指定された桁数に満たない場合に、桁数をそろえるためゼロを付加することである。
by wikipedia

「ゼロ埋め」とか「桁そろえ」とか「桁合わせ」とかとも言いますでしょうか
基本の基本、ゼロパディングの処理です。
桁数（文字数）を揃える目的で「12」→「00012」や「345」→「00345」のように左に「0」を何個かくっつけることですが、これ以外と使うシーンがあるんです。

特に時刻とか日付系
外部APIとかサーバーとか、ローカルタイムとか色々　判定して処理したいときに
あれ、動かないじゃんって思うとゼロが揃ってなかったりするんですよね。

こんな感じで
サーバーから取った日付：02/08/2021  
とあるAPIから取った日付：2/8/2021 

まあ他にも指標系のニュース使ったりするときもこの現象は発生します。
そんなときにこの関数で統一してから処理していきましょう。


<a id="#mql4ソースコード"></a>
# mql4ソースコード

こちらが関数側のソースです。呼び出し側の前に記述されている必要があります。

```c++:test.mq4
//+------------------------------------------------------------------+
//| ゼロパディング    ZeroPading  
//|  code by KOUSHIROU
//|  https://note.com/mt4_coder                  　　　　　　    
//+------------------------------------------------------------------+
string ZeroPading(int rawdigits, int digits)
 {
  string result = IntegerToString(rawdigits);
  int    length = StringLen(result);
  if(length >= digits)
   {
     return(result);
    }
  for(int i = 0; i < digits - length; i++)
    {
     result = "0" + result;
    }
  return(result);
 }
//+------------------------------------------------------------------+
```


こちらは呼び出し側の例
この例は、日付が1桁の場合にゼロ付けする。例）5 → 05、31→31（2桁の場合はそのまま） 

```C++:test.mq4
string day_2dig = ZeroPading(Day(),2);
```

これも呼び出し側の例
この例は、数列を5桁に統一する　例）123→00123にする

```c++:test.mq4
string nazo_code = 123;
int marumekomi = 5;
string aft_code = ZeroPading(nazo_code,marumekomi);
```

シンプルですが日付・ニュース系の情報を使う場合
使いどころは多いです。
皆様の手助けになりますように。

間違いなどあればご指摘いただけると助かります。
以上
白黒動画をカラー動画へ ~AIモデル DeOldify~

最近は、静止画の白黒画像ならば、フリーでカラー化してくれるサービスが一般的になって来ています。

しかし、動画の場合は、そうは行きません。動画の場合は、パラパラ漫画みたいに、画面ごとに白黒画像をカラー化していくわけですが、カラー化する枚数が多すぎて無償のサービスにするわけには、なかなか行きません。

AIモデル自体は、無償で公開されている場合が多いですが、環境構築に手間がかかるため、自分で環境を作成する方法も一般的ではありません。

ですが、亜細亜新聞CHさんの記事を見て実行してみた所、Web上の実行環境では、驚くほどスムーズに実行出来ました😲
https://note.com/asianews_ch/n/n39a2ab6f0bc9

その際に使用していたAIモデルは、DeOldifyというものです。
https://github.com/jantic/DeOldify
![138589407-fb52f583-4840-4fff-9098-c066d55d6b49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2173896/4a0f2898-a9c5-a8fc-b014-71e727d3b6d0.png)

そこで、この実行コードを、私の持っているGPU搭載のLinuxマシンで実行してみました。

やはり、GPU搭載のローカル環境の方が、遥かに処理速度が速いです❗️

少し手こずりましたが、白黒動画のカラー化をローカル環境にて、実行することが出来ました。

こちらが、私がローカル環境で実行したコードです。
https://github.com/GL-Kageyama/DeOldify_ExecutionEnvironment

マリリン・モンローが歌っている動画のカラー化が一番上手く行ったので、貼っておきますね😉
https://www.youtube.com/watch?v=0ASyKfArVU0
![スクリーンショット 2021-10-24 19.13.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2173896/4d6c787e-b6c3-f74c-ccda-6f7be0bf1337.png)


こちらが、元にした白黒動画です。
https://www.youtube.com/watch?v=5eDHlgnRuaM

AIの進歩は、日進月歩なので、これよりも優れたAIも登場してくることでしょう。
今から楽しみです😄
【React】ドラッグ&ドロップで要素を伸び縮みするUIを作ってみる【TypeScript】

# テーマ
- とあるReactアプリでドラッグ&ドロップで要素を伸び縮みさせるUIを作って欲しいという依頼があった
- これだけの要件であればreact-dndを使うと冗長そうなので、今回は使わずに自前で実装してみた

# デモ
- 黒い部分をドラッグ&ドロップすると縦に伸び縮みします

<p class="codepen" data-height="550" data-default-tab="js,result" data-slug-hash="dyzNWPj" data-user="mikan3rd" style="height: 550px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mikan3rd/pen/dyzNWPj">
  React Drag&amp;Drop Resize</a> by mikan3rd (<a href="https://codepen.io/mikan3rd">@mikan3rd</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


# 解説

## draggable属性
- 要素がドラッグ可能であることを示すために`draggable={true}`が必要です
  - https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/draggable

## onDrag / onTouchMove
- ドラッグ中に発生し続けるイベントです
- onDragイベントはスマートフォン/タブレット端末には対応していないため、代わりにonTouchMoveイベントで代用しています

## handleChangeHeightでやっていること
- `React.useRef()`を使い、`targetRef`に伸び縮みさせる要素を渡すようにしています
  - https://ja.reactjs.org/docs/hooks-reference.html#useref
- ドラッグ中の位置(引数の`clientY`) と現在の要素の底の位置（`getBoundingClientRect()`で取得した`bottom`）の差分を計算し、現在の要素の高さと足し算することで次の要素の高さを算出します
-`React.useState()`のstateでheightを更新すると再レンダリングが大量に発生して遅いため、`targetRef.current.style.height`で直接高さを変更して伸び縮みさせるようにしています

## onDragStart / dataTransfer.setDragImage()
- デフォルトだとドラッグ時にドラック中の要素がカーソルに合わせて薄く表示されるようになっています
- これは`onDragStart`時に`dataTransfer.setDragImage()`で変更することができます
  - https://developer.mozilla.org/ja/docs/Web/API/DataTransfer/setDragImage
- 非表示にしたい場合、`dataTransfer.setDragImage()`の引数に`null`などを指定することができないので、透明な画像を用意して指定しています
  - https://stackoverflow.com/questions/7680285/how-do-you-turn-off-setdragimage


# 以上！
- 自分でUIを作ると色々勉強になりますね、皆さんもぜひ試してみてください！
- ちなみに`React.useRef()`は再レンダリング対象にさせたくない変数としても使えるので覚えておくと便利
create-react-app で "Error: EPERM: operation not permitted, uv_cwd" とエラーが起きる原因と対処法

# 概要
書類フォルダ内に

```
npx create-react-app XXX
```
でフォルダを作成したところ、以下のエラーが起きた

```
Error: EPERM: operation not permitted, uv_cwd
```

# 原因
原因はいくつかあるが、その中の一つである

_ターミナルから書類フォルダへのアクセス許可されていなかった_

という原因に当てはまった


# 解決

下記の設定画面に移動
環境設定 > セキュリティとプライバシ > ファイルとフォルダ

_ターミナルの"書類フォルダ"のアクセス許可にチェックする_

無事、create-react-appを行うことができた
djangoのpathlibについてざっくりとまとめる

### 今回のお題
今回のお題はpythonのpathlibというモジュールの使い方です。

用途はパスの結合ですね。

[前回](https://qiita.com/keishi04hrikzira/items/83e323f1c3d119d2bb77)、パスを結合できるos.path.joinについて扱ったところ、現在はpathlibを用いる方法が便利だというコメントをいただきました。

なので今回はpathlibを用いたパスの結合方法についてまとめていきます。
### 目次
- pathlibの使い方
- 取得したパスの型・注意点

### pathlibの使い方
pathlibの使い方は非常に簡単です。

- pathlibからPathをimportする。
- Path()もしくは"/"演算子を用いてパスを結合する。

これだけです。

```python:パスの結合
# import
from pathlib import Path

# Path()で結合
path = Path("dir1", "dir2")

# "/"演算子で結合
path = "dir1" / "dir2"
```
特に、"/"で結合できるのは便利ですね。
###　取得したパスの型・注意点
一応、取得したパスの型についても触れておきます。

pathlibを用いて取得したパスはPosixPath型と呼ばれる型になっています。

この型はiterableではないので、環境変数の値として設定するときなどタプル型またはリスト型を要求される場合には型変換が必要です。
### まとめ
以上がpathlibを用いたパスの連結方法になります。

djangoの特定のファイルにはデフォルトでインポートされていることもあり、なるべくならこちらを使いたいですね。
データベースを作る。  (sqlite3)

#はじめに
 sql文が苦手なので、せめてデータベースの作成と読み込みの関数だけ作る。

#コード

```python:main.py
import sqlite3


def makeDB(db,table_name,columns,cols):
#columns={<typename>:<type>,...}
        size=len(columns)
        cur=db.cursor()
        columns=",".join(map(lambda key:key+" "+columns[key],columns))
        cur.execute("create table if not exists {0} ({1})".format(table_name,columns))
        hatenas=",".join(["?"]*size)
        for col in cols:
                try:
                        cur.execute("insert into {0} values ({1})".format(table_name,hatenas),col)
                        db.commit()
                except Exception as e:
                        pass


def readDB(db,table_name):
        cur=db.cursor()
        return db.execute("select * from {0}".format(table_name))
```


#使う

```csvs:a.csv
Natsumi;40;152;83;60;80
Sayaka;37;158;80;60;87
Maki;36;158;83;60;88
Mari;38;144;75;60;80
Rika;36;157;78;60;84
```

```python:main.py
def readcsv(fname,encoding="utf8"):
        with open(fname,"r",encoding=encoding) as f:
                for line in f:
                        yield line.rstrip().split(";")

db=sqlite3.connect("a.db")
columns={"name":"text unique","age":"int","tall":"int","T":"int","W":"int","H":"int"}
fname="a.csv"
makeDB(db,"MM",columns,readcsv(fname))
for col in readDB(db,"MM"):
        print(col)
db.close()
```

```shell:実行結果
$ python main.py
('Natsumi', 40, 152, 83, 60, 80)
('Sayaka', 37, 158, 80, 60, 87)
('Maki', 36, 158, 83, 60, 88)
('Mari', 38, 144, 75, 60, 80)
('Rika', 36, 157, 78, 60, 84) 
```

#おわりに

些細なものだが、sql文を見なくて済むのは嬉しい。しかしいずれは見る羽目になるか。(笑)
Human Interface Guidelinesを理解する　その2


ロードに関して
--
コンテンツの読み込みに関して、何らかのわかりやすい動きを示す必要がある。Netflixのダウンロードや、音声がどれくらい流れているか？といったこと。ここら辺はコンテンツ系のアプリを使用してみると、どんな感じでコンテンツを利用しているかをみることができる。

・ロード発生をしっかり伝えること
ロード中のクルクルを出してしっかりロード発生を伝える。あわよくば、どれくらいの進捗かどうかも伝えれれば良い。
プログレスバーなどで表示できそう。Youtubeではスケルトンビューでローディングをしているのを思い出した。。

・なるべく早くコンテンツを表示する。
ユーザーが操作している間にバックグランドでローディングをしておくなどの工夫が必要。個人的には動画とかでなければ1秒以上読み込みが起こると違和感があるなぁと感じる。
身近なものだとTiktokは動画をバックグラウンドでとってきて、ユーザーに読み込みをほとんど感じさせない設計になっているのかな？とてもUX体験が良い

・ロード中に代わりとなるコンテンツ（動画や音声、ゲームなど）を表示してロード中であることをユーザーに感じさせない。
あんまし身近なもの例が思いつかない。あまりゲームをしないからかも
・インジケーターや他のロードを示すコンポーネントをアプリの世界観にあったものにする。


　モーダルに関して
--
・モ-ダルは、ユーザーのそれまでの文脈から離れ、一時的にコンテンツを提示するデザイン手法。
終了するには明示的なアクションが必要となってくる。
モーダルでコンテンツを提示することにより、
ユーザーは自己完結型のタスク,ある一つのタスクに関する一連のまとまった操作に集中できる
ユーザーに重要な情報を示し、必要に応じて次の操作を誘導する

モーダルの仕方
シート
シートスタイルは、コンテンツを部分的に覆うカードとして表示される（ViewControllerの上にポンと出てくるやつ）、カバーされていないすべての領域は暗くすることで、ユーザーの操作を意図的に防ぐ。
親ビューまたは前のカードの上端は現在のカードの後ろに表示され、カードを開いたときに中断したタスクを思い出せるようにします。
複雑なタスクを行わず、非没入型のモーダルコンテンツにはシートを使用します。

フルスクリーン
フルスクリーンスタイルは、画面全体をカバーする。
前のビューは完全にカバーされているため、混乱を抑えられる。
ユーザーはボタンをタップじしてフルスクリーンを閉じる
フルスクリーンは、ビデオ、写真、カメラビュー等の没入型コンテンツや何かのデータの編集などの複雑な一連のタスクをする場合に使用する。
ユーザーデータの編集とかメールを送信するとかでよく使われているイメージ。

 モーダルを使用する場合の注意点
--

・合理的にモダリティを使用しましょう
そもそもモーダルは、現在のタスクとは異なるタスクを選択したり実行したりすることにユーザーを集中させる必要がある場合のみ。
モーダルエクスペリエンスは、現在の状況からユーザーを引き離し、閉じるためのアクションを必要とするので、明確なメリットが得られる場合にのみ使用し、むやみやたらに使用するべきではない。

・不可欠な（かつ実利的な）情報を提供するためにアラートを残しておく
アラートは何かが間違っている場合に表示する。むやみやたらに使用するものではない。そこに正当性を持たせることが必要。

・モーダルタスクはシンプルで短く、焦点を絞りましょう
モーダルタスクが多かったり、モーダルを階層構造で多くなると元の画面に戻ることが難しくなり、「そもそもなんのタスクでこの画面をモーダルさせったんだっけ？」となるのでやめた方が良い。

・常にモーダルビューを閉じるボタンをつける。
完了またはキャンセルのボタンを絶対つけたほうが良い。

・必要に応じて、モーダルビューを閉じる前に確認し、データの損失を回避する
メールの下書きとかをイメージするばわかりやすい。モーダルを閉じる前に「データがなくなっちゃうよ！！」と言ってあげる。

・ポップオーバーの上にカードを表示しない
ポップオーバーは簡単な補足や情報を表示したりするのに便利だが、複雑なものは混乱させる

・一般に、モーダルタスクを識別するタイトルを表示しましょう
モーダルタスクに入ると、以前のタスクから切り替わるので、新しいコンテキストを明確に示す必要がある。

・モーダルビューの外観をアプリと整合性を持たせる
ナビゲーションコントローラーにモーダルしてそれが明示的にわかってないとユーザーが混乱してしまうよ。

・アプリ内で一貫したモーダルの遷移スタイルを選択する
モーダルを表示させる方法はアプリ内で一つに限定した方が良い。下から上が一般的だが、上から下へしてみたり、ハーフモーダルが多かったりすると混乱する。
Python 3.10 lxml (wheel) を Windows 10 にインストールする

下記のサイトから lxml の wheel をダウンロードする。

lxml‑4.6.3‑cp310‑cp310‑win_amd64.whl

https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml


コマンドプロンプトにてダウンロードしたディレクトリで下記を実行する。

```
pip install lxml-4.6.3-cp310-cp310-win_amd64.whl
```
チームマネジメントの手法「心理的安全性のつくりかた」を読んだのでまとめ

「心理的安全性のつくりかた」を読んだのでまとめ。

https://www.amazon.co.jp/dp/4820728245

「チームの心理的安全性」は１９９９年にハーバード大学教授のエイミー・C・エドモンドソンが書いた論文で、「チームの心理的安全性とは、チームの中で対人関係におけるリスクをとっても大丈夫だ、というチームメンバーに共有される信念のこと」と定義されています。

Googleが働き方改革の手法として紹介したことで、日本でも広く知られるようになりました。

https://rework.withgoogle.com/jp/guides/understanding-team-effectiveness/steps/introduction/

著者はそれを分かりやすい表現として**「メンバー同士が健全に意見を戦わせ、生産的でよい仕事をすることに力を注げるチーム・職場」**のことと表現します。

しかし、ほとんどの職場では「対人関係のリスク」が「健全に意見を戦わせ、生産的でよい仕事をする」ことを阻害されている場合があるので、いかにその問題を解決していくかがマネージャーの大切な仕事となります。

アメリカ版心理的安全性の計測方法では「無知」「無能」「邪魔」「ネガティブ」という要素で測るのですが、日本人の文化では計測値が正しく出ないので、以下の**「話しやすさ」「助け合い」「挑戦」「新規歓迎」**という要素で評価します。

1. **話しやすさ（批判的なことが言えるか）**
  + みんなが、同じ方向を向いて「これだ！」となっている時、それでも反対意見があれば、それをシェアすることができるか？
  + 「問題」や「リスク」に気づいた瞬間・感じた時に声を上げられるチームか？
  + 知らないことや、わからないことがある時、それをフラットに尋ねられるか？

2. **助け合い（チームプレイできるか）**
  + 問題が起きた時、人を責めるのではなく、建設的に解決策を考える雰囲気があるか？
  + チームリーダーやメンバーは、いつでも相談にのってくれるか？
  + このチームは減点主義ではなく、加点主義か？

3. **挑戦（チームによる模索・試行錯誤ができるか）**
  + このチームでは、チャレンジ・挑戦することが損ではなく、得なことだと思えるか？
  + 前例や実績がないものでも、取り入れることができるか？
  + 多少非現実的でも、面白いアイデアを思いついたら、チームに共有してみよう・やってみようと思えるか？

4. **新規歓迎（メンバーの個性は歓迎されるか）ダイバーシティー＆インクルージョン**
  + 役割に応じて、強みや個性を発揮することを歓迎されていると感じるか？
  + 常識に囚われず、さまざまな視点やものの観方をもちこむことが歓迎されるか？
  + 目立つことも、チームではリスクではないと思えるか？

おわり
Qiitaで画像を表示してリンクさせるやつ（リンクカード）の書き方

#はじめに
Markdownに慣れていなかった頃、横に長い長方形の枠に画像があるリンクのいい感じのやつ（リンクカードと言う）の書き方がわかりませんでした。同じような方のために書き方を共有します。

よく見るこんなやつ

https://qiita.com/

#やり方
リンクカードとして表示させたいURLの前後に改行を入れることでできます。

```
（空行）
https://qiita.com/taqro/items/4ed3f29b004634e2f1fe
（空行）
```
↓のように表示されます。

https://qiita.com/taqro/items/4ed3f29b004634e2f1fe

次のように連続して表示させることもできます。

```
（空行）
https://qiita.com/taqro/items/09ac9443cd3b7a9bc493
（空行）
https://qiita.com/taqro/items/41fb5a97f2b6a52bf86b
（空行）
https://qiita.com/taqro/items/a8e2b4a2508ed6d4ff1d
（空行）
https://qiita.com/taqro/items/06696c883271c5428eed
（空行）
```

↓のように表示されます。

https://qiita.com/taqro/items/09ac9443cd3b7a9bc493

https://qiita.com/taqro/items/41fb5a97f2b6a52bf86b

https://qiita.com/taqro/items/a8e2b4a2508ed6d4ff1d

https://qiita.com/taqro/items/06696c883271c5428eed

#おわりに
リンクカードは記事の参考資料などの紹介に使うと効果的です。次に記事を書くときはみなさんもぜひ使ってみましょう。

#参考記事

https://qiita.com/Qiita/items/c686397e4a0f4f11683d
Railsテスト（RSpec)記事１２選

#RSpecとは？
RspecとはRuby用のテストフレームワークです。RSpec は Gem パッケージとして提供されていますのですぐに導入できます。

#記事
RSpecについて書かれている記事たちです。参照しやすいように一箇所にまとめました。

https://qiita.com/tatsurou313/items/c923338d2e3c07dfd9ee

https://qiita.com/jnchito/items/42193d066bd61c740612

https://zenn.dev/fjsh/articles/b300fd2f8eec77

https://qiita.com/kskinaba/items/38b143e79bdfd44cc42a

https://qian-dao-zhen-yi.gitbook.io/rspec-style-guide/

https://qiita.com/yamaday0u/items/c3bf6036e11298771a99

https://zenn.dev/yukihaga/articles/816758ff6f0bdf

https://zenn.dev/noraworld/articles/rspec-rules-for-team

https://qiita.com/ytnk531/items/c88dfea3fd46ff704a2f

https://qiita.com/Kohei_Kishimoto0214/items/e29e509b12a6eb484a42

https://qiita.com/Yuki_Nakagami/items/85e96075f943ebd9c259

https://zenn.dev/yhorikawa/articles/2107190620_rspec_technic

#おわりに
どんどんテストを書いていきましょう！

https://qiita.com/halkt/items/930097f76f5d82f9079b

https://speakerdeck.com/hoddy3190/nazetesutowoshu-kufalseka?slide=15
Mac miniであそびはじめたので、その記録

https://www.apple.com/jp/mac-mini/

https://twitter.com/e99h2121/status/1450369328566595592?s=20

ということで**[Mac mini を頂いた！](https://blog.qiita.com/engineer-festa-presents-winners-2021/)**ので、どうやって使おうか試行錯誤中というポエムです。

https://ascii.jp/elem/000/004/048/4048192/

筆者、Appleはipod touchしか買わない相当な異端の趣向の者なので、突然ありがたきおもちゃを渡されおさるのジョージ並みに喜ぶもどう使うかもおサルレベルである...。ともかくいま家にあるmy gearで起動して繋いで作業用音楽流すくらいやりたいぞ

とりあえず夫からモバイルディスプレイを奪い手持ちのやっすいマウスとキーボードを繋いだら起動できた。「ぽわーん」(←起動音)

**音デカっ**、と思うが音量の変え方がわからない…
あとtwitterくらい見てやるかと思ったけど@マークどこ？っていうかこれ英語キーボードでしかないわ


## 試行錯誤

https://twitter.com/e99h2121/status/1451699974123626498?s=20

> 訳: M1 Mac miniの電源を入れた！でも、キーボードとモニター足りなくて、まだ日本語が打てねワロタwww


https://twitter.com/e99h2121/status/1451700938608054275?s=20


> 訳: 私Mac弱すぎワロタwww コピー＆ペーストの方法がわっかんね、音量もどうやって変えたらいいのかわっかんねww 　ハイ、私は多くのことを学ばなければなりません...


## SSH接続

夫からディスプレイを借り続けて恩を売られるのも困るのでどうやって普段遣いしようか試行錯誤する。まずSSHはここをこう。

https://twitter.com/e99h2121/status/1451706270528913417?s=20

`ssh e99h2121@192.xx.xx.xx`

なるほど。でも...GUI...


## VNC接続

> VNC 【Virtual Network Computing】

[VNC（Virtual Network Computing）とは - IT用語辞典 e-Words](https://e-words.jp/w/VNC.html)

https://support.apple.com/ja-jp/guide/mac-help/mchlp1657/mac

https://qiita.com/tenomoto/items/071fdc511eaa2dc42192

### VNCとRDP

https://gist.github.com/261shimizu/75e49beb2a6451561bdd46d612cb764b#file-gui-md

### Ultra VNC

https://www.uvnc.com/downloads/ultravnc.html

https://cloud-work.jp/windows_pc/windows/win2mac_vnc/#WindowsUltraVNC_Viewer

https://logical-studio.com/develop/mac/20170120-remoteconnectionfromwindowstomac/

### VNC Viewer

https://www.realvnc.com/en/connect/download/viewer/

ツールは色々ある、この辺はLINUXと同じよね。

### つないだ

`vnc://192.xx.xx.xx/`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/17bef843-f95f-b207-2623-10750f2241e5.png)

映像に関して持ち腐れ感が否めないのでここからどうしようか考えどころである。でもモノから入って色々遊べるって贅沢で超楽しい。


## Docker for Mac

https://docs.docker.jp/docker-for-mac/install.html

## xrdpというやつでRDP的につなげられる

https://qiita.com/ChujoHiroto/items/76012b5847be04e5acee

https://brew.sh/index_ja

## 最近発表されて騒がしかったのはこっち

https://www.apple.com/jp/newsroom/2021/10/introducing-m1-pro-and-m1-max-the-most-powerful-chips-apple-has-ever-built/

https://www.itmedia.co.jp/news/articles/2110/21/news114.html

でもコスパ悪くないやつですよね。


## Mac mini、意外と持ち運べる...

https://pcmanabu.com/mac-mini-mobile/

https://twitter.com/toricls/status/1451543487275409409?s=20

## やはりMacって好きな人は大好き

https://twitter.com/e99h2121/status/1452082095350632448?s=20

## 続く

https://twitter.com/e99h2121/status/1451091760138969088?s=20

あらためて、本当に有難うございました。楽しく使います。
以上お礼含めた記録でした :smiley:
Red Hat Enterprise Linux コマンド

# あいさつ
やっと勉強する時間が確保できた、知識が線ではなく点な状態のインフラ民けいしーです。(´・ω・｀)

わざわざ記事に必要あるのか、正直微妙なところですが、ある種のノート代わりとして使おうかなと思ったところですね。

## コマンド一覧

### 1. ネットワーク設定関連

#### IPアドレスの確認

```
ifconfig
```

#### インターフェースの接続

```
nmcli con up ens160

# 接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/3)
```
#### インターフェースの接続-2.
```
ifconfig <interface-name> up
```


#### インターフェース設定

```
ifconfig <interface-name> <ipv4-address> netmask <subnet-mask> 
```


#### インターフェースの切断

```
nmcli con down ens160

# 接続 'ens160' が正常に非アクティブ化されました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/3)
```

#### 疎通確認
```
ping www.google.co.jp

# 疎通ができている場合
# PING www.google.co.jp (xxx.xxx.xxx.xxx) 56(84) bytes of data.
# 64 bytes from xxx.xxx.xxx (xxx.xxx.xxx.xxx): icmp_seq=1 ttl=128 time=38.9 ms
# 
# 疎通ができていない場合
# 
# ping: www.google.co.jp: 名前またはサービスが不明です
```


### 2. サブスク関連

#### サブスクリプション情報の確認

```
subscription-manager identity

# 登録されていない場合
# このシステムは登録されていません。 詳細については「subscription-manager register --help」をご覧ください。
```

#### サブスクリプション（オフライン）の登録

以下参照(/・ω・)/

https://qiita.com/Kacy-Infra-Minzoku/items/05cee00fdfcd8eac8bfa

### サブスクリプション（オンライン）の登録

```
subscription-manager register --username <UserName> --password <Password> --consumerid=<プロファイルのUUID>

# 登録中: subscription.rhsm.redhat.com:443/subscription
# このシステムは、次の ID で登録されました: <プロファイルのUUID>
# 登録したシステム名: testrhel
```

### 2-4. Red Hat 公式サイトからのサブスク状況の確認

![スクリーンショット 2021-10-25 024719.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473120/df6be928-1eb1-6449-a6bd-5476d6c6f4a1.png)

### 2-5. CUI上でサブスク状況の確認①

```
subscription-manager status

# +-------------------------------------------+
#    システムのステータス詳細
# +-------------------------------------------+
# 全体のステータス: 最新
# 
# システムの目的の状態: 指定されていません
```

### CUI上でサブスク状況の確認②

```
subscription-manager list

# +-------------------------------------------+
#     インストール済み製品のステータス
# +-------------------------------------------+
# 製品名:           Red Hat Enterprise Linux for x86_64
# 製品 ID:          479
# バージョン:       8.4
# アーキテクチャー: x86_64
# 状態:             サブスクライブなし
# 状態の詳細:       
# 開始:             
# 終了:             
```

### 利用可能なサブスクリプションの確認
出力結果が長いので省略

```
subscription-manager list --available
```

### 3. その他

#### RHELバージョンの確認

```
cat /etc/redhat-release

# Red Hat Enterprise Linux release 8.4 (Ootpa)
```

### アカウント関連

#### Rootユーザにログイン

```
su -
# パスワード：<パスワードを入力（非表示）>
```

#### ホスト名の確認

```
hostname
```

#### ユーザーアカウントの詳細の表示①

```
cat /etc/passwd
```

#### ユーザーアカウントの詳細の表示②

```
id
```

#### ユーザーグループの作成

```
groupadd <NAME>
```

#### ユーザーグループの確認

```
cat /etc/group
```


## ショートカットキー 一覧

### 1. コピー&ペースト

#### コピー

`Ctrl + Shift + C`

#### ペースト

`Ctrl + Shift + V`

# おわりに
勉強するたびに随時更新予定です。(´・ω・｀)

## 関連資料

・Red Hat Enterprise Linux 公式

https://access.redhat.com/ja/articles/1307383
【Neos VR】VIVE Pro Eyeでアバターの瞳孔を自動調整する

# 概要
VIVE Pro Eyeを使うとユーザーの瞳孔の大きさを取得することが出来ます．
そこでBlendShapeに反映してアバターの瞳孔が自動で変化するように設定していきます．

# 設定方法
### LogiXでの設定例
EyeManagerのCombinedEyePupilSizeMillimetersから下図のようにBlendShapeへドライブします．
![Photo6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426108/960dc57b-d27d-832b-95be-045b3f81040a.png)
EyeManagerは通常Headの下に自動生成されていますが，存在しない場合は下記リンクを参考に手動でセットアップしてください．

https://qiita.com/umbrasan/items/257182a2832e41c7c053

### Componentでの設定例
今回の内容はコンポーネントのみでも設定できる内容ですので，設定例を紹介します．

アバターの適当な位置にスロットを作成し
Transform/Drivers/ValueCopy\<T>/ValueCopy\<float>
Relations/ValueMaltiDriver\<T>/ValueMultiDriver\<float>
Transform/Drivers/ValueGradientDriver\<T>/ValueGradientDriver\<float>
Transform/Drivers/ValueGradientDriver\<T>/ValueGradientDriver\<float>
を追加します．

ValueCopy\<float>/SourceにEyeManager/CombinedEyePupilSizeMillimeters
ValueCopy\<float>/TargetにValueMultiDriver\<float>/Value
ValueMultiDriver\<float>/DrivesにValueGradientDriver\<float>/Progress
ValueGradientDriver\<float>/TargetにBlendShape
をドライブします．

ValueGradientDriver\<float>/Pointsは
Positionが瞳孔の大きさ，ValueがBlendShapeの値になります
Valueを1以外にすることで最大値を決めることができ，またPointを増やすと中間値を設定することも出来ます．
![Pupil設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426108/65acf7f0-4106-7f82-90c6-6ff9a4b8bf9a.png)

# 動作確認
実際に瞳孔の大きさを変えてBlendShapeが変化しているか確認してみます．
色の変わる箱を用意し，中に入ってみると分かり易いです．
![Pupil3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426108/c77145cb-94c4-998a-5e66-b5da504fd555.gif)
今回設定したアバターをパブリックフォルダー内に入れておきますので設定時の参考にしてください．
neosrec:///U-1ab6590e-9cac-43c3-a23f-147579e0f277/R-75121e8d-3b51-4311-8d52-21c846c259dd
Pythonでsuumoの検索結果を自動でスクショする

#概要
suumoの検索結果で出てきた物件の詳細画面を自動でスクショする機能を作りました。

#環境/使用技術
* macOS Mojave
* Python 3.7.5
* chromedriver
* selenium

#事前準備

##seleniumをインストール

```
pip install selenium
```

##ChromeDriverをインストール
chromedriverをブラウザのバージョンと合わせる必要あります。

```
pip install chromedriver-binary==94.0.4606.61
```

参考

https://blog.lowaivill.com/python/chromedriver-change-version/

#実装

##ソース

```chrome.py
import chromedriver_binary
from selenium import webdriver

driver = webdriver.Chrome()

# suumoの検索結果URLを格納する
# 渋谷区のオススメ上位30件の検索結果URLを格納
url = 'https://suumo.jp/jj/chintai/ichiran/FR301FC001/?ar=030&bs=040&ta=13&sc=13113&cb=0.0&ct=9999999&et=9999999&cn=9999999&mb=0&mt=9999999&shkr1=03&shkr2=03&shkr3=03&shkr4=03&fw2=&srch_navi=1'
driver.get(url)

elem_url=[]

elems = driver.find_elements_by_class_name('js-cassette_link_href')

for elem in elems:
    elem_url.append(elem.get_attribute("href"))

i = 1
for url in elem_url:
    driver.get(url)

    w = driver.execute_script("return document.body.scrollWidth;")
    h = driver.execute_script("return document.body.scrollHeight;")

    driver.set_window_size(w,h)

    driver.save_screenshot('./img/img'+ str(i) +'.png')
    i += 1
    driver.back()

driver.quit()
```

##いざ実行
```
python chrome.py
```

chromeが自動で起動し、imgディレクトリに詳細画面のキャプチャが保存されていきます。
これであなたも物件マニア
A Hard Day's Night のフーリエ解析（イントロ、左チャンネル）

# The Beatles, A Hard Days's Nightのイントロをフーリエ解析する。
今回は、アルバム版A Hard Days's Nightの、イントロの左チャンネルのみを解析する。
この左チャンネルには、PaulのベースとGeorgeの12弦ギターが入っています。

ここの記事の、「周波数成分を表示」を参考にさせていただきました。
https://jorublog.site/python-voice-analysis/
モノラルWAVファイルのフーリエ解析がそのままできました。

フーリエ解析した結果の、matplotlibグラフはこちらです。
![Screen Shot 2021-10-24 at 11.26.18 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2117456/ed248d9b-9832-c2ac-7183-462773cf417b.png)
縦軸が音量、横軸が周波数の対数表示。
主な音符には緑の線を入れています。Dの音には赤の線を入れています。

ベースの音はD3で、特に大きい音量になっています。
問題は、このD2の音が1/3くらいD#3に寄っていること。このズレは、チューニングミスをとは言い難く、意図的にズラしたのではないかと推測します。
もしくは、ジョージ・マーティンが編集中にテープの再生速度をずらした可能性もあります。
このズレが独特な不協和音を生み出しているのではないでしょうか。

この音の倍音であるD4もズレています。３倍音のA4、４倍音のD５、５倍音の734Hzも小さな音量で入っています。
オクターブ低いD2は出力レベルが低くなっていますが、同様のズレはあります。
D7の音は不明です。
A2とF3の音もベースが出しているはずですが、チューニングのズレは観測されていません。

出版されている楽譜の音は、A2 D3 F3 G3 A3 C4 D4 G4 C5 D5 G5 E6　となっています。
D3ズレ問題の除けば、今回のフーリエ解析の結果と、ほぼ一致しています。
次回は、右チャンネルの解析をします。

```wav_fft.py
import sys
import scipy.io.wavfile
import numpy as np
import matplotlib.pyplot as plt

#音声ファイル読み込み
#args = sys.argv
wav_filename = '../Documents/hdn_left.wav'
rate, data = scipy.io.wavfile.read(wav_filename)

#（振幅）の配列を作成
data = data / 32768

##### 周波数成分を表示する #####
#縦軸：dataを高速フーリエ変換する（時間領域から周波数領域に変換する）
fft_data = np.abs(np.fft.fft(data))
#横軸：周波数の取得　　#np.fft.fftfreq(データ点数, サンプリング周期)
freqList = np.fft.fftfreq(data.shape[0], d=1.0/rate)
#データプロット

plt.xscale("log")
plt.plot(freqList, fft_data)
plt.xlim(50, 3200) #0～8000Hzまで表示

def put_f_red(f, name):
  x1, y1 = [f, f], [100, 600]
  plt.plot(x1, y1, 'r-')
  plt.text(f-5, 620, name, size=10, color='red')

def put_f(f, name):
  x1, y1 = [f, f], [200, 500]
  plt.plot(x1, y1, 'g-')
  plt.text(f-5, 520, name, size=10, color='green')

#観測された音符のライン表示
put_f_red(73, 'D2')
put_f_red(78, 'D2#')
put_f_red(147, 'D3')
put_f_red(156, 'D#3')
put_f_red(294, 'D4')
put_f_red(311, 'D#4')
put_f_red(587, 'D5')
put_f_red(1175, 'D6')
put_f_red(2349, 'D7')
put_f_red(2489, 'D#7')
put_f_red(440, 'A4')
put_f_red(734, '734Hz')
put_f(110, 'A2')
put_f(175, 'F3')
put_f(261, 'C4(mid)')
put_f(1318, 'E6')
put_f(3136, 'G7')
put_f(2794, 'F7')
put_f(349, 'F4')
put_f(392, 'G4')
put_f(523, 'C5')
put_f(2637, 'E7')
put_f(1046, 'C6')

plt.show()
```
Docker 1.7環境下でのECRのプライベートリポジトリの利用方法

Docker 1.11 以上なら
https://github.com/awslabs/amazon-ecr-credential-helper を使うことで、docker-login が 普通にECRに対しても認証できます。

今回の方法は、一旦 `docker login` したあとも、12時間経過したら再度 `docker login`を叩かないといけません。
本当になんらかの理由でアップデートできない場合、というのが今回の内容です。


### get-login-password を使った方法

aws-cliをv2にあげるのは簡単なのでとりあえずaws-cli2をあげておく
docker 1.7 だと `-password-stdin` というオプションは存在しないが、こんな感じでいける

```
docker login --username=AWS --password=`aws ecr get-login-password --profile profile`  --email=shida@example.com 0123456789.dkr.ecr.ap-northeast-1.amazonaws.com
```

あとは、通常通り docker push や pull できる
[AtCoder][ABC174F] 数字の配列における指定の範囲にある数字の種類を数える

次の問題の解答を解説する。
[ABC174 F - Range Set Query](https://atcoder.jp/contests/abc174/tasks/abc174_f)

## 問題

下記配列Aがあり、指定の範囲(l, r)にある数字の種類を答える。

```
i: 0 1 2 3 4 5 6 7 8 9
A: 2 5 6 5 2 1 7 9 7 2
```

## 考え方

配列の各数字における1つ前に発生した数字のインデクスをPとする。
初めて発生した数字には-1を記録する。

```
i:  0  1  2 3 4  5  6  7 8 9
A:  2  5  6 5 2  1  7  9 7 2
P: -1 -1 -1 1 0 -1 -1 -1 6 4
```

ここでインデクスiと配列Pに注目する。
指定の範囲(l, r)に(i, P[i])が含まれていればその数字は重複しているとわかる。

```
数字A[i]が範囲(l, r)内で重複しているかの判断： l <= i && P[i] <= r
```

よって答えは下記を計算すればよい。

```
l - r + 1 - (重複数)
```

## 重複数の計算の仕方

(i, P[i])を2次元平面上にプロットする。
すると範囲(l, r)内にある重複数というのは下記の黄色の範囲となる。
この範囲に存在する(i, P[i])の数を効率よく数え上げる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102448/0d3d767e-caad-8476-ace0-e998568a5fc6.png)

数え上げのコツとしてはまず(l, r)と(i, P[i])を全てプロットしておく。
そしてiの大きい方から座標を評価していき、(l, r)に当たったらそれまでに発見した座標の中でrより小さいP[i]を数え上げることで回答できる。
数え上げにはBITを利用すると効率よく計算できる。
【CSSの基本】そのmarginはどの要素が持っているのか

#【CSSの基本】そのmarginはどの要素が持っているのか
複数人数でコーディング作業していると、「あれ？CSSのmarginの当て方が自分のやり方と違ってて…ちょっと気持ち悪い」って思うことがありませんか？
marginの付け方に強制的なルールはないのですが、何となく一方向に向かってmarginを当てている人が多いと思います。
具体的には要素の下に付けていくタイプ（margin-bottom派）と上に付けていくタイプ（margin-top派）です。

##margin-bottom派？margin-top派？それとも？
「マージンをどっち向きに付けるか問題」は結構古くからネット上の話題に上っています。
結局、強制的なルールがない以上、結論は出ないのですが、だいたい大きく分けて
**margin-bottom派**
**margin-top派**
**ミックス派**
の3つの派閥に分かれているみたいです。

###～シンプルに考えて～margin-bottom派の意見
HTML＋CSSでコーディングをはじめてすぐはmargin-bottom派が多いのではないかと思います。
要素の間を開けるのに最も直感的に記述できるからでしょう。
私もコーディングを始めたころはmargin-bottomで要素間のスペースを開けていました。

###～スマートなCSSを目指して～margin-top派の意見
margin-bottomで作業を進めると最後の要素の下にもmarginが開いてしまう時があります。（\<ul>や\<ol>の\<li>タグなど）
解消するためには 疑似要素:last-child で最後の要素を別途修正するのですが、それがなんだか煩わしいとか。
また、上の要素と下の要素があったとして、下の要素が現れるまでは上の要素にmarginは必要ないのだから、下の要素がmarginを伴って表示されるべきというロジックがあります。

###～そうは言っても…～ミックス派の意見
margin-top も margin-bottom もあるんだから、都合に合わせて融通したらいいじゃない？
とはいえ、それだと冒頭の複数人数で作業する場合、marginのポリシーが決まっていないと対応がバラバラになってしまい、CSSの汎用性が損なわれる可能性もあります。
なんらかのルールが欲しいところです。

##親分子分派の旗揚げ
勝手に変な名前の派閥を立ち上げた感じですが、私はこんな考えでmarginルールを決めています。
基本的にはmargin-top派の「次の要素が余白を伴って表示される」という考えをベースにしています。
ただサイトの更新などでHTMLに変更があった場合、CSSもそれに伴い修正を余儀なくされるのですが、なるべく手間を減らしたいので、
要素に優先順位をつけて最も重要な要素を「親分」とし、付随する要素を「子分」として余白を持って追加されるようにします。

例えばこんなHTMLがあったとします。
.postクラスの中に記事タイトル、概要文、詳細リンクがあります。

```
<div class="post">
  <h3><a href="#">記事タイトル</a></h3>
  <p>概要文テキスト概要文テキスト概要文テキスト</p>
  <a href="#" class="button">詳細リンク</a>
</div>
```

単純なmargin-top派だと、marginの方向は以下のようになると思います。

```
<div class="post">
  <h3><a href="#">記事タイトル</a></h3>
  ↑↑↑
  <p>概要文テキスト概要文テキスト概要文テキスト</p>
  ↑↑↑
  <a href="#" class="button">詳細リンク</a>
</div>
```
概要文の\<p>タグが記事タイトルである\<h3>タグとの間にmarginを持ち、さらにその下に詳細リンクの\<a>タグが\<p>タグとの間にmarginを持つ形です。

ある時、記事タイトルの上にタイムスタンプを追加して、その代わり概要文を削除する修正が入ったとします。

```
<div class="post">
  <time>2021.11.11</time>
  <h3><a href="#">記事タイトル</a></h3>
  <a href="#" class="button">詳細リンク</a>
</div>
```

これまでのmargin-top方式だとこうなりますが、\<time>タグを追加し、\<h3>タグにmargin-topを与えないといけないです。

```
<div class="post">
  <time>2021.11.11</time>
  ↑↑↑
  <h3><a href="#">記事タイトル</a></h3>
  ↑↑↑
  <a href="#" class="button">詳細リンク</a>
</div>
```
これでも問題ないのですが、\<h3>タグは.postクラスの中では必ず表示される最も重要な要素（親分）だと思われるので、ここを何度も修正したくありません。
そこで、、\<h3>タグを中心にそのほかの要素がmarginを持つようにしてみます。

```
<div class="post">
  <time>2021.11.11</time>
  ↓↓↓
  <h3><a href="#">記事タイトル</a></h3>
  ↑↑↑
  <a href="#" class="button">詳細リンク</a>
</div>
```
なーんだ、\<time>タグにmargin-bottomをつけて、\<h3>タグには何もつけないようにしただけじゃないか！
確かにそうなんですが、.postクラスの中心である\<h3>タグは、今後の更新でもほぼなくならない要素です。
\<h3>タグを中心にすることで、CSSの修正は他の要素に絞られます。
追加・削除する要素のみ修正することができるようになります。
（もっとも、デザインがより複雑化すると、こんなに単純ではないですが。）

ともあれ、タグの持つ意味や文章構造を重要視するならば、HTML5的にもよい考えなのかなと思っています。
RHEL 8.4 サブスク登録手順

###1. システム プロファイルの新規作成

以下のURLを参照する。

https://access.redhat.com/management/systems

[新規作成]をクリックする。

![6d042da0-4fa0-5344-cce9-60d5d8d47bfe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473120/19ef9207-5e64-d707-27b3-0e943c3d0fc8.png)


[システムタイプ]、[名前]、[アーキテクチャー]、[仮想 CPU数]、[Red Hat Enterprise Linux バージョン]の各設定項目を設定し、[作成]をクリックする。

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473120/960b5594-22ac-5280-b238-7ed7e8810fd1.png)


[testrhel（プロファイル名） は、UUID: xxxx が割り当てられ、正常に作成されました]が表示されていることを確認する。

[サブスクリプション]タブをクリックする。

![スクリーンショット 2021-10-24 230239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473120/53204154-3a7e-e59f-c785-426f9fc334ba.png)


[サブスクリプションのアタッチ]をクリックする。

![スクリーンショット 2021-10-24 231110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473120/56823ad0-618a-5162-d557-d3fc469837dd.png)

アタッチ先を選択する。
サブスクリプションのどちらかにチェックを入れ、[サブスクリプションのアタッチ]をクリックする。

![スクリーンショット 2021-10-25 000631.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473120/87ad5b58-3842-3bf3-bbe5-3559e2a274b9.png)

[証明書のダウンロード]をクリックする。
※ダウンロードファイルは zip フォーマットになる。

![スクリーンショット 2021-10-25 002558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473120/43e5c1c0-be47-2571-dc64-c06bbfacd00e.png)

WinSCPやFFFTPなどで、ローカル作業端末にダウンロードした「証明書」ファイル（xxx.pem）を対象のLinuxサーバの[/tmp/]配下などに配置する。

![スクリーンショット 2021-10-25 011828.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473120/6c0eee2d-82af-76ef-37ee-f2ae6a33c00c.png)

以下のコマンドで証明書ファイルをインポートする。
※[testrhel.pem]は[cp]コマンドで元のファイル名から変更しております。(´・ω・｀)

```
subscription-manager import --certificate=/tmp/testrhel.pem
# 証明書 testrhel.pem は正常にインポートされました
```

※重要（RedHat公式引用）
この手順を行うと、カスタマーポータルのシステムプロファイルにおけるサブスクリプションステータスが "Unknown" となり、# subscription-manager status コマンドでも "Unknown" と出力されます。

実際に確認してみる。

```
subscription-manager status


# +-------------------------------------------+
#    システムのステータス詳細
# +-------------------------------------------+
# 全体のステータス: 不明
# 
# システムの目的の状態: 不明
```

```

subscription-manager list


# +-------------------------------------------+
#     インストール済み製品のステータス
# +-------------------------------------------+
# 製品名:           Red Hat Enterprise Linux for x86_64
# 製品 ID:          479
# バージョン:       8.4
# アーキテクチャー: x86_64
# 状態:             不明
# 状態の詳細:       
# 開始:             
# 終了:             
```

#さいごに

いろいろ調べてみたけど、外（ネットワーク）に繋げられないとダメみたいなのね。
もしかしたらどこかの機会で再調査はするかも。

お疲れ様でした。(´・ω・｀)

##参考資料

https://access.redhat.com/documentation/ja-jp/red_hat_subscription_management/1/html/using_red_hat_subscription_management/registering-offline
Microsoft Power Automate TIPS & FAQ

以下のような運用作業を自動化しようとして、以前使用したUIPathでと考えていましたが、Microsoft Power Automateもよさそうなので調べてみました。
①Slackで担当者に作業開始を連絡
②運用作業処理
③Slackで担当者に作業終了を連絡

#  ■導入前
##　Desktop版とクラウド版がある
　前者はインストールが必要、後者はURLアクセスするだけ

##　Desktop版インストール方法
　・「Microsoft Power Automate Desktop インストール」で検索
　・ダウンロード＆インストール
　・ブラウザを自動化する場合はインストール画面に表示されるリンクをクリックしてブラウザの追加機能アプリをインストールする
　・PC再起動

#  ■基本
##　ブラウザでの操作を記録　→　Webレコーダー
##　PC画面の操作を記録　→　デスクトップレコーダー
##　基本的なプログラム作成の流れ
①レコーダーで操作を記録
②ワークフロー自動生成させる
③ワークフロー修正
④ブレークポイント設定
⑤実行
##　ワークフローの保存先
Onedriveの↓が自動で作成され保存されます。デフォルト、共有でフォルダが作成されているのは大丈夫なのだろうか。。。:disappointed_relieved:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/78092997-abd4-c7fa-fb05-a17d7daaf36e.png)
##　アクションはコピー(Ctrl+C)、切り取り(Ctrl+X)、貼り付け(Ctrl+V)でできる
##　アクションを残したまま無効・有効にする
右クリックメニューでできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/648f214e-7a62-e7fd-50b2-a0d80d679d01.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/80de608c-830e-32c4-694f-ca8a931d6ce6.png)
##　画面の状態によっては意図しない動きをするので注意！
勝手にDelete、送信などしてしまうかも。。。怖:ghost:
##　Waitはあまり使わないほうがよさそう
##　待機させるならウィンドウやコントロールにフォーカスが移るまでというように待機させるのがベター
##　「ウィンドウのUI要素をクリックする」で対象UIを設定しておくとそのUIが存在しない場合エラーとなるので便利
##　重要なアクションを行う直前でメッセージボックスを出すようにする
##　テスト時は重要なアクションを無効にしておく
##　実行はF5キー、ステップ実行はF10

#  ■Windowsデスクトップ画面操作
##　SlackデスクトップアプリをWindows検索から調べて起動する
Slack起動するだけならWin+Rで起動させた方がよさそう
Waitで２秒待機させるのはよくないので待機などさせるように変更予定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/95cf7cb4-0d6a-92ef-e9fa-633797e26291.png)

##　Slackデスクトップアプリからメッセージを投稿する
セキュリティに厳しい環境ではクラウド経由してSlack投稿できないのでSlackデスクトップアプリを操作して投稿する
対象のワークスペースに既にフォーカスがあるとうまくいかないので一旦別のワークスペースに移動させている
もっとシンプルにできそう。。。:thinking:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/6a0b6e1e-3402-9eb7-9882-12d2e35d969f.png)
Bootstrap4.0.0-alpha.6 のModal is transitioningを解消したい

#問題

Bootstrap4.0.0-alpha.6において、公式リファレンスのモーダルを実装し、モーダルの開閉を繰り返すと、`Uncaught Error: Modal is transitioning`というエラーが発生する。

##該当のコード
[公式リファレンスのモーダル](https://getbootstrap.jp/docs/4.2/components/modal/)

```html
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>
```
##解消法1
####バージョンを上げる。
どうやら`beta1`では解決されているらしい。
https://github.com/twbs/bootstrap/issues/21607#issuecomment-330156180

##解消法2
問題の根幹は`fadeクラス`にあるようなので、これを削除するとエラーは発生しなくなる。
ただしfadeinっぽいアニメーションは消える。

```.html
<div class="modal fade ←これ" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">

```

##引用
https://stackoverflow.com/questions/43266664/modal-is-transitioning-error-with-bootstrap4-alpha6-modal
【RHEL】Tera Term の文字化け備忘録

#あいさつ
ども、そこらへんのエンジニア、けいしーです。
ちょろっとメモ書きレベルなので、かなり記事ざっくりしてます。

##Tera Termの文字化けを直したい

###以下のコマンドで文字コードを確認する
文字コードのズレが原因で文字化けが発生する為。

```
echo $LANG
# ja_JP.UTF-8
```


参考資料

https://www.j-oosk.com/teraterm/mojibake/563/

###バージョンの関係で該当設定箇所が存在しなかったので以下設定

[全般]をクリックする。

![スクリーンショット 2021-10-25 014307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473120/e84be0dd-ed7b-97ea-4e1f-7d30291862b2.png)

[言語]の設定項目を[UTF-8]を選択し、[OK]をクリックする。

![スクリーンショット 2021-10-25 014337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473120/491159f1-d077-e466-c7bd-44f80a22cfd2.png)

おしまい。(´・ω・｀)
Certified Kubernetes Administrator(CKA) 受検記録


https://qiita.com/hitsumabushi845/items/a6ae8935eaf509fb5381

先日の CKAD に引き続き、Certified Kubernetes Administrator(CKA) を受検し、合格しました。
同様に受検記録を投稿します。

...といっても、試験全体の雰囲気は上述の CKAD のときと変わりないので、受検までにやってたことのまとめが主になります。

## 受検までにやってたこと

### Udemy

CKAD の時と同様に、Udemy の "Certified Kubernetes Administrator (CKA) with Practice Tests" を中心に取り組んでいました。

https://www.udemy.com/share/101WmE3@rTlQDpfaDbV5NTnf84cnOb7obENsCEZ9eHuBaMEhVth1kgawieYvq48pmZIPiGeY/

学習ログも CKAD の時と同様に個人ブログに書いていました。

- https://hitsumabushi845.hatenablog.com/entry/udemy-cka-section-three
- https://hitsumabushi845.hatenablog.com/entry/udemy-cka-section-five
- https://hitsumabushi845.hatenablog.com/entry/udemy-cka-section-seven
- https://hitsumabushi845.hatenablog.com/entry/udemy-cka-section-eight-nine
- https://hitsumabushi845.hatenablog.com/entry/udemy-cka-section-ten-eleven
- https://hitsumabushi845.hatenablog.com/entry/udemy-cka-section-thirteen-fourteen

また今回、Udemy の当コースと試験範囲（[CKA Exam Curriculum](https://github.com/cncf/curriculum/blob/master/CKA_Curriculum_v1.22.pdf)）を見比べて、各項目と対応する講義動画の一覧を作ったりしました。
これは、Udemy コースのつくり自体は過去の試験範囲を元に作られており、今は範囲外となっているトピックも含まれるため、集中すべきトピックを意識するためです。

https://hitsumabushi845.hatenablog.com/entry/cka-curriculum-memo

といっても CKAD で触れたトピック以外の講義動画・ハンズオンラボは全て通しましたが。

### Killer.sh

いつの間にやら、CKA/CKAD/CKS の受検資格を購入すると、2回分の [Killer Shell](https://killer.sh/) での模試がついてくるようになっていました。

https://training.linuxfoundation.org/announcements/linux-foundation-kubernetes-certifications-now-include-exam-simulator/

Killer Shell は CKA/CKAD/CKS の試験シミュレータ（模試）を提供するサービスで、Katacoda や Kodecloud のようにブラウザ上でコンソールを実際に叩ける、本番さながらの環境で練習することができます。
Killer Shell の概要については以下の記事が詳しいです。

https://blog.vpantry.net/2020/12/killer-shell/

Killer Shell サイドも謳っているように、ここでの問題は実際の試験より難しめに作られているため、このシミュレータで合格ライン（2021年10月現在では 66%）を取れれば本番の試験でも合格できると思います。
このシミュレータは1回につき 36 時間有効な環境が提供されるので、試験前々日くらいからはこれだけをやっていました。
当日も試験開始時間を15時くらいに設定し、直前までこのシミュレータで確認してました。

### kubeadm の練習

これはかなり前にやった。

https://qiita.com/hitsumabushi845/items/4a24109cf1408c0e30de

## 受検環境

環境については冒頭リンクの CKAD のときと同様。
コロナ禍運用のマスク着用可は続行中です。

今回腕とか胸にガッツリプリントのあるロンTを着てたせいか、「その袖のプリントをしっかり見せなさい」と言われてしまった😅
普通に無地の服を着た方が誤解されなくて済みます（）

## 結果

![Screen Shot 2021-10-25 at 1.24.49 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/6bbd9cb5-f473-9f0d-b86a-363541b5fea7.png)

93点で合格。相変わらず準備しすぎた気がする。
とはいえ良い点取った方がちゃんとやった感があるので悪い気はしない。

## 感想

CKAD の時に比べ、普段マネージドサービスを使ってるだけでは触れないトピックが入ってくるので受検前の不安は大きかった。
トラブルシューティング系の設問とかでは、想定される原因は多岐に渡るので、場合によっては全然わからない可能性もあるな・・・！とか。

ただまあ、今の感覚的には多分 CKAD 受かった直後ぐらいに kubeadm でのクラスタ構築・クラスタアップグレードを一通りさらっておけば十分合格ラインだったような気がします。プラスアルファで Hard Way もやってもいいかもレベル。

さて、今回 CKA を取得したことによって Certified Kubernetes Security Specialist(CKS) の受検資格がアンロックされたのですが、今のところ受検の予定はありません。いつか取れるといいなーと思ってはいます。
[Java]データ型(基本型)について（初心者）

# はじめに
本記事では、Javaの`データ型`について記述します。

# データ型とは
Javaのデータ型は、`基本型`と`参照型`に分けられます。
今回は、`基本型`についてになります。

```
データ型
|
|-基本型(今回はここ！)
|   |
|   |-論理型
|   |
|   |-整数型
|   |
|   |-浮動小数点型
|   |
|   |-文字型
|
|-参照型
    |
    |-クラス型
    |
    |-インターフェイス型
    |
    |-配列型
```

## 論理型
boolean...真偽型（true、またはfalse）
論理演算の結果として、trueかfalseで返すということになります。

また、trueかfalseなので、
サイズとしては、`1bit`になります。

```Bool.java
class Bool {
  public static void main(String[] args) {
    int var_a = 1;
    int var_b = 10;
    boolean var_bool;

    var_bool = (var_a < var_b);

    System.out.println(var_bool);
  }
}
```

ターミナル

```
% javac Bool.java 
% java Bool
true
```

## 整数型
名前の通り、整数を表すために使用されます。

|データ型|サイズ|値の範囲|
|-|-|-|
|byte|8bit|-128~127|
|short|16bit|-32768～32767|
|int|32bit|-2147483648～2147483647|
|long|64bit|-9223372036854775808～9223372036854775807|

値の範囲は、
例えば、`8bitならば2^8(2の8乗)`、`16bitならば2^16`というように計算することでわかります。

2^8 = 256
-128~127は全部で256個ありますね。（0を含む）

```Number.java
class Number {
  public static void main(String[] args) {
    byte var_b = 1;
    short var_s = 30000;
    int var_i = 4000000;
    long var_l = 500000000000000L;  // Longは末尾に「L」をつける。

    System.out.println(var_b);
    System.out.println(var_s);
    System.out.println(var_i);
    System.out.println(var_l);
  }
}
```

```
% javac Number.java 
% java Number
1
30000
4000000
500000000000000
```

## 浮動小数点型
名前の通り、小数を表すものです。

|データ型|サイズ|値の範囲|
|-|-|-|
|float|32bit|±3.40E38～±1.40E-45|
|short|64bit|±1.79E+308～±4.94E-324|

```Main.java
class Main {
  public static void main(String[] args) {
    float number1 = 8.5f; // 末尾に「f」をつける。
    double number2 = 3.4;
    
    System.out.println(number1+number2);
    System.out.println(number1-number2);
  }
}
```

```
% javac Main.java       
% java Main       
11.9
5.1
```

## 文字型
char型になります。
`Unicode`という文字コード規格での一文字を、
`0～65535`の範囲の整数で表すものです。
つまり、`小数点以下がある数字、マイナスの数字、65536以上の数字を直接代入できない`です。

```Char.java
class Char {
  public static void main(String[] args) {
  char c1 = 'A';
  c1 = 65;

  char c2 = 66; 

  System.out.println(c1);
  System.out.println(c2);
  }
}
```

```
% javac Char.java
% java Char
A
B
```

以上です。

# 終わりに
最近まで資格の勉強でしたので、
プログラミングに戻ってきましたが、
やはり楽しいですね。

以下参考サイトです。
[Javaコード入門](https://java-code.jp/68)
[Let'sプログラミング](https://www.javadrive.jp/start/var/index4.html)
[Java超入門コース 合併版【Javaの超基本的な部分をたった1時間で学べます】【プログラミング初心者向け入門講座】](https://www.youtube.com/watch?v=kjxetd5ylzI&t=263s)
[charは文字でStringは文字列! Javaでの文字の扱い方を基礎から解説](https://www.bold.ne.jp/engineer-club/java-char)

明日も頑張ります！
ELB（ALB）ターゲットの healthcheck アクセスログを専用のログに出力する（Apache）

#前提
まず前提として、ApacheのVirtualHostは１件目がそのサーバのデフォルトのVirtualHostになります。

例えば以下のようにsite1〜3のVirtualHostが記述されている場合に、意図しないアドレスでアクセスされた場合、一番上のsite1がデフォルトのVirtualHostとして参照されます。

```httpd.conf
・
・
・
<VirtualHost *:80>
    ServerName site1
    CustomLog /var/www/logs/site1_access_log custom
</VirtualHost>

<VirtualHost *:80>
    ServerName site2
    CustomLog /var/www/logs/site2_access_log custom
</VirtualHost>

<VirtualHost *:80>
    ServerName site3
    CustomLog /var/www/logs/site3_access_log custom
</VirtualHost>
・
・
・
```

つまり意図しないアドレスでアクセスされた場合、アクセスログは/var/www/logs/site1_access_logに吐かれるということになります。
AWS でELB（ALB）を使っていると/var/www/logs/site1_access_logに下記のようなログが吐かれます。

```
XX.X.X.XXX - - [20/Oct/2021:00:00:00 +0900] "GET /healthcheck.html HTTP/1.1" 200 - "-" "ELB-HealthChecker/2.0"
```


#デフォルト用にダミーのVirtualHostを追記する

一番上にダミーのVirtualHostを追記する。

```httpd.conf
・
・
・
<VirtualHost *:80>
    ServerName dummy
    SetEnvIf User-Agent "ELB-HealthChecker.*" elb
    CustomLog /var/www/logs/healthcheck_access_log custom env=elb
</VirtualHost>

<VirtualHost *:80>
    ServerName site1
    CustomLog /var/www/logs/site1_access_log custom
</VirtualHost>
・
・
・
```

これでhealthcheckのアクセスログが↓のログに吐かれる。
/var/www/logs/healthcheck_access_log
備忘録~DRY~

###ファイルの読み込みについて

・include
指定したファイルを読み込む。
読み込みが失敗しても処理は中断されない。
HTMLやテキストを読み込むときに使用。

```
include'~~~~~';
```
・require_once
指定したファイルを読み込む
読み込みが失敗すると中断される。
その名の通り、一回しか読みこまない。
関数などの処理を読み込むときに使う。

```
require_once'~~~~~';
```

これらを用いてHTMLとPHPはそれぞれファイルに分割し、それらを読み込んで使う。
そうするとコードを修正したいときに共通の一つのファイルを修正するだけですむ。

ファイル分割、関数化をうまく行い、一つのコードを使いまわせるようにする！DRY！