OmniAICreator/Qiita-1.07M huggingface dataset:
【SQL Server 2017 による In-Database R 分析 チュートリアル】

# SQL開発者のための In-Database R 分析（チュートリアル）

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

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

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

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

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

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

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

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

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

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

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

    ユーザ定義関数を活用しデータの特徴抽出を行います。
  
- [Lesson 5: T-SQLを使用したモデルのトレーニングと保存](http://qiita.com/qio9o9/items/5ddf586094fa5751a8ec)

    ストアドプロシージャ化したRコードにより機械学習モデルを構築して保存します。
  
- [Lesson 6: モデルの利用](http://qiita.com/qio9o9/items/0f524b9328e80c4fc928)

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

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

## シナリオ

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

## 要件

このチュートリアルは、データベースやテーブルの作成、テーブルへのデータのインポート、SQLクエリの作成など、基本的なデータベース操作に慣れているユーザーを対象としています。

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

- SQL Server 2017のDatabase Engine ServicesおよびMachine Learning Services（In-Database）をインストールしてください。
- SQL Server 2017 内でR（およびPython）実行するには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ログインには、データベースやその他のオブジェクトの作成、データの更新、データの参照、ストアドプロシージャの実行の権限を付与してください。

## リンク

#### 次のステップ

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

#### 出典
[In-database R analytics for SQL developers (tutorial)](https://docs.microsoft.com/en-us/sql/advanced-analytics/tutorials/sqldev-in-database-r-for-sql-developers)

#### 関連項目

[Machine Learning Services with R](https://docs.microsoft.com/en-us/sql/advanced-analytics/r/sql-server-r-services)
【SQL Server 2017 による In-Database R 分析 チュートリアル】Lesson 1: サンプルデータのダウンロード

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

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

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

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

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

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

1.  Windows PowerShellコマンドコンソールを開きます。
  
    ダウンロード先ディレクトリを作成したり、指定されたダウンロード先にファイルを書き込むために管理者権限が必要な場合は**管理者として実行**を使用します。
  
2. 次のPowerShellコマンドを実行し、パラメータDestDirの値をローカルディレクトリに変更します。ここでは**C:\tempPythonSQL**をダウンロード先ディレクトリに指定しています。
  
    ```PowerShell:PowerShell
    $source = 'https://raw.githubusercontent.com/Azure/Azure-MachineLearning-DataScience/master/Misc/RSQL/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:\tempRSQL'
    ```
    
    DestDirで指定したフォルダが存在しない場合は、PowerShellスクリプトによって作成されます。
    
3.  インターネット接続によっては、ダウンロードに時間がかかることがあります。すべてのファイルがダウンロードされたらPowerShellコマンドプロンプトで次のコマンドを実行し、ダウンロードされたファイルを確認します。
  
    ```PowerShell:PowerShell
    ls
    ```
    ![rsql-devtut-filelist-gho9o9.png](https://qiita-image-store.s3.amazonaws.com/0/195839/8c9bda21-00de-998e-856d-bcafbc60a19f.png)

## **重要**：一部ファイルの置き換え

ダウンロードしたファイルを以下のファイルで上書きます。

- [RunSQL_SQL_Walkthrough.ps1](https://github.com/gho9o9/sql-docs/blob/live/docs/advanced-analytics/tutorials/assets/tempRSQL/RunSQL_SQL_Walkthrough.ps1)
**Windows認証で実行する場合の不具合修正です。**

- [TrainTipPredictionModel.sql](https://github.com/gho9o9/sql-docs/blob/live/docs/advanced-analytics/tutorials/assets/tempRSQL/TrainTipPredictionModel.sql)
**モデルトレーニングに入力しているデータを70%のサンプリングではなく全件を入力するよう修正しています。これは入力データが少なく十分なモデルトレーニングが行われないことを回避するための修正です。**

## リンク

#### 次のステップ

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

#### 前のステップ

[SQL開発者のための In-Database R 分析](http://qiita.com/qio9o9/items/4f020bb93dc07567e556)

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

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

#### 関連項目

[Machine Learning Services with R](https://docs.microsoft.com/en-us/sql/advanced-analytics/r/sql-server-r-services)
bootstrap3で任意のURLをモーダル内に読み込む


動的にモーダルの中身を変更したい場合があります。
そんな時の方法についてご紹介。

まずはモーダルを表示したい方のHTML。
モーダルが開くタイミングで、show.bs.modalでイベントをひろって
data-hrefで設定したURLを読み込ませています。

```html:sample.html
<a href="#" data-href="load.html" data-toggle="modal" data-target="#modalDetails">リンク</a>

<!-- Modal -->
<div class="modal fade" id="modalDetails" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
    </div>
  </div>
</div>

<script>
$(function () {
	//任意のリンクをモーダル内に読み込む
	$("#modalDetails").on("show.bs.modal", function(e) {
	    var link = $(e.relatedTarget); //クリックしたセルのオブジェクトデータ
	    $(this).find(".modal-content").load(link.attr("data-href"));
	});
});
</script>
```

動的に表示するためのHTMLです。

```html:load.html
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="myModalLabel">タイトル</h4>
</div>
<div class="modal-body">
動的にいれたい内容を挿入
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
```
FireFoxでの自己署名証明書 (.p12) インポート手順

追記: Firefox 77 から `about:certificate` が追加された。

## 現象

![profile1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/06811f42-aaf6-d29b-6879-1326ded8599c.png)

IE側に自己署名証明書を入れていたら
Firefox側でも使うのかなと思っていたがそうでもなかった。

## インポート

![cert.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b3c4a4e6-91bb-1f2f-348f-57ff4f4d197d.png)

あなたの証明書 から。

![import.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4f11c01d-a568-1529-2760-123239d40692.png)
Python: Tips - 値の入れ替え

## 変数の値を入れ替える方法
変数`a:100`と変数`b:20`の値を入れ替えたい時には、普通は変数`c`を作成して、`a`の値を一旦`c`に保持して、`a`と`b`の値を入れ替える。

```python:swap.py
a = 100
b = 20
```

*pythonの変数の多重代入を使うともっと簡単に値の交換ができる*

```python:easy_swap.py
# 多重代入
a, b = 100,20

# 値の交換も
a, b = b, a
```
ちなみに、Rubyも同じことができる。
Android で Fragment を使用していて、画面がホワイトスクリーンになった時の対応方法

ホワイトスクリーンやらホワイトアウトやらで検索しても FGO しかでてこなくて困ったので
自分用のメモとして

##発生条件
全然わからん
![mqdefault.jpg](https://qiita-image-store.s3.amazonaws.com/0/19668/ae0811b7-329e-4d41-d939-7ac47ea44079.jpeg)

- 戻るボタンを押した時とかに発生する
- タスク一覧を表示させてから戻ると直ってる

##対応
- onCreateView 内で **removeAllViews** を呼ぶ

```java
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    container.removeAllViews()
    View rootView = inflater.inflate(R.layout.my_fragment, container,false);
    return rootView;
}
```
####参考
ありがとう:relaxed::relaxed::relaxed:
>GraveDollの備忘録ブログ：onResume()内でFragmentをreplace()しても画面に反映されない
http://gravedoll.hatenablog.com/entry/2014/06/16/215426
Y.A.M の 雑記帳：Android　FragmentTransaction のまとめ
http://y-anz-m.blogspot.jp/2012/03/androidfragmenttransaction_14.html

##備考

- 「Android Fragment 画面 表示されない」で検索したら参考のページが見つかった
 - Fragment というキーワードが重要だったみたい
- removeAllViews については StackOverflow を見たと書いてあったけどページは見つからなかった
Excelのドキュメントが背景色白色で読みにくい時の対処法

今の現場は設計書をExcelで作っている。そうすると、背景色が白色のためとても読みづらい。
Excel側の設定をいじってもよいのだが、なんやかんやExcelは使用するのでExcelの設定は触りたくない。

#結論
Excelの設計書をPDF出力してAdobe Acrobat Readerの背景色設定を変える。

#手順
１．ExcelをPDF化する
　・リボンの「ファイル」を選択
　・「保存と送信」を選択
　・「PDF/XPSドキュメントの作成」を選択
　・「PDF/XPSの作成」を選択
　・PDFファイルを出力

２．PDFの背景色設定を変更する
　・出力したPDFファイルを開く
　・メニューバーの「編集」を選択
　・「環境設定」を選択
　・分類から「アクセシビリティ」を選択
　・文書のカラー設定オプションの「カラーの表示を調整」をチェック
　・「ページ背景色」、「テキスト色」を変更
rumを触ってみる

- ほぼReadmeの翻訳
- `[rum "0.10.8"]`を使用している

## 特徴
- ClojureScriptではreactラッパーとして動作する
- Clojureではhiccupレンダラーとして動作する
    - なのでサーバーサイドレンダリングがやりやすいらしい
- ミックスインを利用することで柔軟にコンポーネントを記述することができる

## インストール 
`[rum "0.10.8"]`を`:dependencies`に追加する

## コンポーネントの定義

いわゆるHiccup Syntaxを利用して記述する

```clj
(require [rum.core :as rum])

(rum/defc label [text]
  [:div {:class "label"} text])
```

## コンポーネントのレンダリング

1. コンポーネントのインスタンスを作る
2. インスタンスをマウントする

下記の例は先述の`label`コンポーネントを適当なdom-nodeにマウントする

```clj
(rum/mount (label "foo") dom-node)
```

## コンポーネントの再描画

### 手動

単純に`mount`を再度呼ぶ。自分で完全に再描画のタイミングをコントロールすることが可能

### reactiveミックスインで自動的に

reagentはreagent.core/atomの変更を検知して自動的に再描画をする機能があるが、
rumでは普通のatomで同じ様な記述ができる。

- `< rum/reactive`のミックスインを指定する
- `rum/react`で参照を監視する

```clj
(def c (atom 0))
(rum/defc label < rum/reactive [text]
  [:div {:class "label"} text
   [:button {:on-click #(swap! c inc)} (rum/react c)]])
```

### localミックスイン

コンポーネントの内部だけで利用される状態がある場合はlocalミックスインが利用できる

- `defc`ではなく`defcs`を使う
    - こちらはコンポーネントの内部の状態が第一引数として渡されるのでアクセスをすることが可能
- localミックスインは`< (rum/local <初期値> <格納するキー>)`の様に使用する


```clj
(rum/defcs toggle-button < (rum/local true :some-random-key)
  [state]
  [:button {:on-click #(swap! (:some-random-key state) not)}
   (pr-str @(:some-random-key state))])
```

### staticミックスイン

コンポーネントの引数がイミュータブルなデータな場合、staticミックスインを利用することで無駄な再描画を避けることができる

```clj
(rum/defc bool < rum/static [bool]
  (if bool
    [:span "TRUE"]
    [:span "FALSE"]))

(rum/defcs toggle-button < (rum/local true :some-random-key)
  [state]
  [:button {:on-click #(swap! (:some-random-key state) not)}
   (bool @(:some-random-key state))])
```

### その他高度な機能
- 自分でミックスインを定義する
- `cursor`で複雑な状態の一部だけを切りだす
- 複数のatomをチェインする
- サーバーサイドレンダリング
Microsoft Cognitive Services デモ サイト/アプリ まとめ

Microsoft Cognitive Servicesは、AIを活用したインテリジェントなAPI群です。

* Microsoft Cognitive Services
 * https://azure.microsoft.com/ja-jp/services/cognitive-services/

Microsoft Cognitive Services デモ サイト/アプリへのリンクが、以前は公式ページにまとめられていたのですが、Azure公式サイトへの移行後になくなってしまったので、ここにまとめておきます。

* CaptionBot
 * https://www.captionbot.ai/

* How-Old.net
 * https://how-old.net/

* TwinsOrNot.net
 * https://www.twinsornot.net/

* MyMoustache.net
 * https://www.mymoustache.net/

* What-Dog.net
 * https://www.what-dog.net/

* CelebsLike.me
 * https://www.celebslike.me/

* Mimicker Alarm
 * https://www.microsoft.com/en-us/garage/profiles/mimicker-alarm/
Go言語 基本文法

本を読んでも読んでも忘れるので、ここに備忘録的に書いておきます。
勉強するごとに書き足していきます。

参考書：スターティングGo言語
https://www.amazon.co.jp/dp/B01FH3KRTI/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

# 変数の定義方法
```go
// 明示的な書き方
var n int

// 初期化も行う
var n int = 3

// 複数定義
var a, b, c int

// 複数定義して初期化も行う
var a, b, c int = 1, 2, 3

// 複数定義2
var (
    a, b int
    name string
)

// 暗黙的な書き方
n := 0

b := true

name := "TomoProg"
```

# パッケージ変数
```go
package main

import (
    "fmt"
)

// このnはmainパッケージの中ならどこでも参照可能
// 他の言語で言うグローバル変数に似てる
var n = 100

func main() {
    n = n + 1
    fmt.Printf("n=%d\n", n)
}
```

# 特殊な型 interface{}
Goではinterface{}という型が存在する。
あらゆる型との互換性を持つ型であり、int、string、配列など何でも入れられる。
変数定義時には特殊な値`nil`が代入される。

```go
var x interface{} // xはnilで初期化される
x = 1
x = 1.2
x = "string"
x = 'あ'
x = [...]int{1, 2, 3}
```
Ruby,Rails,HTML,CSS,JSの大枠

#Rubyとは
まつもとゆきひろ（通称Matz）さんによって開発された日本産のプログラミング言語。「オブジェクト指向スクリプト言語」である。

Webサイトは大きく分けて「クライアントサイド」と「サーバーサイド」という２つの領域で構成されている。ユーザーがブラウザを通して目にしているのは「クライアントサイド」と呼ばれる領域で、Webサイトのロゴデザインやテキストコンテンツなどの見た目を司っている。

ユーザーがWebサイトを操作していると、Webサイトが置かれている大元のサーバーと情報のやり取りを行う必要が出てくる。例えばfacebookやtwitterといったSNSで、「Aさんのプロフィールを閲覧する」という操作をBさんが行ったとする。するとWebサイトは大元のサーバーから「Aさんのプロフィール」に関する情報を、Bさんが操作するブラウザへ引っ張ってこなければならない。

この「引っ張ってくる」という情報のやり取りは、Bさんの目に見えない領域「サーバーサイド」で実行される。そしてこの「引っ張ってくる」という動作の具体的内容、つまり「どんな操作がされた時、どんな情報を、Webサイトのどこに表示させるか」といったことを定義づけるのがRubyのようなプログラム言語の役割である。

CやJavaといったコンパイラ言語はプログラム実行にあたり、人間が書いたソースコードを機械命令に変換する手続きが必要になる。しかしRubyはこうした手続きなくプログラムを実行できるためプログラミングしやすい言語といえる。

さらに、オブジェクト指向言語であるため、既に存在する機能を受け継ぎ、効率よくソフトウェア開発を行うことができるのもRubyの強みである。

#Ruby on Rails
「Ruby on Rails」とはRubyのWebアプリケーションフレームワークである。Rubyには他にもWebフレームワークが存在しているが、実質開発で使われているのはほとんどが「Ruby on Rails」である。

フレームワークとは、開発を行う際に頻繁に必要とされる基礎的な機能をまとめて提供してくれるものである。プログラムの書き方が細かく決まっており、その書き方に従って勧めていくことで比較的カンタンにアプリケーションを作ることが出来る。

#ウェブサイトの構造（HTML, CSS, JavaScript）
twitterやfacebookなど、ブラウザ上でユーザーが目にしているウェブサイトの見た目はHTMK、CSS、JavaScriptという3つの言語で形作られている。

##HTML
Hyper Text Markup Languageの略。ウェブサイトのテキストコンテンツを作成するために用いられる言語。「タグ」と呼ばれる記号を用いることで、文字を太字にしたり、フォントカラーを変えたり、リンクを挿入したりすることができる。

##CSS
Cascading Style Sheetsの略。HTMLがウェブサイトのテキストコンテンツの作成に用いられるのに対し、CSSはテキストの体裁やサイト全体の見栄えを表現するために用いられる言語である。

ウェブサイトの背景色、テキストコンテンツの表示場所、サイズなどは全てCSSで指定されている。

##JavaScript
アプリ開発で使用されるプログラミング言語。写真をスライドさせたり、サイドバーを出し入れしたりと、ウェブサイトに動作を付けることが出来る他、ユーザーが適切な形式でメールアドレスをフォームに入力したかのチェックするなど様々な挙動を設定することができる。
[備忘]公式quick startそのまんまレポート mac+docker+rails+postgres 

引用：https://docs.docker.com/compose/rails/#define-the-project

dockerでrails+postgresの環境を作る。

#はじめに
docker for macをインストール
https://docs.docker.com/compose/install/
https://docs.docker.com/docker-for-mac/install/


それから、以下４ファイルを用意する必要がある。

- Dockerfile
- Gemfile
- Gemfile.lock
- docker-compose.yml

＊今回は、`workspace/プロジェクト名/project/`以下に４つのファイルをおいた。

#Dockerfileを作る

```Dockerfile
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```

#Gemfileを作る

このファイルはrailsをロードするためだけのGemfileです。
`rails new`のタイミングで上書きされます。

```Gemfile
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'
```

#空のGemfile.lockを作る

まっさらなやつを用意しましょう。

# docker-compose.ymlを作る

```docker-compose.yml
version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

#この４つのファイルを使ってrails new！

以下のコマンドで`rails new`しましょう。

```
$ docker-compose run web rails new . --force --database=postgresql
```

以下のようなエラーが出た時は・・・

```
ERROR: Couldn't connect to Docker daemon. You might need to start Docker for Mac.
```

これはdockerを起動していないだけ。
dockerを起動してrunningしていることを確認してからコマンドを打ちましょう:hugging_face:

![](https://i.gyazo.com/044170a6ab3e7d957404af366282a376.png)

すると、ずらずらーと環境構築してくれます。

# 新しいGemfileができているので、イメージを再構築

```
docker-compose build
```

そしたらずらずらgemをインストールしてくれる。

# config/database.ymlをいじる。

db接続の対象を変えます。
この状態でアプリは起動可能だが、db接続がlocalhostに向いている。なので用意するpostgresのdbに向くようにする。

```config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password:
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test
```

# 起動できることを確認して、db:createする。

### 起動できることを確認しましょう

```
docker-compose up
```

### そして`docker-compose up`したterminalとは別のterminalを開き、db作成

```
docker-compose run web rake db:create
```

#期待に胸膨らませ「http://localhost:3000」

やったー:hugging_face:
彼らを見るとなぜか幸せな気分になる。

![](https://i.gyazo.com/df63916fe12a1cdc1c9cf08ebc1738a4.png)

#彼らを休ませてあげよう

`docker-compose up`したタブでcontrol+cで、お休みします。


# 再起動。

```
docker-compose up
```

## この時以下のようなエラーが出るときがあるので、

```
web_1 | A server is already
running. Check /myapp/tmp/pids/server.pid.
```

そのときは、`tmp/pids/server.pid`ファイルを削除して、改めて、`docker-compose up`すればok。

# rails cとかしたいとき、

以下のコマンドでssh接続

```
docker exec -it project_web_1 bash
```

`project_web_1`はコンテナ名が入ります。

# binding.pryとかしたいとき

pry系のgemを入れるだけでは、pryを使えません。
pry系のgemを入れてから、以下の記事を参照。

http://source.hatenadiary.jp/entry/2017/01/27/121635

# quick startにあった以下二つは省略

・Restart the application

作業再開のときとか、dbを作り直したいときとかに参照。

・Rebuild the application

docker-compose.ymlを変更したときにrebuildが必要になる時がある。
[Cousera - Machine Learning]Cloud9にOctaveとMATLABをインストールする

# はじめに

[Cousera](https://www.coursera.org/)のMachine Leaningのコース用にCloud9で開発環境を準備しました。

いつでもどこでも、常に最新の状態で作業を再開できるので、スキマ時間活用に有効です。

# 環境準備
## Workspaceを作成
1. Cloud9にログインしてダッシュボードへ
2. 「Create a new workspace」。templateは「Blank」を選択

## ディスク拡張
MATLABのインストールでディスクが不足するため、
Workspaceのディスクはあらかじめ無料枠最大（5GB) に拡張しておく。



# MATLABのインストール

## アカウント作成

テキストのURLにアクセスし、MathWorksのアカウントを作成する

## インストーラをダウンロード

1. テキストのURLからダウンロードに進み、作成したアカウントでログイン。
2. 「Linux(64-bit)」をダウンロードする

## Cloud9にインストール
（参考）[MathWorks アカウントを使用する製品のインストール](https://jp.mathworks.com/help/install/ug/install-mathworks-software.html#bsnioa5)

1. Cloud9の画面に戻り、「File > Upload local files...」にて、ダウンロードしたZipをアップロードする。

2. 解凍　※ファイル名は、ダウンロードしたものに応じて変更してください。

    ```
    $ unzip matlab_R2017a_glnxa64.zip
    ```

4. X11をインストール
    GUI操作のために、X11をインストールします。
    （参考）[Running X11 in a Cloud9 Workspace](https://github.com/noobkilervip/cloud9-vnc)
    
    ```
    $ cd ~
    $ git clone https://github.com/acabey/cloud9-vnc.git
    $ cd cloud9-vnc/
    $ sudo apt-get update
    $ sudo ./install.sh
    ```

5. メニューの `Run > Run With > C9vpc` か下記のコマンドで起動

    ```
    $ /opt/c9vnc/c9vnc.sh 
    $VNC client running at https://xxxxxxx-xxxxxx.c9users.io/vnc.html
    $Starting c9vnc daemon
    ```

6. 表示されたURLを開く
7. 画面を右クリックし、` Applications > Shells > Bash `でコマンドラインを表示し、インストールを実行

    ```
    $ cd (MATLABインストーラの解凍パス)
    $ ./install
    ```

8. MathWorksアカウントを使って、デフォルトの設定でインストールする
    ※すべてのツールを同時インストールすると、5GBじゃ不足する可能性があります。
    　その場合は、前後半に分けてインストールし、ダウンロードファイルは削除しましょう。

9. MATLABの起動確認

    ```
    $ cd (インストール先)/bin
    $ ./matlab
    ```
    画面が立ち上がればOK。


# Octaveのインストール
## Octaveをインストール
### bashで下記実行

```
$ sudo apt-get update && sudo apt-get install octave
```
テキストどおり
（参考）[Octave for GNU/Linux](http://wiki.octave.org/Octave_for_GNU/Linux)

### 起動確認

```
$ octave
```
で、Octaveに切り替わったらOK.
日経新聞(web)の記事の感情分析し、株式取引した場合どうなるか

## やること
日経新聞(web)に掲載されている上場企業の記事を記事を感情分析して、
株価の取引をした場合、どの程度の利回りになるか検証する！
(結果的にできていません。)

## 手順
### 上場企業に関する記事の感情分析結果と、株価の相関関係を計算、記録する。
1. 日経新聞の記事から、上場企業に関する記事を取得し記事の内容を感情分析(ポジティブ or ネガティブ)する。
2. 特定の会社に紐づく記事の感情分析結果と、株価の値動きに相関関係があるか計算(相関係数を1.0から-1.0で計算)してDBに保存。

企業別の記事：
https://www.nikkei.com/nkd/company/news/?scode=7203&ba=1

### 株価と、日経新聞の記事の感情分析結果に強い相関関係がある企業の株を仮想取引した場合の利回りを検証する。
1. 相関係数が0.5以上の企業の速報ニュースから、株の仮想取引処理をして利回りを記録する。
ポジティブな記事なら「買い」、ネガティブな記事なら「売り」。24時間後に反対取引を記録する。
あくまで株価を記録して利回りを計算するだけで、実際の売買はしない。

2. 一定期間、仮想取引を繰り返した場合の利回りを検証する。

速報ニュース：
https://www.nikkei.com/news/category/company/

## 技術的なところ
### 感情分析API
記事内容の感情分析はGoogleのAPIを利用しています。文章を与えると、感情分析結果を1.0から-1.0の間で返します。
https://cloud.google.com/natural-language/docs/analyzing-sentiment?hl=ja

### 相関関係の計算処理
記事の感情分析結果と株価の値動きの相関係数の計算は、
「ゼロからはじめるデータサイエンス ―Pythonで学ぶ基本と実践」(オライリー)の74Pの処理をコピペしています。
https://github.com/joelgrus/data-science-from-scratch/blob/master/code-python3/states.txt

### 株価の取得
#### 1日単位の株価取得にQuandlを使用
https://www.quandl.com/data/TSE-Tokyo-Stock-Exchange：

## 日経新聞の記事と、株価の相関関係の検証結果
- 日経新聞(web)の上場企業に紐づく全ての記事を取得し感情分析結果を記録し、株価の値動きとの相関関係を計算しました。
1つの企業に対し1日に複数の記事があることを想定し、1日に公開された記事の感情分析結果の平均値と、
1日の株価の値動きの相関係数を計算しました。

- 取得した記事数は約33000記事でした。

## 日経新聞の記事と、株価に強い正の相関関係がある(相関係数 0.5以上)の企業
- 計算対象は過去2年間です。

計算対象の上場企業数は3739社。その内、25社でした。  
これらの企業の株価は日経新聞の記事と強い相関関係がありそう？です。

|証券コード|企業名|市場|記事の感情分析結果と株価変動の相関係数|
|----|----|----|----|----|
|8876|(株)リログループ|東証1部|0.797528717991886|
|6627|(株)テラプローブ|マザーズ|0.784256852802332|
|5195|バンドー化学(株)|東証1部|0.691354389747135|
|2001|日本製粉(株)|東証1部|0.683619801985038|
|4978|(株)リプロセル|東証JQG|0.652835959528794|
|3686|(株)ディー・エル・イー|東証1部|0.614525081805451|
|6505|東洋電機製造(株)|東証1部|0.61361469964872|
|7280|(株)ミツバ|東証1部|0.610410562405695|
|6176|(株)ブランジスタ|マザーズ|0.599923032041581|
|3069|(株)アスラポート・ダイニング|東証JQS|0.587528945001933|
|2440|(株)ぐるなび|東証1部|0.571951779996269|
|6537|ＷＡＳＨハウス(株)|マザーズ|0.564046872692687|
|6591|西芝電機(株)|東証2部|0.563963007617656|
|2788|アップルインターナショナル(株)|東証2部|0.563422976229906|
|2692|伊藤忠食品(株)|東証1部|0.55537592428196|
|4800|オリコン(株)|東証JQS|0.537013593249629|
|7298|八千代工業(株)|東証JQS|0.534355967403926|
|4681|リゾートトラスト(株)|東証1部|0.532854031601563|
|2127|(株)日本Ｍ＆Ａセンター|東証1部|0.527132120553049|
|6534|Ｄ．Ａ．コンソーシアムホールディングス(株)|東証2部|0.517179635411255|
|4536|参天製薬(株)|東証1部|0.512324530213677|
|6058|(株)ベクトル|東証1部|0.512312624739171|
|6651|日東工業(株)|東証1部|0.510589889763407|
|3053|(株)ペッパーフードサービス|東証2部|0.504080378468654|
|7915|日本写真印刷(株)|東証1部|0.5004307798635|

## 相関関係の強い25社の速報ニュースから仮想取引しようとした結果
1週間くらい、速報ニュースから仮想取引するプログラムを起動していますが1件も仮想取引できる条件を満たせませんでした。

要因として次のものがありそうです。
1. 記事の感情分析結果が強いポジティブ(0.5以上)、強いネガティブ(-0.5以下)の場合、
それぞれ買い、売りとして仮想取引しようとしましたが、そんな記事が少ない。

2. 対象の企業数が25社と少ないため、対象となる記事が少ない。

結果的に、この方法で株式を取引した場合、どの程度の利回りなのか分かっていません。  
もう少し、条件を緩くして再チャレンジしようと思います。  
そもそも、3739社中25社しか対象とならないやり方は間違っているような気もしますが。。。。
JavaのInterfaceをJRubyのクラスに実装してJavaから呼びだす


GUIはJava、処理はRubyで書きたくて、RubyとJavaのクラスを相互に扱う必要があったのでメモ

```bash
$ tree
.
├── out
│   └── production
│       └── JRubyTest
│           └── JrubyTest
│               ├── Main.class
│               └── TestInterface.class
├── ruby
│   ├── TestInterface.jar
│   └── test_class.rb
└── src
    └── JrubyTest
        ├── Main.java
        └── TestInterface.java
```

```java:TestInterface.java
package JrubyTest;

public interface TestInterface {
    java.lang.String hello();
}
```

```ruby:TestClass.rb
java_import 'JrubyTest.TestInterface'

class TestClass
  include TestInterface
  def initialize name
    @name = name
  end

  def hello
    "hello #{@name}"
  end
end
```

```java:Main.java
package JrubyTest;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptContext;
import javax.script.ScriptException;

public class Main {
    public static void main(String[] args) {
        ScriptEngineManager m = new ScriptEngineManager();
        ScriptEngine rubyEngine = m.getEngineByName("jruby");
        ScriptContext context = rubyEngine.getContext();
        try {
            File file = new File("ruby/test_class.rb");
            try {
                FileReader reader = new FileReader(file);
                rubyEngine.eval(reader);
                String name = "'Taro'";
                Object testClass = rubyEngine.eval("TestClass.new " + name, context);
                if (testClass instanceof TestInterface){
                    TestInterface test = (TestInterface) testClass;
                    System.out.println(test.hello());
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }
}
```
起動するだけで使えるPostgres.appでのDB作成

[Postgres.app](https://postgresapp.com/)　というものがあります。
DLしてインストールして起動するだけで簡単にPostgreSQLが使えるので試してみました。

##ダウンロード
https://github.com/PostgresApp/PostgresApp/releases/download/v2.0.5/Postgres-2.0.5.dmg

##インストール
dmgを展開してappをアプリケーションフォルダに移動してください。

##使い方
appをダブルクリックで起動します。

起動した画面で"Initialize"をしてあげると新しいサーバーが作成されます。

![スクリーンショット 2017-09-06 0.51.44.png](https://qiita-image-store.s3.amazonaws.com/0/124843/73564076-04f9-52d9-f862-834033edff74.png)

"postgres"と"template1"、あとはユーザー名のDBが自動で作成されます。
ここには表示されないようですが"template0"も作成されています。

PostgreSQLにあまり詳しくないので知らなかったのですが、
・"template0"に接続して新規DB作成　→　まっさらなDBが作成される
・"template1"に接続して新規DB作成　→　"template1"をコピーしたDBが作成される
らしいです。

そもそも"template1"というDBは標準DBとして用意されているもので、デフォルトでCREATE DATABASEした時にコピーされるDBのことのようです。

![スクリーンショット 2017-09-06 0.52.34.png](https://qiita-image-store.s3.amazonaws.com/0/124843/2832bfbd-4629-dd98-4706-e7587576aacb.png)

左のサイドバーを開くとServer一覧が表示されます。

<img width="713" alt="スクリーンショット 2017-09-06 1.04.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/124843/91977fe8-f38b-1e3c-87cf-2c66213d2f2f.png">

ここから新しくServerを作成できます。

DB操作を行うときは、操作を行いたいDBをダブルクリックします。
するとターミナルでDBが開かれます。

```terminal
psql (9.6.5)
Type "help" for help.

postgres=# CREATE DATABASE hogehoge;
CREATE DATABASE
postgres=# \l
                                   List of databases
    Name    |   Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
------------+-----------+----------+-------------+-------------+-----------------------
 hogehoge   | ring0n0ki | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres   | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 ring0n0ki  | ring0n0ki | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0  | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |           |          |             |             | postgres=CTc/postgres
 template1  | postgres  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
            |           |          |             |             | postgres=CTc/postgres
(5 rows)

postgres=#
```
こんな感じで新しくDBを作ったりできます。

簡単に立ち上げれるので分かりやすくて便利です、という感じでした。
自然言語処理の勉強を始めたのでメモ

##  はじめに
コンピュータが、人間が話すことばで人間とコミュニケーションとるための技術を知りたいなあということでお勉強を開始しました。以下、備忘録的メモです。

##  自然言語処理とは
[wikipedia:自然言語処理](https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86)によると自然言語処理は以下と書かれている。

```text
自然言語処理（しぜんげんごしょり、英語: natural language processing、略称：NLP）は、人間が日常的に使っている自然言語をコンピュータに処理させる一連の技術であり、人工知能と言語学の一分野である。
```
引用元：https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86

##  どんな技術があるか

*   形態素解析
*   構文解析
*   照応分析

##  難しさ
コンピュータが自然言語処理を行う難しさに以下がある。

*   単語のわかち書き(日本語、中国語、タイ語など)
*   語義の曖昧性：同じ単語でも文脈によって複数の意味を持つ
*   構文の曖昧性：１つの文で複数の構文木が存在しうる
*   主語省略・代名詞
*   文字通り解釈できない
    *   例）Can you pass the salt? -> I'm afraid that I can't see it.
    *   上記例では答えがyes,noでない。

##  難しさの解消
### 単語のわかち書きへの対応。
形態素解析器として以下がある。

*   Mecab
*   Cabocha (Mecabのラッパー)

さらにCabochaで構文解析後に、pythonパッケージのpydotplusを使うと、構文可視化ができるらしい。下記参考は結構面白い。滝沢カレンさんて素敵だと思う。
参考：[滝沢カレンの理解不能な文章を言語解析してみた。](http://qiita.com/naoyu822/items/9d7a83879c161573f63c)

## 最近の動向
最近の動向ていっても、5年くらい前からの話か。
[2016年のwiredの特集](http://wired.jp/special/2016/nlp/
)で気になったところを以下に書く。

### ことばをベクトル化し、特徴量を認識させる
グーグルの研究者 Quoc Le さんは以下のことを言っている。

```text
「機械は数字を扱うのは得意なのですが、ことばの概念を扱うのが苦手なのです。でも、ことばをヴェクター（ベクトル）化してあげると機械は数字のように概念を扱うことができます」
```
引用元：http://wired.jp/special/2016/nlp/

###  自然言語処理の研究者
*   Quoc Le, Reserch Scientist, Google (*2)
    *   コンピュータが”猫”を見つける
*   Tomas Mikolov, Research Scientist, Facebook AI Research (*2)
    *   Word2vec  
    *   関連論文: [Efficient Estimation of Word Representations in Vector Space](https://arxiv.org/abs/1301.3781)
*   Richerd Socher, CEO&Founder, MetaMind (*2)
    *   「Dinamic Memory Network」(2015年)

### Dinamic Memory Network
[wired 読む機械　自然言語の新たな地平](http://wired.jp/special/2016/nlp/)によると、以下のような機能を考慮したもの。

```text
2015年、ソッチャーらはDynamic Memory Networkと呼ばれるモデルを公開した。
これはふたつの「記憶する機能」が備わっている。
ひとつはことばのヴェクター化を通してことばの意味や概念を記憶する「Semantic Memory」と呼ばれる機能だ。
もうひとつは、短期記憶を担当する「Episodic Memory」で、人間でいえば「海馬」にあたる機能だ。
```
引用元：http://wired.jp/special/2016/nlp/

##  おわりに
深層学習の勉強をしてみたいな。
[深層学習による自然言語処理](https://www.amazon.co.jp/dp/B0756VMJB7/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)ていう本が面白そうなので読んでみよう。

##  参考にしたサイト
*   *1 [wikipedia:自然言語処理](https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86)
*   *2 [wired 読む機械　自然言語の新たな地平](http://wired.jp/special/2016/nlp/)
電気自動車の走行中給電に関して

# 電気自動車
　現在の日本の道路でも少しづつ見ることが多くなったEV（電気自動車）
　電気自動車は、ガソリンなどの化石燃料を使用しないエコカーとして、注目を浴びているが、エネルギーの供給方法にまだまだ問題がある
![img_9da62f5b32e8d4adb0cd46a8b8b9685d156621.jpg](https://qiita-image-store.s3.amazonaws.com/0/190574/0627b9ac-73de-0518-93a1-9f020f50cba6.jpeg)

# 走行中給電
東京大学が走行中給電の技術開発に成功
走行中給電とは、電車のように、走っている車両に電気を供給する仕組みのこと
EVでは高速道路などにコイルを敷設し、この上を車両が通過するときにワイヤレスで給電する。

![unnamed-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/190574/109b1e25-b701-fb00-67b8-5cbc8d320ef4.jpeg)

# 費用に関して
現在の電気自動車で東京-大阪間（約500キロ）をノンストップするには、約二倍のバッテリーが必要となるが、走行中給電の技術を使用することで、現在の半分程度のバッテリーでいけるようになる。

インフラの構築に関しても、東京－大阪間の高速道路で上下の各1車線に設置すると1千億円かかる模様。
権威サーバ（スレーブサーバ）をBINDで構築してみました

#■ 概要
権威サーバ（スレーブサーバ）の構築手順をまとめました。

DNSサーバ共通の構築手順（BINDのインストールなど）やキャッシュサーバ、権威サーバ（マスタサーバ）の構築手順はこちらをどうぞ。

▼セキュアなDNS環境を構築してみました
[http://qiita.com/nk9bb8/items/5a52c8c5a5e14901775d](http://qiita.com/nk9bb8/items/5a52c8c5a5e14901775d)

▼キャッシュサーバをBINDで構築してみました
[http://qiita.com/nk9bb8/items/15f4cb9756a2043e4bba](http://qiita.com/nk9bb8/items/15f4cb9756a2043e4bba)

▼権威サーバ（マスタサーバ）をBINDで構築してみました
[http://qiita.com/nk9bb8/items/f57c94f9469b805ef28e](http://qiita.com/nk9bb8/items/f57c94f9469b805ef28e)


#■ /etc/named.conf の設定内容
※デフォルトの設定値から変更している箇所を中心にコメントを入れています。

```
// アクセス制御リスト
acl "locals" {      
    192.168.56.0/24;                                    // 検証環境のローカスアドレス
    127.0.0.1;
};

// BIND全体の設定
options {
    listen-on port 53 { 127.0.0.1; 192.168.56.112; };   // リクエスト待受けポート／アドレス
    listen-on-v6 port 53 { none; };                     // 検証環境なので、IPv6無効

    directory   "/var/named";
    dump-file   "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";

    allow-query { locals; };                            // 問合せの受付けを許可するアドレス
    allow-transfer { none; };                           // ゾーン転送を拒否する
    recursion no;                                       // 再帰問合せの受付けを拒否する

    dnssec-enable yes;                                  // DNSSECを有効にする
    dnssec-validation yes;                              // 問合せ結果をDNSSECで検証する

    version none;                                       // バージョンを非表示にする

    bindkeys-file "/etc/named.iscdlv.key";
    managed-keys-directory "/var/named/dynamic";
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";
};

// ログ設定
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

// example.jpゾーンを設定（正引き用）
zone "example.jp" IN {
    type slave;                                         // スレーブサーバ
    masters { 192.168.56.111; };                        // マスタサーバのアドレス
    file "slaves/example.jp.zone.signed";               // ゾーンファイル
};

// example.jpゾーンを設定（逆引き用）
zone "56.168.192.in-addr.arpa" {
    type slave;                                         // スレーブサーバ
    masters { 192.168.56.111; };                        // マスタサーバのアドレス
    file "slaves/56.168.192.in-addr.arpa.rev.signed";   // ゾーンファイル
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

```


#■ TSIG対応

####◆/etc/named.confにマスタサーバで作成した共通鍵を登録

```
// TSIG共通鍵
key "tsig-key" {
    algorithm hmac-md5;                                 // アルゴリズム
    secret "lC5r2g9VELb+/ZF3K2N5mw==";                  // キー値
};

// TSIGマスタサーバ
server 192.168.56.111 {
    keys { tsig-key; };                                 // TSIG共通鍵
};

```
ググって調べにくいdefined-or演算子(//)を使ってみる

`//`が出てきてもググれなくて泣かないように確認しておく。

# 参考

こちらを見て試してみた。

[Defined\-or演算子「//」 \- PerlならサンプルコードPerl入門](http://d.hatena.ne.jp/perlcodesample/20120702/1341292758)

[第14回　最新Perl使いこなし術―リファレンスの引き方，5\.10以降の新機能（2）：Perl Hackers Hub｜gihyo\.jp … 技術評論社](http://gihyo.jp/dev/serial/01/perl-hackers-hub/001402)

# サンプルソース

こんな風にdefine-or演算子はサブルーチンの引数をハッシュやハッシュリファレンスで渡す場合のデフォルト値定義に使える。


```pl:a.pl
use v5.10;
use warnings;

test_v5_8();                  # null
test_v5_8(type => "list1");   # hash1
test_v5_8(type => "list2");   # hash2
test_v5_8(+{type => "hash-ref"}); # hash-ref

test_v5_10();                  # null
test_v5_10(type => 0);         # 0
test_v5_10(type => "list1");   # hash1
test_v5_10(type => "list2");   # hash2
test_v5_10(+{type => "hash-ref"}); # hash-ref

sub test_v5_8 {
  my %args = @_ == 1 ? %{$_[0]} : @_;
  my $type = (exists $args{type}) ? $args{type} : "null";
  say "v5.8 $type";
}

sub test_v5_10 {
  my %args = @_ == 1 ? %{$_[0]} : @_;
  my $type = $args{type} // "null";
  say "v5.10 $type";
}
```

`my %args = @_ == 1 ? %{$_[0]} : @_;`については[lib/Furl/HTTP\.pm \- metacpan\.org](https://metacpan.org/source/TOKUHIROM/Furl-3.11/lib/Furl/HTTP.pm#L41)から借用させて頂いた。ハッシュとハッシュリファレンスの違いを一行で吸収してしまうスゴイヤツである。

今までは`my $type = (exists $args{type}) ? $args{type} : "null";`と二重に書いていたのが`my $type = $args{type} // "null";`と一回に収まるがとてもスマートである。
VirtualBoxのVMでLinuxの開発環境を作る

これはなに
---------

社給のWindows PCでの開発がつらくなってきたので、VirtualBoxのVMでUbuntu16.04を動かして、開発環境として使ってみることにしました。
せっかくなので、設定周りをVagrantを使ってファイルで管理でできるようにして、随時更新して行くことにします。

まずは、gnome3のデスクトップ環境をインストールする設定を書いたもの（きっとポートフォワードの設定とか、今後足していくと思います）。

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

    # base box
    config.vm.box = "bento/ubuntu-16.04"

    # shared folder
    config.vm.synced_folder "./data", "/vagrant_data"

    # VirtualBox VM options
    config.vm.provider "virtualbox" do |vb|
        vb.name = "ubuntu"
        vb.cpus = "2"
        vb.memory = "8192"
        # GUI settings
        #vb.gui = true
        vb.customize [
            "modifyvm", :id,
            "--vram", "256",
            "--accelerate3d", "on",
            "--hwvirtex", "on",
            "--nestedpaging", "on",
            "--largepages", "on",
            "--ioapic", "on",
            "--pae", "on",
            "--paravirtprovider", "kvm",
        ]
    end

    # desktop environment provisioner (gnome3)
    config.vm.provision "shell", inline: <<-SHELL
        sudo apt-get -y update
        sudo add-apt-repository -y ppa:gnome3-team/gnome3-staging
        sudo add-apt-repository -y ppa:gnome3-team/gnome3
        sudo apt-get -y install ubuntu-gnome-desktop
        sudo dpkg-reconfigure gdm3
    SHELL

end
```

使い方
-----
0. VirtualBox、Vagrantをインストールしておく
1. 適当なフォルダに上記Vagrantfileを配置
2. 上記フォルダをカレントにして、`vagrant up`。処理が終わるまでしばらく待つ
3. 再起動。`vagrant reload`

参考リンク: 
-----
- [VagrantfileでVirtualBoxのVMパフォーマンス向上設定](http://qiita.com/hidekuro/items/385bcc4b9eb43945751d "VagrantfileでVirtualBoxのVMパフォーマンス向上設定")
- [Ubuntu 18.04 LTSに向けてUbuntu 16.04にGNOMEデスクトップをインストールする](http://ubuntuapps.info/blog-entry-944.html "Ubuntu 18.04 LTSに向けてUbuntu 16.04にGNOMEデスクトップをインストールする")
Java Stream は再利用できない。


## 再利用できませんでした。

```java
import java.util.stream.*;

public class StreamTest {

	public static void main(String[] args) {

		// a-z のストリーム作成
		Stream<String> stream = Stream.iterate('a', c -> ++c).map(Object::toString).limit('z' - 'a' + 1);

		// stream初利用
		try {
			String collect_01 = stream.filter(str -> {
				byte[] b = str.getBytes();
				return (b[0] % 2 == 0);
			}).collect(Collectors.joining(";"));
			System.out.println(collect_01);
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}

		// stream再利用 -- 失敗する
		try {
			String collect_02 = stream.map(str -> "[" + str + "]").collect(Collectors.joining(";"));
			System.out.println(collect_02);
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}

	}

}
```

## 結果

- [stream has already been operated upon or closed]というエラーがでました。

```
b;d;f;h;j;l;n;p;r;t;v;x;z
stream has already been operated upon or closed
```

- 処理つつ、カウントしつつ云々とかするには、なんでもかんでもstreamじゃないほうがいいのかな〜？
Django ProjectのHTTPSサーバー設定: Let's Encrypt

#背景
二番目のDjango project作成中です。今回は, [Django REST framework](http://www.django-rest-framework.org/)を使って、バックアンド、フロントエンドの完全分離実装, sslによるhttps通信を可能にするなど新しいことに挑戦しながら、進めています。

今回は、ネット上に様々な方からすでに情報共有されていましたが、
　1. Django projectへの設定方法はない
　2. 最近は結構設定しやすくなっているらしいが、それに関する文章はない
という理由から、[Let's Encrypt](https://letsencrypt.org/)という無料証明書を使ったHTTPSサーバー設定についてポスティングします。

#条件
まず、今回の設定においては、以下のような条件を満たす必要があります。
1. ProviderからDomainが取得済みである (例: [AWS Route53](https://console.aws.amazon.com/route53/home#DomainRegistration:), [ムームードメイン](https://muumuu-domain.com/)など)
2. Apache2でサイトの設定ファイルが設定済みである

#具体的なやり方
##Step 1. Lets encryptのインストール
こちらについて、Lets encryptのoffical pageでは　[Certbot](https://certbot.eff.org/)というソフトを使うのを推薦していましたが、調べて見たら特にそれにしなくても簡単にできるようです。

```
$ cd /usr/local
$ sudo git clone https://github.com/letsencrypt/letsencrypt
```
##Step 2. SSL証明書を作成する前に
参考文章では、上でインストールした後、すぐに作成コマンドで作っていましたが、うまく行きませんでした。実はその前に以下のような設定が必要なんです。

####Step 2.1 DNSサーバーでwww付きドメインの設定
providerから買ったドメインではwwwが付いていないと思いますが、DNSサーバーにてwww付け、Aレコードとして追加する必要があります。Lets Encryptの証明書作成フェーズでwwwがないドメインだとエラーになります。

```
Domain: example.com
追加部分
Name: www.example.com
Type: A record
Value: サーバーのipアドレス
```
もちろん、apacheのサイト設定ファイルに以下の項目追加を忘れずに。

```
ServerAlias www.example.com
```

####Step 2.2 mod_wsgi設定行のコメントアウト
この部分は、Django projectに限ります。Django projectをapache2にdeployする時に mod_wsgiというソフトが必要になります。具合的に、mod_wsgiをインストールした後、設定ファイルに以下のような項目を追加することになります。

```
WSGIDaemonProcess django_wsgi pythonpath=/var/www/myproject:/usr/local/lib/python2.7/dist-packages	
WSGIProcessGroup django_wsgi
WSGIScriptAlias / /var/www/myproject/myproject/wsgi.py
```

Lets Encryptは、既存の設定ファイルを参照して証明書を作った後、自動的にssl対応のサイト説定ファイルを作ってくれますが、 上の部分をコメントアウトしないと以下のようなエラーになります。

```
Name duplicates previous WSGI daemon definition
```
従って、まず上の部分をコメントアウトし、証明書が作成され、設定された後、ssl対応のサイト説定ファイルの中でコメントアウトをなくすことで対応できます。

##Step 3. Let's Encryptによる証明書の作成
いよいよ作成フェーズになりますが、以下のコマンドを実行するだけで簡単に作成できます。しかも、apacheでの設定ファイルも自動で作ってくれます。

```
cd letsencrypt/
sudo ./letsencrypt-auto --apache -d example.com -d www.example.com
```

##Step 4. mod_wsgiの設定行を有効にするのを忘れずに
Django projectの場合、作成されたapache設定ファイルの中で、mod_wsgi設定行を有効にする必要があります。

#最後に
これで、無料ssl証明書を使ったhttps通信が可能になりました。　最後に注意点として、証明書の有効期限です。上のやり方だと、3ヶ月有効なので、期限が切れる前に、renewalする必要があります。こちらに関しては、他の方が共有した情報がたくさんありますので、そちらを参照にすると良いと思います。

作成済みの時、有効期限に関する記述

```
   Your cert will expire on 2017-12-04. To obtain a new or tweaked
   version of this certificate in the future, simply run
   letsencrypt-auto again with the "certonly" option. To
   non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"
```

#参考文章
[Setting up SSL on a Django App with Let's Encrypt - Ubuntu, Apache, and mod_wsgi](https://www.subevolvere.com/blog/items/4/setting-ssl-django-app-lets-encrypt-ubuntu-apache-and-mod_wsgi)
WebViewでPullToRefreshの実装

### はじめに
* Chrome みたいに PullToRefresh でウェブページを更新してみたいなと思って実装してみたものの、  
ハマりどころがあったので、それの紹介になります。

### 単純な実装の問題点
* 「WebView + PullToRefresh」 などで検索してみると SwipeRefreshLayout を使った実装例がよく出てきます。

```xml:よくあるレイアウト例
<SwipeRefreshLayout>
  <FrameLayout>
    <WebView />
  </FrameLayout>
</SwipeRefreshLayout>
```

* 実際、サンプル通りの実装でなんとかなるのですが、  
Google マップのような指でぐりぐり動かすウェブアプリの場合悲惨な事が起きます。

![pull1.JPG](https://qiita-image-store.s3.amazonaws.com/0/55738/0ed5c566-c08e-5288-6847-7eb552fe1b40.jpeg)

* SwipeRefreshLayout が TouchEvent を吸ってしまって、地図が動かせなくなります…

### 解決策
* Chromium の実装を眺めてた所 OverScroll を監視していて、コンテンツサイズが WebView のサイズを越えない  
（＝スクロールバーが表示されない）場合には SwipeRefreshLayout を有効にしないといった処理になっていました。
* Chromium は WebViewCore から多種多様なイベントを貰っているので同じ実装は出来ません。
* そこでアレンジしたものを git にあげておきましたので、実装を見てみて下さい。  
80行程度の小さなものです。  
https://github.com/lovetanpopo/PullToRefreshWebView
CapyabraでJSが関連するテストがundefined methodエラーになる

RSpec x Capybara で JS が絡んだテストする際に，バージョンやドライバによって使える使えないメソッドがある．

https://github.com/thoughtbot/capybara-webkit/issues/84#issuecomment-111632554
https://stackoverflow.com/a/44401757/4535592

# やりたいこと
あるモデルの削除ボタンをクリックすると，confirmダイアログが表示され，それを accept すると削除が完了するケースをテストしたい．
Viewの記述はざっくり下記の通り．

```views/hoges/edit.html.slim
= link_to @hoge, data: {confirm: 'Are you sure you want to delete?'}, method: :delete, id: 'delete-hoge' do
    | 削除
```

# 記述方法
やはりバージョンによって記述がまちまちのようだが，2017.08 にリリースされた現時点での最新版 2.15.1 だと，下記で問題なく動作した．

* capybara 2.15.1
* capybabra-webbkit 1.1.0


```ruby:Gemfile
group :test do
  gem 'rspec-rails'
  gem 'capybara', '~>2.15.1'
  gem 'capybara-webkit',  '~>1.1.0'
end
```

```ruby:Gemfile.lock
    capybara (2.15.1)
      addressable
      mini_mime (>= 0.1.3)
      nokogiri (>= 1.3.3)
      rack (>= 1.0.0)
      rack-test (>= 0.5.4)
      xpath (~> 2.0)
    capybara-webkit (1.1.0)
      capybara (~> 2.0, >= 2.0.2)
      json
```

```spec_helper.rb
require 'capybara/rspec'
Capybara.javascript_driver = :webkit
```

accept は `page.driver.browser.accept_js_confirms` を使う．
`page.driver.browser.switch_to.alert.accept` や `page.accept_confirm { click_link "XXX" }` は， `undefined method` エラーになり動作しなかった．

```ruby:hoge_spec.rb
feature 'hoge', js: true do # ←　js:true は必須
  scenario 'hogehoge' do
    hoge = FactoryGirl.create(:hoge)
    visit edit_hoge_path(hoge)

    expect(page).to have_content 'edit hoge'

    click_link 'delete-hoge'
    page.driver.browser.accept_js_confirms

    expect(page).to have_content 'Completed'
  end
end
```
複数リポジトリのコミットコメントルールで混乱しないためのGitTips

# 困ったシーン
コミットコメントのルールはプロジェクトや会社に応じて様々なものがあると思います。
複数の異なるルールで運営されているリポジトリをいったりきたりしているとき、
いざコミットする段階になって、「あれ、ここでは日本語だっけ、英語だっけ...」と時々混乱してしまいます。
こういう時のためには、コミットテンプレートを活用すると便利です。


# 参考
http://qiita.com/kasaharu/items/cdb587d4d27d7608b063

# 設定方法

まず、テンプレートとなるtxtファイルを準備する必要があります。
もしチーム内で合意が取れている場合はtxtファイル自体をgit管理に含めても良いと思いますが、
自分の場合は個人的オレオレルールもあったりするので、自分のローカルに適当に置いています。

```cmd
$ mkdir ~/gitmessages
$ vi ~/gitmessages/.template.txt
```

```text:~/gitmessages/.template.txt

# Please write in English!
```

作った設定ファイルをgitに設定します。

```cmd
$ cd /move/to/project/dir
$ git config commit.template ~/gitmessages/.template1.txt
```

すると、コミットコメント記入時にテンプレートの内容が反映されます。


![スクリーンショット 2017-09-05 22.23.56.png](https://qiita-image-store.s3.amazonaws.com/0/24870/fba64228-1e7d-36b3-191c-eadfe6ac37ba.png)

テンプレートの1行目をあえて空けておいて、
2行目の先頭に `# 何か文章` と書くと、記入のためのヘルプメッセージとして扱うことができます。
（このテクニックは @norifumi さんにアドバイスいただきました。ありがとうございます！）

こんな感じに使ったりも便利です。

```text:~/gitmessages/.template2.txt
【番号】 

# 【番号】にはチケット番号を記入してください。
# ... (他にも重要なルールなどを書いたり) ...
```

![スクリーンショット 2017-09-05 22.52.28.png](https://qiita-image-store.s3.amazonaws.com/0/24870/ad29f1d6-ae98-a82f-c2c6-6afbff1fcf2d.png)
jQueryで動的に文字のフォント色を変化させる方法（私はSharePoint画面開発で使いました）


#はじめに
前回の記事でいいねをいただきまして、気分が良くなったので、
Tipsの記事を書かせていただきます。
Webの画面にて何かを選択したら、画面上のフォントの色を変えたい場合にお役に立てる記事です。
javascriptにてjQueryにてCSSで色を指定します。

#本題です
以下コードをご覧ください。
簡単ですね、changeイベントがトリガーでcssで色を指定するだけです。
イベントはchange以外いろいろあると思うので、ターゲットとするDOM要素のとらえたい変化に合わせて変えてください。
ただ要注意です。変化イベントのときの鉄則ですが、
**次の色の変化をさせる前に色を元に戻すこと**
を忘れないでください！

```js:changefontcolor.js

// 選択項目によって色を変化させるメソッド
function setColorItems(){
    // 変化させるDOMのID群
    var ArrayIDsRed = ["ID1","ID2",];    
    var ArrayIDsBlue = ["ID3","ID4"];
    var ArrayIDsAll = ["ID1","ID2","ID3","ID4"];

    $("#TargetID").change(function () {
        // 変化させたDOM要素で何の値に変更されたか取得
        var itemcontents = $("#TargetID").val();
        
        // 最初に色を元に戻す（前回の色が残ってしまうため）
        SetColorfont( ArrayIDsAll, 0 );
        // 何を選択したかによって色を変化させる
        if(itemcontents == "赤色に変化させる"){
           SetColorfont( ArrayIDsRed, 1 );
        }else if( itemcontents == "青色に変化させる"){
           SetColorfont( ArrayIDsBlue, 2 );
        }else{
           SetColorfont( ArrayIDsAll, 0 );
        }
    });
}
 
// ちょっと冗長だけど勘弁してください
function SetColorfont( arrayID , colorflg ){
 
    if(colorflg == 0){
        for (var i = 0; i < arrayID.length; i++) {
            $("#" + arrayID[i]).css('color','black');
        }
    }else if(colorflg == 1){
        for (var i = 0; i < arrayID.length; i++) {
            $("#" + arrayID[i]).css('color','red');
        }
    }else if(colorflg == 2){
        for (var i = 0; i < arrayID.length; i++) {
            $("#" + arrayID[i]).css('color','blue');
        }
    }else{
        // Do Nothing
    }
 
}
```
#おわり
実行していないコードなので、間違いがあった場合はごめんなさい。
今回IDって？DOMって？これを使うhtmlが想像つかない！となったもっとより初心者のかた向けに記事を書こうと思いますので、
できた際はぜひ読んでください。
今回SharePointでの開発を行う上で学んだことを書かせていただきました、
日々日々進化成長がやみませぬ。。。
それではありがとうございました。
VirtualBox 上で開発しているウェブシステムを実機のブラウザで確認する


## TL;DR
* ホストマシンと検証機を同一ネットワークに接続する
* Fiddler をインストールする
* 外部アクセスを許可する
* (Host Remapping をする)
* スマホのプロキシをホストマシンに向ける

## 前提
Windows にインストールされた VirtualBox 上で Web システムを開発している。
ゲストはブリッジ接続ではなく、 NAT とホストオンリーを利用している。
ホストマシンと検証機は同一ネットワーク内の無線 LAN に接続している。
普段は Chrome のデバッグツール等でスマホ表示を確認しているが、詳しい検証や調整は実機でしたい。
実機から VirtualBox 上のゲストにアクセスする方法はググれば色々出てくるが、なんだかハードルが高そう。

## Fiddler をインストールする
[公式サイト](https://www.telerik.com/download/fiddler-wizard) からダウンロードしてくる。
表示されているプルダウンを選択していき、最後にメールアドレスを入力すればダウンロードが始まる。
他のツールは有料だが Fiddler は **無料** で使える。
ダウンロードが完了したら実行し、適当に進めていけばインストールが完了する。

## Fiddler の起動と設定
起動すると何か聞かれた気がするが、とりあえずキャンセル。

### 外部アクセスを許可する
`Tools > Options` を選択するとダイアログが開く。
`Connnections` タブを開き、 `Allow remote computers to connect` にチェックを入れる。
`Fiddler listens on port` の数字をメモっておく。

### hosts の設定

```
ゲスト上で VirtualHost の機能を利用している場合は、これを設定しておく必要がある。
しかし、そうでない場合は特に設定する必要はないので次に進む。
```


メニューバーから `Tools > HOST` を選択するとダイアログが開く。
人によっては `Tools > Host Remapping` とかになってるかも。

入力書式は hosts と同じ。
例えば **ゲスト** の IP が `192.168.1.101` で、これに仮の URL を `vbox01.fiddler` とした場合は次のように書く。

```
192.168.1.10 vbox01.fiddler
```

区切り文字は `半角スペース` でも `タブ` でも良い。
`Save` を押すとすぐに反映される。

## スマホのプロキシを設定する
**ホストマシン** の IP を `192.168.2.201` とし、先に確認した `Fiddler listens on port` の値を `8888` とする。

### iOS
1. `設定 > Wi-Fi` から接続済みのネットワークの `i` ボタンをタップする。
2. 下方向にスワイプすると `HTTPプロキシ` という項目があるので、 `手動` を選択する。
    * `サーバ` の項目に `192.168.2.201` を入力する
    * `ポート` の項目に `8888` を入力する
    * `認証` はデフォルトの状態では `OFF` にしておく（緑にしない）
3. 確定ボタンなどはないので、ホームボタン等で適当に抜ける


### Android
1. `設定 > Wi-Fi` から接続済みのネットワークを長押しする。
2. ポップアップが出てくるので　`ネットワークを変更` をタップする。
3. `詳細設定項目` をタップする
4. `プロキシ` をタップし `手動` を選択する
5. 入力フィールドが展開されるので、下記のように入力する。
    * `プロキシのホスト名` の項目に `192.168.2.201` を入力する
    * `プロキシポート` の項目に `8888` を入力する
    * `プロキシを不使用` はとりあえず空欄
6. `保存` をタップする。

## ブラウザを起動する
**ゲスト** の IP または、 hosts を設定した場合はそれを、スマホのブラウザの URL 欄に入力する。
表示される。うまー。

## 備考
iOS の Safari をデバッグする際は、 Mac と接続しておけば Mac 上の Safari でインスペクタを起動することができるのでめっちゃ捗る。
この時、ホストマシンと Mac は別物で構わない。
Fish-shellでコンパイル時の動作が違う

# 背景
OpenCVのサンプルプログラムをビルドしようとしたら何故か出来なかった

#環境
・Archlinux(4.12.8-2-ARCH)
・GCC(7.1.1 20170630)
・OpenCV(3.3.0-2) - /usr/include/と/usr/lib/下にインストール
・fish(2.6.0)
#実行したコマンド

以下の画像の通り

![Screenshot from 2017-09-05 21-55-51.png](https://qiita-image-store.s3.amazonaws.com/0/138078/26ad719e-ad99-115d-1a67-b9d845973eae.png)

左がfishで右がbash、zshでも試してみたが通った
ちなみにfishのサブコマンドが``でなく()なのはfishの仕様です

#考察

ldが受け取る環境変数か何かが違うのかな？

#暫定的な解決方法

echoした結果をそのまま渡したらいけた
VSCode使ってるしtasks.jsonに書いたしとりあえず

#まとめ
分かり次第書きます、心当たりがあればコメントください
PHPマニュアル日本語版にパッチを送る

Php Docbook Online Editor (https://edit.php.net/) を使うと、PHPマニュアルにパッチが送れる。

実際に送ってみたので、そのときの手順を紹介する。

# オンラインエディタへのログイン

Php Docbook Online Editor にアクセスすると、次のようなログイン画面が開く。

![ログイン画面](https://qiita-image-store.s3.amazonaws.com/0/35988/07e39190-c928-d2a4-35f0-31d15546c898.png)

各種ソーシャルアカウントでログインできる。ぼくはTwitterを選んだ。

今回は日本語版をターゲットとするので、Language module は「Japanese」にする。

# 修正対象の決定

ログイン後、サイドメニューを眺めると、未翻訳のファイルや、エラーのあるファイルがあることがわかる。

今回は /reference/xsl/book.xml のエラー修正に挑戦することにした。サイドメニューの「現在の翻訳のエラー」から /reference/xsl/book.xml を開くと、下記の画面になった。

![/reference/xsl/book.xml を開いたところ](https://qiita-image-store.s3.amazonaws.com/0/35988/48bf8711-8fdd-ec3e-76ca-e4527614a578.png)

# ファイルの修正

エラーメッセージを参考に、link タグを追加して保存した。その結果、エラーがなくなった。

![/reference/xsl/book.xml を編集して保存したところ](https://qiita-image-store.s3.amazonaws.com/0/35988/23d73e57-97df-0349-f135-eec69071b400.png)

念のため、diffを確認してみる。とくに問題なさそうだ。

![diffの内容](https://qiita-image-store.s3.amazonaws.com/0/35988/9591a02d-c4d9-da8a-685e-b44f8c9d6da4.png)

# 「url.libxslt」が定義されているか確認

大事なことを忘れていた。万一「url.libxslt」が定義されていなければ、参照エラーになってしまうかもしれない。英語版には定義されているだろうが、日本語版にはあるのだろうか。

サイドメニューの「すべてのファイル」から Repository/doc-base/entities/global.ent に当たりをつける。ファイルを開いて検索すると、やはり定義されていた。

![url.libxslt が定義されていることを確認](https://qiita-image-store.s3.amazonaws.com/0/35988/146459d3-e784-898d-635c-46fe22fb9ab4.png)

## 注意

ここで可能であれば、ソースをチェックアウトし、同様の変更を施して、ビルドがうまくいくか試したほうがよいだろう。ぼくはそうした。

ビルド方法は下記が参考になる。

- [PHP manual generate HOWTO (version 2013-06-29) - mumumu の日記](http://mumumu.github.io/blog/2013/06/29/php-manual-generate-howto/)

# パッチの作成

さて、変更したファイルは、サイドメニューの「作業中」で参照できるようになっている。「Create a new patch」を選んでみよう。

![パッチを作る](https://qiita-image-store.s3.amazonaws.com/0/35988/6c17323c-e263-2033-b5be-1daaab7e87f1.png)

すると、パッチ名や説明文、メールアドレスを入力する画面が開く。

![パッチ作成画面](https://qiita-image-store.s3.amazonaws.com/0/35988/c1a7a0e9-1beb-35d3-0a23-58589a5d64d4.png)

入力後に「Create」ボタンを押せば、パッチが作成される。「レビュー待ちのパッチ」で内容が確認できるようになった。

![レビュー待ちのパッチが1になっている](https://qiita-image-store.s3.amazonaws.com/0/35988/50ca61a2-e3bf-8ac2-baa6-b97d6b241e2d.png)

あとは、コミッタによってパッチがaccept（またはreject）されるのを待つだけだ。結果は、さきほど入力したメールアドレスにメールで通知される。

# 参考

ぼくが初めて送ったパッチについて、下記の記事にまとめている。

- [iwamotのブログ : PHPマニュアルの「導入」を「はじめに」に変えていただいた](http://iwamot.ldblog.jp/archives/2381182.html)