OmniAICreator/Qiita-1.07M huggingface dataset:
Rの任意のバージョンをインストールする方法 (Ubuntu 16.04 LTS)

#初めに
 自分の研究室にやってきた留学生の子が、研究室のPC(Ubuntu 16.04 LTS)にRをインストールする際、最新のRではなく、その子が普段使っているRのバージョンをインストールしたいと言ったのがきっかけ。

#方法
 色々と調べた結果、Rの特定のバージョンをインストールする方法が分からなかったので、最新のRをインストールした後に任意のバージョンにダウングレードすることにした。
今回はその方法を記載する。

##1. 最新版のRをインストール
###○ sources.listを編集
/etc/apt/sources.listに以下を追加する

```
deb https://<①適当なCRANのミラーサイト>/bin/linux/ubuntu <②バージョンによる>/
```
① 今回は、統計数理研究所のCRAN( `https://cran.ism.ac.jp`)を使うことにした。何を選んでもインストールできると思う。
[CRANについて](https://ja.wikipedia.org/wiki/R%E8%A8%80%E8%AA%9E#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E9%85%8D%E4%BF%A1%E3%83%BB%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8BCRAN%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A9%9F%E8%83%BD)

② Ubuntuのバージョンは16.04の場合は,`xenial`である。

よって、今回は以下のコマンドでsources.listに追加した。

```
echo "deb https://cran.ism.ac.jp/bin/linux/ubuntu xenial/"
```
###○ 公開鍵をaptに登録

```
gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9

gpg -a --export E084DAB9 | sudo apt-key add -
```

###○ aptでRをインストール
```
sudo apt update

sudo apt install r-base
```
これで最新版のRをインストール完了

##2. 任意のバージョンにダウングレード
```
sudo apt-get -y --allow-downgrades install r-base-core=x.x.x-1xenial0

sudo apt-get -y --allow-downgrades install r-base-dev=x.x.x-1xenial0

sudo apt-get -y --allow-downgrades install r-doc-html=x.x.x-1xenial0
```

この３つのコマンドでダウングレード完了です。
`x.x.x`に任意のバーションを記入してください。

以上で終わりです！

#終わりに
なんだかしっくりこない方法になってしまったなぁ
(追記：[Renv](https://github.com/viking/Renv)なるバージョン管理コマンドラインツールがあったので、それを使ったほうが幸せになれそう)


#参考
[UBUNTU PACKAGES FOR R](https://cran.r-project.org/bin/linux/ubuntu/README.html)
[Ubuntu 16.04 に R と Rstudio をインストール](http://st-hakky.hatenablog.com/entry/2017/10/04/164959)
[[R] R 3.3.3から3.3.2にダウングレードする方法](https://qiita.com/greedy-phils/items/9ef7eee85de55b324d5c)
メール投稿システム(仮)【PHP】

#attachmentの画像保存
未だに完成してない、というか色々他の事やっててまたまた手付かずになってたやつ。
アウトプットして行かないと先に進めない気がするのでチラ裏程度に書いてます。

メーラーによって色々癖があって`Content-Disposition:`フィールドが全部`attachment`になるとか全部`inline`(これはiPhone標準メーラーだけ)になるとか`Content-Type: multipart/related;`が無いとか色々癖がありすぎてどーやって対応すりゃいいのか未だに悩んでます。

`Content-Disposition:`フィールドが`attachment`の場合、インラインならば`Content-ID:`フィールドがあるというのは解ったんだけど、ここから先の条件分岐が思い付かない。

iPhone標準メーラーだと`Content-Disposition:`フィールドが全部`inline`になるし。

言葉で条件分岐を書くならば以下。

```php:
/*
バウンダリ区切りから次のバウンダリ区切りまでを $buf に格納。
Content-Disposition: attachmentの場合
$buf の中に Content-ID: が存在すれば inline処理
無ければ attachment処理 を施す。
*/

if (strpos($buf, "Content-ID:") !== false){
    // inline処理
} else {
    // attachment処理
}
```

iPhone標準メーラーだと最初の画像を添付ファイル扱いにすればやりたいことは実現できそうな気がする。`X-Mailer:`フィールドで`iPhone Mail`がヒットすれば専用の処理を走らす感じになるのかな。`X-Mailer:`フィールドは独自フィールドになるから今後、使えなくなりそうだけど今はこれしか思いつかない。

ソースがめちゃくちゃ肥大化してて凄く解り辛い。もっとスマートに記述出来たりするんだろうけど、レビューしてくれる人がいるわけでもないから自分でどうにかするしかない。解り辛くても動けばいいくらいに考えてます。後のメンテナンスのことを考えるほどスキルがあるわけでもないので、とりあえず動くものを作らないと。

何かあったら追記するかもです。
Rust CString::as_ptrの正しい使い方

# はじめに
RustのCStringはCと同様にヌル終端された文字列型で、主にffiによるCの関数呼び出し時に使います。
普通Cで文字列を引数に取る関数はポインタで渡すので以下のように書けますが、これは間違いです。

```rust
//文字列hogeのポインタを取得
let ptr = CString::new("hoge").unwrap().as_ptr();
//Cの関数呼び出し
unsafe {
  c_func(ptr);
}
```

この`ptr`は`"hoge"`の先頭アドレスを指すように見えますが、実際には大抵の場合、空文字列の先頭アドレスを指します。
ただしそうなる保証は（たぶん）ありません。

以下では、その理由と正しい書き方について説明します。
間違いやもっといい書き方などあればご指摘ください。

# 何が起きているのか

分かってしまえば単純な話なのですが、`new`したCStringそのもののbind先がない（bindしてるのはあくまでポインタ）のでCStringのlifetimeは文の最後で尽きています。
Rustのコード内でlifetimeが尽きたものを参照しようとすると当然怒られますが、
この場合参照するのはCの関数内なのでコンパイラのチェックは通ってしまうというわけです。

「空文字列になる」というのはlifetimeが尽きてメモリ解放時に呼び出されるCStringの`drop`実装によります。Rust 1.13.0あたりからCStringの`drop`で先頭に0を書き込むよう変更されました。
ヌル終端文字列の先頭が0なので空文字列になります。
もちろん`drop`後のメモリ領域が即座に再利用される可能性はあるので、空文字列になる保証はないはずです。

このような挙動になった経緯を最後にまとめておきましたので興味のあるかたはご覧下さい。

# 正しい使い方

## `as_ptr`の場合

CStringをbindするのが一番無難です。

```rust
let c_str = CString::new("hoge").unwrap();
unsafe {
  c_func(c_str.as_ptr());
}
```

また、関数呼び出しまで一気にやってしまうという手もあります。

```rust
unsafe {
  c_func(CString::new("hoge").unwrap().as_ptr());
}
```

CStringが`drop`されるのは文の最後なので、一気に書けば関数呼び出し完了後に`drop`されるようです。
ただしリファクタリングと思って外に出した途端に動かなくなるのであまり良くないと思います。
この挙動が仕様として保証されているのかどうかもよくわかりません。

また文字列ポインタの配列へのポインタを渡す場合（つまり`c_func(char * const *)`のような場合）はこのような感じです。

```rust

let mut ptrs = Vec::new();
let mut strs = Vec::new();

for _ in 0..10 {
  let c_str = CString::new("hoge").unwrap();
  ptrs.push(c_str.as_ptr());
  strs.push(c_str);
}

ptrs.push(ptr::null());

unsafe {
  c_func(ptrs.as_ptr());
}
```

普通に書くと実際に渡したい`Vec<*const c_char>`だけを作ってしまいますが、
それとは別にlifetimeを維持するための`Vec<CString>`が必要です。

## `into_raw`/`from_raw`の場合

ここまでは`as_ptr`の例を示しましたが`into_raw`/`from_raw`を使うことも出来ます。
`into_raw`/`from_raw`の扱うポインタは`*const`ではなく`*mut`なので`as_ptr`から置き換える場合は適宜変換が必要です。

```rust
//文字列hogeのポインタを取得しつつ所有権を放棄
//なのでdropはされない
let ptr: *const c_char = CString::new("hoge").unwrap().into_raw();
unsafe {
  c_func(ptr);
  //所有権を取り戻す。文末でlifetimeが切れてdrop
  CString::from_raw(ptr as *mut c_char);
}
```

ポインタ配列版はCString本体を保持する必要がなくなります。

```rust

let mut ptrs = Vec::new();

for _ in 0..10 {
  let c_str = CString::new("hoge").unwrap();
  ptrs.push(c_str.into_raw() as *const c_char);
}

ptrs.push(ptr::null());

unsafe {
  c_func(ptrs.as_ptr());
  for p in ptrs {
    if !p.is_null() {
      CString::from_raw(p as *mut c_char);
    }
  }
}
```

`into_raw`で所有権を放棄しているのでもし`from_raw`を忘れるとそのままメモリリークします。


# 過去の経緯

だいたいの経緯は以下のRFCからたどれます。

https://github.com/rust-lang/rfcs/pull/1642

元々この問題はGithubに間違ったコードが結構あるけどどうしよう？というところから来ているようです。
最初の提案は、そもそも間違いやすい`as_ptr`が良くないので廃止して`with_ptr`に置き換えよう、というものでした。

```rust
//with_strは却下されたので実際には使えません。
CString::new("hoge").unwrap().with_ptr(|ptr| {
  c_func(ptr);
});
```

確かに`with_ptr`はlifetimeがはっきりするのでこの問題は起きないのですが、
複数使う場合ネストが深くなる、ポインタの配列が再帰を駆使しないと書けない、ということで却下されました。

そうはいっても間違いやすいので「ドキュメントに注意書きを書く」という提案があり、こちらは採用されましたが当然既存のコードには効果がありません。

という訳で最終的に提案されたのが`drop`時のゼロ書き込みでした。
これなら保証はないとはいえ、関数呼び出し自体は予定と違う結果になって、間違いに気づくことが出来ます。
また1バイトの書き込みなのでパフォーマンスへの影響も最小限です。

実際私の場合も過去に書いたffiライブラリを久しぶりにメンテナンスしようと思ったら
テストが全滅したので気づきました。
Raspberry Piの無線LAN設定をコマンドラインで行う

## なぜこれをやるのか
Raspberryを有線接続しながらセットアップをすると，無線LANを自動的に認識されない事が多い．  
また，GUI（デスクトップ環境）で操作では，IPアドレスを固定することができたが，無線LANの設定を自動的に設定することができなかった．
なので，今回はRaspberry Piのターミナルを用いて，CUI（文字のみの環境）で無線LANの設定を行う．

## やるにあたって
必要な技術としては，ターミナルの操作やLunuxの知識が必要となるので，デスクトップ環境のみで生きてきた人には少しつらい部分もある．
今回は，[lsコマンド](http://www.ritsumei.ac.jp/~mmr14135/johoWeb/unix02.html)，[cdコマンド](https://techacademy.jp/magazine/6472)，[vi](http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/command/vi.html)の知識があると乗り切れる．

## 設定方法
sudo コマンドでスーパーユーザ（rootユーザ）になる必要がある

```
$sudo su
```

設定するファイルは以下の2つになる．フルパスで書かれているので，その前にviコマンドを使うことで編集できる． 

* /etc/wpa_supplicant/wpa_supplicant.conf

```wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
ap_scan=1
update_config=1

network={
  ssid="SSIDの名前"
  psk="パスワード"
  scan_ssid=1      #ステルスの場合には左の設定を記述する
  key_mgmt=WPA-PSK
}
```

* /etc/network/interfaces

```interfaces
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
  address 192.168.1.20
  netmask 255.255.255.0
  broadcast 192.168.1.255
  gateway 192.168.1.1
  dns-nameservers 192.168.1.1
  wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```
terraformの雛形作成

# terraformの雛形作成
## 1.terraformをダウンロードする
```
$ curl -O https://releases.hashicorp.com/terraform/0.11.1/terraform_0.11.1_linux_amd64.zip
$ sudo unzip terraform_0.11.1_linux_amd64.zip -d /usr/bin/
$ terraform --version
```
## 2. git clone
```
$ git clone https://github.com/shodaisuzuki/terraform_stationery.git
```
### 構成について
```
$ tree
├── README.md
├── bin
│   ├── apply
│   ├── plan
│   └── terraform.exec.sh
├── environments
│   ├── production
│   │   ├── config
│   │   │   └── production.conf
│   │   ├── tfvars
│   │   │   ├── credential.tfvars
│   │   │   └── production.tfvars
│   │   └── user_data
│   │       └── user_data.sh
│   └── staging
│       ├── config
│       │   └── staging.conf
│       ├── tfvars
│       │   ├── credential.tfvars
│       │   └── staging.tfvars
│       └── user_data
│           └── user_data.sh
├── lib
│   ├── add_env
│   ├── remove_env
│   └── template
│       ├── config
│       │   └── template.conf
│       ├── tfvars
│       │   ├── credential.tfvars
│       │   └── template.tfvars
│       └── user_data
│           └── user_data.sh
├── tf
│   ├── auto_scaling.tf
│   ├── load_balancer.tf
│   ├── production
│   ├── staging
│   └── variables.tf
└── tfvars
    └── common.tfvars
```

#### bin
実行ファイル
./terraform_stationery/bin/plan | apply env 
例えば、production環境にplanする場合

```
$ ./terraform_stationery/bin/plan production
```

#### environments
環境ごとの設定値を記述

#### lib
 ```
$ lib/add_env　XXX #環境追加
$ lib/remove/env XXX #環境削除 
```
#### tf
AWS構成を定義する
ファイル名はサービス単位で作成
tf直下の.tfは共通のリソースを記述
variable.tfではtfファイルで使用する変数の定義を行う（実際の値はtfvarsから読み取る）
環境名の下には環境別のリソースを記述する


#### tfvars
tfファイルで使用する変数の値を書く
変数の定義はtf/bariable.tfで行う
共通の設定値をここに書き、環境別の設定値はenvironmentsの方に書く

## 参考

### リファレンス
https://www.terraform.io/docs/commands/index.html
### 構築
http://made.livesense.co.jp/entry/2016/07/12/083000
https://tech.recruit-mp.co.jp/infrastructure/post-10665/
https://qiita.com/zembutsu/items/93e546df765f8b2c4f32
https://qiita.com/ringo/items/3af1735cd833fb80da75
### 壊れた時の復旧参考
https://qiita.com/minamijoyo/items/e0f69bfa853bef60977e#%E3%83%80%E3%83%9F%E3%83%BC%E3%81%AEtf%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B
https://blog.stormcat.io/post/entry/2015/06/01/210500/
Vagrant PHP CLI Xdebug 方法

前略 

最近なんだかんだでフリーランスなりました
お仕事の話あればください！

という報告ついでにメモ的備忘録

後略

vagrant内でphpを実行した時にxdebugしたくなったらこうすれば良いようです

```shell
php \
    -dxdebug.remote_enable=1 \
    -dxdebug.zend_extension=/usr/lib64/php/modules/xdebug.so \
    -dxdebug.remote_port=9000 \
    -dxdebug.remote_autostart=On \
    -dxdebug.idekey=PHPSTORM \
    -dxdebug.remote_host=192.168.33.1 \
    -f hoge.php 
```

php.ini に書くオプションを直接渡す感じ

堅苦しいセキュリティソフト入ってるとXdebugの邪魔したりするのやめてほしいです！
すごく嵌りました！！💢

最近はフロント側の動きが目まぐるしいのでvueとか触ってみてます
Getting reflection in python

```python
def project(p12,p10):
  norm = np.linalg.norm(p12)**2
  ret = np.dot(p10,p12)/norm
  return an[0]+p12*ret

a = []
a.append(map(int, raw_input().split()))
an = np.array(a).reshape(2,2)
p12 = an[1]-an[0]

n = input()
for i in range(n):
  a = []
  a.append(map(int, raw_input().split()))
  for aa in a:
    hn = np.array(aa).reshape(1,2)
    p10 = hn[0]-an[0]
    print(p12,p10,aa)
    projection = project(p12,p10)
    print(p10 + (projection - p10) * 2.0)
```
Chrome拡張機能の構造のーと

- Google Chrome 65.0.3325.181
- https://developer.chrome.com/extensions/getstarted
- https://developer.chrome.com/extensions/manifest

Chrome拡張機能の説明を読んだら、似たような言葉にいい感じに混乱したので図にしとく。

![ChromeExtensionDiagram](https://www.plantuml.com/plantuml/png/V90nJiOm34PtdoBAY9GATWOM1Wx070NN58iqgUAa8C61EGQfKb1fwR-vVS_s5zz9TYcNqSCBzwIG4te2z4v4tRzd2i8n0FoMwieOfQ-xxaQhnmTBdaOAMNO2nb0_inLCF1teayFN8SKI-XCXJhcMTd83xT7i4iSYriU1qJwphmOS1whRpx-Bbbcd7iqrR5DWkxlHzaTiuGkmDMykiYP8yKqeMOUBTkHBsmzSh_vFo0_GkwTeC0Q-liielzKqWYWEt-zJYEzHw4KlMgZqfds0GYqKIYdQNfM2PqP5MPFD7sF8WacCnjr4iX8aYR8hFipPsLslV8MSsO5PNM_4MVPySyxtEpgqeju2mH7c6O8L-bx4Px5THxX7RYCFaCsDzvzB7n6yS7cQ307PIRZg8upYesRSVKIOYf4jMarP0NNZlseXxqtU_xjSgVweob2BXJU5FvM_PTd1kdyP7RhYrjq4BGGROOZWfjrG4mDa7A6v2TeQd8dUPtx_-hEQGiMgaOo1Meek6C8rmh6Q3naTFM8fM7x9937tABMaLL3nkqybKf0uOsHc7hUJxR-qijQ9p848dgAxguGlwMraPFOSsGjo1_aCQmS60f7Qwvv97IRkW_3ikEkl-pTwvcnzP8VPgPX_GtlPEgkWXJKYe-GugqQOn8wV33gaDvjXUx_K27oS3lyiFw4JBbUKo9SF-khT_PINxpvH1cMQr853oXH1krCKlSKAeOvPVTnUa9Qj79mSHM7sVziw2BP0DaMUokSj19UiasR1BVNT2FqUeLHQcfzCvbXh4Fzj-TSt-ejx1G00)

クラス名に使用しているのはドキュメントにでてきた言葉。
`"ダブルクォーテーション"` は `manifest.json` に登場する言葉。

# 図のソース

[これでも見れるけど](https://www.plantuml.com/plantuml/uml/V90nJiOm34PtdoBAY9GATWOM1Wx070NN58iqgUAa8C61EGQfKb1fwR-vVS_s5zz9TYcNqSCBzwIG4te2z4v4tRzd2i8n0FoMwieOfQ-xxaQhnmTBdaOAMNO2nb0_inLCF1teayFN8SKI-XCXJhcMTd83xT7i4iSYriU1qJwphmOS1whRpx-Bbbcd7iqrR5DWkxlHzaTiuGkmDMykiYP8yKqeMOUBTkHBsmzSh_vFo0_GkwTeC0Q-liielzKqWYWEt-zJYEzHw4KlMgZqfds0GYqKIYdQNfM2PqP5MPFD7sF8WacCnjr4iX8aYR8hFipPsLslV8MSsO5PNM_4MVPySyxtEpgqeju2mH7c6O8L-bx4Px5THxX7RYCFaCsDzvzB7n6yS7cQ307PIRZg8upYesRSVKIOYf4jMarP0NNZlseXxqtU_xjSgVweob2BXJU5FvM_PTd1kdyP7RhYrjq4BGGROOZWfjrG4mDa7A6v2TeQd8dUPtx_-hEQGiMgaOo1Meek6C8rmh6Q3naTFM8fM7x9937tABMaLL3nkqybKf0uOsHc7hUJxR-qijQ9p848dgAxguGlwMraPFOSsGjo1_aCQmS60f7Qwvv97IRkW_3ikEkl-pTwvcnzP8VPgPX_GtlPEgkWXJKYe-GugqQOn8wV33gaDvjXUx_K27oS3lyiFw4JBbUKo9SF-khT_PINxpvH1cMQr853oXH1krCKlSKAeOvPVTnUa9Qj79mSHM7sVziw2BP0DaMUokSj19UiasR1BVNT2FqUeLHQcfzCvbXh4Fzj-TSt-ejx1G00)、なんとなく貼っておく

```
@startuml
hide circle
class Extension

Extension *-- "0..1" UI_elements
Extension *-- content_scripts
Extension *-- background_scripts
Extension *-- option_pages
Extension *-- various_logic_files

background_scripts <|-- background_page
background_scripts <|-- event_page

option_pages <|-- options_ui
option_pages <|-- options_page

UI_elements <|-- browser_action
UI_elements <|-- page_action

class background_scripts {
"background_page"
--
裏方で動く仮想的なページ
HTMLの体裁を保つ理由は多分ない
}
class background_page {
"persistent" = true
--
非推奨（ずっと動いちゃう）
}
class event_page {
"persistent" = false
--
必要な時だけ動くもの
}

class content_scripts {
"content_scripts"
--
ページのDOMを触るもの
}

class option_pages {
--
「拡張機能のオプション」
から開く設定画面
}
class options_ui {
"options_ui"
}
class options_page {
"options_page"
--
古い（options_uiに移行）
}

class UI_elements {
--
ユーザーが使うUI
}
class browser_action {
"browser_action"
--
いつでも使うもの
}
class page_action {
"page_action"
--
特定ページで使うもの
}

class various_logic_files {
--
スクリプトとか画像とか
他の拡張で使う諸々
}
@enduml
```
Xamarin.iOS でNSCalendarsUsageDescriptionの説明を書けと注意されちゃう

Xamarinで書いたiOSアプリをAppleに提出してみたら以下の理由で審査に落ちてた。

> Missing Info.plist key - This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSCalendarsUsageDescription key with a string value explaining to the user how the app uses this data.

`NSCalendarsUsageDescription`を書けといっている。

でもこのアプリはカレンダーの情報なんてアクセスしないんだけど？

なんでだろうといろいろググってみたら、`Xamarin`の[PermissionsPlugin](https://github.com/jamesmontemagno/PermissionsPlugin)の設定を正しく行っていなかったことが判明。

> Due to API usage it is required to add the Calendar permission :(

> `<key>NSCalendarsUsageDescription</key>`
> `<string>Needs Calendar Permission</string>`

> Even though your app may not use calendar at all. I am looking into a workaround for this in the future.

カレンダーにアクセスしなくても`NSCalendarsUsageDescription`が必要とのこと。
【kintone】カスタマイズビューのHTML文字数上限を超える

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/kintone-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AEHTML%E6%96%87%E5%AD%97%E6%95%B0%E4%B8%8A%E9%99%90%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B/)をご覧ください😀


HTMLは10,000文字以下という制約に引っかかってしまったときの解決法。

HTMLをjsの変数として定義して埋め込みましょう。

## HTMLは空タグのみ用意

埋め込み先として空のdivタグのみ記述します。

```html:一覧のカスタマイズHTML
<div id="customize_view"></div>
```

## 実際に表示したいHTMLをjsファイルに定義

[テンプレートリテラル（バッククォートで囲む）](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/template_strings)を使えば改行のまま定義できて便利。

```javascript:customize_view_template.js
const customize_view_template = `
{ここに10,000文字を超えるHTMLを書く}
`;
```

## jsで表示する

最後に定義したHTMLをjsで出力します。

```javascript:customize_view_logic.js
(function() {
    "use strict";

    const customize_view_id = 'customize_view';

    kintone.events.on(['app.record.index.show'], function (event) {
        // 対象のビューでない場合は処理しない
        if (document.getElementById(customize_view_id) == null) {
            return event;
        }

        // 出力
        document.getElementById(customize_view_id).insertAdjacentHTML('afterbegin', customize_view_template);

    });
})();
```
「30分間React入門「いいねボタン」作成チュートリアル」やってみた

# 30分間React入門「いいねボタン」作成チュートリアル
http://c16e.com/1510161700/

#注意
下準備の```npm run build``` でつまづくので、足りないパッケージをインストール

```
$ npm install --save-dev babel-preset-es2015 babel-preset-stage-0 babel-preset-react 
```

webpack.config.js編集してloaderを変更

```diff:webpack.config.js
module.exports = {
  entry: __dirname + "/src/main.js",
  output: {
    path: __dirname + "/dist",
    filename: "like-button.js"
  },
  module: {
    loaders: [
-      {test: /\.js$/, loader: "babel", query: {presets: ["es2015", "stage-0"]}}
+      {test: /\.js$/, loader: "babel-loader", query: {presets: ["es2015", "stage-0", "react"]}}
    ]
  }
};
```
####package.jsonはこうなります
```json:package.json
{
  "name": "like-button",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "rm -rf dist/*.js && webpack",
    "watch": "rm -rf dist/*.js && webpack -w"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "webpack": "^3.6.0"
  }
}
```

#ソース
今回書いたソースコードはこちらです
https://github.com/soartec-lab/react_like_button
ドットファイル(設定ファイル)をGit管理する

## 何が嬉しいのか
- 複数のPCを使っている場合に設定を統一させたい場合に同期できるのでとても便利
- 社内の複数人で共通の設定を使う場合などにも使える

## 設定例
.bashrcを管理する例を書いておく

1. 設定ファイルを管理するディレクトリの作成
	
	```
	$ mkdir ~/.setting_files
	```
1. 設定ファイルを移動してシンボリックリンクの作成

	```
	$ mv ~/.bashrc ~/.setting_files/
	$ ln -s ~/setting_files/.bashrc ~/.bashrc
	```
1. Git管理してリモートにpush

設定ファイルをゴリゴリ書くような人は既にやっているかと思いますが記事として残しておきます。
Getting projection in python

```
a = []
a.append(map(int, raw_input().split()))
an = np.array(a).reshape(2,2)
p12 = an[1]-an[0]

n = input()
a = []
for i in range(n):
  a.append(map(int, raw_input().split()))
for aa in a:
  hn = np.array(aa).reshape(1,2)
  p10 = hn[0]-an[0]
  norm = np.linalg.norm(p12)**2
  ret = np.dot(p10,p12)/norm
  print(p10,p12,ret,norm)
  print(an[0] + p12 * ret) 
```

# Refs.
* [norm](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html)
VSCodeのファイルエクスプローラーのtreeを見やすくする


#### 変更後の参考画像
![参考](https://qiita-image-store.s3.amazonaws.com/0/46870/cedde21a-c004-93b0-ebc5-66449d5c8c71.png)

#### TL;DR
- この[Issueコメント](https://github.com/Microsoft/vscode/issues/17777#issuecomment-336641000)を参考にextensionを入れてstyleを変更する

#### Macでの手順
- [vscode-custom-css](https://marketplace.visualstudio.com/items?itemName=be5invis.vscode-custom-css)をVSCodeにインストール
- `~/.vscode/css/tree.css`に[このgist](https://gist.github.com/jakewtaylor/e92acd697409e53a73ebf8e0145d4c28)のstyle.cssの中身をコピペ
- VSCodeの`Preferences > Settings`を開いて↓の設定を追記
  - [IMPORTANT]URLではなくローカルファイルの指定には`file://`から始める必要があることに注意
  - `{{YourUserName}}`は自分のユーザー名に置き換えてください

```
"vscode_custom_css.imports": [
  "file:///Users/{{YourUserName}}/.vscode/css/tree.css"
]
```

- VSCodeでF1を押してコマンドパレットを開き `Enable Custom Css and JS`と入力して実行
- VSCodeを再起動
- `"Your VS Code is corrupted"`とメッセージが出たら `“Don't show again”`をクリックして消す
    - 無視していいものだそうです
- :tada:
Swagger定義ファイルからそれなりにいい感じのHTMLで静的なAPIドキュメントを生成する

こんな感じ

![document_sample.png](https://qiita-image-store.s3.amazonaws.com/0/36379/c18f79df-53b7-c0ef-4eda-1822b5b093c6.png)

[サンプル](https://ryutah.github.io/docker-swagger-document/)

# はじめに
この記事で紹介してる手順は下記の参考サイトと全く同じです。

[Swagger 定義ファイルから そこそこいい感じの静的 REST API ドキュメント作成する - Witch on the Other Shore](http://iktakahiro.hatenablog.com/entry/2016/11/23/100000)

---

最近じゃSwaggerとかでAPI定義書いてSwagger UIをどっかにホスティングして配布するみたいな感じの開発も普通になってきたけど、いまだに静的なファイルでAPIドキュメントが必要というケースも結構あると思う。

一応 `swagger-codegen` でhtmlを出力することもできるんだけど控えめに言って見た目がダサいため、今まではSwagger UIの画面をブラウザで開きPDFで出力するみたいな方法でわりと無理やりドキュメントを生成してた。(めんどくさいので当然メンテナンスしなくなる)

わざわざ自分でツール作るのもめんどくさくて、何かいい方法ないかなーと思って調べたら最初に書いてある記事を発見して、それがわりといい感じだったので紹介してみる。

# 手順
最初に紹介した記事とおんなじことやってるだけ。
各ツールのビルド方法とか元記事には載ってないところを補足として少し追記。

## 使うツールとか
* [swagger2markup-cli](https://github.com/Swagger2Markup/swagger2markup-cli)
  - Swagger -> AsciiDocの変換
* [asciidoctor](https://github.com/asciidoctor/asciidoctor)
  - AsciiDoc -> HTMLの変換

## やってみよう
### 1. swagger2markup-cliのビルドする
```console
$ git clone https://github.com/Swagger2Markup/swagger2markup-cli.git
$ cd swagger2markup-cli
$ gradle assemble
```

`{PROJECT_ROOT}/build/libs`に`swagger2markup-cli-{VERSION}.jar`が生成されてればOK

### 2. asciidoctorをインストール
```console
$ gem install --no-doc --no-ri asciidoctor
```

### 3. Swagger -> AsciiDoc変換
まずはswagger定義ファイルをAsciiDoc形式に変換する。
使うのは `swagger2markup-cli`

```console
$ java -jar {swagger2markup-cli_ROOT}/build/swagger2markup-cli-{VERSION}.jar convert -i {SWAGGER_FILE_PATH} -f {OUTPUT_FILE_PATH}
ex) java -jar /usr/local/lib/swagger2markup-cli-1.3.2.jar convert -i swagger.yaml -f swagger
# カレントディレクトリに `swagger.adoc` が生成される
```

### 4. AsciiDoc -> HTML変換
最後に`asciidoctor`を使ってAsciiDoc形式のファイルをHTMLに変換する

```console
$ asciidoctor -a toc=left {ASCII_DOC_FILE_PATH}
ex) asciidoctor -a toc=left swagger.adoc
# カレンドディレクトリに `swagger.html` が生成される
```

以上。
すごい簡単！！

# Dockerイメージ作った
簡単ではあるものの、生成するたびに Swagger -> AsciiDoc -> HTMLとステップ踏むのが面倒だったり、ツールのビルドにGradleやらRubyやらが必要だったりとちょっとめんどくさかったのでドキュメント生成をラップしたDockerイメージ作った。

[ryutah/swgger-document - Docker Hub](https://hub.docker.com/r/ryutah/swagger-document/)

リポジトリのドキュメントにも書いてあるけどこんな感じでつかう。

```console
$ docker run \
    -v {SWAGGER_FILE_DIRECTRY}:{MOUNT_PATH} \
    ryutah/swagger-document {SWAGGER_FILE_PATH} {OUTPUT_FILE_PATH}
```

例) カレントディレクトリの `sample.yaml` を `sample.html` としてドキュメント生成

```console
$ docker run \
    -v $(pwd):/work \
    ryutah/swagger-document /work/sample.yaml /work/sample.html
```

1つのHTMLとして出力できるから配布も簡単。


ドキュメント出力したいときとかCIに組み込みたいときなんかに使えるんじゃないかな。

# 参考サイト
* [Swagger 定義ファイルから そこそこいい感じの静的 REST API ドキュメント作成する - Witch on the Other Shore](http://iktakahiro.hatenablog.com/entry/2016/11/23/100000)
BPMS processmaker

https://www.bpmchat.com/
実際にRPAとの組み合わせを見れるようにしながら変更していく

実際に登録するまでの流れと動作　GASのソースはアップしながら、誰もが使えるようにまで
ちょっとずつ　流れがあって　いろいろな技術があると思う
＊）全体の中で自分はここをやって　それは繋がっていると思うと考えも変わると思うけど　なかなか難しい　出来ればBPMSで最初にわかれば　変わることもあるかもしれないかも

本当はトータルして何かを作りたいというのに技術があるのかな

BPMS PROCESSMAKERをつかっているが、実際データと比べての説明
システム開発でのBPMSというジャンルだと考えやすいのでそれをもとに　徐々に記載 
http://wiki.processmaker.com/

#BPMS　業務フローとデータの関係
![業務フロー.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/b0f6975a-0bdd-bb4e-4609-4c928a15eec7.jpeg)
#データ構造　フローをデータで表す場合
![データ構造.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/748faf8e-43e5-b52f-dcb7-58cf1a2637e8.jpeg)
#フローをデータに分けると大体かきにまとめられる
プロセス（全体の流れ　BPEL)
タスク（フローでの個々の業務）
ケース（作業管理）
ステップ（実行判定）
トリガ（タスクを実行する際に実行される処理）
ルート（次の処理に行く条件）
#次回 BPMSに沿ってシステムの作成
タスクを実際に設定して業務システムと連携
タスク業務設計から設定（業務設計との連携もかねて）

![ナビゲート.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/243ccb55-7fdf-90ea-7caf-5efb59636997.jpeg)

#BPMSに沿って自動で作成されるシステム
![自動で作成されるページ.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/819b328f-ac31-64d9-1bb0-c89a0603f529.jpeg)
Visual Studio 2017 で git remote prune

## 概要

Visual Studio 2017 上で fetch, pull 時に自動で `git remote prune origin` をする

## 設定

1. [チーム エクスプローラー] タブを選択し、[設定] をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/11242/7fe21f59-e207-e97e-9f8a-110e7ef3d752.png)

2. Git の [グローバル設定] をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/11242/e6d6e3b2-485d-1153-6d3e-9b16df428384.png)

3. 「Prune remote branches during fetch」を [true] にして [更新] をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/11242/42cdf169-2044-e7eb-e877-7ba6976224f3.png)

## 参考

- [How do I refresh branches (local/remote) in Visual Studio when using Git? - Stack Overflow](https://stackoverflow.com/questions/33739400/how-do-i-refresh-branches-local-remote-in-visual-studio-when-using-git/44392375#44392375)
LaravelとAdminerでサクッと管理機能。手抜きだけど結構使えるやつ

# Adminer
https://www.adminer.org/

すごく便利ですよね :sunny:

普段Laravelで開発することが多いのですが、
Laravelでログインした後に、Adminer使えたらいいなーと思ったら、
すでにライブラリありました:dancer_tone3:

最速で管理機能が作れちゃう予感です。
せっかくなので導入してみました。

# Laravel-Adminer
https://github.com/miroc/Laravel-Adminer
LaravelからAdminerを呼び出せるようにしてくれます。
やってることはシンプルですね！

##試した環境
Laravel5.5（Laravel５.1より前はトークンチェックの所が違うみたいです。）

##導入
### 1.ライブラリの追加
```
composer require "miroc/laravel-adminer"
```

### 2.rootingの設定
以下の設定で、〜〜/adminerにアクセスした場合、Adminerに自動でログインできるようになります。
middlewareでログイン後のみアクセス可能に設定しておけば、ログインした後のみアクセス可能になります。

```
Route::group(['middleware' => 'auth'], function () {
    Route::any('adminer', '\Miroc\LaravelAdminer\AdminerAutologinController@index');
});
```

### 3.トークンチェック対象から除外
〜〜/adminer配下での遷移時にエラーにならないようにトークンチェックの除外対象に設定します。

▼Laravel 5.1以上の場合

```php:app\Http\Middleware\VerifyCsrfToken.php
protected $except = [
    'adminer'
];
```

管理画面、もう、これで十分かも:wink:
[Unity開発] ダウンロードデータ、AssetBundle、などのキャッシュ問題切り分けまとめ

## 概要

最新のサーバーを使用するスマホアプリを開発していてデータが落ちてこねえ、ということありませんか？
僕は最近ありました、アセットバンドルを暗号化していたためキャッシュされたアセットバンドルをダウンロードしたときに壊れている扱いになって何が何だかな状態に。
作成時の不具合なのかまず検討したため原因究明に時間がかかったものの結局キャッシュかよという切ない状況になりました。
ということでデータをダウンロードする場合はデータが悪い場合もありますがキャッシュが原因の場合もあるので開発者は知識として知っておいたほうがいいと思いまとめました。
WWWクラスなどでアセットバンドルや画像データをダウンロードした時に最新のデータではなく古いデータになっていることがあります。
この問題はアプリ側（OS）側のキャッシュとサーバー側のキャッシュの可能性があります。

## アプリ側のキャッシュ

アプリ側のキャッシュはWWWクラス（新しい方のAPIはちょっとわからないです）がOSのAPIしているためにダウンロードデータをキャッシュしているために起こります、Unityのキャッシュとは別なので注意が必要です。
回避策としては以下の公式リンクを参考にしてください。

https://helpdesk.unity3d.co.jp/hc/ja/articles/204488864-WWW-がキャッシュされるのを防ぐ
https://qiita.com/tempura/items/75a429507c6d32bf8f46

## サーバ側のキャッシュ

サーバー側のキャッシュはサーバークライアント型のアプリを開発している場合は注意してください。
Webの開発でもよく起きているらしく、ファイルの更新が検出できないような構成だと起こるらしいです。
回避策としてはwebサーバの設定ファイルでキャッシュしないような設定にして
webサーバーを立ち上げ直す必要があるみたいです。

https://qiita.com/sugiii8/items/233e88aa26f00b290f38
https://qiita.com/itsumoonazicode/items/ad5c8017e9285868547e

## まとめ

意外とアプリ開発をしていてサーバのキャッシュの問題であった場合は検索してもうまくヒットせず調べることが難しかったです。
データダウンロードを行うようなアプリを開発するときはキャッシュが問題になる場合があるの知っていれば問題が起きた時に原因特定の時間が短縮できるはずです。
同じ問題当たってしまった人の役に立てればと嬉しいです。
何か間違いがあればコメントください。
Parallel and orthogonal judgement with dot and cross from input for two four points

```python
n = input
a = []
for i in range(n):
  a.append(map(int, raw_input().split()))
for aa in a:
  an = np.array(aa).reshape(4,2)
  s1 = an[1]-an[0]
  s2 = an[3]-an[2]
  dot = np.dot(s1,s2)
  cross = np.cross(s1,s2)
  if (dot==0):
    print("1")
  elif (cross==0):
    print("2")
  else:
    print("0")
```

```
3
0 0 3 0 0 2 3 2
0 0 3 0 1 1 1 4
0 0 3 0 1 1 2 2
2
1
0
```
# Refs.
http://d.hatena.ne.jp/pashango_p/20090714/1247590272
https://qiita.com/lethe2211/items/6cbade2bc547649bc040
[Swift] アプリ名をローカライズする

前提条件：
ローカライズ対応済みであること
以下参照
https://qiita.com/abymaki/items/e03b5e34a0b37e94ad3c

手順：
① 新規ファイル作成より[Strings File]を選択して、「InfoPlist.strings」という名前のファイルを作成する。

② 作成した「InfoPlist.strings」をXcode上で選択して、[File inspector]-[Localize...]ボタンを押下し[Japanese]を選択する。

③ 「InfoPlist.strings」に以下を記載する。

```
CFBundleDisplayName = "アプリ名";
```
ソートは書けなくていい。が、書ける必要がある

# はじめに

なんか今日の昼ぐらいにソートのアルゴリズムを書ける書けないの話題があったっぽいので昔の思い出話を書きます。

# まず初めに

別に書けなくていいです。普通のプログラミング言語ならライブラリにソートの関数というかメソッドというかが用意されています。それを使えばいいです。しかも多くの場合、自分で書くより速いです。データ量に応じてソート方法切り替えたりとかいろいろやっているっぽいので。

# じゃあなんで「書ける必要がある」と書いているのか

昔、プログラマの能力テスト作ってくれと言われてその中にバブルソートを書かせる問題を入れてました。といってもバブルソートのアルゴリズムを暗記している必要があり、それをそらで書くことを求めたわけではありません。
**バブルソートのアルゴリズムは間違えようがないぐらい馬鹿丁寧に問題文に書きました。**

さて、私が何をテストしたかったかわかりますか？
**書かれていることを正しくプログラミングする能力です。**
別の言い方をすると、
**仕様を正しく理解する力です。**

# で、結果は？

テストを受けた人の採点を行うことになりました。
その前に、テストのテスト（本格運用前のお試し）だったので、テストを受けてみてどうだったかのアンケートも見ました。こんなことが書かれていました。

**実務でバブルソートを書くことなんかありえません。**

知ってるよ。
で、そんな偉そうなことを言うならもちろん、

不正解でした。
私に採用権があるならこの人は落とします。

# まとめ

というわけでソートが書ける書けないの話に絡めて昔話をしました。

- ソートアルゴリズムを暗記してそらで書ける必要は全くない
- しかしアルゴリズムが提示されたら正しく実装できる能力は求められる
- それは仕様を正しく理解する能力だ
- なお仕様が正しいかは知らない
railsのmodelでValidateをファイルに切り出す


# いつも通り以下の様なvalidatesをモデルに書いていたとする

```ruby:app/models/user.rb
  validates :name, presence: true
  validates :email, presence: true
  validates :password, presence: true
```
## 1.validate用ファイルを作りvalidatesを移動する

```diff:app/models/validatos/user.rb
+ {  module Validators::User
+    def self.included(klass)
+      klass.validates :name, presence: true
+      klass.validates :email, presence: true
+      klass.validates :password, presence: true
+    end
+  end
```

```diff:app/models/user.rb
-  validates :name, presence: true
-  validates :email, presence: true
-  validates :password, presence: true
```

## 2.1で作ったファイルをincludeする

```diff
:app/models/user.rb
+  include Validators::User
```
正規分布のグラフについて

<h1>はじめに</h1>
春から社内SEとなりました。
諸々勉強中ですので、熟練の方にとっては物足りない内容かもしれません。
Qiitaの投稿内容は私のメモ程度の内容ですので
所属する組織の見解や学術的な内容ではありません。
頑張って更新続けます。

<h1>正規分布の確率密度関数とは</h1>
平均μ、分散σ^2の正規分布の確率密度関数は下記のように表現されます。

```math
X〜N(\mu,\sigma^2)
```
ならば

```math
f(x) = \frac{1}{\sqrt{2π\sigma^2}}\times\exp(-\frac{1}{2\sigma^2}(x-\mu)^2)
```




<h1>正規分布のグラフとは</h1>
上記の確率密度関数のグラフを書きたいと思います。
グラフを書くには微分して増減表を書きます。
（合成関数の微分です）

```math
\begin{align}
\frac{df(x)}{dx} &= \frac{1}{\sqrt{2π\sigma^2}}\times\exp(-\frac{1}{2\sigma^2}(x-\mu)^2)\times(-\frac{1}{2\sigma^2}\times2\times(x-\mu))\\

&=f(x)\times\frac{-(x-\mu)}{\sigma^2}
・・・①
\end{align}
```
（まあまあ綺麗にまとまります）
もう一回微分します。
（積の微分です）

```math
\begin{align}
\frac{d}{dx}\frac{df(x)}{dx}&= \frac{df(x)}{dx}\frac{-(x-\mu)}{\sigma^2}+f(x)\frac{-1}{\sigma^2}\\
&= f(x)\times\frac{-(x-\mu)}{\sigma^2}\times\frac{-(x-\mu)}{\sigma^2}-f(x)\frac{1}{\sigma^2}\\
&= f(x)\times\frac{1}{\sigma^4}\times(x-\mu)^2-f(x)\frac{1}{\sigma^2}\\
&= f(x)\frac{1}{\sigma^4}
((x-\mu)^2-\sigma^2)\\
&= f(x)\frac{1}{\sigma^4}
((x-\mu)+\sigma)((x-\mu)-\sigma)
・・・②
\end{align}
```
（綺麗です）

よって増減表は下記の通りです。

|x|・・・|μ|・・・|
|:-----------------|------------------:|:------------------:|:------------------:|
|①|+|0|-|
|f(x)|・・・|極大|・・・|

|x|・・・|μ-σ|・・・|μ+σ|・・・|
|:-----------------|------------------:|:------------------:|:------------------:|:------------------:|:------------------:|
|②|+|0|-|0|+|
|f(x)|・・・|変曲点|・・・|変曲点|・・・|

ちなみに

```math
\begin{align}
\lim_{x\rightarrow\pm\infty}\exp(-x^2)=0
\end{align}
```
であるので

```math
\begin{align}
\lim_{x\rightarrow\pm\infty}f(x)=0
\end{align}
```
です。
(ここでは厳密な証明を避けております。はさみうちの原理？です。
私の知能を察してください。)

よって平均μ、分散σ^2の正規分布のグラフは
μ（平均値）で極大になり、μから±σ（標準偏差）離れているところで変曲点になると想像できます。
<h1>Rによる正規分布とは</h1>
理屈だけではイメージできないので
可視化してみます。
平均0,分散1の正規分布は下記のようになります。

```sample.R
> curve(dnorm,-3,3)
```

![スクリーンショット 2018-04-03 21.03.08.png](https://qiita-image-store.s3.amazonaws.com/0/243058/ef5f2690-70ec-2e3d-a338-74e2bbae4979.png)

分散1と仮定してますので標準偏差は1となります。
x=±1でいい感じの変曲点になっているかと思います。
<h1>終わりに</h1>
なんとなく正規分布のグラフを書いてしまいがちですが、
高校数学を用いると多少正確に書けることができます。
（変曲点がどこなのか考えて描けます）

ちなみに
平均0分散1の正規分布を標準正規分布と呼びます。
また
平均50分散100（=標準偏差10）の正規分布は偏差値として使用されます。
（偏差値60の方は変曲点におります）

<h1>反省</h1>
私はネットサーファーですが、
実際に記事を書くと色々と苦労しました。
Qiitaを投稿している方々に改めて感謝しつつ、
私も有用なものをたくさん書きたいと思いました。
JavaScriptスマートメモ

# JavaScriptをスマートに書けるようになりたい！
と思い、この記事を投稿することに。
## 内容
- JSの基本の使い方
- 簡単な文法

## 対象者
- JavaScriptの使用方法を一通り覚えたけれど、まだまだ検索しながらでないと文法とかわからないよ！という方

# JavaScriptの記述箇所

## html内に直接記述

scriptで囲う

```html
<script>
	//ここに記述する
</script>
```

## 外部ファイルに記述
外部ファイルの場合、拡張子は**.js**にする。

### 外部ファイルを読み込ませる
htmlファイルに記述する内容。scriptにsrcでファイルの場所を指定してあげる。相対パスでも絶対パスでも。
記述する位置はbody内でもいいみたいだけど、head内に書く方がわかりやすいと思う。


```html
<script src="./hoge.js"></script>
```

## HTML4の場合
scriptにtype="text/javascriptを指定しなければならない。

```html
<script type="text/javascript" src="./hoge.js"></script>	//外部読み込み

<script type="text/javascript"></script>	//コード内に記述
```

## 記述方法Sample
```html:sample.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>sample</title>
	<script src="./js/hoge.js"></script>	//外部ファイルを読み込み

	<script>
		//ここでもOK　HTML5用
	</script>

</head>
<body>

	<script type="text/javascript">
		//ここでもOK typr以降はhtml5は不要
	</script>

</body>
</html>
```

# 分岐
## if(条件分岐)

```javascript:if.js
if(条件式){
	//条件が真ならば処理
}
```

## if～else

```javascript:if_else.js
if(条件A){
	//条件Aが真の場合の処理
}else if(条件B){
	//条件Bが真の場合の処理
}else{
	//すべて当てはまらない時の処理
}
```

## switch(多岐分岐)

```javascript:switch.js
switch( 式 ){
	case 値1:
		//処理1
		break;

	case 値2:
		//処理2
		break;

	case 値3:
		//処理3
		break;

	case 値4:
		//処理4
		break;

	default:
		//処理
}
```


# 比較演算子
| 演算子 | 用途 |
|:-:|:--|
| == | 等しい |
| != | 等しくない |
| === | 厳密に等しい |
| !== | 厳密には等しくない |
| > | より大きい |
| >= | 以上 |
| < | より小さい |
| <= | 以下 |

順次追記します
IOS11.3でformDataを使って画像とテキストを同時に送ろうとしたら「キャンセル」されてしまう


jqueryのajaxを使用して、formDataを使っており、画像とテキストを同時に送る場合、なぜかキャンセルされてしまう現象が起こった。

さっそく解決策

```js
      var ua = navigator.userAgent
      var formData_ = new FormData($('#form').get(0));

      if(/iPhone/.test(ua)) {
        ua.userAgent.match(/iPhone OS (\w+){1,3}/g);
        var iosv=(RegExp.$1.replace(/_/g, '')+'00').slice(0,3);
        if(iosv === '113') {
          if(!$("#image").val()) {
            formData_.delete('image'); //name属性をdelete
          }
          if(!$("#content").val()) {
            formData_.delete('content');//name属性をdelete
          }
        }
      }


```

fileがない場合、fileを消す
textがない場合、textを消す
両方ある場合、何もしない

 IOSとiEは、本当にアレですね。
railsでcsvを読み込んで、DBへ保存する

##csv

```csv:user_data.csv
id,name,email,created_at,updated_at
1,user1,example.com,2018-02-17 00:00:00,2018-02-17 00:00:00
2,user2,example.com,2018-02-17 00:00:00,2018-02-17 00:00:00
3,user3,example.com,2018-02-17 00:00:00,2018-02-17 00:00:00
4,user4,example.com,2018-02-17 00:00:00,2018-02-17 00:00:00
```

##ruby

```ruby:import.rb
require 'csv'

CSV.read("user_data.csv", headers: true).each do |row|
  user = User.create!(
    id: row['id'],
    name: row['name'],
    email: row['email'],
    created_at: row['created_at'],
    updated_at: row['updated_at']
  )
end
```

###実行！
```shell
$ rails runner import.rb
```
##　問題
N+1になってしまうので数が多い場合は、```sequel```、```activerecord-import```などのgemを使ってbulkinsertする
**/*を検索 > Google検索 | man bash  > globstar | Link: Python **辞書

### link

- [\*\*/\* ← こいつぐぐっても出てこない問題【プログラミング歴3か月の壁】【ワイルドカード】](https://qiita.com/moriwm77/items/5379e882d52b4f1bc3a8)

## google検索編

### 自分はこう検索した

「stackoverflow double asterisk directory」でgoogle検索
[検索結果](https://www.google.co.jp/search?ei=GbXEWsvbAcb58QW33KqACw&q=stackoverflow+double+asterisk+directory&oq=stackoverflow+double+asterisk+directory&gs_l=psy-ab.3...17476.18490.0.18767.7.7.0.0.0.0.82.545.7.7.0....0...1c.1.64.psy-ab..0.0.0....0.3OxzUUIj8ek)


検索結果の１つ
https://stackoverflow.com/questions/28176590/what-do-double-asterisk-wildcards-mean/28199882

> answered Jan 28 '15 at 18:24
Keith Thompson

> It's probably using a special feature of some shells that lets `**` do a recursive match, as opposed to a single `*`, which matches only in the current directory.

### 備考

- 検索できない文字は英単語に置き換える (例: ** -> double asterisk)
- 回答が多そうなコミュニテイをキーワードに入れる (例: stackoverflow)
- 思いついたキーワードを足す (例: ディレクトリ関係なので -> directory)

## bash man編

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```


1. `man bash`
2. `/\*\*`
    - `**`の検索の意味
3. `n`
    - 次の検索候補の意味
4. `k`
    - 一行上に移動

以下が見つかる。

```
globstar
        If set, the pattern ** used in a pathname expansion context  will  match
        all  files and zero or more directories and subdirectories.  If the pat‐
        tern is followed by a /, only directories and subdirectories match.
```

globstarという用語らしい。

man bashは`q`で終了する。


globstarで検索すると関連記事が見つかる。名前は大切。

- [Bash 拡張の globstar ファイルパターンマッチ(`**`によるマッチ)のメモ](https://qiita.com/Yuki-Inoue/items/47113a99cca4e985ce7a)


### Python > **辞書

Qiitaで[double ateriskで検索](https://qiita.com/search?q=double+asterisk)すると下記の記事が見つかる。
（`**`では見つからない)

- [pythonで2つの辞書をマージした辞書を作る](https://qiita.com/elferia/items/2c1c27fd6debfbba3abe)
シェーダーの練習でパーティーボールもどきを作った

パーティボールもどきをサーフェースシェーダーで書いてみた(もどきですらないけど)
コードは以下。

```glsl
	Properties{
		_Diffuse("Diffuse Color", color) = (0, 0, 0, 1)
		_EmissionColor("Emission Color", color) = (1, 1, 1, 1)
	}

	SubShader{

		Tags {"RenderType" = "Opaque"}

		CGPROGRAM
		#pragma surface surf Lambert finalcolor:outemission vertex:yaxis

		struct Input {

			float customData_1;
			float customData_2;
		};

		float4 _Diffuse;
		float4 _EmissionColor;

		void yaxis(inout appdata_full v, out Input data) {

			UNITY_INITIALIZE_OUTPUT(Input, data);
			data.customData_1 = max(0, 0.5 * sin((v.vertex.y + _Time.x * 5) * 3.14159 * 8));
			data.customData_2 = max(0, 0.5 * sin((v.vertex.x + _Time.x * 5) * 3.14159 * 8));
		}

		void outemission(Input IN, SurfaceOutput o, inout fixed4 color) {
			color += (_EmissionColor * IN.customData_1 + _EmissionColor * IN.customData_2);
		}

		void surf(Input IN, inout SurfaceOutput o) {
			o.Albedo = _Diffuse;
		}
		ENDCG
	}
	FallBack "Diffuse"
```

実行時はこんな感じ。
![スクリーンショット (3).png](https://qiita-image-store.s3.amazonaws.com/0/192240/47198f66-44a3-2585-ace6-22f28f78a777.png)

このクロスした白線が時間に応じて動く感じです。サーフェースシェーダーのモディファイヤーを使って、アウトプットを加工してます。
個人的に、引数に戻り値を定義するところあたり、どうにも不快感があります。
【Swift】繰り返し処理（for-in、while、repeat-while）

# 実行環境
- Swift4
- Xcode9.2

# for-in文
## for-in レンジ（終了値を含まない）
### 書式
```swift
for 変数 in 開始値 ..< 終了値 {
  // ステートメント
}
```
### 使用例
```swift:1から9の値を取り出す
// 1から9の値を取り出す
for i in 1..<10 {
    print("i: \(i)")
}
// 【結果】
// i: 1
// i: 2
// i: 3
// i: 4
// i: 5
// i: 6
// i: 7
// i: 8
// i: 9
```

## for-in レンジ（終了値を含む）
### 書式
```swift
for 変数 in 開始値 ... 終了値 {
  // ステートメント
}
```
### 使用例
```swift:1から10の値を取り出す
// 1から10の値を取り出す
for i in 1...10 {
    print("i: \(i)")
}
// 【結果】
// i: 1
// i: 2
// i: 3
// i: 4
// i: 5
// i: 6
// i: 7
// i: 8
// i: 9
// i: 10
```

## for-in コレクション
### 書式
```swift
for 変数 in コレクション {
  // ステートメント
}
```
### 使用例
```swift:コレクションから値を取り出す
// 配列
let arrayData = [3, 5, 8, 10]

for data in arrayData {
    print("data: \(data)")
}
// 【結果】
// data: 3
// data: 5
// data: 8
// data: 10


// 辞書
let dictionaryData = ["data1":10, "data2":20, "data3":30, "data4":40]

// 全ての要素を取り出す
for data in dictionaryData {
    print("data: \(data)")
}
// 【結果】
// data: (key: "data4", value: 40)
// data: (key: "data3", value: 30)
// data: (key: "data2", value: 20)
// data: (key: "data1", value: 10)

// 全ての要素を取り出す（キーと値をタプルに代入する）
for (key, data) in dictionaryData {
    print("key: \(key) value: \(data)")
}
// 【結果】
// key: data4 value: 40
// key: data3 value: 30
// key: data2 value: 20
// key: data1 value: 10

// 全てのキーを取り出す
for key in dictionaryData.keys {
    print("key: \(key)")
}
// 【結果】
// key: data4
// key: data3
// key: data2
// key: data1

// 全ての値を取り出す
for value in dictionaryData.values {
    print("value: \(value)")
}
// 【結果】
// value: 40
// value: 30
// value: 20
// value: 10
```
## for-in stride
飛び飛びで繰り返す。
### 書式
```swift
for 変数 in stride(from: 開始値, to: 終了値, by: 間隔) {
  // ステートメント
}
```
### 使用例
```swift:10から50まで3つずつ増える値を取り出す
for num in stride(from: 10, to: 50, by: 3) {
    print("num: \(num)")
}
// 【結果】
// num: 10
// num: 13
// num: 16
// num: 19
// num: 22
// num: 25
// num: 28
// num: 31
// num: 34
// num: 37
// num: 40
// num: 43
// num: 46
// num: 49
```
# while文
## while
指定したループ条件を満たしている間は繰り返す。
### 書式
```swift
while (ループ条件) {
  // ステートメント
}
```
### 使用例
```swift:カウントが5を超えるまで繰り返す
var count = 0
var total = 0
while count < 5 {
    count += 1
    total += count
}
print("count: \(count) total: \(total)")
// 【結果】
// count: 5 total: 15
```
# repeat-while文
## repeat-while
まずは処理を実行した後で指定したループ条件をチェックし、満たしている間は実行する。
while文と違い、最低でも1回処理は行われる。

```swift
repeat {
  // ステートメント
} while (ループ条件)
```
### 使用例
```swift:カウントが1を超えるまで繰り返す
var count = 1
repeat {
    print("処理実行") // repeat-while文のため、この処理は最低1回実行される
    count += 1
} while(count < 1)
```
Elasticsearch 6.2.3 で Ingest Attachment Processor Plugin を使って添付ファイルをインデクシングする

Elasticsearch に文書に紐付いた添付ファイルをインデクシングしたい場合の設定を行います。
内容としては以下のドキュメントをまとめたものになります。
[Ingest Attachment Processor Plugin](https://www.elastic.co/guide/en/elasticsearch/plugins/6.2/ingest-attachment.html)

手元の環境は以下になります。

* Ubuntu 16.04 LTS
* Elasticsearch 6.2.3

最初に ingest-attachment プラグインをインストールします。

```
$ sudo bin/elasticsearch-plugin install ingest-attachment
$ sudo /etc/init.d/elasticsearch restart
```

次に、パイプラインと呼ばれるインデクシング前の繋ぎ込み設定を行います。

```
$ curl -X PUT 'localhost:9200/_ingest/pipeline/attachment' -H 'Content-Type: application/json' -d'
{
  "description" : "Extract attachment information",
  "processors" : [
    {
      "attachment" : {
        "field" : "data",
        "indexed_chars" : -1,
        "properties" : [
         "content",
         "content_type"
        ]
      }
    }
  ]
}
'
```

パイプラインで指定できる設定には以下のようなものがあります。

* field
必須。base64 でエンコードされたバイナリを入れるフィールド名。

* target_field
任意。抽出した添付ファイル情報を入れるフィールド名（デフォルトだと attachment ）

* indexed_chars
任意。抽出する最大 chars 数（デフォルトだと 100000 ）-1 に設定すると無制限になる。

* properties
任意。格納したい情報を指定。指定可能なものは以下。
content, title, name, author, keywords, date, content_type, content_length, language

* ignore_missing
任意。フィールドが存在しない場合は処理を終了する（デフォルトだと False）

なお、パイプラインを削除したい場合は以下のように実行します。

```
$ curl -X DELETE 'localhost:9200/_ingest/pipeline/attachment'
```

bulk API を使うので、インデクシングの前に JSON ファイルを生成します。
ここでパイプラインを指定します。
なお、base64 でエンコードされたバイナリが必要なので変換します。（ CBOR オブジェクトを使うことも可能なようです）

```
$ file_path='/****/****/test.xlsx'
$ file=$(base64 $file_path | perl -pe 's/\n//g')
$ echo -e "{ \"index\" : { \"_index\" : \"shop\", \"_type\" : \"goods\", \"_id\" : \"1\", \"pipeline\": \"attachment\" }\n{ \"data\" : \"$file\" }" > request_bulk.json
```

作成した JSON ファイルを使ってインデクシングします。

```
$ curl -H "Content-type: application/x-ndjson" -X POST http://localhost:9200/_bulk?refresh=false --data-binary @request_bulk.json
$ curl -X POST 'localhost:9200/shop/_refresh'
```

処理の [内部](https://github.com/elastic/elasticsearch/blob/master/plugins/ingest-attachment/src/main/java/org/elasticsearch/ingest/attachment/TikaImpl.java#L108) で Apache Tika を使っていますが、抽出処理はサーバーに負荷が掛かるので elasticsearch.yml で

```
node.master: false
node.ingest: true
node.data: false
```

のようにして専用のノードを作ったほうがいいかもしれません。


### 参考になった記事
[Indexing Attachment file to elastic search](https://stackoverflow.com/questions/7111743/indexing-attachment-file-to-elastic-search)
['Illegal base64 character' exception when indexing pdf in elasticsearch from shell script](https://stackoverflow.com/questions/40720273/illegal-base64-character-exception-when-indexing-pdf-in-elasticsearch-from-she)
[Elastic Search Bulk API, Pipeline and Geo IP](https://stackoverflow.com/questions/41909936/elastic-search-bulk-api-pipeline-and-geo-ip)
Swinjectにおけるインスタンスのスコープに注意

SwiftのDIコンテナライブラリである[Swinject](https://github.com/Swinject/Swinject)と[SwinjectStoryboard](https://github.com/Swinject/SwinjectStoryboard)をプロジェクトで使用しているのですが、少しハマったことがあったので書きます。

以下に完全なコードを載せていますが、注目してほしいのは`ViewModelAssembly`のところです。
`ViewModelAssembly`内で`AppViewModel`のインスタンスを登録していて、それを同じ`ViewModelAssembly`内で`MainViewModel`と`SubViewModel`にインジェクトしています。

一見正しそうに見えますが、実は`MainViewModel`と`SubViewModel`には別々の`AppViewModel`インスタンスがインジェクトされてしまいます。


```swift:SwinjectStoryboard+Setup.swift
import Swinject
import SwinjectStoryboard

extension SwinjectStoryboard {
    class ApiAssembly: Assembly {
        func assemble(container: Container) {
            container.register(API.self) { _ in
                return API()
            }
        }
    }

    class ViewModelAssembly: Assembly {
        func assemble(container: Container) {
            container.register(AppViewModelProtocol.self) { _ in
                return AppViewModel()
            }

            container.register(MainViewModelProtocol.self) { r in
                let api = r.resolve(API.self)!
                let appViewModel = r.resolve(AppViewModelProtocol.self)!
                return MainViewModel(api: api, appViewModel: appViewModel)
            }

            container.register(SubViewModelProtocol.self) { r in
                let api = r.resolve(API.self)!
                let appViewModel = r.resolve(AppViewModelProtocol.self)!
                return SubViewModel(api: api, appViewModel: appViewModel)
            }
        }
    }

    class ViewControllerAssembly: Assembly {
        func assemble(container: Container) {
            container.storyboardInitCompleted(MainViewController.self) { r, c in
                c.vm = r.resolve(MainViewModelProtocol.self)!
            }
        }

        func assemble(container: Container) {
            container.storyboardInitCompleted(SubViewController.self) { r, c in
                c.vm = r.resolve(SubViewModelProtocol.self)!
            }
        }
    }

    @objc class func setup() {
        let assembler = Assembler(container: SwinjectStoryboard.defaultContainer)
        assembler.apply(assemblies: [
            ApiAssembly(),
            ViewModelAssembly(),
            ViewControllerAssembly()
        ])
    }
}
```

Swinjectでは[OpjectScope](https://github.com/Swinject/Swinject/blob/master/Documentation/ObjectScopes.md)という概念があり、デフォルトでは型が毎回resolveされるたびに、新しいインスタンスが作成されるようになっています。

インスタンスの作成は一度だけにして、二回目以降にresolveされる際は既存のインスタンスを返すようにするには、`inObjectScope()`メソッドを呼んであげる必要があります。

```swift:SwinjectStoryboard+Setup.swift
    class ViewModelAssembly: Assembly {
        func assemble(container: Container) {
            container.register(AppViewModelProtocol.self) { _ in
                return AppViewModel()
            }
            .inObjectScope(.container)  // スコープを指定する！！
        }
    }
```
【UE4】マルチプレイにおけるDedicated Serverの建て方

# 概要
- Listen Serverもいいけど常時起動できる本格的なサーバーが立てたい！
- Dedicated Serverと言うらしいけど調べても建て方がいまいちわからない
- 個人の備忘録目的なので解説が雑です

# やり方
1. プロジェクト設定→マップ&モードを開く
2. Default Mapsカテゴリ最下段のボタンを押して展開し、Server Default Mapをサーバー起動時のマップに指定する
3. プロジェクトを保存し、プロジェクトフォルダを開く
4. [プロジェクト名].uproject フォルダがある場所にてバッチファイルを作成する（ここでは ServerRun.bat）
5. バッチの中身は下のように書き込み、保存する（UE4のバージョンや環境によってUE4Editor.exeへのパスが変わります、今回はCドライブにインストール64bit環境かつUE4.19の場合です）
```
cd /d %~dp0
"C:\Program Files\Epic Games\UE_4.19\Engine\Binaries\Win64\UE4Editor.exe" "%~dp0\[プロジェクト名].uproject" Game -server -game -log
```
6. 作成したServerRun.batを起動するとDedicated Serverが立ち上がる

# 確認方法
1. 正常にサーバーが立っているか確認するためサーバー接続用のマップを作成する
2. BeginPlayやUMGのボタンやらにOpen Levelノードを仕込み、接続先のサーバーIPを指定する（ポートはデフォルトだと7777です）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131480/4ff67c4a-9310-d9c5-2de2-bae8d2d9fc48.png)
3.接続ができ、サーバーが存在するマップへ遷移できれば問題ありません

# まとめ
- ローカルマルチプレイヤーが主のゲームならListen Serverでも良いかもしれませんが、常時起動したり不特定多数のユーザーがアクセスするようなゲームを作るのであれば負荷や処理能力、作りやすさを加味してDedicated Serverを建てましょう！
- 今回は面倒でやらなかったですがスタンドアロンで動作するサーバーアプリケーションも作れるようです**（要UE4ソースコードからのビルド）**
ASP.NET > ASP.NET Core > HTTP エラー 500.19 0x80070003



```
HTTP Error 500.19 - Internal Server Error
ページに関連する構成データが無効であるため、要求されたページにアクセスできません。

```



フォルダを移動して実行した際に 0x80070003エラーが出ることがある。

この対処法

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/d098d912-585d-0a29-078e-e882d409feff.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/02f5a6ad-bfd7-4a56-7f67-0cf960a112bb.png)


それでもダメなら、

%USERPROFILE%\Documents\IISExpress\config\applicationhost.config in the following way -


C:\Windows\System32\inetsrv\config


<system.applicationHost>の下、<sites>タグ内に件のフォルダが入っていればそこが原因である。
<site>タグごと消してしまう。


```xml
<configuration>
  <system.applicationHost>
    <sites>
      <site name="wsBusinessLayer">
        <application path="/">
           <virtualDirectory path="/Flowers" physicalPath="D:\TFS\sys\companydomain.com\Dev\Flowers" />
```
           


[\.net \- IIS Express \- 500\.19 Cannot read configuration file \- because it's looking at the wrong path \- Stack Overflow](https://stackoverflow.com/questions/33276878/iis-express-500-19-cannot-read-configuration-file-because-its-looking-at-th)
AzureでSSD大容量、固定IPのLinux VMを最短で作る


### こんな人に向けた記事
急にメモリ16Gで512GBくらいディスクがあるLinuxサーバーを検証用に1台「いますぐ」用意しなければいけないけど、頼む相手がいなくて自分で用意しなければいけないけど、まとめ記事があればそれ見てポチポチやればいいから楽なのになぁ、という人向け。
ついでにCentOSの記事はぐぐれば出てくるけどUbuntuあんまりなかったぞ、という人にも。

ちなみにHDD使った[メンドクサイ構築記事](https://qiita.com/yukio_tokuyoshi/items/647c54fcd7733120907a "メンドクサイ構築記事")の続編。比較すると、いかに楽かわかります。

### 前提
明記していな場合は全てAzure西日本DCを利用しました。金額当は執筆時のものです。

### VMを選ぶ
メモリが多いVMシリーズは「E」(Ubuntu)
E2S v3 2CPU 16GB-RAM ￥13,332.48/month

管理ディスク
P20:512GB ￥8,572.48/month

### VMをデプロイする
Azureポータルでぽちぽちやってね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242111/10a0ed33-7ec5-005b-f106-b0d76e546ab5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242111/80af793f-779f-5957-1ea9-032cb8ab7443.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242111/9ca52fd5-8ca6-30b0-4c4f-193e19da2456.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242111/81d4a5ed-d457-c3d4-c207-613faa7f320e.png)

こんなところに自動シャットダウン設定がデフォルトでON！
これデフォONてクレームになってないの？大丈夫？プロはARMテンプレートから作るから手でやらないから踏まない地雷だって？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242111/82a18258-ef15-a0ad-8d82-81c28eb513df.png)

OFFにしました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242111/088dfc40-7eb6-ed16-9522-df05e148d13c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242111/203c9410-50be-984c-a87e-13ba30199b97.png)

### IPを固定にする
Azureポータルで仮想ネットワークのところで動的→静的に変更する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242111/02b04e67-c90f-220f-0654-0f91d45be92e.png)


### え？もう終わり？
終わりです。前回の記事がなんだったんだっていうお手軽さです。

$df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            7.9G     0  7.9G   0% /dev
tmpfs           1.6G  8.6M  1.6G   1% /run
<font color="Red">/dev/sda1       497G  1.3G  495G   1% /</font>
tmpfs           7.9G     0  7.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           7.9G     0  7.9G   0% /sys/fs/cgroup
/dev/sdb1        32G   48M   30G   1% /mnt
tmpfs           1.6G     0  1.6G   0% /run/user/1000