OmniAICreator/Qiita-1.07M huggingface dataset:
[Unityで学ぶC#] 0 Hello World



# 対象
- スクリプトを作って実行するまでの手順が分かる
- Unityでゲーム作ってきたけどプログラミングの理解が浅い


# なぜUnityでC#を学ぶのか
1. 書いてすぐ実行できる
2. 学んだことを活かしやすい


# 演習1 Hello World

### 1. 準備

`Example0`という名前でスクリプトを作り，以下のようなファイル構成にしましょう.

![im2.png](https://qiita-image-store.s3.amazonaws.com/0/113504/0642a1e4-5392-1851-68d5-04151488eda5.png "im2.png")


後々見やすくなると思います．

### 2. スクリプトを開く

スクリプトをダブルクリックして開くと以下のようになっていると思います．(Unity5.5.0)

![im.png](https://qiita-image-store.s3.amazonaws.com/0/113504/64f15249-5313-4f59-025f-6f05322af0cb.png "im.png")

### 3. Updateの部分は当分使わないので消しましょう．

![gif1.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/b5c32c5b-8a00-ea92-a935-9ddc28227c46.gif "gif1.gif")

### 4. スクリプトを書く．

![gif2.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/df91dc55-b8c6-0101-aa29-1ab1dd97984e.gif "gif2.gif")

```Example0.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Example0 : MonoBehaviour {

	// Use this for initialization
	void Start () {
		Debug.Log ("Hello World");
	}
}
```

書く場所に気をつけましょう．

書き終わったらセーブをします.
Command(Control) + S です

### 5. 実行
![gif3.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/930f368c-7fba-d2d0-c81b-6eb380613692.gif "gif3.gif")


スクリプトを適当なゲームオブジェクトにアタッチ(くっつける)して実行します．

ConsoleビューにHello Worldと表示されたら成功です．

# 今回のスクリプトについて
## Startメソッド

```csharp
void Start(){
```

この行は「Startメソッド」の開始を示しています．

今は実行すると

```csharp
void Start(){ // 開始行

	// 中かっこの間の，この範囲が一回実行される．
	
} // 終わり行
```

と覚えておきましょう．

## Debug.Log

```csharp
Debug.Log("Hello World");
```

この行は"Hello World"という文字列を，Consoleに表示します．

Hello Worldの部分を変えると，違う文字が表示されます．

```csharp
Debug.Log("おはよう"); // おはようと表示される

Debug.Log("test"); // testと表示される
```

![im3.png](https://qiita-image-store.s3.amazonaws.com/0/113504/c9348774-c412-1602-dba8-d0486ce6401a.png "im3.png")

![im4.png](https://qiita-image-store.s3.amazonaws.com/0/113504/944534fc-f66a-1e0f-295f-43ff9430d967.png "im4.png")

# 課題

![im5.png](https://qiita-image-store.s3.amazonaws.com/0/113504/e6153237-283e-9d57-0d9b-f0e4919bec22.png "im5.png")

コンソールにこのように表示するスクリプトを書いてみましょう．
mac端末からphpで改行コードをjsonに渡す方法

#背景
* macから改行コード(PHP)をjsonに渡して、とあるAPI上(webhookで渡してアプリ上で表示するもの、HTMLはかけない）で表示させるのにはまったのでメモっておく
* 今回の場合、json_encodeするからって、特別なこともなく、macのルールにのっとればよかったと反省
* 参考と一緒で要するにoption + ¥ で良かった。。

##期待している表示例
```
あけまして
おめでとう
```
##Codeとsample
```php:sample.php
$message = 'あけまして¥nおめでとう';  // '改行されない'
$message = 'あけまして\nおめでとう';  // '改行されない'
$message = 'あけまして\\nおめでとう'; // '改行されない'
$message = "あけまして\nおめでとう";  // '改行される'
```
#参考
* http://qiita.com/shota_low/items/d639b7fa1e932ac4bdae
Let's Encrypt certbot実行時、キー入力待ちで止まってcronで困らないようにする。

# certbotでキー入力待ち発生！

```shell-session
(certbotインストールディレクトリ)/certbot-auto certonly --standalone -d ほにゃらら.com※架空のドメイン
```

Let's Encryptから証明書を取得するためにずこっと叩いて２回目以降・・・。

```shell-session
You have an existing certificate that contains exactly the same domains you requested
Do you want to renew and replace this certificate with a newly-issued one?
```

同じドメイン名で要求済みなのは百も承知、
証明書の期限が切れる前に新しい証明書を要求したいのですが・・・

人力の場合はもちろん「ＹＥＳ！」で解決する事項ですが、
cronに登録しようにもキー入力待ちで進まないことに・・・。

## --renew-by-defaultオプション！

```shell-session
(certbotインストールディレクトリ)/certbot-auto certonly --standalone -d ほにゃらら.com※架空のドメイン --renew-by-default
```

これで「規定で確認することなく再作成」になるので、心置きなくcronにぶち込めます（＾＾）

要求しすぎて怒られないように（＝＝；）
Fluentdのtagに動的な日付と時間を付与する


## 概要

Norikra -> Fluentd -> Couchbase
という構成で[Norikra](http://norikra.github.io/)で集計した結果を[Couchbase](https://www.couchbase.com/)に入れてます。

システムの都合上、CouchbaseのBucket名に動的に日付と時間を`bucketname_yyyymmddhh`の形式で付与する必要がありました。

その実装方法メモ。

## システム環境

* OS: CentOS release 6.8 (Final)
* Norikra: norikra (1.0.4 java)
* rbenv(Norikra): jruby-1.7.26
* td-agent: 2.3.4-0.el6
* Couchbase: 4.0.0-4051 Community Edition (build-4051)


### fluent-plugin

* fluent-plugin-couchbase (0.0.2)
* fluent-plugin-forest (0.3.3)
* fluent-plugin-norikra (0.4.2)
* fluent-plugin-record-reformer (0.8.2)


## 実装方法

まずは最終的に選択した実装方法を記載します。
こうなりました。

```/etc/td-agent/td-agent.conf
<source>
  type    norikra
  norikra localhost:26571
  <fetch>
    method     event
    target     target_query
    tag        query_name
    tag_prefix norikra.query
    interval 3m
  </fetch>
</source>

<match norikra.query.*>
  type record_reformer
  tag #{Time.now.strftime('%Y%m%d%H')}.${tag}
</match>

<match *.norikra.query.*>
  type forest
  subtype couchbase
  <template>
    hostname couchbase.example.com
    port 8091
    pool default
    bucket bucketname_${tag_parts[0]}
    ttl 0
    include_ttl false
  </template>
</match>
```

## 解説

### 要件的なところ

* Norikraからfetchした当該時間帯の日付と時間がsuffixとしてついたCouchbaseのBucketに集計結果を入れたい。
* 動的な日付と時間の生成はFluentdで完結させたい（ログの送信元であるアプリケーション側で生成してtag指定で送るとかはやりたくない）。

### ポイントざっくり

confを見ればわかると思いますが、ポイントは以下２点です。

* `record_reformer`のtagにrubyのコードを埋め込んで動的に`yyyymmddhh`を生成して先頭につける。
* `out_couchbase`に`forest`をかぶせて`tag_parts`を使えるようにする。


### 細かいところ

#### ダブルクォーテーションにご注意

`record_reformer`のtagの値をダブルクォーテーションで囲むとFluentd起動時の日付と時間で固定されてしまうので今回の場合はNGです。

__OK__

ログを処理するたびに当該時間帯の`yyyymmddhh`が付与されます。

```
#{Time.now.strftime('%Y%m%d%H')}.${tag}
```

__NG__

Fluentd起動時の`yyyymmddhh`で固定されます。

```
"#{Time.now.strftime('%Y%m%d%H')}.${tag}"
```

#### record_reformerを挟む理由

confを見てわざわざ`in_norikra`と`out_couchbase`の間に`record_reformer`を挟む必要はないのでは？と思う方もいらっしゃるかもしれません。

私も最初はこう書きました。

```
<match norikra.query.*>
  type couchbase
  hostname couchbase.example.com
  port 8091
  pool default
  bucket bucketname_#{Time.now.strftime('%Y%m%d%H')}
  ttl 0
  include_ttl false
</match>
```

でもこれだとFluentdの起動時にエラーになってしまいます。

```/var/log/td-agent/td-agent.log
(省略)
  <match norikra.query.*>
    type couchbase
    hostname couchbase.example.com
    port 8091
    pool default
    bucket bucketname_#{Time.now.strftime('%Y%m%d%H')}
    ttl 0
    include_ttl false
  </match>
</ROOT>
2017-01-09 05:13:22 +0000 [error]: unexpected error error_class=Couchbase::Error::BucketNotFound error=#<Couchbase::Error::BucketNotFound: bootstrap error, The bucket requested does not exist (error=0x19)>
```

ログが`The bucket requested does not exist`と言っていますが、Couchbaseに`bucketname_2017010905`を作ってもダメです。

多分`bucketname_#{Time.now.strftime('%Y%m%d%H')}`を作ってあげるといけると思いますがCouchbaseのBucket名に`#`や`{}`は使えません。


#### out_couchbaseにforestをかぶせる理由

上で少し触れているので蛇足かもしれませんが、`out_couchbase`は`tag_parts`が使えないからです。


## まとめ

* Fluentdのtagに動的な日付と時間を付与する方法を紹介しました。
* 動的日時の生成部分をダブルクォーテーションで囲むとFluentd起動時に固定されてしまうので気を付けましょう。
* `out_couchbase`のbucket指定には`tag_parts`は使えないし、rubyのコードを書いても動的にパラメタ生成はしてくれません。
* 他にもっと良い方法があればコメントお願いします。
SpookyJSで、日本語を書くとハングアップして正常に動作しない不具合

かなりハマりました。。
以下の単純なコードで、フリーズ状態で先に進みません。

```js
try {
    var Spooky = require('spooky');
} catch (e) {
    var Spooky = require('../lib/spooky');
}

var spooky = new Spooky({
        child: {
            transport: 'http'
        },
        casper: {
            logLevel: 'debug',
            verbose: true
        }
    }, function (err) {
        if (err) {
            e = new Error('Failed to initialize SpookyJS');
            e.details = err;
            throw e;
        }
        spooky.start('http://en.wikipedia.org/wiki/Spooky_the_Tuff_Little_Ghost');
        spooky.then(function () {
            // コメント
            this.emit('hello', 'Hello World');
        });
        spooky.run();
    });

spooky.on('hello', function (greeting) {
    console.log(greeting);
});

spooky.on('console', function (line) {
    console.log(line);
});
```

**// コメント** の部分を削除すると動作するため、最初はJavascriptのコメントがアウトなのかー？と考えていましたが、さすがにノーコメントのコードはあかんやろ、と思い、公式サイトを見ていたところ、下記のエントリーを発見しました。

> Hangs when there are international characters inside spooky.then
> https://github.com/SpookyJS/SpookyJS/issues/110

上記に対するパッチも。
https://github.com/SpookyJS/SpookyJS/pull/125/files
よく使うGitコマンド

# git使用方法
初心者はまずここを見るとgitについて実感できる  

サルでもわかるGit入門  
http://www.backlog.jp/git-guide/

## よく使うもの
### 一覧表示
```
$ git branch
```
### ブランチを作成
```
$ git branch "ブランチ名"
```
### ブランチ名の変更
```
$ git branch -m "変更前のブランチ名" "変更後のブランチ名"
```
### ブランチ削除
```
$ git branch -d "ブランチ名"
```
### ブランチ切り替え
```
$ git checkout "切り替えたいブランチ名"
```
### ブランチをマージする
masterブランチにissueを取り込む場合

```
$ git checkout master
$ git merge issue
```

## 変更の操作
### 一つ前のコミットのコメントを変更
```
$ git commit --amend
$ git rebase --continue
```
### 以前のコミットのコメントを変更   
3つ前のコミットのコメント内容を変更

```
$ git rebase -i HEAD~3
 #ここで変更したい行の pick を edit に変更し保存する
$ git commit --amend
 #変更したいコメントにする
$ git rebase --continue
```
### 特定の文字列を含むコミットを探す
```
$ git log --grep "探したい文字列"
```
### 特定のコミットまで戻る
```
$ git reset --hard "コミットのハッシュ値"
```
### 戻ったコミットをさらに戻す
```
$ git reflog
 #HEAD@{1}など変更履歴が表示される
$ git reset --hard ”戻りたいHEAD番号”
$ git reset --hard HEAD@{20}
```

### GitHubなどのリモートリポジトリに変更内容を更新する
```
$ git push -u origin master
```
Angular 2 に入門してみてる

WinJS やら React やらは使っているのですが、Angular (AngularJS、Angular 2 ともに) にはこれまで触ったことがなかったので、ちょっと触っておくかと思って入門してみました。 ちなみに TypeScript を使用します。

# やったこと

* 公式ドキュメントの [Quickstart](https://angular.io/docs/ts/latest/quickstart.html) を見た。
* 公式ドキュメントのガイドの [Learning](https://angular.io/docs/ts/latest/guide/learning-angular.html) に沿ってチュートリアルとドキュメントを読むのを進めた。
    * 最初にローカル環境でチュートリアルを進めるためのセットアップ : [Setup](https://angular.io/docs/ts/latest/guide/setup.html)
    * 次にチュートリアル : [Tour of Heroes tutorial](https://angular.io/docs/ts/latest/tutorial/)
    * 最後にガイドのドキュメントを読み進め : [Learning](https://angular.io/docs/ts/latest/guide/learning-angular.html) の 3 以降

# やっていくのに役立ったもともとの知識

* TypeScript の知識。
* Android アプリ開発での Rx やら DI やらの知識。 (なくても困らないけど似てる部分もあるので学びやすかった。)
* React の知識。 (なくても困らないけど似てる部分もあるので学びやすかった。)

# 感想

軽く触った感じの感想です。

* セットアップのページにあるように、[QuickStart seed プロジェクト](https://github.com/angular/quickstart)をクローンしてくるだけでチュートリアルを始められる。 便利。
    * 実際のプロジェクトだともうちょっと構成変えたりすると思うのでこのままの構成を本番環境に持って行くことはないと思うけど、以下のことができる構成が整っている。
        * TypeScript のインクリメンタルビルドとローカルサーバーでの動作確認。
        * Karma による E2E テスト。
        * TSLint による Lint。
    * SystemJS を使ってる。 SystemJS を使ったことはなかったので参考になる。
* チュートリアルもわかりやすくて良い。
* 公式的に TypeScript がサポートされており、ドキュメントのソースコードも TypeScript だったりして、TypeScript で書きたい勢としてはやりやすい。
* Angular は View 部分を扱うライブラリではなくてフレームワークなので、クライアントアプリを書く際の全体の構成の指針が示される感じ。 (そこは React と違うところだなーと思った。)
    * モジュールの仕組みや DI の仕組みが提供されている。 アプリケーション全体のテストについても考えられている。
    * ルーティングの仕組みを提供するモジュールもあるし、HTTP 通信に関するモジュールもある。
    * Web フロントエンドの SPA を書いたことがない、って人でもとっつきやすいのではないか。
    * 一方で View 部分だけを扱うライブラリを求めてる人にとっては 「これじゃない」 感がありそう。
* コンポーネント同士を疎結合にしやすい仕組みになってる。 一方で React と比べて型の制約を付けにくい。
    * 個人的には React の方が好きかな。

# 参考にしたページ

公式ドキュメント以外で参考にしたもの。

* [Angular2実践入門](http://www.slideshare.net/shumpei/angular2-59809652)
* [[初心者向け] Angular2からみるJSフレームワーク入門](https://rdlabo.jp/angular2-373.php)
* [Angular2入門！ゼロから始めたぼくの勉強方法](http://blog.yuhiisk.com/archive/2016/05/03/learning-method-of-angular2.html)
* [入門3日目の僕が感じたAngular 2のすごいところ](http://blog.teratail.com/entry/angular2_nyumon)
win7でWindows Updateが進まない場合の対応

# win7でWindows Updateが進まない症状が出た際の対処

しばらく放置していたVMwareFusionゲストWin7のWindows Updateした時にハマった際のメモです。

環境

- Mac OS X 10.6.8 Snow Leopard
- VMware Fusion 3.1.4
- Windows7 Home SP1(32bit)

症状

- 前回行っていたUpdateは2015年9月
- 「更新プログラムを確認しています…」が数時間経過しても終わらない


## 更新をキャンセル

タスクマネージャ[サービス]タグ内の一覧から「wuauserv」右クリック[サービスの停止]
またはコマンドプロントで

```ruby:cmd
>cd C:\Windows\system32
>net stop wuauserv
```

上記でキャンセルできない場合の最終手段で「更新プログラムを確認しています…」状態のまま一度再起動して強制的にキャンセル。


## いくつかの更新プログラムを手動インストール

### 更新プログラム入手

更新プログラムが今までの「[ダウンロードセンター](https://www.microsoft.com/ja-jp/download)」からの配布が終了(2016年4月)したため「[Microsoft Update カタログ](https://www.catalog.update.microsoft.com/Home.aspx)」から更新プログラムを入手。

- IE（8以上）を起動（Edge/IE以外のブラウザでは利用できないので注意）
- [Microsoft Update カタログ](https://www.catalog.update.microsoft.com/Home.aspx)にアクセス
- 初めてアクセスした場合はアドオンのインストールを求められるのでインストール
- 検索ボックスから必要な更新プログラムを検索(今回インストールした更新プログラムは次項で記述)
- 検索結果一覧から目的の更新プログラム(32bit/64bit/server用などがヒットするのでシステムに合うもの)の[追加]ボタンをクリック
- 検索ボックス下の[バスケットの表示]をクリック
- 追加した項目の一覧が表示されるので、一覧の左上[ダウンロード]ボタンをクリック
- 「ダウンロードオプション」画面で任意のダウンロード場所を指定し[続行]


### 更新プログラム手動インストール

入手した更新プログラムのインストーラーファイルを実行。
今回手動インストールした更新プログラムは次の通り。

- [KB3177467](https://www.catalog.update.microsoft.com/Search.aspx?q=KB3177467)：Windows Update Client(KB3172605)のインストールに必要(KB3172605がインストールできない場合は先にこちらを)
- [KB3172605](https://www.catalog.update.microsoft.com/Search.aspx?q=KB3172605)：Windows Update Client（2016年12月14日時点最新版）
- [KB3138612](https://www.catalog.update.microsoft.com/Search.aspx?q=KB3138612)：Windows Updateが進まない問題を改善
- [KB3125574](https://www.catalog.update.microsoft.com/Search.aspx?q=KB3125574)：Windows7 SP1リリース後5年間分のパッチをまとめたもの

インストーラーを実行しても「このコンピューター上の更新プログラムを検索しています」から進まない場合、コントロールパネル[Windows Update]左カラム[設定の変更]で[更新プログラムを確認しない]に設定すると上手くいく場合があります。


## Windows Update実行

通常のWindows Updateを実行。
更新していなかった期間が長い場合は何度も「更新プログラムの確認」と再起動を繰り返すことになります。
かなり時間がかかるので注意（丸一日つきっきりでした…）。


## 参考

- [Windows7のWindows Updateが終わらない、遅い、進まない問題の解決方法](http://freesoft.tvbok.com/tips/windows_update/not_proceed_update.html)
- [更新プログラムを個別にダウンロードする（Microsoft Updateカタログ編）](http://www.atmarkit.co.jp/ait/articles/1509/07/news030.html)
- [windows7更新プログラムを確認していますを劇的に改善KB3138612](https://www.ikt-s.com/windows7-kb3138612/)
Google Cloud Shell でgo getを行う

Google Cloud Shell で、 `go get` を行う方法です。

公式のチュートリアルなどを行った後、初心者を脱するため `go get` を行おうと思った時に、
それまではローカル環境で、 `goapp get` でパッケージのインストールをしていて
そのままの感覚で、Google Cloud Shell上で `goapp get` を行うと

```
go install runtime/cgo: open /google/go_appengine/goroot/pkg/linux_amd64_appengine/runtime/cgo.a: permission denied
go install appengine_internal/github.com/golang/protobuf/proto: open /google/go_appengine/goroot/pkg/linux_amd64_appengine/appengine_internal/github.com/golang/
protobuf/proto.a: permission denied
```

`permission denied` などと言われて焦ります・・・
しかし、Google Cloud Shell上では、普通に `go get` すればいいようです。
`go env` を見てみると、

```
GOPATH="/home/llby/gopath:/google/gopath"
```

となっていて、HOME直下に `gopath` ディレクトリが作ってあり
`go get` すると、こちらにインストールされます。
`/google/gopath` の方には、権限がないようですね。
なので、 `goapp get` は出来ない・・・

とりあえずこれで、初心者を脱して
旧appengineパッケージから、新appengine（ google.golang.org/appengine ）への移行なども出来ますね。
Reduxまとめ


## Redux

### Action編

__データの流れ__
1. `ActionCreator`で`Action`を作成
2. `Reducer`が現在の`state, action`を元に新しい`state`を作成
3. `state`の変更をUIなどに反映

#### Action
`Store`の`state`を変更するためのメッセージ（オブジェクト）
`ActionCreator`によって作成されるオブジェクトのため、実体として定義はされない

```
{
    type: "SHOW_ERROR",
    error: message
}
```

#### ActionCreator
`Action`を返す単純な関数
`Component`と`Reducer`を繋ぐI/F的な役割

```actions.js
export const SHOW_ERROR_MESSAGE = 'SHOW_ERROR_MESSAGE';

export function showErrorMessage(message) {
  return {
    type: SHOW_ERROR_MESSAGE,
    error: message
  }
}
```

#### Reducer
`state, action`を元に新しい`state`を返す
`state`を更新するためのロジックが定義される

```reducer.js
function errorMessage(state = null, action) {
  const { type, error } = action;

  switch (type) {
    case ActionTypes.SHOW_ERROR_MESSAGE:
      return error;
    case ActionTypes.RESET_ERROR_MESSAGE:
      return null;
    default:
      return state;
  }
}
```

#### Connect
`Component`に`state, action`を`store.props`としてアクセス出来るようマッピングしてくれる

```
// ActionCreator
import actions as actions from '../actions';

class Container extend Component {
  handleShowError(e) {
    const { showErrorMessage } = actions;
  
    e.preventDefault();
    this.props.dispatch(
      showErrorMessage('エラーだよ')
    );
  }

  render() {
    return (
      <button onClick={this.handleShowError}>ボタン</button>
    );
  }
}

// Storeのstateをstore.propsとして返す
const mapStateToProps = state => ({
  return state;
});

export default connect(
  // state => store.props
  mapState
  // ActionCreator
  { ...actions }
)(Container);
```

#### bindActionCreators
`connect`に`ActionCreator`をマッピングする際、`dispatch`関数に`ActionCreator`をバインドしたプロパティとして展開してくれる
（つまり、`dispatch`する手間を省いてくれる）

下記のコードを抽象化してくれる

```
function mapDispatchToProps(dispatch) {
  return {
   // actionXをdispatchするhandleClickプロパティを展開
    handleClick: () => {
    	dispatch(actionCreatorX())
    }
  }
}
```

```
// ActionCreator
import actions as actions from '../actions';

class Container extend Component {
  render() {
    return (
      <button onClick={this.props.showErrorMessage('エラーだよ')}>ボタン</button>
    );
  }
}

// Storeのstateをstore.propsとして返す
const mapState = state => ({
  return state;
});

// dispatch関数がバインドされたActionCreatorを返す
function mapDispatch(dispatch) {
  return {
    actions: bindActionCreators(actions, dispatch)
  }
}

// Containerにマッピング
export default connect(
  mapState
  mapDispatch
)(Container);
```
アルゴリズムとデータ構造

教科書を借りたので、主にそれに沿って。（講義？知らんがな）

## データ構造

### 列
#### 配列
- アクセス $O(1)$ アドレスが計算可能
- 挿入、削除 $O(n)$ 当該データ以降をずらす

#### リスト
- アクセス $O(n)$ めぐるめぐるよ
- 挿入、削除 $O(1)$ つなぎ替えるだけ

#### スタック
アクセス可能な位置を限定したので$O(1)$。
LIFO。

#### 待ち行列
$O(1)$。
FIFO。

#### 木
ノードと葉からなる。
子供の数が任意である場合、子供の持ち方（順序が大事なら列、そうでなければ集合の持ち方の中から）考えなければならない。

### 集合
#### 優先度付き待ち行列
取り出しを最小値に限定。ヒープを使う。

- アクセス $O(1)$
- 挿入 $O(\log n)$

#### 2分探索木
- 深さ 平均$O(\log n)$ 最悪$n$
- アクセス $O(深さ)$
- 挿入、削除 $O(深さ)$

#### 2-3木
ノードは実際のデータを持たない。

- 深さ $O(\log n)$

#### AVL木
- 深さ $O(\log n)$

#### ハッシュ
- $N$: もってるデータの数
- $B$: ハッシュテーブルの大きさ
- $\alpha$: $\frac N B$
- ハッシュ関数: データのキーを引数に、$0 \le i \lt n$なる$i$を理想的には同様に確からしく返す関数。
 
##### チェイン
$N < 2B$が崩れたら、そろそろハッシュテーブルを大きくしてもいいかなーって。

- アクセス、追加、削除 $\alpha + 1$

##### オープンアドレス
こっちは$N < 0.9B$が崩れたら、そろそろ危ないかな。

- 追加 $\frac 1 {1 - \alpha}$
- 存在が保証されているデータの参照、削除 $\frac 1 \alpha \log_e \frac 1 {1 - \alpha}$

### 集合群
- merge, findが可能

- ポインタに依る実装: merge: $O(1)$, find: $O(n)$ (findは、経路圧縮とかするとずっとはやくなる)
- IDによる実装: merge: $O(n)$, find: $O(1)$


## アルゴリズム

### ソート
#### バブルソート
- $O(n^2)$

#### クイックソート
教科書では、pivotとして最初の2要素の大きい方とし、それ**未満**を左側においている。

- 平均$O(n \log n)$、最悪$O(n^2)$

#### マージソート
- $O(n \log n)$

#### ヒープソート
単純にヒープに入れて出すのでも良いが、教科書ではヒープづくりを$O(n)$にがんばっている。

- $O(n \log n)$

#### バケットソート
データの変域が有限で決まっているときに、そのサイズの配列を作れば線形時間にできる。

- $O(n)$

#### 基数ソート
バケットソートを応用して、これを繰り返しすればそこまでメモリを食わずにだいたい線形時間。

- 近似して$O(n)$

### グラフ
#### 最短路
##### ダイクストラ（単一始点）
負のコストがあるとつらい。

###### 単純なダイクストラ
- $O(v^2)$

###### 優先度付待ち行列のダイクストラ
- $O((e+v)\log v)$

単純なダイクストラより良いとは限らない。単純グラフにしたとして、$e = O(v^2)$。

##### フロイド (全始点）
- $O(v^3)$

#### 一列化
帰りがけでやるだけ。

#### 強連結成分分解
帰りがけでやって、辺をえいってやって、やるだけ。

#### 最小木
##### プリム
任意の点からダイクストラ的な。$O(v^2)$

##### クラスカル
コストの小さい方から辺でループを回して、つなげても極大木になるかなって。$O(e \log e)$

#### 関節点
- O(v+e)

$ord$を行き掛けに、$low = \min ( ord[自分], ord[後退辺の先], low[子] )$を帰りがけに求めて、

根でない$v$が関節点 $\Leftrightarrow \exists w \in \\{vの子ノード\\}, ord[v] \le low[w]$

根は、２つ子をもってたら関節点。

### 文字列

#### 力まかせ
- O(mn)

#### KMP
検索文字列の文字それぞれに対してskip数を定める。
そこでマッチしなくなったらskipだけとばす。

- 文書中のポインタは逆戻りしないので、$O(n)$

#### BM
文書中のポインタは前から後ろにすすめるが、そのなかで検索文字列と一致するか調べるときは後ろから比較していく。
不一致のとき、文書側の文字がなにであるかと、検索文字列側のどこで不一致になったかでスキップできる量を測り、大きい方だけスキップする。

- うまくいくと$O(n/m)$


# appendix
今回のテスト以降、見ることはないんじゃなかろうか。

## オープンアドレス法における挿入回数の見積もり
ある位置に要素が入っている確率は同様に確からしく、$\alpha = \frac B N$。
よって、挿入時、再ハッシュが起きる回数つまり衝突する回数がちょうど$i$である確率は、
ちょうど$\alpha ^ i - \alpha ^ {i+1}$くらい。($i$回は衝突したが、$i+1$回目は衝突しなかった。)

ちょうど$i$回衝突したなら計算量は$i+1$らしいので、期待値は、
$\sum_{i=0}^{\infty} {(i+1)(\alpha^i - \alpha^{i+1})} = \sum_{i=0}^{\infty} { (i\alpha^i - (i+1)\alpha^{i+1})} + \sum_{i=0}^{\infty} {\alpha^i} = 0 - 0 + \frac 1 {1-\alpha} = \frac 1 {1-\alpha}$
「SQLアンチパターン」アンチパターン

# 「SQLアンチパターン」アンチパターンとは？

名前から内容が想像できない命名をしてしまうこと。
対策：名前をつける前にもう一度よく考えよう。分かりづらくないか他人の意見も聞いてみよう。

# なぜこれを「SQLアンチパターン」アンチパターンと呼ぶか

書籍「SQLアンチパターン」で命名されているパターンがどれも異常に覚え辛いんだよね。名前からどんな内容かまるで想像できない。一度書籍を読んだ後でも、名前とパターンが結びつかない。

そもそもこの本、中身に対して文章量が多くてまわりくどい。要点を凝縮すれば100ページくらいでおさまるはず。そのせいで読んでもすんなり頭に入りにくい。だからこの本のまとめページがネット上にたくさんある。

[01] Jaywalking(信号無視)
[02] Naive Trees(素朴な木)
[03] ID Required（とりあえずID）
[04] Keyless Entry(外部キー嫌い)
[05] Entity-Attribute-Value(EAV エンティティ・アトリビュート・バリュー)
[06] Polymorphic Associations(ポリモーフィック関連)
[07] Multicolumn Attributes（複数列属性）
[08] Metadata Tribbles（メタデータ大増殖）
[09] Rounding Errors（丸め誤差）
[10] 31 Flavors（31のフレーバー）
[11] Phantom Files（幻のファイル）
[12] Index Shotgun（闇雲インデックス）
[13] Fear of the Unknown（恐怖のunknown）
[14] Ambiguous Groups（曖昧なグループ）
[15] Random Selection(ランダムセレクション)
[16] Poor Man’s Search Engine（貧者のサーチエンジン）
[17] Spaghetti Query(スパゲッティクエリ)
[18] Implicit Columns（暗黙の列）
[19] Readable Passwords（読み取り可能パスワード）
[20] SQL Injection(SQLインジェクション)
[21] Pseudokey Neat-Freak（疑似キー潔癖症）
[22] See No Evil（臭いものに蓋）
[23] Diplomatic Immunity（外交特権）
[24] Magic Beans（魔法の豆）
[25] Sandcastle(砂の城)
NOT INの引数にnullが入ると結果がなくなる理由 〜NULLとNOT IN とドモルガンの法則〜

[NOT IN (NULL) に苦しめられる昼下がり](http://qiita.com/tbaba/items/f121c763c25dc3811c2a)
[sql文のnot inとnull | アララグループの技術者ブログ](https://www.arara.com/staffblog/tech/2015/03/04/1912/)

上記リンクの方々のように
NULLを含むサブクエリの結果などをNOT INに渡した場合、
期待していたクエリの結果が得られないことがある。

# 検証
 postgresql(9.6.1)で確認

以下のテーブルを準備する

```sql:準備
--日本で作ってるフルーツ一覧
CREATE TABLE japan_fruits (name VARCHAR(10));
INSERT INTO japan_fruits VALUES ('りんご'),('ぶどう'),('みかん');

--フィリピンで作ってるフルーツ一覧
CREATE TABLE Philippines_fruits(name VARCHAR(10));
INSERT INTO Philippines_fruits VALUES ('バナナ'),('みかん');
```

日本でしか作っていないフルーツの一覧(りんご、ぶどう)が欲しい。
以下のクエリを実行する

```SQL:日本でしか作れないフルーツ一覧
SELECT * FROM japan_fruits
 WHERE NAME NOT IN(
  SELECT name FROM Philippines_fruits
);
```

```:結果
  name  
--------
 りんご
 ぶどう
(2 rows)
```

実行できた。フィリピンは暑いのでりんごとぶどうが作れない。
ただし上記の結果がPhilippines_fruitsにnullのレコードが無いときのみ有効で、
nullのレコードが存在している場合、以下のようになってしまう。

```sql:nullのレコードがある場合
insert into philippines_fruits values (null);
INSERT 0 1
postgres=# SELECT * FROM japan_fruits WHERE NAME NOT IN(
select name from Philippines_fruits
);
```
```:結果
 name 
------
(0 rows)

```


# 解説

```SQL:日本でしか作れないフルーツ一覧
SELECT * FROM japan_fruits
 WHERE NAME NOT IN(
  SELECT name FROM Philippines_fruits
);
```

[プログラマのためのSQL](https://www.amazon.co.jp/dp/B00SF6JN4U/)によれば、結果がなかった時、上記SQLは以下の順序で実行される

## サブクエリを評価する
```SQL:サブクエリの評価
SELECT * FROM japan_fruits
 WHERE NAME NOT IN('バナナ','みかん',null);
```

## NOT INを定義により変換する
```SQL:NOT_INの変換
SELECT * FROM japan_fruits
 WHERE
  NOT (NAME IN('バナナ','みかん',null));
```

## IN述語を展開する

```SQL:INの展開
SELECT * FROM japan_fruits
 WHERE
   NOT ((NAME = 'バナナ') OR (NAME = 'みかん') OR (NAME = null));
```
## ド・モルガンの法則を適用する
[ド・モルガンの法則](https://ja.wikipedia.org/wiki/ド・モルガンの法則)

```math
\overline{A \cup B} = \overline{A} \cap \overline{B}
```
```math
\overline{A \cap B} = \overline{A} \cup \overline{B}
```

今回はNOT(P OR Q) を (NOT P) AND (NOT Q)に変換する

WHERE句の中の条件
`NOT ((NAME = 'バナナ') OR (NAME = 'みかん') OR (NAME = null));`
が
`(NAME <> 'バナナ') AND (NAME <> 'みかん') AND (NAME <> null) ;`
に変換される。

```SQL:ド・モルガンの法則の適応
SELECT * FROM japan_fruits
 WHERE
  ((NAME <> 'バナナ') AND (NAME <> 'みかん') AND (NAME <> null) );
```

## 式を定数に評価する

NULLはIS NULL/IS NOT NULL以外(=,<,>,<>)で比較すると結果はUNKNOWNとなる。


```SQL:ド・モルガンの法則の適応
SELECT * FROM japan_fruits
 WHERE
  ((NAME <> 'バナナ') AND (NAME <> 'みかん') AND UNKNOWN);
```

## ANDの演算を定数に評価する

UNKNOWNとANDの結果はUNKNOWNまたはFALSEになる。

|x|x AND UNKWNON|
|:-:|:-:|
|TRUE|UNKNOWN|
|FALSE|FALSE|


```SQL:ANDの演算を定数に評価
SELECT * FROM japan_fruits
 WHERE
  UNKNOWNまたはFALSE;
```

WHERE文の中がTRUEとならないので
レコードが1件も選択されない。

# 対策
 - INの中で選択するカラムにnot null制約をつける
 - EXISTSを使う
 
```sql:
SELECT * FROM japan_fruits jf
 WHERE NOT EXISTS(
  SELECT 1 FROM Philippines_fruits pf
  WHERE jf.name = pf.name
);
``` 



# 補足
[NOT INでレコードにNULLが含まれている時の挙動](http://qiita.com/ebyhr/items/0238d1edc71ed5365ab7)
こちらの方が紹介しているStack OverFlowにほぼ全てまとまっちゃっていますが、
折角書いたので投稿。
SQLアンチパターン：サーティワンフレーバー (31 のフレーバー)

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- 目的:列を特定の値に限定する

# アンチパターン

 - MySQLには、enumがあり、値の定義ができる
  - 制約を追加または削除するための構文は無い
  - 新たな値セットで列を再定義するしか方法はない

- 値の1つを廃止する場合、過去のデータをどうするか？
- データベースによって、定義方法が異なる

## 用いてもいいパターン

- enumの値が変わらない場合
 - on/off、左/右

# 解決策

- 限定する値をデータで指定する
 - 参照テーブルを用意する

# まとめ

列に入力する値を限定するときは、値セットが固定されている場合はメタデータを、流動的な場合は データを用いましょう。

# 感想

これは、やったことなかった。というか、そんなことできるの知らなかった...

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
gulpで複数のファイルコピーを同期的に行う

gulpでファイルをコピーするときに

```js
gulp.task('copyFiles', () => {
    gulp.src('./src/a/**').pipe(gulp.dest("./dist"));
    gulp.src('./src/b/**').pipe(gulp.dest("./dist"));
    gulp.src('./src/c/**').pipe(gulp.dest("./dist"));
});

gulp.tasｋ('replace', ['copyFiles'], (){
    gulp.src('./src/a/index.html')
        .pipe(replace(/hoge/g, 'piyo'))
        .pipe(gulp.dest('./dist/a'));
});
```

みたいにやると、非同期的にコピーされてしまい、しかもcopyFilesが終わる前にreplaceが走ってしまい思った結果になりません。コピーが一つだけなら

```js
gulp.task('copyFiles', () => {
    return gulp.src('./src/a/**').pipe(gulp.dest("./dist"));
});
```

や

```js
gulp.task('copyFiles', (ｃｂ) => {
    gulp.src('./src/a/**').pipe(gulp.dest("./dist")).on('end'()=>{cb();});
});
```

のように出来ますが、複数のコピーを全部taskにしてつなげるのは流石に・・・・
で、gulpで同期的に何かをする方法は色々ありますが、generatorを使ってやってみたらこんな感じかなと。


```js
gulp.task('copyFiles', (cb) => {
    var g = (function *(){
        yield gulp.src('./src/a/**').pipe(gulp.dest("./dist")).on('end',()=>{g.next();});
        yield gulp.src('./src/b/**').pipe(gulp.dest("./dist")).on('end',()=>{g.next();});
        yield gulp.src('./src/c/**').pipe(gulp.dest("./dist")).on('end',()=>{g.next();});
        yield cb();
    })();
    g.next();
});

gulp.tasｋ('replace', ['copyFiles'], (){
    gulp.src('./src/a/index.html')
        .pipe(replace(/hoge/g, 'piyo'))
        .pipe(gulp.dest('./dist/a'));
});

```
Raspberry PiでUSB接続のSDカードの認識でハマる

#はまったこと
　- Raspberry Piのバックアップ方法として、外付けUSBカードリーダのSDカードに稼働中のOSのファイル内容をrsyncしようと思った
　- まずは稼働中のOSのSDカードをDDwinでバックアップ
　- それをバックアップ用のSDカードにコピー済み
　-  USB接続のカードリーダ経由でmountしようと思ったけど、アクセスできない。なぜ？   
　-  稼働中のSDのfdiskは以下。バックアップ用も基本的にこの構造のはず。

#実行したコマンド
これをやると、反応が帰ってこなくなった
```
 sudo fdisk -l /dev/sda
```

```file:fdisk.txt
Device         Boot   Start      End  Sectors  Size Id Type
/dev/mmcblk0p1         8192  2496093  2487902  1.2G  e W95 FAT16 (LBA)
/dev/mmcblk0p2      2496094 31422463 28926370 13.8G  5 Extended
/dev/mmcblk0p5      2498560  2564093    65534   32M 83 Linux
/dev/mmcblk0p6      2564096  2699263   135168   66M  c W95 FAT32 (LBA)
/dev/mmcblk0p7      2703360 31422463 28719104 13.7G 83 Linux
```

```file:/var/log/messages
Jan  9 17:58:42 choco kernel: [   34.118937] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Jan  9 17:58:42 choco kernel: [   34.239431] scsi 0:0:0:1: Direct-Access     Generic  STORAGE DEVICE   0119 PQ: 0 ANSI: 0
Jan  9 17:58:42 choco kernel: [   34.240098] sd 0:0:0:1: Attached scsi generic sg1 type 0
Jan  9 17:59:13 choco kernel: [   65.159256] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Jan  9 17:59:44 choco kernel: [   96.119488] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Jan  9 17:59:44 choco kernel: [   96.240162] scsi 0:0:0:2: Direct-Access     Generic  STORAGE DEVICE   0119 PQ: 0 ANSI: 0
Jan  9 17:59:44 choco kernel: [   96.241205] sd 0:0:0:2: Attached scsi generic sg2 type 0
Jan  9 18:00:15 choco kernel: [  127.159756] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Jan  9 18:00:46 choco kernel: [  158.200014] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Jan  9 18:01:17 choco kernel: [  189.080266] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Jan  9 18:01:17 choco kernel: [  189.200963] scsi 0:0:0:3: Direct-Access     Generic  STORAGE DEVICE   0119 PQ: 0 ANSI: 0
Jan  9 18:01:17 choco kernel: [  189.202086] sd 0:0:0:3: Attached scsi generic sg3 type 0
Jan  9 18:01:48 choco kernel: [  220.120538] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
Jan  9 18:01:48 choco kernel: [  220.227584] sd 0:0:0:0: [sda] Read Capacity(10) failed: Result: hostbyte=0x03 driverbyte=0x00
Jan  9 18:01:48 choco kernel: [  220.227610] sd 0:0:0:0: [sda] Sense not available.
Jan  9 18:02:19 choco kernel: [  251.160768] usb 1-1.2: reset high-speed USB device number 4 using dwc_otg
```

ちょっと調べてみる。。
Q Accelerator > 新規投稿時のテンプレート > 動作環境のテンプレートとしての使用案

```txt:動作環境
Windows 8.1 pro (64bit)
Google Chrome v55.0.2883.87 m
```

### 動作環境のテンプレート

@howdy39 さんによる「Q Accelerator」。
http://qiita.com/howdy39/items/e6136b8454099ebfef29

コードの行番号表示、コピペ機能が気に入っています。

「新規投稿時のテンプレート」機能もあるのですが、「自分は使わないな」と最初思っていました。

。。。

ふと、Qiita記事の投稿について考えてみました。

Qiita記事を書く時には「動作環境」を書くように気をつけています。
その動作環境は対象作業によって変わり、何種類かあります。
動作環境は書き間違いがないようにするため、過去記事を探してコピペしていました。

以下のように「新規投稿時のテンプレート」に環境を用意しておき、書きたい記事の環境だけ残して削除する、という使い方が便利かもしれないと思いました。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b53f53a7-2ba6-b07a-e439-803e7870e050.png)
CakePHP3をインストールしたらとりあえずやってること

随時更新。

\# composerからインストールしている前提
\# app.phpに変更が必要なものは適宜app.default.phpにも変更をかける

## DB


```config/app.default.php
            'username' => 'username',
            'password' => 'password',
            'database' => 'database',
```

## Security Salt

$ cat /dev/urandom | LC_CTYPE=C tr -dc '[:alnum:]' | head -c 64

```config/app.default.php
        'salt' => env('SECURITY_SALT', 'GENERATED_SALT'),
```

## Locale

``` config.bootstrap.php
            'timezone' => 'Asia/Tokyo',
```

```config/app.default.php
            'timezone' => 'Asia/Tokyo',
```

```config/app.default.php
        'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja-JP'),
```


## composer

cakephp-codesnifferをrequire-devに追加。

``` composer.json
        "cakephp/cakephp-codesniffer": "2.*"
```

## .editorconfig

``` .editorconfig
[*.sql]
indent_style = space
indent_size = 2
```

## その他

publicの不要ファイル削除。
webroot/fileディレクトリ作成。
favicon.ico設置。

scss用に.editorconfigを修正、.scss-lint.yml作成、ディレクトリとbase.scssを追加。
normalize.css導入。

font-awesome, bootstrap, jqueryあたりを導入。
超初心者向け：WordPress導入したら寝る前にコレだけは入れておけ！的な３つのプラグイン

くぎゅう10Pです、

関連記事：[初心者向け：WordPressでオサレで垢抜けたソレっぽいデザインを探す時に試したいワード](http://qiita.com/kugyu10/items/5da69cc1acd6fff02731)

WordPress、いいですよね。
便利で面白いプラグインがたくさんあります。

本当は３つじゃゼンゼン足りないくらい
素晴らしいプラグインがあふれているのですが、

- **今日始めて**WordPressを導入した！
- **デザイン選ぶのに疲れちゃった**から、記事書くのは明日からにしよう！

って方に、**とりあえずこれ入れてから寝ろや！**と言える、
超必須プラグインをご紹介。


# Akismet　スパムコメント対策プラグイン　必須度：★★★★★

WordPressはスパムコメントがやたら多いです。
はっきりいって、これを入れておかないと
使い物にならないレベルです。

コメント機能を無効にしないなら黙っていれておきましょう。


# JP MarkDown　マークダウン記法に対応するプラグイン　必須度：★★★★☆

非常にお手軽に記事が書けるようになります。

マークダウン記法は、Qiitaでも使われている
カンタンに最低限の装飾がされた文書を書くための記法です。
MarkDown記法のサンプル：http://qiita.com/tbpgr/items/989c6badefff69377da7

QiitaでもMarkDownが採用されていますので、
Qittaユーザには超オススメ。

マークダウン記法と通常のHTMLを混ぜても問題なく動作するため
画像とかを多く使うブログでも使いやすいです。



# SEO All in One　必要最低限のSEO　必須度：★★★★☆

SEOというのは、カンタンに言えば
「Google先生に上位に表示してもらうための工夫」です。

厳密にやろうとすると**とんでもなく面倒くさい**ので、
最低限の対策だけ、１プラグインで済ませてしまうのが
WordPress初心者としては賢い選択です。

- Google解析、
- Googleサイトマップ、
- Twitter/Facebookなどのソーシャルカード、
- 最低限のSEO対策、

などが１パックになったプラグインです。

英語だけど、日本人の利用者も非常に多いので
解説サイトを探すのに困ることは無いでしょう。


- - -

以上、WordPress初心者でも必須な３つのプラグインの
ご紹介でした。

くぎゅう10P
【iOS10】Firebaseでサイレント通知を行う

iOS10で、Firebaseを用いたサイレント通知を行う。
Firebase Webコンソールから送信できるFirebase NotificationsではJSONをカスタマイズできないので、Firebase Cloud Messagingを利用する。

# クライアント側

## 1. 普通のpush通知を送れるようにする

https://firebase.google.com/docs/cloud-messaging/ios/client?hl=ja
ドキュメントにはiOS9までの実装方法しか書かれていないので、User Notifications Frameworkを用いたやり方で書く。

## 2. BackgroundModesの設定

TARGETS > Capabilities > Background Modesの`Background fetch`と`Remote notifications`にチェック

## 3. AppDelegateに下記のメソッドを追加

```ruby:AppDelegate.swift
    func application(_ application: UIApplication,
                     didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) 
    {
        // 処理
        completionHandler(.newData)
    }
    
```
**アプリのforeground, backgroundに関わらず上記のメソッドが呼ばれる。**


# サーバ側

## 1. ChromeウェブストアからPostmanをインストール

https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=ja

## 2. Firebase Webコンソールからサーバーキーを取得
左上の歯車マーク > プロジェクトの設定 > クラウドメッセージング

![スクリーンショット 2017-01-09 17.30.38.png](https://qiita-image-store.s3.amazonaws.com/0/64665/08aedf2d-e9cc-7635-6609-7d1f62146814.png)

## 3. Postmanで送信するJSONを記述

![スクリーンショット 2017-01-09 21.36.13.png](https://qiita-image-store.s3.amazonaws.com/0/64665/0a723a28-0027-82ac-da64-c83e14102858.png)

HTTPメソッドはPOST、URLは https://fcm.googleapis.com/fcm/send を設定。
Headersに下記のキーを追加する。

```ruby:Headers
  Content-Type:application/json
  Authorization:key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
```
xxxxxには先ほど取得したサーバーキーを入力する。
**`key=`がないとエラーコード401が返ってくるので注意。**


BodyにJSONを記述する。
![スクリーンショット 2017-01-09 17.25.33.png](https://qiita-image-store.s3.amazonaws.com/0/64665/cf18e184-75a2-8be6-cd46-48f969c3c273.png)

```ruby:Body
{
    "to" : "/topics/ios",
    "priority" : "high",
    "notification" : {
	    "content_available" : true
    }
}
```

`"to":`は送信したいデバイスが登録されてあるトピックか、もしくはデバイストークンを指定する。トピックの登録には`FIRMessaging.messaging().subscribe(toTopic: "トピック名")`を用いる。反映されるまで数時間かかるが、それまではそのトピックに送信ができない。Firebase WebコンソールのNotifications > 新しいメッセージ >　ターゲット > トピック に表示されるようになったら送信することができる。
**このキーを削ると全てのデバイスに通知が行くわけではなく、通知の送信に失敗してしまう。**


`"notification:"`内の`"content_available" : true`で、アプリがバックグラウンド状態でもメソッドを呼び出すことができる。なお、Appleの公式ガイドには以下のように書いてあるが、こちらのJSONでは通知が届かないので注意。

<img width="478" alt="スクリーンショット 2017-01-09 18.34.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/c20469cc-d092-631a-203e-a1b5a7fea296.png">


## 4. POSTリクエストを送信
右上の"Send"からリクエストを送信する。
アプリがbackgroundであっても`didReceiveRemoteNotification`内の処理が実行される。ヤッタネ！:dango:

## 追記
```ruby:AppDelegate.swift
UIApplication.shared.registerForRemoteNotifications()
```
このコードだけ書くと承認アラートを出さずにサイレント通知を送れるようになる。
BlueNinjaをMac環境で動かしてみた


windowsでの開発を前提としているBlueNinjaをMacで動かしみたのでメモ

# 参考サイト
公式
https://blueninja.cerevo.com/ja/guide/

MacでBlueNinja開発環境
https://dgakane.wordpress.com/2016/09/23/blueninja_dev_env_on_mac/

BlueNinjaのセンサーの値を一通り取得する方法
http://qiita.com/aq_tsurumai/items/f74717e07e19cac5e044

# Macでの開発について
参考サイトの「MacでBlueNinja開発環境」の通りに行うと大抵できるかと思いますが，自分の場合はwgetコマンドがないためにinstall_mac.shを実行あたりでエラーがでました．

ちなみにwgetのインストールはHomebrewを使って

```
$ brew install wget
```

と行いました．

# 開発環境
mac os10.10.5 sierra系も確認
BlueNinjaは更新せず，買ったときのまま．．．
TZ1000 BSP ver1.42.0は使用せず(今度試してもいいかも．．．)
Atom（エディター）
ターミナル（シリアル出力の受け取りとmake）

開発を行う一連の動作になるんだろうなぁっと思う動作を動画にしてみました．

[![ビデオが開けなかった場合に表示されるテキスト](http://img.youtube.com/vi/l0Bd25EHTkY/0.jpg)](https://www.youtube.com/watch?v=l0Bd25EHTkY)


動画内のサンプルコードについて
動画内で使用したコードは参考サイトのコードとほぼ変わらないため，今回は乗せないことにします．

Atomから簡単にビルド，binファイルの移動，screen画面を出すのとかもやっていきたいね．．．
『キットで遊ぼう電子回路シリーズ1』学習メモ(STEP14~STEP20)

[『キットで遊ぼう電子回路シリーズ1』学習メモ(STEP1~STEP11) - Qiita ](http://qiita.com/kure/items/5301492fa809db862764)の続き

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4903272036/kuredev-22/ref=nosim/" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/612e%2BQSbtbL._SL160_.jpg" alt="基本編Vol.1セット [キットで遊ぼう電子回路シリーズ1]" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4903272036/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">基本編Vol.1セット [キットで遊ぼう電子回路シリーズ1]</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 17.01.08</div></div><div class="amazlet-detail">キットで遊ぼう電子回路研究委員会 <br />アドウィン (2013-07-01)<br />売り上げランキング: 18,231<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4903272036/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

# STEP14：コンデンサって？
コンデンサについて

# STEP15：単純CR回路
![step15.jpg](https://qiita-image-store.s3.amazonaws.com/0/50690/86264a04-44e5-2a0a-60d1-1ce590618da8.jpeg)
一瞬ついて、すぐ消える。コンデンサの容量いっぱいに電化が貯まるから

# STEP16：単純CR回路に放電機能を追加
![写真 2017-01-09 17 41 56.jpg](https://qiita-image-store.s3.amazonaws.com/0/50690/e5a22b79-fff8-9df0-329c-a914787e72b8.jpeg)
抵抗に流れて熱で消費される

# STEP17：CR回路（コンデンサ並列接続）
![写真 2017-01-09 17 45 13.jpg](https://qiita-image-store.s3.amazonaws.com/0/50690/21665aef-76be-4330-a1e8-de5cd8b1fcd6.jpeg)
静電容量が倍になる

# STEP18：CR回路（コンデンサ直列接続）
静電容量が1/2になる

# STEP19：Excelを使ってCR回路をシミュレーション
積分

# STEP20：CR回路（微分回路と積分回路）
計算
js 引数の値に含まれる素数を合計する

##お題
引数の値に含まれる素数を合計する。

[素数](https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0)　wikipedia
1より大きい自然数で、正の約数が 1 と自分自身のみの数。ただし、1 は素数には含めない。

例　引数10の場合、10に含まれる素数は2,3,5,7　　こたえは17

```js
function sumPrimes(num) {
//write your code.
}
sumPrimes(10);//17
```

出力結果　例

```js
sumPrimes(10) //17
sumPrimes(977) // 73156
```

##つかったもの
for文
if文

##考え方
・引数が素数かどうか判定する関数をつくる。
・引数が素数でない場合、−1をして次の数値を判定する
・引数が素数の場合、その値を加えて−1をして次の数値を判定する
・引数が1の場合、素数ではないので0を返すようにする

##コード
```js
function sumPrimes(num) {
  function isPrime(number){
      for (i = 2; i <= number; i++){
          if(number % i === 0 && number!= i){
             return false;
          }
       }
      return true;
  }
  if (num === 1){
    return 0;
  }
  if(isPrime(num) === false){
    return sumPrimes(num - 1);
  }

  if(isPrime(num) === true){
    return num + sumPrimes(num - 1);
  }
}
sumPrimes(10);
```

###他にもコードが浮かんだ方、コメントお待ちしております。
Ruby on Rails ~フォロー（友達申請）したユーザーのツイート一覧を取得（コードメモ）

前回の投稿でTwitterやInstagramなどの友達をフォローする機能を実装してみました。

Ruby on Rails ~フォロー（友達申請）機能の実装（コードメモ）http://qiita.com/wtb114/items/dbba4364871aacf520cd

今回はフォローしたユーザーのツイート一覧を取得するページを実装しました。
ツイート機能の実装はこちら。http://qiita.com/wtb114/items/9e7f776cece63fdb2945

#1.ルートの編集。
```config/routes.rb
  resources :users do
    member do
      get :following, :followers, :users_tweets#追記
    end
  end
  resources :relationships, only: [:create, :destroy]
  get "show_tweets" => "tweets#show_tweets"
  get "following_tweets" => "tweets#following_tweets"#追記
  resources :tweets do
    resources :comments, only: [:create]
  end
```

#2.コントローラーの編集。
```app/controllers/tweets_controller.rb
class TweetsController < ApplicationController

    def following_tweets
    @user = current_user
    @users = @user.followings.order("created_at DESC").page(params[:page]).per(20)
  end

end
```
#3.ビューファイルの編集。
```app/views/tweets/following_tweets.html.erb
<h2>フォロー中のツイート</h2>
<% @users.each do |user| %>
  <% @tweets = Tweet.where(user_id: user.id).limit(1).order("created_at DESC") %>
  <% @tweets.each do |tweet| %>
    <div class="contents row" >
      <div class="name3">投稿者:<%= link_to user.username, user_path(user), method: :get %>&nbsp;&nbsp;<%= link_to user.username + 'のツイート一覧へ', users_tweets_user_path(user), {class: 'btn btn-primary withripple' }%></div>
      <div class="name2">投稿日時:<%= tweet.created_at.strftime("%Y-%m-%d %H:%M:%S") %></div>
      <div class="name2"><%= link_to '詳細', tweet_path(tweet), method: :get %></div>
      <div class="name3"><%= simple_format(tweet.text) %></div>
    </div>
  <% end %>
<% end %>
  <%= paginate(@users) %>
</div>
```
#4.indexビューにリンクパスを追加。
```app/views/index.html.erb
<%= link_to 'フォロー中のツイート一覧へ', following_tweets_path, {class: 'btn btn-primary withripple' }%>
```

以上でフォロー中のユーザーのツイート一覧を取得し表示することができました。
『改訂3版基礎 Ruby on Rails』の感想です

# 本の紹介
- 書名：改訂3版基礎 Ruby on Rails
- 著者：黒田 努，佐藤 和人，株式会社オイアクス(監修)
- 出版社：インプレス
- 発効日：2015/5/21

[読者サポートページ](https://www.oiax.jp/rails4book)
[Amazon](https://www.amazon.co.jp/exec/obidos/ASIN/4844338153/oiax-22/ref=nosim)

- Rails習得に照準を合せた入門書です．
- HTML，CSS，なんらかのプログラミング言語をある程度習得済みで，データベースの基礎知識もある読者を想定しています．
- Rubyの説明は全体の約1/7，約70ページです．言語自体は，他言語を学んでいれば，シンプルで易しめ，また美しく感じられると思います．

#良いポイント
- Railsに照準を合せていること．逆に，HTML，CSS，Rubyまたはなんらかのプログラミング言語，データベース基礎知識を事前に習得しておく必要があります．
- 全体を通して一つの標準的なウェブアプリケーション開発に沿うことにより，ウェブアプリケーション開発プロセスも体験学習できること．
- テスト駆動開発がChapter 7で紹介され，以降の終盤で重視されるなど，実践的であること．
- 各章終了段階ごとにサンプルコードが提供されていること．見つかりにくいバグも，自コードと提供コードを並べ比較して探すことができます．どうしても解決できなければ，その段階の提供コードで仕切り直し先に進むことで，中途での躓きも防げます．また，CSSなど注力したくなければ，提供ファイルをコピペ使用できます．
- 総合的に，見通しがよく順序だち網羅的なカリキュラムになっていること．

#改善されると良いポイント
- テスト駆動開発など終盤で紹介される項目がやや難易度が高いこと．手を動かしながらRailsを理解する段階では，理解を要するレイヤが加わる分，捉えにくくなります．
- 誤字・誤コードの多いこと．学習上，致命的と言ってよい内容のものもあります．これについては，読者の協力のもと，[正誤表](https://www.oiax.jp/books/rails4book/eratta.html)を随時更新しているのは素晴らしいと思います．本書を読み始める前に確認しておいた方がよいでしょう．

#総合的に
- Railsを初めて学ぶには適切な入門書だと思います．Rails以外の部分については，事前/並行して/事後に，別途学習するとして，本書ではRails習得に集中するのがよい使い方だと思います．
Gnuplotを使ってGIF生成


# 引き続き、ヴィジュアライズしたい。
[RMagickを使ってGIF生成](http://qiita.com/kumatoki/items/f1806b07954c7087b48a)
> ビジュアライズに限れば適当なplotを使えば良いのだろうけど、gifも欲しい。

どうもその適当なplotで十分GIF生成もできる様なのでお試し。

# Gnuplot
ruby bindingがgemにあるのでinstall.
サンプルはあるがドキュメントは無いせいか、イマイチ使いにくい。
ソースを見てみるとやってることはシンプルで、薄いラッパー。
gnuplotコマンドに文字列を流し込んでいるだけ。
`set term gif animate`と相性が悪いだけで、他の用途なら問題無い気もする。

## make_gif
`set term gif animate`として、output先のファイル設定して、plotを繰り返せばアニメーションGIFに。

```ruby:gnuplot_make_gif.rb
require "gnuplot"
def make_gif(name = "",x = 0,y = 0,fps = 0, &f)
  Gnuplot.open { |g|
    g << "set nokey\n"
    g << "set term gif animate\n"
    g << "set output \"#{name}\"\n"
    g << "set xrange [-1:#{x+1}]\n"
    g << "set yrange [-1:#{y+1}]\n"
    g << "set style line 1 lc \"green\" pt 7 ps 1\n"

    (1..fps).each { |n|
      cs = f.call(g,n)
      g << "plot \"-\" with points ls 1\n#{cs}"
    }
  }
end
```

## lifegame
plotに渡すデータへ二次元配列を変換。ちょいめんどい。

```ruby
require "./gnuplot_make_gif.rb"
require "./lifegame.rb"

lg = Lifegame.new(300,300)
lg.random

make_gif("gnuplot_lifegame.gif",300,300,100) { |io,n|
  io << "set style line 1 lc \"green\" pt 7 ps 0.25\n"
  io << "set title \"lifegame:#{n}\"\n"
  cs = lg.cells.map.with_index { |cy,iy|
    cy.map.with_index { |cx,ix|
      if cx == 1
        "#{ix} #{iy}"
      else
        nil
      end
    }.select { |a| a != nil }.join("\n")
  }.join("\n")
  cs << "\ne\n"
  lg.apply
  cs
}
```

![gnuplot_lifegame.gif](https://qiita-image-store.s3.amazonaws.com/0/154291/9228e5a3-8b82-c534-6319-bbeff706ece7.gif)

# end
この300*300*100のGIF生成に、私のPCでは70秒ほどかかります。
座標変換のコストがちょいかかってます。
プルリクにcurlでコメントする

# なぜそんな
CIサーバーから、GitHubのプルリクにコメントを入れたい。
パイプで渡すと、良き具合に投じてくれるとベスト。

# 現物

https://gist.github.com/sasasin/1a1b7534dfe2f6246378615c80ab720b

```bash:ghpr-comment.sh
#!/bin/bash -e
# how to use:
#   export GITHUB_OAUTH_KEY=....
#   export PR_REPONAME=....
#   export PR_NUMBER=....
#   echo "HELLO WORLD" | ./ghpr-comment.sh
#
# BODY from stdin
BODY=$(cat - | perl -ne 'chomp; s/\\/\\\\/g; s/"/\\"/g; print $_ ."\\n"')
curl -v -X POST \
  -H "Content-type: application/json" -H "Accept: application/json" \
  -u ${GITHUB_OAUTH_KEY}:x-oauth-basic \
  -d "{ \"body\": \"${BODY}\" }" \
  https://api.github.com/repos/uluru/${PR_REPONAME}/issues/${PR_NUMBER}/comments
```

# インストール
置いて +x するだけ

```bash
wget https://gist.githubusercontent.com/sasasin/1a1b7534dfe2f6246378615c80ab720b/raw/3b03f25456ce1d557613671c12bb2be4dae5f0f0/ghpr-comment.sh
chmod +x ghpr-comment.sh
```

# 使い方

```bash
export GITHUB_OAUTH_KEY=....
export PR_REPONAME=....
export PR_NUMBER=....
echo "HELLO WORLD" | ./ghpr-comment.sh
```

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/22947/0e6e6372-c14c-791f-41d1-3cb45540b06b.jpeg)

パイプ越しに何でも渡せる。

```bash
cat /path/to/bigfile.txt \
| grep ... \
| awk .... \
| cowsay \
| ./ghpr-comment.sh
```
Macのzshでrbenvを使う

# brewコマンドでインストール

```shell-session
$ brew install rbenv ruby-build
```

# `.zshrc`ファイルに追記

```zsh
export PATH="$HOME/.rbenv/bin:$PATH" 
eval "$(rbenv init - zsh)"
```

- 変更した`.zshrc`を読み込み

```shell-session
$ source ~/.zshrc
```

# Rubyのインストール

## インストール可能なバージョンをリストアップ

```shell-session
$ rbenv install -l
```

## 指定のバージョンをインストール

```shell-session
$ rbenv install 2.4.0
$ rbenv global 2.4.0
$ rbenv rehash
```
拡散方程式の数値解法

## 拡散方程式
拡散方程式は、その名の通り、物質の拡散を表現した偏微分方程式です。
例えば二次元なら、以下のようになります。

```math
\frac { { \partial  }u(x,y,t) }{ { \partial  }{ t } } =D(\frac { { \partial  }^{ 2 }u(x,y,t) }{ { \partial  }{ x }^{ 2 } } +\frac { { \partial  }^{ 2 }u(x,y,t) }{ { \partial  }y^{ 2 } } )
```

Dについては比例定数です

物質の流れる速度は濃度勾配に比例します。
わりとなんでもそうですが、濃度というのは濃い方から薄い方へ流れていきます。
なんでかというと、例えば空間を細切れにして小さな部屋がいっぱいある様子をイメージします。
そして隣り合う２つの部屋を考えます。
原子はあらゆる方向へ無作為に移動を繰り返しているため、たくさん原子がある部屋からはたくさん原子が飛んできますが、何もない部屋からは出ていくものがありませんから、やはり入ってくるばかりです。逆に２つの部屋の原子の数が同じなら、出て行く量と入ってくる量は均衡していることが想像できます。

式のイメージはこれくらいにして、
導出のほうは、[拡散方程式の手短な導出](http://abrahamcow.hatenablog.com/entry/2014/10/14/114453)あたりを参照するとして、早速離散化して動かしてみます。
例のごとく、差分法でやってみましょう。
できました。

```math
\frac { { \partial  }u(x,y,t) }{ { \partial  }{ t } } =D\left(\frac { { \partial  }^{ 2 }u(x,y,t) }{ { \partial  }{ x }^{ 2 } } +\frac { { \partial  }^{ 2 }u(x,y,t) }{ { \partial  }y^{ 2 } } \right)\\ \frac { { \partial  }u(x,y,t) }{ { \partial  }{ t } } =D(\frac { u(x-\Delta x,y,t)-2u(x,y,t)+u(x+\Delta x,y,t) }{ { \Delta x }^{ 2 } } +\frac { u(x,y-\Delta y,t)-2u(x,y,t)+u(x,y+\Delta y,t) }{ { \Delta y }^{ 2 } } )\\ \Delta x=\Delta y\\ \frac { { \partial  }u(x,y,t) }{ { \partial  }{ t } } =\frac { D }{ { \Delta x }^{ 2 } } \left\{ u(x-\Delta x,y,t)+u(x+\Delta x,y,t)+u(x,y-\Delta x,t)+u(x,y+\Delta x,t)-4u(x,y,t) \right\} \\ \frac { u(x,y,t+\Delta t)\quad -\quad u(x,y,t) }{ \Delta t } =\frac { D }{ { \Delta x }^{ 2 } } \left\{ u(x-\Delta x,y,t)+u(x+\Delta x,y,t)+u(x,y-\Delta x,t)+u(x,y+\Delta x,t)-4u(x,y,t) \right\} \\ u(x,y,t+\Delta t)=u(x,y,t)\quad +\frac { D\Delta t }{ { \Delta x }^{ 2 } } \left\{ u(x-\Delta x,y,t)+u(x+\Delta x,y,t)+u(x,y-\Delta x,t)+u(x,y+\Delta x,t)-4u(x,y,t) \right\} \\ 
```

あとはコードに落とし込みましょう。

```cpp

		float deltaX = float(kWaveWidth) / float(kWaveGrid);
		float deltaT = 0.5f;
		float c = D * deltaT / (deltaX * deltaX);
		std::fill(_values.begin(), _values.end(), 0.0f);
		for (int x = 1; x < kWaveGrid - 1; ++x) {
			for (int y = 1; y < kWaveGrid - 1; ++y) {
				int index = this->valueIndex(x, y);

				float uL = _u[this->valueIndex(x - 1, y)];
				float uR = _u[this->valueIndex(x + 1, y)];
				float uT = _u[this->valueIndex(x, y - 1)];
				float uB = _u[this->valueIndex(x, y + 1)];
				float u = _u[index];

				_values[index] = u + c * (uL + uR + uT + uB - 4 * u);
			}
		}
		std::swap(_values, _u);

```

本質的なコードはこれだけです。
さくっとビジュアライズすると、

![diffuse.gif](https://qiita-image-store.s3.amazonaws.com/0/8588/255e60d5-82d4-dd6c-14f6-7c1e4e08a5ed.gif)

いい感じです。

※マウスの動きは単調なので、[コクのある乱数](http://qiita.com/Ushio/items/63684b56a58704c73824)でペンの位置を振動させています
※思考停止で前方差分で解いていますが、大きなdeltaTなどをとると不安定になります。これを嫌う場合は陰解法をつかうのがわりと定石？のようです。実際[Real-Time Fluid Dynamics for Games](http://www.intpowertechcorp.com/GDC03.pdf)によると拡散の計算にはガウス＝ザイデル法を使うと良いよ、とあります。

## 謝辞
@SatoshiTerasaki さん、数式の修正ありがとうございました！
PureScript で型クラスを import する

# 問題

PureScript 0.10.5 での型クラスの import 方法が分からない。

# 解決策

`class` キーワードを使う。

```
module B where

import A (class Fab)
```

# 参考

- https://github.com/purescript/documentation/blob/a970a2a74803f489d8a7206c13a7c060ff0c1221/language/Modules.md#importing-modules
rails runner を使った batch を書くときの工夫

# 概要
Web アプリケーションは普通に動かしつつ，裏で batch 処理をがんがん動かすアプリケーションを rails で書いた。こういうアプリケーションでは以下のようなことを各 batch が備えていると非常に捗る。

- dryrun モード
- log は batch ごとに別なファイルに吐かせる

具体的には以下。

```bash
# dryrun
# log はファイルでなく標準出力に。debug log も吐く。
$ bundle exec rails runner 'BatchExample.dryrun'

# exec
# log はこのバッチ専用のファイル (=log/batch/batch_example.log) に。debug log は吐かない。
$ bundle exec rails runner 'BatchExample.exec'
```

これをどのように実現したかを備忘録的に残しておく。

# 実現方法

まず batch の基底クラスを作る。

```ruby:lib/batch/base.rb
require 'logger'

class Batch::Base
  @@is_dryrun = false

  class << self
    def logger
      @@logger ||= Logger.new(
        dryrun? ? STDOUT : File.join(Rails.root, 'log', "#{self.to_s.underscore}.log")
      )
    end

    def dryrun(*args)
      @@is_dryrun = true
      logger.level = Logger::DEBUG
      exec(*args)
    end

    def dryrun?
      @@is_dryrun
    end
  end
end
```

あとはこの基底クラスを継承させて batch を書く。

```ruby:lib/batch/batch_example.rb
class Batch::BatchExample < Batch::Base
  def self.exec
    logger.info('start.')
    logger.debug('show only in dryrun mode.')
    unless dryrun?
      # some processes
    end
    logger.info('finish.')
  end
end
```

これだけ。
log は `log/batch/batch_exmaple.log` に吐かれる。

# 補足事項
log 用のディレクトリ (`log/batch`) は以下のようにして git keep する (`.gitignore` の書き方が回りくどい...)。

```:.gitingore
/log/*
!/log/.keep
!/log/batch/
/log/batch/*
!/log/batch/.keep
```