OmniAICreator/Qiita-1.07M huggingface dataset:
Kubernetes dashboard  Deploy

Kubernetes 1.15でのお話

#yaml download
```
mkdir dashboard
cd dashboard
wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dashboard/dashboard-controller.yaml
wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dashboard/dashboard-rbac.yaml
wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dashboard/dashboard-service.yaml
wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dashboard/dashboard-configmap.yaml
wget https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dashboard/dashboard-secret.yaml
```
#deploy dashboard
```
kubectl create -f ./
```
# make certificate and token
```
mkdir certs
cd certs/
openssl genrsa -out dashboard.key 2048
openssl req -subj "/C=JP/ST=Tokyo/L=Tokyo/O=test/OU=test Software/CN=test.jp/emailAddress=test@test.jp" -new -key dashboard.key -out dashboard.csr
openssl x509 -req -days 3650 -in dashboard.csr -signkey dashboard.key -out dashboard.crt
cd ../
kubectl create secret generic kubernetes-dashboard-certs --from-file=certs -n kube-system
cat > admin-token.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
 name: admin
 annotations:
   rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
 kind: ClusterRole
 name: cluster-admin
 apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
 name: admin
 namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
 name: admin
 namespace: kube-system
 labels:
   kubernetes.io/cluster-service: "true"
   addonmanager.kubernetes.io/mode: Reconcile
EOF
```
#deploy token
```
kubectl apply -f admin-token.yaml
kubectl get secret -n kube-system | grep admin | awk -F ' ' '{print $1}' | xargs kubectl -n kube-system describe secret 
```
GCPロードバランシングでssl化したもののGCEインスタンスのflaskにアクセスできなかった日

##前提&状況
・flask
・google compute engine
・loadbalancing
あとでかく

###解決策
ライブラリ(SSLify)を追加

```
$ pip install Flask-SSLify
```
github見ながらよしなに書き込む

```
from flask import Flask
from flask_sslify import SSLify

app = Flask(__name__)
sslify = SSLify(app)
```

##SUCCESS!!


####参考
[https://github.com/kennethreitz/flask-sslify](https://github.com/kennethreitz/flask-sslify)
[Python+Flaskで、全てのリクエストをHTTPSにリダイレクト「Flask-SSLify」](https://programmer-jobs.blogspot.com/2018/03/python-flask-sslify-requests-to-https.html)
高校数学の「極限値」関連の問題をPythonで解く

# 概要

　関数の極限値に関する問題（高校数学）を Python で解いていきます。練習問題と解答例の作成支援を目的としています（教員向けものです）。

- [高校数学の「ベクトルの内積」関連の問題をPythonで解く](https://qiita.com/code0327/items/b8614649757110c654b6)
- [高校数学の「高次方程式・恒等式」関連の問題をPythonで解く](https://qiita.com/code0327/items/66efb7ac56cdea5b0b0d)
- [高校数学の「2次関数グラフ」関連の問題をPythonで解く](https://qiita.com/code0327/items/83b87f3d490e740b2a95)
- [高校数学の「極限値」関連の問題をPythonで解く](https://qiita.com/code0327/items/1fd0df574c8c8357af5a)
- [高校数学の「微分」関連の問題をPythonで解く](https://qiita.com/code0327/items/97fcacc42ab44402eb35)

# 問1

次の極限値を求めよ。

$$ \lim_{x \to -\infty} \frac{5x^2-x}{4-2x^2} $$

## 問1の解き方（参考）

分子分母を $x^2$ で割ります。

$$\lim_{x \to -\infty} \frac{5x^2-x}{4-2x^2}  = \lim_{x \to -\infty} \frac{5-\frac{1}{x}}{\frac{4}{x^2}-2}  = -\frac{5}{2} $$

## 問1の解を与えるPythonプログラム

sympy を利用して解きます。sympy は、記号計算（数式処理）のパッケージです。無限大 $\infty$ は `sympy.oo` で与えます。

```python:Python
from sympy import oo, limit, Symbol
x = Symbol('x')
fx = ( 5*x**2 - x ) / ( 4 - 2*x**2 )
ans = limit(fx, x, -oo)
print(f'解：{ans}')
```

## 実行結果

```
解：-5/2
```

## おまけ1

分数関数 $\frac{5x^2-x}{4-2x^2} $ のグラフを描いてみます。$x\to -\infty$ を見るために、$x$軸をログスケールにします。

```python:
import numpy as np
import matplotlib.pyplot as plt
from sympy import Symbol,solve

# 定義域を確認
g = ( 4 - 2*x**2 ) # 分母
sx = solve(g)
tmp = ', '.join(map(str,sx))
print(f'分母 ( {g} ) がゼロになるのは（定義域から除外されるのは） x= {tmp}　')

# グラフの描画 ここからは numpy を利用
x1 = -np.logspace(-2, 4, num=100)[::-1] # -10e4  ～ -10e-2
x2 =  np.logspace(-2, 4, num=100)       #  10e-2 ～  10e4
x  =  np.concatenate([x1,x2])
f = lambda x : ( 5*x**2 - x ) / ( 4 - 2*x**2 ) 
y = f(x)
plt.figure(dpi=120)
plt.plot(x, y, marker='.')
plt.ylim(-10,10)
plt.xscale('symlog') # 対称ログスケール
plt.show()
```

### おまけ1の実行結果

```
分母 ( -2*x**2 + 4 ) がゼロになるのは（定義域から除外されるのは） x= -sqrt(2), sqrt(2)　
```

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152805/66a2499e-f030-16e3-ff40-db6af3ab604d.png)

グラフからも、$x\to -\infty$ で、$-2.5$ に収束することが推測できます。

## おまけ2

定義域から外れる $x= \pm\sqrt{2}$ でどのような値に近づくのかを見てみます。ここでは $\sqrt{2}$ について、右側（$\sqrt{2}+\delta$）からと左側（$\sqrt{2}-\delta$）からのアプローチしたときの値を見てみます。つまり、$x\to \sqrt{2}^{+}$、$x\to\sqrt{2}^{-}$ のときの極限値を求めます。

`sympy.limit()` の第4引数に、`'+'` または `'-'` を設定します。

```python:Python
from sympy import limit, Symbol,sqrt
x = Symbol('x')
fx = ( 5*x**2 - x ) / ( 4 - 2*x**2 )
ans1 = limit(fx, x, sqrt(2), '+')
ans2 = limit(fx, x, sqrt(2), '-')
print(f'解：{ans1}, {ans2}')
```

### おまけ2の実行結果

グラフの結果と一致します。

```
解：-oo, oo
```




# 問2

次の極限値を求めよ。

$$ \lim_{x \to \infty} (\sqrt{x^2+1}-x ) $$

## 問2の解き方（参考）

```math:
\begin{align}
\lim_{x \to \infty} (\sqrt{x^2+1}-x )  & = \lim_{x \to \infty} \frac{(\sqrt{x^2+1}-x)(\sqrt{x^2+1}+x)}{\sqrt{x^2+1}+x}  \\
& =  \lim_{x \to \infty} \frac{(x^2+1)-x^2}{\sqrt{x^2+1}+x} \\
& =  \lim_{x \to \infty} \frac{1}{\sqrt{x^2+1}+x} \\
& = 0
\end{align}
```


## 問2の解を与えるPythonプログラム

```python:Python
from sympy import oo, limit, Symbol, sqrt
x = Symbol('x')
fx = sqrt(x**2+1)-x
ans = limit(fx, x, oo)
print(f'解：{ans}')
```

## 実行結果

```
解：0
```
テスト品質①

テスト品質についてまとめていく
第5回までを予定

①テストとは
②品質とは
③代表的なテスト技法
④レビューについて
⑤テスト工程枚の確認ポイント



## テストの概念について
### テストとは？
要求通りにソフトウェアが機能するか確認する。
テストとしては、ソフトウェアの動作確認を指すことが多いが、
テストの計画や、テスト終了判定の検証、結果・プロセスの報告などもテストの一環。

### 何のため？
- バグをできる限り見つける
- 重要な部分の動作を保証する
（バグが多い箇所やバグが許されない箇所）
- バグの作りこみを予防する

## テストの7原則

JSTQBが提唱するテストの原則
JSTQBは、世界的なテスト技術者資格を運営するISTQBの加盟組織。

### テストは問題がある事しか示せない
どれだけテストしても、バグがないことは証明不可能。
あくもあでも、潜在するバグを見つける事が目的。

### 全数テストは不可能
入力パターンをすべて網羅することは、基本的に不可能。
例えば、9桁の数値（0〜9）を入力するシステムの入力パターンは、10^9＝1兆となる。
さらに、この例は正常系しか含まれていない。
パターンに対し、バグの多さや発生時のリスクから、優先順位をつけて対象を絞る。

### 初期工程にてテスト
バグ対応は下流工程ほどコストが高い。
可能な限り初期でバグを検出を目指す。

### 欠陥の偏在
欠陥は特定のモジュールに集中する。
例えば、新人が対応した箇所に他よりバグが多かったり、
複雑な機能にバグが集中していたり等。
要件、機能、工程、スキル差などから傾向を分析できる。

### 殺虫剤のパラドクス
虫を殺す殺虫剤身も、使い続けると耐性により効果がなくなるように、
テストテンプレートを使い回しを続けていると、バグを検出し難くなる。
定期的なメンテやテスト内容の再評価は必要。

### テストは条件次第
全く同じ製品でも、条件によって実施するテストは異なる。
個社への対応と、全社向け対応で同じレベルのテストはしない。
要求品質レベルがズレたまま製造が進まないように気を付ける。

### バグ0の落とし穴
バグがないことは高品質ではない。
結果として、性能や利便性を犠牲にしていないか。
COMアパートメントの雑メモ

プロセス
　アパートメント←この壁を超えるのにプロキシスタブがいる
　　スレッド


Single はじめに生まれた
Apart ひとりにしてくれ
Both どこでもいいよ（同期できるよ）
Free 子分と別居はちょっと

STA めんどくさい処理はCOMがやるアパートメントにメッセージポンプがいる
MTA スレッドセーフに作れ
　いろいろあるけどリエントラント（再入可能）とか（目を離してもスキは作らない）

マーシャリング
・MIDL（ちょっとはやい
・タイプライブラリ（オートメーションONLY ユニバーサルマーシャラ
・カスタム（融通と効率 IMarshalと全インターフェイス



DLL クライアントと同プロセス 複数のクライアントプロセスの間でデータは共有しない
EXE クライアントと別プロセス 常にProxy-Stubがいる 複数のクライアントから接続可能

DllHost DLLサーバーにリモートアクセスできるようにするやつ（サロゲート

　　　　　　UIを持つ
　　　　　　　↓
コンテナ→コントロール 昔からあった
コンテナ←コントロール 

A→functionA（関数ポインタF）→B
A←コールバック F()←B

※SyncじゃなくてSinkだった

A→ シンクインターフェイス ISyncを渡す →B
A←コールバック ISync.method() ←B<イベント発生

大原則
サーバがクライアントへイベントを通知する
サーバはシンクインターフェイスを通じてクライアントへイベントを通知する


わたしかた
A サーバ・コネクタブルオブジェクト サーバ側のイベントに応じてシンクインターフェイスを持つ（外部インターフェイスのリストも持つ） コネクションポイントオブジェクトも実装する（コールバックの元締め） コネクションポイントコンテナも実装する（さらなる元締め）
B クライアント・シンクオブジェクト シンクインターフェイスを使ってシンクオブジェクト・そのメソッドを実装

A→B IUnknownをわたす
B QIでIconnectionPointContainerを照会※1、Aから通知を受け取りたいシンクインターフェイスが使えるか確認
（使えるので BはAから IConnectionPoint をもらう）
B AのIConnectionPointインターフェイスのAdviseをコール、自分のISyncを渡す
　　A ISyncをIUnknownとしてリストに追加
A なんかイベントがおこったので（コネクションポイントオブジェクトを見つけ、インターフェイスポインタのリストを照会し）もらったISynｃをコール
B イベント発生

※1 全リストをもらう方法と個別に聞く方法がある EnumConnectionPoints(), FindConnectionPoint()

コネクタブルオブジェクト
→テンプレートを継承&マップで追加→コネクションポイントコンテナ
　→マップで追加→コネクションポイント
COMの例え話を思いついたので書き留める

インターフェイスが人（職種でもいいかも）
メソッドが仕事
コクラスが組織

できる仕事は人によって違う（インターフェイスとメソッドの関係）
各人ができる仕事はそれぞれ決まっている（）
ある人が同じ仕事をやる場合でも、親の組織によってやり方が違う（インターフェイスの実装）
同じ人が複数の組織にいてもよい（インターフェイスの継承・コクラスとインターフェイスの関係）
組織がどんな人材を擁しているか（どんな仕事ができるか）は公示する（IDLとかレジストリとか）
仕事に必要なインプットと、仕事の成果物の仕様も公示する（インターフェイス定義だか宣言だか）
組織や人にはIDが振られており、名前とIDを変換する仕組みがある（LID,IID,CID etc)

どの組織にも、その組織にいる人材を管理する窓口が必要（IUnknown)
　ある組織にいる人材は、その組織の同僚全員の情報（誰がいて何の仕事ができるか）を聞かれたら答えられる（IUnknownを継承）
組織→人→その人の仕事 と問い合わせると仕事が発注できる（QI経由のメソッド呼び出し）
IUnknownは人材に仕事があるかの管理も行う
　ある人の仕事がなくなったら解雇、仕事ができたら再度雇うのが原則（労働者に厳しいね…



組織によっては、仕事を指定するだけで発注可能な窓口を持っている（IDispatch）
　組織がIDispatchを持っていれば、それを通じて組織として可能な仕事を直接問い合わせることが可能（オートメーション）
　IDispatch経由で頼める仕事は、インプット・アウトプットの形式が制限される（オートメーションタイプ）
　（IDispatchが？）コンパイル時に人と仕事の対応を知っておく方法と、受注時に誰の仕事か調べる方法とがある 前者は早い 後者は融通がきく（アーリーバインディングとレイトバインディング）

人経由でもIDispatch経由でも仕事を受注できるようにすることが可能（デュアルインターフェイス）

組織が別の組織を子会社化したり、子会社に仕事を下請けに出すとかもできる その場合人材窓口が混乱しないよう１つにまとめる（アグリゲーションとかデリゲートとか）
（子会社にはならないぞタイプの組織や、子会社としてじゃないと存在できない組織もいる）

発注元の敷地に常駐する住み込むタイプと、常駐しない住み込まないタイプの組織がいる？？？（たとえとしてこれでいいのだろうか・DLLとEXE）
（常駐というとプロセスとして常駐的なやつについても言うからちょっと誤解を招きそう）
　住み込み型と住み込まない型とで、仕事のない人を切るか切らないか変わってくるらしい…
　住み込み型は、組織の立ち上げと解散も発注元から仕事があるかで決まる
　住み込まない型は、組織の立ち上げ・解散タイミングを自分（誰？）の都合で決められる

受注元は、敷地をどう使うか決められる（？）


複数のクライアントからの仕事を同時に受注できる組織と、一度に１つのクライアントからの仕事しかできない組織がいる（MTA, STA？、スレッドモデルのはなしがしたい）

アパートメントの概念を具体的に理解できてねえなこれ

基本はクライアントがサーバーに仕事を発注してアウトプットをもらう
双方向のやりとりをしたい場合はサーバーが連絡担当のひとの情報を公開してクライアントが雇い、サーバ側でなにかあったらその人にれんらくする的な…（コネクタブルオブジェクトとコネクションポイント）
連絡担当の人は連絡のための研修を受けている（コネクションポイント）

こんな人材がいるよなーというのをIDLに書くと、ヘッダとソースにしてくれるのでそれを組織が継承して実装する感じでいいんだっけ…
取引先募集のレジストリもVisual Studioが作って貼り出してくれる
Django + Heroku + Google Driveで画像をアップロードする

# HerokuにデプロイしたDjangoアプリで写真が使いたい
Herokuでは画像のアップロードが非対応なので、画像をGoogle Driveに投げてAWS S3等を使わずにお手軽に表示できるようにしよう！という記事です。

手順は、以下の３つです。
1. Google Cloud Platformから、認証JSONファイルの取得
2. ライブラリのインストール
3. Djangoの設定

> 参考文献
> Django Google Drive Strage リファレンス
> https://django-googledrive-storage.readthedocs.io/en/latest/


## Google API 
### Google Drive APIの有効化
1. Google Cloud Platform (https://console.cloud.google.com/getting-started?hl=ja) にアクセス
2. 検索バーの左側の「プロジェクトの選択」からプロジェクトを選択（もしくは"新しいプロジェクト"から作成）
3. 上の検索バーに「Google Drive API」と入力し検索 -> 「有効にする」


### APIキー(JSONファイル)の取得
1. ナビゲーションメニューの「APIとサービス」から「認証情報」を選択
<img width="1440" alt="GCPスクリーンショット１" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397410/24e32841-bdc0-ec03-0083-0358abf72a2f.png">

2. 「認証情報を作成」ボタンの中から「サービスアカウントキー」を選択
<img width="1440" alt="GCPスクリーンショット２" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397410/ed837d06-7eef-75a7-a688-ae3bb92da064.png">

3. 新しいサービスアカウントを作成から、サービスアカウントを作成する。
キーのタイプは「JSON」。役割は、写真のように選択する。
<img width="1440" alt="GCPスクリーンショット3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397410/e52a8efe-56a3-cc62-bd6c-f46240f1fd03.png">

4.「作成」を押下するとJSONファイルがダウンロードされるので、保存する。

## ライブラリのインストール
Djangoで必要になるライブラリをインストールします。

```bash:bash
$ pip install django-googledrive-storage

#忘れないうちに
$ pip freeze > requirements.txt
```

## Djangoの設定
ダウンロードした`~~~.json`を`manage.py`と同じ階層に配置
`setting.py`に`INSTALLED_APPS`と、googleアカウント、jsonファイルのパスを追記

```python:setting.py

INSTALLED_APPS = (
    ...,
    'gdstorage' #追加
)

# Google Drive Storage Settings
#
GOOGLE_DRIVE_STORAGE_SERVICE_EMAIL = "[Googleアカウント]"
GOOGLE_DRIVE_STORAGE_JSON_KEY_FILE = os.path.join(BASE_DIR, "[発行されたJSONのファイル名(~.jsonまで)]")
```
`models.py`でモジュールのインポートと、`ImageField`を使用していた部分に `storage=gd_storage` と追記

```python:models.py
from gdstorage.storage import GoogleDriveStorage

# Define Google Drive Storage
gd_storage = GoogleDriveStorage()

#models.ImageFieldの引数に 「storage=gd_storage」を追加
image = models.ImageField(upload_to="your_file_dir/", storage=gd_storage)

```

ここまでできれば、画像のアップロードは無事できるはず。

## テンプレートの変更
ここまでくると、Google Driveへの画像投稿ができるのですが、画像表示ができません。
そこで簡単なスクリプトを使用してURLのパスを作成します。  
(注意) Google Driveのリンクをハードコードで拾ってきているので今後のGoogleの仕様変更で動かなくなる可能性もあります。

アプリの`templates`と同じ階層に`templatetags`というフォルダを作成します。
その中に`drivelink.py`という名前で以下のコードを入力します。

```python:templatetags/drivelink.py
from django import template

register = template.Library()

@register.filter(name="convert_drivelink")
def convert_drivelink(url):
    return "http://drive.google.com/uc?export=view&id="+url.split("/")[5]
```

ここまで来たら、テンプレートファイルの中で`{% load static %}`と`{% load drivelink %}`をファイルの先頭に追加。以下のようにオブジェクトにフィルターを掛けてあげるだけ。

```python:~~~.html
{% load static %}
{% load drivelink %}

<img src="{{[オブジェクト].url|convert_drivelink }}">
```

**一回サーバを再起動しないと適用されないので、再起動をお忘れなく。**  

これで画像表示もできるはずです！
CloudFrontのキャッシュをAWS CLIで削除する

# 前提
AWS CLIは使用できる環境

# 結論

```text

aws cloudfront create-invalidation --distribution-id XXXXXXXXXXXXXX --paths "/*"
```

distribution-idは、マネジメントコンソールでIDと表示されている箇所

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478113/537ab77f-004a-2729-be6f-2d2bc32569a8.png)

pathsは削除したいパスを指定する。
ここでは全てを削除する例になっている。

# 2019/10/15 修正
「--paths」で指定するパスをダブルクォーテーションで囲むように変更

```text:変更前
--paths /*
```

```text:変更後
--paths "/*"
```

開発者ガイドに下記のように記載してありました。
AWS コマンドラインインターフェイス (CLI) を使用してファイルを無効にする場合に、* ワイルドカードを含むパスを指定するには、パスを引用符 (") で囲む必要があります。

WindowsのPCからはダブルクォーテーションなしでもうまく動きましたが、Linuxの環境ではうまく動きませんでした。
ダブルクォーテーションなしだと、下記のパスに変換されました。

```
/tmp /srv /root /media /selinux /opt /mnt /etc /usr /dev /var /sbin /proc /bin /codebuild /sys /home /local /get-pip.py /boot /lib64 /lib
```

今いる環境のルート直下のディレクトリ/ファイル？

# 参照サイト
https://docs.aws.amazon.com/cli/latest/reference/cloudfront/create-invalidation.html
git ルート階層を上げたい！

# はじめに
それまでのコミット履歴をsquashしたりしているなど、たいへん荒っぽいことをやっています

remote repositoryにプッシュ後にやったりすると、間違いなくややこしいことになります

（筆者はこのときsvn環境でひとりローカルgitだったので…）

# やりたかったこと
gitのRootが

>
Root
├ dirA
└ dirB
　└ subDirC ←ここ
　　└.git

だったのを

>
Root ←ここ
└.git
└ dirA
└ dirB
　└ subDirC

にしたい

# 補足
ブランチを複数切っていた（ただし，結局ブランチは整理）

一応いくつか方法は調べたが，

Subtree→ブランチがめためたになる
SubModule→よくわかんない

ということで、以下の方法を使った

# やったこと
Filter-branchを使った

1. `Root`ディレクトリ配下から、現在のgitのルートディレクトリ すなわち`dirB/subDirC`を抜いたものを、.gitと同階層= `subDirC`にコピー  
(`Root`の親ディレクトリがカレントディレクトリの状態で ` find ./Root -type f -not -iwholename '*/subDirC*' -print0 | xargs -0 cp --parents -p -t ./Root/dirB/subDirC` などするとよいと思う)

>
Root
├ dirA
└ dirB
　└ subDirC
　　├ .git
　　└ Root
　　　├ dirA
　　　└ dirB
　　　　└ (subDirC以外のdirBのなかみ)

~
2. `master`ブランチに、1でコピーした`Root`配下をadd&commit
3. ブランチが生えまくってるとうざいことに気づき、不要なブランチを整理、枝分かれ１つ（と言ってもFast-forward）だけ (`feature_hoge`)に。なお今回のきっかけになったdirB外におよぶ変更については歴史修正後につぎはぎすることにして退避した
4. `master` ブランチで `git rebase -i --root`して、First commit以外、2.のコミットまでを全部Squash, First commit時に`Root`が存在する状態にしておく
5. `feature_hoge`にCheckout(このとき`master`からはdetachされている), `git rebase master`し、すでに`Root`のいる時空の`master`から`feature_hoge`を生やす
6. `feature_hoge`で`git filter-branch` をつかって以下の操作  
`git filter-branch --tree-filter 'mkdir Root/dirB/subDirC ; find ./ -mindepth 1 -maxdepth 1 -not  -path "*Root*" -not -path ".git*" | xargs -I% mv  % Root/dirB/subDirC' HEAD --all`  
（2でコピー後の`Root`を起点とし、本来`subDirC`があるべきところにフォルダを作って`Root`とカレントディレクトリとgitディレクトリ以外を移動、移動後の状態で全ブランチの歴史を書き換える。）
>
Root
├ dirA
└ dirB
　└ subDirC
　　├ (subDirCの元々のなかみ) ←  `find ./ -mindepth 1 -maxdepth 1 -not  -path "*Root*" -not -path ".git*"` で指定する
　　├ .git
　　└ Root
　　　├ dirA
　　　├ dirB
　　　└ subDirC ←  `mkdir Root/dirB/subDirC` で作成
　　　　└ subDirCのなかみ ← `find (略) |xargs -I% mv  % Root/dirB/subDirC' HEAD --all` で移動

当然ですが、こんなことやるとfilter-branch前後でコミットIDが変わってしっちゃかめっちゃかになります  
7.  `subDirC`の元々のなかみのうち、Git管理外のファイルが移動されないまま残るので、様子を見つつ整理する  
8. `git filter-branch -f --subdirectory-filter Root/ -- --all` して、gitのルートディレクトリを1階層ずらす（これにより、gitのルートディレクトリ・.gitの場所はそのまま、Root(コピー後)が消滅、その配下が1階層上に上がる。相対的には目標のディレクトリ構成に）
>
Root
├ dirA
└ dirB
　└ subDirC ←ここがgitのRootなのは相変わらず
　　├ .git　
　　├ dirA ← 1階層上にくる
　　└ dirB ← 1階層上にくる
　　　└ subDirC

当然ですが、こんなことやるとfilter-branch前後でコミットIDが変わってしっちゃかめっちゃかになります  
9. `subDirC`の名前を`Root`に変える
>
Root
├ dirA
└ dirB
　└ Root ← リネーム
　　├ .git　
　　├ dirA
　　└ dirB
　　　└ subDirC

~
10. もとのSVN Repo内にぶちこむ ← ※ 筆者の環境で必要だっただけです
11.  なんかSVNが改行コードSensitiveだけど適当にごまかす ← ※ 筆者の環境で必要だっただけです
12.  必要に応じて9で作った方のRootを本来の場所に移動とかするといいんじゃないでしょうか

# 参考文献
あったはずなんだけどメモしてない！ごめんなさい！
Xcode11 で「IPA processing failed」というエラーが出たけど、無理やり ipa ファイル作成できてしまった件

# 概要
気づいたら Xcode11 が展開されていたので、
Xcode10.1 で進めてたプロジェクトを更新しようと作業してたんですが、
ipa ファイル作成段階で問題が発生しました。
が、なんか裏技みたいな感じで解決してしまったのでメモしておきます。
ちゃんとした方法知ってる人教えてください。

# 詳細
1. Xcode11.1 でプロジェクトを Archive したので、Distribute App から ipa 作ろうとした。
<img width="744" alt="スクリーンショット 2019-10-03 16.58.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19668/33dcc9f4-2b92-eb6e-df54-fe1cb4a48197.png">

2. なんかやってる画面が開く。
App Thining とか知らんけど、毎回 None にしてる。
<img width="741" alt="スクリーンショット 2019-10-03 16.59.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19668/34c68f1f-b5ba-10e7-7756-dbf42f068443.png">

3. 時間経過で「IPA processing failed」とか表示される！なんやこれ！
<img width="745" alt="スクリーンショット 2019-10-03 16.59.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19668/c6fe4531-4a41-0719-b6b6-52f97ddc13ff.png">

4. ちなみに Xcode11.1 で Archive したブツで、Xcode10.3 から ipa 作成しようとすると
ある程度進められたが、今度は違うエラーが表示される。
さっきより表示が親切だけど結局なにしていいかはわからない。
<img width="742" alt="スクリーンショット 2019-10-03 17.02.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19668/6798a1f9-6744-6caf-e46e-cfde7041a985.png">

5. 「IPA processing failed」で検索すると、bitcode に言及してる人のツイートがあった。
Build Settings の Enable Bitcode は既に No なので、compileBitcode の方をどうにかしてみることにする。
compileBitcode ってなんや（初心者）。

6. 2番の画像の「Rebuild from Bitcode」のチェックマークのことかな？
と思ったので、エラー画像が表示される前に、素早くチェックを押して、Next ボタンを押す。
（実際は間に合わなかったので、トラックパッドでチェックを外して、Enter キーをタップして進めた）

7. 通った。
（見せられなくて全部黒塗りになるので、キャプチャなし）


やっといてなんだけど、エラー出る前にすばやく操作する、
とかいう操作が正しい方法とは思えないのでこわい。
アポー早く修正して。


# 余談
昔書いた記事にいいねとかコメントがついてるっぽいんだけど、
俺の記憶ではうんこ記事なので怖くて見に行けない。
vue.js 子から親へイベントを渡す

# 子から親へイベントを渡す $emit

emitは **放つ** というような意味。

参考
https://qiita.com/fukuman/items/b0bc84081ad0d2bc522a

親コンポーネント Welcome
子コンポーネント SessionNew

### 1. 子コンポーネントからイベントを渡す

```js:session/new.vue
// templateは省略

methods: {
    loginUser: function() {
      axios
      .post('/login',
      {
        user: {
          email: this.user.email,
          password: this.user.password,
          password_confirmation: this.user.password_confirmation
        }
      })
      .then((res) => {
        console.log(res.data)
        this.$emit('isLogin') // <=== 親コンポーネントに isLogin というイベントを渡す
        this.$bvModal.hide('session-new-modal')
      }, (error) => {
        console.log(error)
      })
    }
  }
```

### 2. 子コンポーネントからイベントを受け取る
**子コンポーネントsession-newのプロパティに設定する**

```
@子から受け取ったイベント名="実行したい親コンポーネントのメソッド"
```

```welcome.vue
<template>
  <div>
    <session-new @isLogin="loginMessage"></session-new>
  </div>
</template>
```

### 3. 子コンポーネントのイベントをきっかけに、親コンポーネントのメソッドを実行する
イベントを受け取ったら、**ログインしました**というメッセージを表示する

```js:welcome.vue

<template>
  <div>
    <p v-show="user.showMessage">ログインしました。</p>
    <session-new @isLogin="loginMessage"></session-new>
  </div>
</template>

data: function () {
  return {
    user: {
      showMessage: false
    }
  },
  methods: {
    loginMessage: function() {
      console.log('loginMessage called')
      this.user.showMessage = true
    }
  }
}
```
【講演メモ】AWSの「隙間」を埋める隙間家具OSS開発 (AWS Dev Day Tokyo 2019 Day1)

```
# 講演名
AWSの「隙間」を埋める隙間家具OSS開発

# URLとか
https://aws.amazon.com/jp/about-aws/events/2019/devday/live/
Day1 15:00-15:45

# メモ
- マネージドサービスは開始直後は足りない機能がたくさんある
  - 徐々に機能が増えていく(勝手に強くなる)
  - 工夫で何とかなる機能は後回しになりがち

- 足りない機能を補うOSS（隙間家具OSS）で補助して運用していくと良い
  - マネージドサービスを使わないで自前運用は辛い
    - 勝手に強くならない(人的コストがかかる)

- 隙間家具を自作する
  - 小さく、そのユースケース内で適切な汎用度を持ったものを作る
  - 本家が隙間を埋めたら捨てられる粒度で作る
  - マネージドになった時にきれいに取り外せる設計が大事
  - リトライ時に副作用のない設計になっていると嬉しい
    - 複数サービス間の連携を一度に処理するとリトライが複雑になる
  - 単機能に特化しつつ、そのドメインでの汎用性を持たせると使いまわせる
  - クラウドネイティブの思考方法は大事
  - 状態はマネージドサービスに持て、ユーザのコンピューティング処理は状態を持つな
    - 状態はマネージドサービスに状態を持たない処理だけ書くとスケールが容易
  - 将来マネージドになりそうな部分をアプリケーションのべた書きで解決しない。小さいツール/ライブラリに切り出しておく。
    - アプリケーションで直接書くと蜜結合する
      ->改修しづらい ×
- 「隙間家具OSS」の実例と運用
  - Rin https://github.com/fujiwara/Rin 
  - s32cs
  - ssmwrap

- OSSとして作ると、以下のメリットがある
  - ドキュメントを作るようになる
  - 過度な社内事情の混入を防ぐ
    - 責任分界点を見極めることで将来外しやすくなる
    - 設計がきれいになる
  - 魔改造版が増殖するのを防ぐ
    - 別のプロジェクトのコピペが減る
    - コピペ後に改造されると新機能やバグフィックスに追従できない
  - 同じ様な隙間家具ツールをみんなが毎回手書きするのは無駄

# 感想
- AWS運用あるあるでよかった
- 個人で作った小さなツールをOSS化するってはありだなー。
```
【ゲーム全般】【用語】

# ゲームに関する記事で調べたことをまとめるだけ。

## 技術系


## 技術じゃない系
pay to win  : 課金者が圧倒的に有利になってしまうこと。
レイドバトル : 複数のプレイヤーが協力して敵と戦うこと。
エンドコンテンツ : クリア後の要素のこと。いわゆるRPGの裏ダンジョンとか。
常用Windowsバッチ


* 空フォルダを消す  
`for /f "delims=" %d in ('dir . /ad /b /s') do rd "%d"`

* クリップボードの中身からSVNひらく
* 
    ```
    @echo off
    cmd.exe /c "echo Dim Input:Input="":Do While Not WScript.StdIn.AtEndOfStream:Input=Input^&WScript.StdIn.ReadAll:Loop:WScript.Echo Input > %temp%\_.vbs"
    mshta.exe "vbscript:Execute("str=window.clipboardData.getData(""text""):CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write(str^&""""):close")" | cscript //nologo %temp%\_.vbs  > xx.txt

    SET /P STR=<xx.txt
    del xx.txt


    start "" "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:repobrowser /path:"%STR: =%" 1
    exit
    ```

* SNV UPDATE

    ```
    chcp 932

    TortoiseProc /command:update /path:"C:\xxxxx"
    ```

* 自身のディレクトリ  
  - `%~dp0`

* 自身のファイル名のみ
  - `%~n0`
* yyyymmdd  
  - `%date:~0,4%%date:~5,2%%date:~8,2%`

* YYYYMMDDHHMMSS

    ```
    set YYYYMMDDHHMMSS=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
    %YYYYMMDDHHMMSS: =0%
    ```


* ファイル名に時刻  
  - `echo ^<order^>^<todate^>out^<^/todate^>^<^/order^> >>input/test_%time:~0,2%%time:~3,2%%time:~6,2%.xml`

* メッセージボックス  
  - `mshta vbscript:execute("MsgBox(""hogehoge""):close")`

* クリップボードにコピー
  - `：SET /P<NUL="ないよう"|clip  `


* 日付付きメモ

```
@echo off  
set /p str=":"  
echo %date%%time%::%str%>>tmemo.txt  
```

* `>>memo.txt`←追加　`>memo.txt`←上書き

* バッチファイルからutf-8で保存したい。  
①「CHCP 65001」もしくは「CHCP 850」でコードページ番号を設定する(65001：utf-8、850：utf-16)  
②それでもできないなら、バッチファイルがS-JISになっているのでは？
php & nginx 設定変更 反映 確認

### nignx graceful リロード
nginx -s reload

### 上記で反映されない時
※fpm再起動しなくても反映されるものもある
service php-fpm restart


### nginx確認
nginx -T | grep hoge

### php確認① 見れない設定もある！ だまされちゃいけない ②を使って
※Apacheなら問題ないけど ngixではこれだめ
php -r 'phpinfo();' | grep hoge

### php確認②
php-fpm -i | grep hoge
bundlerのバージョンを固定してbundle installする方法

# ローカルのbundlerでinstallできない
mysql2のgemのバージョンをあげたら、bundlerができなくなり、下記のようなエラーを出し始めた。

```
Bundler could not find compatible versions for gem "bundler":
  In Gemfile:
    rails (= 4.2.7.1) was resolved to 4.2.7.1, which depends on
      bundler (< 2.0, >= 1.3.0)

  Current Bundler version:
    bundler (2.0.2)
This Gemfile requires a different version of Bundler.
Perhaps you need to update Bundler by running `gem install bundler`?

Could not find gem 'bundler (< 2.0, >= 1.3.0)', which is required by gem 'rails (= 4.2.7.1)', in any of the sources.
```

## 本番で動いているbundlerのバージョンに合わせたい
下記のようにオプションで-vをつけてバージョンを指定すると、そのバージョンのbundlerをインストールすることができる

```
$ gem install bundler -v 1.16.1
```

すると、下記のコマンドを打つと、ローカルに入っているbundlerのバージョンが一覧できる。

```
$ gem list bundler

*** LOCAL GEMS ***

bundler (2.0.2, 1.16.1)
```

## bundlerのバージョンを指定して、install
bundler installと何もつけずにコマンドを実行すると、インストールされているbundlerの中で最新を使って行われるので、古いバージョンを利用してbundler installする場合は、下記コマンドでinstallを行う。

```
$ bundle _1.16.1_ install
```

これでbundle installができるようになりました。
アクセス修飾がInternalのメソッドを単体テストする方法

通常Visual Studioでテスト可能なのはpublicに公開されているメソッドのみであり、internal以上のアクセス制限がかかったメソッドに対してコンテキストメニューから「単体テストの作成」を選んでも「単体テストの作成は、パブリック クラスかパブリック メソッド内でのみサポートされます」とアラートが出てテストを作成することができない。

しかし、privateメソッドだけならまだしもプログラム内で他のクラスから呼ばれる可能性のあるinternalメソッドに関してはテストを行いたい場合があるのが実情だろう。

Visual Studioではテストを行いたいメソッドが所属するプロジェクトのAssemblyInfoにInternalsVisibleToを追加することによって、特定のプロジェクト(今の場合テストプロジェクト)に対して、internalメソッドの利用を許可することが可能である。

```c#:AssemblyInfo.cs
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
 
// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
// アセンブリに関連付けられている情報を変更するには、
// これらの属性値を変更してください。
[assembly: AssemblyTitle("Test Target")]
[assembly: AssemblyDescription("")]
#if DEBUG
[assembly: InternalsVisibleTo("TestProject")]
#endif
```
このように記述することで、internalメソッドを単体テストから呼ぶことが可能になる。ただし、コンテキストメニューからの作成はやはりできないのでテストクラスの作成などは自前で行う必要がある場合がある。

ここで#if DEBUGで属性をくくっているのは、テストのときだけこの属性が用いられ、リリース時には不要なアセンブリへの公開をしないための配慮である。

これで話が完了するのであれば、internalメソッドのテスト法などで検索することで情報を簡単に取得することができるのだが、テスト対象プロジェクトが「厳密な名前の署名つきアセンブリ」であった場合「フレンドアセンブリ参照'<TestProject>'は無効です。厳密な名前の署名つきアセンブリはそのInternalsVisibleTo宣言内で公開キーを指定しなければなりません」とアラートが表示されビルドエラーが出てしまう。
これは、はテスト対象プロジェクトが「厳密な名前の署名つきアセンブリ」であった場合はフレンドアセンブリも「厳密な名前の署名つきアセンブリ」である必要があるという制限があるかららしい。
では、どのようにすればテストプロジェクトに厳密な名前の署名を付けることができるのだろうか？

一番簡単な方法は、すでに使われているテスト対象プロジェクトで使われている「厳密な名前のキー ファイル」を指定して、テストプロジェクトに署名をしてしまう方法である。(「厳密な名前のキーファイル」の作成から手順を踏みたい場合はhttps://docs.microsoft.com/ja-jp/dotnet/standard/assembly/sign-strong-name を参考)
TestTargetプロジェクトのキーファイル(myproj_key.sn)をテストプロジェクトのフォルダにコピーしてきて、テストプロジェクトのプロパティを開き、署名タブで署名にチェックを入れれば、テストプロジェクトは「厳密な名前の署名つきアセンブリ」となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/f7cdd222-0b5b-1a9f-092b-dc13f3758855.png)
次に、テストプロジェクトの公開キーを取得する必要があるが、これにはVisalStudioの「開発者コマンドプロンプト」を用いる。

いったん、InternalsVisibleTo属性をコメントアウトするなどしテストプロジェクトをビルド後、生成されたテストプロジェクトのdllに対して

```powershell
sn -Tp <TestProject>.dll
```
を実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/31450899-e519-cd5e-5bc3-58db8f10fa09.png)

上記のような結果が得られる。この「公開キー」の部分をAssemblyInfoで指定すれば、テストプロジェクトでinternalメソッドを利用することが可能となる。

```c#:AssemblyInfo.cs
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
 
// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
// アセンブリに関連付けられている情報を変更するには、
// これらの属性値を変更してください。
[assembly: AssemblyTitle("Test Target")]
[assembly: AssemblyDescription("")]
#if DEBUG
[assembly: InternalsVisibleTo("TestProject, PublicKey=<TestProjectの公開キー>")]
#endif
```
部分ごとには検索に引っかかる情報なのだが、まとまって記されている記事が目につかなかったのでまとめてみた。
containerdでRed HatのUBIを使おうとしたらイメージのpullに失敗する

## 環境

- さくらのクラウド上に立てたサーバ(下記いずれのサーバでも発生)
  - k3OS(v0.2.0)
  - k3OS(v0.3.0)
  - Ubuntu 18.04.2 + containerd

## 状況

RedHatのUBIを使おうとするとイメージのpullに失敗する
(UBIについては[こちらの記事](https://rheb.hatenablog.com/entry/podman_on_centos7_with_ubi)などを参照)

### 再現手順(k3OSの場合)

```bash
# UBI(minimal)を指定
$ kubectl create deployment --image registry.access.redhat.com/ubi8-minimal ubi-test
```

### エラー内容

<img width="940" alt="スクリーンショット 2019-10-03 16.15.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20668/d01987d5-3357-f86e-f705-bdd8d2574aa5.png">

```console
$ kubectl describe pod <pod名>

...
Events:
  Type     Reason     Age                    From               Message
  ----     ------     ----                   ----               -------
  Normal   Scheduled  6m21s                  default-scheduler  Successfully assigned default/ubi-test-7d4f447fdd-7qr7w to example
  Normal   Pulling    4m46s (x4 over 6m20s)  kubelet, example   Pulling image "registry.access.redhat.com/ubi8-minimal"
  Warning  Failed     4m46s (x4 over 6m20s)  kubelet, example   Failed to pull image "registry.access.redhat.com/ubi8-minimal": rpc error: code = Unknown desc = failed to resolve image "registry.access.redhat.com/ubi8-minimal:latest": no available registry endpoint: could not resolve digest for registry.access.redhat.com/ubi8-minimal:latest
  Warning  Failed     4m46s (x4 over 6m20s)  kubelet, example   Error: ErrImagePull
  Normal   BackOff    4m30s (x6 over 6m20s)  kubelet, example   Back-off pulling image "registry.access.redhat.com/ubi8-minimal"
  Warning  Failed     68s (x21 over 6m20s)   kubelet, example   Error: ImagePullBackOff
```

### 再現手順(Ubuntuの場合)

containerdはこちらの手順に従いセットアップ
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd

```console
$ sudo crictl pull registry.access.redhat.com/ubi8-minimal

FATA[0000] pulling image failed: rpc error: code = Unknown desc = failed to resolve image "registry.access.redhat.com/ubi8-minimal:latest": no available registry endpoint: could not resolve digest for registry.access.redhat.com/ubi8-minimal:latest 
```

## 調べた結果

どうもこのcontainerdのIssueっぽい。

[containerd/containerd: Resolver requires optional Docker-Content-Digest #3238](https://github.com/containerd/containerd/issues/3238)

## 修正状況

こちらのPRで対応済み。
https://github.com/containerd/containerd/pull/3245

また、containerd v1.2系へのバックポートもされている。
https://github.com/containerd/containerd/pull/3591

## 解決方法

containerd v1.2.9/v1.3.0以降のバージョンを使えばOK

## k3OS/k3sの場合

最新版のk3s(v0.9.1)のcontainerdはv1.2.8ベースなのでNG。
すでにmasterブランチではv1.3系に切り替わっているっぽいので次のバージョンを待つ or 自前でmasterブランチをビルドするのが良さそう。
macOS上でphp-buildからmasterをビルドする(PHP 7.4+編）

php-srcのmasterブランチをビルドするのって毎度苦労するので、今回ビルドした手順を記録しておきます。

最近configureが何か変わったのか、ライブラリを探すのに`PKG_CONFIG`を指定してやらないと色々見つけてくれなくなりました。

```bash
$ brew install bison re2c libxml2 libjpeg libpng icu4c libzip autoconf \
 automake krb5 oniguruma libedit
$ PKG_CONFIG_PATH="/usr/local/opt/krb5/lib/pkgconfig:/usr/local/opt/openssl/lib/pkgconfig:/usr/local/opt/icu4c/lib/pkgconfig:/usr/local/opt/libedit/lib/pkgconfig" \
 YACC=$(brew --prefix bison)/bin/bison PHP_BUILD_EXTRA_MAKE_ARGUMENTS="-j4" \
 phpenv install master
```

これで無事ビルドできました。

```
$ php -v
PHP 8.0.0-dev (cli) (built: Oct  3 2019 13:55:49) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0-dev, Copyright (c), by Zend Technologies
```

7.4snapshotも同様にビルドできます。
既存のLaravel artisanコマンドを組み合わせて独自のコマンドを作る方法

Laravel artisanコマンドは例えば migrate コマンドあたりが有名だと思います。

```
$ artisan migrate
```

実はこのコマンドと同様に使えるコマンドを独自で実装することができます。
その実装方法と、特に既存のコマンドを組み合わせた独自コマンドを作る方法について説明します。

## コマンドの作り方

以下のように artisan make コマンドを用いて作成できます。

```shell
$ artisan make:command NewCommand
```

これでひな形ができるので、必要な箇所を書き換えれば終わりです。

## 既存コマンドの呼び出し方

私が作ったコマンドの例ですと、migrate した後に即座に cache clear をするものです。
このコマンドの目的はmigrate してDBの状態が変わった後に、それがキャッシュしたままだとエラーが起こるような設計にしている場合、即座にcache削除をしたいのですが、
`artisan migrate` コマンドを打った直後に `artisan cache:clear` を打つという人力オペレーションだと辛いので同時に実行してくれるラッパーコマンドが欲しかったです。

```php
<?php

namespace App\Console\Commands;


use Illuminate\Console\Command;

class MigrateAndClearCache extends Command
{
    // ここがサブコマンドの名前になり、$ artisan migrate-and-cache-clear とすれば実行できます。 
    protected $signature = 'migrate-and-cache-clear';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'migrate and cache:clear db_cache_memcached';

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        $this->call('migrate');
        // cache clear をするキャッシュを引数で指定しています。これは $ artisan cache:clear db_cache_memcached とやったのと同じです
        $this->call('cache:clear', ['db_cache_memcached']);
    }
}

```

ちなみにキャッシュサーバに名前をつけたり分離する方法についてはこちらの記事で紹介しています。https://qiita.com/yamotuki/items/b90af273e2e8e09aa3d2

## コマンドリストでもみれます

```
root@5e3732562350:/var/www# artisan list  | grep migrate
  migrate                               Run the database migrations
  migrate-and-cache-clear               migrate and cache:clear db_cache_memcached
   以下略
```

## 補足
他のコマンドの呼び出し方法については MigrationCommand 内の handle() の実装を参考にしました。

```vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php
        if ($this->option('seed') && ! $this->option('pretend')) {
            $this->call('db:seed', ['--force' => true]);
        }
```
Linux基礎(シェル環境のカスタマイズと仕様)

#bashのエイリアス機能
bashシェルでは、エイリアスを利用することでコマンドの別名を定義したり、コマンドとそのオプションをまとめて一つの新しいコマンドとして実行できる。エイリアス機能を使用するためにaliasコマンドを使用。

alias 別名="コマンド"

```shell
# llと入力するだけで「ls -l」を実行できるようエイリアスを作成
$ alias ll="ls -l"

# llを実行
$ ll
total 1000
-rw-r--r--    1 root  staff    1021  9  5 23:14 README.md
-rw-r--r--    1 root  staff    3577  9  5 23:14 angular.json
-rw-r--r--    1 root  staff     429  9  5 23:14 browserslist
drwxr-xr-x    5 root  staff     160  9  5 23:14 e2e
-rw-r--r--    1 root  staff    1016  9  5 23:14 karma.conf.js
drwxr-xr-x  790 root  staff   25280  9 20 22:46 node_modules
-rw-r--r--    1 root  staff  473349  9 20 22:46 package-lock.json
-rw-r--r--    1 root  staff    1321  9 20 22:46 package.json
drwxr-xr-x   11 root  staff     352  9  5 23:14 src
-rw-r--r--    1 root  staff     270  9  5 23:14 tsconfig.app.json
-rw-r--r--    1 root  staff     543  9  5 23:14 tsconfig.json
-rw-r--r--    1 root  staff     270  9  5 23:14 tsconfig.spec.json
-rw-r--r--    1 root  staff    1988  9  5 23:14 tslint.json
```

エイリアスの設定を削除するためには、unaliasコマンドを使用する。
unalias 別名

```shell
$ unalias ll
```

#bashのシェル関数
bashシェル上で利用できる独自の関数を定義するには、functionコマンドを使用する
function シェル関数名(){コマンド;}

```shell
# llという名前のシェル関数を定義して、ls -ltr | more　コマンドが実行されるように設定
$ function ll(){ ls -ltr | more; }
```

シェル関数の設定を削除するためには、unsetコマンドを使用する。
unset シェル関数
```shell
$ unset ll
```

※単純なコマンドの組み合わせの場合、aliasを利用するが、より複雑な処理をする場合はfunctionコマンドを利用する。

#bashのシェルオプション
setコマンドでオプションを指定することでシェルの様々なオプション機能をオン、オフにできる。setコマンド構文において、-oとすればオプションが有効になり、+oとすればオプションが無効になる。

set [-o][+o] オプション

|オプション|説明|
|---|---|
|allexport|作成または変更した変数を自動的にエクスポート|
|emacs|emacsのようなキーバインドにする|
|vi|viのようなキーバインドにする|
|ignoreeof|Ctrl+Dのキー入力でログアウトしないようにする|
|noclobber|既存ファイルへの上書き出力(リダイレクト)を禁止する|
|noglob|メタキャラクタを使用したファイル名の展開を無効化する|

```shell
# 既存ファイルへの上書き出力（ リダイレクト ）を禁止する設定
$ set -o noclobber

$ echo 11111 > test.txt
#bash: test.txt: cannot overwrite existing file　← 上書き不可のメッセージが出力

#メタキャラクタを使用したファイル名の展開を無効化する設定
$ set -o noglob

$ ls *.txt
#ls: *.txt: No such file or directory　← メタキャラクタの * が無効であり、*.txt ファイルは存在しないと出力されている
```

#bashの設定ファイル
シェル起動時と終了時に「環境変数、エイリアス、シェル関数」などの定義を自動的に行うための設定ファイルが存在する。bashの設定ファイルには、以下のようなファイルがある。

|ファイル|説明|
|---|---|
|/etc/profile|ログイン時に実行される。(全ユーザが参照する設定ファイル)|
|~/.bash_profile|ログイン時に実行される|
|~/.bash_login|~/.bash_profileがない場合に、ログイン時に実行される|
|~/.profile|~/.bash_profile, ~/.bash_loginが存在しない場合にログイン時に実行される|
|~/.bashrc|bash起動時に実行される|
|~/.bash_logout|ログアウト時に実行される|

/etcディレクトリ以下の設定ファイルは全ユーザに適用され、ホームディレクトリ以下の設定ファイルは、ユーザごとに適用される。以上から、全てのユーザで共通に使用する環境変数を設定するためには/etc/profileに設定する。ユーザ別に環境変数を設定する場合は~/.bash_profileファイルに設定する。

システムにログインする場合の設定ファイルの実行順夫は以下。

![スクリーンショット 2019-10-03 16.49.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374557/4b027d84-79f9-2682-a570-9efe7d842c53.png)

設定ファイルのサンプル例
![スクリーンショット 2019-10-03 16.51.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374557/37aff99e-e21d-a280-3975-032a02ded960.png)
Pythonのスライスについて

#目的
なんやかんや使うスライスをこの際まとめなおそう

#スライスとは
リストの一部を切り出す機能のこと
基本は以下のように書く

```Python
array[start : stop]
```

対象となるリストの始点、終点を指定することでその範囲のリストを取り出すことができる
取り出しても元のリストは保持される
取り出される範囲は「始点に指定したインデックス」から__「終点に指定したインデックスの1つ前」__なので注意

以下実行例

```python
array = [1,3,5,7,9]
re_array = array[2:4]
print(re_array)
#[5, 7]
print(array)
#[1, 3, 5, 7, 9]
```

#範囲外の指定
終点に範囲外の指定をしても__エラーが発生しない__
取れるとこまでで止めてくれるらしい

```python
array = [1,3,5,7,9]
re_array2 = array[3:7]
print(re_array2)
#[7, 9]
```

#始点・終点の省略
始点、終点の値を省略することが可能
始点を省略すれば最初から、終点を省略すれば最後まで取得される

```python
array = [1,3,5,7,9]
re_array3 = array[:3]
print(re_array3)
#[1, 3, 5]
re_array4 = array[3:]
print(re_array4)
#[7, 9]
```

始点も終点も省略すると全部取り出せる

```python
re_array5 = array[:]
print(re_array5)
#[1, 3, 5, 7, 9]
```

こんなことする必要はない…と思ったら意外と使い道がありそう

```python
array = [1,3,5,7,9]
#スライスで複製
re_array5 = array[:]
#代入で複製
cp_array = array
#値を変更
cp_array[0] = 23


print(cp_array)
#[23, 3, 5, 7, 9]

#元の値も変更される
print(array)
#[23, 3, 5, 7, 9]

#こっちはされない
print(re_array5)
#[1, 3, 5, 7, 9]
```

Pythonが参照渡しになってる関係上代入で複製すると元の値にも影響する
スライスで作ったリストは新しくリストを作り直しているようでこの影響がないらしい

#ステップ
何個おきに取り出すということが指定可能

```Python
array[start : stop : step]
```

始点、終点の後に追加するだけ

```python
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
odd = array[::2]
even = array[1::2]
print(odd)
#[1, 3, 5, 7, 9]
print(even)
#[2, 4, 6, 8]
```

奇数番だけ、偶数番だけ取り出すなんてことが可能
もちろん上記の始点終点の指定、省略も可能

#負数の指定
ステップに負の値を指定することができる
参照順は__後ろから__

```python
rev = array[::-1]
print(rev)
#[9, 8, 7, 6, 5, 4, 3, 2, 1]
rev2 = array[::-2]
print(rev2)
#[9, 7, 5, 3, 1]
```

#タプルでのスライス
タプルでも同じことが可能

```python
t_array = (1, 2, 3, 4, 5, 6, 7, 8, 9)
t_odd = t_array[::2]
print(t_odd)
#(1, 3, 5, 7, 9)
```

ちゃんとタプルで帰ってくる

#まとめ
・始点:終点:ステップの順で指定
・それぞれ省略可能
・範囲外を指定してもエラーにならない
・負数の指定で逆向き参照
・タプルでも使える

#参考文献
【Python】スライス操作についてまとめ
https://qiita.com/tanuk1647/items/276d2be36f5abb8ea52e
create-react-appで作ったReact SPAをあとからTypeScript対応したい時の手動ワークアラウンド

社内の事情や個人のスキルの問題などではじめはTypeScriptを使わずにReact SPAを作ることになった。
ただ、後からTypeScriptいれようとなった時の覚書。

## 基本ライン

https://vincenttunru.com/migrate-create-react-app-typescript-to-create-react-app/
この記事の手順通りにやればいけます。

## この記事で書くこと
`npm start` or `yarn start`しても`tsconfig.json`などが作成されなかった場合の力技。
十中八九コードに問題があるとかなんでしょうが、それでも押し通らないといけないときの力技。

## 準備
部品取りのためにプロジェクトを新規で作ります。

```bash
$ npx create-react-app ts-cra --typescript
$ cd ts-cra
$ npm i -S typescript @types/node @types/react @types/react-dom @types/jest
$ npm start
```

## 部品取り
`npm start`でTypeScript用のファイルが生成されます。

```
$ git status
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	src/react-app-env.d.ts
	tsconfig.json
```

この２ファイルをmvなどで自分のCRAプロジェクトに移しましょう。

## ライブラリインストール
追加する側のPJにもTypeScript系ライブラリが必要です。

```bash
$ yarn add -D typescript @types/node @types/react @types/react-dom @types/jest
```

ドキュメントなどではdependenciesに入れさせてるんですが、@typesとかってdevの方でいいんじゃないかと個人的には思うのです。
ここってなにか理由あるんですかね・・・

## 実行する
`npm start`で作られるファイルを手動で放り込んでいるので、これで`tsx`ファイルを入れるとちゃんと判定してくれます。

## なお
Flowtypeで中途半端に型をつけていると、そっちの移行作業が発生してイヤッホーorz

```
TypeScript error in /Users/develop/dashboard/src/AccountInfo.jsx(9,46):
'types' can only be used in a .ts file.  TS8010

     7 | import DashboardCard from './DashbaordCard';
     8 | 
  >  9 | const AccountInfo = ({ username, children }: { username: string, children: React.Node }) => (
       |                                              ^
    10 |   <DashboardCard title="Account Information">
    11 |     <Form>
    12 |       <FormGroup>

```
Cyberduck)vs code を外部エディタに設定

###準備
ファイルメニュー＞フォルダーと検索オプションの変更＞表示＞登録されている拡張子は表示しないのチェックボックスを外す ＆ 隠しファイル、隠しフォルダー、および隠しドライブを表示する を選択


###作業開始
1. Cyberduck起動＞編集ー環境設定をクリック

2. 左から4つ目の"外部エディタ"を選択

3.　画像のとうり選択...をクリック
<img width="494" alt="2019-10-03 (3).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380732/bb1efc90-9a13-19a6-ddc5-ce31679f250c.png">
4．C:\Users\ユーザー名\AppData\Local\Microsoft VS Code\bin\code.cmdを選択
(選択しても欄は空白のまま)
”常に省略時エディタを使用”にチェックして

完了！:-)

補足）
C:\Users\ユーザー名\AppData\Local\Microsoft VS Code\bin\code.cmd
は VSCodeインストール時のデフォルトのファイル場所なので、自分でファイル場所を設定した方はそちらから設定を行ってください。

また、Microsoft VS Code が C:\Users\ユーザー名\AppData\Local\ にないときは
C:\Users\ユーザー\AppData\Local\Programs\ を探してみてください。
gitlabのwikiに画像を貼る方法について

# wikiを作成する場合のtips

gitlabのwikiには以前はできなかったはずだが、右下の[Attach a file]を選択することによって画像を添付することが出来、本文にもlinkが記載される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115285/fdbe2ff7-8fc3-c8ea-5570-90061ae4538f.png)

# 嵌るポイント
Formatを[markdown]にしてある場合は良いのだが、画像のように[Asciidoc]にしてあると、このリンクでは画像が表示されない。Previewでは表示されるので、よくわからなかった。

# 解決策
以下のようにリンクをAsciidoc記法に変更する。

`![sample1](uploads/3a703d5706e19d168ce7bb7d8c67d3ec/sample1.PNG)`
↓
`image::./uploads/3a703d5706e19d168ce7bb7d8c67d3ec/sample1.PNG[]`

## 独り言
FormatをAsciidocにしててもPreviewはあくまでmarkdownなんだよねえ。まあそこまで作るのも大変なんだろうけど、むしろPreviewあるのが誤解しがちな気が。
Pythonで交通費検索

[PythonでExcelからデータ読込→サイトで交通費検索→Excelへデータ書込]
By 税理士　井ノ上 陽一 2018年9月4日
の記事を利用して登録メンバーの交通費データを作成しました。

最初はなかなか動かなかったのですが、無事動くようになりました。

エクセルの表に入れたデータですが、最終行がなぜか大きな行数になっていて、プログラムがフリーズしてしまいました。

そこで、データのない行は途中でも飛ばすようにしました。

問題点として、運賃だけを調べたいときに近場でも新幹線や有料特急料金込みの結果が返ってくることです。

初心者なもので、yahoo　の"elements"が読めないため?　乗車券代だけを取得することができればもっと良いのにと思っております。
Raspberry Pi2 modelBをeduroamに接続する

#はじめに

[前回][1]

この間、ラズパイのwifi設定は特にしてしなくても大丈夫だったと書いたが、研究室にラズパイを設置するにあたり、大学のwifiを使う必要があった。
が、メインPCもwifiで接続しており、多重ログインするとセッションが切れてしまう問題が発生。
そこで、[eduroam][2]にラズパイを接続してみたの巻。

#References
- [Raspbian ( Raspberry Pi 3 ) をゼロからセットアップする][3]
- [パスワードのハッシュについて基礎をまとめた。宅ふぁいる便漏洩事件に寄せて][4]
- [openssl コマンドの使い方][5]
- [ラズパイを大学の無線LANに接続する][6]
- [【 iconv 】コマンド――文字コードを変換する][7]
- [Linuxでwpa_supplicantを使ってWPA2の無線LANに接続する方法][8]
- [コマンド履歴を表示するhistoryコマンドを詳しく！【Linuxコマンド集】][9]

#設定
eduroamを使ったことがある人は分かると思うが、ユーザー名とパスワードを入れて認証する必要があり、それらの情報をラズパイに入れておく必要がある。
が、平文のままで入れておくのは怖い。

そこでまず、パスワードのハッシュ化を行う。

```terminal:LXTerminal
$ echo -n パスワード | iconv -t utf16le | openssl md4
```

で、吐き出された文字列をコピペして、　/etc/wpa_supplicant/wpa_supplicant.confを開く。

```terminal:LXTerminal
$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
```

一番下に設定を追加。

```conf:/etc/wpa_supplicant/wpa_supplicant.conf
network={
      ssid="eduroam"
      scan_ssid=1
      key_mgmt=WPA-EAP
      eap=PEAP
      identity="ユーザ名"
      password=hash:ハッシュ化されたパスワード
      phase2="MSCHAPV2"
}
```

この中身の意味については、[ラズパイを大学の無線LANに接続する][6]が分かりやすかった。

さらに、もう一つファイルをいじる。

```terminal:LXTerminal
$ sudo nano /etc/network/interfaces
```

wlan0と書かれた箇所を探す。

```conf:/etc/network/interfaces
allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

私の環境では最初こうなっていた。
このmanualをdhcpに変更する。

```conf:/etc/network/interfaces
allow-hotplug wlan0
iface wlan0 inet dhcp
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

で、

```terminal:LXTerminal
$ wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -B
$ history -c
$ sudo reboot
```

無事繋がりました。


[1]:https://qiita.com/ryupy/items/c3611d690f0e4fe174c1
[2]:https://www.eduroam.jp/for_users/
[3]:http://klee-arc.hatenablog.com/entry/2016/11/30/012333
[4]:https://glorificatio.org/archives/3417
[5]:http://sig9.hatenablog.com/entry/2019/06/10/000000
[6]:https://qiita.com/nishiwakki/items/5889892de9d6a983b960
[7]:https://www.atmarkit.co.jp/ait/articles/1609/12/news019.html
[8]:https://www.xmisao.com/2014/01/16/how-to-connect-wpa2-wireless-lan-using-wpa-supplicant.html
[9]:https://eng-entrance.com/linux-command-history
UnityのQuaternionでよく使う処理まとめ

# Quaternionについて

Quaternionたまに使うといつもよくわからなくなるので、
備忘録的にまとめてみました。
よく使う書き方だけメモ。

# 資料はこちら
- [https://github.com/taroyan/RotationSample](https://github.com/taroyan/RotationSample)


## よく使う回転系の処理

- transform.Rotateである軸を中心に指定角度分回転できる
	``` this.transform.Rotate(new Vector3(0,1,0),10);    // Y軸を回転軸にして１０度ずつ回転 ```
	
- transform.Rotateでワールド座標基準で、現在の回転量へ加算する
  ``` this.transform.Rotate(1.0f,1.0f,1.0f,Space.World); ```
  
- ゲームオブジェクトが向いている方向のベクトルを取得する
  	```this.transform.forward```
    これは以下と同じ意味になる
 	``` this.transform.rotation * Vector3.up```
   
    また、ワールド座標の指定した方向の単位ベクトルを取得したいときは以下のように書く
   
   ```
   var angles = new Vector3(0f, 45f, 0f); // Y軸を回転軸として45度回転した方向
   var direction = Quaternion.Euler(angles) * Vector3.forward;	
   ```
   
   


- Rotation同士をかけると２つの回転を加算したQuaternionを取得できる
  	
今対象としているゲームオブジェクト(this)の向きに、上記で定義したdirectionの方向の角度を加算したい場合は以下のようにQuaternionをかけてあげるだけで方向を変えることができる。
   
``` this.transform.rotation = Quaternion.LookRotation(direction) * this.transform.rotation; // directionは上記で作成した単位方向ベクトル ```

また、上記の方向を回転させる処理を一文で書くと以下のようになる。
  
```
  this.transform.rotation = Quaternion.Euler(new Vector3(0f, 45f, 0f)) * this.transform.rotation;
```


  	
- 時間をかけてゆっくりとゲームオブジェクトを指定の方向へ向かせる

   Slerpまたはlerpを使うことでゆっくり回転できる。

```
transform.rotation = Quaternion.Slerp(startPosition.rotation, targetDir, step);　// 現在のゲームオブジェクトの角度から目標の角度までゆっくりと回転させる
```
	
startPosition.rotation  :   初期の回転角度（だいたい対象のゲームオブジェクトの現在の角度）
targetDir  :  目標の回転角度	
step   :   補完率(0～1) つまり0なら初期の角度　0.5なら初期と目標の角度の中間の角度まで回転



## サンプルプロジェクト内のデバッグキー操作

- Aキー　Y軸を回転軸にして１０度ずつ回転(Rotate関数)
- Bキー　ワールド座標基準で、現在の角度にRotation[1,1,1]を加算する(Rotate関数)
- Cキー　Y軸を回転軸にして90度回転した方向へゲームオブジェクトを回転
- Dキー　現在のゲームオブジェクトの角度にY軸を回転軸にして45度回転を追加する
- Eキー　ゲームオブジェクトをY軸を回転軸にして45度回転させる(Lerp関数)
- Xキー　ゆっくりゲームオブジェクトを指定の角度まで回転(Slerp関数)



## 参考資料

- forwardとはどういう計算をしているか
  - [https://qiita.com/FuwattoFlower/items/ae5be071ae3405ff70f8](https://qiita.com/FuwattoFlower/items/ae5be071ae3405ff70f8)
- Quaternion[同士をかけると回転させられるという説明]()
  - [http://tsubakit1.hateblo.jp/entry/2014/08/02/030919](http://tsubakit1.hateblo.jp/entry/2014/08/02/030919)
- LookAt関数について
  - [https://www.sejuku.net/blog/69635](https://www.sejuku.net/blog/69635)
- Quaternionの使い方全般
  - [https://www.f-sp.com/entry/2017/08/30/171353](https://www.f-sp.com/entry/2017/08/30/171353)
- 二点間角度取得＆ゆっくり回す
  - [https://yowabi.blogspot.com/2018/06/unity.html](https://yowabi.blogspot.com/2018/06/unity.html)
- transform.Rotateについて
  - [https://www.sejuku.net/blog/51521](https://www.sejuku.net/blog/51521)
- Quaternion復習
  - [https://qiita.com/r-ngtm/items/ddf418b13d4b9d767403](https://qiita.com/r-ngtm/items/ddf418b13d4b9d767403)
JavaScript（条件分岐）

#条件分岐
「ある条件が成り立つときだけある処理を行う」という場合
##if文
**「もし○○ならば●●を行う」**という条件分岐が可能になる。

```
if(条件式){
  処理
}
```

```js
//if文の書き方
const number = 12 ;
if(number > 10){
  console.log("numberは10より大きいです");
}
//コンソール
numberは10より大きいです
```

###真偽値
**true**と**false**という２つの値が存在する。
**if文は条件式がtrueであれば処理が実行され、falseであれば実行されない。**
####true
条件式が成り立つ場合に出力される。
####false
条件式が成り立たない場合に出力される。

###演算子
>**比較演算子**
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495605/f03355ea-cab4-0622-9ec2-c86b29fe248a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495605/1348fac7-6d06-3baa-1c6f-7be858f226a4.png)


####例１
```js
const age = 24 ;

// ageの値が20以上の場合に、「私は20歳以上です」と出力してください
if(age>=20){
  console.log("私は20歳以上です");
}

//コンソール
私は20歳以上です
```
####例２
```js
const password = "太郎";

// passwordの値が"太郎"の場合、「ログインに成功しました」と出力してください
if(password === "太郎"){
  console.log("ログインに成功しました");
}

// passwordの値が"太郎"でない場合、「パスワードが間違っています」と出力してください
if(password !== "太郎"){
  console.log("パスワードが間違っています");
}


//コンソール
ログインに成功しました
```

###else
if文に「else」を組み合わせると
**「もし〇〇なら●●を行う、そうでなければ■■を行う」**という処理ができる。

if文の条件がfalseの場合、elseの処理が実行される。
####例１
```js
const age = 17;

// 条件式が成り立たない場合に「私は20歳未満です」と出力してください
if (age >= 20) {
  console.log("私は20歳以上です");
} else{
  console.log("私は20歳未満です");
}

//コンソール
私は２０歳未満です
```

###else if
ifとelseの間に「else if (条件)」を追加することで、if文に条件分岐を追加することができる。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495605/3d51a849-5909-061c-6eb0-a9761077c929.png)

```js
const age = 17;

// ageの値が10以上20未満のとき、「私は20歳未満ですが、10歳以上です」と出力してください
if (age >= 20) {
  console.log("私は20歳以上です");
} else if(age>=10){
  console.log("私は20歳未満ですが、10歳以上です"); 
}else {
  console.log("私は10歳未満です");
}

 //コンソール
私は20歳未満ですが、10歳以上です
```

###複数の条件式
####&&
「かつ」という意味。
「条件1 && 条件2」は「条件1かつ条件2」という意味で、複数の条件がすべてtrueならtrueになる。
####||
「または」という意味。
「条件1 || 条件2」は「条件1または条件2」という意味です。この場合は、複数の条件のうち1つでもtrueならtrueになる。

##switch文
**ある値によって処理を分岐する場合**にswitch文を用いることができる。

```
switch(条件式){
  処理
}
```

###case
switch文の中に「case」を追加することで処理を分けることができる。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495605/acf59e3f-8530-cbd0-61fc-16cecf4cab94.png)

switch文では分岐の数だけcaseを追加する。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495605/2e184aa3-379b-71a1-4873-253c89f180de.png)

###break
breakとはswitch文を終了する命令。
（caseの区切りとして使う。）

switch文ではbreakを忘れないようにする。
Rails6でapplication.jsが読み込まれない。

# 困ったこと
Railsチュートリアルを進めていたらこんなエラーが。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470697/a1f41df6-ad2f-74b6-8a0c-81738b53ff0e.png)

```エラー文
ActionView::Template::Error (The asset "application.js" is not present in the asset pipeline.):
```

application.html.erbのここでエラーが出てたみたい。
Railsチュートリアルの通りに進めていたのになんでだろう。

```erb:エラー部分のコード
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
```

# 解決
どうやらRails6.0でwebpackerが追加された(表現あってるのかわからないけど)ことによって、
webpackerがJavascriptをコンパイルできるようにしてあげなければいけないらしい。

```erb:改コード
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```

ということでエラーが出たコードの代わりにこれを使用すると解決した。
Rails6使うときは`javascript_include_tag`じゃなくて`javascript_pack_tag`を使わなければ、という備忘録でした。

**以上！**
ストロングパラメータの中身を確認する

1. rails c
2. terminalで　`params` とうつと

```terminal
[25] pry(#<UsersController>)> params
=> <ActionController::Parameters {"authenticity_token"=>"902JNry6DuZRLcnlICGd4c47okqQ+vX8Dhk/foMtzC+1GKpPFjZ5JyJV4fS+NNay7A43/5aZChsH/FKPnGUnQQ==", "user"=><ActionController::Parameters {"name"=>"aki", "email"=>"aki", "password"=>"aki"} permitted: false>, "controller"=>"users", "action"=>"create"} permitted: false>
```

その後`params.require(:name, :email, :password)`

```terminal
26] pry(#<UsersController>)> params.permit(:name, :email, :password)
Unpermitted parameters: :authenticity_token, :user
=> <ActionController::Parameters {} permitted: true>
```
となりました。
結局パラメータに入っていなさそうな気がしている。

[参考記事はこちら](https://www.pikawaka.com/rails/params)