OmniAICreator/Qiita-1.07M huggingface dataset:
【SQL Server 2017 による In-Database Python 分析 チュートリアル】Step 1: サンプルデータのダウンロード

#### チュートリアルのはじめから
[SQL開発者のための In-Database Python 分析](http://qiita.com/qio9o9/items/2a521f5ac8afe39e1721)

#### 前のステップ
[SQL開発者のための In-Database Python 分析](http://qiita.com/items/2a521f5ac8afe39e1721)

#### 次のステップ
[Step 2: PowerShellを使用したSQL Serverへのデータインポート](http://qiita.com/qio9o9/items/98df36982f1fbecdf5e7)

# Step 1: サンプルデータのダウンロード

このステップでは、PowerShellスクリプトによってGithubで共有されたサンプルデータセットとスクリプトを選択したローカルディレクトリにダウンロードします。

## データとスクリプトをダウンロードする

1. Windows PowerShellコマンドコンソールを開きます。

    ダウンロード先ディレクトリを作成したり、指定されたダウンロード先にファイルを書き込むために管理者権限が必要な場合は**管理者として実行**を使用します。

2. 次のPowerShellコマンドを実行し、パラメータDestDirの値をローカルディレクトリに変更します。ここでは**C:\tempPythonSQL**をダウンロード先ディレクトリに指定しています。

    ```PowerShell:PowerShell
    $source = 'https://raw.githubusercontent.com/Azure/Azure-MachineLearning-DataScience/master/Misc/PythonSQL/Download_Scripts_SQL_Walkthrough.ps1'
    $ps1_dest = "$pwd\Download_Scripts_SQL_Walkthrough.ps1"
    $wc = New-Object System.Net.WebClient
    $wc.DownloadFile($source, $ps1_dest)
    .\Download_Scripts_SQL_Walkthrough.ps1 -DestDir 'C:\tempPythonSQL'
    ```
    
    DestDirで指定したフォルダが存在しない場合は、PowerShellスクリプトによって作成されます。
    
3. インターネット接続によっては、ダウンロードに時間がかかることがあります。すべてのファイルがダウンロードされたらPowerShellコマンドプロンプトで次のコマンドを実行し、ダウンロードされたファイルを確認します。

    ```PowerShell:PowerShell
    ls
    ```

    ![sqldev-python-filelist-gho9o9.png](https://qiita-image-store.s3.amazonaws.com/0/195839/67c81db2-851c-b288-b30e-5d2bd89aea5d.png)

## リンク

#### 次のステップ
[Step 2: PowerShellを使用したSQL Serverへのデータインポート](http://qiita.com/qio9o9/items/98df36982f1fbecdf5e7)

#### 前のステップ
[SQL開発者のための In-Database Python 分析](http://qiita.com/items/2a521f5ac8afe39e1721)

#### チュートリアルのはじめから
[SQL開発者のための In-Database Python 分析](http://qiita.com/qio9o9/items/2a521f5ac8afe39e1721)

#### 出典
[Step 1: Download the Sample Data](https://docs.microsoft.com/en-us/sql/advanced-analytics/tutorials/sqldev-py1-download-the-sample-data)

#### 関連項目
[Machine Learning Services with Python](https://docs.microsoft.com/en-us/sql/advanced-analytics/python/sql-server-python-services)
【SQL Server 2017 による In-Database Python 分析 チュートリアル】

# SQL開発者のための In-Database Python 分析

このチュートリアルの目的は、SQLプログラマーにSQL Serverで機械学習ソリューションを構築する実践的な体験を提供することです。 このチュートリアルでは、ストアドプロシージャにPythonコードを追加することで、Pythonをアプリケーションに組み込む方法を学習します。

> [!NOTE]
> 同様のチュートリアルのR版は[こちら](http://qiita.com/qio9o9/items/4f020bb93dc07567e556)。R版はSQL Server 2017とSQL Server 2016の両方で動作します。

## 概要

機械学習開発のライフサイクルは一般的に、データの取得とクレンジング、データの探索と特徴エンジニアリング、モデルのトレーニングとチューニング、そして最終的には本番環境へのモデル展開で構成されます。実際のコーディング、デバッグ、テストは、以下のようなPython用の統合開発環境（Python Tools for Visual Studio、PyCharm、Spyderなど）を使用するのが最適です。

Python IDEでソリューションを作成してテストした後、PythonコードをTransact-SQLストアドプロシージャとしてSQL Serverに展開します。このチュートリアルでは、必要なすべてのPythonコードを提供します。

- [Step 1: サンプルデータのダウンロード](http://qiita.com/items/d7e38143c19943573882)

  サンプルデータセットとすべてのスクリプトファイルをローカルコンピュータにダウンロードします。

- [Step 2: PowerShellを使用したSQL Serverへのデータインポート](http://qiita.com/qio9o9/items/98df36982f1fbecdf5e7)

  指定したインスタンス上にデータベースとテーブルを作成し、サンプルデータをテーブルにロードするPowerShellスクリプトを実行します。

- [Step 3: データの探索と可視化](http://qiita.com/qio9o9/items/6f08ffab3e0522044445)

  Transact-SQLストアドプロシージャからPythonを実行し、基本的なデータの探索と可視化を実行します。

- [Step 4: T-SQLを使用したデータの特徴抽出](http://qiita.com/qio9o9/items/904b4045cb60d3dbe63f)

  ユーザ定義関数を活用しデータの特徴抽出を行います。

- [Step 5: T-SQLを使用したモデルのトレーニングと保存](http://qiita.com/qio9o9/items/dd31004c6239462ccd78)

   ストアドプロシージャ化したPythonコードにより機械学習モデルを構築して保存します。

- [Step 6: モデルの操作](http://qiita.com/qio9o9/items/867ff99a04b0a12d5c34)

  モデルをデータベースに保存した後、Transact-SQLを使用して予測のためにモデルを呼び出します。

> [!NOTE]
> ストアドプロシージャに埋め込まれたコードに問題がある場合、ストアドプロシージャから返される情報は通常、エラーの原因を理解するには不十分であるため、PythonコードのテストはPython用の統合開発環境（IDE）を使用することをお勧めします。


## シナリオ

このチュートリアルでは、よく知られているNYC Taxiデータセットを使用します。このチュートリアルをすばやく簡単にするために、データはサンプリングして利用します。このデータセットの、時刻、距離、ピックアップ場所などの列に基づき、特定の乗車においてチップが得られるかどうかを予測するバイナリ分類モデルを作成します。

## 要件

チュートリアルを開始する前に、次の準備を完了する必要があります。:

- SQL Server 2017のDatabase Engine ServicesおよびMachine Learning Services（In-Database）をインストールしてください。

- SQL Server 2017 内でPython（およびR）実行するにはsp_configureでexternal scripts enabledの設定変更が必要です。またexternal scripts enabledパラメータは設定変更の反映にSQL Server 2017の再起動が必要です。

    - 1.外部スクリプト実行機能の有効化


        ```SQL:T-SQL
        EXEC sp_configure 'external scripts enabled', 1;
        ```

    - 2.SQL Server 2017の再起動

        ```cmd:cmd
        net stop "SQL Server Launchpad (MSSQLSERVER)"
        net stop "SQL Server (MSSQLSERVER)"
        net start "SQL Server (MSSQLSERVER)"
        net start "SQL Server Launchpad (MSSQLSERVER)"
        ```

        netコマンドに渡すインスタンス名は環境に応じて変更してください。またSQL Server AgentサービスなどSQL Serverサービスに依存するサービスがある場合には明示的に再開してください。

- このチュートリアルで使用するSQL Serverログインには、データベースやその他のオブジェクトの作成、データの更新、データの参照、ストアドプロシージャの実行の権限が必要です。

## リンク

#### 次のステップ
[Step 1: サンプルデータのダウンロード](http://qiita.com/items/d7e38143c19943573882)

#### 出典
[In-Database Python Analytics for SQL Developers](https://docs.microsoft.com/en-us/sql/advanced-analytics/tutorials/sqldev-in-database-python-for-sql-developers)

#### 関連項目
[Machine Learning Services with Python](https://docs.microsoft.com/en-us/sql/advanced-analytics/python/sql-server-python-services)
Cannot assign through subscript: '○○' a 'let' constant　とエラーが出た

動物の名前をランダムに並び替える関数を書いていいたらエラーが出た

```
class ViewController: UIViewController {

var c = ["うさぎ","ねこ","たぬき","ぞう","キリン","パンダ"]

    func change(c:[String]) -> [String] {
        for x in 0...5 {
            var a = c[x]
            var y = Int(arc4random_uniform(6))
            var b = c[y]
            c[x] = b
            c[y] = a
        }
        return c
    }




}
```

   c[x] = b
   c[y] = a
のところで両方とも
Cannot assign through subscript: 'c'is a 'let' constant
というエラーが出る。

調べると
https://samekard.blogspot.jp/2014/09/swifterror.html
にあった。

『関数の引数で与えられたものを関数内で変更しようとした。関数の引数はデフォルトで定数扱い。関数内で変数として使いたいなら関数の頭でvar a = aなどとして書き換え可能にする。』

とのこと
change関数を記述しているが、そのchange関数の引数であるcという配列はletという変更できない定数として扱われるのでc[x] = bやc[y] = aというような定数に値を代入して変更させるようなことをしてはいけないのだろう


fun changeの中にforの繰り返しの処理を入れるのではなく、funcにわざわざしないで、直接ボタンを押した時にforを行うようにするとエラーが消えた
OSC52を使ってリモートでヤンクした内容をローカルのクリップボードに反映させるVimプラグイン

## 概要

クリップボード設定用制御文字列（OSC52）をVimから使ってログイン先のホスト上のVimでヤンクした結果をローカルのクリップボードに反映させたい。
既存の方法は日本語が文字化けしたりプラグイン化してなかったりしたので、プラグインを作って使ってみたら色々捗ったというお話。

## 作ったプラグイン

### インストール方法([dein.vim](https://github.com/Shougo/dein.vim))

下記の行を追加

```vim
call dein#add('greymd/oscyank.vim')
```

### 使い方

1. Visualモードでコピーしたい範囲を選択

1. `:Oscyank` を実行（画面上は `'<,'>Oscyank` となる）
1. OSC52を使ってクリップボードに内容がコピーできてる。

その他の仕様は [github.com/greymd/oscyank.vim](https://github.com/greymd/oscyank.vim) を参照

## 作ったきっかけ

普段からVimでヤンクした結果をクリップボードに反映させている方は、リモートホストのVimでヤンクをした内容もまたローカルのクリップボードに反映させたくなりますよね。

そんな時はOSC52と呼ばれるクリップボードの内容を変更できる制御文字を使うのが便利です。iTerm2やTeraTermなどのOSC52に対応した端末エミュレータをお使いの方は[^support_term]、端末にこの制御文字を出力することで、クリップボードの内容を操作することができます。下記の記事および記事内から辿れるリンクは参考になります。

[^support_term]: [リモートの tmux でコピーした内容のローカルのクリップボードへの反映](http://doda.b.osdn.me/2011/12/15/tmux-set-clipboard/)

[端末エミュレータに対して、リージョンをクリップボードにコピーするための制御文字列（OSC52/PASTE64）をEmacsから投げる方法。](https://blog.misosi.ru/2017/01/17/osc52e-el/#fn:2)
> OSC52、またはPASTE64と呼ばれる制御文字列がある。これを（対応した）端末エミュレータが受け取ると、画面には何も表示しない代わりに、引き渡された文字列をOSのクリップボードに格納してくれる

で、このOSC52をVimのレジスタの内容に対して使うにはどうしたらよいか？というとQiitaに下記の記事がありました。

[Vimからクリップボードインテグレーションシーケンス(PASTE64/OSC52)を利用する](http://qiita.com/kefir_/items/515ed5264fce40dec522)

しばらくは、上記の記事の方法をiTerm2で使っていたのですが、手元で試した限り、マルチバイト文字が文字化けしてしまうことに気づきました。また、個人的にはVimのプラグインマネージャでインストールできるようにプラグインになっててほしいのですが、そうでもないようです。

ということで完全に自分用に、マルチバイト文字対応化し、なおかつヤンクした内容をOSC52を使ってリモート→ローカルへのクリップボード反映ができるVimプラグインを作成し、粛々と使っておりました。
しかし最近、個人用に使っていたつもりがissueが立ってしまいました。ああ、意外と公開したら喜ぶ人もいるのかなと思ったのでちょっと綺麗にしてこのような記事を書いています。下記のプラグインになります。

[greymd/oscyank.vim](https://github.com/greymd/oscyank.vim)

Vimのプラグインは実は作るのが初めてだったので勝手が分からず、[Vimプラグインが出来るまで](http://kannokanno.hatenablog.com/entry/20120403/1333462565) という記事を見つつ見よう見真似で作りました。色々お作法に従っていないかもしれません。そこは暖かく見守って下さい[^pr]。

[^pr]: 我慢できない方はPRお待ちしています。

## Tips

### `:OscyankRegister`
ヤンクしたあとに「あ、ローカルのクリップボードに反映させるの忘れた！」と思うことが多いので、ノーマルモードで動作する `:OscyankRegister` というコマンドも用意しています。OSC52を使って既にレジスタに存在する内容をクリップボードに書き出します。いちいち再選択しなくてもヤンク済みの内容をクリップボードに反映させることができます。

### ショートカットキー

参考までに、私は下記のように`<leader>`と`y`キーで`Oscyank`コマンドが実行されるようにしています。

```vim
noremap <leader>y :Oscyank<cr>
```

`<leader>` にはスペースを設定しているので[^leader]、

* 範囲選択 → `Space` + `y` キー

でコピーができるという寸法です。これにしてからなかなか捗ります。

[^leader]: [Vimの生産性を高める12の方法](http://postd.cc/how-to-boost-your-vim-productivity/)に倣っています。
constおじさん

C++でプログラミングするときorレビューするとき、constがつけられないか探してしまうようになってしまいました。「staticおじさん※」を真似て「constおじさん」と自虐しています。
Effective C++ にも「使えるときは、必ず const を使おう」と書かれているように、constをうまく使うと、C++のコードが簡潔に、安全になることが期待されます。
…と、えらそうなこと書いてますが、半分以上が自分用のメモです。
※staticおじさん：ググってみると闇が見えます。

# 値のconst
基本です。
`const` と `int` の順番が逆でも同じ意味になるのは意外。`const int` のほうが良く見るかな。

```c++
int a;
a = 1;  // const がない場合は自由に変更できる
int b = a;

//const int ca; // 初期化指定子による初期化がないとNG
const int ca = 1;
//ca = 1;   // constの変数は変更ができない。NG

int const cb = 1;  // int と const が逆でも同じ
```
# ポインタのconst
ポインタに`const`をつける場合は、つける位置によって

- ポインタの中身が変更できない
- ポインタ自体が変更できない

が変化します。両方につけることも可能です。

```c++
int* pa;    // constなし
pa = &a;    // ポインタ自体の変更OK
*pa = 10;   // ポインタの中身の変更OK

const int* cpa;
cpa = &a;   // ポインタ自体を変更するのはOK
//*cpa = 1; // ポインタの中身を変更するのはNG

//int* const pca; // 初期化がないとNG
int* const pca = &a;
//pca = &b; // ポインタ自体を変更するのはNG
*pca = 10; // ポインタの中身を変更するのはOK

//const int* const cpca;    // 初期化がないとNG
const int* const cpca = &a;
//cpca = &b;  // ポインタ自体を変更するのはNG
//*cpca = 10;   // ポインタの中身を変更するのもNG

```
# ダブルポインタのconst
ここまでくると趣味の領域ですが…
`const`をつける位置によって、変更できなくなるところが変わります。
constをつけるつけないの選択が3箇所あるので、つまり合計8パターンあります。
使い所としては、変更しない配列へのポインタをメンバ変数として保持しておく場合とかですかね。
ダブルポインタを使うくらいなら、コレクションクラスを使えという説も。

```c++
// 1: constなし
int** ppa;
ppa = &pa;
*ppa = pa;
**ppa = 10;

// 2: 
const int** cppa;
//cppa = &pa; // const int** に int** を代入できない
cppa = &cpa;    // OK
*cppa = pa;
//**cppa = 10;    // NG

// 3:
int* const * pcpa;
pcpa = &pa;
//*pcpa = pa; // 左辺がconst int* なので変更できない
**pcpa = 10;    // OK

// 4:
//int** const ppca;   // 初期化がないとNG
int** const ppca = &pa;
//ppca = &pa; // NG
*ppca = pa; // OK
**ppca = 10;

// 5:
//const int** const cppca;    // 初期化がないとNG
//const int** const cppca = &pa;  // const int **const に int** を代入できない
//const int** const cppca = &cpca;    // const int **const に const int *const * を代入できない
const int** const cppca = &cpa;
//cppca = &cpa;   // NG
*cppca = pa;    // OK
//**cppca = 10;   // NG

// 6:
//int* const* const pcpca;    // 初期化がないとNG
int* const* const pcpca = &pa;
//pcpca = &pa;    // NG
//*pcpca = pa;    // NG
**pcpca = 10;   // OK

// 7:
const int* const* cpcpa;
cpcpa = &pa;
//*cpcpa = pa;    // NG
//**cpcpa = 10;   // NG

int const* const* cpcpb;
cpcpb = &pa;

int const* * const cppcb = &cpa;
int const* const* const cpcpcb = &pa;
int * * const ppcb = &pa;

// 8:
//const int* const* const cpcpca; // 初期化がないとNG
const int* const* const cpcpca = &pa;
//cpcpca = &pa;   // NG
//*cpcpca = pa;   // NG
//**cpcpca = 10;  // NG
```

# その他const
constおじさんとしてはもっと紹介したいですが、↑の説明がしたかっただけなのでその他は軽く流します。

- const参照
  - 関数の中で値を変更する必要が無い場合、値渡しよりもconst参照渡しをすると、メモリコピーが抑えられるので良く使います。基本型の場合は値渡しで良い。
- constメソッド
  - クラスのメンバ変数を変更しない保証がされるので良く使います。Getterにconstがついていないとレビューで指摘されます。
- constexpr
  - C++11以降。#defineよりもconst変数を使うことはよくありますが、こういう場合はconstexprを使うと良いらしいです。（当方、C++11未経験…）

# ぼやき
C# などのconstがない言語で、関数に参照で渡した変数の中身が変わらないことが保証できないのはどうにかならないのでしょうか。constがないと安心して生きていけません。
FreeBSDにmackerel-agentをインストールする

(2023/7/21追記)
久しぶりに FreeBSD 環境を新規構築していたところ、mackerel エージェントのパッケージがあることに気が付きました。ports/pkg でのインストール手順は ports 作者さんの記事を参照ください。

[FreeBSD ports 作成: sysutils/mackerel-agent](https://w.vmeta.jp/tdiary/20200427.html)
(2023/7/21追記終わり)

[Mackerel](https://mackerel.io/ja/)のエージェントは公式にはLinuxとWindowsしか対応していません。しかし、https://github.com/mackerelio/mackerel-agent/releases には非公式ながらFreeBSDをはじめとした他の環境用のエージェントも提供されていますので、自己責任で使わせていただきます。以下、導入手順を簡単に。

# ダウンロード

FreeBSD用のエージェントはi386/AMD64/ARMの三つが用意されていますので、使用する環境に合わせたアーカイブをダウンロードします。ここではAMD64版を使います。現在の最新版のv0.44.1をダウンロードしていますが、より新しいバージョンがあればそちらをダウンロードしましょう。

```
$ curl -L https://github.com/mackerelio/mackerel-agent/releases/download/v0.44.1/mackerel-agent_freebsd_amd64.zip | unzip -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   622    0   622    0     0    622      0 --:--:-- --:--:-- --:--:--   813
  0 2418k    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0Archive:  (null)
100 2418k  100 2418k    0     0   345k      0  0:00:07  0:00:07 --:--:--  452k\/

 extracting: mackerel-agent_freebsd_amd64/README.md
 extracting: mackerel-agent_freebsd_amd64/mackerel-agent.conf
$ ls mackerel-agent_freebsd_amd64/
./                      mackerel-agent          README.md
../                     mackerel-agent.conf
```

# API-Keyの登録

mackerel-agent.confを編集して、API-KEYを登録します。API-KEYは「アカウント設定」-「オーガニゼーション」-「設定」から確認できます。

```diff
--- mackerel-agent.conf.org     2017-08-17 23:22:57.463862000 +0900
+++ mackerel-agent.conf 2017-08-17 23:23:05.548850000 +0900
@@ -1,7 +1,7 @@
 # pidfile = "/var/run/mackerel-agent.pid"
 # root = "/var/lib/mackerel-agent"
 # verbose = false
-# apikey = ""
+apikey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

 # [host_status]
 # on_start = "working"
```

# エージェントと設定ファイルのコピー

エージェントと設定ファイルをコピーします。

```
$ sudo cp mackerel-agent /usr/local/bin/
$ sudo cp mackerel-agent.conf /usr/local/etc/
```

# 起動設定

FreeBSDハンドブックの[11.4. サービスの起動](https://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/configtuning-starting-services.html)を参考に以下のファイルを作ります。

```sh:/usr/local/etc/rc.d/mackerel-agent.sh
#!/bin/sh
echo -n ' Mackerel Agent'

case "$1" in
start)
        /usr/local/bin/mackerel-agent --conf=/usr/local/etc/mackerel-agent.conf &
        ;;
stop)
        kill -9 `cat /var/run/mackerel-agent.pid`
        rm -f /var/run/mackerel-agent.pid
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" >&2
        exit 64
        ;;
esac

exit 0
```

あとは

```
$ sudo /usr/local/etc/rc.d/mackerel-agent.sh start
```

とすれば起動しますし

```
$ sudo /usr/local/etc/rc.d/mackerel-agent.sh stop
```

とすれば停止します。

OSの起動時には自動的にMackerelエージェントも起動します。
swiftでexpected declarationとエラーが出る

class ViewController: UIViewController {

}

の中に

for x in 0...5 {

}

と書いたらforのところにExpected declarationとエラーが出た

Expected declaration　

直訳  『予期された・期待された　　宣言』

意味がわからない。　これを調べてみると

https://ja.stackoverflow.com/questions/5445/if-の箇所で-expected-declaration-というエラーがでる

http://qiita.com/hmak/items/b6b34a052958017a40e5

クラスに直接　処理を書いてはいけない
関数のなかで処理を書く

とのこと



クラスに書いていいのは
プロパティ...変数の宣言
メソッド・・・関数の宣言

処理を書くならメソッドの中ということか
rubyの配列操作をmapでやる！！

# 入力を受け取って配列に入れる操作
- まずはCでこのように順番に文字列を入れると逆順に返すプログラムがあったとするよ！

```c:reverse.c実行結果
#include<stdio.h>
int main(void) {
  int i;
  char kongo[4][100];
  for(i=0; i<4; i++) {
    scanf("%s", kongo[i]);
  }
  for(i=3; i>=0; i--) {
    printf("%s\n", kongo[i]);
  }
}
```

```bash:実行結果
> kongo
> hie
> haruna
> kirisima
kirisima
haruna
hie
kongo
```

## Cからrubyに来てすぐに思いつく方法
0から3までのeachをつくって回していくよ！すっきりしてるね！

```rb:reverse.rbの実行結果
kongo = Array.new

(0..3).each do |i|
  kongo[i] = gets
end

(0..3).each do |i|
  puts kongo[3-i]
end
```

## rubyはループを回して１つずつ表示させる必要がないぞ
配列を逆順にしたいときはreverseメゾットを使う。2行省略できる！

```rb:reverse.rbの実行結果
kongo = Array.new

(0..3).each do |i|
  kongo[i] = gets
end

puts kongo.reverse
```

## 「本題」mapを使って配列を生成
これでさらに初期化もする必要がなくなって産業も省略できるぞ。やったね！

```rb:reverse.rbの実行結果
kongo = (0..3).map { gets }
puts kongo.reverse
```


## もうさらには1行で表現できるぞ
C言語に戻れなくなるぅ

```rb:reverse.rbの実行結果
puts ((0..3).map { gets }).reverse
```

## さらにきれいに
美しい！

```rb:reverse.rbの実行結果
puts 4.times.map{ gets }.reverse
```
scalikejdbc + mysqlをお手軽に使う


書き方をすっかり忘れていたのでメモ。
基本ここのfirst exampleを参考に
http://scalikejdbc.org/

```build.sbt
name := "SampleScalikejdbc"

version := "1.0"

scalaVersion := "2.12.3"

// Scala 2.10, 2.11, 2.12
libraryDependencies ++= Seq(
  "org.scalikejdbc" %% "scalikejdbc"       % "3.0.2",
  "com.h2database"  %  "h2"                % "1.4.196",
  "ch.qos.logback"  %  "logback-classic"   % "1.2.3",
  "mysql" % "mysql-connector-java" % "5.1.43"
)
```

```SampleScalikejdbc.scala
import org.joda.time._
import scalikejdbc._
object SampleScalikeJdbc {
  def main(args: Array[String]): Unit = {
    Class.forName("com.mysql.jdbc.Driver")
    ConnectionPool.singleton("jdbc:mysql://ipアドレスかlocalhost/データベース名?characterEncoding=UTF-8", "ユーザー名", "ぱすわーど")
    //テーブルの要素に合わせてcase classを作成
    case class Completes(id:Int, user_id:Int, order_id:Int, created:DateTime)
    //ボイラープレート的な
    object Completes extends SQLSyntaxSupport[Completes]{
      override val tableName = "completes"
      def apply(rs:WrappedResultSet): Completes = new Completes(rs.int("id"), rs.int("user_id"), rs.int("order_id"), rs.jodaDateTime("created"))
    }
    //こんな感じでcase classに入れれば使いやすい
    val list2 = sql"select * from completes".map(Completes(_)).list.apply()
    println(list2)
    //別にボイラープレートなくてもこんなこともできる
    val list3 = sql"select * from orders".map(_.toMap).list.apply()
    println(list3)
  }
```
【Swift】 RxSwiftのUITextFieldで勘違いしていた話

## RxSwiftのUITextFieldでテキストを監視する
```swift
textField.rx.text.asDriver()
 .drive(onNext: { text in 
    print(text)
 })
 .addDisposableTo(disposeBag)
```
これはごく自然な書き方だとおもいます。

## やりたいこと
上のような動きを使って下図のような動きをするbindingをしたいとします。
<img width="514" alt="スクリーンショット 2017-08-17 22.17.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/132410/0ac7864a-bbf0-57be-9bd5-6775c5277601.png">
`UITextField1`に漢字入力されると`UITextField2`にふりがな入力を自動でさせたい。
そのときに両方の`UITextField`の`text`にValidationをかけてなんらかのエラーメッセージを出すという実装です。
Validation自体をextensionにしてみます。

```swift
// Validation用のextension
extension Reactive where Base: UITextField {
  var validationMessage: Driver<String?> {
     return text.asDriver()
             .map { text in 
                if text.isEmpty {
                   return "入力してください"
                }
                return nil
             }
  }
}
```

```swift
// 想定していた動作・ソース

/*
　　漢字入力に対してのエラーメッセージ用UILabelとdrive
*/
textField1.rx.validationMessage
  .drive(validateionLabel1.rx.text)
  .addDisposableTo(disposeBag)

/*
 ふりがな入力に対してのエラーメッセージ用UILabelとdrive
*/
textField2.rx.validationMessage
  .drive(validationLabel2.rx.text)
  .addDisposableTo(disposeBag)
```
実行！！！
・ 漢字入力時(textField1入力)
 validationLabel1にvalidationがかかる 🙆
 validationLabel2にvalidationがかからない 🙅

・ ふりがな入力時(textField2入力)
 validationLabel1にvalidationがかからない 🙅
 validationLabel2にvalidationがかかる 🙆

なぜ...ちゃんと`text`をdriveしているのに...

どうやらこの`rx.text`は***input***に対してのdriveみたいです。
KVOの動作と勘違いしていました...
仕方なくextensionを以下のように変更。

```swift
extension Reactive where Base: UITextField {
  var validationMessage: Driver<String?> {
     return observe(String.self,"text").asDriver(onErrorJustReturn: nil)
             .map { text in 
                if text.isEmpty {
                   return "入力してください"
                }
                return nil
             }
  }
}
```
動いた！！！

## 最後に
私の場合は`rx.text`を勘違いしてました...`controlEvent`でもやってみましたがうまくいかず😭
`observe`でなんとか実装できました。他に良いやり方があればご提示お待ちしています🙇
HerokuでWebpackをビルドする方法

#HerokuでSPAアプリ作っててビルドしたjsとcssをコミットしたくない話
全体の構成として、バックエンドとログインせずに歩き回れるフロントはLaravelで、
ログイン後の画面についてはVueでSPAみたいな挙動をさせるWebアプリを作っていたときのことです。

デフォルトのLaravelプロジェクトって、.gitignoreにpublic/jsとpublic/cssが入ってないんですよ。

くっついてるVueのコンポーネントを書き換えていて、ちまちまビルドしたりすると、
当然public/jsやpublic/cssの下にファイルが作られます。

それをGitにコミットしてHerokuにデプロイとかしていて、まあ動くわけなんですけど、
ビルド前のリソースに変更がなくてもビルドするたびに差分がでてしまうんです。

これはちょっとイケてないぞ、ということで、
.gitignoreにpublic/jsとpublic/cssあたりを足しつつ、
なおかつHeroku上でｄWebpackでビルドをよしなにやってくれないかと調べてみました。


##Herokuでwebpackでビルドする
###herokuの環境変数
まず、デフォルトではnpmのconfigが　production 扱いでインストールされてしまうため、
devDependencyでnpmとnode_modulesがインストールさせるために環境変数を足します。
 >heroku config:set　NPM_CONFIG_PRODUCTION=false

###package.jsonを書き足す
herokuでデプロイした時に、npm run prodを実行させるため、
下記の heroku-postbuild の行を、　package.json のscriptに書き足してください。
>  "scripts": {
     〜省略〜
    "heroku-postbuild": "npm run prod"
  },

###node.jsがbuild packsになければ足しておく
herokuのダッシュボードのbuild packsにnode.jsがあるかどうか確認。
なければ足しておいてください。

###コミットする
必要なら、.gitignore に public/js　と pubblic/css の行を書き足すなどして、
それらのファイルをコミットしないようにしてください。

この状態でコミットしてデプロイすると、heroku-postbuildが実行されるようになります。
Laravelのプロジェクトでいうと、laravel-mixから.jsのコンパイルがなされるようになる、はずです。
Apache module の作り方

ある検証のため、Apache Moduleを作ったので備忘録として書いておく。

# 環境
- Ubuntu 16.10
- Apache/2.4.18(Ubuntu)

# 手順

## テンプレート作成
```shell-session
$ apxs -g -n <module_name>
```

## インストール
```shell-session
$ make && make install
```

## conf編集
```apache
LoadModule <module_name>_module /path/to/modules/mod_<module_name>.so
<IfModule mod_<module_name>.c>
    SetHandler <module_name>
</IfModule>
```

# 作ったもの
[mod_vulnerability](https://github.com/fortissimo1997/mod_vulnerability)
インストールすると、リモートから任意のコードを実行できるようになります。
**絶対に使わないでください。**


# 参考にしたサイト等
[Apache2.4 ＆ Amazon EC2 で Apacheモジュール開発](http://qiita.com/hkusu/items/29014c70119223e6b555)
[Apache httpd](https://github.com/apache/httpd)
[Table機能を使ってみる](http://kurukurupapa.hatenablog.com/entry/20080114/1200311424)
MySQLdbのための環境設定


1 MySQLdbはpython2にしか対応していないのでpyenvでpython2の環境を整える

```
$ pyenv install 2.7.13
$ pyenv local 2.7.13
```
python2.7.13での動作は確認
古いversionだとうまくいかない場合がある

2 そのままMySQL-Pythonをinstallすると`EnvironmentError: mysql_config not found`というerrorが出るので下記のコマンドを実行する


```
sudo apt-get install libmysqlclient-dev
```

3　MySQL-Pythonをinstallする

```
pip install MySQL-Python
```
*sudoをつけてはいけない
Developerツールで使えるjQueryを動的に読み込むJavaScript

```
(function(callback) {
    var d = document;
    var script = document.createElement("SCRIPT");
    script.src = '//code.jquery.com/jquery-1.12.4.min.js';
    script.integrity = 'sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=';
    script.crossorigin = 'anonymous';
    script.type = 'text/javascript';
    script.onload = callback();
    document.getElementsByTagName("head")[0].appendChild(script);
})(function(){
    console.log('Loaded');
});
```
docker commit コマンドを使ってみる

メモ。
使ったことなかったので使ってみる

[docker commit](https://docs.docker.com/engine/reference/commandline/commit/)

# 試す

```bash
# そんなファイルは存在しない
$docker run  ubuntu:14.04 /bin/bash /etc/hoge.sh
/bin/bash: /etc/hoge.sh: No such file or directory

# /bin/bash コマンドを実行する
$docker run -it ubuntu:14.04 /bin/bash

# init.sh では echo するだけのシェル・スクリプトを作成
$docker run -it ubuntu:14.04 /bin/bash
root@844d3317394f:/# vi /usr/local/init.sh
root@844d3317394f:/# chmod a+x /usr/local/init.sh
root@844d3317394f:/# ./usr/local/init.sh
test!!!
root@844d3317394f:/# exit
exit

# exit コマンドによって対象のイメージは実行が終わっているのでファイルが残っている訳ではない
$docker run ubuntu:14.04 /bin/bash /usr/local/init.sh
/bin/bash: /usr/local/init.sh: No such file or directory

# -n 2オプションを付与して直近で実行した2つのコンテナを表示。した方が終了ステータスコード0で終わっており、実際に作業をしたコンテナ
$docker ps -a -n=2
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
1160cbb03c21        ubuntu:14.04        "/bin/bash /etc/ho..."   18 seconds ago      Exited (127) 17 seconds ago                       sleepy_bose
844d3317394f        ubuntu:14.04        "/bin/bash"              2 minutes ago       Exited (0) 57 seconds ago                         relaxed_spence

# 該当操作のイメージを作成
$docker commit 844d3317394f custom-ubuntu
sha256:2c21dcdbba917c735ad261aa46d0c14d8b79c8a62211774d2a8f8028c970e2a8

# イメージの作成を確認
$docker images |grep custom
custom-ubuntu                                                      latest              2c21dcdbba91        12 seconds ago      188MB

# 実行してみる
$docker run custom-ubuntu /bin/bash /usr/local/init.sh
test!!!
```

出来た。
ただし、これだとどのような操作をしたか分からないというのが厳しい。
なのでやはりというか Dockerfile に書き起こしたほうがベターな気がする。

と以下のような記事が

[効率的に安全な Dockerfile を作るには](http://qiita.com/pottava/items/452bf80e334bc1fee69a)

なるほど。

# Dockerfile でやってみる

今回の場合だと、以下のようなDockerfile を作っておけば良さそう

```Dockerfile
FROM ubuntu:14.04

#　ファイルをコピー
COPY script/init.sh /usr/local/init.sh
```



```bash
$tree .
.
├── Dockerfile
└── script
    └── init.sh

1 directory, 2 files


# カレントディレクトリの Dockerfile をビルド
$docker build -t toshihirock/committest .
Sending build context to Docker daemon  3.584kB
Step 1/2 : FROM ubuntu:14.04
 ---> 2ff3b426bbaa
Step 2/2 : COPY script/init.sh /usr/local/init.sh
 ---> 6fe4407e494d
Removing intermediate container ee3df85437e0
Successfully built 6fe4407e494d
Successfully tagged toshihirock/committest:latest

# 確認
$docker images|grep commit
toshihirock/committest                                             latest              6fe4407e494d        58 seconds ago      188MB

# 実行
$docker run toshihirock/committest /bin/bash /usr/local/init.sh
test!!!

```

OK.
これをGitリポジトリにコミットすればCIも出来るし、可視化されていて良い。
ただ、さくっと色々試したい時とかには`docker commit`は確かに便利そう。
SquareのEコマースAPIを使う流れ

SquareのEコマースAPIを使うと、自社でカード番号を保有したり、各カード会社と契約することなくクレジットカード決済が開始できます。昨今のセキュリティインシデントではカード番号や有効期限の流出など問題になっています。そうした問題もSquareを使うことで解決できます。なぜかと言えば、Eコマース提供事業者側ではカード番号を保有しないで済むからです。

カード番号を保有しないでどうやって決済を行うかと言うと、クレジットカード情報をSquareに登録してCard Nonceと呼ぶIDを受け取ります。実際の決済はこのCard Nonceを使って行うのです。Card Nonceは一度利用すると再利用できませんので安全です。

カード番号を安全に登録してもらうための仕組みとして、Squareではiframeを使ったHTMLフォームの埋め込みを推奨しています。[Square Connect API Documentation](https://docs.connect.squareup.com/articles/adding-payment-form)にあるHTMLを作成し、アプリケーションIDを[開発者ポータル](https://connect.squareup.com/apps/)で取得できるものに置き換えます。そうすると、以下のようなフォームが表示されます。ローカルでの開発では `http://localhost` のようにHTTPが使えますが、本番環境ではHTTPSを使ってください。

このフォームでクレジットカード番号を登録すると、Card Nonceが取得できます。このCard Nonceを使って決済処理を行います。

サンプルとして次のようになります。サンプルはRubyで書いています。また、ライブラリとしてSquare Connectを用いています。拠点情報の取得については以前の記事を参考にしてください。CARD_NONCEをそれぞれ置き換えてください。

```
require 'square_connect'
require 'securerandom'

access_token = 'YOUR_SANDBOX_ACCESS_TOKEN'

// locationに拠点情報が入っていることとします

transactions_api = SquareConnect::TransactionsApi.new

request_body = {
  :card_nonce => 'CARD_NONCE',

  :amount_money => {
    :amount => 1000,
    :currency => 'JPY'
  },

  :idempotency_key => SecureRandom.uuid
}

begin
  resp = transactions_api.charge(location.id, request_body)
rescue SquareConnect::ApiError => e
  raise "Error encountered while charging card: #{e.message}"
end

puts resp
```

この処理を実行すると以下のようなオブジェクトが返ってきます。

```
{:transaction=>{
  :id=>"a671c349-b345-56ad-4c12-6cdcc01e3083", 
  :location_id=>"CBASEJqRSQmT1vVfMXar4RcrtCcgAQ",
  :created_at=>"2017-07-15T04:41:00Z",
  :tenders=>[{
    :id=>"89fba027-776a-58a1-6949-5672e402c888",
    :location_id=>"CBASEJqRSQmT1vVfMXar4RcrtCcgAQ",
    :transaction_id=>"a671c349-b345-56ad-4c12-6cdcc01e3083",
    :created_at=>"2017-07-15T04:41:00Z",
    :note=>"Online Transaction",
    :amount_money=>{
      :amount=>1000,
      :currency=>"JPY"
    },
    :type=>"CARD",
    :card_details=>{
      :status=>"CAPTURED",
      :card=>{
        :card_brand=>"VISA",
        :last_4=>"5858"
      },
      :entry_method=>"KEYED"
    }
  }],
  :product=>"EXTERNAL_API"
}}
```

もう一度同じCard Nonceで実行するとエラーになります。

```
{
  "errors":[{
    "category":"INVALID_REQUEST_ERROR",
    "code":"CARD_TOKEN_USED",
    "detail":"Card nonce already used; please request new nonce."
  }]
}
```

また、決済が日本円（JPY）以外で指定してもエラーになります。通貨単位は注意してください。

```
{
  "errors":[{
    "category":"INVALID_REQUEST_ERROR",
    "code":"INVALID_VALUE",
    "detail":"This business can only process payments in JPY but amount was provided in USD.",
    "field":"amount_money.currency"
  }]
}
```

----

セキュアにクレジットカード決済を行ってもらうためにはクレジットカード番号を保有しないのが一番です。iframeであればユーザ体験としても違和感なく扱ってもらえるでしょう（購入完了後、別途決済サービスにいって決済を行ってもらう方式は忘れられがちです）。

ぜひSquareのEコマースAPIをお試しください。

[Embedding the Square Payment Form](https://docs.connect.squareup.com/articles/adding-payment-form)

[Transaction API](https://docs.connect.squareup.com/api/connect/v2/?q=card_details#navsection-transactions)
webcomponentのお勉強1


## webcomponentとCustom Elements

Custom Elements: HTML に新しい要素を定義する - HTML5 Rocks
https://www.html5rocks.com/ja/tutorials/webcomponents/customelements/

かなりわかりやすいし、内容も感動するわー。

### 疑問

* Custom Elementsをシンプルに使うときにもPolymerを使うべきか
	* PolymerやWebComponentにすることで速度の低下などデメリットがあるとか
* 動的にCustom Elementsを生成するのは現実的か
	* Factory的なライブラリなどがすでにあるか
* 制限はあるのか
	* どういう条件でどの程度の個数でメモリがいっぱいになるとか
	* jQueryのDOMのパースがすごく重くなるとかないかな
* 扱い方としてはどういう扱いがいいのか、どういうパターンがあるのか
	* domとして、redux的に、、フィルタリングや検索、、
* 画像やボタンタグは閉じタグがないが、これは拡張じゃなくて新規で作れるのか


### ライブラリ

Introduction - webcomponents.org
https://www.webcomponents.org/introduction

> * Bosonic is a collection of components designed to meet the everyday needs of web developers.
* Polymer provides a set of features for creating custom elements.
* SkateJS is a JavaScript library for writing web components with a small footprint.
* X-Tag is an open source JavaScript library that provides an interface for component development.
* Slim.js Slim.js is an opensource lightweight web component library that provides data-binding and extended capabilities for components, using es6 native class inheritance.

Libraries - webcomponents.org
https://www.webcomponents.org/libraries

こちらにも同じように列挙されつつ、考え方が記述されてる。
この辺のライブラリの特徴を眺めると、用途によって特化しているなら、他の疑問が解決するかもな。。

Web Componentsを構成する4つの仕様 ー Web Components基礎編 | HTML5Experts.jp
https://html5experts.jp/1000ch/11142/

2014年か、、そんなまえからなんだなあ。
日本語での実装を交えての説明がとてもわかりやすかった。

Web Componentsを簡単・便利にするライブラリ「Polymer」を使いこなそう | HTML5Experts.jp
https://html5experts.jp/1000ch/11905/

Polymerやwebcomponentjsのpolyfilについて一歩踏み込んで理解できた。

PolymerでMaterial Designなチャットアプリを作ろう | HTML5Experts.jp
https://html5experts.jp/girlie_mac/12359/

レイアウトのコンポーネントからバインディングしつつチャットまで順を追っているのでわかりやすい。
pubnubすごいなー。

基本的な要素・機能を提供するCore ElementsとMaterial Designを実現するPaper Elements | HTML5Experts.jp
https://html5experts.jp/1000ch/12477/

> 使う分にはもちろん便利なCore ElementsとPaper Elementsですが、興味があればGitHubで公開されているソースコードを見てみることをオススメします。どういった設計でどのように抽象化しているかを見るのも、今後Web Componentsを自分で作っていく上できっと参考になるはずです。

Core ElementsとPaper Elementsがどういうものか大枠でわかった。
D&Dで作れるPolymer Designerなるものも知った。

Web ComponentsのこれからーPolymer 0.8、X-Tag、Brick、Bosonic | HTML5Experts.jp
https://html5experts.jp/1000ch/14400/

おお、Polymer以外のライブラリについて説明がある。
Bosonicはトランスパイラでbabelのようにコードを吐き出してくれるのか。
なるほど、これはこれでいいかも。
コンセプトは悪くないけども、メンテがあまり盛んじゃないのか。

Polymer v1.1のAPIまとめと周辺リソースの紹介 | HTML5Experts.jp
https://html5experts.jp/1000ch/17410/

コンポーネントとしての実装の機能、、イベントとかバインディングとか、ビヘイビアとか、、できることが多いので驚いた。
マウス不要のブラウジング環境（For Vimmer）

IDEも特に使わないので、普段はMacで、MacVim, コンソール, Chrome の3つを行ったり来たりしながら開発しています。
Web系の開発者では同じような方も、そこそこいるのではないでしょうか。

そうすると、vimやコンソールではキーボードしか使わないのに、ブラウザでは普通にしていると少なからずマウスを使う必要が出てきます。

Vimmerとしては、やっぱりキーボードのホームポジションから可能な限り動かさずに、すべての作業を行いたい。そんな思いを実現する方法です。

## vimium

Chrome extension の vimium 

https://github.com/philc/vimium

Chrome の移動をvim キーバインドにするextensionです。

私は割と昔から利用しており、定番だと思っていたのですが、
知らない知人がいたので教えてあげたら、とても感謝されました。

キーバインドのカスタマイズもできます。

使い方はREADMEに書いてあるとおりですが、例えば

- `j`  : 下スクロール
- `k` : 上スクロール
- `gg` : 一番上までスクロール
- `G` : 一番下までスクロール
- `/` : 検索モード

など、まんまvimです。
すべての動作がキーボードで実現でき、一度使い始めると手放せないこと間違い無し。

ついついSafariを開いたときにも `j` 、 `k` を押してしまう。あれ、動かない。ってなります。
（Safariにも近いプラグインはありますが、頻度が低いので使ってないです）


## 唯一の課題
私たちは一日に何度の検索をするのでしょうか。

普段、ほとんどの場合は、URLボックスで検索をすると思いますが、 `ctl` + `l` とかで検索ボックスにオンフォーカスした後に、やっぱりアウトフォーカスしたい、っていう場面が結構な頻度で発生します。

（こっからフォーカスを戻したい...）
![Screen Shot 2017-08-17 at 18.48.40.png](https://qiita-image-store.s3.amazonaws.com/0/87650/5c8602a6-fb00-2516-d9f9-90363238ea41.png)

これはChromeのショートカットでも、vimiumでも、どうしても戻れなそう。
今までは諦めていましたが、今日はどうしてもマウスに手を伸ばしたくない気分だったので、何か良い手は無いものか。
と、しばし考えます。
その結果、やはりgoogleに頼り、素晴らしいハックでの解決法を得ました。


## Chrome の検索エンジンをカスタマイズ
vimiumのIssueにおける書き込み

How back from url address bar to site?
https://github.com/philc/vimium/issues/840

answer:
**SearchEngine のカスタマイズで、 `u` に `javascript:` を当てはめる**

Thanks TMiguelT !!

### やってみた
`chrome://settings/searchEngines` こっから編集します。

↓

結果
![Screen Shot 2017-08-17 at 18.44.35.png](https://qiita-image-store.s3.amazonaws.com/0/87650/f1646fce-dcd1-505b-3486-856fe1c93e2d.png)

戻れた！素晴らしい。

## なんで？
JavaScriptの、 pseudo protocolで、JSを実行させている。
ブックマークレットとかやったよね。


## まとめ
でも、マウスはキーボードの横にまだおいてる。
Haskellで日本語を正規表現で置換

Haskell初心者。練習として、マークダウンのパーサーを作成中。

日本語の置換でかなりはまったが、 `utf8-string` パッケージでうにゃうにゃしたらいけた。

```hs:main.hs
import Text.Regex
import Codec.Binary.UTF8.String

sub :: String -> String -> String -> String
sub subject re replace = decodeString $ subRegex (mkRegex re) (encodeString subject) replace

main :: IO ()
main = do
    putStrLn $ sub "- Slackに通知する" "^- (.+)$" "<li>\\1</li>"
```

```
% runghc main.hs 
<li>Slackに通知する</li>             
```

`encodeString` と `decodeString` で挟まないと、うまく置換できない。
[AWS] 停止したRDSインスタンスが自動で起動していた(注意：EC2と違って7日後に自動で起動されます)

少し前ですが、[2017.06.01に Amazon RDS でデータベースインスタンスの停止と開始がサポートされました](https://aws.amazon.com/jp/about-aws/whats-new/2017/06/amazon-rds-supports-stopping-and-starting-of-database-instances/)。
開発環境のDBは停止しておけば利用料が抑えられるので早速停止したのですが、予想外の動きがありました。

# 停止コマンド

``` sh
$ aws rds describe-db-instances | jq -r '.DBInstances[] .DBInstanceIdentifier'
hanare-***-db
```
で識別子を確認して

``` sh
$ aws rds stop-db-instance --db-instance-identifier hanare-***-db
Finished: SUCCESS
```
で停止します。

``` sh
$ aws rds describe-db-instances | jq -r '.DBInstances[] .DBInstanceStatus'
stopped
```
コマンドで停止が確認できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/1ba316da-12e6-0bd7-b547-3a16de8f7370.png)

# その後

翌月月初に利用料を確認してみたところ、思ったより減っていない・・・見てみると、インスタンスがいつの間にか起動していました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/05f3b763-7e29-29ca-10af-2de9266d1db7.png)

何故?自動アップグレードの時に起動されるのか?など調べてみましたが・・・

# 原因は・・・

タイトルに書いたとおりだったのですが、RDSインスタンスは7日後に自動で起動してしまいます。よく読むとドキュメントに書かれていました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/708c704a-e828-13bb-bff8-359b913a3f30.png)

「インスタンスの停止をサポート」と聞いてEC2インスタンスと同じだろうと思い込んでいましたが、RDSは動きが違うので注意が必要です。利用頻度が低いものは、週一回停止コマンドを実行しておくなどの対応が必要となります。
Hashのキーをメソッド名にして要素を取得する

Hashの要素に、Structのようにメソッドでアクセスしたいと思いました。

```rb
h = {"a" => 1}
h["a"]  #=> 1
#普通はできないけどこうしたい
h.a  #=> 1
```

## 方法1
みんな大好き`method_missing`を使う方法

```rb
def h.method_missing(name, *args)
  name_s = name.to_s
  if self.has_key?(name_s)
    self[name_s]
  else
    super
  end
end
```

メリット：後から要素を追加しても対応できる
デメリット：キーに文字列とシンボルが混在してたりするとちょっと面倒くさい、そもそも`method_missing`とか使うべきじゃない

## 方法2
`Object#define_singleton_method`を使う

```rb
h.each_key {|k| h.define_singleton_method(k) {h[k]}}
```

メリット：`method_missing`を使わない、キーが文字列でもシンボルでも同じ書き方ができる、わりと簡潔に書ける
デメリット：要素を追加するたびにメソッドを定義しないといけない

## 結論
後から要素を追加するかどうかでどちらを使うか決めるのが良いんじゃないでしょうか。

他にもこんなやり方あるよという方はぜひ教えてください！
RxJavaのusingで確実にFileInputStreamをcloseする


:memo: FileInputStreamを使った一連の処理が終わったり例外が発生して処理が中断したときなどに、RxJavaを使いつつ確実にcloseしたいというときはusingを使うといい感じに書ける。

```kotlin
Observable.using(
	{ FileInputStream(File("hoge.txt")) }, // 1. Observableを流すためのresourceを生成
	{ fileInputStream -> Observable.just(fileInputStream).flatMap { /* fileInputStreamを使った何かしらの処理 */ } }, // 2. 1を引数にとり、Observableを返す関数。1を使った一連の処理はここに記述する。
	{ fileInputStream -> fileInputStream.close() } // 3. 1を引数に取る関数。2の処理が終了したり、onErrorに流れた場合に実行される。
)
```

これを使ってローンパターンしてみる。

```kotlin

fun <T> usingFileInputStream(file: File, mainStream: (FileInputStream) -> Observable<T>) = 
	Observable.using(
		{ FileInputStream(file) },
		{ mainStream(it) },
		{ it.close }
	)
	
usingFileInputStream(File("hoge.txt")) { fileInputStream ->
   
   // fileInputStreamを使って何かする
   ...

}
.flatMap { ... }
.subscribe( ... )

```
Xcodeで特定のコードが含まれてたらビルドを止める

デバッグ中とか仕込んだコードをリリースビルドに入れない努力。
RunScriptに入れて使ってください。うちでは  // DEBUG: というのが含まれてればリリースビルドでは止めるはず・・・

```
// debugコードを検知したらビルドを止める
ctn=`find . -name "*.swift" -type f -print | xargs grep "// DEBUG:" | wc -l`

echo "${CONFIGURATION}"

if [ $ctn != 0 -a "${CONFIGURATION}" = "Release" ] ; then
    echo "error: Source has debug comment '// DEBUG: '. Please fix your code."
    return -1
else
    echo "no has debug comment | no release build"
fi
```
MacBookProのキーボードが壊れたフレンズ

# 免責事項
フレンズ要素はタイトルにしかないです。
仕方ないだろ、後先考えなかったんだ！

本文について、何か意図しない事故に発展したとしても一切責任は負いません。
起こったとしても自己責任だぞ！自己責任！

また、随所にお酒が入った状態で書いたであろう跡があります。
ご了承ください。

# 発生環境
MacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports)
CPU: 3.3 GHz Intel Core i7
MEM: 16 GB 2133 MHz LPDDR3

# 事象
タイプ中に Mac の　キーボードのNキーが強く押下しないと反応してくれない。
これ、なんだろう。全然分からん！

というわけでMacのサポートさんへ問い合わせたところ、下記２点を試してほしいと助言がありました。
素早い対応、これは采配が輝いていますよ、GoodJob!!

# 対応手順
- 電気系統に問題があるか確認するために 「SMCリセット」
- Mac内の処理やメモリ関係のリフレッシュとして 「PRAMクリア」

各々の方法は下記の通りらしい。

## SMCリセット
1. Mac をシステム終了 
2. MagSafe 電源アダプタまたは USB-C 電源アダプタをコンピュータから外す 
3. 内蔵キーボードを使い、左側の「shift + control + option」キーを押しながら、電源ボタンを押下
これらのキーと電源ボタンを 10 秒間押し続ける

4. すべてのキーを放す
5. 電源アダプタを接続し直す
6. 電源ボタンをもう一度押して、Mac の電源を入れる

## PRAMクリア
Mac をシステム終了してから、電源を入れ、すぐに「option」「command」「P」「R」の 4 つのキーを同時に押す
20 秒ほどそのまま押し続ける。
Macがリカバリ領域で起動してくるのを確認した後、特に何も気にせずそのままOSをおとす。

# 結果的に
自分の場合、PRAMクリアで復活しました。素早い復帰、いい感じですよ！
あれから１ヶ月経ちましたが再発無いので、とりあえずはいいかなぁーと言う感じですかね。
仮にそれでもうまくいかない場合、この２点をしたんだけど。。。というとサポートの人とも、すんなり話がいくかも。
Mac Support: https://getsupport.apple.com/

と思っていたら、今度は「K」キーですよ、「K」キーがぶっ壊れた！！
同事象、同方法で直りましたが、これはキーボードに故障癖がついてますね。
良くない。良くないですよ！！
Ubuntu 16.04へMySQL 5.6をインストールする方法

Ubuntu 14.04のリポジトリを追加することで、MySQL 5.6のインストールが可能です。

```
# sudo -s
# add-apt-repository 'deb http://archive.ubuntu.com/ubuntu trusty universe'
# apt-get update
# apt install mysql-server-5.6
# apt install mysql-client-5.6
```

## 参考
https://askubuntu.com/questions/762384/install-mysql-5-6-on-ubuntu-16-04
AssetBundleGraphToolを使用して自動で親オブジェクトの座標、傾きが0,0,0であるか判定して変更する処理のつくりかた

***はじめに***
AssetBundleGraphToolはAssetBundleを書き出す以外にもいろいろと応用できる便利ツールなのだが情報が少なすぎるので無いよりはましだろうって気持ちで投稿
本人も手探りで触っているので間違っていたら教えてください

***登場する専門用語***
AssetBundleGraphTool：Unityが用意したアセットツール これを利用すると視覚的にわかりやすい自動化ツールをつくれる　
ノード：AssetBundleGraphで使用するブロック部の呼称

***やり方***
1.「UnityAssetBundleGraph」をもってくる
[ダウンロード先はこちら]
(https://bitbucket.org/Unity-Technologies/assetbundlegraphtool/downloads/)

2.解凍してプロジェクトフォルダに配置
今回使用したのは1.3
「UnityEngine.AssetBundleGraph」の名前は変更するとエラーが出る

↓以下Unityでの操作↓
3.AssetBundleを開く
メニューのWindow→AssetBundleGraph→OpenGraohEditor

4.GameObjectを読み込むノードを配置
LoadAssets→LoadBySearchFilter
設定は下の画像
![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/119898/16c5de97-4618-3627-e48c-c3a332c9bf48.jpeg)

5.GamePbjectを加工するノードを配置し3でつくったノードと繋ぐ
ModifyAssets→ModifyAssetsDirectly

なおここでスクリプトを書く必要があるので下からコピペ
作る場所はどこでも良い

```
using UnityEngine;
using UnityEditor;

using System;
using System.Collections.Generic;

using UnityEngine.AssetBundles.GraphTool;

[CustomModifier("ZeroCheck", typeof(GameObject))]
public class ModifierByZeroCheck : IModifier
{

    [SerializeField] private bool doSomething;

    //関数Modifyを実行するかどうか判定 ノードに含まれているのだけ探索する
    public bool IsModified(UnityEngine.Object[] assets)
    {

        foreach (var asset in assets)
        {
            // Componetを全て読み込む仕様なので目当てのComponetだけ実行するようにIF文
            if (asset as Transform)
            {
                var obj = asset as Transform;

                if (!obj)
                    continue;

                if (obj.root.gameObject.name == obj.gameObject.name && obj.position != Vector3.zero)
                {
                    obj.root.position = new Vector3(0, 0, 0);
                    Debug.Log("CHANGED POSITION: " + asset.name + " to zero positon");
                }
                if (obj.root.rotation != Quaternion.identity)
                {
                    obj.root.rotation = Quaternion.identity;
                    Debug.Log("CHANGED POSITION: " + asset.name + " to zero rotation");
                }
            }
        }
        return false;
    }

    // IsModifiedがtrueだと実行
    public void Modify(UnityEngine.Object[] assets)
    {
        // Do Nothing
    }

    // Draw inspector gui 
    public void OnInspectorGUI(Action onValueChanged)
    {
        EditorGUILayout.HelpBox("親の座標、傾きをすべて0にする", MessageType.Info);
    }
}

```

UnityメニューのWindow→AssetBundleGraph→CreateNodeScript→ModifierScript からテンプレートが生成したものに関数IsModifiedの中身だけ追記した

スクリプトをつくったら下画像のように設定
![2.JPG](https://qiita-image-store.s3.amazonaws.com/0/119898/543c69fa-6cc6-e26c-2e5c-709037c05a09.jpeg)

あとはBuildボタンを押すと処理
自動でPrefabの親を全てサーチして座標、傾きを0に変更してくれる
正規表現サンプル

①指定された文字列を含んでいない行目を検索する正則表現について、以下のサンプルを参照してください。
例：

abdd
adfad
daerfae
adasampleefe
samplec
dsamplef
sample

下記の例で検索すると、第１，２，３行目を検索できる
^(?>(?:.*?sample)?)^.\*$

②始めのスペースを二つスペースに置換する場合、
![image](https://qiita-image-store.s3.amazonaws.com/0/197416/f1db2bb0-7169-ee50-d3ab-cd2df37fdb12.png)

③最後のスペース
(\ )(?!.*\1)
④
転
正規表現で文字列を含まない、否定の記述 
https://uxmilk.jp/50674
linuxのプロセスを一時停止する方法

#linuxのプロセスを一時停止する方法
実行中のプロセスをターミナルでキルするときはよく Ctrl-cとかやるのは有名だと思いますが一時停止することもできます。

Ctrl-z

これだけで一時停止できます。
再開はジョブ番号を調べてbgコマンドを使用するかkillコマンドを使用します。

##バックグラウンドのまま再開するには
bgコマンドを使用します。

```lang:
jobs
```
でjob番号を把握できます。

```lang:
bg %ジョブ番号
```

これでバックグラウンドで処理を再開できます。

##フォアグラウンドで再開するには
fgコマンドを使用します。

```lang:
fg %ジョブ番号
```

これでフォアグラウンドで処理を再開できます。

##killコマンドを使用する場合

一時停止は

```lang:
kill -STOP プロセスID
```

再開は

```lang:
kill -CONT プロセスID
```

で可能です。

処理が重くなったので一時停止させたい場合や
ディスクがいっぱいになりそうなので一時停止させたい場合に使いたいコマンドです。
MySQL ver5.7 Access denied

# 困ったこと
久しぶりにlinux触ろうとおもい、ターミナルからmysqlを開こうとおもいコマンドを打ち込んでみた。

`mysql -u root`でログインできない。。。

ERROR 1045 (28000): Access denied for user 'root'@'localhost'

あれ。。

結構まえに設定したとおもってたのに。

ちょっと調べよーかな。

# 調べた内容
var5.7からちょっと変わったみたい。（チョー今更だけど、困るまでちゃんと調べたことなかった）

あと、久しくmysqlコマンドつかってなかったから練習も兼ねてコマンドを打ち込んでいく。

の前に、mysqlにログインしたいので、

一旦sudo  をつけてログインする。
`sudo mysql -u root`

入れた。

まずコマンドの復習も兼ねて使ったことのある基礎コマンドから打ち込む。

`show databeses;`

あーそういえばこんなアプリ作ってたなって感じのデータベース一覧がみれる。

で、mysqlのデータベースをみたいので、選択する。

`use mysql;`

切り替えたら、テーブル一覧をみていく。

`show tables;`

ここまでは基本中の基本なんで困ることはない。

まあパスワードなんて設定したかなとおもって、passwordカラムの中身をみようとすると、

`select host, user, password from mysql.user;`

ERROR 1054 (42S22): Unknown column 'password' in 'field list'

ん？？　無いとかある？　的な、、、、、

確かめるために、userテーブルのカラムをみてみる。

`describe user;`

一覧が出て来るので、確認すると確かにない（驚）

代わりに、authentication_stringっていうカラムがあった。

あ、この辺かわったんだなーと思い、カラムに保存されている値をみてみる。

いや、何も保存されてないぞ。

じゃあなんでログインできないんだ？

どうも、　pluginカラムが問題としてあるみたいだった。

pluginカラムに何が保存されてるのか確認。

`select host, user, plugin from mysql.user;`

あ、なんか`auth_socket` ってのがある。

調べうるとこれが原因みたい。

これが何かっていうのは詳しくはわからなかったのですが、以下の記事を見てみると、
https://dzone.com/articles/change-user-password-in-mysql-57-with-plugin-auth

Debian/Ubuntu系は標準でrootユーザのパスワードを空白で設定しますが、その場合、auth_socket pluginを使用するみたいです。

なので、パスワードを設定していなくても設定している動きをします。

この記事では、そもそもパスワードの設定をしたい場合に、auth_socket pluginが邪魔をするので、それを回避する方法が書かれています。

しかし、今はパスワードはいらないので、auth_socket plugin自体を消していきます。

（パスワードの設定をしたいのに、できなくて困ってるなら上記の記事通りにすればできます）

`update mysql.user set plugin = 'mysql_native_password';`

これで、rootのpluginがauth_socketではなくなりました。

で、はじめに戻り、

`mysql -u root`をしてみると無事mysqlにログインできました。（sudoがいらなくなった）
fastTextの覚書（編集中）

# fastTextの覚え書き
## 公式
公式のGitHubのリポジトリは下記。詳しいインストール方法についてはREADMEを参照。
fastText : https://github.com/facebookresearch/fastText

### 環境
今回試してみた環境は下記。

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"
```

### pythonをインストール
事前にpythonおよびnumpy、scipyを準備しておく。Anacondaが便利。

* Anaconda : https://www.continuum.io

```
$ wget https://repo.continuum.io/archive/Anaconda3-4.4.0-Linux-x86_64.sh 
```

### c++をインストール
fastTextをmakeするために、c++が必要。もし入っていなければ下記コマンドでインストールする。

```
$ sudo apt-get install build-essential
```

### fastTextを準備
GitHubからダウンロード、インストール。

```
$ git clone https://github.com/facebookresearch/fastText.git
$ cd fastText
$ make
```

### 学習済みモデルをダウンロード
リポジトリで配布されている日本語の学習済みモデルをダウンロードする。

```
$ wget https://s3-us-west-1.amazonaws.com/fasttext-vectors/wiki.ja.zip .
```

編集中
Rails5とwebpackerをdocker-composeを使って快適に開発する

# 背景
お試し用スモールアプリケーションを開発することになった。

- サクッと作って、はようお試ししたい
    - Rails使うか
        - Rails5まだ弄ってないし弄りたい
            - Rails5はwebpackが統合されたらしい

こんな感じ。

# 環境
先に環境晒しておきます。

- Ruby 2.4.1
- Rails 5.1.3
- webpacker 2.0

# Railsプロジェクトを作成

```sh
$ rails new example_project --webpack
```

# Railsをdockernizeする
ymlで定義している設定値を環境変数からinjectするように変える。

```yaml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_general_ci
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV['RAILS_DATABASE_USER'] %>
  password: <%= ENV['RAILS_DATABASE_PASSWORD'] %>
  host: <%= ENV['RAILS_DATABASE_HOST'] %>

test:
  <<: *default
  database: <%= ENV['RAILS_DATABASE_TEST'] %>

development:
  <<: *default
  database: <%= ENV['RAILS_DATABASE'] %>

production:
  <<: *default
  database: <%= ENV['RAILS_DATABASE'] %>
```

```yml:secrets.yml
test:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

development:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
```

# webpacker-dev-serverの設定を変える
webpacker-web-serverをホストからアクセス出来るように変える。

```yml:webpacker.yml
dev_server:
  host: 0.0.0.0
  port: 8000
```
hostは必ず`0.0.0.0`にしましょう。ホストからアクセス出来なくなるので。
ポートはお好きな番号で良いんやで。

# foremanの導入
foremanとは、複数のプロセスを束ねて管理してくれる便利gem。
こいつを使ってRailsサーバとwebpacker-dev-serverを1コンテナ内に同時で起動させる。
↓の`Procfile.dev`はアプリケーションのルートディレクトリに設置してね。

```:Procfile.dev
web: bundle exec rails s -b 0.0.0.0 -p 3000
webpacker: bin/webpack-dev-server
```

# Dockerの準備
アプリケーション用のDockerfileを用意する。

```:Dockerfile
FROM ruby:2.4.1

ENV APP /app
RUN apt-get update -qq && \
    apt-get install -y build-essential libpq-dev nodejs npm && \
    npm install -g n && \
    n stable && \
    npm install -g yarn && \
    ln -s /usr/bin/nodejs /usr/bin/node && \
    mkdir $APP

WORKDIR $APP
ADD Gemfile* $APP/
RUN bundle install

ADD package.json $APP
ADD yarn.lock $APP
RUN yarn install

ADD . $APP
```

```yml:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    volumes:
      - store:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - 3306
  app:
    build: .
    command: bundle exec foreman start -f Procfile.dev
    volumes:
      - .:/app
      - bundle:/usr/local/bundle
      - /app/node_modules
    ports:
      - '3000:3000'
      - '8000:8000'
    environment:
      TZ: 'Asia/Tokyo'
      SECRET_KEY_BASE: 'hogehoge'
      RAILS_ENV: 'development'
      RAILS_DATABASE: 'app_db'
      RAILS_DATABASE_TEST: 'app_db_test'
      RAILS_DATABASE_USER: 'root'
      RAILS_DATABASE_PASSWORD: 'password'
      RAILS_DATABASE_HOST: db
    depends_on:
      - db
volumes:
  store:
    driver: local
  bundle:
    driver: local
```

# アプリケーションの起動
ここまで準備出来たら、後はコンテナを起動するだけ。

```sh
$ docker-compose build
$ docker-compose up -d
```

# Rails5 + webpackerを触ってみて
ふああああああああああああああああああああああああ！！！！！！！！！
快適いいいいいいいいいいいいいいいいい！！！！！！！！！！！！！！！！
[クイズ]javascriptと仲良くなるための一歩　第３１話「arguments」

#問題

```js
function fn1(){
  console.log("[" + arguments.length + "]" + arguments[0]);
}
fn1(10); //=> [1]10

function fn2(){
  console.log("[" + arguments.length + "]" + arguments[0] + ", " + arguments[1]);
}
fn2(10); //=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:


#問題

```js
function fn1(){
  console.log("[" + arguments.length + "]" + arguments[0]);
}
fn1(10); //=> [1]10

function fn2(){
  console.log("[" + arguments.length + "]" + arguments[0] + ", " + arguments[1]);
}
fn2(10); //=> [1]10, undefined
```
Cloud9のPHPをアップデートしてLaravelな環境をこしらえる

cloud9でPHPの環境を構築した直後にlaravelをインストールしてプロジェクトを作成しようとすると、

> Your requirements could not be resolved to an installable set of packages.
> ...
> This package requires php >= 5.6.4 but your PHP version (5.5.9) does not satisfy that requirement.

とアレコレ表示されてプロジェクトが作れなかったので対処したメモ

workspaceに初期配置されてるファイルはどっかへ逃がしておくと楽
（これは別にやらなくても構わない）

```bash
$ mkdir ../trash
$ mv ./* ../trash
```

### PHPを5.5.9から5.6へ

```bash
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update
$ sudo apt-get install libapache2-mod-php5.6

$ sudo a2dismod php5
$ sudo a2enmod php5.6
$ sudo add-apt-repository ppa:ondrej/php5-compat

$ sudo apt-get update
$ sudo apt-get dist-upgrade
```


### Laravelインストール

```bash
$ sudo composer global require 'laravel/installer'
```

なんか怒られるけど気にせずスルー。laravelコマンドへのパスを通す

```bash
$ echo "export PATH=\$PATH:~/.composer/vendor/bin" >> ~/.profile
$ source ~/.profile
$ which laravel
```

パスが表示されればOK

### プロジェクト作成

```bash
$ laravel new sample
```

なんか怒られるけど出来てるっぽい

### ドキュメントルートをapp/publicに

```bash
$ sudo nano /etc/apache2/sites-enabled/001-cloud9.conf
```

DocumentRootのところを変えて、[F2]->[Y]->[ENTER]

```
/home/ubuntu/workspace/sample/public
```

### データベースのセットアップ

```bash
$ mysql-ctl install
$ mysql-ctl start
$ mysql-ctl cli

mysql> show databases;
```

c9という空のデータベースを使うも良し、好きな名前で作っても良し。
※Cloud9のデータベースはパスワードが設定されていないので、気になる人は適切な設定を。

### データベースへの接続設定

```bash
$ cp ~/workspace/sample/.env.example ~/workspace/sample/.env
$ vi ~/workspace/sample/.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_created_database_name
DB_USERNAME=your_cloud9_username
DB_PASSWORD=
```

DB_PASSWORDは空でOK。設定した場合はそのパスワードを。

### アプリケーショキーを設定

```bash
$ php artisan key:generate
```

### Node.js（？）のアップデート

```bash
$ cd sample
$ sudo npm install -g npm
$ npm install

$ nvm install 7.5.0
$ npm rebuild node-sass

$ npm run dev
```

npm installのところで大分待たされるけど、ここまでやれば一応laravelが動くようになる

こちらに手順や出来上がった環境など置いてあります
https://github.com/uchikoba/LaravelTrainning

handson.txtの手順に添えば超手抜きですけどToDo管理アプリみたいなものが作れるところまで書いてあります。