OmniAICreator/Qiita-1.07M huggingface dataset:
XMAPPでの状況でFuelPHPをWindows環境にインストール(手抜き版)

FuelPHPをWindows環境に設定するための
とりあえずのてっとり早くFuelPHPを使いたいための手順
そのため、開発環境のみの動作確認のみの使用を考えてのインストール

#環境#
こんな環境の元に行っています。

|OS        | windows7 | 
|----------|----------|
|XMAPP     | v3.1.2   |
|FuelPHP   |  v1.7.2  |
|XMAPPフォルダ | C:\xampp |


#FuelPHPのダウンロード#
「Download」ボタンでダウンロード開始

![WS_2015-03-10_021.JPG](https://qiita-image-store.s3.amazonaws.com/0/61019/1c236df1-75ed-683b-c27b-cdeae40f0e19.jpeg)

「fuelphp-1.7.2.zip」がダウンロードされる

解凍したら解凍したフォルダ毎XMAPPフォルダの下に移動
（フォルダ名が「fuelphp-1.7.2」でもいいけど「fuelphp」にリネームする）
![WS_2015-03-10_031.JPG](https://qiita-image-store.s3.amazonaws.com/0/61019/7b00c971-8c91-71b6-e8d3-a25ac44c30f5.jpeg)


fuelphpの配下はこんな感じで配置されているはず
![WS_2015-03-10_033.JPG](https://qiita-image-store.s3.amazonaws.com/0/61019/55060660-7177-a24d-617b-539c2a14f46f.jpeg)



#パスの設定#
本来は　\apache\conf\extra　の配下のConfファイルをいじってパスの設定を
しなきゃならないけど、てっとり早く動かしたいので
DOSコマンドでショートカット（シンボリックリンクの作成）を行う

```:dosコマンド
cd C:\xampp\htdocs
mklink /d fuelphp "C:\xampp\fuelphp\public"
```


#Welcomの表示#
apacheを再起動してwelcomページのアドレスを打って表示されればＯＫ

http://localhost/fuelphp/welcome/

![WS_2015-03-10_028.JPG](https://qiita-image-store.s3.amazonaws.com/0/61019/6f8076d6-c499-703d-c0d1-326642e89860.jpeg)


ちなみにですがこのWelcomページは
[fuelphpルート]\fuel\app\views\welcome\index.php
[fuelphpルート]\fuel\app\classes\controller\welcome.php
(今回だと　C:\xampp\fuelphp\fuel\app\views\welcome\index.php
　　　　　C:\xampp\fuelphp\fuel\app\classes\controller\welcome.php）
ページの内容が表示されています、
ここら辺のフォルダとかFuelPHPのルール等は別途検索して下さい

#最後に#
今回のパターンはとりあえずFuelPHPのWelcomページを表示する目的のみなので
他の参考にさせて頂いた方のページを見ると、手順を思いっきり抜いている（例えばcomposerのアップデートとか）
たぶんですが、実際に開発を始めると足りな部分が大量に出てくると思います。

*****

参考：[FuelPHPをWindows環境にインストール(publicディレクトリのみ公開ディレクトリにする設定)](http://qiita.com/re-24/items/12ec40bbc90793a29f5c)


参考：[htdocs配下にソースおかなくても実行できるようにする](http://qiita.com/re-24/items/746c2e3a4dfdf4327da8)
Embulkでタスクを処理するスレッドの数を変更する方法

タスクを処理するスレッドの数を変更するには、システムプロパティで

```
-Dembulk.max_threads=1
```

のように指定すれば良い模様。

```
>set JAVA_TOOL_OPTIONS=-Dembulk.max_threads=1

>embulk run -I lib config.yml
Picked up JAVA_TOOL_OPTIONS: -Dembulk.max_threads=1
2015-03-11 14:14:30.523 +0900: Embulk v0.5.1
2015-03-11 14:14:33.959 +0900 [INFO] (transaction): {done:  0 / 4, running: 0}
2015-03-11 14:14:33.990 +0900 [INFO] (task-0000): Task #0 is running...
John,10
John,30
2015-03-11 14:14:37.178 +0900 [INFO] (transaction): {done:  1 / 4, running: 0}
2015-03-11 14:14:37.178 +0900 [INFO] (task-0001): Task #1 is running...
Jane,5
Jane,100
2015-03-11 14:14:40.180 +0900 [INFO] (transaction): {done:  2 / 4, running: 0}
2015-03-11 14:14:40.182 +0900 [INFO] (task-0002): Task #2 is running...
Tom,200
Tom,80
2015-03-11 14:14:43.184 +0900 [INFO] (transaction): {done:  3 / 4, running: 0}
2015-03-11 14:14:43.186 +0900 [INFO] (task-0003): Task #3 is running...
Mary,20
Mary,50
2015-03-11 14:14:46.188 +0900 [INFO] (transaction): {done:  4 / 4, running: 0}
2015-03-11 14:14:46.268 +0900 [INFO] (main): Committed.
2015-03-11 14:14:46.268 +0900 [INFO] (main): Next config diff: {"in":{},"out":{}}

>set JAVA_TOOL_OPTIONS=-Dembulk.max_threads=4

>embulk run -I lib config.yml
Picked up JAVA_TOOL_OPTIONS: -Dembulk.max_threads=4
2015-03-11 14:15:10.892 +0900: Embulk v0.5.1
2015-03-11 14:15:14.044 +0900 [INFO] (transaction): {done:  0 / 4, running: 0}
2015-03-11 14:15:14.085 +0900 [INFO] (task-0001): Task #1 is running...
2015-03-11 14:15:14.085 +0900 [INFO] (task-0002): Task #2 is running...
2015-03-11 14:15:14.085 +0900 [INFO] (task-0003): Task #3 is running...
2015-03-11 14:15:14.085 +0900 [INFO] (task-0000): Task #0 is running...
Tom,200
John,10
John,30
Jane,5
Jane,100
Mary,20
Mary,50
Tom,80
2015-03-11 14:15:17.348 +0900 [INFO] (transaction): {done:  4 / 4, running: 0}
2015-03-11 14:15:17.349 +0900 [INFO] (transaction): {done:  4 / 4, running: 0}
2015-03-11 14:15:17.350 +0900 [INFO] (transaction): {done:  4 / 4, running: 0}
2015-03-11 14:15:17.350 +0900 [INFO] (transaction): {done:  4 / 4, running: 0}
2015-03-11 14:15:17.377 +0900 [INFO] (main): Committed.
2015-03-11 14:15:17.377 +0900 [INFO] (main): Next config diff: {"in":{},"out":{}
}
```

# 参考資料

* [LocalExecutor.java](https://github.com/embulk/embulk/blob/v0.5.1/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java#L78)
* [Runner.java](https://github.com/embulk/embulk/blob/v0.5.1/embulk-core/src/main/java/org/embulk/command/Runner.java#L64)
* [ConfigLoader.java](https://github.com/embulk/embulk/blob/v0.5.1/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java#L43)
RubyとJavaのオブジェクト指向関連の単語の対応表(メモ)

RubyとJavaのオブジェクト指向関連の単語の対応表をメモ書き程度にまとめてみます。
※Rubyの勉強がてらまとめているので、正確さは保証できません。

|Ruby|Java|
|:-----------|:------------|
|initializeメソッド|コンストラクタ|
|インスタンス変数|フィールド|
|インスタンスメソッド|メソッド|
|writer|setter|
|reader|getter|
|accessor|setter+getter|
|self|this|
|クラスメソッド|静的メソッド|
|定数|final付きフィールド|
|クラス変数|静的フィールド|
|モジュール|静的フィールドや静的メソッドのみのfinal付きクラス<br>インターフェイス|
UnityでInputfieldを使う方法（値の取り出し方）【UnityScript】【uGUI】【覚え書き】

#Unity 4.6にて、InputFieldの値を取り出す方法
Unityを初めて半年と経たない自分が書いた物です、間違いがあったら指摘して頂ければ幸いです


InputFieldの使い方、等のキーワードで調べた時に
出て来たコードでは

変数:InputFiled
でインプットフィールドを入れる変数を作成して型を決めて

変数名.valueで取り出していたのですが
自分の所でやってみたところ

BCE0019エラーが出ました。
（原因がバージョンの違いか、何なのかはわかりませんが）
内容は
value is not a member of 'UnityEngine.UI.InputField'
valueはUnityengine UIのインプットフィールドのメンバーではないですとの事で・・・
Valueにしてみたり色々試してみても分からない
動作する方法に辿り着いたのは偶然にも
とりあえず思いつく方法全て適当でもやってみよう。という事で試した中の一つに正解がありました。
最終的に動作したのは
変数名.valueから変数名.textという形です。

自分の所で使用したスクリプトは下に書いて置きます
下のスクリプト使用時の
　シーン構成は
Maincamera
▽canvas
　　テキスト
　▽ボタン
　▽インプットフィールド
EventSystem

で
流れはボタンがクリックされたときに
変数の内容をテキストに反映
という形になっています
以下　自分の所で使用したスクリプト丸コピー


```change.js
#pragma strict

 import UnityEngine.UI;
var messageText:Text;
var inputField:InputField;
 
function Start () {}
 
function Update () {}
 
function OnClickButton() {
messageText.text=inputField.text;
}
```
FRP でスムーススクロールするモジュール書いてみる。


モジュールはこんな感じ:

```javascript:control.js
'use strict';

import K from 'kefir';
import T from 'tween.js';

let d = global.document;

export let animationFrame = K.fromBinder((emitter) => {
  let step = (timestamp) => {
    global.requestAnimationFrame(step);
    T.update(timestamp);
    emitter.emit(timestamp);
  };
  global.requestAnimationFrame(step);
});

export let mousewheel = K.fromEvent(global, 'wheel');
export let wheelDeltaY = mousewheel.map((ev) => ev.deltaY);
export let scrollTop = wheelDeltaY.map((delta) => d.body.scrollTop + delta);

export let noop = () => true;

export let preventDefault = (ev) => {
  ev.preventDefault();
  return false;
};

export let applySmoothScroll = () => {
  let throttledWheelDeltaY = wheelDeltaY.throttle(300);

  animationFrame.onValue(noop);
  mousewheel.onValue(preventDefault);

  throttledWheelDeltaY.onValue((delta) => {
    let t = new T.Tween({ scrollTop: d.body.scrollTop })
      .to({ scrollTop: d.body.scrollTop + (delta * 0.6) }, 300)
      .easing(T.Easing.Linear.None)
      .onUpdate(function () { global.scroll(0, this.scrollTop); });
    t.start();
  });
};
```

スムーススクロールを実行するには次のようなコードを実行する:

```javascript
import control from './control'
control.applySmoothScroll();
```

そもそもスムーススクロールの実装の考え方がこれで良いのか分からないけど、FRP で書くと、一つの事だけをやるモジュールを簡単に組み合わせられて、再利用性が向上するなーと思った。

まだまだ、サクサク書ける感じじゃないけど、書いていてとても楽しい。
Perlワンライナー

仕事でたまに使うワンライナー。
シェルスクリプトの中から、サクッと使えて便利！


Base64エンコード
```Perl
perl -MMIME::Base64 -le 'print encode_base64(`cat $ARGV[0]`, " ")' /tmp/FILE > /tmp/FILE.base64
```
Base64デコード
```Perl
perl -MMIME::Base64 -le 'print decode_base64(`cat $ARGV[0]`)' /tmp/FILE.base64
```

マイクロ秒スリープ
```Perl
perl -e 'use Time::HiRes qw(usleep); my $microseconds = 1500000; usleep( $microseconds);'
```
GitHubからhookをjenkinsで受け取る設定ではまった箇所

ネットで「github jenkins 連携」等検索すると、webhookを使ってjenkinsのjobを実行させれば良いという記事がいくつかあります。
　
　
・githubの設定
webhook でjenkinsのパラメータ付き実行のurlを設定
http://<host>/job/<jobname>/buildWithParameters?token=hogehoge


・jenkinsの設定
ビルドパラメータにpayloadを設定
　
　
これを設定した後にjenkinsからshell実行し、そこでecho $payloadしてもpayloadは取得出来ませんでした。
　
そこで、webhook経由ではなく、servicehookからJenkinsのGitHub pluginを指定して再度実行したらところpayloadが取得できました。
同じように困っている人は一度試してみると良いかもしれません。
[Mac OS X]Eclipseの調子が悪い時にまず試すこと

いつも忘れるのでメモ。

Eclipseを終了させ、以下を実施し再起動すればOK。

```sh
rm -f ~/.android/ddms.cfg
rm -rf ~/.android/cache
```

> [Eclipse hangs at the Android SDK Content Loader - Stack Overflow](http://stackoverflow.com/questions/13489141/eclipse-hangs-at-the-android-sdk-content-loader)
AzureのManagement Certificates（管理証明書）をopensslコマンドで作る

公式だと[WindowsでVisual Studioを使って作る方法](https://msdn.microsoft.com/en-us/library/azure/gg551722.aspx)しか見つからず、`openssl`の例も海外のブログみたいなので見つけたりしたものの、情報が古いのか上手く行かなかった。

試行錯誤の末通ったのがコチラ

```shell-session
openssl req -x509 -nodes -newkey rsa:2048 -keyout ~/.ssh/azure.pem -out ~/.ssh/azure.pem
openssl x509 -inform pem -in ~/.ssh/azure.pem -outform der -out ~/.ssh/azure.cer
````

二行目でできあがる`azure.cer`を`設定`→`管理証明書`からアップロードしてあげればOK。

`-outform der`の辺りが今まで全く馴染みがなくてちょっとハマった…
Mackerelで退役したホストを再登録する

退役させたものの、何らかの理由で再度Mackerelのモニタリング対象にする場合の手順です。

通常、そのままMackerel Agentを再起動しても再登録することができません。これは、Mackerelがホストから伝えられる `hostId` を基に個体を識別しているからです。

rootユーザで以下の通りに実施すると `hostId` がリセットされ、再登録可能となります。

```bash
service mackerel-agent stop
ps auxwwf | grep mackerel   # Mackerel Agent が停止していることを確認
cd /var/lib/mackerel-agent
mv id /tmp/
service mackerel-agent start
diff -su /tmp/id id   # 違うと出ていればリセット成功
```
おためしください。


### 参考資料

- Source: [mackerel-agent/config/config_linux.go](https://github.com/mackerelio/mackerel-agent/blob/master/config/config_linux.go)
    - `hostId` がデフォルトでどのディレクトリに保存しているかを定義しています。
    - 他のプラットフォームは、同じディレクトリにある `config_[PLATFORMNAME].go` を参照して下さい。
Zabbix2.4.3メモ


## 用語

### アイテム

監視項目。プロセス監視、ログ監視などが該当。


### アプリケーション

アイテムをグルーピングするためのもの。


### トリガー

任意の条件に基づいて、障害発生、復旧したというイベントを発生させるもの。


### アクション

任意の条件に基づいて、コマンド実行、メッセージ送信を行うもの。


#### アクション設定例

※1行目は件名

```
【インシデント発生連絡】インシデントNo.{EVENT.ID} {HOST.NAME}で{TRIGGER.NAME}が発生

インシデントチケットを発行します。

インシデントNo：{EVENT.ID}
発見日時：{DATE} {TIME}
ホスト名：{HOST.NAME}
ホストIP：{HOST.IP}
ホストグループ：{TRIGGER.HOSTGROUP.NAME}
監視項目名：{ITEM.NAME1}
監視対象：{ITEM.KEY1}
検知内容：
{ITEM.VALUE1}
```


## トリガーで使える論理演算子

2.2のマニュアルでは `&`, `|` だが2.4では `and`, `or`になっている。いつから変わったか不明

https://www.zabbix.com/documentation/2.2/manual/config/triggers/expression
https://www.zabbix.com/documentation/2.4/manual/config/triggers/expression


## メール通知が来ない

メール送信先のユーザーグループが、アイテムで監視しているホストに対して読み取り権限以上を持っていること


## multilogで出力しているログファイル監視

アイテムのキーをlogrtにして以下のように書く。

```
logrt[/path/to/log/(current|^@.+)]
```
imagemagick 自分用逆引きメモ


## 複数の画像を、並べた一枚の画像にする
```console:
$ montage -tile 2x2 *.png dest.png
```

### montage
複数の画像を一括処理するimagemagickのコマンド

### -tile 2x2
横2 縦2 に並べる


## 複数の画像を連結する(ついでに間も開ける)
```console:
$ convert +append -border 30x30  src-*.png out.png
```

### 意味
src-0.png src-1.png とある元画像を、水平方向に上下左右に30の余白を開けて連結して、out.pngとして出力


## 並べられた画像を、等間隔に分割した個別の画像にする
```console:
$ convert -crop 24x24 src.png dest.png
```

### 意味
src.png を横24縦24ごとに切り出してdest-0.png dest-1.pngというように出力する

### -crop 24x24
横24縦24ごとに画像を切り出す。元画像が24の倍数だったらその数分切り出してくれる


## エラー montage: unable to read font `(null)'

### 原因
よくわからない

### 解決方法
```
$ brew install ghostscript
```
Composerのインストールの際ハマったところ


下記のURLを参考にしていたところ、下記エラーが発生しました。

http://yoshidashingo.hatenablog.com/entry/2014/08/31/170333

```
OOO:aws-php-sample OOO$ curl -sS https://getcomposer.org/installer | php
#!/usr/bin/env php
Some settings on your machine make Composer unable to work properly.
Make sure that you fix the issues listed below and run this script again:

The openssl extension is missing, which means that secure HTTPS transfers are impossible.
If possible you should enable it or recompile php with --with-openssl
```

下記の使用しているphp.verが5.4なので、
php54-opensslをインストールして、改善できました。

```
sudo port install php54-openssl
```
socket.io で http proxy を使う

## socket.io-proxy

[ymx/socket.io-proxy](https://github.com/ymx/socket.io-proxy "ymx/socket.io-proxy")

いろいろ手を入れてみたけど socket.io-client に依存しているのが微妙な感じだった。socket.io-client のバージョンが固定されてしまう。

## tunnel

[koichik/node-tunnel](https://github.com/koichik/node-tunnel "koichik/node-tunnel")

node v0.11 対応されているみたい ([WIP: Added support for node v0.11 · 95e7b0c · koichik/node-tunnel](https://github.com/koichik/node-tunnel/commit/95e7b0c2c2486583c886d182284ef3b38326d9f0 "WIP: Added support for node v0.11 · 95e7b0c · koichik/node-tunnel")) だけど、手元の環境では addRequest のパラメーターの受け取り方が古いっぽくて、うまく動かない。

## tunnel-agent

[mikeal/tunnel-agent](https://github.com/mikeal/tunnel-agent "mikeal/tunnel-agent")

[npm + node V0.11.x does not work behind proxy · Issue #4569 · npm/npm](https://github.com/npm/npm/issues/4569 "npm + node V0.11.x does not work behind proxy · Issue #4569 · npm/npm")

addRequest のパラメーターの受け取り方も node v0.11.x に対応していていい感じだった。

## その他メモ

- node.js の http には http.Agent という仕組みがあって、プロキシにリクエストしてくれるエージェントを生成してくれるのが tunnel と tunnel-agent
- socket.io/engine.io はコンストラクタの第二引数のオプションに上記のエージェントを指定できる
- [HTTP proxy support with Node.js · Issue #192 · Automattic/engine.io-client](https://github.com/Automattic/engine.io-client/issues/192 "HTTP proxy support with Node.js · Issue #192 · Automattic/engine.io-client")
【wordpress】特定の一覧ページだけ全件表示にする方法

##はじめに
wordpressの記事の表示件数は指定がなければ基本的に管理画面で設定している表示件数が反映されます。

明示的に`query_posts`を呼び出す場合はよいのですが、カテゴリページなどのアーカイブ系ページだとわざわざテンプレ内で再度`query_posts( $query_string.'&posts_per_page=-1' );`なんて記述をする必要がでてくると思います。





##なんとなくもやっとする

wordpress側がURLを判別して記事を取得してくれているので、個人的に再度`query_posts`を呼び出すのはもやっとします。

あとテンプレごとに書くので管理もしにくい（はず


##たぶんスマート

いろいろ調べてたどりついたのがこれです。

```php:functions.php
function set_nopaging($query) {
    if (!is_admin() && $query->is_main_query() && is_category()) {
        $query->set('nopaging', 1);
    }
}
add_action('pre_get_posts', 'set_nopaging');
```

こちらはカテゴリページのみ全件表示する場合です。

他の一覧で全件表示したい場合は2行目のif文の中身を`if (!is_admin() && $query->is_main_query() && is_year()) {`とかに変えてもらえれば対応できます。
　

* nopaging

恥ずかしながら、つい先日まで知らなかったパラメータです///
といっても`posts_per_page=-1`と意味合いは一緒のようです。

明示的にわかりやすいので、今後は`nopaging=1`を使っていこうと思います。


#まとめ
個人的にこういうスマートに書ける方法が見つかるとテンションが上がります。
コードも見やすくなりますしねｗ

最後に全件取得はあまり件数が多すぎると処理が重くなったり、サーバに負荷をかけてしまうので、そのあたりは注意が必要ですね。
RubygemsのDevelopment Kitのインストール方法

Rubygems(Rubyのパッケージ管理システム)をWindowsで使うにはDevelopment Kitが必要なので、そのインストール方法をまとめたいと思います。
※この記事では、[RubyInstaller for Windows](http://rubyinstaller.org/)でRubyをインストールしてある状態を前提として話を進めていきます。

1. http://rubyinstaller.org/downloads/ より、Development Kitをダウンロードします。<br>
※ダウンロードリンクがページ下部にあり、また、インストールしたRubyのバージョンやPCのビット数によってダウンロードするファイルが違うので注意してください。
2. ダウンロードしたファイルを実行し、ファイルを展開します。<br>
※この際、展開先のフォルダのパスに日本語が含まれると後の手順でうまくいかなくなるので注意してください。
4. 管理者権限でコマンドプロンプトを起動します。
5. `cd {展開先のフォルダ}`コマンドを実行し、展開先のフォルダに移ります。
6. `ruby dk.rb init`コマンドを実行し、Development Kitの初期化を行います。
7. `ruby dk.rb install`コマンドを実行し、Development Kitをインストールします。
iOS8.0前後のPush通知のId登録部分の実装


久しぶりにアプリをデバッグしたら通知が来なくなっていた。原因はiOS8.0以上から、呼び出すメソッドが変わったため。
以下のようにするとDeviceTokenを取得するところまで動いた。

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

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Push通知用のIdをAPNSに要求
    if ([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)
    {
        /// iOS7 以前のプッシュ通知の登録
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
    } else {
        /// iOS8 移行のプッシュ通知の登録
        UIUserNotificationType types = UIUserNotificationTypeBadge |  UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
        UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
    }

    return YES;
}

// デバイストークンを受信した際の処理 プッシュ通知許可して良いかの画面でOKが押下された場合に呼び出されるデリゲートメソッド
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSLog(@"DevideToken (%@)", tokenId);
}

// iOS8.0以降だとregisterした後コレも呼ばれる
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    //register to receive notifications
    [application registerForRemoteNotifications];
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    // 取得エラーの原因がシミュレーターによるものだった場合なにもしない
    if(error.code == 3010) {
        NSLog(@"Fail Regist to APNS by Simulator.");
        return;
    }

    NSLog(@"Error : Fail Regist to APNS. (%@)", error);
}

```

## 参考サイト
* APNS - iOS8からのプッシュ通知 - Qiita http://qiita.com/FumitakaYamada/items/c394cc991d6f863b56fa
* objective c - Remote Notification iOS 8 - Stack Overflow http://stackoverflow.com/questions/24216632/remote-notification-ios-8
* apple push notifications - APNS Integration 3010 error - Stack Overflow http://stackoverflow.com/questions/23880761/apns-integration-3010-error
【PHP】タイプヒンティング


##これ何？
パラメータの型を指定できる。

指定できる型は、オブジェクト、インターフェイス、配列、callable(PHP5.4以降)。クラスや、インターフェイスを指定した場合、その子クラスや実装クラスも利用できる。

**スカラー型（intやstringやbool）は使えない。**


##具体例

###1.array
array以外を渡すとエラー。

```php
function type_test(array $array){	
}

//タイプヒントがarrayなのに、パラメータがint型なのでエラー。
type_test(1);
//=>Catchable fatal error:Argument 1 passed to type_test() must be of the type array, integer given
```

###2.オブジェクト
タイプヒントとパラメータのクラスの型が違うとエラー。

```php
Class MyClass{
}

Class OtherClass{
}

function type_test(MyClass $class){
}

//タイプヒントがMyClassなのでこれはOK
type_test(new MyClass);

//タイプヒントとパラメータのクラスの型が違うのでエラー
type_test(new OtherClass);
//=>Catchable fatal error: Argument 1 passed to type_test() must be an instance of MyClass, instance of OtherClass given,
```

タイプヒントが親クラス、パラメータが子クラスでもでもOK。

```php
Class MyClass{
}

Class ChildOfMyClass extends MyClass{
}

function type_test(MyClass $class){
}

//OK
type_test(new ChildOfMyClass);
```

###3.インターフェイス
タイプヒントとパラメータのインターフェイス先の型が違うとエラー。

```php
interface MyInterface{
}

Class MyClass implements MyInterface{
}

Class OtherClass{
}

function type_test(MyInterface $class){
}

//これはOK
type_test(new MyClass);

//タイプヒントとパラメータのインターフェイス先の型が違うのでエラー
type_test(new OtherClass);
//=>Catchable fatal error: Argument 1 passed to type_test() must implement interface MyInterface, instance of OtherClass given,
```

###4.callable
少しわかりづらいけど、コールバック可能な、つまり、存在する関数でないとエラーになる。

```php
function func(){
}

function type_test(callable $func){
}

//存在する関数なのでOK
type_test('func');

//存在しない関数なのでエラー。
type_test('not_exists_func');
//=>Catchable fatal error: Argument 1 passed to type_test() must be callable, string given
```

##メリットは？

* パラメータに何を渡したら良いかすぐにわかるので可読性が上がる。
* パラメータの型が保障される。パラメータの型が違うことが原因の不具合はすぐに検出できる。簡易的なパラメータチェック。
bootstrap3とeclipseを組み合わせて使うには？

プログラマー２年目です。

結論から言うと、
bootstrap3とeclipseを組み合わせて使うにはどうしたらいいでしょうか？

今IDEはeclipseを使っていてSeasar2(SAStrats/S2JDBC)をフレームワークに、
Javaで開発しています。

このプロジェクトにbootstrap3を組み込んでカッコイイWebページにしたいと思っています。


しかしWEB-INFの下にbootstrapディレクトリを置き、Actionクラスからこのディレクトリ内のindex.htmlを呼び出して、ブラウザで表示しても、cssが反映されていません。

どうしたらいいでしょうか。もし分かる方がいればお教えください。


現状としては
Actionクラスなどを介さず、bootstarapディレクトリ内のindex.htmlを直接起動すると、cssの反映された自分で実装したWebページが立ち上がるといった状況です。

Actionクラスから間接的に起動する際にもちゃんと反映されたwebページが起動できるようにしたいというのが要望です。


↓Seasar2プロジェクト階層構造

![スクリーンショット 2015-03-11 10.40.22 2.png](https://qiita-image-store.s3.amazonaws.com/0/60528/0f9af8e1-2e43-3a31-522a-335c1963ca57.png)
gradle + jacoco でカバレッジレポートを出力する


#前提

+ Gradle 2.3
+ (Android Studio 1.1.0)

# 設定追加

+ srcが含まれるディレクトリの build.gradle に下記を追記
+ とりあえずhtmlで出力できればいいので、`html.enabled = true` を指定
+ jacoco の `toolVersion` は[ここ](http://mvnrepository.com/artifact/org.jacoco/jacoco-maven-plugin)から選択

```:build.gradle
apply plugin: 'jacoco'

jacoco {
    toolVersion = "0.7.4.201502262128"
    reportsDir = file("$buildDir/customJacocoReportDir")
}

task jacoco(type: JacocoReport, dependsOn: "testDebug") {
    reports {
        xml.enabled = false
        html.enabled = true
        html {
            destination "${project.rootDir}/build/reports/jacoco/${project.name}"
        }
    }
    classDirectories = fileTree(
            dir: './build/intermediates/classes/debug',
            excludes: ['**/R.class',
                       '**/R$*.class',
                       '**/BuildConfig.class',
            ])
    sourceDirectories = files('src/main/java')
    executionData = files('build/jacoco/testDebug.exec')
}
```

# 実行

+ 下記コマンドで、destinationに指定したパスに、レポートが出力される。

```
 ./gradlew jacoco  
```
![スクリーンショット_2015-03-11_10_53_58.png](https://qiita-image-store.s3.amazonaws.com/0/31862/111e700f-2199-1f13-dc56-40d04a02838a.png)
iMac Retina 5K がどうにも重かった問題が解決した？


## 前置き

会社のマシンが iMac (Retina 5K, 27-inch, Late 2014) なわけだが、こいつが最近どうにも重くて「ぐぎぎ…！」って感じだったんだけど、環境設定のとあるオプションを変更したら幸せになれたので共有してみる。

最初は、文字入力がもたつくから「ATOK が悪さしてるのかなぁ？」とか、Google Chrome がメモリをバカ喰いしてるのが原因かなぁ？とか濡れ衣を掛けまくっていたが、どうやら違ったようだ。

## やったこと

__「透明度を下げる」__

これだけ。

## やりかた

![screenshot-01.png](https://qiita-image-store.s3.amazonaws.com/0/33086/a1b3a0eb-604c-0da0-2963-ea4d6dcc47b8.png "screenshot-01.png")

環境設定の「アクセシビリティ」からの〜

![screenshot-02.png](https://qiita-image-store.s3.amazonaws.com/0/33086/eb1e667d-a0df-9cda-ad07-0c8c5bcf2f4a.png "screenshot-02.png")

「ディスプレイ」の項目の「透明度を下げる」にチェックを付ける。

以上。
safari(iOS8.2)のCookieの挙動が変わった？


**3/11：追記
実行したサーバ側の不具合による挙動の可能性が高いため、再度確認次第、追記いたします。
申し訳ございません。**

iOSsafariのCookieの挙動を久しぶりに調べてみたら、変わっている気がしたので、備忘録的にあげておきます。

| 確認日 | 端末 | OSバージョン | Cookieをブロック |
|:------:|:----:|:----------:|:--------------:|
| 2015/03/11 | iPhone4S | 8.2(12D508) | 訪問したWebサイトを許可（デフォルト） |

## 確認方法
1.Safariの[履歴とWebサイトデータを消去]でCookieを削除
2.広告配信ページにアクセスし、広告をタップ
3.Cookie確認ページに、javascriptタグを仕込み、サーバ側でCookieを確認

上記手順でサーバ側のリクエストログを確認したところ、

``` request.log
XXX.XXX.XXX.XXX - - [11/Mar/2015:08:49:01 +0900] "GET /XXX/XXXXX HTTP/1.1" 204 0 "http://XXXX/mesure.html" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12D508 Safari/600.1.4" "XXX.XXX.XXX.XXX" "-"
```

一番最後の要素にCookie値が出力されるはずが、何も表示されない。
広告タップ時に、1stPartyになっているため、今までのsafariの挙動であれば、Cookieが書き込まれているはず。

確認のため、[Cookieをブロック]の状態を、[常に許可]に変更し、再度、Cookie確認ページにアクセスし、
サーバ側のログを確認したところ、Cookieが出力されず。

一度、[履歴とWebサイトデータを消去]でCookieを削除し、[常に許可]のまま、広告をタップし、Cookieを確認したところ、

``` request.log
XXX.XXX.XXX.XXX - - [11/Mar/2015:09:32:37 +0900] "GET /XXX/XXXXX HTTP/1.1" 204 0 "http://XXXX/mesure.html" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12D508 Safari/600.1.4" "125.30.174.128" "XXXX=000359B282E204FF2DEC25CD61626364; XXXX=4bb5ccbe-9964-42a8-9147-843b975f487e"
```

書き込まれていました。

この状態で、[Cookieをブロック]の状態を[訪問したWebサイトを許可]に変更し、サーバにアクセスしたところ、
Cookieが出力された。

## 考察

今までリダイレクトによって1stPartyになり、Cookieを書き込んでいたが、
ポリシーが変わり、リダイレクトによって1stPartyになっても、それはユーザーが訪問したWebサイトにならないため、
書き込まれなくなった可能性がある。

そうなると、Cookieにおける1stPartyと3rdPartyという概念自体が変わってきてしまうため、Web広告業界にとっては、割と大きな問題になります。

ほか2つの[Cookieをブロック]の状態の挙動確認と、いつから変わったのか、iPhone5,6での挙動、OSバージョンアップが起因の場合、それ以前のCookieデータは引き継いでいるのかなどの確認が必要そうです。

※ちなみに、iOSChromeだと問題ありませんでした。
Bootbox4.x.xで初期表示時にフォーカスがあたるボタンを変更する

#### 状況

Bootstrap用のモーダルダイアログライブラリ[bootbox](http://bootboxjs.com/)で確認ダイアログを表示するコードを書いていたのだが、初期表示ではOKボタンにフォーカスがあたっているのをキャンセルボタンにフォーカスがあたるよう変更してほしいという要望があった。

削除確認に使うダイアログなので、単純にリターンキーを押したら削除が実行されるのはまずいということだそうな。


#### bootboxで確認ダイアログを出すコード

```
var confirm = bootbox.confirm("削除します。よろしいですか？", function(result) {
    // OKならtrueに、Cancelならfalseになります
    if (result){
        console.log('OK');
    }
});
```

この通りconfirmメソッドを呼んでいるだけである。
bootboxのサンプルやドキュメントを見ても確認ダイアログでデフォルトのフォーカスを変更するオプションはないようだ。[^1]

そこでbootbox.jsを読むと、初期表示時のフォーカスは以下のコードで当てていることがわかった。

```
    dialog.on("shown.bs.modal", function() {
      dialog.find(".btn-primary:first").focus();
    });
```

つまりダイアログのボタンで一番最初にbtn-primaryのクラスが指定されているところにフォーカスがあたるのである。

よって確認ダイアログをconfrimメソッドではなくカスタムダイアログで表示するようにした。

### カスタムダイアログで書き直したコード

```
bootbox.dialog({
　　message: "削除します。よろしいですか？",
    title: "サンプル",
    buttons: {
        main: {
	     label: "削除しない",
             className: "btn-primary",
                 callback: function() {
                     console.log("削除しない");
                 }
             },
             danger: {
                 label: "削除する",
                 className: "btn-danger",
                 callback: function() {
                      console.log("削除する");
             }
       }
   }
});

```

これで単にリターンキーを押した場合は「削除しない」ボタンにフォーカスがあたっているので、「削除しない」ボタンが押された場合の動作をするようになった。

[^1]: [Change default focus for Confirm buttons?](https://github.com/makeusabrew/bootbox/issues/185)あたりの議論を読み返すとできるようになったと思えるのだがいまいちはっきりしない。
jenkins のタイトルタグを変更する

複数の jenkins を運用していて今見ている jenkins がどの環境のものなのか分かりづらいときにやった設定のメモ。

* Simple Theme プラグイン インストール
* 「Jenkins の管理」「システムの設定」「Theme」「URL of theme JS」に `/userContent/changeTitle.js` と入力
* $JENKINS_HOME/userContent/changeTitle.js に下記を書き込む


```javascript
window.addEventListener("load", function() {
  var title = document.querySelector('title')
  title.innerHTML = title.innerHTML.replace(/\[Jenkins\]/, '[ステージング環境 Jenkins]')
}, false)
```
関数型の勉強に役立つ書籍まとめ

関数型の勉強に役立つ書籍まとめ
=======

※随時追記します。

## 初心者向け

- おおまかに知りたい人はこれ。

[関数プログラミング実践入門 ──簡潔で、正しいコードを書くために](http://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E2%94%80%E2%94%80%E7%B0%A1%E6%BD%94%E3%81%A7%E3%80%81%E6%AD%A3%E3%81%97%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AB-WEB-PRESS-plus/dp/4774169269/ref=sr_1_2?ie=UTF8&qid=1426033552&sr=8-2&keywords=%E9%96%A2%E6%95%B0%E5%9E%8B)

- 関数型のエッセンスはHaskellを学ぶと分かりやすい。簡単な関数から、モ○ドという怖い言葉まで幅広く学べます。

[すごいHaskellたのしく学ぼう! ](http://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-Miran-Lipova%C4%8Da/dp/4274068854/ref=sr_1_1?ie=UTF8&qid=1426033597&sr=8-1&keywords=%E3%81%99%E3%81%94%E3%81%84haskell)

- 関数型に興味無くても、一度読んだ方が良い。どのようにプログラムを書き、テストを書くか等が網羅的に学べます。自然と関数型的な書き方が身につきます。

[プログラミングの基礎 (Computer Science Library)](http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E5%9F%BA%E7%A4%8E-Computer-Science-Library-%E6%B5%85%E4%BA%95/dp/4781911609/ref=pd_sim_b_23?ie=UTF8&refRID=0R5VXF9AMJ1H7WTSGV05)
Sublime Text でコマンドのパスを通す

Sublime Textにはテキストエディタ上でBuildコマンドを実行出来るようになっている。

node.jsのBuildコマンドはデフォルトでは入っていないので新規追加した所、そんなコマンドはないと言われた。
コマンドに書いたのは以下(実行環境はMac)

```node.sublime-build
{
    "cmd": ["node", "$file", "file_base_name"],
    "working_dir": "${project_path:${folder}}",
    "selector": "*.js"
}
```

Macのnode.jsはnodebrewを使っていたため、
デフォルトではパスが通っていない模様。

そこで以下を追記すると動きます。

`"path": "$HOME/.nodebrew/current/bin"`

nodeのコマンドの場所は適宜変更で。
SSHしてからファイルに追記しました

SSHして別のサーバーに入ってから、サーバー上のファイルにdiffのみを書き込みをしたい場合がありやってみました。

# SSHしてから追記したコマンド
コマンド例

```bash:SSHして追記した内容
ssh ホスト名 'echo 追記内容 >> 該当ファイル'
```

## 実際にファイルへ追記したコマンド
実際にexample.comのhoge.txtに追記したとすると以下の様になります。

```bash:SSHして追記した内容
ssh example.com 'echo hogehoge >> hoge.txt'
```
SSH先でhoge.txtファイルを表示します。

```bash:ファイルの中身を確認
ssh example.com
cat hoge.txt

hogehoge
```
ファイルへの書き込みがされていました。

# なぜ
しかしなぜこういう動きをするのかわからんマン(☝ ՞ਊ ՞)
ฅ(・ω・ฅ){ Sinatra + Heroku で Ruboty の Plugin の中からランダムで1つ選んでツイートする Web アプリケーションを作成 } #heroku #sinatra

## :tophat: 概要
Sinatra + Heroku で Ruboty の Plugin の中からランダムで1つ選んでツイートする Web アプリケーションを作成してみます

## :scroll: 仕様
### UseCase
* 「ガチャガチャ」を押すと、ランダムに1つの Ruboty Plugin gem を選び, ツイートボタンが表示される
* 結果は毎回変わる

## :trophy: 完成

### 初期表示
![ruboty-gacha0.png](https://qiita-image-store.s3.amazonaws.com/0/43480/88c01fb3-fe0e-0582-ceb1-7550122deb96.png)

### GachaGacha ボタン押下後
![ruboty-gacha1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/66519d6b-870c-60a8-4947-0f7f5ab2a743.png)

### ツイートボタン押下
![ruboty-gacha2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c16b4bdb-d393-d043-1ca3-60809abc30b6.png)

## :memo: メモ
とりあえず、疎通ということで雑に仕上げた

## :books: 外部資料
<i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty-gacha GitHub](https://github.com/tbpgr/ruboty-gacha)
Intel Edisonをスイッチサイエンス版Eagletに挿してCylon.jsでLチカする

Edison用の拡張基板にはMini Breakoutこと[Intel Edison Breakout Board Kit](https://www.switch-science.com/catalog/1957/)を使っていました。Lチカをしようと調べていると直接LEDをつないではいけないようです。EdisonのGPIOの電圧はArduinoのように5Vや3.3Vではなく1.8Vしかありません。この電圧レベルの信号ではLEDを光らせることはできないのでI2C通信用レベル変換をする必要がありますが、毎回変換モジュールを経由するのは面倒です。[スイッチサイエンス版Eaglet (MFTバージョン)](https://www.switch-science.com/catalog/2070/)はArdiono拡張基板と違いFRISKサイズを維持しながら3.3Vにレベル変換してくれます。Groveコネクタが付いているのもうれしいです。

## SSH接続

[前回](http://qiita.com/masato/items/cacdc479b41d7f1c5284)Edisonには無線LANの設定をしています。EdisonをEagletに挿してmicroUSBポートをUSB電源アダプタにつなぐだけでSSH接続できるようになります。DHCPから以下のIPアドレスが振られています。

``` bash
$ ssh root@192.168.1.14
```

## Cylon.js

Edisonアダプタのnpmパッケージは[cylon-intel-iot](https://github.com/hybridgroup/cylon-intel-iot)になります。

### コーディング

プロジェクトを作成します。

``` bash
$ mkdir -p ~/node_apps/led-blinking
$ cd !$
```

package.jsonにCylon.jsのEdison用アダプターを追加します。
 
``` json:~/node_apps/led-blinking/package.json
{
  "name": "led-blinking",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "cylon-intel-iot": "0.5.0"
  },
  "scripts": {"start": "node app.js"}
}
```

パッケージをインストールします。

``` bash
$ npm install
```

Node.jsのプログラムは[Cylon.js](http://cylonjs.com/documentation/platforms/edison/)のサンプルを使いますが、Eaglet用にピン番号を変更します。スイッチサイエンスの[C++でLED点滅](http://trac.switch-science.com/wiki/IntelEdisonBlinkCPlusPlus)のページにあるC++のコードを参考にすると、mraa番号は37を使えばよいみたいです。
 
``` js:~/node_apps/led-blinking/app.js
var Cylon = require('cylon');

Cylon.robot({
  connections: {
    edison: { adaptor: 'intel-iot' }
  },

  devices: {
    led: { driver: 'led', pin: 37 }
  },

  work: function(my) {
    every((1).second(), my.led.toggle);
  }
}).start();
```

### 電源ランプ兼D13をLチカ

プログラムを実行してLチカさせます。

``` bash
$ npm start

> led-blinking@0.0.1 start /home/root/node_apps/led-blinking
> node app.js

I, [2015-03-09T14:39:13.895Z]  INFO -- : [Robot 56633] - Initializing connections.
I, [2015-03-09T14:39:14.897Z]  INFO -- : [Robot 56633] - Initializing devices.
I, [2015-03-09T14:39:14.916Z]  INFO -- : [Robot 56633] - Starting connections.
I, [2015-03-09T14:39:14.924Z]  INFO -- : [Robot 56633] - Starting devices.
I, [2015-03-09T14:39:14.926Z]  INFO -- : [Robot 56633] - Working.
```
Railsのアプリケーションを作るコマンドを実行しました

rails newでアプリケーションを作成しました。オプションで色々変わるのですね(^o^;)

# 基本コマンド

```bash:railsのアプリケーションを作る
rails new アプリケーション名
```

# MySQLを選択するオプション
デフォルトがsqlite3なので変更したい場合があります。

```bash:railsでMySQLを使用するアプリケーションを作る
rails new アプリケーション名 -d mysql
```

# UnitTestを生成しないオプション
Rspecを利用する場合はUnitTestは不要です。

```bash:railsでUnitTestの無いアプリケーションを作る
rails new アプリケーション名 -T
```

# アプリケーション名を指定せず、コードだけ生成
すでにディレクトリが存在して、Railsのコードだけ生成したい場合は以下です。

```bash:railsのコードだけを生成
rails new ./
```

# 例えば
その場にコードだけ生成したく、UnitTest無しで、MySQLを使用したい場合です。

```
rails new ./ -T -d mysql
```
/var/log/btmpがあふれたので削除しました

サーバーの容量があふれたようなので調べてみたところ、/var/log/btmpファイルが数GBのサイズになっていました。

# 調査方法
dfコマンドで大体の概要を調べます

```bash:HDの使用状況を確認
df
```
あとはduコマンドでディレクトリごとに絞り込んでいきます。

```bash:ディレクトリごとの容量を調べる
sudo du -sm /*
```
duコマンドで調べたところ/var/log/btmpというファイルがHDを圧迫していることがわかりました。

# lastbで/var/log/btmpの中味を確認する
/var/log/btmpというのは不正ログインの記録されるファイルらしいです。
btmpの中味を確認するにはlastbコマンドを使います。

```bash:/var/log/btmpの中味を確認
lastb

root     ssh:notty    103.41.124.56    Sun Mar  8 23:04 - 23:04  (00:00)    
root     ssh:notty    103.41.124.12    Sun Mar  8 23:04 - 23:04  (00:00)  
以下略
```
rootユーザーで不正アクセスしようとしているということでしょうか。

# /var/log/btmpを削除しました
容量が厳しいので一旦btmpを削除します。

```bash:/var/log/btmpを削除
sudo rm /var/log/btmp 
```

# /var/log/btmpを作成
touchしてから600にしておきます

```bash:/var/log/btmpを作成
sudo touch /var/log/btmp 
sudo chmod 600 /var/log/btmp 
```
これで再びlastbコマンドで確認すると、不正ログイン記録が保存されるようになっています。

# sshdのポート番号を変更
/var/log/btmpファイルが肥大化していた原因は、SSHのポートがデフォルトの22番になっていたためでした。そのためSSHのポートを変更しておきます。

```bash:
sudo vi /etc/ssh/sshd_config

Port 987506
```
Port番号を適当に変えます。
あとはsshdを再起動すればOKです。

```bash:sshdを再起動する
sudo /etc/init.d/sshd restart
```

# 参考

* btmpファイルが大きくなっていますがどうしたらいいですか
 * http://ex-cloud.jp/support/question/q-643
* dfコマンドを使ったらhda2があふれてるのに気づいた
 * http://net-vacation.com/blog/archives/6983
OS Xに最速でMeCab, CaboCha, それぞれのRuby bindings+αをインストールする

ほとんどが今までに書いたことのまとめ。

## Homebrew
```console
$ xcode-select --install
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## MeCab
```console
$ brew install mecab
```

## CaboCha
```console
$ brew install cabocha
```

## Ruby
```console
$ brew install ruby
```

## mecab-ruby
```console
$ gem install mecab-ruby
```

## cabocha-ruby
```console
$ gem install cabocha-ruby
```
参考: [日本語係り受け解析器CaboChaをRuby(とRubyGems)から扱う](http://qiita.com/uetchy/items/665e9db0d4b70decbc69)

# 番外編

`$ brew tap uetchy/nlp` して[homebrew-nlp](https://github.com/uetchy/homebrew-nlp)リポジトリを追加する。

## Julius
```console
$ brew install julius julius-dictation-kit
```
参考: [HomebrewでOSXに音声解析エンジンJuliusを入れる](http://qiita.com/uetchy/items/1236b91b15d077e03525)

## KNP
```console
$ brew install knp
```
参考: [HomebrewでOSXに構文解析システムKNPを入れる](http://qiita.com/uetchy/items/3284ba1de1df39166744)

## Open JTalk
```console
$ brew install open_jtalk
```

## HTS Engine API
```console
$ brew install hts_engine_api
```
バブルソート

隣り合うデータを比較して入れ替える 


```ruby
#
#  バブルソート
#
class Array
  def bubble_sort!
    # 配列のコピー
    array = self.dup
    # 配列の長さ分繰り返す
    (length-1).times do
      (length-1).times do |i|
        # 隣の要素と比較して入れ替える
        if array[i] > array[i+1]
          array[i + 1], array[i] = array[i], array[i + 1]
        end
      end
    end
    #元の配列をソート済みの配列に置き換える
    self.replace(array)
  end
end

p [10,2,5,3,6,9,1,4,7,8].bubble_sort!
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```
railsで任意にminitestを実行する方法

```ruby:lib/sample.rb
class Sample
  def initialize(msg)
    @msg = msg
  end

  def say
    @msg
  end

  def scream
    @msg.to_s.upcase.to_sym
  end
end
```

```ruby:test/sample_test.rb
require 'test_helper'
require 'sample'

class SampleTest < ActiveSupport::TestCase 
  setup do
    @sample = Sample.new :hello
  end

  test 'sample 1' do
    assert_equal @sample.say, :hello
  end

  test 'sample 2' do
    assert_equal @sample.scream, :HELLO
  end
end
```

- ファイル単位で実行する場合

```shell-session
$ rake test TEST=test/sample_test.rb
```

- ブロック単位で実行する場合

```shell-session
$ rake test TEST=test/sample_test.rb TESTOPTS="--name=test_sample_2"
```
Gemfileのバージョン指定支援ツール

## bundler-add

引数にgemの名前を渡すと`gem gemname '~>version'`を出力する。

- [rosylilly/bundler-add · GitHub](https://github.com/rosylilly/bundler-add)
- [bundler-add 作った - Qiita](http://qiita.com/rosylilly/items/20f00eb742a5b5f9807b)

```console
$ gem install bundler-add
$ bundle add sinatra sinatra-contrib
gem 'sinatra', '~> 1.4.5'
gem 'sinatra-contrib', '~> 1.4.2'
$ bundle add minitest -g test,development
gem 'minitest', '~> 5.5.1', group: [:test, :development]
```

## gemrat

引数にgemの名前を渡すとGemfileにバージョン付きで追記して`bundle install`を実行する。

- [DruRly/gemrat · GitHub](https://github.com/DruRly/gemrat)
- [Introducing Gemrat: Add Gems From the Command Line - I create things.](http://www.drurly.com/blog/2013/06/16/introducing-gemrat-add-gems-the-command-line/)

```console
$ gemrat sinatra sinatra-contrib
gem 'sinatra', '1.4.5' added to your Gemfile.
gem 'sinatra-contrib', '1.4.2' added to your Gemfile.
Bundling...
```

オプションでpessimistic operator(~>)を使うこともできる。groupの指定はできない。

## safedep

`Gemfile.lock`からバージョン情報を取得してGemfileや*.gemspecに挿入する。

- [yujinakayama/safedep · GitHub](https://github.com/yujinakayama/safedep)

```console
$ cat Gemfile
source 'https://rubygems.org'

gem 'rake'
$ bundle install
# 略
$ safedep
Done.
$ cat Gemfile
source 'https://rubygems.org'

gem 'rake', '~> 10.4'
```

[parser](https://rubygems.org/gems/parser)を使ってコードをパースして、メソッド名(`gem`, `add_runtime_dependency`, `add_development_dependency`, `add_dependency`)などを手がかりにgemを指定している箇所を検出してバージョン情報を書き込んでいる。

---

<p>
This document is licensed under
    <a rel="license" href="http://creativecommons.org/publicdomain/zero/1.0/">CC0</a>.
</p>
VirtualBOX へ CentOS7 をインストール

#目的
Redmineをインストール・検証するための仮想マシンを作成する
※CentOS7を選んだ理由は特になし

#前提
[VirtualBOX](https://www.virtualbox.org/wiki/Downloads "ここから")のインストール／[CentOS7](https://www.centos.org/download/ "ここから")のダウンロードは済んでいること
BIOS設定にて「Intel VT」などが有効になっていること

#VirtualBOXにて仮想マシン作成
##仮想マシン　新規作成
![CentOS7_01.png](https://qiita-image-store.s3.amazonaws.com/0/71253/217f9b1e-2553-e726-d891-0e4f46b6ec3e.png)

ひとまず名前は「CentOS7Base」、バージョンは「Red Hat(64 bit)」
![CentOS7_02.png](https://qiita-image-store.s3.amazonaws.com/0/71253/4cbbb57a-c538-7b92-059e-344f83cf6c0c.png)

メモリは最低限「1024 MB」
![CentOS7_03.png](https://qiita-image-store.s3.amazonaws.com/0/71253/e46d10f9-5b12-b4d1-dd9a-30c65c676101.png)

あとはひとまずデフォルト設定のまま

##仮想マシン　設定
![CentOS7_04.png](https://qiita-image-store.s3.amazonaws.com/0/71253/9716cf0f-cf50-18e9-b141-01874dfdfcc9.png)

ストレージにてCentOS7のディスクを選択
![CentOS7_05.png](https://qiita-image-store.s3.amazonaws.com/0/71253/4792a3fa-ffbc-249a-52bf-7ffa85259fc1.png)

ネットワークにてブリッジアダプターを選択
![CentOS7_06.png](https://qiita-image-store.s3.amazonaws.com/0/71253/c328ba20-8b6f-2482-391b-64d305bf9a41.png)

「OK」押して起動

#CentOS7　インストール
![CentOS7_07.png](https://qiita-image-store.s3.amazonaws.com/0/71253/c7684b7b-d649-d366-4c98-5609cddc4f06.png)

日本語を選択して続行
![CentOS7_08.png](https://qiita-image-store.s3.amazonaws.com/0/71253/30f2ab5f-0d1b-44e4-33a0-5b655638f990.png)

ネットワークとホスト名にて
①右上を「オン」
②設定→IPv4のセッティング→方式　「手動」
③ホストマシン「ipconfig /all」の結果よりゲートウェイ／DNSサーバをセット
④アドレスは適当に
保存して完了
![CentOS7_10.png](https://qiita-image-store.s3.amazonaws.com/0/71253/04c49c2d-ef2c-f50b-bad8-d083567f2595.png)

インストール先はひとまずデフォルト
※詳細説明は別途
![CentOS7_11.png](https://qiita-image-store.s3.amazonaws.com/0/71253/5e968198-82ad-7078-6205-fbbec783fabb.png)

ソフトウェアの選択にて「サーバー(GUI使用)」を選択し、「開発ツール」をチェック
※GUIで何かするかも
※開発ツールはいずれ必要になるので先に入れとく
![CentOS7_12.png](https://qiita-image-store.s3.amazonaws.com/0/71253/2c94cd20-bb2d-5b70-5b5f-763891099fe3.png)

終わったら「インストールの開始」

##ユーザの設定
インストール中に「rootパスワード」と「ユーザの作成」を行う
この際、作成ユーザの「このユーザを管理者にする」をチェック
![CentOS7_13.png](https://qiita-image-store.s3.amazonaws.com/0/71253/73549dfb-d1b7-83f9-aca4-68524de3f8ac.png)

##インストール完了
インストールが完了したら「再起動」
再起動後は「ライセンス情報」を同意すれば完了

##ssh確認（GUI）
ホストPCからssh接続したいので、「admin」でログインして起動確認
アプリケーション→諸ツール→ファイアウォール
![CentOS7_14.png](https://qiita-image-store.s3.amazonaws.com/0/71253/8b793fb5-5008-3d21-0684-4d0d1b2f707b.png)

「ssh」がチェックされていることを確認
![CentOS7_15.png](https://qiita-image-store.s3.amazonaws.com/0/71253/0dfe4d00-ddee-6c81-2b5c-444d2128cd5f.png)


##ssh確認（コマンド）
アプリケーション→ユーティリティ→端末
状態が **active (running)** であること

```shell-session
[admin@centos7 ~]$ systemctl status sshd.service
sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
   Active: active (running) since 水 2015-03-11 19:44:27 JST; 38min ago
  Process: 1248 ExecStartPre=/usr/sbin/sshd-keygen (code=exited, status=0/SUCCESS)
```

sshが起動していなければsuにて

```shell-session
[root@centos7 ~]# systemctl start sshd.service
```

#おわりに
必要最低限のみ記載
細かい内容については気が向けば

[次はRedmineのインストール](http://qiita.com/ikep-panda/items/641b50fdf8c394ddfb6b)
BeautifulSoup小技: ルートTagを求める

BeautifulSoupの任意のタグから、ルートの[document]タグを求める方法です。
あったらいいなと思うメソッドなのに、何故かありませんでした。

```python:bs4_root.py
from bs4 import BeautifulSoup

def root(self):
    if self.name == u'[document]':
        return self
    else:
        return [node for node in self.parents][-1]

BeautifulSoup.root = root
```

メソッド`find_parent(u'[document]')`でも良いのですが、上のコードよりも時間が掛かります。
ゲストモードから戻れなくなったときは


未来の自分のためにメモ。YosemiteでFireVaultをONにした状態で、ゲストモードでログインしようとすると、

- 再起動して
- Safariだけのモードに

なります。その後はKiosk端末化してしまい、再起動してもユーザ選択画面にアクセスできなくなり **ギョッ**とします...。そんなときは、

- **スペースバーを押しながら起動**すると、

もとの世界に帰って来れます。

(怖くて再検証していませんが)
Railsのデータを雑にelasticsearchで可視化する

とにかく簡単にRailsのデータをelasticsearchで可視化したかったので、雑にRubyスクリプトを作成した。

RailsのSQLiteのデータを、curlで単純にelasticsearchに登録するだけ。
モデルのIDでXDELETEしてから、XPUTするので、一応最新のデータに更新される。

ちゃんとやりたい時は、例えば、rest-client使う等適宜修正して使う。

実は自分の支出をelasticsearchで手軽に多面的に見たかった。で、いちいちjson投げるのめんどいのでRailsからデータ登録できるようにしたかっただけ。完全に自分用のプロトタイプなので凝る必要なし。

```ruby:example.rb
#coding: utf-8

require "active_record"

# データベースへの接続
ActiveRecord::Base.establish_connection(
  adapter:   'sqlite3',
  database:  'development.sqlite3'
)

# モデルを定義
class Item < ActiveRecord::Base
end

# モデルの全データ取得
item=Item.all

item.each{|i|

  # モデルを元にjsonを作成
  data="'{\"item_name\":\"#{i.item_name}\",\"@timestamp\":\"#{i.item_date.strftime("%Y-%m-%d")}\"}'"

  # elasticsearchのURL。IDはモデルのIDを使う。
  url="http://localhost:9200/hoge/fuga/#{i.id}"

  # elasticsearchの既存データを削除
  command="curl -XDELETE #{url}"
  `#{command}`

  # elasticsearchにモデルのデータを登録
  command="curl -XPUT #{url} -d #{data}"
  `#{command}
  
}
```
VimでPlay Frameworkの開発環境を整える

Play FrameworkにはEclipseプロジェクトへの変換機能（`activator eclipse`）や、ブラウザ上で開発できる機能（`activator ui`）が提供されている。しかし、普段使っていない開発環境を使うと、使い方を覚えることに多くの時間を割かれてしまい効率が悪い。一方で、Vimの環境を利用していると、EclipseのようなJavaやScalaの優れた補完機能などが活用できない。そこで__Eclim__というEclipseとVimとの橋渡しをするプラグインを使い、使い慣れたVimの中で、Eclipseの機能を利用できるように設定した。以下でCentOS 7上で行った設定の手順を紹介する。また[Eclimのサイト](http://eclim.org)には充実したドキュメントがあるので、そちらも参照するとよい。

### 1. 前提条件
* [Java](http://www.oracle.com/technetwork/java/index.html)の実行環境があること。（バージョン1.6以降）
* [Neocomplete](https://github.com/Shougo/neocomplete.vim)によるVimの補完の設定がされていること。

### 2. 手順
1. まずEclipseの最新版（Eclipse 4.4 Luna）を持っていない場合は、[Eclipseのサイト](https://eclipse.org/downloads)からダウンロードする。
2. 初期設定のままではEclipseでScala IDEを起動したときに以下のような警告が表示される

    ````
    We detected that some of your settings are not adequate for the Scala IDE plugin.

    Run setup diagnostics to ensure correct plugin settings?
    ```

    これを回避するために`eclipse.ini`を編集しておく。[EclipseのWiki](http://wiki.eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F)などを参考に`-vmargs ...`の部分を例えば以下のように修正する。
   
    ```
    -vmargs
    -Xms512m
    -Xmx1024m
    -XX:PermSize=256m
    ```
（2015-10-20 追記：`MaxPermSize` は Java 8 から `Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0` のような警告が出るようになったので削除した。）

3. 次に、[Eclimのサイト](http://eclim.org)から現時点(2015-03-10)での最新版`eclim_2.4.1.jar`をダウンロードする。
4. 以下のコマンドを実行し、インストーラーを起動する。

    ```
    java -jar eclim_2.4.1.jar
    ```

5. インストーラーの指示に従いインストールを進めていく。`Please select the features you would like to install.`と言われたら、“Scala Development Toolkit”の項目にチェックをつけて次へ進む。既にマーケットプレイスなどを使ってScalaのIDEをインストールしてあれば必要ない。

6. `.vimrc`を編集する。（参照：[seansawyer/vim-eclim-scala.md](https://gist.github.com/seansawyer/9e13a2d5a6887cd0f296), [ervandew/eclim issues #121](https://github.com/ervandew/eclim/issues/121)）

    ```
    let g:EclimCompletionMethod = "omnifunc"
    let g:neocomplete#force_omni_input_patterns.java = '\k\.\k*'
    let g:neocomplete#force_omni_input_patterns.scala = '\k\.\k*'
    set completeopt-=preview
    ```
7. Playのプロジェクトのルートディレクトリ（appやconfがあるところ）でターミナルを開き`./activator eclipse`を実行する。これを実行すると、このプロジェクトをEclipseでインポートできるようになる。

8. Eclipseからプロジェクトをインポートする。[File]→[Import...]→[General]→[Existing Projects into Workspace]と開いていき、インポートするプロジェクトのルートディレクトリを指定し、[Finish]を押す。Eclipseは一旦終了する。

9. Eclipse本体のあるディレクトリに`eclimd`というファイルがあるはずなので、ターミナルで`./eclimd`を実行し、Eclimのデーモンを起動する。一度実行してしまうと、`Ctrl-C`で終了するまで他のコマンドを打てなくなるので`./eclimd &`としてプロセスを切り離したり、[tmux](http://tmux.sourceforge.net)で分割した画面で走らせておくと便利である。

10. これでようやく準備が整ったので、Vimでプロジェクトのファイルを編集する。`.`をタイプしたときや、`Ctrl-X Ctrl-O`, `Ctrl-N`をタイプしたときに入力の候補が提示される。候補は`Ctrl-N`で選択する。
    
    ![eclim.png](https://qiita-image-store.s3.amazonaws.com/0/55753/9aa46d22-e1a6-915b-015d-0eb9e659c289.png)

11. 保存時に構文エラーの警告が出る。
    ![eclim_err.png](https://qiita-image-store.s3.amazonaws.com/0/55753/f5afe174-54db-ef72-e075-153b2f600f9b.png)

## 3. まとめ

ScalaやPlayに慣れてないため、まだ分からないことが多いが、その分補完や構文エラーチェックから得られる恩恵は大きかった。マシンの性能次第ではかなり重くなってしまうが、普段からEclipseで開発している環境ならば問題なく動くと思うので試してみるとよいと思う。
[rails] rails generate xxx:install(カスタム Generator の作り方)

# 目的／動機

Rails用gemを作成した時に
作成したgem用のファイルを新規作成したり、
.gitignoreに特定のファイルを追加したかった。

他のgem([figaro](https://rubygems.org/gems/figaro), [devise](https://rubygems.org/gems/devise), [rspec](https://rubygems.org/gems/rspec))だと
rails generate xxx:install
でそれらしいことをしているが、
調べても簡単に目的のページに辿り着けなかったので、ここにまとめた。

# 事前定義

自分が作ったgemのモジュール名を仮に Xxx としておく。

# xxx:install の定義
```ruby:xxx/lib/generators/xxx/install/install_generator.rb
require "rails"

module Xxx
  # Base=引数は自由に取れる NamedBase=引数を一つ取る
  class InstallGenerator < ::Rails::Generators::Base
    # インスタンスメソッドが順番に実行されるので、
    # test1
    # test2
    # test3
    # と標準出力に表示される
    def test1
      puts "test1"
    end
    
    def test2
      puts "test2"
    end
    
    def test3
      puts "test3"
    end
  end
end
```

# Generatorの実行
```ruby:Gemfile
gem "xxx"
```
```bash
bundle install
rails generate xxx:install
```

# 参考URL
[rails でカスタム generator 作る話](http://mgi.hatenablog.com/entry/2014/11/29/124429)
[Railsのカスタムgeneratorの、グループ分けをする](http://d.hatena.ne.jp/kouji0625/20130529/p1)
Gmailアカウントを複数持ちした時にやったこと

結構めんどくさい。「ボタン一つで全ての権限をAからBに譲渡」みたいにできればいいけど、現状アプリ毎にやるしかなさそう。

1. メール : 自動"転送"設定

2. カレンダー : 権限譲渡（"共有"にする、他に共有してもらってる場合は、招待してもらうように頼む）

3. ドライブ : ファイルは共有、共有してもらっていたフォルダはもう一度招待してもらう

4. G+ : コミュニティに入っている場合、再度招待してもらう

5. MyMap : 自分で招待メールを自分に送る
Anddroid向けに作成されたアプリのコードのコアな部分をiOSアプリでも共有したいという話。


JavaのコードをObjective-Cに変換とかして、極力そのまま使えないかな？ということで、
”J2Objc”
がキーワードとして上がってきた。
使えそうかどうか情報収集。

「java objective-c 変換」でぐぐると頭に出てくるのはj2objcばかり。
実質こいつぐらいしか世には無いということかな。

> [JavaのソースコードからJavaScript/Objective-Cのソースコードを生成する](http://lab.sonicmoov.com/development/gwt-and-j2objc/)

JavaコードをObj-C変換し、単品でビルドする方法っぽい
ひとまずはこのやり方で変換したコードをxcodeプロジェクトへ追加していけばいい気がする。
（Javaから持ってきたファイル群は一つのフォルダにまとめるなりした上で）

google code → githubへ移行して開発は続いている様子
https://github.com/google/j2objc



> [j2objcをXcodeに統合する方法](http://lab.sonicmoov.com/development/j2objc-xcode-integration/)

Xcodeへの導入の仕方の記事
JavaコードをXcodeプロジェクトへ変換前に追加してしまい、Obj-Cコードのビルド時に変換→追加してビルドとやってしまうためのやり方？
JavaコードのI/F部が返還後にどうなるか分かってないと同時にビルド以前にコーディングで躓くだろうから、Xcodeにビルド設定まで突っ込む必要は無いのでは？と考えてしまう。
必要にあればこちらもやってみる。

>[j2objc(0.9.3)とXcode - Qiita](http://qiita.com/le_skamba/items/21b38750adf87a5c5a5d)

「zip関連でリンクエラーが出る」ので以下の手順も必要らしい。

	[Build Phases]-[Link Binary With Libraries]の[+]を押して、以下の2つを追加する。
	libz.dylib
	Security.framework


とりあえず今日は
$ brew install maven
しておく。
Gitのコミットメッセージの2行目に何か書くとどうなるのか？

## コミットメッセージの流儀
大体は、1行目が説明、2行目が空白、3行目から詳しい説明を書くこと、としています。では、2行目に何か書くとどうなるのでしょうか。

## 2行目に記述があるコミットメッセージ
![secondlinecommitmessage.png](https://qiita-image-store.s3.amazonaws.com/0/18796/134d1dee-f1e2-46f9-fe15-1a58e7bafd12.png)
このように、2行目に何かしらを記述したコミットメッセージでコミットします。

これを```git log```してみると、このように表示されます。
![after2commits.png](https://qiita-image-store.s3.amazonaws.com/0/18796/5495da93-9c51-c6bd-e626-509eab9c0141.png)

GitHubでは、このように表示されます。
![cropScreen Shot 2015-03-10 at 20.33.56.png](https://qiita-image-store.s3.amazonaws.com/0/18796/59cb462a-a48a-b80b-2cee-a79a732a0e21.png)

GitHub for Macでは、このように表示されます。
![Screen Shot 2015-03-10 at 20.35.07.png](https://qiita-image-store.s3.amazonaws.com/0/18796/b1f7c39a-6059-6394-1184-349f782b1414.png)

bitbucketでは、このように表示されます。
![Screen Shot 2015-03-10 at 20.39.47.png](https://qiita-image-store.s3.amazonaws.com/0/18796/a46bd15d-4593-b49f-c18b-60f7fb076716.png)

## 一見、何の問題もない
このように、webホスティングサービスでも問題なく表示されています。2行目に何か書くのは、書くと予期しない動作をするから、などという理由ではなさそうです。が……

## git logの表示に問題が発生する
予期しない動作など発生しないと思っていたのですが、```git log --oneline```の表示が、以下のようになりました。__1行目、2行目、3行目がひとつの行にまとまって表示されています。__
![onelinecommitlog.png](https://qiita-image-store.s3.amazonaws.com/0/18796/0dd7e134-3088-6237-9a3c-d5e4f7e300e8.png)

そこで、以下のようにもっと長めのコミットメッセージを作成しました。
![longcommitmessage.png](https://qiita-image-store.s3.amazonaws.com/0/18796/61ad382a-5547-cb2c-8561-28e8f9ecf485.png)

これを```git log --oneline```したところ、このようになりました。
![longmessageoneline.png](https://qiita-image-store.s3.amazonaws.com/0/18796/80879a9e-7c8c-688d-4730-2de52ef79f70.png)

結果から、どうやら```git log --oneline```は、コミットメッセージの初めの空行までを読み取って1行に出力する動作をするようです(空行をはさんだ後の文章は表示されていない)。ソースコードを読んでないので推測になりますが。

## まとめ
今回動作チェックをしなかった```git format-patch```や```git am```などで、2行目に記述があるコミットメッセージが何らかの不具合を引き起こさないとも限りません。
特別な理由のない限り、__コミットメッセージの2行目は空行にしましょう。__