OmniAICreator/Qiita-1.07M huggingface dataset:
繰り返しテキストデータ生成ツール「rpttxt」を作りました

# rpttxtとは？

こちら (https://github.com/nendo-code/rpttxt) で配布しております。

例えばこんな感じのデータを作りたいとします。

``` output.txt
{
	"id": 1,
	"name": "John",
	"age": 21
}
{
	"id": 2,
	"name": "Paul",
	"age": 35
}
{
	"id": 3,
	"name": "Tom",
	"age": 64
}
```

このデータを作る場合、あなたならどうしますか？
私なら、適当に手作業で済ませるのであればこんな感じにすると思います。

1.
まず1項目分作る。

``` step1.txt
{
	"id": 1,
	"name": "John",
	"age": 21
}
```

2.
必要な項目数分コピペする。

``` step2.txt
{
	"id": 1,
	"name": "John",
	"age": 21
}
{
	"id": 1,
	"name": "John",
	"age": 21
}
{
	"id": 1,
	"name": "John",
	"age": 21
}
```

３.
各項目の値を狙いの値に書き換える。

``` step3.txt
{
	"id": 1,
	"name": "John",
	"age": 21
}
{
	"id": 2,
	"name": "Paul",
	"age": 35
}
{
	"id": 3,
	"name": "Tom",
	"age": 64
}
```

まあこんな感じで手作業してもいいですが、件数が多いとダルいしミスも発生しやすいです。
データはデータ、テンプレートはテンプレートで分けて書けるといいなあ、と私は思いました。
なので、

テンプレートを書き

``` template.txt
{
	"id": {No},
	"name": "{Name}",
	"age": {Age}
}
```

データをcsvで書いて（またはExcel等でcsvでエクスポートして）

``` data.csv
{No},{Name},{Age}
1,John,21
2,Paul,35
3,Tom,64
```

それらを食わせると下記のような出力が得られるプログラムを作成しました。
それがrpttxtです。

``` output.txt
{
	"id": 1,
	"name": "John",
	"age": 21
}
{
	"id": 2,
	"name": "Paul",
	"age": 35
}
{
	"id": 3,
	"name": "Tom",
	"age": 64
}
```

# なんで作ったの？

世の中に似たツールはありそうな気はしましたが、求めている操作感のものがパッと見つからなかったので、車輪の再発明しました。
あと、「UNIXという考え方―その設計思想と哲学」という本を読んで素晴らしいなあと思ったので、それっぽいシンプルなインターフェースのコマンドラインツールにしました。

（例）コマンドラインでの実行

``` zsh
$ python3 rpttxt.py template.txt data.csv > output.txt
```

# なにで作ったの?

python3で書いて、Windows用のバイナリはPyInstallerで作りました。
PyInstallerは楽チンでとてもいいツールです。
あと、Windowsだとコマンドライン立ち上げるのがダルいので一発で変換かけるバッチファイルもオマケで付けました。
Railsでgroup->order->countしたい話 

```ruby
> Model.group(:column_name).order(count_column_name: "DESC").count(:column_name)

SELECT 
COUNT("model"."column_name") AS count_column_name, 
"model"."column_name" AS model_column_name
FROM "model" 
GROUP BY "model"."column_name" 
ORDER BY "count_column_name" DESC
```

できた。
(覚書)matplodlibで3D 散布図を作る

3D 散布図のイメージを作りたかったので、
google colaboratoryでmatplotlibを使い画像ファイル作りました。

すべての点にラベルつけてます。

```py
#matplotlibで日本語を使えるようにする
!pip install japanize-matplotlib

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot
from numpy.random import rand
from pylab import figure
from google.colab import files
import pandas as pd
import japanize_matplotlib

#散布図の各点のラベル名と3次元座標
#点が多い場合はcsvとか読みこんだ方がいいかも
df = pd.DataFrame({'ラード説': [20, 30, 20],
                   '鶏油説': [10, 15, 15],
                   '香味油説': [5, -10, 10],
                   'ウェイパー説': [40, 50, 25],
                   '味の素説': [15, -30, -15],
                   '中華鍋説': [0, 0, 50],
                   '鍋のあおり説': [0, 5, 30],
                   '硬めご飯説': [-20, 20, 40],
                   'タイ米説': [-15, -25, 45],
                   '卵かけご飯説': [-35, -15, 45],
                   '酒説': [10, -20, -30],
                   'マヨネーズ説':[-5, 20, -10],
                   'チャーシュー説': [40, 10, -15],
                   '水島流チャーハン説':[10, -50, -50]
                   })

#画像サイズと解像度
fig = figure(figsize=(10, 10), dpi=100)
ax = fig.add_subplot(111, projection='3d')

#各点を描画していく
for i in range(df.shape[1]):
 ax.scatter(df.iloc[0,i],df.iloc[1,i],df.iloc[2,i])
 ax.text(df.iloc[0,i],df.iloc[1,i],df.iloc[2,i],  '%s' % (df.columns[i]), size=15)

#軸ラベル
ax.set_xlabel('美味しい - 微妙')
ax.set_ylabel('素材の味 - 調味料の味')
ax.set_zlabel('しっとり - パラパラ')

#軸の長さ
ax.set_xlim(-55, 55)
ax.set_ylim(-55, 55)
ax.set_zlim(-55, 55)

#出力するpngファイル名
pyplot.savefig( '炒飯のコツ-3D-散布図.png' )
pyplot.show()
#pngファイルのDL
files.download('炒飯のコツ-3D-散布図.png')
```

![炒飯のコツ-3D-散布図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217395/ac60024f-47cc-873d-8c4d-976b5af660ad.png)

※ちなみにこの図は私が書いてる[炒飯のブログ](http://www.tyahannoyama.com/「チャーハンのコツまとめ」お店みたいな炒飯を)で使ったものです。
GRUの覚え方 (E資格対策)

LSTMは覚えられたのだけどGRUは覚えられなかったという方向け。



![lstmkaisetu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/b5018417-40b0-d812-e79f-bc13ba124b7e.png)


LSTMは割と役割がしっかり分かれているので覚えやすいですが


![grun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/b4fcf73e-d82a-77d8-f7fc-4781080e91c1.png)


GRUの場合分岐が多く、どこからどうつながっているのか分からなくなります。

なので今日は詳しめに書きます。



![gruuuu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604787/da92ac3c-fd2f-5f47-d3c5-fd7a81eb3ec4.png)

図にするとこうです。
データの流れを赤矢印で、またゲートがLSTMでいう何の部分に当たるか書きました。


#σにはhとxが入る



σでは入力の制御=どれくらい結果を出力するかを行います、なので$h_{(t-1)}$とxは必ず参照します。



#tanhにはリセットゲートを通ったものが入る

tanhには今回の入力xだけでなく、過去の入力をリセットゲートで制御した$r_t*h_t$が入ります、ごっちゃになりますので注意。


#更新ゲートは過去の出力と現在の出力の割合を決める

GRUでは過去の入力と現在の入力だけ見ます。なのでどちらの入力をどれくらい出力するか分岐があります。分岐させたものを最後に足し合わせて出力します。



以上になります、GRUは過去の記憶を保持するために作られたもの。皆さんの記憶保持に役立てば幸いです。
Python)スクレイピング内容をローカルPCに保存

プログラミング初心者がスクレイピングを学んでいます。とりあえずスクレイピングした内容をローカルファイルにダウンロードできるようになったので忘れないうちに備忘録としてメモ。


```python
#ウェブサイトから記事とURLをスクレイピングして結果をローカルＰＣにダウンロードするためのサンプル

#必要なモジュールのインポート
from bs4 import BeautifulSoup
import requests
import pandas as pd

# データフレームを作成
columns = ["記事タイトル", "URL"]
df = pd.DataFrame(columns = columns)

# requestsでウェブサイトから内容を取得してBeautifulSoupで内容を取捨選択など加工
res = requests.get("https:～～スクレイピングしたいウェブサイトのURL～～")
soup = BeautifulSoup(res.content, 'html.parser') # BeautifulSoupの初期化
tags = soup.find_all("XXXXX", {"class": "YYYYYY"}) # XとYはウェブサイトに応じて変わる

# 記事名とURLをデータフレームに追加
for tag in tags:
 article = tag.a.string
 url = tag.a.get("href")
 se = pd.Series([article, url], columns)
 df = df.append(se, columns)

#「to_csv」を使ってコードが保存されているのと同じフォルダにcsvファイルを保存
df.to_csv("./news.csv")
print("終了")
```
docker-compose buildで、The following signatures were invalid: KEYEXPIRED ~ と出た時の対処

[メモ]

```
RUN apt-get update && apt-get install -y ~~~~
```
の前に以下を記載して再build

```
RUN sed -i 's;http://archive.debian.org/debian/;http://deb.debian.org/debian/;' /etc/apt/sources.list
```

参考：https://github.com/confluentinc/cp-docker-images/issues/849
Reactについて

#前提
Reactについて学んだことを書いていきます。

#本題

#Reactとは
React.js とは、UI のパーツを作るためのViewの機能を提供するライブラリ。
Facebook が OSS として公開している。

#特徴
Reactには、JSXという記法がある。

JavaScriptの構文でDOM要素を操作しようとすると読むのが大変だが、JSXによってHTMLとJavaScriptが合体することでDOM要素の設計図を人間が読みやすくなる。


##差分だけ表示するため早い
Reactは、何らかの理由でページが書き換わったことを自動的に検知して、差分だけを再表示してくれるため、表示がとても早い。

##単方向データフロー
Reactは、基本的に親コンポーネントから子コンポーネントにデータが一方通行で渡っていく。
この一方通行という思想があるおかげで、DOM要素間でデータの不整合が出ないよう管理しやすくなる。

#Reactインストール
まずは、nodeとnpxがインストールされているか確認。

```terminal.
$ node -v
$ npx -v
```

##Reactアプリ作成

```terminal.
$ npx create-react-app アプリ名
...
...
success Uninstalled packages.
✨  Done in 4.61s.

Initialized a git repository.

Success! Created アプリ名 at /Users/username/Desktop/works/アプリ名
Inside that directory, you can run several commands:

  yarn start
    Starts the development server.

  yarn build
    Bundles the app into static files for production.

  yarn test
    Starts the test runner.

  yarn eject
    Removes this tool and copies build dependencies, configuration files
    and scripts into the app directory. If you do this, you can’t go back!

We suggest that you begin by typing:

  cd アプリ名
  yarn start

Happy hacking!
```
これでインストール完了！
作成したアプリケーションに移動し、サーバーを立ち上げる！

```terminal.
$ cd アプリ名
$ npm start
```
localhost:3000にアクセスしReactの画面が立ち上がれば完了！
React Nativeでの、ディープリンク処理実装の一例

# ディープリンク処理を実装していく

要件は、下記。

1. カスタムURLスキーマとUniversal Links(AppLinks)両方に対応する
2. ディープリンクは、チュートリアルを抜けた先の画面で処理したい

※ディープリンクは外部に公開しないとします。

# 要件ごとに考える

## 1. カスタムURLスキーマとUniversal Links(AppLinks)両方に対応する

2020年、iOS13/Android10の時代であっても、カスタムURLスキーマを使いたい、という需要は多少あるのではないかと思います（シンプルにアプリのみで完結できるし）。

### カスタムURLスキーマをベースに考える

ディープリンク処理の入り口はあくまでカスタムURLスキーマを受け取るものとし、Universal Links(AppLinks)では、そのカスタムURLスキーマの情報を受け渡す、というやり方です。

Firebaseでの例を示します。

- FirebaseのDynamic Linkで使用するURL:

```
https://デモ.page.link/?link={Universal Links(AppLinks)のURL}&...
```

- Universal Links(AppLinks)のURL:

```
https://デモ.page.link/?demo_dp={カスタムURLスキーマ}
```

- カスタムURLスキーマ:

```
デモスキーマ://ホスト名/...
```

※各情報は良い感じにエンコードして使います。

このようにカスタムURLスキーマの情報をやりとりするようにすると、非常にシンプルな実装にできると思います（カスタムURLスキーマとUniversal Links(AppLinks)の２つの入口でそれぞれパース処理を書くことに比べたら）。

※ディープリンクを外部に公開するのであれば、この方法は基本できないと思います。ディープリンク利用者にいちいちカスタムURLスキーマを作ってね、というのはありえないでしょうから…

## 2. ディープリンクは、チュートリアルを抜けた先の画面で処理したい

- React + Reduxの構成とします

### ディープリンクのデータは、アプリのルートコンポーネントで処理を行い、その結果をReduxのストアに入れる

実は最初実装したとき、ディープリンクを処理するコンポーネントをディープリンクの種類ごとに作り、ディープリンクを処理したいコンポーネントは適宜それをrenderする、という方式で実装していました。

![RNディープリンクアーキテクチャ(旧).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213719/c97a7b6b-9601-79b7-7463-0b7a48735949.png)

実装したコードの例：

```jsx
// ディープ処理コンポーネント
class NavigationDeepLinkHandler extends Component {
  handleDeepLink(...) {
    ...
  }

  componentDidMount() {
    // 起動時ディープリンク処理
    const deepLink = getInitialDeepLink();
    this.handleDeepLink(deepLink);

    // 起動後のディープリンクリスナーを追加
    Linking.addEventListener(handleDeepLink);
  }

  render() { return null; }
}

// ディープリンクを使いたいコンポーネント
class Screen extends Component {
  render() {
    return (
      <...>
        <NavigationDeepLinkHandler />
      </...>
    );
  }
}
```

この方法は最初スタートした時点では実装が非常に楽、かつ良い感じだなと思ってたんですが、実際アプリが複雑になってくると完全に失敗でした。

というのも、

- ディープリンクの種類ごとにコンポーネントを作ると、同じようなコードを至るところに書かないといけない
- あるディープリンクを処理しているときに別のディープリンクが来たら、うっかり処理してしまう
- ディープリンクのロジックのテストで、コンポーネントのことを考えないといけない

という問題がありました。

というわけで、この章のタイトルにした構成にリファクタリングしました。

- **ディープリンクのデータは、アプリのルートコンポーネントで処理を行い、その結果をReduxのストアに入れる**

図示するほど複雑ではないのですが、念の為置いときます。

![RNディープリンクアーキテクチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213719/7a6b2b3f-94dc-2986-5ded-9ec9f4ac66f4.png)

この図からわかるように、アプリのルートコンポーネントですべてのディープリングを受け取り、パースします。そしてそのパースした結果をReduxのストアに保存しておき、各画面で利用する、という実装です。

こうすることで、先程の問題を色々と解決できました。

- 処理するディープリンクの種類が増えても、パースする部分と処理するロジックを足すだけで良い
- あるディープリンクを処理中に別のディープリンクがやってきても、ディープリンク処理用コンポーネントで排他制御することでうっかり処理しない
- ディープリンクのロジックのテストで、コンポーネントのことを考える必要は一切ない

# まとめ

RNでのディープリンクの実装の一例を書きました。案件ごとにどういう実装がマッチするか変わると思いますが、その参考になれば幸いです。

# 補遺

## ディープリンク情報の構造

下記のような構造にしました（UrlObjectはその名の通り、Urlをパースした情報です）。
modeはdataから基本的に導き出せるものなのですが、起動の方法などでmodeを切り替えたい場合などもあるので、dataとは別に保持しています。

```ts
type DeepLinkMode = 'Navigation' | ...;
type DeepLinkData = {
  data: UrlObject;
  mode: DeepLinkMode; // このmodeで、どのディープリンク処理ロジックが起動するか決まる
};
```
TinyDB(Python)でValueError: Document is not a Mappingが発生した時の対処

#エラー

```
ValueError: Document is not a Mapping
```

#エラーが出たコード

```
(dbの変数名).insert(json.dumps(data))
```

#原因
insertは辞書型のデータを求めているのでjson.dumpsでstrにするとエラーが発生する。

#解決策

```
(dbの変数名).insert(data)
```
【Docker/ECR/ECS】  コンテナ入門まとめ① 

#後編
- [Docker / ECR / ECS コンテナ入門まとめ②](https://qiita.com/umaibou1126/items/8d654b219bd8e0f05524)
- [Docker / ECR / ECS コンテナ入門まとめ③](https://qiita.com/umaibou1126/items/aee02db86c9ae9ea7359)

#参考文献

- [AWS ECSでDockerコンテナ管理入門（基本的な使い方、Blue/Green Deployment、AutoScalingなどいろいろ試してみた）](https://qiita.com/uzresk/items/6acc90e80b0a79b961ce)
- [Dockerコマンド一覧](https://qiita.com/nimusukeroku/items/72bc48a8569a954c7aa2)
- [【備忘録】docker pushしたら拒否された](https://qiita.com/shundayo/items/4ae35930fe9f85f535b0)
- [ECS+ECR環境でDockerコンテナをデプロイする](https://qiita.com/furu8ma/items/6dcf596ee67780e8807f)
- [Dockerイメージの作り方](https://qiita.com/Kitanotori/items/c1cfe19fcd29f7b0746c)
- [【Docker】イメージ名とタグ名を変更する方法](【Docker】イメージ名とタグ名を変更する方法)
- [「Got permission denied while trying to connect to the Docker daemon socket」への対応](https://qiita.com/ashidaka/items/734856443f922ff175b1)
- [Amazon ECS における Docker の基本](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html)
- [No space left on device とエラーが出るときの対処法](https://qiita.com/0x50/items/ecc6cfdbb8a3f0c0855f)
- [未使用のコンテナ、volumeなどを一括削除](https://qiita.com/reflet/items/5caa88abcf1e8964783a)

#Docker 基本コマンド

###イメージの取得
```
$ docker images [リポジトリ名]  ※リポジトリ名：DockerHubアカウントで作成

<例>
$ docker images username/sample
```

###タグ設定
```
$ docker tag [イメージ名]:タグ名 ユーザ名/[イメージ名]:タグ名

<例>
$ docker tag testimage:1.0 username/testimage:1.0
```

###DockerHubアップロード
```
$ docker login   ※DockerHubログイン

$ docker push ユーザ名/[イメージ名]:タグ名

<例>
$ docker push username/testimage:1.0
```

###コンテナ作成/起動
```
$ docker run [オプション] イメージ名[:タグ名] [引数]

<例>
$ docker run -it --name "sample" testimage /bin/bash
```

###稼働中のコンテナに接続
```
$ docker attach コンテナ名

<例>
$ docker attach sample   ※プロセス終了:ctrl + P,Q
```

#AWS上でDockerを使用する場合

###Dockerインストール
```
$ sudo yum update -y

$ sudo amazon-linux-extras install docker
```

###Docker起動
```
$ sudo service docker start
         or
$ sudo systemctl start docker
```

###dockerグループにユーザ追加
```
$ sudo usermod -a -G docker ec2-user
```

###dockerアクセス確認
```
$ docker info
```

#"No space left on device" エラー対処

###ファイル数の消費量を表示
```
$ sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
```

###未使用のコンテナ/イメージ/ボリュームの一括削除
```
$　docker system prune -af --volumes
```
四元数

主に3DCG関係で自分がよく使用する数式の自分用メモです。

#表記と定義
```math
q = ( q_0, q_1, q_2, q_3 )\\
q \cdot p = \sum q_i p_i\\
\begin{vmatrix} q \end{vmatrix} = \sqrt{q \cdot q} = \sqrt{ q_0^2 + q_1^2 + q_2^2 + q_3^2 }\\
\begin{align}
q \times p =
( &q_0p_0 - q_1p_1 - q_2p_2 - q_3p_3,\\
  &q_0p_1 + q_1p_0 + q_2p_3 - q_3p_2,\\
  &q_0p_2 - q_1p_3 + q_2p_0 + q_3p_1,\\
  &q_0p_3 + q_1p_2 - q_2p_1 + q_3p_0 )
\end{align}
```

#逆数
```math
i = (0,1,0,0)\\
j = (0,0,1,0)\\
k = (0,0,0,1)\\
q^{-1} = - \frac{0.5}{ \begin{vmatrix} q \end{vmatrix} } (q + i \times  q \times i + j \times q \times j + k \times q \times k)
```

#線形補完
q, p の補完, t=[0,1]

```math
\begin{align}
s &= \left\{
\begin{array}{ll}
1-t & (q \cdot p \geq 0) \\
t-1 & (q \cdot p \lt 0)
\end{array}
\right.\\
r &= s \cdot q + t \cdot p\\
Lerp(q,p,t) &= \frac{r}{\begin{vmatrix} r \end{vmatrix}}
\end{align}
```

#球面線形補間
q, p の補完, t=[0,1]

```math
\begin{align}
a &= \cos^{-1} \begin{vmatrix} q \cdot p \end{vmatrix} \\
s &= \left\{
\begin{array}{ll}
1 & (q \cdot p \geq 0) \\
-1 & (q \cdot p \lt 0)
\end{array}
\right.\\
r &= \frac{1}{\sin(a)} \big( s \cdot \sin(a (1 - t)) \cdot q + \sin(at) \cdot p \big)\\
Slerp(q,p,t) &= \frac{r}{\begin{vmatrix} r \end{vmatrix}}
\end{align}
```

#任意のベクトルを回転軸とする四元数
回転軸ベクトル：a、回転角：θ

```math
\acute{a} = \frac{a}{\begin{vmatrix} a \end{vmatrix}}\\
q = ( \cos(0.5 \theta), \; \acute{a}_0 \sin ( 0.5 \theta ), \; \acute{a}_1 \sin ( 0.5 \theta ), \; \acute{a}_2 \sin ( 0.5 \theta ) )
```

#回転行列へ変換
qと等価な回転行列M

```math
M = \begin{pmatrix}
q_0^2 + q_1^2 - q_2^2 - q_3^2 &
2 (q_1q_2 - q_0q_3) &
2 (q_1q_3 +q_0q_2)\\

2 (q_1q_2 + q_0q_3) &
q_0^2 - q_1^2 + q_2^2 - q_3^2 &
2 (q_2q_3 - q_0q_1)\\

2 (q_1q_3 - q_0q_2) &
2 (q_2q_3 + q_0q_1) &
q_0^2 - q_1^2 - q_2^2 + q_3^2
\end{pmatrix}
```

#回転行列からの変換
回転行列Mと等価なq

```math
\begin{align}
q_0 &= 0.25 \sqrt{chop(M_{00} + M_{11} + M_{22} + 1)}\\
q_1 &= 0.25 \cdot a \sqrt{chop(M_{00} - M_{11} - M_{22} + 1)}\\
q_2 &= 0.25 \cdot b \sqrt{chop(-M_{00} + M_{11} - M_{22} + 1)}\\
q_3 &= 0.25 \cdot c \sqrt{chop(-M_{00} - M_{11} + M_{22} + 1)}\\

chop(x) &= \left\{
\begin{array}{ll}
x & (x \geq 0) \\
0 & (x \lt 0)
\end{array}
\right.\\

a &= \left\{
\begin{array}{ll}
-1 & (q_0 > 0) \; \cap \; (M_{21} - M_{12} < 0) \\
1 & else
\end{array}
\right.\\

b &= \left\{
\begin{array}{ll}
-1 & ( (q_0 > 0) \cap (M_{02} - M_{20} < 0) ) \; \cup \;
     ( (q_0 = 0) \cap (q_1 \neq 0) \cap (M_{10} + M_{02} < 0)) \\
1 & else
\end{array}
\right.\\

c &= \left\{
\begin{array}{ll}
-1 & ( (q_0 > 0) \cap (M_{10} - M_{01} < 0) ) \; \cup \;
     ( (q_0 = 0) \cap (q_1 \neq 0) \cap (M_{02} + M_{20} < 0))  \; \cup \;
     ( (q_0 = 0) \cap (q_1 = 0) \cap (M_{21} + M_{12} < 0)) \\
1 & else
\end{array}
\right.\\

\end{align}\\
```

※後で正規化が必要
スマホゲーム作る人はEventTriggerを使え！！（キャラをUI上の方向キーで動かす）

#実現できること
下の写真のようにボタンを設置して押したらキャラが動くようになる。
![スクリーンショット 2020-05-18 20.14.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/39e3a27c-3567-8905-9e88-cf46f2aa02f2.png)


#やること
##（１）ボタンを作る
なんでもいいのでボタンを配置する
![スクリーンショット 2020-05-18 20.14.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/64e5e34a-3b34-7a65-a737-471e0798f285.png)
![スクリーンショット 2020-05-18 20.14.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/d80145fa-5245-b677-a103-c6a67f47e6d1.png)

##（２）スクリプトを書く

```c#:PlayerManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerManager : MonoBehaviour
{
    //画面の上のボタンによる移動
    bool rightmove;
    bool leftmove;
    
    void Update()
    {
        if (rightmove == true)
        {
            transform.position += new Vector3(4f * Time.deltaTime, 0, 0);
        }
        if (leftmove == true)
        {
            transform.position += new Vector3(-4f * Time.deltaTime, 0, 0);
        }
    }

    public void rightButtonDown()
    {
        rightmove = true;
    }
    public void rightButtonUp()
    {
        rightmove = false;
    }
    public void leftButtonDown()
    {
        leftmove = true;
    }
    public void leftButtonUp()
    {
        leftmove = false;
    }

```

##（３）EventTriggerを追加する
![スクリーンショット 2020-05-18 20.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/fd890e87-ab60-e0fc-900c-3a8186aa4cab.png)
Pointer Down と Pointer Upをそれぞれ作って
PLayerManager.csがついたオブジェクトをドラッグする
そして、のところから任意のものを選択する

以上。

わからないことがあれば
@e_san_desuyo まで

追記：動くスピードはスクリプトから変更可能です
複数のStoryboardを切り替えて起動する【XCode11版】


#複数のStoryboardを使用したい
習作を開発する際など、試してみたい機能によって複数の Storyboad を用意して、起動するStoryboard を切り替えて使いたいことがあります。

今までは、

1. Storyboard を新規追加する
2. Storyboard に ViewController を追加する
3. ViewController の Attributes inspector で is initial View Controller にチェックを入れる
4. プロジェクト設定の General タブで Deployment Info 内の Main Interface で起動したい Storybard を指定する

という方法で切り替えることが出来ました。

<img width="258" alt="check.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14604/ea45cc43-3f5b-ef1b-65d9-cfc47f5a8211.png">


#起動時のStoryboardの指定方法が変わった
ところが Xcode11 では上述の方法では切り替えることが出来なくなっています。
Xcode11 から UIScene という概念が導入された影響のようです。


#Xcode11での指定方法

Xcode11では、１〜３までの Storyboard を用意するまでは同じですが、４の指定方法は以下のように変わりました。

1. Storyboard を新規追加する
2. Storyboard に ViewController を追加する
3. ViewController の Attributes inspector で is initial View Controller にチェックを入れる
4. Info.plist の Application Scene Manifest > Scene Configuration > Application Session Role > Item0 > Storyboard Name に起動したい Storyboard 名を指定する。


<img width="661" alt="infoplist.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14604/da14f632-8c3b-d276-0b39-e605a1262f12.png">




#参考

[起動するStoryboardを変更する](https://qiita.com/Shotaro_Mori_/items/c9348f3f59308171402a)
[SwiftUIを触って分かったこと：①初期画面の設定方法](https://qiita.com/rc_code/items/795ddadb98dfa09d10e6)
Hadoopクラスタkerberos化後のPySparkのエラー

# はじめに
HadoopクラスタのKerberos認証を有効化後にPySparkのエラーが発生しました。
その対応方法です。
# 環境
OS: CentOS 7.7
Hadoopディストリビューション: CDH6.2.1
master node: 3台
worker node: 6台

# 現象
PySparkを実行時に下記のエラー

>Can't create directory
/data/1/yarn/nm/usercache/{username}/appcache/application_{id}
…
/data/n/yarn/nm/usercache/{username}/appcache/application_{id}
Permission denied

{username}: PySpark実行時のユーザ
{id}      : SparkアプリケーションID

## 原因
Kerberos認証有効化前後で実行ユーザが異なるため、PySpark実行時の使用するcacheのディレクトリ権限が足りませんでした。

## 対応方法

woerk node全台の`/data/1/yarn/nm/usercache/{username}`の削除します。
Hadoopクラスタは扱うサーバ数が多いので、何かしらの構成管理ツールを使用していると思います。
構成管理ツールとして、Ansibleを使用しているので下記のplaybookを実行。

```yaml:playbook
host: worker_servers
become: true
tasks:
  - name: rm -rf usercache
    file:
      path: /data/1/yarn/nm/usercache/{username}
      state: absent
# 使用しているdisk分記載
  - name: rm -rf usercache
    file:
      path: /data/n/yarn/nm/usercache/{username}
      state: absent
```

# おわりに
Hadoopクラスタを運用するのは大変（泣）
Float計算回路のVerilog-HDL実装について -その2.7(0対応)

#Float計算回路のVerilog実装
~ FPGA に載せたい ~
オレオレ実装なので間違っていても知りません

加算回路編
[Float計算回路のVerilog-HDL実装について -その１](https://qiita.com/Soleiyu/items/5bbb991de443e61e318e)

デバッグツール作成編
[Float計算回路の(ry-その１.１(float値の16進数表記)](https://qiita.com/Soleiyu/items/1fbdc78c68ad69a6d34d)

補足とLeadingZeros編
[Float計算回路のVerilog-HDL実装について -その1.5 (LeadingZeros)](https://qiita.com/Soleiyu/items/2fbd44883cfb1cdd253d)

減算回路編
[Float計算回路のVerilog-HDL実装について -その2(減算編)](https://qiita.com/Soleiyu/items/b56d3db666bd93f9ef75)

回路共通化とタイミング調整編
[Float計算回路のVerilog-HDL実装について -その2.1(加算回路の共通化とタイミング調整)](https://qiita.com/Soleiyu/items/85e9543463f068fe5047)

共通化編
[Float計算回路のVerilog-HDL実装について -その2.5(共通化)](https://qiita.com/Soleiyu/items/5751c226d1e8008a3231)

## 目的
floatの勉強
float32のハードウェア実装

０に対応したHWの実装
面倒くさいので指数部が0かどうかで判定して非正規化数はまるめる（どんまい）

これで通常計算は最後（のはず）

## ０のパターン

```math
a \pm 0\\
0 \pm a\\
a - a\\
0-0
```
だいたいこの４パターン（2でも良いくらい)

## 今回のHW
![asz_timing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/f8d2cd74-0375-1075-6e21-57f873242f7c.png)

各値の保持とTIM4の変更

## TIM4
```
// TIM4 //
	if ((eb2 == es2) && (vb3 == vs3) && (opb2 ^ opb3)) begin
		op3 <= 1'b0;
		vexp3 <= 8'b0;
	end else begin
		op3 <= opb2;
		vexp3 <= eb2;
	end

	if (eb2 == 8'b0) begin
		r <= 25'b0;
	end else if (es2 == 8'b0) begin
		r <= vb3;
	end else if (opb2 ^ ops2) begin
		r <= vb3 - vs3;
	end else begin
		r <= vb3 + vs3;
	end
```

その２．５までで、絶対値の大小で値をソートしている為、

```math
a \pm 0
```
のパターンで　0 は必ず小さい値としてソートされる

したがって、
計算時にこれを検出すれば良い

さらに
大きい値が 0 であるならば 小さい方は必ず 0 である

## シミュレーション結果

|値１| 値2| 演算子|| 結果|
|:-:|:-:|:-:|:-:|:-:|:-:|
|123.4|0| +||123.4|
|-123.4|0| +||-123.4|
|0|123.4| +||123.4|
|0|-123.4| +||-123.4|
|123.4|0| -||123.4|
|-123.4|0| -||-123.4|
|0|123.4| -||-123.4|
|0|-123.4| -||123.4|
|0|0| +||0|
|0|0| -||0|
|123.4|123.4| +||246.8|
|123.4|123.4| -||0|
PythonとPHPの違いまとめ（主要項目の対比表）

#PythonとPHPの違いまとめ（主要項目の対比表）
pythonとphpのクラスやメソッドなど主要項目の違いまとめ。

どっちがどっちかわからくなるの防止。

<br>

| 項目 | Python | PHP |
|:-:|:--|:--|
| 関数 | def 関数名():  | function 関数名(){} |
| 処理の終わり  | 改行 | ; |
|コメントアウト| # | // or /* */ |
| 変数  | 変数名  | $変数名  |
| クラス定義  | class クラス名: | class クラス名{} | 
| コンストラクタ  | def \_\_init\_\_(self):  | アクセス権 function \_\_construct(){} |
| インスタンス  | クラス名()  | new クラス名()  |
| プロパティ *1  | プロパティ名  | $プロパティ名  | 
| プロパティの呼び出し  | インスタンス.プロパティ名  | インスタンス->プロパティ名  | 
| インスタンス自身  | self | $this  |
| 自身のプロパティ呼び出し | self.プロパティ名  | $this->プロパティ名  |
| メソッド  | def メソッド名(self)  | アクセス権 function メソッド名()  |
| メソッド呼び出し  | インスタンス.メソッド名() | インスタンス->メソッド名() |
| 継承  | class クラス名(親クラス名):  | class クラス名 extends 親クラス名{}  |
| ファイル読込み  | import モジュール名  | require_once(' ')  |
| クラス読込み  | from モジュール名 import クラス名  | require_once(' ')  |
| 親クラスのメソッド呼び出し  | super().メソッド名()  | parent::メソッド名()  |
| クラスメソッド  | `@classmethod`<br>def メソッド名():  | アクセス権 static function メソッド名(){} |
| クラスメソッドの呼び出し  | クラス名.メソッド名()  | クラス名::メソッド名()  |
| クラスプロパティ  | （メソッド定義と同列に）<br>プロパティ名  | アクセス権 static $プロパティ名 |
| クラスプロパティの呼び出し  | クラス名.プロパティ名 | クラス名::$プロパティ名 |
| 出力  | print()  | echo/print |
| 配列  | [] | array()  |
| キーあり配列  | {キー名:値} | array(キー名=>値)  |
| キーあり配列呼び名  | 辞書型 | 連想配列  |
| 配列の要素数  | len(配列)  | count(配列) |
| 変数展開*2  | f'{変数}'  | "${変数}" |
| for文  | for 変数 in range(始値, 終値, ステップ)<br>※ 終値は含まない | for($変数名=初期値: 条件式: ステップ){}  |
| 配列からひとつずつ抜き出す |for 変数 in 配列: | foreach($変数名 as 配列) |
|if文 | if 条件式:| if(条件式){} |
|else if | elif 条件式: | elseif (条件式){} |
|switch文 |なし |switch(){case 条件: 処理; break;} |
|and | and |&&/and |
|or | or| パイプ2本/or |
|インクリメント演算子 |なし | ++ |
|デクリメント演算子 |なし | -- |
|整数型に変換 |int() |intval() |
|文字列型に変換 |str() |strval() |
|小数点に型変換 |float() |floatval() |
|3桁区切り |'{:,d}'.format(数値)<br>f'{数値:,d}' | number_format() |

*1. pythonではインスタンス変数と呼ぶ
*2. PHP：シングルクオテーションだと文字列として出力　
　　python：f文字列の場合

<br>
表にして眺めてみると違いや、規則性がわかりやすい。
git push -f origin master をやりなおす

## 結論
force push 禁止しよう。
一人でもプルリク運用した方が安全。

## 前提
* 中央リポジトリは github
* master へのコミットは原則禁止し、PullRequest で運用
* 個人無料アカウント
* 一人プロジェクトなので、他のマシンなどに master 最新のコミットが残っていたりはしない

## サマリ
1. github のサイト上で、master にマージされた最新のPRを探す
2. 上記 PR のマージコミットの番号を調べる
3. 該当のコミットをローカルに fetch する
4. そのコミットにチェックアウトしてブランチを切る
5. そのブランチを master として **force push** する

## 状況
* master 最新になっていないローカル master を `git push -f origin master` した
* 結果、 github 上のコミット履歴が1ヶ月くらい前にタイムスリップ
* github のサイトではプルリクやマージの状況は残っている
* ローカルにも他のマシンにも最新のコミットがない
* 目の前が真っ暗になった


## 対応
### 1. github のサイト上で、master にマージされた最新のPRを探す
![push-f-master_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/cf64cfe0-56ac-af10-b32a-2883b59a53ab.png)


### 2. 上記 PR のマージコミットの番号を調べる
PRのページの下の方にスクロールするとマージされたコミット番号が表示されているはず。
それをクリックするとマージコミットのページに移動する。
![push-f-master_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/31657a68-127c-0ec9-07f5-810fcac5008c.png)
URLないし画面内のコミット番号をコピーする。
![push-f-master_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/1a6e2fb6-65a1-9a02-baad-22ce03aeea59.png)


### 3. 該当のコミットをローカルに fetch する
ローカルで fetch する

```shell
git fetch origin コミット番号
```

fetch したコミットは `FETCH_HEAD` にある。

### 4. そのコミットにチェックアウトしてブランチを切る
```shell
git checkout FETCH_HEAD
git checkout -b 任意のブランチ名
```

### そのブランチを master として force push する
```shell
git push -f origin 任意のブランチ名:master
```

はぁ、また force push するの。
http接続でgit cloneする時にパスワード入力を省略する方法

git-credential-osxkeychainを使います。
キーチェインにパスワードを保存するので安全です。

```sh:
git config --global credential.helper osxkeychain
```
pullやpushの初回だけユーザー名とパスワードを入力すれば、以降はパスワード入力を省略できます
【Vue.js】v-if使用方法 備忘録

#概要
v-ifの使用方法を記した備忘録です。

#v-ifとは
HTML要素を条件分岐させる事ができるディレクティブの事。

##文法
```html:文法.html
<タグ　v-if 条件></タグ>
<タグ　v-if-else 条件></タグ>
<タグ　v-else 条件></タグ>
```

#v-ifを使ってみる
```html:post_com.html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">  
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
    <title>Title</title>
</head>

<body>
    <div id="app">
        <label><input v-model="myText"></label>
        <!--0から140文字の間の入力があった場合の処理-->
        <p v-if="0 <= myText.length && myText.length <=140">
            {{myTextLen}}
        </p>
        <!--140文字以上が入力された場合の処理-->
        <p v-else-if="141 <= myText.length">
            <font color="red">
                {{myTextLen}}文字超過
            </font>
        </p>
        <p v-else>
        </p>
    </div>
    <script src="./post_com.js"></script>
</body>
</html>
```
```javascript:post_com.js
const app = new Vue({
    el: "#app",
    data: {
        myText:""
    },

    computed:{
        //文字数の絶対値を140からマイナスカウントさせる処理
        myTextLen: function(){
            return Math.abs(this.myText.length - 140);
        }
    }
})
```
##解説
上記PGMはフォームへの入力可能文字残数（ここでは140文字）を表示させるプログラム。
v-modelでデータを繋ぎcomputedで計算処理を外出しさせています。
Join(inner join)とLeft Joinの違い

#Join(内部結合)とLeft Join(外部結合)の違い

## 目次
* [背景](#背景)
* [結論](#結論)
* [検証1.Join](#検証1.Join)
* [検証2.Left Join](#検証2.Left Join)
* [学んだこと](#学んだこと)

##背景
面接でタイトルの質問をされたので、覚えるためにまとめます。

## 結論

#### Join(内部結合)
どちらか一方のテーブルになければ複製されず表示されない。

#### Left Join(外部結合)
左の行は強制的に全て表示し、右テーブルには全ての値がNULLである行を生成して結合する

##　検証1.Join

例えば、以下のテーブルがあったとします。

#### usersテーブル

|id|name|
|---|---|---|
|1 | Bob |
2 | Alan |
3 | James |

#### postsテーブル

|id|body|user_id|
|---|---|---|
|1 | Hello | 3 |
2 | Hi | 1
3 | Good | 2
4 | Why? | 2

現状では、idが2のuserが一つに対し、user_idが2のpostが二つあります.
ここでjoin(内部結合)を使って結合してみます.

SELECT *
FROM users -- 結合元の左テーブル
  JOIN posts --　結合先の右テーブル
    ON users.id = posts.user_id -- 左テーブルのidと右テーブルのidが一致するもの

|id|name|id|body|user_id|
|---|---|---|---|---|
|    3 | James |    1 | Hello |       3 |
|    1 | Bob   |    2 | Hi    |       1 |
|    2 | Alan   |    3 | Good  |       2 |
|    2 | Alan   |    4 | Why?  |       2 |


usersテーブルの行が一つ増えます.
右テーブルに繋ぐべき行が複数ある場合、左テーブルの行を複製して結合します。

__もし、右テーブルにつなぐべき行がない場合は、表示されません__

#### 表示されない例

#### usersテーブル

|id|name|
|---|---|---|
|1 | Bob |
| 2 | Alan |
| 3 | James |
| 4 | Tony |

#### postsテーブル

|id|body|user_id|
|---|---|---|
|1 | Hello | 3 |
| 2 | Hi | 1
| 3 | Good | 2
| 4 | Why? | 2

#### 結果 
|id|name|id|body|user_id|
|---|---|---|---|---|
|    3 | James |    1 | Hello |       3 |
|    1 | Bob   |    2 | Hi    |       1 |
|    2 | Alan   |    3 | Good  |       2 |
|    2 | Alan   |    4 | Why?  |       2 |

## 検証2.Left Join

Left Joinは左の行は強制的に全て表示し、右テーブルには全ての値がNULLである行を生成して結合します.

例えば`id:4 Tony`のPostレコードはないため,内部結合では表示されませんでした.
しかし Left Joinでは表示されていることがわかります.

#### usersテーブル

|id|name|
|---|---|---|
|1 | Bob |
| 2 | Alan |
| 3 | James |
| 4 | Tony |

#### postsテーブル

|id|body|user_id|
|---|---|---|
|1 | Hello | 3 |
| 2 | Hi | 1
| 3 | Good | 2
| 4 | Why? | 2

#### 結果
|id|name|id|body|user_id|
|---|---|---|---|---|
|    3 | James |    1 | Hello |       3 |
|    1 | Bob   |    2 | Hi    |       1 |
|    2 | Alan   |    3 | Good  |       2 |
|    4 | Tony | NULL | NULL | NULL | 

同じように外部結合の中でもRight Joinと呼ばれるものもあるのですが、
Right Joinは右の行は強制的に全て表示し、左テーブルには全ての値がNULLである行を生成して結合します.


## 学んだこと

1. `Join(内部結合)`は左テーブルと右テーブルで一致する要素のみ表示する
2. `Left Join(外部結合)`は左テーブルにある全ての行を表示し,右テーブルにNULLのレコードを生成する
みんな使ってるだろうけど車輪の再発明をして喜ぶマン(日付alias)

忘れそうだから(ry
# これは何？
フォルダに適当に名前つけてわからなくなるので日付で管理しようと思った。　3日後くらいには存在忘れてそう

```shell
alias stamp="date '+%Y-%m-%d'"
```
##使い方
```sh
$ mkdir $(stamp) && cd $_
~/yyyy-mm-dd/ $
```

#思う事
* これくらい覚えてろ
* というか直にかける長さだろ
* 車輪の再発明は仕事でするとアレだけど趣味でするなら言語覚えたりするのにいいと思う（適当）
* このシリーズ投稿し続けたらそれだけで埋まりそう

#　やりたい事
* 日付じゃなくて時間にもスイッチしたいよね
* でも引数だとaliasで書けないからfunctionになる気がする
* そうなるとめんどくさい気もする
* 似た名前でaliasするか迷う（どっちかわからなくなりそう）
CSOM(C#)でSharePointグループを作成する

#概要
CSOM(C#)でSharePointグループを作成します。
[SharePointサイト作成](https://qiita.com/miesque/items/a639ecdcd3324fd44bff "SharePointサイト作成")時に、合わせてグループを作成する際や、まとまった数のグループを作成する際などに便利です。

#開発環境
.NET Framework 4.7.2
NugetでMicrosoft.SharePointOnline.CSOMを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94732/12753ed4-8c74-fd23-ff15-eb889ad508af.png)


#手順
1. SharePointOnlineで、グループを作成したいサイトにログインする
　* usingでサイトのURLを指定 -　http://xxx.xxxx.com/sites/sitecollection/sitename の形式

2. 作成したいグループの存在確認を行う
　* サイトのSPOグループから、ここでは作成したいグループのタイトルと同じタイトルのグループを検索して取得
　* 下記ソースコードでは、既に存在している場合はそこで処理を終了

3. GroupCreationInformationクラスを使用し、グループを追加する
　* GroupCreationInformaionクラスにグループのタイトルと説明を設定し、サイトグループにAddする

4. 属性の編集が必要な場合は、編集して更新する
　* 作成したグループを取得し、属性の更新を行う

#コード
```C#:CreateGroup.cs

// ログインユーザー
var loginUser = ConfigurationManager.AppSettings["SPO_ID"];
// サイトコレクション(サイト)のURL
var siteCol = ConfigurationManager.AppSettings["SITE_COLLECTION_URL"];
// サイトのURL名
var newSiteUrl = ConfigurationManager.AppSettings["NEW_SITE_URL"];

using (var clientContext = new ClientContext(Utility.URLCombine(siteCol, newSiteUrl)))
using (var secureString = new SecureString())
{
    foreach (var c in ConfigurationManager.AppSettings["SPO_PASS"]) secureString.AppendChar(c);
    secureString.MakeReadOnly();
    clientContext.Credentials = new SharePointOnlineCredentials(loginUser, secureString);

    var message = string.Empty;

    var newGroupName = $"{newSiteUrl.TrimEnd('/')}Admin";       // サイトURL名+Admin 管理者用グループ
    var newGroupDisc = "管理者用グループ";

    // 指定したグループが既存かどうかを確認する
    var groups = clientContext.Web.SiteGroups;
    clientContext.Load(groups, gp => gp.Include(g => g.Title).Where(g => g.Title == newGroupName));
    clientContext.ExecuteQuery();
    // 存在する場合は処理終了
    if (groups.FirstOrDefault() != null) return;

    // グループ作成
    var groupCreateInfo = new GroupCreationInformation
    {
        Title = newGroupName,
        Description = newGroupDisc,
    };

    var newGroupAdd = clientContext.Web.SiteGroups.Add(groupCreateInfo);
    clientContext.Load(newGroupAdd);
    clientContext.ExecuteQuery();

    // グループ設定の編集
    // 編集のために再取得
    groups = clientContext.Web.SiteGroups;
    clientContext.Load(groups, gp => gp.Include(g => g.Title).Where(g => g.Title == newGroupName));
    clientContext.ExecuteQuery();

    var group = groups.FirstOrDefault();
    group.OnlyAllowMembersViewMembership = false;           // グループのメンバーシップを表示できるユーザー：すべてのユーザー
    group.AllowMembersEditMembership = true;                // グループのメンバーシップを編集できるユーザー：グループメンバー
    group.Update();
    clientContext.ExecuteQuery();
}

```
#GroupCreationInformationクラス
新しく作成するSharepointグループの属性を指定します。下記以外の属性は、作成時初期値となり、必要に応じて別途設定が必要となるようです。

* Title … グループ名
* Description … グループの説明

#実行結果
下記のようにSharePointグループが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94732/ab3f1645-397a-e902-2f94-dbab985194f3.png)

#参照
[GroupCreationInformationクラス](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.sharepoint.client.groupcreationinformation "GroupCreationInformationクラス")
AWS認定 高度なネットワーキング - 専門知識に合格したので、実践した勉強方法を共有します

#はじめに
[AWS認定 高度なネットワーキング - 専門知識](https://aws.amazon.com/jp/certification/certified-advanced-networking-specialty/)にスコア84%で合格しました。勉強期間は約1ヶ月でした。
（１度目は62%で不合格となり、2度目の受験で合格しました。）

[<img width = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266372/9a95755c-6750-0a5b-a94d-f50a319562d2.png">](https://www.youracclaim.com/badges/2a9f97d6-fb85-4ef6-b0f9-c3bfe3d0902b/public_url)

私が実践した勉強方法を共有しますので、これから受験する方の参考になれば幸いです。

#私とAWSとネットワーク
AWS歴は約4年です。インフラエンジニアとしてアサインされることが多いので、VPCはよく触っています。
ただし、DirectConnectとVPNの構築経験はほぼありません。

こんな感じの人が以下の勉強方法で約1ヶ月勉強したら合格できたと思ってください。

#実践した勉強方法
私が実践した勉強方法を共有します。基本的に上から順番に実施していきました。

##先駆者の方々のまとめ記事を見る
既に受験された方々のまとめ記事を見て、出題範囲のAWSサービスや問われる知識分野を把握しました。
私は以下の記事を参考にさせて頂きました。

- [Jayendra's Blog AWS Certified Advanced Networking – Speciality (ANS-C00) Exam Learning Path](https://jayendrapatil.com/aws-certified-advanced-networking-speciality-ans-c00-exam-learning-path/)
- [ルーター設定経験の無い開発者でもAWS Certified Advanced Networkingに合格できた話](https://dev.classmethod.jp/articles/i-passed-ans/)


## BlackBeltを読む
出題範囲のAWSサービスが分かったら、対象サービスの[BlackBelt](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)を読んで、サービス概要をざっくり理解しました。

## DirectConnect,VPNの概要を理解する
DirectConnect,VPNに関してはドキュメントの文字を読むだけだと中々イメージしずらいものでした。
以下の資料と記事は図が多めで全体像を理解するのに大変参考になりました。

- [AKIBA.AWS 第6回 ネットワーク基礎編：「VPN接続とルーティングの基礎」で発表しました #akibaaws](https://dev.classmethod.jp/articles/akibaaws-6-aws-vpn/)
- [AKIBA.AWS 第7回 ネットワーク応用編：「VGWのルーティング仕様を理解する」で発表しました #akibaaws](https://dev.classmethod.jp/articles/akibaaws-7-vgw-routing/)
- [AWS Direct Connectの概念の整理…Connectionとは？VIFとは？](http://blog.serverworks.co.jp/tech/2018/12/11/concepts-of-direct-connect/)

## サンプル問題を解く
[サンプル問題](https://d1.awsstatic.com/training-and-certification/docs-advnetworking-spec/AWS_Certified_Advanced_Networking_Specialty_SampleExam.pdf)を解きました。満点取るまで繰り返し解きました。

## 公式のStudy Guideで提供されている模擬問題を解く
高度なネットワーキング試験は[公式の参考書](https://www.amazon.co.jp/dp/1119439833/ref=cm_sw_r_cp_ep_dp_jxnEBbBPQ9QDQ)が販売されています。こちらを電子版で購入しました。本を買うと問題が約300問提供されている専用サイトに登録することができます。解答の解説も付いており、大変参考になりました。英語ですが、Google翻訳を活用しました。こちらを繰り返し解きました。

ちなみに、本体の書籍の方はほぼ読んでいませんw
英語のままで勉強するのは精神的に辛いし、Kindleだと全てを一気に翻訳して読むことができず1ページずつ翻訳しながら読み込むのは時間がかかりすぎると判断しました。

## 非公式の問題集を解く
### examtopics
無料で113問提供されています。こちらを繰り返し解きました。
解答が間違っているものもあるのですが、コメント欄でみんなが正解不正解を議論しているので、勉強する上で大変参考になります。

- [Amazon ANS-C00 Exam](https://www.examtopics.com/exams/amazon/ans-c00/)

#感想
DirectConnectとVPNに関する問題が全体の半分近くあったと思うので、重点的に学習することをおすすめします。
高度なネットワーキング試験は模擬試験とAWSトレーニングルームのeラーニングが提供されていなかったりと、学習教材を探すのが大変でした。
また、試験が開始されたのが若干古いため、以下のように解答が最新のベストプラクティスとなっていない問題がいくつかありました。

- Route53リゾルバーを使うとオンプレミスとVPC間の名前解決が簡単にできるようになるが、問題だとEC2でプロキシリゾルバを構築してフォワードさせる解答となっている
- トランジットゲートウェイを使うとオンプレミスとVPC間の通信を簡単に通信させることができるが、問題だとトランジットVPCにEC2でルーターを構築する解答となっている

今回の試験勉強を通して、今まで触ったことのないサービスの概要や特徴を多く知ることができました。学んだことが今後役立つ日がくれば良いなと思います。

※1度不合格となり、2回目の受験で合格したのですが、**9割近くが同じ問題でした**。他のAWS認定試験でも毎回同じ問題がでるものなんでしょうか？
IntelliJ IDEAからコマンドラインでRefomat Code

# TL;DR

InteliJ IDEAでコマンドラインからReformat Codeしたい

# 手順

## 通常

通常なら、メニューバーから
Code→Reformat Code or Reformat file
する

だけどコマンドラインでできたら使い道あるかもな〜と思っていたら公式でのコマンドラインインターフェースが用意されていた

https://www.jetbrains.com/help/idea/command-line-formatter.html


## ideaコマンドを使う

[公式のコマンドラインインターフェース導入](https://www.jetbrains.com/help/idea/working-with-the-ide-features-from-command-line.html)に従って以下を保存する

```shell:/usr/local/bin/idea
#!/bin/sh

open -na "IntelliJ IDEA.app" --args "$@"
```

権限で怒られるはずなので実行権限をつけよう

```shell
chmod +x /usr/loca/bin/idea
```

# ワンライナーでReformat Code

仕事でKotlinを使っているので拡張子は.kt
気にせず書き換えてください

src以下にソースコードがあるとすると以下で良い

```shell
for kt in `find src -name \*.kt`; do idea format $kt; done;
```

多分こっちのがいい

```shell
idea format `find src -name \*.kt`
```


# 追記

使ってみると、思った設定と違うフォーマットされて困ってしまうかもしれません（困ってます）
解決したら載せます
[React]styled componentsで子要素にも適応する！

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#styled componentsを使う！
[Semantic UI React](https://react.semantic-ui.com//)を使用中
[Menu.Item](https://react.semantic-ui.com/collections/menu//)にも適応させる場合、どの様なコードになるのかちょっと分からなかったのでメモとして残す

```index.js
import React from "react";

import { Menu } from "semantic-ui-react";

const MenuStyled = styled(Menu)`
  &&& {
    width: calc(100% - 20px);
    margin: 10px;
  }
`;

```

`&&&`は[この記事を見て理解した！](https://qiita.com/snishinon/items/9ea9c2f981ef081e825f/)

>！！？？ああ、トリッキーだ。&&& {}って何だ。
<a class="link colord">AAA</a>というアンカーがあったとすれば、
<a class="link colord myLink">AAA</a>として.myLinkでデザインしていくことになると思いますが、それと同じ振る舞いをします。
これはCSSの詳細度と闘っています。

`const MenuStyled = styled(Menu)`で`Menu.Item`にもcssを反映させたい場合は以下の方法でいけた！

```index.js
import React from "react";

import { Menu } from "semantic-ui-react";

const MenuStyled = styled(Menu)`
  &&& {
    width: calc(100% - 20px);
    margin: 10px;
  }
  &&&.ui.menu .item {
    padding-top: 2rem;
    padding-bottom: 2rem;
    font-weight: 600;
  }
`;
```

#参考にした記事
・[How do you use first-child or last-child selectors with SC?](https://spectrum.chat/styled-components/general/how-do-you-use-first-child-or-last-child-selectors-with-sc~d427d120-e0d5-4098-8c62-e32d87258787/)
Ruby : open-uriのcharsetメソッドが参照する文字コード

#はじめに
Rubyのopen-uriライブラリを使ってページのスクレイピングをする際、openメソッドで対象urlを開いてからcharsetメソッドを使ってページの文字コードを取得していましたが、charsetメソッドが具体的にどこから文字コードを参照しているのかがわかっていなかったため、まとめます。

#charsetメソッドが参照するリソース
以下公式リファレンスです。

>対象となるリソースの文字コードを文字列で返します。Content-Type ヘッダの文字コード情報が使われます。
[Rubyリファレンスマニュアル OpenURI::Meta#charset](https://docs.ruby-lang.org/ja/latest/method/OpenURI=3a=3aMeta/i/charset.html)

openメソッドでurlを開いた際の「対象となるリソース」というのは、「ブラウザのデベロッパーツールNetworkパネルで一覧表示されるリソース」を指します。

例としてyahooトップページでデベロッパーツールを開いて確認してみます。
https://www.yahoo.co.jp/
![Screenshot from 2020-05-18 18-23-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636023/e8c2dba2-ce46-54dd-1f81-157e3c9b3729.png)

Networkタブで「www.yahoo.co.jp」のリソースを選択し、「Headers」タブで表示した画像です。

「Response Headers」の「content-type」項目に「charset=UTF-8」と記述されています。
charsetメソッドはこの「charset=UTF-8」を参照して文字コードを取得しているということです。

実際にcharsetメソッドを使ってyahooの文字コードを取得してみます。

```sample1.rb
require 'open-uri'

url = 'https://www.yahoo.co.jp/'

charset = nil
html = open(url) do |f|
  charset = f.charset
  f.read
end

p charset
```

```sample1.rbの実行結果
$ ruby sample1.rb
"utf-8"
```

#charsetメソッドでいつも文字コードを取得できるとは限らない
上の例で見たように、charsetメソッドが参照するのはリソースの「content-type」項目です。
つまりリソースの「content-type」項目に「charset」が書かれていないと参照できません。

例えば、zozotownトップページには「content-type」項目に「charset」が記述されていません。
https://zozo.jp/
![Screenshot from 2020-05-18 18-49-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636023/718aa065-bd1a-ec99-b319-44f8e4fc34ee.png)

「content-type」項目に「charset」の記述が見当たりません。

zozotownトップページを指定して文字コードを取得してみます。

```sample2.rb
require 'open-uri'

url = 'https://zozo.jp/'

charset = nil
html = open(url) do |f|
  charset = f.charset
  f.read
end

p charset
```

```sample2.rbの実行結果
$ ruby sample2.rb
nil
```
結果のように、「content-type」に記述がないと、charsetメソッドで取得した結果はnilとなります。

では実際zozotownはどの文字コードで書かれているのでしょうか。
ページで「ctrl + u」を押してページのソースを表示すると、
![Screenshot from 2020-05-18 19-00-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636023/27fc156e-0184-5598-4f2f-dd61f9e0da16.png)

zozotownのページは「Shift_JIS」で書かれていました。

このようにページによってcharsetメソッドが文字コードを取得できない場合があるので注意が必要です。
コロナ自粛期間を利用してAWSソリューションアーキテクトアソシエイトを取得した話

## 試験を受けた背景
昨今のコロナ自粛の影響で完全リモートかつ土日も外に出れない状況に
なったので隙間時間に何か勉強したいというのが大きな動機になります。
その中で**短期間で目に見えた結果がほしい**と思い
兼ねてから気になっていた本試験に臨むことにしました。

## 勉強方法と勉強期間
勉強期間は約一ヶ月で最初は主にAWS各種サービスの概要と使い方と選択する優位性を網羅的に勉強しました。
その後は試験勉強でおなじみ**過去問を繰り返し解く**ということを中心に行いました。
総仕上げとしてAWS公式のオンライン模擬試験を受けました。

## 参考にしたコンテンツ
### [徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書 徹底攻略] (https://www.amazon.co.jp/dp/B07M7S9GDL/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

言わずと知れたテッパン書籍の黒本をまずは一通り読破しました。
AWSをあまり知らない人がまず理解する本としてはとてもおすすめです。
ですがこの本だけでは合格は難しいと思います。

### [一夜漬け AWS認定 ソリューションアーキテクト アソシエイト 直前対策テキスト](https://www.amazon.co.jp/dp/B087RMBS3B/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
こちらはより試験対策に特化したポイントをわかりやすく書いてある本です。
試験前の最終確認としてとても役に経ちました。

### [Udemy これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/course/aws-associate/)
Udemyのこちらの試験対策教材は最強です。
各種主要サービスの概要、ハンズオン、模擬問題集を網羅して勉強することができます。
これを一通りやるだけで70%の確率で受かる気がしています。

### [Udemy AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集](https://www.udemy.com/course/aws-knan/)
さらに問題の傾向になれたい、合格確率を上げたいという人におすすめです。
この問題集の正解率が75%を超えている人はかなりの確率で受かると思います。
ただ問題の難易度はかなり高いので最初に受けると挫折するかもしれないので注意です。

## 問題の傾向
AWSの実務経験が少なくとも1年以上はある人前提の問題なので少なくとも
下記に関しては理解が必要だと思います。

- グローバルサービス、リージョンサービス、AZサービスの違い
- VPC、サブネット、セキュリティーグループ、AZなどの基本構成
- EC2、Cloudfront、ELB、AutoScaling、CloudWatch、Route53、S3、RDSなどの基本サービスについて
- IAMユーザー、グループ、ロール、Organizationsなどの認証について

システム構築では当たり前のデータベースやキャッシュについては確実出題されるかと思います。
またログ収集や分析についても多くはないですが出題されるかと思います。

- RDSとAuroraの違いと選定するべき理由など
- DynamoDBやElastiCacheなどの違いと選定理由など
- Kinesis、Redshift、Athna、EMR、S3Selectなどの用途

適切なコスト算出が求められるのでストレージの用途や種別の理解は必要だと思います。
とくにS3について多く出題される傾向があると思います。

- EBSの種別と違い
- EFSを選択するシュチュエーション
- S3の種別、ライフサイクルとGlacierについて

最近のモダンアーキテクチャとしてサーバレスやDockerコンテナについての
問題もいくつか出題される傾向にあると思います。
またマイクロサービスアーキテクチャが主流になっているため、
コンポーネント間を連携する仕組みについても問われるかと思います。

- APIGateWay、lambdaなどのサーバレスについて
- ECS、EKSなどのコンテナオーケストレーションツールについて
- SQS、SNSなどのメッセージングサービスについて

クラウドファーストな時代ではありますが、まだまだオンプレミスは多くのこっているので、
AWSへの移行やオンプレとの接続方法についても少なからず問われるかと思います。

- DirectConnectによる専用線について
- StorageGatewayについて
- Snowballによる移行について

## この資格は実務に役立つかどうか
試験である以上合格対策があるため必ずしもこの資格を持っているイコールAWSでインフラを構築できるというわけではないと思います。
しかしながら最近のビジネスソリューションを構築する上では、
AWSを網羅して理解し最適なソリューションを選定する必要があるので一つの指標にはなるかと思います。特に私は最近ではアーキテクチャの設計や選定をすることが多いので勉強してみてかなり役に経ちました。
また限られた時間で文章を読み最適な解答を導き出すということが必要になるので、
ビジネススキルとしても勉強しておいて役にたつと思います。

## まとめ
認定資格登竜門とはいえ勉強しなければ絶対に受からない資格かと思います。
かつ問題の構成がうまいのがやはり**理解**していないと解けない問題ばかりだと思います。
個人的にはコロナ自粛期間に何かしら目に見える結果を残したいと思い勉強してみましたが、
それが形になって素直に嬉しいです。
これをきっかけに次はプロフェッショナルをゆるゆると勉強しようとかなと考えてます。
【Xcode】差分（ファイル名の横のMとかRとか）が表示されない

## GitHubでよくやるリポジトリ作成から開発までのフロー
1. GitHubでリポジトリを新規作成する
2. cloneする
3. cloneしたディレクトリ内にXcodeのプロジェクトを作成
4. git push
5. 実装を進めていく

## Xcodeでよくファイル名の隣にでる差分のアイコンがでない
最初に上記のフローで開発を始めたら、よく見るファイル名の隣の差分アイコンが表示されませんでした。
<img width="289" alt="スクリーンショット 2020-05-18 19.03.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/2e9efc0a-f72f-149b-b521-b0c27b79f595.png">
ローカルブランチとの差分をみようとしても見れない。

## 解決策
`メニュー>Source Control>Create Git Repositories...`を選択して`create`すればOK!
<img width="423" alt="スクリーンショット 2020-05-18 19.05.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/922f0565-a6fc-6755-6109-7c5badcbd173.png">
Flutterでテキストフィールドを囲う色を変える

## やり方

`border：` ではなく `enabledBorder:`で色を設定する。

```dart
TextField(
  decoration: InputDecoration(
    enabledBorder: OutlineInputBorder(
      borderSide: BorderSide(
          color: Colors.green,
      ),
    ),
  ),
),
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309048/700f0fb8-9841-3434-b4c7-37f82ec09141.png)


## 参考
[dart - Flutter - Changing the border color of the OutlineInputBorder - Stack Overflow](https://stackoverflow.com/questions/50334268/flutter-changing-the-border-color-of-the-outlineinputborder)
[Extend InputDecoration borders for disabled/error/focused states by HansMuller · Pull Request #19694 · flutter/flutter · GitHub](https://github.com/flutter/flutter/pull/19694)
【Kotlin】Androidの回転時のカメラプレビュー処理

##はじめに
初投稿です。今回はテストも兼ねてAndroidのカメラプレビューの回転処理をどうするか問題について書いてみます。
私自身初心者ですので内容も初心者向けかもしれませんが、少しでも参考になれば幸いです。

##スマホ画面の向きを取得
```
fun rotationView(){
        appRotation = when(windowManager.defaultDisplay.rotation){//アプリ画面の向き
            Surface.ROTATION_0 -> 0
            Surface.ROTATION_90 -> 90
            Surface.ROTATION_180 -> 180
            Surface.ROTATION_270 -> 270
            else -> //ありえない
        }
・
・
```
縦向きと横向きの２通りにしてもいいです。
##回転時ビューをリサイズするので倍率を決める
後述しますが、videoWidth,videoHeightにはSurfaceTextureの横,縦のサイズが入っています。

```
・
・
        val scaleX:Float = when{
            appRotation == 0 || appRotation == 180 -> videoWidth.toFloat() / videoWidth.toFloat()//1.0倍(縦向きならリサイズしない)
            appRotation == 90 ||appRotation == 270 -> videoWidth.toFloat() / videoHeight.toFloat()//X/Y倍(横向きならリサイズする)
            else -> 1.0f//ありえない
        }
        val scaleY:Float = when{
            appRotation == 0 || appRotation == 180 -> videoHeight.toFloat() / videoHeight.toFloat()//1.0倍(縦向きならリサイズしない)
            appRotation == 90 || appRotation == 270 -> videoHeight.toFloat() / videoWidth.toFloat()//Y/X倍(横向きならリサイズする)
            else -> 1.0f//ありえない
        }
・
・
```
scaleXが横軸(スマホの短い方),scaleYが縦軸(スマホの長い方)の倍率です。
##最後にビューを回転,リサイズする
```
・
・
        val matrix = Matrix()
        matrix.postRotate(-appRotation.toFloat(),videoWidth * 0.5f,videoHeight * 0.5f)//px,pyを起点にスマホの回転と逆回転させる
        matrix.postScale(scaleX,scaleY,videoWidth * 0.5f,videoHeight * 0.5f)//px,pyを起点にリサイズ
        mainView.setTransform(matrix)
    }
```
postRotateでスマホの回転方向と逆向きにビューを回転させます。ただ回転させるだけだとビューが引き延ばされた感じになってしまうので、postScaleで横向きのときはX軸にX/Yを掛けてYの長さに、Y軸にY/Xを掛けてXの長さにリサイズします。
単純にビューの縦横のサイズを指定できれば早いんですけどね．．．。
##あとはsurfaceTextureListenerでサイズを変更する

```
private val surfaceTextureListener = object:TextureView.SurfaceTextureListener{
        override fun onSurfaceTextureAvailable(texture:SurfaceTexture, width: Int, height: Int) {
            //有効になった時
            videoWidth = width
            videoHeight = height
            rotationView()
        }
        override fun onSurfaceTextureSizeChanged(texture:SurfaceTexture, width: Int, height: Int) {
            //サイズが変わった時
            videoWidth = width
            videoHeight = height
            rotationView()
        }
        override fun onSurfaceTextureUpdated(texture:SurfaceTexture) {
            //更新時
        }
        override fun onSurfaceTextureDestroyed(texture:SurfaceTexture): Boolean {
            //破棄された時
        }
    }
```
ビューのサイズが変わったときもwidthとheightを渡すなりすればちゃんとリサイズしてくれます。
もっとこうした方がいいよってのがあれば是非教えてください！
Docker Desktop for Mac をターミナルから起動・終了


普段から `Docker` を使っているわけではないので必要なときだけ起動、不要になったら止める、というのをターミナルでやりたかった訳です。

頻繁に使いそうなので備忘として ＆ 他にそう思っている人もいるかも、と思って記事にしました。

# 試した環境

* macOS Catalina (10.15.4)
* Docker Desktop for Mac ver. 2.2.0.5 (43884)

# 起動

```
nohup /Applications/Docker.app/Contents/MacOS/Docker > /dev/null 2>&1 < /dev/null &
```

ここでバックグラウンドで起動した `Docker.app` の `PID` が出てくるので、終了のときに使うのもいいかもですね。

# 終了

```
ps axww | grep "/Applications/Docker.app/Contents/MacOS/Docker" \
| grep -v grep | perl -lane 'print $F[0]' | xargs kill
```

# 感想

Macに乗り換えてまだ2ヶ月ぐらいですが、macOSはUNIX系の知識を活かせるのがよかですなあ。