OmniAICreator/Qiita-1.07M huggingface dataset:
【git stash】コミットはせずに変更を退避したいとき

「とあるブランチで作業中だけど、いますぐやりたいことができた。作業がすごく中途半端だからコミットはしたくない。」
というときに、`stash`が使えます。
`stash`を使用すると、コミットしていない変更を退避することができます。
`stash`で現在の変更を退避して、今すぐやりたい作業をして、退避させていた変更を戻して作業を再開することができます。


# 変更を退避する

```bash
$ git stash -u
```
コミットしていない変更がある状態で上記のコマンドを実行すると、変更した部分が退避されます。
ワーキングディレクトリ上は差分がない状態になります。
「コミットしていない変更」とは、`add`したものも`add`していないものもどちらも含まれます。
`-u` は　`--include-untracked` の略です。新規作成ファイル(追跡対象に含まれていないファイル)も退避することができます。



# 退避した作業の一覧を見る
以下のコマンドで退避した作業の一覧を見ることができます。

```bash
$ git stash list
stash@{0}: WIP on test: xxxx
stash@{1}: WIP on commit-sample: xxxx
```
`stash@{n}`から始まる1行が1回分のstashになります。
`WIP on`のあとはブランチ名です。
`xxxx`はstashをしたときのHEADのコミットハッシュとコミットメッセージになります。

# 退避した作業を戻す

```bash
$ git stash apply stash@{0}
```
`stash@{0}` の作業をもとに戻します。

`git stash apply stash名`にて退避した作業を元に戻すことができます。
このとき、現在チェックアウトしているブランチへ退避した変更が書かれます。
変更を退避したときのブランチにも、それ以外のブランチにも戻すことができます。
また、stash名を指定しない場合は、直近に退避された作業を戻します。

`stash@{0}` のstash名は省略することもできます。省略した場合は、直近にstashした情報が戻されます。

上記のコマンドだと、addしていた変更もaddされていない状態で戻ります(`staged`されていた変更も`not staged`ととして戻る)。
addした状態そのままにもどしたいときは、上記のコマンドに`--index`オプションを付けて実行します。

```bash
$ git stash apply stash@{0} --index
```

# 退避した作業を消す
`stash`を使用して退避した作業を元に戻しても、退避した情報は残ったままです。
`git stash list`を実行すると、退避した情報はそのまま残っているはずです。
退避した作業を消すには、以下のコマンドを使用します。

```bash
$ git stash drop stash@{0}
```
`stash@{0}` をstashのリストから削除します

`drop`と同様、 stash名（`stash@{0}`）を省略すると、直近にstashした情報を消すことができます。



# 退避した作業を元に戻すと同時に、stashのリストから消す
退避した作業を消すには`drop`を使用する必要がありましたが、作業をもとに戻すと同時に消すこともできます。

```bash
$ git stash pop stash@{0}
```
`stash@{0}` の作業をもとに戻すと同時に、退避作業の中から削除します

こちらもstash名（`stash@{0}`）を省略すると、直近にstashした情報を消すことができます。
退避した変更をもとに戻す際にコンフリクトが発生する場合もあるので注意してください。


# そのほか

### 作業を退避するときにメッセージを付ける

```bash
$ git stash save "stash message"

$ git stash list
stash@{0}: On test: stash message
```

コミットハッシュ+コミットメッセージが表示されていた部分が、指定したメッセージになっています。

### 退避した変更の詳細をみる

```bash
$ git stash show stash@{0}
```

変更ファイルの一覧を見ることができます。
また、`-p`オプションをつけることで、変更内容の詳細をみることもできます。

```bash
$ git stash show stash@{0} -p
```


### addした変更以外を退避させる
オプションを何もつけない場合、addした変更もaddしていない変更も退避されます(新規追加ファイルは例外)。
`-k`(もしくは--keep-index)をつけて実行すると、addした変更は退避されません。

```bash
$ git stash -k
```


### 退避した作業をすべて消す

```bash
$ git stash clear
```

`git stash list`を実行すると、退避した情報がすべて消えていることが確認できます。
javascriptでprivate関数のようなものを使う


```js
var object = (function () {

    var publicFunc = function (arg) {
        return _privateFunc(arg);
    }
    var _privateFunc = function (arg) {
        return "private_" + arg;
    }

    return {
        "publicFunc": publicFunc
    }
})();

console.log(object.publicFunc('test'));// 'private_test'
```

ES6ではないです
FlowのObject type spreadの挙動を確認する

## はじめに

[v0.42.0](https://github.com/facebook/flow/releases/tag/v0.42.0) からリリースされている Object type spread 機能ですが、ドキュメントが [公式サイト](https://flow.org/en/docs/) にはまだ無いようです。
そこで実際挙動を調査したところ、個人的には中々難しい仕様だったので、まとめてみました。

検証に使った flow-bin のバージョンは v0.45.0 です。


## 基本的な挙動

サンプルとして、以下のような型を定義してみます。

```
type T1 = {
  x: number,
  y: number,
  z: number,
};

type T2 = {
  y: number,
  z: string,
  a: number,
  ...T1,
  b: number,
};
```

`T2` には複数のプロパティが定義されていますが、それぞれこのような意図で定義しています。

- `x` = 拡張する側にあり、拡張される側にはない
- `y` = 拡張する側にあり、拡張される側に同じ型がある
- `z` = 拡張する側にあり、拡張される側に違う型がある
- `a` = 拡張される側にあり、拡張される前に宣言されている
- `b` = 拡張される側にあり、拡張される後に宣言されている

その結果、`T2` はどのような定義になるかと言うと、以下と同じになるようです。

```
type T2_ = {
  x?: number,
  y:  number,
  z:  number | string,
  a:  mixed,
  b:  number,
};

// 確認コード
({ x: 0, y: 0, z: '', a: [], b: 0 }: T2);
({ x: 0, y: 0, z: '', a: [], b: 0 }: T2_);
({ x: 0, y: 0, z: 0, a: [], b: 0 }: T2);
({ x: 0, y: 0, z: 0, a: [], b: 0 }: T2_);
({ y: 0, z: '', a: [], b: 0 }: T2);
({ y: 0, z: '', a: [], b: 0 }: T2_);
({ x: 0, y: 0, z: '', a: [], b: 0, newProp: 0 }: T2);
({ x: 0, y: 0, z: '', a: [], b: 0, newProp: 0 }: T2_);
```

それぞれを挙動から推測して、理由付けしてみます。

- `x?: number`
  - `...T1` によって増やされたプロパティです
  - 型は `T1` と同じになりますが、オプショナルになります
- `y: number`
  - `...T1` の前に `T2` の型宣言に含まれているプロパティです
  - 型は両方の Union になりますが、`number | number` なので、結果 `number` になっているようです。たぶん。
- `z: number | string`
  - `y` と同じように、`...T1` の前に `T2` の型宣言に含まれているプロパティです
  - 同じように両方の Union になりますが、y と違って両方の型が異なるので `number | string` になっているようです
- `a: mixed`
  - `...T1` の前に `T2` の型宣言に含まれているプロパティですが、`T2` に同じプロパティが存在しなかったプロパティです
  - これは理由が良くわかってないので、説明は後にします
- `b: number`
  - `...T1` の後に `T2` で型宣言されているプロパティですが、`T2` に同じプロパティが存在しなかったプロパティです
  - これは `b` の定義がそのまま有効になっているようにみえます

こんな風に見えました。


## 参考 Issue

唐突にここで Object spread type について質問とその回答がなされている Issue の紹介です。全般的に役立ちました。

https://github.com/facebook/flow/issues/3534

ここに先程の [`a: mixed` の理由も書いてあるよう](https://github.com/facebook/flow/issues/3534#issuecomment-287580240) ですが・・・
・・・自分はよくわかりませんでした・・・。


## 自分が欲しかったものは `...$Exact<T1>` すれば良い

さて、上記の中からある一部の挙動だけを抽出してサンプルにしてみます。

```
type T1 = {
  additional: number,
};

type T2 = {
  existing: number,
  ...T1,
};

// 以下と同じになる
type T2_ = {
  existing: mixed,
  additional?: number,
};
```

現実は上記のようになりますが、自分としては以下のように、`T2` が `T1` 分だけ増やされる定義になることを期待していました。

```
type T2 = {
  existing: number,
  additional: number,
};
```

これには先に紹介した Issue で解が用意されており、`...$Exact<T1>` しろとのことです。

Ref) https://github.com/facebook/flow/issues/3534#issuecomment-287580240

```
type T1 = {
  additional: number,
};

type T2 = {
  existing: number,
  ...$Exact<T1>,  // これな
};

// 以下と同じになる
type T2_ = {
  existing: number,
  additional: number,
};
```

何故こうなるのかは・・・これも不明です・・・。

以下らの概念と関係があるらしいのですが、`{ ...exactな定義 }` がこういう結果になるという明確な理解は得られていません。

- [exact/non-exact](https://flow.org/en/docs/types/objects/#exact-object-types-a-classtoc-idtoc-exact-object-types-hreftoc-exact-object-typesa)
- [Width Subtyping](https://flow.org/en/docs/lang/width-subtyping/)


## 以上

マニュアル待ちというステートです。
jQuery.Deferred で可変個の Deferred 関数を扱う際の Tips

はじめまして。「ぱいな」と申します。

私は自称ネットワークエンジニアなのですが，最近 Web まわりもちょっと勉強していて，jQuery を使ってます。この投稿は jQuery.Deferred についてです。タイトルに "Tips" と書きましたが，本音は「これもっと良い方法あるんじゃね？」というところなので，もし良い方法があったらコメントくださいまし。

# Deferred 関数の逐次処理
さて，非同期処理の強い味方，jQuery.Deferred ですが，可変個の Deferred 関数を扱うケースがあると思います。`$.when.apply()` を使って配列として渡してあげれば，一気に処理してくれますね。

```javascript:example01.js
// jQuery.Deferred を使った何か非同期処理をする関数
function deferredFunc(mesg) {
	var dfd = $.Deferred();

	setTimeout(function () { // 0～5秒のランダムな時間の後に引数をログ出力する
		console.log(mesg);
		dfd.resolve();
	}, Math.random() * 5000);

	return dfd.promise();
}

// これを可変個とする
var messages = ["poi", "poe", "pui"];

// 可変個の配列を map して要素を deferredFunc に渡す
var deferreds = messages.map(function (mesg) {
	return deferredFunc(mesg);
});

// 全ての deferredFunc が resolve したら "Done!" とログ出力する
$.when.apply($, deferreds).done(function () {
	console.log("Done!");
});
```

しかし，Deferred 関数を逐次処理したいケースも，希かもしれませんがありうるでしょう。（「jQuery.Deferred 使わないで普通に書けば？」というツッコミもありそうですが，Deferred 関数をいじれない時などです。）

Deferred 関数の個数が決まっていれば `then()` をチェインしていけば良いです。今回の例では無名関数で包む必要があるのでちょっと面倒ですが，こんな感じに。

```javascript:example02.js
deferredFunc("one").then(function () {
	return deferredFunc("two");
}).then(function () {
	return deferredFunc("three");
});
```
"one", "two", "three" が順番にログ出力されます。

では Deferred 関数の個数，というか Deferred 関数で処理したい配列等の個数が可変個だったら。これしか思いつかなかったのですが `reduce()` でチェインしてみました。

```javascript:example03.js
var messages = ["one", "two", "three"];

var deferreds = messages.map(function (mesg) { // ここではまだ実行したくないので，無名関数でくるむ
	return function () {
		return deferredFunc(mesg);
	};
});

deferreds.reduce(function (prev, curr) {
	return prev.then(function () {
		return curr();
	});
}, $.Deferred().resolve());
```
無名関数の嵐！　でも，これで "one", "two", "three" が順番にログ出力されます。

もっと良い方法を募集中ー。

# 可変個の `$.when.apply().done()` の返値を処理する

可変個の Deferred 関数の返値（正確には `resolve()` の引数）を処理したいときもちょっと悩みました。

例えば，Deferred 関数を次のように変えてみます。

```javascript:example04-01.js
function deferredFunc(mesg) {
	var dfd = $.Deferred();

	setTimeout(function () { // 0～5秒のランダムな時間の後に引数を resolve() する
		dfd.resolve(mesg);
	}, Math.random() * 5000);

	return dfd.promise();
}
```

前章の `deferredFunc()` と異なる点は，引数を関数内で `console.log()` するのではなく，`resolve()` する点です。可変個の `deferredFunc()` を `$.when.apply().done()` にかけたとき，返値を処理するにはどうするか悩みました。これも良い方法を募集中なのですが，こんな感じで一応解決。

```javascript:example04-02.js
var messages = ["one", "two", "three"];

var deferreds = messages.map(function (mesg) {
	return deferredFunc(mesg);
});

$.when.apply($, deferreds).done(function () {
	for(var i = 0; i < arguments.length; i++) { // arguments は forEach() 使えない
		console.log(arguments[i]);
	}
	console.log("Done");
});
```

JavaScript において，関数の引数は仮引数だけではなく `arguments` でも受けられます。こうすれば，全ての `deferredFunc()` が `resolve()` した後，"one", "two", "three" が一度にログ出力されます。
Rails - schema.rb（既存DBを使ったアプリ作成）

既存のDBを使う場合、現在の状態をschema.rbにして、マイグレーションはその状態をスタート地点として作っていくことになるのかなと思っております。とりあえず、schema.rbの作り方とかを確認してみます。

参考：[【Rails】スキーマ情報管理（schema.rbとstructure.sql）](http://www.task-notes.com/entry/20170118/1484665656)

# schema.rbの作成

使っているのはMySQLです。とりあえず、schema.rbを作成してみます。

```
$ rake db:schema:dump
```

おー作られました。db/schema.rbにあります。sqlファイルを作成することもできるようです。便利っぽいので試してみます。

```
$ rake db:structure:dump
```

上記のようにすると、db/structure.sqlが作成されました。

# マイグレーションファイルの作成

```
$ rails g migration create_tables
```

とやって見ると、マイグレーションファイルが作成されますが、中身は空です。

```20170428095931_create_tables.rb
class CreateTables < ActiveRecord::Migration[5.0]
  def change
    create_table :tables do |t|
    end
  end
end
```

参考：[Railsのマイグレーションファイルを既存のスキーマ、データベースを元に作成](http://blog.digital-squad.net/article/398190260.html)

空のマイグレーションファイルに、schema.rbの内容をコピペしたらいいようです。

```
$ rails db:migrate
```

すでにテーブルは当然ありますが、上記を実行したらマイグレーションが動きました。
== 20170428095931 CreateTables: migrating =====================================
-- create_table("bills", {:force=>:cascade, :options=>"ENGINE=InnoDB DEFAULT CHARSET=utf8"})
   -> 0.0287s
.
.
.
-- create_table("price_types", {:force=>:cascade, :options=>"ENGINE=InnoDB DEFAULT CHARSET=utf8"})
   -> 0.0312s
== 20170428095931 CreateTables: migrated (0.3061s) ============================

# モデルの作成

テーブル内容からモデルを作成するような機能はあるのでしょうか？cakePHPだとbake model Userとかでできますので、同じように出来るかやってみます。

参考：
[rails 既存DBを使ってrailsしてみた。](http://hmu29.hatenablog.com/entry/2014/02/14/001513)
[Railsで既存のテーブルをModelとして使用する](Railsで既存のテーブルをModelとして使用する)

下記で空のモデルを作成するということらしい。cakephpの場合、良し悪しは別にして勝手にバリデーションとかまでテーブル構造から推測して作成してくれるけど、そういうのはないのかな？

```
$rails g model hogehoge 
```

参考：
[いつも忘れる「Railsのgenerateコマンド」の備忘録](http://maeharin.hatenablog.com/entry/20130212/rails_generate)
[railsコマンド(rails)](http://railsdoc.com/rails)

どうもテーブル構造を入力しないと勝手に現状のテーブルあるいは、schema.rbを前提にバリデーション含めて作るとかそういうのはないらしい。あと、cake bake model allみたいなテーブル全部のモデル作るとかそういうのもないらしい。まああんまり必要になることはないか。でも今は使いたかった。

要はテーブル数だけ、上記の`rails g model hogehoge`をやるってことか。めんどくさいな。あとデフォルトでは自動でマイグレーションファイルも作成されるらしいので、オフにした方が良さそう。`rails g model hogehoge --migration false`とやればいいっぽい。`rails g model hogehoge --migration false -s`とやると、すでに存在するファイルはスキップするっぽい。

```
$ rails g model customers --migration false
$ raiis g model options --migration false
.
.
.
```
xampp for windows(version5.6.28-0)をwindows 8.1(2017.4.28)にインストールし、apache + mysql(mariadb) + phpmyadminの正常動作確認

xampp for windowsのインストーラーをxampp公式サイトからダウンロードする。
ダウンロードページで"ここをクリック"をクリックして、明示的にダウンロードを開始する。
("ダウンロードは間もなく自動的に開始されます。開始されない場合： ここをクリック.")
https://www.apachefriends.org/jp/index.html
https://www.apachefriends.org/jp/download_success.html

今回動作確認したxampp for windows 5.6.28.0を明示的にダウンロードする方法
https://sourceforge.net/projects/xampp/files/XAMPP%20Windows/5.6.28/
上記のページ内の、"xampp-portable-win32-5.6.28-0-VC11-installer.exe"をクリックしてダウンロードを開始できます。
https://sourceforge.net/projects/xampp/files/XAMPP%20Windows/5.6.28/xampp-portable-win32-5.6.28-0-VC11-installer.exe/download

"xampp-portable-win32-5.6.28-0-VC11-installer.exe"

ダウンロードしたインストーラーをクリックしインストーラーを起動。(インストール中の選択などは特に無し)
![xampp_and_UAC.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/baafdb23-68e5-9a96-cabb-94976699f2b5.png)
(UACの警告に関しては、インストール場所が"c:\program files (x86)"であった場合のUAC動作の問題についてなので、デフォルト構成でのxampp installerには影響が出ないのでそんままスルーして問題無しです。)

![xampp_default_install_location.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/f2213951-bac4-2150-ca22-2c09ac87b21a.png)

インストール完了後、windows 8.1のスタートスクリーン経由かWin + s(windowsキー+s)で"xampp"と検索し、"xampp control panel"を起動。
初回のapache, mysqlのstart時にwindows firewallの構成を以下のprivate networkのみアクセスの方式で設定。

![xampp_apache_firewall_config_as_private_network.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/13457248-42d6-7a06-bc6f-6ba35ebf4f95.png)

![xampp_mysql_firewall_config_as_private_network.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/c860d8af-0ed6-711a-7bd3-feec18e474c4.png)

xamppでapacheとmysqlが正常動作していることを確認(apacheとmysqlが"status change detected: running"で正常に動作状態にあること確認)
![xampp_mysql_and_apache_start_passed.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/772649d0-de12-e601-1675-aacc58a6dc09.png)

最後にphpmyadminをxamppのmysqlのadminボタンから起動し、正常にmysql + phpmyadmin(mysql管理ツール)が起動することを確認
![xampp_phpmyadmin_in_ie11.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/03f61ac5-e4f7-4c09-edc3-b9d02831d80c.png)
Sample code for react-infinite using ES6 syntax without React.createClass

I want to implement infinite scroll in my app.
I found https://github.com/bvaughn/react-virtualized, but it's a bit heavy. I want to use a simple and thin one, and then I found `react-infinite`

`react-infinite`
https://github.com/seatgeek/react-infinite

sample code for `react-infinite` with a create-react-app environment

* using create-react-app
* using ES6 syntax
* without React.createClass

### NOTE
- this sample code has elements in React Component's state  
It's a bit weird.

### code

```
import React, { Component } from 'react';
import Infinite from 'react-infinite';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  render() {
    return (
      <div className="App">
        <div className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h2>Welcome to React</h2>
        </div>
        <p className="App-intro">
          To get started, edit <code>src/App.js</code> and save to reload.
        </p>
        <InfiniteList />
      </div>
    );
  }
}

class ListItem extends React.Component {
  
  render () {
    return (
      <div className="infinite-list-item">
        List Item {this.props.num}
      </div>
    );
  };
};


class InfiniteList extends React.Component {
  constructor (props) {
    super(props);
    this.state = {
      elements: this.buildElements(0, 100),
      isInfiniteLoading: false
    };
  }

  buildElements (start, end) {
    let elements = [];
    for (let i = start; i < end; i++) {
      elements.push(<ListItem key={i}/>)
    }
    return elements;
  }

  handleInfiniteLoad () {
    let that = this;
    this.setState({
      isInfiniteLoading: true
    });
    setTimeout(function() {
      let elemLength = that.state.elements.length,
        newElements = that.buildElements(elemLength, elemLength + 1000);
      that.setState({
        isInfiniteLoading: false,
        elements: that.state.elements.concat(newElements)
      });
    }, 2500);
  }

  elementInfiniteLoad () {
    return <div className="infinite-list-item">
      Loading...
    </div>;    
  }

  render () {
    return <Infinite elementHeight={40}
      containerHeight={250}
      infiniteLoadingBeginBottomOffset={200}
      onInfiniteLoad={this.handleInfiniteLoad}
      loadingSpinnerDelegate={this.elementInfiniteLoad()}
      isInfiniteLoading={this.state.isInfiniteLoading}
    >
      {this.state.elements}
    </Infinite>;
  }
};


export default App;

```

### Gif
![fc7db198376555f0d19d3dff3581d2af.gif](https://qiita-image-store.s3.amazonaws.com/0/20911/e6617dd8-e876-ac46-1fa7-2d75922954cb.gif)
[A3RT]GWなんだしUnityを使ってチャットBotをつくろう

---
1.はじめに

---

リクルートが無料で使えるAIを公開しました
https://a3rt.recruit-tech.co.jp/

その中に会話AI(以下TalkAPI)があったのでUnityで取得できるようにしました
https://a3rt.recruit-tech.co.jp/product/talkAPI/


---
1.準備

---

必要なもの
・Unity
・リクルートのTalkAPIのKey
・MinijsonとJsonnodeが記載されたC#スクリプト


・Unity
Unityをインストールしていなかったらインストールしておいてください
https://unity3d.com/jp/get-unity/update


・リクルートのTalkAPIのKey
TalkAPIを使用するためのカギをもらいましょう
https://a3rt.recruit-tech.co.jp/product/talkAPI/registered/

登録すると登録したメールアドレスにAPIを使用するための鍵が発行されます（7XDERM6AEUJtl82I7qIOAbVb76Aaaaaaa <-こんな感じの）
後で使うのでメモしておいてください


・MinijsonとJsonnodeが記載されたC#スクリプト
Minijson
http://qiita.com/phi/items/914bc839b543988fc0ec
(コード直リンク:https://gist.githubusercontent.com/darktable/1411710/raw/513f1c0ceb0cd4728973e109bd0b13911f162ebd/MiniJSON.cs)

Jsonnode
http://qiita.com/phi/items/914bc839b543988fc0ec
(コード直リンク:https://gist.github.com/asus4/7f7b5912d703f44c2711)

これを下の写真のように配置してください
1.Plugins フォルダをつくる
2.JsonNode.csとMiniJson.csを作成して上記サイトからコードを完コピ
![063a4f8f91017d69bc886132a38118fb.png](https://qiita-image-store.s3.amazonaws.com/0/119898/9c42751d-2f69-4201-bda8-21f8b724496c.png)


---
2.取得する

---
本題

RequestTaklAPI.cs　って名前のC#スクリプトを作成してください

そしてRequestTaklAPI.csに下記コードを書き込んでください

```RequestTaklAPI.cs
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using System;
using System.Collections;
using System.Text;

public class RequestTaklAPI : MonoBehaviour {

    string url = "https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk";
    string apikey = "取得したAPIKEYを入力してください！！！！！";
    public string query = "";
    public Text text;

    IEnumerator Start()
    {
        // ChatAPIに送る情報を入力
        WWWForm form = new WWWForm();

        form.AddField("apikey", apikey);
        form.AddField("query", query,Encoding.UTF8);

        // 通信
        using (UnityWebRequest request = UnityWebRequest.Post(url, form))
        {
            
            yield return request.Send();

            if (request.isError)
            {
                Debug.Log(request.error);
            }
            else
            {
                try
                {
                    // 取得したものをJsonで整形
                    string itemJson = request.downloadHandler.text;
                    JsonNode jsnode = JsonNode.Parse(itemJson);
                    // Jsonから会話部分だけ抽出してTextに代入
                    if (text.text != null) {
                        text.text = jsnode["results"][0]["reply"].Get<string>();
                    }
                    Debug.Log(jsnode["results"][0]["reply"].Get<string>());
                }
                catch (Exception e)
                {
                    // エラーが出たらこれがログに吐き出される
                    Debug.Log("JsonNode:" + e.Message);
                }
            }
        }
    }
}


```
※apikey = "取得したAPIKEYを入力してください！！！！！"の部分にあなたが取得したkeyを入れてください

実行結果
Hierarchy　に空のGameObjectを配置してRequestTaklAPI.csを追加してQueryの項目に「おなかすいた」と入力して実行すなsy

私もすきましたと返ってきてます
無事に実行できたようです
![ca538c2be8d68c1972113d73efa143aa.png](https://qiita-image-store.s3.amazonaws.com/0/119898/8daaaacc-32c3-470e-81bc-ea0d73521219.png)
mysql installer for windows(version5.7.18.1)をwindows 8.1(2017.4.28)の初期状態からインストールした場合の動作履歴(正常にインストールできないパッケージ有)

mysql installer for windowsのダウンロード元ページ
https://dev.mysql.com/downloads/windows/installer/5.7.html

"mysql-installer-community-5.7.18.1.msi"のダウンロードを完了後、実行、developer defalultを選択

久しぶりにmysql installerを実行してみましたが、ms vc++ 2013 runtime, mc vc++ 2015 runtimeが前提で使われている点など、参考になりました。

単純にdeveloper defaultを選択して、次へをえらんだだけでは、Mysql serverは正常にインストールされないことがわかりました。(2017.4.28 19:27)

windowsの標準のアンインストール作業だと一括でのmysql installerでインストールしたプログラムを案インストールできない点は注意が必要そうです。(2017.4.28 19:31)

![mysql_installer_developer_default_contains_vs_required_product.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/064fc509-1b17-7337-926d-6229c210b7f1.png)

![mysql_installer_developer_default_automatically_resolves_mscpp2013runtime.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/eba671dc-64e1-9602-0f2e-2017edb9f4fa.png)

![mysql_installer_developer_default_automatically_resolves_mscpp2015runtime.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/b4b1c437-fae0-0464-8acd-e5668b0d9be6.png)

![mysql_installer_developer_default_automatically_resolves_vstools_for_office2010.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/1852797b-fbe7-fa4b-3b87-fe38a1ebd50e.png)

![mysql_installer_developer_default_nonautomatically_resolves_vs2012or2013or2015or2017.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/7152d93d-c81d-72a5-5113-04a8fa97d4c0.png)

![mysql_installer_developer_default_nonautomatically_resolves_python3d4.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/083008e5-1332-393f-05a5-cb10f3b36536.png)

![mysql_installer_developer_default_noninstalls_requirement_nonsatified_product.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/ddca55a1-dd75-9b88-568d-965d0d7336b6.png)

![mysql_installer_developer_default_installs_eight_following_products.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/8ffdf6de-9722-9a0b-1391-4f6f7872defc.png)

![mysql_installer_developer_default_installs_result_in_windows8d1.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/091436ca-8ab6-ed03-acfe-ea9e4fd5c6e0.png)

![mysql_installer_developer_default_installing_after_installer_execution.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/8def50e9-38c8-adb1-563f-b874074feaea.png)

一括アンインストールできない例
![uninstall_mysql_installer_developer_default.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/6f543c62-d1da-f3a2-6999-b9612ad62148.png)

![after_uninstall_mysql_installer_developer_default.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/33fe8ac3-6c6f-e825-6a0b-34c895f86186.png)
AntでProcessingを実行する

# なんでAnt?

EclipseやIntelliJでProcessingを動かす例は色々紹介されていますが、
それぞれの環境で設定を行わなければいけません。
Antから使うテンプレートがあれば、作りたい作品やその時の気分に合わせて使うエディタを変えることが簡単になると思う。

テンプレートはここで公開しています。
https://github.com/enkatsu/ProcessingAnt

使い方は

```bash
# Antが入ってない人はインストール
$ brew install ant
# 確認
$ ant -version

$ git clone git@github.com:enkatsu/ProcessingAnt.git
$ cd ProcessingAnt

# build.xmlの編集(編集した時点でどこかに保存しておけば使い回し易いかも)
# ...
# <property name="p5core" location="path/to/core_dir"/>
# <property name="p5dir" location="path/to/processing_dir"/>
# 例)
# <property name="p5core" location="/Applications/Processing.app/Contents/Java/core/library"/>
# <property name="p5core" location="/Users/ユーザ名/Documents/Processing"/>
# ...

# 実行
$ ant
```
npmから乗り換えてわかったYarnの4つのメリット

この記事は加筆・修正して「[npmから乗り換えてわかったYarnの4つのメリット \- ICS MEDIA](https://ics.media/entry/19384)」に引っ越しました。

[![npmから乗り換えてわかったYarnの4つのメリット \- ICS MEDIA](https://qiita-image-store.s3.amazonaws.com/0/67884/166e5349-c89e-228b-50b9-fe5e8b1ef646.png)](https://ics.media/entry/19384)

**3万PV、280いいねとフロントエンド界隈でご好評いただいた内容**です。ぜひご覧ください。

※ Google検索で辿り着いた方にリンク切れとなっては申し訳ないので、元の記事を残しています。ご了承ください。
IBM Cloud Cloudant Standardプランの価格体系の考え方

(2021/11時点の情報に合わせて更新しました)

IBM Cloud上でよくご利用いただいているサービスの一つにNo SQL DatabaseのCloudantサービスがあります。このCloudantを利用する際にはカタログページから無料のLiteプランか有料のStandardプランをご利用いただきます。特にStandardプランを利用いただく場合に、価格に関する説明が非常にわかりにくいというご指摘をよくいただきますので、今回は補足の説明をしたいと思います。


Cloudantサービスのカタログページ:
https://cloud.ibm.com/catalog/services/cloudant
ご利用条件
https://www.ibm.com/support/customer/csol/terms/?id=i126-6627


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/abe6ba48-7ded-1fe1-1c3a-830288ce5fcd.png)

#Standardプランはスループットに応じた課金モデルでご提供

Standardプランに関する価格はカタログのページを見ただけでは正直よくわかりません。実はここには重要な考え方の説明が抜けています。
StandardプランではRead/Write/Query(旧称Read/Write/Global Query)という3つの操作のスループットに応じた課金が行われます。具体的には 100 Reads/秒, 50 Writes/秒, 5 Querirs/秒を1つのユニット(ブロック)とし、ユニット単位でスループットの増減することができます。

IBM Cloud Docs:
https://cloud.ibm.com/docs/services/Cloudant?topic=cloudant-pricing

サービス・インスタンスをプロビジョニングする際には、1ユニット分のスループットでプロビジョニングされ、後にお客様はスループットを管理コンソールから変更することができます。変更の際は無停止で新しい設定値が反映されます。

||1ユニット|
|:--:|:-:|
|Readの実行回数上限(毎秒)|100|
|Writeの実行回数上限(毎秒)|50|
|Queriesの実行回数上限(毎秒)|5|
|個々のドキュメントのサイズの上限|1MB|
|標準価格に含まれるストレージ領域|20GB|

スループットとして指定された実行回数の上限を上回る頻度でAPIが呼び出された場合には、実行エラーが発生します。このときHTTPレスポンスコード `429 Too Many Requests` の応答が返されます。このようなケースではスループットのユニット数を増加するか、業務的に許されるのであれば少し時間をおいてリトライするように呼び出し元のアプリケーションで工夫する必要があります。
スループットのユニット数を変更するには、Cloudantのサービス・インスタンスの管理コンソール画面で変更できます。「Select Capacity」のスライドバーをスライドさせることで変更が可能です。最大で100ユニットまで拡張できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/ef4a4231-e6f0-aea2-abfa-90276599421d.png)

##### 1ユニット分の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/9d6c020c-4b48-e694-e997-141cef7db768.png)
##### 3ユニット分の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83689/c85827c4-4f32-e8a7-162e-4d6fe740abcb.png)

#利用料金は?

スループットを構成する要素ごとに単価が定められ、ユニットあたりの料金を算出することができます。
なお実際には1ヶ月730時間で計算しており、若干の増減が見込まれます。年間の平均額としてご理解ください。

||1回/秒あたり(月額)|1ユニットあたり(月額)|
|:--:|:-:|:-:|
|Read|28.000775円|2,800円 (100回/秒)|
|Write|56.00155円|2,800円 (50回/秒)|
|Queriey|560.0155円|2,800円 (5回/秒)|
|||1ユニットあたり合計8,400円|

なお、ストレージは20GB分が標準で追加料金なくご利用いただけますが、超過分はGBあたり112.0031円/月でご利用いただけます。
請求時にはユニット数ならびにストレージ量は1ヶ月間のご利用の平均量に基づき請求が行われます。また月の途中でご利用開始もしくはご利用終了された場合にはご利用期間に応じて按分された料金が請求されます。

ご利用料金見積もり金額の例)

1ユニットご利用かつ、ディスクは1ヶ月間で平均で0GB容量オーバーしていた(20GBの枠内で利用)とすると
8,400[円/ユニット] x 1[ユニット] + 112.0031[円/GB] x 0[GB] = 8,400円が見積もり金額となります。
この金額が1ヶ月ご利用時の最低料金となります。

3ユニットご利用かつ、ディスクは1ヶ月間で平均で15GB容量オーバーしていた(つまり35GBを使っていた)とすると
8,400[円/ユニット] x 3[ユニット] + 112.0031[円/GB] x 15[GB] = 26,880円が見積もり金額となります。

 

#勘違いしやすいポイント

* Read/Write/Queriesの利用頻度に基づく従量課金ではありません。選択されたスループットの上限以内での利用が可能で、スループットの大きさに応じた課金が発生します。
* スループットの上限値を動的に変更することはありません。お客様にてスループットの上限を設定いただきます。
* 月額の料金の記載は月間730時間として時間課金の料金を積算したものです。実際には時間課金でご利用料金が発生します。
SQL PSM到来(mariadbサイトにSQL99の規格が公開されているのに対して、Oracle Database 11.2がSQL:2008規格に準拠している事実確認)

"今回のリリースのOracle Databaseは、この付録の前の項で説明したように、最新版のSQL規格であるSQL:2008に準拠しています。SQL-92(特にSQL-92のエントリ・レベル)またはSQL:1999は、SQL:2008に置き換えられているため、Oracleは、データベースの今回のリリースがこれらの以前の規格に準拠していることを正式に明示していません。SQL規格の新旧版の間(SQL-92とSQL:1999の間およびSQL:1999とSQL:2008の間の両方)に行われた一部の変更(大部分は小規模なもの)は、アプリケーションに影響を及ぼす可能性があります。影響のある非互換の詳細については、SQL規格またはこの規格に関する説明資料を参照してください。"
http://docs.oracle.com/cd/E16338_01/server.112/b56299/ap_standard_sql013.htm

Oracle Database 11.2が想定以上にSQL:2008という新しいSQLの規格に準拠していることをしり、驚きました。
とすると、Array, LIST, SETなどの、collection系typeにも標準対応していそうなので、いままでよりかなりデータ設計の方式で考え方が変わりそうです。

"2008年7月に採用された最新のSQL規格をSQL:2008といいます。この規格の正式名称は、次のとおりです。

•ANSI/ISO/IEC 9075:2008、『Database Language SQL』、Part 1「SQL/Framework」、Part 2「SQL/Foundation」、Part 3「SQL/CLI」、Part 4「SQL/PSM」、Part 9「SQL/MED」、Part 10「SQL/OLB」、Part 11「SQL/Schemata」、Part 13「SQL/JRT」、ANSI/ISO/IEC 9075-14:2008、『Database Language SQL』、Part 14「SQL/XML」


•ISO/IEC 9075:2008、『Database Language SQL』、Part 1「SQL/Framework」、Part 2「SQL/Foundation」、Part 3「SQL/CLI」、Part 4「SQL/PSM」、Part 9「SQL/MED」、Part 10「SQL/OLB」、Part 11「SQL/Schemata」、Part 13「SQL/JRT」、ISO/IEC 9075-14:2008、『Database Language SQL』、Part 14「SQL/XML」"
(SQL2008がかなり膨大なスペックであることを知りました。)
https://docs.oracle.com/cd/E16338_01/server.112/b56299/intro002.htm

壮絶なる事実を今知りました。まさかのSQLに標準でフロー制御が付いたのですね。しかもOracle databawse 11.2ですでに使用可能なレベルのSQLにフロー制御搭載が来たとすれば、歴史的な、完全なるSQLのみによるプログラミングさえ視野にいれた革命的な規格と規格準拠がわかったと、私は考えています。
("•使用される文は、それぞれが複雑、強力で、スタンドアロン型の文です。これまで、SQLにはフロー制御文は含まれていませんでしたが、最近認められたSQLのオプション部分ISO/IEC 9075-5 : 1996にはフロー制御文が含まれています。フロー制御文は、永続保存モジュール(PSM)としてよく知られており、SQLの拡張機能であるOracleのPL/SQLは、PSMに似ています。")
https://docs.oracle.com/cd/E16338_01/server.112/b56299/intro002.htm

これほどすごい機能がありながら、過去に大量のSQL記事を読んできましたが、PSM(SQLフロー制御)を用いた記事は1件も読んだことがありませんでしたが、これからはすごい便利なSQLによるプログラミング時代が始まりそうです。

SQLの規格における、SQLの機能一覧も復習になったので、記録しておきます。
("SQL文を使用して、次の処理を行うことができます。
•データの問合せ
•表の中の行の挿入、更新、削除
•オブジェクトの作成、置換、変更、削除
•データベースとデータベース・オブジェクトへのアクセス制御
•データベースの一貫性と整合性の保証")
railsでdatetime型の前後入力のバリデーションをかける方法

開始日と終了日があって、終了日が開始日よりも前の日付になったらダメだよってときのやつ。

# やり方は簡単
・モデルにvalidationを作っちゃう
・以下参照


# 例

Eventモデルで実験

```
class Event < ActiveRecord::Base
  validates :start_date, presence: true
  validates :end_date, presence: true
  validate :start_end_check

  def start_end_check
    errors.add(:end_date, "の日付を正しく記入してください。") unless
    self.start_date < self.end_date
  end
end
```
ちゃんと動きました！いぇい！

# 参考元

「一言多いプログラマーの独り言」さん
http://programmer-jobs.blogspot.jp/2013/05/ruby-on-rails_21.html
助かりました。ありがとうございます。
SQL99のドキュメントがmariadbのサイトで公開されているのでSQL99についての入門をしていたがSQL4のロードマップチェック

MariaDBのサイトにSQL99（SQLの規格）解説が載ってるので読むと良いよ("sql99, complete,really というSQL99の解説書の全ページがMariaDBのサイトに掲載されている。")
http://qiita.com/satton_maroyaka/items/f8e5f800a7ffc3e5dff6
https://mariadb.com/kb/en/sql-99/

SQL99というSQLの標準規格があることを知ったので、ひとまずこのSQL99について調べるのを開始してみます。

新しい業界標準「SQL99」詳細解説
http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sql99/sql99_0.html
("新しく登場する「SQL99」では、オブジェクト指向やJavaを取り入れたものとなり、 リレーショナルなデータのみならず、データアクセス一般に広く利用される アクセス言語としての地位を目指したものとなっている。")

第三章　SQLJと今後の標準化動向（4）("SQL国際標準委員会は、次のSQL標準（開発コード名は「SQL4」）として次のような課題を検討している。",
"SQL99でサポートした配列(ARRAY)型に加えて次のような型を追加する。
• SET型・・・・要素の順番に意味がないが、重複を許さない集合
• LIST型・・・要素の順番に意味があるが、重複を許す集合"(まさかのcolumn and cellであったはずのrdb and tableだが、SET typeとLIST typeが出ることで、かなり柔軟なデータ保存が実現できる時代が来ることが楽しみになりました。),
SQL/MED(
(SQL/Management of External 
Data),
抽象LOB(外部ファイルをLOB型データとして扱う), 
DATALINK(DATALINK型は、外部ファイルを位置づけるURLをコード化したもので),
"抽象表は、SQLサーバ（DBMS）の管理外の外部ファイル、非リレーショナル編成のデータベース、あるいは他社ベンダーのデータベース中の表を「外部表」として定義する。そしてSQLサーバと外部サーバとの間のAPIを標準化することによって、アプリケーションが発行するSQL文の目的表が、自分のデータベース中に存在するのか、それとも外部表であるのかを意識させないような透過性を実現しようというのである。"
)
(table and viewに相当する、仮想的なtable実現に対して、今度は仮想的なcolumn、仮想的なcellが実現できるのは、確かに使う状況がありそうです。
まるでRDB + SQLで包括的なリソースアクセスができる時代さえ想定できそうです。),



http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sql99/sql99_3d.html
Homebrewで入れたMySQLのmy-xxx.cnfの場所とmy.cnfの設置

## まずMySQLのインストール
```
$ brew install mysql
```

### 起動
```
$ mysql.server start
```
### 停止
```
$ mysql.server stop
```
### ステータス確認
```
$ mysql.server status
```

## my-xxx.cnfの場所
Homebrewで入れたアプリケーションは ```/usr/local/Cellar/``` 以下に入るので ```/usr/local/Cellar/mysql```というディレクトリができているはず。

```
$ find /usr/local/Cellar/mysql -name "my*.cnf"
/usr/local/Cellar//mysql/5.7.17/support-files/my-default.cnf
```

## my.cnfの設置
先程見つけたmy-xxx.cnfをmy.cnfにリネームしつつ設置する。
my.cnfの設置場所は以下で確認できる。
※4箇所出力されているが、左から順に読み込まれる。
<pre>[masatomo@Masatomo-no-MBP ~]$ mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
</pre>

上記4箇所のいずれかにコピー＆リネームして内容を適宜変更、リロードすればOK
```
$ mysql.server reload
```
Laravel5.4でバリデーションをテストする


カスタムバリデーションをかけいたらバリデーションのテストがしたくなったので、不格好ながらテストを書いてみました。

```php:tests/Unit/RegisterTest.php
$registerRequest = new RegisterRequest();

$values = [
'name' => '田中 太郎'
'email' => 'tanaka@example.com'
'password' => '00'
];

$validator = \Validator::make($values, $registerRequest->rules());
$this->assertEquals($validate->fails(), true);
```

## 補足
- `$validate->fails()`は`true`でバリデーションに引っかかったことを意味する[詳しくはこちらを参照](https://readouble.com/laravel/5.4/ja/validation.html#manually-creating-validators)
- `assertTrue`や`assertFalse`もありますが、僕の場合はデータに予想結果をくっつけてイテレータでぶん回すので`assertEquals`を使ってます。


理想を言えば、Requestではなくカスタムバリデーションのみをテストしたかったんですが、時間の関係上今回はそこまで調査ができませんでした。。。
MariaDB 10.1(version10.1.22)をIE11(version11.09600.18639)でダウンロードしたとき署名判定でファイル破損をチェック

過去にたくさんのインストーラやプログラムをダウンロードしてきましたが、一度として署名判定でファイル破損が発生した、具体的な状況に遭遇したことがなかったので、人生初のリアルなファイル破損を署名判定で適切に検出できた事実を記録しておきます。

mariadbをはじめとしたメジャーなプログラム、インストーラーには署名という方式で、インストーラーのバイナリが作者の署名作成後に変更されていないことを署名チェックで行うことができます。

仮にネットワーク転送中のバイナリおよびビット破損、インストーラーが公開されているファイルサーバー上でのバイナリ破損、さらにはダウンロード中の一時ファイル状態での物理保存先でのバイナリ破損などによって、想定していないバイナリ状態になっていた場合は、IE11のダウンロード機能で、適切に署名判定がされて、ファイルが破損しているかどうかをチェックすることができます。

つまり、今回の記事は、作者が想定しないバイナリ状態であったことが、明確に検出できた、具体的な事例でもあります。

![ie11_file_signature.PNG](https://qiita-image-store.s3.amazonaws.com/0/172848/4389d6d0-85a0-7fc3-a55d-61bfa49e43c0.png)

"Download 10.1.22 Stable Now!"
https://downloads.mariadb.org/

"•ファイルにデジタル署名が含まれる場合は、その署名が有効であり、信頼できる場所からファイルが提供されていることを確認する。デジタル署名を確認するには、初めてファイルをダウンロードするときに表示されるセキュリティ警告のダイアログ ボックスで、発行元のリンクを選びます。"("文書番号:17436 - 最終更新日: 2016/09/15 - リビジョン: 3")
https://support.microsoft.com/ja-jp/help/17436/windows-internet-explorer-download-files-from-web
IBM Cloud API ConnectサービスでのProxy利用上の注意点


IBM CloudのAPI Connectサービスは日本時間2017/3/31よりProxyとして動作する場合に新しいヘッダーをつけて後続の処理にリクエストを送信するようになりました。これによりAPIの動作が変わってしまう事象に遭遇されたケースがあり、その対応内容をまとめました。


#変更になったヘッダー
具体的に追加されるようになったのは以下のフィールドです。
```
X-Forwarded-Host: (API Connectサービスが使用するサーバーのホスト名を設定します)
```
この結果としてリダイレクトを伴うAPIを公開した場合の動作に影響が生じるようになりました。具体的にはHadoopの処理をAPI Connectを介して公開するケースなどで影響があります。具体的に実施する操作のイメージを示します。図中のcurlコマンドとHTTPレスポンスは問題を理解いただき、簡単に再現できるように記述致しました。
<img width="1117" alt="スクリーンショット 2017-04-28 6.06.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/e4e29ef6-a124-aec5-159b-217805b1bfa9.png">
*図1: 影響を受ける一般的なWebHDFSへのファイルの作成処理*

#ヘッダーが変わったことによる影響
IBM Cloud上ではこのような処理を実現するためにはAPI ConnectサービスとBigInsights for Apache Hadoopサービスを組み合わせることで実現できます。両者を組み合わせ、図1に示した1の処理をAPI Connectを通じて公開した場合、3/31以前の動作では以下のような振る舞いでした。
<img width="1200" alt="スクリーンショット 2017-04-28 17.12.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/e15b8a61-4882-4417-b3f7-ec410c378146.png">
*図2: API ConnectサービスとBigInsightsサービスを組み合わせたHDFSへの操作時の処理フロー*

変更がおこなわれたことにより以下のような振る舞いをするようになりました。
<img width="1222" alt="スクリーンショット 2017-04-28 17.13.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/f549fea1-c361-52c9-b585-ec4d56ba4132.png">
*図3: API ConnectサービスとBigInsightsサービスを組み合わせたHDFSへの操作時の処理フローで発生するエラーの事象*
図3に示した1.2の処理でHTTPレスポンスに含まれるLocationフィールドに対してAPI Connectサービスのノードが返るようになりました。これは"X-Forwarded-Host"ヘッダーが含むリクエストに対する処理としては一般的な処理であり、製品が提供する機能の不具合ではありません。

#期待通りに動作させるための回避策
図2と同様の動作をするためには、API ConnectサービスからBigInsightsサービスを呼び出す際に工夫する必要があります。"X-Forwarded-Host"ヘッダーに対してBigInsightsサービスが提供するWebHDFSサービスのエンドポイントのホスト名を指定することで、同じような動きにします。稼働するイメージとしては下に示した図4のような流れです。
<img width="1196" alt="スクリーンショット 2017-04-28 17.23.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/83689/aed67175-0827-635b-03d0-2f6248d163d9.png">
*図4: API ConnectサービスとBigInsightsサービスを組み合わせたHDFSへの操作時の処理フローにおいて期待通りに動作させるための回避策*

##API Connect上での回避策の設定
このような設定をするためにはAPI Connect上で定義しているAPIそれぞれのyamlファイル上に設定するのが最も平易な方法です。この設定は`-proxy`と同じレベルに`- set-variable`が来るように記述します。

    - set-variable:
        title: set-variable
        actions:
            - set: message.headers.x-forwarded
                value: <DATANODE>

この回避策を設定することで従来と同様に動作しますので、3月末から突然APIが稼働しなくなってしまったお客様におかれましては確認いただきますよう、お願いいたします。
C#で素因数分解してみる

SQLで素数求める方法ってありますよね。定義をそのまま書き下すだけの。
じゃあLinq使って同じような書き方できるんじゃないか？、というとこから走り出します。

##素数を求める

まずは素数の定義からいきましょう。

>Wikipediaより
>>素数（そすう、英: prime number）とは、1 より大きい自然数で、正の約数が 1 と自分自身のみであるもののことである。正の約数の個数が 2 である自然数と言い換えることもできる。1 より大きい自然数で素数でないものは合成数と呼ばれる。

これをそのままLinqで書き下します。

```csharp:CountPrime1
IEnumerable<int> CountPrime(int min = 0, int max = int.MaxValue)
{
    return Enumerable.Range(2, max - 1)
        .Where(s1 => Enumerable.Range(1, s1 - 2)
            .All(s2 => s1 == s2 || s1 % s2 != 0))
        .SkipWhile(s => s < min);
}
```

このままだと数が大きくなると列挙に時間がかかりすぎるので、ちょっと小細工します。
ある合成数の1を除く約数の最小値がxの時、その数字はx^2以上になります。
つまり、特定の数字Nが素数であるかどうかを考える時に、√N以下に約数がなければNは素数となります。
というわけでこうなります。

```csharp:CountPrime2
IEnumerable<int> CountPrime(int min = 0, int max = int.MaxValue)
{
    return Enumerable.Range(2, max - 1)
        .Where(s1 => Enumerable.Range(2, (int)Math.Sqrt(s1))
            .All(s2 => s1 == s2 || s1 % s2 != 0))
        .SkipWhile(s => s < min);
}
```

##素因数分解する

素数の求め方は既にわかっているので、まずは素直にいきましょう。
1は素因数分解できないので最初にはねてます。本当は例外投げるべきかも。

```csharp:Factoring1
IEnumerable<int> Factoring(int number)
{
    if (number == 1)
        yield break;
    // 素数の一覧を取得
    var primes = CountPrime(0, number);
    var tmp = number;
    foreach (var prime in primes)
    {
        // 剰余が発生するまで割り続けて、終わったら次の素数に
        while (tmp % prime == 0)
        {

            tmp = tmp / prime;
            yield return prime;
        }
    }
}
```

実行するとわかりますが、これ、桁数が大きくなると素因数分解の難易度にかかわらずどんどん遅くなります。
最初に素数を全て取得している上、割り切れたかどうかに関わらず素数を全てループしているのが原因です。
というわけで逐次素数を生成していきましょう。

```csharp:Factoring2
IEnumerable<int> Factoring(int number)
{
    if (number == 1)
        yield break;
    // 最小の素数をリストに
    var primes = new List<long>() { 2 };
    var tmp = number;
    // 割れなくなったらやめる
    while (tmp != 1)
    {
        foreach (var prime in primes)
        {
            // 剰余が発生するまで割り続けて、終わったら次の素数に
            while (tmp % prime == 0)
            {
                tmp = tmp / prime;
                yield return prime;
            }
        }
        if (tmp == 1)
            // 割れなくなったらやめる
            yield break;
        var maxPrime = primes.Max();
        if (Math.Sqrt(tmp) < maxPrime)
        {
            // 最大の素数が残っている数の平方より大きいなら残っている数は素数
            primes.Add(tmp);
            continue;
        }
        // 次の素数を求める
        primes.Add(Enumerable.Range(maxPrime, tmp - maxPrime)
            .First(s1 => !primes.Any(s2 => s1 % s2 == 0)));
    }
}
```

まだ最適化の余地は残っているとは思いますが、intの範囲内なら半秒もせずに算出してくれるので、許容範囲内かと。

###ちなみに

こんなのとか

```csharp
IEnumerable<long> LongRange(long startNum, long count)
{
    for (var i = startNum; i < startNum + count; i++)
        yield return i;
}
```

こんなの

```csharp
IEnumerable<BigInteger> BigRange(BigInteger startNum, BigInteger count)
{
    for (var i = startNum; i < startNum + count; i++)
        yield return i;
}
```

を作ってEnumerable.Range()とかデータ型を置き換えてやれば、intの範囲外でもばっちこいです。
※BigIntegerの場合はMath.Sqrt()に対応する関数が無いので、素数の自乗と残っている数値を比較してやる必要があります
PHP で作った Trello のクローン php-simple-kanban 更新内容まとめ

『Trello のクローンを PHP で作りました』
http://qiita.com/Web_akira/items/f4a56ccf350c5501a535
→　こちらに追加していくと見づらいので、履歴はこの記事でまとめます。

##【2017年1～4月】


### 追加した機能

- クッキーログインに対応しました。
- カードの検索機能を実装しました（最大100件まで表示）。
- 簡易的な画像表示機能を追加しました。
- 日本語/英語の切替に対応しました（英語版を追加しました）。


### 対応したバグ

- カードの移動/複製後、画面が崩れる現象を修正しました。
- Ajax でエラーになる際、アラートを表示するのではなく、タイムアウトを設定してモーダルで通知するようにしました。
- インストール（初期設定ファイルの修正）を行わずにダイレクトにアクセスされた場合、空のSQLiteが作成されるため、メッセージを出して回避するようにしました。


### 今回のふりかえり

個人的な用途で使う分には、ほぼ使いたい機能を盛り込むことができました。
あとファイル添付と、アラート機能をつけるか迷っています。

英語版は、海外の人から「ないの？」と issue を頂いたので、即効で実装いたしました。
Serverless Frameworkで、AWS Lambda function用に作られるCloudWatch Logsの期限を指定する


某所でServerless Frameworkが採用されており、コンソールでCloudWatch Logsをみると、`Never Expire`のlogsが沢山できていた。
これは真綿で首を絞めるような課金になるので、`serverless.yml`上で`logRetentionInDays`を設定するやり方を調べた。


```
$ sls --version
1.11.0
```

## 標準リソースの上書き機能を使う

そのまんまのサンプルが案内されていました。

[serverless/resources.md | serverless/serverless](https://github.com/serverless/serverless/blob/master/docs/providers/aws/guide/resources.md#override-aws-cloudformation-resource)


> You can override the specific CloudFormation resource to apply your own options. For example, if you want to set AWS::Logs::LogGroup retention time to 30 days, override it with above table's Name Template.


なるほど、標準でつくられるLogGroup(`/aws/lambda/{service_name}-{stage}-{function_name}`)の定義を上書きできるんだ。


上書き用名前指定の書式は、`{normalizedFunctionName}` + `LogGroup`となっている。

例えば次の例,function名を`main`としている場合、`MainLogGroup`に`RetentionInDays`を付与してあげればよい。

```serverless.yml
---
service: myservice

# ...

functions:
  main:
    handler: lambda_function.lambda_handler

```


```
resources:
  Resources:
    MainLogGroup:
      Properties:
        RetentionInDays: "30"
```

`--noDeploy(-n)`(1.12.x以降は`sls package`)でCFnテンプレートだけ作ってみると、ちゃんとそのようになっていることが確認できる。


```
  "Resources": {
    "MainLogGroup": {
      "Type": "AWS::Logs::LogGroup",
      "Properties": {
        "LogGroupName": "/aws/lambda/myservice-development-main",
        "RetentionInDays": "30"
      }
    },
```

function名に`-`や`_`が入っている場合、それぞれ予約文字列の`Dash`、`Underscore`を使えばよいとのこと。
名前自体が`Dash`だったりするケースは調べていません。


### 環境(stage)によって期限を変更したい場合

例えば`custom`属性を使って、stage名で引っ張ってくれば使い分けができますね。


```serverless.yml
custom:
  logRetentionInDays:
    development: "14"  # stage[development]は14日
    production: "90"   # stage[production]は90日
    default: "3"       # stageが見つからなかったらこれにfallbackするために設定

resources:
  Resources:
    MainLogGroup:
      Properties:
        RetentionInDays: ${self:custom.logRetentionInDays.${opt:stage, self:provider.stage}, self:custom.logRetentionInDays.default}
```

デフォルトにfallbackするかどうかはお好みかな。
Raspberry PIにPyCallをインストールしてRubyからGPIOのPython用ライブラリを使ってみる

# はじめに

長らく放置していたラズパイを使って何かしようと思ったけど、テーマが思いつきません...（汗）

しばらく考えてみた結果、先日から利用しているPyCallがどのくらい汎用的に使用できるか試してみようということで、ラズパイにPyCallを入れてスイッチのON/OFFを検出する回路を作ってRubyで動かしてみました。

［参考サイト］
[Raspberry Pi GPIO入出力のサンプル（Python, C言語, shellスクリプト）](http://netlog.jpn.org/r271-635/2013/01/raspberry_pi_gpio_test.html)

# PyCallのインストール

初期インストール直後にRuby2.1が入っていたので、これをそのまま利用します。
以下のコマンドでPyCallをインストール。

```sh:
$ sudo apt install -y ruby-dev
$ sudo gem install --pre pycall
```

# Python用のソースコードを確認

前述の参考サイトにて公開されているソースコードを見てみます。

```py:gpio_input.py
#!/usr/bin/python
 
import RPi.GPIO as GPIO
import time
 
IO_NO = 4
 
print("press ^C to exit program ...\n")
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(IO_NO, GPIO.IN)
 
try:
 while True:
  print(GPIO.input(IO_NO))
  time.sleep(1)
except KeyboardInterrupt:
 print("detect key interrupt\n")
 
GPIO.cleanup()
print("Program exit\n")
```

試しに実行してみると...

```:
$ python gpio_input.py
press ^C to exit program ...
1
1
1
0
0
1
1
1
0
1
1
^Cdetect key interrupt

Program exit
$
```

ボタンを押すと0になって、離すと1が表示されるようです。
とりあえず配線は間違っていないことがわかりました。

# PyCallを使って書き換え

サンプルコードをそのまま使うのでは少し味気ないので、ON/OFFした回数を数えながら表示するよう変更してみます。

```rb:gpio_input.rb
require 'pycall/import'
include PyCall::Import

pyimport 'RPi.GPIO', as: 'gpio'

io_no = 4

status = 1
buff = 1

cnt = 0

puts "press ^C to exit program ...\n"

gpio.setmode.(gpio.BCM)
gpio.setup.(io_no, gpio.IN)

# 「Ctrl」+「C」で停止させる
Signal.trap(:INT) do
  puts "detect key interrupt\n"
  gpio.cleanup.()
  puts "Program exit\n"
  exit 0
end

loop do
  status = gpio.input.(io_no)
  if buff != status
    if status == 1
      puts "OFF"
    else
      cnt += 1
      puts "ON(#{cnt})"
    end
  end
  
  buff = status
  sleep 0.5
end
```

ちなみに、Rubyでは大文字から始まる変数は定義できない（...と聞いたことがある）ので、小文字に変えて使っています。

# 動作確認

コマンドを実行し、ボタンを数回押してみる...

```:
$ ruby gpio_input.rb
press ^C to exit program ...
ON(1)
OFF
ON(2)
OFF
ON(3)
OFF
^Cdetect key interrupt

Program exit
$
```

できた(^-^)

[PI Piper](https://github.com/jwhitehorn/pi_piper)というGemを使えばRubyでも問題なくできるようなので、PyCall使う必要はないんですけどね...

さて、次は何しようかな。
他のプログラミング言語経験者がWordPressの開発にうつった時に理解しておきたい勘所


# はじめに

他言語での開発経験があるエンジニアが初めてWordPressを触るときの勘所

少し前になりますが、WordPressで開発されたWebサイトのテーマをリニューアルするお仕事をしました。
PHPやWordPressの開発経験はほぼ0でしたが、多少なりとも他言語での開発経験があったので、基本的なPHPの文法はすぐにキャッチアップできました。一方、フレームワークであるWordPressの方は、どくとく（？）な特徴（癖）を理解するまで少し時間がかかってしまいました。

初めてWordPressの開発をするときにどんなところを理解しておけばよいか、まとめてみます。

## この記事の目標

- 他言語で開発経験がある人が、はじめてWordPressを触るときの勘所をまとめる
- 読者が勘所を理解することで、僕のように変な実装をしないですむようになればいいな

## 想定読者

- C#/Java/Pythonなど、なんでもいいので、他の言語での開発経験はそれなりにある方
- WordPressはなんとなく知っているレベルの方（WordPress?ブログやるやつだよね、レベルの方）

※　まぁ当時の私ですね

# WordPressを触る上での基本的な勘所

* カスタム◯◯
* テンプレート階層
* フィルターとアクション（フック）
* WordPressループ

## カスタム◯◯

「WordPressをデフォルトのまま使う」場合はともかく、少しいじってくるとたいてい「カスタム◯◯」という言葉に出くわします。◯◯にはいる言葉も馴染みのないのでわかりにくいですが、よく使うので理解しておくと良いと思います。
次のテンプレート階層にも関連してきます。

post = 投稿・固定ページ等と思ってください

|名前|説明|
|--:|:--|
|カスタムタクソノミー|タクソノミーは、タグやカテゴリといった投稿を分類する概念です。カスタマイズすることで、自動車や花といった分類ができるようになります|
|カスタムフィールド|デフォルトでは、タグやカテゴリ、などしか記事に付随する情報はありません。カスタムフィールドを定義することで、記事に付随する情報を増やすことができます。|
|カスタム投稿タイプ|デフォルトでは、postは投稿と固定ページしかありません（※）。カスタム投稿タイプを定義することで、新しいpostを定義することができます。|

※話を簡単にするためにはっしょっています。正確には違います。

## テンプレート階層

WordPressはブラウザから渡ってきたURLを解析して、自動的に表示するPHPファイル（テンプレートファイル）を決定してくれます。

会社情報（/companyでアクセスする)といった固定ページがあった場合、
1. page-{slug}.php
2. page.php
3. index.php

という順番に自動的にページを探してくれます。

何が便利かというと、postとURLが決まれば勝手にファイルは決まるので、URLに応じて分岐処理を書く必要がなくなります。

## フィルターとアクション（フック）

WordPressのカスタマイズは、WordPressの機能を拡張していくことにほかなりません。
フィルターであれば、apply_filtersでフックされるポイントを定義しておき、add_filterで追加された関数を呼びだします（複数追加可能）。

概念図
![filter.png](https://qiita-image-store.s3.amazonaws.com/0/37873/37467780-7baa-4a68-ca8b-0b49eca59d01.png "filter.png")



プラグインを作成するうえで、WordPressのどの処理にフックをかけるかが重要なポイントになります。
一応日本語サイトもあるのですが、いかんせん翻訳されていないものや、情報が古いものがあります。ここはおとなしく英語サイトにいきましょう。

* アクション一覧：https://codex.wordpress.org/Plugin_API/Action_Reference
* フィルター一覧：https://codex.wordpress.org/Plugin_API/Filter_Reference

なお、フィルターとアクションは、返り値があるかないかです。

## WordPressループ

DBにアクセスし、データを取得するといった機能を実現する場合、何も考えないとDBへのコネクションをはって、DBからデータをとって、複数データがある場合はループして…といった処理を書きがちです。

```
var connection = new DBConnection();
var sql = "SELECT name FROM nanchara_db WHERE ...";
var persons = connection.exec(sql);

foreach(persons as person){
    // ...処理...
}
```
※なんかいろいろごっちゃですが、イメージとして捉えてもらえれば…

WordPressはフレームワークということも有り、DBへのアクセスを隠蔽してくれます。（こんな感じに）。
なれないと、これなにやっているねん？となります。が、よく使うので自然と覚えてくると思います。

```php
<?php 
if ( have_posts() ) {
	while ( have_posts() ) {
		the_post(); 
		//
		// 投稿がここに表示される
		//
	} // end while
} // end if
?>
```
参考：https://wpdocs.osdn.jp/%E3%83%AB%E3%83%BC%E3%83%97

# おわりに

WordPressがフレームワークということもあり、そのあたりの知識をキャッチアップできれば、だいぶ理解が進むと思います。
あとは、一度テーマやプラグインを開発してみるのが、理解の一番の近道かと

## 次にどんなことを学べばよいか？

勉強中であれですが、よりWordPressに突っ込んでいくのであれば次のようなことを学んで行けば良いのではないでしょうか。（順不同）

* WordPressのデータベース
* プラグイン開発
Rspecのcarrierwaveを実行した後のファイルを削除

##はじめに
毎回Rspecを実行した後画像は増えてきて困ることで、削除したい手順です。

###手順
1.Rspec実行してアップロードされた画像を異なるディレクトリに配置

```ruby:qiita.rb
class MyFileUploader < CarrierWave::Uploader::Base
def store_dir
  if Rails.env.test?
    "MyFile/#{Rails.env}/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  else
    "MyFile/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end
```
２.spec/rails_helperで下記のような、after(:all)でテストの最後に実行されます

```ruby:qiita.rb
config.after(:all) do
  if Rails.env.test? 
    FileUtils.rm_rf(Rails.root + "public/MyFile/#{Rails.env}/")
   end
end    
```

###参考資料
https://github.com/carrierwaveuploader/carrierwave/wiki
C# はじめました メモ #01

Twitterにだらだら書きそうだったのでちょっとまとめて。故あってMac環境なので、IDEにはRider-EAPを使ってます。やっててよかったJetBrains Toolbox！

# 1日目学習リスト

マルチスレッド前提の言語を初めてやるので小さな感動がたくさんあった日
チュートリアルでコンソールアプリケーションを作成
https://docs.microsoft.com/ja-jp/dotnet/articles/csharp/tutorials/console-teleprompter

## using ステートメント

厄介なストリーミングで受け取るデータのメモリ解放にぴったり。単にライブラリ読み込むだけじゃなかった！よかった。例外発生でもリソース開放とかいいね！

## IEnumerable<T> 列挙子

yield return ステートメントに対応した列挙要素…なにそれ。ActionScriptだったら(ry

## yield ステートメント

良きに計らってくれる非同期のお助けステートメント。こまめに値を返してヘッダを開放したい(このあたりFlash屋さんの考え方)ときはコレ。とは言え乱用注意だね。

## 定数は全部大文字のわけではない。
Environment.NewLineは改行の定数っぽい。

## Console.write/Console.writeLine
毎度改行するかでメソッドが別れるタイプの言語なのね

## Theading.Task は Delay設定してからWaitでまつ

phpなどでsleepとかそういうのをよく見てたので新鮮。Queryな考え方か。

## var は型なしというわけではない？

コンパイラを通したときに内部では確定する型なのでJavaScriptのようなパンドラの箱ではない様子

## staticなクラスを使うときはやはりstaticが必要

import気分でいたらそうではなかった。コレはしばらくぶりにC#書いたりすると間違いそう。

## lock

マルチスレッド前提らしい排他処理を約束してくれるステートメント。実感はまだないけどよく使いそう

# 1日目を通して

まずはセミコロンと{}最高。ない言語は滅んでしまえばいい(チラシの裏だからいいはず

今のところ、便利な言語というのに尽きる。他の言語でコレできたんだけどーより、こういうことが、幾つかの方法で提供されてて選んで使っていけるということが多い。

Riderは良かった！チュートリアルを進めるてるとそのコードの書き方はCoolじゃないね！とばかりゆるく指摘してくれるし、なによりサジェッションの表示に慣れてる自分には助かる。あと、若干VisualStudioよりシンプルで迷いにくいのもいいかも。

最終的な目的はHoloLensのUWP作れるために最低限理解する、かけるようになるなので、Riderは選択肢に入らないIDEなんだけどUnityと組み合わせたり、Macでチュートリアルを進めるには大変良さそう。

余裕がある日に続けていきたい