OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntuを18.04以降にアップグレードした時にNFSのマウントに失敗するようになったとき

以下の全部を試す必要はないかも知れない。上から順にやってみるといいかも。

# サービスが足りない
アップグレードで「NetworkManager-wait-online」が登録され忘れているようなのでsystemctlでenableしよう。
`sudo systemctl enable NetworkManager-wait-online`

# NFSのバージョン違い
NFSのデフォルトがNFS4になっているようなのでサーバがNFS3ならオプションに`vers=3`を追加しよう。

# `netdev`と`_netdev`
マウントオプションにネットワークサービスの起動を待つ`netdev`オプションがあるのだが、これが`_netdev`に変わったっぽい。
GANのトレーニングのしくみがわかってきた。。

##１、GANをひとつのネットワークとしてとらえる。
<img width="1245" alt="スクリーンショット 2020-07-21 6.54.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/fa29a7e9-c211-4cd0-b9fc-0073d7fc1ef4.png">
シンプルなニューラルネットワークのトレーニングは、「ネットワークを計算が進んでいって、アウトプットと正解との差を計算し、誤差逆伝播で重みを更新する。。。」と直線的に理解しやすいのですが、GANは２個ネットワークがあるみたいだし、ロスも２種類あるし、どうやってトレーニング計算しているんだろう、と思っていました。
コードを読んでいくと、
GANも「ひとまとまりのネットワーク」としてとらえることによって理解しやすいのではないかと思うようになりました。
入力→ジェネレーター→ディスクリミネーター→出力、というワンストップのネットワークとしてです。
##２、GANの本当のアウトプット
GANをひとつのネットワークとしてとらえると、アウトプットはなんだと思いますか？
イメージ？　
ちがうんです。
アウトプットはたったひとつの数字です。
「0.2」とかです。
この単純な数字をもとに、トレーニングはすすみます。
トレーニング１ステップのなかで、
本物画像をGANに入力したアウトプット（リアル・アウトプット）
偽物ノイズをGANに入力したアウトプット（フェイク・アウトプット）
が計算されます。
これらは最初に言った単純な数字です。
たとえば、
リアル・アウトプット「0.6」
フェイク・アウトプット「0.3」
とかです。
ピクセルの数だけ数字があるとかではありません。本当に１個だけの数字です。

##３、アウトプットの正解
このアウトプットの正解は、
本物（リアル）が「1」
偽物（フェイク）が「0」
です。
先程の例とくらべると、本物を入力した結果「0.6」は、本物を入力した時の正解の「1」と（単純に引き算して）0.4の差があるといえます。
また、偽物の結果「0.3」は、偽物を入力した時の正解の「0」と（単純に引き算して）0.3の差があるといえます。
##４、アウトプットと正解の差をもとにトレーニングされる
ディスクリミネーター・ロスは、
リアル・アウトプットと「１」の差
＋
フェイク・アウトプットと「0」の差
です。
要するに、本物は本物、偽物は偽物、となるような正解の数字とどれだけ誤差があるかがディスクリミネーター・ロスです。
ジェネレーター・ロスは、フェイク・アウトプットと「１」の差
です。
要するに、偽物を入れた時に「本物（１）」とどれだけ誤差があるかがジェネレーター・ロスです。
これらのロスをもとに、ネットワークの重みを誤差逆伝播法で調整していくのですが、
ディスクリミネーター・ロスをもとに調整されるのは、ネットワークのうちディスクリミネーターの重みのみ、
ジェネレーター・ロスをもとに調整されるのは、ネットワークのうちジェネレーターの重みのみ、
です。
誤差逆伝播法とは、ロスの差がなるべく小さくなるように少しずつネットワークの重みを調整していくのですが、
ディスクリミネーターは正解との誤差をなるべく小さくするように逆伝播調整され、
ジェネレーターは、フェイク・アウトプットを本物（１）に近づけるように逆伝播調整されます。
これにより、「ディスクリミネーターは本物と偽物を判別するようにトレーニングされる、ジェネレーターは偽物を本物としてディスクリミネーターをあざむくようにトレーニングされる」、というよく聞くGANの構造になるわけです。
そして、トレーニングされたジェネレーターは、本物に似た画像を生成するようになりますが、トレーニング過程において、ジェネレーターの生成する画像は、あくまでGANネットワーク全体の中間表現にすぎません。


Twitterフォローしてくださいお願いします！
https://twitter.com/JackdeS11
用語：「経緯度」＝（経度、緯度）を調べた

こんにちは。
用語に関しまして、『「経緯度」＝（経度、緯度）』を調べてみました。ただし、「[経緯度](https://ja.wikipedia.org/wiki/経緯度) 」(Wikipedia) の中のほぼ引き写しです。

- 「経緯度」とは、「（経度、緯度）」のこと
- この「経度、緯度」の順で並べることは、
  - 和漢の伝統の用例通り[^1]
  - [右手系](https://ja.wikipedia.org/wiki/右手系)に準拠

[^1]: 日本の法律文・公式文書に現れる場合も、全て「経緯度」です。
用語：『「測定」＋「算出」＝「計測」』の意味を調べた

こんにちは。
用語に関しまして、『「測定」＋「算出」＝「計測」』という意味の説明を目にしました。そこで自分なりに調べて区別を明確化しようと試みました。

- 測定値（測定値データ）を得ることを指して「**測定**」と呼ぶ。
  - 用例：「体重測定」
- データ値（もしくは元となる値）を用いて、有用な値を求めることを指して「**算出**」と呼ぶ。
  - 用例：「体重測定値と身長測定値とから[ボディマス指数](https://ja.wikipedia.org/wiki/ボディマス指数)（BMI）の値を算出する」
- この上記の二つを合わせて行うことを指して「**計測**」と呼ぶ。
  - 用例：「住民の[ボディマス指数](https://ja.wikipedia.org/wiki/ボディマス指数)を計測する」
Local by Flywheel で Bedrock のローカル環境を作ったメモ

### 使用状況 -v

* Mojave 10.15.5
* Composer  1.10.5
* PHP 7.3.5
* Local by Flywheel 5.6.3

***
[rootのサポートページ](https://roots.io/guides/local-bedrock-development-with-local-by-flywheel/)
サポートページの通りに普通にwordpressをカスタムインストール。

### ローカル環境構築

1. 「`+`」ボタンをクリック
2. 適当にサイトに名前(今回は```bedrock```)を付ける
3. 希望の環境を選択(カスタム - PHP:7.3 WebSever:Niginx Database:MySql5.7)
4. WPのユーザー名とパスワードを入力（あとで削除するので適当に...）
5. 「`ADD SITE`」をクリック。

SSLもついでに追加
1. 設定のタブから、「`SSL`」をクリック
2. 「`TRUST`」をクリック
3. macのパスワード入力


###Bedrockをインストール
仮のフォルダ名:bedrock
From ~/Local Sites/bedrock/app/, run:

```
$ composer create-project roots/bedrock bedrock
```

bedrock内の .env ファイルを編集。
★Flywheelにあるデータベース記入
★WP_HOMEのパスを変更

```
DB_NAME='local'
DB_USER='root'
DB_PASSWORD='root'

# Optionally, you can use a data source name (DSN)
# When using a DSN, you can remove the DB_NAME, DB_USER, DB_PASSWORD, and DB_HOST variables
# DATABASE_URL='mysql://database_user:database_password@database_host:database_port/database_name'

# Optional variables
# DB_HOST='localhost'
# DB_PREFIX='wp_'

WP_ENV='development'
WP_HOME='https://bedrock.local'
WP_SITEURL="${WP_HOME}/wp"
WP_DEBUG_LOG=/path/to/debug.log

# Generate your keys here: https://roots.io/salts.html
AUTH_KEY='generateme'
SECURE_AUTH_KEY='generateme'
LOGGED_IN_KEY='generateme'
NONCE_KEY='generateme'
AUTH_SALT='generateme'
SECURE_AUTH_SALT='generateme'
LOGGED_IN_SALT='generateme'
NONCE_SALT='generateme'
```

### nginx設定を更新する
~/Local Sites/bedrock/conf/nginx/site.conf.hbsを編集

```
-root "{{root}}";
+root "/Users/username/Local Sites/bedrock/app/bedrock/web";
```
サーバーを再起動で完成。
YAMAHA RTX1200 GUIでPPPoE設定

#はじめに
![20200704_234243.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462058/3a8a7a83-8af1-5b9f-59b4-a4a63d65de95.jpeg)

RTX1200を購入したので設定してみた。
もちろん会社用ではなくプライベート用に。
我が家のネットワーク環境を担っていたのはBuffaloのWSR-2533DHP×2台なのだが、どうも最近WiFiが途切れることが目立ち、ついに有線でもネットワークが途切れる現象が起きた。
従って、今回は原因の切り分け＆興味本位でRTX1200を購入した。ついでにルーターの配下に無線ルーターを置く設定もしてみたかったのだ。
VPNの設定は本機ではないがFortiGateのUTMでは経験したことがある。

##現在のスピードテスト
2.4GHz
![Screenshot_20200704-122255_Google.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462058/408893a9-176a-7574-54a6-a0121377860b.jpeg)


5GHz
![Screenshot_20200704-122214_Google.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462058/6174967e-f666-3757-56cf-7b92f78f7936.jpeg)

##用意するもの
・プロバイダ情報
・LANケーブル
・PC

#いざGUIで設定
中古で購入したので念のため初期化してからPCとLAN１ポートを繋ぐ。
WAN側にはLAN2 or LAN3ポートにONUからLANケーブルを繋ぐ。
##デフォルトゲートウェイの確認～管理者画面へログイン
初期IPアドレスは192.168.100.1になっているのでデフォルトゲートウェイを確認する。

```.bat
ipconfig /all
```
デフォルトゲートウェイの確認ができれば、インターネットブラウザを開きアドレスバーに http://192.168.100.1/ と記入して管理者画面へ入る。
ルーターが工場出荷状態になっていればユーザー名、パスワードともに空白で入れる。
<img width="787" alt="１.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462058/229ce57c-f509-100b-23ba-8cf5cf86f968.png">
トップページに入れたら、管理者向けトップページをクリックし、ユーザー名パスワードともに同じく空白で入る。

##PPPoE設定
管理者向けトップページに入れたら、初期設定のウィザードからプロバイダ情報の設定をクリックする。
WAN側に繋いだポートを選択し、プロバイダ情報を入れていく。
ntpサーバーに関しては、各種プロバイダーが提供するntpサーバーを記入することをおすすめする。
まぁ家庭レベルでいえばいらないのだが、企業の情シスレベルになるとルーター側の異常があったときに正確な時刻を取得していればいつなにがあったのかがわかるので幸せになれる。

##RTX1200配下に無線ルーターを配置する
LAN1ポートに無線ルーターのWANポートに繋ぐ。
この時無線ルーターは無線AP機能だけで稼働させたいのでROUTERモードからAPモードへ、AUTOからMANUALへとそれぞれスイッチを切り替える。
しばらくするとWiFiが認識し始める。

##DHCPリース範囲の設定
家庭レベルなのでなんでもいいが、無線ルーター×二台はIPが変わると困るので固定にしたい。
固定したIPアドレスがリース範囲に被ってしまうのを防ぐため、無線ルーターのIPアドレスと被らないように設定してあげる。

##無線ルーターの中継器側での設定
既に中継器モードとして使用していた無線ルーターは、無線ルーター親機のモードを変えても中継器として稼働してくれたので特に設定などはなかった。
中継器モードの設定は説明書を見たほうが早いし分かりやすいので割愛する。

##RTX1200を買ってよかったと思うところ
各ポートにつながっている端末のリンク速度を可視化することができるところはすごくおもしろい。
![ネットの可視化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462058/61d9e8c8-b8db-eda4-ef79-78acaf0634cc.png)
この画像を見るとポート1のリンク速度がとても遅い。これはデスクトップにつながっているのだが、今は電源を切った状態だ。
このデスクトップの電源をつけると1000BASE-Tになる。
つまり電源を切った状態でもリンクされていることが分かる。
リンクされているからWOLで電源をつけるパケットを流せるのだなと理解できた。
最後に通信速度
有線
1F(RTX1200と直接つながっている)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462058/4f5fe0e8-d3e4-c51b-4af7-1690b9fd679b.png)
2F（無線ルーター中継器のLANにつなげている）
<img width="302" alt="有線.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462058/e849cd41-4240-1a95-6529-669c694640b3.png">
2.4GHｚ
<img width="298" alt="2.4.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462058/7ca490fa-b048-f854-847e-58d63ae8c0e4.png">
5GHｚ
<img width="301" alt="5G.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462058/2e8d171f-e81f-d47a-0fb1-a22b9e0b824a.png">
【Vueエンジニアが作る】絶対失敗しないCSSナビゲーションメニューまとめ１３選

[![how-to-make-navigation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/027a3e93-2b02-e410-d903-9ecd3593735a.png)
](https://www.twinzlabo.com)

こちらの記事に記載のデザイン・コードは全て自由に使っていただいて大丈夫です(筆者が作成したため)
プロジェクトに取り込んでより充実したデザインにしてもらえれば○



---
##ヘッダーデザインにコピペで使えるナビゲーションメニュー３選

**動きは下の画像のような感じになります**

###１. ヘッダーで使いやすいシンプルなナビゲーションメニュー

![header-design-navigation-animation1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/c4447373-98c6-06c3-b6f4-e8cde0f7f283.png)

###２. ボタンが滑らかに拡大するかわいらしいナビゲーションメニュー

![header-design-navigation-animation2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/d169fd94-4c9d-4749-70fd-4d6fc715608b.png)

###３. ボタンが縮小しながら立体的に浮き出るナビゲーションメニュー

![header-design-navigation-animation3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/15d59959-192d-67ad-0a46-d33bb2b3acee.png)

###4. ボタンが凹みながら縮小する超動くナビゲーションメニュー

![header-design-navigation-animation4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/801aed57-1652-362b-73f3-22ff046400e7.png)


---
##マウスオーバーでドロップダウンするナビゲーションメニュー３選

**動きは下の画像のような感じになります**

###１. ドロップダウンするシンプルなナビゲーションメニュー

![hover-animation-navigation-dropdown1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/b437baac-1c2a-6cc6-30b5-20ed84961405.png)

###２. ボタンが浮く！独特でかわいいナビゲーションメニュー

![matereal-design-navigation1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/9eb0ae81-7c8d-594d-eec4-41810c059013.png)

###３. マウスオーバーでドロップダウン！UIナビゲーションメニュー

![hover-animation-navigation-dropdown3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/0bb61f59-e677-6f9e-305e-af349823dfe0.png)



---
##絶対失敗しないナビゲーションメニューサンプル３選

**動きは下の画像のような感じになります**

###１. hoverするとボタンが浮き上がるナビゲーションメニュー

![matereal-design-navigation1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/7e613a70-9642-fa0a-22aa-c6859552efee.png)

###２. hoverするとボタンが凹むナビゲーションメニュー

![matereal-design-navigation2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/3bee3b2f-9b8e-cf30-29af-5cb4f9b9b1f9.png)


###３. hoverするとボタンが立体的に浮き出るナビゲーションメニュー

![matereal-design-navigation3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/0769fa4f-19a4-73f5-6443-3ad1c9ead9e8.png)



---
##初心者でも簡単！動きのあるナビゲーションバーデザイン３選

**動きは下の画像のような感じになります**

###１. マウスオーバーで文字が太くなるナビゲーションバーデザイン

![navigation-bar-animation1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/fb1d6ba0-bbfa-2ad9-be20-27261584e6bf.png)


###２. マウスオーバーで文字が傾くナビゲーションバーデザイン

![navigation-bar-animation2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/aedc17b0-35b0-c5d2-cd1e-8a639247bb59.png)


###３. transform: skew＋hoverでシンプルなナビゲーションバーデザイン

![navigation-bar-animation3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643410/15b88309-c7d7-8259-5252-e0385f341cd8.png)
WSL上でjupyter notebookのカーネル起動時に"Permissions assignment failed for secure file"エラーがでた話

#はじめに
自分がつまづいたための忘備録です。圧倒的初心者なので変なところがあればコメントお願いします…。

#要約
## やろうとしたこと
WSL上でvenv環境を作成、pipによりjupyterをインストールし、jupyter notebookを使おうとした。



##起こったこと
カーネル起動時(ipyenbファイルを開くとき)、以下のエラーが出た。

```
RuntimeError: Permissions assignment failed for secure file: '/mnt/c/Users/<usename>/ubuntu_home/.local/share/jupyter/runtime/kernel-<ユニークid>.json'. Got '0o677' instead of '0o0600'.
```

##原因
以前にWSLのホームディレクトリの場所を変更していた[[参考](https://qiita.com/funacchi/items/c3bb78a546cf2605205d)]ため、ファイルの権限周りで異常が起こった。

##解決策
デフォルトのホームディレクトリ上にランタイムディレクトリを設定する(ここではtmpファイルに移動)。

```
export JUPYTER_RUNTIME_DIR=/tmp
```

#詳細

##環境
Ubuntu : 18.04.4
pip : 9.0.1
Python : 3.6.9
jupyter core     : 4.6.3
jupyter-notebook : 6.0.3
qtconsole        : 4.7.5
ipython          : 7.16.1
ipykernel        : 5.3.0
jupyter client   : 6.1.5
jupyter lab      : not installed
nbconvert        : 5.6.1
ipywidgets       : 7.5.1
nbformat         : 5.0.7
traitlets        : 4.3.3
##解決策のソース
https://github.com/jupyter/notebook/issues/5058
ぐぐって一番最初に出てくる公式のissueから
それっぽいところだけ翻訳すると、

- エラーの起きているファイルは、カーネル起動時につくられ、カーネル終了時に消去される一時的なファイルである
- このファイルの権限が600ではなく777(本当は677ではなく777)になっている
- このファイルの置き場所が本来のOSのディレクトリではなく、他のファイルシステムに関連付けられているディレクトリに置かれているか、他のシステムによって本来のOSディレクトリがマウントされているのが問題
- 以下の手順に沿って解消できる
    1. Notebookサーバを終了する
    2. `export JUPYTER_RUNTIME_DIR=/tmp`を実行する
    3. (他の方法でランタイムディレクトリの場所を指定していない場合)普通にNotebookサーバを立ち上げてみる

このissueの場合は、複合コンピュータからユーザホームディレクトリにアクセスしていたみたいですが、
私の場合は、WSLのUbuntuからWindows上のディレクトリにアクセスしている形になっている、ということだと思います。

ということで、処理手順に従って直せば解決しました！
現状tmpに突っ込んでるので、実際はちゃんとローカルに他の置き場所決めたほうが良いとのこと。



##【おまけ】ファイルの権限あたりの話
自分がわかってなかったので初歩的な話を書いていきます。

ファイルにはそれぞれ「読み(r)」「書き(w)」「実行(x)」の三種類がある。
また、権限を与えられる人は、「所有者」「グループ」「その他の権限」の3人(グループ)。
`ls -l`して最初に書いてあるやつがこれらを指した内容になっています。

で、このrwxを8進数で表すことがあり、上記3人(グループ)それぞれにどのような権限を付与するかで8進数3桁の文字で表せるようです。

777　→　rwxrwxrwx
600　→　rwx------

こちらの記事がわかりやすく書いてあったので参考にさせていただきました。
https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95


# おわりに
今回、英語を読みたくないが一心に、エラー文から推測していろいろな記事をあたって、膨大な時間を要してしまったのですが、
結局は公式のドキュメントやアナウンスが最強で、英語だからと避けないで、きちんとそれを読むのが解決の最短経路であるということを学びました…。
これからはきちんと公式のドキュメントは大事にします。
Emacs26の標準キーバインド

## まえがき
emacsのキーバインドが思い出せない。　**<font color="RoyalBlue">単語単位で移動</font>**するやつ。どこにも書いてない。
だから僕は耳と目を閉じ口を噤んだ人間になっても、emacsのキーバインドだけは分かる人間になろうと考えた。だがならざるべきか・・・。
__<font color="DarkOrange">CAUTION：使用しているのがSpacemacsだということには注意。</font>__

### 執筆時の環境
- MacOSX Catalina 10.15.5
- Emacs 26.3 (Spacemacs 0.300.0 develop)

### 更新履歴 - 最新３つの履歴を残す（初版：2020/07/04(SAT)）
1. 2020/07/05(SUN): 7.の章を追加
2. 2020/07/07(TUE): 章の番号を変更。4.の章を加筆
3. 2020/07/19(SUN): 5. ウィンドウの操作を追加

## 0. 覚えよう
### キーバインドの見方
- C: control
- M: alt
- S: ESC
- SPC: space

C-f: controlとfを同時押し。
（C-Aなどは、cotrol+shift+a。ここでは出ないが気にするな）
M-x goto-line: M-xのあとは命令文？を入力する形式。

### やり直す
|キー|効果|
|:-:|:--|
|C-g|コマンドの実行を中止し、何も無かったことにする。|
|C-/|取り消す。アンドゥ。押すたびに１個づつ戻る。|

### 何かがおかしくなったら
- デバッグモードでターミナルから起動する。`emacs --debug-init`
- `C-x b`で\*Message\*バッファを開いてみる。


## 1. 文字入力のためのカーソル移動
### 編集の基本
|キー|方向|単位|捕捉|
|:-:|:-:|:-:|:--|
|C-f|右|文字|1つ動く。行を跨げる。|
|C-b|左|文字|1つ動く。行を跨げる。|
|M-f|右|単語|漢字とそれ以外の区切りへ。行を跨げる。|
|M-b|左|単語|漢字とそれ以外の区切りへ。行を跨げる。|
|C-p|上|行|1つ動く。|
|C-n|下|行|1つ動く。|
|C-a|頭|行|どこにいても先頭へ。|
|C-e|尾|行|どこにいても末尾へ。|

### 閲覧するとき用
|キー|方向|単位|捕捉|
|:-:|:-:|:-:|:--|
|C-v|上|画面|表示されている分が１画面|
|M-v|下|画面|表示されている分が１画面|
|M-<|頭|バッファ|ページの先頭へ。|
|M->|尾|バッファ|ページの末尾へ。|
|M-x goto-line|||指定した行へジャンプ。SpacemacsではM-g gでいける。|

## 2. 編集する
|キー|動作|
|:---:|:----|
|delete|普通の削除。左へ。|
|fn+delete|fnつけると逆方向。|
|C-k|カーソル位置から末尾までカットする。改行は消せない。貼り付けできる。|
|C-@|範囲選択。選択開始からC-fやC-aを使える。範囲でコピーしたり切り取ったりしたいときに使う。マークする。|
|C-x h|全範囲を選択する。マークする。|
|C-w|カットする。|
|M-w|コピーする。|
|C-y|挿入。カーソルに位置にコピー、切り取りしたものを挿入。挿入なので範囲選択しても上書きはされない。|
|||
＊Emacsでは範囲選択を「リージョンをマークする」という。
＊Spacemacsの話だが、MajorモードによってはM-x i でインサーションを利用できたりする。

## 3. コーディングで使えるかもしれないヤツ
|キー|動作|
|:---:|:----|
|M-;|コメントアウト。|
|C-M-\|一括でインデントする。|
|M-x tabify|範囲選択内のスペースをタブへ変換する。|
|M-x untabify|範囲選択内のタブをスペースへ変換する。|
|M-=|範囲選択内の文字数と行数を数える。C-x hのあとにやればいいかも。|
＊メージャモードで用意されている機能も忘れるな。

## 4. フレームの操作
フレームの中にウィンドウがあるイメージ。

|キー|動作|
|:---:|:----|
|M-m T F|フルスクリーン(Spacemacs only)|
|C-x 5 2|フレームを新規作成|
|C-x 5 0|アクティブなフレームの削除|
|C-x 5 1|アクティブでない全てのフレームの削除|
|C-x 5 b|他のフレームで開いているバッファを選択|
|C-x 5 d|他のフレームで新しいDiredを開く|
|C-x 5 f|他のフレームでファイルを新しく開く|
|C-x 5 C-f|同上。|
|C-x 5 m|他のフレームで新しいメールを作成、送信。|
|C-x 5 o|他のフレームへの移動|
|C-x 5 r|Display Buffer Other Frame.|

Spacemacsにはフルスクリーンの機能が初めから用意されているので嬉しい。あまり使いどころが思い浮かばないキーバインドもあるが、メールを送ることもできるのでこの際メールもEmacsでやることにしよう。そうしよう。


## 5. ウィンドウの操作
|キープレフィックス|動作                            |
|:----------:|:---------|
| C-x 0   |アクティブなウィンドウを消す|
| C-x 1   |アクティブなウィンドウ以外を消す|
| C-x 2   |アクティブなウィンドウを上下に分割|
| C-x 3   |アクティブなウィンドウを左右に分割|
| C-x 4 0 |アクティブなウィンドウと表示されていたバッファを消す|
| C-x o   |アクティブではない別のウィンドウへ移る|
| C-x ^   |アクティブなウィンドウの高さを増やす|
| C-x }   |アクティブなウィンドウの横幅を増やす|
| C-x {   |アクティブなウィンドウの横幅を減らす|
| C-x +   |全てのウィンドウの高さを同じにする|
| C-x -   |ウィンドウに表示する行数が必要ない場合、そのウィンドウを縮小します|
MacBookPro 13incの私にはあまり使わないキーバインド 。

## 6. バッファの操作
## 7. Diredの使い方
## 8. Emacs & Distribution
本家: [GNU Emacs](https://www.gnu.org/software/emacs/)
Vimユーザー向け: [Spacemacs - maser branch](https://www.spacemacs.org/)
Vimユーザー向け: [Spacemacs - develop branch](https://develop.spacemacs.org/)
Dark Side: [Doom Emacs](https://github.com/hlissner/doom-emacs)

## むすび
先輩に用意してもらったDockerFileを使用してLaravel6の環境を作成した話

# 目的

- 先輩の記事を参考にLaravel6の環境をDockerを用いて作成した話をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

# 前提条件

- 特になし。

# 前提情報

- 職場の大先輩である[@layzy_glp](https://qiita.com/layzy_glp)さんのQiitaの記事[Dockerで始めるLaravel講座 - Laravel編](https://qiita.com/layzy_glp/items/579b295e8cc899aef2c4)の記事の方法を参考にLaravel6の環境をDockerを用いて作成する。

# 読後感

- Dockerコンテナ内のnginxのドキュメントルートディレクトリに「app」と言う名前のLaravel6のアプリを作成する。

# 概要

1. Docker Desktop for Macのインストール
1. DockerFileのcloneとコンテナの起動
1. Laravelインストーラの取得
1. Laravelのインストールとアプリ作成
1. 確認

# 　詳細

1. Docker Desktop for Macのインストール
    1. 下記の手順を参考にDocker Desktop for Macをインストールする。
        - [Docker Desktop for Mac をインストールする](https://qiita.com/miriwo/items/b4d41c45a12b1ae7f91e)
1. DockerFileのcloneとコンテナの起動とログイン
    1. 下記の先輩の記事の「Docker環境を作ろう」の部分を参考に全て実施して必要ファイルのcloneとコンテナの起動・コンテナへのログインを行う。
        - [Dockerで始めるLaravel講座 - Laravel編](https://qiita.com/layzy_glp/items/579b295e8cc899aef2c4)
1. Laravelインストーラの取得
    1. 下記の先輩の記事の「Laravelのインストーラーをインストールしよう」の部分を参考に全て実施してインストーラーを取得する。
        - [Dockerで始めるLaravel講座 - Laravel編](https://qiita.com/layzy_glp/items/579b295e8cc899aef2c4)
1. Laravelのインストールとアプリ作成
    1. 下記のコマンドを実行してnginxのドキュメントルートディレクトリに移動する。
    
        ```terminal
        $ cd /usr/share/nginx/html
        ```
    1. 下記コマンドを実行してLaravelのインストールとアプリ作成を行う。
 
        ```terminal
        $ composer create-project --prefer-dist laravel/laravel app "6.*"
        ```
    1. さきのコマンド実行完了後、作成されたappディレクトリに移動して下記コマンドを実行しアプリケーションキーを作成する。

        ```terminal
        $ php artisan key:generate
        ```
1. 確認
    1. appディレクトリにて下記コマンドを実行しLaravelのバージョンが6.Xになっていることを確認する。

        ```terminal
        $ php artisan -V
        ```
    1. ブラウザにて[http://localhost:8080](http://localhost:8080)にアクセスし、下記の画面が出ることを確認する。

        ![Laravel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a12c6213-93f3-ce14-aa51-43e9e8cac3be.png)


    1. 作成されたappディレクトリに移動して下記コマンドを実行しアプリケーションキーを作成する。

        ```terminal
        $ php artisan key:generate
        ```
部分分数分解（部分分数展開）

有理関数の積分は整式の割り算などを通じて、部分分数分解をすればあとは適当に結局、以下の3つの積分公式の組合せになるっていう定理がLeibnizによって導かれている。積分の定理の中でこの定理はとても綺麗だと思う（美しいと思うが、数学に対して美しいという言葉はなんか使い回されてしまって逆に美しくなくなってしまったのでｗ）。

```math
\begin{align*}
\displaystyle \int \frac{1}{(ax+b)^n}dx&=
\left\{\begin{array}{l}
\displaystyle \frac{1}{a}\log |ax+b| \quad (n=1) \\
\displaystyle -\frac{1}{a}\cdot \frac{1}{n-1}\cdot \frac{1}{(ax+b)^{n-1}}\quad (n>1)
\end{array}\right.\\
\int \frac{1}{a^2+x^2}dx &=\frac1a \tan^{-1}\frac{x}{a}\\
\int \frac{f'(x)}{f(x)}dx &= \log |f(x)|
\end{align*}
```

基本的に部分分数分解（展開）は

```math
\frac{1}{(x+1)(x^2-x+1)} = \frac13 \cdot \frac{1}{x+1} 
		-\frac13 \cdot \frac{x-2}{x^2-x+1}
```
のように分解する作業だが、展開後の式は分母が2次式の時は分子は1次式になる。
もっと一般的には分母が$n$次式なら分子は$n-1$次式になる。
元が整式だから3番目の公式を使えばそれは積分できるようになるね。はみ出た部分を$\tan^{-1}$で吸収する感じ。

とすると次は？

```math
\frac{1}{(x-1)^2(x+2)}
```
これを部分分数分解すると

```math
\frac{1}{(x-1)^2(x+2)} = \frac13\cdot \frac{1}{(x-1)^2} - 
\frac19\cdot \frac{1}{x-1} +\frac19\cdot \frac{1}{x+2}
```
とするのが一般的だが（この分解が出来るってのは右辺から通分すればわかるはず、気になる人はやってみて。）、

```math
\frac{1}{(x-1)^2(x+2)} = \frac{Ax+B}{(x-1)^2} + \frac{C}{x+2}
```
として求めようとする人もいる。まぁこっちでもいいけどね。
こっちでやると一つ作業が多くなるからってことでさっきやった方で部分分数分解するって感じ(多くならない時もあるが)。なんで作業が一つ多くなるかは実際に積分すればわかるはず。
vagrantでUbuntuの環境構築をしよう

#自己紹介
むちゃんです。
関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪の2回生です:boy_tone2: (2020.7.5現在)

イベントなど回っているので是非大阪辺りの方は会いましょう！

#Vagrantの環境構築
 ※色々な方法で環境構築ができるので是非試してみてください。

##セットアップの手順

1. VirtualBoxをインストール
https://www.virtualbox.org/

2. Vagrantをインストールする
https://www.vagrantup.com/

##流れ
1. 仮想マシンのイメージをダウンロード
2. 仮想マシンを扱うための作業ディレクトリを用意
3. 登録したイメージを指定して、仮装マシンの設定ファイルを作成
4. 仮想マシンの起動
5. 仮想マシンのログイン

---
###作成編
**[ここからは実際にコマンドを入力していきます。]**

 ・**Ubuntu 18.04 LTSの仮想マシンのイメージをダウンロード**
　 　<font color="red">※サイズが大きいので少し時間がかかります。

 ```
 $ vagrant box add ubuntu/bionic64
 ```

 ・**登録したboxの確認**

 ```
 $ vagrant box add list
 ```

・**仮想マシンを扱うための作業ディレクトリを用意しそのディレクトリ内に入ります。**

```
 $ mkdir [ディレクトリ名]
 $ cd [ディレクトリ名]
 ```
・**登録したイメージを指定して、仮装マシンの設定ファイルを作成しましょう。**

```
 $ vagrant init ubuntu/bionic64

 $ls
 Vagrantfile
 ```
---
###起動、ログイン
・**仮想マシンの起動**
 <font color="red">※設定ファイルと同じディレクトリで行ってください

```
 $ vagrant up
 ```

・**仮想マシンにログイン**

```
 $ vagrant ssh
 ```

---
###ログアウト、シャットダウン

・**仮想マシンからログアウト**

```
 $ vagrant exit
 ```

・**シャットダウン**

```
 $ vagrant halt
 ```

#あとがき
今回は自分なりにubuntuの環境構築についてまとめてみした:thumbsup_tone2:
是非使ってあげてください。

Twitter @HomgMuchan ぜひフォロー待っています❗️
Pythonでプロセスについて勉強してみた

### 概要
- pythonを使ってプロセスの生成周りを学習し直したメモ
- subprocessモジュールなどもあるが、自分で実装して勉強し直したメモ
- 備忘録

---
### 前提
- 環境
    - python: v.3.7.7

---

### 基礎
- ```os.fork()```
    - fork により、そのプロセスのコピーができる。
    - 複製された方が「子」、作った方は「親」
    - 子プロセスでは `0` が返り、親プロセスでは子プロセスの `id` が返る
    - forkしたプロセスは、親プロセスが処理終了を待つことはない
        - 親プロセスが先に終了すると、子プロセスで`os._exit()`してもゾンビプロセスとして残ってしまうので注意
    - つまり
        - forkすると、その時点で処理が分岐される
        - **親は子の終了は待たない**
        - 分岐した際に、自分が子or親の判定は、fork()の返り値が`0` or `!0`で判定する
        - 定石としては、親プロセス側の処理として子プロセスの処理を待つ(waitpidなど)で待つか放置して待つのか、killするのかを書く
        - 放置した場合は、子プロセスが終了してもゾンビとして残る可能性がある
- `os._exit()`
    - fork()によって作られた子プロセスを終了させる
- `os.exec()`
    - 外部コマンドを実行する
    - `exec`の引数は以下例の組合せで変わる
        - `v` : tuple もしくは list で実行するプログラムの引数を指定する
            - 例) `execvp('python', ['python', 'test.py'])`
        - `l` は文字列を指定する
            - 例) `execlp('python', 'python', 'test.py')`
        - `p` : 実行するプログラムをシステムパス (`ie. PATH`) から探す
        - `e` : 実行時に指定する環境変数の Dictionary を最後の引数で指定できる。指定するとこの関数を呼んだプログラムが持っていた環境変数（＝PCにデフォルトで設定されている環境変数）は引き継がれないので、追加する場合は `os.environ` で取得した環境変数に追加したものを渡す
- `os.waitpid(sid, option)`
    - `option=0`で指定したプロセスIDの処理が終わるまで待つ
        - これをかまさないと、子プロセスで`os._exec()`してもプロセスがゾンビとして残り続ける。つまり、子プロセスが終了しようとしたとき、親プロセスが`wait`してないと、そのプロセスはゾンビ状態となって残る
    - `option=os.WNOHANG`とすると、子プロセスの状態を判定する。この時、呼び出し元のプロセスは、ブロッキングされない(=待ち合わせない)ため、子プロセスの終了を**待ち続けない**。
    - `os.setid()`
        - プロセスグループのリーダとなる = 制御端末を持つ
        - 制御端末を持つまでの流れ
            1. 新しいセッションを作成する。
            2. 呼び出したプロセスを新しいセッションのリーダーにする。
            3. プロセスを制御端末から切り離す。
- memo:
    - 子プロセスが先に `_exit` したあと、親が`waitpid`するとどうなるのか？子供は先に`kill`されてゾンビにならないのか？
        - きちんと`waitpid`をすることで子プロセスが`kill`された。逆に、子が先に処理が終わったからといって`waitpid`しないとゾンビになるので注意。

---
### 応用
- djangoにおいて、リクエストを返した後も長時間ジョブとしてプロセスで処理を回したい場合の実装例
    - double fork
        - 実験
            - 1回`fork`して`runscript` -> 親は`wait`せずに`return` → 当然子プロセスはゾンビ化
            - 2回`fork`すると孫プロセスはinit配下の子プロセスとなる → 孫プロセスが終了する → ***ゾンビ化せずに消える***
        - キモは`setsid()`が効いていることで、孫プロセスがデーモン化した
            1. 子プロセスは`fork`後、セッションリーダーとなり、制御端末を親プロセスとは別にもつ
            2. 子プロセスは孫プロセスを`fork`
            3. 子プロセスは即時`exit()`して親プロセスは`waitpid`で待ち合わせる→子プロセスの`kill`とゾンビ化を防ぐ
            4. 孫プロセスはセッションリーダーでないことが自明なのでデーモンとして制御端末を持たないことが約束される
            5. 孫プロセスは子プロセスが終了するとinitプロセス(root)配下においてプロセスの後処理をしてくれるので、処理終了後ゾンビにならない
- セッションとプロセスについて
    - すべてのプロセスは、セッションに属するグループに属し、階層が存在する。
    - セッション（SID）→プロセスグループ（PGID）→プロセス（PID）
        - プロセスグループ内の最初のプロセスがプロセスグループリーダーになる
        - セッション内の最初のプロセスがセッションリーダーになる
    - すべてのセッションに1つのTTYを関連付け、セッションリーダーのみがTTYを制御できる。
    - プロセスがデーモン化される（バックグラウンドで実行される）ためには、セッションリーダが`kill` されてセッションがTTYを制御する可能性がないようにする必要がある

---
nfcpy で Felica をエミュレートする

基本的に公式のGetting started に例が載っています
[Emulate a card](https://nfcpy.readthedocs.io/en/latest/topics/get-started.html#emulate-a-card)
私は Pasori RC-S380 を使っていますが、その場合このままでは動きません
USBカードリーダーをベンダーIDとプロダクトIDで指定する必要があります
exampleでは `nfc.ContactlessFrontend('usb:054c:06c1')` となっています
Pasori RC-S380 の場合は `nfc.ContactlessFrontend('usb:054c:06c3')` と変更します
これで動くようになるはずです

そのまま書いてありますが
`idm, pmm, sys = '03FEFFE011223344', '01E0000000FFFF00', '12FC'`
を変更すれば IDm, PMm, システムコードも自由に変更することが出来ます

PMm の冒頭を書き換える事でIC種別も変更可能です
`idm, pmm, sys = '03FEFFE011223344', '01E0000000FFFF00', '12FC'` と設定し、 `nfcpy/examples/tagtool.py` で読み取った結果

```
Type3Tag 'FeliCa Plug (RC-S926)' ID=03FEFFE011223344 PMM=01E0000000FFFF00 SYS=12FC
NDEF Capabilities:
  readable  = yes
  writeable = yes
  capacity  = 1008 byte
  message   = 0 byte
```

`idm, pmm, sys = '03FEFFE011223344', '00F1000000FFFF00', '12FC'` と設定し、 `nfcpy/examples/tagtool.py` で読み取った結果

```
Type3Tag 'FeliCa Lite-S (RC-S966)' ID=03FEFFE011223344 PMM=00F1000000FFFF00 SYS=12FC
NDEF Capabilities:
  readable  = yes
  writeable = yes
  capacity  = 1008 byte
  message   = 0 byte
```

`idm, pmm, sys = '03FEFFE011223344', '0332000000FFFF00', '12FC'` と設定し、 `nfcpy/examples/tagtool.py` で読み取った結果

```
Type3Tag 'FeliCa Standard (RC-SA00/1)' ID=03FEFFE011223344 PMM=0332000000FFFF00 SYS=12FC
NDEF Capabilities:
  readable  = yes
  writeable = yes
  capacity  = 1008 byte
  message   = 0 byte
```

また、`ndef_read`, `ndef_write` は NdefFormatable にするためなので、NdefFormatable でなくする場合はその二つを消すことで実現出来ます

Felica の仕様についてはこちらの記事が分かりやすかったです
[Qiita - [PASMO] FeliCa から情報を吸い出してみる - FeliCaの仕様編 [Android][Kotlin]](https://qiita.com/YasuakiNakazawa/items/3109df682af2a7032f8d)
PHPファイルがブラウザで正しく表示されない

phpファイルをブラウザで表示させようとしたところ、

[![Image from Gyazo](https://i.gyazo.com/2d35d0fc46f201399d1292f48974938d.png)](https://gyazo.com/2d35d0fc46f201399d1292f48974938d)

ソースコードしか表示されなくて地味にハマったので

対処法を自分用に保存。


## apacheを起動

まずPHPはサーバーサイド言語のため
当然ながらWEBサーバーを動かさなければお話なりません。

## ドキュメントルート変更

apacheはデフォルトで**MAMP/htdocs/index.php**ファイルが起動するようになってるでこれを変更します。
[![Image from Gyazo](https://i.gyazo.com/9e39a70fb9f2b5670466fcd1eaba3797.jpg)](https://gyazo.com/9e39a70fb9f2b5670466fcd1eaba3797)

1 :MAMP選択　➡️　prefecturesを選択

2 :Web Serverを選択

3 :ドキュメントルートを表示させたいファイルに選択。

以上。




フレームワークの恩恵を受けていると
サーバーやネットワークの知識が浅いことを痛感させられますな。。
[2] : C#(ASP.NET core)でWeb APIを作って(以下略)[EntityFrameworkCore#SELECT編]

# 概要
[前回](https://qiita.com/myantyuWorld/private/6130f77e5906bd895043)では、リクエストボディのXMLを変換するプログラムを作成しました  
今回は、　XML　→　オブジェクトに変換したものを「EntityFramework」の技術を使用してCRUDしていきます。

## Nuget設定

1. ソリューションエクスプローラー　→　プロジェクト[右クリック]
2. Nugetパッケージの管理
3. 参照　→ ”Postgres”で検索　→　”Npgsql.EntityFrameworkCore.PostgreSQL”をインストール  
※ .net coreのバージョンとそろえること

## テーブルと構成をそろえたEntiryクラス作成

設定の例

```c#
{
    [Table("m_memotype")]
    public class MemoType
    {
        [Key]
        [Column("mmsb")]
        public int Mmsb { get; set; }

        [Required]
        [Column("mmsn")]
        public string Mmsn { get; set; }
    }
}
```

## DbContextを継承したDB操作用クラスの作成

```c#
public class HelloContext : DbContext
{
    public DbSet<MemoType> MemoTypes { get; set; }

    public HelloContext(DbContextOptions options)
        : base(options)
    {
    }

    public HelloContext()
    {
    }

    protected override void OnModelCreating(ModelBuilder mb)
    {
        mb.Entity<MemoType>().Property(x => x.Mmsb).ForNpgsqlUseSequenceHiLo();
    }
}
```

## appsetting.jsonの設定

```json
// ConnectionStringsに以下追記
"ConnectionStrings": {
     "HelloContext": "Host=localhost;Port=5432;User Id=postgres;Password=;Database={database name}"
}
```

## StartUp.csの設定

using Microsoft.EntityFrameworkCore;の記述忘れに注意

```c#
// ConfigureServices()に以下追記
// Dependency Injection(依存性注入)
services.AddDbContext<HelloContext>(option =>
{
    option.UseNpgsql(Configuration.GetConnectionString("HelloContext"));
});
```

## Controllerの設定
以下を追記

```c#
        HelloContext _context;

        public CatController(HelloContext context)
        {
            _context = context;
        }

```

## 動作確認

selectを確認
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587970/55afd8fa-45ad-0374-4e15-056f3ae0b7aa.png)
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587970/fb25c312-43b4-9f4c-817a-9e422ec98f2b.png)

---

# 参考資料

[DbContextを使用したデータ作成#テスト"データで DB を初期化する"参照](https://docs.microsoft.com/ja-jp/aspnet/core/data/ef-mvc/intro?view=aspnetcore-3.1)
DockerでCaddyを試す

# はじめに

[爆速！ AWS EC2(Amazon Linux)環境でHTTPS環境を建てる方法 (Caddy)](https://qiita.com/ChujoHiroto/items/0ced6930a0f88ac55383)をみて面白そうだなって思った。試したいけど、環境構築は面倒だなってことで、Dockerで試しに動かしてみることにした。

# 試しに動かしてみる

```
# ポートは片方だけでも動きます
$ docker run --rm -it -p 80:80 -p 443:443 caddy
```

接続先は、[http://localhost](http://localhost)でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563543/0397b302-083c-5829-94e6-554a61bfdab6.png)

# 中身が見たい

```
$ docker run --rm -it -p 80:80 -p 443:443 caddy /bin/ash
```

## 設定ファイル

`/etc/caddy`内に`Caddyfile`があります。

```.conf:/etc/caddy/Caddyfile
# The Caddyfile is an easy way to configure your Caddy web server.
#
# Unless the file starts with a global options block, the first
# uncommented line is always the address of your site.
#
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace the line below with your
# domain name.
:80

# Set this path to your site's directory.
root * /usr/share/caddy

# Enable the static file server.
file_server

# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080

# Or serve a PHP site through php-fpm:
# php_fastcgi localhost:9000

# Refer to the Caddy docs for more information:
# https://caddyserver.com/docs/caddyfile

```

# おわりに

Dockerfileとかを試したい場合は、以下が参考になると思います。

・[caddy](https://hub.docker.com/_/caddy?tab=description)
・[Go製WebサーバーCaddy触ってみた](https://techblog.ca-wise.co.jp/2016/12/post-130.html)
プルリクを出すまでの流れ

##プルリクまでの手順を整理

1、何をする前にも必ずファイルを確認する癖をつける。

```
$ git status
```

2、共同で開発中のブランチからデータを更新する。これをしないと自分だけ開発に取り残されます。また、適度に行っていないとコンフリクトが大量に発生して後々面倒な事になります。

```
$ git pull origin 開発中のブランチ
```
3、コンフリクトが起った場合は解消します。解消出来たらコミットしていきます。

```
$ git status
#ファイル状況を確認
```

```
# addするファイルは慎重に選んでからね。
$ git add addするファイル

# 全て一括でaddするなら
$ git add .

$ git commit -m "saveしたよ"
```

4、rspecでテストする。

```
$ rails db:migrate:reset db:seed RAILS_ENV=test 

$ rspec
```

5、テストが通ったらリモートブランチにpushしていく。

```
$ git push origin 現在作業しているブランチ名
```

6、プッシュ出来たら次はリモートブランチのページにいきプルリクを出します。その際にマージ先を指定するのを間違わないように！！プルリクの内容を必要に応じて記載する。

7,プルリクが出せたら変更になっているコードをしっかり確認する事！！！！自分のいじったコードで他のシステムに悪影響が出そうなコードは消すか変更を加え再びpushする。

#####*その際再びプルリクを出す必要はない。pushしたらプルリクも更新されます。
Linuxのネットワークの疎通確認に使うツール

# ping

プロトコル: icmp

IP層での疎通を確認する時に使う．応答しないポリシーのサーバには使えない．

```bash
ping example.com
```

玄人は[deadman](https://github.com/upa/deadman)を使うとか使わないとか．

# tcpdump

プロトコル: IP層～アプリケーション層

パケットをキャプチャする．tsharkでもいけるはず．

```bash
sudo tcpdump -i ens160
```

# nc

プロトコル: トランスポート層～アプリケーション層

Firewallが通過するかの確認に使う．

```bash:サーバ
nc -kl 3000
```

```bash:クライアント
nc server.example.com 3000
```

# telnet

プロトコル: smtp, http, telnet

アプリケーションやミドルウェアが応答するかのチェックに使う．

```bash
telnet example.com 80
```

# curl

プロトコル: http, ftp, sftp, tftp, ldap, ...

アプリケーションやミドルウェアが応答するかのチェックに使う．対応プロトコルが多い．

```bash
curl -si http://example.com/
```

よく使うオプション:

- `-i` HTTPレスポンスヘッダが見れる
- `-k` SSL証明書のチェックをスキップ
- `-s` プログレスバーを出力しない(パイプで渡す時に便利)

# その他

nmap, wget, ss(netstat), lsof, ...

コメントで教えて下さい．
とあるAPIをたたいて日付の値を取得したら、フォーマットが変でバグかと思ったけどISO 8601でサポートされているフォーマットだった話


## ある日の出来事
[PiWeb-API](https://github.com/ZEISS-PiWeb/PiWeb-Api)で測定を取得し、日付の値（K4）をしたら、フォーマットが変だったけど、そういう仕様だったお話し。

本当の日付
**2020/06/18 21:45:14**

取得した日付の値
**2020-06-18T12:45:14Z**

以下のように変換したら問題ありませんでした。

```c#:test
var datetime = "2020-06-18T12:45:14Z";
var convertedDatetime = DateTime.ParseExact(datetime, "yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture);

Console.Writeline(convertedDatetime.ToString("yyyyMMdd HH:mm:ss"));
```

```C#:output
20200618 21:45:14
```

>[web サービスでよく使用される](https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime?view=netcore-3.1#formatting-04)
とのことです。

この辺を確認しました。
[日時のフォーマット（ISO 8601） - Qiita](https://qiita.com/kidatti/items/272eb962b5e6025fc51e)
[C# で日付をフォーマットされた文字列に変換する - C# 便利メモ - C# 入門](https://csharp.sql55.com/cookbook/format-datetime.php)
[DateTime 構造体 (System) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime?view=netcore-3.1#formatting-04)





-
今からoauth2_proxy使うならoauth2-proxyのほうがいい

OAuth2 Proxyという名前でリポジトリがいくつかある。

# oauth2_proxy

bit.lyの作ったOSSで今はアーカイブなっている。

https://github.com/bitly/oauth2_proxy

# oauth2-proxy

上記のforkとして生まれている。今もメンテナンスがされている。

https://github.com/oauth2-proxy/oauth2-proxy
tkinterで動画をcanvasに表示している状態でroot.quit()するとエラー

# 事の発端
省略

# 動作環境
Windows 10
PyCharm

# コード
省略

# エラーの原因
不明

# ボツ案
root.quit()ではなく、root.destroy()ならエラーは起きなかった。しかし、destroyでは、実行が停止していないので、これではソフトの終了の目的が果たせなくなったのでdestroyではダメです。

# 解決方法
release()をすれば解決しました。解決したのに1時間以上。

    cap = cv2.VideoCapture(0)
でcapを作成していたのを

    if cap:
        cap.release()
        cap = None

のようにして、releaseしてからroot.quit()しないとエラーになってしまいます。tkinterのウィンドウが固まってしまいます。

# 備考
tkinterのcanvas内での動画の表示には、root.after()を使って表示をループさせています。

```
root.after(self.delay, self.camera_update)
```
Raspberry-piメモ

色々作ってもらっていると、自分でも触りたくなったので休日に勉強を始めた

とりあえず買って放置していたものを掘り起こす
Raspberry Pi4 ModelB Rev1.2　とラズパイカメラv2
Raspbian 10 buster

---

たぶんまたしばらくしたら同じことで詰まるので、自分の手順を記録する

##### 1.とりあえずカメラをつないで画像を保存してみる
参考URL様
> http://igarashi-systems.com/sample/translation/raspberry-pi/usage/python-camera.html

IDEのthonny？とかいうのでｻﾝﾌﾟﾙﾌﾟﾛｸﾞﾗﾑのｺﾋﾟﾍﾟを動かす
→ 問題なくできる

##### 2.openCVで画像を触ってみたかったのでインストール
何も考えず pip install python-opencv
→　import cv2ができず地獄が始まる

---

### pythonのデフォルトをpython3にした
参考URL様
> https://www.souichi.club/raspberrypi/python3-default/

> ```
$ sudo unlink python
> $ sudo ln -s python3 python
```

ちゃんとimportできるかターミナル触りまくっててpython3と打つのがだるかっただけ。結局ﾀｰﾐﾅﾙで触らなくなったのであんまり意味がなくなったかも

---
### キーボードがなんかおかしいので直す
参考URL様
> https://qiita.com/sukinasaki/items/426068d6e87169fa3d88

> ```
$ sudo raspi-config
```

> から同じ感じで

ちょっとconfigの最初だけ名前違ったけど４番目なのは変わらず
設定できたと思ったら何かたまに元に戻る、USB切り替え器でキーボードつないでるのが良くないのかなあ。メインPCとラズパイの接続を切り替えたりしてると元に戻る
追記）よくわからないが元の設定は日本語配列に変わってなかった？
入力メソッドが並んでいるところの英語キーボードを削除、日本語キーボードに変更したら調子がよくなった。たまにできてたのはなぜなんだろう

---
### python3 + openCV

import cv2が使えない

参考URL様
> https://creepfablic.site/2020/04/10/python-opencv-error/

関係ありそうなところをマネする

##### ImportError: libjasper.so.1: cannot open shared object file: No such file or directory
> ```
$ sudo apt-get install libjasper-dev

##### ImportError: libQtGui.so.4: cannot open shared object file: No such file or directory
> ```
$ sudo apt-get install libqt4-test

##### ImportError: libcblas.so.3: cannot open shared object file: No such file or directory

> ```
$ sudo apt-get install libatlas-base-dev

##### ImportError: /lib/python3.7/site-packages/cv2/cv2.cpython-37m-arm-linux-gnueabihf.so: undefined symbol: __atomic_fetch_add_8

> ```
export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1

を追記

コマンドのやり方がよくわからなかった（ただ開かれたファイルの中身を大量のエラーだと勘違いしていた）ので
/home/pi にあった.bashrcをテキストエディタで開いて一番下の行に上記の１文をコピペして保存した。.profileのほうにも入れた
どっちが正解？

---

ここでターミナルではimport cv2が通る

IDEのサンプルプログラムにimport cv2を書き足してみる→またImportErrorが出る

---

標準入っていたやつで悩みたくないので、少し触れたことがあるソフトに切り替える
##### Visual Studio Codeを入れる
参考URL様
> https://qiita.com/optimisuke/items/1cd7440442f7420e6b99

簡単に入れることができた。

##### 普通にimport cv2はOKになったが、import picameraが動かなくなった

→VS Codeの作業フォルダとして名前をimportするものと同じpicameraにしたせいでエラーが出ていた？そういうの関係あるんだ

---  
無事にサンプルプログラムが動いて画像が保存できる。
import cv2も通る

よし、スタートライン
vsftpd で chroot する

私のメインの作業記録は[zenn](https://zenn.dev/tomoakinagahara)に移しています。
こちらの記事はもう更新されませんので、下記のzennの記事を参照して下さい。関連する記事もリンクされません。

https://zenn.dev/tomoakinagahara/articles/1f18348c1fef08

<hr/>

# ⚠注意❗

以下の内容は更新されておらず、古く、間違っている、仕様が変わっている、箇所があるかもしれません。正しい情報は、上記のzennの記事をご覧ください。

# chroot とは

許可されたディレクトリー以下しか閲覧できなくする機能です。
FTP接続時に、アカウント毎に閲覧できるディレクリーを変更したい場合に使います。

# 前提

ここでは、vsftpd で chroot するためだけの設定を説明します。
vsftpdは、その他の設定により、外部ファイルが、許可リストになったり拒否リストになったり紛らわしいので注意が必要です。

# 設定

具体的な設定は以下の通り。

```sh:vsftpd.conf
# chrootのlistを有効にする。
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

# userlist設定
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list

# このディレクトリーに、ユーザー名の個別の設定ファイルを作成する
user_config_dir=/etc/vsftpd/user_conf
```

```sh:chroot_list
# ここに列挙したユーザー名がchrootの対象になる
foo
bar
```

```sh:user_list
# userlist_deny=NO  だと許可(allow)リストになる
# userlist_deny=YES だと拒否(deny)リストになる
admin
foo
bar
```

```sh:user_conf/foo
# このディレクトリーより上には移動できない
local_root=/www/foo.com
```

```sh:user_conf/bar
# このディレクトリーより上には移動できない
local_root=/www/bar.com
```

# トラブルシューティング

## 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

chrootした先に書き込み権限があるとエラーになる。設定で回避できる。

```sh:vsftpd.conf
allow_writeable_chroot=YES
```
【Pug】htmlを簡単に書く

HTMlを簡単に記述するためのものであり、
閉じタグが要らず、変数を使える「Pug」について
簡潔にまとめたのでこちらでご紹介。

# Pugについて
pugの使用にはNode.jsが必要。
◉一般的なPugの特徴として三つ
・includeを使用してファイルを分割できる
・閉じタグが要らない。
・変数が使える（JSと似てる）

```html:例

- var man = "123456";
```

# Pugのインストール

```
npm i pug-cli -g
```

#Pugファイルを作る
ファイル名.pugのファイルを適当に作ります。
[![Image from Gyazo](https://i.gyazo.com/881eeb9c5c9d75d1b79b0268f83c0544.png)](https://gyazo.com/881eeb9c5c9d75d1b79b0268f83c0544)

#HTMLに変換する
以下のコマンドを叩きます。

```
pug index.pug --pretty
```
_________________________________________
以上で終了です。
ご覧いただきありがとうございました。
初めてのnuxt.js / nuxt-property-decoratorの導入方法

基本的に使用しているのはVC

コンポーネントを利用するために、Nuxt.jsをビルドしたら、
下記のコマンドを入れ、Typescriptの導入環境を整える。

１．builderの設定
yarn add nuxt-property-decorator
参照：https://typescript.nuxtjs.org/ja/guide/setup.html#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
2. decoratorの設定
yarn add nuxt-property-decorator


早速簡単なコードをtypescriptで作ってみる。

```Nuxt.js/Vuetify/Typescript
<template>
  <v-content>
    <v-row>
      <p>名前：{{name}}</p>
      <p>年齢：{{age}}</p>
      <p>出身地：{{country}}</p>
      <p>３倍の値は:{{triple}}</p>
    </v-row>
    <template>
      <button @click="onClickButton">このボタンを押してぴょん</button>
    </template>
  </v-content>
</template>

<script lang="ts">
import { Component, Vue } from "nuxt-property-decorator";

@Component
export default class index extends Vue {
  public name: string = "taro";
  public age: number = 24;
  public country: string = "日本";
  public score: number = 55;

  get triple() {
    return this.score * 3;
  }

  public onClickButton() {
    alert("よっしゃ！");
  }
}
</script>
```
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630652/c93c5129-9a54-827b-2526-0636b337d7bd.png)



これでとりあえず、Nuxt.jsへのTypescript導入は完了
Tableau：『データブレンド』機能を具体的なデータで理解する

今回はTableau特有の結合機能「データブレンド」についてご紹介します。

ブレンド機能を理解するためには本題に入る前に、まず結合の懸念点から考える必要があります。

#粒度の違うデータの結合は注意が必要
具体的なデータで見ていきます。以下のようなデータがあったとしましょう。
(※数値はダミーです)

<b>実数値テーブル</b>

| CD名 | 月 | 売上|
|:-----------|------------:|:------------:|
| 夜明けまで強がらなくていい | 1月| 120万 |
| 夜明けまで強がらなくていい | 2月| 110万 |
| 黒い羊 | 1月 | 100万 |
| 黒い羊 | 2月 | 90万 |
| こんなに好きになっちゃっていいの？ | 1月 | 80万 |
| こんなに好きになっちゃっていいの？ | 2月 | 70万 |

<b>目標値テーブル</b>

| グループ名 | CD名 | 売上目標|
|:-----------|------------:|:------------:|
| 乃木坂46 | 夜明けまで強がらなくてもいい| 200万 |
| 欅坂46 | 黒い羊 | 150万 |
| 日向坂46 | こんなに好きになっちゃっていいの？ | 100万 |

実績値テーブルの粒度はグループ、目標値テーブルの粒度はグループかつ日付です。

このような粒度の違うデータを紐づける時は注意が必要です。

シンプルに結合してみます。結合KEYは「CD名」ですので、結合後のテーブルは下記のようになります。

|グループ名| CD名 | 月 | 売上|売上目標|
|:-----------|:-----------|------------:|:------------:|:------------:|
|乃木坂46| 夜明けまで強がらなくていい | 1月| 120万 |200万 |
|乃木坂46| 夜明けまで強がらなくていい | 2月| 110万 |200万 |
|欅坂46| 黒い羊 | 1月 | 80万 |150万 |
|欅坂46| 黒い羊 | 2月 | 80万 |150万 |
|日向坂46| こんなに好きになっちゃっていいの？ | 1月 | 80万 |100万 |
|日向坂46| こんなに好きになっちゃっていいの？ | 2月 | 70万 |100万 |

ここで乃木坂46の売上と売上目標を比較してみると・・・・

<b>230万(売上) vs 400万(売上目標)</b>

集計するとこんな感じになりますがどうも違和感がありますね。数値がかなり乖離しています。

理由は単純で、売上目標のデータ1行に対して、売上のデータが2行結合されていて、データが重複してしまっているからです。

##集計関数で解決する
Tableauで出来る解決策の一つとして、集計を駆使することが挙げられます。Tableauでは集計方式を簡単に操作できるので以下の様に、一瞬で調整は可能です。
<img width="450" alt="スクリーンショット 2020-01-14 10.50.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/5fa80102-7eea-4656-8e88-9232ba1014d1.png">

<b>しかし一つ懸念として「集計方式の調整し忘れ」があります。項目数が増えて複雑な時や、データを結合した人とその後の作業をする人が違った際、集計ミスが起こる可能性があります。</b>

「AVGなのにSUMしてた」などの集計ミスです。
粒度の違うデータを結合するときは注意が必要です。

#粒度の違うデータ統合に有効な「ブレンド」機能

ここで出番なのがTableauの<b>ブレンド機能</b>です。

データブレンドとは一言で言うと、<b>「複数のデータソースを集計してから結合する」</b>です。
ブレンド機能の仕組みは以下の通りです。

テーブルを合体させてから集計する「データ結合」に対し、

「ブレンド」はそれぞれ集計してから結合します。

順番が逆ですね。

ですので、ブレンドをすると以下のようになります。

無事クリーンなテーブルの完成です。

#Tableau上での操作

ブレンドをTableau上で行うのは簡単です。

複数のデータソースを別のデータソースとして読み込んだら、「データ」タブから「リレーションシップの編集」を選択します。
<img width="300" alt="スクリーンショット 2020-01-14 11.00.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/0561b8fd-1acd-19fb-77a1-7a3d4b5af1b0.png">

↓のような画面が出るので、ブレンドしたいデータソースを2種類選んで、KEYにしたいカラムを選択したら完了です。
<img width="450" alt="スクリーンショット 2020-01-14 11.01.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548159/3b4a3eb0-6fc9-140f-be86-5afa127d0566.png">

カラム名が同じものは自動的に指定されます。DAYと日付など、カラム名が違うものは手動で編集なので注意です

ここまでをまとめると、

- 結合は「テーブルを合体させてから集計する」

- ブレンドは「集計してから合体する」

のように、<b>順番に違いがあります。</b>

#ブレンドが絶対というわけではない

ブレンド機能は画期的で便利な機能ですが、毎回使える機能というわけではないかと思います。

何故なら、データソースが多くなるほどブレンドなのか、結合なのか、KEYは何なのかなどごちゃごちゃしてしまうからです。

なので、GCPやAWSなどのDWHにデータソースが全て格納されているならばTableau上でブレンドさせずに

あらかじめSQLを叩いて集計テーブル、マートを作ってしまうのがベターが気がします。

今回の例でいうと、

```
SELECT
グループ名,CD名,売上,売上目標
FROM `目標値テーブル`
INNER JOIN
(
SELECT
グループ名,CD名,SUM(売上)
FROM `実数値テーブル`
GROUP BY CD名
)
USING
(CD名)
```


こんなイメージです。集計されてないテーブルを集計したテーブルをjoinさせています。

Tableauに考えさせずに可視化できるのでデータ量が多い場合などはパフォーマンスが上がるかもしれませんね。




元も子もない結論ですが、なるべくTableauには考えさせずにいきたいところです。
最近のVirtualBoxでAndroid-x86を使う方法

Android-x86は、スマートフォン向けOSであるAndroidを、PC向けに移植したものだ。
そして、それをVirtualBox上にインストールして使う記事がいくつか存在する。私もそれにしたがって、Android 9を仮想マシンに入れることにした。
#しかしながら...
私の環境は、Ubuntu 18.04、VirtualBox 6.1.10
ほかサイトの記事には、VirtualBoxの設定画面で、「3Dアクセラレーションを有効化」にチェックを入れなければならないという記述のある記事があった。
もちろん私も、チェックを入れて起動してみるが...
起動しない。
いや、起動はするのだが、GUIが出ずに、CUIのコンソール画面で止まってしまう。
「Android-x86 VirtualBox 起動しない」で検索してみるも、3Dアクセラレーションを有効にせよの一点張りである。
#対処法
この場合の対処法である。
 
原因は、グラフィックスコントローラが「VMSVGA」に設定されていることが原因である。

まず、VirtualBoxの、Android-x86の仮想マシンの設定を開き、「ディスプレイ」に移動する。そうしたら、あの、「3Dアクセラレーションを有効化」のチェックを外す。
それでもって、グラフィックスコントローラーに、「VBoxSVGA」もしくは、「VBoxVGA」を指定する。
このとき、「無効な設定が見つかりました」と怒られるが、これで普通に動くので無視。
ちなみに、「3Dアクセラレーションを有効化」のチェックを入れたまま、「VBoxSVGA」、「VBoxVGA」を指定してしまうと、強制的にグラフィックスコントローラーが「VMSVGA」に変更されてしまい、動作しなくなるので注意。
![rect1476.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648261/1db50d89-904c-ee66-3419-3ea4951fe7f6.png)

#起動してみよう
設定が完了したので、インストールなしモード(Run Android-x86 without installation)で起動してみると...
「android」のロゴが点滅して...
![名称未設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648261/786f15e5-fe1b-7a7c-398c-3936194db55c.png)
起動した!

あとは、正常に動くことを確認できたので、一旦仮想マシンを再起動して、Android-x86をインストールしていけばいい。Android-x86のインストール方法は、あまり昔と変わりはないようなので、ほかサイトの記事でも参考にすればよいかと。

#別な方法
Android-x86をVirtualBoxで起動するには、別な方法もある。
仮想マシンの設定画面から、OSのタイプを、「Microsoft Windows」バージョンを「Windows 10 (64-bit)」にする。
そうして、グラフィックスコントローラーを、VBoxSVGAにする。この場合は、3Dアクセラレーションを有効化することが可能だ。
![rect837.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648261/cf4d7d62-6b3c-0aee-2fcd-18157abbfa96.png)

#まとめ
どうやら、グラフィックスコントローラーが「VMSVGA」になっていると動作しないようだ。要は、VMSVGAを指定しなければいいので、VMSVGA以外のグラフィックスコントローラを使う方法なら何でも良さそうだ。
【Rails】form_withの属性や基本構文

#### はじめに
チーム開発にて Ruby on Rails を用いてWebアプリを作成中です。

まだまだ未熟なため、記述やコードがわかりにくいかもしれません。
記載しきれなかったものや変更点は、随時更新・ブラッシュアップしていきます。

私と同じ初学者の方は検索に検索を重ねると「いま自分が何を調べたいのか」が分からなくなってしまいがちですので、専門用語やカタカナ用語は都度 解説します。

>`form_with`：
フォーム実装のためのヘルパーメソッド。
Rails5.1よりform_withが導入され、form_forやform_tagが非推奨となり今後 削除される予定となっている。一つの構文でフォームが書けるようになった。
HTTPメソッドを指定する必要が無い。form_withではinputタグは用いない。

```:html.haml
.form-wrapper
  = form_with url: credit_cards_path, method: :post, model: @card, local: true, html:{name: "inputForm"}, class: 'form-wrapper', id: 'charge-form' do |form|
```
解説します。

```
= form_with 〜 do |form|
-# 例えるなら、お菓子作りでいうケーキカップ(= form_with)と袋と紐(do |form|)
```
```
url: credit_cards_path
-# パスは関連モデルがある場合、省略可。
```
```
method: :post
-# formのデフォルトHTTPメソッドはPOST、省略可。
```
```
model: @card
-# ActiveRecordを継承するモデルのインスタンスが利用可。
```
```
local: true
-# デフォルトで非同期通信リクエストで送信されるようになる。remote: trueの指定をする必要は無い。
```
>`非同期通信`：
コンピュータ間で送信者のデータ送信タイミングと受信者のデータ受信タイミングを合わせずに通信を行う通信方式。つまり、送信者と受信者の両方がオンラインである必要がなく、片方が接続しているだけで通信が成立する。

```
html:{name: "inputForm"}
-# name: "inputForm"(html:{}が無い)だとエラーになる。
```
```
class: 'form-wrapper', id: 'charge-form'
-# class属性やid属性にはHTML属性は不要。
```
**form_with** ヘルパー表

| オプション         |説明|デフォルト値|
|:-----------------|:------------------|:------------------:|
|:url|フォームに入力されたデータを送信するURL。名前付きルートを直接使用可能 |nil|
|:method|HTTPメソッドの指定。|POST|
|:format|送信するデータ形式 JSON形式やXML形式など:urlオプションが指定された場合は無視される。|text/html|
|:scope|ルーティングで名前空間が指定されている場合に利用するPrefix指定。|nil|
|:model|モデルオブジェクト。オブジェクトが新規レコードの場合は作成フォームが生成され、既存レコードの場合は更新フォームが生成される。|nil|
|:authenticity_token|認証トークンの指定。カスタム認証トークンでオーバーライドするかfalse、認証トークンフィールドをスキップする。||
|:local|リモートフォームを使わない設定。|false|
|:skip_enforcing_utf8|IE5以前の文字化け対策(UTF-8の矯正送信)のスキップ設定。|false|
|:builder|フォームオブジェクトのオーバーライド(オリジナルフォームコントロールの作成)|nil|
|:id|オプションのHTML id属性|nil|
|:class|オプションのHTML class属性|nil|
|:data|オプションのHTML data属性|nil|
|:html|id、class、data以外のオプションHTML属性|nil|

#### おわりに
form_withのまとめは以上となります。
例がお役に立てば幸いです。

## 参考記事
[form_for/form_tag/form_withについて【概要+使い方】]
(https://qiita.com/Tatsu88/items/cb78c0997ce24abb6759)
[form_withまとめ]
(https://rails-ambassador.herokuapp.com/tips/FormWithHelper)
bash で タブ補完するときに大文字小文字を区別しないようにする

```bash
echo 'set completion-ignore-case On' >> ~/.inputrc
```
あるいは

```bash
echo "bind 'set completion-ignore-case on'" >> ~/.bashrc
```

Raspberry Pi OS 10.4 で検証

参考: [Can I make Tab auto-completion case-insensitive in Bash?](https://askubuntu.com/questions/87061/can-i-make-tab-auto-completion-case-insensitive-in-bash)
【初心者でもわかる】擬似要素（::before,::after）でサンドイッチを作る方法

# どうも、7noteです。今回は擬似要素（::before,::after）を使ってサンドイッチを作って行きます！

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/before_after/
AndroidStudioのAlarmManager実装時に苦戦した点

AndroidStudioでAlarmManagerを使う方法について
自分がコードを書いていた時につまずいた点などを踏まえて紹介します。

<font color="Red">※Qiita初投稿です、ちょくちょく変なところや違うところがあるかもしれませんが多めにみてください…</font>

#AlarmManagerの設定の仕方

今回作るのは何分後(秒、時間、etc...)かに処理するというコードを作ります。
まずは、AlarmManagerの設定の仕方を見ていきます。

###<font color="Red">重要！</font>
##1: AndroidManifestに設定を加えていきます。

```AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"

<uses-permission android:name="android.permission.WAKE_LOCK" />

   <application

        <receiver
            android:name=".AlarmManagerを受け取るクラス."
            android:process=":remote" >
        </receiver>
   </application>
</manifest>
```

AndroidManifestに`uses-permission android:name="android.permission.WAKE_LOCK"`
と`receiver android:name=".AlarmManagerを受け取るクラス"
            android:process=":remote"`を書くことでAlarmManagerが動きます。

私は、ここを書くの忘れていてめっちゃ苦労しました。公式サイトもAlarmManagerのところになかったので…

##2: AlarmManagerを送るためのIntentを作る

```AlarmManagerを置きたいところに.java
    ...
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmManagerを受け取る場所.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

    alarmManager.setExact(AlarmManager.RTC_WAKEUP, お好きな時間を「ミリ秒！」で, pendingIntent );
```

Intentを使って何分後にデータを送るか設定します。
上の3つのコードの`context`は、だいたい`getApplicationContext()`となっていることが多いです。
最後の行の第2引数はミリ秒となっていることが多いのでミリ秒で書くことをおすすめします。

##3: BroadcastReceiverをextends(継承)したクラスを作成する

```AlarmManagerを受け取る場所.java

// BoardcastReceiverを継承
public class AlarmManagerを受け取る場所 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
     // 作りたい処理を書く
    }
}
```

`BroadcastReceiver`を継承してあとはonReceiveメゾットを作ってそこに処理を作ったら完成です。


最後まで見ていただきありがとうございます。
最初なので何かとおかしいところがあれば申し訳ありません。

twitterもやっていますのでフォローしていただければ幸いです。
https://twitter.com/tomfumy_dev
いまさら「なぜアジャイルか？」をまとめた．

# 1. はじめに
本記事では，

| 略称 | 意味 |
| :---: | :---: |
| Waterfall | ウォーターフォール型の開発手法 |
| Agile | アジャイル型の開発手法 |

とする．

# 2. なぜ Agile か？

## 2.1. もともと Waterfall が持っている問題点

実は Waterfall の問題点が指摘されていたのはここ数年の話ではなく，
1990 年代半ばにはすでに反対運動が起きている．[^1]

[^1]: [アジャイルソフトウェア開発 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA)

Waterfall を適用するためには，下記の**条件**をクリアしている必要がある．

| 条件 | 備考 |
| :---: | :---: |
| **顧客が本当に欲しいもの**を把握できる． | 顧客自身が，「本当に欲しいもの」を完璧に説明できるとは限らない． |
| 上記を，**漏れなく**，**正確に**把握できる． | 漏れがあると，手戻りにつながる． |
| リリースまでの**遅さを許容できる**． |  |
| 納品までに顧客の**要求事項が変化しない**． | ≒ ニーズが変化しない． |

### 難易度が高い！

## 2.2. 時代背景
現代は，一昔前と比較して以下の特徴がある．
1. IT 技術／ IT サービスの進化により，ものごとの**変化がはやい**．
2. 既存のニーズがある程度満たされたことにより，**さらなるニーズが多様化／複雑化**している．

ニーズの観点で簡略化すると，
**未来のニーズを正確に予測することは年々困難になってきている**．
と言い換えられる．

今後はさらに，この流れが加速することが予測できる．

## 2.3. まとめ
総じて，以下のことが見てとれる． 

- **要件定義が難しい**．
- **時代背景と相性が悪い**．

だから，**顧客の要求／市場の変化に強い**新しい開発手法として，2001 年に
「**[アジャイルソフトウェア開発宣言](http://agilemanifesto.org/iso/ja/manifesto.html)**」(**Manifesto for Agile Software Development**) が公開された．

# 3. 所感
自分が Agile を知ったのが２年くらい前だったため，生まれて間もない手法だと勘違いしていた．
ところがどっこい，自分が二足歩行の練習をしているときにはすでに誕生していたのである．
勉強してて楽しかった．

# 4. 最後に
「ここもうちょっと具体的に書いてよ」なところがあったらコメントください．
追加します．
【Rails】絶対パス・相対パス・ルートパスの使い分け

#前提知識

- 絶対パスとは・・・Prefixに「_url」を付けて生成されるパスで、 **先頭が「http」で始まる。**

- 相対パスとは・・・現在いる階層からのパスで、**先頭が「/(スラッシュ)」で始まらない。**

- ルートパス(ルート相対パスともいう)とは・・・Prefixに「_path」を付けて生成されるパスで、**先頭が「/(スラッシュ)」で始まる。**


#使い分け

- link_toメソッドの引数で指定するパスは、**絶対パス**または**ルートパス**にする

```ruby:application.html.erb
ex) <%= link_to("TweetApp", "/posts/index") %>
```
※link_toでのパスは、/の左側には「localhost:3000」がある。その為先頭の/を消すとエラーが起きる。

- redirect_toメソッドで指定するパスは、**絶対パス(ルートパスでも可の場合が多い)**にする。

```ruby:users_controller.rb
ex) redirect_to("/login")
```

- renderメソッドで指定するパスは、**相対パス**にする。

```ruby:users_controller.rb
ex) render("users/login_form")
```