OmniAICreator/Qiita-1.07M huggingface dataset:
jqコマンドでGeoJSONから特定のプロパティを削除する


GeoJSONを生成してから「あのプロパティいらんかったなー。あれだけ削除したいなー」ってときに使う。


```bash
cat example.geojson | jq "del(.features[].properties.＜消したいkey＞)" > example2.geojson 
```

### サンプル

下記GeoJSONデータからnameを削除する

```json:input
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          0,
          0
        ]
      },
      "properties": {
        "label": "hoge",
        "name": "hoge", //これ削除したい
        "address": "tokyo"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          10,
          10
        ]
      },
      "properties": {
        "label": "test",
        "name": "test", //これ削除したい
        "address": "takasaki"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          20,
          20
        ]
      },
      "properties": {
        "label": "foo",
        "name": "foo", //これ削除したい
        "address": "tokyo"
      }
    }
  ]
}

```

jqを使ってnameプロパティを削除する

```bash
cat input.geojson | jq "del(.features[].properties.name)" > output.geojson
```

実行結果

```json:output
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          0,
          0
        ]
      },
      "properties": {
        "label": "hoge",
        "address": "tokyo"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          10,
          10
        ]
      },
      "properties": {
        "label": "test",
        "address": "takasaki"
      }
    },
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          20,
          20
        ]
      },
      "properties": {
        "label": "foo",
        "address": "tokyo"
      }
    }
  ]
}

```
SpringコンテナにSeasar2のコンポーネントを移すメモ

前回の、[CDIコンテナにSeasar2のコンポーネントを移す (その２)](http://qiita.com/hirokapi/items/c8c105015bb2a7a69e1f)に書いた記事のSpring Frameworkバージョンです。

## S2コンテナの中身を Springコンテナに移す処理のサンプル

```java:
public class Fuga {

    public static void main(String[] args) {
        GenericXmlApplicationContext springContext = null;
        DefaultListableBeanFactory springFactory = null;
        BeanFactoryLocator beanFactoryLocactor = ContextSingletonBeanFactoryLocator.getInstance();
        BeanFactoryReference ref = beanFactoryLocactor.useBeanFactory("baseContext");
        springContext = (GenericXmlApplicationContext) ref.getFactory();
        springFactory = springContext.getDefaultListableBeanFactory();

        for (ComponentDef def : getComponentDefs()) {
            Class<?> clazz = def.getComponentClass();
            String name = def.getComponentName();
            String className = clazz.getSimpleName().substring(0, 1).toLowerCase().concat(str.substring(1));
            if (StringUtil.isEmpty(name)) {
                name = className;
            }
            if (InstanceDef.SINGLETON_NAME.equals(def.getInstanceDef().getName())
                    || InstanceDef.APPLICATION_NAME.equals(def.getInstanceDef().getName())) {
                if (!springFactory.containsBean(name)) {
                    springFactory.registerSingleton(name, def.getComponent());
                }
                springFactory.registerAlias(name, className);
            } else {
                GenericBeanDefinition springDefinition = new GenericBeanDefinition();
                springDefinition.setBeanClass(clazz);
                springDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE);
                springFactory.registerBeanDefinition(name, springDefinition);
            }
        }
    }

    private static List<ComponentDef> getComponentDefs() {
        S2Container container = S2ContainerFactory.create();
        container.init();
        List<ComponentDef> componentDefList = new ArrayList<ComponentDef>();
        componentDefList.addAll(getComponentDefs(container));
        return componentDefList;
    }

    private static Set<ComponentDef> getComponentDefs(S2Container container) {
        Set<ComponentDef> componentDefSet = new LinkedHashSet<ComponentDef>();
        for (int i = 0; i < container.getComponentDefSize(); i++) {
            ComponentDef componentDef = container.getComponentDef(i);
            componentDefSet.add(componentDef);
        }
        for (int i = 0; i < container.getChildSize(); i++) {
            S2Container child = container.getChild(i);
            componentDefSet.addAll(getComponentDefs(child));
        }
        return componentDefSet;
    }
}
```
FlashDevelopをmacで使う

[Haxe](http://haxe.org/)のエディタとしては[FlashDevelop](http://www.flashdevelop.org/)がかなり良いような気がするが、windows専用なので、ふつうmacでは使えない。

[CrossOver](https://www.codeweavers.com/products/crossover-mac/)という有料のアプリを使うと、Windowsのアプリがmac上で使える。ParallelsやFusionより安いし、いちいちWindowsを立ち上げなくてすむし、Windowsを買わなくてすむ。かなりいいのでは。

#インストール方法
ここのムービー通りにやったら無事インストールできた。FlashDevelopだけでなく、macとの連携のためにFlashDevelopBridgeというアプリもインストールする。
https://www.youtube.com/watch?v=lZOfBnmetVs

#はまった点
* 上記の映像では検索ボックスからFlashDevelopを検索してインストールしているが、FlashDevelopが最新じゃないし、なぜかbridgeがうまく動かんかった。公式サイトからexeをダウンロードしてきて、「インストーラーを選択する」からインストールしたら動いた。

* コードヒント・コード補間の動作がおかしかった。CrossOverの設定でX Window Systemというのを有効にしたら、うまくいくようになったが、日本語入力ができなくなった。（→日本語入力あきらめた。。）

* TestProjectするとmacのブラウザでlocalhost開いてくれるけど、多分、動作しない。なので、自分でlocalhostをたてて確認するようにしてみた。
CentOS7へmDNS導入の３分クッキング

#手順
1. nss-mdnsを導入
2. お好みのhostnameがあればそれに変更する
3. ファイアーウォールを調整する
4. 再起動する（面倒な手動再ロードをスキップするため）

#解説
1. nss-mdnsを導入  
`sudo yum install epel-release`  
`sudo yum install nss-mdns`
2. お好みのhostnameがあればそれに変更する。例としてjenkins.localに変更`sudo vi /etc/hostname`
3. ファイアーウォールを調整する。ここでは例として設定が面倒なので停止`sudo systemctl stop firewalld.service`
4. 再起動する`sudo reboot`

#やったね
これで`ping jenkins.local`でpongしてくれます
引数省略時の値を引数と同名のメソッドで設定していると Ruby 2.2 で動かなくなる場合がある


結論から言うと。

- 仮引数を `foo = foo` のように記述した場合の挙動が Ruby 2.2 で変わった (修正された)
- `foo = foo()` または `foo = self.foo` にすれば 2.1 と同じ挙動になる
- 実行中 `warning: circular argument reference` という警告メッセージが出たら、たぶんまともに動かないので注意
- Rails 4.1.2 未満は Ruby 2.2 に対応していない

# 経緯

Rails 3 のアプリケーションを Ruby 2.2.0 でテストしたら、謎の例外が起きた。

```bash
Failure/Error: Unable to find matching line from backtrace
     TypeError:
       wrong argument type nil (expected Symbol)
```

例外が起きる前に下記のような警告が表示されている。

```bash
.../lib/active_record/associations/has_many_association.rb:79: warning: circular argument reference - reflection
```

該当箇所の [Rails 3.2.21 のコード](https://github.com/rails/rails/blob/v3.2.21/activerecord/lib/active_record/associations/has_many_association.rb)をみるとこんな感じ。

```ruby
def inverse_updates_counter_cache?(reflection = reflection)
  ...
end
```

[Rails 4.2.0 だと](https://github.com/rails/rails/blob/v4.2.0/activerecord/lib/active_record/associations/has_many_association.rb)こうなってる。

```ruby
def inverse_updates_counter_cache?(reflection = reflection())
  ...
end
```

debugger でみてみると、Rails 3.2.21 の書き方では reflection は nil になってしまっている (reflection メソッドは `attr_reader :reflection` で定義されており、`@reflection` にはオブジェクトがある)。

どうも、引数省略時の値を仮引数と同名のメソッドで設定しようとしている場合に、メソッドを呼び出すのではなく、ローカル変数を参照するように変わったらしい。それで、`reflection()` と明示的にメソッド呼び出しの書式にすることで、問題を回避しているものと思われる。

[blame](https://github.com/rails/rails/blame/v4.2.0/activerecord/lib/active_record/associations/has_many_association.rb) を見てみると、次のコミットで修正されたようだ。

- [make tests pass on Ruby 2.2 · e88da37 · rails/rails](https://github.com/rails/rails/commit/e88da370f190cabd1e9750c5b3531735950ab415)

ここから、bugs.ruby-lang.org を参照しているので見てみる。

- [Bug #9593: Keyword arguments default argument assignment behaviour not consistent with optional argument - ruby-trunk - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/9593)


元の挙動は bug であるとされている。確かに例に挙げられているとおり、通常は `foo = foo` としたら右辺はローカル変数の参照になるので納得できる。

> Yes. It was a bug.
> An assignment creates a variable and it hides same name method in its RHS, as you can't call foo method inside bar method:
>
>     def foo; 'foo'; end
>
>     def bar
>       foo = foo # nil
>     end
> https://bugs.ruby-lang.org/issues/9593#note-5

また、同じコメントで、`()` を後置することで、メソッド呼び出しであることを明示する方法が紹介されている。

> Always you can call the method explicitly with ().
> https://bugs.ruby-lang.org/issues/9593#note-5

文法上メソッド呼び出しであることが明示されればよいので、`self.reflection` のように `self.` を前置してもよい。

あとで気付いたが、[2.2.0 リリース時の NEWS](https://github.com/ruby/ruby/blob/v2_2_0/NEWS) でも言及されていた。
VirtualBox上のUbuntuでNAT+ホストオンリーネットワーク構成にするメモ

さいきんUbuntu Server 14.04LTS環境をVirtualBox上に作りました。このような仮想環境上のLinuxのネットワーク設定は仮想NICを2個使ってNATアダプタ+ホストオンリーアダプタで運用するのが最適解だと思います。以下なども参照のこと。

- [VirtualBox 2.2 と CentOS 5.3 でローカル開発環境 - もやし日記](http://web.archive.org/web/20141230205030/http://d.hatena.ne.jp:80/p4life/20090413/1239624784)

しかしUbuntuの場合(?)は勝手にeth1を有効にしてくれないので、設定変更しないとホストオンリーネットワークが使えません。そこで`/etc/network/interfaces`末尾に次のように設定します。

```
auto eth1
iface eth1 inet static
address 192.168.56.99
netmask 255.255.255.0
```

VirtualBoxのホストオンリーアダプタの初期設定では192.168.56.2から192.168.56.99が固定IPで割り当てて良い場所になっているので、その範囲で好きなIPアドレスに設定すると良いでしょう。


上記設定をして再起動すればホストマシンから特定のVMにsshできる環境の完成です。
C言語(C11)で`main`の定義方法は何が一番正しいのか？


__【注意】下記はC言語での話であって、C++言語の話ではありません。混同しないように！__

## 仕様書を確認する

C11仕様書最終ドラフト[n1570](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)には

```c
int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }
```
  
の二つだけしか書いていません。また、`char *argv[]`の部分は`char **argv`としてもよいと備考に書かれています。なお、`argc`と`argv`は別の名前でもかまいません。ただし、これ以外を禁止しているのでは無く、実装定義の方法でもよいと書いてあります。

では、どうすべきでしょうか？OSやコンパイラによっていちいち`main`の書き方を変えるのは、移植性を低くし、不具合の温床とのなります。よって、上の三種類以外は使用すべきではありません。上の三つが正常に動作しないようなコンパイラは消費期限が切れてますので __捨てて下さい__ 。

### 結論
`main`を定義するときは`int main(void) {}`、`int main(int argc, char *argv[]) {}`、`int main(int argc, char **argv) {}`を使いなさい。

__完__

## ちゃんと確認する

これで終わってしまっては駄目なので、巷の噂にある物を確認してみます。コンパイルは`clang -Wall -std=c11 ${name}.c -o ${name}`でしてみました。

```
$ clang --version
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix
```

### 検証1 戻り値の型を省略すると`int`になるので、書かなくてもよい。

省略できるなら、書かなくてもいいよね？

```none_main_void.c
main(void)
{
	return 0;
}
```

```
$ clang -Wall -std=c11 none_main_void.c -o none_main_void
none_main_void.c:1:1: warning: type specifier missing, defaults to 'int'
      [-Wimplicit-int]
main(void)
^~~~
1 warning generated.
```

暗黙の`int`が使われますという警告が表示されますが、一応はコンパイルできました。これはC言語の古い書き方の互換性のために残されている文法です。将来廃止される可能性があり、使うべきではありません。


### 検証2 戻り値の型は`void`でもよい。

ふるーいC言語入門によくある書き方です。

```void_main_void.c
void main(void)
{
	return;
}
```

```
$ clang -Wall -std=c11 void_main_void.c -o void_main_void
void_main_void.c:1:1: error: 'main' must return 'int'
void main(void)
^~~~
int
1 error generated.
```

戻り値の型が`int`じゃないとエラーになってコンパイルに失敗しました。`void`でもよい実装のコンパイラなら通るかもしれませんが、実装依存になってしまいますので、使わないようにしましょう。

### 検証3 `()`とすると`(...)`と解釈される。

そもそも`(...)`って何でしょうか？可変長パラメーターの事だとすると`va_start`の第2パラメーターはどうするでしょうかね？

```int_main_empty.c
int main()
{
	return 0;
}
```

```
$ clang -Wall -std=c11 int_main_empty.c -o int_main_empty
```

エラーも何も無しでコンパイルできました。`int main(void) {}`と逆アセンブリして比較すると全く同じになっています(`int main(int argc, char *argv[])`は異なります)。あれ、結局、C++と一緒で`int main() {}`でいいんじゃ無いのか？

いえいえ、そうでありません。C++言語では`(void)`と同じですが、C言語の`()`はまた別の意味になります。次のコードを見て下さい。

```emp_para.c
int a();

int main(void)
{
	a();
	a(1);
	a(1, 2);
	return 0;
}

int a()
{
	return 0;
}
```

`a()`関数にパラメーターを色々渡していますが、エラーになりません。もし`int a(void)`としていた場合は、`a(1)`のところでエラーになってしまいます。つまり、`()`はどんな引数でもかまわないという意味になります。なお、`va_start`の第2パラメーターに指定する変数が無いので、0個以上の可変長引数としては使えません。そもそも可変長引数は`, ...`という表記を最後に付けるという定義なので`(...)`というものはありません。

なお、仕様書には空の`()`は廃止予定と記載されていますので、使うべきではありません。

### 検証4 環境変数が入った第3のパラメーターがあるらしい。

第3の男、現る。

```int_main_envp.c
int main(int argc, char *argv[], char *envp[])
{
	return 0;
}
```

```
$ clang -Wall -std=c11 int_main_envp.c -o int_main_envp
```

問題なくコンパイルできます。実は、仕様書の付録Jにこの`envp`に関する記載があります。`envp`は環境変数が入っている文字列の配列で、一番最後が`NULL`になっています。付録に記載されていることもあり、ほとんどの環境で同じように使えるようです。ただ、実装依存であり、全ての環境で使えることが保証されていないため、使用しない方がいいでしょう。環境変数は`getenv()`等で操作をして下さい。


### 結論
`main() {}`でも動くけど、ある日突然エラーになっても知らないからね。
redis-cli で resque の job を追加


cron で resque の job を追加したいんだけど、ruby が入ってない環境だったので、ruby なしで resque の job を追加する方法を調べた。

# 結論

```ruby
class Foo
  @queue = "foo"
end

Resque.enque(Foo, 1, 2)
```

と同じことを redis-cli でやるなら下記でよい。

```bash
$ redis-cli sadd resque:queues foo
$ redis-cli rpush resque:queue:foo '{"class":"Foo","args":[1,2]}'
```

いちおう詳しく書くと、

- `resque:queues` というセットにキュー名を追加
- `resque:queue:キュー名` というリストに `{"class":クラス名,"args":引数の配列}` な JSON を追加

# 調査の過程

`resque-1.20.0/lib/resque.rb` を読むと、下記の流れになる。

```
Resque.enqueue(klass, *args) ->
Resque.enqueue_to(queue, klass, *args) ->
(hook を実行して) Job.create(queue, klass, *args) ->
Resque.push(queue, class: klass.to_s, args: args)
```

```
Resque.push(queue: String, item: Hash)
-> redis.sadd(:queues, queue.to_s) # Resque.watch_queue 内で呼ばれる
-> redis.rpush "queue:#{queue}", encode(item)
```

`Resque::Helpers#encode` は `::MultiJson.encode(object)`

また、`Resque.redis=` で namespace を `resque` にしている。
ubuntuでessentiaを使う

この記事は間違ってる
というかスマートじゃない可能性が高いです。

https://github.com/MTG/essentia/issues/231#issuecomment-78290129
```
No need to build libav from source if you can use packages from trusty
```
というわけで普通にaptからinstallしても大丈夫らしい。




#### 以下どうしてもffmpegをビルドして使いたい人向け。


ubuntu環境にessentiaをインストールした時のメモ。

optionalな機能に注意　
-------------------------------
[公式のインストールドキュメント](http://essentia.upf.edu/documentation/installing.html)を読むと一部オプショナルで、環境の準備はドキュメント外で自分でやる必要があるのが分かる。
とくに```libavcodec```はサンプルを動かしたり、音声ファイルの出力するためには必須になってくるので、オプショナルといえども入れといたほうが良いことが多い。

libavcodecのインストール
------------------------------
さてこの```libavcodec```だが、apt-getなんかでインストールしようとすると、PICオプション無しでコンパイルされているのかessentia自身のコンパイル時に怒られてしまう。

```
/usr/bin/ld: /usr/local/lib/libavcodec.a(vc1dsp_mmx.o): 再配置 R_X86_64_PC32 (シンボル `ff_pw_9' に対する) は共有オブジェクト作成時には使用出来ません。 -fPIC を付けて再コンパイルしてください。
```

というわけで気合でソースからコンパイルすることに。


ffmpegのインストール
------------------------------
libavcodecはffmpegのライブラリなのでffmpegをインストールすれば一緒に入る。もちろんapt経由でインストールしたffmpegではだめ（そもそもubuntu14系ではapt-getでffmpegがインストール出来ない。）なのでffmpegと周辺ライブラリも全部自力でコンパイルする。

幸い[先人が通った道](https://wiki.ubuntulinux.jp/UbuntuTips/Application/HowToInstallAndUseLatestFFmpegAndX264)なので真似すれば良い。
ただ、essentiaで利用できるようにするには、上記のエントリに一工夫必要になる。

*追記 2015/02/26*
ffmpegのビルド時に必ず libavresample を有効にして下さい。
libswresampleでもessentiaはサポートしてくれているのですが、あまりテストされていないようで、libavresample使うほうが安定です


./configure 〜 --enable-pic
-----------------------------
そもそもpicオプション無しでコンパイルされているのが問題なので、makeするときに-fPICが着くようにconfigureする必要がある。コレをちゃんとやらないと自力でやっても何の意味もないので注意。

各ライブラリのconfigureにかならず```--enable-pic```をつけることを忘れずに。


#### lameの追加configureオプション
特に前述の記事のlameのconfigureは```--disable-shared```が付いていてそもそもsoファイルを作ってくれないのでlameだけは以下のように変えて実行する必要がある。
```
./configure --enable-nasm --enable-pic
```

#### ffmpegの追加configureオプション
上述しましたが必ずlibavresampleを有効にしておきましょう

```
./configure --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-x11grab --enable-libmp3lame --enable-libvpx --enable-pic --enable-avresample
```


まとめ
--------------------------------
- ubuntuでessentiaを入れるためにはffmpegの自力コンパイルが必要
- 共有ライブラリとして使うのでconfigureで```--enable-pic```を指定する
- 参考文献のlameのconfigureの--disable-sharedは外す
- ffmpegのlibavresampleは有効にする
Laravel5 の Eloquent 多対多中間テーブルまとめ自分用

```
Group *--* User
```

１つのグループには複数のユーザが所属できて
１人のユーザがいろんなグループに所属できるみたいなやつ

```database/migrations/create_pivot_tables.php
Schema::create('group_user', function($table){
    $table->increments('id');
    $table->integer('group_id')->unsigned();
    $table->foreign('group_id')->references('id')->on('groups');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');
    $table->timestamps();
    $table->unique(array('group_id', 'user_id'));
});
```

中間テーブル名はアルファベット順に並べる

```Group.php
public function users(){
    return $this->belongToMany('hoge\User');
}
```

これでbelongToMany型が返ってくるねん

```
$users = $group->users();
$men = $users->where('gender', '=', 'man');
```

まだＳＱＬ実行されてないのでさらに条件追加したりできる

```
$results = $men->getResults();
```

getなんとか() 系のメソッドを実行するとＳＱＬ実行される


```
$userIds = $group->users()->getRelatedIds();
```

IDほしいだけなら belongToMany::getRelatedIds()

多対多の場合は逆もいっしょ
PHP5.4.7でstdClassをArrayに変換した時に詰まったこと

タグの環境にてページネーションを実装中に現象。
https://gist.github.com/mitukiii/917075
こちらのロジックを使用させて頂きました。

```php
$array = stdClassToArray($results);    // resultsにはSQLをページネーションした形で取得したstdClass objectが入っている
$page = array(
            'current' => $array['currentPage'],
            'perpage' => $array['perPage'],
            'last' => $array['lastPage'],
            'total' => $array['total']
        );
```
としたところ

> Undefined index: currentPage

なんぞ?
と$arrayの中身のダンプを取ってみたところ
![WS000210.JPG](https://qiita-image-store.s3.amazonaws.com/0/53556/6708b456-ac9c-bcc1-be0c-47111b469bb5.jpeg)

何か化けてる…?
取りあえず全ソースファイルの文字コードをUTF-8に強制変換かけてみるも効果無し。
仕方ないので文字をヘキサ表示してみる
> var_dump(bin2hex($key));

![WS000211.JPG](https://qiita-image-store.s3.amazonaws.com/0/53556/c9647bcc-c61b-8270-9c99-91a1d49fe6b7.jpeg)

おぉ…null文字が混入している。
null*nullになっている意味が正直分かりませんが取りあえずnullをどうにかしてあげるといいということですね。

>  $key = str_replace('@', '', $key);

これを

>  $key = str_replace("\x00", "", str_replace('@', '', $key));

こうするとcurrentPageのところが
![WS000212.JPG](https://qiita-image-store.s3.amazonaws.com/0/53556/5fa1cb80-5373-8f4b-e62b-6d1f816a5ffc.jpeg)

こうなって取りあえず文字化けは解消しました。
アスタリスクは…正直どうにもなりませんね。
コントローラー側で

```php
        $array = stdClassToArray($results);
        $page = array(
            'current' => $array['*currentPage'],
            'perpage' => $array['*perPage'],
            'last' => $array['*lastPage'],
            'total' => $array['*total']
        );
```

アスタリスク足して指定してやることでちゃんととれました。
View(Smarty)側への受け渡しはいつも通りで。
Android StudioでAndroidJUnit4を使うとテストが実行されない場合がある

# 問題
ActivityInstrumentationTestCase2を継承したクラスでAndroidJUnit4を使うとテストが実行されないことがあります
とりあえず、Android Studio 1.1.0 + Espresso 2.0で確認

```java:MainActivityTest.java
@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

    private MainActivity mActivity;

    public MainActivityTest() {
        super(MainActivity.class);
    }

    @Before
    public void before() throws Exception {
        this.setUp();
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        mActivity = getActivity();
    }

    @After
    public void after() throws Exception {
        this.tearDown();
    }

    @Test
    public void checkClick() {
        //ボタンをクリック
        onView(withId(R.id.button)).perform(click());
    }
}
```
アノテーションをつけたのにも関わらず、checkClickは実行されません

# 現状の回避方法

```java:MainActivityTest.java
@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

    //〜中略〜
    @Test
    public void test() {}

    @Test
    public void checkClick() {
        //ボタンをクリック
        onView(withId(R.id.button)).perform(click());
    }
}
```

このようにtestを含んだメソッドを1個余計に作るだけでOKです
これでtestとcheckClickが実行されます

普通のクラスやApplicationTestCaseだと問題ないんですけど、何が原因なんでしょうね？
Javaのpackage・import・修飾子について

Javaのpackage・import・修飾子に関するメモ

## package
>Javaパッケージ(Java package)は名前空間の中にあるJavaクラスをまとめるメカニズムである。(wikipediaより)

__package__とは､複数のクラスをまとめる仕組みであり､クラスの__名前空間__や__アクセス制御__に利用される｡

パッケージに分割すると__クラスやインターフェースの名前衝突を防ぐ__ことができる｡

しかし､Javaにはパッケージ名の衝突を防ぐ仕組みはなく､__インターネットドメイン名(DNSドメイン名)__を利用することを推奨している｡

```java
/* パッケージ名 */
info.ktaro.www
```

パッケージ宣言は､__行の先頭で行う必要がある｡__

```java
/* 例 */
package info.ktaro.www

class Sample{
    ...
}
```

## import
>Javaソースファイル内でパッケージを使うことで、import文でパッケージからクラスをインポートすることは便利なものとなる。(wikipediaより)

__import文__は､他のパッケージ内のクラスやインターフェイスを参照するために利用する｡
ただし､上記は必須ではない｡

```java
/* importを利用しない書き方 */
java.util.List<String> list = new java.util.ArrayList<String>();

/* importを利用した書き方 */
import java.util.*
...
List<String> list = new List<String>();

```

### importの種類
#### オンデマンドインポート
アスタリスク(*)を利用したインポート｡

` import java.util.* `

#### 単一型インポート
個別に型名を指定したインポート｡

` import java.util.List `

オンデマンドインポートは便利な半面､多用すると__名前衝突を発生させる__可能性が高くなるため､なるべく__単一型インポート__を行うように心がける｡


## 修飾子
### クラス
#### 修飾子(アクセス制御)
|修飾子|意味|
|----|----|
|public|どこからでもアクセス可能｡|
|なし|同一パッケージ内のみアクセス可能|

#### 修飾子
|修飾子|意味(記述なし)|
|----|----|
|final|拡張継承を禁止｡(継承可能)|
|abstract|抽象クラス｡(具象クラス)|
|...|...|

### メンバ(フィールド､メソッド､コンストラクタ､etc.)
#### 修飾子(アクセス制御)
|修飾子|意味|
|----|----|
|public|どこからでもアクセス可能｡|
|private|そのクラス内からのみアクセス可能|
|protected|そのクラス内､継承クラス､パッケージ内の他クラスからアクセス可能|
|なし|そのクラス内､パッケージ内の他クラスからアクセス可能|

#### フィールド宣言
|修飾子|意味|
|----|----|
|final|再代入禁止｡(定数)|
|static|クラスフィールド|
|...|...|

#### メソッド宣言
|修飾子|意味|
|----|----|
|final|オーバーライド不可|
|static|クラスメソッド|
|abstract|抽象メソッド|
|...|...|
SRPMを一撃でRPMビルドする。 (rpmコマンドでつい忘れがちな細かいオプションもおまけで記載)

いっつも忘れてしまうので、例によってメモ代わりに。
タイトルは釣りです。
<br>
SRPMに含まれているSPECファイルをそのまま使うのであれば、

`# rpmbuild --rebuild <SRPMファイル>`

これで一撃でbuildできる。
<br>
わざわざ、

```
# rpm -Uvh <SRPMファイル> 
# cd /usr/src/redhat/SPEC
# rpmbuild -ba <SPECファイル> 
```

とやらずに済むので便利。
※そもそも、一撃ビルドせずに、きちんとSPECファイル読めや。変なもん仕込まれてたらどうんだ、ボケ。という憂慮はあるのだが。。。
<br>

ちなみに、rpmの-Uオプションは、既に前バージョンのrpmパッケージがインストールされてる場合はアップデート、
インストールされていない場合は、新規インストール(-iオプションと同じ)という便利なオプション。
これ知ってから-iオプションは久しく使っていない。
<br>

なお、ネット上で散見される

```
# rpm --rebuild hogehoge.srpm
```

これはrpmのバージョン3まで。

<br>



**○おまけ**
ついでに、他にもよく忘れがちになるrpmコマンドの細かいオプションをメモっておく。
(たまにど忘れしてman叩く羽目になるので。。。)

<br>
**・敢えてインストール済みのパッケージをダウングレードしたい時に。
(Forceでも良いが、ほぼ依存関係壊れるのでこちらで一個ずつ解消することをお薦めする。)**
`# rpm -Uvh --oldpackage <RPMファイル>`
<br>
**・インストール済みのパッケージを再インストールしたい場合に。**
`# rpm -Uvh ---replacepkgs <RPMファイル>`
<br>
**・実際にインストールせずに、インストールチェックのみを実施する。
(個人的には毎回使っている。必須。)**
`# rpm -Uvh --test <RPMファイル>`
<br>
**・RPMファイルを指定して更新履歴を表示する。**
`# rpm -qp --changelog <RPMファイル>`
<br>
**・既にインストール済みのRPMパッケージの更新履歴を表示する。**
`# rpm -q --changelog <パッケージ名>`
<br>
**・RPMファイルに含まれるpreinstall/postinstallスクリプトを確認する。**
`# rpm -qp --scripts rpmファイル`
<br>
**・既にインストール済みのrpmパッケージのスクリプトを確認する。**
`# rpm -q --scripts <パッケージ名>`
<br>
**・該当ファイルを含むパッケージ名の表示する。**
`# rpm -qf <ファイル名>`
<br>
**・パッケージが依存しているファイルの表示する。**
`# rpm -qR <パッケージ名>`

<br>
<br>
rpmのオプションは豊富。
今時はyumでもっと楽に解決できるはずだが、yumが使えない環境などもあるので、少しでも覚えておくといざという時に非常に助かる。


最後に…
<br>
**困ったらすぐに--nodepsとか--forceを使う奴はエンジニアじゃない！！**
(特に過去の自分…)
<br>
それでは、また気が向いた時に。
TypeScriptでの外部リソース操作について

外部リソース操作が発生するコード周りは以下のような感じにしています。

## リソースクラス

```ts
/// <reference path="typings/jquery/jquery.d.ts" />

interface Window {
    webApiBaseUrl: string;
}

module Resource {

    //WebApiサーバーのUrl
    var urlBase = window.webApiBaseUrl;

    export class Parson {

        constructor(
            public id: string,
            public name: string,
            public address: { zip: string; address: string; tel1: string; tel2: string}) { }

        static get(): JQueryPromise<Array<Parson>> {
            return $.getJSON(urlBase + "/master/parson")
                .then((data: Array<any>, textStatus, jqXHR) => {
                    //データ取得してから戻り値オブジェクト作るところは、
                    //どうしてもAny値を扱う必要があるので、インテリセンスに頼れない。
                    var d = $.Deferred();
                    var parsons = new Array<Parson>(data.length);
                    for (var i = 0; i < data.length; i++) {
                        parsons[i] = new Parson(
                            data[i].id,
                            data[i].name,
                            {
                                zip :  data[i].zip,
                                address : data[i].address,
                                tel1 : data[i].tel1,
                                tel2 : data[i].tel2
                            });
                    }
                    return d.resolve(parsons).promise();
                });
        }
    }
}
```


## リソースクラスの利用側

コード補完(私はVisualStudio使っていますが、他環境でも同じ感じになると思います。)で型情報表示されています。安全にプログラミングが出来そうです。

![20150223_resource01.png](https://qiita-image-store.s3.amazonaws.com/0/7736/2d76f932-fec0-74e4-6183-f106e72e9d63.png)
AWS-CLIを使うインスタンスにはPublic-DNS(or EIP)が必須なので注意しよう、という話


超基本的なことですが、後で気付くと意外と痛いことになるので、メモしておきます。

<font color=red>AWS-CLIは、インスタンスにPublic-DNS(IP)を振っていないと、正常に動きません。</font>

理由は、`AWS-CLIのエンドポイントはVPCの外にあるから`、です。

Internet Gatewat(I-GW)まで出て行けるようなRouting tableが設定されていれば、レスポンスもI-GWまで戻ってこれるはずで、I-GWからVPCの中に対してはプライベートIPでも通信可能なことから、正常に通信できるのではないか（I-GWがプロキシ的な役割を担う事ができるのではないか）と考えることもできるのですが、残念ながらそういうわけにはいかないようです。

確かにI-GWはプロキシ的な役割を果たすのですが、グローバルIPアドレスはインスタンス側で持つ必要があります。
これは、以下ドキュメントに記載があるとおり、AWS側の仕様です。

■Internet Gateways
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Internet_Gateway.html
>
An Internet gateway serves two purposes: to provide a target in your VPC route tables for Internet-routable traffic, and to perform network address translation (NAT) for instances that have been assigned public IP addresses. 
To enable access to or from the Internet for instances in a VPC subnet, you must attach an Internet gateway to your VPC, ensure that your subnet's route table points to the Internet gateway, ensure that instances in your subnet have public IP addresses or Elastic IP addresses, and ensure that your network access control and security group rules allow the relevant traffic to flow to and from your instance.



<b>■AWS-CLIを使うために必要な設定（まとめ）
①：CLI実行対象となるインスタンスのroot権限、もしくは操作対象リソースに対するIAM権限
②：I-GW、もしくはNATインスタンスを経由してVPCの外に出られるようなRouting設定
③：PublicなIPアドレス（AWSで自動的にアタッチされる動的なPublic-DNSでもOK）</b>


例えばDBサーバなどは、より厳密に侵入を防ぎたいなどの理由で、Public-DNSを振らないケースがあると思いますが、そうなるとAWS-CLIコマンドが正常に実行できなくなってしまいます。

CloudwatchにカスタムメトリクスPushなど、結構些細なことで使う事になるケースがあるので、
後で使う事になって、EIP振らないといけなくなってしまった、ということがないように気をつけたいですね。
WindowsをSSD換装して使っていたら或る日突然OSが起動できなくなった。（個人メモ）

#はじめに
SSD換装したWindows8.1のPCを使用していて、或る日突然Windowsが起動しなくなった。結果的にSSD換装前の状態に戻してしまったが、事前に分かっていればほとんど被害がなかったはずなので簡単なメモを残す。

#環境
・ASUS X200M
・Windows 8.1
・Transcend SSD370 (換装したSSD)

#何が起きたか
Windows Updateを実行したタイミングでPCが不安定になり、OSシャットダウンも完全に終わらない状態になった。強制終了後に起動したところ（例によって）CHKDSKが走り、その後にブルースクリーンとなった。（エラーコードは0xc0000225で、途中でBCDを修正して0xc0000001に変わった。）

#問題発生の原因
・３か月前にPCの内臓ディスクをHDDからSSDに換装した。
・データの移行はEaseUS Todo Backup 7.5（無償版）を使用して、ディスクを丸ごと（USB接続したSSDに）コピーしてSSD換装したところ無事OSが起動したので問題がないと思っていた。
・この時点で実はBCDの情報がきちんと移行されておらず、最低限起動可能な環境にはなっていたものの、Recovery用のパーティションが設定できていなかったと考えられる。
⇒このために復元ポイントの自動作成がされない状態になっており、Windows Update等で何か問題が起きても戻せない状態となっていた。
※結果的にSSD自体には何も問題がなかった。

#今回の対応策
・SSDを一旦換装前のHDDに戻してOSを起動し、SSDをUSBで接続したところ問題なく読めることを確認した。ついでに\Windows\System32\Srt\SrtTrail.txtの内容を確認したところWindowUpdate後にOSが起動できない状態になっていた。
・正常に起動している状態でBCDの状態をファイルに保存（bcdedit /enum all）。これをSSD上に格納した。
・回復ドライブを作っていなかったので、ここで作成した。
・起動できなくなったSSDに一旦戻して、起動エラーが出る状態に戻す。そして、回復ドライブから起動してコマンドプロンプトを起動する。（やり方は色々なページに書かれているので別途参照のこと。）
・この状態でbcdedit /enum allの出力をして、上記正常起動の結果と見比べて、unknownとなっている部分をすべて修正した。（bcdedit /set 何とか）
　※ひょっとすると正常起動した環境からエキスポート（bcdedit /export）した情報をそのままインポート（bcdedit /import）できるかもしれない。
・ここまできて、結局Windows Updateの失敗を元に戻せないことがわかったので、CドライブをEaseUS Todo Backupで再コピーした。

#問題点
１．BCD設定が移行されていなかった。（復旧パーティションが見えない状態など。）
２．このためWindowsの復旧ポイントも作られていなかった。

#本来の姿
今回は後の祭りだが、本来は以下のようにするべきだった。
・SSD換装時にデータの移行が終わり、OS起動が起動で来たらbcdedit /enum allの結果を見て、移行前と差異がないか確認をする。もしも差異があれば（換装前の環境でbcdedit /exportしたものを）インポートしておく。
・Windows Update時に復元ポイントが自動的に取られるようにするために、Cドライブのシステムの保護（コントロール パネル→システムとセキュリティ→システム→システムの保護）が有効か確認する。無効であれば「構成」から有効にしておく。
PythonのTkinterでCheckbuttonを動的に作成してみる

#＊はじめに
[前回](http://qiita.com/nnahito/items/ad1428a30738b3d93762)で，PythonのTkinterの基本的な部分は書きました．
今回は，TkinterのCheckbuttonを動的に作成する方法を載せます．




#＊流れ
簡単な考え方の流れ図を．
1. Tkinterの枠組みを作る
2. Checkbuttonの結果（チェックされているか否か）と，Checkbuttonのハンドルを格納するグローバルな変数を用意
3. Checkbuttonを作り，BooleanVarの内容とCheckbuttonのハンドルをグローバル変数に格納
以上です．



#＊コード
```lang:Python
#!/usr/bin/env python
# -*- coding: utf8 -*-
import sys
import Tkinter
import tkMessageBox


root = Tkinter.Tk()
root.title(u"Software Title")
root.geometry("400x300")


#
# グローバル変数
#
hLabel = []				#ラベルのハンドルを格納します
hCheck = []				#チェックボックスのハンドルを格納します
CheckVal = []			#チェックボックスにチェックが入っているかどうかを格納します


#
# チェックボックスのチェック状況を取得する
#
def check(event):
	for n in range(len(CheckVal)):
		if CheckVal[n].get() == True:
			label = Tkinter.Label(text=u"チェックされています")
			label.place(x=100, y=20*n + 50)
		else:
			label = Tkinter.Label(text=u"チェックされていません")
			label.place(x=100, y=20*n + 50)
		
		#ラベルのハンドルを追加
		hLabel.append(label)
	

#
# チェックボックスを動的に作成
#
def make(ebent):
	#作成するチェックボックスの個数（Entryの値）を取得
	num = Entry1.get()
	
	#既出のチェックボックスやラベルを削除
	for n in range(len(hCheck)):
		hCheck[n].destroy()
		hLabel[n].destroy()
	
	#配列を空にする
	del CheckVal[:]
	del hCheck[:]
	del hLabel[:]
	
	#Entry1に入力された値分ループ
	for n in range(int(num)):
		#BooleanVarの作成
		bl = Tkinter.BooleanVar()
		
		#チェックボックスの値を決定
		bl.set(False)
		
		#チェックボックスの作成
		b = Tkinter.Checkbutton(text = "項目" + str(n+1), variable = bl)
		b.place(x=5, y=20*n + 50)
		
		#チェックボックスの値を，リストに追加
		CheckVal.append(bl)
		
		#チェックボックスのハンドルをリストに追加
		hCheck.append(b)
	


button1 = Tkinter.Button(root, text=u'Checkbuttonの作成',width=20)
button1.bind("<Button-1>",make)
button1.place(x=90, y=5)

button2 = Tkinter.Button(root, text=u'チェックの取得',width=15)
button2.bind("<Button-1>",check)
button2.place(x=265, y=5)

Entry1 = Tkinter.Entry(root, width=10)
Entry1.place(x=5, y=5)


root.mainloop()
```

##上記のコードの実行画面
![スクリーンショット 2015-02-23 17.39.52.png](https://qiita-image-store.s3.amazonaws.com/0/63338/b63e6017-ef3d-082c-7d43-6f6d40cdb8f9.png)
FreeBSD で pkg で運用するためのメモみたいなもの


最近やっと pkg を使い始めましたが、十分に理解していないのと、忘れっぽいのでメモして置く予定です。
とりあえずのメモなので順番には意味はありません。

- インストールされるファイルの一覧が知りたい。

```shell-session
pkg info -l パッケージ名
```





# 参考にしているサイト等
- [FreeBSD handbook: 5.4. Using pkg for Binary Package Management](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/pkgng-intro.html)
- [Pkg PkgPrimer](https://wiki.freebsd.org/PkgPrimer)
- [pkg - FreeBSD入門](http://kaworu.jpn.org/freebsd/pkg)
- ``# pkg help``
- ``# man pkg``
realm-java で Fatal signal 11 (SIGSEGV) に悩まされた話


# はじめに

趣味で作っているアプリでrealm-javaを使っているのですが、タイトルの通りFatal signal 11で落ちることがあったのでメモ。
なお、根本的な解決策および原因は分かってません。もうちょっと条件がはっきり分かったらissueに書こうかとも思うのですが、Debugでステップ実行してると発生しなかったりで発生箇所すらはっきりしないのです。。。
ちなみに、本現象は執筆時点で最新の0.79.1でも発生しています。


# 発生した現象と状況

`Realm`を今回実装したServiceのプライベートなフィールドとして定義、`onCreate`で初期化してサービス内で引き回して、最終的に`onDestroy`で破棄する作りとしていた。

```java
Realm mRealm;

@Override
public void onCreate() {
    mReam = Realm.getInstance(this);
}

@Override
public void onDestroy() {
	mRealm.close();
}
```

また、コード中では`RealmResult`もプライベートなフィールドとして各所に引き回していました。

```java
RealmResult<Hoge> mRealmResult;

private void getHogeList(String hoge) {
	return mRealmResult.where().equalTo("hoge", hoge).findAll();
}

private void getHogeHogeList(String hogehoge) {
	return mRealmResult.where().equalTo("hogehoge", hogehoge).findAll();
}
```

なぜこのような作りにしていたかと言うと、ユーザの操作によってカラム`hoge`で絞り込んだ結果をユーザに提示。
そこから更にユーザ操作でカラム`hogehoge`に対して絞り込み条件を追加という処理を行っていたから。
realmでは`RealmResult`に対してもクエリーを投げられるので、結果に対してさらに絞り込みという処理がしやすかったんです。
加えてそのサービスが起動中はずっと必要なので、いちいち`getInstance(context)`するのが面倒だったのも理由です。。。

ただ、上記のようにしていたコードはNexus6 (Android 5.0.1)では問題なく動くものの、Nexus5 (Android 4.4.4)ではアプリが強制終了してLogcatには以下のようなログだけが出力。。。

```
Fatal signal 11 (SIGSEGV) at 0xd63794b7 (code=1), thread 6794 (ng.hogehoge)
***以下メモリダンプ***
```

## とりあえず回避策

根本的な解決になっていないかもしれないですが、ReamインスタンスやRealmResultインスタンスの引き回しをやめました。
Realmが必要となるところで`Realm.getInstance(context)`して、不要となったところで`close()`する、これだけです。
これで、クラッシュが発生していたNexus5 (Android 4.4.4)でもクラッシュは発生しなくなりました。

ただ、Realmでクエリーを投げた結果として得られるオブジェクトはいついかなる場合も、coreライブラリを通したメモリへの参照です。
Realmインスタンスがクローズされるともうアクセスすることはできません。

したがって、引き回しが必要なデータは別途Realmのモデルとは別のオブジェクトとして保持していく必要があります。

この辺りはデータの保持方法やロジック自体の再検討が必要になってきます。
自分の場合は、検索条件だけ保持しておいて、必要なときにまとめてクエリーを投げることにしました。

```java
String mHoge;
String mHogeHoge

private HogeListener mHogeListener = new HogeListener() {
	@Override
	public void onUserHogeInput(String searchHoge) {
		mHoge = searchHoge;
		Realm realm = Realm.getInstance(this);
		RealmResult<Hoge> result = getSearchedList(realm);
		// データを保持する
		ArrayList<String> hoogeNames = new ArrayList<>();
		for (Hoge hoge : result) {
			hogeNames.add(hoge.getName());
		}
		// もうRealmは不要なのでクローズ。メソッド内でRealmを完結させる。
		realm.close;
		// 保持したデータでいろいろ処理する
		showHogeSearchResult(hogeNames);		
	}
};

private HogeHogeListener mHogeHogeListener = new HogeHogeListener() {
	@Override
	public void onUserHogeHogeInput(String searchHogeHoge) {
		mHogeHoge = searchHogeHoge;
		Realm realm = Realm.getInstance(this);
		RealmResult<Hoge> result = getSearchedList(realm);
		// 省略
		realm.close;
	}
};

private RealmResult<Hoge> getSearchedList(Realm realm) {
	RealmQuery<Hoge> query = realm.where(Hoge.class);
	if (mHoge != null && mHoge.equals("")) {
		query.equalTo("hoge", mHoge);
	}
	if (mHogeHoge != null && mHogeHoge.equals("")) {
		query.equalTo("hogehoge", mHogeHoge);
	}
	return query.findAll();
}

```

## 雑感

このような処理が必要となるケースは多くないとは思いますが、なんだかRealmの良さがスポイルされてしまっている気がします。
だれか、もっと良い解決方法があれば教えて下さい。。。
Jenkinsの「使用許諾に同意しないと自動インストールできません。」を直す


# 「使用許諾に同意しないと自動インストールできません。」

mac mini に Jenkins をインストールして CI サーバーとして使用しています。
稼働開始当初より、ログに下記のメッセージが表示されてずっと困惑しておりました・・・

「使用許諾に同意しないと自動インストールできません。」

何の使用許諾なのかさっぱり分からず、インストールできないと出ていますが、問題なく稼働しているので何なんだろうとずっと考えていました・・・

## 原因とメッセージの非表示方法

どうも次の例外が発生していたようです。

JDKInstaller.UnableToInstallUntilLicenseAccepted

どうやら JDK をインストールしようとして失敗していた模様です。

### 非表示方法

1. [Jenkinsの管理]-[システムの設定]-[JDK]へ移動
2. 「インストール済みのJDK...」を押す
3. 「自動インストール」のチェックをはずす

どうも Jenkins には Oracle のアカウントを設定できるページが存在しており、アカウントを入力済みだと JDK を自動でインストールしてくれる機能がある模様。
xcodeしか使ってなかったので、全くわからんかった・・・
Laravel5 の Eloquent で自分の所属する会社の社員ID一覧を取得したいやんけ

```
$me = \Auth::user();

$companionIds = Company
    ::find($me->company_id)
    ->users()
    ->getRelatedIds()

var_dump($companionIds);
```
```
array(2) { [0]=> int(1) [1]=> int(2) }
```
とてもかっこいい
DockerでPhalcon用にベースイメージを作る Phalcon 1.3.4 (LAMPベース)


こちらにソースを置いておきます。
https://github.com/teruchi/phalcon-base

まずはDockerfileを用意します。

```Dockerfile
#
# Phalcon Base
#
# 20150223
#   Phalcon 1.3.4 (remi)
FROM teruchi/lamp-base
MAINTAINER teruchi

# install phalcon
RUN yum install -y php-phalcon && \
    yum clean all

# install mbstring php-xml
RUN yum install -y php-mbstring libxslt php-xml && \
    yum clean all
```

ベースイメージにはこちらで作成したものを使ってます。
http://qiita.com/_teruchi/items/ee23f34ae1918ff31088

cloneしたディレクトリで

```bash
$ docker build -t teruchi/phalcon-base .
```

Phalconはビルドがとにかくめんどくさいので、remiに用意されているrpmを使います。

ここで作ったイメージをベースにPhalconのプロジェクトを作っていきます。
vagrant-cachierプラグインで仮想サーバのプロビジョニングを高速化する




# vagrant-cachierプラグインとは

yumやapt-getなどパッケージ管理システムのパッケージをローカルにキャッシュすることでプロビジョニングの実行を高速化するプラグイン。

[vagrant provision]などを何度も実行する場合や、仮想サーバを一度削除した後に[vagrant up]する場合の作成時間が削減できる。


# 導入方法


## インストール
```
$ vagrant plugin install vagrant-cachier
```

## Vagrantfileへの記述

下記では:boxを指定しており、インストールしたパッケージをBox単位でキャッシュする。同一Boxを使うVagrantfileであれば、別のVMでもキャッシュを共有できる。

```Vagrantfile
Vagrant.configure("2") do |config|
  # (snip)
 
  if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :box 
  end
 
  # (snip)
end
```

### config.cache.scopeについて

:boxと:machineのいずれかを設定可能。

#### :box（box単位のキャッシュ）
ダウンロードしたパッケージは複数のboxをまたいで共有される。一度ダウンロードしたパッケージは、複数プロジェクトやboxで再利用される。

#### :machine（仮想サーバ単位のキャッシュ）
仮想サーバ単位でパッケージを保存する。複数の仮想サーバで[apt-get update]や[yum install]などを同時に実行する場合はロックによるエラーが発生するため、こちらのオプションを指定すうｒ。


# GitHub
https://github.com/fgrehm/vagrant-cachier
gruffを使ってグラフ作成しようとしたら`get_type_metrics': unable to read fontって言われた

こちらを参考にグラフ作成してみるか〜となってやってみましたが、うまくいかず。。
http://easyramble.com/ruby-gruff-graph.html

```rb:Gemfile
source "https://rubygems.org"

gem 'gruff'
```

```rb
#!/usr/bin/env ruby

require 'gruff'

g = Gruff::Line.new
g.title = "My Graph"

g.data("Apples", [1, 2, 3, 4, 4, 3])
g.data("Oranges", [4, 8, 7, 9, 8, 9])
g.data("Watermelon", [2, 3, 1, 5, 6, 8])
g.data("Peaches", [9, 9, 10, 8, 7, 9])

g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}

g.write('my_fruity_graph.png')
```

```
bundle install --path=vendor/bundle
bundle exec ./test.rb
/Users/xxx/Working/git/graphs/vendor/bundle/ruby/2.1.0/gems/gruff-0.5.1/lib/gruff/base.rb:1112:in `get_type_metrics': unable to read font `/usr/local/share/ghostscript/fonts/n019003l.pfb' @ error/annotate.c/RenderFreetype/1123: `(null)' (Magick::ImageMagickError)
	from /Users/xxx/Working/git/graphs/vendor/bundle/ruby/2.1.0/gems/gruff-0.5.1/lib/gruff/base.rb:1112:in `calculate_caps_height'
	from /Users/xxx/Working/git/graphs/vendor/bundle/ruby/2.1.0/gems/gruff-0.5.1/lib/gruff/base.rb:523:in `setup_graph_measurements'
	from /Users/xxx/Working/git/graphs/vendor/bundle/ruby/2.1.0/gems/gruff-0.5.1/lib/gruff/base.rb:485:in `setup_drawing'
	from /Users/xxx/Working/git/graphs/vendor/bundle/ruby/2.1.0/gems/gruff-0.5.1/lib/gruff/base.rb:450:in `draw'
	from /Users/xxx/Working/git/graphs/vendor/bundle/ruby/2.1.0/gems/gruff-0.5.1/lib/gruff/line.rb:174:in `draw'
	from /Users/xxx/Working/git/graphs/vendor/bundle/ruby/2.1.0/gems/gruff-0.5.1/lib/gruff/base.rb:424:in `write'
	from ./test.rb:15:in `<main>'
```

ググってみるとどうやら`ghostscript `をインストールする必要があるみたい。

```
brew install ghostscript
```

これでイケる！
と思ったら違うエラーが。。

```
/Users/xxx/Working/git/graphs/vendor/bundle/ruby/2.1.0/gems/gruff-0.5.1/lib/gruff/base.rb:425:in `write': unable to load module `/usr/local/Cellar/imagemagick/6.8.6-3/lib/ImageMagick//modules-Q16/coders/png.la': file not found @ error/module.c/OpenModule/1277 (Magick::ImageMagickError)
	from /Users/xxx/Working/git/graphs/vendor/bundle/ruby/2.1.0/gems/gruff-0.5.1/lib/gruff/base.rb:425:in `write'
	from test.rb:15:in `<main>'
```

これはここの通りにやったら解決しました。
http://qiita.com/liubin/items/c4c0963d2b6550221682

んで無事グラフ生成できました。
めでたしめでたし。


![my_fruity_graph.png](https://qiita-image-store.s3.amazonaws.com/0/14975/ce964958-99f6-aa73-7798-9d22a3bcd4f4.png)
原因思考と結果思考。足を引っ張る存在から、先頭を走れる人材になるために。 - ある戦友に向けて -

仕事でコミュニケーションしていると、このようなことを言う人をたまに見かけます。
「これは、ここが出来てないからダメだ。」
「あれは、ああいうふうになっているからうまくいくわけがない。」

あなたの周りにも、いるのではないでしょうか？このような人。

![bird.png](https://qiita-image-store.s3.amazonaws.com/0/25176/d4ec1fcb-3e03-3336-3231-91bb1746370b.png)

このような人は、概して、挙げてくれた問題を解決しようとすると、
「これは、他にもこういうところが出来てないからダメだ。」
「あれは、こういうふうにもなるから、うまくいくわけがない。」
と、色々な問題点を上げてきます。

その人に、何のために問題を指摘しているのか聞いてみると、
「いや、問題に気づいたから指摘しただけだ。」
「うまくいくわけがないから言っているだけだ。」
と答えてきます。

こういう人と会話すると、結論が見えずに、論理が立たず、モヤモヤします。

結局、このような人は問題を挙げたいだけで、何かを良くしようとか、悪いことが起ころうとするのを防止しようとかいう行動はしません。

このような人は、原因思考といって、ある時点から過去の出来事にしか関心事がありません。物事を良くしようとは考えていません。将来の問題の発生を未然に防ごうという気もないのです。

なおかつ、このような人は、自分が足を引っ張っているだけの存在とは気づいていません。ともすると、自分は問題を発見できる有能な人材であるとさえ思っています。

また、このような人の口癖として、「どうせXXXXだから」とか「XXXなんてXXXXだ」とかいうものがあります。過去しか見ていないことを象徴するようなセリフです。

原因思考に対して、結果思考という考えがあります。
「これは、これができれば良くなる。」
「あれは、ああいうふうにすれば結果を生む。」
ゴールに近づいたり、問題を解決するための手段を考えます。

この人は、結果に目を向けて、結果を出すための最短距離を進もうとします。結果を出すための考え方をして、行動をとります。行動の結果、物事が前進したり、問題の予防ができます。

![sandway.png](https://qiita-image-store.s3.amazonaws.com/0/25176/f12614ac-f177-6412-36da-9183eeebb21d.png)

原因思考ではなく、結果思考を用いるべきなのです。無限にある問題にとらわれて先に進めない様では、何もせずにますます状況が悪くなる様ではだめです。結果に目を向けて、そこにたどり着くために必要な手を講じなければならないのです。

しかしながら、人は誰しも、時として原因思考に陥ってしまうことがあります。疲れている時、物事がうまく行っていない時、ついつい原因思考になりがちです。

そんな時でも、自分をふりかえり、観察してみましょう。自分が原因思考になっていないか、結果思考になっているか。

また、原因思考に必要以上に振り回されないように。原因思考になっている人を結果思考に誘導出来るようにしましょう。時には相手にしないことも重要です。

結果思考に導くためのいい方法は、質問することです。「それは、何のためですか？」と。
原因思考の人は「XXXXXないためだ。」と回答してきます。その回答には、「では、どうあるためですか？」と質問します。相手から「XXXのためだ。」という表現がでるように導きます。
また、問題提起した内容について、対応してもらうのも手です。原因思考の方は、うまくいかない原因を無限に探索するため、やってもやってもキリがないという状況に陥ります。実際に状況に陥ってしまい、自らを振り返る機会をつくることもひとつの導く手段です。

それでも難しければ、せめて自分は結果思考でいるようにしましょう。結果思考は結果思考を引き寄せます。「どうすればよいか。」「何をすれば良くなるか。」を考えて行動しましょう。

そうすれば、一歩一歩成功に近づいていきます。
なぜならあなたが成功を目指して行動するからです。

----

この文書は、たった一人の私の戦友に対して書いています。

周りの原因思考の人間に振り回され、キリモミしている君。時にそれに付き合い、疲弊していく君。
この文書が、少しでも君の存在をより良くしてくれることを願って書いています。

戦友は素直ではないので、直接言っても聞いてくれないでしょう。
いつか、何らかの形で、この文書が君に届かんことを。

恐惶謹言
DockerでLAMP環境のベースイメージを作る CentOS 6.6 + Apache 2.2 + MySQL 5.6 + PHP 5.6


こちらにソースを置いておきます。
https://github.com/teruchi/lamp-base

まずはDockerfileを用意します。

```
#
# LAMP Base
#
# 20150223
#   CentOS 6.6 +epel +remi
#   Apache 2.2.15
#   MySQL 5.6.23
#   PHP 5.6.6

FROM centos:6
MAINTAINER teruchi

# update yum
RUN yum update -y && \
    yum clean all

# epel repo
RUN yum install -y http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && \
    yum clean all
COPY epel.repo /etc/yum.repos.d/

# remi repo
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm && \
    yum clean all
COPY remi.repo /etc/yum.repos.d/

# mysql repo
RUN yum install -y http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm && \
    yum clean all

RUN yum install -y httpd php mysql php-mysqlnd && \
    yum clean all
```

後で、このイメージの上にもろもろミドルウェアを入れていくDockerfileを作るので、本当にベースの環境しか入れません。
（MySQLいらないかも？）

epel.repoはこんな感じ

```
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
```

remi.repoはこんな感じ

```
[remi]
name=Les RPM de remi pour Enterprise Linux 6 - $basearch
mirrorlist=http://rpms.famillecollet.com/enterprise/6/remi/mirror
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

[remi-php56]
name=Les RPM de remi de PHP 5.6 pour Enterprise Linux 6 - $basearch
mirrorlist=http://rpms.famillecollet.com/enterprise/6/php56/mirror
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
```

PHP 5.6を使いたいのでremiを使いました。

そしてbuild。

```
docker build -t teruchi/lamp-base .
```

teruchi/lamp-baseの部分は適時変更してください。

epel.repo, remi.repoには必要な記述だけ残してCOPYするようにしています。
他ではsedで設定ファイルを変更しているパターンがありますが、gitでそれぞれのファイルをバージョン管理したいので、この方法が望ましいと思います。

でrun。

```
docker run -it --rm teruchi/lamp-base /bin/bash
```

ベースイメージなのでここで何するわけではないけど、動作確認のため。

GitHubに上げてあるので、checkoutして微調整後、docker buildすることをお勧めします。
GAE/J タスクキューにcontent-type jsonを渡したい

# GAEでタスクキュー呼び出し

## キューを設定する側
### 普通にパラメータ渡しの場合

```java
String QUEUE_URL = "/callback/url";
String paramValue = "parameterValueYouWantToSend";

TaskOptions taskOptions =  
        TaskOptions.Builder.withUrl(QUEUE_URL)
                .param("SOME_PARM_NAME", paramValue)
                .method(TaskOptions.Method.POST);
Queue taskQueue = QueueFactory.getDefaultQueue();
taskQueue.add(taskOptions);
```

### JSONで渡したい場合

```java
String QUEUE_URL = "/callback/url";
JSONObject json = new JSONObject();
json.put("someKey", "jsonValue");

TaskOptions taskOptions =  
        TaskOptions.Builder.withUrl(QUEUE_URL)
                .payload(json.toString())
                .method(TaskOptions.Method.POST)
                .header("Content-type", "application/json");
Queue taskQueue = QueueFactory.getDefaultQueue();
taskQueue.add(taskOptions);
```

### 注意点
- paramとpayloadはどちらかしか指定できない
- jsonを送る時は"Content-type"も指定してあげること

## 一応受け取る側も

### パラメータで受ける

```java
String paramValue = asString("SOME_PARM_NAME");
```

### JSONで受ける

```java
String body = getRequestBody(request);
JSONObject json = new JSONObject(body);
```
※ getRequestBodyはrequestのinputStreamからチマチマデータを読み取ってるメソッドを別に用意しているだけです。

## 参考URL

[java - App Engine - How to passe JSON to Queue - Stack Overflow](http://stackoverflow.com/questions/28016079/app-engine-how-to-passe-json-to-queue)
Go言語でSensuのCLI「ohgi」を作った


最近話題のGo言語の勉強も兼ねて，sensu-apiを叩くCLIを作ってみました．

## 名前の由来

`sensu`(扇子)に関連する単語ということで，`kaname`(要)や`yoichi`(与一)が候補でした．
GitHubに同名リポジトリが無いということで，`ohgi`(扇)にしました．

## 作ったきっかけ

既にRuby製の[agent462/sensu-cli](https://github.com/agent462/sensu-cli)があります．
ただ，表示の情報量が多く，見難いと感じていました．

![sensu-cli.png](https://qiita-image-store.s3.amazonaws.com/0/58742/aa574512-6a40-77aa-5b3b-4a2c8a3186d7.png "sensu-cli.png")

そこで，シンプルな表示で，高速に動作するものを作ることにしました．
表示形式やコマンドは，[Uchiwa](https://uchiwa.io/)を参考にしています．

## コマンド構成

Goでコマンドを作るために，[spf13/cobra](https://github.com/spf13/cobra)を使いました．
[spf13/pflag](https://github.com/spf13/pflag)でフラグが使えたり，`help`を生成してくれたりして便利です．

文字列の結合は「[Goの文字列結合のパフォーマンス - Qiita](http://qiita.com/ono_matope/items/d5e70d8a9ff2b54d5c37)」を参考に，`[]byte`と`append`で行っています．

`aggregates`以外のsensu-apiは一通り叩けるようにしています．
`stashes`は`silence`コマンドとして，機能を制限して実装しました．

```
Sensu command-line tool by golang
https://github.com/hico-horiuchi/ohgi

Usage:
  ohgi [command]

Available Commands:
  checks [check]               Returns the list of checks
  request [check] [subscriber] Issues a check execution request
  clients [client]             Returns the list of clients
  history [client]             Returns the client history
  events [client] [check]      List and resolve current events
  resolve [client] [check]     Resolves an event (delayed action)
  health                       Returns the API info
  info                         Returns the API info
  silence [client] [check]     Returns a list of silences
  version                      Print git revision of ohgi
  help [command]               Help about any command

Use "ohgi help [command]" for more information about that command.
```

## v0.1.0

![ohgi.png](https://qiita-image-store.s3.amazonaws.com/0/58742/01fbc833-be27-e13e-0d3b-1627976da4c8.png "ohgi.png")

ソースコードとバイナリ(darwin，linux)はGitHubで公開しています．
Windowsでも動作しますが，CygwinやMingwが必要です．
(コマンドプロンプトでは，カラーコードを処理できない．)

  - [hico-horiuchi/ohgi](https://github.com/hico-horiuchi/ohgi)

ぜひ使って頂いて，IssueやPullRequestをお願いします!

## これから

Sensuのメーリスで布教したり(もちろん英語)，Sensuの勉強会があれば発表したりしたいです．
sensu-apiは仕様が変わったりするので追従したり，コマンドの追加を頑張りたいです．
ubuntuにgradleをインストールする方法

## 概要
ubuntuにgradleコマンドをインストールする方法．  
## 手順
 1. gradleのダウンロード  
  [gradleのホームページ](http://gradle.org/installation)に行き、右にあるDownloadをクリック．(2015/02/23時点では最新は2.3)
 2. 解凍してパスを通す  
  <pre>
  $ unzip gradle-2.3-all.zip
  $ cp -r gradle-2.3 ~/local/bin
  $ export PATH=$PATH:~/local/bin/gradle-2.3/bin
  </pre>
 3. 実行
 <pre>
 $ gradle -v
 ------------------------------------------------------------
 Gradle 2.3
 ------------------------------------------------------------
 Build time:   2015-02-16 05:09:33 UTC 
 Build number: none
 Revision:     586be72bf6e3df1ee7676d1f2a3afd9157341274
 Groovy:       2.3.9
 Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
 JVM:          1.7.0_75 (Oracle Corporation 24.75-b04)
 OS:           Linux 3.2.0-76-generic amd64
 </pre>

## Update方法
最新版が出たら、上記の手順を1からおこなう。
rspecがto respond to `has_tag?`とかto respond to `has_form?`でて失敗するようになった時の対処



```
 Failure/Error: it { is_expected.to have_tag('a[data-role=button]', text: name) }
       expected <a href="/" data-role="button">リンク名</a> to respond to `has_tag?`
```

とか

```
to respond to `has_form?`
```

みたいなエラーがでるようになった。

[rspec-html-matchers](https://github.com/kucaahbe/rspec-html-matchers)を0.7にすると出るようになったみたいだ。
`spec_helper.rb`に

```
config.include RSpecHtmlMatchers
```

を書き加えた。

```
describe "my view spec" do
  include RSpecHtmlMatchers

  it "has tags" do
    expect(rendered).to have_tag('div')
  end

end
```

のように特定の範囲だけ有効にすることもできるようになったようだ。
QiitaクローンのLodgeを立てる

# Lodgeとは？
LodgeはRailsで作られたQiitaのクローンです。プライベートな情報共有ツールとしてQiitaのようなものを構築したいときにぴったりです。まだ開発途中といった感じですが今後の進展に期待して導入してみました。
[Lodge](https://github.com/lodge/lodge)

# インストール手順

```bash
$ git clone https://github.com/lodge/lodge.git
$ cd lodge/
$ gem install bundler
$ bundle install --path vendor/bundle
$ bundle exec rake db:create RAILS_ENV=production
$ bundle exec rake db:migrate RAILS_ENV=production
```

## メール送信設定
Gmailをメール送信に利用する場合.envにユーザ名とパスワードを記述しますが、アカウント認証時にエラーが発生する場合があります。ログに以下のような行が出力されています。

```text
F, [2015-02-20T20:04:10.451031 #32645] FATAL -- : 
Net::SMTPAuthenticationError (534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=
):
  app/models/user.rb:70:in `find_for_google_oauth2'
  app/controllers/custom_devise/omniauth_callbacks_controller.rb:4:in `google_oauth2'
  config/initializers/quiet_assets.rb:6:in `call_with_quiet_assets'
```

このような場合は少しめんどうですが、アカウントの二段階認証の設定をすることでエラーを回避できます。
エラーメッセージにあるように`https://accounts.google.com/ContinueSignIn?`にアクセスして二段階認証を有効にしてください。

## Google OAuth2の設定
LodgeにはGoogleのOAuth2を利用して認証する機能があります。
まだ公式なドキュメントがないのであっているかわかりませんがひとまず認証に成功したので、その方法を記しておきます。

### Google Developers Console
#### Google API
[APIと認証]->[API]を選択し、Google+ APIを有効化します。

#### APIキー取得
[APIと認証]->[認証情報]を選択します。
lodge.example.comにLodgeが立っていると仮定すると

[承認済みの JAVASCRIPT 生成元]に``http://lodge.example.com``
[承認済みのリダイレクト URI]に``http://lodge.example.com/users/auth/google_oauth2/callback``

を指定する。しばらくするとクライアントIDとクライアントシークレットが発行されるのでこれを.envの``GOOGLE_CLIENT_ID``と``GOOGLE_CLIENT_SECRET``に記述します。
Railsで曜日の日本語表記を返すやつ

デフォルトでは無さそうな感じだったのでlocaleを使ってDateを拡張

```rb

class Date
  def wday_i18n
    I18n.t("date.abbr_day_names")[self.wday]
  end
end

```

こちらを参考にさせて頂きました。
http://qiita.com/hisa0507/items/8209448f1e3e20b96b52
複数のCaboChaファイルを個別に ChaKi.NET ファイルで読み込める sqlite db ファイルに変換する

コマンドプロンプトを開く

- SJIS ファイルに対する整形

```bat
for %F in (*.cabocha) do "c:\Program Files\NAIST\ChaKi.NET\CreateCorpusSLA.exe" -e=SHIFT_JIS -C %F %~nF.db
```


- UTF-8 ファイルに対する整形

```bat
for %F in (*.cabocha) do "c:\Program Files\NAIST\ChaKi.NET\CreateCorpusSLA.exe" -e=UTF8 -C %F %~nF.db
```

---
そもそも複数の CaboChaファイルを作成する方法

```bat
for %f in (*.txt) do "c:\Program Files (x86)\CaboCha\bin\cabocha.exe" -f1 %F > %~nF.cabocha
```