OmniAICreator/Qiita-1.07M huggingface dataset:
CSVファイルをドラッグ＆ドロップでデータをtable表示



```base.html
<div id="drop_wrap">
<p>ファイルをドロップしてください</p>
</div>
<table id="data_result">
  <thead>
    <th>見出し1</th>
    <th>見出し2</th>
    <th>見出し3</th>
    <th>見出し4</th>
  </thead>
  <tbody>
    <!-- ここにCSVデータ表示  -->
  </tbody>
</table>
```

```style.css
#drop_wrap {
    display: block;
    border: 2px dashed #bbb;
    border-radius: 5px;
    color: #bbb;
    padding: 25px;
    text-align: center;
    margin: 10px auto 5px;
    font-size: 18px;
    font-weight: bold;
    -khtml-user-drag: element;
    margin: 5% auto;
    width: 80%;
}
```


 ```script.js
$(function(){
   // FileAPIでCSVファイルのドロップ出力処理
    $("#drop_wrap").on("drop", function(e) {
        e.preventDefault();
        var $result_body = $('#data_result tbody');
        var files = e.originalEvent.dataTransfer.files[0];
        var reader = new FileReader();
        reader.onload = function(event) {
            // " "ごとに分割して配列化
            var lineArr = event.target.result.split(" ");
            // 行と列の二次元配列にする
            var itemArr = [];
            for (var i = 0; i < lineArr.length; i++) {
                itemArr[i] = lineArr[i].split(",");
            }
            // tableタグで出力
            var insert = '';
            for (var i = 0; i < itemArr.length; i++) {
                insert += '<tr>';
                for (var j = 0; j < itemArr[i].length; j++) {
                      insert += '<td>' + itemArr[i][j] + '</td>';
                }
                insert += '</tr>';
            }
            $result_body.html(insert);
        }

        reader.readAsText(files, 'Shift_JIS');
    }).on("dragenter", function() {
        return false;
    }).on("dragover", function() {
        return false;
    });
});
```
Mac で Julia #11 Pythonのライブラリを呼び出す


前回に引き続きJuliaについてです。

[ドキュメント](https://docs.julialang.org/)に沿って試していきます。

今回はpythonのモジュールを呼び出すのを試します。

## PyCall.jl

[JuliaPy/PyCall.jl](https://github.com/JuliaPy/PyCall.jl)を参考にします。

### Installation

```julia
julia> import Pkg

julia> Pkg.add("PyCall")
  Updating registry at `~/.julia/registries/General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
 Resolving package versions...
 Installed PyCall ─ v1.18.2
  Updating `~/.julia/environments/v1.0/Project.toml`
  [438e738f] + PyCall v1.18.2
  Updating `~/.julia/environments/v1.0/Manifest.toml`
  [438e738f] + PyCall v1.18.2
  Building PyCall → `~/.julia/packages/PyCall/akNFy/deps/build.log`

julia> using PyCall
[ Info: Precompiling PyCall [438e738f-606a-5dbb-bf0a-cddfbfd45ab0]
julia> 
```

インストールできたようです。

```julia
julia> PyCall.pyversion
v"3.6.6"

julia> PyCall.pyprogramname
"/Users/qoAop/.julia/packages/Conda/m7vem/deps/usr/bin/python"

julia> PyCall.libpython
"/Users/qoAop/.julia/packages/Conda/m7vem/deps/usr/lib/libpython3.6m"

julia> PyCall.conda
true
```

ユーザーの.juliaディレクトリにpythonがインストールされていてそれを使用するようです。

また```ENV["PYTHON"]```で使うPYTHONを指定して```Pkg.build("PyCall")```でビルドできるようです。

### Usage

```julia
julia> @pyimport math

julia> math.sin(math.pi / 4)
0.7071067811865475
```

pythonのmathモジュールをインポートして使うことができました。

```julia
julia> @pyimport numpy.random as nr

julia> nr.rand(3,4)
3×4 Array{Float64,2}:
 0.456341  0.247138   0.934635  0.379108
 0.476357  0.0794866  0.292872  0.63637
 0.70342   0.874391   0.147737  0.591573

julia>
```

numpyモジュールを呼び出せました。

### pyimport_conda

pyimport_condaでjuliaのpythonにモジュールをインストールできるようです。

今日はこの辺で。
Docker for Windows で Shared Drives の設定をせずにホストディレクトリのマウントをしようとするとコンテナ作成の途中で止まってしまう

Docker for Windows CE の Version 18.06.1-ce-win73 (19507) を使ってる時の話。

# 発生する問題

表題通り、Shared Drives の設定をしていないとコンテナ作成の途中でコマンドが止まってしまう。 特に何もメッセージが出てこないので、原因がわからずだいぶ困った。 (昔のバージョンだと 「Shared Drives の設定が必要」 という旨のダイアログが表示されてた気がする。)

## 具体的には

具体的には、Docker compose で下記のようにホストマシンのディレクトリをボリュームとしてマウントしようとした場合。

```yaml
version: "3"
services:
  foo:
    image: mysql:5.6.34
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    volumes:
      - ./bar:/bar
```

`docker-compose up` が 『Creating foo_bar_1』 みたいな表示で止まってしまう。

あるいは、`docker run` であれば、`docker run -v C:\Users\nobuoka\Documents\bar:/bar -it --rm -e 'MYSQL_ALLOW_EMPTY_PASSWORD=yes' mysql:5.6.34` みたいな感じでコマンドを実行した場合、何も表示されない状態で止まってしまう。

# 解決方法

単純に Docker for Windows の 「Settings」 の 「Shared Drives」 でドライブの共有を有効にすればよい。
【超シンプル】macOSで特定のフォルダをローカルサーバー化する

# 超シンプル、macOSで特定のフォルダをローカルサーバー化する

terminal上で、ローカルサーバー化したいフォルダに cd して、下記コマンドを入力する。

```
python -m SimpleHTTPServer 8888
```

その後はmacOSのブラウザ上からは

```
http://localhost:8888/
```

でアクセス可能となる。
GemfileのgithubショートハンドでGemfile.lockのプロトコルが強制的にgitになる問題

# tl;dr
関わっているプロジェクト（Ruby on Rails）で、`bundle install`を実行したところ、Gemfile.lockに以下のような差分が出てきてコミットできない状況に陥ったので、解決策をメモ。

```diff
-  remote: https://github.com/hogehoge/hoge.git
+  remote: git://github.com/hogehoge/hoge.git
```

# 参考
以下のブログを参考にさせてもらいました。
[bundler 1.13.0でGemfileに`:github` ショートハンドを使用するとwarningが出る](http://y-yagi.tumblr.com/post/150244664010/bundler-1130%E3%81%A7gemfile%E3%81%AB-github)

# 概要
Gemfileに以下のような記載がある場合、
（`github:`をショートハンドと呼ぶんだそうです）

```ruby:Gemfile
gem 'hoge', github: 'hogehoge/hoge'
```

`bundle install`を実行すると、Gemfile.lockにはこんな感じに記載される。

```console:Gemfile.lock
remote: git://github.com/hogehoge/hoge.git
```

プロトコルが`https`ではなく`git`に置き換わってしまうことで差分が発生するので、コミットに含められない事態に。
（他の人がどうやって`https`で運用してるのか知らなかった）

# 解決方法
gitの設定をちょっとだけ直してあげます。

```console
$ bundle config github.https true
```

上記コマンドを実行してあげれば、ショートハンドを使った場合も、`https`でアクセスしてくれるようになるので、`Gemfile.lock`も変な差分は出ないようになります。

# おまけ
参考サイトの方にも書かれていますが、githubショートハンドを使った状態で`bundle install`を実行すると、以下のような警告が出ます。

```console
The git source `git://github.com/hogehoge/hoge.git` uses the `git` protocol, which transmits data without encryption. Disable this warning with `bundle config git.allow_insecure true`, or switch to the `https` protocol to keep your data secure.
```

「gitプロトコルは暗号化されないので、セキュアじゃないよ。https使ったほうがいいんじゃね？」ってことです。
InterSystems Cache'のObjectScriptでローカルファイルを読み、ExcelのStringで扱う方法

Excel VBA側の設定は過去記事をご覧ください。
https://qiita.com/torisan_/items/226c319249e5d4fdc79e

ObjectScript側の準備
クラスNewClass1に、次のコードを追加する。

```vb:fileread()
ClassMethod fileread(filename As %String) As %String
{
    #dim line as %String
    #dim stream
    #dim sc

	Set stream=##class(%Stream.FileCharacter).%New()
	Set sc=stream.LinkToFile(filename)
	While 'stream.AtEnd {
	Set line=stream.Read()
	; Process the chunk here
	WRITE line
	}
	Quit line
}
```
![20180831-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/4bc1242f-beae-13bf-9abf-2121e08f4e85.png)

変数宣言は、先頭を1文字以上の空白にして、#dimと表現する。
%Stream.FileChalacterがCache'に用意されたクラス。
streamに、LinkToFile関数で指定したファイルが結び付けられて開かれる。
stream.Read()で、32000バイトのデータを読み取る。1行ずつ読み取りたいときはstream.ReadLine()でOK。
戻り値はQuitで記述する。

VBAの準備
以下のサブルーチン(TestCacheEntry2)をExcel VBAのModule1に記述する。

```vb:Module1.TestCacheEntry2()
Sub TestCacheEntry2()
     TestCacheConnection '以前の記事での開き方を参照
     
     Dim Patient As CacheActiveX.ObjInstance
     Set Patient = factory.New("User.Main.NewClass1")
     Dim s1 As String
     s1 = Patient.fileread("C:\data\test.txt")
     Patient.s = s1
     MsgBox (s1)
     
     Patient.sys_Save
     Patient.sys_Close
     Set Patient = Nothing

End Sub
```

画面イメージは次の通り。この例ではVBAでの関数の呼び出し方を示すために、少し回りくどくObjectScriptでファイルを読み込んでCache'にsys_Saveしていますが、ファイル操作だけならObjectScriptの中で完結すればOKです。なおActiveXだと、.NETのように再度コードを読み込む必要がない(!)ので、コード開発はとても快適です。画面を伴うDBのプロトタイプ開発ではExcelVBA-ActiveX-Cache'ObjectScriptは最高の環境かもしれません。

![20180831-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/3e223d2f-69e9-710d-6460-9398799f54b8.png)
liタグでよく使う1とか2とかをcssで連番に表示させる

リストタグ`<li>`をコーディングするときによくあるのが

1. 番号付きリスト
2. 番号付きリスト
3. 番号付きリスト

とか上のような番号付きのリスト。

原稿のコピペでなんとなく直接書いてたのですが調べたらcssで自動的に番号を振ってくれるんですね〜
早速使ってみました:wink:

### HTML
```HTML
<ol class="list_number">
  <li>
    <p>テスト見出し<br>ダミー文章</p>
    <p>ぶんは外のおじぎ間会がねずみを教わっみみずくたた。またどう変ましですというゴーシュませなく。</p>
  </li>
  <li>
    <p>テスト見出し<br>ダミー文章</p>
    <p>いいかげんたなのましはでしそしてゴーシュのばか汁の中からはにわかに生意気ましでして、</p>
  </li>
  <li>
    <p>テスト見出し<br>ダミー文章</p>
    <p>これじゃ火花を落ちれものないた。</p>
  </li>
</ol>
```

### css
```css
.list_number {
  counter-reset: number;
  list-style-type: none;
  padding: 0 16px;
}
.list_number li {
  position: relative;
  border-top: 1px dashed #5fbcff;
  margin-top: 0;
  line-height: 1.2;
  padding: 16px 0 16px 53px;
}
.list_number li p {
  margin: 0;
}
.list_number li:before {
  position: absolute;
  top: 25px;
  left: 0;
  counter-increment: number;
  content: counter(number);
  display: inline-block;
  background: #5fbcff;
  color: #fff;
  font-weight: bold;
  font-size: 20px;
  border-radius: 50%;
  width: 35px;
  height: 35px;
  line-height: 35px;
  text-align: center;
}

```

###コレが肝
`counter-increment`

連番で表示させるために`counter-increment: カウンタ名（自由に決めてOK）;`
表示形式を指定（今回は数字の連番）`content: counter(number);`


## 出来上がり
:relaxed:
<p data-height="265" data-theme-id="0" data-slug-hash="mGRwJO" data-default-tab="css,result" data-user="kikuchi" data-pen-title="cssで連番を表示させる" class="codepen">See the Pen <a href="https://codepen.io/kikuchi/pen/mGRwJO/">cssで連番を表示させる</a> by naoko kikuchi (<a href="https://codepen.io/kikuchi">@kikuchi</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


## 参考サイト
 [【CSS】counterを利用した自動ナンバリング](https://design-studio-f.com/blog/css-counter-automatic-numbering/ "【CSS】counterを利用した自動ナンバリング")

[自動で連番付与できるCSS。counter-incrementの使い方](https://liapoc.com/counter-increment.html "自動で連番付与できるCSS。counter-incrementの使い方")
任意の期間の、dateオブジェクト配列を生成する。


「１日ごと」や「１時間ごと」などの、日付や時刻のシーケンスを配列として生成します。

```js
 //１日ごと
d3.scaleTime()
	.domain([new Date(2018, 8, 1), new Date(2018, 9,1 )])
	.ticks(d3.timeDay, 1) //区間指定

//2日ごと
d3.scaleTime()
	.domain([new Date(2018, 8, 1), new Date(2018, 9,1 )])
	.ticks(d3.timeDay, 2) 

//月曜日ごと	
d3.scaleTime()
	.domain([new Date(2018, 8, 1), new Date(2018, 9,1 )])
	.ticks(d3.timeMonday, 1)	

//1時間ごと
d3.scaleTime()
	.domain([new Date(2018, 8, 1), new Date(2018, 8,2 )])
	.ticks(d3.timeHour, 1)
```


出力結果
<img width="469" alt="D3 ver.4 2018-08-31 17-40-35.png" src="https://qiita-image-store.s3.amazonaws.com/0/2832/c9bcc6e1-4ff4-4c9a-cfba-7bac11c85e80.png">
SPSS Modeler on WindowsでUTF-8を扱う

SPSS Modeler on 日本語WindowsはデフォルトではShift JISの文字コードが使われます。UTF-8のデータを読み書きしたい場合には設定が必要です。

■試した環境
Modeler 18.1.1
Windows 10

##1. UTF-8のデータを読む場合

フラットファイルのインポートノードでUTF-8のデータを開くと以下のように文字化けします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/b7ce56a2-0709-b664-c23e-4e56447e0f44.png)

エンコードをUTF-8に変更すると文字化けが解消します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/a864a94e-14df-6546-e122-3b7f0041c6f1.png)

##2. UTF-8のデータを書く場合
フラットファイルのエクスポートノードで、やはりエンコードをUTF-8にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/2b36e7a7-e31a-9689-80b7-f7962cbdf745.png)

出力結果をバイナリエディタで見てみるとUTF-8で出力されているのがわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/abb9ac5d-4000-0a1e-8353-0265642b8a2f.png)

## 3.入力も出力もUTF-8の場合

入力も出力もすべてUTF-8であるという場合にはストリームのデフォルト設定を変えるのが便利です。
ツールのストリームのプロパティのオプションを開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/6b339edd-f60a-4250-6780-e77d2dda40a1.png)

オプションの全般の中のエンコードでUTF-8を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/69cebfbb-3f3f-7d85-06fd-e5609f88819a.png)

この設定がしてあるとこのストリームのデフォルトがUTF-8になりますので、UTF-8のファイルを開いても文字化けになりません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/3447ed20-dd81-3fa4-af2a-e1fda4b22882.png)

## サンプルストリーム

https://github.com/hkwd/spsssample/tree/master/utf8

## 参考
IBM Knowledge Center - IBM SPSS Modeler 内での Unicode のサポート
https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.1.1/modeler_mainhelp_client_ddita/clementine/unicode_support.html

なお、Mac版のModelerでは「システムのデフォルト」もUTF-8になりますので、読み書きはUTF-8になります。逆にShiftJISのデータはあらかじめUTF-8に変換しておく必要があります。
ASP.NET MVCのMapRouteとMapMvcAttributeRoutesを併用するとどうなるか

# 結論
- RouteConfigの設定の順序によっては併用にならない。
- Route属性の指定があればそちらでルーティングされ、MapRouteの方は使用されない。
- Route属性の指定がなければMapRouteのルールが指定される。

# 前提知識
ASP.NET MVCでWebアプリのプロジェクトを作った時、デフォルトのルーティングルールはApp_Start/RouteConfig.csに書かれています。内容は以下の通り。

```C#
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
```

しかしこれは柔軟性が低いです。まずidはすべてのハンドラに必要ではありません。しかしこのままではすべてのハンドラでid付きでアクセスできてしまいます。そのような違いをMapRouteをモリモリ追加していくことで表現できるんですが複雑で読みづらくなります。デフォルトのまま運用しているところも多いのでは。

もちろんこれだけでなく、属性ベースのルーティングが採用できます。以下の通り。

```C#
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapMvcAttributeRoutes();
        }
    }
```

MapMvcAttributeRoutesを指定すると、Route属性やRoutePrefix属性が指定でき、パスを任意のパラメータとして指定できるなどとても便利です。

というわけで属性だけでいいじゃんと思うんですが、これを併記したらどうなるかを調べました。なんとなく両方のパスでアクセスできるんじゃないかと考えたんですがどうなるでしょうか。

# パターン１
MapRouteの後にMapMvcAttributeRoutesをコール。

```C#
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
            routes.MapMvcAttributeRoutes();
        }
    }
```

- MapRouteは有効
- Route属性が付いている場合は<b>どちらで設定したパスでもアクセス不可</b>
- RoutePrefix属性は無視

というわけで併用できません。

ちなみにRazorの@Html.ActionLink()はアクセス不可でも動いてくれます。MapRouteの方で。だからなんだという感じですが。

# パターン2
MapRouteより先にMapMvcAttributeRoutesをコール。

```C#
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapMvcAttributeRoutes();
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
```

- MapMvcAttributeRoutesは有効
- Route属性がない場合のみMapRouteが有効
  - Route属性がある場合はMapRouteのルールではアクセス不可
  - RoutePrefix属性のみが付いている場合はRoutePrefix属性は無視される

併用できました。Route属性の有無でどちらが適用されるか変わります。片方しか適用されないのは理想的ですね。ただしRoute属性なし,RoutePrefix属性のみだとRoutePrefix属性が無視されるので、うっかりRoute属性を省略するとPrefix通りにアクセスできません。
@Html.ActionLink()もちゃんと動いてくれます。

上記の通りできるとはいえ、併用すると書く場所が発散しちゃうのでできるだけMapRoute側をシンプルに保つなどの工夫が必要です。

# おまけ
調べるきっかけになった記事。
https://exceptionnotfound.net/attribute-routing-vs-convention-routing/
未経験から3ヶ月でアプリケーション作ってみた

# どんなものを作ったのか
未経験から、Java、MySQL、jQuery、Springなどを勉強して
アプリケーションを作りました。

よくあるホームページって感じです。
機能としては、会員登録・会員情報変更・予約システム・管理者ページ etc... です。

予約画面の部分だけ添付します。

GitHubにもすべてアップロードしています。
興味のある方は[**こちら**](https://github.com/connectcrew-ishii/DanceSpring)から見てください。

![shcedule.png](https://qiita-image-store.s3.amazonaws.com/0/285564/95c80dc2-8656-0cf3-a439-b35305411dec.png)

空いているコマの「◎」を押すと、、
![shcedule1.png](https://qiita-image-store.s3.amazonaws.com/0/285564/b17239bc-9ec0-c5d0-fc35-83c0af722665.png)
こんな感じに非同期で予約完了まで出来るようになってます。

CSSはホットペッパーを参考にしました。(参考というよりはむしろ、、、)
2枚目の画像で表示されているダイアログボックスは、jQuery-uiでググれば出てきます。

# 3ヶ月やって感じること
正直な感想は、楽しい！！
その一言に尽きます。
納期やらなんやらは無いので、当たり前ですが、、、


今後は、オブジェクト指向を意識して、より次に繋げやすいプログラムを組んでいきたい。
イラストロジックをときたい

下書きが邪魔なのでこれも公開

なぜときたいか・・・
それは徐々にできていく過程をジーって見てたいからさ。

##イラストロジックルール周り
イラストロジックのルールは
<a href="http://www.puzzler.ne.jp/solve/logic.html" target="_blank">お絵かきロジック（モノクロ）</a>
<a href="http://www.puzzler.ne.jp/solve/colorlogic.html" target="_blank">お絵かきロジック（カラー）<a/>
ここがすごくわかりやすい。
例題もすごくちょうどいいのでちょっと借りてきてしまった・・・。

カラーになるとまたちょっとルールが違う箇所があるのですが、
カラーの方がヒントが多く解くのが楽です。手動で解くときね・・・
違いは色が違うときはx一つ挟まないってこと。

##うーん、まずは実装方針を立てる
これが意外と厄介で・・・。
あくまで私の考え方を私がテキトーに解いてくので・・・あしからず

###まず最初に・・・
とりあえず最初に10マスあって8の場合、こんな風に塗れる
<img width="200" alt="スクリーンショット 2018-03-05 19.41.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/c2c293f7-a7d8-11c6-303d-a95abec5d3a7.png">

また、2 1 2 1の場合もこんな風に確定する
<img width="30" alt="スクリーンショット 2018-03-05 19.41.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/6851b030-2c88-3fca-8e21-faa77fac8be7.png">

最初はとりあえずこれかな。

これを実行するとこうなる
<img width="300" alt="スクリーンショット 2018-03-05 19.44.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/5f6ada81-b39e-6b83-9a8e-07bf67851947.png">

##次・・・
さてここからが問題だ。
できることは二つかな。

###端っこ仮置き作戦
上下左右の端のラインについて、仮置きして、逆のラインをそこからのばし、
端から一つ隣のラインで矛盾が発生すればそこはxが発生する
今回の場合下のラインはそれで4マス確定する
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/55d112b3-3f8f-ffde-d516-b8e6e1847106.png" width="300">

他の位置だとどれも上のラインの1の条件を満たさない
![スクリーンショット-2018-03-05-19.58.16.png](https://qiita-image-store.s3.amazonaws.com/0/46444/64d6c996-4a0e-4d93-17c5-4df6e62686fd.png)

これを一回上下左右やろうかな。端っこが少しわかるのって結構楽なのよね。

###確定探し
一列見て、ぬれる場所があれば塗る　矛盾が発生する場合xをつける
これは一列ずつ見ていくだけ。
<img width="374" alt="スクリーンショット 2018-03-05 19.45.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/d08ad6a2-bc65-f84e-be40-d4a55bffc6a5.png">

基本的にこれをループさせる。
これで1マスも進まないやつは・・・次

###難しいやつ
上記確定探しループで進捗が進まない場合、
仮置きエラー作戦かな・・・。
ユーザーに改変してほしくない処理をJavaScriptで書いてしまう危険性について

ユーザーに改変してほしくない処理をJavaScriptで書いてしまうことは、とても危険です。なぜ危険で、どれほどクリティカルな問題なのかということを書いていきたいと思います。

## ユーザーを信用してはいけない

まず、大前提としてプログラミングの世界ではユーザーから入力されるデータや送られてくるデータを信用してはいけません。もちろん大半のユーザーは悪さをしようとは考えていないと思いますが、中には悪さをしようとするユーザーもいます。そんなユーザーが悪意のあるスクリプトを送ってきたり（XSS）、SQLインジェクションなどで攻撃してきたりした時に、何も対策をしていないとデータを改変させられたり、抜き取られたりしてしまう危険があります。対策としては、エスケープ処理をしたりプリペアードステートメントを利用したりすればいいのですが、今回はXSSなどの対策の話ではないので割愛させて頂きます。

## 入力フォームからの入力だけ注意すればいいわけではない

入力フォームの値はエスケープ処理などをしてサニタイズしていたとしても、JavaScriptのコードに脆弱性があったりするとそこから攻撃されてしまう危険があります。基本的に改変されたくないコードをJavaScriptのコードに書いてはいけません。なぜならJavaScriptのコードはクライアントサイドで書き換え可能だからです。デベロッパーツールなどを使えば任意で書いたコードを実行させることが簡単にできてしまいます。

## 実際にデベロッパーツールからスクリプトを実行させてみる

実際にGoogle Chromeのデベロッパーツールを利用してスクリプトを作成してみましょう。
### アラート表示

1. Windowsの場合はF12、Macの場合はOption + Command + Iでデベロッパーツールを表示させます。
2. Consoleを選択して、スクリプトを記述してenterキーを押す。
![dev.gif](https://qiita-image-store.s3.amazonaws.com/0/205865/339323e1-29e4-0137-29ba-88bf539b7bad.gif)

これだけで、任意のスクリプトを実行させることができてしまいます。

### jsファイルの改変

jsファイルの書き換えの場合は、Sourcesという項目からファイルを選択して書き換えることができます。クリックイベントなどの箇所を書き換えたい場合は、下記のように要素を選択してからEvent Listenersという項目を選んでjsファイルをクリックすれば、クリック処理の箇所に飛ぶことができます。（すごく便利）

<img width="1275" alt="dev_js.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/205865/3074f705-f994-6a96-c4b2-5374297d03cb.jpeg">

クリック処理の箇所に飛んだ後に、既存の処理を書き換えてCommand + S（Macの場合）かCtrl + S（Windowsの場合）で保存すれば処理を改変させることができます。

![dev_js.gif](https://qiita-image-store.s3.amazonaws.com/0/205865/e3fe7597-e95e-f5ee-5d13-4d76ab903ed5.gif)

上記のように、jsの処理は難読化などがされていなければ簡単に書き換えることができてしまいます。




## 脆弱性のあるプログラムの例

記事評価をさせるために`いいねボタン`や`役に立ったボタン`などを用意して、評価された数を表示するようなものがあった場合を例にあげてみます。

1. ページの`いいねボタン`を押した際にajax（記事IDや評価の累計数をjsから送る）でサーバと非同期通信。
2. サーバサイドでjsから送られたデータを元にDB情報を更新（評価数もjsから送られた累計数を元に更新）。
3. 正常に更新処理が行われたことをjsで受け取り、現状のページに表示されている評価数をインクリメントして表示する処理をjsで行う。

上記のような処理があった場合、これはクリティカルな問題があります。ポイントは、 **評価数の累計もjsから送られてきた値を元にしてしまっているところです。** これでは、jsで送る値を改変してしまえば評価数を0にすることなどができてしまいます。

## まとめ

基本、クライアントサイドの処理は簡単に改変できてしまいますので、ユーザーに改変してほしくない処理をクライアントサイドで行うことはとても危険です。そういった処理はサーバサイドに書くようにしないといけないと思います。ちなみに、`Cookie`なんかも簡単に書き換えられますので、改変してほしくない値は保持させないようにしましょう。重要なことは **ユーザーには悪人がいるかもしれないということを常に忘れずにプログラムを書いていくことだと思います。** 逆に世の中の人がみんな善人ならクライアントサイドに書いても別に問題ないんですけどね（笑）。

## 参考

- [ページのJavaScriptを動的に書き換えて実行する - Qiita](https://qiita.com/sasaplus1/items/3d08c58b2129f6bba01c)
- [「世界最悪のログイン処理コード」を解説してみた - Qiita](https://qiita.com/YSRKEN/items/0095cf75be3f607b0f98)
Clovaスキルの統計を確認する

Clovaスキルをリリースしてどれぐらいのユーザーが利用しているのかを確認するための機能が最近リリースされました。
結構詳しくカテゴライズされた情報が見られるので面白いデータが見られそうです。

統計で確認したスキルは弊社からリリースされている「BMI測定」で確認しました。
※URLはスマホから確認できます。
https://clova-skill-store.line.me/appbridge?target=extensionDetail&extensionId=jp.co.ienter.bmi

# 統計を確認する
統計列が追加され、確認リンクを押すとスキルの統計ページへ遷移できます。

![s100.png](https://qiita-image-store.s3.amazonaws.com/0/154355/c3e6a418-3ae7-032f-1d7f-1bcaf1b24f2c.png)

# サマリーを確認する
［サマリー］［ユーザー］［発話］［インテント］の4つのタブが表示されます。
サマリーは様々な合計値を確認することができます。

### サマリー:前日ユーザー数
前日にスキルを起動したユーザー数を確認できます。
5人なのでまだまだですね。。。

![s110.png](https://qiita-image-store.s3.amazonaws.com/0/154355/bea2121c-77ed-d6bc-f478-31ad07c4682c.png)

### サマリー:過去7日間
過去7日間どれだけのユーザーがスキルを起動したかが確認できます。

![s111.png](https://qiita-image-store.s3.amazonaws.com/0/154355/b3d33499-7e7a-785b-542f-6c61cff4e3db.png)

### サマリー:過去7日間に使われたインテント（上位10件）
よく使われているインテントを確認できます。
これを見ると意外とヘルプ（Clova.GuideIntent）が発話されていることがわかりますね。

![s112.png](https://qiita-image-store.s3.amazonaws.com/0/154355/1a30d22a-1556-6916-b033-d8d250a27a8b.png)

# ユーザーを確認する
スキルを利用したユーザー数やユーザーが使っているデバイスを確認することができます。

### ユーザー:ユーザー数
その日に何人スキルを起動したかが確認できます。

![s120.png](https://qiita-image-store.s3.amazonaws.com/0/154355/fe26c212-6635-2846-5357-7f75a71cffef.png)

### ユーザー:デバイス数と割合
使用しているデバイスが確認できます。やはりClova Friends Miniの利用が多いですね。
デバイスの割合もグラフで表示されます。
何故かデバイスの内訳の色味が一致してない気持ち悪さはありますが、その内修正されるでしょうｗ

![s121.png](https://qiita-image-store.s3.amazonaws.com/0/154355/0d366319-f72a-4189-5b00-b082ba2965a1.png)

# 発話を確認する
どれだけ発話されたかを確認することができます。

### 発話:発話数
日毎だけでなく、時間ごとに確認することもできます。夕方以降にスキルを起動することが多い傾向があることがわかりますね。

![s130.png](https://qiita-image-store.s3.amazonaws.com/0/154355/f068b6d7-54ee-62e7-fbc8-8fed82457fec.png)

### 発話:インテント分類時の精度が低い発話(前日分)
認識できなかったインテントの発話を確認することができます。
これを見ると、単位の「cm」に反応していないことがわかります。対話モデルのインテントに「cm」にも反応すべきですね。

![s130_001.png](https://qiita-image-store.s3.amazonaws.com/0/154355/de57cf24-167b-7026-6050-da63200db5a2.png)

# インテントを確認する
どのインテントがどれぐらい利用されているかを確認できます。
細かく色分けされてとても分かりやすいですね！

![s140.png](https://qiita-image-store.s3.amazonaws.com/0/154355/e60a36cb-8d67-b313-f809-e97a7221cbe4.png)

#まとめ
GoogleアシスタントやAlexaにも統計ツールがありますが、ここまで分かりやすいのはClovaだけだと思います。
皆さんもスキルをリリースして統計ツールを活用してみましょう！

システム化のご検討やご相談は弊社までお問い合わせください。
https://i-enter.co.jp/contact/
Excel VBA 普通の電卓の通りに表示させることに半分・答える

#Q11Qの記事が引用された奇妙な相談
[Excelで掛け算の計算が合わない](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10173652420)
>Excel2016を利用しております。
電卓で計算すると
1117000÷12×6＝558499.999999999...
という計算なのですが、Excelで計算すると答えが
1117000÷12×6
＝558500.000....
になります。小数点以下が勝手に四捨五入されているようです。
表示形式をいじったりしましたが、そもそも計算結果の小数点以下が存在しないような感じです。
 この違いだけでも大きくこの後の計算がかわってくるので困っています。
過去質問を検索しても表示形式の事ばかり出てくるので、***計算過程でかってに四捨五入されない方法がありましたら教えていただきたいです。 ***

##BA Best Answer
>＞Excelで掛け算の計算が合わない
これは割り算が原因です・・・
÷12×6
は ×2
1117000÷2＝558500
小数数点以下ない・・・
(中略)
しかし小数点以下のある数値では簡単式でも
違う結果になります
演算御座
https://eip.econ.kanagawa-u.ac.jp/eip/excel-calc-error.html
http://qiita.com/Q11Q/items/84b380b20ef51eca929c
>>all********さん　2017/5/212:48:12
参考に
[EXCELの単純な計算に誤差があるようです。12.3-12=0.3000000000000010000となり0.3にならず困っています。もし、どのEXCELも同じ現象なら大きな問題です。](https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_excel-mso_windows8/excel%E3%81%AE%E5%8D%98%E7%B4%94%E3%81%AA%E8%A8%88/e5421c34-8053-4132-a0a6-14729e505376)

>>yuu********さん
2017/5/212:53:01
早速のご回答ありがとうございます
ご回答とリンク先を読ませていただきました。

>>***大変わかりやすく、ほとんど初心者の私でも、理解でき、今求めている答えをExcelで導き出すことは難しいと納得することが出来ました。***
おかげさまで無駄な時間を削減することができそうです。ありがとうございました。


##BA以外

>gru********さん(カテゴリマスター) 2017/5/212:27:11
12で割って6をかけるんだから、2で割ったのと同じになるのが正しいんです。電卓は最後まで確認して最適化せず途中の割り切れない部分をぶった切っているので、そういう間違った結果になります。Excelの勝ちですね。
>>    yuu*******\*さん    2017/5/212:37:27
    早速のご回答ありがとうございます。
    確かにおっしゃる通りなのですが、どうしてもこの計算過程を通ったうえでこの計算結果を出さないといけない事情がございまして…。***
    Excelの仕様ということですね。ありがとうございます。

#だいぶ間違いすぎだろ
####まず演算御座ってなんだよ
誤字がひどい
####電卓のアルゴリズム
1117000÷12×6＝558499.999999999...
これは右から÷12=a
a×6
と計算していくから
####これは仕様であって勝ち負けではない
なんなのこのカテゴリマスター

##しかし実はExcelで再現するのは難しい

##コードの中では簡単だが
CDec (CDec(1117000 / 12) * 6)
電卓通りにするにはVBAを使う以外思いつかない
質問者の注文通りに結果を出すにはCDecで計算のステップごとに囲むのが有効

```vb
Debug.Print CDec (CDec(1117000 / 12) * 6)
```

##結果をセルに入れると変換されてしまう

```vb
Sub test()
Range(ActiveCell.Address).value= CDec (CDec(1117000 / 12) * 6)
End Sub
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/51e13140-cf63-d1a9-630e-9d3230db6677.png)

## クレーマー臭を感じる
一体これなんの意味がある質問なんだろう…まず、たいへんわかりやすいというのはウソだな。

>表示形式をいじったりしましたが、そもそも計算結果の小数点以下が存在しないような感じです。
この違いだけでも大きくこの後の計算がかわってくるので困っています。

確かにこの値をそのまま入れても自動調整されてしまう。そら後ろが0になるのは当然だ。
しかしその程度の素人がなぜこんな電卓をExcelでシミュレートしようというのか。
***クレーマーが電卓の誤差をあげつらうために計算式をExcelでまとめ、電卓会社へ突っ込むのではないか。***

###文字列にしてみる

```visualbasic

Sub cdccalcStr()
'計算結果をActivecellに入れる
'ただし文字列になる
Dim R As Range
Set R = Range(ActiveCell.Address)
Dim buf As String
R.Value = "'" & CDec(CDec(1117000 / 12) * 6)
End Sub
```



#演算誤差で得た知識を活用する
Excelの内部演算が15桁なら、その下の位で循環小数や無限小数を計算して調整するのではないか？
ならば           して　　　　　　　されないようにすればいいのでは？

```vb

Sub cdccalc()
Dim R As Range

D
buf = CStr(CDec(CDec(1117000 / 12) * 6))
            L  t(   ,   )
R.          = 
End Sub
```
#まとめ
　まず計算法則を理解していない。理解していればExcelの方が正しい。また、無理に電卓の結果を通らなければいけない計算はない。
　あまりにも不可解すぎるし、いやな予感がするので半分コードを示した。
際限なくただで要求をエスカレートする可能性が多いから。
　この質問者のずれっぷりは薄気味悪いので、これ以上は書かない。
　***しかしこれ以上は10億円積まれない限り応じられない。***
Spring Boot でハマったこと

# Entity関連
- @ OneToMany
- @ ManyToOne

この辺りが混乱したし、うまくいかないことが多々あった。

# OneToManyとは
Entityの1対多の関係のこと。

例）一人のユーザーが、何かを5件予約したとする。
DB上では、userテーブルとshceduleテーブルに分かれているものとして、
1ユーザーに対して、5件の予約が入っている。
この状態が1対多の関係である。

userテーブルのPKとscheduleテーブルのFKをくっつける感じ。
実際使ってみると、いちいちSQL発行しなくて済むので、ラクだと感じた。

~~~User.java
@Entity
@Table(name="member")
@Data
@NoArgsConstructor
@AllArgsConstructor
@NotNull
public class User implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;　　 ←これがPK(Primary Key)
    .............
	@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER,orphanRemoval=true)
	@JoinColumn(name="user_id")
	@OrderBy("date")
	private List<Schedule> scheduleList;
}
~~~

# ManyToOneとは
OneToManyの逆ですね。。。

上の例で言えば、予約1件1件に対して、誰が予約しているのかという情報を持つことになる。

~~~Schedule.java
@Entity
@Table(name="schedule")
@Data
@NoArgsConstructor
@AllArgsConstructor
@NotNull
public class Schedule implements Serializable{
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
	@Column(name="user_id")
	private int userId;　　←これがFK(Foreign Key)
	private String date;
	private String time;
    ............
	@ManyToOne
	@JoinColumn(name="user_id",nullable = false,insertable=false, updatable=false)
	private User user;
}
~~~

# まとめ
今後もっと詳しく書いていこうと思うが、一旦はこんな感じで。
c# ログイン認証からのダウンロード方法について

自動ダウンロードプログラムの作成
言語:C# 開発環境:Visual Studio 2017

実施動作
①ログインページにアクセス(HTTPS)自己証明書使用
※自己証明書エラーが必ず出ます。インストール等の解決方法はNG
② ログインIDとパスワードを入力してSubmitをクリック
※ログインIDとパスワードのinputはFrame(1)にある為、メインページにはログインソースはなし
③ログイン後、ダウンロードリンクのURLでファイルのダウンロード

上記を行えるプログラムを作成したいのですが、いい方法が思いつきません。
同じプログラムの内容で質問していますが、そもそもWebbrowserを使わずとも出来るでしょうか。
https://teratail.com/questions/144068

問題点
①自己証明書が自己証明の為、セキュリティエラーが表示される(台数の関係上1台１台インストールしていく方法はNGでお願いします)
②ログインページがFrameをしており、メインページにはログインソースはなし
③ログイン後は特定のURLでファイルがダウンロード可能

検索等してもhttps + Frame先操作　+ ダウンロード　を組み合わせたものは見つけられませんでした。
初心者の為、お手柔らかにお願いいたします。
オブジェクトのプロパティと変数

##JSにおいてプロパティと変数は同じもの。

* オブジェクトはプロパティの集合体。プロパティは、名前（キー）と値のペアである。
* 変数を宣言し格納するときは、キーと値のペアを指定している。

```js:js
const obj = {x:3, y:5}; //キーと値のペア
const value = 1; //キーと値のペア
```

オブジェクトobjのプロパティとして x = 3, y = 1 が存在するのと同じように、value = 1 もまたオブジェクトのプロパティとして存在している。
 
=>  **グローバルオブジェクトのプロパティ**に存在している。

以下にその証明を書く。

```js:js
const obj = {x:3, y:5};
const value = 1;

console.log(obj.x) //3
console.log(this.value) //1
//トップレベルコードのthis参照は、グローバルオブジェクトを参照している。
```
つまり、変数もまたグローバルオブジェクトのプロパティである。



##グローバル変数とローカル変数

|    変数名    | ローカル変数                                                 | グローバル変数                                 |
| :----------: | :----------------------------------------------------------- | :--------------------------------------------- |
|     意味     | 関数内で宣言した変数。関数の引き数。                         | 関数の外（トップレベルコード）で宣言した変数。 |
|    参照先    | その関数の中でのみ参照できる。                               | プログラム全体からアクセスできる。             |
| オブジェクト | Callオブジェクト                                    | グローバルオブジェクト                               |
|  変数名解決  | Callオブジェクトのプロパティ、トップレベルコードのプロパティ | トップレベルコードのプロパティ                 |
*注意点として、if文などで使われるブロックスコープはスコープを持たないので注意。*


###Callオブジェクトについて
Callオブジェクトとは、**関数が呼ばれたときに暗黙に生成されるオブジェクト**のこと。そしてローカル変数とは、暗黙に生成されるオブジェクトのプロパティである。そのためローカル変数はCallオブジェクトの生存期間のみ利用可能である。

ただし上記には例外がある。それが**クロージャ。**
クロージャでは、関数を抜けたあともローカル変数は存在し続ける事ができる。


###変数名の解決
コード上に変数名を書いたときに、その値を探すことを変数名の解決という。
ローカル変数は、外側に向かって関数内のCallオブジェクトを探しはじめ、最後にグローバルオブジェクトのプロパティを探す。


##変数とプロパティの存在チェック

宣言していない変数は　ReferenceError
存在しないプロパティへアクセスすると、undefined

```js:js
console.log(x); //"x is not defined"
console.log(this.x); //undefined 

//変数aの判定チェック
var a = 10;
if('a' in this) {
  var b = a;
} else {
  var b = 7;
}
```
NTT TECH カンファレンス#3

##■入門WebAuthn：安全・便利な新しいWeb認証方式
Speaker：NTTコミュニケーションズ　能島良和（元CW）

Web Authentication仕様とは
認証サポートのソフトウェア
生態情報をローカル認証とするメリット
生態情報をサーバに送るまでに攻撃を受けるリスクがある

【HP概要】
3月にW3Cで勧告候補になったWeb Authentication仕様。生体認証による利便性と、仕様レベルで組み込まれたフィッシング対策による安全性が特長の新しいWeb認証方式です。
如何にしてWebAuthn仕様が利便性と安全性を両立しているか、サーバーサイドをOSSライブラリとして実装して得られた知見を元に仕様を解説し、また、ブラウザ、認証デバイスの対応状況についても紹介します。

【Speaker概要】
能島 良和 - NTTコミュニケーションズ
VerioではApache CloudStackの開発、NTTコムウェアではSpringベースのWebアプリケーションフレームワーク導入PJ支援に従事。
現在はNTTコム クラウドサービス部所属。休日プログラマー。

##■細かくて伝わらないWebRTC API
Speaker:岩瀬 義昌

WebRTC（契機：Skype　→　ただ、恐ろしく実装が面倒）
→JavaScriptがかければできる
　音声と映像、データが簡単の通信が実現できる

Chromeのくそ仕様があるので、FireFoxでも試してみてFireFoxで試してみて上手くいけばコードがChromeの仕様でいじめられていることがわかる

IPv6の世界は直ぐそこにある
・北米にかなり主流
・AppleもIPv6対応しないと審査落す
→ DNS64+NAT64：IPv4とv6を上手く変換してくれる
　DNS64+NAT64の欠点
　　WebRTCはFQDNじゃないので
　　AndroidOSのなかにCLATデーモンがあるので、こいつがIPv4（端末内）からIPv6（端末外）に変換する

現状WebRCT1.0が策定された
1.0のAPIはブラックボックスだった
NVは小分けしていく→network,transport,media

【HP概要】
W3C WebRTC APIの非常に細かい動作、イベントの発生について解説します。必要に応じてブラウザのソースコードなどを参照しつつ解説します。
WebRTCのAPIが頭に入っている前提であるため、上級者向けのセッションとなります。
【Speaker概要】
岩瀬 義昌 - NTTコミュニケーションズ
WebRTCのCPaaSであるSkyWayのTech Lead。インフラからWebRTCまでやる何でも屋。

##ブロックチェーンはどう役に立つのだろうか？
Speaker：田所 貴弘 - NTTコムウェア

blockchainの特徴
１．特有のdata構造
　名の通りblockとchainで構成されている
２．Peer to Peer
３．Consensus algorithm
４．hash化/電子署名

BlockChainのすごさ
１．改ざん困難
２．管理者無しで価値移転が可能
３．高いSystem可用性
４．traceability



【HP概要】
仮想通貨取引の中核技術として昨今話題であるブロックチェーン技術については、仮想通貨関連に留まらず、応用性と高いポテンシャルが世の中で期待されているものの、サービスとして確立しているものはまだまだ少ない印象です。そこで、
そもそもどんな技術なのか（概要）
どのようなメリットがあるのか（特徴）
今の世の中の動向（利用事例）

を簡単にまとめるとともに
・私個人でブロックチェーン技術を活用するならという視点で
実際試験的に実装してみた方法や環境、そこで得た気付きや課題をご紹介します。
【Speaker概要】
田所 貴弘 - NTTコムウェア
H22入社。NTTコムウェアで開発と営業をで経験（およそ半々）、現在は営業担当。ブロックチェーン技術に興味を持ち、個人で諸々調べたり実装したりしてます。
Expressのvalidationについて

# やること
ブロックチェーン以外のネタもたまには書いてみたいですというエントリー

Expressはフレームワークとしては設計思想に口出ししすぎないよう、デフォルト状態だと薄く作られており（って誰かが言ってた）、ベストプラクティス的なものは割と開発者の設計によって異なるのだなあという印象です。

Expressを最初に取っ付くときに色々と迷うものの一つとしてバリデーションの仕組みつくりがあげれられると思います。
ので、今回はその備忘録となります。

# Expressでバリデーションってどうやるんだ・・・
調べると、だいたいexpress-validatorがよく使われているっぽい！
https://express-validator.github.io/docs/
※express-validatorそのものについてはこの記事では詳しく触れません。。。


できればLaravelのformRequestとかみたいに、Controllerに行く前に決着がつくようにしたいぞ。。。

# 公式のサンプル
```js

// ...rest of the initial code omitted for simplicity.
const { check, validationResult } = require('express-validator/check');

app.post('/user', [
  // username must be an email
  check('username').isEmail(),
  // password must be at least 5 chars long
  check('password').isLength({ min: 5 })
], (req, res) => {
  // Finds the validation errors in this request and wraps them in an object with handy functions
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(422).json({ errors: errors.array() });
  }

  User.create({
    username: req.body.username,
    password: req.body.password
  }).then(user => res.json(user));
});
```
ふむふむ・・・わかりやすい・・・

が・・・・

公式ドキュメントの例としては完全ですが、
実際に組み込んでみる場合、routingに直接validationを書き込むようなことは
あんまりないはず・・・

# こうしよう
※Expressのapp.jsからあらかじめ`route/index.js`を読み込むようにしてあります。

```route/index.js
//module
var express = require('express')
var router = express.Router()

//controller
var testController = require('path/to/testController')

//validator
var testValidator = require('path/to/validator/testValidator')

//routing
router.post('/test', testController, testController.store)

```
こんな感じで、Express的に言うと「ルーター・レベルのミドルウェア」のような感じで、controllerに処理がたどり着く前に、postされたdataに対してvalidationにかけることができました。

一応、validatorはこんな感じ

```testValidator.js
const { check, validationResult } = require('express-validator/check')

module.exports = [
  check('email').isEmail().withMessage('must be a valid email')
];
```
うすい！

# あとがき
Expressはmiddlewearの積み重ねで作り上げて行くものなんだなあと思いました。
vim の neocomplete プラグインをインストール

vim の補完プラグイン [neocomplete](https://github.com/Shougo/neocomplete.vim) をインストールした時のメモ。

環境は以下。

* ubuntu 16.10 (Yakkety Yak)
* vim: version 7.4.1829

[requirements](https://github.com/Shougo/neocomplete.vim#requirements) によると、 `7.3.885+ with Lua` が必須だそうです。

バージョンはOKですが、`with Lua` かどうかはわからないので確認。

`vim` を立ち上げて `:echo has('lua')` してみたら `0` でした。
`1` が返れば `with Lua` ですが `without Lua` なようです。

`with Lua` にするには Ubuntu(debian) では以下のパッケージが必要なようです。

* vim-nox
* vim-gtk
* vim-gnome
* vim-athena

```
$ sudo apt-get install vim-nox vim-gtk vim-gnome vim-athena
```

これで再び `vim` で `:echo has('lua')` すると、、、`1`が!

あとは、`neocomplete.vim` をインストール。
私は vim のプラグインはまだ(?) [NeoBundle](https://github.com/Shougo/neobundle.vim) で管理しているので `.vimrc` に

```
NeoBundle 'Shougo/neocomplete.vim'
```

を追加してOKでした。

[設定サンプル](https://github.com/Shougo/neocomplete.vim#configuration-examples) を `.vimrc` を追記するととりあえず補完が機能しているようです！

その他:

* `neocompete.vim` の設定については今回はインストール編という事で後々。。。。
* `vim` のプラグイン管理は最近は [dein](https://github.com/Shougo/dein.vim) が推奨されてるようですね。いつか時間できたら乗り換えます。
GitHubとSlackを連動させて通知を受け取る@2018年版

GitHubの連携が新しくなったようです。
Appのページでも古いバージョンから移行してくれと通知が来ています。


<img width="1070" alt="Screen Shot 2018-08-31 at 15.45.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/6d7bc8d2-2605-821e-cdd1-b6de4e70f0c4.png">

> This version of the GitHub app is only supported for customers who use GitHub Enterprise. If you’re not a GitHub Enterprise customer, install the upgraded GitHub app.

新しいアプリをSlackに導入します。
前のバージョンではリポジトリごとにConfigurationを作っていましたが、新しいバージョンでは流れが違います。

1. SlackにGitHub Appをインストール
2. GitHub Appで認証を掛ける
3. 通知させたいチャンネルに＠GitHubを招待
4. /github コマンドでリポジトリを購読（Subscribe）

# GitHub Appのインストール

Slackのワークスペースに対してGitHub Appをインストールします。
AppインストールのURLがわからなくなりますが

```
https://example.slack.com/apps
```

的な感じで、ワークスペースのURL＋`/apps`でアクセスします。
そこの「Get Essensial App」を開きます。

その中のGitHubを選択します。

<img width="1013" alt="Screen Shot 2018-08-31 at 15.26.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/f4187b11-21c2-bd09-d66b-d6235a76241f.png">


インストール！

# GitHubで認証させる

Slackのユーザー（Apps）にGitHubが居るので、そこで認証をかけます。

```
/github signin
```
とすると認証用のブラウザ画面が開きます。

認証完了するとこんな感じになります。

<img width="631" alt="Screen Shot 2018-08-31 at 15.25.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/a7f05fdc-4f7c-c46d-1727-dac4d559fc8a.png">


# Slackのチャンネルに招待
@GitHub Appを招待します。

```
/invite @GitHub
```


# リポジトリを購読させる

通知させたいチャンネルで、`/github subscribe`を使って通知をオンにします。

```bash
/github subscribe yousan/ts_ex2 issues, pulls,statuses,public,commits:all,releases,comments,branches,reviews
```

<img width="631" alt="Screen Shot 2018-08-31 at 15.25.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/f7f73f2d-e933-a671-40c0-4f6caba458c3.png">


引数は`GitHubのユーザ名/リポジトリ名 通知する種類`です。

通知の種類は[公式サイト](https://github.com/integrations/slack#configuration)に載っていますが、全部通知するなら下記になります。


```
issues,pulls,statuses,public,commits:all,releases,comments,branches,reviews
```

良いGitHubライフを！
javaのJUnitの簡易メモ

# テストクラスのメソッド説明

前提クラス

	public class TestMethods {

	/**
	 * ブランクチェック
	 *
	 * @param value
	 *
	 * @return ブランク有無
	 * */
	static public boolean isBlank(String value) {
		if (value == null || value.length() == 0) {
			return true;
		}
		return false;
	}

	/**
	 * int値チェック
	 *
	 * @param value
	 * 			文字列
	 * @return int値判定有無
	 * */
	static public boolean isInt(String value) {
		if (isBlank(value)) {
			return false;
		}
		try {
			Integer.parseInt(value);
		} catch (NumberFormatException e) {
			return false;
		}
		return true;
	}
	}

` setUpBeforeClass `
 このテストクラスの最初のテストメソッドが呼び出される前に実行されるメソッド
` tearDownAfterClass `
 このテストクラスの最後のテストメソッドが呼び出された後に実行されるメソッド
` setUp `
 各テストメソッドが呼び出される前に実行されるメソッド
` tearDown `

## org.junit.Assert クラスが持つメソッド
`assertArrayEquaals`
期待値と実績値が等しい場合は正常終了。等しくない場合は失敗終了する
`asertEquals`
期待値と実績値が等しい場合は正常終了。等しくない場合は失敗終了
`assertFalse`
実績値が false の場合は正常終了。true の場合は失敗終了する
`assertNotNull`
実績値が null でない場合は正常終了。null の場合は失敗終了する
`assertNotSame`
期待値と実績値が同じ参照をしていない場合は正常終了。同じ参照をしている場合は失敗終了する
`assertNull`
実績値が null の場合は正常終了。null でない場合は失敗終了する
`assertSame`
期待値と実績値が同じ参照をしている場合は正常終了。同じ参照をしていない場合は失敗終了する
`assertTrue`
実績値が true の場合は正常終了。false の場合は失敗終了する
`fail`
このメソッドが実行されると失敗終了する
 各テストメソッドが呼び出さた後に実行されるメソッド
` testIsBlank `
 テスト対象クラスの isBlank メソッドに対するテストメソッド
` testIsInt `
 テスト対象クラスの isInt メソッドに対するテストメソッド
Google APIの認証の種類

Google APIの認証方法は三種類あるのですが、説明を読んでもいまいち理解できず、触ってみてようやく理解できたので、まとめておきます。認証情報の作成方法については、検索すればいくらでも出るのでそちらを参照してください。

ポイントは、APIを利用するためのAPI認証と、ユーザーデータを利用するためのユーザー認証は別だということです。ここで作成するのは、APIを利用するための認証情報であり、その認証情報の種類が、APIアクセスの中で行うユーザー認証の方法によって変わる、ということを覚えておいてください。

# APIキー
一般的なAPIキーです。APIキーを用いる場合は、ユーザー認証ができないため、一般公開されているデータ（Google Mapなど）にしかアクセスできません。

# OAuth 2.0
よくあるやつです。ユーザー認証をOAuth2で行います。一度は必ずGoogleの認証ページにアクセスして対話的に認証を行う必要があるため、全自動化が必要なサービス等には向きません。コンソールアプリの場合は、APIから取得したURLにアクセスすることで、認証を行うことができます。

# サービスアカウント
アプリ専用のGoogleアカウントを作成し、そのアカウントでユーザー認証を行います。`[アカウント名]@[プロジェクト名+suffix].iam.gserviceaccount.com`のようなメールアドレスが発行され、これをアカウント名として用います。サービスアカウントは、ユーザーアカウントに**代理ログイン**するためのアカウントなので、作成時点ではどこにもログインすることはできません。そのため、APIの利用の前に、ユーザーアカウントとサービスアカウントを紐づける必要があります。この紐づけ作業は、基本的にGoogleの各種サービス（Google Analyticsなど）の管理ページで行います。

サービスアカウントは、キーさえあれば対話的なログイン作業が必要ないため、全自動のサービス等に向いています。

# 使い分け
APIキーは、ユーザーデータにアクセスする必要がない場合に使います。OAuth 2.0は、不特定多数のユーザーのデータにアクセスする必要がある場合に向いています。ウェブサービス等におけるGoogleアカウントでのログインもこれに当たります。サービスアカウントは、特定のユーザーのデータ（自身のアカウントや、会社の顧客など）にアクセスする場合に向いています。ユーザーアカウントにサービスアカウントを紐づけてもらう手間が発生しますが、そのあとは対話的なログインなしにユーザーデータにアクセスできます。
Ubuntu16.04で突然Slackが起動しなくなる

# 問題点
再起動したときにまれにSlack Linux betaが起動しなくなることがある。[公式](https://get.slack.help/hc/en-us/articles/212924728-Slack-for-Linux-beta-)には

1. From the Slack desktop app, click Help in the menu bar.
2. Select Troubleshooting and click Clear Cache and Restart.

とあるが、そもそもアプリが立ち上がらないのでこれを実行することができない。

# 解決策
`rm ~/.config/Slack/SS`を実行する。これでシンボリックリンクが貼り直されて起動することができる:v:

# 参考
MacのTrouble ShootingのTopicに突如現れるUbuntu向けのコメント。まさに神。
http://www.cpierce.org/2015/09/slack-wont-open-or-you-need-to-clear-your-settings-from-a-computer/#comment-3798
React NativeのFlatList

# 自己紹介

- :octocat: yatatsu
- PAY, inc.
- QRコード決済ができるお支払いアプリ「PAY ID」
- Android, iOS, React Native

----

# FlatListとは

- リストを表示するためのコンポーネント
- `Flat` <=> `Section`
- https://facebook.github.io/react-native/docs/flatlist

----

# in Native App...

- UITableView, UICollectionView in iOS
- RecyclerView in Android
- 単純なScrollViewとの違いは？
  - レイアウトの読み込み遅延と再利用

----

# 読み込み遅延
- 表示している部分+前後
- 大量のデータでもスムーズに動く
- スクロールに応じて順次読み込んでいく

----

# 読み込み遅延

 ![image](https://i.gyazo.com/6cdf6106ab28a7e3ac9fa5418f8dc706.png)

----

# in FlatList...
- `VirtualizedList` を継承
- ScrollViewコンポーネントの中にアイテムをレイアウト
- ScrollView→ `UIScrollView` / `ScrollView`
- では遅延されない…？

----

# 遅延される
- ネイティブのScrollViewの上にJS層で実装
- 初回に読み込み+スクロールに応じてバッチで読み込み
- 急なスクロールがあると即座に読み込み
- 読み込み = stateを更新してrender

----

# 実装
- `Libraries/Lists/VirtualizeUtils.js`
    - https://github.com/facebook/react-native/blob/master/Libraries/Lists/VirtualizeUtils.js
- 画面の大きさその他に応じてoffsetとlimitを決め
- `maxToRenderPerBatch`
  - 一回の読み込みバッチでいくつのアイテムを読み込むか
  - デフォルトは`10`
- `updateCellsBatchingPeriod`
  - 読み込みバッチのスケジュール間隔

----

# Performance
- `getItemLayout`
 - 読み込みが間に合わないときにこれが渡されていないとガクガクになる
 - `scrollToItem` / `scrollToIndex` 
    - 読み込み済みのレイアウトまでしかスクロールできない
- `maxToRenderPerBatch` / `updateCellsBatchingPeriod` / `initialNumToRender`
  - 白飛びを防ぎたい
  - 一度にレイアウトするアイテムを増やせる
  - パフォーマンスとのトレードオフ
DMP入門まとめ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/7eb1e4e0-bb31-abad-d6ce-12cc3d06d626.png)

重要だと思った部分を抜粋しつつまとめ

## DMPとは
- データマネジメントプラットフォーム
- **多様で大量のデータを蓄積・統合**し、**リアルタイムに分析**して1人1人の**消費者に最適なタイミングで最適なコミュニケーションとサービスを送り込む**ことができるもの
- 従来の消費者を大括りでしか扱わないマスマーケティングから、マススケールの1to1マーケティングにシフトできるもの(多量で大規模なのに1人1人にあったマーケティング)
- マススケールでの1to1マーケティングを実現するためのベースとなる仕組み

## DMPの役割
主に2つ

- 広告配信対象となるオーディエンスデータを販売する事業者を指す「**オープンDMP**」  
  - 広告配信のために**データそのものが商品価値があるもの**として扱われるもの(**サードパーティデータ**)
- もうひとつは企業が**自社で保有している顧客および将来の顧客の行動をデータベース化**する「**プライベートDMP**」
  - 広告を含むより多くのマーケティング施策のためにデータを活用するもの

 今後のマーケティングの根幹を成すのはプライベートDMP

## DMPを定義する要素
大きく分けると

- データの保管
- データの分析
- データの分割(セグメント)

細分類したワークフロー

1. **顧客ID**、**Webサイト訪問クッキー**、**会員ID**、**ソーシャルメディアIDなど**を統合する。
2. **統合されたデータを分析**し、**クラスタリングを生成**する。
3. 生成した**クラスターを連携するツールにデータをフィードないし交換**する。
4. 生成した**クラスターに属するユーザーデータを可視化**する。
5. 特定ユーザーと類似または**関連づけられるユーザーに対象を拡張**する。
6. **ユーザーセグメントを最適化**し、**セグメントごとのメッセージを最適化**する。
7. ユーザーデータを広告配信に利用し、かつ**広告配信の反応によってデータの精度を高める**

加えて連携できるメディアや企業間でデータを交換する事(オープンDMPと連携)

## DMPがもたらすこと
- 分析単位をページビューからユニークユーザーでできる
  - ユーザーが**適切にリピートしているか**、**購買へ転換しているか**をユーザー数として把握することが可能となる
- **セグメントされたユーザーの重なり**を把握することができる
  - セグメント間の親和性がわかる
- 重複が削除できる
  - セグメントを細分類することで、**セグメント間のユーザー重複を排除**できる

## メディアのDMP利用法
- メディアの分析を**メディア枠単位ではなくオーディエンス単位**で行うこと
- オーディエンスデータを提供すること

## 広告主のDMP利用法
- 自社データの管理・セグメント化
- 外部オーディエンスの購入

## 今までとは違う、DMPによって変わる広告配信
ターゲティング対象を**単一事象分析だけでなく、複数事象組み合わせによって決められる**ようになること

## 広告主のDMP活用ステップ
1. プライベートDMPの構築
2. プライベートDMPへのデータ保管
3. 外部DMPとのデータ・連携分析
4. 内部オーディエンス分析
5. データ分割(セグメント作成)
6. 広告配信連携
7. 広告配信結果フィードバック

## DMPの課題
- データ活用視点の検討ができていないとビックデータの価値密度が低くなる
- ROIが不明にもかかわらず、絶対額は大きくなるリスクの高い投資となる
  - 「分析がビジネスに効く」経験を企業が有し、分析自体の価値を信じられることが不可欠

## データによるビジネス改善のサイクル
- データ収集⇔データ蓄積⇔データ分析⇔施策実施(改善実現)
  - 情報システム部とマーケティング部などで分けられていると、担い方の違いから上手く回らないため「分析」機能の確立が必要
 
## 分析機能確立に必要なこと
1. データの集約とアクセス権確保
  - 分析担当によって一元的に分析可能な状態にすること
2. 実行とのつなぎ込み
  - 分析側のビジネスへの理解だけでなく、依頼側にも分析に関する最低限の理解を醸成すること
3. 経営の理解とコミット

## DMPを扱える組織と人材
- 「データドリブンなマーケティング思考」を全社で共有すること
- 「データドリブンなマーケティング思考」とは
  - データをもって今何が起きているかを把握すること
  - データをもって、その原因を知ること
  - データをもとに、施策「打ち手」を企画すること
  - データによって、施策「打ち手」の効果を予測すること

- 4種類の人材
  - データマネジメントディレクター
  - データアナリスト
  - コミュニケーションプランニングディレクター
  - デジタルマーケティングプランナー

## 印象に残ったワード
#### データに意味や価値を与えるのも取り扱うマーケター次第
#### 自分の顧客が他のチャネルやメディアでは何をしているか知ることが重要

## 書籍情報
横山 隆治, 菅原 健一, 草野 隆史. 顧客を知るためのデータマネジメントプラットフォーム　DMP入門
https://amzn.to/2LJSKnQ


##「DMP」と「CDP」
主な違いは設計思想
**「データを活用し易い形に統合する」**のが**DMP**
**「個人プロファイルを精密に、リッチにしていく」**のが**CDP**
といえそうで仕組みとしては同じ
言葉のトレンドとして**CDP**
https://cdp-integral.com/
https://www.ever-rise.co.jp/adtech-blog/customer-data-platform.html
https://www.ever-rise.co.jp/service/product/integral-core.html
https://www.ever-rise.co.jp/adtech-blog/cdp-how_to_use.html
コネクトクルー　研修

# 研修で行ったこと
・Eclipse(IDE)を使った開発
・MySQL, Microsoft Azureを使ったDB構築
・Python(Jupyter-Notebook)を使っての分析
・Spring Frameworkを使ってWebアプリケーション開発
・CSS(スタイルシート)の扱い方
・JavaScript(jQueryやajax)を用いて、動的な見た目にした

# 参考書籍
- Java
    - 「わかりやすいJava入門」
    - 「新・明解Java入門」
    - 「サーブレット・JSP入門」
    - 「Java言語で学ぶ　デザインパターン入門」
    - 「SpringBoot2 プログラミング入門」

- データベース
    - 「基礎からのMySQL」
    - 「データベースのきほん」
- 分析
    - 「Pythonによるデータ分析入門」
    - 「ゼロから始めるDeep Learning」
- その他
    - 「Excel VBAでデータ分析」
    - 「簡単だけどしっかりわかるExcel VBA」

# 悩んだ点・躓いた点
Javaで、クラスやらインスタンスやらが出てきて、理解に苦しんだ。

自分の理解としては
「クラス」とは・・・何らかの役割をもつもの。
「インスタンス」とは・・・クラスを実体化させたもの。



例えば、、、
学校でテストを行うとする。
「テスト用紙」クラスがあり、問1～問nまでの情報を持っている。
その用紙を配るときに、生徒の人数分「テスト用紙」クラスをnew してインスタンスを作る。
といった感じ。。


# 参考までに
開発したものをGitHubにアップしてあります。
[**こちら**](https://github.com/connectcrew-ishii/DanceSpring)から飛べます。
du の結果について注意点。特に ZFS で、圧縮を効かせているとき。

# 概要

あるシステムから別のシステムにディレクトリをコピーするときに、あらかじめ、 `du -sh ディレクトリ` を実行し、十分な領域があることを確認してから、コピーをした。
コピーが終わった後、コピー先で `du -sh コピーしてきたディレクトリ` をすると、元のサイズより、大きくなった。

# 原因

ZFS の圧縮機能によるものが大きいような気がしているが、そもそもduコマンドの仕様によるところもあると考えられる。。

[ZFS のディスク領域の計上 \- Oracle Solaris の管理: ZFS ファイルシステム](https://docs.oracle.com/cd/E26924_01/html/E25824/gbchp.html)

そこに以下のような記述があった。


>UFS ファイルシステムでは、du コマンドが、ファイル内のデータブロックのサイズを報告します。ZFS ファイルシステムでは、du コマンドが、ディスクに格納されているときのファイルの実際のサイズを報告します。このサイズにはメタデータと圧縮データも含まれます。実際、この報告は「このファイルを削除した場合、どれだけの容量を得られるか」という質問に回答するときに役立ちます。したがって、圧縮がオフになっている場合でも、ZFS と UFS では異なる結果が表示されます。

その後以下のページを教えていただいた
- [ディレクトリ中のファイルサイズ合計値を バイト表示](http://sonic64.com/2004-05-26.html) 

# 教訓

どこか別のマシンにデータをコピーするときには、管理者には、どのコマンドでサイズを図ったかを伝えておいたほうが良い。

バイオインフォマティクスの場合、圧縮がきくかもしれないファイルを扱うことが多いので、特に注意が必要だろう。

# 参考

7バイトのファイルを作ったが、 `du -sh test` をすると、 `1.0K` となっている。
この場合は増えているが、減るケースもあるので、その例を作ることができたら、

```
$ find ./test -type f -printf "%s\n" |awk '{sum += $1; printf "\r" sum };'
$ du -sh test/
512	test/
$ echo -n "1234567" > test/testfile.txt
$ find ./test -type f -printf "%s\n" |awk '{sum += $1; printf "\r" sum };'
7
$ du -sh test/
1.0K	test/
$ tree test
test
└── testfile.txt

0 directories, 1 file
$ 
```

ZFSで圧縮がきいていると、du の結果が減っているように見える例

`dd` をつかって、 `0` を 1G のファイル作ってみた。

```
$ dd if=/dev/zero of=test/1G.dummy bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 1.51057 s, 694 MB/s
$ du -sh test/
1.5K	test/
$ ls -l test
total 1
-rw-r--r-- 1 manabu manabu 1048576000 Aug 31 14:57 1G.dummy
-rw-r--r-- 1 manabu manabu          7 Aug 31 14:52 testfile.txt
$ 
```

1Gのファイルがあるのだが、 `du -sh` では、 `1.5K` となっている。 

圧縮が効いていないファイルシステム(ext4)で実行すると、 1001M(1G) となった

```
$ mkdir test
$ du -sh test     
4.0K	test
$ dd if=/dev/zero of=test/1G.dummy bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.469074 s, 2.2 GB/s
$ du -sh test
1001M	test
```
WEBページ作成によく使う機能等まとめ

下記にWEBページ作成にあたり、よく使うであろうものをまとめます。
気が向いたときに追記していきます。

#ページネーションの実装にはkaminariを使う。 
kaminari:pageメソッドと、kaminari:perメソッドがある。

【参考】[kaminari徹底入門]
(https://qiita.com/nysalor/items/77b9d6bc5baa41ea01f3)



#link_toメソッド

```rb
link_to(body,url[,html_options])
```
body：リンクテキスト
url:URLのパス
htm;options:＜a＞要素に付与する属性
第三引数として、httpメソッドを指定できる

#HTTPリクエスト
<table>
<tr>
 <th> Railsのリソースの7つのアクション</th>
 <th>役割</th>
</tr>
<tr>
 <th>get</th>
 <th>サーバーからブラウザに情報を返す。単にウェブサイトを閲覧する際にはこのメソッドが利用されている。</th>
</tr>
<tr>
 <th>post</th>
 <th>ブラウザからサーバーに情報を送信し、サーバーに情報を保存する。情報の登録などの際に、サーバーに情報を送信するために利用される。</th>
</tr>
<tr>
 <th>delete</th>
 <th>ブラウザからサーバーに情報を送信し、サーバーに情報を保存する。情報の登録などの際に、サーバーに情報を送信するために利用される。</th>
</tr>
<tr>
 <th>patch</th>
 <th>ブラウザからサーバーに情報を送信し、サーバー内の情報を置き換える。登録情報の更新などの際に、サーバー内のデータを更新するために利用される。</th>
</tr>
</table>

rake routesコマンドでHTTPリクエストの一覧を表示できる。

コマンド実行

```terminal
#moooviディレクトリに移動
$ cd mooovi
#rake routesコマンドを実行
$ rake routes
```

出力結果

```terminal
           Prefix Verb URI Pattern                                 Controller#Action
   search_products GET  /products/search(.:format)                  products#search
           product GET  /products/:id(.:format)                     products#show
              root GET  /                   
```





#Railsのリソースの7つのアクション
<table>
<tr>
 <th> Railsのリソースの7つのアクション</th>
 <th>役割</th>
</tr>
<tr>
 <th>index</th>
 <th>リソースの一覧を表示する。</th>
</tr>
<tr>
 <th>show</th>
 <th>リソースの内容を表示する。</th>
</tr>
<tr>
 <th>new</th>
 <th>リソースを追加する。</th>
</tr>
<tr>
 <th>create</th>
 <th>リソースを追加し、作成する。</th>
</tr>
<tr>
 <th>edit</th>
 <th>リソースを更新するためのフォームを表示する。</th>
</tr>
<tr>
 <th>update</th>
 <th>リソースを更新する。</th>
</tr>
<tr>
 <th>destroy</th>
 <th>リソースを削除する。</th>
</tr>
</table>

【例】

```TweetsController.rb
class TweetsController < ApplicationController

  def index
    @tweets = Tweet.includes(:user).page(params[:page]).per(5).order("created_at DESC")
  end

end
```



###resourcesメソッド
Railsの基本となるコントローラの7つのアクションで記載した7つのアクション名に対してのルーティングを自動で生成するメソッド。

テーブルに保存されるレコード1つの情報のことをリソースと呼ぶ。


従来なら、下記のようにモデルからビューへのルーティングを指定する。

```rb
TechReviewSite::Application.routes.draw do
  get 'products/:product_id/reviews/new' => 'reviews#new'
  post 'products/:product_id/reviews' => 'reviews#create'
end
```

しかし、このように パス と アクション を自分で考えて定義していくのは面倒。このとき、resourcesメソッドが使える。

【例】

```rb
Rails.application.routes.draw do
  resources :books
end
```

###ルーティングのネスト
ネストとは入れ子構造とも呼ばれ、ある記述の中に入れ子構造で別の記述をする方法です。
ルーティングでいうと、あるコントローラへのルーティングの記述の中に、別のコントローラへのルーティングを記述するということを指します。

自分は下記のように理解してます。間違ってるかも？
要は、どのモデルに対するデータなのかを明示するために使う。
例：どのツイートに対するコメントなのか

#部分テンプレート
ビューを作成する際に同じようなレイアウトの部分が複数存在する場合、同じHTML構造の部分を共通化することによって、無駄なくビューファイルを作成することが出来ます。

**部分テンプレートのファイル名は必ずアンダーバー「_」から始まります。**

###renderメソッド
renderメソッドは、部分テンプレートを呼び出す際に利用するメソッドです。

####render partialオプション
renderメソッドに :partialというオプションをつけることで、明示的に部分テンプレート名を指定し、部分テンプレートを表示することができます。
下の例では、_sample.html.erbという部分テンプレートを呼び出しています。

```rb
render partial: "sample"
```

####render localsオプション
また、localsというオプションを用いると部分テンプレート内でその変数を使えるようになります。

```rb
render partial: "sample", locals: { tweet: "hello!" }
```