OmniAICreator/Qiita-1.07M huggingface dataset:
jQueryで動的に生成したtableにイベントリスナーをつける

jQueryで動的に生成したテーブルにイベントリスナーを付けようと
例を色々探してみましたが、いい塩梅の例が見付からなかったため自分用に書いておきます。

#HTML
```html:html
<body>
<table id="table"></table><!--ここに行を追加-->
</body>
```
#jQuery
```js:js
$('#table').on('click','#name', function(){
  sample();//呼び出す関数
});
...
...
function setth(){
  var row = document.createElement("tr");//trを生成
  var th = document.createElement("th");//thを生成
  th.id="name";//thにidを付与
  th.innerHTML="名前";
  row.appendChild(th);//行にthを追加
  $("#table").append(row);//rowをテーブルへ追加
}
```
これにより生成されるhtmlはこうなります。

```html:html
<body>
<table id="table">
  <tr>
    <th id="name">name</th>
  </tr>
</table>
</body>
```

| 名前   | 
|:-------|
| hoge   |
| fuga   | 
| poyo   |

テーブルの名前のセルを押すとクリックイベントが起こせます。
(tdは各自で増やしてください。)

詳しい説明は以下を参考に...
参考にしたサイト
[onメソッドを利用したイベントの設定-jQuery入門講座](http://www.jquerystudy.info/tutorial/intro/event2.html)
Go言語でJSONを返すシンプルなAPIサーバーを作るメモ


このライブラリを使うといい感じに作れるみたいです。
https://github.com/ant0ine/go-json-rest

Golang初心者すぎるのでまずは動かすところから。

## goのバージョン
こんな感じです。

```
$ go version
go version go1.4 darwin/amd64
```

## コピペでJSONサーバー

`go get`コマンドでライブラリをダウンロードしておきます。

```
$ go get github.com/ant0ine/go-json-rest/rest
```

パッケージが`$GOPATH/src`以下に入っていることが確認できます。

```
$ ls $GOPATH/src/github.com/ant0ine
go-json-rest
```

APIpサーバープログラムを記述します。

```api.go
package main

import (
    "github.com/ant0ine/go-json-rest/rest"
    "log"
    "net/http"
)

func main() {
    api := rest.NewApi()
    api.Use(rest.DefaultDevStack...)
    api.SetApp(rest.AppSimple(func(w rest.ResponseWriter, r *rest.Request) {
        w.WriteJson(map[string]string{"Body": "Hello World!"})
    }))
    log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))
}
```

## 実行
`go run`で実行できます。 localhost:8080にアクセスするとJSONが返ってきていることがわかるとおもいます。

```
$ go run api.go

09/Jun/2015:18:32:19 +0900 200 92μs "GET / HTTP/1.1" - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36"
```

![](http://i.gyazo.com/df6510540362f9dd54842319315b6a90.png)
[jquery]複数のチェックボックスで、一つも選択されてなかったらアラートを出す。


**複数のチェックボックスが存在し、ひとつもチェックついていなかったら送信されずに、アラートを出す方法。**


[手順]
1. divタグ(なんでも良い)で複数のチェックボックスをまとめる(html) 
2. submitしたら、警告する(jquery)
1. チェック数をカウントする変数を作成(jquery)
3. チェック数0だったら、警告とsubmitしないようにする(jquery)




## 1. divタグで複数のチェックボックスをまとめる(html)
```
<div class='div_class'>
	<input type='checkbox' name='hello' value='1'>
	<input type='checkbox' name='hello' value='2'>
	<input type='submit'>
</div>
```


## 2. submitしたら警告する(jquery)

```

// step2
  <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.0.min.js"></script>
  <script>
  
  $(function(){
	$('.submit').click(function(){
		alert('チェックしとらんぞ。');
	});
  });

// step2
 
  
  </script>
```

## 3. チェック数をカウントする変数を作成(jquery)

```
  <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.0.min.js"></script>
  <script>
  
  

 $(function(){
	$('.submit').click(function(){
	
	// step3
	var check_count = $('.div_class :checked').length;
	// step3

		alert('チェックしとらんぞ。');
	});
 });



</script>
```

こんだけ。
divタグやformタグなどでcheckboxタグをくくらないとできないので、注意。


## 4. チェック数に応じた条件分岐作成(jquery)

```
  <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.0.min.js"></script>
  <script>
  


 $(function(){
	$('.submit').click(function(){
	var check_count = $('.div_class :checked').length;

	
	// step4
	if (check_count == 0 ){
		
		alert('チェックしとらんぞ。');
		
		return false;
	}
	// step4

	});
 });


</script>
```


# まとめ

``` 


<div class='div_class'>
	<input type='checkbox' name='hello' value='1'>
	<input type='checkbox' name='hello' value='2'>
	<input type='submit' class='send'>
</div>


  <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.0.min.js"></script>
  <script>



 $(function(){
  $('.send').click(function(){
    var check_count = $('.div_class :checked').length;
    if (check_count == 0 ){
      alert('チェックしとらんぞ。')
      return false;
    }
  });
});


</script>
```



jquery初心者にとっては繊細、括弧の過不足とかclassとかidとか気をつける。
Vagrant 1.6.3でvagrant-berkshelfがインストールできない件

Vagrant 1.6.3でvagrant-berkshelfをインストールしようとすると、エラーが発生しました。

# エラー

~~~
$ vagrant plugin install vagrant-berkshelf
Installing the 'vagrant-berkshelf' plugin. This can take a few minutes...
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:

An error occurred while installing nokogiri (1.6.6.2), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.6.2'` succeeds before bundling.
~~~

# 解決策

Vagrantのバージョンを1.6.3から1.7.2にアップデートしたら、簡単にインストールできました。

~~~
$ vagrant version
Installed Version: 1.7.2
Latest Version: 1.7.2

$ vagrant plugin install vagrant-berkshelf
Installing the 'vagrant-berkshelf' plugin. This can take a few minutes...
Installed the plugin 'vagrant-berkshelf (4.0.4)'!
Post install message from the 'vagrant-berkshelf' plugin:

The Vagrant Berkshelf plugin requires Berkshelf from the Chef Development Kit.
You can download the latest version of the Chef Development Kit from:

    https://downloads.getchef.com/chef-dk

Installing Berkshelf via other methods is not officially supported.

You have new mail in /var/mail/sonixasia
~~~

Vagrantのバージョンアップの方法は以下の記事を参考にしました

[Vagrantの実行環境のバージョンアップ](http://qiita.com/Handen01/items/21c03183e5198bb77a96)
HerokuのPostgresDBをVagrantのPostgresDBへ復元する。

## 条件
VagrantBoxはUbuntuが入った[scotch](https://box.scotch.io/)に[Posgresql9.4インストール追記](http://qiita.com/niiyz/items/74eec19b19d0385c7212)したもの。

## HerokuのDBバックアップ取得

MacOSXで[pgadmin3](http://www.pgadmin.org/download/macosx.php)使用。
GUIなやつ。

[pgadmin3の設定](http://qiita.com/niiyz/items/35d3a713d214b3df306f#postgres%E7%94%A8%E3%81%AEgui%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

繋いだらデータベース名を右クリックしてバックアップを選ぶ。
フォーマット=tar、エンコーディング=UTF8で保存。

## VagrantのポスグレDBへリストア

pgadmin3でリストアしようとしたら時間かかりすぎて断念。
コマンド叩いてやることにする。
Vagrantのサーバー(Ubuntu)にはPostgresが入っているものとする。
バックアップファイルは/var/www/db.backupに設置。


~~~ shell:linuxのpostgresユーザーになっておく
$ vagrant ssh
$ sudo su - postgres
~~~

~~~ shell:データベース作成
$ psql
postgres=# CREATE DATABASE newdb ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8' TEMPLATE template0;
CREATE DATABASE
postgres=# \q
~~~

~~~ shell:作成したデータベースに復元
pg_restore -d newdb /var/www/db.backup
~~~

## VagrantのPostgresに繋がらなかったら見るファイル

### pg_hba.conf

postgresユーザーでnewdbはどこからでも繋いでOK設定
 
~~~ text:/etc/postgresql/9.4/main/pg_hba.conf
host newdb postgres 0.0.0.0/0 trust # 追記
~~~

### postgresql.conf

Vagrantのローカル(localhost)からとMacOSX(192.168.22.32)のpgadmin3から繋がるようにしとく)

~~~ text:/etc/postgresql/9.4/main/postgresql.conf
listen_addresses = 'localhost,192.168.22.32' # アンコメントして追記
~~~

### ファイルを更新したら再起動する

~~~ shell:ポスグレ再起動
sudo /etc/init.d/postgresql restart
~~~
Rails gem: delayed_jobのデバッグ

delayed_job で遅延実行するジョブのデバッグはどうやるの？

## 発端

ログに以下のようにでてworkerは走っているようだが期待する結果が得られないときどこを確認するのか。
```
Job Delayed::PerformableMethod (id=24) RUNNING
```

## 確認方法

delayed_jobの設定を変更する。
`config/initializer/delayed_job_config.rb`等:

```
Delayed::Worker.destroy_failed_jobs = false  # 失敗したジョブをキューから消さない設定
Delayed::Worker.logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log'))  # ログファイル出力
```

railsを実行。

ワーカーを実行。
`$ script/delayed_job start`

railsを操作するなどしてジョブを投入。

ログを見て、失敗を確認したら、

```
$ cd rails_dir
$ rails c
Delayed::Job.all
Delayed::Job.last.last_error
エラーログが出ている。このログを参考にワーカーをデバッグ。
```

参考：
http://www.sitepoint.com/delayed-jobs-best-practices/
StatusBarに乗っている時間やアイコンの色を黒に変える方法


## 概要
Material Designのガイドラインを読んでいたら、StatusBarに乗っている時間やアイコンの色を黒にしているキャプチャが載っていたので方法を調べてみました

https://www.google.com/design/spec/layout/structure.html#structure-system-bars

## 注意
__API Level 23（Android 6.0）__以上でしか使えないので注意

## 方法
### styles.xmlの設定

```android:windowLightStatusBar``` を設定するだけ
使用したい場合はv23のリソースディレクトリを切って、専用のstyles.xmlを作成すれば良いと思います

```values-v23/styles.xml
<style name="Sample" parent="@style/Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowLightStatusBar">true</item>
</style>
```

## 結果
StatusBarに乗っている時間やアイコンの色が黒くなりました
通知アイコンも勝手に黒くしてくれます

![Screenshot_20151023-152038.png](https://qiita-image-store.s3.amazonaws.com/0/40539/8021fd5d-e431-a77d-992a-8115c9d4df39.png)
cinii の API を叩くクラスの実装

#1 はじめに
こんにちは。今回は cinii から論文のメタデータを取得するためのクラスを実装しました。研究で論文のアブストラクトが欲しかったので実装しました。

#2 実装
やることはシンプル。API を叩いて、論文のメタデータを @items に配列でセットするだけ。一応 API を叩くときのパラメータは変更可能にしてある。
どんなパラメータがあるかは下記を参照ください。
http://support.nii.ac.jp/ja/cia/api/a_opensearch


````lang=cinii.rb
require "net/http"
require "uri"
require "json"

# cinii からデータを取得するためクラス
class Cinii
  attr_reader :items
  
  # 検索キーワードは欲しいので new したときに指定するようにする
  def initialize(q)
    # cinii を叩く際の初期パラメータ
    @params = {
      q: q,
      format: "json", # データフォーマット
      count: "100", # 取得データの上限数
      lang: "ja", # 言語
      start: 1 # 何ページ目か
    }
  end
  
  # パラメータを変更可能にする
  def merge_params(params)
    @params.merge!(params)
  end

  # API を叩いてデータを fetch
  def fetch
    # 結果セットを取得
    result = get_result
    # 論文情報が入った配列を取得
    # @items にセットする
    @items = result["@graph"].first["items"]
  end

  
  # 以下 private method たち
  private

    # cinii を叩いた結果を返す
    def get_result
      json = Net::HTTP.get(get_uri)
      JSON.parse(json)
    end

    # cinii の API を叩く際の uri を返す 
    def get_uri
      # uri のクエリ部分を作成する
      queries = []
      @params.each{|key, val| queries.push("#{key}=#{val}")}

      uri = URI.escape("http://ci.nii.ac.jp/opensearch/search?#{queries.join("&")}")
      URI.parse(uri)
    end
end

# テストしてみる
q = "景観生態"
cinii = Cinii.new(q)
cinii.fetch
p cinii.items

````

#3 終わりに
取得したデータには割と重複があった。ユニークな論文情報が欲しい方は要注意です。
文字列から HTML タグを取り除く

文字列から HTML タグを取り除くには正規表現を使ったり Gem ([Sanitize](https://github.com/rgrove/sanitize) など) を利用したりする方法がありますが、
Rails のヘルパにもっと気軽に使えるメソッドがありました。
それは [ActionView::Helpers::SanitizeHelper#strip_tags](http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html#method-i-strip_tags) です。

```rb
ApplicationController.helpers.strip_tags("<p class='text-muted'>デブだからって<br>力があると<br>思うなよ</p>")
#=> "デブだからって力があると思うなよ"
```

ビュー以外の任意のクラスで使いたい場合は `delegate` と併用すると便利かと思います。

```rb
delegate :strip_tags, to: 'ApplicationController.helpers'
```
Build from source without root permission


```
export PATH=$HOME/local/bin:$PATH
export PKG_CONFIG_PATH=$HOME/local/lib/pkgconfig
export LD_LIBRARY_PATH=$HOME/local/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=$HOME/local/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=$HOME/local/include:$CPLUS_INCLUDE_PATH
```
APCがAPCuとZend OPcacheに取って代わられたワケ

## これはなに？
古いPHPを使用しているサービスだと、5.6+にマイグレーションする際にもAPCを使いたいという要望が多い。
PHP5.5+でなぜAPCではなくZend OPcacheやAPCuを使うようになったのか？
そもそもZend OPcacheやAPCuってなんなのさ！

って説明できるようになるために調べてみました。

----

## APCとZend OPcache/APCuの関係

APCが機能として持っている
　opecode cache機能とdata cache機能を
　
PHP 5.5+では
　opecode cache     : Zend OPcache
　data cache            : APCu 
　
で提供するようになりました。

----

## そうなった経緯
経緯が綺麗にまとまったサイト。
https://www.devside.net/wamp-server/installing-apc-for-php-5-5


ざっくりまとめるとこんな感じ。

* APC 3.1.14のopecode cache機能に深刻なバグがあり、PHPから排除された。PHP5.3が出た頃です。

その後、

* APCはopecode cache機能を削除して、data cache機能のみを提供するAPCuとなった。
* opecode cache機能は、Zend Optimizer+がOSS化されたもの⇨Zend OPcacheがカバー。Zend OPcacheはPHPに組み込まれた。


## PHP5.5が出た頃にAPC⇨Zend OPcache/APCuの流れが加速したワケ
　
* APC最後の安定版リリース=3.1.13はPHP5.5+では動かないから。
Atom でプレビュータブを使う

# 概要

ちょっと長いので、概要は読み飛ばしてもらって構いません… :sweat: 

僕は Sublime Text から Atom に移ったのですが、
その経緯もあって [sublime-tabs](https://atom.io/packages/sublime-tabs) というパッケージを愛用していました。

このパッケージはタブを開く際の挙動を Sublime Text と同様にするパッケージです。
Atom は Tree View でファイルをクリックするたびにタブが増えていくのですが、
ファイルの内容をちょっと確認したいだけの場合、この挙動ではタブが無意味に増えてしまい少し厄介です。
そこで sublime-tabs を有効化すると、プレビュータブという機能が使えるようになります。
Tree View のファイルをクリックした際にそのファイルの内容はプレビュータブに表示され、
その後別のファイルをクリックした場合はそのプレビュータブが上書きされます。
ファイルを編集するかタブをダブルクリックすることで、そのタブがタブバーに残ります。

しかし sublime-tabs は最近の Atom のアップデートで完全に使えなくなりました。
ただ [GitHub のページ](https://github.com/ddavison/sublime-tabs) に `DISCONTINUED: This package is now in core` と書かれていたので調べてみたところ、
コアパッケージの tabs というパッケージにこの機能が統合されたようです。

# 方法

## 01. Preferences... を開く
![スクリーンショット 2015-06-09 17.28.36.png](https://qiita-image-store.s3.amazonaws.com/0/6697/f5c71dd6-5169-ece8-1b79-b23ecd18187b.png)

## 02. Use Preview Tabs をチェックする
![スクリーンショット 2015-06-09 17.28.52.png](https://qiita-image-store.s3.amazonaws.com/0/6697/21d53559-cd48-3c20-cdd0-66a510f99ed7.png)
Postgresの引数配列

ストアド引数でinteger[]とnumeric[]があるような場合に
型が自動識別できないというエラーが発生するけどその対処方法。

~~~sql
def strSql = "{call hogehoge(argInt := ?, argNum := ?)}"
def params = [sql.connection.createArrayOf('int4', [1] as BigDecimal[])
		, sql.connection.createArrayOf('numeric', [1] as BigDecimal)]
sql.call(strSql, params) {
}
~~~

ググッたけどこういう事例ってなくてぶっちゃけ勘で書いたものなので
もうちょっといいやり方がありそうな気がするけどとりあえずこのやり方で出来た。
原理は分かってないけどとりあえず動く。

ポイントはcreateArrayOfでPostgresqlの型を指定する事と
引数の配列をBigDecimal[]にする事。
多分後者に関してはもっといいやり方があると思うけど
単純に[1]としただけではダメだった。

値（[1] as BigDecimal[]）の部分はspockでwhereで用意した名称を指定する事も出来る。
Salt と HMAC の違い

タイトルの内容について、どちらもハッシュの計算時に使用するアレな値という意味では2つは全く一緒なので、違いを整理しました。
備忘として残しておきたかったので投稿します。

# Salt (ソルト) #
パスワードを暗号化する際に付与されるデータのことを言います。
例えばメールアドレスとパスワードでアカウント登録を要求されるようなサービスにおいて、メールアドレスをSaltに含め、パスワードをハッシュ化して保存するといった使い方をします。
パスワードを捨ててパスワードハッシュを保存し、さらに保存されたハッシュは非可逆でパスワードを復元できないことが重要となります。
もしサーバーのrootに第三者が侵入したとしてもパスワードの漏洩を防げるからです。
また、この方法は総当り攻撃を阻止することを意図していて、攻撃が**意図的に遅くなるように**設計されているのが特徴で、ストレッチング(1000回ハッシュ計算を繰り返して計算に時間がかかるようにする)という方法と併せてよく使用されます。
そのため、**Saltは秘密であることを重要視していない**ですが、いくつかの条件があります。

- ユーザーごとに異なるSaltであること (漏洩時のリスクを最小限にする為）
- ある程度の長さを確保すること (推測されにくくする為)

# HMAC #
メッセージ認証符号の一つであり、鍵(メッセージ認証符号のことです)とデータとハッシュ関数を元に計算されたハッシュ値を持ちます。
認証と改竄検出のために使われるアルゴリズムで、HMACにより算出された値をMAC (Message Authentication Code) 値と呼びます。
HMACは基本的に暗号チェックサムであり、攻撃者がメッセージを改竄したことを検出するために使用されます。
なので**鍵は秘密である**必要があり、**可能な限り高速となるように**設計されている特徴があります。
一定確率で結果が分岐する処理のための補助クラス

敵を倒した時に15%の確率でランクAのアイテムをドロップし、25%の確率でランクBのアイテム、60%の確率でランクCのアイテムをドロップする、といった分岐処理に役立つクラスを試作。クラス名は適当。
探せば同様のものが既にあるかもしれませんが…。
結果を返す所でUniLinqを利用しているので注意。
<br>

```C#:ProbabilityRatio.cs
using UnityEngine;
using System;
using System.Collections.Generic;
using UniLinq;

static public class ProbabilityRatio<T>{
	static public T GetResult(Dictionary<T,int> events){
		int sum = 0;
		foreach (var e in events) {
			sum += e.Value;
		}
		int rnd = UnityEngine.Random.Range (0, sum);
		int tmp = 0;
		foreach (var e in events) {
			tmp += e.Value;
			if (rnd < tmp) {
				return e.Key;
			}
		}
		return events.FirstOrDefault (x => x.Value > 0).Key;
	}
}
```
<br>
使い方はまず結果となる型を用意し、その発生確率を整数比で表したものを値としてDictionary変数に追加します。
あとは変数を先程の関数に代入するのみです。

例：ドロップアイテムのランクとドロップ確率の比
RankA : RankB : RankC = 15 : 25 : 60

```csharp:sample
using UnityEngine;
using System.Collections.Generic;

public class sample : MonoBehaviour {

	public enum SampleRank{
		C,B,A
	}

	void Start () {
		var tmp = new Dictionary<SampleRank,int> ();
		tmp.Add (SampleRank.C, 60);
		tmp.Add (SampleRank.B, 25);
		tmp.Add (SampleRank.A, 15);

		var res = ProbabilityRatio<SampleRank>.GetResult (tmp);

		Debug.Log (res);
	}
	
}

```
<br>
発生確率が小数点以下だったとしても、比が整数比になるように値をかけてやれば問題なく使えます。

例　A : B = 0.1 : 99.9 = 1 : 999
`var tmp = new Dictionary<SampleRank,int> ();
tmp.Add (SampleRank.A, 1);
tmp.Add (SampleRank.B, 999);`
AWS RDS上のPostgreSQLへポートフォーワードで接続する


RDS上に構築したPostgreSQLデータベースへGUIクライアントのpgAdmin3で踏み台経由で接続する手順を説明します。

対象：Windowsクライアント

用意するもの

* [putty](http://ice.hotmint.com/putty/#DOWNLOAD)
* [pgAdmin3](http://www.pgadmin.org/download/windows.php)

これらは、参照サイトを参考にダウンロードしてインストールしてください。

## Puttyの設定
まずPuttyでポートフォーワードの設定を行います。

1. 踏み台サーバへの秘密鍵での接続設定
	1. pemファイルをPuttyで使用するppkファイルへ変換する。
		1. puttygen.exeを起動し、ファイルをロードする。
		![puttygen.exeを起動してpemをロードする](https://qiita-image-store.s3.amazonaws.com/0/10435/42819d58-84f9-1be3-0da0-7eb145755ec3.png "load_pem.png")

		1. pemファイルをppkファイルへ変換する。
		![pemファイルをppkファイルへ変換](https://qiita-image-store.s3.amazonaws.com/0/10435/bd6aae15-fe5c-cd09-4b20-ed3b4a75b39a.png "save_ppk.png")
		1. ppkファイルを保存する。
	1. putty.exeを起動し、sessionの項目を選択し、[接続アカウント名]@[踏み台アドレス]で接続設定を作成しておく。
	![セッション接続設定](https://qiita-image-store.s3.amazonaws.com/0/10435/85ecfe84-b3d1-1a6b-fc7f-0a56dc259e02.png "setting_ssh_session.png")
	ここで、『Open』ボタンで接続を確認しておく。これで秘密鍵での接続が行えるようになっている。
1. トンネリングの設定
	1. Source portへローカルの接続ポート(ここでは、5432)。DestinationにRDSのDNS名と接続ポートを追加する。
	![フォーワードの設定](https://qiita-image-store.s3.amazonaws.com/0/10435/14363912-420d-d5c6-b518-85937c6a141a.png "Input_ForwardedPort.png")
	1. 追加をしてForwarded portsについかする。
	![フォーワードポートの追加](https://qiita-image-store.s3.amazonaws.com/0/10435/870650ca-1dcb-49b6-2fd9-4cb3acb9f542.png "Add_ForwardedPort.png")
	以上で、サーバへ接続を行うとポートフォーワードが行われます。
	
## pgAdminの設定

1. pgAdmin3の設定
	1. pgAdminを起動して、「ファイル」→「サーバの追加」で接続設定を作成します。
	![サーバの追加](https://qiita-image-store.s3.amazonaws.com/0/10435/244ec696-7915-1c81-d28c-f75af4e72c77.png "pgAdmin_new_server.png")
	
		設定が完了したら、接続して完了です。
	1. こんなかんじで接続状態が確認できればOKです。
	![pgAdmin_complete.png](https://qiita-image-store.s3.amazonaws.com/0/10435/63741a02-ece7-e11c-afc7-e3b9b350a9b4.png "pgAdmin_complete.png")

以上。
Polymer API Reference Propertiesの値指定

## API Reference の見方
 Polymerの各コンポーネントには、API ReferenceがあってそのPropertiesを変更することで、様々な設定が行える。
 例として、paper-tabsを挙げると。
 https://elements.polymer-project.org/elements/paper-tabs
 API Reference Propertiesにはキャメルケースで書かれているが、実際に値を変更する場合は、以下のようにチェーンケースで書く必要がある。
 
 ```
 <paper-tabs no-bar="true"><content></content></paper-tabs>
 ```

## 問い合わせ先
何かミスとか質問などあれば、この記事にコメントしてもらうか、以下のメールアドレスに問い合わせていただけると助かります。
akira.kashihara@a-dawn.net
jquery URLっぽいもの(CDN)を読み込めない。


CDNとは、Content Delivery Network




# Googleが提供しているCDN
https://developers.google.com/speed/libraries/?hl=ja#jquery

# MicroSoftが提供しているCDN
http://www.asp.net/ajax/cdn

# jqueryが提供しているCDN
http://code.jquery.com/


全部試してダメだったら、ファイル読み込んでください。
pandas plotを使うケース，(pure) matplotlib plot を使うケース


Pythonで時系列データ等を作図する際，pandasやmatplotlibを使用することになるが，データ分析モジュールpandasが，一部matplotlibの機能を取り込んでいるplot機能があり，このpandas.plotと純粋な(pure) matplotlib.plotをどのように使い分けるかを考えてみた．

pandas.plot はmatplotlibファンクションを使用して（wrapperとして）自分の機能を実現しているので，結果としてのplot図は（pandas.plotもpure matplotlibも）ほぼ同じとなることは明らかである．使い分けのポイントとしては，（主観的に）使い勝手がいいか/悪いかということであろう．

pandasは，DaraFrame構造の取扱いに優れており，折れ線のplotは，ほとんどコマンド一行で作成できる．

例として以下のデータ(pandas DataFrame class)を用意した．

```text
In [11]: df_mkt[:10]
Out[12]:
            policy  actual       sp500
2000-01-01     5.5     NaN         NaN
2000-01-02     5.5     NaN         NaN
2000-01-03     5.5     NaN  1441.46997
2000-01-04     5.5     NaN  1441.46997
2000-01-05     5.5     NaN  1441.46997
2000-01-06     5.5     NaN  1441.46997
2000-01-07     5.5     NaN  1441.46997
2000-01-08     5.5     NaN  1441.46997
2000-01-09     5.5     NaN  1441.46997
2000-01-10     5.5     NaN  1465.15002
```

2000年から2014年までの米国政策金利と実効的な金利，及びS&P500 indexのデータである．これを以下のように作図する．

``` 
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

（中略）

df_mkt.plot(grid=True, figsize=(10,4), secondary_y=['sp500'])
``` 

右側軸の使用を指定する "secondary_y" オプションを使用したが，とても**楽**である．
![my_figure1.png](https://qiita-image-store.s3.amazonaws.com/0/74152/6685a3c5-eb1a-624e-ac4c-fcc926e17007.png)


タイトルや軸ラベル等，図の装飾はまだであるが，ほぼ完成である．これをmatplotlibで描こうとすると以下のコードが必要となる．

```py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

（中略）

fig, ax1 = plt.subplots(figsize=(10,4))
plt.plot(df_mkt.index, df_mkt['policy'], 'b', label='policy')
plt.plot(df_mkt.index, df_mkt['actual'], 'g', label='actual')

plt.grid(True)
plt.legend(loc=4)

ax2 = ax1.twinx()
plt.plot(df_mkt.index, df_mkt['sp500'], 'r', label='s&p500')
plt.legend(loc=0)

``` 

(今回の作図では，縦軸を右側軸，左側軸と分ける指定が必要となってくる．）
一応，上のコードによる作図の結果を添付しておく．（仕上がりは**ほぼ**同じになったが，Legendのラベルがまとまっていない．場所も”誤解”を与えるようなところに置いてしまった...  修正要．）

![my_figure2.png](https://qiita-image-store.s3.amazonaws.com/0/74152/5731a10a-6b1b-8238-d2d0-f32d524efb13.png)

以上より，２つのplot機能の使用ケースおすすめは以下の通り．

-pandas DataFrame で扱った時系列データの折れ線チャート(historical line chart)を作図するケースでは，素直に pandas.plot (）を使う．
-時系列データの折れ線チャート以外，例えばscatter plot，あるいはもっと複雑なチャートを作図するケースでは, pandasのプロットではなく，素の（pureな）matplotlib作図functionを用いる．（pandas.plot がサポートしないチャートもたくさんあるので．）

### 参考文献
-"Python for Data Analysis": [(O'reilly Media) http://shop.oreilly.com/product/0636920023784.do](http://shop.oreilly.com/product/0636920023784.do) 
-"Python for Finance": [(O'reilly Media) http://shop.oreilly.com/product/0636920032441.do](http://shop.oreilly.com/product/0636920032441.do) 
-公式ドキュメント [http://matplotlib.org/contents.html](http://matplotlib.org/contents.html), [http://pandas.pydata.org/pandas-docs/stable/visualization.html](http://pandas.pydata.org/pandas-docs/stable/visualization.html)
Apache2.4.6のconfメモ

2.2系と変わっててハマったのでメモ

```apache:/etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf

User apache
Group apache

ServerAdmin root@localhost

ServerName centos7.vm

#セキュリティ対策
ServerTokens ProductOnly
TraceEnable off

<Directory />
    AllowOverride none
    Require all denied
</Directory>

DocumentRoot "/var/www"
#<Directory "/var/www">
#    AllowOverride None
#    Require all granted
#</Directory>

<Directory "/var/www">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog "logs/error_log"
LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined
</IfModule>

<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>

AddDefaultCharset UTF-8

<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>

EnableSendfile off

IncludeOptional conf.d/*.conf
```

```apache:/etc/httpd/conf.d/vhosts.conf
<VirtualHost *:80>
  ServerName centos7.vm
  DocumentRoot /var/www
  <Directory "/var/www">
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:80>
  ServerName mysql.vm
  DocumentRoot /usr/local/src/phpMyAdmin-4.4.9
  ErrorLog /var/log/httpd/phpmyadmin/error_log
  CustomLog /var/log/httpd/phpmyadmin/access_log combined env=!no_log
  <Directory "/usr/local/src/phpMyAdmin-4.4.9">
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>
```
Pythonで簡単なパワポファイルの作成

Pythonライブラリpython-pptxをつかってプログラムから簡単なpptxファイルを作成します。

まずはpipをつかってライブラリをインストールします。
[Pythonのパッケージ管理ツールpipのインストール(Windows)](http://qiita.com/f00tba11artist/items/7650953685e7e8e9a8e6)

`pip install python-pptx`

これでOKです。

では簡単なパワポをつくってみます。


```lang:test.py
from pptx import Presentation

prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
title = slide.shapes.title
subtitle = slide.placeholders[1]

title.text = "Hello, World!"
subtitle.text = "python-pptx was here!"

prs.save('test.pptx')
```

実行しますとtest.pptxというファイルが同じディレクトリにつくられます。
`python test.py`


開くとこんな感じのスライドができます。
![hello-world.png](https://qiita-image-store.s3.amazonaws.com/0/52622/3b868633-fa11-bd63-8867-aabd60035977.png)


ドキュメンテーション
https://python-pptx.readthedocs.org/en/latest/index.html#api
VS2005C++でツールメニューからActiveX コントロール テスト コンテナを起動できるようにする方法

VS2005C++でActiveX コントロール テスト コンテナを起動する方法

ツール⇒外部ツール
追加ボタン

タイトル　ActiveX コントロール テスト コンテナ(&T)
コマンド　C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\tstcon32.exe
初期ディレクトリ　C:\Program Files\Microsoft Visual Studio 8\Common7\Tools

OKボタン

これで、ツールメニューからActiveX コントロール テスト コンテナを起動できるようになる。
VS 2005 C++でActiveXを作成し、メソッドを追加する方法

VS 2005 C++でActiveXを作成し、メソッドを追加する方法、
クラスビューで、
XXXLib⇒_DXXXを右クリックメニューで
追加⇒メソッドの追加
でメソッドウィザードが現れる。
JDKのインストール先(macで困った人)

# はじめに
* macにAndroid Studioをインストールしたら「JDK7が必要」と言うのでインストールしたが、見つからない、、、インストールし直してもパスが見れないし、、、という人のためのメモ
    * しょーもないですが、あまりにもつまったので

# JDKのインストール先
* **/Library/Java/JavaVirtualMachines** （Oracleが入れるJDK）
    * **/System**/Library/Java/JavaVirtualMachines ではない（Appleの入れるJDK）
EC2インスタンスのログをCloudWatchで見る

# EC2インスタンスの条件
1. Amazon Linux
2. IAMロールは未割り当て
3. インスタンスの作り直しが難しい

上記条件に当てはまらない (作り直しが可能など) 場合は、[aws documentation](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/QuickStartEC2Instance.html)を参考に設定するべき。

# IAMユーザーを作成
1. IAMコンソールを開く
2. ナビゲーションペインで[**ユーザー**]をクリック
3. [**新規ユーザーの作成**]をクリック
4. ユーザー名を入力 (一つでよい)
5. [**ユーザーごとにアクセスキーを生成**]をチェックオン
6. [**作成**]をクリック
7. [**ユーザーのセキュリティ認証情報を表示**]をクリックすると[**アクセスキーID**]と[**シークレットアクセスキー**]が表示されるのでメモ

# EC2にCloudWatch Logsをインストール
```
$ sudo yum update -y
$ sudo yum install -y awslogs
```

# CloudWatchの設定
1. /etc/awslogs/awscli.confを編集

```
region = <使用中のリージョンを設定>
aws_access_key_id = <IAMユーザーのアクセスキーID>
aws_secret_access_key = <IAMユーザーのシークレットアクセスキー>
```

# awslogsサービスを開始
```
$ sudo service awslogs start
$ sudo chkconfig awslogs on
```

# 動作確認
1. CloudWatchコンソールを開く
2. ナビゲーションペインで[**ログ**]をクリック
3. ロググループ一覧に[**/var/log/messages**]があるはず

# 応用
* /etc/awslogs/awslogs.confを編集して、任意のログファイルを送信
* CloudWatchのメトリックスフィルタを作成して、指定文字列パターンを検出したらアラート通知
Node.js ファイルをコピーするたぶん一番簡単な方法

2行で。

````js
var fs = require('fs');
fs.createReadStream('hoge.log').pipe(fs.createWriteStream('hage.log'));
````
他のフォルダにコピーしたいなら、相対でも、絶対でも、それなりのパスをつければOK

以上。


もっといい方法があったらご教授ください。
（コピー先フォルダチェックとか、エラー処理とか、細かいこと抜きでね。）
Dockerコンテナをlinkオプションで接続する

##やりたいこと
![link_docker.png](https://qiita-image-store.s3.amazonaws.com/0/25413/5ce67933-f5d9-ece9-266c-7adab6c85bf7.png)

##方法
**<変数>記述は環境に合わせて読み替え**

1. イメージ1のDockerfileにEXPOSE記述を記述し構築する

    ```lang:Dickerfile
EXPOSE :<サービスポート番号>
```
```shell-session:ホスト
docker build -t <イメージ1の名前> <ソースパス>
```
<br>

2. コンテナ1を起動する

    ```shell-session:ホスト
docker run -name <コンテナ1の名前> -d <イメージ1の名前>
```
※イメージ1をEXPOSE記述なしで構築済みの場合「--expose <サービスポート番号>」を指定してコンテナ1を起動することで同様のコンテナを作成可能
<br>

3. コンテナ1へのリンクオプションを指定して、コンテナ2を起動する  

    ```shell-session:ホスト
docker run -name <コンテナ2の名前> -d --link <コンテナ1の名前>:<リンク情報用プレフィックス>
```
<br>

4. コンテナ2の中でリンク情報を表示する

* コンテナ1のアドレスを表示する  
 
    ```shell-session:コンテナ2
echo ${<リンク情報用プレフィックス>_PORT_<サービスポート番号>_ADDR}"
```

* コンテナ１のサービスポート番号を表示する  

    ```shell-session:コンテナ2
echo ${<リンク情報用プレフィックス>_PORT_<サービスポート番号>_PORT}"
```

* telnetで接続してみる

    ```shell-session:コンテナ2
telnet <コンテナ１のアドレス> <コンテナ１のサービスポート番号>
# Trying ***....
# Connected to ***.
# Escape character is '^]'.
```

yay!
Android StudioとGenymotionの連携


Android端末のシミュレータとして
Android Studioに標準で採用されているAVD Managerを使っていたところ、
先輩から「Genymotionのほうが軽くておすすめだよー」と教えていただいたので、
早速環境構築してみた。
環境構築、大好きっ子なのです、ふふふふふ。

参考にさせていただいたのは下記のQiitaの記事。
[Genymotion + Android Studio on Mac](http://qiita.com/Sam/items/8d551f575b617fa0be7e)

上記の記事を読んでいただいたらすぐ導入できるので
私が特段書くこともないんですが…。

使ってみた感想。
**早い、軽い、ちゃんと動く！**

デバッグ時のログもちゃんと吐き出されていますし、
これからAndroidの開発を始める人には
断然Genymotionがおすすめですね！
Expected BEGIN_OBJECT but was 〜

http://www.programcreek.com/java-api-examples/index.php?api=com.github.kevinsawicki.http.HttpRequest

こんな感じの fromJson() メソッドを良く見掛けて、どうやら HttpRequest のテンプレっぽいんだけどこれを
使用したコード中で Gson の処理がエラーになっていた。

Expected BEGIN_OBJECT というのは json のオブジェクト開始 `{` が来るはずというところで、そこに例えば json の
Array が来たりすると `Expected BEGIN_OBJECT but was BEGIN_ARRAY` というエラーになったりする。
`Expected BEGIN_OBJECT but was STRING` というと json じゃない文字列が渡って来ている様子。

どうもエラーから推測しにくくて詰まった。

参考
===

http://stackoverflow.com/questions/9598707/gson-throwing-expected-begin-object-but-was-begin-array
Spring4勉強会 第七回

# Spring勉強会 第七回

今回はSpringMVCにて、cssやjsをロードする方法

## mvc-config.xmlへの追記

```
<!-- webapp下にjsやcssを配置する際の指定。resources下を全てresourceとみなす -->
<mvc:resources mapping="/resources/**" location="/resources/" />
```

これを追記する

## jspに読み込むresourceを記述する

```
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test</title>
<link href="<c:url value="/resources/css/test.css" />" rel="stylesheet">
</head>
<body>
<div id="max">${max}</div>
</body>
</html>
```

簡単なjspを例にとってます。
ようは

```
<link href="<c:url value="/resources/css/test.css" />" rel="stylesheet">
```

してるだけです。
ただ、c:urlしているので、

```
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
```

が必要です。

## cssの配置

以下のキャプチャのような場所に配置すれば、今回のtest.jspでは参照できます。
あとはよしなにやれば上手くいきます。

![css.png](https://qiita-image-store.s3.amazonaws.com/0/78857/e5dfaa7c-f5c3-e077-3842-f1d658914f36.png)
GearVRfアプリケーションの基本

※この文書は[GearVR Framework](http://www.gearvrf.org/)のドキュメント[Writing a Basic GearVRf Application](http://www.gearvrf.org/bin/view/GearVRfDeveloperGuide/GearVRfDevGuide300BasicApp)の2015年6月9日時点の翻訳です。

GearVRf APIの使用方法に慣れるために、基本的なアプリケーションを書いてみましょう。
このセクションの例として使われている`simplesample`GearVRfサンプルアプリケーションはGearVRfバナーを白い背景のVRワールドに表示します。
GearVRfはフルスクリーンで実行し、単一のViewを持っています。テーマ、メニュー、レイアウトは必要ありません。しかしGearVRfアプリケーションはAndroidリソース(strings, ints, drawables, assets, res/raw など)を使うことができます。

## ステップ1 GVRActivityを継承してアクティビティを実装する

アクティビティを実装するために、GVRActivityを継承する必要があります。そして`GVRActivity.setScript`でデバイスXMLファイルとシーングラフを作成するための`GVRScript`オブジェクト(下記サンプルの`SampleViewManager`)を提供することでアプリケーションを初期化します。

ウィザードによって生成されるアクティビティを`GVRActivity`を継承するように変更しましょう。そして`onCreate()`を`setContentView()`の代わりに`setScript()`を呼ぶように変更しましょう。

```java
package org.gearvrf.simplesample;

import android.os.Bundle;
import org.gearvrf.GVRActivity;

public class GalleryActivity extends GVRActivity {

  @Override
  protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setScript(new SampleViewManager(), "gvr_note4.xml");
  }

}
```

## ステップ2 GVRScriptを継承してVRワールドを実装する

アプリケーションで主にやることは、スクリプトクラスを継承して必要に応じて変更することです。`GVRScript`を継承した新しいクラスを作成して`onInit()`と`onStep()`コールバックを実装しましょう。

`onInit`でやるべきことは次の通りです:

* 背景色の設定
* シーンオブジェクトで使用するメッシュとテクスチャーの読み込み
* それぞれのシーンオブジェクトを作成して、そのマテリアルと位置を設定する
* シーンオブジェクトをシーングラフに追加する

```java
package org.gearvrf.simplesample;

import org.gearvrf.GVRContext;
import org.gearvrf.GVRScene;
import org.gearvrf.GVRSceneObject;
import org.gearvrf.GVRScript;
import org.gearvrf.GVRTexture;
import android.graphics.Color;

public class SampleViewManager extends GVRScript {

  private GVRContext mGVRContext;

  @Override
  public void onInit(GVRContext gvrContext) {

    // onStep()での使用に備えてフィールドに保持する
    mGVRContext = gvrContext;

    // 背景色の設定
    GVRScene scene = gvrContext.getMainScene();
    scene.getMainCameraRig().getLeftCamera()
        .setBackgroundColor(Color.WHITE);
    scene.getMainCameraRig().getRightCamera()
        .setBackgroundColor(Color.WHITE);

    // テクスチャーの読み込み
    GVRTexture texture = gvrContext.loadTexture("GearVR.jpg");
    // シーンオブジェクトの作成(このコンストラクターは標準の'unlit'シェーダーを使用する四角いシーンオブジェクトを作成します)
    GVRSceneObject sceneObject = new GVRSceneObject(gvrContext, 4.0f, 2.0f, texture);

    // シーンオブジェクトの位置を設定
    sceneObject.getTransform().setPosition(0.0f, 0.0f, -3.0f);

    // シーンオブジェクトをシーングラフに追加
    scene.addSceneObject(sceneObject);
  }

}
```

## ステップ3 フレーム毎の処理をonStepメソッドに実装する

シーンオブジェクトをフレーム毎に動かす処理はここに書きます。shader uniformsを更新する時はこのメソッド内で行います。シーンプロパティをフレーム毎もしくは特定のフレームで調整したいなら、`onStep`メソッドはそれらを変更するのに正しい場所です。OpenGL ESアプリケーションにとって、shader uniformの更新はフレーム毎に起こります。uniformの更新が起こるなら、更新は`onStep`の中で行われる必要があります。
メモ: `onStep`メソッドは空にしておくこともできます(頭の動きによる視点の変更のみの静的なシーンを描画する`simplesample`のように)。
cucumber で 同時に別々のフォーマットで出力する方法

意外とどこにも書いてなかった（ちゃんと調べてないともいう）ので自分用メモ。

```bash
cucumber --format rerun --out rerun.txt --format html --out result.html --format rerun
```

こんな感じで --formatを複数設定してあげると別々のフォーマットで出力される。
--format rerun --out rerun.txt で rerun用のファイル出力
--format html --out result.html で htmlでのファイル出力
--format rerun で コンソールに rerun結果を出力
ってかんじ。

これで rerun しながら、結果がグラフィカルに表示できるので便利。
Redis3のcluster構築メモ(vagrant上での構築)

# クラスタの構築方法

## 前提
virtualboxとvagrantがインストールされていることが前提。
3台のvagrant上に構築する。

ゲストos : debian 7.2
node1 : 192.168.33.71
node2 : 192.168.33.72
node3 : 192.168.33.73
redisのポート : 6379

## vagrant上での構築方法
VagrantFileに以下のように記述。
box名は自分の環境のbox名に合わせてください。

<pre>
config.vm.box = "debian72"

config.vm.define :redis1 do |node|
  node.vm.network :private_network, ip: "192.168.33.71"
end

config.vm.define :redis2 do |node|
  node.vm.network :private_network, ip: "192.168.33.72"
end

config.vm.define :redis3 do |node|
  node.vm.network :private_network, ip: "192.168.33.73"
end
</pre>

## インストール方法
vagrant sshなどでゲストOSにログイン後、以下のコマンドを打ち、redisをインストールする。

<pre>
wget http://download.s.io/releases/redis-3.0.2.tar.gz
tar xzf redis-3.0.2.tar.gz
cd redis-3.0.2
make
</pre>

## クラスタ化のための設定
~/redis-3.0.2/src/redis.confの最後に以下の設定を追加する

<pre>
### custer setting
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
</pre>


## redisサーバ起動
<pre>
~/redis-3.0.2/src/redis-server redis.conf
</pre>

### 動作確認
これでbarが表示されれば、動作OK

<pre>
~/redis-3.0.2/src/redis-cli
set foo bar
get foo
</pre>

## gemのインストール
これを入れておかないとクラスタ起動時にエラーが出てことがある。

<pre>
sudo gem install redis
</pre.


## クラスタ作成
<pre>
./src/redis-trib.rb create 192.168.33.71:6379 192.168.33.72:6379 192.168.33.73:6379
</pre>

### gemがなくてエラーが出た時
下のようなエラーが発生した場合はこのコマンドでredis用のgemをインストールする必要がある。

<pre>
sudo gem install redis
</pre>

<pre>
/usr/local/lib/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- redis (LoadError)
	from /usr/local/lib/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from ./src/redis-trib.rb:25:in `<main>'
    vagrant@debian-7:~/redis-3.0.2$ cd /usr/local/lib/
</pre>

## クライアント起動
-cオプションをつけて起動すること。
これでどのノードから起動してもtestkeyが取得できるはず。

<pre>
~/redis-3.0.2/src/redis-cli -c
set testkey testvalue
</pre>

## その他

### クラスタには最低3台必要
redisクラスタの構築には最低３台のredisが必要。３台ない場合はクラスタ起動時に怒られる。

### データのレプリカ
上の手順だとレプリカは作らない(レプリカ数は0)。レプリカを指定して複数ノードに同じデータを保持したい時にはredis-trib createコマンドのオプションでreplicasを指定する。
レプリカを設定することでもし、特定のredisサーバが落ちてもデータが生き残る可能性が上がるが、メモリもその分、使うのでレプリカ数の設定は慎重に。

### 参考

http://redis.io/topics/cluster-tutorial
AWS CLIを使ってS3のバケット内オブジェクトのpermission(ACL)を一括変更する

# 背景

s3バケット内のオブジェクトのパーミッションでeveryoneにリード権限がないので、サイトが公開できない...（なぜ、、wordpressとか使っているとたまにある...）

↓↓↓↓↓

＿人人人人人人人人人人人人人人人人人人人人人人人人人人人人＿
バケット内のオブジェクトに一括でpublic-readの権限を与えたい
￣ＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹ￣

↓↓↓↓↓

なんかブラウザのコンソール画面からバケットに権限与えても各オブジェクトのpermissionは変わらないしどうしようと思ってググったところ

下記で公開されているようなsdkを使ってパーミッションを変更するもの等ありました。

- [[S3, CloudFront] アップロード済みファイルのメタ情報を一括で変更する](http://dev.classmethod.jp/cloud/aws/s3-cloudfront-uploaded-files-metainfo-update/)
- [AWS S3 のファイルを rails console から一括変更する](http://detham.tumblr.com/post/65417253671/aws-s3-rails-console)
- [One shot S3 permission changer. 一括でS3 のオブジェクトのパーミッションを変更するスクリプト。](https://gist.github.com/uzulla/5318378)

、、、がsdk入れるのめんどくさい。。。
AmazonLinuxAMIだからaws-cliは入ってる。これでいけるだろ、いけるに決まってる。
と思い書いてみました。

# AWS CLIを使ってS3のバケット内オブジェクトのpermission(ACL)を一括変更する

- 対象のs3バケットに権限のあるアクセスキーを登録

```
$ aws configure
AWS Access Key ID []:
AWS Secret Access Key []:
Default region name [ap-northeast-1]:
Default output format [json]:

もしくは

$ export AWS_ACCESS_KEY_ID=xxxxxxxxxx
$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxx
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ export AWS_DEFAULT_OUTPUT=json

```

参考：[【AWS】CLIの初期設定について（認証情報とコマンド補完）](http://www.task-notes.com/entry/20141026/1414322858)

- スクリプト

```
[直列で実行]
aws s3 ls --recursive s3://{{ bucketName }}/ | awk '{print $4}' | xargs -I{} aws s3api put-object-acl --acl public-read --bucket {{ bucketName }} --key "{}"

[並列で実行]
aws s3 ls --recursive s3://{{ bucketName }}/ | awk '{print $4}' | xargs -P4 -I{} aws s3api put-object-acl --acl public-read --bucket {{ bucketName }} --key "{}"
```

※ 並列実行は試していないが、直列だと結構時間かかったので...（-P 並列実行数 のオプションをつけて）

- あるフォルダのみ対象にする

```
aws s3 ls --recursive s3://{{ bucketName }}/path/ | awk '{print $4}' | xargs -P4 -I{} aws s3api put-object-acl --acl public-read --bucket {{ bucketName }} --key "{}"
```

こんな感じでできる。
lsの値にpath指定をしてあげればOK!

もっと良い方法ありそうだが、なかなかでてこなかったのでひとまずこれで乗り切りました。
もし良い方法あれば教えてください。


[追記]
s3cmdを入れる方がだいぶ楽だったようです..笑

```
s3cmd setacl -r --acl-public s3://{{ bucketName }}
```
blank / empty / nil の使い分け



```
@book = Book.find(100000)
@book.nil? true
@book.blank? true
@book.empty? undefined method 'empty?'
 
@jfalda.nil? true
@jlfjad.blank? true
@fajjfa.empty? undefined method 'empty?'

```


blank = empty + nil + (空白文字列("    "))


nil? オブジェクトクラス
blank? オブジェクトクラス 
empty? Arrayクラス
Consoleの出力を全て指定のファイルに出力する。


`$this->info()` などの出力を全て指定のファイルに出す方法みたいな感じ。何が何でもそのファイルに書き出すようになるので、ちょっとアレかもしれない。

```php
<?php namespace App\Console\Commands;
use Symfony\Component\Console\Output\StreamOutput;
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\StreamOutput;


class testCommand Extends Command {

	 
    /**
     * Run the console command.
     *
     * @param  \Symfony\Component\Console\Input\InputInterface  $input
     * @param  \Symfony\Component\Console\Output\OutputInterface  $output
     * @return int
     */
    public function run(InputInterface $input, OutputInterface $output)
    {
        $this->input = $input;

        $this->output = new StreamOutput(fopen(/*出力先*/, 'a', false));

        $result = parent::run($input, $this->output);

        fclose($this->output->getStream());

        return $result;
    }

	/**
	 * Execute the console command.
	 *
	 * @return mixed
	 */
	public function fire()
	{
		// 今までどおりの処理をする
	}
}
```
#速報#開発者カウント不要

#Now everyone can get their app on their Apple device.

[公式ホームページ](https://developer.apple.com/xcode/)より

> "Xcode 7 and Swift now make it easier for everyone to build apps and run them directly on their Apple devices. Simply sign in with your Apple ID, and turn your idea into an app that you can touch on your iPad, iPhone, or Apple Watch. Download Xcode 7 beta and try it yourself today. Program membership is not required."
Vue.js と handlebars を併用するときのデリミタ変更

Vue.config でデリミタ変更できます

```js
Vue.config.delimiters = ['[[', ']]'];
```

[ドキュメントはこちら](http://vuejs.org/api/global-api.html)

なんか毎度ドキュメント漁ってるのでメモ。
他、人によってはいじりそうなconfigはprefixでしょうか(v-なんちゃらをdata-v-なんちゃらにしたり)。
Capistrano による Object.extend

これってちょっと行儀悪くない...？

```irb
[1] pry(main)> require 'capistrano/all'; require 'capistrano/setup'
=> true
[2] pry(main)> Object.ancestors
=> [Object,
 Capistrano::DSL,
 Capistrano::DSL::Stages,
 Capistrano::DSL::Paths,
 Capistrano::DSL::Env,
 Capistrano::TaskEnhancements,
 PP::ObjectMixin,
 Kernel,
 BasicObject]
[3] pry(main)> class Klass;end
=> nil
[4] pry(main)> Klass.instance_methods.grep(/role/)
=> [:role, :roles, :role_properties, :release_roles]
```

Object にメソッドを大量に生やしてくる
CoffeeScriptで、markdown用のソースコード引用をちゃっちゃと生成する

#雑記
苦労人の小説家や漫画家とかの、独特の重さ、シンデレラボーイorガールの小説家や漫画家とかの、独特の軽さ、というのは、多分「運」に対する見方というか「相場感」が影響しているのだと思う。それが、水木しげるみたいな域に達すると苦労人とは言え、「命が繋がるかどうかの運」というレベルになるので、重さや軽さを超越するんだと思うけど。まあ、普通の人は、デビューの早い人は、基本的に「運」が味方になってくれる感じの物語になりやすいし、そうでない人では「運」が災厄となる物語が多い。そのあたり、客観視してもう一段自由に「運」の相場を書き分けられたら、トルストイみたいなもんが書けるんじゃないかな。安易なように見えて面白い視点だと思う。**本題と全然関係ないけどな！**

#いや、ちょっと書いたので
しょーもない小技シリーズ、とでも言えば良いのだろうか。ちまちましたソースコード群からmarkdown用のソースコード引用作るってとき、僕と同世代のみんなは、sh,sed,awkでやるよね。若いみんなはperl or ruby or pythonとかでやるんかな。世代を問わず、lispでやる人はいるかもな。きのこ派、じゃなくてemacs派の人びとだ。

どうでもいいね。とりあえず、coffeeでやる。なんでもかんでもcoffeeでやるんだい。

#使い方
下記のfiles2markdown.coffeeを保存します。

```
> ls >ls.txt
> vi ls.txt
(ファイルの順番変えたり、見出し付けたり、邪魔なの消したり)
> coffee ./files2markdown.coffee -e ls.txt >newpost.md
```

こんな感じです。\$で始まる行は、\$を抜いてそのまま出力するようになっているので、例えばls.txtはこんな風に編集します

```ls.txt
$
$#はじめに
$
$
$#if,switchなどの条件分岐からの合流
$
test-coffee-if,switch.html
test-javascript-if,switch.html
$
$#単純な順次実行
$
test-coffee-simple.html
test-javascript-simple.html
$
$#同時実行はこれくらいでいい？
$
test-coffee-each.html
test-javascript-each.html
$
$#伝統的なforによる繰り返し
$
test-coffee-for.html
test-javascript-for.html
$
$#配列やオブジェクトの巡回
$
test-coffee-forin.html
test-javascript-forin.html
$
$#シンプルなwhile
$
test-coffee-while.html
test-javascript-while.html
$
$#例外機構
$
test-coffee-exc.html
test-javascript-exc.html
$
$#あとがき
$
```

ちゅうわけで、なんか次の投稿記事が想像できますね！

では、処理するコード。

```coffeescript:files2markdown.coffee
#!/usr/bin/env coffee

fs = require('fs')

sources = ""
for str in process.argv
  if str.match(/\.txt$/)?
    sources = str

files = (fs.readFileSync sources,'utf8').split('\n')

for fname in files
  result = fname.match(/^\$(.*)$/)
  if result?
    console.log result[1]
  else if fname.length > 0
    result = fname.match(/\.([^\.]*)$/)
    if result?
      ext = result[1]
    switch ext
      when 'coffee'    then lang = 'CoffeeScript'
      #add other extentions
      else                  lang = ext
    console.log '```'+lang+':'+fname
    console.log fs.readFileSync(fname,'utf8').trim()
    console.log '```'
    console.log
  else
    #skip
    0
```

なぜcoffeeでやるのか。
SSH鍵をホスト毎に変えたり、ホスト名を変えて別ユーザでログインしたり。


SSHで`HostA.example.com `にログインするときにホスト名を変えて、ログインユーザを変えたり、鍵を変えたりしてログインするとか。

ログイン先は `HostA.example.com` とする。


```.ssh/config
# ssh -p 4321 -i ~/.ssh/work_rsa admin@HostA.example.com
# が ssh Product で上記と同じ意味になる
Host Product
   HostName HostA.example.com
   Port 4321
   User admin
   IdentityFile ~/.ssh/work_rsa
   PreferredAuthentications publickey
   
# ssh -p 4321 -i ~/.ssh/develop_rsa develop@HostA.example.com
# が ssh Develop で上記と同じ意味になる
Host Develop
   HostName HostA.example.com
   Port 4321
   User develop
   IdentityFile ~/.ssh/develop_rsa
   PreferredAuthentications publickey
```
Node.js ファイルを書き込みする際にフォルダを作成する

ファイルを作成する際にフォルダがなかった場合、自動的に作ってほしいですよね。
そのお手軽なソリューションです。

````writefile.js

var mkdirp = require("mkdirp")
var fs = require("fs")
var getDirName = require("path").dirname
function writeFile (path, contents, cb) {
  mkdirp(getDirName(path), function (err) {
    if (err) return cb(err)
    fs.writeFile(path, contents, cb)
  })
}

writefile("c:/Users/hoge/hoge1/foga2/foo.txt","foo",function(err){
        if(err) throw err;
});

結果："c:/Users/hoge/hoge1/foga2/foo.txt"が作成されます。フォルダが無ければすべて再帰的に作成されます。
````


このとおりmkdirpを使えば簡単です。
mkdirpは

````js
npm install mkdirp
````

としてインストールすればOKです。

以上。
Unity2Dでドット絵のスクロール表現

いろいろ試してみたんですけど、結局2D（とくにドット絵)でスクロールするときは、
Filter ModeをBilinear(バイリニア)にしないとガジガジして使い物にならないと思う。
結構やってないアプリがあるような....。
Generate Mip Mapsのチェックも外したほうがよい。
と思う。
![スクリーンショット 2015-06-09 10.57.59.png](https://qiita-image-store.s3.amazonaws.com/0/7447/01c73910-d2db-92f3-8e30-0d9e2c9ea1b1.png)

ちなみに、動かさないなら、Filter ModeはPointのほうがきれいです。ドット絵の場合。
Kobito for Windows - 記事のアップロード


- - -
(追記, date. 6/20/2015)
使っている ** Kobito for Windows ** のversionが抜けていました．下を書いた時点でのversionは正確にはわかりませんが，「記事の移動」ボタンが追加されたのは，** ver.1.1.0 ** 以降のようです．そして現時点では，** ver.1.1.3 **にて追記を書いています．
- - -
”Kobito for Windows" に慣れていないのはもちろんのこと，Qiitaへの投稿，Markdown記述方法についても不慣れなので，投稿方法を調べてみた．

ローカルPC（クライアント）にてテキストを入力し，それをプログラム"Kobito for Windows"にてQiita siteへアップロードする流れは難しくない．一つ気になった点は，画像の添付方法である．

"Kobito for Windows" では，Web Browser上（またKobito for Macと同様に）Drag&Dropにて画像を添付する．

![my_capture2.PNG](https://qiita-image-store.s3.amazonaws.com/0/74152/6cf54098-b31a-7420-706b-735aedaa5d16.png)

ローカルPCでの作業なので，画像ファイルはまだPC上にある．

```
![my_capture2.PNG](C:\Temp\my_capture2.PNG)
```

心配した点は，記事のアップロードの際にこの画像ファイルもQiitaサーバへ転送してくれるだろうか，ということである．実際にやってみた．
まず，Inboxチーム（フォルダ）にある記事をQiitaチーム（フォルダ）へ移動．(「記事の移動」ボタンを使用．）

![my_capture3.PNG](https://qiita-image-store.s3.amazonaws.com/0/74152/04210d71-0c41-9922-6a19-a55eef4e9525.png)

![my_capture4.PNG](https://qiita-image-store.s3.amazonaws.com/0/74152/93f09a10-1d2d-cc04-7513-a03876b54449.png)

「Qiitaへの投稿には一つ以上のタグが必要です」とのことなので，タグ（今回はQiita tagを使用）を入力．その後，「アップロード」ボタン(下図）にて Go!

![my_capture5.PNG](https://qiita-image-store.s3.amazonaws.com/0/74152/db9f471b-1276-5450-967f-714473c18d0c.png)

うまく出来ただろうか？
確認したところ，以下の結果となった．

- Inboxチーム・フォルダにてDrag&Dropで添付した画像ファイルはuploadされない．（自動的にLinkアドレスの更新は，行われない．LinkがローカルPCのもの C:\Temp\xxxx.png となっているものは転送されないし，当然，表示されない．）
- 一方で，Qiitaチーム・フォルダにてDrag&Dropで添付した画像ファイルは，記事をアップする前に（Drag&Drop後すぐに）アップロードされる．Linkアドレスは，``` https://qiita-image-store.s3..../ ``` に更新される．

したがって，画像を添付すべきタイミングは，Inboxチーム・フォルダからQiitaチーム・フォルダに記事を移動した後にした方がいい，ということが分かった．

（上記の最初に転送に失敗したファイルは，Web Browserで付け直しました．）
ownCloud8インストール

CentOS7で実施。

## 参考

* [YUKASHIKADO Inc. 開発ブログ • ownCloud on Nginx + PHP-FPM](http://dev.yukashikado.co.jp/post/50696329067/owncloud-on-nginx-php-fpm)


## ダウンロード

* [software.opensuse.org: パッケージのインストール: isv:ownCloud:community / owncloud](http://software.opensuse.org/download/package?project=isv:ownCloud:community&package=owncloud)

もしくは[Getting Started with ownCloud | ownCloud.org](https://owncloud.org/install/#instructions-server)

```インストール
cd /etc/yum.repos.d/
wget http://download.opensuse.org/repositories/isv:ownCloud:community/CentOS_CentOS-7/isv:ownCloud:community.repo
yum install owncloud
```

* /var/www/html/owncloud/ が出来る。

## DB

```
yum install mariadb-server php-mysql
```

```/etc/my.cnf.d/my_custom.cnf
[mysqld]
character-set-server = utf8
innodb_file_per_table = 1
slow_query_log=ON
long_query_time=1
log-slow-queries=/var/log/mariadb/slow.log

[client]
default-character-set=utf8
```

```bash:mariadb機動
systemctl enable mariadb
systemctl start mariadb
```

```mysql:
create database owncloud default character set utf8;
grant all privileges on owncloud.* to owncloud@localhost identified by '(パスワード)';
flush privileges;
```

## httpd

```bash:
systemctl enable httpd
systemctl start httpd
```

## owncloudの画面

* http://server-ip/owncloud/

![owncloud.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fd161d14-230e-f2cb-509b-53553acbad3d.png)

![owncloud2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f5dadc3e-765f-77fa-cfaa-7e22f22f99c9.png)

![owncloud3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9b08b8f1-f66b-5019-d450-fa50ed14d138.png)

## 513MB制限

もし513MBまでしかUPLOADできないと出た場合、

```diff:/var/www/owncloud/.htaccess
- php_value upload_max_filesize 513M
- php_value post_max_size 513M
+ php_value upload_max_filesize 2G
+ php_value post_max_size 2G
```


## ownNote

* EverNoteのようなもの。
* /var/www/owncloud/apps/ownnote/js/script.js
    * 編集していたら 60秒後自動保存される。

## memcached

* [Server Tuning & Performance Tips — ownCloud Server Administration Manual 8.1 documentation](https://doc.owncloud.org/server/8.1/admin_manual/configuration_server/performance_tuning.html)

```bash:
sudo apt-get install -y memcached php5-memcached
```

* [Config.php Parameters — ownCloud Server Administration Manual 8.1 documentation](https://doc.owncloud.org/server/8.1/admin_manual/configuration_server/config_sample_php_parameters.html)

```diff:/var/www/owncloud/config/config.php
  $CONFIG = array (
+   'memcache.local' => '\OC\Memcache\Memcached',
+   'memcache.distributed' => '\OC\Memcache\Memcached',
+   'memcached_servers' => array(
+           array('localhost', 11211),
+   ),
  );
```

----

## owncloud9をnginx + php7で動かそうとしたメモ

* debian9にて確認

```bash:インストール
wget https://download.owncloud.org/community/owncloud-9.0.1.tar.bz2
tar xf owncloud-9.0.1.tar.bz2
cd owncloud
sudo chown -R www-data:www-data owncloud
```

が必要。

* php7.0-sqlite3
* php7.0-xml