OmniAICreator/Qiita-1.07M huggingface dataset:
他のGameObjectのメソッドを呼び出す方法【Unity】

まだUnity始めたばかりの超初心者です。

# SendMessage
- 引数を最大１つしか設定できない
- メソッドを実行するだけ
- 返り値を取得できない

``` C#:SendMessage
GameObject targetObj = GameObject.Find ("TargetObj");
targetObj.SendMessage("targetFunc");
```

# アタッチされているクラスを引っ張ってくる
- 引数を複数設定できる
- 返り値取得もできる

``` C#
GameObject targetObj = GameObject.Find ("TargetObj");
// 取得したGameObjectからアタッチされているクラスをGetComponentで引っ張ってくる
GameManager targetScript = targetObj.GetComponent<TargetClass> ();
targetScript.instantiateCoin (targetFunc, "arg1", "arg2");
```

まだ他にも方法があればアップデートしていきます。
sort -Vオプションでバージョニングをソートする

「x.y.z」みたいなバージョニングの一覧がある場合、それの一番新しいのを取るためにsort -rコマンドを使うと、文字列としてソートされるため期待する順序とは異なった順になってしまうことがあります。

```bash
$ echo -e "1.8.0\n1.9.0\n1.10.0\n1.10.1\n1.11.0"
1.8.0
1.9.0
1.10.0
1.10.1
1.11.0

$ echo -e "1.8.0\n1.9.0\n1.10.0\n1.10.1\n1.11.0" | sort -r
1.9.0
1.8.0
1.11.0
1.10.1
1.10.0

$ echo -e "1.8.0\n1.9.0\n1.10.0\n1.10.1\n1.11.0" | sort -nr
1.9.0
1.8.0
1.11.0
1.10.1
1.10.0
```

こんなとき、sortの-Vオプションを使えば自然なバージョニング(何をもって自然というのかは不明ですが)でソートしてくれます。

```bash
$ echo -e "1.8.0\n1.9.0\n1.10.0\n1.10.1\n1.11.0" | sort -Vr
1.11.0
1.10.1
1.10.0
1.9.0
1.8.0
```
### 参考
http://linuxjm.osdn.jp/html/GNU_coreutils/man1/sort.1.html
composite_primary_keysを使用するとidが使えなくなるっぽい


composite_primary_keysのgemを入れると、saveした時にidにnilが入るので、元の挙動(auto incrementの値が代入される)となるようにするパッチ。

##Gem
rails (ver. 4.2.0)
composite_primary_keys (ver. 8.1.0)

##Code
以下のソースを``/config/initializers``以下に配置する。

```composite_primary_keys_patch.rb
module ActiveRecord
  module Persistence

    def _create_record(attribute_names = self.attribute_names)
      attributes_values = arel_attributes_with_values_for_create(attribute_names)

      new_id = self.class.unscoped.insert attributes_values

      if self.class.primary_key.kind_of?(Array)
        if self.class.primary_key.include?('id')
          primary_keys = {}
          attributes_values.each { |key, value|
            if self.class.primary_key.include?(key.name)
              primary_keys[key.name] = value
            end
          }
          new_ids = []
          self.class.primary_key.map { |key|
            if key == 'id'
              new_ids << new_id
            else
              new_ids << primary_keys[key]
            end
          }
          self.id = new_ids
        else
          self.id ||= new_id if self.class.primary_key
        end
      else
        self.id ||= new_id if self.class.primary_key
      end

      @new_record = false
      id
    end

  end

  module AttributeMethods
    module Read
      def read_attribute(attr_name, &block)
        # CPK
        if attr_name.kind_of?(Array)
          _read_attribute(attr_name, &block)
        else
          name = attr_name.to_s
          _read_attribute(name, &block)
        end
      end
    end
  end

end
```
CentOSからSQL Server or Azure SQL Databaseに接続する

PHP+Mysqlばっかり使ってた人が
何故かAzure SQL Daatabase(Azure版SQL Server)を使わざるを得なくなって調べた産物
ODBCとか必要なのかと悩んでいましたが特に必要ないみたいです。

CentOS5をベースにしていますが、
**これで絶対にLinuxから行けます！**


#freetdsのインストール

まずは「freetds」をいれます。

```
# yum install freetds freetds-devel
```




実はこれだけでSQL ServerやAzure SQL Databaseに繫げることが出来ます。
（tsqlというCLI用のmysqlコマンドみたいなやつでつなげます。）

```
# TDSVER=8.0 tsql -H 'データベースサーバIP' -p 1433 -U 'ユーザ名' -D 'データベース名'
```

Azure SQL Databaseの場合は[データベースサーバIP]を[hogehoge.database.windows.net]とします。
**あと、Azure SQL Databaseにつなげる際は、Azure側で接続元IPを登録しないといけません。**
Azure管理コンソールからSQL Database、データベースを選び、
ダッシュボードから使用できるipアドレスに
クライアントIPアドレスアドレスを登録しておきます

-Pを付けることでパスワード入力をスルーすることが出来ます

Azure SQL Databaseの場合は -Dを付けて接続時にデータベースを決めておかないといけません。
要するにSQL Serverのuseコマンドが使えないんです。
ってことは「[データベース名].[dbo].[テーブル名]」と記述する奴もAzure SQL Databaseでは使えません。。

###実行例
Azure SQL Databaseにつないだ場合

```
# TDSVER=8.0 tsql -S 'hogehoge.database.windows.net' -p 1433 -U 'fugefuge' -P 'hagehage' -D 'bokeboke'
locale is "ja_JP.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
Default database being set to bokeboke
1> select top 10 * from udauda;
2> go
```




#設定ファイルについて

freetds.conf というファイルに設定を書いておくことも出来ます。
また、（後日書きますが）PHPからの接続の場合、
この設定ファイルが重要になったりします。

```
# vi /etc/freetds.conf
```
```
[dataserver]
host = データベースサーバIP
port = 1433
tds version = 8.0
charset = CP932
client charset = UTF-8
```

```
# TDSVER=8.0 tsql -S dataserver -U 'ユーザ名' -D 'データベース名'
```

もし、上手く行かなかった場合、
設定ファイルの場所がわかっていない可能性があるので

```
# export FREETDSCONF=/etc/freetds.conf
```

と事前に実行してあげてください。
（.bash_profileに入れとくといいですね）

以上です。

```
 読み込んだプラグイン:security
 インストール処理の設定をしています
 パッケージ freetds は利用できません。
 パッケージ freetds-devel は利用できません。
 エラー: 何もしません
```
で、入れれれへんって方はリポジトリを確認してください

```
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -ivh epel-release-6-8.noarch.rpm
```
Objective-Cでの定数定義について


Objective-Cで定数を定義する方法を紹介します

# 定義方法
## 1. const

### グローバル定数

```Objective-C:Class.m
#import "Class.h"

const NSInteger kInt = 1;
const CGFloat kFloat = 10.f;
NSString *const kString = @"String";

@implementation Class

...

@end
```

```Objective-C:Class.h
#import <Foundation/Foundation.h>

extern const NSInteger kInt;
extern const CGFloat kFloat;
extern NSString *const kString;

@interface Class : NSObject

...

@end

```
 
### ローカル定数

```Objective-C:Class.m
#import "Class.h"

static const NSInteger kInt = 1;
static const CGFloat kFloat = 10.f;
static NSString *const kString = @"String";

@implementation Class

...

@end
```


#### 注意点

*NSString* の `const` の位置に注意してください。
*NSInteger* や *CGFloat* と同じように

```
const NSString *kString = @"String";
``` 

と記述してしまうと、Objective-CではNSStringはオブジェクトなので、 
**const なNSStringオブジェクトへのポインタ** となってしまいます。



## 2. Defineマクロ

```
#define INTEGER_VALUE 1
#define FLOAT_VALUE 10.f
#define STRING_VALUE @"String"
```


#### 注意点

1. 最後にセミコロンを記述しないようにしてください。
1. こちらの方法は下記の理由により、個人的にはあまり推奨しません。
 
  * 型の指定がない
  * 同じ名前で定義してしまうと意図しないタイミングで定数置換が行われてしまう危険性がある


# 命名規則

定数の命名規則について紹介します

### 1. 先頭に k をつけ、単語の先頭の文字を大文字にする

Objective-Cで、1番よく見られる形です。
先頭の *k* はドイツ語の *Konstant* に由来するらしいです。

```
static const NSInteger kIntegerConstantValue = 1;
```


### 2. 先頭にプロジェクトの Class Prefix をつけ、単語の先頭の文字を大文字にする

enumで定義されている場合に、よく見られる形です。

```
static const NSInteger ABCIntegerConstantValue = 1;
```


### 3. 全て大文字で記述し、単語と単語の間に _ を入れる

C言語のDefineマクロで定義されている定数はこの形で記述されていることが多いですね。
僕もDefineマクロで定義しなくてはならない場合は、このように定義しています。

```
static const NSInteger INTEGER_CONSTANT_VALUE = 1;
```
SPAの分類とアップデータの設計


メモ書き

## 完全スタンドアローン

ネットワークの断線に耐えうるもの

考えられるシチュエーション

- ローカルのhtmlを`file://` で開いた時
- Electronアプリケーション
- すべてのリクエストがServiceWorkerでモックされた状態(初回アクセスは必要)

永続ストレージにもlocalStorageやIndexedDbを使う。
ネットワークを前提にしないので、アップデートが難しい(ネットワークを含む新しいアセットの配布が必要)

起動にネットワークリクエストを挟まず、なにがなんでも速く起動したいならこれ。
起動後のバックグラウンド処理でアップデーター起動、というものが多い。

アプリケーションの起動処理とアップデーターの起動は独立。

## 準スタンドアローン

起動時や要所要所にネットワークリクエストを必要とするが、瞬断に耐えうるもの。AndroidとiOSアプリと似たような設計になる。

- アセットの一部がServiceWorkerでキャッシュされた状態(初回アクセスは必要)
- すべてのリクエストをServiceWorkerでモックしているが、サーバー側で更新があった場合再取得(application cache的用途)

起動後に最小限の情報を持っていれば、必要な情報はクライアントでキャッシュしてネットワークリクエストを減らし高速に動作する設計。普通のウェブサイトの発展形ともいえる。


最近の東京の地下鉄では稀になったけど、地下鉄で定期的にネットワークが切れることが予想される環境や、使われるシチュエーションが発展途上国などで回線品質を悪い場所を想定するときにも有効。


SlackやSkypeのようなチャットサービスはログイン必須+ネットワーク前提なので、結果的にこうなる。

アプリケーションの起動処理はアップデーターの起動(ネットワークリクエスト含む)に依存。
JavaのLabelValueBean型変数にラベルと値を設定する方法

LabelValueBean型は、ラベルと値を同時に持つことができる。
下記のように宣言する。

    LabelValueBean hoge = new LabelValueBean("ラベル1", "value1");
    java.lang.System.out.println("ほげ: " + hoge);

コンソールへの表示結果は下記のようになる。

    ほげ: LabelValueBean[ラベル1, value1]
JenkinsのScripted Cloud Pluginを使ってVMware FusionのVMの起動や終了をJenkinsで行う


## はじめに

Jenkinsのスレーブを仮想マシンで実現しているとして、仮想マシン自体の起動やシャットダウンをどうするかというと、一番楽なのはホストマシン起動時に合わせて仮想マシンも起動させて動作させっぱなしにする、というやり方だと思います。

しかし、頻繁にそのスレーブを使うならまだしも、たまにしか使わないのに仮想マシンを起動しっぱなしにするのはリソースの無駄遣いと言えます。

そうなると、仮想マシンの起動やシャットダウンをJenkinsから行いたいというのが人情で、実際例えばVirtualBoxですと[VirtualBox Plugin](https://wiki.jenkins-ci.org/display/JENKINS/VirtualBox+Plugin)というものがあり、必要に応じてVirtualBoxの仮想マシンを操作することができます。

ところが、我らがVMware Fusionにはそういうものが無く、仕方ないのでlaunchdでvmrunさせることで仮想マシンの自動起動をさせていたわけですが、OS X on OS Xなんてやっていると結構な負担なのでこれをどうにかしたいと思っていました。

## Scripted Cloud Pluginでスレーブを作る

調べてみると、[Scripted Cloud Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Scripted+Cloud+plugin)というものが見つかり、これで実現できるのではと思い、トライしてみました。あと、日本語の解説が全く見つからなかったのでチャレンジしてみたというのもあります。

Scripted Cloud Pluginでスレーブを作るには、2つの手順を踏みます。

1. Scripted Cloudを作る
2. 作成したScripted Cloudを用いたスレーブを作る

### Scripted Cloudを作る

Scripted Cloudを作るには、[Jenkinsの管理]->[システムの設定]の[クラウド]で[scripted Cloud]を作成します。

![scriptedcloud1.png](https://qiita-image-store.s3.amazonaws.com/0/45008/5588e916-ff2e-fe15-7841-4c75c639e12c.png "scriptedcloud1.png")

それぞれ、クラウドの名前、VM起動スクリプトのパス、VM終了スクリプトのパスを記載します。
この手順が[プラグインの公式サイト](https://wiki.jenkins-ci.org/display/JENKINS/Scripted+Cloud+plugin)でも簡単にしか説明されていなくて戸惑ったのですが、設定内容がシンプルなので実際はそんなに困らないです。

VMの起動/終了は、VMware Fusionではvmrunを使用するため、スクリプトの内容は以下の様な感じになります。

```bash:vm_start.sh
#! /bin/bash -ex

VM_PATH="/path/to/"${SCVM_NAME}".vmwarevm/"${SCVM_NAME}".vmx"
VMRUN="/Application/VMware Fusion.app/Contents/Library/vmrun"

ssh cloudhost "\"${VMRUN}\" start \"${VM_PATH}\" nogui"
```
```bash:vm_stop.sh
#! /bin/bash -ex

VM_PATH="/path/to/"${SCVM_NAME}".vmwarevm/"${SCVM_NAME}".vmx"
VMRUN="/Application/VMware Fusion.app/Contents/Library/vmrun"

ssh cloudhost "\"${VMRUN}\" stop \"${VM_PATH}\""
```
 

### スレーブを作る

スレーブ作成の方は[プラグインの公式サイト](https://wiki.jenkins-ci.org/display/JENKINS/Scripted+Cloud+plugin)でちゃんと説明されているので、そちらを参照されたほうが良いかと思います。

![scriptedcloud2.png](https://qiita-image-store.s3.amazonaws.com/0/45008/7db9134a-430f-57ba-d271-2149a5175cbb.png "scriptedcloud2.png")

![scriptedcloud3.png](https://qiita-image-store.s3.amazonaws.com/0/45008/69924af1-a9b6-aa9c-3e8b-af826126e544.png "scriptedcloud3.png")

設定項目の、[Virtual Machine Name]から[What to do〜]は変数としてScripted Cloudの設定で指定したstart/stopスクリプトで使用できるため、切断時の扱いに応じて処理を変えるとかもできます。

## 最後に

このプラグインはあくまでVMの起動と終了だけを管理するものなので、スレーブの起動設定(sshかJNLPかとか)は通常のスレーブ作成方法そのままということでスレーブを作り慣れた人にも安心です。
過去に実行したコマンドの前後を見る


過去に実行したコマンドは`history`で見れますが、そのコマンドの前後の文脈も見たい場合があります。
そんなときは`history`の結果を`grep`にパイプし、かつオプションで`-行数`と指定してあげると、前後n行が表示されます。

```shell
history | grep 検索文字 -行数
```


例えばrbenvをインストールしたときなど、このコマンドを使えばどうやってインストールしたか確認できます。
こんな感じ。

```shell
# 過去に実行されたrbenv initの前後3行を表示
$ history | grep 'rbenv init' -3
 18  brew install rbenv ruby-build rbenv-gem-rehash
 19  touch .zshrc
 20  echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
 21  echo 'eval "$(rbenv init -)"' >> ~/.zshrc
 22  less .zshrc
 23  rbenv --version
 24  rbenv install --list
```

ちなみに後ろの行だけを表示したいなら`-A 行数`、前の行だけを表示したいなら`-B 行数`と書けばOKです。

```shell
# 過去に実行されたrbenv initの後ろ3行を表示
$ history | grep 'rbenv init' -A 3
 21  echo 'eval "$(rbenv init -)"' >> ~/.zshrc
 22  less .zshrc
 23  rbenv --version
 24  rbenv install --list
```
AWS EC2のAmazon Linuxでの時刻設定メモ


> 参考: http://hivecolor.com/id/2

初期状態は

```
$ data
2015年  7月  9日 木曜日 8:41:12 UST
```

USTです。9時間前になってます。

これを日本時間にします。

## `/usr/share/zoneinfo/Japan`を`/etc/localtime`に上書き

```
$ cp /usr/share/zoneinfo/Japan ./
$ mv Japan localtime
$ sudo mv ./localtime /etc/localtime
```


## 確認

```
$ date
2015年  7月  9日 木曜日 17:41:12 JST
```

JSTになってます。
ISC BIND 9 に DoS 脆弱性

## 脆弱性の内容

「[JVNVU#93531657: ISC BIND 9 にサービス運用妨害 (DoS) の脆弱性](http://jvn.jp/vu/JVNVU93531657/)」より

> ISC BIND 9 には、DNSSEC 検証を有効にした再帰的名前解決処理が、特定の条件下において異常終了する脆弱性が存在します。

> DNSSEC 検証を有効にしたキャッシュ DNS サーバを運用している場合、遠隔の第三者によって、サービス運用妨害 (DoS) 攻撃を受ける可能性があります。

## 影響度

「[CVE-2015-4620: Specially Constructed Zone Data Can Cause a Resolver to Crash when Validating | Internet Systems Consortium Knowledge Base](https://kb.isc.org/article/AA-01267)」より

CVSS 基本値 7.8 (AV:N/AC:L/Au:N/C:N/I:N/A:C)

| 基本評価基準                            | 評価値            |
|----------------------------------------:|:------------------|
| 攻撃元区分（AV）                        | ネットワーク（N） |
| 攻撃条件の複雑さ（AC）                  | 低（L）           |
| 攻撃前の認証要否（Au）                  | 不要（N）         |
| 情報漏えいの可能性（機密性への影響, C） | なし（N）         |
| 情報改ざんの可能性（完全性への影響, I） | なし（N）         |
| 業務停止の可能性（可用性への影響, A）   | 全面的（C）       |

CVSS については[デモページ](http://www.baldanders.info/spiegel/archive/cvss/cvss2.html)を参照のこと。

## 影響を受ける実装

- BIND 9.7.1 から 9.7.7 まで
- BIND 9.8.0 から 9.8.8 まで
- BIND 9.9.0 から 9.9.7 まで
- BIND 9.10.0 から 9.10.2-P1 まで

対策としては以下のバージョンにアップデートすればよい。

- BIND 9.9.7-P1
- BIND 9.10.2-P2

（9.8 以前の BIND 9 はサポートを終了している）

一時滝な回避策としては DNSSEC 検証機能を無効にすること（当然検証機能は機能しなくなるので注意）。ルータ等のネットワーク機器への対応については [JVN のページ](http://jvn.jp/vu/JVNVU93531657/)を参考にどうぞ。

## 参考ページ

- [（緊急）BIND 9.xの脆弱性（DNSサービスの停止）について（2015年7月8日公開）](http://jprs.jp/tech/security/2015-07-08-bind9-vuln-dnssec-validation.html)
- [BIND 9にDoSの脆弱性 - JPCERT/CC | マイナビニュース](http://news.mynavi.jp/news/2015/07/09/267/)
ディープラーニングにおける様々な物体領域検出のアプローチ方法(R-CNN)

## ディープラーニングにおける物体領域認識の必要性

最近ディープラーニングについて勉強していまして、あらかじめ人間によってトリミングや処理された認識しやすい下記のような画像の認識は90%以上の高確率で出来るようになりました。

![89bfbe03-6e3b-489d-8476-8979e3a1f557.png](https://qiita-image-store.s3.amazonaws.com/0/72314/5342f8dd-8c41-580c-d42e-c993d8c79228.png)

しかしこの前処理を人間がやっていたのではディープラーニングを使う利点が大きく削がれてしまいます。そこで複数の物体を含む画像からそれぞれの物体領域を認識し、その領域ごとにニューラルネットワークによる認識を行うプロセスいわゆるR-CNN(Regions with Convolutional Neural Network)を使う必要があります。R-CNNを使用する事で下の画像のような検出が可能になります(まだできてないけどCaptcha Breakerを作ってます)。

![8001.png](https://qiita-image-store.s3.amazonaws.com/0/72314/437cf24e-a682-4200-4f38-04c5c164fad4.png)

そこで、物体領域認識にはいくつかの方法があるので簡単にまとめてみようと思います。

## Objectness

古くから使われている物体認識方法です。1枚の画像を10,000枚以上に分割して顕著度、エッジ、色や場所を基としたスコア付けがなされたのち、スコアが高い部分が物体領域として認識されるという方法です。スコア付けは割と緩く行われるが精度は高く、処理速度も良好のようです。出力として画像中の座標と物体らしさのスコアが得られます。問題点として一度検出がスルーされてしまうと再帰させるのが難しいという点、物体の詳細な輪郭は得られない点があります。古くからある方法のため論文やドキュメントが多く、参照しやすいです。

![nmsMS+CC+SS_002053.jpg](https://qiita-image-store.s3.amazonaws.com/0/72314/db0472b2-d5f9-5631-ae86-194b36406c76.jpeg)

## CPMC(Constrained Parametric Min-Cuts)

Objectnessと同様に古くからある物体認識方法です。前景として配置された点(Seeds)の周囲にグラフカット処理が行われ、それらを基に物体領域を認識するという方法。処理速度が非常に遅いがかなりの高精度で物体領域が検出できるようです。また強みとしてObjectnessでは得られない物体の輪郭が高精度で得られるという点があり、目的の物体を背景から切り離して処理したい時などに適しています。

 ![CPMC.png](https://qiita-image-store.s3.amazonaws.com/0/72314/ea4817ff-8009-eae5-918d-9bdd814f91db.png)

## Selective Search

最近何かと流行っている物体認識方法。色やテクスチャ特徴を基に類似度が高い近接領域を段階ごとに結合していき、最終的に一枚の画像を一つの結合体にします。その段階的な変化を基に物体領域を認識するという方法。精度が高く、処理速度も高速ですがパラメータ調整が大変なようです。複数のパラメータ設定で並列処理することで認識率を上げることができます。物体の輪郭も得る事ができますがCPMCにの精度には及びません。物体の詳細な輪郭を得る必要がない場合は良い選択肢の一つになりそうです。

![image.png.jpeg](https://qiita-image-store.s3.amazonaws.com/0/72314/7beb13a2-5bd0-1827-0dc6-ca26364f10a4.jpeg)

## Object Proposals

CPMCと類似している物体認識方法です。前景として配置された点(Seeds)からピクセルごとの結合を基に物体の境界予測を複数作成しその全体の傾向から物体領域を認識するという方法。CPMCと同様の長所、短所を持っていて処理速度はCPMCと同様遅いですが高精度の認識ができ、物体の輪郭も得る事ができます。物体をパーツごとに認識できる(鳥の羽の部分のみや人の顔の部分のみなど)ためより細かい画像分類などに向いています。動植物の分類などを目的としている場合は良い選択肢となりそうです。

![objectproposal.png](https://qiita-image-store.s3.amazonaws.com/0/72314/b6e98d73-d1be-c6be-9f21-c64aea89a9e8.png)

## まとめ

物体領域認識はCNNによる認識の上流にくるので、CNNのチューニング以上に画像認識率に関わってきます。これらの他にも様々な方法があり、用途によって最適な物体領域認識方法を選択する必要が有ります。またこれらの物体領域検出方法も学習により精度が改善されるみたいなので色々と試してみたいです。

他に方法を見つけ次第随時追加していこうと思います。
何か問題点、改善点ありましたら教えてください。

## 参考文献

* [Objectness measure V2.2](http://groups.inf.ed.ac.uk/calvin/objectness/)
* [Homepage of Koen van de Sande](http://koen.me/research/selectivesearch/)
* [CPMC: Automatic Object Segmentation Using Constrained Parametric Min-Cuts By Joa ̃o Carreira and Cristian Sminchisescu](http://www2.isr.uc.pt/~joaoluis/papers/PAMI2012.pdf)
* [Geodesic Object Proposals By Philipp Kr ̈ahenbu ̈hl and Vladlen Koltun] (http://www.philkr.net/home/gop)
CakePHP2.x 独自SQLの場合でDBからのデータをまとめたいときのTips

CakePHP使い始めて間もないのですが、わからないことばかり。

とくに独自SQLを書いたときに取得しようとするとなぜだか配列がいくつかに分かれてしまう。とくにASで別名したときなどに不便さを感じました。
CakePHP調べてたら仕様だとのことです。

これは、バーチャルフィールドというものを使って取得する必要があるようです。
http://book.cakephp.org/2.0/ja/models/virtual-fields.html


例
`$this->ModelName1->virtualFields['originalName1'] = 0;`

こんな感じで定義して、SQL文の中で
`AS ModelName1__originalName1`

さらに
`FROM Table_name AS ModelName1`
としてテーブル名とモデル名を合わせておく必要があります。
こうすると取得したデータがすべて、array["ModelName1"]にまとまって取得できます。

こちらを参考にさせていただきました！
http://i723.sakura.ne.jp/wp/archives/179

以上！

Qiita初投稿！
ControllerやActionごとにレイアウトテンプレートの出し分け

#はじめに

ControllerやActionごとにレイアウトテンプレートを出し分けたいときTips
デフォルトでは`app/views/layouts/application.html.erb`が呼び出されます

#Controller

```
class hogehoge < ApplicationController

  layout '呼び出したいテンプレート'

  def hogehoge
  end

end
```

#Action
```
class hogehoge < ApplicationController

  def hogehoge
    render :layout => '呼び出したいテンプレート'
  end

end
```
Ubuntu14.04にTrema0.4.7導入

とりあえず動いた方法を書いておきます

# バージョン
* Ubuntu 14.04
* Trema __0.4.7__
* ruby 1.9.3p484
* ruby2.0 2.0.0p384
* gem 1.8.25
* gem2.0 2.0.14

# 必要なパッケージ導入
`sudo apt update`
`sudo apt install ~~~~~`

## 必要パッケージ ##
* gcc
* git
* make
* ruby2.0
* libruby2.0
* ruby-dev
* ruby2.0-dev
* libpcap-dev
* libsqlite3-dev
* libglib2.0-dev
* openvswitch-switch
* openssl

# gemのバージョン設定
gemのバージョンが1.8.25以上じゃないと動きません
`sudo gem update`
`sudo gem install rubygems-update -v 1.8.25`
`sudo update_rubygems`

# Tremaインストール
`sudo gem install trema -v 0.4.7`

# 動作確認
`trema version`

#注意事項
* 動作確認でバージョンが表示されても実際に動作しないことがあるので、リピータハブとconfファイルでちゃんと動作を確認したほうが良い
* rubyのconfファイルを移動する必要がある場合があったりなかったり

移動コマンド
`sudo cp /usr/include/x86_64-linux-gnu/ruby-2.0.0/ruby/config.h /usr/include/ruby-2.0.0/ruby/`
配列がわかった！

#コード
```rb
lass Scraping
  def self.movie_urls
    links = []
    agent1 = Mechanize.new
    main_page = agent1.get("http://eiga.com/now/")
    elements = main_page.search('.m_unit h3 a')
    elements.each do |ele|
      links << ele.get_attribute('href')
    end

    links.each do |link|
      get_product('http://eiga.com' + link)
  end



  def self.get_product(link)
    agent2 = Mechanize.new
    sub_page = agent2.get("http://eiga.com/" + links)
    title = sub_page.at('.moveInfoBox h1')
    image = sub_page.at('.pictBox img')
    puts title
    puts image
  end
end
```
#理解したこと
* 配列は引数などとは違って、何かを受け渡したりしない!

```rb
links = []
agent1 = Mechanize.new
    main_page = agent1.get("http://eiga.com/now/")
    elements = main_page.search('.m_unit h3 a')
    elements.each do |ele|
      links << ele.get_attribute('href')
    end
```
まずこのコードで空の配列linksに、main_pageから取得したhref要素の全てを入れている。つまり、メイン画面のリンク先が溜まっているタンクのようなものを作成している。

```rb
links.each do |link|
      get_product('http://eiga.com' + link )
  end
```
現段階ではlinksに多くのリンク先がたまっているので、今度はそのlink先一つ一つについて分解したいのだが、その前にlinkのurlについて整理し、それをget_productというメソッドに渡している。つまりeach.do関数でたまっているlinksが一つ一つlinkとしてget_product(http:// + link)という形で定義され、全てのリンク先が定義される。

```rb
def self.get_product(link)
    agent2 = Mechanize.new
    page = agent.get(link)
    title = page.at('.moveInfoBox h1').inner_text
    image_url = page.at('.pictBox img')[:src]
    product ~ Product.new(:title => title, :image_url => image_url)
    product.save
  end
end
```
そしてここで得たlinkという配列をつかって、リンク先の一つ一つのタイトルをゲットしてるのだ。
Go言語(Go-Json-Rest)のCORSでのハマり。Safariだけでハマった話。


[go-json-rest](https://github.com/ant0ine/go-json-rest)を使ってAPIサーバーを立ててCORS対応する話を前に書いたのですが、Safariだけ挙動でハマった話です。

> 参考: [Go言語(Go-Json-Rest)でAPIサーバーを立てるときのCORS設定 (Basic認証機能付きも)](http://qiita.com/n0bisuke/items/45ab414fc11959fc27c7)

##ハマり内容

前のコードと同じ内容です。
ChromeやFirefoxの場合はこれで問題無く動作していました。

* Go側

```app.go

/*省略*/
  api.Use(&rest.CorsMiddleware{
        RejectNonCorsRequests: false,
        OriginValidator: func(origin string, request *rest.Request) bool {
            return origin == "http://localhost:3000" || origin == "http://192.168.43.158:3000" || origin == "http://localhost"
        },
        AllowedMethods: []string{"GET", "POST", "OPTIONS"},
        AllowedHeaders: []string{"Accept","Authorization","content-type"},
        AccessControlAllowCredentials: true,
        AccessControlMaxAge:           3600,
    })
    
/*省略*/

```

* フロント側

```api.js

$(function(){
  var host = 'localhost:8080';
  var rand_param = '?ie=' + parseInt((new Date())/1000, 10);
  var endpoint = '/countries';
  var url = 'http://'+host+endpoint+rand_param;

  function make_base_auth(user, password) {
    var tok = user + ':' + password;
    var hash = btoa(tok);
    return "Basic " + hash;
  }

  $.ajax({
      url: url,
      beforeSend: function (xhr){
        xhr.setRequestHeader('Authorization', make_base_auth('userud', 'password'));
      },
  }).done(function(data){
      console.log(data);
  }).fail(function(data){
      console.log(data);
  });

});

```

ここまでは前回と同様のソースコードです。

###chromeやfirefoxだと普通です。

![](http://i.gyazo.com/de17e883ed38fe4c2291e09dc6b7e72e.png)

### safariだけでエラーが発生。(しかもPOSTのみ)

> ※ safariのバージョンは8.0.7(OSはYosemite)です。

![](http://i.gyazo.com/43a6608cd776748c471ebf25072c61fc.png)

iPhoneで確認して、最初はiPhoneだけの問題かと思いきや、Safari特有の問題みたいです。

※ GETメソッドは問題無く動作してました。

## 解決: Access-Control-Allow-Headersにoriginを追加しましょう。

色々試行錯誤した結果解決しました。

[Access-Control-Allow-Headers](https://developer.mozilla.org/ja/docs/HTTP_access_control#Access-Control-Allow-Headers)にoriginを追加することで解決しました。逆に言えば、Safari以外はこの指定が無くても動いてくれるんですね。

[go-json-rest](https://github.com/ant0ine/go-json-rest)の実装の場合は`AllowedHeaders`に`origin`を追加します。これでsafariでも大丈夫です。

```app.go

/*省略*/
AllowedHeaders: []string{"origin", "Accept","Authorization","content-type"},    
/*省略*/
```

これだけで半日くらいハマった...
Safariだけで発生した問題だったのでブラウザごとのxhr実装とかの関係かと思ってフロント側調査ばかりしてました。

こちらの記事([GolangでXMLHttpRequestLevel2+CORSのプリフライトが通るサーバーを立てる(BasicAuth付き)](http://qiita.com/futosu/items/b49f7d9e28101daaa99e))をもとにサーバーを構築しなおしてみたら同じJSコードで通ったのでGo側の実装に問題がありそうだという糸口です。

## まとめ

GETメソッドは問題無く動作していたのでややこしかったです。
Access-Control-Allow-Headersはしっかり設定しましょう。


勉強になりました。→ [異なるドメインのURLからデータを参照する方法 - Cross-Origin Resource Sharing](http://koiroha.blogspot.jp/2014/09/cross-origin-resource-sharing.html)
AtomでTypeScriptの環境を構築する


## TypeScriptのプラグインをインストール

### atom-typescriptをインストール
atom-typescript
https://github.com/TypeStrong/atom-typescript

ターミナルで以下のコマンドを入力
**インストールに結構時間がかかる**ので気長に待ってください。

```sh
$ apm install atom-typescript
```

### プロジェクトのルートにtsconfig.jsonファイルを作成
tsconfig.jsonにjsにコンパイルする際の設定を記述します。
compileOnSaveをtrueに指定すると、保存と同時にjsファイルにコンパイルしてくれます。gulpやgruntで自動コンパイルする場合は、falseにしてください。

```json:tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "declaration": false,
    "noImplicitAny": false,
    "removeComments": false,
    "noLib": false,
    "preserveConstEnums": true,
    "suppressImplicitAnyIndexErrors": true
  },
  "formatCodeOptions": {
    "indentSize": 4,
    "tabSize": 4,
    "newLineCharacter": "\r\n",
    "convertTabsToSpaces": true,
    "insertSpaceAfterCommaDelimiter": true,
    "insertSpaceAfterSemicolonInForStatements": true,
    "insertSpaceBeforeAndAfterBinaryOperators": true,
    "insertSpaceAfterKeywordsInControlFlowStatements": true,
    "insertSpaceAfterFunctionKeywordForAnonymousFunctions": true,
    "insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": false,
    "placeOpenBraceOnNewLineForFunctions": true,
    "placeOpenBraceOnNewLineForControlBlocks": true
  },
  "compileOnSave": true,
  "filesGlob": [
    "./**/*.ts",
    "!./node_modules/**/*.ts",
    "!./bower_components/**/*.ts",
    "!./typings/**/*.ts"
  ],
  "files": [
    "./test.ts"
  ]
}
```

## 構文チェック

### Linterをインストール
Linter
https://github.com/AtomLinter/Linter

ターミナルで以下のコマンドを入力

```sh
$ apm install linter
```

### tslintをインストール

tslint
https://github.com/palantir/tslint

ターミナルで以下のコマンドを入力

```sh
$ npm install -g tslint
$ apm install linter-tslint
```

### プロジェクトのルートにtslint.jsonファイルを作成
tslint.jsonにtypescriptを構文チェックする各種設定を記述します。


```json:tslint.json
{
  "rules": {
    "class-name": true,
    "curly": true,
    "eofline": false,
    "forin": true,
    "indent": [true, "spaces"],
    "label-position": true,
    "label-undefined": true,
    "max-line-length": [true, 140],
    "no-arg": true,
    "no-bitwise": true,
    "no-console": [true,
      "debug",
      "info",
      "time",
      "timeEnd",
      "trace"
    ],
    "no-construct": true,
    "no-debugger": true,
    "no-duplicate-key": true,
    "no-duplicate-variable": true,
    "no-empty": true,
    "no-eval": true,
    "no-string-literal": false,
    "no-switch-case-fall-through": true,
    "no-trailing-comma": true,
    "no-trailing-whitespace": true,
    "no-unused-expression": true,
    "no-unused-variable": true,
    "no-unreachable": true,
    "no-use-before-declare": true,
    "one-line": [true,
      "check-open-brace",
      "check-catch",
      "check-else",
      "check-whitespace"
    ],
    "quotemark": [true, "single"],
    "radix": false,
    "semicolon": true,
    "triple-equals": [true, "allow-null-check"],
    "variable-name": false,
    "whitespace": [true,
      "check-branch",
      "check-decl",
      "check-operator",
      "check-separator",
      "check-type"
    ]
  }
}
```
PhoneClean2 Pro


昨年 iPhone6 に機種変更してそれ以前に使用していた iPhone4S はアプリのテスト用兼 IC レコーダとして使用していました。ほぼ毎日Macに接続して iTunes で同期していましたが、先日この同期に失敗して30GB以上あった音楽データが無効なデータになってしまいました。こうなったとき本来は、コンテンツと設定を消去するなり工場出荷状態に復元するのですが、機種変更した後なのでSIMカードは入っているもののアクティベートできない可能性があり、おいそれとはできません。そこで、こういった不要データを削除するようなユーティリティソフトを探してみました。AppStore で探すとMacにインストールして使う「Wondershare TunesGo」というのが使えそうだったのですが、ダウンロードして動かして見ると、iPhoneを接続すると落ちてしまいました。
そこで、Web で検索をして今回購入した 「PhoneClean2」を見つけました。
早速ダウンロードしてインストールしてみました。
アプリを立ち上げるとiPhoenの接続を促す画面となり接続すると次のような初期画面になります。ここで、左端のクイッククリーンを最初に実行しましたが、これはどちらかというと一時ファイルで使われなくなったものを削除する程度のものでした。

![150709_PhoneClean_1.png](https://qiita-image-store.s3.amazonaws.com/0/60473/f36f0a86-696b-9ab5-59f7-6a2cb0a679a7.png "150709_PhoneClean_1.png")



次のディープクリーンはどうやら携帯を下取りしたりするときにデータを完全消去するためのメニューのようです。
そして３番目のツールボックスをクリックすると、なんとライセンスコード入力を要求されます。どうやらこの機能は有償のようです。でもどうやらこれが正解のようです。
そこで、購入手続きをして( ¥2,999) ライセンスキーを入力すると次の画面になります。

![150709_PhoneClean_2.png](https://qiita-image-store.s3.amazonaws.com/0/60473/7f9e26a2-dfb3-594f-66fe-e413b11aa7d4.png "150709_PhoneClean_2.png")



ここでメディアクリーンを選択すると、本来はここに音源ファイルが出て来るはずなのですが、何もないと言われてしまいます。
そこで、メディア修復を選択すると、しばらくiPhoneの中身をスキャンして次のような画面になります。


![150709_PhoneClean_3.png](https://qiita-image-store.s3.amazonaws.com/0/60473/7a3b12fc-2edd-3802-a5d3-f9700d038845.png "150709_PhoneClean_3.png")



音源のファイルらしきもののリストが表示されます。
これを全部選択して下の「修復」というボタンをクリックすると修復してくれそうです。
しかし、そのようにしても「しばらくお待ち下さい」で延々と待たされます。
そこで、これをストップして、１つだけ選択して「修復」してみました。
すると、なんかやっているみたいですが、やはり「しばらくお待ちください」状態がつづきます。仕方なくストップして一旦アプリを終了して立ち上げ直し、また上記の画面まで持ってくると確かにチェックしたファイルが無くなっています。
どうやらなんかしてくれているようですが、終わらないのはおかしい。
そこで１つ気づきました。
iPhone の設定消去をしたので、SIMがロックされています。そこで一旦iPhone をとりはず時再起動してSIMロックを解除しました。
その後接続すると、今度は選択したファイルを処理して、また再度iPhone をスキャンしてリストを更新してくれました。
複数のファイルを選択してもちゃんと動作します。
ただし、全部を選択しての一気通貫はやはりファイル数が多く時間がかかりそうなので、少し筒ヒマを見て続けましょう。

なんとかなりそうです。

この手のソフトウェアは直接iPhone のファイルシステムをいじくるためたぶんApple は推奨していないのでしょうがとても助かります。
ちなみに「ツールボックス」の画面で下の方には「システムクリーン」とか「アプリシュリンク」という項目がありますが、こちらは「脱獄必須」とあり「JailBreak」が前提のようです。
rsyslogを使ってsftpサーバの操作ログを出力する。

## About
sftpサーバのクライアントの操作履歴を出そうという試みです。

## Environment
Centos7
rsyslog 7.4.7
openssh

## doing
### rsyslog自体のログを出す
* rsyslog自体のログがデフォルトでは出ておらず、問題発生時に困ったので検証時はオンにしておくと良さそうです。

```/etc/rsyslog.conf
...
logger /var/log/messages
...
```

deprecateなオプションみたいですが、とりあえず出しておきます。

### sftpサーバの設定をする

```:/etc/ssh/sshd_config
# override default of no subsystems
Subsystem       sftp    internal-sftp -f local5 -l INFO

Match group sftp-user
        PasswordAuthentication yes
        X11Forwarding no
        AllowTcpForwarding no
        ChrootDirectory /home/%u/chroot/
```

### rsyslogで設定する

ログを出力させるために必要な設定は下記です。

```/etc/rsyslog.conf
$ModLoad imuxsock 

# sftp log
local5.*                                                /var/log/sftp.log

AddUnixListenSocket /home/test001/chroot/dev/log
```

最初の行でsocketの利用を有効化し最後の行でchroot配下のユーザがsocketにアクセスできるようにリンクを貼っています。リンクのもとは`/dev/log`のようです。

真ん中の行で受信するログのファシリティと送信先を指定しています。

これらの設定の後にsshとrsyslogを再起動してあげると、socketが作成されログ出力が可能になります。

### socketが作れる数に上限があるらしく、全てのユーザでログが取れない。

```/etc/rsyslog.d/user.conf
AddUnixListenSocket /home/test001/chroot/dev/log
AddUnixListenSocket /home/test002/chroot/dev/log
...
AddUnixListenSocket /home/test100/chroot/dev/log
```

というように指定したのですが、001-049までしかsocketが作られませんでした。調べるとrsyslogの7.4.7時点では50未満？が上限だったようです。

* [[rsyslog] Out of unix socket name descriptors, ignoring /srv/sftp-xxx/dev/log](http://lists.adiscon.net/pipermail/rsyslog/2013-June/032944.html)
* https://github.com/sematext/rsyslog/blob/master/plugins/imuxsock/imuxsock.c#L65

CHANGELOG見ると[7.5.4](https://github.com/rsyslog/rsyslog/blob/master/ChangeLog#L1133)から修正されているとのことだったので、バージョンアップで対応しました。

### バージョンアップ方法
* http://rpms.adiscon.com/v7-stable/rsyslog.repoを`/etc/yum.repo.d`にDLする
* yum updateする
Windows の Adobe Type Manager モジュールに特権昇格の脆弱性

これも例のイタリア企業への hacking で使われた 0-day 攻撃手法。ローカルでしか効かないので CVSS 値は低めだが，先の [Flash の脆弱性](http://qiita.com/spiegel-im-spiegel/items/a7eabf1a7d5218f16226) と併せて対処する必要がある。

## 脆弱性の内容

「[JVNVU#92689788: Windows の Adobe Type Manager モジュールに特権昇格の脆弱性](http://jvn.jp/vu/JVNVU92689788/)」より

> Microsoft Windows OS のカーネルモジュール Adobe Type Manager ( atmfd.dll ) は、OpenType フォントのサポートを提供するモジュールです。
> Adobe Type Manager にはメモリ破損の脆弱性が存在し、Windows OS カーネルメモリが操作される可能性があります。

> 本脆弱性を悪用した攻撃により、Windows システム上で SYSTEM 権限を取得される可能性があります。この攻撃では、OS やウェブブラウザが提供するサンドボックス機能や防御策を回避される可能性があります。

## 影響度

[Vulnerability Note VU#103336](http://www.kb.cert.org/vuls/id/103336) より

CVSS 基本値 6.8 (AV:L/AC:L/Au:S/C:C/I:C/A:C)

| 基本評価基準                            | 評価値            |
|----------------------------------------:|:------------------|
| 攻撃元区分（AV）                        | ローカル（L）     |
| 攻撃条件の複雑さ（AC）                  | 低（L）           |
| 攻撃前の認証要否（Au）                  | 単一認証（S）     |
| 情報漏えいの可能性（機密性への影響, C） | 全面的（C）       |
| 情報改ざんの可能性（完全性への影響, I） | 全面的（C）       |
| 業務停止の可能性（可用性への影響, A）   | 全面的（C）       |

CVSS については[デモページ](http://www.baldanders.info/spiegel/archive/cvss/cvss2.html)を参照のこと。

## 影響を受ける実装

- Windows XP から Windows 8.1 までの 32 ビット版および 64 ビット版 : [MS15-077](https://technet.microsoft.com/library/security/MS15-077) で修正済み

## 参考ページ

- [「Hacking Team」の漏えい事例：Open Typeフォントマネージャの脆弱性の検証 | トレンドマイクロ セキュリティブログ](http://blog.trendmicro.co.jp/archives/11866)
〔質問〕YouTube videoタグsrc属性がblob:https%3A//www.youtube.com/~とhttps://~.googlevideo.com/~の２パターンあるのですが。。。

Youtubeの同じ動画にアクセスしたとき、videoタグのsrc属性の値が現在調べて分かっている範囲で2パターンあります。
たとえば、
https://www.youtube.com/watch?v=7I4fvFmCb9M
にアクセスした場合、
blob:https%3A//www.youtube.com/e2bf7c47-56f9-44a8-b4f1-0aea8662c14a (最後のGUIDみたいな文字列部分はその都度変化する)
と
https://r5---sn-cpbavcx-ioq6.googlevideo.com/videoplayback?initcwndbps=2787500&mm=31&ipbits=0&mn=sn-cpbavcx-ioq6&id=o-AC7dSy4XvOEahID3CgmcYqhqWz3umLGQkOw4TvoE3ckr&mt=1436419847&dur=0.000&mv=m&ms=au&ip=110.233.169.28&lmt=1426855782137544&upn=VDk-YuU6S8M&expire=1436441554&sver=3&fexp=901816%2C9406148%2C9406174%2C9407133%2C9407610%2C9407888%2C9408142%2C9408420%2C9408710%2C9413138%2C9415436%2C9415955%2C9416126%2C9417116%2C9417340&key=yt5&source=youtube&mime=video%2Fwebm&pl=16&ratebypass=yes&requiressl=yes&signature=40F3B45700A8BA8A1994929503E9CDA35FC02211.6CF68E839D056331B4BBFCAB6C156FA9A58A3A09&itag=43&sparams=dur%2Cid%2Cinitcwndbps%2Cip%2Cipbits%2Citag%2Clmt%2Cmime%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cratebypass%2Crequiressl%2Csource%2Cupn%2Cexpire&cpn=-F5LnEpOScSM7gSv&ptk=matthiasmorr%252Buser&oid=LCw1BihhLvOLCG9XrfXCNQ&ptchn=un_F6xxJYJ5TErfgf4FPWA&pltype=content&c=WEB&cver=html5
の２つがあります。

このドメインが違うURLがどのようにして決められているのかがわからないところなのです。

これはすべての動画ではなく、一部の動画でのみ発生します。
Chromeでビルドの違いにより、この２パターンが発生します。
ChromeのWebVRビルド版でもたいていの動画が blob:https%3A//www.youtube.com/~ になります。
しかし、一部の動画においてはChromeの安定版からアクセスするとぼぼ100% blob:https%3A//www.youtube.com/~ になるのですが、ChromeのWebVRビルド版ではほぼ100% https://~.googlevideo.com/~ になるのです。

安定版とWebVRビルド版の違いとしては、WebVR実装あるなしの違い以外に、安定版が64bitでH.264サポートであるのに対して、WebVRビルド版が32bitでH.264非サポートというところです。(この違いがかかわっているとは考えられにくいのですが)


この、URLがどのようにして決まるのかご存知の方がいらっしゃったらご教授のほどよろしくお願い申し上げます。
SharedPreferenceに改行を含む文字列を保存する際の注意点

## 概要

有名なバグなのかはちょっと分からないのですが，あまり情報が出ていないようなので紹介．
今のところ 4.4.2 Kitkat で確認しています（そのほかのバージョンは調べてないです）

一応 [Issue](https://code.google.com/p/android/issues/detail?id=159799) にはなっていました

## 保存した文字列

<pre>
aaa
bbb
ccc

</pre>

文字数は 4 * 3 = 12．

**cccの最後に改行があるのがポイント** 
（Qiitaでは4行目が見えなくなっているけど…）

## 後からSharedPreferenceから取得した文字列

<pre>
aaa
bbb
ccc
    
</pre>

文字数は 4 * 3 = 12・・・のはずが，lengthを取ってみると16
文字を反転させると分かるけど， **4行目に半角スペースが4つ追加されている**

## 条件

* SharedPreferenceに文字列を記録する
* 文字列の最後に改行がある
* 文字列を追加した後， **一度プロセスを落として** SharedPreferenceから値を読み込む

一度プロセスを落とす必要があるのは，通常SharedPreferenceの読み書きはメモリ上で行われるため．プロセスを落とすことで，値が再度ファイルから読み込まれる．これが重要

## 記録させた後のSharedPreferenceのファイル

```xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="test">aaa
bbb
ccc
    </string>
</map>
```

**閉じタグが半角スペースでインデントされてる…**
WordPress Twenty Fifteen テーマに FaceBook Page Plugin を入れてみました

初心者のやり方ですが、参考になれば。

#1. FaceBook Page Plugin のコードを入手する。

こちらのサイトを参考にしました。
https://39life.net/fbpageplugin/

#2. 入手したコードをテーマに入れる。
content.php の 
entry-content のすぐ下、Author bio. の前です。
 
```php:content.php
		?>
	</div><!-- .entry-content -->


<!-- ここから -->

<div class="fb-page-plugin">
<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=v2.4&appId=xxxxxxxxxxxxxxxxxxx";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>


<div class="fb-page" data-href="https://www.facebook.com/facebook" data-width="500" data-small-header="false" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="false" data-show-posts="true"><div class="fb-xfbml-parse-ignore"><blockquote cite="https://www.facebook.com/facebook"><a href="https://www.facebook.com/facebook">Facebook</a></blockquote></div>
</div>

<!-- ここまで -->


	<?php
		// Author bio.
		if ( is_single() && get_the_author_meta( 'description' ) ) :
			get_template_part( 'author-bio' );
		endif;
	?>

```

xxxxxxxx のところは、私のユニークな番号かもしれないと思って伏字にしてあります。

さらに style.css の最後に　真ん中合わせを指定する内容を追加します。

```css:style.css

.fb-page-plugin{
	text-align: center;
	margin: 20px 0;
}
```

そうすると、こういう表示になりました。

![スクリーンショット 2015-07-09 15.54.29.png](https://qiita-image-store.s3.amazonaws.com/0/83787/4e869e61-7ac4-9cdd-3cbc-0f7f86baa70b.png)
【Unity】VRブランコを作って、本物のブランコに乗って遊んでみたけど、ただ気持ち悪くなっただけだった件

#<i class="fa fa-book" style="font-size:1em;"></i> 体が浮遊した感覚が味わえると聞いたので

本物のブランコに乗り、足が宙ぶらりんの状態で、HMDを装着してVRブランコを体験すると体が浮遊した感覚が味わえると耳にしたので、UnityでVRブランコを作って公園で遊んでみました。


#<i class="fa fa-book" style="font-size:1em;"></i> さくっと作ってみた

さて、どう作ろうかなと。
脳みそをフルパワー回転させて5秒ぐらい考えた結果、やっぱり**ブランコの原理は振り子運動**じゃないかと結論が出たので、

はい、振り子を作りました。振り子作って終わりです。


「Sphere」を2つ作成します。

片方を振り子の支点となるようにします。

「Hinge Joint」と「Rigidbody」を追加して、設定を以下の通りにします。

![tama04.png](https://qiita-image-store.s3.amazonaws.com/0/67591/d8025b0f-7aed-c8f6-601f-4a6742f56223.png)

支点の中心（Anchor）をSphereのど真ん中にくるようにしました。

もう一方のSphereにも「Hinge Joint」と「Rigidbody」を追加して、設定を以下の通りにします。

![tama05.png](https://qiita-image-store.s3.amazonaws.com/0/67591/d6912fda-7541-aaaa-f824-07ce689bdb26.png)

こっちは「Use Gravity」にチェックをいれて、Freeze Rotationもチェックいれます（自転しないようにする為）。
更に「Hinge Joint」で支点の方のSphereを選択して2つの玉を繋ぎます。


#<i class="fa fa-book" style="font-size:1em;"></i> 動かすと


![65e5615a-4585-4758-8181-4b6ac578ed0c-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/67591/ec35f34b-42e6-05da-aedf-ea141499881b.gif)

こんな感じでぶらんぶらんと。GIFアニメだと動きがアレですが、当然ながら本当はもっとヌルヌル動きます。
この振り子だけパッケージとしてGithubに置いときます。
↓
https://github.com/king-panda/huriko


#<i class="fa fa-book" style="font-size:1em;"></i> もろもろ追加して

カメラの調整やゼンリンさんの街のアセット追加したり、GUIを追加したり、もろもろ弄って最終的にはこういう形で。
Cardboardで観れるように

![tama06.png](https://qiita-image-store.s3.amazonaws.com/0/67591/08d31e9f-96a4-8a18-c35f-3f683c354c3d.png)

動画もありますよっと
↓
https://www.youtube.com/watch?v=YzqA-W4L9T0&feature=youtu.be
Parseで開発環境、ステージング環境、本番環境を分ける



##開発環境から別環境を複製する
ここでは開発環境用のアプリはすでにあるものとして、そこからステージング環境、本番環境用のアプリを複製します。

Parseの管理画面でSettingsタブを選択します。

Clone Appという欄があるので、そこに新しアプリ名を入れて"Clone This App"を押すと選択中の既存アプリのデータを引き継いだ新アプリを作成することができます。

![parse_settings.png](https://qiita-image-store.s3.amazonaws.com/0/38423/0e16aee4-a165-fba4-9435-5a5685eb7cc0.png)


deployするときにアプリ名を指定すれば一つのプロジェクトで複数のParse環境を扱えるようになります。


```parse deploy [アプリ名]```



##デフォルトアプリの設定

アプリ名を指定しないときのデフォルトアプリは以下のコマンドで設定できます。

```//defaultアプリを設定
$ parse default app_dev
Default app set to app_dev.
//defaultアプリを確認
$ parse default
Current default app is app_dev
```


##エイリアスの設定

以下のコマンドでエイリアスを設定することも可能です。

```
$ parse add dev
Email: example@gmail.com
Password(will be hidden):
1:app_dev
2:app_stg
Select an App: 1
```
AndroidプロジェクトのKotlin化

# 前置き

ただのメモ。
基本は、[Kotlin](http://kotlinlang.org/docs/reference/using-gradle.html) のサイトの通り

# Android Studio pluginをinstall

Android Studio > Preferences > Plugins > Browse Repository

![browse_repository.png](https://qiita-image-store.s3.amazonaws.com/0/15000/c9e80a20-0fa0-e2af-67d3-faffeaae82a0.png)

下記２つをinstall

- Kotlin
- Kotlin Extensions for Android

![kotlin_install.png](https://qiita-image-store.s3.amazonaws.com/0/15000/546a0728-b97d-b3e8-0283-ba181633a675.png)

Android Studioは一度リスタートする

# build.gradleの編集

buildscriptにclasspathの追加

```groovy:build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:0.12.613'
    }
}
```

pluginを適用

```groovy:build.gradle
apply plugin: 'kotlin-android'
```

runtimeを追加

```groovy:build.gradle
dependencies {
  compile 'org.jetbrains.kotlin:kotlin-stdlib:0.12.613'
}
```
# .java => .kt ファイルへの変換

- 対象のファイルを選ぶ
- `Cmd + Shift + A` を押してクイックアクションを起動
- convert files to kotlin と入力.
- Enterでconvertできる

![input_kotlin.png](https://qiita-image-store.s3.amazonaws.com/0/15000/8ce243dc-9d41-0c3a-4e35-5dac9fc33c93.png)

# build

`./gradlew assembleDebug` してみてビルドできれば成功。

途中で下記のような `compileDebugKotlin` ってタスクが挟まるっているはず。

```
:app:compileDebugKotlin UP-TO-DATE
```
mongoDB Open Close を繰り返すとどうなるか確認した

mongoDB の C ドライバを使ったプログラムでループしながらデータを登録するとき、接続切断を繰り返すと、パフォーマンスにどう影響するかを確認した。


##設定

指定サイズのドキュメントを、Bulk 無しで Insert する。

テストパターン

    A) mongo_open、mongo_get_collection を毎回コールする。(同、close 処理)
    B) mongo_open、mongo_get_collectioin を最初に 1 回だけコールする。
    C) mongo_open は最初に 1 回だけコール、mongo_get_collection は毎回コールする。


##処理時間測定結果 (sec)

(ドキュメントサイズ 48 bytes の時)

|ケース/登録件数|10,000|25,000|50,000|250,000|
|:-:|:-:|:-:|:-:|:-:|
|A|3|7|68|423|
|B|0|2|4|18|
|C|1|2|3|18|



(ドキュメントサイズ 1,008 bytes の時)

|ケース/登録件数|10,000|25,000|50,000|250,000|
|:-:|:-:|:-:|:-:|:-:|
|A|3|7|63|435|
|B|0|3|4|23|
|C|1|2|5|24|


##気付き

- 毎回の open/close (テストケースA) とそれ以外 (テストケースB,C) とでは
   相当の処理時間差がみられるが、1 回のみの open (テストケースB) と
   コレクション情報は毎回取得するケース (テストケースC) では有意差は
   みられない。
        
        
- テストケースA の場合、netstat 情報で TIME_WAIT のコネクションが相当数
   残ってしまっている。
   (今回は、28,000 ほどのセッションがこのステータスで残っていました。)
   CLOSE し終わっていない為、リソースは保持されたままになってしまうので、
   毎回の処理は避けた方がいいのではないか。
        
        
- データがドロップしている理由については調査中。
   (常に決まった件数近辺でドロップしているようなので、リソースの設定
    などが関連しているものと思われる。)
   **-> 後の確認で、ソケットが作成できなかったことが原因でした。（ポートがいっぱいいっぱいで、接続ができていないタイミングがあった。）**
会計年度を算出するTIPS


業務アプリケーションを製作していると、結構な頻度で需要があるので書き慣れているのですが、うっかりミスもよくやってしまうので、メモ。

##前提条件##
以下のようにテーブル(company)で決算月を永続化している。
会社ID: 1 は 決算月が３月であるという意味です。

| company_id | closing_month |
|:-----------|:--------------|
| 1          |             3 |


##SQLで算出する##

以下のSQLで現在時点での、会計年度が求められる。
基本的には、年月日から決算月を引けばいいが、12月決算の場合は引いてはいけない。12の剰余を割り出せば望みの結果が得られる。

```sql
SELECT 
	`company_id`
	, `closing_month` 
	, YEAR(ADDDATE(NOW(), INTERVAL -1 * (`closing_month` % 12) MONTH)) as `fiscal_year`
FROM company
```

##PHPで算出する##

同様に、基準日から決算月を引き、「年」を取り出すことで算出できる。

```php
/**
 * 会計年度を取得する
 * @param $closingMonth 決算月
 * @param $date 基準日 YYYY-MM-DD
 * @return 会計年度 YYYY
 */
function getFiscalYear($closingMonth, $date = 'now')
{
	$objDate = new DateTime($date);
	$interval = sprintf('P%dM', fmod($closingMonth, 12));
	$objDate->sub(new DateInterval($interval));
	return $objDate->format('Y');
}
```
MP4動画をWMVへの変換方法

ウィンドウズムービーメーカーでMP4動画を編集したり、ホームページでシェアしたりしようとするならMP4をWMVに変換することをおすすめします。
WMVは汎用性の極めて高い形式でウィンドウズメディアプレイヤー、ウィンドウズムービーメーカー、ウィンドウズスマホ 8、Xbox One、ZENなどで幅広くサポートされています。MP4をWMVに変換することを通して変換後のWMV動画をウィンドウズムービーメーカーでサクサク編集できます。
「FonePaw スーパーメディア変換」はMP4-WMV変換専用のスーパーコンバーターとして、MP4/MPEG-4形式の動画をWMVに瞬速変換できます。それに加えてこの動画変換ソフトは複数の動画を一括変換することが可能です。何より、高度なオプション編集機能でビットレート、フレームレート、コーデック、チャンネルなど、各種のパラメータを自由に調整することで使い道に応じて動画をもっと活かせます。
「<a href="http://www.fonepaw.jp/video-converter/"target="_blank">FonePaw スーパーメディア変換</a>」無料試用版をパソコンにダウンロードして変換をスタートしましょう。 :laughing: 

1.ソフトを実行しMP4ファイルを追加
ソフトをパソコンにインストールしてから実行。「ファイルを追加」をクリックしMP4動画ファイルをインポート。インポート完了後、右サイドのモニターで動画ファイルをプレビュー可能。
![fonepaw-video-converter-main.png](https://qiita-image-store.s3.amazonaws.com/0/85758/bf84d4d6-6b03-1759-1441-ffcfefd68a44.png)
2.プロフィール変更、出力形式を3GPに
プロフィールのドロップダウンボタンをクリックし、検索ボックスで「3GP」を入力しWMV形式を選択。MP4ファイルをほかのポータブルデバイス用に変換したい場合、お手持ちのデバイスのカテゴリで任意の形式を選択してもいいです。
![all-profiles.png](https://qiita-image-store.s3.amazonaws.com/0/85758/4af35c09-f106-cf35-8c33-c8aef35c2305.png)
3.出力先を選択
「参照」をクリックしてローカルフォルダから3GPの保存場所を選択。

4.MP4からWMVに変換
「変換」をクリックしてMP4から3GPへの変換を開始させます。進捗バーで変換の残り時間と進捗が見えます。変換後にコンピュータを自動的シャットダウンするようにしてもOK。
![completed-video-conversion.png](https://qiita-image-store.s3.amazonaws.com/0/85758/8ba2ee55-29cf-37d3-bb23-a0852a933840.png)
ついに完成！<a href="http://www.fonepaw.jp/tutorials/convert-wmv-to-mp4.html"target="_blank">WMVからMP4への変換</a>ばかりではなく、「FonePaw スーパーメディア変換」を使用しては多種多様な動画形式を今最も流行っている形式に変換することができます。一番機能豊富な動画変換ソフトではないかもしれませんが、文句を言わずに変換作業を簡単で素早く完成させるようにするソフトではあります。
ROS tutorial まとめ3 rosparamとroslaunch

#まとめ3#
##パラメータとは##
パラメータサーバというところに格納されたデータのこと。
データベースのようなもの。

##rosparam##
- rosparam list
パラメータサーバにあるパラメータの表示。

- rosparam get
パラメータの値を取得。

    **使い方**

    ```bash
    $ rosparam get [param_name]
    ```

    すべてのパラメータの値を見るには、

    ```bash
    $ rosparam get /
    ```

- rosparam set
パラメータの値を変更。

    **使い方**

    ```bash
    $ rosparam set [param_name] [変更後の値]
    ```


- rosparam dump
ファイルへの書き込み。

    **使い方**

    ```bash
    $ rosparam dump [file_name]
    ```



##roslaunch##
一度に複数のノードを起動することができる。
launchファイルで起動するノードを記述しておく。

**使い方**

```bash
$ roslaunch [package] [filename.launch]
```

まず、パッケージまで移動(ここでは、beginner_tutorials)。

```bash
$ roscd beginner_tutorials
```

launchディレクトリを作成。

```bash
$ mkdir launch
$ cd launch
```

launchファイルを作成。

```turtlemimic.launch
<launch>

  <group ns="turtlesim1">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>

  <group ns="turtlesim2">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>
        
  <node pkg="turtlesim" name="mimic" type="mimic">
    <remap from="input" to="turtlesim1/turtle1"/>
    <remap from="output" to="turtlesim2/turtle1"/>
  </node>

</launch>
```

roslaunchする。

```bash
$ roslaunch beginner_tutorials turtlemimic.launch
```

```bash
$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
```

亀のウィンドウが2つ表示され、turtle1に送った指示がturtle2にも反映される。
ファイルの中身を読むpythonスクリプトのテンプレ

```python:readLine
import sys 
import os.path

argvs = sys.argv #引数リスト
argc = len(argvs)

if (argc != 2):
    print 'args must to be 2' 
    quit()

if not (os.path.isfile(argvs[1])):
    print 'no such file: ' + argvs[1]
    quit()

f = open(argvs[1])

for line1 in f:
    # 処理
f.close()
MySQLのint(11)って何？

MySQLのint(11)はサイズを指定できるわけではなく、0を補完するためのオプション
[mysql]mysqlのint(11)のカッコ内の数値の意味 http://dbinfo.sakura.ne.jp/?contents_id=102

intのサイズは4バイトで`-2147483647`〜`2147483647`までしか指定出来ません。
サイズは以下のサイトが覚えやすい。インドと中国の人口(25億人)が登録するとサービスが落ちますw
[MySQL]INT型の最大値(IntegerのMAX値2147483647)を覚える方法 · DQNEO起業日記 http://dqn.sakusakutto.jp/2010/05/mysqlintintegermax2147483647.html

ちなみにこれ以上のサイズの数値を指定したい場合は、bigint型を使います。
UnixTimestampは11桁以上になるので、bigint型なら保存できます。
全文検索できるファイルサーバとしてのAlfresco

ファイルサーバやSubversionで大量のドキュメントを管理していると、「昔見たあのファイルどこにあったっけ？」「探している資料がすぐ見つからない・・・」ということが起きがちです。

気の利いた解決法はないか探す中でAlfrescoというものを知りました。
使いだすと超便利で、普通のファイルサーバには戻れなくなります。

## Alfrescoとは？

- ファイル内全文検索 タグ/コメント プレビュー 履歴管理 ワークフロー機能等のあるファイル共有サーバ
    - 正確には、エンタープライズのコンテンツ管理プラットフォームとのこと
- 内部的には、Tomcat + Apache Solr + LibreOffice + DB(PostgreSQL/MySQL）＋αという感じ
- 英国のAlfresco社が開発していて、OSSのCommunity版（LGPL v3）と商用のEnterprise版がある

機能の概要は、公式サイトよりもaegifさんのこの資料がわかりやすいです
・「0からわかるAlfresco」http://www.slideshare.net/MoritakaSoma/alfresco20150422

## インストール
Linux/Mac/Windows版ともインストーラがあり簡単に導入可能でした

- https://wiki.alfresco.com/wiki/Community_file_list_5.0.d


## ActiveDirectoryとの認証連携
こちらを参照しました

- http://aegif-labo.blogspot.jp/2012/02/alfrescoldap.html
- http://aegif-labo.blogspot.jp/2014/12/alfresco-50active-directoryntlm-sso.html

はまりポイントとしては、CIFSでのアクセスでは上記のLDAP認証が適用されない点。
(CIFS経由のアクセスの場合にはAlfresco上のユーザーアカウント・パスワードを利用したローカル認証となるよう)

## その他

- Web画面以外に、WebDav, FTP, CIFS, REST API, CMIS経由のファイルアクセスが可能
- 未検証ですが、クラウド上とオンプレ上の環境の同期機能があるそう。iPhone/Androidアプリもあり


## 使ってみた感想
- 良い点
    - ファイル内全文検索・タグ付けでファイルが非常に探しやすい
    - ドキュメントの参照/更新履歴が可視化されてチームコラボレーションしやすくなる
- 気になる点
    - OSS版をカスタマイズしたり大規模で利用する場合には、自力でごりごり頑張る必要がある
    

RailsやJavaのWebアプリケーションのバックエンドに配置して、ファイル管理・ワークフローサービスとして利用してみるのも面白そうな感じ。
Gradle 2.5の新機能を試す - Continuous build

2015/07/8にGradle Version 2.5がリリースされました。
今回のリリースではいくつかの新機能が追加されているようなので、さっそく試してみます。
本記事ではContinuous buildについてです。

# Continuous build
この機能はファイルの変更を監視してタスクの再実行をしてくれるというもので、RubyのGuardのようなものです。
内部的にはWatchServiceというAPIを使用しているようです。そのため、Java 7以降の環境でないとこの機能を使うことができません。
また、ビルドスクリプトの変更にも対応していないという制限もあります。

# 実行方法
Continuous buildを実行したい場合、`-t`または`--continuous`オプションを付けます。
オプションを付けて実行すると、指定したタスクが一度実行され、その後変更監視状態になります。
終了したい場合には最後のメッセージにあるようにctrl-dで抜けることができます。

```
$ gradle -t build
Continuous build is an incubating feature.
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build UP-TO-DATE

BUILD SUCCESSFUL

Total time: 4.213 secs

Waiting for changes to input files of tasks... (ctrl-d then enter to exit)
```

その後監視対象のファイルに変更があった場合には以下のようにタスクが再実行されます。

```
Change detected, executing build...

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

Total time: 1.925 secs

Waiting for changes to input files of tasks... (ctrl-d then enter to exit)
```

# 再実行の条件

再実行の条件は各タスクで指定されている入力ファイルとタスクの依存関係によって決まっています。

各タスクで指定されている入力ファイルというのは、タスク定義のinputsプロパティで指定されたものを指します。
そのため、独自に定義したタスクでもContinuous buildを使いたい場合にはinputsプロパティを適切に指定する必要があります。

さらにタスクの依存関係によって、指定したタスクが依存しているタスクの入力ファイルも監視対象になります。

例えば典型的なJavaのプロジェクトの場合、`build`タスクを指定しているとmainとtestに含まれるファイルの変更によって再実行されますが、
`compileJava`タスクを指定している場合には、`src/main/java`以下のファイルの変更のみによって再実行され、`src/main/resources`や`src/test/java`以下のファイルの変更では再実行されません。

# 今後

今回リリースされた機能はあくまでも初期リリースだと言っており、今後のリリースでさらなる機能拡張がされるようです。

# 参考

- [Gradle 2.5 Release Notes](https://docs.gradle.org/current/release-notes#continuous-build)
- [Chapter 19. Continuous build](https://docs.gradle.org/current/userguide/continuous_build.html)
- [WatchService (Java Platform SE 7 )](http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html)
- [Chapter 14. More about Tasks](https://docs.gradle.org/current/userguide/more_about_tasks.html#incrementalTask)
td-agentのtype forwardを使うときはUDPポートもあける

TCPしかあけていないと少しするとエラーでログ送信が止まってしまいます。
（最初問題なく動くのでよしできた！となって安心していたらいつのまにか止まっていたので少しはまりました...）


![EC2_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/33013/85c4da63-aa64-85d3-18c2-89245a4093c5.png)
（参考画像：AWSのセキュリティグループの設定）




どうやらUDPでハートビートしているらしいです。

ちなみにUDPポートをあけていない状態だと下記のエラーでとまっていました。

```
[warn]: failed to flush the buffer. error_class="RuntimeError" error="no nodes are available"
```