OmniAICreator/Qiita-1.07M huggingface dataset:
AVXで倍精度浮動小数点の4x4の転置

ぐぐっても、AVXでfloatの8x8の転置だとか、SSEでfloatの4x4の転置だとかしか出てこなかったので、表題の通りdouble型の4x4の行列をAVXで転置する方法です。

#AVXでdouble型の4x4の行列を転置

```cpp:_mm256_transpose4x4.cpp
inline void _mm256_transpose4x4_pd(
    __m256d src1, __m256d src2, __m256d src3, __m256d src4,
    __m256d &dst1, __m256d &dst2, __m256d &dst3, __m256d &dst4)
{
 __m256d src5 = _mm256_unpacklo_pd(src1, src2);  // a0 b0 a2 b2
 __m256d src6 = _mm256_unpackhi_pd(src1, src2);  // a1 b1 a3 b3
 __m256d src7 = _mm256_unpacklo_pd(src3, src4);  // c0 d0 c2 d2
 __m256d src8 = _mm256_unpackhi_pd(src3, src4);  // c1 d1 c3 d3
 dst1 = _mm256_permute2f128_pd(src5, src7, 0|(2<<4));   // a0 b0 c0 d0
 dst2 = _mm256_permute2f128_pd(src6, src8, 0|(2<<4));   // a1 b1 c1 d1
 dst3 = _mm256_permute2f128_pd(src5, src7, 1|(3<<4));   // a2 b2 c2 d2
 dst4 = _mm256_permute2f128_pd(src6, src8, 1|(3<<4));   // a3 b3 c3 d3
}
```
#参考
こちらをかなり参考にさせて頂いています。--> http://www.officedaytime.com/tips/simd.html

#余談
* SSEでfloatの4x4の転置は_MM_TRANSPOSE()なるマクロが用意されていたりします。
* doubleの2x2の転置は_mm_unpacklo_pdと_mm_unpackhi_pdで簡単に実装することが出来ます。
* _mm_unpacklo_psと_mm256_unpacklo_pdの動作が思ってたのと違ったのでちょっと焦りました。
メッセージの転送を理解する

objective-cは、オブジェクトのメソッド呼び出しをランタイムが仲介するメッセージ式と呼ばれる方法で実現している。

以下に示すようなクラス定義を想定する。

```objc:Foo.h
#import <Foundation/Foundation.h>

@interface Foo : NSObject
-(void)bar;
@end
```
```objc:Foo.m

#import "Foo.h"

@implementation Foo
-(void)bar
{
    NSLog(@"bar method is called");
    return;
}

@end
```

当たり前だがインスタンスを生成して
`[foo bar]`
とすればメソッド呼び出しが可能。

ここでクラス定義に存在しないメソッド例えばfoobarを呼び出すとする。
`[foo foobar]`として呼び出そうとするとコンパイラから怒られるが
objc_msgSend関数を使うとメッセージを送信することができる。
`objc_msgSend(foo,@selector(foobar));`
この時コンパイルエラーにはならないが実行すると
"unrecognized selector sent to instance 0xxxxxx"
要するに、よくわからないセレクタ（メソッドの呼び出し情報）がfooインスタンスに送られてるよ
というエラーが発生してアプリがハングする。

つまり、実行時にメッセージを解析してメソッドが存在するかチェックをしているという仕組みに
なっている。（こういうのを動的結合という。）

オブジェクトに送信されたメッセージは該当するメソッドが見つからないと
`+(BOOL)resolveInstanceMethod:(SEL)sel`
`-(id)forwardingTargetForSelector:(SEL)sel`
`-(void)forwardInvocation:(NSInvocation *)anInvocation`
という順番でメッセージが転送されていく。

実験のためにFoo.mを以下の用にしてみる。

```objc:Foo.m

#import "Foo.h"
#import <objc/runtime.h>

@implementation Foo


+(BOOL)resolveInstanceMethod:(SEL)sel
{
    NSLog(@"resolveInstanceMethod:'%@'", NSStringFromSelector(sel));
    class_addMethod([self class], sel, (IMP)newInstanceMethod, "v@:");
    return YES;
}

void newInstanceMethod(id self, SEL _cmd) {
    NSLog(@"new instance method is called! sel:'%s'",_cmd);
}

-(void)bar
{
    NSLog(@"bar function");
    return;
}
@end
```

ここで
`objc_msgSend(foo,@selector(foobar));`
を実行すると
`+(BOOL)resolveInstanceMethod:(SEL)sel`
が呼び出されることが確認できる。

その後はここではランタイム関数のclass_addMethodを利用して
動的にクラス定義にセレクタに対応する関数の追加を行ってみた。
（コンパイル時に定義されていないメソッドを実行時にクラスに追加）

objective-cでは動的結合でメソッドの呼び出しを行っている仕組み上
このように動的にメソッドを追加することも可能。

ちなみに

```
    objc_msgSend(foo,@selector(foobar));
    objc_msgSend(foo,@selector(foobar));
```

のように連続してメッセージを送信してみると分かるが、２度目のメッセージ送信では
`+(BOOL)resolveInstanceMethod:(SEL)sel`
の呼び出しは行われない。
つまり、クラス定義にfoobarメソッドが動的に追加されたままになっていることがわかる。
(対象のオブジェクトだけにメソッドが追加されている訳ではないことに注意)

クラスにメソッドが追加されていることを確かめるために上記のメソッド追加が行われた後に
インスタンスを新しく作ってメッセージを送ってみる。
`id bar = [[Foo alloc] init];`
`objc_msgSend(bar,@selector(foobar));`
このときも同様にメッセージ転送されることなくメソッド呼び出しが行われる。
つまり、クラス自体にメソッドが追加されている。

参考までに検証に用いたmain.mを以下に置いときます。

```objc:main.m
#import <Foundation/Foundation.h>
#import "Foo.h"

int main(void)
{
    id foo = [[Foo alloc] init];
    [foo bar];

    objc_msgSend(foo,@selector(foobar));
    objc_msgSend(foo,@selector(foobar));
    
    id bar = [[Foo alloc] init];
    objc_msgSend(bar,@selector(foobar));
    
    return 0;
}

```
timeで複数のコマンドの実行時間を測る


bash のビルドインコマンドならブレースでグループ化できます。

```sh
#!/bin/bash

time -p {
  sleep 1
  sleep 2
}
```

```text:output
real 3.00
user 0.00
sys 0.00
```

GNU time だとこんな書き方はできません。

```sh
#!/bin/bash

/usr/bin/time -p {
  sleep 1
  sleep 2
}
```

```text:output
/usr/bin/time: cannot run {: No such file or directory
real 0.00
user 0.00
sys 0.00
a.sh: line 6: syntax error near unexpected token `}'
a.sh: line 6: `}'
```

GNU time でも `bash -c` でコマンドを記述すれば大丈夫です。

```sh
#!/bin/bash

/usr/bin/time -p /bin/bash -c 'sleep 1; sleep 2'
```

```text:output
real 3.00
user 0.00
sys 0.00
```

これを応用して各コマンドの実行時間とトータルの実行時間を表示してみます。

```sh
#!/bin/bash

time -p {
  echo "sleep 1"
  time -p sleep 1
  echo

  echo "sleep 2"
  time -p sleep 2
  echo
  
  echo "total"
}
```

```text:output
sleep 1
real 1.00
user 0.00
sys 0.00

sleep 2
real 2.00
user 0.00
sys 0.00

total
real 3.00
user 0.00
sys 0.00
```

さらに syslog に記録してみます。

```sh
#!/bin/bash

{
  time -p {
    echo "sleep 1"
    time -p sleep 1
    echo

    echo "sleep 2"
    time -p sleep 2
    echo

    echo "total"
  }
} 2>&1 | logger -i -s -t oreore -p user.info
```

```text:output
oreore[3636]: sleep 1
oreore[3636]: real 1.00
oreore[3636]: user 0.00
oreore[3636]: sys 0.00
oreore[3636]:
oreore[3636]: sleep 2
oreore[3636]: real 2.00
oreore[3636]: user 0.00
oreore[3636]: sys 0.00
oreore[3636]:
oreore[3636]: total
oreore[3636]: real 3.00
oreore[3636]: user 0.00
oreore[3636]: sys 0.00
```

```text:/var/log/messages
May 15 19:19:01 areserver oreore[3636]: sleep 1
May 15 19:19:02 areserver oreore[3636]: real 1.00
May 15 19:19:02 areserver oreore[3636]: user 0.00
May 15 19:19:02 areserver oreore[3636]: sys 0.00
May 15 19:19:02 areserver oreore[3636]:
May 15 19:19:02 areserver oreore[3636]: sleep 2
May 15 19:19:04 areserver oreore[3636]: real 2.00
May 15 19:19:04 areserver oreore[3636]: user 0.00
May 15 19:19:04 areserver oreore[3636]: sys 0.00
May 15 19:19:04 areserver oreore[3636]:
May 15 19:19:04 areserver oreore[3636]: total
May 15 19:19:04 areserver oreore[3636]: real 3.00
May 15 19:19:04 areserver oreore[3636]: user 0.00
May 15 19:19:04 areserver oreore[3636]: sys 0.00
```
Windows8 & UnityRemote 設定メモ

# Windows8 & UnityRemote 設定メモ (Arrows F-11D用)

## [Android]  
+ 設定 → アプリケーション → 開発 → USBデバッグのチェックをオン  
+ GooglePlay から Unity Remoteをインストール

## [Windows]  
+ Androidの機種に合わせたUSBドライバをインストールする [ここから](http://spf.fmworld.net/fujitsu/c/develop/sp/android/)  F-11Dをダウンロードする   
2. デバイスマネージャからその他の項目にあるF-11Dにダウンロードし回答したフォルダをパスに当ててインストール

### ※エラー
「指定されたカタログファイルにファイルのハッシュがありません。ファイルが壊れているか改ざんされた可能性があります。」  

#### [対処法]
1. windows8のチャームを開き「設定」次に「PC設定の変更」
2. 「全般」内項目の「PCの起動をカスタマイズ」にある「今すぐ再起動する」を選択
3. 再起動がかかりブルー画面のメニューに入るので「トラブルシューティング」を選択
4. 「詳細オプション」-「スタートアップ設定」-「再起動」の順に選択
5. スタートアップ設定メニュー画面が表示されたら、キーボードの「7」を押す
6. PCが正常に立ち上がり設定完了


### 追記(14/09/22)
USBドライバがAndroidの機種ごとでなく共通のものが新しく出ているようなのでそちらを使ったほうがいい
[USBドライバをダウンロードする](http://spf.fmworld.net/oss/driver/adb/data/download.html)
UnityReote4の挙動がおかしかったが、USBドライバを新しくすることで解決した。
Fog で S3 の期限付きダウンロード URL を作りたい


Fog で S3 の期限付き URL を取得したい場合は、[Fog::Storage::AWS::File#url](http://rubydoc.info/github/fog/fog/Fog/Storage/AWS/File:url) を使用すればよい。有効期限となる時刻は引数で指定する。

```ruby
require 'active_support/core_ext'
require 'fog'

fog_storage = Fog::Storage.new(aws_settings)
bucket = fog_storage.directories.get(bucket_name)
file = bucket.get(path)

expire_time = 30.second.since

file.url(expire_time)
```
Apache+OpenSSLで簡単に自己認証したい

SSL接続のテストの為におれおれ認証用に証明書と鍵ペアをできるだけ簡単に作る。

##ワンライナー

```
openssl genrsa -out server.key 2048 ; openssl req -new -key server.key -out server.csr -subj '/C=JP/ST=Tokyo/L=Tokyo/O=Example Ltd./OU=Web/CN=example.com' ; openssl x509 -in server.csr -days 3650 -req -signkey server.key > server.crt
```

/C=JP/ST=Tokyo/L=Tokyo/O=Example Ltd./OU=Web/CN=example.com　らへんを任意に編集してください

カレントディレクトリにserver.key(秘密鍵)　と　server.crt (証明書)ができるのでそれを使います。

これで終わり

##上記コマンドを1行づつ説明すると・・・

秘密鍵（server.key）の作成 (パスフレーズなし)

```
openssl genrsa -out server.key 2048
```

公開鍵（server.csr）の作成

```
openssl req -new -key server.key -out server.csr -subj '/C=JP/ST=Tokyo/L=Tokyo/O=Example Ltd./OU=Web/CN=example.com'
```


公開鍵を使って証明書（server.crt）の作成

```
openssl x509 -in server.csr -days 3650 -req -signkey server.key > server.crt
```

##Apacheで使う場合

server.key (秘密鍵)とserver.crt (証明書) をApacheに設定

```apache:conf/extra/httpd-ssl.conf
SSLCertificateKeyFile /path/to/server.key
SSLCertificateFile /path/to/ssl/server.crt
```
pt-deadlock-loggerを使ってみる

[http://www.percona.com/doc/percona-toolkit/2.2/pt-deadlock-logger.html]()

* デッドロックの情報を検出、保存してくれるツール。

## とりあえずで使ってみる

#### percona-toolkit(2.2.7)はインストール済み想定


ローカルではなくhost1にあるDBを見に行く

```
$ # デッドロック情報を保存するテーブルを作成する必要がある為、初回は保存用テーブル作成オプションをつけて実行
$ pt-deadlock-logger --create-dest-table --dest D=test,t=deadlocks -hhost1 -uuser
```
これでデッドロック情報テーブルを作成し、検出待ちになる
二回目以降は--create-dest-tableを省けばよい

### この状態で試にデッドロックを起こしてみる

[MySQLでデッドロックを発生させる](http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/db/mysql/%E3%83%87%E3%83%83%E3%83%89%E3%83%AD%E3%83%83%E3%82%AF%E3%83%86%E3%82%B9%E3%83%88.php)を参照

こんな感じのが出る

```
server ts thread txn_id txn_time user hostname ip db tbl idx lock_type lock_mode wait_hold victim query
host1 2014-05-15T17:52:14 2999 0 411 user www.xxx.xx xxx.xx.xx.xx database deadlock_test col RECORD X w 0 
host1 2014-05-15T17:52:14 3036 0 28 user www.xxx.xx xxx.xx.xx.xx database deadlock_test col RECORD X w 1 select * from deadlock_test where col = 1 for update
```

test.deadlocks
```
mysql> select * from test.deadlocks\G
*************************** 1. row ***************************
   server: host1
       ts: 2014-05-15 17:52:14
   thread: 2999
   txn_id: 0
 txn_time: 411
     user: user
 hostname: www.xxx.xx
       ip: xxx.xx.xx.xx
       db: database
      tbl: deadlock_test
      idx: col
lock_type: RECORD
lock_mode: X
wait_hold: w
   victim: 0
    query: 
*************************** 2. row ***************************
   server: host1
       ts: 2014-05-15 17:52:14
   thread: 3036
   txn_id: 0
 txn_time: 28
     user: user
 hostname: www.xxx.xx
       ip: xxx.xx.xx.xx
       db: user
      tbl: deadlock_test
      idx: col
lock_type: RECORD
lock_mode: X
wait_hold: w
   victim: 1
    query: select * from deadlock_test where col = 1 for update
2 rows in set (0.00 sec)
```


### バックグランドで指定の時間走らせる

--daemonizeと--run-timeオプションを付けて実行する

```
$ pt-deadlock-logger --daemonize --run-time=3000 --dest D=test,t=deadlocks -hhost1 -uuser
$ ps aux | grep pt-deadlock-logger 

```

定期的にINNODB STATUSの内容を引っ張って保存してくれてる感じ
逆引きReactiveCocoa: 固定値をRACSignalでラップする

非常に基本的なことですが、あまりはっきりと触れられていない（触れる必要がない？）のが、単純に固定値をラップしたシグナルを生成するケースです。方法自体は単純で、以下のようなメソッドが用意されています。

```objc
// 値の場合
RACSignal *singleValueSignal = [RACSignal return:@"foobar"];

// 下記と同義
[RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {
	[subscriber sendNext:@"foobar"];
	[subscriber sendCompleted];
	return nil;
}];

// `completed`だけの場合
RACSignal *emptySignal = [RACSignal empty];

// 下記と同義
[RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {
	[subscriber sendCompleted];
	return nil;
}];

// `error`だけの場合
NSError *someError = ...;
RACSignal *errorSignal = [RACSignal error:someError];

// 下記と同義
[RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {
	[subscriber sendError:someError];
	return nil;
}];
```

利用ケースについて、例えば引数のシグナルの変化に合わせて指定したセレクターを実行する `-[NSObject rac_liftSelector:withSignals:]` では、引数は全てシグナルでなければならないのですが、

```objc
[self.mapView rac_liftSelector:@selector(setCamera:animated:) withSignals:cameraSignal, [RACSignal return:@YES], nil];
```

というように、固定値を使いたい場合などにはよく使う必要が出てくるのではないでしょうか。
Unity2Dメモ1 タッチ座標にあるオブジェクトに値を送る

# タッチ座標にあるオブジェクトに値を送る

```csharp:TouchManager.cs
public class TouchManager : MonoBehaviour {
    Vector2 touchPoint;
    RaycastHit2D hit;
    Touch touch;
    string sendStr = "";

    void Update()
    {
        if (Input.touchCount > 0) // タッチが開始されたら
        {
            this.touch = Input.touches[0];

            // タッチ座標を変換
            this.touchPoint= Camera.main.ScreenToWorldPoint(this.touch.position);

            if (touch.phase == TouchPhase.Began)
            {
                // Raycast(光線の出る位置, 光線の向き)
                this.hit = Physics2D.Raycast(this.touchPoint, Vector2.zero);

                if (this.hit)
                {
                    // タッチ座標にあるオブジェクト
                    GameObject selectedObject = this.hit.collider.gameObject;
　　　　　　
                    switch (selectedObject.tag) // オブジェクトのタグ
                    {
                        case "A": 
                            this.sendStr = "A";
                            selectedObject.SendMessage("MethodA", this.sendStr);
                            break;
                        case "B": 
                            this.sendStr = "B";
                            selectedObject.SendMessage("MethodB", this.sendStr);
                            break;
                        case "C": 
                            this.sendStr = "C";
                            selectedObject.SendMessage("MethodC", this.sendStr);
                            break;
                    }
                }
            }
        }
    }
} 
```
Product Advertising APIで取得したXMLのElementを連想配列に追加する

Qiita の使い方の勉強・練習含め、メモを投稿します。
提示情報不足な部分があるかもしれませんが、
どうぞご了承くださいませ。。
ブラッシュアップしていきます。


amazon APIを使ってXMLを取得した後、
データを整理したくてXMLから各要素を抽出することになりました。

Amazonは、一度に10個のデータを取得できます。
XMLの回答には<Item>が複数あるので、その要素を連想配列で取得したいと思います。

`function getDatafromXML(xmlData){
  data = [];
  var element = xmlData.getElement();
  var item = element.getElement("Items").getElements("Item");
  for(var i = 0; i <item.length;i++){
    data[i] = item.getElement("ItemAttributes").getElement("ListPrice").getElement("Amount").getText();
  }
  return data;
}
function getPrice(){
var price = [];
price = getDatafromXML(xmlData);
Logger.log(price);
}`

これで実行したところ、[nullの要素をgetElementできません」
とエラーが返ってきてしまいました。

どうやらAmazonのレスポンスの中には、存在したりしなかったりする要素があるので、getElementで取得する前に、その要素があるのかを判定する必要あります。

以下のようにif文で判定しようとしましたが、まだうまく行きません。
`if(item.getElement("ItemAttributes").getElement("ListPrice").getElement("Amount"){
  data[i] = item.getElement("ItemAttributes").getElement("ListPrice").getElement("Amount").getText();
}
function getPrice(){
var price = [];
price = getDatafromXML(xmlData);
Logger.log(price);
}`

ifの条件文は、1要素ずつしかできないようなので、以下に修正
完成版
`function getObjfromXML(xmlData){
  var obj = {};
  var element = xmlData.getElement();
  var items = element.getElement("Items").getElements("Item");
  for(var i = 0; i <item.length;i++){
   if(items[i].getElement("ItemAttributes")){
     if(items[i].getElement("ItemAttributes").getElement("ListPrice")){
       if(items[i].getElement("ItemAttributes").getElement("ListPrice").getElement("Amount")){
         obj["price"] = items[i].getElement("ItemAttributes").getElement("ListPrice").getElement("Amount").getText();}
     }
   }
  }
  return obj;
}
function getPrice(){
var price = [];
price = getDatafromXML(xmlData);
Logger.log(price);
}`
 
 実行結果

 これでうまくXMLのElementを取得出来ました。
Jersey2.8とGuice3.0を連携させる


JAX-RS 2.0からDI(JSR-330)が仕様に組み込まれています。JAX-RSの参照実装であるJerseyにも2.XからはDIが組み込まれています。ところが、そのJSR-330の実装はHK2でした。そのため同じくJSR-330の実装であるGuiceとJerseyの連携が、Jersey1.Xのころと同じ方法ではできなくなりました。どうする！？

# HK2がBridgeを提供してくれました！
HK2がGuiceとのBridgeを提供してくれたので、ちょこっと書いたら動くようです。


``` java
package web;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.ServletModule;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.jersey.server.ResourceConfig;
import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import javax.ws.rs.ApplicationPath;

@ApplicationPath("/")
public class MyApplication extends ResourceConfig {
    private static Logger logger = LoggerFactory.getLogger(MyApplication.class);

    @Inject
    public MyApplication(ServiceLocator serviceLocator) {
        
        logger.info("start.")
        // GuiceBridgeの初期化
        GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
        GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
        // ServletModuleをGuiceBridgeに登録する        
        guiceBridge.bridgeGuiceInjector(Guice.createInjector(new ServletModule() {
            @Override
            protected void configureServlets() {
                bind(YourInjectableOne.class);
            }
        }));

        packages("your.resource");

        logger.info("end.")
    }
}

```

依存性はこんな感じ。

``` build.gradle
dependencies {
    compile 'org.glassfish.hk2:guice-bridge:2.3.0-b05'
    compile 'com.google.guava:guava:17.0'
    compile 'com.google.inject:guice:3.0'
    compile 'com.google.inject.extensions:guice-persist:3.0'
    compile 'com.google.inject.extensions:guice-servlet:3.0'
    compile 'org.glassfish.jersey.core:jersey-server:2.8'
    compile 'org.glassfish.jersey.containers:jersey-container-servlet:2.8'
}
```

# 参考
https://github.com/pjagielski/jersey2-guice-camel-example
Firefox 29で無くなったアドオンバーを戻す（というか前のUIに戻す）

#現象
[アドオンバーにページ容量を表示するプラグイン](https://addons.mozilla.org/ja/firefox/addon/lori-life-of-request-info/?src=ss)を使っていたので、Firefox 29でアドオンバーが表示されなくなって困った。

#対策
[Classic Theme Restorer (Customize Australis)](https://addons.mozilla.org/ja/firefox/addon/classicthemerestorer/)をダウンロードして前のUIに戻した。
ActiveModel 内の include・extend 関係


**環境**
- Rails 4.1.1

ActiveModelについての覚書です。ActiveModelパッケージ内での、クラス・モジュール間のinclude・extendを図にしました。

**Model, Naming, Conversion, Translation, Validations**
![activemodel_class_diagram_1.png](https://qiita-image-store.s3.amazonaws.com/0/5179/b60431d3-da33-21c7-ddcd-9d71929d6eb6.png "activemodel_class_diagram_1.png")
[ActiveModel::Model](http://api.rubyonrails.org/classes/ActiveModel/Model.html)
[ActiveModel::Naming](http://api.rubyonrails.org/classes/ActiveModel/Naming.html)
[ActiveModel::Conversion](http://api.rubyonrails.org/classes/ActiveModel/Conversion.html)
[ActiveModel::Translation](http://api.rubyonrails.org/classes/ActiveModel/Translation.html)
[ActiveModel::Validations](http://api.rubyonrails.org/classes/ActiveModel/Validations.html)
[ActiveModel::Callbacks](http://api.rubyonrails.org/classes/ActiveModel/Callbacks.html)

**AttributeMethods, Dirty**
![activemodel_class_diagram_2.png](https://qiita-image-store.s3.amazonaws.com/0/5179/350da5d6-bf43-0f7b-0743-86fcec1da4b4.png "activemodel_class_diagram_2.png")
[ActiveModel::AttributeMethods](http://api.rubyonrails.org/classes/ActiveModel/AttributeMethods.html)
[ActiveModel::Dirty](http://api.rubyonrails.org/classes/ActiveModel/Dirty.html)

**Serialization, Xml, JSON**
![activemodel_class_diagram_3.png](https://qiita-image-store.s3.amazonaws.com/0/5179/d4f683a5-5936-a513-d913-64f91f6fed2e.png "activemodel_class_diagram_3.png")
[ActiveModel::Serialization](http://api.rubyonrails.org/classes/ActiveModel/Serialization.html)
[ActiveModel::Serializers::Xml](http://api.rubyonrails.org/classes/ActiveModel/Serializers/Xml.html)
[ActiveModel::Serializers::JSON](http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html)

----

```ruby:active_model.rb
module ActiveModel
  extend ActiveSupport::Autoload

  autoload :AttributeMethods
  autoload :BlockValidator, 'active_model/validator'
  autoload :Callbacks
  autoload :Conversion
  autoload :Dirty
  autoload :EachValidator, 'active_model/validator'
  autoload :ForbiddenAttributesProtection
  autoload :Lint
  autoload :Model
  autoload :Name, 'active_model/naming'
  autoload :Naming
  autoload :SecurePassword
  autoload :Serialization
  autoload :TestCase
  autoload :Translation
  autoload :Validations
  autoload :Validator
...
```
Ruby on Rails 4.1.0, PostgreSQL 9.3.7で起きた問題とその解決法

## railsサーバが起動しない(Windows)

### 問題1

1. railsサーバを起動しようとすると以下のエラーが出て止まる

```
$ rails s
=> Booting WEBrick
=> Rails 4.1.0 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0
.0.1 (--binding option)
=> Ctrl-C to shutdown server
Exiting
C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.1.0/lib/tzinfo/data_source.rb:199:i
n `rescue in create_default_data_source': No timezone data source could be found
. To resolve this, either install TZInfo:ata (e.g. by running `gem install tzi
nfo-data`) or specify a zoneinfo directory using `TZInfo:ataSource.set(:zonein
fo, zoneinfo_path)`. (TZInfo:ataSourceNotFound)
```

### 解決法

1. Gemfileに以下を追加してbundle

```
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw]
```

### 問題2

1. railsサーバを起動するとWebブラウザで以下のようなエラーが出る

```
fe_sendauth: no password supplied
```

### 解決法

1. 新規のデータベースとそのユーザを作成する

```
createuser -U postgres -P postgreuser
新しいロールのためのパスワード:(postgreuser password)
もう一度入力してください:(postgreuser password)
パスワード:(postgres password)
createdb -U postgres -O postgreuser -E utf8 mydb1
パスワード:(postgres password)
```

2. config/database.ymlを書き換える

```
development:
  adapter: postgresql
  encoding: utf8
  database: mydb1
  pool: 5
  username: postgreuser
  password: (postgreuser password)
  host: localhost
  port: 5432

test:
  adapter: postgresql
  encoding: utf8
  database: mydb1
  pool: 5
  username: postgreuser
  password: (postgreuser password)
  host: localhost
  port: 5432

production:
  adapter: postgresql
  encoding: utf8
  database: mydb1
  pool: 5
  username: postgreuser
  password: (postgreuser password)
  host: localhost
  port: 5432
```

### 問題3

1. railsサーバを起動するとWebブラウザで以下のようなエラーが出る

```
Migrations are pending. To resolve this issue, run: bin/rake db:migrate RAILS_ENV=development
```

### 解決法

1. 未実行のマイグレーションファイルを実行する
(RAILS_ENV=developmentでデベロップメント環境のマイグレーションを行える)

```
rake db:migrate
```

### 参考

[WindowsでRuby, Rails, PostgreSQLをインストールしてherokuにデプロイする方法](http://dari88.hatenablog.com/entry/2014/02/01/173811)
[createuser | PostgreSQL 9.3.2](http://www.postgresql.jp/document/9.3/html/app-createuser.html)
[createdb | PostgreSQL 9.3.2](http://www.postgresql.jp/document/9.3/html/app-createdb.html)
[rake db:migrate | Railsドキュメント](http://railsdoc.com/references/rake%20db:migrate)
Django: inlineformset_factory で フォームセットの各フォームに初期値を与える



例えばイベント参加者を指定するフォーム:

```py

    class CompanionForm(forms.ModelForm):
        def __init__(self, event=None, *args, **kwargs):
            # アルコールが出るイベントに参加する同行者は年齢を入力しないといけない
            if event.with_alcoholic_drink:
                self.base_fields['age'] = forms.TextInput(required=True)
                
            super(CompanionForm, self).__init__(*args, **kwargs)

```

申し込みの同行者が複数いるので、inlineformset_factoryで、複数のCompanionFormを作成したい。

が、inlineformset_factoryで生成したフォームセットクラスには、インラインフォームに渡す引数を指定できない。

inlineformset_factory はフォームセットインスタンスを作成したら、インライン入力するフォームのクラスを"form"フィールドにセットするので、これを引数をCurry化したstaticmethodでリプレースしてやると、

フォームセットインスタンスの__init__()の中のどこかで呼ばれる、

```
    self.form(**initial_parameter) 
```
 
で各インラインフォームを作る時に実際のインラインフォームを初期化する時にパラメータを指定してくれるようになる。


ヘルパーを作って対応

```py

    class OrderCompanionFormset(BaseInlineFormSet):
        # ... Order-Companion の関係モデルのフォームセットをごにょごにょする

    from django.utils.functional import curry

    def create_companion_formset(request, event, order, initial={})
        formset = inlineformset_factory(
            Order, Companion,
            form=CompanionForm,
            fromset=OrderCompanionFormset )
            
        # form を event引数でcurry化
        formset.form = staticmethod(curry(formset.form, event=event))
        
        ...
        return formset(data=request.POST or None
                       instance=order, initial=initial{})
        
```
分布の適合度を検定する

[前回](http://qiita.com/ynakayama/items/1494cf4fdf988e1c7c7c)まで母集団を全数調査することを前提に Hadoop について色々と説明をしてきたわけですが、母数の分布について何らかの仮定をした際に適合度の検定が必要になります。

## 検定によってわかること

検定によってどんなことが判定出来るか考えてみましょう。

1) 比率の検定

比率の差の検定 → 2 つの異なる母集団の間で母比率に差があるといえるか。
これは母比率 P がある値 P_0 に等しいと言えるかで判定します。

2) 平均値の検定

平均値の差の検定 → 2 つの異なる母集団の間で母平均に差があるといえるか。
これは母集団の平均値 μ がある値 μ_0 に等しいと言えるかで判定します。

3) 分散の検定

分散の差の検定 → 2 つの異なる正規母集団の間で分散に差があるといえるか。
これは正規母集団の分散 σ^2 がある値 σ^2_0 に等しいと言えるかで判定します。

4) 適合度の検定

観察されたデータが特定の分布に一致していると言えるか。
2 つの母集団の確率分布が異なるものであるかどうか。

## ポアソン分布

ポアソン分布については以前に[仮説検定と確率分布](http://qiita.com/ynakayama/items/e41f592ad7fe02f23c1c)でも説明した通りです。

確率変数の取りうる値が離散かつ無限の場合、単位時間あたり平均で λ 回発生する事象が単位時間に X 回発生する確率です。

```math
{P(X = k) = \frac {{\lambda}^xe^{-\lambda}} {k!} \\
ただし \\
\lambda \gt 0
}
```

## 分布の適合度の検定

ある位置情報における端末固有情報の観測回数を考えます。端末固有情報がそれぞれ特定の地域で観測されるか 100 台について調査したとして、端末固有情報毎に以下の表に従ったとします。

| 観測回数 | 端末台数 |
|:--|:--|
| 0 | 43 |
| 1 | 31 |
| 2 | 14 |
| 3 |  8 |
| 4 |  3 |
| 5 |  1 |

この観測回数はポアソン分布に従っていると言えるか有意水準 (= P 値) 5% で検定します。

λ = 未知母数 (データから推定する)
X = クラス k

したがって標本平均をポアソン分布の未知母数 λ の推定値とし

```math
\hat{\lambda} = \frac 1 {100} (0 x 43 + 1 x 31 + 2 x 14 + ... ) = 1
```

したがって期待度数は

| クラス k | 観測度数 | 期待度数 |
|:--|:--|:--|
| 0 | 43 | 36.8 |
| 1 | 31 | 36.8 |
| 2 | 14 | 18.4 |
| 3 |  8 | 6.13 |
| 4 |  3 | 1.53 |
| 5 |  1 | 0.307 |
| 6 |  0 | 0.0330 |

```math
\chi^2 = \frac {(43-36.8)^2} {36.8} + \frac {(31-36.8)^2} {36.8} + ... = 5.011
```

こうして求められた値を[カイ二乗分布の表](http://www.biwako.shiga-u.ac.jp/sensei/mnaka/ut/chi2disttab.html)と付きあわせます。

自由度はクラスの個数 -1 から未知母数の個数を引くので 7 - 1 - 1 = 5 、仮に k=3 以上をひとまとめにしてクラス数を 4 とした場合は 4 - 1 - 1 = 2 となります。 P 値 0.05 で自由度 2 の欄を見ますと 5.99146 とありますからこの値に収まっており帰無仮説は棄却されません。つまり **ポアソン分布に従っていないとは言えない** ことがわかりました。

## ポアソン分布と極限定理

せっかくなのでパラメータが n と p=λ/n な正規分布の λ を一定に保ったまま n を無限大に近づけるとポアソン分布に近似することをシミュレーションしてみましょう。

[以前にも中心極限定理のシミュレーションは強引な方法でやりました](http://qiita.com/ynakayama/items/6b89cb451a73ae7a8990)が、より簡単におこなうことができます。

```py3
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

M = 1000
for N in [10,30,50,100]:
    data = [np.average(np.random.poisson(3, N)) for i in range(M)]
    hist, key = np.histogram(data, bins=np.arange(1,5,0.1), density=True)
    ax.plot(hist, label=str(N))

plt.legend(loc='best')
plt.show()
plt.savefig("image.png")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/5361c61a-c3d5-066a-af51-74e12408d24c.png)

N = 100 のとき、ほぼ正規分布に近似していることが観測されます。
Vagrant1.5でEC2インスタンスを立ち上げる設定


VagrantからEC2インスタンスにsshした後、プロビジョニングする設定。

## やったこと

### プラグインインストール
`$ vagrant plugin install vagrant-aws`

### box追加
`$ vagrant box add aws https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box`

### vagrant init
`$ vagrant init aws`

### VagrantFile
```
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "aws"

  config.vm.provider :aws do |aws, override|
    aws.access_key_id     = "<ACCESS_KEY_ID>"
    aws.secret_access_key = "<SECRET_ACCESS_KEY>"
    aws.keypair_name = "<KEYPAIR_NAME>"
    aws.instance_type = "t1.micro"
    aws.region = "ap-northeast-1"
    aws.ami = "<AMI>"
    aws.security_groups = [ '<SECURITY_GROUPS>' ] 

    override.ssh.username = "ec2-user"
    override.ssh.private_key_path = "~/.ssh/aws.pem"

  end

end
```

### vagrant up

`$ VAGRANT_LOG=DEBUG vagrant up --provider=aws`

デバッグつけるとこけた時に便利

### vagrant ssh

```
$ vagrant ssh

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/
1 package(s) needed for security, out of 18 available
Run "sudo yum update" to apply all updates.
```

### プロビジョニング

立ちあげた後なんだけど、プロビジョニングも普通に追記すればおｋ。
provisionの内容は[こんな感じ](http://qiita.com/fuzzy31u/items/c573378ba1803bcbc06f)で。

```
config.vm.provision :fabric do |fabric|
  fabric.fabfile_path = "./provision.py"
  fabric.tasks = ["execute"]
end
```
これを追記してprovision実行

`$ vagrant provision`

## トラブルシューティング

`$ vagrant provision`

の際、こんなエラーが出たら…

`Fatal error: sudo() received nonzero return code 2 while executing!`

/etc/sudoersの下記をコメントアウト

`Defaults    requiretty`

## Secret Access Keyについて
あとSecret Access Keyの取得方法がよりセキュアになったみたいで、[IAMマネジメントのコンソール](https://console.aws.amazon.com/iam/home?#security_credential)から取得するようだ。

### 参考

* [Where’s my secret access key? - AWS Security Blog](http://blogs.aws.amazon.com/security/post/Tx1R9KDN9ISZ0HF/Where-s-my-secret-access-key)
* [Getting Your Access Key ID and Secret Access Key - Amazon Simple Queue Service](http://blogs.aws.amazon.com/security/post/Tx1R9KDN9ISZ0HF/Where-s-my-secret-access-key)

Secret Access Keyは取得直後の一度しか表示されない。
既にリネーム済みのファイル名を Subversion に反映する（もっといい方法募集中）

Mercurial だと ``hg rename -A`` というオプションがあるが、``svn`` にはなさそうなので、仕方なく、以下のようなバッチを作った。

```bat
rem @echo off

if not exist %2 goto usage
if     exist %1 goto usage

move %2 %1
svn move %1 %2
exit /b

:usage
    echo svn renamer like hg rename -A
```

もっといい方法はないものか…
Vagrant + Fabricの設定


## 前提
VMはCentOS6.4をVagrantで構築済み。
HostはOSX。

## やりたいこと

https://gist.github.com/fuzzy31u/117a6e00f93423aeca10

これはshellスクリプトのprovision。
\# TODO manually!
とか書いてあるのを自動化したかったです。

全体的にはhttpサーバ起動したりMySQL, Pythonの最新バージョンをrpmインストールしたりソースインストールしたりするような手続き。

## やったこと

### Fabricインストール@ホストOS
` $ sudo pip install fabric `

### Fabric provisionerインストール@ホストOS
` $ vagrant plugin install vagrant-fabric `

### provisioning用Pythonスクリプト作成
```python:provision.py
# -*- coding: utf-8 -*-
 
from fabric.api import run, sudo, cd
from fabric.contrib.files import sed, append, contains
 
def execute():
    update_yum()
    install()
    change_network_config()
    config_httpd()
    link_www_dir()
    epel()
    remi()
    mysql55()
    python3()
 
def update_yum():
    sudo('yum update -y')
 
def install():
    sudo('yum -y install httpd')
    sudo('yum -y install emacs')
    sudo('yum -y install wget')
 
def change_network_config():
    sudo('service iptables stop')
    sudo('chkconfig iptables off')
 
def config_httpd():
    sudo ('service httpd start')
    sudo('chkconfig httpd on')
 
def link_www_dir():
    sudo('ln -fs /vagrant /var/www/html')
    
def epel():
    run('wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm')
    sudo('/bin/rpm -Uvh epel-release-6-8.noarch.rpm')
    sed('/etc/yum.repos.d/epel.repo', before='enabled=1', after='enabled=0', use_sudo=True)
 
def remi():
    run('wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm')
    sudo('rpm -Uvh remi-release-6.rpm')
 
def mysql55():
    sudo('yum install -y --enablerepo=remi mysql-server')
    if not contains('/etc/my.cnf', 'character_set_server=utf8'):
        append('/etc/my.cnf', 
               '\ncharacter_set_server=utf8\ndefault-storage-engine=InnoDB\ninnodb_file_per_table\n[mysql]\ndefault-character-set=utf8\n[mysqldump]\ndefault-character-set=utf',
           use_sudo=True)
    sudo('service mysqld start')
    sudo('chkconfig mysqld on')
 
def python3():
    run('wget https://www.python.org/ftp/python/3.4.0/Python-3.4.0.tgz')
    run('tar xzvf Python-3.4.0.tgz')
    with cd('Python-3.4.0'):
        run('./configure --enable-shared --with-threads')
        run('make')
        sudo('make install')
        sudo('cp -p libpython3.4m.so libpython3.4m.so.1.0 /usr/lib')
        sudo('/sbin/ldconfig')
        run('source ~/.bash_profile')
        run('python3 --version')
```
ファイル書き換えはputで置き換えなくてもsedとかappendが使えるよう

### VagrantFile編集
```
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
 
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos64"
 
  config.vm.provision :fabric do |fabric|
    fabric.fabfile_path = "./provision.py"
    fabric.tasks = ["execute"]
  end
end
```

### プロビジョニングを適用しつつup
vagrant up --provision
IntelliJでリモートのPython SDKを読み込む


IntelliJでリモートのPython SDKを指定する設定です。
ちなみにVagrant configから読み込む、てのでやりました。

ローカルには入れてないんだけど、ちょっとVMに入れたPython3系で試してみたいなーって時に。

## 設定

1. File -> New Project...

2. 左ペインからPython Moduleを選択 -> Next

3. Configure...
 ![IntelliJでリモートのPython SDKを読み込む](http://f.st-hatena.com/images/fotolife/f/fuzzy31u/20140515/20140515161751.png)

4. 左上のプラスマーク -> Python SDK
 ![IntelliJでリモートのPython SDKを読み込む](http://cdn-ak.f.st-hatena.com/images/fotolife/f/fuzzy31u/20140515/20140515161752.png)

5. Remote...
 ![IntelliJでリモートのPython SDKを読み込む](http://cdn-ak.f.st-hatena.com/images/fotolife/f/fuzzy31u/20140515/20140515162040.png)

6. File from Vagrant config -> VagrantFileのあるディレクトリ
 ![IntelliJでリモートのPython SDKを読み込む](http://cdn-ak.f.st-hatena.com/images/fotolife/f/fuzzy31u/20140515/20140515162258.png)

7. HostをリモートIPにする（Auth, keyなども自分のを設定） -> Test connection...
 ![IntelliJでリモートのPython SDKを読み込む](http://cdn-ak.f.st-hatena.com/images/fotolife/f/fuzzy31u/20140515/20140515162259.png)

8. Python interpreter pathの選択ボタン -> 好きなPython Interpreterを選択
 ![IntelliJでリモートのPython SDKを読み込む](http://cdn-ak.f.st-hatena.com/images/fotolife/f/fuzzy31u/20140515/20140515162845.png)
LegUp を試してみる.


漢なら C 言語ベースで高位合成(high level synthesis)ですね!

LLVM ベースの HLS である LegUp を試してみましょう.

http://legup.eecg.utoronto.ca/

ライセンスは基本オープンソースのようですが, 商用利用には制限があるようなのでご注意ください.

## オンラインデモ

オンラインのデモがあるので試してみます.

http://legup.eecg.utoronto.ca/demo.php

```
//----------------------------------------------------------------------------//
// Generated by LegUp High-Level Synthesis Tool Version 3.0 (http://legup.org)
// Compiled: Mon Jan 21 17:30:53 2013
// University of Toronto
// For research and academic purposes only. Commercial use is prohibited.
// Please send bugs to: legup@eecg.toronto.edu
// Date: Thu May 15 04:18:39 2014
//----------------------------------------------------------------------------//

`define MEMORY_CONTROLLER_ADDR_SIZE 32
`define MEMORY_CONTROLLER_DATA_SIZE 64
// Number of RAM elements: 4
`define MEMORY_CONTROLLER_TAG_SIZE 9
`define TAG_NULL `MEMORY_CONTROLLER_TAG_SIZE'd0
`define TAG_PROCESSOR `MEMORY_CONTROLLER_TAG_SIZE'd1
// @.str = private unnamed_addr constant [8 x i8] c"default\00"

`define TAG_g__str `MEMORY_CONTROLLER_TAG_SIZE'd3
`define TAG_g__str_a {`TAG_g__str, 23'b0}
// @imem = internal unnamed_addr constant [44 x i32] [i32 -1885077504, i32 665124868, i32 614858756, i32 266368, i32 12726305, i32 202375190, i32 0, i32 872546314, i32 12, i32 1006702593, i32 875036672, i32 280704, i32 17385505, i32 -1926627328, i32 350336, i32 17520673, i32 -1922301952, i32 25847850, i32 295698435, i32 -1389625344, i32 -1385562112, i32 65011720, i32 666763252, i32 -1346437112, i32 -1347354620, i32 -1347420160, i32 605028352, i32 705167368, i32 285212683, i32 638648321, i32 707264520, i32 285212678, i32 637796352, i32 639959040, i32 202375177, i32 640745473, i32 135266334, i32 638582785, i32 135266331, i32 -1883308024, i32 -1884225532, i32 -1884291072, i32 666697740, i32 65011720], align 4

`define TAG_g_imem `MEMORY_CONTROLLER_TAG_SIZE'd2
`define TAG_g_imem_a {`TAG_g_imem, 23'b0}
//   %dmem = alloca [64 x i32], align 4
`define TAG_main_0_dmem `MEMORY_CONTROLLER_TAG_SIZE'd5
`define TAG_main_0_dmem_a {`TAG_main_0_dmem, 23'b0}
//   %reg = alloca [32 x i32], align 4
`define TAG_main_0_reg `MEMORY_CONTROLLER_TAG_SIZE'd4
`define TAG_main_0_reg_a {`TAG_main_0_reg, 23'b0}

// Turn off warning 'ignoring unsupported system task'
// altera message_off 10175

module top
	(
		clk,
		reset,
		start,
		finish,
		return_val
	);
input clk;
input reset;
input start;
output wire finish;
output wire [31:0] return_val;
wire memory_controller_waitrequest;
wire memory_controller_enable_a;
...
```

なにやら Verilog コードが無事に吐かれました. 素晴らしいですね!
WicketFilterのコントロールから除外するパスの設定

##経緯
「このパスだけはWicketにコントロールされないように無視したいなー」

##方法
Wicketを使うときにはWicketFilterを使って、Wicketがコントロールするパスを決めるのが一般的である。コントロールから除外したいパスの設定には、filterのパラメータで`ignorePatshs`を使う。

```xml:web.xml
<filter>
  <filter-name>WicketFilter</filter-name>
  <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
  <!-- snip -->
  <init-param>
    <param-name>ignorePaths</param-name>
    <param-value>foo/, bar.html</param-value>
  </init-param>
  <!-- snip -->
</filter>
```

上記の様に設定すると、コンテキストパス/foo/ 以下および コンテキストパス/bar.html がWicketFilterのコントロールから無視される。

なお、DEBUGモードでログを出すと、アクセス時に以下の様なログが出る。

```
DEBUG org.apache.wicket.protocol.http.WicketFilter - Ignoring request http://example.com/コンテキストパス/foo/baz.html
DEBUG org.apache.wicket.protocol.http.WicketFilter - Ignoring request http://example.com/コンテキストパス/bar.html
```
Gistでソースや文書をシェアする


[ブログ](http://staffblog.yumemi.jp)を書きました。Qiitaにも投稿します。

--

前々から [Gist](https://gist.github.com/) は知ってたのですが（kobitoからQiitaに投稿する際に、Gistにも投稿するかオプションがあるし）、あまりちゃんと触ってなかったので、この機に試してみました。

# Gistとは

GistはGitHubのサービスの一つで、これを利用するとソースコード1ファイル単位(複数もOK)でGit管理し、公開することができます。

GistのURL：https://gist.github.com

例えばこんな感じです ⇒ https://gist.github.com/hkusu/78e0e3460efe7723f948

<a href="http://staffblog.yumemi.jp/wp-content/uploads/2014/05/スクリーンショット-2014-05-15-15.56.00.png"><img src="http://staffblog.yumemi.jp/wp-content/uploads/2014/05/スクリーンショット-2014-05-15-15.56.00.png" alt="スクリーンショット 2014-05-15 15.56.00" width="567" height="417" class="alignnone size-full wp-image-3352" /></a>

# 何が便利か

大きくは次の特徴があるからかなと。

- 本来GitHubは、無料枠だと非公開なリポジトリは作れないのですが、Gistの場合は非公開にできる。
    - ただURLが分かってしまえば誰でもアクセスできてしまいます、が、上記の例のように推測されにくいURLになっています。
- GitHubにアカウントが無くても自分のソースや文書を公開できる。
    - ただURLを覚えてないと、どこにあったか分からなくなります^^;
- ブログ等、Gist外のWEBサイトへ張りつける為のスクリプトタグが準備されている。
    - 上の例だとこういうタグです。

    <a href="http://staffblog.yumemi.jp/wp-content/uploads/2014/05/スクリーンショット-2014-05-15-16.22.16.png"><img src="http://staffblog.yumemi.jp/wp-content/uploads/2014/05/スクリーンショット-2014-05-15-16.22.16.png" alt="スクリーンショット 2014-05-15 16.22.16" width="450" height="21" class="alignnone size-medium wp-image-3356" /></a>

    - 張りつけるとこんな感じになります。

    <a href="http://staffblog.yumemi.jp/wp-content/uploads/2014/05/スクリーンショット-2014-05-15-16.28.38.png"><img src="http://staffblog.yumemi.jp/wp-content/uploads/2014/05/スクリーンショット-2014-05-15-16.28.38.png" alt="スクリーンショット 2014-05-15 16.28.38" width="567" height="558" class="alignnone size-full wp-image-3355" /></a>

あともちろん、GistのコンテンツもGitでバージョン管理できます。

# 文書の公開にも良さそう

色々な言語用にハイライト表示をしてくれるのですが、Markdownにも対応しています。
ですので、ソースでなくても文書の管理や公開する場合にも良さそうです。

こんな感じ ⇒ https://gist.github.com/anonymous/cd6b011b36c2db5a02f8

# 終わりに

非公開にできるので、ちょっとしたソースや文書を他のユーザと共同で編集するのにいいなと感じました。
前回に投稿した [GitHub Pages](https://pages.github.com)と合わせて、今後もGihHubの便利な機能を使いこなしていきたいと思います。
Gradle Jetty Ecilpse plugnのJettyのversionを変更する


GradleからJetty9.2を使いたかったのですが、公式のJetty pluginだとJettyのverisonが古いらしい。そこで[Gradle Jetty Ecilpse plugn](https://github.com/Khoulaiz/gradle-jetty-eclipse-plugin)を利用することにしました。ところがデフォルトではJetty9.1だったのでなんとかします。

# gradle pluginの依存性のversionを変更する
GitHubにあるGradle Jetty Ecilpse plugnの設定方法です。

``` build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath (group: 'com.sahlbach.gradle', name: 'gradle-jetty-eclipse-plugin', version: '1.9.+')
    }
}
apply plugin: 'jettyEclipse'
```

ここに細工してJetty9.1->Jetty9.2に依存性を上書きます。

``` build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath('com.sahlbach.gradle:gradle-jetty-eclipse-plugin:1.9.+') {
            // groupがorg.eclipse.jettyの依存性を除外する
            exclude group: 'org.eclipse.jetty'
        }
        // 上で除外した依存性を追加
        classpath 'org.eclipse.jetty:jetty-webapp:9.2.0.M0'
        classpath 'org.eclipse.jetty:jetty-plus:9.2.0.M0'
        classpath 'org.eclipse.jetty:jetty-jsp:9.2.0.M0'
        classpath 'org.eclipse.jetty:jetty-annotations:9.2.0.M0'
    }
}
apply plugin: 'jettyEclipse'
```

簡単ですね。
あとはgradle jettyEclipseRunでJetty9.2が起動します。
mysql5.6をソースビルドしてマスター・スレーブで動かす[後編]

[前回](http://qiita.com/Fu3nori/items/2903f768d0d179047c18)の続きです。
マスター、スレーブで使う為のDBを立ち上げを終えたら、マスターから出力される更新ログを随時スレーブ側で受け取り、反映出来るようにします。

マスターの更新ログは前回my.cnfでpid出力先として指定した **/usr/local/mysql/data**の中に出力されているはずですので、一度確認してみるといいでしょう。

出力されていなければ設定が間違っている可能性が高いので、もう一度前回の記事をご覧下さい。

# マスター側DBでレプリケーション用ユーザーを作成する
## マスター側DBにクライアントでルートでログイン

(ここでは省略していますが、パスワード設定を必ずパスワードは設定しておく事)
` mysql -u root`

## ユーザー作成

`GRANT REPLICATION SLAVE ON *.* TO repl@'127.0.0.1' IDENTIFIED BY '任意のパスワード';`

# マスター・スレーブを同期させる
## マスターのDB更新を一旦禁止する

現在のマスター側のデータを維持するため、DB更新を一旦禁止。
`FLUSH TABLES WITH READ LOCK;
EXIT;
/etc/init.d/mysqld_master stop`

## マスターのデータを全て取得する

`cd /usr/local/mysql/data
tar -cvf /usr/src/backup.tar .`

## マスターのログファイル一覧をメモする

以下の通り実行し、出力されたFileとPositionの内容をメモ。
Fileなら **mysql-bin.XXXXX** 
Positionなら数字が出力される。
`mysql -u root
SHOW MASTER STATUS;
EXIT;`

## 取得したデータをスレーブ側に展開する

`tar -xvf /usr/src/backup.tar -C /usr/local/mysql_slave/data `
次の通りslave/data内を確認して、binファイルがコピーされていればOK
`ls /usr/local/mysql_slave/data`

## マスター側の更新を有効にする

`mysql -u root
UNLOCK TABLES;
EXIT;`

## スレーブ側のDBに接続して設定を行う

`/usr/local/mysql_slave/bin/mysql -u root -P 13006
CHANGE MASTER TO
        MASTER_HOST='127.0.0.1',
        MASTER_USER='repl',
        MASTER_PASSWORD='設定したパスワード',
        MASTER_LOG_FILE='先程メモしたFile',
        MASTER_LOG_POS=先程メモしたPosition;
START SLAVE;`

## 実際に動作を確認する

これ以降、マスター側でのDB更新は全てスレーブに反映される。
マスター側で任意のDB/テーブルを作成、更新後、スレーブに接続して反映されているか確認する。
JenkinsでGithubログインできるようにしてOrganizationメンバーに権限を与えてみる

JenkinsにおいてGithubアカウントでログインできるようにした。
またGithubのOrganization(開発グループ的なもの)のメンバーだけがJenkinsの権限を持ってジョブを実行できるようにした。
その手順をメモしておく。

#　参照サイト
* [Jenkins with GitHub OAuth Plugin のセットアップ手順 - 野良C++erの雑記帳](http://d.hatena.ne.jp/gintenlabo/20130205/1360079248)
* [Hudsonの操作権限をユーザ/グループ/ロール別に制御する - ふぞろいのGENGOたち](http://d.hatena.ne.jp/tyuki39/20110111/1294759823)
* [Role Strategy Plugin - Jenkins - Jenkins Wiki](https://wiki.jenkins-ci.org/display/JENKINS/Role+Strategy+Plugin?focusedCommentId=46336489#comment-46336489)
* 

# やってみた手順
## githubアカウントでjenkinsにログイン出来るようにする

* jenkinsインストールする
* Jenkinsのプラグインに以下を追加する
 * Github OAuth Plugin
 * Role Strategy Plugin
* Githubにアプリを追加する
 * [https://github.com/settings/applications/new](https://github.com/settings/applications/new)にアクセスし、以下のようなアプリを作成する
 * Application Name、Application description：適当に設定
 * Homepage URL：[Jenkins URL]
 * Authorization callback URL：[Jenkins URL]/securityRealm/finishLogin
* jenkinsのグローバルセキュリティの設定を行う
 * ユーザ情報をGithub Authentication Pluginにして作成したアプリのClient IDとClient Secret設定
 * 権限管理をRole-Based Strategyに

![jenkins-security-for-github.jpg](https://qiita-image-store.s3.amazonaws.com/0/16768/6a0f1512-2522-bf06-31cb-876542999688.jpeg)

## Roleを設定して特定ユーザしか操作権限がないようにする

行列による権限設定でも良いけど各ユーザ毎の権限設定が面倒臭いのでRoleつくってユーザに割り当てるようにした。

 * 読み取り専用のRoleを作成する
  * [Jenkinsの管理] → [Manage and Assign Roles] → [Manage Roles]
  * [Global roles]でread-onlyのような名前でroleを追加し、一通りのread権限を付けておく

![manage_and_assign_roles.jpg](https://qiita-image-store.s3.amazonaws.com/0/16768/cb04a351-a72c-cffa-e71c-6dbcfba2d59c.jpeg)

 * Roleを割り当てる
  * [Jenkinsの管理] → [Manage and Assign Roles] → [Assign Roles]
  * [Global roles]でAnonymousのRoleをread-onlyにする(デフォルトは全権限がある)
  * 自分のGithubアカウント名をaddしてadmin権限をつける

![asign_role.jpg](https://qiita-image-store.s3.amazonaws.com/0/16768/fe33ba83-93a8-dae5-fe07-1422b606503b.jpeg)

## Organizationのメンバーの操作を許可する

Githubは[API](https://developer.github.com/v3/orgs/members/)でOrganizationの一覧取得が可能。
JenkinsはAPIでユーザ操作ができないみたい(2014/05/15時点)なのでconfig.xmlを直接編集して再起動する。(API使えたらメンバー変更後の更新とか楽なのに、、、)

 * [GithubのOrganizationメンバー一覧取得スクリプト](https://gist.github.com/mechamogera/1b6b9be40b3686bc94fd)を実行してメンバー一覧を取得する

```bash
git clone https://gist.github.com/1b6b9be40b3686bc94fd.git github_org_members
cd github_org_members
bundle install --path vendor/bundle
bundle exec ruby github_org_members.rb --org-name hoge | xargs -I{} -n1 echo "          <sid>{}</sid>"
```

 * 出力結果をjenkinsディレクトリのconfig.xmlに入れる(今回は手動でやった)
  * &lt;role name="admin" pattern=".*"&gt;の&lt;assignedSIDs&gt;の中身を出力結果と入れ替え
 * jenkinsを再起動する
戻り値が複数ある時、あと戻り値がイミディエイタリな時


+ 戻り値が複数ある時 ⇒ 戻り値オブジェクト
+ 戻り値がimmediatelyな時 ⇒ メッセージ

　オブジェクト指向上の別物を匿名関数を引数にするという一つの方法で実装します。

``` csharp
//これを
Tuple<int, string> hogefunction(int arg) {...}
//こう
bool hogefunction(int arg, Action<int, string> setter) {...}
```
``` csharp
//これを
foreach (var result in hoge.hagefunc(k)) Debug.Print(result);
//こう
hoge.hagefunc(arg, (result) =>  Debug.Print(result));
```

　なので次のような実装で「副作用が～」とか「生存期間が～」と言う話題になりますよね？

``` csharp
errorflg = hogefunction(arg, ( k , j ) => {
    effectCounter++; // 実行回数が1回とは限らない。
    effectObj.A = k;
    effectObj.B = j;});
``` 
``` csharp
void hagefunc(int arg, Action<String> immediateAct)
{
	this.MessageOutput = immediateAct; // 他の処理で使う用に取っておく。
	// 関数内のインスタンスが既に失われていても実行できてしまう。
}
``` 

　型優先と匿名型(関数型プログラミング)は別のパラダイムだけど、概念とか?
抽象的な上位にはオブジェクト指向が残ってるのが感じとれて面白くないですか。

　こういった設計と実装のミスマッチが起こりうるので、人力で不具合を探す時は
設計をイメージしましょう。
(OOPで設計していなくても、人間が認識できるものはすべてオブジェクトです！！)
INIファイル読み書きで大文字／小文字を区別する

Python標準のINIファイルパーサ既定動作では、オプション名の大文字／小文字を区別しない（出力時は小文字へ自動変換される）。この既定動作を変更し、大文字／小文字を区別する動作に変更する方法。

```py
import ConfigParser # Python 2.x
import configparser # Pyrhon 3.x

cfgparser = ConfigParser()
cfgparser.optionxform = str
```

- Python2.7: [ConfigParser.optionxform](http://docs.python.jp/2.7/library/configparser.html#ConfigParser.RawConfigParser.optionxform)
- Python3.3: [configparser.optionxform](http://docs.python.jp/3.3/library/configparser.html#configparser.ConfigParser.optionxform)
svn: E155016: The working copy database at hogehoge is missing

DBにsqlを実行して共有フォルダへ保存するWindowsのバッチファイルがありました。
履歴管理のために、単に共有フォルダではなくsvnリポジトリに変更しようと試みた際のバッドノウハウ。

リポジトリ作成と、初期ファイルのコミットまでうまく行き、既存のバッチファイルに、svnコミットする行を追加し実行したところエラーに遭遇。

svn: E155016: The working copy database at hogehoge is missing.

バッチファイル内に、 サブフォルダ内の*.dbファイルを全部消すコマンドが有り、.svn内のwc.dbも消されちゃってました。。。
変数nowがいつでもどこでも現在時刻を持つようにする

```js:準備
Object.defineProperty(window, 'now', {
  get: function(){ return new Date(); }
});
```

```js:使い方
console.log(now);

setTimeout(function() {
  console.log(now);
}, 1000);
```

ローカル変数との名前の重複については

```js
var now = window.now;
```

で回避できるかと思います。

いや、これが現実的な使い方ではないとは思うんですが、getterて良いですね。うはー夢が広がりんぐ。

参考:

* [Object.defineProperty - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)
GASのYouTube LiveStreaming API で、完全クローズドな動画配信環境を構築する

現在100人組織の社内システムをGoogleAppsで構築しています。

YouTubeLiveが一般公開されたので、誰でも使えるようになりました。

ニッチな需要&しょっぱいプログラムですが、少しでも皆さんの役に立つ部分があったらうれしいと思って、
ちょっとだけ書かせていただきました。

[プログラム相関図.jpg](https://qiita-image-store.s3.amazonaws.com/0/36324/a9c8cea4-9b9e-df1a-e28b-6378c4412781.jpeg)

本当はひとつひとつ細かく説明したいのですが、ここでは概要だけを説明させていただきます。

本来は、ライブイベントのカレンダー登録から、WEBページ作成まで一つのプロジェクトで行いたかったのですが、
Googleカレンダーを取り扱うスクリプトと同時に実行しようと、
GoogleカレンダーがGetできなくなってしまいます。
現在YouTube Date API v3.0は試験運転中のため、だと思われます。
Dockerでsshdがバックグラウンドで起動しない場合の対策

# 15/09/09 追記
現在のDockerには `docker exec` コマンドがあるため、sshしなくても、ホストマシンからexecして入れるようになっている。
リモートマシンから直接乗り入れたいという場合でなければ、sshd入れるよりコンテナをシンプルに保てるので、こちらがオススメです

--------

[Dockerのドキュメントにある方法](http://docs.docker.io/examples/running_ssh_service/)をScientific Linux (CentOS)にあわせてDockerfileを書く

```bash:Dockerfile
FROM jtang/scientificlinux-6.4-x86_64
RUN yum install -y openssh-server openssh-clients
RUN echo 'root:root' |chpasswd
EXPOSE 22
```
buildしてrunする

```bash
docker build -t test/sshd .
docker run -d -p 10022:22 test/sshd /usr/sbin/sshd -D
```

sshを試してもconnection refusedで動かない
なんでだろうと思って

```bash
docker run -t -i -p 10022:22 test/sshd /bin/bash
```

で中に入ってコマンドを叩いてみると、ssh_host_rsa_keyとssh_host_dsa_keyがないって言われた
今まで /etc/init.d/sshd start とかでしか起動したことがなかったのでわからなかったのだが、どうやらこの時に、ここらへんのキーが自動生成されるらしい
Dockerfileを編集する

```bash:Dockerfile
FROM jtang/scientificlinux-6.4-x86_64
RUN yum install -y openssh-server openssh-clients
RUN echo 'root:root' |chpasswd

# 追加分
RUN /usr/bin/ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ""
RUN /usr/bin/ssh-keygen -t dsa -b 1024 -f /etc/ssh/ssh_host_dsa_key -N ""

EXPOSE 22
```

これでpassなしにrsa_keyが生成される。この状態でbuildしてrunしてssh接続すると入れた
FileResultでzipファイルを返す

#目的

複数のcsvファイルをzipにまとめてダウンロードするやり方のメモ。


#準備
[DotNetZip](http://dotnetzip.codeplex.com/)を使用します。（中身のIonic.Zip.dllを使用）
NuGetで追加するのが簡単だと思います。

#コード

```csharp

public ActionResult DownloadZip(){
    var csv1 = "hoge,moge,piyo";
    var csv2 = "foo,bar";

    var zip = new Ionic.Zip.ZipFile();

    zip.AddEntry("csv1.csv", Encoding.GetEncoding("Shift_JIS").GetBytes(csv1));
    zip.AddEntry("csv2.csv", Encoding.GetEncoding("Shift_JIS").GetBytes(csv2));

    var ms = new MemoryStream();
    zip.Save(ms);
    ms.Position = 0;

    return File(ms, System.Net.Mime.MediaTypeNames.Application.Zip, "FileName.zip");
}

```

#まとめ

ZipFileインスタンスを作ってファイル名とbyte配列を追加していき、MemoryStreamに格納してFileResultで返すという流れです。
当然csv以外のファイルも可能。