OmniAICreator/Qiita-1.07M huggingface dataset:
Three.js の基礎


せっかく勉強したので自分のメモ用に書いておきます。間違っている所もあるかもしれませんが、その際はご指摘ください。

##
**three.jsとはWebGLをさらにリッチなものにするためのjavascriptで書かれたライブラリの１つです。(CanvasやSVGなどでも使えます)**

##必要なものは３つ
**シーン**
```scene = new THREE.Scene();```
まず１つめに必要なものがシーンです。
シーンとはこれから作っていく3D空間のことです。これからここに色々追加していきます。

**カメラ**
```camera = new THREE.PerspectiveCamera(fov, aspect, near, far);```
PerspectiveCameraには以下の４つの引数を入力します

fov:カメラの画角を入れます（Camera frustum vertical field of view.）
aspect:縦横比を入力します。（Camera frustum aspect ratio.）
near:撮影範囲の手前の距離を指定します。nearよりも近くにあるものはレンダリングの対象になりません（Camera frustum near plane.）
far:撮影範囲の最大距離を指定します。farより遠くのものはレンダリングの対象になりません（Camera frustum near plane.）

**レンダラー**

```
renderer = new THREE.WebGLRenderer();
renderer.setSize(width, height);
var container = document.getElementById('container');
container.appendChild(rendrer.domElement()); //レンダラーをDOM上に設置
```
renderer.setSize(width, height);のwidthとheightで、レンダラーの横幅と高さを指定します。


##シーンに光源とオブジェクトを追加
先ほど作成したシーンに光源とオブジェクトを追加していきます。いきなり、必要な３つ以外のものが出てきましたね。たしかに、シーン、カメラ、レンダラーの３つがあれば表示することはできますが、このままでは、シーン上に何もないので意味がありません。そこで、光源とオブジェクト、要はレンダリングの対象をシーン上に追加していきます。

**光源**
光源には何種類かありますが、今回は平行光源を使用しています。

```
var directionalLight = new THREE.DirectionalLight( hex, intensity); //ライト作成
directionalLight.position.set( 100, 100, 100);//ライトの位置
directionalLight.lookAt(new THREE.Vector3(0, 0, 0));//ライトの向き
scene.add(directionalLight); //シーンにライトを追加する
```
DirectionalLightには２つの引数があります
hex:光の色（Numeric value of the RGB component of the color. ）
intensity:光の強さ。デフォルト値は１です。（Numeric value of the light's strength/intensity.）

**オブジェクト**
オブジェクトを作る前に、まずオブジェクトはgeometryとmaterialからできています。イメージ的にはgeometryで形を作って、materialで材質を決めるという感じです。

```
var geometry = new THREE.CubeGeometry(50, 50, 50);  //立方体作成
var material = new THREE.MeshPhongMaterial({color: 0xFFFFaa});
var mesh = new THREE.Mesh(geometry, material); // 立方体と材質を結びつけてメッシュ作成
scene.add(mesh);//シーンに追加
```
geometryにはcubeを今回は使っています。引数は横幅、高さ、奥行きとなっています。さらにオプションで、それぞれのセグメントも追加することができます。セグメントのデフォルト値は１です。
materialも様々ありますが、MeshPhongMaterialを今回は使用。引数は色を指定していますが、他にも影など指定可能。


##レンダリングする
ここまでで、光源とオブジェクトを追加したシーン、カメラ、レンダラーの準備ができましたので、最後にレンダリングします。

```
renderer.render(scene, camera);  //レンダリング
```
これで、レンダリングが行われオブジェクトがWebGL上に表示されるはずです。しかし、アニメーションとして動きのあるオブジェクトを表示するにはこのレンダリングを何度も行う必要があります。
そこで

```
requestAnimationFrame(関数名);
```

を使い、再帰関数として何度もレンダリングを行います。
よく編集するシーンへ移動するためのカスタムメニュー(手動)

#便利な小ネタ#
といいつつ僕がunity触るときは絶対作ってる。

```csharp:SceneMover
public class SceneMover {
	[MenuItem("シーン/メインへ")]
	public static void MoveMain()
	{
		EditorApplication.OpenScene ("Assets/asset.unity");
	}
}

```
こんな感じでシーンを指定してOpenSceneしてやるとそのシーンへ移動するメニューができる。よく使うシーンはワンクリックで移動したいよね？
毎回シーン探すのめんどくさいでしょ？
Markdown の console と sh-session の使い分け(?)

Qiita の Markdown の記法に console と shell-session の 2 種類があることを知らずに、

今まで私はシェルを表現するときに shell-session を使っていた。
shell-session では全て灰色になってしまうので、やや不思議に思っていた。

次のように使い分けるのが正しいということだろうか？

```console:console
$ echo hello
```

```shell-session:shell-session
hello
```

```console:console
$ echo world
```

```shell-session:shell-session
world
```
選択範囲内から検索するPowerPointマクロ

## やりたいこと
PowerPointで、全文でなく選択範囲内からテキスト検索したい。

## マクロの作り方 

まずは下記のようなユーザーフォームを作る。
![UForm.PNG](https://qiita-image-store.s3.amazonaws.com/0/80231/d7ab9432-94d7-0d46-78bc-9212bf922da9.png)

ユーザーフォームに下記のようなコードを埋め込む。
「検索」ボタンと「次へ」ボタンは、それぞれ「btnSearch」、「btnNext」を割り当てる。

```vbnet:UserForm1.frm
Option Explicit

Private MyRng As TextRange
Private Found As TextRange

'「検索」ボタンを押したとき
Private Sub btnSearch_Click()

    On Error GoTo ErrMessage
    
    Set MyRng = ActiveWindow.Selection.TextRange
    Set Found = MyRng.Find(TextBox1.text) 'テキストボックスに記入したテキストを検索する
    Found.Select
        
    Exit Sub

ErrMessage:
    MsgBox "検索を行う範囲を選択してください"

End Sub

'「次へ」ボタンを押したとき
Private Sub btnNext_Click()
    
    On Error GoTo ErrMessage

    With Found
        Set Found = MyRng.Find(TextBox1.text, .Start + .length - 1) '次のテキストを検索
        If Not (Found Is Nothing) Then
            Found.Select
        Else
            MsgBox "見つかりません"
        End If
    End With
    
    Exit Sub

ErrMessage:
    MsgBox "検索を行う範囲を選択してください"

End Sub
```

標準モジュールから呼び出せるようにする。

```vbnet:Module1.bas

Option Explicit

Public Sub Sample()

    UserForm1.Show vbModeless

End Sub

```
これで、選択範囲からの検索ができるようになる。

## 課題

テキストを選択しているときは正常に動作するが、オートシェイプを選択しているときはうまく動作しないようです。様々な選択範囲に対してこのマクロを動作させるには、エラー処理を作りこむ必要がありそうです。

## 参考
1. [TextRange.Find メソッド (PowerPoint)] (https://msdn.microsoft.com/ja-jp/library/office/ff744247.aspx)
unsupported_grant_typeエラー

callback.phpからTokenエンドポイントにリクエストすると、
{"error":"unsupported_grant_type","error_description":null,"error_code":"901"}
というエラーが返ってきます。

'authorization_code'という文字列で間違っていないと思うのですが、
何が原因かわかりますでしょうか？

callback.phpは以下のようなコードになっています。

<?php
/**
 *callback.php（コールバック）
 *Tokenエンドポイントにリクエスト
 *
 */
 	$code = $_GET["code"]; // 認可コード

	$applicationId = "アプリケーションID";
	$secret = "シークレット";

	$api = "https://auth.login.yahoo.co.jp/yconnect/v1/token";

	$basicAuth = base64_encode($applicationId . ':' . $secret);

	$redirect_uri  = "Authorizationエンドポイントで指定したURI";


	$postdata = array(
		"grant_type" => "authorization_code",
		"code" => $code,
		"redirect_uri" => $redirect_uri
		);
		

	$header = array(
	   'Authorization: Basic '.$basicAuth,
	   'Content-Type: application/x-www-form-urlencoded; charset=utf-8'
	);
	$ch = curl_init($api);
	curl_setopt_array($ch, array(
	    CURLOPT_HEADER => true,
	    CURLOPT_HTTPHEADER => $header,
	    CURLOPT_POST => true,
	    CURLOPT_POSTFIELDS => $postdata,
	    CURLOPT_RETURNTRANSFER => true,
	    CURLOPT_SSL_VERIFYPEER => false
	));

	$result = curl_exec($ch);

	// HTTPステータスコードをチェックしエラーならエラー内容を出力
	if(curl_errno($ch)) {
    	echo 'Curl error: ' . curl_error($ch);
	}

	curl_close($ch);

	echo $result;


?>


よろしくお願いいたします。

根岸
CRON等のバッチのロギング

cron にバッチを登録する時、リダイレクトとかだらだら長く書きたくないとか、
リダイレクトの書き方をミスして、何も記録されてなかったと言う事態を回避したり、
バッチのログをローテーションさせたいとか…
まぁいろいろ有りますが、全部まとめて自分用のテンプレを晒して見ます。


```bash:テンプレmybackup.sh
#!/bin/bash

# このリダイレクトの書き方は bash 限定なので
# sh とかに変更してはならない！！

# ログファイルを年月で分ける
logfile=/tmp/mybackup.log.`date +'%Y%m'`

# 出力を全てログファイルへリダイレクト
#exec 1>> ${logfile} 2>&1

# syslog に出す時はこれ
exec 1> >(logger -p local3.info) 2>&1

# syslog に出すなら、時間の出力は不要。
printf '%s %s my backup start\n' `date +'%Y-%m-%d %H:%M:%S'`

# ダンプ開始
printf '%s %s DB dump start\n' `date +'%Y-%m-%d %H:%M:%S'`
# DB のフルダンプとか…
# mysqldump ... ...

# ファイルコピー開始
printf '%s %s file copy start\n' `date +'%Y-%m-%d %H:%M:%S'`
# ファイルのコピーとか…

printf '%s %s my backup end.\n' `date +'%Y-%m-%d %H:%M:%S'`
```
DeepLearningのライブラリ触ってみた


[DeepLearning もくもくハッカソン](http://deep-learning-hackathon.connpass.com/event/12867/)に参加したのでその中で試したことを書きます。
今回はHelloWorldできればいいくらいなキモチで参加。


# H2O

- http://h2o.ai/
- sparkと組み合わせられる(sparkling-water)

## Flow(notebookみたいなの)で試してみる

- [Flow tutorial](https://github.com/h2oai/h2o-3/blob/master/h2o-docs/src/product/flow/README.md)

```
java -jar h2o.jar
open http://localhost:54321
```
- exampleをロードしてhogehoge

# sparkling-water

- H2O on spark
	- https://databricks.com/blog/2014/06/30/sparkling-water-h20-spark.html
	- http://www.slideshare.net/0xdata/sparkling-water-5-2814
	
## Spark-Cluster(ローカル)で動かしてみある

- setup
	- `git clone git@github.com:h2oai/sparkling-water.git`
	- [spark-1.2.2-bin-hadoop2.4](http://d3kbcqa49mib13.cloudfront.net/spark-1.2.2-bin-hadoop2.4.tgz)
	- java7とか
	- Dockerfileからbuildしてもよい
		- 本家のだとビルドが壊れてます
		- [修正版](https://github.com/takei-shg/sparkling-water/tree/PUBDEV-1168/docker)

- [tutorial](https://github.com/h2oai/sparkling-water/tree/master/examples#step-by-step-through-weather-data-example)

```
./bin/launch-spark-cloud.sh
export MASTER="spark://localhost:7077"
./run-example.sh AirlinesWithWeatherDemo
```

# spark-ec2

- ec2上でmaster/slaveでSpark-Cluster作りたい
- その上でsparkling-water動かしたい
- [sparkをec2に立てる](http://ampcamp.berkeley.edu/exercises-strata-conf-2013/launching-a-cluster.html)
- なんか動かないorz


# DL4J

- [Deep Learning for Java, Scala & Clojure on Hadoop, Spark & Flink](http://deeplearning4j.org/)
- sparkはまだGPU難しそうだけど、これはGPUも使える
- dockerでbuildしたがIDEないとexample動かんので退散...


# Caffe

- 一応Caffeも触ってみた
- [Deep learning framework by the BVLC](http://caffe.berkeleyvision.org/)
- @ixixiさんの[docker image](https://registry.hub.docker.com/u/ixixi/caffe-lstm/)
	- [public AMI](http://blog.titocosta.com/post/110345699197/public-ec2-ami-with-torch-and-caffe-deep-learning)

```
$ docker run -p 8888:8888 --rm ixixi/caffe-lstm ipython notebook /opt/caffe/examples --ip=0.0.0.0 --no-browser
$ boot2docker ip
192.168.59.104
$ open http://192.168.59.104:8888
``` 

- 試しに猫ひろし食わせてみた

![Kobito.j5DK65.png](https://qiita-image-store.s3.amazonaws.com/0/5950/9b9b26ce-df26-6dd9-19c8-1daed37d1bc3.png "Kobito.j5DK65.png")


![Kobito.feBrEu.png](https://qiita-image-store.s3.amazonaws.com/0/5950/87fae592-df8e-8b1c-7285-e4838c18ebd5.png "Kobito.feBrEu.png")

- predicted class は543だと

```data/ilsvrc12/synset_words.txt
    541 n03240683 drilling platform, offshore rig
    542 n03249569 drum, membranophone, tympan
    543 n03250847 drumstick
    544 n03255030 dumbbell
    545 n03259280 Dutch oven
```

drumstick???
idobataにhubotを設置してみる

![スクリーンショット 2015-05-25 22.42.16.png](https://qiita-image-store.s3.amazonaws.com/0/14380/301ea47c-19b7-2297-9716-9b487c6326c9.png)

# 資料
http://gihyo.jp/dev/serial/01/hubot
https://hubot.github.com/docs/
https://github.com/idobata/hubot-idobata

# やってみた感想
今更だけど、[idobata](https://idobata.io)にhubotを置いてみるのを試してみた。
ボットの情報の入出力先をアダプターで気軽に選べたり、
スクリプトを置くのがすごくカンタンで、ちょっとかわいい。

## 環境
* Mac OS X
* ndenv
  * node v0.10

# インストール/構築

```bash
$ npm install -g yo generator-hubot
$ mkdir cat-hubot
$ ndenv rehash
$ cd cat-hubot/
$ yo hubot
```

## 古い手順でやったら…
generatorを使えって。

```bash
$  hubot --create cat-hubot
'hubot --create' is deprecated. Use the yeoman generator instead:
    npm install -g yo generator-hubot
    mkdir -p cat-hubot
    yo hubot
```

# とりあえず起動

0.12だったので起動しなかった。

```bash
$ bin/hubot
ndenv: version `v0.10' is not installed
```

0.10をインストール。

```bash
$ ndenv install v0.10
$ ndenv local v0.10
```

起動した。

```bash
$ bin/hubot 
cat-hubot> [Sat May 23 2015 19:02:14 GMT+0900 (JST)] ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s  | grep web_url | cut -d= -f2)`
[Sat May 23 2015 19:02:14 GMT+0900 (JST)] INFO Using default redis on localhost:6379

cat-hubot> 
```

# git/githubで管理する

```bash
$ git init
$ git add .
$ git commit -m "first commit"
$ git remote add origin git@github.com:ken1flan/cat-hubot.git
$ git push -u origin master
```

# スクリプトを追加してみる
## `Hello`と聞いたら、`にゃー`と答える、スクリプト。

```scripts/cat.coffee
module.exports = (robot) ->
  robot.hear /hello/i, (res) ->
    res.send "にゃー"
```

```hubot
cat-hubot> Hello
にゃー
cat-hubot> 
```

## `cat-hubot Hello`と話しかけたら、`にゃー`と答える、スクリプト。

```scripts/cat.coffee
module.exports = (robot) ->
  robot.respond /hello/i, (res) ->
    res.send "にゃー"
```

```hubot
cat-hubot> Hello
cat-hubot> cat-hubot, Hello
にゃー
```

# idobataとつなげる

## アダプターの追加

```bash
$ npm install hubot-idobata --save
$ npm install
```

## idobataでボットアカウントを設定

Room Settingsにボットを作る設定があるので、そこで作って、トークンをメモっておく。


## 起動時に使用するアダプターに`idobata`を設定。

```Procfile
web: bin/hubot -a idobata
```

```bash
git commit -a -m "change Procfile idobata"
```

# Herokuに置く

herokuにアプリを作って設定。

```bash
$ heroku create
$ heroku config:set HUBOT_IDOBATA_API_TOKEN=<トークン>
$ heroku config:set HUBOT_NAME=<ボットの名前>
$ git push heroku master
```

# Googleのスクリプトで生存確認する
作ったボットが寝子なので、Google Apps Scriptで作った猫じゃらしでちょいちょい興味を引くようにする。

```js
function check_server(url)
{
  var response = new Array;
  var start = new Date;
  try{
    var res = UrlFetchApp.fetch(url);
    response['code'] = res.getResponseCode();
  } catch(e){
    response['code'] = 999;
  }
  var end = new Date;
  response['time'] = end - start;
  return response;
}

function keepAwakeCat() {
  url = 'http://(hubotのURL)'
  var response = check_server(url);  
}
```
CentOS7にRedmine3をインストールする際の注意点


# 概要

CentOS7にRedmine3をインストールした際に、色々つまずいた箇所がありましたので、その内容を記述しておきます。なお今回の話を進めるにあたって、下記サイトの「Redmine 3.0をCentOS 7.0にインストールする手順」をベースに話を進めていきます。また、いずれもroot権限ユーザで実行しています。

＜インストールの際に参考にしたサイト＞
[http://blog.redmine.jp/articles/3_0/installation_centos/](http://blog.redmine.jp/articles/3_0/installation_centos/)

また、今回使用した環境構成は、下記の通りとなります。
OS：AWS EC2 CentOS7(AWS Marketplace)
DB：AWS RDS MySQL5.6.22


# つまずきポイントポイント
## CentOSの設定
### firewalldでHTTPを許可
CentOS7は、AWS Marketplaceから構築しましたが、どうやらこのインスタンスでは、firewalld及びiptablesが設定されていないようです。セキュリティーグループの方でポート設定をするから無いのかと思っています。なので、本手順はスキップしました。
※ただし、セキュリティーグループの設定がしっかりなされている事が前提です。

## 必要なパッケージのインストール
### MariaDBとヘッダファイルのインストール
mysqlをインストールする為、下記コマンドも実行しました。

```
# yum install mysql mysql-devel
```

### Rubyのインストール
Rubyは、システムにインストールされたRubyバージョンに依存されるのが嫌だったので、rbenvでのインストールで実施しました。

＜rbenv を使って ruby をインストールする(CentOS編)＞
http://qiita.com/inouet/items/478f4228dbbcd442bfe8

上記サイトの通り環境が構築出来たら、下記手順でRuby2.2系の最新版をインストール。

```
# rbenv install 2.2.2
# rbenv global 2.2.2
# rbenv rehash
```


## MariaDBの設定
### MariaDBではなく、RDSのMySQLを使用

上記構築手順サイトでは、DBは「MariaDB」を使用していたのですが、後で冗長化したいなと思って、今回DBはAWS RDSでMySQLを作成したのですが、この辺りで色々つまずきポイントがありました。

＜RDSで日本語が文字化けする問題＞
http://qiita.com/reoy/items/e355debf1e2b2abd703b

RDS MySQLのパラメータグループのデフォルト設定で、文字コードのデフォルトが「latin1」とかになっていました。新たにMySQLのパラメータグループを作成して、このグループでの文字コード設定を「utf8」に変更しました。


## その他
### rbenvでRubyをインストールしたことによる弊害

よーし。ひと通り設定完了したぞー。表示確認だー！あれ・・。なんかエラーが・・。こんなエラーログが出た。

```
App 1881 stderr: Cannot execute "/root/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.7/buildout/support-binaries/PassengerAgent": Permission denied (errno=13)
```

Rubyをrbenvでインストールしたのですが、パーミッションにおけるエラーのようです。下記サイトを参考にしました。

＜Ruby on Railsをapacheで起動出来るようpassengerの設定＞
[http://blog.sion-cojp.com/rails_passenger/](http://blog.sion-cojp.com/rails_passenger/)
TwitterのJSONを解析する

TwitterのJSONには一部Unicodeではない(?)文字が混じっていることがあるらしく、これがD言語の`std.json.parseJSON`で解析に失敗する原因となる。
`std.json.parseJSON`には、このような文字列に出会った時に置換したりするようなインターフェースは残念ながら備わっていない。(std.csvには備わっていて、例外を投げるか無視するかを選択可能)
そのため、予めこれらの文字列を何かしらに置換する必要がある。
今回はstd.jsonはある程度解析に時間がかかるモジュールであると割りきって、regexを使って置換を試みることにした。


```d
import std.json, std.utf, std.regex, std.uni, std.ascii;

JSONValue toJSONValue(string contents)
{
	enum r = ctRegex!r"\\u([0-9a-fA-F]{4})";
	string func(Captures!string c)
	{
		dchar val = 0;
		char[4] buf = void;
		auto str = c[1].toUpper();
		foreach (i, ch; str)
			val += (isDigit(ch) ? ch - '0' : ch - ('A' - 10)) << (4 * (3-i));
		return isValidDchar(val) ? toUTF8(buf, val).idup : "□";
	}
	return contents.replaceAll!func(r).parseJSON();
}
```

上記のように無効文字を置換するようにしてやることで、解析を行う事ができる。
はじめてのgem：extensible_attr_accessor

Rubyを使ったプログラミングに取り組み始めて、さあgemを作ろうと書き始めたのはいいのですが、ヤクの毛刈り状態に陥って、別な作業や調べ物に追われ続けていました。で、結局その毛刈り作業の中から新たなgemを作って、そっちを先に公開することと相成りました。

# gem名
`attr_accessor`などを拡張できるので、`extensible_attr_accessor`としました。

# 機能内容
ふつう、`attr_accessor`、`attr_reader`、`attr_writer`は単純にインスタンス変数のやり取りをするアクセサを作ることしかできません。で、似たような処理を挟むアクセサを多数作ろうとした時に、これでは面倒だなと思いました。

ちょうど、これらのメソッドは標準ではブロックを取らないので、ブロックを渡した場合だけ独自処理を挟むようにすれば既存のコードにも問題は起きないはずだと考え、意外とすんなり実装を終えました。

# 使い方
`attr_accessor`、`attr_reader`、`attr_writer`の引数としてブロックを渡すだけです（ブロックがない場合は標準のものを呼び出します）。それぞれが作り出すゲッター、セッターの挙動は以下のようになります。
<dl>
<dt>attr_reader</dt>
<dd>インスタンス変数から読み取った値をブロックに渡し、ブロックが返した値をゲッターメソッドの戻り値にします。</dd>
<dt>attr_writer</dt>
<dd>セッターメソッドの引数をブロックに渡して、ブロックが返した値をインスタンス変数とします。</dd>
<dt>attr_accessor</dt>
<dd>ゲッターとセッターで同じブロックが呼び出されますが、第2引数に`:get`あるいは`:set`が来るので、どちらか識別できます。</dd>
</dl>

# サンプルコード

```rb:Sample.rb
gem 'extensible_attr_accessor'

class TestClass

  # ブロック付きゲッター
  attr_reader(:str_val) { |v| v.to_s }
  # ブロックなしの時は普通に動作
  attr_writer :str_val

  # シンボルでも渡せる
  attr_writer :capital_val, &:capitalize
  attr_reader :capital_val

end

test=TestClass.new

#数値で代入（@str_val=10）
test.str_val=10
p test.str_val # "10"

#代入時点で変化（@capital_val="Matz"）
test.capital_val='matz'
p test.capital_val # "Matz"

```

# 注意事項
* ブロック内から`return`してしまうと、セッター・ゲッターメソッドからも抜けてしまいます。特にセッターの場合は、値が正しく入りませんので注意してください。
* 文法上、`attr_accessor :foo { |v| ... }`のような書き方はできません。以下2つのどちらかで対応してください。
  * ブロック以外の引数リストをかっこで包む（`attr_accessor(:foo){ |v| ... }`）
  * `do ... end`を使う（`attr_accessor :foo do |v| ... `）

# 外部リンク
* [RubyGemsページ](https://rubygems.org/gems/extensible_attr_accessor)
* [Github](https://github.com/jkr2255/extensible_attr_accessor)
Railsのルーティングでid（主キー）を変更する

##はじめに
Railsでbookモデルを作ると、booksテーブルの各bookのidは数字の主キーが自動的に振り分けられ、対象のbookへのアクセスには以下のようなURLが使われる。

```http
http://localhost:3000/books/1
```
ところで、このid(主キー)の部分を変えたい。


##とりあえずレコードの内容

```
"id":"1"
"isbn":"978-4167413019"
"title":"落語と私"
"author":"桂米朝"
"published_at":"1986/03"
"created_at":"2015-05-24T08:48:02.255Z"
"updated_at":"2015-05-24T08:48:02.255Z"
```
ここでは、isbnを主キーにすることにする。

##Bookモデルで主キーを設定
```rb:app>models>book.rb
class Book < ActiveRecord::Base
  self.primary_key = "isbn"
end
```

##すると...
```http
http://localhost:3000/books/978-4167413019
```
-> アクセスできた。

```
"id":"978-4167413019"
"isbn":"978-4167413019"
"title":"落語と私"
"author":"桂米朝"
"published_at":"1986/03"
"created_at":"2015-05-24T08:48:02.255Z"
"updated_at":"2015-05-24T08:48:02.255Z"
```
-> レコードの内容はこう。
-> idの部分にisbnと同じ内容が振られていた。

```http
http://localhost:3000/books/978-4167413019/edit
```
-> これもOK
-> destroyもOK
-> おわり

##まとめ
あっちこっちと紆余曲折したわりには、なんとモデルに１行加えるだけで終わってしまった。

##追記(15/5/28)
プライマリーキーを変えたのはいいけれど、bookテーブルにbelongs_toでアソシエーションされたreviewモデルは、外部キーbook_idをinteger型でとっているので、そのままだとわけのわからないことになってしまった。

そこで、schema.rbを書き換えて、book_idをstring型で取れるようにした。

```rb:schema.rb
  create_table "books", force: :cascade do |t|
    t.string   "isbn"
    t.string   "title" 
    t.integer  "author"
    t.string   "published_at"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
  end

  create_table "reviews", force: :cascade do |t|
    t.string   "comment"
    t.string   "book_id" # 外部キー。元々はt.integer
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```
これでうまくアソシエーションしてくれた。
Titanium SDK 4.0.0.GA Android での TabGroup の ActionBar問題


最近至るところで、全然マルチプラットフォーム楽じゃないとか、Titaniumてオワコンとか言われて、それって単に良く使いこなせてないか、昔のんしか知らないだけなんじゃ無いのと魂を濁らせてるTitaniumerの皆さんこんにちは。

某PodcastとかでもAppceleratorのクローズドソース的な誤解を受けてそうで辛いです。
TitaniumのSDKはオープンソースです。

もしあなたが最近のAlloyなTitaniumを触っていたとして、バギーだのAndroidしんどいなど感じたとしたらそれは、愛が足らないせいです。
否定は出来ないですけど。

さて、ひとしきり毒づいた所で、バギーなAndroidの話です。

Titanium SDK 3.3.0以降、ActionBarを非表示にするにはカスタムThemeを作って、

```platform/android/res/values/theme.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
	<style name="Theme.NoActionBar" parent="@style/Theme.AppCompat">
		<item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
    </style>
</resources>
```

tiapp.xmlでAndroidManifestに反映する方法が、[Appcelerator公式Blog](http://www.appcelerator.com/blog/2014/08/hiding-the-android-actionbar/)でも紹介されていました。

```tiapp.xml
<android xmlns:android="http://schemas.android.com/apk/res/android">
	<manifest>
		<application android:theme="@style/Theme.NoActionBar"/>
	</manifest>
</android>

```

SDK 3.5.1.GAまではこの方法は有効です。

4.0.0.GAでも、この方法は概ね使えるのですが、TabGroupを使っている場合は注意が必要です。

上記ThemeでTabGroupを使っている場合、SDK 4.0.0.GAに上げると、こうなってOpenできなくなります。

```
[ERROR] TabGroupProxy: (main) [549,549] ActionBar not available for TabGroup

```

Themeを無効化すればTabGroupにはActionBarが表示されないので良いのですが、3.5.1.GAの時は問題なかったので少し焦りました。

あとTabGroupと通常のWindowが混在している場合迄は追えていません。


本件はあくまで私に起こった事と状況から推測した事なので、間違い等あればコメントください。
MacPortsのTips

MacPortsで`sudo port install redis`したら、次のようなエラーが出た。

```
clang: error: linker command failed with exit code 1
```

簡単に調べた感じでは、Mac OS X 10.8のclang 3.1で起きるエラーのようだった。[^1][^2]

[^1]: MacPortsプロジェクトでは3年前に解決してるらしい？
[^2]: Xcode4.4で解決しているらしい？

取り敢えず、`sudo port clean redis`してから`sudo port install redis`したらあっさりインストールできた。
OSXでjhbuildでビルドしたPythonを動くようにする

# 背景

[GTK+ Download: Mac OS X](http://www.gtk.org/download/macos.php)を参考に
jhbuildでGimpをビルドした。

# OSXでjhbuildでビルドしたPythonを動くようにする

普通に以下を行うと後で色々ハマる。

```bash
~/.local/bin/jhbuild build python
```

少なくとも、PATHは/bin:/usr/bin:/sbinのみで始めるのが吉。

## Homebrewのopensslを使わない場合

PATHで/usr/local/binを抜いて、prefixで~/gtk/inst指定していても、

/usr/local/includeや/usr/local/libのopensslを検出してこれを使おうとしてしまうので、リンクを削除しておく。

```bash
brew unlink openssl
```

## Homebrewのopensslを使う場合

Python自体は、Homebrewのopensslを使ったものを
作成して動かせるが、他のGtk+関連のライブラリをインストールしていく中では
かなり面倒な事が起きる。（というか起きたので、この方法はおすすめしない）

```bash
jhbuild shell
```

でシェルに入り、

pythonのconfigure実行時に

```bash
CFLAGS=-I/usr/local/opt/openssl/include LDFLAGS=-L/usr/local/opt/openssl/lib ./configure --prefix ~/gtk/inst --libdir ~/gtk/inst/lib --enable-shared
```

のように、CFLAGSとLDFLAGSを追加する。

# pythonのリンクの設定を変更する

Python本体がAppleの純正のPythonのライブラリを参照する設定になっているので、
これをinstall_name_toolで変更する。

```bash
cd ~/gtk/inst/bin
install_name_tool -change /System/Library/Frameworks/Python.framework/Versions/2.7/Python ~/gtk/inst/lib/libpython2.7.dylib python
```

# この作業をしていないと起こる悲劇

- openssl周りをクリアしていないと、import md5ができない
- なにかのモジュールをインポートするとスレッドがどうのとエラーを吐き死ぬ。

# 関連投稿

- [gtk - Macでfc-listコマンドでフォントがなにも表示されないとき - Qiita](http://qiita.com/kjunichi/items/a9b95d2ac4d57a5d6206)

# 関連記事

- [OSXでgimpのプラグインを作りたくなりgimpをソースからビルドした件](https://abrakatabura.hatenablog.com/entry/2015/05/24/180402)
- [macOS版の公式Gimp-2.10.appでPython-Fuを有効にするには](https://abrakatabura.hatenablog.com/entry/2018/08/10/075153)
Flash BuilderでFlashバージョンの変更した時に毎回確認ダイアログが出てくるのを阻止する

コンパイル設定したFlashバージョンが11.4より上だと下記の用なダイアログが出て大変めんどくさい。
(Flash Builder 4. 7/ Mac OSX)

```
/Applications/Adobe Flash Builder 4.7/player/mac/11.4/Flash Player Debugger.app

このプロジェクトには、より新しいバージョンの Adobe Flash Player が必要です。Flash Player をインストールするか、または Flash Builder を再インストールする必要がある場合があります。

インストールされた Adobe Flash Player バージョン : 11,4,402,265
必要なバージョン : 11,7,0,0

アプリケーションを起動しますか？
```

このダイアログ、[ダウンロード]とかリンクがある割に、404ページで使い物にならない。

* 「Adobe Flash Player Debugger ダウンロード」とかで適当に検索してダウンロードページを見つける。

>[Flash Player - ダウンロード](http://www.adobe.com/jp/support/flashplayer/downloads.html)

* 私の環境はMacなのでMac用の「Flash Player プロジェクターコンテンツデバッガーをダウンロード」からダウンロード。

* 適当な場所に保管する(「/Applications/Adobe Flash Builder 4.7/player/mac/[ダウンロードしたバージョン]/Flash Player Debugger.app」あたりが無難かも？)

* [環境設定 (⌘,)]⇢[Flash Builder]⇢[デバッグ]
「スタンドアロンのAdobe Flash Player」[参照]ボタンからダウンロードした「Flash Player Debugger.app」を指定する
PHPStormのカラースキーマを変更したら選択中の変数がハイライトされなくなってしまった場合の対処法

その日の気分や体調、天候に合わせてカラースキーマやフォント変えますよね。
今回も良さげなカラースキーマを探してきて変更してみたら、選択中の変数がハイライト表示されなくなってしまい、ほんの少しだけ（震え声）設定場所等を探したりの対応に苦労しました。

##変数がハイライト表示されないってどういうこと？
画像内のメソッドのパラメータ`$server`にカーソルを当てている状況です。

[カラースキーマ変更前]
![20150524165559.png](https://qiita-image-store.s3.amazonaws.com/0/25818/ec06621a-8d45-b0db-97f8-56b914c8746b.png)

[カラースキーマ変更後]
![20150524165419.png](https://qiita-image-store.s3.amazonaws.com/0/25818/3142e70b-a4b7-5182-0e45-c0c01e2bc572.png)

変更前だと、メソッド内の`array_merge`の第二引数`$server`もハイライトされていますね。
変更後はハイライトされていないので、引数で受け取った`$server`がどこで使われているか非常に分かり難いです。

## 選択された変数のハイライトの設定方法
ハイライト表示されないのは、**変更したカラースキーマの該当項目の色の設定**の問題でした。／(^o^)＼

![20150524170553.png](https://qiita-image-store.s3.amazonaws.com/0/25818/002b4f6a-36cf-9901-e573-9c40df19372f.png)

```
Preferences > Editor > Colors&Fonts > General > Identifier under caret
```
を弄ればOKです。


![20150524170759.png](https://qiita-image-store.s3.amazonaws.com/0/25818/f0dfc709-9788-90bc-6998-2dc83e3bbde2.png)


*よし、これでもう決して見失わない。*


「Highlight usages of element at caret」のチェックも忘れないで下さいね。

```
Preferences > Editor > General
```
![20150524171102.png](https://qiita-image-store.s3.amazonaws.com/0/25818/732e2de8-83eb-231e-09af-e0812d4532d4.png)


## 個人的におすすめのカラースキーマ

Laravel界で有名なJeffrey Way氏がLaracastで使用しているテーマを有志が作成したもの？
https://github.com/bugsysha/zenWay

Laracastでよく見るテーマ
https://github.com/fungku/colour-schemes

PHPStormのテーマを集めたサイト
http://phpstorm-themes.com/

## カラースキーマのインストール方法（適当）

「.icls」ファイルを以下の場所(Mac&PHPStorm8の場合)に配置すれば、PreferncesのColors＆Fontsから選択できるようになります。
```
~/Library/Preferences/WebIde80/colors
```
64bit版NYAGOS ビルド手順

説明は割愛しますが、Go, GCCの他にGitも必要です。
予めGitをインストールして使用できる状態にしてください。
また、バッチ中では`curl`も使用しています。curlがなければブラウザでDLしてください。

# 64bitバイナリビルド用のGoをインストール

[GoのDLページ](http://golang.org/dl/)から
**go1.4.2.windows-amd64.msi**をDLしてインストールするか、
**go1.4.2.windows-amd64.zip**をDL、展開、PATHを通して
64bitバイナリをビルドできるようにする。

# 64bitバイナリビルド用のGCCをインストール

windowsでのGCC環境はtdm-gccが一番お手軽なので、
[tdm-gccのDLページ](http://tdm-gcc.tdragon.net/download)から
**tdm64-gcc-4.9.2-3.exe**をDLしてインストールするか、
**TDM64 Packages**一式をDL、展開、PATHを通して
64bitバイナリをビルドできるようにする。

# 64bit版NYAGOSのビルド

バッチにまとめました

```bat:nyagos64_build.bat
curl -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar xf lua-5.3.0.tar.gz
git clone https://github.com/zetamatta/nyole
git clone https://github.com/zetamatta/nyagos

pushd lua-5.3.0
make mingw
copy src\lua53.dll ..\nyagos
popd
@rem nyagosのビルドで`lua`が必要なのでPATHを通す
set PATH=%PATH%;%~dp0lua-5.3.0\src

pushd nyole
make LUA53=..\lua-5.3.0
copy nyole.dll ..\nyagos
popd

pushd nyagos
make
popd
```

## バッチ実行時にエラーが出る場合は

* 文字エンコード : UTF-8
* 改行コード : \r\n

あたりを確認
UniRxのシンプルなサンプル その11(シーケンスをつなげる Concat)

[UniRxのシンプルなサンプルの取扱説明書](http://qiita.com/Marimoiro/items/b0c66c6c22cf58bde049)
[前(プッシュを遅らせる Delay)](http://qiita.com/Marimoiro/items/a6131e9bde9b0d13b1ba)
[次(シーケンスをつなげる Concat)](http://qiita.com/Marimoiro/items/f49dfd886de4900042c9)

#シーケンスをつなげる#
今回はシーケンスをつなげてプッシュするConcatを紹介します。

今回は150Frameの間上に移動しそのあと右に移動するようなオブジェクトを作ってみます。

#前準備#
ConcatSampleを張り付けたオブジェクトを作ります。

#ソースコード#

```csharp:ConcatSample.cs
using UnityEngine;
using UniRx;
using UniRx.Triggers;
using System.Collections;

public class ConcatSample : Base {

	// Use this for initialization
	void Start () {
	
		//最初の150Frameはこれ
		var first = this.UpdateAsObservable ().Select (_ => new Vector2 (0, 0.01f));
		//150Frame以降はこれ
		var second = this.UpdateAsObservable().Select (_ => new Vector2 (0.01f, 0));

		first.Take(150).Concat (second).Subscribe (v => Move(v.x,v.y));
	}
}

```
今回は2本のシーケンスを使ってやってみます。
一つ目(first)は、new Vector2 (0, 0.01f)をプッシュし続けるシーケンスです。
二つ目(second)は、new Vector2 (0.01f, 0)をプッシュし続けるシーケンスです。

first.Concat(second).Subscribe(action)とすると以下のような挙動になります。
1. first.Subscribe(action)をする
2. firstがOnCompleteを発行するまで続ける
3. OnCompleteが発行されたらsecond.Subscrbe(action)する

という流れです。
(Subscribeといっていますが後続にWhereとかがつながっていればそれも一緒につなぎます。)
つまりfirstのプッシュがすべて完了したら、secondにバトンタッチするイメージです。

今回のfirstはOnCompleteを発行するような性質のものではないのでTake(150)でOnCompleteを発行させています。

上記のような動作なのでsecondにObservable.Timerを入れるとfirstのOnCompleteが発行されてからのカウントになりますし。UpdateAsObservableを使えばSubscribeするまでは読み捨てられます。

利用用途としてはたとえば、あるイベントが起きてから数フレームの間だけしたい動作などを記述するときに利用できそうです。

#実行結果#
150Frameの間上に移動しそのあと右に移動します。
bash：標準出力も標準エラーもログに出力

障害対応時などの一刻を争う調査などの際、この挙動にハマってしまって対応が遅れるケースを見てきたんで共有です。

## test.sh
sonna_file_naiyo.txtが存在しないとして

```
#!/bin/sh

echo "foo"
cat ./sonna_file_naiyo.txt
echo "bar"
```

で、このスクリプトを

### teeでロギングしちゃうよ！

```
$ sh ./test.sh | tee test.log
foo
cat: ./sonna_file_naiyo.txt: No such file or directory
bar
```

#### logの中身を見てみるよ！

```
$ cat ./test.log 
foo
bar
```

(´・ω・`) 標準エラー出力がファイルに吐かれてないお・・・なぜだお・・・

## 標準出力＆標準エラーどちらもロギングする場合

標準エラー出力を標準出力にリダイレクトする方法を検討しましょ

```
$ sh ./test.sh 2>&1 | tee test.log
foo
cat: ./sonna_file_naiyo.txt: No such file or directory
bar
```

#### 確認するよ！

```
$ cat ./test.log 
foo
cat: ./sonna_file_naiyo.txt: No such file or directory
bar
```

(∩´∀｀)∩ﾜｰｲ

## teeではなくファイルへのリダイレクトを使う場合

`>`や`>>`でファイルへ出力するケースもあると思います。

その際にも同様にリダイレクトを行いますが、どこに記述するかについて慎重になるべきです

```
$ sh ./test.sh > test.log 2>&1

$ cat test.log 
foo
cat: ./sonna_file_naiyo.txt: No such file or directory
bar
```

上記は想定通りの挙動例

#### 指定の順番や位置を間違えると

意図しない状況になりますので注意です

```
$ sh ./test.sh | tee test.log 2>&1
foo
cat: ./sonna_file_naiyo.txt: No such file or directory
bar

$ cat test.log 
foo
bar
```

```
$ sh ./test.sh 2>&1 > test.log
cat: ./sonna_file_naiyo.txt: No such file or directory

$ cat test.log 
foo
bar
```

(´・ω・`)結構ハマりやすいと思うので、注意したいですね（自戒）
Flex Formatterをソース全体にかける

すでにあるソース一つ一つにFlex Formatterをボタンでポチポチしてくのは面倒臭いので一括で掛ける方法を探しました。

1. フォーマッター用のJarをダウンロード
> http://sourceforge.net/projects/flexformatter/files/flexformatter/0.8.9/

2. コマンドラインサポートを行うJarをダウンロード
> http://sourceforge.net/projects/flexformatter/files/flexformatter/CommandLineSupportJars/

上記２つを同ディレクトリに展開(jarが同じディレクトリに配置されるようにする)

3. 展開されたディレクトリへcdで移動し、下記コマンドを実行する

> java -Djava.ext.dirs=.  utilities.CommandLine  "path/to/sources/src" "path/to/properties/formatter.properties" 4 true UTF-8

※最終的にフォーマッター掛けに失敗するファイルがあるようです。そういったファイルはコマンド終了後に表示されます。
何故かソースコードに全角スペースが混じっている事が多いので、全角スペースを半角スペースにすると良いようです。XMLを直接記入していたりするコードも失敗する気がします。

## 参考
http://chouhans.wordpress.com/2013/01/25/command-line-flex-formatting/﻿
Gradleのtaskをpecoで選択する


Gradleを使ってAndroid開発しているとき、Gradleのtaskを選択することが多く、以前書いた内容でTAB補完は出来るようになった
[Android - GradleをZshで補完する - Qiita](http://qiita.com/petitviolet/items/11ae1c7791e6343a6c1e)

今回は、taskをTAB補完ではなくpecoで選択出来るようにした
![gradle_comp.gif](https://qiita-image-store.s3.amazonaws.com/0/280/5b09e355-75e7-72fb-cf2c-526042acf233.gif "gradle_comp.gif")

## 手順

1. カレントディレクトリに合った`gradle`コマンドを探す
2. `gradle tasks --all`を実行して文字列として取得
3. 得られた文字列をTAB補完の場合はSpace区切りにする
4. pecoで絞り込む場合は`\n`区切りに変換する
	- zshのフラグを用いてソートする


```zsh:/usr/local/bin/_gradle
#!/usr/bin/env zsh

# 使用するgradleコマンド
function gradle_command() {
  local gradle_cmd='gradle'
  if [[ -x ./gradlew ]]; then
    gradle_cmd='./gradlew'
  fi
  if [[ -x ../gradlew ]]; then
    gradle_cmd='../gradlew'
  fi
  echo $gradle_cmd
}

# gradleのtask一覧
function gradle_tasks() {
  local gradle_cmd=$(gradle_command)
  local completions=''
  local cache_dir="$HOME/.gradle_tabcompletion"
  mkdir -p $cache_dir

  # cacheするファイル名
  local gradle_files_checksum='hoge';
  if [[ -f build.gradle ]]; then 
    if [[ -x `which md5 2> /dev/null` ]]; then # mac
      local all_gradle_files="$(find . -name build.gradle 2> /dev/null)"
      gradle_files_checksum="$(md5 -q -s "${all_gradle_files}")"
    else # linux
      gradle_files_checksum="$(find . -name build.gradle | xargs md5sum | md5sum)"
    fi
  else
    gradle_files_checksum='no_gradle_files'
  fi

  if [[ -f $cache_dir/$gradle_files_checksum ]]; then # cached! yay!
    completions=$(\cat $cache_dir/$gradle_files_checksum)
  else
    # ジョブ制御を無効化
    set +m
    # バックグラウンドでindicatorを回す
    loading 1000 & >/dev/null 2>&1
    set -m
    # indicatorのprocess id
    local LOADING_PID=$!
    completions=$($gradle_cmd --no-color --quiet tasks --all | grep --color=none ' - ' | awk '{print $1}' | tr '\n' ' ')
    # indicatorを殺す
    kill -INT $LOADING_PID
    if [[ ! -z $completions ]]; then
      echo $completions > $cache_dir/$gradle_files_checksum
    fi
  fi
  echo $completions
}

# pecoでtask選択
function peco-select-gradle-tasks() {
  local gradle_cmd=$(gradle_command)
  local completions=$(gradle_tasks)
  local selected_task=$(echo ${(o)${(z)completions}} | tr ' ' '\n' | peco)
  if [ -n "$selected_task" ]; then
    BUFFER="$gradle_cmd $selected_task"
    zle accept-line
  fi
  zle clear-screen
}

zle -N peco-select-gradle-tasks
bindkey "^g^t" peco-select-gradle-tasks

# gradleのtab補完
function _gradle() {
  local cur="$1"
  local completions=$(gradle_tasks)
  local -a tasks
  tasks=("${(z)completions}")
  compadd $tasks
  return 0;
}

compdef _gradle gradle
compdef _gradle gradlew
compdef _gradle ./gradlew
```

これを`source /path/to/script`すれば使えるようになる
`^g^t`でgradleをpecoで選べるようになったのでめっちゃ便利
Ruby - ニコニコ動画の検索APIラッパーを作りました

## 概要

[ニコニコ動画 『スナップショット検索API』 ガイド](http://search.nicovideo.jp/docs/api/snapshot.html)で公開されている検索用APIをRubyから呼び出すためのライブラリです。

## インストール

Gemfileに

```text:Gemfile
gem 'nico_search_snapshot'
```
と書くか、コマンドラインから

```bash:コマンドライン
gem install nico_search_snapshot
```
## 使い方

```rb
require 'nico_search_snapshot'

nico = NicoSearchSnapshot.new('アプリケーション名')
results = nico.search('query')

results.each do |r|
  puts r.cmsid # -> "sm12345"
  puts r.title # -> "動画のタイトル"
  puts r.description # -> "動画の説明文"
end
```

newするときに、APIを使用するアプリケーション/サービス名(最大40文字)を渡してください。APIの`issuer`パラメータに渡しています。APIの利用状況把握のために使用されるそうです。

resultsには検索結果のリストが入ってきます。検索結果は以下のプロパティを持っています

|プロパティ|内容|
|-----|-----|
|cmsid|動画ID|
|title|動画のタイトル|
|description|動画の説明文|
|tags|動画のタグ|
|start_time|動画の投稿日時|
|thumbnail_url|動画のサムネイルURL|
|view_counter|再生数|
|comment_counter|コメント数|
|mylist_counter|マイリスト数|
|last_res_body|直近のコメント|
|length_seconds|動画の再生時間(秒)|

### 検索結果の件数
デフォルトでは検索結果の先頭から10件を取得するようになっています。`:from`と`:size`オプションで開始と件数を指定できます。

```rb
results = nico.search('query', size: 100) # 先頭100個
results = nico.search('query', size: 100, from: 200) # 201〜300個目
```

`:all`オプションを指定すると全件取得できます。このgem独自のオプションです。検索結果の終わりに達するまでリクエストを繰り返します。運営に怒られたらごめんなさい。

```rb
results = nico.search('query', all: true)
```

### キーワード検索とタグ検索

`:search`オプションで、キーワード検索かタグ検索かを指定します。

```rb
# キーワード検索
nico.search('query', search: [:title, :description, :tags]) 
# タイトルだけを対象に検索
nico.search('query', search: [:title]) 

# タグ検索
nico.search('query', search: [:tags_exact])
```

### フィルタ

検索結果にフィルタをかけることができます。
`:filter`オプションに抽出条件のリストを渡します。条件指定の仕方は以下の通りです。[公式ドキュメント](http://search.nicovideo.jp/docs/api/snapshot.html)にもっと詳しい情報が載っていますので、参照してみてください。

```rb
# 再生時間が5分きっかりの動画だけ抽出する
nico.search('query', filters: [{
  type: :equal, field: :length_seconds, value: 300}])

# 2015年1月1日から1月31日までの間に投稿された、かつ再生数1万を超える動画だけを抽出する
results = nico.search('hello', filters: [
  {type: :range,
   field: :start_time,
   from: '2015-01-01 00:00:00',
     to: '2015-02-01 00:00:00',
   include_upper: false # <- 終端(2015-02-01 00:00:00)を含まない
  },
  {type: :range, field: :view_counter,
   from: 10000,
   include_lower: false # <- 開始(10,000)を含まない
  }])
```

## ソート

`:sort_by`と`:order`オプションで検索結果の並び順を指定することができます。
指定できるフィールドは以下の通りです。

|フィールド名|
|---|
|last_comment_time|
|view_counter|
|start_time|
|mylist_counter|
|comment_counter|
|length_seconds|

`:order`オプションは`:asc`が昇順で`:desc`が降順です。

```rb
nico.search('query', sort_by: :view_counter, order: asc)
```

## ソースコード

https://github.com/ishidamakot/nico_search_snapshot

## RDoc
http://ishidamakot.github.io/nico_search_snapshot/

拙い英語でRDocのコメントを書いてみたのですが、意味が通っているのか自分でもわかりません。誰か英語を教えてください。
Rails で therubyracer をインストールしているのに bundle install が通らない時の対処


therubyracer をインストールしているのに bundle install がこける事象に遭遇しました。

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/t-fujiki/.rbenv/versions/2.1.0/bin/ruby extconf.rb
checking for main() in -lpthread... yes
checking for main() in -lobjc... yes
checking for v8.h... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/t-fujiki/.rbenv/versions/2.1.0/bin/ruby
	--with-pthreadlib
	--without-pthreadlib
	--with-objclib
	--without-objclib
	--enable-debug
	--disable-debug
	--with-v8-dir
	--without-v8-dir
	--with-v8-include
	--without-v8-include=${v8-dir}/include
	--with-v8-lib
	--without-v8-lib=${v8-dir}/lib
/Users/t-fujiki/Development/Rails/shelfy/vendor/bundle/ruby/2.1.0/gems/libv8-3.16.14.3/ext/libv8/location.rb:50:in `configure': You have chosen to use the version of V8 found on your system (Libv8::Location::System::NotFoundError)
and *not* the one that is bundle with the libv8 rubygem. However,
it could not be located. please make sure you have a version of
v8 that is compatible with 3.16.14.3 installed. You may
need to special --with-v8-dir options if it is in a non-standard
location

thanks,
The Mgmt

	from /Users/t-fujiki/Development/Rails/shelfy/vendor/bundle/ruby/2.1.0/gems/libv8-3.16.14.3/lib/libv8.rb:7:in `configure_makefile'
	from extconf.rb:32:in `<main>'

extconf failed, exit code 1

Gem files will remain installed in /Users/t-fujiki/Development/Rails/shelfy/vendor/bundle/ruby/2.1.0/gems/therubyracer-0.12.1 for inspection.
Results logged to /Users/t-fujiki/Development/Rails/shelfy/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-14/2.1.0-static/therubyracer-0.12.1/gem_make.out
An error occurred while installing therubyracer (0.12.1), and Bundler cannot continue.
Make sure that `gem install therubyracer -v '0.12.1'` succeeds before bundling.
```

# 対処策

[Yosemite で libv8 と therubyracer をインストールする](http://3.1415.jp/d3wpyqjr) にありますが therubyracer と libv8 は環境ごとに入れるべきバージョンが違うっぽい。下記コマンド実行で bundle install が通るようになった。


```
bundle update libv8
```
CentOS 7でVNCサーバを構築してみた

インテルのNUCでCentOS7をディスプレーなしで運用するために、VNCサーバを構築した時のメモです。

# VNCサーバのインストール

yumで tigervnc-server をインストールします。

    $  yum install tigervnc-server

# VNCサーバのパスワード設定

vncpasswdコマンドでVNCサーバのパスワードを設定します。

    $ vncpasswd
    Password:
    Verify:

# VNCサーバのサービス設定

CentOS7からはsystemctlでサービスの設定を行う必要があります。
まず、/etc/systemd/system 配下に、VNCサーバのユニットファイルをコピーするか(ユーザが複数の場合)、または、シンボリックリンクを作成します(ユーザが１人の場合)。

    $ cd /etc/systemd/system
    ln -s /lib/systemd/system/vncserver@.service vncserver@:1.service

次に、ユニットファイルを編集します。

    $ vi vncserver@:1.service

ユニットファイル内で \<USER\> と記述されている個所をVNCサーバのログインユーザ名に書き換えます。

    [Service]
    Type=forking
    # Clean any existing files in /tmp/.X11-unix environment
    ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
    ExecStart=/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
    PIDFile=/home/<USER>/.vnc/%H%i.pid
    ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

# VNCサーバのサービスの有効化

systemctlコマンドで、サービスの自動起動を有効化と再起動を行います。

    $ systemctl daemon-reload
    $ systemctl enable vncserver@:1
    $ systemctl restart vncserver@:1

# ファイアーウォールの設定

firewall-cmdでVNCサーバとクライアントの通信を許可する設定を行います。

    $ firewall-cmd --permanent --zone=public --add-service=vnc-server
    $ firewall-cmd --reload
    $ firewall-cmd --list-all

# VNCクライアントからの接続確認

UltraVNC ViewerなどのVNCクライアントから、ポート番号 5901 を指定して、VNCサーバに接続できることを確認します。

![VNC.png](https://qiita-image-store.s3.amazonaws.com/0/79832/867420c6-7cd7-b5ff-d2d0-610695ba85fc.png)

認証ダイアログが表示されたら、vncpasswdコマンドで設定したパスワードを入力してログインします。

![VNCAU.png](https://qiita-image-store.s3.amazonaws.com/0/79832/910249f5-4338-06d1-e5d2-55c8ebac6a46.png)
Xcode AutoLayoutでとりあえず縦に均等に並べておきたい時(はじめてメモ)


Xcode6をさわりはじめの頃、迷子になったの思い出したのでメモ。

とりあえず、こんな感じで、縦に均等に並べえおきたい時。

![キャプチャ.png](https://qiita-image-store.s3.amazonaws.com/0/6714/3c352511-8985-b720-43eb-3d9cb4959563.png "キャプチャ.png")


## 設定

![1-aoutolayout.png](https://qiita-image-store.s3.amazonaws.com/0/6714/77b7ca9d-7cab-cf43-456f-011dee1645e9.png "1-aoutolayout.png")

均等にしたいアイテムをドラッグで選択した状態で、上のキャプチャの1.にCheckをいれて2.をclick


![2-aoutolayout.png](https://qiita-image-store.s3.amazonaws.com/0/6714/35fe00f9-47e0-c1a4-1993-69d4db21b952.png "2-aoutolayout.png")

次に隣のAdd New Constraintsのアイコンの設定で、
3.上の高さを変更することを指定。4.で適当に30とかいれて、5.のボタンで設定する。

## 反映

そして、さらにとなりの、`|-△-|`こんなようなボタンで、「Update Frames」をすると、設定が反映される。


## 確認

![3.png](https://qiita-image-store.s3.amazonaws.com/0/6714/7a92760f-796b-2d05-9fec-c1909f581487.png "3.png")

このアイコンからAssistant editorを開いて、

![4.png](https://qiita-image-store.s3.amazonaws.com/0/6714/0982cb57-743f-3f06-d956-e71bb13086e7.png "4.png")

previewを選択して、見え方を確認できる。

## もっと詳しく

[Auto Layout ガイド(日本語PDF)](https://developer.apple.com/jp/documentation/AutolayoutPG.pdf)
PythonでCSVモジュールを使った時の日本語問題を解決する。

PythonのCSVモジュールがあまりにも貧相なので躓いた時に解決した方法。


```
f = open("data.csv", "ab")
writer = csv.writer(f, quoting=csv.QUOTE_NONE)
```

クオートを付けずにCSVに保存。

```
f = codecs.open("data.csv", "r", "utf-8")
   for line in f:			
   line = line.rstrip()
   l = line.split(",")
   hoge = l[0]

   print hoge
```

なんとか解決した。
SwiftでQuickDialogをpushViewControllerで使う

QuickDialgはDailogと名付けられているのでモーダルでしか使えないのか？
UINavigationControllerでpushViewControllerしたい。

また、この時、なんとかQuickDialgViewControllerをサブクラス化して、その中でQRootElementを作れないかも試行錯誤してみたが、こっちはちょっと無理っぽい。

単純にQuickDialgのサンプルを参考に以下のようにした。
１．QRootElementはクラス・メソッドで別途作る。
２．上記をrootとして渡してQuickDialogControllerのインスタンスを作り、これをpushViewControllerする。
###１．QRootElementはクラス・メソッドで別途作る
QuickDialgのサンプルにならって何たらBuilderのcreateメソッドという名前にする。
Swiftではクラス・メソッドは class func create() と書けばよいらしい。

```swift:ExampleQRootBuilder.swift
class ExampleQRootBuilder: NSObject {
    class func create() -> QRootElement {
        let root = QRootElement()
        root.title = "Hello"
        root.grouped = true
        let section = QSection(title: "Example")
        let label = QLabelElement(title: "Hello", value: "Hello!")
        root.addSection(section)
        section.addElement(label)
        return root
    }
}
```
###２．QuickDialogControllerとpushViewController

```swift
let root = ExampleQRootBuilder.create()
let qdc = QuickDialogController(root: root)
self.navigationController.pushViewController(qdc, animated: true)
```
QuickDialogControllerはサブクラスにして戻るボタンなどカスタマイズしてもよい。
JQuery: Bootstrap popover のcontent htmlの手動セットとcloseボタン設置

Railsで作ったデータベースで、同姓同名のデータがある場合に、その一覧を Bootstrap の popover で表示するようにしたかった（下図のような感じ）。
![fig01.png](https://qiita-image-store.s3.amazonaws.com/0/80250/81f7a481-79e2-431a-0456-e5887675f99d.png)

姓名のフィールドに入力があった時点で、JQueryのchangeイベントを受けて、検索するアクションをたたいて、getJSONで受け取って表示すればよい。

BootstrapページのpopoverのサンプルはButtonにメッセージを設定して、クリックなどで表示させるものだが、自分で検索の都度にcontentを設定したいし、また、popoverを消すためのcloseボタンも設置したい。どうするか？

まずは、表示したい場所にdivを書く。

```html
<div id="popoverSameNames"></div>
```
これに対して、popover で content を設定して、show すればよい。

popover.({options}) の中でcontentを指定することもできるが、それだと、再検索したときに表示が切り替わらないことが判明。
↓
こちらにヒントがあった
[Bootstrap popover content cannot changed dynamically](http://stackoverflow.com/questions/13564782/bootstrap-popover-content-cannot-changed-dynamically)
書き換えるたびに以下のようにすればよいようだ。

```js
$("#popoverSameNames").data('bs.popover').options.content = samenames_html;
```
また、closeボタンのつけ方は以下にあった。
[How to add a close button to Bootstrap Popover](http://www.emanueletessore.com/twitter-bootstrap-popover-add-close-button/)

最終的に以下のようなコードにした。
↓

```js
// getJSONで受け取った同姓同名の情報から samenames_html を作って↓
if (samenames_html.length > 0) {
  $("#popoverSameNames").popover({ 
    title: '同姓同名があります.<span class="close">&times;</span>',
    template: '<div class="popover" role="tooltip" style="width:500px;font-size:80%;"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"><div class="data-content"></div></div></div>',
    html: true
  }).on('shown.bs.popover', function(e){
    var popover = $(this);
    $(this).parent().find('div.popover .close').on('click', function(e){
      popover.popover('hide');
    });
  });
  $("#popoverSameNames").data('bs.popover').options.content = samenames_html;
  $("#popoverSameNames").popover('show');
} else {
  $("#popoverSameNames").data('bs.popover').options.content = "";
  $("#popoverSameNames").popover('hide');
}
```
これでとりあえずうまく動いている。
do-release-upgrade 中にbyobuをdetachしたらattach出来なくなる病

```
$ byobu
protocol version mismatch (client 7, server 6)
```

ひぁーーー！！

http://unix.stackexchange.com/questions/122238/protocol-version-mismatch-client-8-server-6-when-trying-to-upgrade

```
$ pgrep tmux
29914
$ /proc/29914/exe attach
```

戻った orz
mysql 初めからtable作成まで一連のコマンド備忘録


普段railsばっかりなのでmysql生であんまり触らないゆえにコマンドのsyntaxたまにググりがちなの手間なので備忘録。

rootでmysqlログイン

```
mysql -u root -p
```

user作成

```
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
```

userに権限与える

```
grant all privileges on db名.table名 to 'user名'@'host名' with grant option;

```

table作成

```
CREATE TABLE table名 (colum名 type名);
```

value insert

```
INSERT INTO table名 (col名たち) VALUES(valueたち)
```

index追加

```
CREATE INDEX part_of_name ON customer (name(10));

```

not null追加とか

```
ALTER TABLE Person MODIFY P_Id INT(11) NOT NULL;
```


いや初めから[cheatsheet](http://cse.unl.edu/~sscott/ShowFiles/SQL/CheatSheet/SQLCheatSheet.html)でぐぐればよかったんだ(情弱..)
vagrant+virtualbox+Ansible+centos+oracleXE+php環境構築手順

# 環境
mac OS X Yosemite 10.10.3
Virtualbox 4.3.2
Vagrant 1.3.5 
Git
Ansible 1.91

# 前提
oracle xe を公式サイトからダウンロード（~/Downloadsに保存)


# 手順
```
$ cd ~
$ mkdir myVagrant && cd myVagrant
$ git clone https://github.com/ismaild/vagrant-centos-oracle.git
$ cd vagrant-centos-oracle
$ mv ~/Downloads/oracle-xe-11.2.0-1.0.x86_64.rpm.zip ./oracle/
$ vagrant up
起動後
$ vagrant ssh
$ sudo usermod -G dba vagrant
$ sqlplus /nolog
SQL> conn /as sysdba
接続されました。
SQL> exit


$ sudo yum install git
$ mkdir -p repos/git
$ cd repos/git
$ git clone https://github.com/CHH/phpenv.git
$ cd phpenv/bin
$ ./phpenv-install.sh
$ vi ~/.bashrc
export PATH="/home/vagrant/.phpenv/bin:$PATH"
eval "$(phpenv init -)"
$ source ~/.bashrc

php-build インストール
$ git clone https://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build

インストール可能なphpバージョン
$ phpenv install --list

epel インストール
$ sudo yum install wget
$ wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

$ sudo yum localinstall -y epel-release-6-8.noarch.rpm

$ sudo yum -y install gcc bison libxml2 libxml2-devel openssl-devel   \
    libcurl-devel libjpeg-turbo-devel libpng-devel libmcrypt-devel \
    readline-devel libtidy-devel libxslt-devel


apacheのインストール
$ sudo yum install -y httpd httpd-devel

gitのインストール
$ sudo yum install - y git


エラー: Cannot retrieve metalink for repository: epel. Please verify its path and try again対策
→ epel.repo設定を修正 
$ sudo vi /etc/yum.repos.d/epel.repo
---
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch

↓

baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
---


mcrypt.h not found. Please reinstall libmcrypt エラー対策
→以下をインストール
--
$ wget "http://dl.fedoraproject.org/pub/epel/6/x86_64/libmcrypt-2.5.8-9.el6.x86_64.rpm"
$ wget "http://dl.fedoraproject.org/pub/epel/6/x86_64/libmcrypt-devel-2.5.8-9.el6.x86_64.rpm"
$ sudo yum -y localinstall libmcrypt-2.5.8-9.el6.x86_64.rpm libmcrypt-devel-2.5.8-9.el6.x86_64.rpm
--

その他パッケージをインストール
$ sudo yum install -y libxml2-devel bison bison-devel openssl-devel curl-devel libjpeg-devel libpng-devel readline-devel libtidy-devel libxslt-devel


phpのインストール
$ phpenv install 5.3.8

$ phpenv rehash

phpのインストールバージョン一覧
$ phpenv versions

phpバージョン切り替え
$ phpenv local 5.3.8
$ php --version
PHP 5.3.8 (cli) (built: May 24 2015 07:34:08) 
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
    with Xdebug v2.2.7, Copyright (c) 2002-2015, by Derick Rethans

```

good luck!
XPathとCSSセレクター対応表

Yahoo PipesとかでXPathを使わなきゃいけないとき、CSSだとこう書くんだけどXPathでどう書いたらいいんだろう？と思って調べていたら[とても良い対応表](http://ejohn.org/blog/xpath-css-selectors/)を書いている人がいたので翻訳してみた。

| 取得対象 | CSS3 | XPath
| --- | --- | --- |
| 全ての要素 | * | //* |
| 全てのP要素 | p | //p |
| 全ての子要素 | p > * | //p/* |
| ID指定 | #foo | //*[@id='foo'] |
| クラス指定 | .foo | //*[contains(@class,'foo')] ※ |
| 属性指定 | *[title] | //*[@title] |
| 全てのPの最初の子要素 | p > *:first-child | //p/*[0] |
| 子要素Aを持つ全てのP | 不可 | //p[a]
| 次の要素 | p + * | //p/following-sibling::*[0]

※この式はクラスが'foobar'でも'foo bar'でもマッチしてしまうので厳密には正しくありません。実際にこれらを区別しようと思ったらもっと複雑で複数の式を組み合わせる必要があるでしょう。
Ruby on Railsの最初

##プロジェクトを作る
```shell-session
data$ rails new new_project
```
-> いろいろできる。

##プロジェクトファイルに移動して、scaffoldでモデル生成
```shell-session
data$ cd new_project
new_project$ rails generate scaffold hoge id:integer name:string memo:text day:date
```
-> hogeモデルができて、dbに(id,name,memo,day)のテーブルを作る準備ができる。

##作ったモデルをdb:migrate
```shell-session
new_project$ rake db:migrate
```
-> 作ったモデルに合わせてdbにテーブルができる。

```shell-session
new_project$ rails sever
```
-> サーバー起動して、localhost:3000/hoge/にアクセスして確認
-> 試しに1つレコードを new hoge から生成してみる

##できたテーブルを確認
```shell-session
new_project$ rails dbconsole
SQLite version 3.7.13 2012-07-17 17:46:21
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>.tables
hoge              schema_migrations
```
-> hogeテーブルを確認

```shell-session
sqlite>select * from hoge;
1|123|私|あっちらこっちらどっちら|2015-05-24|2015-05-24 04:03:24.555191|2015-05-24 04:03:24.555191
```
-> sql文でテーブルの中のレコードを確認

```shell-session
sqlite>.quit
```
-> dbconsole終了

##作るのやめたのでモデルを削除
```shell-session
new_project$ rails destroy model hoge
```
-> hogeモデルが消える

##モデルはなくなったけど、dbは？
```shell-session
new_project$ rails dbconsole
SQLite version 3.7.13 2012-07-17 17:46:21
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>.tables
hoge              schema_migrations
```
-> まだhogeテーブルがある。

```shell-session
sqlite>select * from hoge;
1|123|私|あっちらこっちらどっちら|2015-05-24|2015-05-24 04:03:24.555191|2015-05-24 04:03:24.555191
```
-> 中身もある。

##dbに入れたhogeテーブルも削除
```shell-session
new_project$ rake db:drop
```
-> テーブルを削除。

```shell-session
new_project$ rails dbconsole
SQLite version 3.7.13 2012-07-17 17:46:21
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>.tables
sqlite>
```
-> テーブルを確認したら消えていた。

##おわり
とりあえず作って消しては終わり