OmniAICreator/Qiita-1.07M huggingface dataset:
Arduinoをオシロスコープとして使ってみる

##手持ちのArduinoでオシロスコープ作成

[前記事](https://qiita.com/nobody_gonbe/items/7551c4213fa8e37a771b)で購入した怪しい中華製マルチコインアクセプターで、設定したパルスがちゃんと出ているか見たらなんか思ってた数字が出ていない。
そのためちゃんとしたパルスを見るためにオシロスコープが必要となったが1万円くらいするので買うか微妙に悩んでいたらarduinoを簡易的なオシロスコープ代わりに使えるシステムを九州工業大学が作っていたのでお借りした。

##Arduino簡易オシロスコープを入れる

▼簡易オシロスコープ
https://www.iizuka.kyutech.ac.jp/faculty/physicalcomputing/pc_kitscope

回路や必要な手順についても上ページに記載されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/d16b5bb8-687c-cfbc-5131-d61fb4cf5dcd.png)
下の方にダウンロードボタンがあるのでそこからzipをダウンロードして解凍する。

ArduinoとProcessingが必要とのことなので両方のソフトをダウンロード、インストールして準備する。
▼Arduino IDE
https://www.arduino.cc/en/Main/Software

▼Processing
https://processing.org/download/

##マルチコインアクセプターとの接続

マルチコインアクセプターからはArduinoを壊すような強い電圧は流れないようなので抵抗を挟まずにそのまま繋いだ。
純粋な簡易オシロスコープとして使用する場合は九州工業大学のページに記載されている抵抗をちゃんと挟んで作った方がいい。
いろいろ探したがコインアクセプターのCOUNTERがなんの役割を行うのかの記事が見当たらなかったので、調べるためにCOUNTERをA2に刺して一緒に調べることにした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/8ab2e39f-8981-cf91-b8dd-2935f1bed946.png)

##スケッチの転送
ArduinoをUSB接続してインストールしておいたArduinoIDEを利用して手持ちのArduino nanoにkit_scope.inoを転送して、記憶させる。
続いてProcessingにてkit_scope.pdeを起動し、実行（run）ボタンを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666820/27a23d12-9758-21b7-4948-f0d7b74cfac3.png)
このような画面が出たら成功。

##参考
▼九州工業大学　Arduino 簡易オシロスコープ
https://www.iizuka.kyutech.ac.jp/faculty/physicalcomputing/pc_kitscope
Rust: MariaDB のデータを削除 (Delete)

フォルダー構造

```text
$ tree -L 2
.
├── Cargo.lock
├── Cargo.toml
├── src
│   ├── main.rs
│   └── utils.rs
└── target
    └── debug
```

```text:Cargo.toml
[package]
name = "delete"
version = "0.1.0"
edition = "2018"

#

[dependencies]
diesel = { version = "*", features = ["mysql"] }
chrono = "0.4"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	delete/src/main.rs

					Jul/17/2020
*/
// --------------------------------------------------------------------
use std::env;
use crate::utils::establish_connection;
use diesel::mysql::MysqlConnection;
use diesel::prelude::*;

mod utils;

// --------------------------------------------------------------------
fn simple_sql(key_in:&str) {
	let connection: MysqlConnection = establish_connection();

	let sql_str = "delete FROM cities where id = '".to_owned()
	 + key_in + "'";

	println! ("{}",sql_str);

	connection.execute(&sql_str).unwrap();
}

// --------------------------------------------------------------------
fn main (){
	eprintln! ("*** start ***");

	let args: Vec<_> = env::args().collect();
	let key_in = &args[1];
	println! ("{}",key_in);
	simple_sql(key_in);

	eprintln! ("*** end ***");
}

// --------------------------------------------------------------------
```

src/utils.rs は、こちらのものと同じ
[Rust: MariaDB のデータを読む (Read)](https://qiita.com/ekzemplaro/items/6275e1c853d7abcae1e9)

実行

```bash
cargo run t3324
```
Rust: MariaDB のデータを更新 (Update)

フォルダー構造

```text
$ tree -L 2
.
├── Cargo.lock
├── Cargo.toml
├── src
│   ├── main.rs
│   └── utils.rs
└── target
    └── debug
```

```text:Cargo.toml
[package]
name = "update"
version = "0.1.0"
edition = "2018"

#

[dependencies]
diesel = { version = "*", features = ["mysql"] }
chrono = "0.4"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	update/src/main.rs

					Jul/20/2020
*/
// --------------------------------------------------------------------
use std::env;
use crate::utils::establish_connection;
use diesel::mysql::MysqlConnection;
use diesel::prelude::*;
use chrono::{Local, Date};

mod utils;

// --------------------------------------------------------------------
fn simple_sql(key_in:&str,population_in:&str) {
	let date_mod: Date<Local> = Local::today();
	println!("{}", date_mod);

	let connection: MysqlConnection = establish_connection();

	let sql_str = "update cities set population = ".to_owned()
		 + population_in + &", date_mod = '".to_owned()
		 + &date_mod.to_string()
		 + &"' where id = '".to_owned() + key_in + "'";

	println! ("{}",sql_str);

	connection.execute(&sql_str).unwrap();
}

// --------------------------------------------------------------------
fn main (){
	eprintln! ("*** start ***");

	let args: Vec<_> = env::args().collect();
	let key_in = &args[1];
	let population_in = &args[2];
	println! ("{}\t{}",key_in,population_in);
	simple_sql(key_in,population_in);

	eprintln! ("*** end ***");
}

// --------------------------------------------------------------------
```

src/utils.rs は、こちらのものと同じ
[Rust: MariaDB のデータを読む (Read)](https://qiita.com/ekzemplaro/items/6275e1c853d7abcae1e9)

実行

```bash
cargo run t3322 2398100
```
【初心者向けチュートリアル】Boltを使用してUnityで簡単なゲームを作成する-12

こちらの記事では**音声の実装～exeの出力**を行います。

#音声の実装
前回まででゲーム部分は一通り完成しました。最後にBGMとSEを実装しましょう。

まずBGMを実装します。
Titleシーンに移動して、Hierarchyから右クリック>CreateEmptyを選択してからのオブジェクトを作成し、名前を「BGM」とします。
作成出来たらAudioSourceをAddComponentして、AudioClipに用意したBGMをドラッグ＆ドロップしましょう。
![BoltGame - Title - PC, Mac & Linux Standalone - Unity 2019.3.1f1 Education _DX11_ 2020_07_20 15_50_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/7cff3b14-6b7d-496d-8762-7182b666d455.png)
また、BGMはシーンに入った瞬間再生させたいためPlayOnAwakeはチェックを入れたままにします。
Loopも同じくチェックしたままでOKです。
これで再生すると音楽が聞こえるようになります。
このBGMオブジェクトをコピーしてGameシーンとResultシーンにも設置し、Clipに登録するBGMを変えればBGMの設定は完了です。

次にSEです。
まずボタンを押したときの音声を実装します。
TitleシーンのStartButtonに、先ほどと同じようにAudioSourceをAddComponentして、ボタン用のSEをClipに登録します。
SEはAwakeとLoopの必要がないのでチェックは外しておきます。
設定出来たらSceneChangeButtonグラフに移動して、以下のようにノーツを繋ぎ変えます。
![Screenshot 2020_07_20 15_56_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/1ce5b510-dab2-bd13-cecd-f8e4d6a9a68a.png)
Audio Source:Play()ノーツは自身のAudioSourceに設定されている音声を再生するノーツです。
これで再生し、ButtonをクリックするとSEが聞こえるようになります。
ResultのButtonにも同じようにAudioSourceを取り付けたらボタンのSEはOKです。

あとはアイテムを拾った時の音声ですね。
Gameシーンに移動し、PlayerにAudioSourceをAddComponentして、アイテムを拾った時用のSEをClipに登録します。
次にItemControllerを開いて、SetVariableから以下のようにノーツを繋ぎ変えます。
![BoltGame - Game - PC, Mac & Linux Standalone - Unity 2019.3.1f1 Education _DX11_ 2020_07_20 16_07_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/e0a94682-bca8-b729-bcdc-1fe6dad9f236.png)
Game Object:Find(Name)ノーツはシーンに存在するオブジェクトを名前検索し取得するノーツです。
Component:GetComponent(Type)(一番上のものを選択してください)ノーツは自身にアタッチされているコンポーネントにアクセスできるノーツです。
Audio Source:PlayOneShot(Clip)ノーツは指定したClipを一度だけ再生するノーツです。いくつも音が重なる場合があるときはこちらのノーツを使用して鳴らしましょう。
以上のことを踏まえると、
FindでPlayerオブジェクトを取得する。
PlayerのAudioSourceにアクセス。
登録したSEを再生してアイテムを削除する。
という流れですね。

これで再生しでアイテムを拾うとSEが聞こえるようになっていると思います。
音のバランスが気になる場合はAudioSourceのInspector内Volumeから調整してください！

これで音声の実装は完了です。
ついにゲームが一通り完成しました！

#exeの出力
最後の作業です！
ゲームを実際にexeファイルで遊べるようにします。

BuildSettingからPlayerSettingをクリックしましょう。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/bfeee5d1-ca0e-3148-b474-df2e01f3e4cb.png)
すると設定画面が開くので、以下のように変更して出力時のexeのウィンドウサイズを変えておきます。(1920*1080以外でも16:9の比率であればOKです)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/14b41b1f-74ad-754a-90ae-5e9a0f1dd496.png)
設定出来たらBuildSettingに戻って、右下のBuildから出力しましょう。
出力後すぐ自動でexeが起動してほしい場合はBuildAndRunをクリックしてください。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654796/321b1439-73c0-0db3-f3e0-730519f7f939.png)
保存できると、上のようなUnityアイコンのついたファイルが出来ますので、ダブルクリックすると実際の環境でゲームをプレイが可能になります。

これでexeの出力は完了です。

#最後に
ここまでチュートリアルお疲れさまでした。
目次にも書きましたが、今回のゲームは最低限の機能しか実装しておらずかなりシンプルなので、

・Resultから直接リトライできるようにする
・拾うとスコアが減ってしまうアイテムを作成する
・ゲームが始まる前にカウントダウンを挟む
・次に出てくるアイテムを予告して表示する

など、今まで覚えてきた機能を使って自由に要素を追加してみてください。

また、ここまで完走された方はぜひ感想アンケートにお答えいただけますと幸いです。
https://forms.gle/PA8dXoJiiazFNyex9 (Googleフォームに移動します)
それ以外で何かご意見等ございましたらコメント欄までお願いします。
ではでは、お付き合いいただきましてありがとうございました！
RPA技術者検定とは？ 概要〜勉強方法まで詳しく解説！

こんにちは！
Peaceful morning社でインターンをしている高橋です！
今回とりあげるのは**RPA技術者検定**です！みなさんは、RPAに検定があることをご存知でしょうか。

**・今回在宅勤務などで、通勤などの余った時間を別の時間に使いたい**
**・自分が持つRPAのスキルをアピールしたい**
**・RPAエンジニアとして働きたい**

こんな方々に向けた記事となっています！

###RPAのエンジニアとして働いてみたい方・興味がある方はこちらもご覧ください。

**①事務職から転職したRPAエンジニアが語る仕事の2つの魅力**
https://rpahack.com/attraction-of-rpa

**②RPAエンジニアのキャリア論？キャリアアップに必要な３つのこと**
https://rpahack.com/rpahack_event


##RPA技術者検定について
Winactorを使ったRPAの検定をサービス提供元のNTTデータ社が運営しています。
このRPA技術者検定には4つのレベルに分かれています。レベルは**入門講座・アソシエイト・エキスパート・プロフェッショナル**の4つに分かれています。今回はその4つのレベルについて説明していきたいと思います。


###入門講座
入門講座はRPAとは？ RPAについて知りたい方、まずは**RPAの基礎知識を勉強したい方**を対象としています。

受験料は**無料**となっていて試験はネット環境が整っていれば何処でも受験することが出来ます。
出題数は20問で正答率80％以上を合格としています。入門動画講座を視聴することで試験が受けられます。入門動画講座は無料で視聴が可能となっています。比較的誰でも受けやすく合格しやすいと考えられます。

###アソシエイト
アソシエイトは**Winactorの基礎知識を持っている方や学びたい方そしてシナリオ作成経験のある方**を対象としています。

アソシエイトから受験料**(7,150円税込)**が発生します。全国のCBT試験会場で受験できます。
出題数は50問で試験時間は1時間、正答率を原則70％以上を合格としています。Winactorの概要10問、Winactorのシナリオに関する問題20問、Winactorの機能に関する問題20問の計50問となります。

勉強方法としてはe-learning(https://winactor.com/e_learning/) 講座を受講する、 または検定のサイトに添付されている例題のPDFを参考にすることが主な勉強方法となります。アソシエイトはRPA入門講座からも出題されるため入門講座を受験したら早めにアソシエイトを受けるのがオススメかもしれません。

###エキスパート
エキスパートはアソシエイトの1つレベルが上がったもので、**WinActorについてかなり理解している方や実際に実務経験があり、トラブルなどの急な対応の経験がある方**が対象となります。

受験料は**16,500円（税込）**となっています。
出題数は５問で試験時間が2時間の実技試験となり正答率が60%以上を合格としています。
そしてエキスパートは試験会場が決まっており札幌・仙台・東京・名古屋・大阪・広島・福岡・那覇の８カ所となっています。試験日も決まっておりペースとしては2,3ヶ月に１回となっています。試験範囲は公式サイトに記載されています。

勉強方法としては、ヒューマンリソシア社が提供している研修(https://resocia.jp/corporate/solution/rpa/traning/index.html) をうける、ヒューマンアカデミーが出版している書籍(2020　電子書籍　WinActor ®　RPA技術者検定エキスパート ～実施問題と解説～ https://ec.athuman.com/products/detail/1089) を読むということがあげられます。

###プロフェッショナル
プロフェッショナルはRPA技術者検定の中で１番レベルが高い試験になります。ただ、**プロフェッショナルについては準備中です**。試験は年に1回で面接と実技試験が予定されています。プロフェッショナルを受験するにはエキスパート合格者のみと予定されています。


##これから受験される方に
RPAの需要は年々増えていっているため資格を持っておいても損はないのではないでしょうか。アソシエイトまでは正答率が70％以上なため比較的合格しやすいと思います。RPA HACKというRPA専門メディアにもRPAについて書かれているため是非訪れてみてはいかがでしょうか。

RPA技術者検定↓
http://watest.jp/index.html

##Winactorについてもう少し詳しく知りたい方
この記事を読んでWinactorについての知識をつけたいとお考えの方にむけて、こちらの記事をおすすめします。

**WinActorがさらに進化！ WinActor Ver.7を解説**
https://rpahack.com/winactor_ver7

**純国産RPA『WinActor®』とは？歴史～特徴まで完全ガイド**
https://rpahack.com/winactor


##RPA HACK おすすめ記事 3選
RPA HACKを少しでも気になった方にむけてこちらの記事をおすすめします。
RPA HACKでは100本以上の記事が無料で読めます！

1.**「自動化が進む世界で、時代に合わせて変化する人を応援したい――藤澤専之介氏インタビュー」**
(弊社代表のインタビューです。弊社の思いであったりビジョンがわかります！)
https://rpahack.com/sennosukefujisawa_interview

2.**「UiPath StudioXの基本をマスター！～画面構成/カード/アクション」**
(RPAツールであるUiPath StudioXの使い方を丁寧に解説しています！これからRPAを使ってみたいという方にはおすすめです！)
https://rpahack.com/uipath_studiox_1

3.**「RPAの導入事例　部門ごとに事例を紹介！」**
(RPAが実際どんな業務に使われているのかイメージがつかないという方におすすめです！)
https://rpahack.com/rpa-casestudy

この他にも、RPA関連の情報を随時更新しています！ご覧ください！

最後まで読んでいただき誠にありがとうございました！
テーブルのデータをマークダウンにしたい？

それ、 [DBeaver](https://dbeaver.io/) なら簡単にできますよ、というお話です。

# 手順

![20200720_dbeaver_markdown.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141299/465853d9-9b29-86fb-a12b-69b95e6f73eb.gif)

マークダウンにしたい行を選択して、右クリックします。GIF では全ての行を選択していますが、1行ずつ選択することもできます。

次に、 **高度なコピー** から **Copy as マークダウン** を選択します。すると、マークダウン形式でクリップボードにコピーされます。

例えば、こんな感じです。

```
|id|memo_id|name|created_at|updated_at|
|--|-------|----|----------|----------|
|1|1|キーワード1|2020-07-20 13:37:41.0|2020-07-20 13:37:41.0|
|2|2|キーワード2|2020-07-20 13:37:41.0|2020-07-20 13:37:41.0|
```

# Qiita に貼り付ける際の注意点

DBeaver で生成したマークダウンを Qiita の記事に貼り付けても、うまく解釈されないことがあります。

それは、**カラム名の文字数が3文字未満の場合** です。

例えば、先ほどのテーブルには `id` というカラムがあり、その下に `|--|` と生成されています。

DBeaver は、カラム名の文字数分、 `-` （ハイフン）を生成します（ [ソースコード](https://github.com/dbeaver/dbeaver/blob/7.1.3/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/exporter/DataExporterMarkdownTable.java#L108) ）。カラム名が **2文字** （ `id` ）なので、 `-` も **2文字** 生成されています。

しかし、Qiita では `-` が **3文字以上** ないと、表として認識してくれません。[^1] `|-|` や `|--|` ではダメで、`|---|` とする必要があるのです。また、これは1番左の列だけでなく、表のどこかしらに、そうした箇所があるとダメなようです。

[^1]: `:` （コロン）を使う場合は、コロンを含めて3文字以上必要です。 `|:-|` ではダメで、 `|:--|` としなければなりません。

ということで、先ほど生成したマークダウンを以下のように修正します。

```
|id|memo_id|name|created_at|updated_at|
|---|-------|----|----------|----------|
|1|1|キーワード1|2020-07-20 13:37:41.0|2020-07-20 13:37:41.0|
|2|2|キーワード2|2020-07-20 13:37:41.0|2020-07-20 13:37:41.0|
```

すると、このとおりキレイに表示されます！

|id|memo_id|name|created_at|updated_at|
|---|-------|----|----------|----------|
|1|1|キーワード1|2020-07-20 13:37:41.0|2020-07-20 13:37:41.0|
|2|2|キーワード2|2020-07-20 13:37:41.0|2020-07-20 13:37:41.0|


# 感想

ということで、 DBeaver を布教したい今日このごろです。[^2]

[^2]: 前職は macOS で開発する環境だったけど、なぜかみんな [Sequel Pro](https://www.sequelpro.com/) を使っていて、DBeaver を使っている人は自分以外には1人しかいなかった。そしてみんなから「タブを閉じただけで Sequel Pro がすぐにクラッシュするんだけど対処法知らない？」と聞かれたんだが、そんな不安定なソフトを無理して使わんでも...
IEと少し仲良くする方法

##　前置き

HTML/CSSの不具合で、
「IEだけアイコンが見切れてるけど？」とか
「IEだけアイコンの位置がズレてるけど？」
みたいな不具合をよく見かけます。

その際の解決策を少し紹介できればなーと。
（間違っていたらごめんやで！こっそり教えてください！）

## IEあるある その1 「IEだけアイコンが見切れてるけど？」

SVGファイルに、

```
viewBox="n n n n"
```
の記述があるか確認しましょう。
無い場合、アイコンが見切れてしまいます。

ちなみに**viewBox**ってなんやねん！
って思う人いるかもしれないです。

説明すると
https://www.indetail.co.jp/blog/13002/
という訳です。

### 解決策

SVGには**viewBox**をちゃんと書きましょう！

## IEあるある その2 「IEだけアイコンの位置がズレてるけど？」

これは主に**display:flex**を使っている時に起きがちです。
ちなみにアイコンの位置以外にも、**display:flex**を使って
レイアウトを調整している際によく起きます。

原因はflexアイテムの伸び率、縮み率の設定にあります。
それぞれの説明はMDNとか適当に見てください。
https://developer.mozilla.org/ja/docs/Web/CSS/flex

```
flex-grow: 1;
flex-shrink: 0;
flex-basis: 200px;
```
こやつらです。
この内の**flex-basis**を設定しないとバグります。

また、ショートハンド記法でも同様で、

```
flex: 1 30px;
```
こんな風に書くとバグります。
（左から順にflex-grow、flex-shrink、flex-basis）

上記の場合、flex-basisが記載されていない為、
IEが勝手に**flex-basis:auto**と解釈します。

**flex-basis:auto**なんだから
そりゃレイアウト崩れるよねって感じです。

### 解決策
**flex-basis**をちゃんと設定しましょう！

## まとめ

大した内容では無いですが、
**display:flex**を使ってレイアウトが逝ってしまった時、
確認する箇所として参考にして頂けたらと思います。

また、個人的な感想ですが、IEは基本全て定義してあげた方が安全です。
定義しないと、**auto**と解釈されがちなイメージです。

まあ、IEのような~~クs~~使いづらいブラウザは使わないのが
一番いいんですけどねー。
あと数年は我慢です。
MATLABでかんたん動画作成

#MATLABでかんたん動画作成

##はじめに
MATLABで動画作ってTwitterに上げたい！　みたいな動機で、**MATLABで動画を作成してmp4に書き出す**ことをやってみました。
その時のコードを備忘録もかねてこちらにまとめておきます。
この例ではバーバーポール（美容室にあるやつ）もどきを3Dで作製して連続表示しています。

##できるもの
これがくるくる回ります。
かわいいね！
![barbarpole.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677514/28856f6e-fb34-fe6d-0d2e-7ab54f10c700.jpeg)



##コード

```matlab

figure();

% 表示する図の準備
t = (0:0.1:10);
f = 1;
% 余談ですがMATLABだとiは虚数なのでiiを使っています
for ii = (0:0.3:6)

    for jj = (0:0.02:1.6)
        plot3(cos(t-ii+jj), sin(t-ii+jj), t*2, 'r-');
        plot3(cos(pi/2+t-ii+jj), sin(pi/2+t-ii+jj), t*2, 'w-');
        plot3(cos(pi+t-ii+jj), sin(pi+t-ii+jj), t*2, 'b-');
        plot3(cos(3*pi/2+t-ii+jj), sin(3*pi/2+t-ii+jj), t*2, 'w-');
        hold on;
    end

hold off;
grid on;
xlim([-3 3])
ylim([-3 3])

% 今回はなくても問題ないです
drawnow;

% getframe()でも動いて、その場合はまた少し違った図になります
% が、途中で表示範囲を変えたりするとエラー吐くのでgetframe(gcf)の方が安全だと思っています
myMovie(f) = getframe(gcf);

f = f+1;
end

% 好きな形式で書き出し
% 保存場所はコードと同じ場所です
v = VideoWriter('myMovie.mp4', 'MPEG-4');
% ゆっくり表示したかったのでフレームレートを初期値より下げています
v.FrameRate = 10;
open(v);
writeVideo(v, myMovie)
close(v);

```


##おわりに
~~いかがでしたか？？~~
MATLABは動画作成ソフトではありません。
【AWS】MFAを有効にしているユーザでCLIを利用する方法

# はじめに

MFAを設定しているユーザでAWS CLIを利用してみたいと思ったので、試してみました。

# 利用方法

## アクセストークンの設定

ユーザのCLIアクセストークン等の情報は事前に発行しておいてください。

```sh:基本情報設定コマンド
aws configure
```

下記4点の情報について入力を求められるので、ユーザの認証情報を入力してください。

```sh:基本情報設定コマンド実行結果
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
```

## CLI上でMFA認証

ターミナル上で下記の文を実行します。

```sh:MFA認証を実行する
aws sts get-session-token --serial-number [[自分のMFAデバイスのARN]] --duration-seconds 86400 --token-code [[MFAデバイスの認証コード]]
```

**自分のMFAデバイスのARNの確認方法**
AWSマネジメントコンソールの`ユーザー`タブから、確認したいユーザのページを開きます。
`認証情報`のタブを開き、赤枠内に記載されているARNを利用します。

![0720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/da2015a6-c53d-ebdf-7836-9d2b4fe498d5.png)

**--token-codeの確認方法**
自分が設定しているMFAの認証機器上でコードを確認してください。

## MFA認証実行後の設定

MFA認証を実行すると、下記のような認証結果が返却されます。

```sh:MFA認証の実行結果
{
    "Credentials": {
        "AccessKeyId": "AccessKeyIdxxxxxxxxxxxxxxxxxxx",
        "SecretAccessKey": "SecretAccessKeyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "SessionToken": "SessionTokenxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "Expiration": "202X-XX-XXTXX:XX:XX+00:00"
    }
}
```

実行結果を元に、認証情報を設定します。
`--profile`で名前を付けて認証情報を設定します。
今回は、「mfa-user」という名前で認証情報を登録します。

`~/.aws/credentials`に情報を登録します。

```sh:credentialsの末尾に追加する内容
[mfa-user]
output = json
region = ap-northeast-1
aws_access_key_id = AccessKeyIdxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = SecretAccessKeyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws_session_token = SessionTokenxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

# 実行確認

上記の設定で、`mfa-user`というプロファイルでCLIが動作するようになっていると思います。

実行できるか確認してみましょう。

```sh:確認用コマンド
aws s3 ls --profile mfa-user
```

正常に設定されていた場合、エラーでは無く、s3のバケット一覧が表示されるはずです！
s3のバケットが1つも無い場合は1つも無い旨のメッセージが表示されます。

# まとめ

MFA認証を有効にしたまま、CLIを利用する方法をまとめてみました。
今までは、AWSマネジメントコンソールから操作していましたが、今後は、CLIを積極的に利用していきたいと思います。
【C#】Webclientクラスを用いてHTTP通信をする。

メモとして残します。


#■やり方
```c#
Uri url = new Uri(Path.Combine("https://hoge.com", "api.php"));

//WebClientオブジェクトを作成
var wc = new WebClient();
var ps = new NameValueCollection();
// ヘッダを設定
wc.Headers.Add("user-agent", "hogebrowser");  
////送信するPOSTデータを設定
ps.Add("i", "hoge");

////リクエストしてレスポンスを変数へ
byte[] response = wc.UploadValues(url, ps);
wc.Dispose();// オブジェクトを破棄


```
【WordPress】docker-composeを使ってWordPress開発環境をたった3分で構築する

# はじめに

【この記事は**5分**で読了できます】

docker-composeを使ってWordPressの開発環境をたった3分で爆速構築します。
(まだpullされていないimageをpullする時間は除きます。)

今回はDockerの[公式ドキュメント](https://docs.docker.com/compose/wordpress/)(英語)を参考に進めますので、英語のドキュメントが読める方はそちらをご参考ください。

## 動作確認環境

- macOS Catalina (ver. 10.15.5)
- Docker Desktop for Mac (ver. 2.3.0.3)

## 手順

実際にやっていきましょう！

### 1. ディレクトリの作成

新しくディレクトリを作成します。
今回は[my_wordpress]という名前にしました。

```console
mkdir my_wordpress
cd my_wordpress/
```

### 2. docker-compose.ymlの作成

先ほど作ったディレクトリ直下にdocker-compose.ymlファイルを作ります。

```console
touch docker-compose.yml
```

docker-compose.ymlに以下の内容を記述します。

```yml:docker-compose.yml
version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}
```

### ビルド

docker-composeでビルドします。
detachedモードで起動する```-d```オプションをつけています。

```console
docker-compose up -d
```

### WordPressの起動

ブラウザでWordPressを起動します。
Docker Desktop for Mac (or Windows)の場合、<http://localhost:8000>にアクセスします。

### 言語選択

アクセスすると以下の画面になります。
お好きな言語を選択してください。（日本語もあります。）
![wordpress-lang.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235035/53ee92c9-fa92-b4f2-f1fb-315ff1876758.png)

### フォーム入力

次に以下の画面になります。
必要な情報をフォームに入力し、Install WordPressをクリックします。
![wordpress-welcome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235035/5670a804-79a7-bb0c-6733-a5d88e49c2fb.png)

### WordPress開発環境構築

無事WordPress開発環境が構築できました！やったー！

### 終了コマンド

以下のコマンドで終了できます。

```docker-compose down```
コンテナとデフォルトのネットワークを削除しますが、WordPressのデータベースはそのまま保持されます。

```docker-compose down --volumes```
コンテナとデフォルトのネットワークを削除し、WordPressのデータベースも削除します。

## 参考サイト

cf. https://docs.docker.com/compose/wordpress/
CS50 TidemanのおかげでRecursionを少し理解する

(9/18追記)
8月に42Tokyoの試験を受けることができ、合格しました。試験を通して、recursionについてかなり理解が深まりましたので、整理して別に書き直します。この記事は、こんな理解だったのかという記録の意味で残しておきます。

#はじめに
初めての投稿です。勉強したことを記録に残していくことで、振り返りを行い、学習効果を高めることと、同じような躓きをする方に役立てばという考えで始めました。

#CS50に取り組んだ経緯
プログラミング初心者で、もともと42Tokyo(https://42tokyo.jp) の試験を3月に受ける予定でしたが、コロナの影響で延期となってどうしようかと考えていたところ、海外のキャンパスの生徒の方が「試験が延期になって凹んでいる人はこのコースをやるといいよ」と勧めていたのがCS50というオンラインコース(https://online-learning.harvard.edu/course/cs50-introduction-computer-science) でした。

#Tideman
Tideman(https://cs50.harvard.edu/x/2020/psets/3/tideman/) はこちらのコースのAlgorithmの回の宿題で、初心者にはかなり難しいものだと思います。実際、[CS50 tideman]と検索するとstack overflow やredditなどでどうやって解けばいいんだというやり取りを多数見つけることができます。どういう問題か、簡単に説明すると選挙の方式の実装です。候補者に対して、有権者はランクをつけてAさんは１位、Bさんは２位、Cさんは３位というように投票を行います。このランクづけの結果、AさんはBさんに勝っている、BさんはCさんに勝っているということが決まり、候補者間の勝ち負けの有向グラフができます。最終的にグラフで誰にも指されていない（負けていない）候補者が当選となります。グラフを作る際に、サイクルを作らないように（全員が誰かに指されてしまうと当選者を決められないので、優先順位付けをしてそうならないようにする）、Recursion(再帰)を使って上手く処理をしなければなりませんが、ここが難しく、私も3日くらいはまってしまいました。

#参考になった動画
CS50のTAの方がRecursionとCall stackについて説明しています。これらの動画がかなり理解を助けてくれました。Call stackというのは関数の呼び出し(call)が重なっていく(stack)ことで、このイメージをしっかり持つことがRecursionを理解するのにとても重要だと思いました。実際、図を書きながら、自分の書いたコードがどういう順番で処理をされていくかを逐一追って、ようやくクリアできました。

Recursionについて
https://www.youtube.com/watch?v=mz6tAJMVmfM
Call stackについて
https://www.youtube.com/watch?v=aCPkszeKRa4

#Returnの仕方も重要
Recursionを使う際、呼び出した関数から値を返してもらうことが大事です。最初は以下のコードを書いてうまく行きませんでした。これは、Tidemanで重要な候補者間の優劣を示すグラフがサイクルを描かないようにチェックをするための関数で、true / falseを返します（私を含めて、ここで多くの方がハマるようです）。

```
bool check_cycle(int w, int l)
{
    int i = 0;

    while (i < candidate_count)
    {
        if (locked[i][w]) //find lock to point winner
        {
            if (i == l)
            {
                return true;
            }
            check_cycle(i, l) //ここで関数を再び呼び出すけど、これではダメだった
        }
        i++;
    }
    return false;
}
```
上の書き方での問題はcheck_cycle(i, l)の結果がtrueになっても、呼び出し元に返っていないので、いつもfalseになってしまうことでした。そのため、下のように直すことで想定通りの動きをしてくれるようになりました。

```
bool check_cycle(int w, int l)
{
    int i = 0;

    while (i < candidate_count)
    {
        if (locked[i][w])//find lock to point winner
        {
            if (i == l)
            {
                return true;
            }

            if (check_cycle(i, l))//こうすればちゃんとtrueが返る
            {
                return true;
            }
        }

        i++;
    }
    return false;
}
```

#まとめ
概念が難しくて、苦手意識を持っていたRecursionを使うコードを一から自分で考えて書くことができました。少し慣れたというか、使えるイメージがついてきたので、使うべき時にはどんどん使って、習熟していきたいです。
交渉アナリスト２級・オンデマンド講座受けました！

PMという職種上、ほとんど全ての人との関わり合いが交渉ごとだ思い、交渉が上手くなりたいという一心で、たどり着いたのが交渉アナリスト２級。
会社で、この資格の支援をしているということもあり、早速受けることにしました。

私が受けた方法は、日本交渉協会のビデオOnDemand講座。

教材が届き、受講開始。

仕事が忙しいので、朝早く起きて、毎日散歩の前に１時間勉強することにする。
模擬テストも含めて賞味二週間弱で完了予定！

教材は：

テキスト
ワークブック
オンラインビデオ


各章のビデオを最初に見て、テキスト片手に、ワークブックにチャレンジするという方法。

実際に初めて見ると、価格交渉の話から入り、「価格交渉よりも、どうやったらWinWinにできるのかな」という疑問を抱きつつも、価格交渉は交渉の基本ということのようなので、我慢して一つ一つこなしてゆくことにした。

テキストは比較的量が多く、読むのに数日かかるが、ビデオを先に見て、テキストを読むと重複しているところが結構あるので、積読する必要がないことが判明。中盤は、不必要に時間を費やすことをやめ、ビデオで学習し、必要なところだけテキストで補完するようにしました。

（ただビデオの講師の喋り方が非常にスローなので、1.5xで聞いてました。）

以下自分用にまとめ（細かいことは、テキストに書いてある通りなので省略）

## 価格交渉の構造
　出発点、目標点、留保店など。相手の留保点（もうこれ以上譲れないPOINT)がわかれば締めたもの。あまり現実的ではないが、構造として理解できました。
### Zopa
Zone of possible agreement. もしお互いの留保点がオーバーラップしていたら、交渉は成立する可能性大
### Batna
Best Alternative to negotiated agreeement. これを持ってると、交渉に有利に立てる。　もし交渉が決裂しても、代替案はあるから大丈夫！
### 交渉力
肩書きとか（弁護士、交渉士、上司、社長など）、資源、正当性、個性などが交渉力に影響を与える。
### アンカリング
これは、いいです。まず最初にこちらからオファーを出して、相手に「お、ここが交渉のスタート地点か」と思わせることにおり、交渉に優位に立てる。


## 交渉手順

### 交渉準備
これ重量。情報の収集や分析など。
### ファーストオファー
最初にオファーをした側が優位に立つ。そのオファーが相手にアンカリングされる。
### 交渉ダンス　
相互に情報交換を行い、譲歩を繰り返しながら、解決策の方向性を探ること。
### クロージング
最後の合意形成。PNNも重要！
### 交渉倫理（嘘ついてもいいの？）
→この部分は、正解はなく人によって回答は異なるところ。ただ騙すことはしてはいけないと思います。


## 交渉の二つのタイプ
### 分配型交渉　
パイの大きさは決まっているので奪い合い
### 統合型交渉
パイの大きさを大きくして、WIN WINに持ってゆく

## 交渉の心理
### 個人の認知・バイアス
- 行動のエスカレーション
- 迷信：ぱいの大きさは決まっている
- アンカリング
- フレーミング（アンカリングと違い、考え方の方向付けのこと。本書では、あまり取り上げられていたなかった）。
- 選択的知覚（自分の好みの情報を採用してしまうなど）
- 勝者の呪縛（相手のことを考えずに、勝つことにみに囚われる）
- 自信過剰

### 影響力
- 社会的証明（今、一番人気！）
- 好意
- 権威（医者、弁護士）
- 希少性

### 組織の意思決定の罠
### グループ・シンク（強制力による同調）
### リスキーシフト（強い気持ちが共鳴して、個人ではしないような決断）

その他、いろいろなツールがあったが、全部網羅できないのでここでは割愛。


## ワークブックのテストを受けて

オープンブックではあるが、やはり学んだことを理解していないと回答はできない内容。学習ほやほやだったので、割とスラスラ回答できた。ただ手記なので、漢字が思い浮かべられないことが多々あったので、その都度漢字をググるという始末。。。

### そしてテスト結果はー＞合格！

と、かなり盛り沢山な内容で、なんとなく今までやっていたこともあったりとかあるが、体系立てて学べたので、この知識を生かして、今後の交渉に活用してゆきたいです。

今、学習意欲がかなり上がっているので、この勢いに乗じて、交渉アナリスト補も受けることにしました。
Elastic Beanstalkでデプロイする際に、No such file or directory: '/var/app/ondeck/' と表示される

# はじめに
Elastic Beanstalkに構築したLaravelアプリケーションのデプロイの際に「No such file or directory: '/var/app/ondeck/'」と表示され、デプロイに失敗しました

# 環境
```bash
$ php artisan -V
Laravel Framework 6.18.25
```

Elastic Beanstalkプラットフォームバージョン : PHP 7.3 running on 64bit Amazon Linux2


# エラー内容
```bash
$ eb logs
----------------------------------------
/var/log/eb-engine.log
----------------------------------------
・
・
・
2020/07/20 14:17:25.467640 [ERROR] Error occurred during build: [Errno 2] No such file or directory: '/var/app/ondeck/storage'
2020/07/20 14:17:25.467671 [ERROR] An error occurred during execution of command [app-deploy] - [PostBuildEbExtension]. Stop running the command. Error: Container commands build failed. Please refer to /var/log/cfn-init.log for more details. 
```

# 対応方法
プラットフォームのバージョンを「PHP 7.3 running on 64bit Amazon Linux2」から「PHP 7.3 running on 64bit Amazon Linux」に変更して、対処しました
（Amazon Linux2系を使用するのをやめました）

# まとめ
Amazon Linux2では、「/var/app/ondeck」のフォルダがなくなったようです
抜本的な解決になっていませんが、お困りの方は参考にしてみてください

# 参考
[AWS Developer Forums: Server stuck in a loop (eb-engine.log)](https://forums.aws.amazon.com/thread.jspa?threadID=322881)
Amplifyでpush前のバックエンドに強制的に戻す方法

# はじめに
Amplifyで作成したバックエンドは、権限設定などリソースが複雑に絡み合ってくると、誤ったリソースの削除を行ってしまった場合など、`$amplify push`のコマンドを入力しても途中でエラーになってしまい、もうどうしようもない、、、ということが起きがちです。

何も知らなかった開発段階では、泣く泣く`$amplify delete`をして、一から作り直していたことも有りました、、、。(これが辛いのなんのって。)

本番環境をリリースしてから、そんなスクラップ&ビルドはできませんので、今回はそんなときの対処法を記録として共有します。
(これも暫定的な方法なので、早くamplifyさんこのあたり改善してくれないかな、、、)

# 対処法の流れ
## 事実を受け止める
修復する方法ないか出来る限り検証はしたほうがいいですが、素直に自分がやってしまった過ちを受け入れましょう。

## 過ちを正す
`$amplify push`が一切できなくなってしまった要因を見つけだし、動いていた頃のコードに修正します。


## 新しい出会い
ここでenvコマンドの登場です。
以下の流れで、別のバックエンドの環境を構築し乗り換えます。

```console
$ amplify env add
 Do you want to use an existing environment? No
? Enter a name for the environment testdev // 名前は適当でOK
$ amplify env checkout testdev
$ amplify push
```

## 過去との決別
壊れて動かなくなってしまったこれまでの環境に別れを告げます。
ありがとう、、、そしてさようなら、、、

```console
$ amplify env remove dev
```
このとき以下のようなエラーが出て、お別れに失敗することがあります。

```console
App d1bqk0orw288u not found.
```
これは、GUIのamplify設定でホスティングの登録した際の紐付けが怒られています。GUIからamplifyを開き、紐付けを解除しましょう。
その後、アプリID(上記の場合は`d1bqk0orw288u`)をローカルのamplifyフォルダで検索をかけると2箇所出てきますので、その項目を削除します。
再度removeコマンドを打てば、完全にお別れができます。

## 復縁
やっぱり、君じゃなきゃだめだ、、。

``` console
$ amplify env add
 Do you want to use an existing environment? No
? Enter a name for the environment dev
$ amplify env checkout dev
$ amplify push
```
## そしてお別れ
この子のおかげで、また出会うことができました。本当にありがとう。
これで壊れた関係を無事修復することができました。

```console
$ amplify env remove testdev
```
# アフターフォロー
これでバックエンドは完全復活しました！！1から自分で作り直すことを考えれば、めちゃめちゃ早くシンプルに解決できました。
ただ、amplify以外のGUIで設定した箇所については、再度設定し直す必要があります。
以下は参考までに記載しておきます。

## Amplifyコンソール
再度gitのブランチと復活したバックエンドを結び直します。

## API Gateway
Lambda関数は、同じfunction名で作成されていますが、全く別物になるため、再度functionの紐付けを全て行いましょう。

- functionの再度紐付け
- オーソライザーの再設定

CROSのエラーがでることあり。再度CROSの有効化をやってデプロイしたら解消しました。

## Cognito
結構GUIで設定してしまっていること多いので、注意が必要です。

- ソーシャルログイン設定
    - OpenID Connect設定
    - マッピング
- 検証メール設定
- Lambdaトリガー(サインアップ前にcreateUserを紐付け)
- デバイス

## DynamoDB
DBも完全に初期化されているため、必要な初期データの流し込みを行います。これ忘れているとエラーいっぱい起きますので、ちゃんと行いましょう。

## aws-exports.js
こちらのフォイルも更新されているため、開発メンバーに周知しましょう。

# おわりに
できればこれもやりたくはない作業ですが、dev環境であれば、修復ができるようになりました。もしprodでこれがおきたら、、、

必ず開発環境内で検証をしっかりと行っていきましょう！！

引き続き、効率的な開発に向けてamplifyとはより深いお友達になっていきたいと思います！

# 参考
https://github.com/aws-amplify/amplify-cli/issues/1406
AWSでデプロイして放置してたらアクセス拒否された件

#初デプロイから2週間、スプリントレビューでメンターさんに動作確認してもらおうとしたら・・・

そんな不思議なトラブルのお話です。

TECH CAMP最終課題カリキュラム中、私はデプロイ担当をしております。

そして迎える初スプリントレビュー、本番環境見せようとしたら・・・


**アクセスが拒否されました(確かこんな文面)**
スクショ撮っておけばよかった。

？？？


おそらく私含め、チームメンバーもそんな顔してたような気がします。
ハナからできてなかったんならまだしも、一度は成功してたんですから。

よくわからないのでインスタンスの再起動やら一度停止、起動を経てもういいやと再デプロイ、すると・・・

<img width="1278" alt="1eeca22305ed9d2611dc51d814045929.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629020/425c6450-c776-2ff1-228f-f12c704fd9ff.png">

ググったところ、NGINXのホーム画面のようで、これが出るということは、
Elastic IP設定するファイルにElastic IPがちゃんと書けてない(誤字ってる)
という記述を発見、ならイージーモード。秒で直せばいい。

いやElastic IP合ってるんですけど？

デプロイの勉強会用のQiitaをいくら見ても何が間違ってるのかわからない。
ググってもわからん。

チームメンバーもあれこれ助言してくれますが、解決に至らず...
メンターさんへの相談も視野に入れつつ、3度目の正直の再デプロイ。

作りかけのほぼ白紙のwebページが見事表示できましたとさ。

ここで仮説。
**デプロイ後、一定時間放置してたら、AWS側で「これいらないのかな？」と判断してアクセス弾く説。**
大穴の考えとしてはアクセス集中で弾かれるということもありますが、Elastic IPなんざそんな誰も彼も知ってるわけじゃないんだから。この線は薄いと思います。
仮に総当たり攻撃的な感じで打って入ったんだとしても、Basic認証もあるので、一定の硬さはあるはず。

体感で思っただけなので、むしろその辺り知ってる人いたら教えてください。
お願いします。
Matplotlibでx軸のラベルが見切れるときの対処

　Matplotlibを使っていて普段はラベルの文字に問題ないが、スライド用や論文用に文字サイズを大きくすると、x軸のラベルが見切れてしまうことがある。
　よく遭遇する問題だがピンポイントに解説している記事が調べた限り見つからないので書き残しておく

###見切れる例

```python
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.size'] = 46
plt.rcParams['lines.linewidth'] = 3
x = np.linspace(0, 2 * np.pi)
y = np.sin(x)
plt.plot(x, y)
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
```
実行結果は次の図のようになる。
![bad2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257157/a2eaa78d-4e08-2b5c-71fa-6151aa98862d.png)

赤丸つけたところが見切れている。
###見切れなくする
グラフの描写範囲の設定を変えることでx軸のラベルを見きれない用にできる。
グラフの描写範囲の下限の設定は、```matplotlib.pyplot.rcParams['figure.subplot.bottom']``` に格納されている。これがデフォルトだと0.11になっていて、下から11%の領域までグラフが描かれてしまうため、x軸のラベルが入り切らない。これを15%(0.15)くらいに変更すればいい。

```python
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.size'] = 46
# 次の一行を書いておく
plt.rcParams['figure.subplot.bottom'] = 0.15
plt.rcParams['lines.linewidth'] = 3
x = np.linspace(0, 2 * np.pi)
y = np.sin(x)
plt.plot(x, y)
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
```
![good.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257157/66d2a84d-29b6-e71e-f1d0-613750e79f08.png)
審査へ提出 審査へ提出するための項目が足りません エラー

App store connectのUIに変更が入っていますね。

いつもの感じで審査にすすめるために **審査へ提出** ボタンを押したところ

> 
審査へ提出するための項目が足りません
提出には下記の項目が必要です：
広告ID（IDFA）の利用に関する正しい回答を選択していることを確認してください。AppにIDFAが含まれていて「いいえ」を選択した場合は、バイナリが恒久的に却下されます。この場合、新しいバイナリを提出する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6327/40b7b040-bad2-afe7-3f6f-d922de419216.png)

とエラーが出てしまいました。

ん？え？どこ？となりましたが、画面一番下にありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6327/c5ebbe65-fe2e-41a2-fe1a-cbd8bd315eac.png)

もともと、**審査に提出** を押した次の画面にあった項目でした。バージョン別のページ一番したに移動したようです。
【初心者向け】VSCodeでDjango-htmlを自動整形したいときに躓いたのでメモ

##はじめに
この記事では__Django-htmlのフォーマッター__（厳密に言うと違うけど）をVisual Studio Code上で動かすのに困った点などをまとめる。

Django-girlsとかから取り敢えず初めて見たけど、
__「there is no formatter for 'django-html' files installed('django-html' ファイルのフォーマッタがインストールされていません。)」__って出て苦戦してる人向け。

##Formatterとは
__コーディングは見やすさが命。__

記述パターンを統一することで可読性が上がり、純粋な作業効率のUPだけでなく
スムーズなチーム間共有にも繋がる。あと見やすいとモチベも向上する。

それを__自動でお手伝いしてくれる__拡張機能(とか)が、いわゆる__コードフォーマッター__。
便利な世の中になったよね。

##実行環境
 - Windows10 64bit
 - Visual Studio Code v1.47.2


##留意点

手順的には割とあっさりなので、仕組みが分からずなんでやねんと試行錯誤した部分を先に走り書きとしてまとめておく。

 - VSCodeの内部にも__js-beautify__というフォーマッターがあり、実は結構これで色々できる。けど__使用するスタイルを変更する機能がない__ので断念。
 - Extensionsとしては__prettier__とかが有名。だけどhtml,css,jsとかに対応してる一方でDjango-htmlはこちらも__非対応__だった為断念。（settingうまく弄ればいけたかも？
 - __beautify__はjs-beautifyで出来ない設定を可能にし、拡張性をもたらすアドオン。今回はこれを使用。
 - __留意点として、Django-html用のformatterは、2020年7月現時点では存在しない__(多分)。
今回はhtml扱いのなかで、Django-htmlをフォーマットしているため、Djangoテンプレートとの融和性は低め。なので__すべてがきれいに整えられるわけではないことに注意。__

##導入手順
#####１．Ctrl+Shift+xで`beautify`を検索、install
![tes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217271/cb4f093a-5951-693b-d4f7-b0f007167086.png)

#####２．Ctrl+,でsettingsから、右上の.jsonで開き以下を追記

```json:setting.json
  "beautify.language": {
    "html": [
        "htm", "html", "django-html"
    ]
  }
```
#####３．保存してVSCodeを再起動

#####４．編集中のdjango-htmlでフォーマットしたい範囲を`Ctrl+K Ctrl+F`で選択、フォーマット。（全体で行うときはShift + Alt + F）

#####終わり。

###思ったこと
最初は「拡張子htmlなのにエンコードされない、ぐぬぬ..」とかれこれ１時間ほど設定を見直していたが、Django-html用のformatterがないという初歩的な勘違いだった。おかげでjs-beautifyとprettierの特徴や違いが学べたから良しとしよう。

Djangoはbeautifyでjsはprettierとか言語別でフォーマットをしておくと便利かも。

ちなみにVSCode内蔵のformatを指定するときはこう↓

```json
"editor.defaultFormatter": "vscode.html-language-features"
```



最後までお読みいただきありがとうございました。

###参考にしたサイト
[GitHub - There is no document formatter for 'django-html'-files installed. #65189](https://github.com/Microsoft/vscode/issues/65189)
[stackoverflow - There is no document formatter for 'django-html'-files installed](https://stackoverflow.com/questions/55175822/there-is-no-document-formatter-for-django-html-files-installed)
[Beautify HookyQR - VisualStudio Marketplace](https://marketplace.visualstudio.com/items?itemName=HookyQR.beautify)
[VSCodeにおけるDjango-htmlのformatterについて](https://qiita.com/ajim/items/b46292e21cc8d0160b06)
Deviseでログイン前のルーティングを設定する

#やりたいこと
Devise導入した状態で、
ログイン前後のルーティングをカスタマイズする。

#前提
Deviseをインストールすると、デフォルトではルートパスが/users/sign_inとなっている。
そのため、ログインしていない状態でtopページへ行こうとするとdevise側で勝手にサインインページに飛んでしまう。

#方法
ログインしていない状態で特定のページへ遷移させたい場合は
`  before_action :authenticate_user!
`
を該当コントローラーに記述する必要があります。
全てのアクションについてログイン認証を必要とする場合はapplication_controllerに記述することで
各コントローラーに記述する手間を省けます。

#before_action :authenticate_user!とは
`  before_action :authenticate_user!`はdeviseのヘルパーメソッドです。
これを記述することで認証ユーザーのみ各アクションを実行するようになります。

#特定のアクションのみ、ログインしていない状態で実行したい場合
例えば｢topページとaboutページだけはログインしていなくても表示させたい…｣という時は
下記のように、該当アクションを除外する形で指定します。

```  before_action :authenticate_user!, except: [:top, about]
```
こうすることでtopアクションとaboutアクションのみログアウト状態でも表示することができます。
その他のアクションはログインしていないとURL直打ちしても表示されなくなります。

▼参考Devise　authentication_user!
https://skillhub.jp/courses/137/lessons/978


又、今回私はapplication_controllerに記述すると記載しましたが、
userコントローラー以外の他のコントローラーにログイン認証設定を加えたくない場合は
ディレクトリに階層を作り、そのディレクトリのみ適応されるコントローラーを作成する方法もあります。

下記を参考にしてください。
▼参考
https://qiita.com/ryuuuuuuuuuu/items/bf7e2ea18ef29254b3dd
ReadTheDocsでno module namedのエラーが出た時


# はじめに

ReadTheDocsというサービスがあります。
これはどうやら

- Sphinxでドキュメントを作るのを、ReadTheDocs上でGitHubからTravisなどで自動化してビルドし、そのままパブリックに公開する

というもののようです。

https://cookiecutter-pypackage.readthedocs.io/en/latest/tutorial.html

このライブラリを用いて現在パッケージを作成していますが、どうやらこのチュートリアルもReadTheDocsで公開されているようです。

# エラー

ReadTheDocsのビルド上で

```
no module named `numpy`
```

のように、numpyのパッケージがないからdocsのビルドのときに参照先が分からずエラー出てるよ！が発生しているようです。
よって、ビルドのときにこれらの内部で使っているパッケージをインストールしてあげれば良さそうです。


# 対処法

https://docs.readthedocs.io/en/stable/config-file/v2.html

こちらを参照して修正します。

`.readthedocs.yml`に

```yml

python:
    install:
        - requirements: docs/requirements.txt
```

を追加して、docs/requirements.txtに必要なパッケージを書いてあげれば、ビルド前にインストールしてくれます。
サーバーサイドでレンダリングされたHTMLを埋め込むReact SPAで、MathJaxでTypesetする

MathJax向けに書かれた数式を含むサーバーサイドでレンダリングされたHTMLを取ってきて、ReactのSPAに埋め込む場合、

### componentDidMountでロード

```javascript
async componentDidMount() {
  // この設定は、\colorを使うために必要
  ;(window as any).MathJax = {
    loader: {load: ['[tex]/color']},
    tex: {packages: {'[+]': ['color']}}
  }

  // MathJaxをロード
  const x = document.createElement('script')
  x.type = "text/javascript"
  x.src = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"
  x.async = true
  ReactDOM.findDOMNode(this).appendChild(x)
}
```

### componentDidUpdateでTypeset

```javascript
componentDidUpdate() {
  const es = document.getElementsByClassName("math-expr")
  if (es) {
    ;(window as any).MathJax.typeset(es)
  }
}
```

### ```\color```が使えない！
version 3から、autoloadの設定にするか、明示的にロードしないと使えなくなったようです。
http://docs.mathjax.org/en/latest/input/tex/extensions/color.html

また、書式も変わっています。
Heroku Add-onで追加したSendGridのアカウントがBanされた

メール送信サービスのSendGridですが、HerokuのAdd-onとして追加することもできます。
後者の場合は追加すると環境変数にログインIDとパスワードが設定されます。

通常はこれですぐに利用できるので便利です。
しかし一度Add-onを外してしまって再度付け直そうとしたときに、SendGridのアカウントがBanされて追加できなくなったことがあったのでその時の対応記録です。


# 現象

1. SendGridのAdd-onを追加
2. 開発中はやっぱりMailtrapを使おうと思い、SendGridは削除（環境変数も）

### 〜後日〜
SendGridに戻そうと思って再度Add-onを追加しようとしてもできない。

SendGridのアカウントがBanされているとのこと:frowning2:

```bash
$heroku addons:create sendgrid:starter -a <app-name>
Creating sendgrid:starter on ⬢ <app-name>... !
 ▸    An error was encountered when contacting the add-on partner to create sendgrid:starter: Error Provisioning User - User status - banned
```


# 調査した結果

- https://github.com/sendgrid/docs/issues?q=is%3Aissue+heroku
同じ現象が報告されているが、サポートに問い合わせてとしか書いてない

- https://sendgrid.com/docs/ui/account-and-settings/troubleshooting-login/#account-banned

> A banned account is not allowed back on SendGrid in the future.

> We don't make a habit of letting banned accounts back on, but if you would like to discuss it, please respond to the email you received regarding the ban. Support cannot assist in reactivation of banned accounts.

Banされたらもう復元不可？

Heroku経由でないアカウントの場合はBanされたときにメールが飛ぶらしいので、文句あるならそれに返信しろ。
サポートではアカウントの復活はできない。

ふーん:innocent:


# 解決策

Heroku経由ではなく、普通にSendGridのアカウントを作る。
[New Account | SendGrid](https://signup.sendgrid.com/)

一瞬、HerokuのDyno立て直すしかないんか:tired_face:
と思いましたが、そうしなくてもこれでいいやんとなりました。

一応サポートの“ログインアカウントを忘れた場合”というテンプレ問い合わせを送ってもみましたが、レスポンスは期待できません。
（１週間ぐらい経っても音沙汰なしでした）

### 注意点

送信元メールアドレスをVerifyしてないとエラーが出てメール送信できない。

```
The from address does not match a verified Sender Identity. Mail cannot be sent until this error  (truncated...)
```

[Single Sender Verification](https://sendgrid.com/docs/ui/sending-email/sender-verification/)

# 2023/05/17追記
2022年9月にもまた同様の事象に遭遇しました。
結論としてはBanされたアカウントを復旧してもらうことができ、Heroku Add-onとして使い続けることができました👏

## 方法
再度情報を集めてみると [こちらの投稿](https://salesforce.stackexchange.com/questions/298044/getting-access-to-sendgrid-com-was-denied-http-error-403-trying-to-access-se) を見つけたので、サポートに問い合わせてみることにしました。
前回は "ログインアカウントを忘れた" という文脈でしたが今回は「ログインに関するその他のトラブル」から問い合わせてみました。

[SendGridサポート](https://support.sendgrid.com/hc/en-us)
![Search For Solutions. Get Support. 2023-05-17 17-49-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395008/cc804d2a-7485-003c-eeb3-2a1d59cac785.png)

内容としては
- HerokuのAdd-onとして利用していて
- 一度もログインしていないがBanされている（今回はこういう状況でした🌚）
- なぜこんなことに・・？アカウントを復旧してもらうことはできますか？？
- （無料プランだから標的になりやすかったのかと思って）現状Freeプランだけどこれは本番環境なので将来的には有料プランにするつもりです
- ユーザー名（Heroku Add-onの場合 `app000000@heroku.com` というフォーマットで自動的に割り当てられているはず）

みたいな感じでしたためました。

## 結果
翌日には担当者から返信があり（前回とは違って早かったのでびっくり）、「どういう事業者か」「アカウント所有者である証明」「どういう内容のメールを送信するか」といった質問に答えてと言われました。

以下のような内容で回答しました。
- 自社の（受託の場合はクライアントの）ホームページURLや事業内容の説明
- 私のプロフィール（LinkedInのリンク貼った）
- 送る予定のメールがどんな性質のものか
- メール内容のサンプル

そしてまた翌日、「ご迷惑かけてすみませんでした。あなたのアカウントはreactivateされました！」というメッセージが来て無事にアカウントは復旧されました🎉

## まとめ
サポートへの問い合わせはすべて英語での対応になります。
1,2営業日以内には必ず返信がある感じだったので、以前のイメージは払拭されました。

そもそもなぜこのようにBanされてしまうのかは疑問が残りますが・・
もし同じ状況になった場合はサポートに問い合わせてみるのが良さそうです。
AWS Amazon linux 2でLaravel7の環境構築

新たにLaravel7でプロジェクトを作成する事になったため、今回必要な環境の構築覚書。


php                 :php 7.3
フレームワーク      :Laravel 7
データベース　      :MariaDB 10.5.4
テンプレートエンジン:twig
ログイン管理        :sentinel 4.x

以前素のphpで書かれていたプロジェクトの改修なのでテンプレートエンジンとログイン管理は該当プロジェクトと同じものを使用する事に。

<h1>EC2立ち上げからphp,apache,Composer,Laravelのインストールまで</h1>
[AmazonLinux2でLaravelの開発環境構築](https://qiita.com/h19e/items/02d1301d4fdd8dfa88ac)
上記ページを参考に行う。


<h1>MariaDBのインストールと設定</h1>
　yumデフォルトでインストールできるmaria-dbはバージョン5.5の為、レポジトリを設定してダウンロードする。
　インストール時は MariaDB-server の綴りに注意。（MとDBが大文字）

```
$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
$ sudo yum install MariaDB-server
```

データベースの文字列をUTF-8に設定する。/etc/my.cnf.d/server.cnf の [mariadb] セクションに以下の設定を追加。

```/etc/my.cnf.d/server.cnf
[mariadb]
character-set-server=utf8
```

有効化～開始～セキュリティ設定

```
$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb

$ sudo mysql_secure_installation
Set root password? [Y/n]
Remove anonymous users? [Y/n]
Disallow root login remotely? [Y/n]
Remove test database and access to it? [Y/n] n
Reload privilege tables now? [Y/n]
 ...
Thanks for using MariaDB!
```

ログイン～文字コード確認

```
#ログイン
mysql -u root  -p

Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 23
Server version: 10.5.4-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

#文字コード確認
MariaDB [(none)]> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

#ログアウト
MariaDB [(none)]> exit
Bye
```



<h1>twigインストール(LaravelでTwigを利用する専用パッケージrcrowe/twigbridgeのインストール)</h1>

```
$ composer require rcrowe/twigbridge
```


<h1>Sentinelインストール</h1>

```
$ composer require caratalyst/sentinel "^4.0"
```

<h1>参考文献</h1>
[AmazonLinux2でLaravelの開発環境構築](https://qiita.com/h19e/items/02d1301d4fdd8dfa88ac)
[CentOS 7 に MariaDB Community Server 最新版をインストール]
(https://mariadb.com/ja/resources/blog/install-mariadb-server-centos7/)
[EC2(Amazon Linux 2)にmariaDBを導入する]
(https://qiita.com/PAmatsuti/items/ed89719a1f4f579bd01a)
[簡単！Laravelでtwigテンプレートエンジンを使う実例]
(https://blog.capilano-fw.com/?p=2678)
[Sentinel Manual Cartalyst 4.x]
(https://cartalyst.com/manual/sentinel/4.x#installation)
Rubocop Airbnb

#はじめに
作成したポートフォリオにRubocop Airbnbを導入したのでメモします。

#Rubocopとは
Rubocopは書かれたコードがRubyのコーディング規約に沿った書かれ方をしているかを自動的に確認してくれるgemです。

#Rubocopではなく、Rubocop Airbnbを導入する理由
Rubocopはデフォルト設定だと自分で設定を変更する必要があるとのことなので、airbnbの開発で使用されているrubocopの設定をインストールできるRubocop Airbnbを導入することにしました。

#Rubocop Airbnbの導入手順
基本的に[Rubocop Airbnb](https://github.com/airbnb/ruby/tree/master/rubocop-airbnb)の手順に従いました。

###Gemfileにgemを追加
gemを追加したら、bundle installします。

```ruby:Gemfile
group :development do
  gem 'rubocop-airbnb'
end
```
###Rubocop-airbnbを適用させるアプリファイルに、rubocop.ymlとrubocop-airbnb.ymlを作成し、それぞれ内容を記載
rubocop.ymlの内容は必要に応じて適宜変更してください。

```ruby:rubocop.yml
 inherit_from:
  - .rubocop_airbnb.yml

 # Rails用に最適化
 Rails:
   Enabled: true

# 文字数の上限を８０文字から変更
LineLength:
  Max: 130

 #rubocopで検証したくないフォルダを指定
 AllCops:
   Exclude:
     - 以下省略
```
```ruby:rubocop-airbnb.yml
 require:
   - rubocop-airbnb
```

###実行
設定が完了したら、`bundle exec rubocop --require rubocop-airbnb`

以上。
【3分で設定】MacでAWSのアクセスキーを暗号化して管理


# 前提
Homebrew, aws-cliは導入済みとして記載します。

# 手順
Homebrewを使用して[aws-vault](https://github.com/99designs/aws-vault)を入れる。

```bash
brew install --cask aws-vault
```

aws-vaultにアクセスキーを登録。
パスワードの設定が求められる。

```bash
# 以下の "foobar" は任意の文字列
aws-vault add foobar
```

aws-vaultの情報を使用するように`~/.aws/credencials`を設定する。

```zsh
[default]
credential_process=aws-vault exec -j foobar
```

挙動を確認。
先ほど設定したパスワードの入力が求められる。

```bash
aws s3 ls
```

以上。簡単＆安心ですね。

# 詳細
Macには[キーチェーン](https://support.apple.com/ja-jp/guide/keychain-access/kyca1083/mac)という認証情報管理用のアプリケーションが含まれます。そこでAWSのアクセスキーを管理するためのOSSが今回使用した[aws-vault](https://github.com/99designs/aws-vault)です。
デザインのクラウドソーシング大手である99designsがメンテしており、2020/07時点でGitHubのスターは3700ほどついており開発も活発です。

# 備考
以下は便利な使い方です。お好みでご利用ください。

## セッションの持続時間を伸ばす

- [aws-vaultのmacOSのキーチェーンのタイムアウトを伸ばす](https://qiita.com/minamijoyo/items/5ed3113434e51308ded1)

## アクセスキーのローテーション

```bash
aws-vault rotate -n foobar
```

STSを用いずアクセスキーをそのまま使う`-n`オプションを付加しないと私の環境ではエラーとなりました。
[ベストプラクティス](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/best-practices.html#rotate-credentials)として、アクセスキーは定期的にローテーションしたほうが良いので簡単なエイリアスを作成して気軽にローテーションできるようにしておきましょう。
以下はZ Shellで`avr`というエイリアスを貼っています。(`aws-vault rotate`の略)

```zsh
echo "alias avr='aws-vault rotate -n foobar'" >> ~/.zshrc
source ~/.zshrc
```

## ブラウザでログイン

```bash
aws-vault login foobar
```

## 環境

- sw_vers
  - ProductName:	Mac OS X
  - ProductVersion:	10.15.6
  - BuildVersion:	19G73
- aws-vault: v5.4.4
- aws-cli: aws-cli/2.0.32 Python/3.8.4 Darwin/19.6.0 botocore/2.0.0dev35

## 関連リンク

- [公式Usage](https://github.com/99designs/aws-vault/blob/master/USAGE.md)
- [aws-vault についてのあれこれ](https://qiita.com/kangaechu/items/cb8f68e3866ee5af71c8#%E5%82%99%E8%80%83)
Windowsでwgetをインストール　　　　　～使用まで

今回はwindows10でwgetを使用する手順を書き残していきたいと思います。
自分が学習しようとしているページで次のような記述がありました。
「以下のコマンドでデータをダウンロードします。   ～～wget ---」
実際にこのコマンドを実行しても案の定、「認識されていません」エラーが出てきました。
そこでwgetについて調べることに。

##まずwgetとは
大体のことはここに書いています。参照してみてください。
https://www.atmarkit.co.jp/ait/articles/1506/09/news006.html

ここに書いてある通り、要するにwgetとは
>「複数のファイルをまとめてダウンロードしたい」「稼働中のWebサイトをまるごとバックアップしたい」といったときに便利なコマンドが「wget」です。

ってことですね。
Linux等のUNIX系OSでは標準で入っているらしいですが、
windowsでは入っておらず、別途インストールする必要があるらしいです。


##wgetのインストール（windows10）
ということでインストールしてみましょう！

まず
http://gnuwin32.sourceforge.net/packages/wget.htm
にアクセス

ここでダウンロードするファイルは
・Binaries
・Dependencies
上記2点
そしてzipファイルをインストールできたらどこかに展開します。
その際に展開先を同じファイルにしておくように注意してください。

↓こんな感じ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662559/e76f7272-4871-aeb4-0f32-dd218686eb25.png)

ここでbinファイルの中身がこのようなリストになっていたらOKです。
違う場合は足りないものをコピーしてきてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662559/7dd7b0fc-bb69-ecd1-1f2c-8496c4078cb2.png)

このままではいちいちコマンドプロンプトでこのファイルまで移動しないといけないのでPATHを通しましょう。
PATHとはなんぞや？という方はこちらを参考に↓
https://qiita.com/sta/items/63e1048025d1830d12fd

ついでにPATHの通し方も丁寧な説明があったので↓
https://qiita.com/shuhey/items/7ee0d25f14a997c9e285
PATHのところに登録するディレクトリは上述のbinファイルです。

ここまででインストールは完了し、いつでもwgetコマンドを使えるようになったわけです。

##wgetの実行
では早速コマンドを実行してファイルをダウンロードしてくるぞー、、、
と思った矢先
「SSL による接続が確立できません。」
といったエラーが出て、ダウンロードできませんでした。

エラーを調べてみるとwgetのエラーがまとまっているサイトがあったのでこちらを参考にしました。
https://pentan.info/server/linux/wget_error_ssl.html
今回は安全であろうと確認が取れていたので`--no-check-certificate'を用いてダウンロード完了（ウイルス等の危険性もあるのでこちらのコマンドを使う際は要注意）
無事勉強する準備が整いました。（長かった、、、）
LookerのUh Oh!エラーについて。犠牲者減るようにメモ


Lookerで`Uh Oh`っていうエラー画面に遷移することがあります。

こういう感じのエラーです↓

| ![「Uh Oh!」エラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/c67f7511-bea6-981d-1ca8-295566c88921.png)
|:--|

これ調べてみると、汎用エラーメッセージっぽいので解決が結構難義な場合があります。
※現時点(2020/7月)ではLive Chatに調査依頼投げて解決することが多いと思います。

徐々にLooker導入企業が増えてきている。と思われますので、最初につまづくエラーを減らせればと思い、メモベースで情報残しておきます。


## Uh Oh!エラーが出るまで

LookerではLookMLにデータ定義をコードで記すことによってデータの型変換、計算、条件変換などの汎用性を持たせることができます。またコードで記述する為、git管理が可能でバージョン管理やfindなどによるデータ検索も高速に行うことが可能になっています。

この機能を利用する関係上、まずはmodelの構築を行います。このmodelの中では、テーブルをViewとして扱います。

そして、Looker導入当初では、このViewの数が少ない為、あまり意識しないのですが、導入後１年〜２年経過していくと、 Viewの数はどんどん増えていくと思います。

そして、**これらを管理しやすくする為に、Viewをディレクトリ管理したいと思うように**なります。

今回は、このフェーズでハマった`Uh Oh!`エラーの紹介となります。


## Uh Oh!エラーの発生原因

・ディレクトリ構成をわかりやすくする為に**日本語名称のディレクトリを設定**した
・この**ディレクトリ配下にviewを格納**した

一見すると、普通に思える対応ですが、この対応がエラー発生の引き金になりました。
この設定によって、後述するプロジェクトのサーチ機能でエラーが発生することになります。

## プロジェクトでのサーチ機能について

Lookerではプロジェクト内で定義されたViewなどをサーチして探すことができます。

・Developからプロジェクトを選択し、右上にある検索窓に探したいView名称を入れてGoを押す


| ![「Uh Oh!」エラー①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/97472245-d532-46cf-e73c-c0c5d61220df.png)
|:--|


・検索対象の結果表示画面。検索対象文字列を利用しているView数と利用コード数、処理概要を表示

| ![「Uh Oh!」エラー②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/d1b9ac87-93ce-5189-086f-336b276c85d6.png)
|:--|


上記のサーチ機能はとても便利でよく使うのですが、
今度は、**日本語で作成したディレクトリ配下にLooker_userというViewを用意してそれをサーチ**してみると、


|<img width="600" alt="「Uh Oh!」エラー③.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/07352f8e-6d2d-af58-075e-f675e733cff8.png">
|:--|

|<img width="６00" alt="「Uh Oh!」エラー④.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/7892fba0-a5f3-1f7f-17ab-f17ae147800e.png">
|:--|

こんな感じで`Uh Oh!` が発生しました。

## Lookerの仕様確認(Live chatでLooker社に）

・サーチ機能で対象Viewは見つかったが、日本語に対応しておらず、汎用エラーの `Uh Oh!`が発生した
・こちらの件はサポート経由でLookerの開発チームには伝えたが、いつ対応されるか？などの回答はもらえませんでした。

## 結論
現時点では、**Lookerのプロジェクトで日本語名称ディレクトリを使うと、サーチ機能が利用できない**ので、注意しましょう！
テーブルのカラムの型の種類(Ruby on Rails)

#プログラミングの勉強日記
2020年7月20日　Progate Lv.211
Ruby on RailsⅧ


#データベースの用意
　マイグレーションファイルと呼ばれるデータベースに変更を指示するためのファイルを作成する。`rails g model モデル名 カラム名:型`で作成できる。<font color=blue>モデル名は必ず最初を大文字にして、単数形にする。</font>なので、postsテーブルを作成するが、この場合単数形にする。モデルについては下で記述する。
　マイグレーションファイルは`db/migrate`フォルダの下に作成される。

```:ターミナル
$ rails generate model Post content:text
```
　これを実行すると、`app/models`フォルダにモデルが定義されたファイルと、`db/migrate`フォルダにマイグレーションファイルの2つのファイルが生成される。

##データベースに変更を反映する
　`rails db:migrate`コマンドを実行すると、データベースに変更を反映できる。テーブル作成時には`id`、`created_at`、`updated_at`が自動生成される。データベースに反映されていないマイグレーションファイルが存在する状態でページにアクセスすると、<font color=orange>マイグレーションエラー</font>が発生する。なので、マイグレーションファイルを作成した場合は必ずこのコマンドを実行する。


#指定する型


| 型       |     意味　 | 
|:-----------------:|:------------------:|
|  string |  文字列(1〜255文字) |    
|  text | 長い文字列(1〜4294967296文字)  |
| integer | 整数（4バイト）|
| bigint  | 整数(8バイト)  |  
|  float | 浮動小数  |
|  decimal | 精度の高い小数 |
|  numeric  |  数値  |
|  datetime |  日時  |
|  timestamp |  タイムスタンプ |
|  time | 時間  |
|  date | 日付  |
|  binary | バイナリデータ  |
|  boolean | 真偽値型  |


日時：日付と時刻の形式YYYY-MM-DD HH：MM：SS
タイムスタンプ：1970年1月1日からの秒数を格納


#参考文献
https://www.it-swarm-ja.tech/ja/ruby-on-rails/ruby-on-rails%e3%81%a7%e3%81%af%e3%80%81datetime%e3%80%81timestamp%e3%80%81time%e3%80%81date%e3%81%ae%e9%81%95%e3%81%84%e3%81%af%e4%bd%95%e3%81%a7%e3%81%99%e3%81%8b%ef%bc%9f/970613851/
https://chinatz.hatenablog.com/entry/2018/07/20/210000