OmniAICreator/Qiita-1.07M huggingface dataset:
docker(65)今日のdocker error: failed to register layer: Error proc essing tar file(exit status 1): no space left on device.

docker for windows 7
https://qiita.com/kaizen_nagoya/items/490e5a250efabc9dc557

での作業。

```shell-session
$ docker run -it kaizenjapan/anaconda-nikhil  /bin/bash
Unable to find image 'kaizenjapan/anaconda-nikhil:latest' locally
latest: Pulling from kaizenjapan/anaconda-nikhil
cc1a78bfd46b: Already exists
314b82d3c9fe: Already exists
adebea299011: Already exists
f7baff790e81: Already exists
44c478e462a0: Already exists
62c64b135d24: Extracting  3.348GB/3.348GB
2a91b77a00b7: Download complete
C:\Program Files\Docker Toolbox\docker.exe: failed to register layer: Error proc
essing tar file(exit status 1): write /opt/conda/lib/python3.6/site-packages/ten
sorflow/include/unsupported/Eigen/CXX11/src/TensorSymmetry/StaticSymmetry.h: no
space left on device.
See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.

$ df -k
Filesystem            1K-blocks      Used  Available Use% Mounte
C:/Program Files/Git 1465033724 116440744 1348592980   8% /
D:                   2930134012 106795056 2823338956   4% /d
E:                       163246    163246          0 100% /e
F:                      3866624   1244128    2622496  33% /f

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

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
GitHub Desktop2.0　proxy環境下で使おうとした話

# GitHub Desktop 2.0をproxy環境下で使おうとしたら、エラーが起きた。
## 結論
とりあえず結論から。 
git bashを起動して、

```shell
$ git config --global http.proxy  proxy.foo.com:port
$ git config --global https.proxy proxy.foo.com:port
```
を実行すると、使えました。

## GitHub Desktop2.0とは
まぁ、この記事を読んでいる方の大半は既に知っていのかなって思いますが、GitHub Desktop2.0は今年の6月5日にGitHubからリリースされたGUIのGitクライアントソフトです。非常にシンプルでわかりやすいUIとかっこいいデザインでおすすめのGUIクライアントです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236980/906164ad-899a-5690-ba68-f89ff06b4ad2.png)

proxy環境下に行ったときに、Windowsのproxy設定だけでは止まってしまったので、アプリケーション内にproxy設定ないかなと思って探したけど見つからなかったので、git bashを開いてproxy設定を行った、というお話でした。
htmlの特殊文字の表示

Railsでアプリケーションを作成しているときに、データベースから引っ張ってきた数値に、hamlで単位として「%」をつけようと思ったらエラーが発生したので調べました。

## エラーと修正
### エラーの場合
```index.html.haml
= record.GA
%
//⬆︎この「%」の書き方だとエラーが出る
```
record.GAというのがデータベースから持ってきている数値です。
その後に「%」をつけようとしました。
![](https://gyazo.com/666bccfdeabf8c941e815075463bda0c.png)
結果、こうなりました。
どうやらタグとしてみられたようです。

### 修正した場合
```index.html.haml
= record.GA
&#037;
//⬆︎これが特殊文字の表記の仕方(%の場合)
```
![](https://gyazo.com/00c9ed55f2a0e7e4fa9cc3026f27ce99.png)
こういった書き方をするとビューにも%がきちんと表示されます。
基本的には、&〇〇;という風に囲んであげるみたいです。

## Htmlの場合
やることは同じです。
hamlだと%を直接書いたらエラーになりましたが、htmlではそのまま表示されます。
ただし、&lt;p&gt;などはタグとしてみられるので、表示させたい場合は

```sample.html
&lt;p&gt; こっちは表示される
<p> こっちは表示されない
```
![](https://gyazo.com/a3c880892f8d874d11889b26ed654798.png)
実際、このQiitaの上の説明文の「&lt;p&gt;などはタグとしてみられるので」の部分もこの書き方をしないと、pタグの働きをして、一つの段落として文章が出てきました。


## 参考サイト
[HTMLの特殊文字](http://web-dou.com/html/t023b.html)
NetworkXのエッジに長さなどの情報を設定する


# はじめに

NetworkXで、辺の繋がりだけでなく、辺の重みや特殊なプロパティを設定したい。

# 対処法

```python
import networkx as nx
import random

# 適当に生成
G = nx.random_tree(10)

# Gのエッジ集合を取り出す
for (u, v) in G.edges():
    G.edges[(u, v)]['weight'] = random.randint(3, 10)

```

NetworkXの各辺(u,v)(タプル)は

```py
G.edges[(u, v)]
```
で取り出すことができます。つまり、タプルをキーとする辞書になっています。

この辺G.edges[(u,v)]は辞書となっているため
`weight`をキーとして、そこに重さを入れればいいです。

他にも
`love`, `long`など入れようと思えば入れることができます。
【JupyterNotebook/Lab】Jupyter上でデバッグする３つの方法【Pdb】

# Jupyter上でデバッグしたい
print文を挟み、何回も繰り返し実行しながらデバッグの根源を突き止めるのはやめたい気持ち.

- ブレークポイントを指定しデバッグする方法
- エラー発生時にデバッガを起動する方法
- エラー発生後にデバッガを起動する方法

の３つの方法を紹介します。

# ブレークポイントを指定するデバッグ

デバッグをしたい行が明確な場合, 
以下行をデバッグしたい行に挟みます.

```python
from IPython.core.debugger import Pdb; Pdb().set_trace()
```

#### 実行例

以下は`i`が10になったらブレークする例です. たしかに`i=10`が確認できますね.


<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180836/f2b74157-c6da-8344-6a97-8d66c6c1a472.png' width=600/>


# エラー発生時にデバッガを起動する方法
バグがどこかで発生した段階でPdbを起動させたい場合。

```python
%pdb on
# %pdb off ← デバッグ検知モードをoffにしたい時
```

#### 実行例
`i == 10`の時に意図的にエラーを発生させています. ちゃんとデバッガが起動していますね.

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180836/397ff7ce-6e81-4c6f-d749-1399312e9bd6.png' width=600/>

# エラー発生後にデバッガを起動する方法

特定のセルでエラーが発生した時、後からPdbを起動させたい場合。

```python
%debug
```

#### 実行例

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180836/dd47dc17-884a-4822-37b3-a0d6a6d39b4a.png' width=600/>




# よく使うコマンド

> [Python Ipdb Cheatsheet](https://wangchuan.github.io/coding/2017/07/12/ipdb-cheat-sheet.html)

ここらへんですかね. 便利なのあったら教えてください

| コマンド | 説明 |
|:--|:--|
| w | スタックトレースを表示 (where) |
| n | 次の行に入るまで実行 (next) |
| c | 次のブレークポイントまで実行を継続 (continue) |
| q | 最後まで実行して終了 (quit) |
| d | 関数の中に潜る (down) |
| u | 関数の外で出る (up) |
| s | 次の関数呼び出しまで実行 (step) |
| r | 現在の関数が復帰するまで実行 (return) |
Webページが表示されるまでの流れ


##コテコテの初心者なので...

はじめまして、タナカです。
ＩＴ業界に足を踏み入れて１年半。
お世話になりっぱなしの Qiitaさん、
初投稿は「Webページが表示されるまでの流れ」を書き留めてみます。


ほぼ自己満＆自分用備忘録です。
コテコテの初心者なので、大目にみてやってください。

##ブラウザにURLが入力されると


１．クライアントは、ドメイン名が設定された[DNSサーバ](http://e-words.jp/w/DNS%E3%82%B5%E3%83%BC%E3%83%90.html)に問い合わせる。

２．問い合わせ先のDNSサーバがドメイン名に対応する情報を、
　　:ok_woman_tone1: 持っていた場合  ➡ IPアドレスをクライアントに返す。
　　:no_good_tone1: 持っていなかった場合 ➡ 更に上位のネームサーバの情報をクライアントに返す。
　　新しいネームサーバの情報を受け取ったクライアントは、再度問い合わせを発行し、
　　最終的にIPアドレスを持つネームサーバに行き当たるまで、問い合わせを繰り返す。

３．クライアントは受け取ったIPアドレス宛てにHTTPリクエストを発行する。

４．Webサーバは要求されたリクエストに対応するHTMLソースをレスポンスとして返信する。

５．ブラウザがWebサーバからダウンロードしたHTMLソースを表示する。
　　（Webページが表示される。）

<font color="DarkGray">URLを入力した後、一瞬でこんなやり取りがされているなんて考えてもみなかったな～</font>
memcached を docker で触って感覚を掴む

# その1 memcached イメージを使う

以下のように dockerhub の memcached を使うことで簡単に試すことができる。

```terminal
$ docker run --name my-memcache -d -p 11211:11211 memcached
e502fab0fe92a15b060df17b2900c09d14d0c3c84a03e6f10f8c8ea3786a54f7

$ telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set hoge 0 100 4
piyo
STORED
get hoge
VALUE hoge 0 4
piyo
END
quit
Connection closed by foreign host.
```


# その2 centos イメージを使う

別の方法として、centos に yum install memcached する場合もメモしておく。


```dockerfile
FROM centos:6

RUN yum install -y memcached telnet
```

```terminal
$ docker build -t memcached-study .
$ docker run -it --rm --name memcached-study memcached-study bash

# service memcached start
# telnet localhost 11211
```

以上です。とにかく docker が便利。ありがとうございます。
RDBMS毎の概念の違い

●MySQL
インスタンス > データベース = スキーマ > テーブル、インデックスなど

●Oracle
インスタンス = データベース > スキーマ > テーブル、インデックスなど

●PostgreSQL
インスタンス > データベース > スキーマ > テーブル、インデックスなど

●SQL Server
インスタンス > データベース > スキーマ > テーブル、インデックスなど
docker for windows install memo(Edge: 40323)

WSL2のコンテナと通信でなくなったので、インストールし直した。

### Edge Releaseのインストール
WSL2ベースの最新版の機能を利用するには、Edge Releaseのビルドをインストールする必要がある。このため、[こちら](https://docs.docker.com/docker-for-windows/edge-release-notes/)から辿れる[リンク](https://download.docker.com/win/edge/40323/Docker%20Desktop%20Installer.exe)からダウンロードできるバイナリを使ってインストールする。

### WSL2 Engineの有効化
Docker for Windowsの設定から、WSL2 Engineを有効にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44988/779c879e-9e4f-fdbb-d2c8-a7a839de8754.png)

さらに、「Resources」-> 「WSL INTEGRATION」からどのディストリビューションを使用するかを指定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44988/9c00f1de-8261-d0f0-e900-7c1599c31f29.png)


これでWindowsのターミナルからdockerコマンドを使えるようになるはず。



### WSL2のDockerの設定
docker-ceをインストールし、`DOCKER_HOST`を設定しておく。

```sh
$ sudo apt update
$ sudo apt install -y docker-ce
$ echo "export DOCKER_HOST=unix:////var/run/docker.sock" >> ~/.bashrc
$ source ~/.bashrc
```
.gitignoreの表記ルールと例

.gitignoreの書き方について簡単に記載します。

## .gitignoreの概要

.gitignoreとは、git上にアップしたくないファイルを指定するためのファイルです。

- 容量が大きすぎるファイル
- 毎ビルド差分が出てしまうファイル
- ビルドすれば勝手に生成されるのでgitにアップする必要がないファイル

などは.gitignoreに記載し、gitにアップしないようにすることが推奨されています。

`$ git init` で自動的に作成されるわけではなく、開発者自身で作る必要があります。
ファイル名を正しく `.gitignore` とすればちゃんと反映されます。

ファイル作成方法の例

```
$ touch .gitignore # ファイル自体の作成。
$ vi .gitignore # ファイルを編集。
```

## .gitignoreについて知っておくと便利そうなこと

- リポジトリのルート階層ににある必要はない。
- .gitignoreファイルはリポジトリに複数あってよい。
- 有効範囲は.gitignoreがある階層以下全部。（親階層のファイルには無効）

## .gitignoreの表記方法

```
# コメント	           # `#`で始まる行はコメント。
*.exe	            # 特定の拡張子（今回は.exe）を含むファイルを指定する。
bin/	            # 特定のフォルダ（今回はbin）の中身すべてを指定する。
!needfile.txt	    # 特定のファイルを指定しない。ignoreしない。
package/**/*.txt    # フォルダ内の特定拡張（今回はpackageフォルダ内の.txt拡張子）子を指定する。
```

## .gitignoreの例

自身のiOSプロジェクトで用いてるものの一部を抜粋。

```
# generally
.DS_Store
*.swp
DerivedData

# ObjC/Swift specific
*.hmap
*.ipa

# Carthage
Carthage/

# Other
*.xccheckout
*.moved-aside
*.xcuserstate
*.xcsmblueprint
```

## 補足

.gitignoreに書いたのに反映されない！というときはこちらを参照。
https://qiita.com/fuwamaki/items/3ed021163e50beab7154

## 参考

https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff
https://qiita.com/anqooqie/items/110957797b3d5280c44f
[Java EE] webApp開発、難しすぎワロタ！ 分からない単語 - まとめ

※このページは復習ノートなので、また更新するかもしれません。

### 動的インクルード
(スッキリわかるサーブレット&JSP入門 P.342~. 以降、同参考書のページ数)
##### 標準アクションタグ
##### EL式 (Expression Language)
${...}のやつ。...の部分が式(expression)。

### JSTL (Java-server pages Standard Tag Library)
(P.360~)
カスタムタグを使うのに必要。

#データベース
(P.376~)
##### DBMS (Database Management System)
SQL(Structured Query Language)

##### JDBC (Java Database Connectivity)
ライブラリの１つで、データベースを操作するためのプログラム群。

#サーバーサイドの設計
(P.426~)
##### BO (Business Object)
アプリケーションの中核となるクラス。
##### DAO (Data Access Object)
データベースの操作を行う。
##### Enity
「ただの情報の塊だよ」のクラス。フィールドとgetter/setterを持つ。
簡単なWebサービスをリリースするまでの流れ

# 作るもの

ブラウザで開いたらちょっとしたメモが書けるツール。
保存機能は入れない。（storage使ってお金かかるのが嫌だから）

# 必要な事

1. アイコン作成
2. Firebase Hostingで必要なファイルをdeploy
3. ドメイン紐付け


## アイコン作成

サービス名はTextAreaにしようと思ったので、  
文字ベースでロゴを無料で作成できるWebサービスを探して作成。
https://www.onlinelogomaker.com/logomaker/?lang=jp#

![スクリーンショット 2019-11-05 13.56.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29008/ce3a35a8-cf02-9c06-5ae3-dc9b222121e9.png)

これでダウンロードすればおーけー。

## Firebase Hostingで必要なファイルをdeploy

手順としてはfirebaseのプロジェクトを作成し、
CLIでdeployまで持っていくのですが、これは調べればたくさん情報が出てくるので、
参考資料というあたりにまとめておきます。
ここにまとめて画像も配置。面倒くさいのでStoreとかは使わない。

## ドメイン紐付け

お名前.comなどで欲しいドメインを取得します。
自分は `text-area.xyz` を取得しました。
.xyzは月額1円という破格の安さ。

その後ドメイン名と公開したWebサービスを紐付けます。
やり方は参考資料にある「Firebase Hostingで公開したWebサイトにカスタムドメインを設定するやり方」通りにやれば出来ます。

# 出来上がったもの

https://text-area.xyz/

<img width="1131" alt="スクリーンショット 2019-11-05 14.21.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29008/824d09c2-b552-4b50-f080-82e06266cc94.png">


本当にシンプルではありますが、使用感も今の所良いです。
bookmarkしておけば秒で表示できてちょっとした一時メモには重宝します。

見せた人にはほぼ100%保存機能をつけて欲しい、テンプレ機能をつけて欲しいという要望は受けますが余裕が出来たら考えます。

# あとがき

せっかくなので広告とかを入れて、
小金儲けをしたいなーと思い、AdSenseを入れようとしましたが、

<img width="1147" alt="スクリーンショット 2019-11-05 14.19.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29008/1e586c52-7fd9-0413-f15d-c93f7746053e.png">


となり、Googleさんからは価値が低いサイトと判断されました。
このシンプルがゆえの価値は理解されなかったようです。

## 参考

[【第4回】 Firebase Hosting でスタティックな Web ページをデプロイしよう！【はじめてみよう Firebase】](https://www.topgate.co.jp/firebase04-firebase-hosting-deploy-website#firebase-hosting-web)
[Firebase Hosting でWebサイトを公開する方法](https://qiita.com/gupuru/items/25a6722f6f802d3a5250a)
[Firebase Hostingで公開したWebサイトにカスタムドメインを設定するやり方](https://qiita.com/gupuru/items/dc453a15147e2e2a3578a)
メモ: firewalldの設定

## 設定一覧

```sh
sudo firewall-cmd --list-all
```

```diff:以下の項目を確認
 $ sudo firewall-cmd --list-all
 public (active)
   target: default
   icmp-block-inversion: no
   interfaces: ens18
   sources: 
+  services: cockpit dhcpv6-client ssh
+  ports: 80/tcp
   protocols: 
   masquerade: no
   forward-ports: 
   source-ports: 
   icmp-blocks: 
   rich rules: 
```

## 設定の有効化 (OS再起動で設定消える)

```sh:tcp80の通信許可
sudo firewall-cmd --add-port=80/tcp
```

```sh:tcp80の通信拒否
sudo firewall-cmd --remove-port=80/tcp
```


## --permanent (--reload するまで変更が有効にならない)

```sh:tcp80の通信許可
sudo firewall-cmd --add-port=80/tcp --permanent
```


```sh:tcp80の通信拒否
sudo firewall-cmd --remove-port=80/tcp --permanent
```

```sh:--permanent指定の設定の有効化
sudo firewall-cmd --reload
```

## ansible

* [firewalld – Manage arbitrary ports/services with firewalld — Ansible Documentation](https://docs.ansible.com/ansible/latest/modules/firewalld_module.html#id2)
【C言語】構造体に値を追加する関数の作成

## 目的
C言語のポインタ受け渡しでドはまりしたので、繰り返さないようにログを残し、事象を整理する。

## 問題
関数内で設定している構造体の文字列データが、別の処理で行っている`memset`のタイミングで壊れてしまう。

## 原因
戻り値の構造体が保持している変数に、関数内で定義した変数のポインタを渡してしまったことが原因でした。

```c
// 人物情報構造体
typedef struct {
	char *name;
	int age;
} PERSON;

// 人物情報を取得する関数
// target：txtファイルを'fgets'関数で読み込んだ一行分の文字列データが格納されている
PERSON GetPerson(char *target) {
    // CSV文字列(target)を分解し、構造体へ格納して値を戻す
    char *splitted[2];
    // CSV分解関数(cclip様の分割関数を利用)
    split(target, ",", splitted, 2);
    int age = atoi(splitted[1]);
    // 戻り値を設定
    PERSON result = { splitted[0], age }; // <- ここで関数内で定義した変数を戻り値の変数に格納
    return result;
}
```
上記で記載したGetPersonによる構造体取得処理は、戻り値とする構造体に関数内で取得した変数のポインタを渡しています。
この関数は値が設定された人物構造体を戻すのですが、構造体メンバの`name`はスタック領域の状態により値が変わってしまう状態になっています。
そのため、別関数などで`memset`等のメモリ値を変更する関数が呼ばれ、`splitted`を格納しているスタック領域が書き換えられた場合、構造体内の`name`で保持している値が壊れてしまいます。
（というか実際に壊れてしまいて、原因がわからなくてドはまりしていました）

## 対応
あらかじめ作成していた構造体変数をポインタ引数として取得し、関数内で値を変更するようにしました。

```c
// 人物情報構造体
typedef struct {
	char name[256];
	int age;
} PERSON;

// [改良版]人物情報を取得する関数
// target：txtファイルを'fgets'関数で読み込んだ一行分の文字列データが格納されている
// person：呼び出し側で初期化済みの人物構造体のポインタ
void GetPerson(char *target, PERSON *person) {
    // CSV文字列(target)を分解し、構造体へ格納して値を戻す
    char *splitted[2];
    // CSV分解関数(cclip様の分割関数を利用)
    split(target, ",", splitted, 2);
    strcpy(person->name, splitted[0]);
    person->age = atoi(splitted[1]);
}
```
呼び出し側で初期化されている構造体ポインタを引数にとり、随時値を代入することで初期化漏れを防いでいます。
また、構造体の型を`char`配列に変更し、`strcpy`で文字列の実体をコピーし、スタック領域が書き換えられても影響がないようにしています。

---
コメントで`sscanf()`を利用した処理を教えていただきました！

```c
bool GetPerson(const char* target, PERSON* person) {
    return sscanf(target, "%255[^,],%d", person->name, &person->age) == 2;
}
```
こちらの方がcsv分割関数も必要なく、すっきりと書けるので見通しも良いです。
今後文字列分解処理をする際は、`sscanf()`を利用して文字列分解処理をしようと思います。
@fujitanozomu さん、コメントいただきありがとうございます！

## おわりに
自身でも意識していない箇所でポインタ先メモリの書き換えが行われており、大はまりしました。
初めてのC言語のため、メモリ管理が必要、クラスが存在しない、ポインタに受け渡しによる参照等、意識することが多くて難しいです。
今回の問題も、今まで意識してこなかったスタック領域が書き換わったために発生したバグで、非常に勉強になりました。
「ここはこうした方が良い」等のご意見がございましたら、教えていただけると嬉しいです。

## 参考とさせていただいたサイト
[文字列を分割する split関数の自作例](https://edu.clipper.co.jp/pg-2-22.html)
[ヒープとスタック](https://www.uquest.co.jp/embedded/learning/lecture16.html)
[プログラミング言語2 - 構造体](http://flute.u-shizuoka-ken.ac.jp/~s-okubo/class/language/006.htm)
Imgixメモ

# カスタムドメイン
sourcesの設定からカスタムドメインを作成可能
カスタムドメインでhttpsを使う場合には、サポートセンターに問合せをし、追加料金を支払う必要がある

# キャッシュ削除
複数一括削除は不可なので、
apiを使用してループ処理で一括削除を行う。

以下キャッシュ削除処理メモ

```
$domain_name = 'https://hogehoge.imgix.net';
$api_key= '************';
$file_path = '/img/test.png';

$headers = array(
    'Content-Type:application/json',
    'Authorization: Basic '. base64_encode($api_key.':')
);
$payload = json_encode(array("url" => $domain_name. $file_path));

$curl = curl_init('https://api.imgix.com/v2/image/purger');
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
return curl_exec($curl);

```
自分のポータルサイトをhttps化した話

自分は、開発系ではほとんど実績がないものの()、趣味活動でいろいろ手を出している都合上、何やったかをかき集めて記載してあるポータルサイトを持っているのですが、これを時々あーだこーだした話です
httpサイトだと、ブラウザで警告が出る世知辛い(？)時代になってしまいましたし、コストもほとんどかからないのなら、やっちまおう。っていうその場のノリ100％のやつです

# 前提

* 元々、共有ホスティングサービスでWebページを公開していた
* 1年ぐらい前に、S3の静的Webサイトホスティング機能で十分じゃね？！って思ってそっちに切り替えた
* その後ドメインをlightsailのDNSに管理させたら、基本的なことは大体できるし楽じゃねこれってそっちに持ってった
* この時に、www.自分のドメイン名.com でアクセスできるようにしてあった(CNAMEでS3の静的Webサイトホスティングのドメインと紐づけ)
* 何かの役に立つ可能性が非常に低い()個人サイトだから、アクセス数はごく少ないのが明らかな状況である

# やったこと

* ACM証明書の取得
* S3の設定変更
* CloudFrontを使って配信できるように設定
* DNSの対向先切り替え

## ACM証明書の取得

* Cloudfrontに設定するACM証明書は、バージニア北部リージョンで取得する必要がある
* ［ドメイン名.com］だけではなく、［www.ドメイン名.com］ の証明書を取得する必要がある。DNSの都合上、［ドメイン名.com］をCNAMEで設定できないため。たぶんRoute53なら問題ないんだろうけど…

## S3の設定

Cloudfrontを設定する前に、S3にバケットを作成し、コンテンツをアップロードしておく。
今回の場合はすでに静的Webサイトホスティングで公開中のコンテンツがあるのでこれをそのまま流用する。

- 静的Webサイトホスティング機能はオフにする。バケットの情報をコンソールで表示し、「概要」→「Static Website Hosting」の項目を確認する。 
- 「ブロックパブリックアクセス」→「パブリックアクセスをすべてブロック」をオフにする

## CloudFrontの設定

* 通常通り、WebのDistributionを作成する。
* Originに、公開したいWebコンテンツを入れたバケットを指定する。
* Restrict bucket accessはyesにすると、S3に直接Webアクセスできなくできるのでyesにする
* Origin access IdentityはCreate new Identityにする
* Grant Read permission on bucketをyesにして、バケットポリシーを自動設定する。
* 先述した2つの設定をすると、S3にバケットポリシーが自動的に付与され、CloudfrontからS3の内容を参照できるようになる。
* Cache BehaviorのViewer Protocol PolicyはRedirect HTTP to HTTPSにする。こうするとhttpでリクエストが来てもhttpsにリダイレクトされる。
* DistributionSettingsのAlternate domain namesについて、公開するサイトのFQDNを設定する
* SSL証明書については、Custom SSL Certificateを選択し、先にバージニア北部リージョンで取得した証明書を設定する。
* Default Root Objectについては、index.htmlとか設定するといい具合なのかなと思う
* 大体こんな感じに設定してCreateボタンを押すとDistributionが作成される


## DNS対向先の変更

* ［www.ドメイン名.com］のCNAMEレコードを作成する。CNAMEの送信先FQDNは、CloudfrontのDistributionの詳細画面のGeneralの中にある、Domain Nameを設定する(xxxxxx.cloudfront.netという値があるはず)

# https化にかかるコストは？

ほとんどかかってないです。
ACM証明書は無料。
アクセス数が増えると、Cloudfrontの使用料が上がると思いますが、月当たり多くて1000アクセスぐらいだったら殆ど無いに等しい。

# 結論
Cloudfrontを使うと、すごく簡単にhttps化することができる。
今回はS3に静的コンテンツを置くという最も簡単なやりかたについて書きましたが、
WordPressを使いたいとか、動的なコンテンツを置くサイトを作る場合であれば、CloudfrontのOriginにLightsailとかEC2を設定する感じになると思いますし、何ならAPI Gateway経由でLambdaをキックするとかもできるはずで、ドメイン名を1個に統一していろいろなことをやらせるにも便利なので、気軽に使ってみたらいいと思う。
(ただし、CloudfrontとInstanceの間の通信はLet's encryptとか無料の証明書発行サービスを使うことになるけどね。ELBはそれなりの値段するし。)
myoをROS上で動かす。

Ubuntu上でMyoと接続したい！　
↑３分で出来る。と思いきや、しょうもない事で何回かハマったのでメモ

#開発環境
- Ubuntu16.04LTS
- ROS kinetic
- Python2.7

#ROS上でmyoを起動する

###myoに関するプロジェクトをダウンロード
Githubで「ros myo」と検索した所複数ヒット、
しかし、一部プロジェクトでは接続不安定だったので相性とかあるのかも？
今回利用させて頂いたのは以下のリポジトリ、
https://github.com/roboTJ101/ros_myo.git

ROSのWorkspaceに移動してgit cloneします。以下を実行してください。

~~~
git clone https://github.com/roboTJ101/ros_myo.git
~~~

#####前提パッケージをインストールする。
- enum34
- pySerial  
上記２つのPythonPackageをインストールします。以下を実行してください。

~~~
sudo pip install enum34
sudo pip install pySerial
~~~


**pipがデフォルトでPython2系ではない人は上記のコマンドではインストール出来ません。**
Pipのデフォルトは確認するには、以下を実行してください。

~~~
pip -V | grep -P -o "python[0-9\.]+"
~~~
色付きの文字で、<font color="Red">python3.x</font>(xは数字)とか出たら、
sudo pip install〜〜を**pip→pip2.7**とかに変えてインストールしてくれ。

#####catkin_makeする
rosのworkspaceに移動してcatkin_makeしましょう。以下を実行してください。

~~~
cd <ROSのWorkspaceのPath>
catkin_make
~~~


###myoを充電
何らかのデバイスとUSB接続していると、上手く通信出来ないようです。
また、myoには電源ボタンが無く、常にスタンバイモードです。
一応、満充電から一周間程度維持出来るらしい。




###myo付属のドングルを装着
ハマったポイントです。
MyoはBluetooth接続ですが、Myo付属のドングルを装着しないと上手く動作できませんでした。
しかも、ダミー底の下とかいう滅茶苦茶わかりづらい位置にマウントされています。

![S__59842563.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497254/26ee3d54-1cf9-e642-8629-bd85da1b752d.jpeg)

###myoと接続するためのNodeを立ち上げる
roscoreしましょう。ターミナル上で以下を実行してください。

~~~
roscore
~~~

myoと通信する為のNodeを起動します。
roscoreしたターミナルとは別で、以下を実行してください。

~~~
rosrun ros_myo myo-rawNode.py
~~~
以上でmyoと接続完了です。

#myoが配信するtopicについて

| トピック名 | メッセージ型 | 備考 |
|:---------:|:----------:|:----------|
| myo_imu | Imu | 普通のImu型、加速度や角速度、quaternion(HWで計算済みの角度※)が取得できる |
| myo_ori | Vector3 | euler\[rad\](HWで計算済みの角度※) |
| myo_ori_deg | Vector3 | euler\[degree\](HWで計算済みの角度※) |
| myo_emg | MyoArray | ８つの筋電センサの値を取得できる |
| myo_arm | MyoArm | 未確認 |
| myo_gest | MyoPose | 握るなどのジェスチャーが対応する数字で取得できる |
| myo_gest_str | String | 握るなどのジェスチャーが文字列で取得できる  |
| pose | PoseStamped | Myoの姿勢が配信されます。rviz上で簡単に確認できる |

※Myo内蔵のチップで計算された値。応答速度・正確性が高い、Yaw軸は時間とともにズレるので注意。(該当コードを参照したところ、Myoから送られたデータをそのまま使用しているため、内臓チップで計算された値と判断)
MySQLでエクスポート、インポート

忘れないように覚書。
毎回調べている気がするので。
今回オンプレ-> AWS RDSのデータ移行でしたが特に問題なくできました。

## エクスポート

```
mysqldump -u  [ユーザID] -p -h localhost [スキーマ] > [ファイル名].sql
```

-d オプション : データを除外


## インポート

```
mysql -u [ユーザID] -p  -h [ホスト名].rds.amazonaws.com [スキーマ] < [ファイル名]
```
Kubernetesで起動に失敗してしまうpodをデバッグする

イメージ作った環境だと動くんだけどk8sにのっけると起動しなくて `CrashLoopBackOff` を繰り返す、ログを見てなんとなく原因はつかめるものの実際にそのイメージで動作している環境に入って調べればすぐわかるのに...というあなたに

# 止まったpodを作る
`$ kubectl edit deploy` して、以下のようにcommandでsleepを指定する。時間はいくらでもいい。

```bash 
  spec:
    template:
      spec:
        containers:
        - command:
          - /bin/sleep
          - "3000"
```

# podに入る
プロセス1番が寝ている間にこっそり入って色々する。

```bash
$ kubectl exec -it {$pod_name} /bin/bash
```

# podを殺す
sleepしているpodはdeleteしても消えないしpodに入って `kill -KILL 1` しても死なないので、
[Kubernetesで消えないPodを強制的に削除する](https://qiita.com/reoring/items/7252556bb216e242cddf) を参考に 
```
$ kubectl delete pods {$pod_name} --grace-period=0 --force
```
webプログラミングってなに？始めるためにまずやること

#webプログラミング言語とは？
webプログラミング言語は、webサービスにおいて自分のアイデアを形にしたり、みんなに使ってもらったりするための言語です。
大きく分けるとフロントエンドとバックエンドの２つに分類することができます。

###フロントエンドとは
フロントエンドとは、ブラウザに働きかけるもので、簡単に言うと「見せる」モノです。ホームページやブログなど目に見える部分を担当する言語です。サイトに装飾や動きを与えるなど目に見えて自分が作成したプログラムが反映されていくので自分はやっていて楽しいです。(笑)

**フロントエンドの言語**
- HTML
- CSS
- Javascript
- jQuery　　　　 

ホームページやブログは、HTML、CSSのみで作ることが可能であり、サイトに動きを付けたい場合にJavascriptやJQueryを用います。

###バックエンドとは
バックエンドとは、サーバ内で動く仕組みなどのことで、私たちの目には見えないとことで働くモノです。また、バックエンドのことをサーバーサイドと言い換えることもできます。サーバーサイドの言語は、目に触れる部分ではなくアプリやサービスの内部を担当する言語です。

**バックエンドの言語**
- PHP
- MySQL
- WordPress　　　　


#フロントエンドに興味を持ったあなたに
私は、ホームページなどウェブサイト制作に興味があったのでフロントエンドを中心に現在勉強をしています。そのようなこともありフロントエンドを始めるにあたって使いやすいおすすめの環境を記載します。
プログラミングを始めるためには、まずエディタを用意をする必要があります。

###おすすめのエディタ
エディタとは、一言でいうとプログラムを書くためのソフトです。自分が「使いやすい！」と思い、おすすめするエディタは、**「Visual Studio Code」**です。VScodeは、補完機能が充実しているので文法ミスも少なくなり、初心者の方にお勧めです。
以下のURLからダウンロード可能です。
https://code.visualstudio.com/

フロントエンドは、エディタでプログラムを書き、ブラウザで動作を確認する形になります。


#とりあえずやってみよう！
自分がwebプログラミングを始めたのは、友達の「一緒にHTMLの勉強しよ！」という一言がきっけでした。自分のやりたいことが見つかっていなかった私は、とりあえず勉強してみることにしました。そこから徐々にwebプログラミングの面白さに気づいていきました。
**挑戦することで視野が広がることを実感しました**
フロントエンドとバックエンドのどちらか自分が興味を持つほうから勉強を始めていくことをお勧めします!
macで起動中のApp一覧をターミナルで取得する

MacOS で起動中のアプリの一覧を、ターミナルのCUIで得る方法。

```shell
$ osascript -e 'tell application "System Events" to get name of (processes where background only is false)'
# => Finder, Mail, Google Chrome, 1Password, Inkdrop, Preview, Dictionary, iTerm2, Karabiner-Elements, clion, MacVim
```

参考 : https://stackoverflow.com/questions/7929872/get-list-of-running-apps-on-mac-os-x-in-bash
AWS CLIでVPCエンドポイントを作成する時のポリシー(JSON)の指定方法

CLIでVPCエンドポイントを作成するときに、エンドポイントポリシーのJSONをどうやって渡せばいいのかを悩んだので、そのメモ書きです。
JSONの文字列をシェルの変数に投入してあげるという解決策です。
# 実行例
```shell

AWS_PROFILE=default

POLICY='
{
    "Statement": [
        {
            "Action": "*",
            "Effect": "Allow",
            "Resource": "*",
            "Principal": "*"
        }
    ]
}'

aws --profile ${AWS_PROFILE} ec2 create-vpc-endpoint \
    --vpc-endpoint-type Interface \
    --vpc-id vpc-f1dcfc96 \
    --subnet-ids subnet-cde80585 subnet-0bf40020 subnet-742e712f \
    --security-group-ids sg-beca3fc2 \
    --service-name com.amazonaws.ap-northeast-1.sqs \
    --policy-document "${POLICY}";
```
# 解説
ミソは、エンドポイントのポリシーをシェル変数(ここでは、POLICY)に登録して、--policy-document の引数に "${POLICY}"と入れること。
引数に入れる"${POLICY}"は、必ずダブルクォーテーションで括ること。(bashのコマンド文字列解析時に、JSONの途中のスペースを引数の区切りと誤認するのを回避するため)
IAMでサーバ証明書をインポートするCLI手順

ACM(AWS Certificate Manager)ではなく、IAMでサーバ証明書をインポートするときのCLI手順のメモです。
## サーバ証明書のインポート
```shell
PROFILE=default

aws --profile ${PROFILE} iam upload-server-certificate \
    --server-certificate-name hoge.com \
    --certificate-body file://hoge.com.crt \
    --private-key file://hoge.com.key 
```
## インポートしたサーバ証明書の確認
```shell

aws --profile ${PROFILE} iam  list-server-certificates
```
開発メモ　使ってないけど使いそうなメソッド等

開発メモ
使いそうなメソッド群 都度更新

###rails scan
正規表現で取得した内容を配列で返す。
取得した文字列文eachみたいな形でぶん回せるっぽい。何か使えそうなのでめも。
https://ref.xaio.jp/ruby/classes/string/scan


###20200214追記
忘れそうな簡単な年齢計算
toYearEnd =  Date.new(Date.today().prev_month(3).next_year(1).year, 4, 1)
@lists.where("date_part('year', age(?, users.birthday)) <= 18", toYearEnd)
ubuntu18.04にpyenvをインストール

```
sudo apt update
sudo apt-get install vim -y

sudo apt install -y git
git clone https://github.com/pyenv/pyenv.git ~/.pyenv

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc

source ~/.bashrc

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev

pyenv install 3.6.5
pyenv global 3.6.5
python -V
```
-isystem /usr/include すると gcc 6.1 以上だと stdio.h などが見つからずにエラーになるので注意

## 背景

CMake でライブラリが INTERFACE_INCLUDE_DIRECTORIES で `/usr/include/OpenEXR/..` を設定している.
このライブラリを IMPORTED として自前アプリに組み込んでいる.

https://qiita.com/osamu0329/items/3e9868e83d3745b8c8b6

この場合, INTERFACE_INCLUDE_DIRECTORIES のパスが `-I` ではなく, `-isystem` を使う.

`-isystem /usr/include/OpenEXR/..` がコンパイルのコマンドラインになる.

この設定により, `include_next` で stdio.h などがみつらなくてコンパイルエラーになる.

## 原因

-isystem on a system include directory causes errors
https://stackoverflow.com/questions/37218953/isystem-on-a-system-include-directory-causes-errors

include_next などとの絡みです.

https://qiita.com/angel_p_57/items/34c42bbb38e81178bdc1
https://www.poared.com/wordpress/?p=133
https://gcc.gnu.org/onlinedocs/gcc-3.2.3/cpp/Wrapper-Headers.html

ありがとうございます.

相対パス指定, たとえば `-isystem /usr/include/OpenEXR/..` でも同じです.

結果として, `-isystem /usr/include/` とすると, include_next でのヘッダのサーチパスの探索順序が変わるなどして, エラーになります.

`-I/usr/include` では問題ありません(`-I/usr/include` は include_next の探索では無視(?)されるらしいからです).
 
## cmake での解決　

imported なターゲットで `INTERFACE_INCLUDE_DIRECTORIES` を使っている場合, デフォルトでは SYSTEM(`-isystem`)になる. 

https://github.com/AcademySoftwareFoundation/openvdb/issues/70

`-DCMAKE_NO_SYSTEM_FROM_IMPORTED:BOOL=TRUE` を設定し, SYSTEM にしないようにする.

### 本質的な解決

`/usr/include` のパスを追加しない.
同期・非同期、マルチスレッド・シングルスレッド、並行処理・並列処理のまとめ

床屋でのコース・・・タスク
一度に行う処理の過程・・・プロセス
コースの中の「髪を切る」「シャンプーをする」「顔を剃る」「ドライヤーをする」1つ1つの処理・・・スレッド

####シングルスレッドの例
プロセス中にスレッドが1つある
![スクリーンショット 2019-11-05 13.18.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374924/0957fb33-cf85-5d2e-debc-1bf86802013d.png)

####マルチスレッドの例
プロセス中にスレッドが2つある
![スクリーンショット 2019-11-05 13.22.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374924/91378d8e-01ce-ac36-086a-e2ddbd34de03.png)


###同期（同期処理）
前の処理が終わってから、次の処理が行われる。
順番に処理が行われる。

例) コースが「髪を切る」「シャンプーをする」「顔を剃る」「ドライヤーをする」と順番に行われていく。

###非同期（非同期処理）
前の処理が終わるのを待たずに、次の処理が行われる。
前の処理が遅かったら、どんどん早い処理が行われていく。
順番に処理が行われる。

例) コースが「髪を切る」「シャンプーをする」「顔を剃る」「ドライヤーをする」と順番に行われない。「顔を剃る」「髪を切る」「シャンプーをする」「ドライヤーをする」などが起こること。

###マルチスレッド
複数の処理が複数または単一の処理機能によって並行して行われること。

例) コースの中で「顔を剃る」「ドライヤーをする」が同時に行われてしまう

###シングルスレッド
並列処理などを行わず、単一の処理を順番に実行していくこと。

例) コースの中で1プロセス中1スレッドが守られる。もちろん非同期も起こりうる。

###並行処理
処理を順不同に行う処理です．人間にとってみればあたかも同時に行われているように見えてしまう処理。別のプロセスが同時に行われること。

例) 実際には2人美容師がいるのに、1人の美容師により隣の人の顔そりと自分のドライヤーが行われているように感じてしまうこと？

![スクリーンショット 2019-11-05 13.38.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374924/b15002c6-2e67-e5ed-095a-15b95228d81a.png)


###並列処理
マルチスレッドで実行し計算負荷を分散させる処理。

例) コースの中で「顔を剃る」「ドライヤーをする」が同時に行われてしまう
ドーパミンニューロンの2つのサブタイプ



ドーパミンニューロンには価値に関わる情報を伝達する「Valueタイプ」のニューロンとSalienceに関わる情報を伝達する「Salienceタイプ」の2つのサブタイプのニューロンがある．

Valueタイプのニューロン：報酬に対して活性化し，罰に対して抑制する．

Salienceタイプのニューロン：報酬に対しても活性化を示すが，罰に対しても活性化を示す．
JavaScriptのthisのスコープについて調べた

JavaScriptを勉強していて頻繁に出てくるのがこの「this」だが、
定義する場所によって参照先が違ったりと色々厄介なやつなので勉強がてら調べて見た。
(挙動の確認のためあえてvarを使ってるが基本使わないほうがいい)


## 関数からの呼び出しの場合

```javascript
var test = 'nogi';

function myThis(){
  console.log(this);  // Window
  this.test = 'hoge';
}

myThis();
console.log(test);  // hoge

```
関数から呼び出したthisは`グローバルオブジェクト`を参照していることがわかる。
つまり、グローバル変数のtestに'hoge'を入れたことで'nogi'が変わってしまった(グローバル汚染)
ただし、ES6から変数の定義にletやconstが使えるようになったので特に気にしなくて問題はなさそう。

```javascript
let test = 'nogi';

function myThis(){
  console.log(this);  // Window
  this.test = 'hoge';
}

myThis();
console.log(test);  // nogi
```



## メソッドからの呼び出しの場合

```javascript
var test = 'yamada';

var myobj = {  
  test: 'taro',  
  myThis: function(){
    console.log(this);   // {test: "taro", myThis: ƒ}
    this.test = 'hanako';
  }
};

myobj.myThis();
console.log(myobj.test); // hanako
console.log(test); // yamada
```
メソッドから呼び出したthisは属してる`オブジェクト`を参照していることがわかる。
当然グローバルスコープへの影響もない。



```javascript
var test = 'yamada';

var myobj = {
  test: 'taro',  
  myThis: function(){
    console.log(this);  
    this.test = 'hanako';

    function myThis2(){
      console.log(this.test);  // yamada
    }
    myThis2();
  }
};

myobj.myThis();
```
メソッド内に関数myThis2を追加した場合の挙動。
メソッドで定義しているが、あくまで関数なので参照先は`グローバルスコープ`になっている。


## クラスからの呼び出しの場合

```javascript

var test = 'yamada';

class myClass{
  constructor(){
    this.test = 'taro';
    console.log(this); // myClass {test: "taro"}
  }

  myThis(){
    console.log(this);  // myClass {test: "taro"}
  }
}

var myobj = new myClass();
myobj.myThis();
console.log(test);  // yamada
```
クラスで呼び出したthisはプロパティもメソッドも属している`クラス`を参照していることがわかる。
この辺はシンプルでわかりやすい。

```javascript
class myClass{
  constructor(){
    this.test = 'taro';
    console.log(this);
  }

  myThis(){
    console.log(this);
    
    function myThis2(){
      console.log(this);  // undefined
    }
    myThis2();
  }
}

var myobj = new myClass();
myobj.myThis();
```
クラス内のメソッド内に関数myThis2を定義した。
何と、thisの参照先が`undefined`になってしまった！
詳しいことは今度調べてみよう。。

##アロー関数からの呼び出しの場合

```javascript
var test = 'yamada';

var myobj = {
  test: 'taro',  
  myThis: function(){
    this.test = 'hanako';

    var arrow1 = function (){
      console.log(this.test);  // yamada
    }
    
    var arrow2 = () =>{
      console.log(this.test);  // hanako
    }

    arrow1();
    arrow2();
  }
};

myobj.myThis();
```
先ほどのメソッド内に定義されている関数のスコープを確認した時のものにアロー関数を追加したもの。
arrow1は前記した通り、関数なので`グローバルオブジェクト`を参照しているが、何とアロー関数の場合はメソッドを呼び出している`オブジェクト`を参照している。
同じ関数でも参照先が違うのは注意しておきたい。
Attentionのメモ



トップダウン型注意とボトムアップ型注意

トップダウン性注意：刺激について事前知識をもっていて，バイアスすることで，目的とする刺激を選択する<font color="Lime">能動的</font>な注意のこと

ボトムアップ性注意：1つの刺激が周囲の刺激と顕著に異なったり，刺激が突然出現した場合にその刺激に対して惹きつけられるような<font color="Lime">受動的</font>な注意のこと

また，ボトムアップ性注意を誘引するような特性のことをサリエンシー(Saliency)と呼ぶ

このサリエンシーはスライドを作るときに応用すると伝えたいことが強調されて良いかも．

[参考](https://bsd.neuroinf.jp/wiki/%E8%A6%96%E8%A6%9A%E6%80%A7%E3%83%88%E3%83%83%E3%83%97%E3%83%80%E3%82%A6%E3%83%B3%E5%9E%8B%E6%B3%A8%E6%84%8F%E3%81%A8%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E5%9E%8B%E6%B3%A8%E6%84%8F)
SignalFxでAWSのモニタリングをやってみる

#SignalFxでAWSのmonitoringをやってみる

前にはほぼデフォルトでリソースの取得からdashboardの作成までやってみたので、今回はawsのデータを収集してみようかと思います。

https://qiita.com/saeoshi/items/8898c0a34d52c71906d7

Intergationの画面をみると、Cloudwatchからデータを引っ張ってくるみたいですね。

<img width="665" alt="Screen Shot 2019-11-05 at 12.32.28 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/69322d0c-c6d7-b3b6-2092-701a82ebda21.jpeg">

## Setup

### SignalFx用のIAMロールの作成
下記を参考に、policyを作成してロールに紐づけてください。

https://docs.signalfx.com/en/latest/integrations/amazon-web-services.html#connect-to-aws

### SignalFx側に設定
Integration→Amazon Web serviceを選択すると、ARNか、Access key/Secret IDを登録する画面が
出てくるので入力します。

<img width="794" alt="Screen Shot 2019-11-05 at 12.59.02 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/fcbeb87d-6ea2-8ff7-6cef-3bd5e6b79157.jpeg">


### Metricsの確認
設定後、数分でcloud watch側からのデータがsyncされ、metricsが見れるようになる。
Metrics画面に移動すると、下記のように各サービスが選択できるようになる。

<img width="1680" alt="Screen Shot 2019-11-05 at 12.43.56 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/bb870a4b-8e71-a946-f46e-126dc63b5a7e.jpeg">

EC2をクリックしてみると

<img width="1680" alt="Screen Shot 2019-11-05 at 1.10.12 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/4862209b-c26c-7ec0-52a4-5960707d17d8.jpeg">

設定されてるMetricsが取得可能になっていることが確認でできる。
ちょっとみづらいけど、、、

<img width="1296" alt="Screen Shot 2019-11-05 at 1.17.36 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/ebcd4fe2-d61b-74ec-6292-06674226700e.jpeg">

###Dashboardの確認
cloudwatchからデータを取得すると、EC2やRDS用のDashboardが自動で作成される。
Dashboard画面にいくと、下記にような形で表示されている。

<img width="1574" alt="Screen Shot 2019-11-05 at 1.21.32 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/08918bf2-1241-2132-aa7b-7a8a8331d10a.jpeg">

<img width="1680" alt="Screen Shot 2019-11-05 at 1.21.45 PM.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190656/c7288c0c-cf60-4e07-fcba-ba3758ff04da.jpeg">

##最後に
結構簡単に取れるので、そこそこ便利かな〜という印象です。
アプリケーションのトレースが強いみたいなので、そこは後日やってみたいと思います。
【Linuxコマンド再現】ls -xをRubyで表現してみた

## はじめに
[こちらの記事](https://qiita.com/rana_kualu/items/19ab559dddbca6674417)で`ls`コマンドを学習中の言語で実装してみるといい練習になるという内容があったので、試してみました。

既存機能を自分で実装するのはロジックを組む練習にいいですね。

## この記事が役に立つ方
- ロジックを組むことに慣れていない
- Ruby初心者

## この記事のメリット
- `ls -x`コマンドを再現出来る
- ロジックを考える練習になる

## 環境
-  OS： macOS Mojave version 10.14.6
* シェル： zsh
* 使用言語： Ruby 2.6.3

## `ls -x`コマンドがやっていること
以下が`ls -x`コマンドの機能です。これを練習として、自作してみます。

2. カレントディレクトリ内のファイル・ディレクトリ一覧を取得
3. 取得した一覧から、デフォルトで非表示のもの（’.’や ‘..’など）を間引く
4. 間引いた一覧を繰り返し処理で出力していく。出力時のルールは以下3点
	- ファイル名・ディレクトリ名は見やすいように折返し表示にしない
	- 表示幅は「最大のファイル・ディレクトリ名の長さ」+半角スペース１つ
	- 名前の頭を昇順ソートし、Z字の順に表示

## ターミナルの幅・サンプルファイル名
作成するプログラム名：`ls_command.rb`
ターミナルの幅：50
サンプルファイル・ディレクトリ:以下（`ls -1`で出力）

```zsh
banana8.txt
banana9.txt
ls_command.rb
orange #ディレクトリ
ruby #ディレクトリ
ruby4.txt
ruby5.txt
ruby6.txt
ruby7.txt
sample #ディレクトリ
sample1.txt
sample2.txt
sample3.txt
```

## プログラム
自分で考えた結果がこちらです。
先日学んだ[%による幅指定](https://qiita.com/terufumi1122/items/f949bfc325e6ac107a76)も活用しています。
こういうところで使うんですね。

```ruby:ls_command.rb
children = Dir::entries(".").sort

# 文字数の最大値を算出。
string_length_max = 0 

children.each do |n|
  if string_length_max <= n.length
    string_length_max = n.length
  end
end


# ターミナルの幅 を 文字数の最大値+1 で割ることで、見やすく整形する準備を行う。
p column = (`tput cols`).to_i / (string_length_max + 1)

# 不要なファイルを配列から削除。
without_list = [".", ".."]
new_children = children - without_list

# 実表示部分。
new_children.each_with_index do |item, index|
    print "%-#{string_length_max}s " % [item]
    case (index + 1) % column
    when 0
      print "\n"
    end unless index == 0
end

```
## 出力結果
うまくいきました！

```zsh
❯ ruby ls_command.rb
banana8.txt   banana9.txt   ls_command.rb 
orange        ruby          ruby4.txt     
ruby5.txt     ruby6.txt     ruby7.txt     
sample        sample1.txt   sample2.txt   
sample3.txt    
```

参考：`ls -x`コマンドでの出力

```zsh
❯ ls -x
banana8.txt   banana9.txt   ls_command.rb
orange        ruby          ruby4.txt
ruby5.txt     ruby6.txt     ruby7.txt
sample        sample1.txt   sample2.txt
sample3.txt
```

## 悔しいポイント
### 1. `ls`コマンドが再現出来ていない
`ls -x`コマンド：「Z字」の順にファイル・ディレクトリ名が出力される（左上→右上→左下→右下）

`ls`コマンド：「N字の左右反転」順に出力される（左上→左下→右上→右下）

どうやったら縦にならびつつ、列方向にも出力できるのか？

### 2. 動作が遅い
通常の`ls -x`よりも動作がワンテンポ遅く、どこの部分が速度を落としているのか？

`each_with_index`の中に`case`を入れてしまっているなど、条件分岐が多いからでしょうか。このあたりはまだ全然わかりません。

## おわりに
いつもお世話になっている`ls`ひとつでも自分で考えると大変でした。
いい勉強。

小さなプログラムのロジックであればパッと頭に浮かんでくるよう、今後も継続して学習していきます！

## 参考にさせて頂いたサイト（いつもありがとうございます）
[Rubyでターミナルのサイズを取得する - Qiita](https://qiita.com/kwyt/items/d54525639ff7ec55b293)
[配列の複数要素の削除はdelete_ifかreject、-なんかを使おう - Qiita](https://qiita.com/zom/items/4461d786c35ae9eced0b)

## 【追記】 リファクタリング後の`ls -x`　17行→6行
@scivolaさんのアツいコメントを受け、早速修正してみたので追記します。
なんと、11行も間引くことができました！

元の自分のコードがなんて冗長だったのかと猛省です。

リファクタリングでこんなにも簡素化できるんですね。
`map`や`join`の使い方は特に応用が効きそうなので、今後も意識的に「使えないか？」という疑いを持っていきます。

```ruby:ls_command.rb
children = Dir::children(".").sort

# 文字数の最大値を算出。
string_length_max = children.map{ |child| child.length }.max

# ターミナルの幅 を 文字数の最大値+1 で割ることで、見やすく整形する準備を行う。
column = (`tput cols`).to_i / (string_length_max + 1)

# 実表示部分。
children.each_slice(column) do |items|
  puts items.map{ |item| "%-#{string_length_max}s " % item }.join
end
```
while文

#はじめに
この記事ではwhile文の使い方を簡単にまとめています。

##while文の作成方法

```
while 条件式:
   　　条件式が真の時に実行する文
```
と書きます。

条件式が真となった時、
whileブロックの中の式が
順に実行されて行きます。

while文は、
条件式が真の間、
無限に処理が繰り返されます。

なので、
必ず繰り返し処理が終了するよう
中身の式を考えましょう!

##while.else
while.elseを使うと、
条件式が偽になった時に施行する
式が書けます。

```
while 条件式:
      条件式が真の時に実行する文
else:
      条件式が偽の時に実行する文 
```

：を忘れないようにしましょう。


##参照
https://www.javadrive.jp/python/for/index1.html
Cognos filter関数でパラメーターをオプションにする

#filter関数でオプション
以前、こちらでfilter関数について紹介しました。
**Cognos ディメンショナルモデルでのフィルター&値のプロンプト&ドリルスルーの例**
https://qiita.com/shinyama/items/26f80635cd275f77cfe2

filter関数を使用すると、パラメーターが「必須」になってしまいますが、オプションにする方法を投稿しておきます。

こちらに似ているのですが、ちょっと書き方違ったので、念のため。
**Cognos レポートでSQL直書き時に使用するpromptmanyをオプションにする方法**
https://qiita.com/shinyama/items/8f1ea0877033cdb44396

いきなりですが、こちらでできました。

```html
filter([販売].[製品].[製品].[製品ライン],caption([販売].[製品].[製品].[製品ライン]) in (#promptmany('pPL','string',"'NoSelect'")#) or ('NoSelect' in (#promptmany('pPL','string',"'NoSelect'")#)))
```
**レポートの実行イメージ**
プロンプトを選択していないけど「終了」可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/c01ba0c3-574e-3b01-456f-63205be73327.png)

そのまま終了の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/397d08c1-874f-69c0-6aea-2fa08709a622.png)

「キャンプ用品」と「ゴルフ用品」を選択した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/cb8c3983-f05d-605c-e47e-6af6620d5a8c.png)

はい、大丈夫そうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/a3d0c8b9-57bf-76d3-a67c-6f4014b94d92.png)

ご活用下さい！
QuillをVueなどのSSRを加味して組み込む 他tips

# Quill
[Quill https://github.com/quilljs/quill](https://github.com/quilljs/quill)
> Quill is a modern WYSIWYG editor built for compatibility and extensibility.

Quillはテキストエディタライブラリです。
拡張性も高いですが、特殊な仕様の理解が必要です。
Quillを扱う（拡張する）tipsの紹介をします。

## QuillのSSR時のエラー回避
Vue.jsなどのSSR可能なフレームワークでSSR時にQuillをimportするとDOM系のAPIを参照しエラーになってしまいます。

<img width="1000" alt="スクリーンショット 2019-11-05 12.41.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6046/fb1cb02c-6117-d9a2-87cf-644eaf793c20.png">


### 対策（Vue.jsの場合）
```.vue
<div red="editor" />

<script>
let Quill = {}
if (process.client) {
  Quill = require('quill')
}

export default {
  ...
  mounted () {
    if (process.client) {
      const quill = new Quill(this.$refs.editor.$el)
    }
  }
}
</script>
```

サーバサイドではimportできない・importはブロックの中では実行できないので`require`を使います。


## 改行時のスクロールをwindowする
Quillでは改行・折返しによりテキストの高さが変化した際の自動スクロールを親階層のDOMエレメントしか指定することができません
DOM構造や既存のスタイルの関係上windowをスクロールしたい場合が考えられます。

### 対策
```.js
quill.selection.scrollIntoView = function (scrollingContainer) {
  const range = this.lastRange
  if (range == null) return
  const bounds = this.getBounds(range.index, range.length)
  if (bounds == null) return
  const limit = this.scroll.length() - 1
  const [first] = this.scroll.line(Math.min(range.index, limit))
  let last = first
  if (range.length > 0) {
    [last] = this.scroll.line(Math.min(range.index + range.length, limit))
  }
  if (first == null || last == null) return
  const scrollBounds = {
    top: 0,
    bottom: window.innerHeight
  }
  if (bounds.top < scrollBounds.top) {
    window.scrollBy(0, -(scrollBounds.top - bounds.top))
  } else if (bounds.bottom > scrollBounds.bottom) {
    window.scrollBy(0, bounds.bottom - scrollBounds.bottom)
  }
}
```

quillの`scrollIntoView`の実装を参考にスクロール処理をwindowに差し替えましょう

## ドラッグ＆ドロップで画像を挿入する
quillにはドラッグ＆ドロップの処理は組み込まれていないので自前で追加しましょう

```.js
quill.container.addEventListener('drop', (event) => {
  if (!event.dataTransfer.files || event.dataTransfer.files.length == 0) {
    return
  }
  event.stopPropagation()
  event.preventDefault()

  const files = event.dataTransfer.files
  const file = files[0]
  const name = file.name
  const range = quill.getSelection(true)

  someUploadFunc(file).then(response => {
    quill.insertEmbed(range.index, 'image', response.url, 'user')
  }).catch(error => {
    console.error(error)
  })
}, false)
```
【Git】ローカルブランチとリモートブランチの差分を表示させるコマンド集

ローカルブランチとリモートブランチの差分を表示させるコマンドの覚書きです。

## 対象ツール
- Git

## 手順
### 1. リモートリポジトリの変更履歴の取得
```
> git fetch origin リモートブランチ名
【例】
> git fetch origin master
```

### 2. ローカルブランチとリモートブランチの差分を表示させる
以下に様々なタイプのコマンドを記しておく

## (1) git diff
差分のあるファイル（とその内容）を表示させる

### ①オーソドックスなコマンド

```
> git diff ローカルブランチ名 origin/リモートブランチ名
【例】
> git diff master origin/master
```

### ②サマリを表示

```
> git diff --stat ローカルブランチ名 origin/リモートブランチ名
【例】
> git diff --stat master origin/master
```

### ③差分のあるファイル名を表示

```
> git diff --name-status ローカルブランチ名 origin/リモートブランチ名
【例】
> git diff --name-status master origin/master
```

## (2) git log
コミットハッシュ値の現在地（ローカルブランチとリモートブランチそれぞれ）を表示させる

### ①オーソドックスなコマンド

```
> git log ローカルブランチ名 origin/リモートブランチ名
【例】
> git log master origin/master
```

### ②1コミット1行で表示
```
> git log --oneline ローカルブランチ名 origin/リモートブランチ名
【例】
> git log --oneline master origin/master
```

## 参考
- [Gitでリモートブランチとローカルブランチの差分を表示する | Pistolfly](https://www.pistolfly.com/weblog/2010/11/git-svn-status-showing-chang.html)
- [忘れやすい人のための git diff チートシート | Qiita](https://qiita.com/shibukk/items/8c9362a5bd399b9c56be)
- [git diff を徹底攻略！よく使う便利オプションまとめ、完全版。 | WWW CREATORS](http://www-creators.com/archives/755#i-9)
- [［初心者向け］こんなときどうする⁉︎ GitのTips31選！ | Qiita](https://qiita.com/Keisuke69/items/35d60e4e375fc525ccbd)
Django環境の構築 for Win10 (with 仮想空間)

# 概要

まっさらなWindows10にDjangoをインストールする手順について書きます。

※なお、筆者の環境に構築した際の覚書きとなります。色々なインストール方法があるかと思われますので、これが全てではありません。

# 構築環境の前提条件

* Windows10 (筆者の場合はProエディション)
* Pythonは未だ入っていない

# 環境構築の方針

* PowerShellを使うよ
* venvで仮想空間にDjangoをインストール

# Pythonのインストール

## ダウンロードとインストール

**はじめにPythonありき。**

Windows10のPythonは公式のインストーラーをダウンロードして行うのがいいでしょう。
Anacondaには手を出さないでおきます。

Pythonのバージョンは**3系**を使います。

本記事の環境構築時の最新バージョンは3.7.4
下記サイトの下の方から自分の環境に合わせてダウンロードします。
https://www.python.org/downloads/windows/

64bit環境のインストーラーを選択しました。

ダウンロードしたものをインストールします。
このとき、筆者はPATHを通すオプションにチェックを付けました。
デフォルトではOFFになっていると思います。

## インストールできたか確認

Windows10のPowerShellを立ち上げて、Pythonのバージョンを確認します。
Windowsはpython, pyどちらも使えます。pyは最新バージョンが指定されるようです。

```
PS C:\Users\AKI> python --version
Python 3.7.4
 
PS C:\Users\AKI\django_proj> py --version
Python 3.7.4
```

# Django環境構築

**本記事ではDjangoはPythonの仮想環境を利用して構築します。**

仮想環境とは、**仮想的に閉じた空間**を作ることで、Pythonの色々なパッケージでごちゃごちゃパソコンを汚さないことに役立つものです。

**この仮想環境の中でDjangoを動かします。**

## Django環境構築用のディレクトリを用意

PowerShellで自分の好きなところにディレクトリを作ります。
今回は自分のHOMEに作ります。
ディレクトリを作ったらその中に移動します。

```
PS C:\Users\AKI> mkdir django_proj
PS C:\Users\AKI> cd .\django_proj\
PS C:\Users\AKI\django_proj>
```

## venvで仮想環境を用意

venvというもので仮想環境を構築します。

Python2系の時にはvirtualenvというものを使っていたようですが、3系ではvenvになりデフォルトでPyhonに入っています。

では、構築します。
ここでは仮想環境の名前を「env01」と名付けます。

```
PS C:\Users\AKI\django_proj> python -m venv env01
PS C:\Users\AKI\django_proj> ls
 
env01  <-このフォルダができる
```

そして、**Scripitsフォルダの中にあるactivateを実行する**ことで仮想環境の中に入ります。

```
PS C:\Users\AKI\django_proj> .\env01\Scripts\activate
(env01) PS C:\Users\AKI\django_proj>
```

Shellの先頭に(env01)と表示されました。

**あなたは今仮想環境の中にいます。**

ここでもPythonのバージョンを確認しましょう。

```
(env01) PS C:\Users\AKI\django_proj> python --version
Python 3.7.4
```

## Djangoの導入

仮想環境の中でpipを使って導入します。

「pip」とはPythonのライブラリやらパッケージやらを管理するシステムです。
初心者がAnacondaを入れて適当にやった場合は、よくわからないままにパッケージがpipと干渉を起こしてローカル環境が混沌と化します。

はじめにpipの最新版にアップグレードしておきます。

```
(env01) PS C:\Users\AKI\django_proj> python -m pip install --upgrade pip
```

コマンドを入力してインストールします。

```
(env01) PS C:\Users\AKI\django_proj> pip install Django
.
.ここで色々ログが流れる
.
Successfully installed Django-2.2.3 pytz-2019.1 sqlparse-0.3.0
```

Djangoのバージョンを確認します。

```
(env01) PS C:\Users\AKI\django_proj> django-admin --version
2.2.3
```

ちなみに、ここでPoserShellをもう一つ立ち上げて、そこでDjangoのバージョンを確認してみましょう。

```
PS C:\Users\AKI> django-admin --version
 
そんなコマンドは無いと言われる。
```

**仮想環境の中だけにDjangoが構築できました。**

仮想環境を抜けるときは下記のようにコマンドを入力します。

```
(env01) PS C:\Users\AKI\django_proj> deactivate
PS C:\Users\AKI\django_proj>
```

**現実に戻りました。**

以上でDjangoの環境が構築できました。

次のステップはTutorialです。
フロントエンドカンファレンス関西2019

## フロントエンドカンファレンス関西2019

[フロントエンドカンファレンス関西2019](https://2019.kfug.jp/) 登壇資料 一覧

ハッシュタグ: [#frontkansai](https://twitter.com/search?q=%23frontkansai)

※ 一部反映されてない登壇スライドあり、随時更新予定です

### A session

- [モダンJavaScript再入門](https://speakerdeck.com/likr/re-introduction-to-modern-javascript)
- [ディレクトリ構成ベストプラクティス ~ Angularアプリを作り続けてわかったこと](https://speakerdeck.com/okunokentaro/frontend-conference-2019)
- Adobe XDで作るマイクロインタラクション
- [2019年のUIパフォーマンス](https://speakerdeck.com/jlkiri/2019nian-falseuipahuomansu)
- AWSを活用したフロントエンド開発
- [私たちはなぜ SPA で開発するのか](https://speakerdeck.com/potato4d/why-you-choose-spa)
- [フロントエンドエンジニアのためのセキュリティ対策 ~XSS編~](https://speakerdeck.com/masashi/number-frontkansai-2019)

### B session

- [デザイン設計の体幹とスキル](https://speakerdeck.com/ykazu/core-skills-of-the-design-for-front-end)
- [事例からみるアプリデザインの成長戦略とWeb Native Platform](https://speakerdeck.com/rdlabo/app-design-growth)
- [UIデザイナが実装できると良いこと](https://speakerdeck.com/contiki9/ui-designer-coding-goood)
- [高齢者でも使えるプロダクトUIの挑戦](https://speakerdeck.com/jmblog/designing-user-interfaces-for-the-elderly)
- [プロダクト開発とFigmaのより良い関係を求めて](https://speakerdeck.com/takanorip/purodakutokai-fa-tofigmafalseyoriliang-iguan-xi-woqiu-mete)
- [居酒屋で使えそうなアプリをflutter for webで作ってみた備忘録](https://speakerdeck.com/yujionishi/ju-jiu-wu-deshi-esounaapuriwoflutter-for-webdezuo-tutemitabei-wang-lu)

### C session

- [PWAとCache API](https://speakerdeck.com/tiwuofficial/pwatocache-api-number-frontkansai)
- [JavaScript も jQuery も未経験の新人エンジニアが 1 年間 Vue.js を 学習して感じた話](https://speakerdeck.com/yugkwmt/frontend-conference-2019)
- [レガシーなフロントエンドをリプレイスする](https://speakerdeck.com/daikids2/regasinahurontoendoworipureisusuru)
- [Nuxt.js + Firebaseでの開発と高速化に挑んだ話](https://speakerdeck.com/bumptakayuki/nuxt-dot-js-plus-firebasetefalsekai-fa-togao-su-hua-nitiao-ntahua)
- [ReactHooksでvideoを乗りこなす](https://speakerdeck.com/narirou/reacthookstevideowocheng-rikonasu)
- [Web制作現場のディレクションを支えるGitHub](https://speakerdeck.com/mikakane/webzhi-zuo-xian-chang-falsedeirekusiyonwozhi-erugithub)

### Handson

- [Vue](https://github.com/ryo-is/vue-handson-app)
- [React](https://github.com/44x1carbon/frontendconf2019-react-handson)
- [Angular](https://github.com/ng-kyoto/angular-handson-2019kfug)

### LT

- [脊髄反射でプロダクト作ることの学びとススメ](https://www.notion.so/2019-7cbaa8438e6746029172267e50f9c5fa)
- [Angularはいいぞ！フレームワークにAngularを採用した理由](https://slides.com/yayoimatsuoka/frontend-kansai-2019#/)
- [TypeScriptでHTTPリクエストを型安全にする方法](https://docs.google.com/presentation/d/1OoceK0kGSQ9N0l6q-d1UK3zo2gmImwDNKgSfBp8bkOg/edit#slide=id.g6f5b5c2297_0_147)
- [コンポーネント管理の失敗と今後のやっていき](https://speakerdeck.com/yahooshiken/konponentoguan-li-falseshi-bai-tokorekarafalseyatuteiki)
- Automatic Test for Frontend Side
Error while connecting to SSH FS : Couldn't find the requested PuTTY session これ

#SSH-FSでこのエラーがでてくる
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525883/eed736db-9fa3-4484-338a-55771b58f020.png)

ちなみにこの時点でsettingは
Host,Port,Username,Passwordを記述済み

##解決策
Rootの記述
/から始まるルートディレクトリの設定を行っていなかった
ラズパイなら/home/pi的な
##おわり
しょーもない
Python初心者向け　学習フロー

Python初心者の私がPython学習するにあたって、「この流れで学習したらいいかな～」と思ったものをまとめてみました。

もし、Python初心者の方で「どういう手順で何をやったらいいかわからない」という方がいれば下記の流れで学習してみてはどうでしょうか。

##Pythonでできることをざっくり理解
　https://www.sejuku.net/blog/3863

##学習を進める前に知っておくとよさそうなもの
　〇仮想環境でバージョン管理
　　https://blog.codecamp.jp/programming-python-virtual-environment

##Python学習サイトまとめから自分にあった学習サイトを選択
　https://proengineer.internous.co.jp/content/columnfeature/12344

##私が使用した学習サイト
　https://www.javadrive.jp/python/
WordよりTexを薦める

Tex
Texはword版のプログラム言語という認識。


Tex
メリット
・配置、レイアウトをプログラム言語で指定できるため、体裁がまとまる。
・機能拡張できる。組み込みファイルを用いれば、さらに細かく指定できる。
・軽い、慣れれば早い。

デメリット
・言語の文字化けもありうる。
・コンパイルをミスると出力できない。
・思い通りにならないこともある。

Word
メリット
・直感的に作れる。
デメリット
・メモリを食う。
・思い通りにならないことがある。

以上
float の解除 clearfix

# 子要素が全てfloatの時の、親要素の高さ 

通常、親要素の高さは子要素を包む高さとなるが、子要素が全てfloatの時、親要素の高さは0となってしまうという性質がある。

float は浮いているという意味で、親要素からみると float の子要素は存在しないように見えるからである。


例

```html

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title></title>
    <link rel="stylesheet" href="css/reset.css">
    <link rel="stylesheet" href="css/style.css">
  </head>
  <body>
    <header class="header">

    </header>
    <div class="wrapper">
      <main class="main">

      </main>
      <div class="sidemenu">

      </div>
    </div>
    <footer class="footer">

    </footer>
  </body>
</html>
```

```css
.header {
  width: 100%;
  /* border: 1px solid red; */
}

.wrapper {
  width: 970px;
  /* border: 1px solid red; */
  margin: 30px auto 40px;
}

.main {
  display: block;
  float: left;
  width: 660px;
}

.sidemenu {
  float: right;
  width: 275px;
}

.footer {
  width: 100%;
}


.header, .main, .sidemenu, .footer {
  border: 1px solid #aaa;
  background-color: #ccc;
}
.header, .footer {
  height: 100px;
}
.main, .sidemenu {
  height: 500px;
}

```

mainクラスとsidemenuクラスにはそれぞれfloatが指定されているため高さを認識できなくなり、footerが上がってしまう。

<img width="1680" alt="スクリーンショット 2019-11-05 12.19.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/5b4edc8c-6215-ab50-72c6-4bc1916f59a6.png">


# 改善策

親要素に`clearfix` クラスみたいにクラス名をつける(使いまわせるように)。

```html
<div class="wrapper clearfix">
  <main class="main">

  </main>
  <div class="sidemenu">

  </div>
</div>
```

擬似要素を使用し`clear: both;`とし(もしくは 'clear: left;')、floatを解除することで、高さを認識できるようになり、この問題を解決することができる。
https://saruwakakun.com/html-css/basic/before-after

```css
.clearfix::after {
  content: '';
  display: block;
  clear: both;
}
```


<img width="1677" alt="スクリーンショット 2019-11-05 12.29.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/0990ebf2-5c94-b5da-374e-3dc0d69a06f8.png">