OmniAICreator/Qiita-1.07M huggingface dataset:
PHP オブジェクトでMVC的な考えを実装してみる。

ＭＶＣを利用したフレームワークの便利な所は人力で、プログラムの構成が理解しやすかったりする所ですが、オブジェクトを利用したプログラムにも同じようにＭＶＣ的なルールを取りいれたらどうだろうと思い、実装してみました。

それぞれ
- _Modelはモデルのみ（データのみ）
- _controlerはデータ処理のみ
- _viewは状況に応じてのアウトプットのみを担当させてみました。

-----


```Content.php

<?php


class Content_Model{

	protected $data;

	function __construct(){
		$this->data = array("アイテム１","アイテム２","アイテム３");
	}

}


class Content_Controler extends Content_Model{

	function get_count(){
		return count($this->data);
	}

	function get_list(){
		return $this->data;
	}

	function get_single($i){
		return $this->data[$i];
	}

}



class Content_View extends Content_Controler{

	function view($id1=0,$id2=0,$id3=0){

		switch ($id1) {

			case 0:

				echo "トップページ用　";
				print_r($this->get_count());
				break;

			case 1: //

				echo "リストページ用　";
				print_r($this->get_list());
				break;
			
			case 2; //

				echo "個別ページ用　";
				print_r($this->get_single($id2));
				break;


			case 3: //

				echo "認証ページ等　";

				if($id3==1){
				echo "○　ログイン中";
				}else{
				echo "Ｘ　ログインしてね";
				}

				break;

		}

	}

}




//ページ用
$page = array("top"=>"0","list"=>"1","single"=>"2","ninsyou"=>"3");



$content = new Content_View();



//トップページの場合
$content->view($page['top']);
echo "<hr><br>".PHP_EOL;

//リストページの場合
$content->view($page['list']);
echo "<hr><br>".PHP_EOL;

//個別ページの場合
$content->view($page['single'],2);
echo "<hr><br>".PHP_EOL;


//認証ページの場合 ログインしてない
$content->view($page['ninsyou'],2,0);
echo "<hr><br>".PHP_EOL;

//認証ページの場合 ログインしてる
$content->view($page['ninsyou'],2,1);
echo "<hr><br>".PHP_EOL;


```

[paiza.io でのサンプル](https://paiza.io/projects/e/-JuWVODsIfCwpxJ8BpRRJg?theme=twilight)

----

効率のいいプログラムにはならないですが、自分ルールの中でもわかりやすくプログラムが組めそうな感じです。

補足として
> 参照
> https://ja.wikipedia.org/wiki/Model_View_Controller

上記のＭＶＣのパターンを考えれば、コントローラーが出力用にデータを成型してるだけなので、入力処理の部分を別途classで実装（セキュリティも加味する）した方が、整理できてわかりやすいかもしれませんね。
後日、そのパターンも考えてみます。

Content_Controlerを
- Content_Input_Controler
- Content_Output_Controler
- に分けて継承してしまうとかですかね。
[メモ]サーバ起動時に自動で独自のプロセス起動させるには（chkconfig）

レンタルサーバをお借りしていると
たまに意図せずにサーバが落ちてしまうことがあるので
再起動した時に自動で独自のサービスを起動させるためのメモ

# chkconfig

chkconfigの設定が必要そう!

詳しい話は下記リンク参照
http://blog.jicoman.info/2014/04/centos_init_script/

# 自動起動するスクリプトを書く

テスト的に記載

**本来ならばコマンド失敗時にログを残すなどしないと!**

```
vi /etc/rc.d/init.d/syonet
```

``` /etc/rc.d/init.d/syonet

#!/bin/bash
# chkconfig: 345 99 1
# description: syonet
# processname: syonet

start(){
    if [ -e /root/.phpenv/versions/7.0.0/sbin/php-fpm ]; then
        nohup /root/.phpenv/versions/7.0.0/sbin/php-fpm &
    else
        echo "/root/.phpenv/versions/7.0.0/sbin/php-fpmがないよ!"
    fi

    if [ -e /root/http.conf ]; then
        nohup h2o -c /root/http.conf &
    else
        echo "h2oのコンフィグファイル/root/http.confがないよ!"
    fi

    if [ -e /root/c9sdk/server.js ] && [ -d /root/slack_rack_php ]; then
        nohup node /root/c9sdk/server.js -p 8080 -a XXX:XXX -w /root/slack_rack_php/ &
    else
        echo "cloud9をcloneした？syonetのcloneは?"
    fi

    return 0;
}
stop(){
    echo "not stop"
    return 0
}
Programming Phoenix 本のサンプルを 1.1.0 以降で動かす場合の修正点

[Programming Phoenix](https://pragprog.com/book/phoenix/programming-phoenix) は Phoenix 1.0 をベースにして書かれていますが、バージョン 1.1.0 で gettext 対応が入ったため、下記引用の部分はそのままだとエラーになって動きません（ネット上のいくつかのサンプルも、同様のロジックのものがありますね）。

原因と対策がわかるまで２〜３時間悩んだため、他の人が同じ罠を踏まないように共有しておきます。

```
 <%= if f.errors != [] do %>
    <div class="alert alert-danger">
      <p>
        Oops, somthing went wrong! Please check the errors below:
      </p>
      <ul>
        <%= for {attr, message} <- f.errors do %>
          <li>
            <%= humanize(attr) %> <%= message %>
          </li>
        <% end %>
      </ul>
    </div>
  <% end %>
```

モデルの changeset() で、

```
validate_length(:password, min: 10)
```

などのように min/max を指定していると、その field の errors の値は`{"should be at least %{count} character(s)", [count: 2]}`のような tuple として返ってきます。そのため、上記サンプルのように `<%= message %>` としてセットしようとすると、

```
no function clause matching in Phoenix.HTML.Safe.Tuple.to_iodata/1
```

というエラーが表示されて動きません。

[Phoenix 1.0.x to 1.1.0 upgrade instructions](https://gist.github.com/chrismccord/557ef22e2a03a7992624) によると、1.1.0 からは `web/views/error_helpers.ex` で translate_error というメソッドが追加されているため、下記のように message を translate_error に渡すことで、正常に表示されるようになります。

```
<%= for {attr, message} <- form.errors do %>
  <li><%= humanize(attr) %> <%= translate_error(message) %></li>
<% end %>
```
gettextをPHPで使用するサンプル

# 目的

gettextを使って、ロケールごとに文字列を翻訳するPHPサンプル

ロケールの設定を変えるとコード中の「greeting」という文字が
「こんにちは世界」、「HELLO WORLD」に翻訳されて出力される

**gettextとは**
https://ja.wikipedia.org/wiki/Gettext

# gettextのインストール

ここからよさ気な最新版を選びます
http://ftp.gnu.org/pub/gnu/gettext/

```shell-session
$ cd /usr/local/src
$ wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.6.tar.gz

$ tar zxvf gettext-0.19.6.tar.gz

$ cd gettext-0.19.6
$ ./configure

$ make
$ make install

$ gettext --help
$ gettext --version
gettext (GNU gettext-runtime) 0.19.6

```

完了。

# アプリケーションの作成

最終的にこんな感じになります

```
.
├── greeting.php
├── locale
│   ├── en_US
│   │   └── LC_MESSAGES
│   │       ├── messages.mo
│   │       └── messages.po
│   └── ja_JP
│       └── LC_MESSAGES
│           ├── messages.mo
│           └── messages.po
└── messages.po

```

## PHPスクリプト

```php:greeting.php
<?php

/* 後ほど切り替えてテストする */
$lang = "ja_JP.UTF-8";
//$lang = "en_US.UTF-8";

/* 翻訳ファイル名 */
$domain = "messages";

setlocale(LC_ALL, $lang);

/* 翻訳ファイルの置き場を指定 */
bindtextdomain($domain, "./locale/");

/* 翻訳ファイル名の指定 */
textdomain($domain);

/* _()はgettext()のエイリアス。これで囲む */
echo _("greeting");
```

## 翻訳用ベースファイルの生成(.po)

```shell-session
$ xgettext greeting.php
$ ls
greeting.php message.po
```
_()で囲まれた文字列を、翻訳箇所として抽出した message.po が生成される

```message.po
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-12-29 13:07+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: greeting.php:19
msgid "greeting"
msgstr ""

```

以下の部分のcharsetをCHARSETからutf-8に変えます
`"Content-Type: text/plain; charset=utf-8\n"`

## 翻訳

1. まずはディレクトリ作成とmessage.poのコピー

```shell-session
$ mkdir -p locale/ja_JP/LC_MESSAGES/
$ mkdir -p locale/en_US/LC_MESSAGES/

$ cp message.po locale/ja_JP/LC_MESSAGES/message.po
$ cp message.po locale/en_US/LC_MESSAGES/message.po
```

2. ./locale/【ロケール】/LC_MESSAGES/message.po の以下の部分に翻訳を記述する

```locale/ja_JP/LC_MESSAGES/message.po
msgid "greeting"
msgstr "こんにちは世界"
```

```locale/en_US/LC_MESSAGES/message.po
msgid "greeting"
msgstr "HELLO WORLD"
```

## 翻訳ファイルのコンパイル(.mo)

```shell-session
$ cd ./locale/【ロケール】/LC_MESSAGES/
$ msgfmt message.po
$ ls
message.po message.mo
```

## 実行

greeting.phpの `$lang` を変えて実行すると、ロケールの設定ごとに
異なる翻訳結果が出力されていることがわかる

```
$ php greeting.php

こんにちは世界
  あるいは、 
HELLO WORLD
```

# 参考とサンプル

ありがとうございました
http://el.jibun.atmarkit.co.jp/kaigaiengineer/2010/08/i18ngettextph-1.html
http://d.hatena.ne.jp/ao3/20080328/1206673266
http://qiita.com/tooooooooomy/items/9d20c81923f1d8cae75f

若干ファイル名が違いますが、ソースコードです
https://github.com/yotasasaki/gettext-sample
UE4 でログ出力を確認する

# 環境
UE 4.10.0
Visual Studio 2015

# 概要
Unreal Engine 4 を触ってみて動作を確認する
今回はログ出力の方法を確認

# 本文
## 準備
エディタの [ウィンドウ] -> [デベロッパーツール] -> [アウトプットログ] を選択し
ログの表示を有効化しておく

## 適当にログを出力してみる
適当なアクターを作成し Tick の中にログ出力を組み込んでみる
以下、そのままで動くサンプル

[コード]
void AMyActor::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );

    UE_LOG(LogTemp, Warning, TEXT("output : %s"), L"ログの内容");
}

[出力]
LogTemp:Warning: output : ログの内容

注意点は、ログの出力文字列を TEXT マクロで囲う事と、文字列を引数に取る場合で文字列
リテラルを指定する場合は L"～" にする事

## ログカテゴリ
UE_LOG マクロの第一引数の LogTemp はエンジンが定義しているデフォルトのログカテゴリで、
ログを出力する際にカテゴリが一緒に出力される。これによって、ゲーム実行時に記録したログ
からデータを抽出するのに役立てる。
UE4 では、このログカテゴリをユーザーが拡張できるようになっている。
拡張方法は、以下の 2 種類あるようだ

## 一つの cpp 内でのみログカテゴリを追加する場合
DEFINE_LOG_CATEGORY_STATIC マクロを使用して cpp にログカテゴリを追加する
STATIC の名前の通りヘッダではなく cpp に追加する事
他のプログラマが使う必要が無いローカルな定義をしたい場合や、他のプログラマに
使用して欲しくないカテゴリを定義したい場合などはこちらを使用する

[コード]
DEFINE_LOG_CATEGORY_STATIC(NewLogCategoryName, Warning, All);
void AMyActor::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );

    UE_LOG(NewLogCategoryName, Warning, TEXT("output : %s"), L"ログの内容");
}

[出力]
NewLogCategoryName:Warning: output : ログの内容


## 複数の cpp で共有するログカテゴリを追加する場合
1.DECLARE_LOG_CATEGORY_EXTERN マクロでヘッダに、ログカテゴリを宣言
2.DEFINE_LOG_CATEGORY マクロで cpp に、ログカテゴリを定義
こちらは、アプリケーション全体(でなくても良いが)で共有して使用したいログカテゴリを
追加する場合の手順となる

[ヘッダ]
DECLARE_LOG_CATEGORY_EXTERN(NewLogCategoryNameGlobal, Warning, All);

[コード]
DEFINE_LOG_CATEGORY(NewLogCategoryNameGlobal);

void AMyActor::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );

    UE_LOG(NewLogCategoryNameGlobal, Warning, TEXT("output : %s"), L"ログの内容");
}

[出力]
NewLogCategoryNameGlobal:Warning: output : ログの内容


## ログレベル
UE_LOG マクロの第二引数の Warning はエンジンが定義しているログレベル
OutputDevice.h のネームスペース ELogVerbosity 名前空間に定義されている列挙体で以下の
定義がある。
 
 enum Type
 {
     NoLogging,
     Fatal,
     Error,
     Warning,
     Display,
     Log,
     Verbose,
     VeryVerbose,
 };

致命的なエラーや、エラー、警告など、一般的なゲームライブラリやゲームエンジンにある
定義とほぼ同じものが用意されている。ログレベルによって、出力されるログのカラーが
異なるので、うまく使い分ければログが見やすくなる。

Error は赤、Warning は黄色、Display は灰色でログが出力される
また Fatal を指定すると、その時点でプログラムがクラッシュしてクラッシュレポートの
送信ダイアログが出てくるようだ。


## まとめ
UE4 では、ログカテゴリをユーザーが自由に拡張できるようになっている。
ローカル拡張も、グローバル拡張もどちらも可能なのでかなり柔軟にログ出力できるように
なっていて、かなり使い勝手が良い。
underscoreコードリーディング（rest）



underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##restとは



###[underscorejs.orgのrest](http://underscorejs.org/#rest)

こんな説明。
>####_.rest(array, [index]) Alias: tail, drop 
Returns the rest of the elements in an array. Pass an index to return the values of the array from that index onward.


```javascript
_.rest([5, 4, 3, 2, 1]);
=> [4, 3, 2, 1]
```

------------- 

配列の残りの要素を返す。
indexを渡した場合は、index以降の値を返します。


###[underscore.rest](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L477)

コードはこのあたり。


```javascript
 // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
  // Especially useful on the arguments object. Passing an **n** will return
  // the rest N values in the array.
  _.rest = _.tail = _.drop = function(array, n, guard) {
    return slice.call(array, n == null || guard ? 1 : n);
  };

```

_.tail,_.dropもエイリアスを張られている。
sliceを用いてarrayのn番目以降を返す。
Aurelia入門の軌跡

# はじめに

JavaScriptは昔少し触っただけなのですが、Webアプリが作りたくなり、Aureliaに手を出し始めました。
早速つまづき始めているので、その記録を含め、書いていきたいと思います。

前提として、この記事は以下のような人が以下のような環境で試しながら書いています。

* 人: C++、C#あたりは詳しいがJavaScriptは初心者。Haskellは好き
* OS: OS X El Capitan
* ブラウザ: Firefox 43.0.3

# なぜAureliaか

ちょっと作りたいアプリがあり、Webアプリが適しているだろうと思い、一発やってみるかと思い立つ。
何年前だったか、Webアプリフレームワークは幾つか触ってみたことがあるものの、時代は大きく変わっているらしい。
というわけで、今は何で作るのがナウいのか調べてみたところ、AngularJSやReact.jsなど最近よく目にする単語が並んでいました。
この辺りを使うのが良いのかな……などと考えていたところ、Aureliaの文字が。
そういえば、Web関係に詳しい知人がこれからはAurelia……かもしれないと語っていたような気が！
そのようなわけで、多分一番ナウいであろうAureliaを使ってみようということになったのです。

最近は世の中はMVVMなんです？
WPFでMVVMはやっていたので、なんとかなるかも！
と前向きになる。

# Getting Started!

http://aurelia.io/docs.html#/aurelia/framework/latest/doc/article/getting-started
に「Getting Started」があったので、ここから開始。
左側に自分が何者か選べるので、躊躇なく

> I am new to web dev or SPA

を選択。……SPA？？　あ、知ってる知ってる！　おじさん向けの週刊誌だよね。
ググってもそれしか出てこないし間違いない。
うん。読んだことないし、new to です。

次に、どの言語で書くか選んで「Kit」をダウンロードするらしい。
ES 2016 (ECMAScript 2016) かTypeScriptが選べるらしい。
正直どちらがいいのかわからないが、左側がオススメだろうということで、ES 2016を選択。
C++の世界ではC++11の対応が徐々に広まって、部分的に使えるかな？　というレベルなのに、2016なんて未来のものを使って良いのかたいへんに心配です。
ボタンをクリックするとアーカイブが落ちてくるので、適当なところに展開っと。

次は「server-side technology」を選べとな。
まずVisual Studio。うん。Macなのでないな。
次にNodeJS。おお聞いたことある。ただなんかサーバーをちゃんと用意するのも少し面倒そうだな……。
今回Webアプリは作りたいのですが、ブラウザ内で完結させればいいかと考えており、特にサーバーはいらないかなと思っているのです。
3つ目の選択肢はFirefox。楽そうなのでこれでいくか。
常日頃は充電を長持ちさせると噂のSafariを使っているのですが、SafariではHTTPを通さないと、Kit に入っていたindex.htmlが正しく表示されないことを確認しているので、残念ながらFirefoxをインストールしなければならないようです。
最近、大したものはインストールしていないはずのSSDの容量が心もとなくなってきたのですが、涙を飲んでFirefox 43.0.3をインストール。
使っていないChrome消そうかな…。

# 最初のつまづき

Getting Started を読みながら「Creating Your First Screen」「Adding Navigation」と進めていきます。
なんだか昔書いていたHTMLと別物になっている気が。
恐ろしい。HTMLは恐ろしい子だ。

ここで初めてのつまづきが。
なぜかブラウザの画面が真っ白のまま表示がされない。
どこか書き間違えたかな？　と思い、ドキュメントのコードをコピペしてみるが変化なし。
Webコンソールには

> TypeError: Unexpected anonymous AMD define

との表示が。
いろいろ試すものの変化なし。
諦めかけたその時、Googleの海の底で「開発ツールを閉じなよ」との声が聞こえる。
（残念ながら該当サイトは今探すと見当たらず）
開発ツールを一度「×」ボタンで閉じてページを再読み込みすると、難なく表示。
おお。よかった。

しかし、今同じように試してみても、上のエラーは再現せず……。
JavaScriptの世界にはまだわからないことがたくさんだ……。

#VimでHTMLとJS

少しずつ進めていますが、どうにもVimでHTMLやJSが書きづらい。
とりあえず

* http://www.vim.org/scripts/script.php?script_id=2075
* http://www.vim.org/scripts/script.php?script_id=3227

は入れてみたものの……。
うーむ。

続く。
karma(+webpack)+babel(es6)+power-assertで動かす


つまり、コード全体がes6で書かれていて、モジュール管理をwebpackで行っている場合に、ユニットテストでpower-assertをいい感じに使う方法です。ちなみにユニットテストはmochaです。

### モジュールのバージョン

| モジュール | バージョン |
|-------|---------|
| karma | 0.13.15 |
| webpack | 1.12.9 |
| babel | 6.3.21 |
| power-assert | 1.2.0 |
| babel-plugin-espower | 2.0.0 |

## 結論
[babel-plugin-espower](https://github.com/power-assert-js/babel-plugin-espower)で行けます。

## 経過と問題
最初はkarmaのpreprocessorである[karma-webpack](https://github.com/webpack/karma-webpack)と[webpack-espower-loader](https://github.com/power-assert-js/webpack-espower-loader)を併用して行おうとしていました。

```javascript
// karmaのプリプロセッサー設定(駄目な例)
{
  preprocessors: {
    "test/**/*.js": ["webpack", "espower"]
  }
}

```

```javascript
// karmaのwebpack設定(駄目な例)
{
  webpack: {
    module: {
      loaders: [
        {test: /\.js$/, exclude: /node_modules/, loader: "babel-loader"}
      ]
    }
  }
}
```

これでも実行は出来るのですが、2つ問題がありました。
1. karmaのdebugでsourcemapが正しく反映されない
2. karmaのwatchモードが必ず失敗する(`:ERROR [karma]: { [Error: no such file or directory]`とかのエラー)

そのため、都度再起動するのが結構手間でした。

## 対策


公式リファレンスを読みましょう。
[webpack-espower-loader#webpack-espower-loader-does-not-work-with-babel-loader](https://github.com/power-assert-js/webpack-espower-loader#webpack-espower-loader-does-not-work-with-babel-loader)というFAQに以下のように説明されています。

> webpack-espower-loader does not work with babel-loader due to the change of transpiled code since babel 5.0. Please use babel-plugin-espower with babel-loader.


まんまですね。

`babel-plugin-espower`をインストールして、`.babelrc`か`package.json`(babelの設定を管理しているほう)に、以下のように記述します(この例はpackage.json)。

```json
  "babel": {
    "presets": [
      "es2015"
    ],
    "plugins": [
      "babel-plugin-espower"
    ]
  },
```

karma側はwebpackのbabel-loaderに身をゆだねます。

```javascript
// karmaのプリプロセッサー設定
{
  preprocessors: {
    "test/**/*.js": ["webpack"]
  }
}

```

これで快適にテストをする事が出来ます。
混ぜるな禁止ということで。
「OpenCV-Python Tutorials」OpenCV3.1版のhtml版が読みたい


以下の内容は古くなっています。
docs.opencv.org/3.1.0/の[OpenCV-Python Tutorials](http://docs.opencv.org/3.1.0/d6/d00/tutorial_py_root.html#gsc.tab=0)
がアクセス可能になっています。

例題のスクリプトも
orb = cv2.ORB_create()
のようにOpenCV 3.1の実際のバインディングにそったスクリプトになっています。


直接、
http://docs.opencv.org/3.1.0/d6/d00/tutorial_py_root.html#gsc.tab=0
にアクセスしてください。


--------------------------------------------------------------------------
OpenCV3.1がリリースされた。

dandelionさんが
[OpenCV Change Logs（意訳）]
(https://github.com/atinfinity/lab/wiki/OpenCV-Change-Logs%EF%BC%88%E6%84%8F%E8%A8%B3%EF%BC%89#3.1)
を作成してくれています。

そのアーカイブを展開したときのディレクトリ
opencv\sources\doc\py_tutorials
に最新版のOpenCV-Python Tutorialsが含まれている。

従来紹介した記事のリンク、
http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html
のリンク先のhtmlは、3.0-betaのものであって、OpenCV3.1のものではない。
そのため、OpenCV-Python Tutorialsの著者が、修正した最新の内容を読むには、
opencv\sources\doc\py_tutorialsにあるmarkdownファイルをエディタで開いて
読むのがよい。

py_orb.markdown
を開いてみる。

winMerge()で対応するファイルをopencv3.0 と　opencv3.1とで比較してみる。
3.1の方では

```.py
# Initiate ORB detector
orb = cv2.ORB_create()
# find the keypoints with ORB
kp = orb.detect(img,None)
# compute the descriptors with ORB
kp, des = orb.compute(img, kp)
```
とチュートリアルにあるpythonのスクリプト、対応するリリースの実装とが一致するようにORBクラスの生成について修正されていることが確認できた。


付記：
OpenCVのOpenCV-Python Tutorialsドキュメントは、Sphinxなどを使ってmarkdownファイルから生成しているようです。
markdown -> rst -> html

[Markdownもはじめよう](http://www.slideshare.net/takahashim/sphinx-markdown?next_slideshow=1)slideShare　
このスライドは、markdownからrstに変換する方法を教えてくれている。

Sphinxドキュメント
http://docs.sphinx-users.jp/contents.html
Sphinxはrstファイルからhtmlを生成するツール


追記：
OpenCVのドキュメントは一連のCMakeからのビルドで作っているらしいが、今のところ自分でドキュメントを生成することには3.0でも3.1でも成功していない。3.0のwindows版でCMakeは成功するが、CMake でBUILD_DOCS をチェックして、[configure],[generate]には成功するが、どのようにしたらwindowsで上記のhtmlを生成できるのかがつかめていません。



OpenCVの最新の機能を使おうとする場合には、まだOpenCV-Pythonのバインディングが存在しないのでC++で使うこと。また、opencv_contrib をGitHubのレポジトリからもってきて、追加でビルドする(参考記事)。

OpenCV Change Logs（意訳）によると、
いろいろ興味あるアルゴリズムが実装されている。


###**参考記事：**
opencv_contrib をwindowsで利用するための手順が書かれている。
[1]: [「OpenCV 3.0がリリースされたので導入してみた」](http://qiita.com/SatoshiRobatoFujimoto/items/c65022a5a6bf845d219b)
DigitalOceanを使ったシンプルなサーバー構築

はじめてちゃんと使ったのでまとめてみます。

## 1. Dropletを作成
インスタンスのことをDigitalOceanではDropletと呼びます。
シンプルにこんな感じで。  

|image|size|region|
|:--:|:--:|:--:|
|Ubuntu|$5/mo|Singapore|


</br>
今回は大したものをアップしないため、一番小さいサイズで。
1時間1円弱くらい。安い！
これでDropletができました。

## 2. DigitalOceanのConsoleからログインする
[Droplets] → [Access] → [Console Access]
で、DropletのConsoleにアクセスできます。
ユーザー名とパスワードを迫られるので入力します。
</br>
※1 ユーザー名はDroplets作成時に指定したhostname
※2 パスワードは(SSHの設定をしてなければ)Droplets作成後にメールで送られてきます

ログインするとパスワード変更を迫られるので言われるがまま変更します。



## 3. Apache2をインストール
今回はApache2をまず入れました。
おなじみですが下記コマンド。
```
sudo apt-get install apache2
```

これでDropletのIPにアクセスして、インストールを確認します。


## 4. 公開鍵暗号方式でSSH接続できるように設定

すでにクライアント側で公開鍵と秘密鍵を生成していることを前提に、話を進めます。  
※ 公開鍵と秘密鍵の生成については下記も参照。
[公開鍵暗号を利用したSSH接続について](http://qiita.com/Y-Mukoyama/items/f20def019e25dc162ca8)

右上の歯車マークから、
Settings → Security → SSH keys の「Add SSH key」に入ります。

[Name] には、例えばMacbookairとかわかるような名前を。
[Public SSH key]には、クライアント側で準備してある公開鍵を貼り付けます。
で、Create SSH key ボタン。

これでDigitalOceanに公開鍵が渡されました。

## 5. ドメイン設定
DNS設定を行います。
上のタブ Networking → Domains → Add a Domain から、取得したドメインを入力し、そのドメインと紐付けたいDropletのIPアドレスを入力。
で、Create Record します。

サブドメインも登録したい場合は、Aレコードに追加。  

</br>
今回は以上のように基本的な設定を行いました。
railsで新しいプロジェクト作る時に、あとからbundle installするケース

# うまく動かない？！

先ほど投稿したやり方だと、なぜか rails generate が通らない

http://qiita.com/rojiuratech/items/db35abd15f366f9b4db0

```terminal:bash
$ rails g scaffold office name:string mode:integer address1:string address2:string address3:string

/Users/rojiuratech/.rbenv/versions/2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- bundler/setup (LoadError)
```

いろいろ検索したが「path周りがまずい」ようだったが解決に至らず。

# 他の方法を考えよう

1. 各railsプロジェクトで使うgemが、プロジェクトごとに管理されていればよい。
2. 別に、上記で取り上げたやり方でなくとも良い
3. この場合、rails new するときにbundleをスキップし、後で別途bundleすればよくね？

・・・こっちの方が例は多い

# bundleしないでrailsプロジェクトを新規作成

下記のような感じで、--skip-bundleとオプションを指定してやって新規プロジェクトを作成

```terminal:bash
$ rails new hello2 --skip-bundle
```

Gemfileも生成されますが、gemのインストールが行われないので早い（笑）

# あらためて、インストール先を指定してbundle

railsプロジェクトのディレクトリに移動し、インストール開始。

```terminal:bash
$ cd hello2
$ bundle install --path vendor/bundle
```

rakeやbundle以外のものはプロジェクト内のディレクトリに保存されます。

# 今度はgenerate可能

```terminal:bash
$ bundle exec rails generate scaffold home name:string

      invoke  active_record
      create    db/migrate/20151230045806_create_hoges.rb
      create    app/models/hoge.rb
      invoke    test_unit
      create      test/models/hoge_test.rb
      create      test/fixtures/hoges.yml
      invoke  resource_route
       route    resources :hoges
      invoke  scaffold_controller
      create    app/controllers/hoges_controller.rb
      invoke    erb
      create      app/views/hoges
      create      app/views/hoges/index.html.erb
      create      app/views/hoges/edit.html.erb
      create      app/views/hoges/show.html.erb
      create      app/views/hoges/new.html.erb
      create      app/views/hoges/_form.html.erb
      invoke    test_unit
      create      test/controllers/hoges_controller_test.rb
      invoke    helper
      create      app/helpers/hoges_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/hoges/index.json.jbuilder
      create      app/views/hoges/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/hoges.coffee
      invoke    scss
      create      app/assets/stylesheets/hoges.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss
```

できたー。
OcamlとUnisonのインストール on OS X EL Capitan

私は、研究でServer computerとLocal computer間、ソースの同期をとるのに、scp commandではなく、
unisonというソフトを良く使っている。Unisonを使うことで、同期必要な複数のファイルをいちいちscpで
送らなくても、command一行で同期できる。

- 例： unison projectname

ただ、Unisonには、妙な規則がある。
1.同じバージョンのunison同士でないと、同期できない
2.インストール時、同じバージョンのocamlでコンパイルしないと、同期できない

なので、macのpackage manager - homebrewで簡単にインストールできるが、serverに対応unisonが
インストールされていない時、手動でインストールする必要がある。

今回は、unison 2.40.128(旧version)が必要なので、やってみた内容をポスティングする。

**Ocamlのインストールと設定**
Serverの方に、最新バージョンのOcaml(4.02.3)が入っていたので、

[Ocaml Download](http://caml.inria.fr/ocaml/release.en.html)

上のページからダウンロードしようとしたら、binaryの提供はしていなく、OPAMという
新たなpackage managerが必要らしい。

![Screen Shot 2015-12-30 at 2.53.44 PM.png](https://qiita-image-store.s3.amazonaws.com/0/77744/9b36652f-51b5-a0bf-1eaf-b041898ffb20.png)

そこで、以下のような文章を見つけので、Ocamlbrewを通して、opamとocamlを簡単にインストールすることにした。

[CentOS 6.4 に OCaml と OPAM をインストールするなら ocamlbrew を使おう](http://diary.overlasting.net/2013-11-22-1.html)

ただ、上のブログでは、設定方法が書いていないが、.bashrcファイルに以下の内容を入れる必要がある。

'source $HOME/ocamlbrew/ocaml-4.02.3/etc/ocamlbrew.bashrc'

**Unisonのインストールと設定**
Ocamlのインストール後、unisonの方は簡単で、

`make UISTYLE=text`

でコンパイルし、

`ln unison /usr/local/bin`

でリンクさせるだけで、使える。

#追記　2017/07/06
僕が間違っていました。unison各バージョンをコンパイルできるOCamlバージョンが決められていることを言おうとしていました。

例えば、
　　　![スクリーンショット 2017-07-06 9.43.18.png](https://qiita-image-store.s3.amazonaws.com/0/77744/ebe6d33a-2bd4-17e9-cd26-413d53372f3b.png)

このようにunison 2.48.4は　OCaml 4.03.0以下でないとコンパイルできないとか。
cocos2d-x 3.xでglScissorを使う

```cpp
// .h

class ScissorLayer : public cocos2d::Layer
{
public:

    virtual void visit(
        cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t flags) override;

private:

    cocos2d::CustomCommand _beforeVisitCmdScissor, _afterVisitCmdScissor;
};
```

```cpp
// .cpp

void ScissorLayer::visit(cocos2d::Renderer* renderer, const cocos2d::Mat4& transform, uint32_t flags)
{
    // シザー開始
    _beforeVisitCmdScissor.init(_globalZOrder);
    _beforeVisitCmdScissor.func = [this](){
        glEnable(GL_SCISSOR_TEST);

        const cocos2d::Rect clippingRect(
            convertToWorldSpace(cocos2d::Vec2::ZERO), getContentSize());

        _director->getOpenGLView()->setScissorInPoints(
            clippingRect.origin.x, clippingRect.origin.y,
            clippingRect.size.width, clippingRect.size.height
        );
    };
    renderer->addCommand(&_beforeVisitCmdScissor);

    // シーングラフ処理
    cocos2d::Layer::visit(renderer, transform, flags);

    // シザー終了
    _afterVisitCmdScissor.init(_globalZOrder);
    _afterVisitCmdScissor.func = [](){ glDisable(GL_SCISSOR_TEST); };
    renderer->addCommand(&_afterVisitCmdScissor);
}
```
Dで作ったプログラムをOSXのアプリケーションにする

D+GLFW3のプログラムをアプリケーションバンドルにしようとしたらハマったのでメモ。

まずこういう構成でバンドルを作る。

```
Application.app
 \_Contents
   \_Info.plist
   \_MacOS
     \_実行ファイル
   \_Resources
     \_dylibとか
     \_その他リソース
```

それで起動すると一瞬で落ちる。どうやらdylibが読み込めてないらしい。[これ](http://qiita.com/h12o/items/1410707dd9e7135d207a)によると通常の方法でアプリケーションを起動するとカレントワーキングディレクトリが`/`になってしまうらしい。このせいでdylibやリソースなどの読み込みがうまくいっていなかった。そこで、プログラム中で`chdir`してやる。

```diff
import std.path : dirName;
import std.file : chdir;
void main(string[] args) {
  chdir(args[0].dirName.dirName ~ "/Resources");

  ...
}
```

これで一応動いたから良しとする。条件コンパイルを使えばマルチプラットフォームでも対応できる。

```
void main(string[] args) {
  version (OSX) {
    chdir(args[0].dirName.dirName ~ "/Resources");
  }

  ...
}
```

#余談

GLFW3ではOSXのアプリケーションバンドルから起動されている時`glfwInit`内で[カレントワーキングディレクトリを`Resources`にする](http://stackoverflow.com/questions/17001488/osx-bundle-throwing-exception-only-when-app-in-macos-folder-and-resources-in-res)らしい。でもDerelictGLFW3を使うときはdylibの読み込み時に`chdir`しないといけないので意味がなかった。
最初のセンサ > v0.2 > リミッタ回路 / サーメットトリマ(5k)使用 / AD取込外付け

http://qiita.com/7of9/items/12ea577a999dab3b996e
で試用したフォトトランジスタに関して、以下の変更を行った。

1. リミッタ回路追加
  - 赤外LEDを相対する方向に実装 > VF以上電圧が立たないように
2. 1.1kのI-V変換用抵抗を5kのサーメットトリマに変更
3. AD入力を基板実装から外付けに変更

サーメットトリマ関連 http://qiita.com/7of9/items/b21920ce635f3f50214d
リミッタ回路関連 http://qiita.com/7of9/items/7c031af2f629f288bf66


## 写真

撮影用に固定するため紙の上に貼っている。このまま使用するわけではない。　

1. ESP-8266実装基板
2. リミッタ回路基板
3. フォトトランジスタ回路基板

![DSC_0041.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/08fdcccf-d695-7b69-0162-0132e3a3da1b.jpeg)


## 補足

- ケーブルの色
  - 赤 : Vcc
  - 青 : TOUT
  - 黒 : GND

- リミッタ回路基板にチェックピンを追加。TOUT電圧確認用 

- リミッタ回路を分けた理由
  - 赤外LEDの点灯が影響をAD取込に与えないよう (波長がかぶるのか、応答関数がよくわかってない)
  - 今後、別のAD取込をしたい時にリミッタ回路を使い回すため

サーメットトリマのシャフトを調整することで、感度の変更を行うことができるようになった。
一方で、リミッタ回路を入れたことで、上限を抑えるとができている。

上限が1.049V程度になっているのが微妙かもしれない。抵抗分圧でさらに上限を制限して1.0V以下にすることが必要かもしれない。


## 失敗
別基板で実装を進めていたが、通信が安定しなかったため途中で諦めた。

ICB-288という片面実装基板で実装したが、115200bps通信の文字化けが発生しプログラムを書き込めなかった。
AWG24のケーブルをAWG28に変更したり、GND面を増やすなりしてノイズ対策を行い、文字化けの頻度は減らすことができたが、完全にはなくせなかった。
カウンタキャッシュまとめ

## 参考
* [ruby on rails - counter_cache with has_many :through - Stack Overflow](http://stackoverflow.com/questions/5256897/counter-cache-with-has-many-through)

* [カウンタキャッシュで集計を速くする - komagataのブログ](http://docs.komagata.org/4855)

> counter_cacheはfooのcreateとdestroyのコールバックとして数を増減するというだけの動作なので、後付けする場合はupdate_countersメソッドで集計し直してやる必要がある。
Vagrant,chef-soloでRails開発環境の構築

# はじめに
以下を参考
http://murayama.hatenablog.com/entry/2014/10/15/073819
翻訳サイトではありますが、vagrantとは的なところから丁寧に説明してくれています。

githubのurl名指しでとってきてるcookbookをchefが参照できなかったり、cookbook自体が非推奨になってたり、railsのaoutloadが効かなかったりしたので、少し変えてあります。

# 1. 各種インストール

```
$ brew cask install vagrant
$ brew cask install virtualbox
$ vagrant plugin install vagrant-vbguest
$ vagrant plugin install vagrant-librarian-chef
```

# 2. 使うcookbookをCheffileに定義
そして自分のrailsプロジェクトrootにて、
Cheffileを作ります。

```
$ vi Cheffile
```
で

```filename:Cheffile
site "http://community.opscode.com/api/v1"

cookbook 'apt'
cookbook 'build-essential'
cookbook 'mysql', '5.5'
cookbook 'ruby_build'
cookbook 'nodejs'
cookbook 'ruby_rbenv'
cookbook 'vim'
cookbook 'timezone_lwrp'
```
と書きます。

mysqlのバージョンは以下を参考に、欲しいOSに適したバージョンにするといいと思います。
https://supermarket.chef.io/cookbooks/mysql

# 3. vagrantファイル用意
続いて、自分のrailsプロジェクトrootにて、

```
$ vagrant init
```
とするとVagrantfileが出来上がります。
それ以下のように編集します。

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

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # 欲しいOSを探して指定するといいと思う。
  # https://atlas.hashicorp.com/boxes/search
  config.vm.box = "ubuntu/precise64"

  # virtual boxの設定
  config.vm.provider :virtualbox do |vb|

    # メモリとかcpuとか指定できる
    # http://www.virtualbox.org/manual/ch08.html#vboxmanage-modifyvm
    vb.customize [
      "modifyvm", :id,
      "--memory", "2048"]

    # VMのシステム時刻がずれていく問題の対応
    vb.customize [
      "setextradata", :id,
      "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled", 0]
  end

  # nfs経由で接続
  # うまくいかない場合はホスト側の /sbin へのpathを通してあげる
  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.network :forwarded_port, guest: 3000, host: 3000
  config.vm.synced_folder ".", "/vagrant", type: "nfs"

  # 仮想環境がhostの秘密キーを使えるようになる
  config.ssh.forward_agent = true

  # Chef Solo の設定
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["cookbooks", "site-cookbooks"]

    # 使うrecipe
    chef.add_recipe "apt"
    chef.add_recipe "nodejs"
    chef.add_recipe "ruby_build"
    chef.add_recipe "ruby_rbenv::system"
    chef.add_recipe "ruby_rbenv::user"
    chef.add_recipe "vim"
    chef.add_recipe "mysql::client"
    chef.add_recipe "timezone_lwrp"

    # recipeのnodeに渡したいことをここに書く
    chef.json = {
      rbenv: {
        user_installs: [{
          user: 'vagrant',
          rubies: ["2.0.0-p195"],
          global: "2.0.0-p195",
          gems: {
            "2.0.0-p195" => [
              { name: "bundler" }
            ]
          }
        }]
      },
      tz: "Asia/Tokyo"
    }
  end
end
```

# 4. vagrant実行
vagrant実行

```
$ vagrant up
```
中に入る

```
$ vagrant ssh
```
/vagrant にrailsプロジェクトの一式が入っているかと思います。
bundle install とか rails s をよしなに実行していただければ。
便利なtldrコマンド

tldrコマンドをMacにインストールしてみました。

tldrはmanコマンドを補完するもので、[このプロジェクトのGithubにある説明書き](https://github.com/tldr-pages/tldr)によりますと、tldrとはTL;DRと書き、"Too Long; Didn't Read"という意味だそうで、つまりは「長すぎたんで読まなかった」ということです。manのドキュメントは詳細に書いてあるものが多いですが、言われてみれば説明が冗長すぎて読むのがちょっとしんどいですね。。。基本的な使い方であればまずtldrで調べてみて、それでも不足であればmanを参照するといった使い方がいいのではと思いました。

インストールしてみます。

```bash
brew tap tldr-pages/tldr
brew install tldr
```

試しにgrepコマンドで。

```bash
$ tldr grep
 Matches patterns in input text
 Supports simple patterns and regular expressions

 search for an exact string
grep something file_path

 search recursively in current directory for an exact string
grep -r something .

 use a regex
grep -e ^regex$ file_path

 see 3 lines of context
grep -C 3 something file_path

 print the count of matches instead of the matching text
grep -c something file_path

 use the standard input instead of a file
cat file_path | grep something

 invert match for excluding specific strings
grep -v something
```

おー、わかりやすい。
mongoDB v3 圧縮データの find()

*mongoDB v3 でストレージエンジンでのデータ圧縮がサポートされているが、このデータを読み込む時のメモリの使用量に違いがあるかどうかを確認した。*


## 確認方法

mongoDB に 1,000,000/2,000,000/4,000,000 件のデータを登録して、その全データを find() により取得する。

スクリプト実行中に、
・vmstat 1 2
・mongostat 1 -n 2
を 1 秒 sleep で実行し、find() 開始前後のメモリ使用量を比較する。


``` lang:find.js
DBQuery.shellBatchSize=2000000000
db.test.find({})
```

``` lang:実行
shell> mongo test1 < find.js > /dev/null
```


## 結果

ストレージ上は圧縮されるが、メモリに展開されたときには、ローデータが乗っているよう。
Percona server for mongoDB でも試してみたが、同じ結果が得られた。

### mongoV3 + 圧縮none

> show dbs
test1  0.323GB  <-  1,000,000 件
test2  0.646GB  <-  2,000,000 件
test3  1.293GB  <-  4,000,000 件

|| 1,000,000 | 2,000,000 | 4,000,000 |
|---|---|---|---|
| vsize | 336M | 669M | 1,254M |
| res | 336M | 670M | 1,341B |

### mongoV3 + snappy (cacheSizeは大きめに設定)

> show dbs
test1  0.048GB
test2  0.096GB
test3  0.190GB

|| 1,000,000 | 2,000,000 | 4,000,000 |
|---|---|---|---|
| vsize | 309M | 668M | 1,254M |
| res | 316M | 669M | 1,341M |


### Percona server for mongoDB

> show dbs
test1  0.016GB
test2  0.031GB
test3  0.047GB

|| 1,000,000 | 2,000,000 | 4,000,000 |
|---|---|---|---|
| vsize | 398M | 898M | 1,698M |
| res | 340M | 682M | 1,310M |
[Swift]永続性シングルトンで全体設定モデルを作ってみた。

永続性のあるシングルトンを作ってみた。
下記のサンプルでは全体設定の為に書いた部分を取って出したので、必要に応じて変数代入時等好きなタイミングでsave()を呼ぶといいと思う。


```swift
class GlobalConfig:NSObject,NSCoding {
    static let instace = GlobalConfig.instance()
    //configs-start
    var word = "default value"
    //configs-end
    init?(coder aDecoder: NSCoder) {
        super.init()
        word ?= aDecoder.decodeObjectForKey("word") as? String
    }
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(word, forKey: "word")
    }
    func save(){
        let ud = NSUserDefaults.standardUserDefaults()
        let data = NSKeyedArchiver.archivedDataWithRootObject(self)
        ud.setObject(data, forKey: "config")
    }
    private class func instance()->GlobalConfig{
        let ud = NSUserDefaults.standardUserDefaults()
        if let data = ud.objectForKey("config") as? NSData {
            do {
                let gc = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? GlobalConfig
                return gc ?? GlobalConfig()
            }catch{
                return GlobalConfig()
            }
        }
        return GlobalConfig()
    }
}

//オペレータの追加
infix operator ?= {}

func ?= <T> (inout lhs: T, rhs: T?) -> Void {
    if let rhs = rhs {
        lhs = rhs
    }
}
```

#?=
nilの時は代入しないというもの。これによって、`var word = "default value"`となっている部分がデフォルト値として使える
rubyでいう||=

#static let instace = GlobalConfig.instance()
これでGlobalConfig.instaceでシングルトンアクセス出来る。

#private class func instance()->GlobalConfig
上記のinstaceで読んでいた部分。
データが無い場合や不整合な場合は初期化したものを返す。
逆に保存されているデータは復元して返す。
先ほどの?=のおかげでアップデートで管理する変数を増やしてもデフォルト値が返る。

#save()
保存するときに呼ぶ。
Oracleのセッションにおいてオープンしているカーソル数を調べる

# 概要

アプリケーションからOracle（というかDB全般）に接続する際に、使用後にきちんとクローズしてあげないと開いたままのカーソル数が蓄積されていってしまいます。
その後、設定上限に達すると、「ORA-01000: maximum open cursors exceeded」エラーが発生します。
対処方法は「きちんとクローズする」ことですが、「オープンしたカーソル数が増減しているかどうかを調べたい」という機会があったので、調べ方をメモしておきます。

### 使用環境

Oracle : 12.1c Standard One Edition
OS : CentOS 6.6

## SQL

SID毎のオープンカーソル数の設定上限と、現在オープンしているカーソル数は、
以下のSQLによって取得できます。

```

-- 設定上限
select value from v$parameter where name ='open_cursors';

-- SIDごとの現在オープンしているカーソル数
select 
  sid, 
  statistic#, 
  value
from v$sesstat
where statistic# = 5 
  and sid in (select sid from v$session where username ='hoge')
;

```

### SID

調査対象のアプリケーションのsid(Session ID)は、v$session表からusernameなどを使用して特定してください。

### STATISTIC\#, VALUE

V\$SESSTAT表は、ユーザー・セッションについての統計情報を示し、
V\$STATNAME表は、V\$SESSTAT表およびV\$SYSSTAT表で表示される統計情報のデコードされた統計名を示す、
のだそうです。（Oracleリファレンスより）

オープンしているカーソル数の定義は、V\$STATNAME表にて以下のように定義されています。

- statistic\# = 5
- name = 'opened cursors current'

どなたかのお役に立てば幸いです。ではでは。

## 参考ページ

- [Oracle® Databaseリファレンス - V$SESSTAT](https://docs.oracle.com/cd/E16338_01/server.112/b56311/dynviews_3028.htm#i1416128)
- [Oracle® Databaseリファレンス - V$SATNAME](https://docs.oracle.com/cd/E16338_01/server.112/b56311/dynviews_3076.htm)
- [スレッド: ORA-01000のカーソル数とは?](http://otn.oracle.co.jp/forum/message.jspa?messageID=8070365)
Unityでスコアなどのデータを保存する方法(PlayerPrefsのまとめ)

## 使用例
```sample.cs
//データ入力
PlayerPrefs.SetInt("StageLevel",10);
//データ取得
int stagelevel = PlayerPrefs.GetInt("StageLevel");
```
## データの設定と取得(float型)
- キーに対する値を設定する  
  PlayerPrefs.SetFloat(string key, float value);
- キーに対する値を取得する  
  PlayerPrefs.GetFloat(string key, float defaultValue = 0.0F);  
キーが存在する場合は値を取得する  
存在しない場合は defaultValue を返します。

## データの設定と取得(int型)
- キーに対する値を設定する  
  PlayerPrefs.SetInt(string key, int value);
- キーに対する値を取得する  
  PlayerPrefs.GetInt(string key, int defaultValue = 0);  
キーが存在する場合は値を取得します  
存在しない場合は defaultValue を返します。

## データの設定と取得(string型)
- キーに対する値を設定する  
  PlayerPrefs.SetString(string key, string value);
- キーに対する値を取得する  
  PlayerPrefs.GetString(string key, string defaultValue = "");  
キーが存在する場合は値を取得する  
存在しない場合は defaultValue を返します。

## データが存在するかどうか
PlayerPrefs.HasKey
public static bool HasKey(string key);

## データ削除
- すべてのキーと値を削除します。注意してください  
PlayerPrefs.DeleteAll
- キーと対応する値を削除  
PlayerPrefs.DeleteKey(string key);

## おすすめアセット
視覚的にPlayerPrefsの情報を確認することができる
https://www.assetstore.unity3d.com/jp/#!/content/7070

## 公式リファレンス
http://docs.unity3d.com/ja/current/ScriptReference/PlayerPrefs.html
2015年のJavaScript開発者アンケートまとめ

いろんな所でJavaScript関係のアンケートがあったのでそのまとめ

## [JavaScript Developer Survey Results](https://ponyfoo.com/articles/javascript-developer-survey-results "JavaScript Developer Survey Results")

- 公開: 2015年12月
- JavaScript開発者アンケート
- ベースは[ブログ](https://ponyfoo.com/articles/javascript-developer-survey)


## [TypeScript Developer Survey Results - TypeScript - Site Home - MSDN Blogs](http://blogs.msdn.com/b/typescript/archive/2015/02/02/typescript-developer-survey-results.aspx "TypeScript Developer Survey Results - TypeScript - Site Home - MSDN Blogs")

- 公開: 2015年1月
- TypeScriptに関するアンケート
- ベースは[ブログ](http://blogs.msdn.com/b/typescript/archive/2015/01/21/typescript-developer-survey.aspx)

## [Angular 2 Survey Results](http://angularjs.blogspot.co.uk/2015/09/angular-2-survey-results.html "Angular 2 Survey Results")

> 質問項目: https://docs.google.com/forms/d/1BSHEMqR-1fkG0_edLiOQql7nbNT7Z8aHVxMJok1ljgo/viewform

- 公開: 2015年9月
- Angular2に関するアンケート
- ベースは不明

## [React Developer Survey Results - AngularClass](https://angularclass.com/react-developer-survey-results/ "React Developer Survey Results - AngularClass")

> 質問項目: https://docs.google.com/forms/d/1bh1RrIJJRG4NIfbFMivF5n9LdcazG8fgcoxH5A460tU/viewform?c=0&w=1

- 公開: 2015年12月
- Reactに関するアンケート
- ベースは[不明](https://www.reddit.com/r/reactjs/comments/3im5ch/react_developer_survey_what_do_they_know_do_they/)

## [2015-07-06のJS: React v0.14 Beta 1、Firefox 39、ES6アンケート結果 - JSer.info](http://jser.info/2015/07/06/react-0.14-firefox39-es6/ "2015-07-06のJS: React v0.14 Beta 1、Firefox 39、ES6アンケート結果 - JSer.info")

> 質問項目: https://azu.typeform.com/report/AGW5qu/T5WV

- 公開: 2015年7月
- ES6についてのアンケート
- ベースは[ブログ](http://jser.info/2015/06/30/ember-data-survey/)

## [JavaScript Scene Tech Survey Results — JavaScript Scene — Medium](https://medium.com/javascript-scene/javascript-scene-tech-survey-d2449a529ed#.91yi03xrr "JavaScript Scene Tech Survey Results — JavaScript Scene — Medium")

- 公開: 2015年6月
- JavaScript開発者アンケート
- ベースはSNS

------

生データ(CSV)とかは公開されてないのが殆どっぽい
スマホアプリをPCへー「Nox App Player」まとめ

![NoxAppPlayer(600x320).jpg](https://qiita-image-store.s3.amazonaws.com/0/98372/4e590944-5194-ad74-cc9a-51169485c11a.jpeg)

Nox App Playerは、モバイルゲームやアプリをPCで楽しめる新しいAndroidエミュレータです。カスタム仮想マシン上に作られ、Android 4.4.2カーネルで開発されており、X86とAMDプロセッサーの両方と互換性があります。旧式のWin XP SP3から最新のWindows 10までのWindowsシステムで安定かつスムーズに動作できます。

機能まとめ：http://noxappplayerjp.hatenablog.com/entry/2015/12/28/171339 

「Nox App Player」 - ビデオレコーディング機能

「Nox App Player」 - 画面サイズ設定

「Nox App Player」 - コマンドプロンプト

「Nox App Player」 - スクリプトレコーディング機能

「Nox App Player」 - データバックアップ/復元機能

「Nox App Player」 - インストール/アンインストール方法

「Nox App Player」 - マルチ・スクリーン・タッチ機能

「Nox App Player」 - PCとのファイル共有方法

「Nox App Player」 - 使い方

「Nox App Player」 - マルチ・ウィンドウ・モード

「Nox App Player」 - Android Appsをインストール

Nox App PlayerはGoogle Playストアをプリロードしたので、容易にアプリをダウンロードしてPCにインストールできます。キーボード入力、カメラ、マイクの内蔵が基本機能になっています。Nox App Playerが他のエミュレーターと異なるのは、ゲームで使用するゲームパッドやコントローラーが接続できる点です。アクション・ロールプレーゲーム（ARPG）では、ユーザーは従来のWASDキーを使って、自分のキャラクターを操作し、他のキーをスキルの獲得や射撃用に振り分けることも可能です。

![Keyboard Control .png](https://qiita-image-store.s3.amazonaws.com/0/98372/fe1162de-966a-c10d-75d9-a25f989f1a56.png)
(仮想キーで操作)

また別の革新的機能としてはマルチプレーヤー・モードがあり、同時に複数のNox App Playerウインドーを作動させることができます。それぞれのウインドーは異なるアプリ／ゲームを作動させることができます。同じコンピュータースクリーン上で、ウインドーを簡単に切り替えることもできます。この機能を持つデスクトップ・ショートカットがあり、数回のクリックで次のプレーヤーが起動します。ホストとなるコンピューターの設定と性能によって、複数のインスタンスを並行して動作させることも可能になりました。

![Multiply Instance.jpg](https://qiita-image-store.s3.amazonaws.com/0/98372/dd3f0167-d01f-9c63-cd58-4311c005183e.jpeg)
（マルチウィンドウモード）

Nox App Playerはシステムとして日本語、英語、中国語、韓国語の4言語をサポートしています。ソフトウエアは自動的にユーザーのキーボードに接続し、PCのキーボードでNoxに日本語を直接打ち込むことができます。Google Playerストアから入力アプリをダウンロードして入力してもいいです。ユーザーはまた、ソフトウエアに割り当てるCPUとRAMをカスタム化することもできます。画面はマウスをドラグしたり調整したりすることでサイズ変更可能で、システム設定で好みの解像度にカスタマイズすることもできます。

またNox App Playerはデータのバックアップと復元機能があります。エミュレーターに大容量で重要なデータを扱うならば、この機能によって定期的にバックアップし、データが安全に保護できます。さらに注目すべきことは、NoxがAndroidデベロッパーにとって素晴らしいテストツールでもあることです。ルートモードにすることで、デベロッパーは簡単にアプリを展開し、それがテストできます。
Nox App Playerは完全に無料です。あなたは推奨のアプリをインストールしたり、フル機能を使うための月額料金を支払う必要はありません。

公式サイト：
http://www.bignox.com/jp

他のBlogやニュース掲載からの紹介:

Vector
http://www.vector.co.jp/magazine/softnews/151208/n1512081.html?ref=top 

共同通信
https://prw.kyodonews.jp/opn/release/201510274974/ 

Nelog
http://nelog.jp/nox-app-player 

いろいろメモ
http://etc.miscmemo.com/digital/post-4914/ 
http://etc.miscmemo.com/digital/post-4956/
Swiftでコールバックをオプショナルにしたときのメモ。



２つのパターンをただのメモとして書いておきます。

```swift
func hoge((callback: (String) -> Void)?) {
	let str = "piyo"
	
	callback?(str)
}
```


```swift
func hoge((callback: (String) -> Void)?) {
	let str = "piyo"
	
	if let c = callback {
		c(str)
	}
}
```

このように書いておけば、callbackがnilのとき何も処理をしないでいてくれる。
リバースプロシキ上でのbasic認証にハマったこと

リバースプロシキでURLの転送をしている場合、basic認証がうまくかからないので
その解決方法を書いていきます。

```
<VirtualHost *:80>
   ServerName example.com
   DocumentRoot "/var/www/html"
   ProxyPass / http://localhost:8800/
   ProxyPassReverse / http://localhost:8800/
   <Directory "/var/www/html">
     Allow from all
     AuthType Basic
     AuthUserFile "/var/www/html/.htpasswd"
     AuthName "MY_HP"
     Require valid-user
   </Directory>
</VirtualHost>
```

いつものように設定してもかかりませんでした。

いろいろ調べたところリバースプロシキとbasic認証の併用時に注意しなければいけないと
以下のURLに書かれていました。
http://enjoy1.bb-east.ne.jp/~grassland/edcb/80_info_1.html

**変更後**

```
<VirtualHost *:80>
   ServerName example.com
   DocumentRoot "/var/www/html"
   ProxyPass / http://localhost:8800/
   ProxyPassReverse / http://localhost:8800/
 　<Location "/">
     Allow from all
     AuthType Basic
     AuthUserFile "/var/www/html/.htpasswd"
     AuthName "MY_HP"
     Require valid-user
   </Location>
</VirtualHost>
```

無事解決しました
ElastisearchをSQLでクエリー可能にするプラグイン

Elasticsearchを使う上で標準のDSLであるストラクチャードクエリーを書くことは避けて通れません。しかしこのJSON形式のDSLはもともと機械が理解するためのもの...人間が書くには辛すぎます。ネストが増えるたびに上に行ったり下に行ったり、目を凝らしてカッコの対応を確認したり...。使い慣れたSQLで問い合わせができたらどんなに楽だろうと思ったあなた！そんな便利なプラグインが存在します。

![elasticsearch-sql](https://cloud.githubusercontent.com/assets/9518816/5555009/ebe4b53c-8c93-11e4-88ad-96d805cc698f.png "elasticsearch-sql")

# elasticsearch-sqlの導入
Elasticsearchのプラグインの導入はコマンド一発なので簡単です。ESのバージョンによってバイナリが違うので注意してください。**導入後はESの再起動が必要です**

* Elasticsearch 1.X

`./bin/plugin -u https://github.com/NLPchina/elasticsearch-sql/releases/download/1.4.7/elasticsearch-sql-1.4.7.zip --install sql`

* Elasticsearch 2.0.0

`./bin/plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/2.0.2/elasticsearch-sql-2.0.2.zip`

* Elasticsearch 2.1.0

`./bin/plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/2.1.0/elasticsearch-sql-2.1.0.zip`

# 基本的な使い方

このプラグインはウェブUIからアクセスする方法と、GETメソッドのクエリストリングを使う方法があります。ウェブ画面のURLはこちら。

`http://localhost:9200/_plugin/sql/`


GETメソッドのクエリーストリングによる問い合わせは次のように行います。

`http://localhost:9200/_sql?sql=select * from indexName limit 10`

またSQLをESのDSLに変換して表示することもできます。

`http://localhost:9200/_sql/_explain?sql=select * from indexName limit 10`


# SQLの実例

* 簡単なSELECT文

```sql
SELECT * FROM bank WHERE age >30 AND gender = 'm'
```

インデックスとドキュメントは/で区切ります。インデックスのワイルドカードに*を使うことも多いと思いますが、クォートすることなくそのまま書けます。スペースが含まれている時はバッククォートで括ります。この辺りMySQLのパーサーがベースになっているそうです。

```
SELECT `field with space` FROM my-index-*/my-doc WHERE age >30 AND gender = 'm'
```


* GROUP BYを使ったSELECT文

```sql
select COUNT(*),SUM(age),MIN(age) as m, MAX(age),AVG(age)
FROM bank GROUP BY gender ORDER BY SUM(age), m DESC
```


* DELETE文

```sql
DELETE FROM bank WHERE age >30 AND gender = 'm'
```


# Elasticsearchに合わせた拡張SQL

ESの能力を引き出すために、ES固有の機能を呼び出す関数が装備されています。Elasticsearchを使っている人なら「あれか」と分かるかと思います。

**matchクエリー**

```sql
SELECT address FROM bank WHERE address = matchQuery('880 Holmes Lane') ORDER BY _score DESC LIMIT 3
```


**rangeクエリーと集約の合わせ技**

* ageフィールドを年齢層でグループ化して、カウント。

```sql
SELECT COUNT(age) FROM bank GROUP BY range(age, 20,25,30,35,40)
```

* date_histogramアグリゲーションを使って日次の集計

```sql
SELECT online FROM online GROUP BY date_histogram(field='insert_time','interval'='1d')
range date group by your config
```

```sql
SELECT online FROM online GROUP BY date_range(field='insert_time','format'='yyyy-MM-dd' ,'2014-08-18','2014-08-17','now-8d','now-7d','now-6d','now')
```

* ジオロケーションによる集約
しっかりESの能力を引き出せていますね！

```sql
SELECT * FROM locations WHERE GEO_BOUNDING_BOX(fieldname,100.0,1.0,101,0.0)
```

# このほかの機能

LIMIT/OFFSETによるページング、ネストしたフィールドへのアクセス、なんと限定的ながらJOINもできます。なお、JOINはESの機能ではなくこのプラグインが計算しています。

# 時代はSQL　〜ポエム〜
NoSQLが叫ばれて久しい昨今ですが、データ操作の共通言語としてSQLが再度見直されています。Spark SQL, Apache Drill, PrestoなどあえてSQLを採用している例はかなりあります。関数型言語のように宣言的で集合の操作が容易なSQLは言語としては洗練されているのでしょう。実行計画から有向グラフを作り、分散環境へ問い合わせをするのが最近のアーキテクチャですね。Hiveのmap-reduceアーキテクチャの時代から一歩進みましたが、それでもSQLが廃れないのは本質的だからではないでしょうか。
Gitの設定

# ホワイトリスト
## .gitignoreの書き方

### 末尾に/
ディレクトリだけに適用（ファイルには適用されない）
### 先頭に/
その.gitignoreファイルを基点とした同階層にだけ適用
### !
逆の意味（無視しない）

## 実際こんな感じ
```lang:.gitignore
# 全部禁止
*
# ディレクトリは許可
!*/
# 個別に許可
!*.c
!*.h
```
空のディレクトリ内に空のディレクトリはどうしようか？

----
[Prhyzmica – blog side](http://blog.prhyzmica.com/?p=151)内の記事で以下の記述があった。
> ホワイトリスト方式で!を使って書く時の注意。!で無視を取り消すファイルはgitignoreから見える場所にある必要がある。一度無視してしまったフォルダの中身はgitignoreから見えないので、まず①無視してしまったフォルダをホワイトリストに入れる②フォルダの下を全て無視に加える③無視したくないファイルのみを!で否定する のようにする。
```
/* 
/.* 
!/dir/ 
/dir/* 
!/dir/hoge.txt
```
PHP SESSIONを取り扱う自作クラス

セキュリティとか万全ではないのであしからず。

---
参照URL

>セッションの有効期間とか設定とか挙動とかを調べました
http://pentan.info/php/session_gc.html

>セッション実行時設定
http://php.net/manual/ja/session.configuration.php#ini.session.gc-divisor
​
>session idについて
http://php.net/manual/ja/function.session-regenerate-id.php
​
>sessionハイジャック
http://sawara.me/php/2348/


上記を参考にセッション保存、取り出し、検索（？）をクラス化してみました。


```SessionDb.php
<?php
​
class SessionDb{
	private $SesId;
​
 function __construct(){
	//ini_set('session.gc_maxlifetime', 1800); //session消去の時間/秒
	//ini_set('session.use_trans_sid',0); //URLにセッションIDを付加しない(デフォルト：0)
	//ini_set('session.use_cookies',1); //セッションIDの保存にcookieを使用する(デフォルト：1)
	//ini_set('session.use_only_cookies',1); //セッションIDの保存にcookieのみを使用(デフォルト：1)
	//ini_set('session.name', 'korehajibunde'); //一般的なセッション名を避ける場合
	//ini_set('session.cookie_secure',1); //HTTPS以外でのcookieを送信しない(デフォルト：0)
	ini_set('session.use_strict_mode',1); //セッションアダプション対策(デフォルト：0)
	session_start(); 
	session_regenerate_id(true);
	$this->SesId = session_id();
	$_SESSION['ipaddress'] = $_SERVER['REMOTE_ADDR']; 
 }
​
function ck_ses(){
 	if($this->SesId==session_id()):
		 if($_SESSION['ipaddress'] == $_SERVER['REMOTE_ADDR']){ return true; }
	endif;
}
​
function exist_ck($key){
	if(@$_SESSION[$key]==""):
		return true;
	endif;
}

  function set($key,$value){
	if($this->ck_ses())
      $_SESSION[$key]=$value;
  }
​
  function get($key){
	if($this->ck_ses())
    return $_SESSION[$key];
  }
​
  function del(){
    session_destroy();
    session_unset();
    //setcookie(session_name(), '', time() - 3600, "/");
  }
​
  function find($keys,$find){
  	if($this->ck_ses())
    $data = $_SESSION[$keys];
​
    foreach ($data as $key => $value) {
       if($find==$value) return true;
     }
  }
​
	function __destruct(){
	
	}
​
}
​
​

//使い方の例

$sdb = new SessionDb(); 
echo '<meta charset="utf-8">';
​
$sdb->set('name',array('tarou','tuyosi','kenta'));
​
foreach ($sdb->get('name') as $key => $value) {
   echo $value."<br>";
}
​​
if($sdb->find('name','kenta')) echo "<br>kenta is exist";
​
$sdb->del();
​
?>
```

ウェブで実行確認
[paiza.ioへのコードリンク](https://paiza.io/projects/e/vNpPoYarSJPCuVVB5FkAog?theme=twilight)




例えば開発中とかにデータベースを使わずにサクサクする時にたまに使ったりします。

```TestDb.php

class TestDb extends SessionDb{

	public $data;

	function __construct(){

		if($this->exist_ck('TestDb')):
		$this->start_ob();
		endif;
		$this->data = $this->get('TestDb');

	}

	function start_ob(){
	$this->set('TestDb',array('yamada'=>'tarou','kinosita'=>'mari'));
	}

}

$testdb = new TestDb();
foreach($testdb->get('TestDb') as $key=>$value){
	echo PHP_EOL.$key.$value;
}

```
OneDrive for MacでFinderのアイコンOverlay

MacのOneDriveが更新されて、Finderで同期状態が分かるようになった。

<img width="522" alt="onedrive_apps.png" src="https://qiita-image-store.s3.amazonaws.com/0/16514/2761effd-d049-e492-9b18-b61c53fc44d8.png">

しかし、自分の環境（Yosemite）では、アップデートしただけでは表示されなかった。

「Onedrive Finder Overlay」とかで調べてみたら、機能拡張を有効にせよ、という記述が。
システム環境設定>機能拡張の中にそれらしいチェックボックスを発見。
![onedrive.png](https://qiita-image-store.s3.amazonaws.com/0/16514/546d1c15-75e7-fe3c-b5b2-f88d8878e2d5.png)

これにチェックを入れたところ、無事に同期状態が表示されるようになった。
![onedrive_after.png](https://qiita-image-store.s3.amazonaws.com/0/16514/a91b60f1-4637-0853-35a2-cc3b78f1fcc9.png)
[Mac]Terminalの$より前の記載内容を変更する

# [Mac]Terminalの$より前の記載内容を変更する

## まずは環境変数を把握

**PS1**という環境変数に、$より前の部分が設定されている。

では実際にどのように設定されているか確認してみましょう。

```
$echo $PS1
\h:\W \u\$
```

上の\hやら\Wを組み合わせることにより、記載内容を変更します。
これらの意味は、[こちら](http://www.yoheim.net/blog.php?q=20140309)を参考にしてください。

## では**PS1**を変更してみる

**~/.bashrc**　か　**~/.bash_profile**　のどちらかに**PS1**を追加して再起動する

```
$vi ~/.bashrc

# ターミナルの$より前の記載内容
PS1="\u:\W$ "
```

簡易的な内容ですが、このように簡単に変えられるんですね。

以下のブログを参考にしました。そちらのほうがより詳しい情報が記載されております。ありがとうございました。
[YoheiM.NET](http://www.yoheim.net/blog.php?q=20140309)
Mac OSX 10.11 El Capitan で、キーチェーンアクセスの許可ボタンが押せなくなる問題対応

Mac OSX 10.11 El Capitan にアップデート後、アプリからキーチェーンアクセスへの許可を求められる際、例えば Xcode でアプリを作成後、オーガナイザから「Upload to App Store」する際など、キーチェーンアクセスのダイアログの「常に許可」「許可」のボタンが押せなくなることがあります。
(ボタンの押下時、ボタンの色は変わりますがボタンアップしても反応が無い)

![スクリーンショット 2015-12-30 9.42.05.png](https://qiita-image-store.s3.amazonaws.com/0/68302/0185a0fe-8c08-86a6-298e-94bec73e64d0.png)

マルウェアへのセキュリティ対策として、HIDのユーティリティ周りの権限が厳しくなっている模様。

私は、SmoothMouse というマウスユーティリティを使っており、これが原因でした。

# 解消方法

- システム環境設定から、「SmoothMouse」を選択
<img width="438" alt="スクリーンショット 2015-12-30 9.43.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/68302/715b64f3-8d83-dd7e-e9c0-d9d6c7f0cf71.png">
- Mouse タブの、「Enable for mice」のチェックを外す。
<img width="780" alt="スクリーンショット 2015-12-30 9.43.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/68302/84e00adb-501a-1057-ec87-5da4b9098f34.png">
- Trackpad の、「Enable for trackpads」も OFF の必要があると思う。私はもともとOFFだった。
- 再起動不要
- マウスを動かしてみて、macデフォルトのダメ挙動になっているのを確認後、Xcode の 「Upload to App Store …」をクリックして手続きをすすめる
- 「常に許可」が押せる!