OmniAICreator/Qiita-1.07M huggingface dataset:
スタックを使って文字列を逆順にする

# 前書き
これはある学生の日々の学習の成果を記した備忘録であります
実行環境

- `macOS 10.12.6`
- `Python 3.7.0`

# やったこと
"Hello"という文字列を"olleH"に変換する
以下実行したコード


```py
str = "Hello"
print(str)
list = []

for c in str:
    list.append(c)

reverse = ""
while len(list):
     reverse += list.pop()

print(reverse)
```

# 結果
```
% python3 reverse.py                                                                                                                                                                                        [16:55:28]
Hello
olleH
```
#追記
関数にして引数で文字列を受け取るver

```py
def reverse(str): 
    list = []

    for c in str:
        list.append(c)

    reverse = ""
    while len(list):
        reverse += list.pop()

    print("output: "+reverse)

reverse(input("imput:  "))
```

実行結果

```
% python3 reverse.py                                                                                                                                                                                       
imput:  hello
output: olleh
```
Node.js向けORM Objection.jsを使ってみた(1)

## 概要

[Objection.js](https://vincit.github.io/objection.js/#introduction
)というNode.js向けのORMを試してみましたので、

調べたことなどについてまとめます。

## 特徴

* [Knex.js](https://knexjs.org/)ベースのORM
* PostgreSQL, MySQL, SQLite3をサポート
* QueryBuilderを使用して、柔軟にクエリを作成できる
* JSONSchemaベースのvalidation
* Eager Loading
* Graph insert/upserts
* 複合主キーのサポート
* pluginシステム

## 前提

* Node.js v8
* PostgreSQL

## インストール

```sh
$ yarn add knex objection pg
```

## 利用法

以下のようにして、Modelを初期化する

```javascript
// knexのインスタンスを作成する
// 詳しくは、https://knexjs.org を参照
const knexConfig = require('./path/to/knexfile');
const knex = require('knex')(knexConfig);

// 作成したknexのインスタンスを、Modelのknexメソッドに渡す
const { Model } = require('objection');

Model.knex(knex);
```

## 続き

長くなりそうなので別の記事にまとめます。

* [(2)Model定義について](https://qiita.com/uki00a/items/14cfb36a5222447a8919)
* [(3)基本的なクエリの発行方法について](https://qiita.com/uki00a/items/7fe257ffff7faf82f67c)
* [(4)トランザクション](https://qiita.com/uki00a/items/d83546a9e6856c72170c)
* [(5)Graph inserts](https://qiita.com/uki00a/items/71f5523c116c7bfa6106)
* [(6)Graph upserts](https://qiita.com/uki00a/items/be99253b6258b4b862fa)
* [(7)Eager loading](https://qiita.com/uki00a/items/b3d8e853f420226a97cd)
【Unity3D】カメラを回転｜フリック・スワイプの向きに回転

[vaguely](http://mslgt.hatenablog.com/)様の[【Unity】カメラを回転させるメモ](http://mslgt.hatenablog.com/entry/2017/02/18/020630)のコードを少し書き換えました。

```C#
using UnityEngine;

public class CameraRotation : MonoBehaviour
{
    public Camera MainCamera;
    private Vector3 lastMousePosition;
    private Vector3 newAngle = new Vector3(0, 0, 0);

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            // マウスクリック開始(マウスダウン)時にカメラの角度を保持(Z軸には回転させないため).
            newAngle = MainCamera.transform.localEulerAngles;
            lastMousePosition = Input.mousePosition;
        }
        else if (Input.GetMouseButton(0))
        {
            // マウスの移動量分カメラを回転させる.
            newAngle.y += (Input.mousePosition.x - lastMousePosition.x) * 0.1f;
            newAngle.x -= (Input.mousePosition.y - lastMousePosition.y) * 0.1f;
            MainCamera.gameObject.transform.localEulerAngles = newAngle;

            lastMousePosition = Input.mousePosition;
        }

    }
}
```
僕が変えた所はVector3のnewAngleのyの回転量をマイナスからプラスに変えただけです。
vaguely様のコードはスワイプの向きの反対方向に回転、僕のコードはスワイプの向きに回転します。


元コードは[こちら](http://mslgt.hatenablog.com/entry/2017/02/18/020630#20170218_rotate_camera)
StanとRでベイズ統計モデリング(アヒル本)をPythonにしてみる - 8.4 ロジスティック回帰の階層モデル

[実行環境](https://qiita.com/shngt/items/ce6f2c3ef348cd80f432)

## インポート

```python
import numpy as np
from scipy import stats
import pandas as pd
import pystan
import matplotlib.pyplot as plt
from matplotlib.figure import figaspect
import seaborn as sns
%matplotlib inline
```

### データ読み込み

```python
attendance41 = pd.read_csv('./data/data-attendance-4-1.txt')
attendance42 = pd.read_csv('./data/data-attendance-4-2.txt')
```

# 8.4 ロジスティック回帰の階層モデル
## 8.4.4 Stanで実装

```python
N = attendance41.index.size
C = attendance42['CourseID'].max()
I = attendance42.index.size
conv = pd.Series([0, 0.2, 1], index=('A', 'B', 'C'))
data = dict(
    N=N,
    C=C,
    I=I,
    A=attendance41['A'],
    Score=attendance41['Score']/200,
    PID=attendance42['PersonID'],
    CID=attendance42['CourseID'],
    W=conv[attendance42['Weather']],
    Y=attendance42['Y']
)
fit = pystan.stan('./stan/model8-8.stan', data=data, pars=('b', 'b_P', 'b_C', 's_P', 's_C', 'q'), seed=1234)
```

## 8.4.5 推定結果の解釈

```python
ms = fit.extract()
N_mcmc = ms['lp__'].size

param_names = ['mcmc'] + ['b{}'.format(i+1) for i in range(4)] + ['s_P', 's_C']
d_est = pd.DataFrame(np.hstack([np.arange(N_mcmc).reshape((-1, 1)), ms['b'], ms['s_P'].reshape((-1, 1)), ms['s_C'].reshape((-1, 1))]), columns=param_names)
d_qua = d_est.loc[:, param_names[1:]].quantile((0.025, 0.5, 0.975)).T.reset_index()
d_qua.columns = ('X', 'p2.5', 'p50', 'p97.5')
d_qua['X'] = pd.Categorical(d_qua['X'])
d_melt = pd.melt(d_est, id_vars=('mcmc'), var_name='X')
d_melt['X'] = pd.Categorical(d_melt['X'])

_, (ax1, ax2) = plt.subplots(1, 2, figsize=figaspect(1/2))
sns.violinplot('value', 'X', data=d_melt, order=param_names[1:], scale='width', inner=None, orient='h', color='w', ax=ax1)
ax1.errorbar('p50', 'X', data=d_qua, xerr=[d_qua['p50']-d_qua['p2.5'], d_qua['p97.5']-d_qua['p50']], fmt='o', c='k')
plt.setp(ax1, xlabel='value', ylabel='parameter')

param_names = ['mcmc'] + ['b_C{}'.format(i+1) for i in range(10)]
d_est = pd.DataFrame(np.hstack([np.arange(N_mcmc).reshape((-1, 1)), ms['b_C']]), columns=param_names)

def get_map(col):
    kernel = stats.gaussian_kde(col)
    dens_x = np.linspace(col.min(), col.max(), kernel.n)
    dens_y = kernel.pdf(dens_x)
    mode_i = np.argmax(dens_y)
    mode_x = dens_x[mode_i]
    mode_y = dens_y[mode_i]
    return pd.Series([mode_x, mode_y], index=['X', 'Y'])

d_mode = d_est.loc[:, param_names[1:]].apply(get_map).T

d_est.loc[:, param_names[1:]].apply(lambda s: sns.kdeplot(s, shade=True, legend=False, color='k', alpha=0.15, ax=ax2))
ax2.vlines(d_mode['X'], d_mode['Y'], 0, linestyles='dashed', alpha=0.6)
sns.rugplot(d_mode['X'], color='k', ax=ax2)
plt.setp(ax2, xlabel='value', ylabel='density', xticks=np.arange(-4, 5, 2))
plt.tight_layout()

plt.show()
```
![fig8-9.png](https://qiita-image-store.s3.amazonaws.com/0/103085/10d24945-6f0b-22d5-f6d7-32bab9cdce6b.png)
Haskell入門　典型的な再帰関数の練習

## 記事の内容　典型的な再帰関数の練習
再帰とは、関数の定義の中で自分自身を呼び出すことです。
この記事では、典型的な再帰関数の練習を実施します。

### 基底部について確認
解こうとする問題を同じ種類のより小さな問題に分解し、それら部分問題を解くことを考える。
分解していった結果、これ以上分解できず、解を**再帰を使わずに**定義しなければならないケースにたどり着く。これを**基底部**という。

## なぜHaskellで再帰が重要か
Haskellの目的は、**ほしい結果が何であるかを直接定義する**ことです。
Haskellの特徴の一つで、**副作用がない**というものがあります。これは値が変化しないということを意味します。普通のプログラミング（手続き型）では、値が変化しないなんて想像できません。しかし、Haskellでは、**計算式、定義式をそのまま記述するため**、副作用がありません。

## 実装
[すごH本](https://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-%EF%BC%AD%EF%BD%89%EF%BD%92%EF%BD%81%EF%BD%8E%EF%BC%AC%EF%BD%89%EF%BD%90%EF%BD%8F%EF%BD%96%EF%BD%81%EF%BD%83%EF%BD%81-ebook/dp/B009RO80XY/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=)を写経します。
### maximum関数
リストの中で一番大きな数を返す関数。

```haskell
maximum' :: (Ord a) => [a] -> a
maximum' [] = error "empty"
maximum' [x] = x
maximum' (x:xs) = max x (maximum' xs)
```

### 再帰でよく使う共通のパターン x:xs
「基底部は空リストし、x:xsパターンで、リストの先頭要素をxに束縛し、残りをxsに束縛する」

### replicate関数
値を指定された数だけ繰り返す。

```haskell
replicate' :: Int -> a -> [a]
replicate' n x
  | n <= 0 = []
  | otherwise = x : replicate' (n-1) x
```

注意 :演算子　リストの先頭に要素を追加する


### reverse関数
リストを逆順にする

```haskell
reverse' :: [a] -> [a]
reverse' [] = []
reverse' (x:xs) = reverse' xs ++ [x]
```


### elem関数
値とリストを受け取り、その値がリストにふくまれるか調べる。

```haskell
elem' :: (Eq a) => a -> [a] -> Bool
elem' a [] = False
elem' a (x:xs)
  | a == x = True
  | otherwise = a `elem` xs
```
探し物が先頭になければ、xsを調べ、空のリストにたどり着いたなら、結果はFalse。

## クイックソートを再帰で！
xより小さいか等しい要素を左に置きたい。そのためにリスト内包表記を使う。大きいものも同様。


```haskell
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
  let smallerOrEqual = [a | a <- xs, a <= x]
    larger = [a | a <- xs, a > x]
  in quicksort smallerOrEqual ++ [x] ++ quicksort larger
```

述語とリストを受け取り、述語を満たすものだけからなるリストを返すfilter関数を使うと、さらに読みやすくかけます。

```haskell
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
  let smallerOrEqual = filter (<= x) xs
    larger = filter (> x) xs
  in quicksort smallerOrEqual ++ [x] ++ quicksort larger
```
MySQLの起動・確認・停止方法（備忘録）

おもいっきり備忘録だけど、まあ気にするな。

```
$ sudo service mysqld start
```
いつもmysqldの「d」をすっ飛ばしてしまうのだが、あるあるかな？
　
　
　
起動状態の確認方法。

```
$ sudo service mysqld status
```
さらに、停止方法。

```
$sudo service mysqld stop
```
なんだ、**sudo service mysqld**は共通なんだね。
GoogleColaboratory にローカルファイルをアップする方法


機械学習などで **GoogleColaboratory** を利用する機会が増えた。

ローカルに保存しているデータ(npyファイルなど)を **GoogleColaboratory** にする方法を備忘としてまとめる。

## GoogleColaboratoryへのファイルアップ方法

```
# show upload dialog
from google.colab import files
uploaded = files.upload()
```

## アップロードしたファイルの確認方法

```
!ls -l
```
AtomでQiitaの記事を作れるようにした

Excelを良く使う系のシステムエンジニアやってるんですが、
世の中の技術とかトレンドとかに乗り遅れてしまった感があるので、
今さながら勉強しなおしということで、Qiita投稿から始めようかと。

まずは、環境づくりから。

## 環境
- macOS High Sierra
- Atom 1.28.2 x64

## 目標
- とりあえずMarkdownのプレビューがAtomで見れれば良い。

## パッケージ
- Markdown Preview

## インストール
私の環境では日本語化しているので、下記の通り。
- [環境設定]>[+ インストール]
- パッケージの検索に「Markdown Preview」と入力
- 出てきた検索結果から「markdown-preview」をインストール
- インストールしたら[環境設定]>[パッケージ]で確認できる

## 使い方
- Atomでファイルを作成する
- [contorl] + [shift] + [M]で右側にプレビューが表示される

## 設定
Atomの改行をプレビューに反映する。
- [パッケージ]>[Markdown Preview]>[Toggle Break On Single Newline]をクリック

Github風にする。
- [パッケージ]>[Markdown Preview]>[Toggle Github Style]をクリック

## 出来上がりはこんな感じ
![スクリーンショット 2018-08-19 16.05.13.png](https://qiita-image-store.s3.amazonaws.com/0/71150/42ad3b15-bafa-2f27-9cd0-ea183706ecfa.png)

以上。
初学者（僕のこと）がつまづく用語（随時アップデート）

**インスタンス変数**→~~クラスに定義された~~インスタンスがもつ変数のこと。この変数をControllerで定義すれば、Viewで同名の、Controllerで代入された変数を使える。
　
　
　
　
　
　
___
随時更新！
bundle intallでAn error occurred while installing nokogiri (1.8.4)のエラー発生

## 概要
macOSのversionはHigh Sierra 10.13.6
rails new した後、bundle installをしたら以下のエラーが発生。
指示されている様に`gem install nokogiri -v '1.8.4'`
を打っても解決せず同じエラーが発生する。

```ruby
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
(中略)
Building nokogiri using system libraries.
ERROR: cannot discover where libxml2 is located on your system. please make sure `pkg-config` is installed.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
(中略)
An error occurred while installing nokogiri (1.8.4), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.8.4'` succeeds before bundling.
```

## 解決手順

`brew update`した後、
`brew install libxml2`および`brew link --force libxml2`
(または`brew install --force libxml2`で２つまとめて行う)を打ち`gem install nokogiri -- --use-system-libraries`
でnokogiriをインストールする。


```ruby
$brew update
(中略)
$brew install libxml2
(中略)

$brew link --force libxml2

Linking /usr/local/Cellar/libxml2/2.9.7... 21 symlinks created

If you need to have this software first in your PATH instead consider running:
  echo 'export PATH="/usr/local/opt/libxml2/bin:$PATH"' >> ~/.bash_profile

gem install nokogiri -- --use-system-libraries

Building native extensions with: '--use-system-libraries'
This could take a while...
Successfully installed nokogiri-1.8.4
Parsing documentation for nokogiri-1.8.4
Done installing documentation for nokogiri after 2 seconds
1 gem installed

```

無事にnokogiriがインストールされたら
再び`bundle install`を行う。
その後、`brew unlink libxml2` を行う。

```ruby
$bundle install
(中略)

$brew unlink libxml2
```


## 参考
[macOS Sierra での gem install nokogiri でエラー]
(https://qiita.com/riocampos/items/43b55ba06e6c3ec01b82)
Homestead環境においてPhpStormからPHPUnitをデバッグ実行する

# 環境
* php 7.2
* Laravel 5.4
* Homestead 6.1.0 (Vagrant経由で起動)
* Windows10(Homesteadとの共有フォルダを作成してWindows上でソースを編集している)
* PhpStorm 182.3911.43
* xdebug 2.6.0

# やりたい事
PhpStormからPHPUnitをデバッグ実行したい
（ブレークポイントで停止させたい）

# 手順

１. Homestead上でxdebugの設定を行う

`/etc/php/7.2/mods-available/xdebug.ini`を以下の通り編集する

```bash
zend_extension=xdebug.so
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000
xdebug.max_nesting_level = 512
xdebug.remote_autostart = 1 # ←追加
xdebug.remote_host = 10.0.2.2 # ←追加（Homesteadでは10.0.2.2がホストOSのIPアドレスになります）
```

２. php-cliでxdebugを読み込む様に設定する

```bash
cd /etc/php/7.2/cli/conf.d
sudo ln -s /etc/php/7.2/mods-available/xdebug.ini 20-xdebug.ini
```

３. nginx, php-fpmを再起動する

設定を再読み込みするためです。

```bash
sudo service php7.2-fpm restart
sudo nginx -s reload
```

４. PhpStormで設定画面を開き、xdebugからの接続を待ち受けるポートを設定します

`Ctrl+Alt+S`で設定を開く
`Servers`を選択する（下記画像中①）
`＋`ボタンを押下して設定を追加する（下記画像中②）
Host: `127.0.0.1`　（下記画像③）
Port: `9000`　（下記画像③）
`Use path mappings` にチェックを入れる　（下記画像④）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71575/f15266ed-682b-1831-a690-1b48d2d9f010.png)

# 確認
エディター上でブレークポイントを設定後
PHPUnitをデバッグ実行する
ブレークポイントの行で停止すればOKです

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71575/b5ea2469-1919-9311-c12c-d518c795ad80.png)


# 参考ページ
https://swordbeta.com/post/debugging-in-phpstorm-with-xdebug-locally-in-vagrant-or-in-docker/
Hoisting 宣告提升 By 彭彭 25

	11. 前端工程師面試常見
		a. 變數 與函式的宣告提升
		//b. 閉包 Closure 的觀念與用途 どこ?

![WS000023.JPG](https://qiita-image-store.s3.amazonaws.com/0/280122/857e0a0b-7eec-f783-8b58-245d75f45d80.jpeg)

	
```ruby
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"></meta>
	<title>宣告提升 Hoisting</title>
	<script type="text/javascript">
	
	/*x=1127; // 給定初始資料
	alert(x); // 使用變數
	var x; // 宣告變數 就算宣告寫在後面也ok 自動提升到最前面 這個就叫做hoisting
	*/
	// 宣告變數同時給定初始資料 並置於下面 則 undefined
	// var x=10; 
	
	/////////////////////////////////////////////////////////////
	/*test();//前置ok
	function test(){
	alert("hello florence");
	}
	*/
	// 這樣是不ok的
	test();
	var test = function(){
	alert("florence")
	}
	
	</script>
</head>
<!-- 網頁初始化 首頁的顯示 -->
<body>
</body>
</html>
```
SoXのrepeatエフェクトの回数指定に要注意

# 音声処理といえばSoX (Sound eXchange)
音声ファイルを切り出したりつなげたりフォーマット変換したり（以下略）
そんな音声処理に欠かせない[SoX](http://sox.sourceforge.net/)ですが。
最近、とある機能の使い方でハマってしまったのでメモしときます。

# repeatエフェクトで音声を繰り返す
SoXの機能として、1つの音声ファイルを指定した回数だけ繰り返す **repeat** というエフェクトがあります。
但しこれがちょっと曲者です。

## 繰り返されるのはN+1回

まず無音の音声ファイルを作ります。分かりやすいように長さは1秒で。

```bash:terminal
$ sox -n -r 44100 -c 1 -b 16 -e signed-integer silence.wav trim 0.0 1.0
$ soxi silence.wav

Input File     : 'silence.wav'
Channels       : 1
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:00:01.00 = 44100 samples = 75 CDDA sectors
File Size      : 88.2k
Bit Rate       : 706k
Sample Encoding: 16-bit Signed Integer PCM
```

続いて、これを5回繰り返して5秒間の音声ファイルを作りたいと思います。

```bash:terminal
$ sox silence.wav out.wav repeat 5
$ soxi out.wav

Input File     : 'out.wav'
Channels       : 1
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:00:06.00 = 264600 samples = 450 CDDA sectors
File Size      : 529k
Bit Rate       : 706k
Sample Encoding: 16-bit Signed Integer PCM
```

え、6秒になってる？
実はrepeatエフェクト、**指定した回数+1回**繰り返した音声を出力するのです。
このことは ``man sox`` にも載っています。**original audio と別にN回続ける**んですって。

```
repeat [count (1)]
       Repeat the entire audio count times, or once if count is not given.  Requires  tem‐
       porary  file  space  to  store  the audio to be repeated.  Note that repeating once
       yields two copies: the original audio and the repeated audio.
```

よって、「5回繰り返した音声」を作成したい場合は「4」を指定するのが正しい使い方です。
一般に、「N回繰り返した音声」を作成したい場合は「N-1」を指定することになります。

## 余談
いつだったか「16回までしかrepeatできない」という現象に見舞われた記憶があります。
SoXのバージョン自体は古かったと思います（確かCentOS 6上のsox 14.2.0）が、あまり鮮明に覚えてないのと、当時同じSoXのバージョンでも別のマシンで試したらうまくいったということで、結局解決せずに終わってしまいました。
心当たりのある方がいらっしゃいましたらご一報いただければ幸いです。
[Rails] MacBookのローカルで環境構築

プログラミングを学び始めてもうすぐ３ヶ月になろうとしています！
AWSでコードを試していたのですが、そろそろ欲が出てきてローカル環境を自力で作成してみたい！と思い挑戦してみました。

・・・が、エラーが出まくる！諦めかけたのですが、もう一度チャレンジしてみたらlocalhost:3000でRailsサーバーが構築できているではないか！っと思わずガッツポーズをとってしまいました♪

うまくいったプロセスを残しておこうと思います。

# 環境
・　Macbook OS X v.10.11.6

##１．Xcodeインストール

Xcodeをインストールする。
下記のコードをターミルで入れてみる。

```
$ xcode-select -p
```

もし以下が表示されていたら、インストールがまだなのでインストールする。

```
xcode-select: error: unable to get active developer directory...
```

以下の表示だった場合は既にインストール済み。

```
/Applications/Xcode.app/Contents/Developer
```

または

```
/Library/Developer/CommandLineTools
```

※xcodeインストール方法は省きます！

##２．Gitの確認
次にGitのを確認してみます！

```
$ git version
git version 2.10.1 (Apple Git-78)
```

以下のコードを実行してみて、

```
$ git config -l --global
fatal: unable to read config file '/Users/.../.gitconfig': No such file or directory
```

上記の表示だったら、下記を実行する。

```
$ git config --global user.name "Your Real Name"
$ git config --global user.email me@example.com
```

もう一度`git config -l --global`を実行する。

```
$ git config -l --global
user.name=Your Real Name
user.email=me@example.com
```
上記の表示が出たら準備完了。


##３．Homebrewをインストール

`brew`を実行。

```
$ brew
-bash: brew: command not found
```

`not found`だったら、Homebrewをインストールする。


##4．GPGをインストール
Homebrewを使うためにGPGをインストールする。

```
$ brew install gpg
```

次にRVMに対してのセキュリティキーを実行。

```
$ command curl -sSL https://rvm.io/mpapis.asc | gpg --import -
```

##５．RVMをインストール

以下を実行してRVMをインストール。

```
$ \curl -L https://get.rvm.io | bash -s stable
```
こんなメッセージが出てくる。

```
mkdir: /etc/openssl: Permission denied
mkdir -p "/etc/openssl" failed, retrying with sudo
your password required for 'mkdir -p /etc/openssl':
```
→Macのパスワードを求められるので入力する。



もしRVMを既にインストールしている場合はアップデートしておく。

```
$ rvm get stable --autolibs=enable
```

##６．ターミナルを閉じる
一度ターミナルを閉じてから、再度開く。

##７．Rubyをインストール
Rubyをインストールする。
今回、バージョンは`2.5.1`を指定して入れてみました。

```
$ rvm install ruby-2.5.1
```

```
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin15]
```

gem のバージョン確認。

```
$ gem -v
2.7.7
```
一応gemのアップデートしておく。

```
$ gem update --system
```

■以下はとりあえず実行してみた。

```
$ rvm gemset list

gemsets for ruby-2.5.0
=> (default)
   global
```

```
$ rvm gemset use global
$ gem list
```

```
$ gem outdated
$ gem update
$ echo "gem: --no-document" >> ~/.gemrc
$ gem install bundler
$ gem install nokogiri
```

##８．Railsをインストール

```
$ gem install rails -v 5.1.4
```
```
$ rails --version
Rails 5.1.4
```

```
$ mkdir workspace
$ cd workspace
$ rails _5.1.4_ new hello_app
$ rails s
```

ブラウザで`localhost:3000`を実行。

#まとめ
上記の手順でローカル環境でrailsサーバーを実行することができました！
うまく動いたのでめっちゃ感動です♪
[Laravel] Windowsで作成したHomestead環境をMacに展開する

## 結論から言うと
Laravel Homestead環境をパッケージ化(.box化)して他PCに移植するのはオススメしないので[もっと楽な方法で行う](#もっと簡単で楽な方法)方が良い

## テストの目的
`vagrant package`で作成した[Laravel Homestead](https://readouble.com/laravel/5.4/ja/homestead.html)環境(.box)を、Windows→Macに移行する。
これが出来れば、他環境への移行の際にもスムーズに行えるのではないかと思い、今回テストを実施

**<移行元：Windows（ .boxの作成環境）>**
使用PC：Surface Pro 4
OS：Windows 10 Pro RS4
PHP：7.2.4 (cli) (built: Mar 28 2018 04:46:46) 
Vagrant：2.1.2
VirtualBox：5.2.16
Laravel Framework：5.6.33
Laravel Homestead：7.14.2
Windows PCでHomestead環境を作成したのち、Laravelの動作を`vagrant ssh`実行⇒`http://192.168.10.10`に接続して確認。その後、Bootstrap4 / Laravel Mixが使えるように設定

**<移行先：Mac（ .boxの配布環境）>**
<img width="698" alt="スクリーンショット 2018-08-31 22.04.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/131342/b4ade3cb-e966-41f1-a06b-1d2ed5badd8e.png">



## テスト手順
-  プロジェクトルートに移動し、`vagrant ssh`でVMに接続
-  VM 内で下記を実行し、/etc/udev を無効化

```vagrant:ssh
sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

-  `vagrant package`を実行

※パッケージ名の指定も可能
:black_nib:[Command: vagrant package [name|id]](https://www.vagrantup.com/docs/cli/package.html)

成功するとプロジェクトルート内にpackage.boxが作成される(筆者環境では約1.8Gのサイズ、下図)
![2018-08-19 (2).png](https://qiita-image-store.s3.amazonaws.com/0/131342/225199c6-d88c-9026-a41d-4031b2285f0c.png)

## Macへの移行テスト

- 作成したpackage.boxを、外部メディアにコピーしてVagrant+VirtualBox導入済のMacに移す。
その後、展開したいディレクトリに配置し、下記を実行

```vagrant:terminal
#listに追加
vagrant box add enma/homestead ./package.box

#コマンドで確認
vagrant box list

#VagrantFileの作成(その後ファイル内容の修正が必要)
vagrant init enma/homestead

#VM起動
vagrant up

```

下図の通り、Windows→Macへの環境移行には成功したが、**環境依存のエラー処理に多くの時間を費やした**ため、box作成～移行の手順は煩雑であり非効率との結論を得た。
![DlAjZluVsAAWpYK.png](https://qiita-image-store.s3.amazonaws.com/0/131342/2e532cb7-de0c-4ac4-3c05-afc2831713a8.png)



**難所**

- VagrantFlieは上記の通り`vagrant init`を実行して新たに作成し直す必要がある

- パーミッションやipの設定など諸々必要
参考：[Laravelのパーミッションを適切に設定](https://qiita.com/engulisyu/items/ad819d06ea0cd31411df)
[vagrant on mac にLaravel Homesteadを入れてみる](https://qiita.com/you-me/items/3886f072cbcbead98733)

- ゲスト側とホスト側のVirtualBoxのバージョンが異なる場合、エラーが発生するため共有フォルダが有効化されない
参考：[Vagrant 事始め 番外編 02 - 共有フォルダの共有に失敗する](https://qiita.com/centipede/items/db839132abd3a24a1807)

- Homestead.yamlのsitesで設定した公開フォルダ以下はmountされない（何らかの手段で外部からソースを引っ張ってくる必要がある。例えばGitHubを用いてgit clone→box配布元の構成に正しく配置するといった作業が必要）
参考：[[PC1→PC2] vagrantで独自boxを作って配布する
](https://qiita.com/YusukeHigaki/items/36cd2d4b60f049815fc6
)

##もっと簡単で楽な方法

素直に公式HPに書いてある通りにする⇒https://readouble.com/laravel/5.6/ja/homestead.html

『(日本語訳より抜粋)自分の「ホーム」ディレクトリの中のHomesteadフォルダへリポジトリをクローンすることは、自分のLaravel（とPHP）の全プロジェクトをホストしておくHomestead Boxを用意するのだと考えてください』

Qiita過去記事の内容をご覧ください
[Laravel5.6 新規プロジェクト作成手順](https://qiita.com/kawax/items/01109b274dc99b48966b)

共有フォルダの設定のところで、
自分のプロジェクトの管轄のフォルダをGitHub等から持ってくると楽


##他の参考記事##

[Vagrant の環境を複製する](https://qiita.com/murachi1208/items/99daa3ca069d907a7b50
)


**GitHub**
-
https://github.com/dcsyhi/Laravel_Homestead
Hyperターミナルで日本語を扱えるようにする

Hyperターミナルの紹介をしていましたが日本語に対応したとかしてないとか情報が交錯していたので調査して表示する方法を見つけました。
[hyperターミナル](https://qiita.com/rspepe/items/e4be7af2be733625476b)
[hyperターミナルを最新ソースでbuild & run](https://qiita.com/rspepe/items/0f7f89714a3c1763625f)

対応としては環境変数のLANGを ja_JP.UTF-8 に書き換えることで日本語を扱えるようになります。

```
echo $LANG
```

日本語が????ってハテナマークで表示されている場合はLANGが ja.UTF-8 となっていると思います。

ためしに

```
export LANG=ja_JP.UTF-8
```

って打ったあとに日本語表示できるようになっていれば成功です。

このままだとターミナルを起動し直すと元に戻るので

~/.zshrc
とか
~/.bash_profile

に

```
export LANG=ja_JP.UTF-8
```

を記述しておいてください。

そのうち、こんなことしなくても ja_JP.UTF-8 でも大丈夫になる気はしますが今はこれで。
Emacs でGo lang を利用する方法

Emacs にGo lang 環境を設定する方法はいくつかあるのですが、Goの環境変数やその他設定の漏れがあったりと、まともな記事がなかったので完全保存版を作ってみました。

# 前提
* ubuntu (Linux Mint)
* zshを利用していること
* emacsがインストール済みであること

# Go langのインストール
Go langをインストールします。

```
sudo apt install golang
rehash
```
または最新版や特定のバージョンをインストールしたい場合は下記を実行します。

```
# 1.15.5をインストールする場合
# インストールページ: https://golang.org/dl/
wget https://dl.google.com/go/go1.15.5.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.11.5.linux-amd64.tar.gz
ls /usr/local/go/bin/go
```

# Go langの環境変数を確認
ここでGo langの `go env` で表示されるパラメータと環境変数は異なることため、注意が必要です。

```
/usr/bin/go env
```

最新版や特定のバージョンをインストールした場合は下記を実行します。

```
/usr/local/bin/go env
```

# Go langのパス設定
Go langを扱うために必要なパスを設定します。

```
mkdir ~/go
vi .zshrc
# 以下の内容を書き込み
# Go lang
# 最新版や特定のバージョンをインストールした場合のみ
export PATH=/usr/local/go/bin:$PATH
# 以下は共通の設定
[ -d "$HOME/go" ] && export GOPATH=$HOME/go && export PATH=$GOPATH/bin:$PATH
# ここまで
```
zshrcを読み込みます。

```
source ~/.zshrc
```

# パッケージのインストール
ここでは私的にインストールしておくべきパッケージをインストールします。

```
go get github.com/rogpeppe/godef
go get github.com/mdempsky/gocode
# Go lang 1.11 で登場したmodulesを利用したい場合はこちら
# go get github.com/mdempsky/gocode
go get github.com/golang/lint/golint
go get github.com/kisielk/errcheck
```

# Emacs へのパッケージインストール
Emacsに Go lang関連パッケージをインストールします。
Emacsを起動して以下のコマンドを入力します。

```
M-x package-install go-mode
M-x package-install flycheck
M-x package-install exec-path-from-shell
M-x package-install auto-complete
M-x package-install go-autocomplete
```

# Emacs の設定
以下の設定 ~/.emacs.el または ~/.emas.d/init.el に記載します。

```
;; --- exec path from shell ---
(exec-path-from-shell-initialize)

;; --- go mode
(require 'auto-complete)
(require 'go-autocomplete)
(require 'auto-complete-config)
(ac-config-default)
(add-hook 'go-mode-hook 'flycheck-mode)
```

Emacsを再起動して確認してみて下さい。

# 最後に
ランチャ等からEmacsを起動させる場合は、Go langを利用するためには、Go langが使用する環境変数をEmacsにきちんと認識させる必要があります。
そこで、今回はexec-path-from-shellを利用しましたが、個別に `add-to-list` にてGo lang周りのパスを設定してもOKかと思います。

# 参考
https://tecadmin.net/install-go-on-ubuntu/
https://golang.org/doc/install?download=go1.11.5.linux-amd64.tar.gz
JSON 基本教學 By 彭彭 24


	9. JSON 基本教學
	
```ruby
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"></meta>
	<title>JSON 教學</title>
	<script type="text/javascript">
	// JSON: javascript object notation(javascript 物件表示法)
	//js new一個物件
	/*	var point = new Object();
		point x=3;
		point y=4;
		point.get=function(){
			alert(this.x + "," this.y);
		}
		*/
	//JSON 建立物件的格式(json 的基本動作)
		var point = {
			"x":3,
			"y":4,
			"comeon":function(){
				alert(this.x + "," + this.y)
			}
		}
		//point.comeon();
		
	/* 
		物件結構與 JSON 格式字串轉換,使用内建 JSON 物件中的方法
			使用 JSON.stringify(物件);將物件轉換成 JSON 格式的字串,但會忽略函式的部分
			使用 JSON.parse(JSON 格式字串;) 將字串轉換成物件結構
	*/
	// 用JSON 物件轉換字串
	var jsonStr=JSON.stringify(point);
	console.log(jsonStr);
	// 用JSON 字串轉換物件
	var plainObj=JSON.parse(jsonStr);
	console.log(plainObj);
	alert(plainObj);
	</script>
</head>
<!-- 網頁初始化 首頁的顯示 -->
<body>
</body>
</html>
```
NW.jsを実際に使ってみて躓いたポイントまとめ

※この記事は[ブログからの転載記事](http://minimum-opus.blog.jp/archives/11362101.html)です。

はじめに
=======
[前回記事](https://qiita.com/Minimum-Opus/items/b28b528a9c34ad21599e)を読んでくださった方はご存知だと思いますが、僕は[Kindleを便利にするためのアプリケーション](http://minimum-opus.blog.jp/archives/11346443.html)をNW.jsを用いて開発しています。
この度ついに、exe化することに成功しましたので、今回はNW.jsをいざ使ってみたときに躓いたポイントを紹介していきたいと思います！
つまづきポイント
===============
つまづきポイント①: 3rd製node_moduleもビルド対象！
----------------------------------------------
...まぁ、冷静に考えれば「**そりゃそうだ**」なんですけどね。

[NW.jsの紹介記事](http://minimum-opus.blog.jp/archives/11257848.html)で、ビルド対象を`src`フォルダに移動させる必要があることを紹介しました。
このとき、`src`に移動したソースファイル内で`require`されているモジュールについても、`src`フォルダにインストールされている必要があります。

![Clipboarder.2018.08.19-002.png](https://qiita-image-store.s3.amazonaws.com/0/278909/dbbd0ead-9b80-f11d-adc8-e82464e64714.png)
上記のように`node_modules`フォルダが`src`フォルダ内に生成されている状態でしたら、
その`node_modules`フォルダにインストールされているモジュールは`require`できるようになります。

この`src`フォルダへモジュールのインストールは
`src`フォルダをカレントフォルダにした状態で`npm install`するだけです。

つまづきポイント②: Nodeモジュール化してないコードは見えちゃう！
----------------------------------------------------------
もし、`index.html`にほぼすべての処理を記載していたとします。
すると、この次に紹介する「右クリックすると意図しないメニューが出る」の対策をしていない場合では、
`F12`を押すと、`index.html`に記載されていたり、
`script`タグに記述されているファイルについてはソースが**丸裸**になります。

なるべくNode.jsのコードは外部モジュール化したほうが良いでしょう。

つまづきポイント③: 右クリックすると意図しないメニューが出る
------------------------------------------------------
NW.jsはデフォルトでChrome DevToolsが有効な状態でビルドされます。
Chrome DevToolsが有効な状態だと、NW.js上にて生成されたウィンドウの空欄上を右クリックすると、
再起動とか検証とかいろいろ見られたくない場所へのメニューが出現してしまいます。

![Clipboarder.2018.08.19-003.png](https://qiita-image-store.s3.amazonaws.com/0/278909/1110e9cc-0105-1583-5384-0ec652837544.png)

これは製品として嫌なので、
`src`フォルダ内の`package.json`に`"chromium-args" : "--disable-devtools"`の記述を追加してChrome DevToolsを無効にする必要があります。

つまづきポイント④: process.argvが使えない！
-----------------------------------------
NW.jsで`process.argv`を利用すると、いくら配列を渡しても、
`process.argv.length`が`1`になります。[公式のリファレンス](http://docs.nwjs.io/en/latest/References/App/#appargv)にて`nw.App.argv`の利用がアナウンスされているっぽいので、`nw.App.argv`を利用してください。
使い方は`process.argv`同様です。

締め
====
ネイティブアプリ化といえばElectronだったり、React Nativeばかりがもてはやされて、なかなかNW.jsの日本語の情報が少ないですが...

**是非、皆さんNW.jsを使ってみてください！**
あんなシンプルな方法でビルドができてしまったり、まだまだポテンシャルがありそうな気がしてドキがムネムネです！
CEK入門者がステップアップするために(基本的なJSONの中）

# こんな人向け

スロット、インテントなどの概念は理解したし対話モデルの作成方法も理解した。でも、サーバー側にはどのようにClovaが認識した情報を送っていて、どのようにClovaに喋らせばいいかがわからない。
ハンズオンなどで一通りやってみたけど、ステップアップがなかなかできない。
なんとなく、SDK使ってるけど、もっと中を知りたい。

そんな方向けの記事になれば幸いです。

# サーバー側には何が送られるか

どのスキルにも必ずサーバーを設置する必要があります。
スキル設定画面の「サーバー設定」にURLを指定していると思いますが、そのURL当てに何を送っているかです。

結論から言うと、ただのJSONデータです。
いや、そんなこと誰でもなんとなくわかっていると思うのですが。。。
では、その中身を見て行きましょう。

省略している部分が結構あるのですが、今回の説明は見やすさ重視で省略しました。
大事な部分は、`request`の中身です。

<img width="290" alt="qiita_md.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/d4ac98c4-d7d8-a19d-5c81-6417835fd3ca.png">



# サーバーに送られる大まかな３種類

スキルを起動してから、終了するまでにサーバーに送られてくるデータには大きく分けて３種類あります。
どの
３種類のうちどのデータであるかを`request.type`の値で判断しています。
以下の画像ですと、値が`LaunchRequest`となっている部分です。

<img width="418" alt="qiita_md.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/46137f20-8d87-addc-b355-12c3e2b5523a.png">


ここに入る値が以下の3つです。

| 入る値|内容|
|------------------|-------------------|
|LaunchRequest|スキル起動時のリクエスト。<br>ユーザーが「（スキルの呼び出し名）を開いて」と言ったときに発生します。|
|IntentRequest|ユーザーが何かしらのインテントに引っかかる発話をしたときに発生します。<br>今回は、CEKで作成した「FortuneIntent」やビルトインテント（最初から定義されているインテント)などの処理をswitch文で条件分岐しながら実装していきます。|
|SessionEndedRequest|ユーザーが「終了」などと言ったときです。|

大まかに分けると、
1. スキルを開いた時 >> LaunchRequest
2. スキルを起動中の時 >> IntentRequest
3. スキルを終了する時 >> SessionEndedRequest

こんな感じでしょうか。

３つどれも全てのスキルで使用することになりますが、特に重要なのは`IntentRequest`です。
`IntentRequest`では、インテント名とスロットを取得することができるからです。

# IntentRequestでインテント名とスロットを取得する

IntentRequestでは必ずインテント名を取得することができます。
スロットはインテントごとに変わってくると思います。

それでは、IntentRequestデータの例です。

<img width="431" alt="qiita_md.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/8314c00a-5ee8-4751-4ec3-d9baa583871c.png">

`request.intent.name`でインテント名を取得します。
スロットは`request.intent.slots.slotsタイプ.value`で取得しています。

実際のコードでは、まずインテント名を取得してユーザーが何を言っているのかを判断して行きます。
その中で、スロット取得が必要なインテントであれば取得します。

# サーバーが返すレスポンス

それでは次に、サーバーが返す内容も見て行きましょう。
これもただのJSONです。

<img width="728" alt="qiita_md.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/5f2893dd-aea1-1fb7-10c8-f685072706a1.png">

見てわかる通り、日本語のテキストの値がClovaが喋る内容になってきます。
ぶっちゃけ、ここの値を変えるだけでClovaが喋る内容を変えることができます。
問題は、この画像だとClovaが喋る内容が二つあること。

そういえば、Clovaに喋らすパターンは2つあることを言っていませんでした。
まずそちらを説明します。

# スキルを終了させるか、させないか

Clovaが何かを言ってスキルを終了させるか、もう一度ユーザーに何かを言わせるか、２通りあります。
それを、コントロールさせているのが`shouldEndSession`です。
こちらの値が、`ture`ならスキル終了。
`false`ならもう一度ユーザーに応答を求めるモードになります。

<img width="728" alt="qiita_md.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/0627aa87-05b4-d479-f21b-792ab794d5ad.png">

# Clovaが喋るテキストが２個ある問題

もう一度同じ画像を載せます。

<img width="728" alt="qiita_md.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/5f2893dd-aea1-1fb7-10c8-f685072706a1.png">

ここの、日本語のテキスト部分を変えればClovaに喋らす内容を変えられると言いました。
ただ、問題は、喋らす内容が2つある。とも言いました。

さらには、Clovaに喋らすパターンは2つあることも言いました。
そして、この画像の`shouldEndSession`をよく見ると`false`になっていることがわかります。つまり、このJSONデータだとスキルは終了せずユーザーに再度会話を求めます。

これで、全ての謎は溶けました。

そうです。一つ目のテキストは、最初にClovaが喋る内容。
二つ目は、ユーザーが数秒間応答なかった時に、再度Clovaが喋る内容になります。

<img width="728" alt="qiita_md.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/d1cf29d9-07d3-2748-e753-056725f20f07.png">
不完全性定理入門　from「コンピュータは数学者になれるのか」

##不完全性定理をちょっとでも分かりたい
理性の限界を示した、なんて言われることもある不完全性定理。しかし、その意味を厳密に掴むのは難しい。かの天才物理学者ペンローズすらも誤用したほどです。

深く掘り下げるには、数学的にも哲学的にも難しい、と言われます。

今回は、コンピュータサイエンスの文脈で不完全性定理を考えてみましょう。

##コンピュータは数学者になれるのか
照井一成氏のこちらの本。
[コンピュータは数学者になれるのか](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AF%E6%95%B0%E5%AD%A6%E8%80%85%E3%81%AB%E3%81%AA%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%8B-%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A4%8E%E8%AB%96%E3%81%8B%E3%82%89%E8%A8%BC%E6%98%8E%E3%81%A8%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%B8-%E7%85%A7%E4%BA%95%E4%B8%80%E6%88%90/dp/4791768515/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=&sr=)

第2章の形式系やコンピュータの限界に関わる成果についてまとめて、「コンピュータは数学者になれるのか」というテーマに迫ります。

・タルスキの真理定義不能性
・チューリングの決定不能性
・ゲーデルの第一不完全性定理

##スライドシェアにて
スライドにてまとめました。こちらへどうぞ。
[不完全性定理入門　from「コンピュータは数学者になれるのか」](https://www.slideshare.net/meta_7/from-109939800)


#####形式系について
形式系については、同書の1章をまとめたこちらの資料が参考になりました。
[コンピュータは数学者になれるのか？①](https://qiita.com/crampon231/items/060c3d00c150be5e910d)
俺的Material Designに影響されたUI設計

僕がUI設計をするときに大事にしてることをダダッと殴り書きしておきます。

# はじめに
**今のデザインでしっくりきてるもん！！っていう部分と競合する部分があればガン無視してください！！**
自分の信じるものを捻じ曲げる必要はないよ！！

# Material Designがどんなもんなのか読む
リンク貼ろうと思ったら元のページがややっこしく変わってた。残念。

今読むなら、この辺が一番びしっと来ると思う。
画像とか使われてて最上級にわかりやすいからめんどくさがらずみて。Chromeでページ翻訳かけて読んで。
[Surface - Material Design](https://material.io/design/environment/surfaces.html#material-environment)

ここから、僕が読みだしていることをまとめると
・UIは紙でできてる
・UI上の文字や画像は紙に印刷されているものとして扱う
    <small>※動画とかはインクがリアルタイムで動くという解釈でOK</small>
・星形とか複雑な形のボタンなどの実装はNG
・アニメーションは拡大・縮小・座標移動で頑張る
・紙同士の重なりを影で表現する
・色使いはシンプルに

**Material Designのミソは影と色**。
どちらも手前にあるものなのか、背景なのかを表現するのに重要。

影はAndroidだとelevationっていうのを与えてやるとつけることができる。
けど、Unityだと棒1本入るだけで影とは思えないので、画像リソースを作ってやるのがいいと思う。
僕が使ってるExpression Designであれば、画像効果でドロップシャドウがつけられるので、困ってたらぜひ。
無料ですし。.psd形式は扱えないけど。

色使いに関しては後の方で。

...という具合。
これを頭に置いておいて、どんなUIにしていくかを考えていく。

# お手本を用意する
お手本、マジで大事。

僕はいつもGoogle産のUIをお手本にしている。
アニメーションとか、色使いとか。
Googleだったらこうやるんだろうなっていうのを考えてやっていく。

なんかしっくりこねぇなと思ったら自分が普段違和感なく使っているソフト・ゲームのUIを確認して違和感が何かを確かめるとスッキリするんです。

違和感の確認材料として、お手本はたくさんあるといいと思う。

# 紙とペンでラフスケッチ
こんなUIがいいんじゃないかな、と思うものを片っ端からガリガリ描いていく。
ここにボタンがあって、ここに説明出して...みたいな感じで。

頭の中で考えているだけだとそもそも複数出てきにくいし、目で見るものを頭で考えたってわかりにくい。
**目で見るものは目で見ながら考えよう**。

また、なんでもかんでも見える場所に置いておくとどうしても画面がごちゃついて、英語の教科書を開いた時のような発作に襲われてしまうユーザが出てくるかもしれない。
そういう印象を与えないためにも、**不要な説明やボタンはアニメーション等を使って必要なときにだけ出現させる**ようにするといいと思う。

考える段階でひとつ、僕が意識しているのは**ある程度ありふれたUIであること**。
UIはソフトウェアやゲームにおいて、何よりも最初に触れるし、ストーリー終盤で手に入れる伝説の剣よりも長い時間、長い期間にわたってユーザが使い続けるものである。
だから、それが攻めすぎたもので、慣れるのに時間がかかったりだとか、わからない部分があるとそのソフト・ゲームは使いにくい、遊びにくいと思われても仕方なくなてしまう。

だから、メニュー項目が並んでいる画面や、設定画面などの基本的などんなものにでもあるような画面はそれに合わせておく。
ソフトウェアであればそのソフトを動かすOSが用意しているデザインガイドラインやコンポーネントに従っておくのが無難であると思う。

# Material Design Colorsカラーパレットから色を選ぶ
色使いはダサさに直結してくる。
ある程度、現代的で無難なデザインがしたければ[Material Design Colors](https://www.materialui.co/colors)から色を選んでくるのが楽。
文字の色も、ボタンの色も、背景の色も全部ここから選んでくる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/255294/5dfe4ba6-70fa-65e3-9a11-f6425995a70a.png)
こういう感じで色が並んでいるので、使いたい色をクリックする。
そうすっとカラーコードがクリップボードにコピーされるのでしかるべき場所へ貼り付けよう。

デフォルトは16進コードだけど、\#つきの16進コードとかrgb()、rgba()が良ければ左上のMaterial Design Colorsとページのタイトルが書いてある横のHEXという部分のドロップダウンから変えられるから、必要に応じて変えよう。



で、色を選ぶうえで僕が気をつけていることは次の3点
・テーマカラーを決めること
・ネガティブは赤、ポジティブは緑
・背景は微妙に暗く、手前の物は明るく

## テーマカラーを決める
テーマカラーを1つ決めて、目立たせたい言葉やボタンはこのテーマカラーにする。
悪目立ちすることなく、いい感じに目立つのでオススメ。

複数あるとなんかちゃらんぽらんな印象を受けるので1つにまとめるのが無難。
QiitaもTwitterも、テーマカラーは1つしかないじゃん？


ゲームであれば、ゲームそのもののテーマカラーと、ゲームのモードごとで別のテーマカラーを割り当てたりとかすると、テーマカラーの違いで「あ、これは別のモードなんだな」と無意識的に思わせることもできるので、「なんかしっくりこない」と思う場合は試すといいかも。

## ネガティブは赤、ポジティブは緑
**<font color="#f44336">エラーは赤色で出せ</font>、<font color="#4CAF50">成功しました！みたいなのは緑色で出せ</font>**

心理学的に赤色の何かには危機感を覚え、緑色の何かには安らぎを感じるのだそう。
この辺は大体揃ってるから、逆にしたり変えたりするとスリコミに引きずられて操作ミスの原因になったりするので従うといいと思う。

## 背景は微妙に暗く、手前の物は明るく
さっきの影の話に戻るんだけど、人間は暗いものを奥、明るい物を手前として考える。
だから、明るい色の物を手前において、そいつに影を付けてやるとしっくりくる見た目になる。

かといって背景の色がめっちゃめちゃ暗いとなんかダサくなるのでその辺はしっくりくるのを探ってみてね。

# 設計に苦しんだら...
他の人に見せて感想を聞きましょう。
新たな改善策やデザイン案が不思議と浮かんでくるものです。
【随時更新】Raspberry PI でぶち当たった壁一覧

## IPアドレスの固定化失敗からのリカバリ
wifi接続したあとSSHの固定化をしようと思い、画面から設定しまくってうまくいかず、あきらめて普通のwifi接続に戻そうとしたが戻らず。。。

###こんなときは？
以下ファイルに変なインターフェイスができまくっているので、すべて消す！
そうすると、うまくつながるはず！

```
sudo vi /etc/dhcpcd.conf
```
```dhcpcd.conf
～(省略)～
SSID XXXXXXXXXXXXX
static ip_address=192.168.1.81/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
static domain_search=

SSID XXXXXXXXXXXXX
static ip_address=192.168.1.81/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
static domain_search=

SSID XXXXXXXXXXXXX
static ip_address=192.168.1.81/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
static domain_search=

SSID XXXXXXXXXXXXX
inform 192.168.1.81
static routers=192.168.10.1
static domain_name_servers=192.168.10.1
static domain_search=192.168.10.1
～(省略)～
```

## SSHの設定
IPアドレスの固定化はあきらめて、とにかく別PCからSSH接続できればいいやーと考える。
画面からSSHを有効化して再起動を実施！しかし、SSH接続できず。。。

###こんなときは？
理由をいろいろ探ると、「boot配下にsshフォルダが必要」とのこと
ので、作成して再起動をすると他PCから接続できた！！うれしす♪

```
sudo mkdir /boot/ssh
```
セキュリティ強化の一環であるバージョンから画面で設定しただけではだめとの記事あり
Railsのプリコンパイルをローカル環境で行ってデプロイを高速化する方法

Rails アプリを Capistrano でデプロイするとき `deploy:assets:precompile` タスクでフロントまわりのビルドが走ります。

デプロイ先のサーバーが低スペックだと、そのビルドに時間がかかってデプロイがなかなか終わりません。その上、サーバーの負荷も上昇し、サービスも不安定になってしまいます。

そこでプリコンパイルだけローカルで行うようにする例がこちらです。

```ruby:config/deploy.rb
unless ENV["REMOTE_BUILD"] == "1"
  # 元のタスクの内容は消しておく(重要)
  Rake::Task["deploy:assets:precompile"].clear

  # 新しく定義
  # cap production deploy:assets:precompile
  desc "ローカルで assets:precompile してコピー"
  task "deploy:assets:precompile" do
    tmpdir = "/tmp/__repository_#{fetch(:application)}_#{fetch(:stage)}"

    run_locally do
      execute :rm, "-fr #{tmpdir}"
      execute "git clone #{fetch(:repo_url)} --depth 1 --branch #{fetch(:branch)} #{tmpdir}"
      within tmpdir do
        # database.yml はなくてもいいはずだけど assets:precompile を実行するタイミングで
        # initializers/* のなかでDBアクセスしてしまったりすることもあるので
        # database.yml がない場合は必要に応じて用意する
        # この例ではプリコンパイル時専用の database.precompile.yml を config/database.yml としています
        execute :cp, "-v", "#{__dir__}/database.precompile.yml", "config/database.yml"

        # master.key も必要に応じてコピーする
        execute :cp, "-v", "#{__dir__}/master.key", "config"

        # もし NODE_ENV=production な環境でビルドするときは
        # devDependencies が対象にならないので --production=false の引数をつけとくといい
        execute :yarn

        # 環境変数 STAGE, NODE_ENV, RAILS_ENV を有効にしておく
        with stage: fetch(:stage), rails_env: fetch(:rails_env), node_env: fetch(:rails_env) do
          # sh -c で実行しているのは rbenv 関連プレフィクスをつけたくないため。
          # execute :bundle で実行したりすると rbenv_map_bins のフックが影響して
          # リモートで execute する用の rbenv がついてしまう
          execute :sh, "-c 'bundle exec rails -t assets:precompile'"
        end
      end

      # public/{assets,packs} をデプロイ先に転送
      within "#{tmpdir}/public" do
        roles(:web).each do |e|
          execute :rsync, "-au --delete -e ssh assets packs #{e.user}@#{e.hostname}:#{release_path}/public"
        end
      end
      execute :rm, "-fr #{tmpdir}"
    end
  end
end
```

`config/deploy.rb` に追加、または `lib/capistrano/tasks/local_build.rake` などに保存します。

あとは普通に `cap production deploy` するだけです。

これで私の環境では**23分26秒**かかっていたデプロイが**4分3秒**になりました。

なお、上のタスクはごちゃごちゃしていますが、やっていることは簡単でリモートでプリコンパイルするタイミングで次の処理を行います。

1. ローカルに git clone
1. yarn && rails assets:precompile
1. pubilc/{assets,packs} をサーバー側にコピー

注意する点はこちらです。

- database.yml が git の管理下にある場合は別ファイルからコピーする必要はない
- ssh 経由で rsync が使えること

プリコンパイルの影響でデプロイが大変という方がいましたら試してみてください。
ASP.NET Core 2.1 への移行

# .NET Core 2.1 リリース

2018 年 5 月 30 日に、.NET Core 2.1 と ASP.NET Core 2.1 がリリースされました。

* [Announcing .NET Core 2.1
](https://blogs.msdn.microsoft.com/dotnet/2018/05/30/announcing-net-core-2-1/)
* [ASP.NET Core 2.1.0 now available](https://blogs.msdn.microsoft.com/webdev/2018/05/30/asp-net-core-2-1-0-now-available/)

色々と機能追加もあるようですが、やはり魅力的なのは、ビルド時間の短縮とランタイムのパフォーマンス改善です。

正直、今までは、ビルドを開始してから少々時間がかかるなという感じがしていましたが、.NET Core 2.1 からは、スムーズにデバッグを開始できるようになりました。

公表では、3 から 10 倍程、ビルド時間が高速になったようです。

また、ランタイムも API によりますが、各所で改善が行われたようです。

* [Performance Improvements in .NET Core 2.1
](https://blogs.msdn.microsoft.com/dotnet/2018/04/18/performance-improvements-in-net-core-2-1/)

# .NET Core 2.1 への移行方法

ここでは、ASP.NET Core 2.0 ベースのコードを ASP.NET Core 2.1 へ移行する方法を紹介します。

詳しくは、以下に記載がありますので、こちらも参考にしてください。

* [Migrate from ASP.NET Core 2.0 to 2.1
](https://docs.microsoft.com/en-us/aspnet/core/migration/20_21?view=aspnetcore-2.1)

## ターゲット フレームワークの変更

対象のプロジェクトを選択し、[プロパティ] - [アプリケーション] - [ターゲット フレームワーク] を ".NET Core 2.1" に変更します。

<img width="497" alt="ターゲットフレームワークの変更" src="https://qiita-image-store.s3.amazonaws.com/0/172205/ebd10689-c254-4fd6-67af-f82d0daed68a.png">


## パッケージの更新

対象のプロジェクトを選択し、[NuGet パッケージの管理] - [インストール済み] - [Microsoft.AspNetCore.All] を選択し、[アンインストール] から、同パッケージを削除します。

"Microsoft.VisualStudio.Web.CodeGeneration.Design" も同様に削除します。

<img width="699" alt="Microsoft.AspNetCore.All" src="https://qiita-image-store.s3.amazonaws.com/0/172205/325a0bd7-e46e-7ac2-2ccc-ff51911ccf7a.png">


次に、[参照] - [検索] に、"Microsoft.AspNetCore.App" を入力し、[Microsoft.AspNetCore.App] を選択し、[インストール] から、同パッケージをインストールします。

<img width="703" alt="Microsoft.AspNetCore.App" src="https://qiita-image-store.s3.amazonaws.com/0/172205/ed6c9bb9-823a-ed14-a7f3-cd46297acf5e.png">

"Microsoft.VisualStudio.Web.CodeGeneration.Design" も同様に最新版をインストールします。

## 起動確認

ここで、一度ビルドしてみます。

私の環境では、以下のエラーが出力されました。

エラー	CS1061	'IApplicationBuilder' に 'UseBrowserLink' の定義が含まれておらず、型 'IApplicationBuilder' の最初の引数を受け付けるアクセス可能な拡張メソッド 'UseBrowserLink' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないかを確認してください。

IApplicationBuilder の拡張メソッド UseBrowserLink は、.NET Core 2.1 から、パッケージが変更になったようです。

* [Browser Link in ASP.NET Core
](https://docs.microsoft.com/en-us/aspnet/core/client-side/using-browserlink?view=aspnetcore-2.1)

私の環境と同様の問題が発生する場合亜は、対象のプロジェクトを選択し、[NuGet パッケージの管理] - [参照] から、"
Microsoft.VisualStudio.Web.BrowserLink" の最新版をインストールします。

ビルドして、エラーが発生しないことを確認し、プロジェクトを起動し、動作を確認ください。

#移行に関して

.NET Core 2.0 -> 2.1 への移行でもこれくらいの手間はかかってしまいます。

.NET Core は、これまでの .NET Framework と異なり、自己完結型展開ができるので、手間と感じるのであれば、サポートの問題はあるにせよ、移行しないことも選択できます。

ただし、変化に追随する先進的なアプリケーションの開発、機能追加を継続するのであれば、移行しない手はありません。

アプリケーションの性質、位置付により適切なランタイムの選択が必要と考えています。

以下を別の記事として追記しました。

* [ASP.NET Core 2.1 コード ベースへの移行](https://qiita.com/hiromasa-masuda/items/2785232a6dab9a451aeb)
SQLServer ストアドプロシージャ 変数まとめ

#**はじめに**

SQLServerのストアドプロシージャ内で使用する変数についてまとめました

##**①変数宣言**

DECLAREの後に、変数とデータ型を記述します。
また、初期設定では値はNULLに設定されています。

```SQL:構文
DECLARE @変数名 データ型 ;
```

```SQL:例
DECLARE @number int ;
DECLARE @text varchar(2);
```

データ型の詳細は下記ページ参照

> Microsoft Developer Network データ型 (Transact-SQL)
> https://msdn.microsoft.com/ja-jp/library/ms187752(v=sql.120).aspx

##**②変数に値を代入**

先ほどの宣言後にSETで値を代入することができます。

```SQL:構文
SET @変数名 = 値;
```
```SQL:例
SET @number = 1;
SET @text = 'テスト';
```

##**③変数宣言時に値代入**

①で変数宣言、②で変数に値を代入しました。
しかし、下記の記述で変数制限と初期値設定を同時にすることができます。

```SQL:構文
DECLARE @変数名 データ型 = 値 ;
```
```SQL:例
DECLARE @number int = 1;
DECLARE @text varchar(10) = 'テスト';
```

##**変数を使用した小技集**

1.SELECT文を変数の中に入れて実行する方法

テーブル名を変数に入れて、その変数を実行するとSELECT文を実行することができます。

```SQL:例
DECLARE @SELECTTEST varchar(1000) = 'SELECT Id FROM TESTTABLE';
EXEC (@SELECTTEST);
```
herokuを初めて使って止まった場所とは・・・

#herokuという無料で使えるものがあるらしい
　LINE BOTの開発で調べるとherokuというサービスを無料で使用できるようで、チュートリアルを使いながら進めていると途中で止まってしまった。
#止まった場所
https://devcenter.heroku.com/articles/getting-started-with-python#push-local-changes
　このURLでrequestsをinstallした後のこと。

```cmd.bat
heroku local
```

ここでこんなエラーが・・・

```
ModuleNotFounderror: No module named 'fcntl'
```

今回はWebサービスをリリースする予定ではないのでここで作業を止めてLINE Botの開発に移動しようと思う。
# scikit-learnで多項式回帰を行う

# やること
- ElasticNetを用いた多項式回帰
- 多項式回帰モデルよるの予測(プロット含む)
# 学習データ

データ生成に用いた式としては

```math
y = 2x^2 + 3x + 1

```
にガウスノイズを加えたものを用いる。

学習データ数は100である。

予測用に用いたデータは同じ式を用いて新たに生成し，
50個用意した



```python
xb2 =  10 * np.random.rand(100, 1)
yb2 =  xb2**2 + 3.05*xb2 + 1.1 + np.random.randn(100,1) 

plt.scatter(xb2,yb2,c = "b")

```

![04-1.png](https://qiita-image-store.s3.amazonaws.com/0/276691/c5a56faf-7c07-3920-242c-7472b7fe6473.png)


# 多項式回帰のための準備
データX(説明変数)の次元は1だが、データを観る限り、
2次多項式から生成されているっぽい。

sklearnのPolinomialFeaturesの機能を用いて、
元のデータを二乗したものを新たな特徴量として加える。

```python
from sklearn.preprocessing import PolynomialFeatures as PF

pf = PF(degree=2, include_bias = False)
xb2_poly = pf.fit_transform(xb2)


```

# Elastic-Netによる学習

今回使うモデルは、リッジ回帰、Lasso回帰等とならび、
基本的は学習で最小化すべきコスト関数に正則化項(制約)
を加えることで、過学習を防ぐ。
Elastic Netは、リッジ回帰とLasso回帰どちらにも用いられる

今回は単純なデータなので、2次多項式で回帰すべきだという判断がつけやすいが、
実際はより特徴量がもっと多いことが殆どなので、これは役立つ。

```math

J(\theta) = MSE(θ) + r\alpha \sum_i^n|\theta_i| + \frac{1- r}{2} \alpha \sum_i^n \theta^2_i
\\

*MSE(\theta):最小二乗法誤差。
\\
制約を加えない場合によく用いられるコスト関数。

```

このElastic Netでは、パラメータとして、制約の程度を表すαと、
リッジ回帰、lasso回帰のどちらを重視すべきかを決めるrを
定める必要がある。これは、グリッドサーチなどを用いて、
実際にどのパラメータを用いた時に予測性能が良いかを探る必要がある。

今回はElastic Netを用いたが、以下のチートシート等を用いて、
どのモデルを用いるべきかの判断を行う。

![cheet.png](https://qiita-image-store.s3.amazonaws.com/0/276691/5328b6e2-a012-83b2-b001-e19a140031d3.png)


```python

from sklearn.linear_model import ElasticNet


e_net = ElasticNet(alpha = 0.1, l1_ratio = 0.5)
e_net.fit(xb2_poly, yb2)


```


#予測
あとは、前述した予測用データを用いて予測を行う。
この際、numpyのソート等を用いて、説明変数の順番を昇順にしておく必要がある。

```python
xb2_t = 10* np.random.rand(50, 1)
print("xb2_t\n",xb2_t.shape)
#np.sortの使い方注意
xb2_t = np.array([np.sort(xb2_t[:,0])]).reshape(50,1)
print("xb2_t after\n", xb2_t.shape)
xb2t_poly = pf.fit_transform(xb2_t)
yb2_pred = e_net.predict(xb2t_poly)

plt.scatter(xb2,yb2,color = "blue")
plt.plot(xb2_t,yb2_pred,"red")
plt.show()

```


![04-2.png](https://qiita-image-store.s3.amazonaws.com/0/276691/219acd47-439c-71c8-91c8-d2207b2e1420.png)

# 参考
scikit-learnとTensorFlowによる実践機械学習
Aurélien Géron　著、下田 倫大　監訳、長尾 高弘　訳
https://www.oreilly.co.jp/books/9784873118345/
windows10にTensorFlow GPUを入れる

# 環境
- windows10
- GPU(NDIVIA GeForce GTX 1060 3GB)
- Anaconda3
- CUDA
- CuDNN

# 手順
## ドライバーの更新
[NDIVAの公式サイトよりドライバを更新](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)

## Anaconda3(仮想環境)
[Anacondaのダウンロードページ](https://www.anaconda.com/download/)からAnaconda3をダウンロード
完了すると「Anaconda Navigator」があるので、ここで仮想環境を作れる。（コマンドでも作れます）

## CUDA
[CUDAのダウンロードページ](https://developer.nvidia.com/cuda-downloads)
何も操作しない場合はこのディレクトリ
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2

## CuDNN
CUDAのバージョンに合わせたCuDNNをダウンロード[CuDNNのダウンロードページ](https://developer.nvidia.com/cudnn)
CuDNNはZipファイルでダウンロードできます。
zipファイルから展開したものをCUDA/v9.2ファルダに入れようとしましたが、パスで問題があったようなので展開したファイルをCUDAの該当するフォルダーにコピーしました。

ex) cuda/bin/cudnn64_7.dll → CUDA/bin/cudnn64_7.dll

## pipでインストール
```console
pip install tensorflow-gpu
```

Tensorflowのバージョンを確認して、ちゃんと入れられたかチェックします。

```console
 python -c "import tensorflow as tf; print(tf.__version__)"
```

次に、GPUを認識できているかチェック

```python
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```
結果

```python
2018-08-19 13:25:37.227703: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2018-08-19 13:25:37.534817: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1405] Found device 0 with properties:
name: GeForce GTX 1060 3GB major: 6 minor: 1 memoryClockRate(GHz): 1.7085
pciBusID: 0000:01:00.0
totalMemory: 3.00GiB freeMemory: 2.42GiB
2018-08-19 13:25:37.539355: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1484] Adding visible gpu devices: 0
2018-08-19 13:27:42.397650: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:965] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-08-19 13:27:42.400826: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:971]      0
2018-08-19 13:27:42.402037: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:984] 0:   N
2018-08-19 13:27:42.403457: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1097] Created TensorFlow device (/device:GPU:0 with 2123 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060 3GB, pci bus id: 0000:01:00.0, compute capability: 6.1)
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 4112415611464959698
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 2226402099
locality {
  bus_id: 1
  links {
  }
}
incarnation: 11326046508655942687
physical_device_desc: "device: 0, name: GeForce GTX 1060 3GB, pci bus id: 0000:01:00.0, compute capability: 6.1"
]
```


# 参考にした記事
- http://thr3a.hatenablog.com/entry/20180113/1515820265
- https://qiita.com/exy81/items/48314b968d9fad6170c8
【Androidアプリ開発勉強】ViewModelの実態はActivityで良さそう

<br>
この記事は間違いを含んでいるので注意!
最新の情報は[訂正記事](https://qiita.com/FORTE/items/8bbbe732489f0e2e457d)を参照してください。
<br>
<br>
<br>
<br>
<br>
<br>

[前回](https://qiita.com/fortegp05/items/6c34f5579ba2a44ca14e)の最後に以下のように書きました。
>ViewModelはこのアクティビティのJavaファイルの事なのか、
>他にオブジェクトを作ったほうが良いのか…。
>こういうのが書いてある資料が無い(あるいは見つからない)んだよなぁ…。

これが気になったのでちょっと調べてみました。
結果、こんな感じの設計(構成)にしようかなぁと思ったのでアウトプット。
(これで良さげだけどデメリットが有るのかはよくわからない…)

まぁもっとモダンなやり方はあるのだろうけど、
勉強段階なので出来れば基礎からいっときたいなーと思っている。

# 結論
ViewはXAML
ViewModelはActivity
ModelはActivity以外のJavaが当てはまる。

[参考記事](#参考記事)を基に以下の実装とする。

ModelLocatorを生成してModelを保持する。
ModelとViewController間はObserverパターンで実装する。
ViewModelが観察者(Observer)、
Modelが被観察者(Subject)。

- ユーザーからの操作(ボタン押下とか)
ViewModelのイベントハンドラで(必要があれば)Modelに更新要求を出す。
Modelは更新要求を処理して結果を通知する
(ViewModelの生成時に監視先のModelに通知先としてViewModel自身をセットする)

- Modelからの通知
例えば異常時にModelからViewに通知する
このときActivityが死んでいればそこには通知は出さない
(Activityが死んだ時に削除通知をModelに出すので通知するときには通知対象から消えているハズ)


と、ここまで参考資料で調べて、
これだとデータ保存時とかにViewModelからModelにデータを渡すやり方とか、
取得したデータを返す方法がわからず…うーん。
引数で渡すのは密結合すぎる気がする。

もう少し調べないとダメっぽい。


## 参考記事

[iOS/Androidアプリエンジニアが理解すべき「Model」の振る舞い](https://www.slideshare.net/mokemokechicken/iosandroidmodel)
[IOS/Androidアプリの３つの大事な設計方針](https://www.slideshare.net/mokemokechicken/iosandroid-32804491)
Railsメソッド名（レコードの取得と更新）備忘録

message = Message.all
→Messageモデルのレコード一覧を参照できる。
 
 
message = Message.first
→Messageモデルの最初のレコード（idが最小のレコード）を参照できる。

message = Message.find(2)
→id: 2 のレコードを取得。
 
 
message = Message.find_by(A: B)
→AカラムのBという内容を**ただ一つのみ**取得する。

messages = Message.where(A: B)
→AカラムのBという内容を**複数**取得する。
___
上記のようなメソッドでレコードを取得したら、saveメソッドでレコードを更新できる。