OmniAICreator/Qiita-1.07M huggingface dataset:
[Grails]実行時の環境を切り替える。

[参考](http://grails.jp/doc/latest/guide/conf.html#environments)

Grailsでは開発環境、テスト環境、本番環境で利用するデータベースを切り替えるなど、実行環境によって読み込むデータなどを変更出来ます。
Grailsはデフォルトで **dev** , **test** , **prod** という環境が用意されています。

Grailsに環境を渡すには以下の3つの方法が有ります。
1. `grails`コマンドでインタラクティブモードに入る際に環境を指定する。
2.`grails`コマンドでGrailsを起動する際に環境を指定する。
3. インタラクティブモード時にコマンドの先頭に環境を指定する。

独自の環境をGrailsに渡す事も出来ますが、上記の1番と2番の方法でないとGrailsに正しく環境を渡す事が出来ません。

1番の場合だと以下のようになります。
`grails -Dgrails.env=koji`

テストとして以下のようなBootstrap.groovyを記述します。

```groovy:Bootstrap.groovy
class BootStrap {

    def init = { servletContext ->

        environments {
            development {
                println "development!"
            }

            test {
                println "test!"
            }
            production {
                println "production!"
            }

            koji {
                println "koji!"
            }
        }
    }
    def destroy = {
    }
}
```

この状態で`grails -Dgrails.env=koji`を実行してインタラクティブモードに入ってから、`run-app`でGrailsを起動すると、 **koji!** と表示されます。

デフォルトの環境の場合、Grailsに渡す環境とソースで記述する各環境に対応した記述が異なります。

| 渡す環境 | ソース上の記述 | メモ |
|:--------|:-------------|:-----|
|dev|development|デフォルト。指定しない場合はこれになる|
|test|test|テスト用|
|prod|production|本番環境用|
ファイルアップロードボタンを設置したい


モバイルサイトなどのファイルアップロード機能で、通常のファイルセレクタのフォームではなく、ファイルアップロード用のボタンを設置してファイル選んだ瞬時にアップロードを開始したい場合がある。

こんなイメージ。([DevHub](https://github.com/volpe28v/DevHub)というチャットツールのモバイルサイト実装したアップロードボタン。右端の黒いボタン)
![スクリーンショット 2014-04-13 0.07.39.png](https://qiita-image-store.s3.amazonaws.com/0/4195/dacda3b5-e70d-54b6-5442-5ccc7adc4999.png)
メリットとしては、ファイル選択直後にアップロードが開始するのでアップロードまでの手順を削減できる。

# html
html は input の type="file" タグを非表示で設置し、その代わりボタンを表示する。(以下の例は TwitterBootstrap を使っている前提)

```html
<input type="file" id="upload_chat" name="file" style="display:none"></input>
<button id="upload_chat_button" class="btn btn-small btn-inverse"><i class="icon-upload icon-white"></i></button>
```

# js
ボタンの click イベントでフォームのクリックイベントを発火することでファイル選択フォームが開かれる。iPhoneの場合はここでカメラ起動かアルバム内の画像を選択するUIが表示される。

```js
$('#upload_chat_button').click(function(){
  $('#upload_chat').click();
  return false;
});
```

続いてフォーム側の 'change'イベントを実装し、ajax でファイルの情報を 'POST' する。
このイベントはユーザがアルバム内のファイルを選択したりカメラで写真を撮って「写真を使用」を選択した際に発火する。

```js
$('#upload_chat').on('change', function(){
  return function(event){
    var file = $(this).prop('files')[0];
    var formData = new FormData();
    formData.append('file', file);

    $.ajax('/upload' , {
      type: 'POST’,
      contentType: false,
      processData: false,
      data: formData,
      error: function() {
        //アップロードエラー時の処理
      },
      success: function(res) {
        //アップロード成功時の処理
      }
    });
    return false;
  }
});
```

# サーバサイド
サーバサイドではファイル情報のPOSTを元にファイルを保存などの処理を行う。
例として node.js の express サーバでファイルを保存するコードはこんな感じ。

```js
var fs = require('fs');

exports.post = function(req, res) {
  var tmp_path = req.files.file.path;
  var file_name = "hoge.jpg";
  var target_path = './static/uploads/' + file_name; // ファイルを保存する場所

  fs.rename(tmp_path, target_path, function(err) {
    if (err) {
      throw err;
    }
    fs.unlink(tmp_path, function() {
      if (err) {
        throw err;
      }
      // ファイル保存成功時の処理
      res.send({message: "アップロード成功!"});
    });
  });
};
```

これでモバイルでもアップロードボタンから簡単にファイルをアップロードできるようになる。

[2016/09/06 追記]
express を 4系に上げたら上記コードでは動かなくなった。対応版は以下。
https://github.com/volpe28v/DevHub/blob/master/routes/upload.js
OSX Mavericksでcoldfusion 10の環境でMavericksを再インストールしたら動かなくなった（解決済み）


macbook proが強烈な異音（びびびびび）ってなり始めたので、びっくりしてAppleのサポートに連絡した。

OSの再インストールをする話になって、３、４時間かけてOSを再インストール。

で

Coldfusionが立ち上がりません。
```
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java
```
が消えています。

Mavericksからは、Java6はインストールされない。からか
オラクルのJavaダウンロード画面に行き最新のJava7をダウンロード
Java7からはosxへのjavaの提供はAppleからオラクルに移った

ここから悪夢が始まる。

## 単純に1.6.0.jdkへのパスをjava 7 jdkへ変換する

上手く起動下来た！と思っていたけど
こんなエラーがでてcfimageが死亡

```
javax.media.jai.util.ImagingException
StackTrace java.lang.ClassNotFoundException: javax.media.jai.util.ImagingException at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at coldfusion.bootstrap.BootstrapClassLoader.loadClass(BootstrapClassLoader.java:213) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at coldfusion.tagext.io.ImageTag.(ImageTag.java:81) at sun.reflect.GeneratedConstructorAccessor168.newInstance(Unknown Source) at

```

## とりあえずjava 7を疑う

/Library/Java/JavaVirtualMachinesフォルダに
1.6.0_35-b10-428.jdk、1.6.0_51-b11-456.jdk、1.6.0_51-b11-457.jdkとかjava6系のsdkが入っていたのでそれにパスを変更

治らない。

## coldfusionを疑う

coldfusionの最新アップデートにMavericks専用のupdate 13があった。早速適用。

できない

coldfusion10の必アップデートをいれないとインストールできないみたい。いろいろしらべながインストールして、update 13をあてる

治らない

## インストールされているcoldfusionを疑う

もしかしたら、coldfusionが壊れているかもしれないと思って
削除して、再インストール。

データソースと様々な設定をおこなう。
また、update 13をあてる

治らない

## もしかしたらappleの最後のjava6が入るのでは？

Java for OS X 2013-005
http://support.apple.com/kb/DL1572?viewlocale=ja_JP


ビンゴ

1.6.0_65 がインストールされ
```
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/
```
が復活した。

cfimageも復活！

ここまで5時間。
無駄につかれた。
Rails(v4)チュートリアル2章メモ


## 2.3から

**microportstテーブル**

| フィールド名 |型 |
|-----------:|------------:|
|          id|      integer|
|     content|       string|
|     uesr_id|      integer|


```
$ rails generate scaffold Micropost content:string user_id:integer
$ bundle exec rake db:migrate
```

route.rbに resources :micropostsが追加されている。
resources :usersは2.3より前で既に作成されている。


```
DemoApp::Application.routes.draw do
  resources :microposts
  resources :users
```

** resources :micropostsの内容 **

```
HTTPリクエスト	URL	アクション	用途
GET	/microposts	index	すべてのマイクロポストを表示するページ
GET	/microposts/1	show	id=1のマイクロポストを表示するページ
GET	/microposts/new	new	マイクロポストを新規作成するページ
POST	/microposts	create	マイクロポストを新規作成するアクション
GET	/microposts/1/edit	edit	id=1のマイクロポストを編集するページ
PATCH	/microposts/1	update	id=1のマイクロポストを更新するアクション
DELETE	/microposts/1	destroy	id=1のマイクロポストを削除するアクション
```

** リスト2.9 マイクロポストの最大文字数を140文字に制限する。 **

```app/models/micropost.rb
class Micropost < ActiveRecord::Base
  validates :content, length: { maximum: 140 }
end
```

## 2.3.3ユーザーとマイクロポストをhas_manyで関連づける

**リスト2.10 1人のユーザーに複数のマイクロポストがある。**

```app/models/user.rb
class User < ActiveRecord::Base
  has_many :microposts
end
```

**リスト2.11 1つのマイクロポストは1人のユーザーにのみ属する**

```app/models/micropost.rb
class Micropost < ActiveRecord::Base
  belongs_to :user
  validates :content, length: { maximum: 140 }
end
```

## 2.3.5デモアプリケーションのデプロイ

herokuへのデプロイ(heroku toolbelt取得/登録済み)

```
$ heroku create
$ git push heroku master
```

アプリケーションのデータベースが動作するようにするには、以下を実行して本番データベースのマイグレーションを行う必要もあります。

```
$ heroku run rake db:migrate
```
AngularJSのFilter機能のデモ


![スクリーンショット 2014-04-12 22.50.49.png](https://qiita-image-store.s3.amazonaws.com/0/35733/59d9c1a0-2af6-483f-424e-cff3e379e083.png "スクリーンショット 2014-04-12 22.50.49.png")

学習がてら、作ってみました。

AngularJSのFilter機能で、リアルタイムに検索結果を絞り込んでいます。

郵便番号データは郵便局のものを使っています。全国だとデータが多く重いので^^; 今回は東京23区に限定しています。

デモはこちら ⇒ http://hkusu.github.io/AngularJS_filter_demo/

## ソースの説明

デモのソース一式はこちら ⇒ https://github.com/hkusu/AngularJS_filter_demo

↓郵便局からダウンロードしてきたデータ(CSV形式)を手元でJSON形式へ変換し、変数 `datas` に記載（今回は便宜的にControllerに書いてますが、本来は Factory や Service に書いた方が良さげ）

```javascript:controller側
angular.module('filterTestApp')
  .controller('MainCtrl', ['$scope', function ($scope) {

    $scope.datas =
      [
        {"val0":1020072,"val1":"東京都","val2":"千代田区","val3":"飯田橋"},
        {"val0":1020082,"val1":"東京都","val2":"千代田区","val3":"一番町"},

        〜途中略〜

        {"val0":1330002,"val1":"東京都","val2":"江戸川区","val3":"谷河内（２丁目）"},
        {"val0":1340086,"val1":"東京都","val2":"江戸川区","val3":"臨海町"}
      ];

  }]);
```

↓フィルタリングしてるのは `<tr ng-repeat="data in datas | filter:search">` のところ。上記のControllerに記載した `datas` の配列の値を `ng-repeat` でぐるぐるしながら取り出す際、画面での入力項目 `search` で絞り込み。

```javascript:view側
<div class="container" ng-controller="MainCtrl">
    <br>
    <h3><strong>東京23区 郵便番号•住所検索</strong></h3><br>
    <p>
      <font color="grey">AngularJSのFilter機能を利用したデモです。検索キーワードに郵便番号または住所の一部を入力すると、1文字入力するたびにリアルタイムに検索結果が絞りこまれます。</font>
    </p>
    <input type="text" calss="sapn2" ng-model="search" placeholder="検索キーワードを入力">&nbsp;<small><font color="grey">(郵便番号、住所どちらでもOK)</font></small><br>
    <br>
    <table class="table table-striped">
        <thead>
        <tr>
          <th>郵便番号</th><th>都道府県(東京のみ)</th><th>区</th><th>町</th>
        </tr>
        </thead>
        <tbody>
            <tr ng-repeat="data in datas | filter:search">
                <td>{{data.val0}}</td>
                <td>{{data.val1}}</td>
                <td>{{data.val2}}</td>
                <td>{{data.val3}}</td>
            </tr>
        </tbody>
    </table>
</div>
```

## ほか

- 上記のような絞り込みの他に、表示フォーマットの変更やソートなどの機能がAngularJSではデフォルトで用意されています。
	- http://docs.angularjs.org/api/ng/filter
- 自分でFilterを定義することもできます。

```javascript:例
angular.module('filterTestApp')
  .filter('myfilter', function () {
    return function (input) {

      〜処理内容〜

    };
  });
```
RPMソースパッケージまとめ

よく忘れるのでメモ
メンテナーの皆さん有難う！

Fedora
http://ftp.riken.jp/Linux/fedora/releases/20/Everything/source/SRPMS/
http://ftp.riken.jp/Linux/fedora/releases/20/Fedora/source/SRPMS/
https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/source/SRPMS/

CentOS
http://vault.centos.org/6.5/os/Source/SPackages/

CentOS SCL
http://dev.centos.org/centos/6/SCL/x86_64/

OracleLinux
http://public-yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64/

OpenSuse
http://download.opensuse.org/source/distribution/13.1/repo/oss/suse/src/

epel
http://ftp.riken.jp/Linux/fedora/epel/6/SRPMS/

rpmforge
http://pkgs.repoforge.org/

JPackage
http://mirrors.dotsrc.org/jpackage/6.0/generic/free/SRPMS/

Remi / php
http://rpms.famillecollet.com/SRPMS/

Wing / php httpd samba
http://wing-net.ddo.jp/

Florian La Roche / python
http://jur-linux.org/download/el-updates/6/SRPMS/

ius / php python
http://dl.iuscommunity.org/pub/ius/stable/CentOS/6/SRPMS/

OpenSuse / ruby
http://download.opensuse.org/repositories/home:/takehironet/CentOS_CentOS-6/src/

Groonga / mecab groonga
http://packages.groonga.org/centos/6/source/SRPMS/

Nginx
http://nginx.org/packages/centos/6/SRPMS/

--

RPMパッケージの作成方法
http://www.vinelinux.org/docs/vine5/manuals/making-rpm.html
WildFlyでcookieにsecure属性をつける

# 概要

WildFlyをロードバランサの配下において、SSLをロードバランサで解除することを想定。
この場合、非SSLでWildFlyにリクエストが来てもSecure Cookieを発行したい。
WildFlyで常にSecure Cookieを返すようにする。

```xml:standalone.xml
            <servlet-container name="default" default-buffer-cache="default" stack-trace-on-error="local-only">
                <jsp-config/>
                <session-cookie http-only="true" secure="true"/>
            </servlet-container>
```

secureのついでにhttpOnly属性もつけておく。

出力されるCookieはこんな感じ。

```
Set-Cookie: JSESSIONID=8hcdNBxD85gw57wPoZrfUorq.host1; path=/exampledbtest; secure; HttpOnly 
```

デフォルトでJSESSIONIDの末尾にホスト名が付いているので、Sticky sessionとして使えそう。GlassFishの時はi1などホスト名ではないものをつけていたが、別の値に変更する方法はないものか。。。
GoでMongoDBを使う初歩

　GoでDBを使おうと思いMongoDBを使う方法を勉強したのでメモします。mongoDBのライブラリーとして使用したのはmgoを使っています。使うまでの手順を以下に示します。

**1. MongoDBのインストール**
　インストールはhomebrewを使います。homebrewのインストールは別途してください。

```
brew install mongodb
```
**2. bzrのインストール**
　mgoをインストール際に必要なライブラリーです。こちらもhomebrewでインストールします。xcode5.1ではエラーが出たので事前にhomebrewをupdateしておきます。

```
brew update
brew install bzr
```
　事前準備はこれで終了です。次に本体をインストールしていきます。
**3. mgoのインストール**
　こちらはhomebrewではなくてgogetを使います。homebrewのように簡単にできます。

```
go get labix.org/v2/mgo
```
**4. サンプルダウンロードして実行**
　サンプルはGoogle先生が教えてくれたこちらのものをコピペで使用しました。https://gist.github.com/border/3489566

**5.　サンプルの実行**
 コピペで作成したものをsample.goとして保存し実行します。

```
go run sample.go
```
　プロンプトにいかが出たら成功です。


Phone {ObjectIdHex("53493562e2c176e7e52e894a") Ale  2014-04-12 21:45:22.96 +0900 JST}
Results All:  [{ObjectIdHex("53493562e2c176e7e52e894a") Ale +55 53 1234 4321 2014-04-12 21:45:22.96 +0900 JST}]
Results All:  [{ObjectIdHex("53493562e2c176e7e52e894a") Ale +86 99 8888 7777 2014-04-12 21:45:22.967 +0900 JST}]

以上で完成です。
少しいじってみてからまた情報upします。
論文紹介：機械学習によるWeb Proxyのパフォーマンス改善

論文メモ

Web Proxy キャッシュのLRUアルゴリズムのパフォーマンスを教師付き機械学習で改善する

http://home.ijasca.com/data/documents/IJASCA18_Waleed.pdf

SVMが使われている模様。
Logstash + Elasticsearch を使ってみる


参考: [Getting started with logstash](http://logstash.net/docs/1.4.0/tutorials/getting-started-with-logstash)

ほとんど上記サイトの内容そのままです。

# 準備

java のバージョン確認

```
$ java -version
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode)
```

とりあえず、1.6 でしたが動いたっぽいです。

# ダウンロード & 解凍

```
curl -O https://download.elasticsearch.org/logstash/logstash/logstash-1.4.0.tar.gz
tar zxvf logstash-1.4.0.tar.gz
cd logstash-1.4.0
```


# とりあえず起動


```
bin/logstash -e 'input { stdin { } } output { stdout {} }'
```

上記は標準入力から収集したログを標準出力に書きだすだけの設定です。
ためしに`hello`とか打つと

```
hoge  <- 入力した内容
2014-04-12T12:05:53.958+0000 nakamatsu.local hoge <- 出力された内容
```

のようになります。

logstash では出力結果を様々な形式に加工する'codec'を持っている。
例えば'rubydebug'を使うと、Rubyのハッシュ形式の文字列として出力することができる。

```
hello
{
       "message" => "hello",
      "@version" => "1",
    "@timestamp" => "2014-04-12T12:11:57.424Z",
          "host" => "hogehoge"
}
```

# 出力をElasticsearchに格納する

## Elasticsearch のダウンロードと起動

適当な場所で以下を実行し、Elasticserch を起動する

```
curl -O https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.0.1.tar.gz
tar zxvf elasticsearch-1.0.1.tar.gz
cd elasticsearch-1.0.1/
./bin/elasticsearch
```

## 出力先を Elasticsearch にする

以下のように logstash を起動すると出力先が Elasticsearch になる

```
bin/logstash -e 'input { stdin { } } output { elasticsearch { host => localhost } }'
```

試しに標準入力から適当な文字を入れて、Elasticsearch に入ったかどうか確認する

```
curl 'http://localhost:9200/_search?pretty'
```

Elasticsearch はHTTPなAPIからアクセス可能で上記のURLを叩くと以下のようなJSON文字列が帰ってくる。

```
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 10,
    "successful" : 10,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "logstash-2014.04.12",
      "_type" : "logs",
      "_id" : "H7dSnW_TSTOVno_V25JYlQ",
      "_score" : 1.0, "_source" : {"message":"hello","@version":"1","@timestamp":"2014-04-12T12:17:51.216Z","host":"nakamatsu.local"}
    }, {
      "_index" : "logstash-2014.04.07",
      "_type" : "logs",
      "_id" : "_sisyTEvSRaqXt6TR3pXwg",
      "_score" : 1.0, "_source" : {"message":"hoge","@version":"1","@timestamp":"2014-04-07T04:00:34.590Z","host":"nakamatsu.local"}
    }, {
      "_index" : "logstash-2014.04.07",
      "_type" : "logs",
      "_id" : "_K48GJWeTLSUZzgrNXD7fg",
      "_score" : 1.0, "_source" : {"message":"you know, for logs","@version":"1","@timestamp":"2014-04-07T03:54:50.355Z","host":"nakamatsu.local"}
    } ]
  }
}


```

とりあえずここまで。
[Merged] ZK Custom CSS Messagebox

** この記事の内容は、本家にマージ済みです **

* * *

こんなかっこわるいポップアップ出てきたらどうしますか。。

![tumblr_inline_mp19duYt221qz4rgp.png](https://qiita-image-store.s3.amazonaws.com/0/41678/e7d575d4-ed8d-36a7-c5b6-f3222030e98b.png)


環境その1: ZK
============

シチュエーションと問題点
----------------------------------

* **ZK 7.0.0 以前の話**
* 任意のポップアップだけスタイルを変えたい場合に変えられない
* ボタンの幅を変えられない

ゴール
---------

ポップアップする Window の zul に、任意の sclass を付加できるようにする
(ボタンの幅等はそのクラスを使ってCSSで対応)


実際の手順
--------------

### 入れ替え対象 zul 作成

[Githubで検索](https://github.com/zkoss/zk/search?q=messagebox.zul&ref=cmdform)。
zul/src/archive/web/zul/html/messagebox.zul を元に作ることにする。

```html:my_messagebox.zul
<window title="${arg.title}" sclass="z-messagebox-window ${arg.sclass}"
  border="normal" width="260pt" closable="true"
  use="org.zkoss.zul.impl.MessageboxDlg" xmlns:w="client">
    <hbox>
        <div sclass="${arg.icon}"/>
        <separator spacing="13px" />
        <div sclass="z-messagebox">
            <label value="${arg.message}" multiline="true" w:onBind="zul.wnd.Messagebox.onBind(this, '${empty arg.width ? 350: arg.width}')"/>
        </div>
    </hbox>
    <separator spacing="15px"/>
    <hbox id="buttons" style="margin-left:auto; margin-right:auto">
        <custom-attributes button.sclass="z-messagebox-btn"/><!-- CSS class for buttons -->
    </hbox>
</window>
```

`${arg.sclass}`を足しただけ。


### 入れ替えトリガとなる Listener の作成

```java:jp.fio.zk.MessageboxSetTemplateListener.java
package jp.fio.zk;

import org.zkoss.zk.ui.util.WebAppInit;
import org.zkoss.zk.ui;
import org.zkoss.zul.Messagebox;

public class MessageboxSetTemplateListener implements WebAppInit {

    @Override
    void init(WebApp wapp) {
        Messagebox.setTemplate('/my_messagebox.zul');
    }

}
```


### Listener 登録

zk.xml に以下を追加

```xml:zk.xml
(snip)
<listener>
    <listener-class>jp.fio.zk.MessageboxSetTemplateListener</listener-class>
</listener>
(snip)
```


### show

groovy のコードで失礼。

```groovy
Messagebox.show(
    '変更箇所がありますが戻りますか？',
    '確認',
    [Messagebox.Button.OK, Messagebox.Button.ABORT, Messagebox.Button.CANCEL] as Messagebox.Button[],
    ['保存して戻る', '破棄して戻る', 'キャンセル'] as String[],
    null,
    null,
    null,
    [sclass: 'myMessagebox']
);
```


環境その2: ZKGrails
================

症状
------

動かない。。(画面ロード時にエラー)
エラー内容は控えるの忘れました。ごめんなさい。

対策
------

いやあ、ハマった。。
↑の ZK 対策で使った messagebox.zul ソース内の「$」を、全て「#」にするだけ。



こんなめんどくさいことしなくてもいいように
=====================================

[Forkした](https://github.com/yuki-takei/zk)。
Pull Request してみることにする。


後日談
=====

[Mergeされました](https://github.com/zkoss/zk/commit/22116381071cac83f501024b37ec64a57be72747)。
LightTableでDeveloper Toolsを利用する

LightTableでは（Chromeの？）Developer Toolsが利用できます。

User keymapで`:dev-inspector`のショートカットを作成して実行するか、コマンドバーで`dev-inspector`と入力して実行すると以下のような画面が別Windowで開きます。

![dev-inspector.jpg](https://qiita-image-store.s3.amazonaws.com/0/40558/0a910925-b58a-bd00-1b20-a1c9339a49f2.jpeg)

これで、スキン作成などの際にどのElementが何を表しているかがわかって便利になりそうです。

※自分の環境だけかもしれないけど、DeveloperTools開くとLightTable自体が落ちること良くあるので要注意
Yokohama.rb Monthly Meetup #43 メモ


# File.join と Pathname.join と JRuby

すべて、MacOS X 上で調査。

```ruby
# with ruby 2.1.1p76 
require "pathname"
File.join("a", "/") # => "a/"
Pathname.new("a").join "/" # => <Pathname:/>
File.join("a", "\\") # => "a/\\"
Pathname.new("a").join "\\" # => #<Pathname:a/\>
```

`File.join` と `Pathname#join` の結果が違う。

続いておなじことを JRuby で。

```ruby
# with jruby 1.7.9 (1.9.3p392)
require "pathname"
File.join("a", "/") # => "a/"
Pathname.new("a").join "/" # => <Pathname:/>
File.join("a", "\\") # => "a/\\"
Pathname.new("a").join "\\" # => <Pathname:\>
```

ふつうの ruby とは、 `Pathname.new("a").join "\\"` の結果が違う。

これは結構マズイと思う。
カレントに `a`, `b`, `\` という名前のファイルがあるときに、

```ruby
Dir.glob("*").map{ |c| Pathname.pwd+c }
```

とすると、得られる値は、
ふつうの ruby だと

```
 <Pathname:/Users/nabetani/yokohama.rb/qiita/\>,
 <Pathname:/Users/nabetani/yokohama.rb/qiita/a>,
 <Pathname:/Users/nabetani/yokohama.rb/qiita/b>,
```

と、まあそりゃそうだという内容なんだけど、 JRuby だと

```
 <Pathname:\>,
 <Pathname:/Users/nabetani/yokohama.rb/qiita/a>,
 <Pathname:/Users/nabetani/yokohama.rb/qiita/b>,
```

という恐ろしいことになる。
Windows への気遣いが裏目に出た感じだと思うけど、どうなんだろ。

まあしかし。
そもそも
`Pathname.new("a").join "/"`
が
`<Pathname:/>`
になるのが、なんのためなのかわからない。
Creating rails project and connecting to GIThub

Basic Rails project creation and Sharing with Github

I choose to practice coding on Aptana studio 3 because on some moment I found my eclipse clashing.
And before I might forget the steps, I will write it here for the future use. (might forget it!)
It will not be a problem because aptana is developed as a eclipse IDE so any plugin for eclipse can also be use on Aptana studio.

Create Rails Project – Aptana Studio

Step 1: Go to File -> New -> Rails Project (if Rails Project is not on the list, click on Project… and select Rails Project inside the pop-up window).

Step 2: Set a name for your project inside Project Name field.

To use my project on Github, I have to share and link the project to Github Repo.

**Sharing to a local repository

1.Right-Click on Project Name, select Team -> Share Project…. After you clicked on Share Project there will appear a new window.

2. Click on Project Name as it appears under Project column on the new window. Note: Do not click on Path or Repository because it will not select the instance of the project.

3. After you clicked on the Project Name, there will be an active button called Create on the bottom of the window. Click on it. Do not change the value of the input field next to the button because it automatically sets the address of .git-config file inside your Project Folder.

4. By clicking the Create button you will notice that Repository field will be populated with the .git-config file address. Click on Finish.

In this moment you will notice that your project name will have [master] added at the end of the name. This means that the project is shared.

And as long as you have linked the project, commiting and pushing is just a piece of cake!

![1111.png](https://qiita-image-store.s3.amazonaws.com/0/41038/821a5548-007b-8db1-5ef0-36c1be6151d3.png)

![22.png](https://qiita-image-store.s3.amazonaws.com/0/41038/a5b9daa8-7866-de58-a594-3d2a35280b83.png)

That's all for this week.
docker meetup tokyo #2 memo

docker meetup tokyo #2 に行ってきました。

### スケジュール
[docker meetup tokyo #2](http://connpass.com/event/5640/)

google platform $500分使わないとね。

### twitter hashtag #dockerjp
[twitter hashtag](https://twitter.com/search?q=%23dockerjp)

### スライドとか

* [Docker基礎+docker0.9, 0.10概要] (http://www.slideshare.net/mainya/dockerdocker09-010)

* [Linux kernel のコンテナ機能] (https://speakerdeck.com/tenforward/11)

* [Dockerアプリケーションのポータビリティを考える](https://speakerdeck.com/naoya/dockerapurikesiyonfalsepotabiriteiwokao-eru-number-dockerjp)
  [上記のデモで使うリポジトリ] (https://github.com/naoya/docker-paas-example)

* [コンテナ内で複数のサービスを管理する試み](http://slides.com/yoheikawahara/deck)

* [Docker +serverspecで作るconfigspec CI](http://dev.classmethod.jp/cloud/aws/docker-serverspec-configspec-ci/)

* [Docker meets AWS OpsWorks](https://speakerdeck.com/takipone/docker-meets-aws-opsworks)

* [Aiming解析チームでのDockerの利用](http://futoase.github.io/presentation-docker-meetup-tokyo-2/)

* [GCE+Docker+etcdでレイトレ] (http://lighttransportengine.com/)

* [Fluent Dashboard＋Norikraでリアルタイムダッシュボードを7分で作る話 #dockerjp](http://qiita.com/kazunori279/items/6329df57635799405547)

* [Docker ApplicationをDaaSにデプロイ #dockerjp](https://speakerdeck.com/tcnksm/docker-applicationwodaasnidepuroi-number-dockerjp)

* [Data center to distributed cloud slideshare](http://www.slideshare.net/shigeyoko/data-center-to-distributed-cloud-slideshare)

### まとめ

* [Docker Meetup Tokyo #2　まとめ #dockerjp](http://gitpub.hatenablog.com/entry/2014/04/12/020901)
* [Docker Meetup Tokyo #2 へ行ってきました #dockerjp](http://www.koemu.com/blog/2014/04/12/docker-meetup-tokyo-2/)

### 気になったURL

##### https://orchardup.com/
安い

##### http://wercker.com/

##### https://asciinema.org/

### 感想

https://twitter.com/yanap/status/454592036109172736

docker使ってないので、使ってみようと思いましたw
JavaFX webview が取得した cookie を取得したり、新しく設定したりしたい

新しく cookie を設定したいときは webview のインスタンスを生成してから URL を load するまでの間で以下の様な形で cookie を設定してあげれば良いようです。

```java
public static function test() throws Exception
{
     webView = new WebView();
      LinkedHashMap<String, List<String>> headers = new LinkedHashMap<>();
      headers.put("Set-Cookie", Arrays.asList("key=value");

      CookieHandler.getDefault().put(new URI("http://www.sample.com"), headers);

      WebEngine engine = webView.getEngine();

      engine.load("http://www.sample.com/test");
}
```


webview が取得した cookie を取得したいときは以下のようにすればいいみたい

```java
CookieHandler cookieHandler =
     CookieHandler.getDefault();

LinkedHashMap<String, List<String>> map = cookieHandler.get(
            new URI("https://www.sample.com/"),
            new LinkedHashMap<String, List<String>>()
);

// "key1=value1; key2=value2;" のような文字列で返ってきます
String allCookieString = map.get("Cookie").get(0);

```
yieldのブロックの中でreturnが不可解な挙動（とりあえずメモっとく）

```rb

class SampleController < ApplicationController
  def action
   doit do 
     # あれやこれや
     return 'TEST' # returnやbreak付けると正常に戻らなかった。別の処理に入って、MissingTemplateしていた。あれ？なぜ？
     'TEST' # こうすると何事も無く戻った
   end
  end

  def doit
    #あれやこれや
    ret = yield 

    respond_to...
  end

end
```

まだrubyの理解が足りていない様子で、returnが付く時と付かない時の挙動の違いすら把握できていないらしい。修行が足りません。
vagrant & Veewee  を windows 上で利用する


vagrant の導入（Windows）
http://www.vagrantup.com/
ここから msi を取ってきてインストール

勝手にパスが引かれるのでいきなり vagrant コマンドが使えるようになる
試しに公式からubuntuイメージを取ってきていれる

```
vagrant init precise64 http://files.vagrantup.com/precise64.box
```

どうすれば ssh できるか見る

```
vagrant ssh-config
```

試してみる

```
ssh vagrant@127.0.0.1 -p2222
```

設定を突っ込むと楽

```
vagrant ssh-config >> ~/.ssh/config
```

Veewee  の導入
適当に clone する

```
git clone git://github.com/jedi4ever/veewee.git
```

終わったら bundle install

```
cd veewee
bundle install
```

gem json のインストールでこけたら
http://rubyinstaller.org/downloads/
にいって Development Kit の For use with Ruby 2.0 (x64 – 64bits only) をダウンロード
http://cdn.rubyinstaller.org/archives/devkits/DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe

ダウンロードしたディレクトリに移動

```
cd "~\Downloads\DevKit-mingw64-64-4.7.2-20130224-1432-sfx"
ruby dk.rb init
ruby dk.rb install
```

veewee に戻って、Boxの作成に入る
まずは template を veewee に作成させる

```
cd veewee
bundle exec veewee vbox templates
```

いろいろ出力されるので、ここからいい感じのものを抜き出す
今回はこれを利用する

```
bundle exec veewee vbox define 'debian-wheezy' 'Debian-7.2.0-amd64-netboot'
```

ビルド中に落ちるのでこのファイル
c:/Ruby/lib/ruby/gems/2.0.0/gems/net-ssh-2.7.0/lib/net/ssh/config.rb
の先頭に以下のものを追加。（もっといい方法があるはず・・。

```rb
Encoding.default_external = "utf-8"
```

ビルドする

```
bundle exec veewee vbox build debian-wheezy
```

export すればいい感じにできる

```
bundle exec veewee vbox export debian-wheezy
```

早速されをできあがったボックスを登録して起動

```
vagrant init debian-wheezy
vagrant up
```
はい、終わり、疲れた
LightTableでショートカットキーで任意のコード実行

LightTableには:eval.customという任意のコードを実行できる機能があります。

例えばUser keymapに

```
"ctrl-e" [(:eval.custom "(macroexpand-1 '__SELECTION__)")]
```

と設定しておくと、ctrl-eで選択中のコードのマクロ展開ができます。
※`__SELECTION__`は選択中のコードで置き換えられます。

実行結果はデフォルトではエディタ内にインラインで表示されます。
出力先を変えたい場合は2番目の引数のマップで:result-typeを指定します。

```
"ctrl-e" [(:eval.custom "(macroexpand-1 '__SELECTION__)" {:result-type :statusbar})]
```

:result-typeには以下のものが指定できます。

|値|概要|
|:--|:--|
| :inline |エディタ内にインライン表示（デフォルト） |
| :statusbar |ステータスバーに表示|
| :silent |表示しない|
| :replace |選択中のコードを実行結果で置き換え|

また、その他のオプションとして以下も指定できるようです。（試してませんが）

|オプション|概要|
|:--|:--|
| :verbatim |実行結果にpr-strを適用するか否か（true/falseを指定）|
| :ns |実行するネームスペースを文字列で指定|
| :class |表示部分に適用するCSSクラスを文字列で指定|

&nbsp;    
また、:eval.customの他にも:editor.watch.custom-watch-selectionでWatchのカスタマイズもできるようです。
詳細は[このページ](https://groups.google.com/forum/#!msg/light-table-discussion/lyFzPGI2XMs/apVN0qkS8sgJ)を参照してください。
msys 環境で screen をビルドする

http://d.hatena.ne.jp/j_m/20071101/1193941693
上の優秀な資料をさらに親切にしただけです。

```bash
wget http://ftp.gnu.org/gnu/screen/screen-4.0.3.tar.gz
wget http://ftp.eq.uc.pt/software/pc/prog/cygwin/release/screen/screen-4.0.3-1-src.tar.bz2
tar xvzf screen-4.0.3.tar.gz
tar xvjf screen-4.0.3-1-src.tar.bz2
sed -e 's/__CYGWIN__/__MSYS__/g' screen-4.0.3-1.src.patch > screen-4.0.3-1.src.patch.msys
patch -p1 -d . < screen-4.0.3-1.cygwin.patch
patch -p1 -d . < screen-4.0.3-1.src.patch.msys
cd screen-4.0.3
autoconf
CFLAGS="-DNCURSES_STATIC" ./configure --prefix=/usr/local
make
make install
mkdir -p /var/run
touch /var/run/utmp
touch /etc/ttys
```
即売会サービスを作ろう４(in Python mini Hack-a-thon)


サークル関係のapiは出来たので、次はアイテム関係のapiを作ります。
今回は (第42回)Python mini Hack-a-thon に参加して作業してました。 
http://connpass.com/event/5775/


![additem.jpg](https://qiita-image-store.s3.amazonaws.com/0/2029/46534ad2-2330-62d8-2828-f3f963ab8bdd.jpeg "additem.jpg")

こんなUIから登録できるようにします。


##新しく覚えたこと

### Entityの設計 について

やることは前回とほとんど一緒ですが、今回は登録されるサムネイルが１枚〜４枚と変動しています

```Python
#サークルが販売しているアイテム情報。１エンティティ=１アイテム
class CircleItem(BaseModel):
    circleInfomation = ndb.KeyProperty(kind=CircleInfomation)   # 販売サークル
    name = ndb.StringProperty()     	# アイテム名
    thumbUrls1 = ndb.StringProperty() 	# アイテムサムネイルその１
    thumbUrls2 = ndb.StringProperty() 	# アイテムサムネイルその２
    thumbUrls3 = ndb.StringProperty() 	# アイテムサムネイルその３
    thumbUrls4 = ndb.StringProperty() 	# アイテムサムネイルその４
    description = ndb.StringProperty()	# アイテム説明
    count = ndb.IntegerProperty() # 販売個数
    price = ndb.IntegerProperty() # 販売金額
```

と、サムネイルごとにプロパティを入れてもいいのですが、サムネイルプロパティの目的はすべて一緒なので
一つのプロパティにまとめて入れてしまっても良さそうです。


```Python
#サークルが販売しているアイテム情報。１エンティティ=１アイテム
class CircleItem(BaseModel):
    circleInfomation = ndb.KeyProperty(kind=CircleInfomation)   # 販売サークル
    name = ndb.StringProperty()			# アイテム名
    thumbUrls = ndb.StringProperty(repeated=True) # アイテムサムネイルのURL(最大４つ)
    description = ndb.StringProperty()	# アイテム説明
    count = ndb.IntegerProperty() 		# 販売個数
    price = ndb.IntegerProperty() 		# 販売金額
```

こうしました。


### クエリのカーソル処理 について

サーバ内にある複数回のリクエストにわけて表示させようとした場合、カーソル処理を行います。
AppEngineSDK には便利な関数が用意されているので、そちらを土台に続きがあればURLを添付するようにしてます。
URL生成には webapp2#uri_for が便利でした。


```Python

# DataStoreへクエリ実行
entitylist, next_curs, more = CircleItem.query(CircleItem.circleInfomation==circleInfo.key).fetch_page(limit, start_cursor=cursor)

# 続きがあるなら次のURLを生成
next_url = None
if more:
	next_url = webapp2.uri_for('Infomation',circleid=circleid,limit=limit,cursor=next_curs.urlsafe())

# 今回のデータを設定
itemList = []
for e in entitylist:
	item = Common.createCircleItemResponseFromEntity(e)
	itemList.append(item)

res = dict(
	itemList = itemList,
	next = next_url
)

# JSON化してクライアントへ返す
Common.writeUserResponseSuccess(self, res )
```

たとえば
http://localhost:8080/user/api/circleitem/infomation?circleid=1
こんなリクエストを投げた場合、

```JSON
{
	"response":
	{
		"status":200
	},
	"next":"http://localhost:8080/user/api/circleitem/infomation?circleid=1&limit=1&cursor=E-ABAIICLWoSZGV2fmZyZWVtYXJrZXQtYXBwchcLEgpDaXJjbGVJdGVtGICAgICA4JcJDBQ=",
	"itemList":
		[
			{
				"price":1000,
				"thumbUrls":[
					"http://localhost:8080/user/api/circleitem/thumbnail?circleitemid=5171003185430528&no=0"
				],
				"count":12,
				"name":"アイテム名",
				"description":"アイテム詳細"}
		]
}
```

このようなリクエストが返ってきて、`"next":"http://localhost:8080/user/api/circleitem/infomation?circleid=1&limit=1&cursor=E-ABAIICLWoSZGV2fmZyZWVtYXJrZXQtYXBwchcLEgpDaXJjbGVJdGVtGICAgICA4JcJDBQ="`この部分を再度サーバに投げることで順番に取得できます。



そんな感じで今日までのブランチができました
https://github.com/nagai/freemarket/tree/20140412




##今後の課題

* UIの色を変更したい
* 配送方法が不明
* エラー処理を決めたい
クライアントのリクエストが不正だった場合にどうするかをきめたほうがきめる
・アプリ再起動
・同じリクエストを再度行う
あたりがいいかな？

* テストをしたい
今は chrome extentionのAdvanced REST client を利用してぽちぽち試しているのですが
そろそろ手間が増えてきたのでなにか別の方法を導入したいです。

##次回
次はクライアント側を作ります。
Elasticsearch の index templates で解析方法を指定する（または、default mapping が効かない時に）


Elasticsearch の（恐らく）1.0 から `/etc/elasticsearch/default-mapping.json` に設定を書いても mappings に反映されなくなりました。今後は [index templates](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-templates.html) 機能を使う必要があります。

index templates は API 経由で設定することも、ファイルを設置することもできます。運用上適した方を使えばいいでしょう。

## API
`localhost:9200/_template/<template_name>` に json を PUT/GET/DELETE すれば ok です。

例えば kibana で使う `accesslog-YYYY.MM.DD` という index 用の設定は次のようになります。

```json
{
  "template": "accesslog-*",
  "mappings": {
    "fluent": {
      "properties": {
        "host": {
          "type": "string",
          "index": "not_analyzed"
        },
        "uri": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}
```

これを `curl -XPUT localhost:9200/_template/accesslog -d ...` のようにして保存します。

template キーの `accesslog-*` という値が、各 index に対してこのテンプレートを適用するか判定するパターンになります。`accesslog-2014.04.12` という名前の index が作成されると、パターンにマッチするのでこのテンプレートが適用されます。

mappings の下の `fluent` はタイプ名で、`fluent` というタイプで投入したデータに対して mappings を適用するように範囲を限定しています。properties 以下がデータの各キーに対する mapping で、この例では `host` と `uri` を string 型で indexing 時に解析しない（そのままのデータを使う）ように指定しています。それ以外のキーは dynamic mapping 機能で自動的に処理されます。

Fluentd と [fluent-plugin-elasticsearch](https://github.com/uken/fluent-plugin-elasticsearch) でデータを流し込むなら、`fluent.conf` は以下のようになるでしょう。

```
<match pyfluent.**>
  type elasticsearch
  host localhost
  port 9200
  logstash_format true
  logstash_prefix accesslog
  type_name fluent
  include_tag_key true
  tag_key @tag
  flush_interval 5s
</match>
```

流し込むデータは次のようなものを想定しています。

```json
{"host": "127.0.0.1", "uri": "/users/1", "method": "GET", ...}
```

## ファイル
API 経由ではなく、ファイルを使って設定することもできます。その場合 `/etc/elasticsearch/templates/<template_name>.json` ファイルを作成します。

注意が必要なのは、API 経由の時と微妙にデータ構造が異なることです。先ほどの例だと、次の内容で `/etc/elasticsearch/templates/accesslog.json` を作成します。

```json
{
  "accesslog": {
    "template": "accesslog-*",
    "mappings": {
      "fluent": {
        "properties": {
          "host": {
            "type": "string",
            "index": "not_analyzed"
          },
          "uri": {
            "type": "string",
            "index": "not_analyzed"
          }
        }
      }
    }
  }
}
```
GLRパーサの問題点

前回までの内容はこちらです。

[caperの紹介](http://qiita.com/jonigata/items/2a4e3b642afd20970eb2)
[GLRパーサの実装(背景編)](http://qiita.com/jonigata/items/69381937b2d5b0af410c)
[GLRパーサの実装(コーディング編)](http://qiita.com/jonigata/items/fc1764dde1fa62cdac2f)

今回は、GLRを実用する上での問題点について考えていきたいと思います。

# GLRの実用上の問題点

## GLRは決定的でない

私が考える、GLRパーサジェネレータを実用化する上での一番の問題は、「真実はいつもひとつ」じゃないことです。前々回ご紹介したシミュレータをいじっていただければわかると思いますが、文法的には正しくても複数の解釈が可能なのです。

LALRパーサであれば、deterministicであるため、エラー以外でセマンティックアクションの結果が捨てられることはありません。そのため、例えばセマンティックアクションの中でASTノードが生成された場合、エラーに遭遇しなければそのノードはまず確実に使われます。

ところが、GLRは、今まで解説してきたように、曖昧な局面ではパーサを複製しますので、仮に最終的にはひとつの解釈に収まるような文法であっても、そこに至るまでに本筋でないパーサがセマンティックアクションを起動してしまうことがあります。その結果、全体としてはパースに失敗していないのに、セマンティックアクションの結果が無用のものとして捨てられるといったことが頻繁に発生し得ます。

また、GLRでは、単純に、ひとつの文章について合法的に複数の解釈が可能になるという問題も挙げられます。どれが望む解釈なのかをユーザに選択させる方法が必要になってくるでしょう。

## GLRパーサのデータ構造は単純でない

前回示したように、GLRパーサのデータ構造は通常のLRパーサほど単純ではありません。もしGCのない言語で実装しようとすると、ヒープを利用してshared_ptr的なものを使うか、あるいは自前でアロケータを作るようなことをするしかないと思います。またGCが存在する環境で動かすとしても、ある程度ヒープを食い散らかすような動作にせざるを得ないでしょう。応用はその分狭まることになるかと思います。

また、GCのない環境では、上記の「全体としてはエラーが起きていないのにセマンティックアクションの結果が捨てられることがある」問題にも、ユーザが対応しなければいけません。つまり、ユーザがGCのようなものを用意しなければならないことになります。C++であれば、現実的にはshared_ptrを使うしかないのではないでしょうか？

# 私の考える「便利なGLR」

そういったようなことを踏まえると、やはりGLRの真価は、「スキャナーレスでASTまで生成してくれる」ような「こまけえことはいいんだよ型オールインワンフロントエンドジェネレータ」でこそ発揮されると思っています。caperでかなりの部分を汎用的にしたのとは真逆の方向性です。ジェネレータも、C++では現実的にはshared_ptr以外考えにくいのでそうと決めつけるし、C++以外のジェネレータではもちろん容赦なくGCを使う感じです。

急にDSLが欲しくなった時にものすごく気軽に作れる道具、というのが想定しているユースケースです。

といったわけで、これから作るGLRパーサはcaperとしては独立したコマンドにしようかと思っています。レポジトリは面倒なので一緒にしようかと思っていますが。もしご興味のあるかたがいらっしゃったら、ぜひjonigata@twitterをフォローしていただけると励みになります。
mac os 再インストール

### 再起動

⌘ + R を再起動してグレーの画面がでてきたら押す
OS Xインストールやディスクユーティリティが選べる画面が立ち上がる

### ディスクユーティリティ

ディスクユーティリティの画面で起動ディスク選んで、右側の消去のタブから消去する。

セキュリティオプションはひとつレバーを右側にしてゼロオプションで消去するのが時間と安全のバランス的に良い。

### パーティション

一番上のHDDの 500GB　TOSHIBAとかなってるとこ選んで、パーティションを２つにしてたので、消して、作り直した。

ディスクユーティリティ終了

### USBからインストール

あらかじめ作っておいたインストールディスクを使う

http://c-through.blogto.jp/archives/34782560.html
http://weekly.ascii.jp/elem/000/000/156/156669/

USBをさす

再起動して立ち上がるときにoptionを押すとOS Xをどこからインストールするか
選べる画面にいくので、そこで、作っておいた、USBを選択する 

### インストール

OS X をインストールを選ぶ
さっき、作り直したパーティションにインストールするので、そのHDDのアイコンを選ぶ

インストール完了後、⌘ + q で終了する

http://support.apple.com/kb/ht5189?viewlocale=ja_JP

### ピープー音

mac mini の後ろあけて、メモリがひとつうまくささってなくて
8GBがあるはずが、4GBになってたんで、ちゃんとはめないとねっていうことで
はめたはずが、ピープー音ですよ。３回なったらメモリバンクに問題がありますって、そらね。手前のメモリ奥までささってないからですね。

メモリは奥まで、カチッといれましょう！
zshでディレクトリにcdした際に自動的にvirtualenvを有効にする


virtualenvは、Pythonの環境を自由に切り替えられて便利なものの、同時に複数のプロジェクトを扱っている場合など、いちいちディレクトリに移動して、`source .venv/bin/activate`のようなコマンドを実行しなくてはいけなくて少し面倒。

そこで、zshでディレクトリにvirtualenvの設定が存在した場合に、自動的に環境を切り替えるように設定してみる。

zshでは、ディレクトリが変更された際に自動的に`chpwd`関数が呼ばれる。これを用いて、例えば、virtualenvを格納しているディレクトリ名が`.venv`の場合には下記のように設定する。

```
function chpwd() {
    if [ -d .venv ]; then
        source .venv/bin/activate
    fi
}
```

これで、zshでディレクトリにcdするとvirtualenvを自動的に有効にすることができる。
Unity4からNode.jsのWebSocket接続してみた。

Unity4からWebSocket接続してみた。

いろいろ苦戦したが、出来た。

#githubからwebsocket-sharpをDL
VS2013でビルドする場合、ビルドターゲットを.netフレームワークバージョン3.5にする
↑これはまった。Unity4は.NETが3.5みたいね。

#Unity側のWebSocketクライアント
以下のブログを参考にした
Geisha Tokyo Engineers' Blog
[超簡単]UnityでWebSocketを使ってチャット ~Playと一緒~
http://blob.geishatokyo.com/archives/180003
このブログはScala PlayでWebSocketサーバ作ってた。
ひとまず今回はインストールとかめんどいのでNode.jsで作る。

#node.jsのWebSocketサーバ立てる
以下のブログを参考にした
感謝のプログラミング 10000時間 一緒に、プログラミングを学ぼう。
2013-06-10
Node.jsでWebSocketサーバを作ってみる。
http://programming-10000.hatenadiary.jp/entry/20130610/1370844721

で、出来た。

初め、socket.ioでやろうとしたらUnityからつながらなかった。
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="top"><div style="border:1px solid;margin:0px;padding:6px 0px;width:260px;text-align:center;float:left"><a href="http://hb.afl.rakuten.co.jp/hgc/02b75513.56077fcc.04549cd7.9cd6da87/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f12720545%2f%3fscid%3daf_link_tbl&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f16882369%2f" target="_blank"><img src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f1049%2f9784798041049.jpg%3f_ex%3d240x240&amp;m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f1049%2f9784798041049.jpg%3f_ex%3d80x80" alt="【楽天ブックスなら送料無料】Unity実践技術大全 [ 菊田剛 ]" border="0" style="margin:0px;padding:0px"></a><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px"><a href="http://hb.afl.rakuten.co.jp/hgc/02b75513.56077fcc.04549cd7.9cd6da87/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f12720545%2f%3fscid%3daf_link_tbl&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f16882369%2f" target="_blank">【楽天ブックスなら送料無料】Unity実践技術大全 [ 菊田剛 ]</a><br><span style="">価格：3,996円（税込、送料込）</span><br></p></div></td></tr></table>
Apacheでのクライアント認証の仕組み

HTTPS通信とクライアント認証で、秘密鍵・公開鍵・証明書の違いがよく分からなかったので、調べてみました。自分用メモなので分かりづらいかもしれませんが、すみません。

# クライアント認証の仕組み

## 概要
> 1. クライアントは、サーバへhttps接続
> 1. サーバはクライアントに、クライアント証明書を要求
> 1. クライアントは、クライアント証明書をサーバへ送付
> 1. そのとき、クライアント証明書をユーザが選択する
> 1. サーバは署名されたクライアント証明書を解読しクライアントの公開鍵を取得
> 1. クライアントは、送付メッセージにダイジェストを付加し、クライアントの持つ秘密鍵で暗号化する
> 1. サーバは、クライアントの公開鍵を使ってメッセージを解読
> 1. 解読したメッセージからメッセージ・ダイジェストを作成し、クライアントが付加したメッセージ・ダイジェストと比較する
> 1. 一致が確認されれば、信頼できるクライアントから改ざんされていないメッセージを受信したと言える
> 
> 引用元：http://alk.dip.jp/apache2-default/sv290.html

※ポイント
HTTPSでのSSL通信は、秘密鍵暗号方式であるのに対し、クライアント認証は、公開鍵暗号方式。秘密鍵と公開鍵の役割が異なるので注意。
暗号方式の違いについては　http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/kagi.htm　参照

## サーバはどうやってクライアントを認証するのか

サーバはクライアント証明書を持っているクライアント（例えば、他サーバにアクセスするためのクライアント証明書しか持っていないクライアント）を全て認証する訳にはいかない。任意のクライアントに対し、どの条件で照合し認証しているのか。

⇒　照合条件は、 *SSLVerifyDepth*, *SSLCACertificateFile* で設定することができる。

### SSLVerifyDepth

> mod_ssl がクライアントが有効な証明書を持っていないことを決定する前に、どれくらい深く確認しなければならないか設定する。 デフォルト値は 1。
> 
> 深さは、クライアント証明書を認証するのに必要な CA 証明書の最大数。 深さ 0 なら、自己署名されたクライアント証明書だけ許可される。 デフォルトである深さ 1 なら、自己署名されたクライアント証明書もしくは SSLCACertificateFile ディレクティブで指定した証明書の CA によって署名されたクライアント証明書が許可される。
>
> 引用元：http://www.nina.jp/server/slackware/httpd/ssl.conf.html

### SSLCACertificateFile

> クライアント証明書を発行した CA の、CA 証明書ファイルを指定する。 クライアント認証で使用される。 複数の CA で発行されたクライアント証明書を使用する場合は、SSLCACertificatePath ディレクティブを使用する。
>
> 引用元：http://www.nina.jp/server/slackware/httpd/ssl.conf.html

### その他のディレクティブ

* SSLCARevocationFile
クライアント証明書を発行した CA の、失効証明書リストファイルを指定する。 破棄されたクライアント認証を確認するために使用される。
* SSLVerifyClient 
クライアント認証のレベルを設定する。requireを指定すれば、クライアント認証が必須となる。
MountainLionでBTデバイスのバッテリー状況を取得

# MountainLionでBTデバイスのバッテリー状況を取得

## 目的

* システム環境設定で見るのが苦痛だった。
 * Geektool で表示させてしまえばいい

## コマンド

### Keybord

```
$ ioreg -n "AppleBluetoothHIDKeyboard" | grep -i "batterypercent" | tr '|' "\n" | tail -n1 | sed 's/.*= \([0-9]*\)$/\1%/'
61%
```

### Trackpad

```
$ ioreg -n "BNBTrackpadDevice" | grep -i "batterypercent" | tr '|' "\n" | tail -n1 | sed 's/.*= \([0-9]*\)$/\1%/'
30%
```

### Mouse

```
$ ioreg -n "BNBMouseDevice" | grep -i "batterypercent" | tr '|' "\n" | tail -n1 | sed 's/.*= \([0-9]*\)$/\1%/'
```

 * 持ってないので多分、大丈夫という感じ
Symfonyの各ディレクトリの役目

* app/: アプリケーション設定を含むディレクトリ
>日常的な開発においては、app/config/ ディレクトリの中の設定やルーティングファイルを編集するために app/ ディレクトリをよく使うでしょう

* src/: プロジェクトのすべての PHP コードはこのディレクトリの下に格納されます
>簡単にいえば、src/ ディレクトリは、アプリケーションを動かすためにあなたが書いた実際のコードすべてを含んでいます。例えば、PHP コード、テンプレート、設定ファイル、スタイルシートなどを含んでいます。開発するとき、ほとんどの作業は、このディレクトリに作った 1 つ以上のバンドルの中で完結しています。

* vendor/: 慣例ではあらゆるベンダーライブラリはここに置かれます

* web/: ここはウェブルートディレクトリで、公開してアクセス可能なファイルはここに含めます
>ウェブルートディレクトリは公開する静的なファイルすべてを置く場所です。画像やスタイルシート、そして JavaScript も含みます。また次のようなフロントコントローラーを置く場所でもあります:
Brew Update でコケる対処


何か１月に一回はコケててそのたびに直し方を検索してる気がするのでメモ


```shell
[yasui@Yasui-MBA2: ~][15:35] $ brew update
error: Your local changes to the following files would be overwritten by merge:
	Library/Contributions/brew_bash_completion.sh
	Library/Contributions/brew_zsh_completion.zsh
	Library/Contributions/cmd/brew-services.rb
...
	L
error: The following untracked working tree files would be overwritten by merge:
	Library/Aliases/vid.stab
...
	Library/Formula/sparkey.rb
Please move or remove them before you can merge.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master
[yasui@Yasui-MBA2: ~][15:35] $ cd /usr/local
[yasui@Yasui-MBA2: /usr/local][15:36] $ git fetch
[yasui@Yasui-MBA2: /usr/local][15:36] $ git reset --hard origin/master
error: unable to unlink old 'README.md' (Permission denied)
fatal: Could not reset index file to revision 'origin/master'.
[yasui@Yasui-MBA2: /usr/local][15:39] $ sudo git reset --hard origin/master
Password:
HEAD is now at cd9c98b Use .diff instead of .patch for github commit sourced patches
[yasui@Yasui-MBA2: /usr/local][15:39] $
```

そんな感じ。
berkshelf のインストール


Chef のRepositoryからrecipeを撮ってくる場合、
そのrecipeの依存関係等があるので、結局、
依存関係の管理が必要になってくる。
それを、gem や、apt の様に良い感じに、解決してくれるのが、
berkshelf というものらしい。


[Berkshelf で Chef Cookbook の管理](http://jedipunkz.github.io/blog/2013/03/17/berkshelf-chef-cookbook-manage/)


このページを参考にさせていただいて、インストールしようとしたのだが、NativeのコンパイルでError

```
% sudo gem install berkshelf                         [~/Development/connect/ChefRepoSoftetherServer]
Password:
Building native extensions.  This could take a while...
ERROR:  Error installing berkshelf:
ERROR: Failed to build gem native extension.
...
linking shared-object hitimes/2.0/hitimes.bundle
clang: error: unknown argument: '-multiply_definedsuppress' [-Wunused-command-line-argument-hard-error-in-future]
```

どうやら、Xcode 5.1のバージョンアップに対応していないらしい。

[【Mac】clang によるビルドエラー【Xcode 5.1】](http://2no.hatenablog.com/entry/2014/03/14/061952)

上記ページを参考にして、

```
% sudo -s
# ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future gem install berkshelf
```

として、コンパイルオプションをつければ、インストールできる。
インクリメントリターン


Java小ネタ。

後置インクリメントは値の評価後に加算処理が行われるのはおなじみですよね。
で、こんな感じで関数のreturnでインクリメントしたらどうなるのだろうと。

``` java
public class Foo {
	
	private static int x = 0;
	public static void main(String[] args) {
		System.out.println(countUp()); // -> 0
		System.out.println(countUp()); // -> 1
	}
	
	private static int countUp() {
		return x++;
	}
}
```

加算前の値をreturnした後に、加算処理が行われているようです。良かったです。
・・・returnした後に、加算処理？

なんでこんな芸当が出来るのかよくわからなくなったので、マシン語翻訳。countUpの部分です。

``` javap
  private static int countUp();
     0  getstatic Foo.x : int [10]
     3  dup
     4  iconst_1
     5  iadd
     6  putstatic Foo.x : int [10]
     9  ireturn
      Line numbers:
        [pc: 0, line: 11]
```

変数を複製して、スタティックフィールド(x)に反映する値と、returnで戻す値を別々に用意しているようです。なるほど。
lisp-mode + outline-mode で快適生活

リンクは以下。

* http://www.emacswiki.org/emacs/OutlineMode
* http://www.emacswiki.org/emacs/?action=browse;oldid=outline-magic.el;id=OutlineMagic

C-Tab で、カッコをたたんで開いて。
そういえば、自分 paredit 入れてないなあ。入れようか。
自分は途中まで書いて`C-c ]`だからなー

```el
(add-to-list 'load-path (site "outline-magic"))
(eval-after-load 'outline
  '(progn
    (require 'outline-magic)
    (define-key outline-minor-mode-map (kbd "<C-tab>") 'outline-cycle)))

(defun lisp-mode-common-hook ()
  (require 'slime-annot)
  (require 'hyperspec)
  (require 'cl-indent-patches)
  (outline-minor-mode t)
  (eldoc-mode t)
  (setf truncate-lines t)
  (setq tab-width 8))
```
Pixivイラスト検索APIの取得結果のデータ構造を調べる

#概要
Pixivイラスト検索APIの取得結果のデータ構造を調べた。（2014/3/31時点）

#対象API

（URL）
http://spapi.pixiv.net/iphone/search.php

（サンプルURL）
http://spapi.pixiv.net/iphone/search.php?&s_mode=s_tag&word=(%E7%99%BE%E5%90%88%20OR%20%E3%83%AC%E3%82%BA)%20-%E8%85%90%E5%90%91%E3%81%91&order=date&PHPSESSID=0&p=1

#データ内容
指定条件でキーワード・タグ検索した結果のイラスト群のデータを返す。

#データ形式
CSV

#列定義
| 列の内容  |   | データ型(MySql) | データ型(SQLite) | 主キー | 例 |
|:--|:--|:--|:--|:--|:--|
| イラストID  | illust_id | integer UNSIGNED | INTEGER | PRIMARY KEY | 99999 |
| 作者ID  | user_id | integer UNSIGNED | INTEGER |   | 9999  |
| 拡張子 | extension | varchar(10) | TEXT |   | jpg |
| タイトル  | title | varchar(64) | TEXT |   | あああああ |
| サーバ番号 | server_no | integer UNSIGNED | INTEGER |   | 1 |
| 作者名 | user_name | varchar(30) | TEXT |   | 日本太郎  |
| 128x128画像のURL | illust_128_url | varchar(200) | TEXT |   | http://i1.pixiv.net/img01/img/xxxxx/mobile/99999_128x128.jpg  |
| x1  | x1  | varchar(10) | TEXT |   |   |
| x2  | x2  | varchar(10) | TEXT |   |   |
| 480mw画像のURL | illust_480mw_url  | varchar(200) | TEXT |   | http://i1.pixiv.net/img01/img/xxxxx/mobile/99999_480mw.jpg  |
| x3  | x3  | varchar(10) | TEXT |   |   |
| x4  | x4  | varchar(10) | TEXT |   |   |
| 投稿日時  | illust_entry_dt | datetime | TEXT |   | 2099-12-31 23:59:59 |
| タグ  | tags  | varchar(660) | TEXT |   | タグ1 タグ2 タグ3 |
| 使用ソフト | tool_name | varchar(150) | TEXT |   | sai |
| 評価回数  | evaluate_cnt  | integer UNSIGNED | INTEGER |   | 999 |
| 総合点 | evaluate_sum  | integer UNSIGNED | INTEGER |   | 9999  |
| 閲覧数 | view_cnt  | integer UNSIGNED | INTEGER |   | 99999 |
| キャプション  | caption | longtext | TEXT |   | This is caption.  |
| ページ数  | page_cnt  | integer UNSIGNED | INTEGER |   | 3 |
| x5  | x5  | varchar(10) | TEXT |   |   |
| x6  | x6  | varchar(10) | TEXT |   |   |
| x7  | x7  | varchar(10) | TEXT |   | 999 |
| x8  | x8  | varchar(10) | TEXT |   | 9 |
| 作者ID(表示名) | user_disp_id  | varchar(50) | TEXT |   | xxxxx |
| x9  | x9  | varchar(10) | TEXT |   |   |
| R18フラグ  | r18_flg | tinyint UNSIGNED | INTEGER |   | 0 |
| x10 | x10 | varchar(10) | TEXT |   |   |
| x11 | x11 | varchar(10) | TEXT |   |   |
| 作者画像URL | user_url  | varchar(200) | TEXT  |   | http://i1.pixiv.net/img01/profile/xxxxx/mobile/999999_99.jpg  |

※あくまでも著者の推測です。かなり大雑把な把握です。

#テーブル生成用コマンド(SQLite)

```sql:CreateIllustTable.sql
CREATE TABLE illust(illust_id INTEGER PRIMARY KEY, user_id INTEGER, extension TEXT, title TEXT, server_no INTEGER, user_name TEXT, illust_128_url TEXT, x1 TEXT, x2 TEXT, illust_480mw_url TEXT, x3 TEXT, x4 TEXT, illust_entry_dt TEXT, tags TEXT, tool_name TEXT, evaluate_cnt INTEGER, evaluate_sum INTEGER, view_cnt INTEGER, caption TEXT, page_cnt INTEGER, x5 TEXT, x6 TEXT, x7 TEXT, x8 TEXT, user_disp_id TEXT, x9 TEXT, r18_flg INTEGER, x10 TEXT, x11 TEXT, user_url TEXT);
```

#関連ページ
[Pixiv検索結果をCSVダウンロードするHTMLファイルを用意した](http://qiita.com/nezuq/items/55800d55c03606e0b13c)
[Rubyで前処理。Pixivのタグ検索結果から作品ID別タグリストを作る](http://qiita.com/nezuq/items/6e3313643c08b0e0b6c7)

#参考サイト
[APIのデータ解析 - 為さねば成らぬ](http://d.hatena.ne.jp/verno3632/20110219/1298101891)