OmniAICreator/Qiita-1.07M huggingface dataset:
neovimのbrew upgradeでerror吐いたのでとりあえずの解決

# neovimのbrew upgradeではまる
初めてbrew upgradeをしたところ、neovimでエラーを吐いたのでとりあえずの解決策。
以下、解決までの流れです。

brew upgradeをすると、

```
==> Installing neovim --HEAD
Error: An exception occurred within a child process:
  RuntimeError: /usr/local/opt/luarocks not present or broken
Please reinstall luarocks. Sorry :(
```


言われるがままにluarocksを別途インストール。

```
$ brew install luarocks
==> Installing dependencies for luarocks: lua
==> Installing luarocks dependency: lua
==> Downloading https://homebrew.bintray.com/bottles/lua-5.3.5_1.el_capitan.bott
######################################################################## 100.0%
...
==> Summary
🍺  /usr/local/Cellar/luarocks/3.0.1: 99 files, 595.2KB
==> Caveats
==> lua
You may also want luarocks:
  brew install luarocks
==> luarocks
LuaRocks supports multiple versions of Lua. By default it is configured
to use Lua5.3, but you can require it to use another version at runtime
with the `--lua-dir` flag, like this:

  luarocks --lua-dir=/usr/local/opt/lua@5.1 install say
```

無事インストールできたようなので再度upgrade。

```
$ brew upgrade neovim
==> Upgrading 1 outdated package:
neovim HEAD-10c3b20
==> Upgrading neovim
==> Cloning https://github.com/neovim/neovim.git
...
==> Downloading https://luarocks.org/luabitop-1.0.2-1.src.rock

curl: (22) The requested URL returned error: 404 Not Found
Error: An exception occurred within a child process:
  DownloadError: Failed to download resource "neovim--luabitop"
Download failed: https://luarocks.org/luabitop-1.0.2-1.src.rock
```


どうやら読み込もうとしているURLが404なので、エラーで検索してみるとissueを発見。


https://github.com/Homebrew/homebrew-core/issues/32231
このissueの中でのリンク先、
https://github.com/Homebrew/homebrew-core/issues/32144
を見る。


# issueに書いてあるコマンドをコピペしてインストール
とりあえず下の方のコメントにあった
brew reinstall https://raw.githubusercontent.com/Homebrew/homebrew-core/71820bed2565c7d65159ee29e5d4784cf436d73f/Formula/neovim.rb --HEAD

を試す。

```
$ brew reinstall https://raw.githubusercontent.com/Homebrew/homebrew-core/71820bed2565c7d65159ee29e5d4784cf436d73f/Formula/neovim.rb --HEAD
######################################################################## 100.0%
==> Reinstalling neovim
...
==> make install
🍺  /usr/local/Cellar/neovim/HEAD-edcf640: 1,380 files, 18.6MB, built in 4 minutes 11 seconds
```

エラーを吐かずにインストールできました。
とりあえずは問題なく動いています。見た感じ暫定版？
一応参考までに。
行列ごとにデータをまとめることが大事なことを伝える方法

Excelの相談に乗っていると、次のようなシートに出会うことが、かなりあります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/60aa6a6c-3314-492e-5b29-17afd609bab7.png">

「これは改善した方がいい」
とコンサルすると、
「毎日集計できてるからいいじゃない」
「なんで変えるの？」
「めんどくさい」
ここまでがテンプレートになってるのではないでしょうか。
そんな時に、できるだけこちらの意図を組んでもらえるような説明はどんなものか、考えてみたいと思います。
# なぜいけないのか
はじめの方では、セル結合がいけないのです。
※セル結合自体がいけないのではなく、セル結合の使い方がいけないということは強く申しあげておきます。
A列の日付が結合されているところでは、３、５、９、１１行にしか実データが入っておらず、並べ替えやフィルタがうまく動作しないですね。
データはすべての行に
<strong>いつ、何が、いくらで、何個、どうした</strong>
を記録してないとコンピュータは判断できません。
もっと言うと、コンピュータは１行ごとにしかデータを読まないのです。抜けは許されません。
同じようにI列J列も同じです。
これなら日付が変わるまで集計するという計算式にすればいいのにと思います。

```例
=IF(A2="",I1+G2,G2)
```

また、CE、EF、IJ列も結合しています。
このまずいところは、Excelで顕著なのですが、Excelは、1セルのみ選択して並べ替えやフィルタ、ピボットテーブルの操作をする場合、空白の行、空白の列があるところまでを一覧表とします。
だから操作が簡単だし、１列だけを並べ替えるようなミスも防げます。
しかし、この場合は、本当に並べ替え、フィルタをしたいのは２行目を見出し行としたそれ以降となってほしいのですが、実際には１行目を見出しにしたすべてを一覧表範囲にしてしまします。
つまり、せっかくのミスを防ぐ簡単操作をできなくしているということです。
この表には２行目を見出しとした場合でも、問題があります。
２行目だけに注目すると、価格、数量、利益、余剰が２つずつあります。
ピボットテーブルで集計する場合、同じ項目名が存在しているのはまずいので、Excelが自動で番号を付けてくれます。しかしその番号も、オペレーションしている中でどの項目を表しているかわかりません。
データベース関数や、データタブの詳細から呼び出すフィルターオプション機能では完全に重複しているとちゃんとした結果が出ません。
# では正しくする
ということで、この表は、次のような表になっていると良いでしょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/d8556541-568d-22c1-8b3c-3df794772d91.png">

ただ、これだと日の変わり目がわからないと言われるかもしれません。
そこはExcelの条件付き書式設定を使います。
A2からA13、I2からI13、J2からJ13を選択し、数式として以下のように$A3=$A2の条件を設定します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/06f81ac5-7f55-e008-9917-6fe4c4707f3c.png" width=50%>

ユーザー定義表示形式で「;;;」と設定すればそのセルの値は非表示になります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/2f35595d-da15-6ba5-4bb9-8df55680621d.png">

うまくやれば罫線もできるような気がします。
# 全くデータになっていない記録
もっと酷いものだとこんなのもあります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/247287/f46f99ff-bcdb-98af-5015-d1a553b9d4e4.png" width=50%>

なんというか、それこそ計算して集計してるんだからいいんだろみたいな典型です。
もちろん、自動化されていませんし、集計もできないことはないのでしょうけど、ものすごく複雑で、後から他の人が見た時に分かるのかな、月次集計はどうすんだろ、みたいなツッコミどころはたくさんあります。
要は、大変でしょ、楽じゃないでしょ、ってことです。
# まとめ
なんとなくみなさんが思っていて、周りに説明するときに説明しにくいな、理解してもらえないなということをまとめてみました。
速さが変わる、正確さが変わる、楽さが変わる。
このあたりが訴えどころですし、いろいろ機能を使えば簡単だよとか、そんな設定めんどうくせぇってことなら、そのくらいは作ってあげたりする必要はあるかもしれません。
でも、そこまでやっても先に進まない場合もあると思うので、そういう時は、現行のフォーマットに外部から操作する自分だけ楽になるような仕組みを作っちゃうというのも誰にも迷惑かける話ではないのでいいかもしれません。
効率化したくない人や楽になりたくない人はいないと思っているのですが、もしかしたらそんな人がいるのであれば、そういう人はその人の道を進んでもらって、自分自身はどんどん楽になっていきましょう。
[Rails] Markdown形式で入力できるようにしてみたら、サクッとXSS脆弱性が組み込めてしまったのでその対策


## 参考元の記事
https://qiita.com/hkengo/items/978ea1874cf7e07cdbfc

この記事の通り編集可能なページを作成すると、すぐにXSS脆弱性を持ち込めてしまったので、自戒を込めて記事にします。

## XSS（クロスサイトスクリプティング）脆弱性の試し方

マークダウン記法で編集したTextに下記のタグを記入し、リロードしてみましょう。
これでJavaScriptが実行されて、ポップアップが表示されれば、それは脆弱性にあたります。

```*.js
<script>
alert(document.cookie);
</script>
```

攻撃方法はこちらの記事が詳しいです。

### XSSの脆弱性について
https://techracho.bpsinc.jp/hachi8833/2016_11_14/28884


##回避策

この場合、html_safeとして、すべてのタグを許可してしまっている点が問題です。

```*.html

<p>
  <%= markdown(@article.body).html_safe %>
</p>

```

なので、利用可能なタグと属性だけを許可してあげましょう。

```*.html
<p>
  <%= sanitize(markdown(@article.body), tags: %w(h1 h2 h3 h4 h5 strong em a p), attributes: %w(href) %>
</p>
```
許可する属性は、自動リンクONにしているので、hrefが必要ですね。

###html_safeは用法用量を守って使いましょう。
Pythonでメール送信; smtplibのサンプルコード

# 関連リンク
- [Pythonでメール受信; imaplibのサンプルコード](https://qiita.com/takey/items/1498af9e1113eeb7bb21)
- [Pythonでメール受信; poplibのサンプルコード](https://qiita.com/takey/items/a7e843255da8052c64b8)

# 処理の流れ
1. MIMEメッセージを作成する
2. MIMEメッセージに必要なヘッダを付ける
3. SMTPクライアントインスタンスを作成する
4. サーバーにログインする
5. メール送信（MIMEメッセージを送信）

# サンプルコード
```python
import base64
import smtplib
import ssl
from email.mime.text import MIMEText
from email.utils import formatdate
# https://docs.python.jp/3/library/smtplib.html

"""
(1) MIMEメッセージを作成する
"""
main_text = "これが本文です"
charset = "utf-8"
if charset == "utf-8":
	msg = MIMEText(main_text, "plain", charset)
elif charset == "iso-2022-jp":
	msg = MIMEText(base64.b64encode(main_text.encode(charset, "ignore")), "plain", charset)


"""
(2) MIMEメッセージに必要なヘッダを付ける
* Gmailで送信する場合
  - Gmailの設定で「セキュリティの低いアプリの許可」を有効にする必要あり
  - https://myaccount.google.com/u/1/lesssecureapps?pageId=none
"""
msg.replace_header("Content-Transfer-Encoding", "base64")
msg["Subject"] = "これが件名です"
msg["From"] = "alice@gmail.com" # "Alice <alice@gmail.com>"
msg["To"] = "bob@gmail.com"
msg["Cc"] = ""
msg["Bcc"] = ""
msg["Date"] = formatdate(None,True)


"""
(3) SMTPクライアントインスタンスを作成する
* yahoo!メールで送信する場合
  host: "smtp.mail.yahoo.co.jp"
  nego_combo: ("no-encrypt", 25) or ("no-encrypt", 587) or
              ("ssl", 465)
* Gmailで送信する場合
  host: "smtp.gmail.com"
  nego_combo: ("starttls", 587) or ("starttls", 25) or
              ("ssl", 465)
"""
host = "smtp.gmail.com"
nego_combo = ("starttls", 587) # ("通信方式", port番号)

if nego_combo[0] == "no-encrypt":
	smtpclient = smtplib.SMTP(host, nego_combo[1], timeout=10)
elif nego_combo[0] == "starttls":
	smtpclient = smtplib.SMTP(host, nego_combo[1], timeout=10)
	smtpclient.ehlo()
	smtpclient.starttls()
	smtpclient.ehlo()
elif nego_combo[0] == "ssl":
	context = ssl.create_default_context()
	smtpclient = smtplib.SMTP_SSL(host, nego_combo[1], timeout=10, context=context)
smtpclient.set_debuglevel(2) # サーバとの通信のやり取りを出力してくれる


"""
(4) サーバーにログインする
"""
username = "username@gmail.com"
password = "password"
smtpclient.login(username, password)


"""
(5) メールを送信する
"""
smtpclient.send_message(msg)
smtpclient.quit()

```
【文字化け】Visual Studio Codeのソースコード、ターミナルの文字化け対策

# この記事の内容

最近VisualStudioCodeをアップデートした影響かわかりませんが文字化けするようになったので、その時行った内容です。
Visual Studio Codeの文字化けが直ります。


# 設定を確認する

設定を変更しましょう
ファイル→基本設定→設定からfiles.autoGuessEncodingと入力しcheckをつけましょう
![0001.JPG](https://qiita-image-store.s3.amazonaws.com/0/183354/73e51707-379a-6330-ff00-78b3b971ed89.jpeg)

### 直らない場合
ワークスペースの設定はどうなっていますか？
ファイル→基本設定→設定→ワークスペースの設定files.autoGuessEncodingと入力しcheckをつけましょう![0001.JPG](https://qiita-image-store.s3.amazonaws.com/0/183354/de9e87fc-3ff9-a39a-441e-8aae08ea3758.jpeg)

## ソースコードが文字化けする
ソースコードがUTF-8の場合

ファイル→基本設定→設定からfiles.encodingと入力しutf8を選択しましょう（適宜変更してください）
同じくワークスペースの設定も見ておきましょう。
![0001.JPG](https://qiita-image-store.s3.amazonaws.com/0/183354/2f1a94ab-f76e-9e20-326b-3ced0e4ebfdd.jpeg)

### 直らない場合

最近アップデートした影響かわかりませんが、私の場合codeのフッダー部分の設定がおかしくなっていました。
![0001.JPG](https://qiita-image-store.s3.amazonaws.com/0/183354/b7e83aba-4d73-9e54-786a-45e60218f3c4.jpeg)

Windows 1252を選択し、エンコード付きで再度開く→UTF-8に変更。

# まとめ
私の場合これらの設定で直りましたが、ほかに「こんな方法で直した」という方がいればコメントください。
OpenJDK 11のFlight Recorder

# 概要
Java 11が2018年9月26日にリリースされました。
このバージョンからOpenJDKでもFlight Recorderが使えるようになったので使い方を見てみます。

# 使用方法
## 事前準備
Flight Recorderで記録したファイルを見るにはmission controlが必要でJDKとは別にインストールしておく必要があります。以下のサイトにインストーラがあります。
https://jdk.java.net/jmc/
(2018/10/18時点ではearly accessです)

mission controlのサンプル画面
<img width="1440" alt="スクリーンショット 2018-10-18 12.15.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/276167/137d1a3e-52d8-18ac-3a51-77b129024fd7.png">


## プロファイリング記録
プロファイリング記録とはXX秒後からYY秒間記録するといった使い方です。
以下のオプションをjavaコマンド実行時に指定します。

```
-XX:StartFlightRecording=delay=20s,duration=60s,filename=myRecording.jfr,settings=profile,name=SampleRecording
```
- delayはjavaコマンド実行してから何秒後に記録を開始するか指定します
- durationは記録を何秒間するかの指定です
- filenameで記録を保存するファイルを指定します（このファイルをmission controlで読むことでプロファイルが見れます）

## 連続記録
連続して記録を行い必要に応じて最新のX分のプロファイルとか全期間のプロファイルとかをファイルに保存できます。
以下のオプションをjavaコマンド実行時に指定します。

```
-XX:+FlightRecorder -XX:StartFlightRecording=maxage=5m,settings=default,disk=true
```

- maxageは最大の保持期間です

## 実行中のアプリケーションを記録
既に実行しているアプリケーションに対してflight recorderを適用したいケースもあると思います。
その場合はmission controlの画面から`フライト記録の開始`を選択することで記録を始めることができます。
`プロファイリング記録`、`連続記録`のどちらも選択することができます。

<img width="377" alt="スクリーンショット 2018-10-18 12.19.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/276167/e9933300-fcb7-4ae6-cca8-434ba98b0d71.png">

## mission control
ディスクに保存したjfrファイルを読み込むと以下のようなプロファイル画面が表示されます。
<img width="1439" alt="スクリーンショット 2018-10-18 12.26.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/276167/122408fd-214b-068e-2e07-7f2a844e645a.png">

Threadsの画面はスレッドダンプで取れる情報と同等の情報が見れます。
<img width="1440" alt="スクリーンショット 2018-10-18 12.32.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/276167/7cb0cf95-4a2c-862d-decf-84c1b1e76cbb.png">

メモリーの画面はヒープダンプで取れる情報と同等の情報が見れます。
<img width="1440" alt="スクリーンショット 2018-10-18 12.33.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/276167/8fc38304-6b88-1996-d401-32c37300799e.png">

メソッドプロファイリングではどのメソッドが多く呼ばれているかなどを確認できます。性能分析に有用ですね。
<img width="1440" alt="スクリーンショット 2018-10-18 12.36.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/276167/324df20d-a03b-9810-ebf3-27939be1ec3b.png">

ガベージコレクションではGCログと同等の情報が見れます。
<img width="1440" alt="スクリーンショット 2018-10-18 12.37.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/276167/4c154551-cce6-52f5-d0fb-eeaf5d4f7f4c.png">
PHP で文字列からトークン（連続半角英数字）を抜き出し、書式を判断する

ID の書式が正しいか（連続した半角英数字であるか）の検証と、ID の抜き出しのため「[php 連続 半角英数字 抜き出す](https://www.google.co.jp/search?q=site%3Aqiita.com+php+連続+半角英数字+抜き出す)」を Qiita に絞り込んでググっても出てこなかったので、自分の備忘録用として。

## TL;DR （トークンであるかを検証する関数）

PHP で `7325e63298f853dbd777` といった、アクセストークン／記事 ID／ユーザー ID などの連続半角英数であるか調べるユーザー関数です。

```php
/**
 * 文字列が指定された長さの半角英数字トークンか返す.
 *
 * @param  string  $id_verify 調べたい値
 * @param  integer $len       トークンの長さ
 * @return boolean
 */
function isIdUniformed($id_verify, $len)
{
    if (! ctype_alnum($id_verify)) {
        return false;
    }
    
    return $len === strlen($id_verify);
}
```

- `ctype_alnum`関数：英数字かどうかを調べる @ [PHP マニュアル](http://php.net/manual/ja/function.ctype-alnum.php)
- `strlen`関数：文字列の長さを得る @ [PHP マニュアル](http://php.net/manual/ja/function.strlen.php)

## TS;DR （連続半角英数字の抜き出しと検証）

URL から連続した半角英数字の記事 ID を取得し、ID が正しい書式（連続した半角英数字）か確認するサンプル。

```php:サンプル・スクリプト
<?php

// サンプルの記事 ID から ID の長さを取得
$id_sample = 'f4b6807a116a5e94998f';
$id_length = strlen($id_sample);

// 記事 ID の検索パターン
$pattern   = '/items\/([0-9a-z]+)/';

// 記事 ID を抜き出す URL
$url = 'https://qiita.com/KEINOS/items/7325e63298f853dbd777';

// 記事 ID の抜き出し
if (! preg_match($pattern, $url, $matches)) {
    die('No pattern found.');
}
$id_verify = $matches[1];

// 抜き出した記事 ID の表示
echo 'ID to verify: ', $id_verify, PHP_EOL;

// 検証結果の表示
echo isIdUniformed($id_verify, $id_length) ? 'OK:Uniformed' : 'NG:Irregular format';

// 検証のユーザー関数定義
function isIdUniformed($id_verify, $len)
{
    if (! ctype_alnum($id_verify)) {
        return false;
    }

    return $len === strlen($id_verify);
}

```
```text:結果
ID to verify: 7325e63298f853dbd777
OK:Uniformed
```
- [オンラインで動作確認する](https://paiza.io/projects/eEPnUEfEfLLtZbG8WMtYJw) @ paiza.IO
[CentOS7] SSH の "Permission denied" を駆逐するためのチェックリスト

# ぼくのトラウマ

```
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

# 環境

クライアント： CentOS7
サーバー： CentOS7

# 確認しよう

パーミッション、所有者の設定に原因があることが多いみたい。

## 公開鍵

サーバー側に保管するよ。

### 保管場所の確認

公開鍵はファイル名を `authorized_keys` に変更。

```
/home/user/.ssh/authorized_keys
```

### パーミッションの確認

- `/home/user/.ssh` は __700__

- `/home/user/.ssh/authorized_keys` は __600__

### 所有者の確認

- `/home/user/.ssh` の所有者は user 本人（鍵だけではなくディレクトリも所有者を確認！）

- `/home/user/.ssh/authorized_keys` の所有者は user 本人

### こんな感じになるはず

`ls -la` コマンドでパーミッション、所有者を確認。

- `/home/user/.ssh`

```
drwx------. 2 user user 29 10月 1 12:00 .ssh
```

- `/home/user/.ssh/authorized_keys`

```
-rw-------. 1 user user 410 10月 1 12:00 authorized_keys
```

## 秘密鍵

クライアント側に保存するよ。

### 保管場所の確認

```
/home/user/.ssh/id_rsa
```

### パーミッション確認

- `/home/user/.ssh` は __700__

- `/home/user/.ssh/id_rsa` は __600__

### 所有者の確認

- `/home/user/.ssh` の所有者は user 本人（鍵だけではなくディレクトリも所有者を確認！）

- `/home/user/.ssh/id_rsa` の所有者は user 本人

### こんな感じになるはず

`ls -la` コマンドでパーミッション、所有者を確認。

- `/home/user/.ssh`

```
drwx------. 2 user user 29 10月 1 12:00 .ssh
```

- `/home/user/.ssh/id_rsa`

```
-rw-------. 1 user user 410 10月 1 12:00 id_rsa
```

## その他、ありそうな原因（随時更新予定）

### ホームディレクトリのパーミッション

サーバー側、クライアント側両方のホームディレクトリ `/home/user` は user（本人）以外書き込みできないようパーミッションを設定する。

__755__ とか __700__とかであればOK。

```
drwx------. 26 user user 4096 10月 1 12:00 user
```

### 鍵をコピペした場合

クライアント側で作った公開鍵をサーバー側に保存するとき、鍵の中身をコピペした場合。

- 全体が正確にコピペされているかどうか
- 変な改行が入っていないか

### 秘密鍵のファイル名を変更した場合

秘密鍵のデフォルトのファイル名は `id_rsa` ですが、これを変更した場合は `ssh` コマンドを叩く際に `-i` で鍵の指定が必要です。

例）`id_rsa` から `id_rsa_test` に変更

```
$ ssh 192.168.0.123 -i ~/.ssh/id_rsa_test
```
Mapboxのマップのドラッグやスクロールの終了イベント


ユーザーがドラッグしたりフリックしてスクロールしてマップが移動しますがその終了イベントのとり方です。
`addOnCameraIdleListener`を使うのが最も適切と思われます。

```kotlin
mapboxMap.addOnCameraIdleListener {
    info { "onCameraIdle" }
}
```

はじめ `addOnMoveListener` 使ってたんですが、フリックの慣性移動の後のイベントがとれなかったので。。
SATySFiでデフォルト引数書くときOptional.fromがべんり

`@require: option`して使う

`Option.from(デフォルトの値 Optionalな値(SomeやNone))`みたいな感じでかんたんに書けてべんり

```
@require: option
@require: stdja

let-inline ctx \sugoi ?:prefix s =
  let p = Option.from `すごい` prefix in
  read-inline ctx (embed-string (p ^ s))
in

document (|
  author = { Seiei MIYAGI };
  show-title = true;
  show-toc = false;
  title = { Optional.fromべんり }
|) '<
 +p { \sugoi(`べんり`); }
 +p { \sugoi?:(`やばい`)(`べんり`); }
>
```

## 実行結果

![Screenshot from 2018-10-18 12-01-10.png](https://qiita-image-store.s3.amazonaws.com/0/2074/6332feb4-91b0-308b-09cd-a32c04fa2043.png)
CUIのゴミ箱システムを作る

## はじめに
**rm**で消してしまった人やその対策として
CUIでもゴミ箱作れそうだなと思ったのでやってみました。

簡単に言うと`rm`は一度消しちゃうと戻らないので
`mv`で自作のゴミ箱に入れるようにするだけです。

Ubuntuでは`/tmp`のディレクトリは毎回起動時に初期化されているようです。
なのでゴミ箱を毎回`/tmp/garvage`に作っていきます。

## 自動起動スクリプト
`# vi /etc/rc.local`
一番下の行でユーザー権限でゴミ箱(/tmp/garvage)を作ります。

```vim:/etc/rc.local
su -l [userName] -c "mkdir /tmp/garvage"
```
## エイリアスの登録
私の場合は`~/.zsh_aliases`にエイリアス入れてます。
この辺は環境によって[bash_aliases]とか[bashrc]に変えてください。
`$ vi ~/.zsh_aliases`

```vim:~/.zsh_aliases
alias _rm="/bin/rm"
alias rm="mv -t /tmp/garvage"
```
一応本当のrm使いたくなったとき用に_rmのコマンドに退避させてあるので安心！

## おわり
rmで消しちゃったよ...。って経験が一度でもあればやってみてください。
ちなみに権限いるやつとかディレクトリとかrmならオプションが必要ですが
ただのmvなので-frやsudoなどのオプションもいらず
スムーズにゴミ箱に入れることができて意外と便利です。
SATySFiでoptionalな型をつける方法

## `?:`でoptional引数として定義する

```
@require: stdja

let-inline ctx \sugoi ?:prefix s =
  let p = match prefix with
    | None -> `すごい`
    | Some(p) -> p
  in
  read-inline ctx (embed-string (p ^ s))
in

document (|
  author = { Seiei MIYAGI };
  show-title = true;
  show-toc = false;
  title = { SATySFiでoptional }
|) '<
 +p { \sugoi(`ねむい`); }
 +p { \sugoi?:(`やばい`)(`ねむい`); }
>
```

### 実行結果

![Screenshot from 2018-10-18 11-34-26.png](https://qiita-image-store.s3.amazonaws.com/0/2074/8facbf1b-5b83-91c4-7ee6-d34f68a5d43b.png)


## `match`で`None`や`Some`にマッチさせる

```sugoi.saty
@require: stdja

let-inline ctx \sugoi s =
  let s = match s with
    | None -> `すごい`
    | Some(s) -> s
  in
  read-inline ctx (embed-string s)
in

document (|
  author = { Seiei MIYAGI };
  show-title = true;
  show-toc = false;
  title = { SATySFiでoptional }
|) '<
 +p { \sugoi(None); }
 +p { \sugoi(Some(`すごくない`)); }
>
```

### 実行結果
![Screenshot from 2018-10-18 10-56-21.png](https://qiita-image-store.s3.amazonaws.com/0/2074/2649214d-a5b4-7796-0acb-b173326d2d9d.png)
Git

編集中

流れ
ワークツリー（ワーキングツリー）
↓
追加（登録）
↓
インデックス（ステージングエリア）
↓
コミット
↓
ローカルリポジトリ
↓
プッシュ
↓
リモートリポジトリ


#用語



|項目|説明|備考|
|:-----------------|:------------------|:------------------|
|origin|リポジトリの場所(URL)の別名||
|master|デフォルトのブランチ名||
||||
||||
||||
||||
||||

head
仮のブランチ
このまま自由に変更を加えることができますが、
別のコミットをチェックアウトすると変更履歴共々破棄されてしまいます。
（コミットしていても履歴ごと消えてなくなります！）
ちょっと過去に戻してあれこれ試してみるには便利なHEADタグですが
知らずにこのまま変更を加えていくといつのまにか消えていた！
なんて大惨事になりかねません。
こんなHEADタグ()ですがブランチに変えることもできます。
これでHEADタグが指名したブランチに変わります。
間違えてHEADタグに対してコミットしていても慌てずブランチとして繋ぎなおせば大丈夫です。

# **参照サイト**
[サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](https://backlog.com/ja/git-tutorial/)
[Git - Book](https://git-scm.com/book/ja/v2)
[【連載Git入門目次】ほんとは簡単？SourceTreeでGitを始めよう！](https://naichilab.blogspot.com/2014/01/gitsourcetreegit.html)
Anaconda でよく使うコマンド一覧

Windows 用です．
今現在は Ubuntu を使っていてほとんど pip で済ませています．

# 一般
| 目的 | コマンド | 補足 |
|:--|:--|:--|
| `Conda` のアップデート | `conda update conda` ||

# 仮想環境
| 目的 | コマンド | 補足 |
|:--|:--|:--|
| 仮想環境構築 | `conda create -n [name] python=[version] [library]` ||
| 仮想環境一覧 | `conda info -e` | `conda env list` でも可能 |
| 仮想環境有効化 | `activate [name]` ||
| 仮想環境無効化 | `deactivate [name]` ||
| 仮想環境削除 | `conda remove -n [name] --all` |
| 仮想環境名称変更 | `conda create -n [new name] --clone [old name]` |
|| `conda remove -n [old name] --all`| クローンして元の環境を削除
| パッケージ追加 | `conda install [package]` | スペース区切りで複数可能 |

# パッケージ管理
| 目的 | コマンド | 補足 |
|:--|:--|:--|
| インストール | `conda install [name]` ||
| インストール (バージョン指定) | `conda install [name]==x.x.x` ||
| アンインストール | `conda uninstall [library]` ||
| インストール済み一覧 | `conda list` ||
| インストール済み一覧 (環境指定) | `conda list -n [name]` ||
| 全部のアップデート | `conda update --all` ||
| 特定のアップデート | `conda update [library]` ||
| パッケージ一覧の更新 | `conda install -y conda-build` ||
Laravelのwith句の条件指定部分にaliasをつけたい

# 概要
LaravelのEagerLoadingを利用してデータを取得したいが、条件指定を含む連結部に別名(Alias)をつけたい、ということをしようとしたときに困ったので皆さんに共有。

# 本題
Laravelにおいてwith句を利用するときに条件指定をする際は、以下のようにすることで条件指定ができる。ここでは、hogeというテーブルがあるとして、fugaというテーブルを連結することを考える。

```php:連結例
// fugaというテーブルを連結させたいが、
// statusは1のデータのみ連結したい、といった場合
Hoge::with(['fuga' => function($query) {
  $query->where('status', 1);
}]);
```

これでも良いのだが、このデータにアクセスする際は、`[hogeのデータの実態]->fuga`のような形で連結したデータにアクセスすることになる。しかしながら、`->fuga`だけでは、fugaが「`status=1`のデータのみである」ということがわからないため、視認性を高めるために`->fuga_status_1`としたい。

そこで、以下のようになっている部分を変更して、

```php:修正前
public function fuga() {
  return $this->belongsTo('App\Fuga');
}
```

以下のようにしてみた。

```php:修正後(これはNG)
public function fuga_status_1() {
  return $this->belongsTo('App\Fuga')->where('status', 1);
}
```
`fuga()`はもともと動いていたし、これでいけるでしょ、と思ったのだが、これでは`->fuga_status_1`にアクセスしてもnullが返却されてしまう。

うまく動いた方法は以下。
条件を指定するときは、Eloquentのリレーションの定義と別々に書いてあげないといけなかった。

```php:うまく動く方法
public function fuga() {
  return $this->belongsTo('App\Fuga');
}
public function fuga_status_1() {
  return $this->fuga()->where('status', 1);
}
```

これで、`[hogeのデータの実態]->fuga_status_1`というデータの取得ができるようになり、連結されるfugaがどんなデータであるかは、変数名をみただけで明らかになる。

```
Hoge::with(['fuga_status_1']);
```

# 終わりに
とりあえずできたのですが、なんでこうなるかわかる人がいればコメントで教えてください。
qmk_firmwareをWindows上でmakeする方法

**注意**

**この記事は古いものです。2020/07/30現在のQMK firmwareではOSがWindows環境の場合、MSYS2を利用したファームウェアのmake環境構築方法がQMK公式ドキュメントに記載されており、SMKiJ(Self Made Keyboard in Japan)有志が随時和訳しているためそちらを参照してください。**

[QMK 環境の構築](https://github.com/shelaf/qmk_firmware/blob/f23dc6c86fea99898c97a9cad393ff342b28c86c/docs/ja/newbs_getting_started.md)
[Self-Made Keyboard in Japan discordサーバー（略してSMKiJ）](https://discord.com/invite/NM7XtDW)

**ドキュメントの日本語訳も随時有志によって行われてしかも充実しています。QMKは日々更新されており、ブログなどの記事では更新が追い付かないため古い可能性が高くなっています。**

**記事は削除しました。上記誘導文もそのうち削除します**
[Rails] CSRFトークンチェックでエラーになるのを回避する方法

SPAなどを作っていて、Railsアプリとは別のアプリから
XHRでリクエストするAPIとして利用する場合は、CSRFトークンの検証ができないため、エラーになる。

### 解決方法

APIで利用するコントローラに

```
skip_before_action :verify_authenticity_token
```

を追加すればCSRFトークン検証をスキップすることができる。


ちなみによく

```
protect_from_forgery with: :null_session
```

を入れて解決という記事を見かけるがこれだけでは

**「csrfトークンがないリクエストを例外にしない」**

だけで、解決できないので注意（むしろこれはなくてもOK）
投稿日時を「X年前,X時間前」とか分かりやすい文字列に変換する

```swift
func timeAgoString(postTimeInterval:TimeInterval)->String{
  guard timeInterval > 0 else{return ""}

  let now = Date()
  let postTime = Date(timeIntervalSince1970: postTimeInterval)

  let c = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: postTime, to: now)

  if let year = c.year, year > 0 { return "\(year)年前" }
  else if let month = c.month, month > 0{ return "\(month)月前" }
  else if let day = c.day, Int(day/7) > 0{ return "\(Int(day/7))週前" }
  else if let day = c.day, day > 0{ return "\(day)日前" }
  else if let hour = c.hour, hour > 0{ return "\(hour)時間前" }
  else if let minute = c.minute, minute > 0{ return "\(minute)分前" }
  else if let second = c.second, second > 0{ return "\(second)秒前" }
  return "今"
}
```
GoogleデータスタジオはどこからMySQLやPostgreSQLにアクセスしてくるのか

Googleデータスタジオは、グローバルからアクセス可能なMySQLやPostgreSQLのテーブルもデータソースとすることができます。

この機能を使うと、自社のサービスのデータダッシュボードを簡単に構築することもできますが、データベースの接続をオープンにするのは大問題なので、Googleデータスタジオからの接続のみにIPアドレスで制限する設定が必要です。

# 接続元のネットワーク

Googleデータスタジオの接続元ネットワークは次のページに記載があります。

* [MySQLコネクタ](https://support.google.com/datastudio/answer/7088031?hl=ja)
* [PostgreSQL コネクタ（ネットワークは同じ)](https://support.google.com/datastudio/answer/7288010?hl=ja)

# どの地域からのアクセスか

このネットワークが物理的にどこに存在するのか、Geo IPで確認しました(各帯域の先頭IPアドレスで地域を参照しています)。

```
64.18.0.1	United States New York
64.233.160.1	United States Newark
66.102.0.1	United States Ashburn
66.249.80.1	United States Galveston
72.14.192.1	United States Ashburn
74.125.0.1	United States Ashburn
108.177.8.1	United States Ashburn
173.194.0.1	United States Monroe
207.126.144.1	United States Newark
209.85.128.1	United States Ashburn
216.58.192.1	United States Draper
216.239.32.1	United States Mountain View
```

すべて米国でした。
もしかしたら地域ごとに分散されているかと思いましたが、そういうわけではなさそうです。

# 地域を確認するスクリプト

参考までにこんなスクリプトで地域を確認しました。

```bash
#!/bin/bash

LIST=$(cat << EOL
64.18.0.1
64.233.160.1
66.102.0.1
66.249.80.1
72.14.192.1
74.125.0.1
108.177.8.1
173.194.0.1
207.126.144.1
209.85.128.1
216.58.192.1
216.239.32.1
EOL
)

for IP in $LIST
do
  JSON=$(curl -s -S http://ip-api.com/json/$IP)
  LOC=$(echo $JSON | jq -r "[.country, .city] | @tsv")
  echo $IP$'\t'$LOC
done
```

# Ubuntuでファイアウォールを開放するスクリプト

UbuntuでGoogleデータスタジオ向けにファイアウォールを公開するスクリプトです。こちらもオマケにどうぞ。

```bash
#!/bin/bash

LIST=$(cat << EOL
64.18.0.0/20
64.233.160.0/19
66.102.0.0/20
66.249.80.0/20
72.14.192.0/18
74.125.0.0/16
108.177.8.0/21
173.194.0.0/16
207.126.144.0/20
209.85.128.0/17
216.58.192.0/19
216.239.32.0/19
EOL
)

for IP in $LIST
do
  sudo ufw allow from 216.239.32.0/19 to any port 3306
done

sudo ufw status
sudo ufw enable
```
APIの改行コード [WIP]


現在作っているbash用ライブラリでつまづいたものです。
Qiita APIをcURLで取得すると、改行コードが`\n`ではなく`^M`(`\r\n`)となっていて、

| API | 改行コード |
|:-:|:-:|
| Qiita | `^M`(`\r\n`) |


# `^M` -> `\n`

つまりは`\r`を消せばいい。単純

```bash
str="string with ^M.
"
echo "$str" | sed 's/\r//g'
```
[Chrome] 印刷ダイアログを非表示にして直接印刷する方法 

## この記事について

Google Chrome で印刷ダイアログを表示させずに直接プリンターより印刷する方法を紹介します。英語で言うところの「silent printing」の設定です。

## やりかた

Chrome の起動コマンドにオプション「`--kiosk-printing`」を指定すればＯＫです。実際には非表示ではなく一瞬ダイアログが表示されてすぐ消えます。印刷設定はChromeで最後に使った設定が利用されます。

- **Windowsの場合**

Chromeのショートカット、もしくは`chrome.exe`のプロパティ画面より起動コマンドを修正します。

参考：[YouTube: Silent printing in Google Chrome](https://www.youtube.com/watch?v=4aByczxnfHo)


- **Mac の場合**

Windowsのようにショートカット自体に起動コマンドを持てないので、直接実行コマンドをたたくとのことです。

参考：[How to setup the Kiosk printing on Chrome and Opera](How to setup the Kiosk printing on Chrome and Opera)

## 活用方法

**以下のJavascriptのコードと組み合わせることで、印刷画面に遷移させずに任意の内容を印刷させることができます。**

**レジや証明書発行サービスのように、その場で印刷物を渡す系のシステムがWEBアプリで実装可能になります。**

レシートプリンタやKioskモード（機能制限した全画面モード）と組み合わせて色々活用方法を考えると楽しいと思います。


```js:メインウィンドウ
$('#print_button').on('click', function (e) {
    var url = '印刷用ウィンドウのURL';
    window.open(url);
})
```

```js:印刷用ウィンドウ
$(window).load(function () {
    setTimeout(function () {
         window.print();
         window.close();
    }, 200);
})
```

コード引用： [Qiita: そろそろ真面目に、HTMLで帳票を描く話をしようか](https://qiita.com/cognitom/items/d39d5f19054c8c8fd592)


## 参考

- 印刷帳票をデザインするときに参考にしてください。

 - [Qiita: 紙の帳票を元にHTML帳票を作る方法](https://qiita.com/okoppe8/items/45e7b37774899e763d31)

- Google Chrome キオスクモードの紹介

 - [簡単！GoogleChromeのKIOSKモードで簡易デジタルサイネージ](https://blogs.fc-taka.net/blog/2015/06/27/post-1195/)

 - [Qiita: デジタルサイネージを作ったので学んだことを晒してみる Part.1](https://qiita.com/Akoarum_K/items/7f65c67f78b2ed9edb6c)
leafletを鍛える。その10

#概要

leafletを鍛えてみた。
d3のv4でjsonよんでみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/q/J/Y/qJYR.jpg?t=1539776849)

#サンプルデータ

```
{
	"bikuya": [{
		"lat": "37.929687",
		"lon": "140.151111",
		"name": "オートショップユニット"
	},
	{
		"lat": "37.929220",
		"lon": "140.109344",
		"name": "（株）エイジュウプロ"
	},
	{
		"lat": "37.923453",
		"lon": "140.093108",
		"name": "（株）ホンダウイングロードショウ"
	},
	{
		"lat": "37.911333",
		"lon": "140.112004",
		"name": "（有）カーセンター葵商会"
	},
	{
		"lat": "37.907591",
		"lon": "140.108036",
		"name": "塚本サイクル"
	},
	{
		"lat": "37.928429",
		"lon": "140.114247",
		"name": "サイクルショップ川口"
	},
	{
		"lat": "37.916279",
		"lon": "140.099879",
		"name": "サイクルショップ中村"
	},
	{
		"lat": "37.917854",
		"lon": "140.101416",
		"name": "菅原商会"
	},
	{
		"lat": "37.912485",
		"lon": "140.108688",
		"name": "サイクルセンター卯月"
	},
	{
		"lat": "37.912049",
		"lon": "140.105914",
		"name": "ホンダ野村モータース"
	},
	{
		"lat": "37.869915",
		"lon": "140.103534",
		"name": "モーターハウスＫ"
	},
	{
		"lat": "37.918955",
		"lon": "140.109289",
		"name": "ライダースサロン・ヤマカ"
	},
	{
		"lat": "37.915746",
		"lon": "140.108313",
		"name": "中央ホンダ"
	},
	{
		"lat": "37.905011",
		"lon": "140.107225",
		"name": "香澄ホンダ"
	},
	{
		"lat": "37.912663",
		"lon": "140.123328",
		"name": "佐藤オート商会"
	},
	{
		"lat": "37.910789",
		"lon": "140.121636",
		"name": "香坂輪店"
	},
	{
		"lat": "37.958525",
		"lon": "140.125682",
		"name": "斎藤モータース"
	},
	{
		"lat": "37.956678",
		"lon": "140.117820",
		"name": "ニューホンダ石山"
	},
	{
		"lat": "37.903901",
		"lon": "140.131694",
		"name": "二輪屋たかはし"
	},
	{
		"lat": "37.886019",
		"lon": "140.104554",
		"name": "夢工場"
	},
	{
		"lat": "37.874814",
		"lon": "140.103239",
		"name": "あべ輪店"
	},
	{
		"lat": "37.905055",
		"lon": "140.137379",
		"name": "レッドバロン米沢"
	}]
}

```

#サンプルコード

```
var map = L.map('map').setView([37.9, 140.1], 12);
mapLink = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
var svgLayer = L.svg();
svgLayer.addTo(map);
var svg = d3.select("#map").select("svg");
var g = svg.select('g');
d3.json("http://jsrun.it/assets/O/z/T/r/OzTrh", function(pointsOfInterest) {
    pointsOfInterest = pointsOfInterest.bikuya;
    pointsOfInterest.forEach(function(d) {
        d.latLong = new L.LatLng(d.lat, d.lon);
    });
    var feature = g.selectAll("circle").data(pointsOfInterest).enter().append("circle").style("stroke", "black").style("opacity", .4).style("fill", "blue").attr("r", 20);
    function drawAndUpdateCircles() {
        feature.attr("transform", function(d) {
            var layerPoint = map.latLngToLayerPoint(d.latLong);
            return "translate("+ layerPoint.x +","+ layerPoint.y +")";
        })
    }
    drawAndUpdateCircles();
    map.on("moveend", drawAndUpdateCircles);
});
```

#成果物

https://embed.plnkr.co/PmFqM50uT3SRFLahjrCE/

以上。
jsdoでtensorflow.js その4


#概要

jsdoでtensorflow.jsやってみた。
keras風、高級APIでやってみた。
sin問題、やってみた。
バイアスとウェイトを取り出してみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/6a4bd96b-93ce-5476-18f2-94e744dc2400.png)

#バイアスとウェイト

```
Tensor
     [[0.2531025, 0.4164523, -1.1151464, 0.4376633, 0.1289877, 0.4103372, 0.2792153, 0.70398],],
Tensor
    [-0.4401962, -2.1132319, 0.5595089, -0.563455, -0.1893023, -0.2885419, -1.009542, -0.0465528],
Tensor
    [[0.1940588 , 0.0681509 , 0.9535493, -0.0773719, 0.8324607 , -0.8515605, -0.6706933, 0.1878372 ],
     [0.4493144 , -0.4780639, 1.5485642, 1.4073216 , 2.0158291 , -1.4143182, -1.4408728, -0.8682367],
     [-0.6381388, 0.1522027 , 0.9951886, -0.2726825, 0.527568  , -0.3888088, -0.4528778, 0.6447773 ],
     [0.2419801 , -0.8167835, 0.9237465, -0.5314366, 0.9571585 , -0.8029142, -1.2987713, 0.0321875 ],
     [0.0331108 , -0.0905754, 0.1779677, 0.6799864 , 1.1167135 , -0.0741848, -0.3947299, -0.0009523],
     [-0.5466188, -0.4837927, 0.1234538, -0.5929621, 0.3947013 , -0.1113829, -0.7998782, 0.1112668 ],
     [0.0643774 , -0.5435904, 0.6300909, 0.4568717 , 1.3888791 , -0.5006527, -0.49882  , 0.2748145 ],
     [-0.0169007, 0.2333336 , 0.0424321, -0.0196944, -0.7414989, -0.1316426, -0.5333264, -0.6009958]],
Tensor
    [0.0902436, 0.1338934, 0.066715, 0.139732, -0.2624187, 0.0090373, -0.1885402, 0.0884176],
Tensor
    [[0.96334   ],
     [0.4154128 ],
     [-0.8263575],
     [1.8862615 ],
     [-0.587487 ],
     [0.4512331 ],
     [0.7456639 ],
     [-1.3292562]],
Tensor
    [0.3027641]

```

#サンプルコード

```
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function draw(data, n) {
	var hc = n * 100 + 100;
    ctx.strokeStyle = "#f00";
    ctx.lineWidth = 1;
	ctx.moveTo(0, hc);
    for (var i = 1; i < 20; i++) 
    {
        ctx.lineTo(i * 5, hc - data[i] * 30);
    }
	ctx.stroke();
}

const buffer = tf.buffer([20, 1]);
const buffer2 = tf.buffer([20, 1]);
b = [];
for (var i = 0; i < 20; i++) 
{
    var x = i / 3.0;    
    var y = Math.sin(x);
    b.push(y);
    buffer.set(x, i, 0);
    buffer2.set(y, i, 0);
}
draw(b, 0);
const xs = buffer.toTensor();
const ys = buffer2.toTensor();
const model = tf.sequential({
	layers: [tf.layers.dense({
		units: 8,
        activation: 'tanh',
		inputShape: [1]
	})]
});
model.add(tf.layers.dense({
	units: 8,
	activation: 'tanh'
}));
model.add(tf.layers.dense({
	units: 1,
	activation: 'tanh'
}));
model.compile({
	optimizer: 'adam',
	loss: 'meanSquaredError'
});
model.fit(xs, ys, {
    batchSize: 20, 
    epochs: 3000
}).then((d) => {
    var str = "loss = ";
    str += d.history.loss[0]; 
    alert(str);
    p = [];
    for (i = 0; i < 20; i++)
    {
        var x = i / 3.0;
        var pre = model.predict(tf.tensor2d([[x]], [1, 1]));
        var f = pre.dataSync();
        p.push(f);
    }
    draw(p, 1);
    var out1 = document.getElementById('src');
    out1.value += model.getWeights() + '\n';
});

```

#成果物

http://jsdo.it/ohisama1/WB1Y

以上。
【Mac】プロキシを使用していないのにChromeでERR_PROXY_CONNECTION_FAILEDが出る場合の解決方法


# 現象

<img width="497" alt="スクリーンショット 2018-10-18 9.40.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/264910/e2a0dddc-39cf-0fc7-bb03-4a7d1f7daa3f.png">


プロキシに繋いでいないのにプロキシサーバーがどうこうとか言われてインターネットにつながらないことがある。

大半のケースの場合はWi-Fiからインターネット接続をしているので、設定からプロキシのチェックを外すことで解決することができる。

# Wi-Fiに繋いでいる場合の解決方法

- システム環境設定->ネットワーク->Wi-Fi[詳細]→プロキシを開く。
<img width="656" alt="スクリーンショット 2018-10-17 20.29.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/264910/290efc23-8bb3-b5aa-d480-4d8cb540a416.png">


- チェックボックスが付いていれば全て外す。
- [OK]を押下し、戻ってきたネットワーク画面で[適用]を押下する。

筆者の場合はこちらの手順で解決することができました。

# テザリングしている場合の解決方法

テザリングしている場合は少し面倒で、Bluetooth、iPhone USBともにプロキシの設定をGUIから見ることができません、

筆者の場合は以下の手順で解決することができました。

- [ネットワーク]から使用しているテザリング種別を選択し、下の[-]を押下する。
<img width="649" alt="スクリーンショット 2018-10-18 9.42.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/264910/036530f2-7148-9d44-1ef6-abf36c0fd119.png">


- 次回Macに接続したときにどうこう言われるがどちらでもよい
<img width="422" alt="スクリーンショット 2018-10-18 9.01.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/264910/1a879cb5-7d4b-ee01-82ff-bbba95a566df.png">

- [+]を押下し、インターフェイスに自分が先程削除したものを選択。必要であれば名前を変える
<img width="417" alt="スクリーンショット 2018-10-18 9.00.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/264910/54f209ee-3aaa-f9ab-db6e-875ca017b78c.png">



また、以下にCUIからプロキシの設定を変更するコマンドを記述しておきます。ダブルクォーテーションで囲っている文字列の部分はネットワーク名なので変えている人は適宜変更して実行ください。

## USBでテザリングしている場合

### プロキシの設定状態を確認
```
networksetup -getwebproxy "iPhone USB"
```

無効になっていれば`Enabled`が`No`になっている。Yesになっていればoffにするコマンドを実行する。

### 表示例
```
Enabled: No
Server:
Port: 0
Authenticated Proxy Enabled: 0
```

### プロキシの設定をoffにする
```
sudo networksetup -setwebproxystate "iPhone USB" off
```


## Bluetoothでテザリングしている場合

### プロキシの設定状態を確認
```
networksetup -getwebproxy "Bluetooth PAN"
```

### プロキシの設定をoffにする
```
sudo networksetup -setwebproxystate "Bluetooth PAN" off
```
合計値を計算する（SUM）

記載内容は、Version：8.0.12で確認したものです。


##1. 指定フィールドの合計値を計算する
SUMを使うとフィールドの合計値を出すことができます。
計算するフィールドはSELECT文で指定します。

```ruby:指定フィールドの合計値
mysql> select sum(フィールド名) from テーブル名;
```

##2. 特定範囲の合計値を計算する
WHEREを使うと計算範囲を指定することができます。
あらかじめ設定していたidの範囲を指定する場合
下記のようにidの範囲の合計値を計算することができます。id 3以下を指定する場合は下記の通りです。

```ruby:id範囲の指定
mysql> select sum(フィールド名) from テーブル名 where id <= 3;
```

特定の値の合計値を出す場合は下記の通りです。

```ruby:値の指定
mysql> select sum(フィールド名) from テーブル名 where フィールド名 = '値';
```

両方を設定する場合は下記のイメージです。

```ruby:複数の指定
mysql> select sum(フィールド名) from テーブル名 where フィールド名 = '値' AND id <= 3;
```
ArduinoでSwitch文が使えない...?

```c
switch(value) {
    case 1:
        while(!Serial.available());
        char temp = Serial.read();
        // 処理が続く
        break;
    case 2:
        while(!Serial.available());
        char temp = Serial.read();
        // 処理が続く
        break;
    default:
        break;
```
このコード、Arduinoなら問題なくコンパイルは通ります。
ですが、実際に動かすと、case 1も2もdefaultもどれにも当てはまらないということになっています。
なぜなら、switch文の中で同じ変数が複数宣言されるからです。
正直に言って、コンパイルエラー出してほしかったです。
なので、解決策としては、

```c
switch(value) {
    case 1:
        while(!Serial.available());
        {
            char temp = Serial.read();
            // 処理が続く
        }
        break;
    case 2:
        while(!Serial.available());
        {
            char temp = Serial.read();
            // 処理が続く
        }
        // 処理が続く
        break;
    default:
        break;
```
となります。

意外と気づきにくいバグ(だと個人的に思っています)
体感！VB.NETプロジェクトの闇！

## 読み始める前に
あのときの気持ちを忘れないために記事として残しておきます

この記事は自分が１年以内に参画したVB.NETプロジェクト内で遭遇した、地獄のようなバッドプラクティス集です。絶対真似しないでください。

## １．プロジェクトの設定がOption Strict Offになっている
### 問題点
- 暗黙的な型変換が行われるようになり、実行前に防ぐことのできるバグが実行するまでわからなくなる。
- 型が違う場合は実行時に勝手にキャストされてしまい、バグ発生量、デバッグ量がとっても増えるので絶対にやめよう**（実際にDecimal型の値がInt型に勝手にキャストされて大変なことになった）**

### 対処
- Option Strict Onにしよう
- 自動でのキャストに頼らず、必要なときはDirectCast関数やCInt関数等を使って明示的にキャストしましょう


## ２．社内フレームワークの関数の戻り値がObject型（Valiant型）
### 問題点
- 何が戻ってきているのかわからないので、VisualStudioの補完が一切きかない。
- 文書や、デバッグモードで実際の型が何なのか確認する必要が出てくる。
- 大量にキャストが必要になる、そしてOption StrictがOffにされる
- 作業量が増えまくるので絶対にやめよう

### 対処
**返したい型のまま**で返して

(そのフレームワークは元がVB6用で、VB.NETにそのままリプレースしたので、その名残が残っているらしい）

## ３．メソッドの実行結果がすべてフィールド変数に格納される
### 問題点
分かりづらい、使いにくい、フィールド変数の数が多くなればなるほど、どの変数がどのメソッドの戻り値なのかわからなる

### 対処
- 基本、返したい値があるなら戻り値で返す。
- 複数の値を返す必要があるならデータクラスを作って、それに格納し戻り値で返す。
- もし、処理の成功、失敗があり、成功の場合には値を返すようなメソッドであれば、処理の失敗時に例外をスローするような設計も考慮に入れる

## ４.クラスのフィールド変数の初期化をクラスの利用者側でやらないといけない
### 実装例

```vb
Dim database = New Database()
ReDim database.SelectedData(99) 
'SelectHogeメソッドのデータ格納用フィールド変数（配列）の初期化
database.SelectHoge()
Dim hoge = database.SelectedData
'hogeをいろいろ使う
```

### 問題点
カプセル化なんてなかったんや。。。
非常に使いにくい、初期化する変数が多ければ多いほど、使うための手間が多くなる

### 対処法
- オブジェクト指向を勉強しなさい
- 今回の例はメソッド側でSelectedDataを初期化すれば解決する問題だよね
- それ以前に取得してきたデータは戻り値で返しましょうね

## ５．Rnd関数を使う
### 例

```vb
Function NextInt(min As Integer, max As Integer) As Integer
    Return (max - min) * Rnd() + min
End Function
```

### 問題点
- Randomize関数を実行し忘れると、アプリケーション再起動時に同じ値が出てくる
- 車輪の再発明でバグの原因になるかもしれない

### 対処
- .NETframeworkにはRandomクラスがあるのでそっちを使う
- RandomクラスにはNextメソッドがあり、範囲指定ができるので上記の関数を実装する必要がない
- まず先に.NETframeworkやライブラリを確認して、解決する方法がないか探して見ることが重要

#６．ほしい値にたどり着くまでがとても長い
### 例

```vb
Dim hoshiiValue = dicHoge(dicFuga(FugaKeys.FugaFuga))(0).HogeArray(HogeLabel.HogeHoge)(0).HogeFuga
'確か顧客データのリストだったはず
```

### 問題点
- こんなの作った人にしかわからない、覚えきれない
- 実際はこれより長くて、しかも上司のレビューを通過していた
- こんな構造を作ってしまった人はデータクラスという概念を一切しらなかったっぽい

### 対処
- データクラスを作って１件分のデータをまとめ、それをリストなどに格納していって、クラスや関数に渡す
- 関数やクラス、メソッドには必要な範囲のデータを渡すようにする（過剰に渡さない）

## ７．コーディングルールに関数やメソッドは必ずTry Catchで囲むがある
### 例

```vb
Sub FuncHoge(ByRef value As User)
    Try
    '何かいろいろ処理


    Catch e As Exception
    '握りつぶす      
    End Try
End Sub
```

### 問題点
- バグが発生した場合の原因究明がとても困難
- エラー時の処理が各所に散らばっていて、修正がとても困難
- こんなコーディングルールを設定するプロジェクトマネージャは、例外処理をおじゃま虫としか思っていないんだろうな

### 対処
- プログラマーの人は何でもかんでもcatchしない、大抵はthrowしたままで大丈夫なはず（もし、catchする必要があるなら、しっかり確認を取る）
- Exceptionでキャッチは基本しない（SocketExceptionが発生するなら、SocketExceptionでキャッチする等）これも要確認
- プロマネの人はIO・ネットワーク等の例外をどこでcatchして処理するか、しっかり考える

## 最後に
１から５までの問題を発見したプロジェクトは、開発環境も良くなくVisualStudio2008で、更にコーディングルールもVB6時代を踏襲したままで、.NETFrameworkも2.0までと悪い状況の詰合せみたいな感じでした。出そうと思えばもっと最悪なことがいっぱいありますが今回はこれぐらいに。
Factory Botのメソッド利用時に、"FactoryBot."を省略できる話

[Everyday Rails – RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)でRspecを学習中に気づいた点をメモ。

FactoryBotのメソッドを利用する時は、

```ruby
it "has a valid factory" do
  expect(FactoryBot.build(:user)).to be_valid
end
```
という形でFactoryBot.*method*という形をよく見る。
(書籍にも書いてある＆ググった時もこの形が多い)

ただこの際、"FactoryBot."の部分を省略できる
(以下[FactoryBotのREADME](https://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md
)より引用)

```ruby
# Returns a User instance that's not saved
user = build(:user)
```
省略するためには以下の設定が必要。
(以下railsの場合。rails以外のやり方は[README](https://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md)参照)

```ruby:spec/rails_helper.rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end
```

### 懸念点
省略できるのはいいが、
`user = build(:user)`という書き方だと、
FactoryBotのメソッドなのかどうか一見して判別つきにくい気もする。
使い分けも必要？
発掘 RulerGuide メンバー (Publisher)

#RulerGuide メンバー (Publisher)
https://msdn.microsoft.com/ja-jp/library/office/ff938907.aspx のキャッシュ
ページ上のオブジェクトを整列するために使用するグリッド線を表します。RulerGuideオブジェクトは、 RulerGuidesコレクションのメンバーです。
#メソッド

##アプリケーション
オブジェクト修飾子を付けずにこのプロパティは Publisher の現在のインスタンスを表すApplicationオブジェクトを返します。オブジェクト修飾子を使用すると、このプロパティは、指定したオブジェクトの作成元を表すApplicationオブジェクトを返します。OLE オートメーション オブジェクトと共に使用すると、オブジェクトのアプリケーションを返します。
##親
指定されたオブジェクトの親オブジェクトを表すオブジェクトを取得します。たとえば TextFrame オブジェクトの場合は、テキスト ボックスの親図形を表す Shape オブジェクトを取得します。値の取得のみ可能です。
##Position
指定した範囲のテキストのベースラインを基準とするフォントの相対位置を表すバリアント型 (Variant) の値を設定します。正の値を設定すると、テキストは標準のベースラインより上に移動し、負の値を設定すると、テキストはベースラインより下になります。未定義の値は、-9999.0 として返されます。値の取得および設定が可能です。
##種類
ルーラー ガイドの種類を表すPbRulerGuideType定数を設定または返します。読み取り/書き込み。

WizardProperties オブジェクト (Publisher)
文書のスタイルまたはデザイン ギャラリー オブジェクトのウィザードで使用可能な設定値を表します。

#Example

WizardPropertiesコレクションを取得するのにウィザードのオブジェクトのPropertiesプロパティを使用します。次の例の名前と現在の設定を表示する、作業中の文書に関連付けられている文書のデザインをレポートします。

```visualbasic
Dim wizTemp As Wizard
Dim wizproTemp As WizardProperty
Dim wizproAll As WizardProperties

Set wizTemp = ActiveDocument.Wizard

With wizTemp
Set wizproAll = .Properties
MsgBox "Publication Design associated with " _
&amp; "current publication: " .Name
For Each wizproTemp In wizproAll
With wizproTemp
Debug.Print " Wizard property: " _
&amp; .Name &amp; " = " &amp; .CurrentValueId
End With
Next wizproTemp
End With

```


#メモ
使用している Microsoft Publisher の言語バージョンに応じて上記のコードを使用する場合に、エラーが表示されます。この問題が発生した場合は、エラーを回避するエラー ハンドラーを作成する必要があります。詳細については、 Wizard オブジェクトを参照してください。

#メソッド
##FindPropertyById

#プロパティ
##Application
##Count
##Item
##Parent
発掘 Printer オブジェクト (Publisher)

#Printer オブジェクト (Publisher)
プリンターオブジェクトは、コンピューターにインストールされているプリンターを表します。

##注釈
Microsoft Publisher ユーザーのプリンターの設定] ダイアログ ボックス ([ファイル] メニュー) の設定に対応して用紙サイズ、 PaperSource、 PaperOrientation、プリンターオブジェクトなど、プロパティの多くインタ フェースです。
お使いのコンピューターにインストールされているすべてのプリンターのコレクションは、 InstalledPrintersコレクションによって表されます。

## 例
次の Microsoft Visual Basic for Applications (VBA) マクロは、コンピューターにインストールされているすべてのプリンターの一覧を取得、どちらかを決定する、プリンターオブジェクトのプロパティのPrinterNameとIsActivePrinterプロパティを使用する方法を示しています。それらは、現在作業中のプリンターといくつかのプリンターの設定を取得します。マクロには、イミディ エイトウィンドウに結果が表示されます。

```visualbasic
Public Sub Printer_Example()

Dim pubInstalledPrinters As Publisher.InstalledPrinters
Dim pubApplication As Publisher.Application
Dim pubPrinter As Publisher.Printer

Set pubApplication = ThisDocument.Application
Set pubInstalledPrinters = pubApplication.InstalledPrinters

For Each pubPrinter In pubInstalledPrinters
Debug.Print pubPrinter.PrinterName
If pubPrinter.IsActivePrinter Then
Debug.Print "This is the active printer"
Debug.Print "Paper size is ", pubPrinter.PaperSize
Debug.Print "Paper orientation is ", pubPrinter.PaperOrientation
Debug.Print "Paper source is ", pubPrinter.PaperSource
End If
Next

End Sub
```

https://msdn.microsoft.com/ja-jp/VBA/Publisher-VBA/articles/printer-object-publisher
Application
DriverType
Index
IsActivePrinter
IsColor
IsDuplex
PaperHeight
PaperOrientation
用紙サイズ
PaperSource
幅
Parent
PrintableRect
PrinterName
PrintMode
Nuxt.jsで手間取ったことまとめ


Nuxt.jsのプロジェクトをいくつか作っていて躓いたところまとめ

# nuxtが生成するディレクトリについて整理

### buildDir
- nuxt.config.js `buildDir` プロパティ．
- `nuxt build` や `nuxt generate` した時
- デフォルトは `.nuxt`

### generate.dir
- nuxt.config.js `generate` プロパティの下にある `dir`
- `nuxt generate` もしくはspaモードで `nuxt build` した時
- デフォルトは `dist`

# ページ上部のプログレスバーがいらない時
- nuxt.config.js `loading` プロパティを `false` にする．

# 同一リポジトリに複数のnuxtプロジェクトがあるとき
- 複数のnuxt.config.jsを用意することになる
- それぞれ `srcDir` と `buildDir` と `generate.dir` を設定してやること．
- npm-run-allなどで並行にビルドを走らせようとするとポートが衝突するので `nuxt build -p 3001` など指定してやると良い．


# `nuxt generate` したファイルをルート以外のURLに配置するとき
例えば `https://example.com/my/dir/` に配置するとき

- nuxt.config.js `router.base` に `/my/dir/`
 - devのときは `/`　になるようにNODE_ENVなどで切り替えると良い
- nuxt.config.js `build.publicPath` に `https://example.com/my/dir/`
- aタグhref属性ではルートを `/my/dir/` と見て良い．
 - つまり `https://example.com/my/dir/hoge` へは単に `/hoge` として良い
【Ethereum】MetaMaskとRemixの連携

# はじめに
MetaMaskの使い方と、どのように動いているのかを理解するため、Remixとの連携を試した記録

MetaMaskのインストールはいろんな方がわかりやすく書いているので割愛
[MetaMask(メタマスク)の導入方法](https://www.fukuhara-sencho.com/entry/2018/05/08/193858)

# MetamaskをRopstenテストネットワークにつなぐ
Metamaskをどのネットワークにつなぐかはプルダウンメニューから選択できる。
今回は、Ropstenテストネットワークを選択

![スクリーンショット 2018-10-17 3.23.59.png](https://qiita-image-store.s3.amazonaws.com/0/300706/2c4a3bd6-36e4-1d8f-34e8-511d430c7ed8.png)

# RemixとMetamaskをつなぐ
Remixにて、Environmentでinjected Web3を選択

![スクリーンショット 2018-10-17 3.22.37.png](https://qiita-image-store.s3.amazonaws.com/0/300706/5820bff3-9a80-6095-eb85-f9fee1bedb87.png)

Ropstenテストネットワークに接続されていることがわかる
また、アカウントとして、現在有効なMetaMaskのアカウントが使われている
![スクリーンショット 2018-10-17 3.23.14.png](https://qiita-image-store.s3.amazonaws.com/0/300706/95e13ff0-038b-1433-fdcc-ab72e9011641.png)

# スマートコントラクトの実行

以下のスマートコントラクトを作成

```solidity:greetings.sol
pragma solidity ^0.4.19;

contract greetingContract {
    string greetings="Hello!";

    function setGreeting(string _greeting) public {
        greetings = _greeting;
    }
}
```
コンパイルを済ました後にデプロイを実行すると以下のようなNotificationが出る
Ropstenテストネットワークでコントラクトをデプロイしようとしているけど大丈夫かと聞かれているようだ
![スクリーンショット 2018-10-17 3.28.51.png](https://qiita-image-store.s3.amazonaws.com/0/300706/518c19f5-5ac8-ee66-c5ac-b0e572ef8ecd.png)

確認をクリックするとトランザクションがブロックチェーンに送られ、Remixのログ出力に、トランザクション情報へのリンクが表示される[^1]
![スクリーンショット 2018-10-17 3.38.40.png](https://qiita-image-store.s3.amazonaws.com/0/300706/743b5812-5e3f-afa1-cedc-703959078a1d.png)

[^1]: 今回のデプロイ時のトランザクションは[こちら](https://ropsten.etherscan.io/tx/0xa051c292fdb33b11a7ce58cb92ca781b39ae83d667854a1a7c7793c0fc329cc7)

そして、デプロイされたコントラクトが実行できるようになる
![スクリーンショット 2018-10-17 3.41.21.png](https://qiita-image-store.s3.amazonaws.com/0/300706/a7119372-1008-cc58-af08-1f2fb185f5a9.png)

`greetings`の変数を確認すると、初期値が格納されていることが確認できる
ちなみに、変数の参照はトランザクションが発生しないも確認できる
![スクリーンショット 2018-10-17 3.43.15.png](https://qiita-image-store.s3.amazonaws.com/0/300706/4b990a70-dee5-517d-a5de-4aa6f24878e6.png)

`setGreeting`メソッドを実行後に`greetings`を確認するとたしかに更新されている
※`setGreeting`メソッドを実行時にMetaMaskの確認画面がでるが今回は割愛
![スクリーンショット 2018-10-17 3.44.57.png](https://qiita-image-store.s3.amazonaws.com/0/300706/693a389c-fc53-e66f-88ef-f35d3a097cf6.png)

# 最後に
MetaMaskのアカウントを使って、スマートコントラクトを実行することが確認できた
Remixではなく、ローカルのブロックチェーンへの接続方法も調べたい

# 宿題

- [ ] MetaMaskをローカルブロックチェーンにつなげる

# 参考資料
[Ethereum Developer 2016/17: Build A Decentralised Apps](https://www.udemy.com/ethereum-developer/learn/v4/overview)
[Ethereum 外部コントラクトの呼び出し方法（Remix, MetaMask連携）](https://qiita.com/tomohata/items/12967b69ee5ff80ce0f7)
Xcode 10.0.0 + Poco の導入手引き

# はじめに

初めての投稿なので、読みにくかったらすみません。よろしくお願いします。


# 使用環境

* macOS High Sierra
* Xcode 10.0.0
* Poco 1.9.0 （Homebrew で導入）


# 背景

openFrameworks に挑戦し始めてから色々作ったので、動いているところを録画して公開したくなった。Mac だと QuickTime を使ってキャプチャすることもできるが、あまりカーソルが映って欲しくない。
そこで、画面録画できるアドオン `ofxVideoRecorde` を試してみることにした。

だが `ofxVideoRecord`のサンプルを動かそうとしたら build error で下記の通り。

```sh
"Poco/Condition.h": file not found
```

どうやら `Poco` が入っていないらしいので、ググってインストールする。面倒なので、今回は Homebrew で導入した。サイトを参考にして簡単なサンプルを作ってみたが、正常にコンパイルできた。
しかし、Xcode でビルドする際にうまくいかない。この「Xcode に Poco を認識させる」部分で手こずってしまったので、備忘録を残しておく。


# 症状
CLI上でコンパイルは正常にできたが（下記）、Xcode でビルドできない。

```sh
# リンク指定なしではエラーが出る
$ g++ ***.cpp

# リンクを指定すれば正常にコンパイルできる
#   -I/usr/local/include` : インクルードパス
#   -L/usr/local/lib` : ライブラリパス
#   -lPocoFoundation` : リンク
$ g++ -I/usr/local/include -L/usr/local/lib -lPocoFoundation ***.cpp
```

Xcode エラーについて`Reveal on Log`を確認

* `g++ ***.cpp` でコンパイルしたときと同じエラーが出る
* 恐らく、インクルードパスやリンクが正しく通っていないっぽい


# 原因

Xcode のプロジェクト自体でパスを正しく通す必要がある


# 対処
Xcode のプロジェクト自体で下記のようにパスを通す（暫定的な解決策）

* `Project Settings` --> `Build Settings`に移動
    * `Linking --> Ohter Link Flags` : `-lPocoFoundation`
    * `Search Paths --> Library Search Path` : `/usr/local/lib`
    * `Search Paths --> Header Search Path` : `/usr/local/include`


# まとめ

やっと動いた...これで画面録画とかできる...（多分）。

ただ、とりあえずビルドできるようにはなったが、どうも対処方法が汎用性に欠けててダサい気もする。リンカを張るとかの方がスマートなのかな？
あと今回の問題は、そもそも Homebrew でインストールしたせいかもしれない。何なら、ダウンロードしてきてビルドするのも解決策かも（試せてないから分からないけど）。

何にせよ、IDE のパス問題は毎回大変だ...。


# Reference
* [POCO C++ Libraries の簡単な使用方法 - Qoosky](POCO C++ Libraries の簡単な使用方法 - Qoosky)
* [iPhone開発 - Cachet Software](http://www.cachet.co.jp/?p=99)
* [Linker command failed with exit code 1でハマりまくったお話 - Qiita](https://qiita.com/aframeworks-blog/items/db45373e1ccb3c32fae3)
* [ld: library not found for -lPodsの対処法 - Qiita](https://qiita.com/shishimo@github/items/af18f5e057d206f051b6)
* [Using Poco and XCode - Apple Community](https://discussions.apple.com/thread/3164084)
超初心者のAngular学習〜３日目コンポーネント〜

#はじめに
前回では最初のAngularを立ち上げる部分からやっていきました。三日目はフロントエンド、バックエンド等の開発でよく聞くコンポーネントについて理解を深めるための備忘録です、たぶん間違ってること多め。
#コンポーネントとは
そもそもコンポーネントって何？って思うと思います。僕の[よく使うサイト](https://wa3.i-3-i.info/word12384.html)を引用すると 、

>コンポーネント (component)
>>何かの部品のこと

>引用元: 分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

ふむ、大まかには部品のことらしい（爆）。
もう少しフロントエンドのコンポーネント詳しく探ると、[このサイト](https://qiita.com/seya/items/8814e905693f00cdade2)にはこのように書かれていました。

>そして、このコンポーネントを構成する要素は以下の4つがあります。
>>情報構造
>>スタイル
>>状態
>>インタラクション・機能

>引用元: 最近のフロントエンドのコンポーネント設計に立ち向かう

少し細かくすると４つの部品に分けれるらしい。

## 情報構造・スタイル
情報構造はHTML、スタイルはCSSに当たる。要はこの部分は見た目の部分
人間の体で言うとHTMLがその人の身体で、CSSが服とか衣装みたいなもんっていうフランクな感じで考えてます。

## 状態（ストア）
この部分はStoreのことを指しています。要は得られた情報の一時的な格納先。
昨今のWebコンポーネント指向ないし、Webアプリケーションの根幹の一つと言っても過言ではないと思う。
この部分は備忘録でまとめるとすごい長くなるので後でまとめます。要は、人で例えるとパット見の状態、名前、健康とか名刺の住所とかのこと。

## インタラクション・機能
この部分は単純にアプリケーションの機能が書かれてる部分を指します（けっこう適当）
まあ、サーバーにアクセスしたり、ファイル読み込んだりとか機能を書いたりする部分。僕はこれは人で言うところの仕事の中身だと思ってます。（建築したり、車運転したりとかそんなところ）

### モジュール＆サービス（部品の共通化)
これは別にあってもなくても良いけど、同じ部品（変数とか、機能とか、ルーティングとか）を何度もつかうのは~~アホくさい~~面倒なので、部品の共通化する部分。わりとこの部分は理解しとかないと正直しんどくなる。要はこれがコンポーネント指向でネスト（入れ子構造）を複雑化させない鍵となる部分の一つだと僕は感じる。だって人間だって使うものはきっちりとまとめて置くと便利でしょ、小物入れとかさ。まあ、入れてるところがわからなくなることも多々あるので、部品の共通化は注意も必要だとは思います。要は使いたいものだけ小物入れに入れるようにしましょう。

#で、結局どんな構成なのさ？
ぶっちゃけそんな型みたいなものはWebコンポーネント指向にはありません。いや、あるかもしれませんが、それは設計者、開発者の気分次第です。要はそれくらい自由に作れています。例えば、

![sketch-1539795756068.png](https://qiita-image-store.s3.amazonaws.com/0/259528/5356d812-38dd-5f83-33c4-49798aae1692.png)

みたいに階層式でまとめるのもあり？、逆に

![sketch-1539795763193.png](https://qiita-image-store.s3.amazonaws.com/0/259528/22610d64-8a25-445b-efe6-8c02c5ccd9d2.png)

みたいに同じ階層にまとめるのもありかな？
一つの階層にまとめるのもありだけど、機能がめちゃくちゃ少ない限りはそんなことは絶対にスマートではありません。また、同じ機能をまとめたり、ストアを別にしたりしたりするんで僕はこんな感じに書いています。
![sketch-1539795771319.png](https://qiita-image-store.s3.amazonaws.com/0/259528/94c4abd9-2d79-a25c-0635-47acbe6d3c9c.png)

超絶雑ですが、大まかにはこんな感じに書きます。ちなみにコンポーネント（コンポ）といっても中身は機能だけではなく、HTMLやCSSも入ってます。これをもっと細分化して再利用しやすくすることもできそうですが、前述でも述べてる通り、機能の再利用するための細分化は複雑なネストを生み出しかねないので注意が必要です。

#三日目終了
まあ、Webコンポーネント指向についての備忘録でした。たぶん間違ってること多いと思うので訂正お願いします。四日目はAngularの機能の一つというか、昨今のフロントエンド、バックエンド開発で欠かせないRxJSについてまとめていこうかな？と思います。（まとめれるのか？）