OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry PiでDNS serverを立てる

# はじめに

Kuberentesを使用しているとIngress機能を使用して、名前したくなるので、
Raspberr Piを使用してDNSサーバーを立てたくなったので、構築する

# DNSサーバー導入

[Dnsmasq](https://datatracker.ietf.org/doc/html/rfc3397)を使用して構築する
以下のコマンドで、インストールする

```bash
sudo apt install dnsmasq
```

インストール後`/etc/dnsmasq.conf`があるので有効状態を確認すると以下の通りになる。

```bash
$ cat /etc/dnsmasq.conf |grep -v "^#"|grep -v '^\s*$'
dhcp-mac=set:client_is_a_pi,B8:27:EB:*:*:*
dhcp-reply-delay=tag:client_is_a_pi,2
```

以下の通りに書き換える

```config
#dhcp-mac=set:client_is_a_pi,B8:27:EB:*:*:*
#dhcp-reply-delay=tag:client_is_a_pi,2
domain-needed
bogus-priv
strict-order
local=/bookserver2.local/
server=8.8.8.8
server=8.8.4.4
domain=bookserver2.local
cache-size=15000
```

書き換え後、以下のコマンドを実行数

```bash
systemctl restart dnsmasq
```

後は、必要に応じてhostsファイルに追加する

```bash:/etc/hosts
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1               bookserver2
192.168.0.21    bookserver2 bookserver2.local
```
# 動作テスト
PCのIPアドレスでDNSを直接指定するか、ルーターのDNSの指定で、
サーバのIPを指定すれば、DNSを使用できる

dnsサーバー以外のPCでdigコマンドで動作確認できる

```bash
$ dig bookserver2

; <<>> DiG 9.16.1-Ubuntu <<>> bookserver2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44061
;; flags: qr rd ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;bookserver2.                   IN      A

;; ANSWER SECTION:
bookserver2.            0       IN      A       192.168.0.21
bookserver2.            0       IN      A       127.0.1.1

;; Query time: 10 msec
;; SERVER: 172.28.16.1#53(172.28.16.1)
;; WHEN: Thu May 27 21:19:21 JST 2021
;; MSG SIZE  rcvd: 72
```
[Laravel]一意なファイルパスを作成する方法

# 概要
Laravelで一意なパスになるファイルを作成したかったのですが、特にメソッドが用意されているようではなかったのでそのメモ書きになります。
他の言語でも応用が効く方法になってると思います。

# 背景
phpの関数に[tempnam](https://www.php.net/manual/ja/function.tempnam.php)という関数が用意されていましたが、ファイルのフルパスを返すようで、今回は相対パスもしくはファイル名が欲しかったため代わりに[uniqid](https://www.php.net/manual/ja/function.uniqid.php)という関数を使うことにしました。
しかし[uniqid](https://www.php.net/manual/ja/function.uniqid.php)関数では、一意なファイルパスを作成出来ることが担保出来ないようだったので、次の関数を用意しました。

# 方法
``` sample.php
function getUniquePath():string
{
  // 適当なprefix付きのパスを作成
  $path = uniqid('some-dir/some-prefix_');

  // 作成予定のディレクトリ先に同一ファイルパスがないことを確認
  if(Storage::disk('local')->missing($path)){
    return $path;
  }
  
  return $this->getUniquePath();
}
```


非常に簡易的ですが上記のような関数を用意することで、一意なパスのファイル名を得ることが出来るかと思います。
GitHubのリポジトリの最初のcommitを見つける方法

GitHubにあるレポジトリの最初のコミットを見つける方法です。
InsightsタブのNetworkを選択し、Network graphが表示されたら、
Shift + ←キーでgraphの左端に移行することができ、グラフの最初のノードを選択できます。
【アウトプット】SQLのCASE式を用いて異なる条件の集積を求める方法

## はじめに
「達人に学ぶSQL徹底指南書第2版」におけるCASE式に関する箇所で、
理解が一度詰まった部分を、理解を整理するためにアウトプットとして書いています。
CASE式を用いて異なる条件の集積を求める方法を後半で記述しています。
学び始めて1週間経ってない超初心者なので間違っていたらご指摘いただけると嬉しいです:bow:

## CASE式の基本的な文法
CASE式とはSQLにおける条件分岐を記述するための重要で便利な技術。
CASE式の書式には、以下の２つがある。

#### 単純CASE式 (simple case)
```
CASE color
  WHEN '1' THEN '白'
  WHEN '2' THEN '黒'
ELSE 'その他' END
```
単純CASEの方が簡潔に書けるが、できることも限られる。

#### 検索CASE式 (searched case)
```
CASE WHEN color = '1' THEN '白'
  WHEN color = '2' THEN '黒'
ELSE 'その他' END
```
単純CASEでできることは検索CASEでもできる。

## CASE式を使う時の注意点

- 真になるWHEN句は無視されるため、排他的に記述する方がいい。
- 全ての分岐でCASE式の返すデータ型が一致している必要がある。
- ENDの書き忘れに注意する。
- ELSE句は必ず書く。  
→ELSE句はオプションであり記述しなければ「ELSE NULL」になるが、「エラーにならないが結果が違う」というバグの温床になりやすいから。
- CASE式自体には集積機能がないため、レコードを集積するためには集積関数が必要。


## 異なる条件の集積をCASE式を使って1つのSQLで行う
異なる条件の集積という言葉に「？」となったが、２軸を持ったテーブルということで理解。
例えば、AグループとBグループで黒白赤から好きな色のアンケートを取った結果が以下のようなテーブルだとする。


| color | a_or_b_group | num_of_people |
| ----- | ------------ | ------------- |
| white |	a |	60 |
| white	| b |	40 |
| black	| a |	100 |
| black	| b | 100 |
| red	| a |	100 |
| red   | b |	50 |

このテーブルから色別・グループ別の人数を求める場合、
次のようなコードだと１つのSQLで集積を行うことができる。
１軸から２軸のテーブルにし、検索CASE式を用いる。

```
SELECT color,
  SUM(CASE WHEN a_or_b_group = 'a' THEN num_of_people ELSE 0 END) AS a_group,
  SUM(CASE WHEN a_or_b_group = 'b' THEN num_of_people ELSE 0 END) AS b_group
FROM colorTbl
GROUP BY color;
```
こんな感じで書いているコードを最初に見た時、
合計を出しているわけじゃないからSUMいらないのでは…？と思ったが、
SUMを入れないと集約されずに同じ数のレコード数が結果として出されてしまう。

上記コードを実行すると、以下のテーブルが結果として出力される。

| color | a_group | b_group |
| - | - | - |
| red	| 100 | 50 |
| black	| 100 |	100 |
| white | 60 | 40 |

これで完了。
すっきりしたテーブルになった。

## 参考本
達人に学ぶSQL徹底指南書第2版
Wordpressでよく使うifでの条件分岐

#どうも7noteです。Wordpressでよく使う条件分岐をまとめてみました。

wordpressでWEBサイトを作成する際に、

**「headタグやコンテンツをページによって出し分けしたいが、共通パーツとして1ファイルで管理したい」**

こんな場合、ページの種類によってタグを出し分けるためにwordpress用の関数とif文を合わせることで実装が可能になります。

他にも「スマホのときだけ」や、「アイキャッチ画像が登録されているなら」などif文とwordpressの関数を組見合わせることで、簡単に設計することができます。

そんな**便利なWordpressのifでよく使う条件分岐をまとめてみました。**


## 「どのページかを判断する」

```php
<?php
if (is_front_page()、is_home()) {
	// TOPページかどうか
} elseif (is_category()) {
	// 一覧ページかどうか
} elseif (is_page()) {
	// 固定ページかどうか
} elseif (is_single()) {
	// 記事ページかどうか
} elseif (is_category()) {
	// カテゴリページかどうか
}
?>
```

## 2ページ目以降かを判断する

```php
<?php if ( is_paged() ) : ?>
  ここに処理を書く
<?php endif; ?>
```

## 404ページかを判断する


```php
<?php
if (is_404()) {
  // 404ページかどうか
}
?>
```


## アイキャッチ画像が設定されているかどうか

```php
<?php if ( has_post_thumbnail() ) : ?>
    <?php the_post_thumbnail(); ?> <!-- アイキャッチ画像が設定されていれば表示 -->
<?php else: ?>
    <img src="no-image.jpg" alt="" width="" height=""> <!-- 画像が設定されていなければ代替画像を表示 -->
<?php endif; ?>
```


## スマートフォンかどうかを判別する

```php
<?php
if ( wp_is_mobile() ) {
	/* ここにモバイル向けの内容を表示、echo する */
}
?>
```


## Wordpressのメディアファイルかどうか

```php
<?php if ( is_attachment() ): ?>
<meta name="robots" content="noindex"> // メディアファイルのページだったら検索を拒否
<?php endif; ?>
```

これでメディアをアップロードした場所のページ（URL）単体がインデックスされることはありません。


## まとめ

様々な条件分岐を紹介しました。
私もそこまでよく使うわけではないので、今後少しづつ増やしていければと思います。


#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
elm327の研究 その2

# 概要

elm327を調べてみた。

# 対応プロトコル

|番号|プロトコル|既知の車種|
|:--|:--|:--|
|1. |SAE J1850 PWM||
|2. |SAE J1850 VPW||
|3. |ISO 9141 - 2|saab 9-3|
|4. |ISO 14230 - 4 KWP ( 5 BAUD INIT )|ルノー　クリオ|
|5. |ISO 14230 - 4 KWP ( FAST INIT )||
|6. |ISO 15765 - 4 CAN ( 11 BIT ID, 500 KBAUD )|スマート　フォーフォー|
|7. |ISO 15765 - 4 CAN ( 29 BIT ID, 500 KBAUD )||
|8. |ISO 15765 - 4 CAN ( 11 BIT ID, 250 KBAUD )||
|9. |ISO 15765 - 4 CAN ( 29 BIT ID, 250 KBAUD )||
|10. |SAE J1939 CAN ( 29 BIT ID, 250 KBAUD )||


# ATコマンド

|コマンド|意味|
|:--|:--|
|BRD hh			|ボーレート除数hhを試す
|BRT hh			|ボーレートタイムアウトを設定する。
|D			|	全てデフォルトに設定する。
|E0, E1			|Echo off, on*
|FE			|	イベントの消去
|I			|	version IDの表示
|L0, L1			|改行のoff,on
|LP			|	ローパワーモードに移行
|M0, M1			|メモリ off,on
|RD			|	保存されたデータの読み込み
|SD hh			|データhhの保存
|WS			|	ウォームスタート (ソフトウェアリセット)
|Z			|	全てをリセット
|@1			|	デバイスディスクリプションの表示
|@2			|	デバイス識別子の表示
|@3 cccccccccccc	|@2識別子を記憶
|PP xx OFF		|プログラムパラメータ xxの無効化
|PP FF OFF		|全てのプログラムパラメータの無効化
|PP xx ON		|	プログラムパラメータ xxの有効化
|PP FF ON		|全てのプログラムパラメータの有効化
|PP xx SV yy		|PP xxに値yyを設定
|PPS			|	PPの結果を表示
|CV dddd 		|	dd.ddボルトに調整。
|CV 0000		|	CV値を工場設定値に戻す。
|RV			|	入力電圧の読み込み
|IGN			|	IgnMon入力レベルの読み込み
|AL			|	ロング（> 7バイト）のメッセージを許可する
|AMC			|	アクティビティモニタカウントを表示
|AMT hh			|アクティビティモニタのタイムアウトをhhに設定
|AR			|	自動受信
|AT0, 1, 2		|	アダプティブタイミング　オフ、AUTO1*、AUTO2
|BD			|	バッファのダンプ表示
|BI			|	初期化シーケンスを迂回する。
|DP			|	現在のプロトコルを表示する。
|DPN			|	番号別のプロトコルを表示。
|H0, H1			|ヘッダー off*,on
|MA			|	全てをモニターする。
|MR hh			|レシーバー用のモニタ = hh
|MT hh			|トランスミッタ用のモニタ = hh
|NL			|	通常の長さのメッセージ*
|PC			|	プロトコルの終了
|R0, R1			|レスポンス off, on*
|RA hh			|受信アドレスをhhに設定
|S0, S1			|スペースの表示 off,on*
|SH xyz			|ヘッダーをxyzに設定
|SH xxyyzz		|ヘッダーをxxyyzzに設定
|SH wwxxyyzz		|ヘッダーをwwxxyyzzに設定
|SP h			|	プロトコルをhに設定し保存
|SP Ah			|プロトコルをAuto,hに設定し保存
|SP 00			|保存しているプロトコルを削除
|SR hh			|レシーブアドレスをhhに設定
|SS			|	標準の検索順序を使用 (J1978)  
|ST hh			|タイムアウト時間をhh x 4 msecに設定
|TA hh			|テスターアドレスをhhに設定
|TP h			|	プロトコルhを試す。
|TP Ah			|プロトコルhを試し自動的に検索する。

# 過去、所有の車のOBD事情。


## ルノー　クリオ　2001

クリオのOBDポートは、灰皿の下にあります。 
ELM327のコードは、ATSP4です。 
プロトコルは、ISO14230-4 KWP(5baud init 10.4k baud)です。
ECUは、SIRIUS32Nです。

## スマート　フォーフォー
OBD２のコネクターは、ハンドルの下のカバーを引っぱって、はずすと出てきます。
ELM327のコマンドでATSP6です。
プロトコルは、ISO 15765-4 CAN (11 bit ID 500 kbaud)で、CANです。
ecuは、bosch motronicです。

## saab 9-3 2003

ELM327のコマンドでATSP3で動作します。
ISO9141-2(5 baud init 10.4k baud )です。
コネクタは、ハンドルの真下にあります。
ECUは、TRONIC5です。




以上。
[Xcode]Unable to install "アプリ名"の対処法

## エラー状況
ビルドを実施し、Successと表示されたがその直後に`Unable to install "アプリ名"`とエラーが発生し、シミュレータ or 実機が起動しないというエラー

## 解決方法
Xcodeのプロジェクトファイルへ移動し、`TARGET/Build Phases/Embed App Extention`にある『Copy only when installing』のチェックボックスが外れていたので付け直すと無事、インストール完了。

## 備考
今回のエラーメッセージをGoogleで検索すると、実機にダウンロードしているアプリの数が上限に達している場合の対処法や、デバイスに登録されているProvisioning profileを削除する対処法に関する記事をたくさん見かけたが、いずれも該当せず少し手こずった。

ログはしっかり読もう（笑）
Windowsでgit mvしたらPermission denied


# 事象 : エクスプローラでリポジトリのディレクトリを開いた状態で`git mv`したら怒られた
- 環境
    - Windows10 Pro バージョン1909
    - git version 2.25.0.windows.1

```bash
$ git mv oldname newname
Rename from 'path/to/oldname' to 'path/to/newname' failed. Should I try again? (y/n) n
fatal: renaming 'path/to/oldname' failed: Permission denied
```

## 原因 : エクスプローラを開いているから
参考 : [[git]git mv で“permission denied”が発生する場合はExplorerのプロセスをKillすると直る &#8211; エンジニ屋](https://sevenb.jp/wordpress/ura/2017/03/23/gitgit-mv-%E3%81%A7permission-denied%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AFexplorer%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92kill/)

根本的な仕組みはよくわからないがエクスプローラが邪魔してるらしい。

### 対応 : エクスプローラーを閉じる

```bash
# 1. エクスプローラを閉じて、今一度git mvすると
$ git mv oldname newname
# 2. 難なくいけた。
$ ls -la | grep name
drwxr-xr-x 1 ponsuke 1049089        0  5月 14 08:54 newname
```
troccoで冪等性を考慮しつつスナップショットを取得する設定の話

# はじめに
データ分析基盤において冪等性の問題は避けて通れないものではないかと思います。

当社では[troccoを導入](https://qiita.com/t_odash/items/9ba5bb24a7ab07603ec1)し、分析対象データのBigQueryへの集約を進めているのですが、集約にあたり細かなニーズが出てきました。一部のテーブルでスナップショットを取得したい(過去時点のデータを日別に保存しておきたい)というもので、これの取得時に冪等性を考慮する必要がありました。当初はBigQueryのシャーディング機能で実現しようかとも考えたのですが、troccoの機能で実現できました。

# 0. troccoについて
troccoはSaaS版Embulkといったサービスで、各種データ転送をGUIで設定できるだけでなく、Redshift/BigQueryへのクエリ発行やジョブ管理等の便利機能も提供されています。詳細は[公式ページ](https://trocco.io/lp/index.html)をご確認下さい。

# 1. 冪等性を担保する話
## 1.1 概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/9445595d-cd8e-77e4-55b1-c13b5091b720.png)


上図は処理の流れを端的に表したものです。データ転送機能を用いてRDSインスタンスの内容をBigQueryに転送したのち、データマート機能を用いてスナップショットを保存しています。ここで冪等性を考慮し、保存時に当日分のスナップショットが既に存在する場合は当日分を削除してから保存する処理にしています。また、こうした処理の流れを[ワークフロー機能](https://trocco.io/lp/function/workflow.html)で管理しています。

データ転送時の冪等性の話は今回は割愛します。

##1.2 データマート機能と冪等性
### 1.2.1 データマート機能

上述の通り便利機能のうちのひとつである`データマート機能`(BigQueryへのクエリ発行機能)を利用しています。これは公式の[説明ページ](https://trocco.io/lp/function/dwh.html)にあるようにDWH(現在はBigQueryまたはRedShift)に対してクエリを発行して集計や変換を行う為の機能です。

設定画面にはクエリ本体やクエリ発行先のテーブル、結果を書き込むテーブルを入力する欄が設けられています。変数を作成することもでき、これによってキューイング時の日付をクエリに入れ込むことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/13ac866b-660e-690c-8508-a60256e9458d.png)


以下はクエリの例ですが、保存したいカラムに加え、変数を利用したパーティション用カラムdtも記述しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/11392de1-df41-5f36-39df-fb0ff61bc17a.png)

このdtカラムを出力先設定の項目で入力することで、保存先テーブルのパーティションとして利用できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/6757d42c-8db9-1161-24c2-7d023e4d70cd.png)

### 1.2.2 冪等性の話
ここまで設定してようやく冪等性の話に帰ってくるのですが、以下の通り`転送前に実行するクエリ`という便利機能があります。これを用いると、実際に転送を行う前に転送先テーブル内の当該パーティションを削除できます。これにより、データマート機能が何度実行されても同じパーティション内でデータが重複する事態を回避できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/f36b49b9-2b3e-79c4-c7ec-c133f5f9378c.png)





# 2. GCPの権限の話/プロジェクトまたぎの処理
本筋から少し逸れますが、troccoでBigQueryを扱う場合、GCPで作成したサービスアカウントの認証情報をtrocco側に登録することになります。このサービスアカウントに権限を付与することで、データマート機能をGCPのプロジェクトをまたいで利用できます。


以下の図の例では、スナップショット保存先PJでサービスアカウントを発行し、転送先PJにて権限付与を行うことで、転送先PJにクエリした結果をスナップショット保存先PJに転送できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/362a1c66-f2fd-d3f0-8a87-2a46fcbf5e8a.png)

図のようにスナップショット用PJを用意している場合や、データレイク層・データウェアハウス層・データマート層といった階層を別プロジェクトを作成することで構成している場合に有効な利用方法です。

# 3. まとめ
troccoを用いることで冪等性を考慮しつつスナップショットを取得する設定を簡単に行うことができました。`転送前に実行するクエリ`機能がなかなか便利で、他にもアイディア次第で色々できそうな印象です。

# 参考
[trocco](https://trocco.io/lp/index.html)
keepalived(LVS)のsource hashスケジュールの謎

# はじめに
お手軽L4ロードバランサーのLVSですが、地味に今まで勘違いをしていました。
振り分けアルゴリズムの中で接続元IPをハッシュ化して指定リアルサーバに振り分ける `sh`ですが、rrやlcなどとはweightの考え方が全然違いました。

## shのweightは割り振りの重み付けではない
lcやwlcなどはリアルサーバに割り当てたweghtの総和から各リアルサーバに設定した値の割合だけ割り振りますよ。
って考え方だったかと認識しています。
例えば、サーバAのweightは5、サーバBは3、サーバCは10とかにすれば、総和は5+3+10=18になり、サーバAは18/5≒27.8%の割合で割り振ります。

ところが、shは同様の考え方をしませんでした。
公式ではありませんが、下記サイトにヒントがあります。
http://kb.linuxvirtualserver.org/wiki/Source_Hashing_Scheduling

リアルサーバの最大接続数x2をweightに設定するのが正解らしいです。
weightに設定した値を超えた接続は全てnullになってしまうため、思った通りの割り振りはされないようです。

つまり、上記と同様にサーバAは5、サーバBは3、サーバCは10の設定値だと、サーバAは2接続までサーバBは1接続までサーバCは5接続までは正常に割り振られ、それを超える接続はもはやランダムまたはrrになってしまうようです。

## という事で
今まで振り分けアルゴリズムをshにすると「何かちゃんと割り振られてないなぁ・・・」と思っていた事がどうやら思い過ごしではなく、設定に不備があったという話でした。
なお、weightは0～65,535の間を指定する必要があるので、注意が必要です。
elm327の研究

# 概要

elm327を調べてみた。

# elm327とは

自動車のECUとPCが通信するための、マイクロコントローラ。
オンボード診断（OBD）インターフェース。
MicrochipTechnologyのPIC18F2480 マイクロコントローラーに実装されている。

# 代表的な回路

![schema-interface-elm327.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/12da3e54-d398-6bf6-3f8b-c284f6f0e8de.jpeg)

# ECUとは

ecu(エンジンコントロールシステム)とは、燃料噴射射制御（ＥＦＩ）を中心に点火制御（ＥＳＡ）、アイドル回転速度制御（ＩＳＣ）など複数の制御対象をマイクロコンピュータを応用したエンジンコントロールコンピュータで集中的に制御し、エンジンを最適な状態で作動させるシステムである。

+ 燃料噴射制御（Ｅｌｅｃｔｒｏｎｉｃ Ｆｕｅｌ ｌｎｊｅｃｔｉｏｎ）
 従来のＥＦＩと同様、吸入空気量とエンジン回転速度および水温センサなどの信号から
エンジンに最適な空燃比となるように燃料噴射を制御する。
+ 点火制御（Ｅｌｅｃｔｒｏｎｉｃ Ｓｐａｒｋ Ａｄｖａｎｃｅ）
 従来の遠心ガバナとバキュームコントローラの機械式進角に代わるものでエンジンの回転 速度と負荷状態から最適な点火時期を制御する。
+ アイドル回転速度制御（Ｉｄｌｅ Ｓｐｅｅｄ Ｃｏｎｔｒｏｌ）
 従来の始動後ファーストアイドルとクーラー使用時のアイドルアップ制御、暖機後のアイドル回転などを、まとめて制御するものでエンジンの経時変化、負荷変動が起きてもアイドル回度を安定に保つ制御を行なう。
+ ダイアグノーシス（自己診断）
 各入力信号（センサ．ワイヤハーネス．コネクタｅｔｃ）の異常が発生した場合、コンピュータが記憶して表示を行なう。

# ecuの図

![image7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8e2e46f9-4028-24f5-d388-1500ed3a5ec8.gif)

+ 吸気系統
 エアクリーナでろ過された空気は、スロットルボデーをへてサージタンクに入いり、インテークマニホールドから各シリンダに入いる。
 暖機運転中はスロットルボデーと一体化されたエアバルブの通路が開き、暖機運転に必要な空気が入いるためファーストアイドルとなる。
 また、暖機後のアイドル時はスロットルバルブが閉じているため、吸入空気はスロットルボデーのバイパス通路を通ってシリンダヘ入いる。
 プレッシャセンサはインテークマニホールドの圧力を検出し、電気信号に変えエンジンコントロールコンピュータに送っている。
 一回の吸入行程でシリンダに入いる空気量はインテークマニホールドの圧力に比例するので、この圧力を検出することで吸入空気量を間接的に計測している。
+ 燃料系統
 燃料はフューエルタンクからタンク内のフューエルポンプで吸入・吐出され、フューエルフィル夕でゴミや水分がとり除かれる。
その後パルセーションダンパを通ってデリバリパイプに送られインジェクタの開弁にともない燃料はインテークマニホールド内に噴射される。
 プレッシャレギュレータはポンプからインジェクタまでの燃圧を調整し余分な燃料を
リターンパイプからフューエルタンクに戻しているため燃料は常に配管内を循環している。
+ 制御系統
 エンジンの運転状態を検出するセンサと、センサからの情報を総合的に判断するエンジンコントロールコンピュータ、およびコンピュータの信号により働くアクチュエータから構成される。
 例えば、燃料噴射量制御ではプレッシャセンサからの吸気管圧力信号をもとに基本噴射量が決定され、各センサからの信号で補正を加えインジェクタを通電する。
 点火制御ではプレッシャセンサからの吸気管圧力とディストリビュータからのエンジン回転数から基本進角が決定され、この進角に各センサからの信号で補正を加えイグナイタに点火信号を送る。

# ＯＢＤとは

アメリカ合衆国、カリフォルニア州は、高い人口密度と膨大な交通量のために、1980年代初頭に厳しい大気汚染にさらされました。地方の政治家は、この問題を当時最も納得のゆく、厳しい車両技術規定を議会で通過させる機運として受けとめました。これにより、排ガスシステムに関するメーカーへの技術的な要求が高まりました。
最初のＯＢＤシステム（ＯＢＤ-Ｉ）は、1988年に導入されました。このシステムの主要なステップは、排出ガスに影響するすべての電気構成部品を、車両の電子装置でモニターすることでした。ドライバーには、故障時に視覚信号（エンジンテルテール）によって通知されるようになりました。
ＯＢＤ-ＩＩは、1996年1月からアメリカ合衆国で適用されています。ＯＢＤ-Ｉと比較した場合の排ガスモニターの改善点は、主に追加された、電子構成部品を含めて、全ての排ガスに関連するシステムとプロセスがモニターされるようになったということです。
欧州の車両排ガス規制のおける最初の意思表明は、1970年に発表され初期規制として導入されました。このガイドラインは、徐々に追加されて厳格なものになってきました。１９９８年には、初めての排ガスモニターシステムが定められました。このシステムは、アメリカ合衆国での実績に基ずくＯＢＤを組み入れたものです。２０００年には、これらのシステムは欧州で新たに認証を受ける2,500Ｋｇまでの全ての乗用車に必須となります。２００１年に他の車両クラス全車種に波及されます。

# ＯＢＤの変遷

1988年アメリカ合衆国内、ＯＢＤ-Ｉが導入。
1、車両には自己管理できる電子システムを装着する。
2、排ガス関連の故障は、ダッシュボードに装着された、フォルトランプに表示。
3、故障はコントロールユニットのフォルトメモリーに記録され、オンボード診断装置を使って読み取りが可能。
1991年欧州のﾒｰｶｰはＩＳＯ9141-2（米国ＯＢＤ-ＩＩ）を作った。
ＯＢＤ-ＩＩに適合したコントロールユニットは、ＳＡＥ（米国自動車技術者協会）、ＩＳＯ（国際標準化機構）の両規格に適合。
1、フォルトランプの点滅機能。
2、不具合だけでなく排気量に関連する機能またはコンポーネントの監視機能。
3、故障のほかに運転状態をフリーズフレームに保存する機能。
4、フォルトメモリーに保存された内容を点滅コードの代わりに診断テスト装置（スキャンツール）を使って読み出し可能。
1994年ＯＢＤ-ＩＩ1996/1/1以降は米国全てのガソリン車に適合。
1996年ディーゼル車に適合

# obdコネクタの場所

基本、ハンドルの下。

以上。
NameError: uninitialized constant Railsエラー

rake db:migrateをすると、表題のエラーが発生しました。

```:ターミナル
rake aborted!
NameError: uninitialized constant Rails
/var/www/rails/men-skincare/Rakefile:6:in `<top (required)>'
/home/ec2-user/.rbenv/versions/2.7.0/bin/bundle:23:in `load'
/home/ec2-user/.rbenv/versions/2.7.0/bin/bundle:23:in `<main>'
(See full trace by running task with --trace)
```

NameErrorに関して、クラスが定義されていない場合などは遭遇したことがあったのですが、RailsがNameErrorになっているのは初めてでした。


##対処法

結論としては、config/application.rbファイルにてRailsのrequireがコメントアウトされているというかなり初歩的なミスでした…。

```ruby:config/application.rb
# require "rails"
# # Pick the frameworks you want:
# require "active_model/railtie"
# require "active_job/railtie"
# require "active_record/railtie"
# # require "active_storage/engine"
# require "action_controller/railtie"
# require "action_mailer/railtie"
# # require "action_mailbox/engine"
# # require "action_text/engine"
# require "action_view/railtie"
# require "action_cable/engine"
# require "sprockets/railtie"
# require "rails/test_unit/railtie"
```
これらのコメントを全て外すことで解決しました。

以下はエラーメッセージの内容から確認したことになります。

まずRakefileの内容を確認しました。
ただこちらは自動生成されるファイルのため、特に問題無し。

次にrailsが起動していないのかと思い、「bundle exec rails -v」コマンドを打つときちんとrailsのバージョンが表示されたので問題無し。

そしてエラー分に「See full trace by running task with --trace」と記載があったので、--traceをつけて再度実行したのですが、同じエラーが表示されました。


###おわりに
まさかapplication.rbファイルに問題があるとは、エラー文からは推測もつきませんでした。
少し前に同ファイルをいじった記憶があるので、そこで恐らくコメントアウトしてしまっていたのだと思います。
役に立つか分かりませんが、どなたかに役立てば幸いです。
誤って容量の大きなファイルをコミットしてしまいGithubにプッシュできなくなった場合の解決策

#　誤って容量の大きなファイルをコミットしてしまいGithubにプッシュできなくなった場合の解決策

## 発生したケース

100MBのテキストファイルをコミットしてしまい、GithubにPushできなかったため、zip圧縮しコミットしてプッシュしたが、履歴が残っていたためGithubにプッシュできずハマった。

## 解決手順

1. 直前のコミットを取り消し(新しくコミットしていなければこの対応は不要)
1. テキストファイルをコミットから削除
1. Githubにプッシュ
1. テキストファイルをZip圧縮して、コミット後、再度Githubにプッシュ

### 直前のコミットの取り消し

```
$ git reset --hard HEAD^
```

### 指定ファイルのコミットから削除し、コミット内容を変更

```
$ git rm --cached 指定ファイル
# プッシュされていない履歴からもファイルを削除する必要があるため、以前のコミットを変更して修正
$ git commit --amend -CHEAD
```
はじめてのdocker

Dockerの導入を行いました。
インストール後、なぜかうまく起動しませんでした。
ぐぐるとHyperVを有効にしなければならないという記事が大量にでてきました。
どうやらプログラムと機能のところでHyperVという項目があり、☑を入れると有効かされるらしいのですが、、、
そもそもHyperVがない。
さらに調べるとwindowsproにしかない模様。私の使ってるwindowshomeにはないようです。
homeでdocker使えないなんてことはないだろうと考えました。
調べると正しい手順やダウンロードしなければならないものがあるらしく、その手順さえふめばdockerを使うことは可能な模様。

https://docs.microsoft.com/en-us/windows/wsl/install-win10#simplified-installation-for-windows-insiders

ここを参考にしました。

windowsにlinuxを導入する必要があったんですかね？dockerがlinuxのコンテナ技術をもとにつくられてるからでしょうか？

そもそもこれ、linuxの環境が仮想マシンで使えてるということでしょうか？
じゃあdockerいらなくね？とも思いましたがどうなんでしょうか。

わかる方いたら教えてほしいです。
WordPress 同梱のPHPMailer 脆弱性の対応（メールの件名バグについてもtipsあり）

## 概要
タイトルの件を対応することがあったので備忘録的投稿です。
CVSS（※1）のスコアが高い脆弱性が、利用しているWordPress に同梱のPHPMailer 内に存在することが発覚したので、脆弱性解消の手動アップデートを対応。
もともとは、phpのライブラリ、PHPMailer の対象バージョン（6.1.8 から6.4.0）で、
オブジェクトインジェクション攻撃（※2）を実行できる脆弱性が見つかったことに端を発します。

ちなみに、PHPMailer のCVSS脆弱性の識別子は以下
 [CVE-2020-36326] 

## 対応について
基本はWordPress を最新版にアップデートすればOKです（2021/05/27時点でVer 5.7.2 が最新版）。
4系でも、Ver 4.2以降であれば、各ブランチの最新版にバージョンアップでOK（各ブランチの最新版は[リリース一覧（外部サイト）](https://wordpress.org/download/releases/)を参照のこと）

Ver 4.1 以前は今回の脆弱性対応の対象外になっているので、マイナーバージョンのアップデートを検討か、以下で対応（今回のメインの話）。
### Ver 4.1以前または、なんらかの理由でWordPress をアップデートできない場合
手動でファイルを更新と追加を行う。
対象ファイルは以下の4つ（更新1つ、追加3つ）。各ファイルはWordPress のVer 5.7.2 とか最新版から持ってくる。
※ 反映方法は各自環境に準拠して実施してください。
#### 更新対象ファイル
- {WordPressインストール先のパス}/wp-includes/class-phpmailer.php

#### 追加対象ファイル
- {WordPressインストール先のパス}/wp-includes/PHPMailer/Exception.php
- {WordPressインストール先のパス}/wp-includes/PHPMailer/PHPMailer.php
- {WordPressインストール先のパス}/wp-includes/PHPMailer/SMTP.php

上記対応後
`wp_mail();` 関数を実行している機能でメール送信ができることを確認する。

<strong>！注意</strong>
絶対これが良い、という対応策ではありません。
選択肢の優先順位としてはアップデートを優先。もしくは対応する場合はそれを見越して採用してください。

* * *
#### tips：件名（subject）に指定した文字列の文字コードがおかしくなることがある。
マルチバイト（日本語）を件名に指定している場合、送信されたメールの件名が`=?iso-2022-jp?〜` みたいな謎の文字列に変換されて届くことがあります。
どうも、[WP Multibyte Patchプラグイン（外部サイト）](https://ja.wordpress.org/plugins/wp-multibyte-patch/)でメール送信の際の文字エンコード処理が上手く行っていない様子。
以下の対応をすることで、解消できたので合わせてtips を掲載。

対象は以下のファイル↓
{WordPressインストール先のパス}/wp-content/plugins/wp-multibyte-patch/wpmp-config-sample-ja.php

上記をコピペ。`wpmp-config.php` に名前を変更して、`wp-content` 直下に設置。
↓のパスで設置できればOK。
{WordPressインストール先のパス}/wp-content/wpmp-config.php

設置した`wpmp-config.php` ファイル内の、87行目付近にある記述を以下のように変更する。

``` wpmp-config.php：87行目付近
$wpmp_conf['patch_wp_mail'] = false;
```
↑ `wp_mail();`でエンコードを実行する・しないの指定をしている箇所。
もともと`true` で設定されているはず。

ファイルの編集をしたら、再度メールの送信テストを実施。
件名が日本語で送信されていることが確認できたらOK。

※ WP Multibyte Patch 使ってないけど文字化けするんだが？というはちょっと...分かんないっす。

現場からは、以上です。

* * *

## 用語解説
### ※1 CVSS
Common Vulnerability Scoring System とは共通脆弱性評価システムのこと。
IT製品のセキュリティ脆弱性の深刻さを（システムを理解している人であれば、評価に用いて同じ判定を出せる基準を持つ）評価システムのこと。現在バージョンはv3 で、その他細かい説明は[共通脆弱性評価システムCVSS v3概説（外部サイト）](https://www.ipa.go.jp/security/vuln/CVSSv3.html)を参照してください。
### ※2 オブジェクトインジェクション攻撃
オブジェクトをインジェクション（注入）して攻撃する方法のこと。
今回の脆弱性には、意図しないオブジェクトの挿入が可能な状態となっており、極端な例で言えば、サイトやサービスの破壊や改ざんや情報漏洩を引き起こすことができると言うもの。


## 参考・引用元記事（すべて外部サイトへ遷移します）
[WordPress公式 > WordPress 5.7.2 Security Release](https://wordpress.org/news/2021/05/wordpress-5-7-2-security-release/)
[イイネ.biz > WordPress 5.7.2 Security & Maintenance](https://イイネ.biz/security/1660/)
webブラウザ　URLの最大文字数

#結果#
主要ブラウザのうち、IE以外は制限が無いと考えられる

IEも、じきにサポートが切れるので
URLの最大文字数については、あまり考えなくて良さそう
##URLの最大文字数##

###IE###
IEでは2083文字
だだしGetメソッドの場合は2048文字
https://support.microsoft.com/ja-jp/topic/url-%E3%81%AE%E6%9C%80%E5%A4%A7%E9%95%B7%E3%81%AF-2-083-%E6%96%87%E5%AD%97internet-explorer-174e7c8a-6666-f4e0-6fd6-908b53c12246

###IE以外###
具体的に何文字と制限はかかっていないようです
調べた感じだと、数万文字単位で行けるっぽい

###サーバー側の制限###
ブラウザよりも
サーバー側の上限を考えたほうが良さそうです

私の環境だと、IISで文字数制限がかかっていました。
物によっては、フレームワークによる制限もあるかもしれません
【ポートフォリオ】ゲストログイン機能の実装方法

ポートファリオ用の作成が終わっても、忘れてはいけないことがあります。
「**ゲストログイン機能**」です。

採用担当者がポートフォリオにアクセスしたときに
わざわざ新規登録する必要があると面倒に思われ、ポートフォリオを見ない可能性があります。

採用担当者は数多くのポートフォリオを見ています。
採用側の立場になれば、面倒なことは避けてワンクリックで見たいものです。
少しでもログインしやすい状態にしましょう。

今回は、自身が行った実装方法と出てきたエラーを記載しています。

以下の記事と動画を参考に実装しました。
↓↓↓↓↓

https://qiita.com/take18k_tech/items/35f9b5883f5be4c6e104

###YouTube
⑴[【Rails】あなたの簡単ログイン機能は大丈夫？　ゲストログイン機能の実装方法 (前半)](https://www.youtube.com/watch?v=s4OGhzx91pA)
⑵[【Rails】あなたの簡単ログイン機能は大丈夫？　ゲストログイン機能の実装方法 (後半)](https://www.youtube.com/watch?v=Nj_YJ4hRN9E)

上記の記事の 「**その2 : ゲストログイン機能の実装方法**」 で実装しました。

また、「**Devise**」を使用しているのを前提とします。

# 手順① routes.rbの設定

```ruby:confing>routes.rb
# 以下を追記
  devise_scope :user do
    post 'users/guest_sign_in', to: 'users/sessions#guest_sign_in'
  end
```
SessionsControllerに新しいアクション**guest_sign_in** を追加します。
**devise_for :users**　と元々記述があっても上記を追加するだけで構いません。

#手順② controller.rbの設定

新しいアクション**guest_sign_in**を設定するため、app/controllersにusersディレクトリを作成します。さらにusersディレクトリの中にsessions_controller.rbを作成します。

```ruby:app>controllers>users>sessions_controller.rb
#　以下を追加
class Users::SessionsController < Devise::SessionsController
  def guest_sign_in
    user = User.guest
    sign_in user
    redirect_to root_path
  end
end
```

# 手順③ modelの設定

```ruby:app>models>user.rb
# 以下を追記
def self.guest
    find_or_create_by!(email: 'guest@test.com') do |user|
      user.password = SecureRandom.urlsafe_base64 # ランダムなパスワードを生成
    end
  end
```

# 手順④ viewsの設定

```ruby:app>views>layouts>application.html.erb
# 以下を追記
<%= link_to 'ゲストログイン（閲覧用）', users_guest_sign_in_path, method: :post %>
```
トップページにゲストログインボタンを表示する場合、この記述でOKです。
(表示スタイルは各自で変更します。)

#発生したエラー

##activerecord::recordinvalid in users::sessionscontroller#guest_sign_in

というエラーが発生しました。

調べたら上記の設定の場合は、ゲストユーザーのアカウントは
メールアドレスとパスワードの作成だけされています。

私は「name」を登録必須にしていたため、エラーが起こっていました。

nameのバリデーションは

```ruby
validates :name, presence: true, length: { maximum: 7 }, format: {with: /\A[a-zA-Z]+\z/ }
```
と「**アルファベット最大7文字まで**」の制限をかけていたので


それに適する情報を、modelsに追記します。

```ruby:models>user.rb
def self.guest
    find_or_create_by!(email: 'guest@test.com', name: 'guest') do |user|
      user.password = SecureRandom.urlsafe_base64
    end
  end
```



これで問題なく実装することができました！
![image from Gyazo](https://gyazo.com/330d97be122e9bd2d8eae8b0b982139d.gif)

# 参考記事

[簡単ログイン・ゲストログイン機能の実装方法（ポートフォリオ用](https://qiita.com/take18k_tech/items/35f9b5883f5be4c6e104)
Laravel を XREA free で実装した話

##動機
php を使った Web アプリを作ってみたいと思ったので、最近人気の Laravel に手を出してみることに。
初めにレンタルサーバーを使った簡単な実装を行うことに決めました。
ただ、試してみたいだけなので、金はかけたくない。ということで、Laravel を使える無料レンタルサーバーを探しました。[^1]
（実は先にスターサーバーフリーで実装を試みましたが、失敗に終わりました。それも記事に残しているので、興味があればどうぞ[^2]。）

##XREA free [^3]
XREA free の利用は公式サイトからどうぞ。
クレジットカードが無くても登録できるので、初めてレンタルサーバーを使う方にもオススメです。

##Laravelのインストール
偉大な先人が既に試してくれていたので、その記事[^4]を参考にしました。

```shell
$ mkdir laravel
$ cd laravel
$ cd laravel
$ phpcli -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ phpcli -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ phpcli composer-setup.php
$ phpcli -r "unlink('composer-setup.php');"
$ phpcli -d register_argc_argv=1 composer.phar create-project --no-dev --prefer-dist laravel/laravel プロジェクト名 "5.5.*"
$ cd ~/public_html
$ ln -s ~/laravel/プロジェクト名/public ドメイン名
$ ls ドメイン名
public #シンボリックリンク
```

ただ、XREA で転送設定の変更が必要そうです。
（ディレクトリを削除して、シンボリックリンクにしても上手くいきませんでした。しょうがないので、/ドメイン名/public とシンボリックリンクを作って、転送設定で /ドメイン名/public に転送されるよう設定しました。）
（また、php のバージョンを上げて Laravel 6 をインストールしようとしましたが、XREA でいくら変更しても変わらないので断念しました。
追記：phpcli を使うと php7.0 のままですが、php72cli を使えば php7.2 を使えました。[^5]これで Laravel 6 がインストールできる！"5.5.*" を "6.*" に変更します。）


[^1]: https://tomato-code.com/4223/
[^2]: https://qiita.com/okada1220/items/ee221a958f238563da28
[^3]: https://www.xrea.com/
[^4]: https://qiita.com/haessal/items/789f8cce5027d0b8d1c2
[^5]: https://qiita.com/old_cat/items/68392b1ce724f662b118
Laravel をスターサーバーフリーで実装したかった話

## 動機
php を使った Web アプリを作ってみたいと思ったので、最近人気の Laravel に手を出してみることに。
初めにレンタルサーバーを使った簡単な実装を行うことに決めました。
ただ、試してみたいだけなので、金はかけたくない。ということで、Laravel を使える無料レンタルサーバーを探しました。

※最終的に実装は出来ていません。Laravel がスターサーバーフリーで上手くいくのか知りたかった、後学のためにどうして上手くいかないのか知りたい、そんな人向けです。
※「とにかく実装がしたいんだ！」って人は別の無料レンタルサーバー XREA free で Laravel を実装する記事も書いたので、そちら[^1]をどうぞ。
※「俺は実装出来たぜ！馬鹿なやつだな、どうやったか教えてやるよ！」って人は記事を読んで、何処が間違っているか教えてください。

## スターサーバーフリー[^2]
PHP, MySQL が使えるレンタルサーバーを無料で借りられます。ただし、MySQL は１つしか使えないそう。（Word Press での利用を想定しているようですが、今回は無理やり Laravel で利用します。）
借りるためにはネットオウルへの登録が必要ですが、特に面倒な手続きはないので無料レンタルサーバーとしてはオススメです。

## Laravel 実装に向けて　パート１
スターサーバーフリーではシェルが使えないので、ローカル環境で Laravel を構築してそれをアップロードする形になります。
ローカル環境からサーバへ移行するための方法はこのサイト[^3]を参考にしました。
結局、FTP接続で全ファイルを送りました。（半日以上かかりました (^-^;)）

## Laravel 実装に向けて　パート２
スターサーバーフリーではルートディレクトリの index.html, index.php 等が最初に呼び出されるファイルに設定されています。
Laravel で最初に呼び出して欲しいファイルは プロジェクト名/public/index.php です。
最初に呼び出されるファイルを変更する方法として、シンボリックリンクを作成することが考えられます。

```shell
$ ln -s /プロジェクト名/public /プロジェクト名
```

ただ、スターサーバーフリーではシェルが使えないので、シンボリックリンクを作ることが出来ません。したがって、別の方法を考える必要があります。
ローカル環境では

```shell
$ pwd
~/プロジェクト名
$ php artisan serve
```

で http://localhost:8000 に表示できます。これは プロジェクト名/ 下の serve.php が動いてくれているようだったので、ファイル名を変更して最初に呼び出されるようにしてみました。

```shell
$ pwd
~/プロジェクト名
$ mv serve.php index.php
```

## Laravel 実装に向けて　パート３
これで http://ドメイン名 にアクセスすれば Web ページが表示されるようになりましたが、表示されるといっても 500 | server error が出るだけです。
なぜエラーが発生するのか、色々と調べた結果、このサイト[^4]に辿り着きました。

```shell
$ php artisan key:generate
```

をする必要があるそうです。これもシンボリックリンクと同様、ローカル環境で作成して転送しても意味がありません。
もうお気づきでしょうか？……そうです。シェルが使えないので、このコマンドは打てないのです。したがって、私はここでスターサーバーフリーの利用を断念することにしました。
（Laravel が使えないだけで、ブログなどの別の用途には利用可能です。）

## 結果
スターサーバーフリーではシェルが開放されていないので、Laravel の実装は無理でした。

## 最後に（自戒の念を込めて）
何でも出来ると思い込んで調べ続けるのは辞めましょう。時間の無駄です。
（Qiita ではもっと上手くいかない例についてもまとめて欲しいです。失敗は成功のもと！）
そのレンタルサーバーで無理なら、別のレンタルサーバーを探す。レンタルサーバーで無理なら、クラウドサービスを探す。クレジットカードが無くて AWS が無理なら、Heroku を使う。など状況自体を変えましょう。
もしかしたら複雑な手順を踏めば出来るのかもしれませんが、簡単に実装出来ない状況が既に間違っています。試作で簡単に出来ないことは、実務でも使い物になりません。

[^1]: https://qiita.com/okada1220/items/b71710683de8f5368cf2
[^2]: https://www.star.ne.jp/free/
[^3]: https://nebikatsu.com/6233.html/
[^4]: https://qiita.com/miriwo/items/5ad045abf374e87ce64c
【備忘録】 Windows 版の IntelliJ の Terminal で Git bash を使用する方法

▼ メモ記事
下記の記事を参考にして、設定することができた

https://qiita.com/EichiSanden/items/7c735c5d7ec33c51012c

普段は Mac なので、 IntelliJ のターミナルに不備を感じることはなかったが、
Windows だと設定しておいた方が開発効率が上がるのでメモ
SPSS Statistics 28の新機能

IBM SPSS Statistics v28がリリースされました。
最新バージョン28の新機能をご紹介します。

# Version 28の新機能
1.分析方式
 ・メタ分析
2.プロシージャーの機能拡張
 ・検定力分析の機能拡張
 ・比率統計量の機能拡張
3.片側ｔ検定
4.その他の統計の機能拡張
5.使いやすさと生産性の機能拡張

# メタ分析
複数の研究で類似した調査を行っている場合、それらの研究から得た結果をデータとして分析するメタ分析ができるようになりました。
メタ分析では、統計的手法を使用して、効果を総合的に推定したり、研究間の異質性を調べたり、最終的な結果に対するバイアスの影響を調べたりすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/2e52f669-d130-70cd-f3b9-059b17cc69f0.png)

# 検定力分析の機能拡張
これまでは単一の検定力の値のみ指定が可能でしたが、複数の検定力の値や開始、終了の範囲と間隔を基準値として指定することができるようになりました。
これにより、サンプルサイズの上限(検定力の値が変化しなくなる点)を見つけやすくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/dc278253-99ea-1582-47db-500b17d9fff3.png)

# 比率統計量の機能拡張
価格関連バイアス (Price-Related Bias) が、散らばりのメソッドでサポートされるようになりました。信頼区間の算出もできます。
PRB は、高価格の資産の場合に価格比の評価が系統的に高いか低いかを示す指標です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/dc5967a9-e9bb-277d-3eaf-8f5310038ab0.png)

# 片側ｔ検定
これまで平均の比較の各種ｔ検定では、両側ｔ検定のみの出力でしたが、片側ｔ検定の出力が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/63e712a3-e949-5f1b-8d7b-3ad02a882070.png)

# 単純主効果の比較
これまでシンタックスコマンドで対応していた単純主効果の比較がダイアログボックスから選択できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/da449c64-b4d9-cd3e-f213-e4ac0e1c7ed3.png)

# 参照カテゴリのデフォルト設定と配置の変更
これまで参照カテゴリのデフォルトは[最後]でしたが、[最初]に変更になりました。また、ダイアログボックス内の配置が、[最初]を左側に[最後]を右側に変更となりました。
これにより、カテゴリ値が0,1,2の場合、デフォルトの設定を使用した際に0を参照(基準)値とするため分析結果の読解をスムーズに進めることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/302428d6-5500-c0ab-bbf2-8bc0963fa575.png)

# ワークブックファイル
これまでシンタックスと出力は別々のファイル形式でのみ保存できましたが、組合せたワークブックファイル(*.spwb)として保存することができるようになりました。
これにより、グラフや分析結果と同じファイルにシンタックスコマンドを一元管理でき、さらにシンタックスを実行することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/4afafef4-df9a-1c14-98b0-0d4d80e5850d.png)

# 関係マップ
変数の相互関係を視覚化します。変数および、変数内のカテゴリ値をノード、そのノード間の関係性・影響の強さをリンク線で表します。
これにより、変数間やカテゴリ間の関係の強さが視覚的にわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/383c50a8-ebc8-525e-bd4e-41a54e63609b.png)

# テーブル編集機能の強化
出力結果のテーブルを編集するダイアログボックスに引き出し式ペインが組み込まれました。
これにより、テーブル編集の際のクリック回数を減らして編集の効率化を図ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/c434c173-9309-eec6-d768-ad93cfa35e4b.png)

# 検索機能拡張
検索機能が更新され、メニューダイアログ、ヘルプトピック、ケーススタディ、シンタックスリファレンスの結果も得られるようになりました。
これにより、ユーザーインターフェースダイアログ、ヘルプシステムのトピックにある全ての語句を検索できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/bedfd3c3-217f-feef-a239-412c15775f02.png)

# 参考
https://www.ibm.com/blogs/journey-to-ai/2021/05/a-learning-guide-to-ibm-spss-statistics-get-the-most-out-of-your-statistical-analysis/
[AWS_28]独自ドメインを設定する

##環境
**Amazon Web Service**

* EC2(Amazon Linux 2 , t2.micro , 汎用SSD 8GB)
* RDS(MySQL , db.t2.micro)
* ALB

**ローカルPC**

* MacBook Pro(2.9 GHz デュアルコアIntel Core i5 , 8 GB 2133 MHz LPDDR3)
* macOS 11.3.1（20E241）

##概要
現状は、ALBのドメインでWebサーバ(EC2インスタンス)にアクセスできる状態になっているが、独自ドメインでアクセスできるようにする。
**Before**
![構成図09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/d7207433-7cbe-6706-1e91-722d8ce06e05.png)


**After**
![構成図11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758644/1c07fa3b-cf6f-3670-8191-85895e0e64f0.png)


##独自ドメインを取得
`FC2ドメイン`にてドメインを取得。
[Freenom](https://www.freenom.com/ja/index.html) だとマイナーなTLD(トップレベルドメイン)が12ヶ月無料で取得できるらしい。

##ホストゾーンの作成
1. `Route 53　＞　ホストゾーン　＞　ホストゾーンの作成`をクリックする。
1. 次の項目を入力していく。
    * ドメイン名: (任意)
    * タイプ: パブリックホストゾーン
1. `ホストゾーンの作成`をクリックする。

##NS(ネームサーバ)の設定
取得したドメインのNSを、Route53で作成したホストゾーンのNSに変更する。
要は、取得したこのドメインはRoute53で管理するということを取得元に知らせる。

* ホストゾーン内のNSレコードのうち4つの`値/トラフィックのルーティング先`を、取得元の管理画面等にあるNSの設定箇所にコピペする。<br>
FC2ドメインの場合、NSの設定は`DNSの設定　＞　ネームサーバの変更`にある。

##Aレコードの作成
ALBのドメインと取得した独自ドメインを紐付ける。

1. `Route 53　＞　ホストゾーン　＞　(作成したホストゾーン)　＞　レコードを作成`をクリックする。
1. 次の項目を入力する。
    * レコード名: `blog.`(取得した独自ドメイン)
    * レコードタイプ: `A – IPv4 アドレスと一部の AWS リソースにトラフィックをルーティングします。`
    * トラフィックのルーティング先: 
        * `Application Load Balancer と Classic Load Balancer へのエイリアス`
        * `アジアパシフィック (東京) [ap-northeast-1]`
        * (使用しているALB)
        * ルーティングポリシー: `シンプルルーティング`
1. `レコードを作成`をクリックする。

##確認
取得した独自ドメインでWebサーバにアクセスできることを確認する。
Analytics Cloudを活用したPOSデータ分析：相対時間フィルターを活用した日次売上速報レポートの作成

# 利用環境 #

データベース：Oracle Autonomous Data Warehouse　容量(1OPCU)

BIサービス：Oracle Analytics Cloud  機能セット(Enterprise Analytics) 、容量(２OPCU)



# 用意したデータについて #

アパレル事業の店舗POS売上明細データ：　ID付きPOSデータなので、会員ID付きの売上データです。商品属性（カラーコード、サイズ）、ブランドなどは、連結済み

会員マスタデータ：会員の基本属性データですが、ポイント増減に関する情報も、連結済みのデータ





# Analytics Cloudを活用したPOSデータ分析：相対時間フィルターを活用した日次売上速報レポートの作成

日次売上速報レポート自体を作成することは、Analytics Cloudを使えば、とても簡単なことですが、日次速報レポートという性格上、たいていの場合、営業日には毎日参照されます。参照するユーザがシステムに、毎日ログインする度に最新の情報が参照できるように期間の絞り込み条件を変更するのは、少し手間です

ログインする度に、常に直近のxx日の集計結果が表示されると、便利ですし、親切だと思います。



Analytics Cloudには、こういう、日次速報レポートを展開するときなどに、ちょっと便利なフィルタリングの機能があったのでご紹介します。







完成形イメージ
**日次売上速報グラフ（日別、商品アイテム別）**

![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/cb7ab22d-e740-424f-182d-dc7555a26148.jpeg)


# ベースのレポートを作成する　



X軸に”購入日付”、Y軸に”売上金額”、そして色には”アイテム名称（商品アイテム）”を配置した積上げ棒グラフを作成します。そしてフィルター領域に任意のフィルターを配置します。購入日付で値を絞り込みたいので、購入日付もフィルター領域にドラグ＆ドロップで配置します。



![0022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/8d996d0b-d307-5e54-2edb-087432ebd43f.png)



日付タイプの項目（カラム）をフィルター領域に配置すると、デフォルトでは下記のように、カレンダーから開始と終了日付を選択することになります。これだと毎回ログインする度に絞り込み範囲を指定することになるわけです。


![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/2f48ceef-e99f-add5-2774-a0ac6d1ca113.jpeg)




# 日付タイプのカラムのフィルタ・タイプを相対時間に変更



フィルター領域に配置された、購入日付カラムの右上のあたりをクリックすると、メニュがポップアップするので、フィルタ・タイプを選択します。ここで、実は、フィルタタイプが選択できるようになっていて、デフォルトでは、”日付範囲”になっているのですが、これを”相対時間”に変更します

![0023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/2a652285-ba66-54f2-a29a-089372bd8293.png)



”相対時間”の編集画面で、”タイプ”を「過去」、”時間レベル”を「日」を選択し、増分に、表示したい任意の日数を指定します

![0024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/e6789d72-ebe7-65ac-e059-242c7f441bf1.png)



このように、システム上の今日日付から、14日分西盛り込まれた日次速報グラフが表示されるようになりました。Analytics Cloudが参照する分析データベースが日次で、最新のデータに更新されるような運用を行っている場合は、このフィルターを”相対時間”に変更することで、常に最新の日次速報レポートをユーザに提供することが容易になると思います。

![007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1513882/c89e554f-affa-f70e-40da-fa1fcb88fab7.jpeg)



# まとめ

- 日付タイプの項目は、フィルター・タイプを相対時間に変更することができるので、システム上の今日日付から、自動的に任意の期間、遡ってデータを絞り込みたい時に便利
- 相対時間のタイプは、「過去」の他、「累計」、「次」を選択することが出来るようになっている。「累計」を選択すれば、指定した時間レベルの最初(例えば１月１日）)から、システム上の今日日付までの値に絞り込んでくれる。「次」を選択した場合は、システム上の今日日付から将来の任意の期間に絞り込んでくれるので、将来予測データだけを表示するときに便利
- 相対時間フィルターについては、Analytics Cloudの製品ドキュメントの[相対時間フィルター]()の章をご参照ください。
iPhoneの高効率フォーマット（HEIC）だとinput[type=file]でExifが読み取れない

## ざっくり結論

iOS の input[type=file] の仕様によりHeicファイルはExifが破棄される
jpegフォーマットの場合大丈夫な場合もある
そもそもiPhoneでheicファイルをブラウザ上からアップロードできない？

## 調査

（結構読まれたらスクショとかでわかりやすく更新します… :bow:)

### 前提 .heicファイル自体には Exifは存在する
iPhoneから直接heicファイルをとってきて、プレビューしてみてください。inspectするとちゃんとExifがいます。
xxdしてもそれっぽい文字列発見できました。

### なにがしたかったん？
ブラウザから画像アップロードするときにクライアント側でリサイズしなくてはいけなかったところ、Exif消えてほしくないという要望があった。
[blueimp-load-image](https://www.npmjs.com/package/blueimp-load-image)の機能でExifを取得し、リサイズしたBlobに再度Exif部分のバイナリをつけるという手法をとった。

やってみたところ以下のような結果に。

| 撮影ソース | Exif取得可能か |
|:-:|:-:|
|iPhone5s で撮影したデータ|OK|
|iPhone6sPlus で撮影したデータ|OK|
|iPhone12ProMax 高効率フォーマット(jpg)|NG Exifは消える|
|iPhone12ProMax 互換性フォーマット(jpg)|Exifは残るがOrientationがライブラリ上で設定できない|

### どの段階で消えてるの？
調査してみたところ `input[type=file]` の段階でだめっぽい。

まず、前提条件としてどの段階で Exifが消えるか調査しようと以下
https://codepen.io/dameyellow/pen/abJyEoq
Codepenでつくって `input[type=file]` で保持したファイルを FileReaderでBase64に変換してみた。
でてきた画像を長押しなどで保存してみる。
すると…

| 撮影ソース | Exif取得可能か |
|:-:|:-:|
|iPhone5s で撮影したデータ|OK|
|iPhone6sPlus で撮影したデータ|OK|
|iPhone12ProMax 高効率フォーマット(jpg)|NG Exifは消える|
|iPhone12ProMax 互換性フォーマット(jpg)|Exifは残るがOrientationがおかしい|

となった。
おなじやん！

ならば、.heic自体をアップロードし、直でExif取得してきてライブラリで変換してやればええやん。
と考え、

```html
<input type="file" accept=".heic">
```

で制限しようと思ったんですが、どうやらiPhoneだと勝手に**jpgに書き換えられる**っぽいです。

## 結果
それそのもの（Apple公式の回答など）があまり見つからないのですが、以下のような Stackoverflowは発見しました。
https://stackoverflow.com/questions/16297730/image-upload-from-iphone-strips-exif-data
ほかにはこんなスレッドが
https://news.ycombinator.com/item?id=23260987

ググりキーワードが悪いのかもしれませんので、どなたか…どうか…
これだ！ってページありましたら教えていただけると嬉しいです。
【失敗談】iterm2が起動できない..!?ターミナルも起動できない....

#状況
・iterm2が起動した瞬間落ちる
・デフォルトのターミナルも開くと「プロセスが完了しました」なんて冷たいこと言って入力受け付けない
・VSコードのターミナルも受け付けてくれない

###なんでこーなった？？？
エイリアス設定しようとして.bashrcと.bash_profileをいじっていたらこうなった。

###どうしよう
でもターミナルさわれないからbashの変更部分戻せないよ・・・(><)

#解決策

###bashじゃなくてshでデフォルトのターミナル開く
デフォルトターミナル→環境設定→一般設定→開くシェル→/bin/sh

###編集する
いじっていた.bash_profile元にもどす。

#できた！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！

#反省
何かのサイトを見ながら脳死でbashをいじっていたが、大事な部分なので変なことしないように理解しながら行動すべきでした。すいませんでした。
全く同じ状況の記事がなかなか見つからなかったため、誰かの助けになると幸いです。
名前が文字化けしたファイルの見つけ方と消し方


##この操作をする羽目になったきっかけ
fortran90で書かれたパブリックコードを触っていたところ変に操作してしまい、ファイルの名前が文字化けしたいらないファイルを作ってしまいましたが、うまく消せませんでした。
その時にファイル名が文字化けしたファイルがいっぱいありすぎて手作業でやるには少しだけ困ったので、shellファイルを作ることにしました。

ここに共有すると、より良い方法を教えてくださる親切な方が現れることがあるとわかったので、個人のメモとして下書きに保存していたこの記事を公開します。



##前提
linux

##見つけ方
見つけるだけなら以下でOK

```php
ls -i
```

####いっぱい消す用の見つけ方
①ls -i -1 でファイル固有のナンバーを見つけ、1行にする
②txtにコピーしてexcelファイルにする
③名前のとこ消す
④txtfileに戻す(私の場合、"mozibake.txt"と名付けました)


##消し方
###ちょっとだけある
(参考:https://centos.bungu-do.jp/archives/42)

ターミナルに以下を打ち込んで実行

```php
find . -inum $line -ok rm -rf {} \;
#$lineには上で見つけたファイルの固有ナンバーが入ります
```



###いっぱいある(私の場合は170個あった)
(参考:shellでの配列の扱い方
https://anmino.hatenadiary.org/entry/20091027/1256628984)

0.あらかじめ文字化けファイルを見つけて"mozibake.txt"にファイル固有の番号を保存しておく

1.次のようなshellファイルを作る
(例えば名前をmozibake.shにしておく)

```php
#!/bin/sh
# 区切り文字を改行コードに指定
IFS=$'\n'

# ファイルを配列に読み込む
file=(`cat "mozibake.txt"`)

# 行ごとに繰り返し処理を実行
ln=0
for line in "${file[@]}"; do
    ln=`expr $ln + 1`  #これがいるかはわからんが
    find . -inum $line -ok rm -rf {} \;
done
```

3.ターミナルで sh mozibake.sh を実行

4.消していい？って聞かれるので全部yを押す
chart.jsでドーナツ円グラフを作ったのでメモ

#背景

業務でドーナツ型の円グラフを表示する必要があり、JavaScriptプラグインを調べたところ、<a href="https://www.chartjs.org/">chart.js</a>が良さそうだったので、その時作ったサンプルのメモとしてこの記事を残しておきます。

##やりたいこと

* ドーナツ型の円グラフを表示する
* ドーナツの空洞の大きさを調整する
* 蹄鉄型にする

完成系
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/9c9f434a-72d5-af2e-8061-cfaa2e7735df.png)
<a href="https://codepen.io/heytommy/pen/xxqLpry">ソースはこちら(CodePen)</a>

##空洞の大きさを調整

options.cutoutの値を設定して調整しました。
ドーナツ型の円グラフでは初期値が50になっています。

初期値のままのとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/578993cd-15d3-d5af-d4a6-21ba07711c1a.png)

空洞の割合を75%に変更

```
    options: {
        responsive: false,
        cutout: 75,
    }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/4ceb09ad-b8b4-ea23-d5d2-72f53a9b9666.png)

空洞の割合を大きくすることで、細いドーナツ型の円グラフになります。

##蹄鉄型のドーナツ円グラフ
蹄鉄型にするためには円グラフの円の長さをまずは指定します。
options.circumferenceで0~360の範囲で指定します。

さらに必要に応じて好みの向きに円を回転させます。
options.rotationで最上部を起点として時計回りに0~360または-180~180で指定します。

円の長さを280度とした場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/cb905258-4655-476d-f42a-8844bc23b063.png)

```
    options: {
        responsive: false,
        cutout: 75,
        circumference: 280,
    }
```

グラフを220(-140)度回転した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/9c9f434a-72d5-af2e-8061-cfaa2e7735df.png)

```
    options: {
        responsive: false,
        cutout: 75,
        rotation: 220,
        circumference: 280,
    }
```

これで下に向いた蹄鉄型のドーナツ円グラフが出来ました。

##何もしないと隙間が出ていたので消しました

data.datasetsのborderWidthを指定しないとデフォルトで白の枠線が描画されてしまいます。
※分かりやすく背景にrbga(0,0,0,.5)を指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613298/13e65cf5-8010-cd67-d0df-16c14b61ee8d.png)

この枠線を消すにはborderWidthに0を指定すればOKです。

```
    data: {
        datasets: [{
            data: [10, 90],
            backgroundColor: ['rgba(30, 30, 116, 1)', 'rgba(0, 0, 0, 0.1)'],
            borderWidth: 0
        }],
    },
```

##ツールチップいらん

ツールチップが必要ないときはoptions.plugins.tooltipにfalseを指定してください。

```
    options: {
        plugins: {
            tooltip: false
        },
```
docker-composeを使用したJenkinsのセットアップで詰まったところ

#はじめに
タイトル通りですが、学習していて詰まったところを記事にしました。
何かお役に立てればうれしいです。

##本題


```yaml:docker-compose.yml
version: "3"
services:
        master:
                container_name: master
                image: jenkins/jenkins:lts-jdk11
                ports:
                        - 8080:8080
                volumes:
                        - type: bind
                          source: ./jenkins_home
                          target: /var/jenkins_home
```

上記ymlファイルで`docker-compose up`を実行したところ

```
master    | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
master    | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
master exited with code 1
```
というエラーが出た。
調べたところ、原因はマウント用に作成したディレクトリの権限問題っぽい。
なので権限設定を変更する。

```
sudo chown -R 1000:1000 ./jenkins_home/
```
で権限設定を変更したら無事Jenkinsを起動することができた。

###参考文献
・https://github.com/jenkinsci/docker/issues/493
IntelliJ のプラグインである GitToolBox が便利すぎる

▼ メモ記事

IntelliJ のプラグインである GitToolBox がめちゃくちゃ便利
https://plugins.jetbrains.com/plugin/7499-gittoolbox

![スクリーンショット 2021-05-27 17.54.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441218/bf400623-c6c0-cf5f-7e34-52a0e23f02aa.png)

対象の 1 行のソースが、いつ誰がどのコミットで記述したのかを確認することが可能になる

![git_tool_box_result.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441218/8afe99ce-5708-78c4-ce3e-98fafb92bdd5.png)

今まで都度 `右クリック => Git => 履歴を表示`と叩き、ヒストリーを表示させてからコミットを追っていたので、非常に助かります
バブルソートの配列の参照範囲

うまくいかなかったコード

```
void sort(vector<int>& x)
{
  for (vector<int>::size_type i = 0; i < x.size(); i++){
    for (vector<int>::size_type j = 0; j < x.size(); j++){
      if(x[j] > x[j+1]){
        int tmp;
        tmp = x[j];
        x[j] = x[j+1];
        x[j+1] = tmp;
      }
    }
  }
}
```
うまくいかなかった理由
x[j+1]で格納されていないところまで参照していた。

これでうまくいった

```
for (vector<int>::size_type j = 0; j < x.size() - 1; j++){
```

ふたつめのfor文のjの上限を-1した。
Javascript 変数②

昨日に引続き、変数について学習しましたので、そちらについて記事に残していきます。

前回の記事では、変数の中には様々な値を格納することができる。ということがわかりました。

```javascript
let name = "山田二郎";
console.log(name); //山田二郎
```
上の例では name という変数に山田二郎という文字列を格納した後、nameを出力しています。

```javascript
let name = "山田" + "二郎";
console.log(name); //山田二郎
```
先程とは少し違い、変数の中で文字列の結合をしています。

```javascript
let x = "山田";
let y = "二郎";
let z = x + y;
console.log(z); //山田二郎
```
上の例では、変数ｘには文字列 "山田" を、変数yには文字列 "二郎" を、変数zには変数xとyを結合する。というように定義しています。
このように変数の中で変数同士を結合する、ということもできますので、代入された値同士を結合し、何かに出力することも可能なようです。


また、数値の場合は四則演算が可能です。

```javascript
let x = 3;
let y = 4;
let z = x + y;
console.log(z); //7
```
次の例のように自分自身で足し算をすることも可能です。

```javascript
let x = 15;
x = x + 15;
console.log(x); //30
```
数値を足し算した場合はその和が出力されますが、数値を文字列として扱ってしまった場合は和でなく、文字列が出力されてしまいます。

```javascript
let x = "20";
let y = "21";
let result = x + y;
console.log(result); //2021
```
ですので、変数に値を格納し結合や足し算をする場合は、値の扱いに気をつける必要があります。
Integromatで日付を日本時間にする方法

Integromatで日付を扱おうとしたら日本の標準時じゃなかったので。

##Integromatにおける日付
 ISO 8601 準拠協定世界時（UTC）で統一しているみたいです。

##日本の標準時で扱う方法
formatDate関数を使います。

画像の真ん中下段にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1264471/a8f0bb2c-00a8-28c4-1a5c-fb27a86e43a3.png)

##formatDateの使い方

```
formatDate(変換したい日付 ; 日付のフォーマット ; タイムゾーン)
```

で指定します。
日付のフォーマットはある程度自由に指定できます。

例）
YYYY/MM/DD HH:mm　⇒　2021/05/27 17:25
YYYY-MM-DD hh:mm a　⇒　2021-05-27 05:25 pm

タイムゾーンは東京にするのであれば「Asia/Tokyo」を指定します。
他のタイムゾーンにするのであれば下記のページで好きな地域を選び「TZ database name」を指定しましょう。

[List of tz database time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List)

これで日本時間で日付が扱えるようになります。
Optional型の基本

#Optional型とは

```.swift
var a:Int = 1

var b:Optional<Int> = nil

```

通常Swiftの型は`nil`を許容しない。`var a:Int = nil`なんていう宣言をするとエラーが出ます。
でもOptional型を用いると`nil`を入れられます。

#便利なこと

何処かから値を受け取って処理する時にその値がまず`nil`じゃないかどうかを気にする処理を書く時、Optional型を使わないとしたら

```.swift
if a != nil {
  //nilじゃなかったときの処理
  } else {
  //nilだったときの処理
  }
```

こんな書き方ですかね。まぁこの書き方で何か不備があるのか今の私ではよくわかりませんが（強制的にネストになるのか好ましくないのか？）、swiftの仕様上このような書き方にはならず、以下のようになります。

###オプショナルバインディング

```.swift
var a:Int? = 1

if let a = a {
  //nilじゃなかったときの処理
} else {
  //nilだったときの処理
}

type(of: a) //Optional<Int>.Type
```

これの良いところはif文の中でaはOptional<Int>型ではなくInt型になっているんですね。コレをアンラップと言います。なのでaは値を持っていることが保証されています。そしてif文を抜けた後ではまたaはOptional<Int>型に戻っています。

ちなみに`guard let`という構文もあって、コレは`guard let`を外れた先では自動的にアンラップされるという特徴があります。下のサンプルコードを見ると、

```.swift
var a:String? = "nilじゃないです"

guard let a = a else {
  //nilだったときの処理を書く
}

type(of: a) //String.Type
```

Optional<String>型のaは`guard let`の先でString型になっています。`if let`とは逆の結果になってますね。

### ??演算子

コレはnilだったときの値にデフォルトの値を設定する演算子です。`??`のあとにデフォルト値を書きます。

```.swift
let a:String?

if let a = a {
  ...
} else {
  print(a ?? "nilです")
}
```
aがnilだったら文字列`"nilです"`を出力します。
nilのまま出力しようとすると警告が出るので、文字列でnilであることがわかるようにしてます。

###強制アンラップ

`!`を使って強制的にOptional型を破壊。

```.swift
let a:Int? = 1
let b:Int? = 2

a! + b!
```

Optional型では四則演算ができないので`nil`かどうかはお構いなしに強制的に値を取り出してInt型にしてます。もしも`nil`だったらエラーで止まります。

#まとめ
基本的な使い方をまとめてみました。オプショナルチェインとかはまだあんまり使い慣れてないので、仲良くなれたら改めて追加しようと思います。

とても良いモチベーションになるのでストック、LGTMよろしくお願いします！
[AWS_05]Route53について

##概要
`Amazon Route53`についてのまとめ。

##動機
DNSについての知識がCCNPや応用情報など資格勉強で得た知識のみで、まだ理解が浅いためDNSと一緒にまとめることにした。

##Amazon Route53とは
可用性の高いDNSを提供するマネージドサービス。

##ルーティングポリシー
ルーティングポリシー|説明(教科書)|説明(自分的解釈)
---|---|---
シンプルルーティング|設定されたレコードの情報に従って、ルーティングする。|Route53にて、[ドメインとELB]を紐づけている。<br>例:ドメインxxxとLB-1が紐付けられていれば、xxxにアクセスするとLB-1へ。LB-2に紐付けられていればLB-2へアクセスする。
加重ルーティング|複数のリソースに対して加重度を設定し、指定した比率に応じて処理を分散するようにルーティングする。|例:ドメインxxxにアクセスすると、90%のトラフィックはLB-1へ。10%のトラフィックはLB-2へ。
レイテンシーベースルーティング|最もレイテンシーが低いリソースへルーティングする。|例:東京リージョンとオハイオリージョンでサービスを提供している場合、東京リージョンが50ms、オハイオリージョンが300msの応答速度だとしたら、東京リージョンへアクセスする。
位置情報ルーティング|接続クライアントの場所に基づいて、地理的に近い場所へルーティングする。|例:日本のPCからはアメリカのリージョンへ、アメリカのPCからはアメリカのリージョンへアクセスする。
複数値回答ルーティング|最大8つからランダムに選ばれた正常なレコードを使用し、Route53がDNSクエリに応答する。|DNSによる負荷分散に近いが、AWS公式は負荷分散の代替にはならないと言っている。
フェイルオーバールーティング|ルーティング対象となるリソースのヘルスチェックを行い、利用できるリソースへルーティングする。|プライマリとセカンダリがあり、プライマリへのヘルスチェックが失敗すると、セカンダリへアクセスする。

##レコード
レコード名|関連付け
---|---
Aliasレコード|ドメインとAWSサービス
Aレコード|ドメインとIPv4アドレス
AAAAレコード|ドメインとIPv6アドレス
NSレコード|ドメイン情報を管理するサーバ
SOAレコード|ドメインの管理情報
###AliasレコードとCレコード
ドメインとURLの関連付けがされる`Cレコード`は、AWSでは基本的に使用しない?らしい。理由はそれぞれの関連付けのされ方を見れば分かる。
**Aliasレコードの場合**
`ドメイン`
｜
`IPアドレス`

**Cレコードの場合**
`ドメイン`
｜
`AWSサービスのURL(LB-1-xxx.ap-northeast-1.elb.amazonaws.com)`
｜
`IPアドレス`

上記のように間に挟むかどうかで、応答速度が異なる。
さらに追加料金がAliasレコードは無料だが、Cレコードだと有料になってしまう。

##
西暦日付に型定義

`Date` は エラーになるが `string`よりは狭まったものがほしい

## TL;DR;

```ts
const oneToNine = [1, 2, 3, 4, 5, 6, 7, 8, 9] as const;
const d = [0, ...oneToNine] as const;
type OneToNine = typeof oneToNine[number];
type D = typeof d[number];
type YYYY = `19${D}${D}` | `20${D}${D}`;
type MM = `0${OneToNine}` | `1${0 | 1 | 2}`;
type DD = `${0}${OneToNine}` | `${1 | 2}${D}` | `3${0 | 1}`;
// これを使う
export type DateYMDString = `${YYYY}/${MM}/${DD}`;
```

![ 2021-05-27 at 17.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66521/7c554cfb-ee32-27c5-57e1-3ea134e62265.png)


### 例

```ts
let sample1 : Date;
sample1 = '2021/05/27'
// => エラー
// Type 'string' is not assignable to type 'Date'

let sample1 : DateYMDString;
sample1 = '2021/05/27'
// => OK
sample1= '2020:05:27'
// => エラー
// Type '"2020:05:27"' is not assignable to type '"1900/01/01" | "1900/01/02" | "1900/01/03" | "1900/01/04" | "1900/01/05" | "1900/01/06" | "1900/01/07" | "1900/01/08" | "1900/01/09" | "1900/01/10" | "1900/01/11" | "1900/01/12" | ... 74387 more ... | "2099/12/31"'.
```
Ruby 問題⑥ 特定の数字を検知するプログラムの実装　

#はじめに

とうとう明日プログラミングスクール卒業します涙

卒業しても学習はし続け、Qiitaアプトプットも欠かさず頑張ります！

本日はドリルのinclude?メソッドを復習します。






#問題
以下の要件を満たすarray123メソッドを実装。

・配列内に1,2,3が全て入っている場合は、「True」と出力してください
・配列内に1,2,3の全てが入っていない場合は、「False」と出力してください

```
出力例
array123([1, 2, 2, 3, 2]) → True
array123([1, 2, 5, ]) → False
array123([1, 1, 2, 3, 4, 3]) → True
```

#ヒント
include?メソッドを使用します。

公式リファレンス

https://docs.ruby-lang.org/ja/latest/method/Array/i/include=3f.html

https://docs.ruby-lang.org/ja/latest/method/String/i/include=3f.html


#解答

```.rb
def array123(nums)
  if nums.include?(1) && nums.include?(2) && nums.include?(3)
    puts "True"
  else
    puts "False"
  end
end

array123([1, 2, 2, 3, 2])
```

仮引数のnumsには配列[1, 2, 2, 3, 2]が格納されます。

そして〜だった時、"True",〜だった時,"False"なのでifを使います。

```.rb
 def array123(nums)
   if #条件式
    puts "True"
   else
    puts "False"
   end
 end
 
```

この条件式には「1があるとき」かつ、「2があるとき」かつ、「3があるとき」という記述をします。
そこで配列に対し、include?メソッドを呼び出します。
　


```
.include?()←引数に探索する数字
```

条件式は下記になります。

```.rb
nums.include?(1) && nums.include?(2) && nums.include?(3)
```