OmniAICreator/Qiita-1.07M huggingface dataset:
[CodeIQ]「バイナリ・カウント」問題

# <i class="fa fa-spinner" style="font-size:1em;"></i> はじめに
CodeIQより[@riverplus](https://twitter.com/riverplus) Kawazoeさんから
「バイナリ・カウント」問題（ https://codeiq.jp/q/1539 )

コードゴルフ用の問題じゃないけど、Rubyでゴルフしてみた。

# <i class="fa fa-fire" style="font-size:1em;"></i> 最初のコード
証明は省略しますが、次式が成り立つことを利用しています。

```math
W(n) = \begin{cases}
 0 & (n=0) \\
 1 & (n=1) \\
 W(m) + W(m - 1) + m& (n=2m,\ m \in \mathbb{N}) \\
 2W(m) + m + 1& (n=2m+1,\ m \in \mathbb{N}) 
\\ 
\end{cases}
```
ただし, $\ W(n)$は, $1$から$n$までの自然数の2進化10進数(BCD:Binary‐Coded Decimal)のハミング重み(Hamming Weight)の合計とする. [^1]

```rb:answer_01.rb
$memo = {}
inputs = [10**3, 10**10]

def hws(n)
  return 0 if n == 0
  return $memo[n] unless $memo[n].nil?
  $memo[n] = n.even? ?
             hws(n/2) + hws(n/2-1) + (n/2)
           : hws(n/2)*2 + (n/2) + 1
end

inputs.each do |input|
  puts "%11d -> %d" % [input, hws(input)]
end
```

# <i class="fa fa-flag-checkered" style="font-size:1em;"></i> ゴルフしたコード
## <i class="fa fa-plane" style="font-size:1em;"></i> 関数defを使った場合
73文字でした。

```ruby:answer_02.rb
def w(n)m=n/2;n<1?0:m+(n%2<1?w(~-m)+w(m):1+w(m)*2)end;p w(1000),w(100**5)
```

## <i class="fa fa-rocket" style="font-size:1em;"></i> λ式を使った場合
自己最短のコードで、71文字でした。

```ruby:answer_03.rb
w=->(n){m=n/2;n<1?0:m+(n%2<1?w[~-m]+w[m]:1+w[m]*2)};p w[1000],w[100**5]
```

[^1]: ハミング重み: http://en.wikipedia.org/wiki/Hamming_weight<br>この問題の場合のハミング重みは、[Population Count] (https://chessprogramming.wikispaces.com/Population+Count)とも呼ぶらしい。<br>なお、**最初のコード**に出てくる式の証明は、<br>上記のPopulation Countのリンク先を見ればわかるかもしれません。
安全で高速なbundle install（ディレクトリを指定&並列化&省略オプション）



1. bundle installせずにrailsプロジェクトを作成する

```
rails new test -BT
```

(B ... skip bundle)
(T ... skip test unit)


* gemインストール先のパスを指定

ついでに
* staging, production環境は必要ないので除外設定
* --jobs=4 は並列処理の設定　これがあると高速化するのでついでに追加

```
bundle install --path vendor/bundle --without staging production --jobs=4
```


bundlerはオプションを以下のファイルに自動で記録して、次回以降省略できる。

```.bundle/config
---
BUNDLE_PATH: vendor/bundle
BUNDLE_JOBS: 4
BUNDLE_WITHOUT: staging:production
BUNDLE_DISABLE_SHARED_GEMS: '1'
```

以上！
PlayFramework Java 2.3.xにおけるCSRFチェックのエラーハンドリング

# CSRFエラーハンドリング
![スクリーンショット 2015-05-19 18.23.16.png](https://qiita-image-store.s3.amazonaws.com/2409/36105/77057e0e-70b2-252e-e3e5-c268077c6dd0.png "スクリーンショット 2015-05-19 18.23.16.png")

PlayFramework JavaでCSRFフィルターを利用していると、
ブラウザにこんな白画面とエラーメッセージが出ることがある。
これを回避するために
オリジナルのエラーハンドリング用のクラスを定義して、
CSRFエラーが起きた際に独自の処理を行わせる。

## コントローラ
CSRFフィルタリングを適用したい、ViewにFormを渡す側のActionは以下のようにアノテーションを付加

```java
@AddCSRFToken
public static Result get() {
    return ok(form.render());
}
```

FormのPOST先、受け入れ側のActionは以下のようにアノテーションを付加

```java
@RequireCSRFCheck(error = OriginalCSRFErrorHandler.class)
public static Result save() {
    // Handle body
    return ok();
}
```
``@RequireCSRFCheck``の引数にCSRFエラーハンドリング用のクラスを渡す。


## CSRFエラーハンドリング用のクラス　
``@RequireCSRFCheck``の引数に渡している、
``CSRFErrorHandler``クラスを実装した以下のようなクラスを作成する。
ここではpackageをcsrfとする。

```java:app/csrf/OriginalCSRFErrorHandler.java
pacakge csrf;

public class OriginalCSRFErrorHandler extends Results implements CSRFErrorHandler {

    public OriginalCSRFErrorHandler() {
    }

    @Override
    public Result handle(String s) {
        /**
         *	処理
         */
        return null;
    }
}
```

## CSRFエラーハンドリング設定オプション

さいごに、CSRF設定オプションとして、エラーハンドリングを行うクラスを``application.conf``に追記しておく。

```conf:conf/application.conf
## CSRF setting
csrf.error.handler = "csrf.OriginalCSRFErrorHandler"
```


# 補足
## CSRF（クロスサイトフォージェリ）ってなんだべ
https://www.playframework.com/documentation/ja/2.2.x/ScalaCsrf

> クロスサイトリクエストフォージェリ (CSRF) は、攻撃者が被害者のブラウザに被害者のセッションを使ったリクエストを行わせるように仕向ける、セキュリティ上の脆弱性です。セッショントークンはすべてのリクエストにおいて送信されるので、攻撃者が被害者のブラウザに代わってリクエストを強制できる場合、攻撃者は被害者に代わってリクエストを行えるということになります。

### PlayのCSRF対策
> Play はリクエストが CSRF リクエストでないことを検証する複数のメソッドを提供しています。その主要なメカニズムは CSRF トークンです。このトークンは、クエリ文字列、または投稿されたすべてのフォームのボディ部分に配置され、同様にユーザーのセッションにも配置されます。そして、Play はこの双方のトークンが存在し、一致することを検証します。
例えば AJAX を通じて行われるような、ブラウザ以外からのリクエストについて簡易に対策できるよう、Play は以下も提供しています:
X-Requested-With ヘッダが存在する場合、Play はそのリクエストが安全であると見なします。X-Requested-With は jQuery のようないくつかのポピュラーな Javascript ライブラリがリクエストに追加します。
値が nocheck の Csrf-Token ヘッダが存在する場合、または適切な CSRF トークンを含む場合、Play はそのリクエストが安全であると見なします。

つまり、Actionの際にCSRFトークンを発行してFormに渡して、POSTされたときにCSRFトークンの値が正当であるか確かめることでCSRFリクエストじゃないかどうか確かめるわけです。

### 使う準備とかね
https://www.playframework.com/documentation/ja/2.3.x/JavaCsrf

ここの「グローバルCSRFフィルタの適用」を見る
Magitでコミットメッセージが書きづらい

1. キーバインド C-; が奪われる
2. 途中で勝手に改行される

となって、(私には)非常に使いづらくなっていました。
原因は git-commit-mode-hook で flyspell と turn-on-auto-fill が起動しているせいだったので、次のようにすると快適になりました。

```el
(setq git-commit-mode-hook nil)
```
※最新の Magit だと flyspell は外され turn-on-auto-fill だけ有効になっているようです。
RailsアプリからSlackに通知


Railsで作ってるWebアプリのエラーや、ご意見フォームからの投稿をSlackにとりあえず流したいとき用。

以下のgemを利用する。
[aki017/slack-ruby-gem](https://github.com/aki017/slack-ruby-gem)

```rb:Gemfile
gem 'slack-api'
```

`bundle install`したら、`config/intializers`下に設定ファイルを置く。

```rb:config/intializers/slack_api.rb
require 'slack'

Slack.configure do |config|
  config.token = "<Slack Authentication Token>"
end
```

トークンは、以下のページで取得。
[Slack Web API | Slack](https://api.slack.com/web)

---

あとは、実際にSlackに送信する部分を記述するのみ。

例えば`email`, `message`というプロパティを持つ、`Opinion`というモデルのインスタンスの情報を送るとすると、適当だがこんな感じだろうか。

```rb:app/controllers/opinions_controller.rb
class OpinionsController < ApplicationController
  def create
    @opinion = Opinion.new(params[:opinion])
    
    if @opinion.save
      notify_to_slack
      ...
    else
      ...
    end
  end
  
  private
  
  def notify_to_slack
    text = <<-EOC
-----------------------------
[#{Rails.env}] 新しいご意見が来ました。

▼メールアドレス
#{opinion.email}
▼内容
#{opinion.message}
    EOC
    
    Slack.chat_postMessage text: text, username: "Opinion Notifier", channel: "#opinion"
  end
end
```

`Slack.chat_postMessage`には引数として、`text`（メッセージ）, `username`（表示名）, `channel`（channel名）が渡せる。`text`と`channel`は必須。

これで通知がSlackに来る。

![Screen Shot 2015-05-19 at 3.29.15 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1795/f2858b64-792e-6843-1f87-85dece98b09b.png "Screen Shot 2015-05-19 at 3.29.15 PM.png")

簡単な通知ならこれで良さ気。
AWSにSupervisorを導入する手順

# 初期ではRoot権限が無いため、Rootのパスワードを設定

```
sudo su -
passwd
```

# supervisorをインストール

```
sudo pip install supervisor
```

# rootユーザーになったら以下のコマンドで設定ファイルの雛形作成

```
echo_supervisord_conf > /etc/supervisord.conf
```

# プログラム毎に設定ファイル置き場を作成

```
sudo mkdir /etc/supervisord.d
```

# ログ用のディレクトリを用意

```
sudo mkdir /var/log/supervisor/
```

# 対象プログラム毎のファイルを読み込むように設定を修正

```
sudo vi /etc/supervisord.conf

# 以下設定を追記
[include]
files = /etc/supervisord.d/*.conf
```

# 起動スクリプト用意

```
sudo vi /etc/init.d/supervisord
```

* 以下内容を記載して保存

```bash
#!/bin/sh
#
# /etc/init.d/supervisord
#
# Supervisor is a client/server system that
# allows its users to monitor and control a
# number of processes on UNIX-like operating
# systems.
#
# chkconfig: - 64 36
# description: Supervisor Server
# processname: supervisord

# Source init functions
. /etc/init.d/functions

RETVAL=0
prog="supervisord"
pidfile="/tmp/supervisord.pid"
lockfile="/var/lock/subsys/supervisord"

start()
{
echo -n $"Starting $prog: "
daemon --pidfile $pidfile /usr/local/bin/supervisord -c /etc/supervisord.conf
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch ${lockfile}
}
stop()
{
echo -n $"Shutting down $prog: "
killproc -p ${pidfile} /usr/local/bin/supervisord
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] ; then
rm -f ${lockfile} ${pidfile}
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
esac
```

## 設定ファイル反映

```bash
sudo chmod +x /etc/init.d/supervisord
sudo /etc/init.d/supervisord restart
```

# ハマったところ

* サンプルプログラムが速攻で終わりすぎると以下のエラーが出て処理が終わるので注意

```
default  BACKOFF    Exited too quickly (process log may have details)
```
Lambda binding for lua is not supported.



cocos2dx luaで「Lambda binding for lua is not supported.」
とコメントがありその後assert(false)となっている場所がある。

使えなくて不便だなと思っていていろいろと調べたところ
解決できたのでメモ、正しい方法か怪しいです。

まずそもそも、onTouchとかlambdaになっているところでも対応している場所があるので
できるんじゃないかなと思い調査をしました。

lua_cocos2dx_ui_manual.cppのソースを参考に魔改造を施しました。

今回使いたかったのは「cc.EventDispatcher:addCustomEventListener」


こんなかんじで修正を行ったところのみ抜粋

```frameworks/cocos2d-x/cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp

#include "CCLuaEngine.h"

int lua_cocos2dx_EventDispatcher_addCustomEventListener(lua_State* tolua_S)
{
    int argc = 0;
    cocos2d::EventDispatcher* cobj = nullptr;
    bool ok  = true;

#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
#endif


#if COCOS2D_DEBUG >= 1
    if (!tolua_isusertype(tolua_S,1,"cc.EventDispatcher",0,&tolua_err)) goto tolua_lerror;
#endif

    cobj = (cocos2d::EventDispatcher*)tolua_tousertype(tolua_S,1,0);

#if COCOS2D_DEBUG >= 1
    if (!cobj) 
    {
        tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_EventDispatcher_addCustomEventListener'", nullptr);
        return 0;
    }
#endif

    argc = lua_gettop(tolua_S)-1;
    if (argc == 2) 
    {
        std::string arg0;
        std::function<void (cocos2d::EventCustom *)> arg1;

        ok &= luaval_to_std_string(tolua_S, 2,&arg0, "cc.EventDispatcher:addCustomEventListener");
/*
        do {
			// Lambda binding for lua is not supported.
			assert(false);
		} while(0)
		;
*/
        if(!ok)
        {
            tolua_error(tolua_S,"invalid arguments in function 'lua_cocos2dx_EventDispatcher_addCustomEventListener'", nullptr);
            return 0;
        }

		 // 
        LUA_FUNCTION handler = (  toluafix_ref_function(tolua_S,3,0));
        
        cocos2d::EventListenerCustom* ret = cobj->addCustomEventListener(arg0, [=](cocos2d::EventCustom* event){
    		LuaStack* stack = LuaEngine::getInstance()->getLuaStack();
		    stack->pushObject(event, "cc.Ref");
    
		    stack->executeFunctionByHandler(handler, 1);
			stack->clean();
        });
        object_to_luaval<cocos2d::EventListenerCustom>(tolua_S, "cc.EventListenerCustom",(cocos2d::EventListenerCustom*)ret);
        // 
        
        
        return 1;
    }
    luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "cc.EventDispatcher:addCustomEventListener",argc, 2);
    return 0;

#if COCOS2D_DEBUG >= 1
    tolua_lerror:
    tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_EventDispatcher_addCustomEventListener'.",&tolua_err);
#endif

    return 0;
}


```

これでluaではこんな感じで記載

```lua

cc.Director:getInstance():getEventDispatcher():addCustomEventListener("todo", function(event)
	printInfo("todo")
end)
```


pull requestしようかな。。
radiotap rate


[Rate](http://www.radiotap.org/defined-fields/Rate)フィールドがあり、これはu8で、500Kbps unit として読む。つまり0Kbps～127.5Mbpsが表現できる。いっぽうで802.11acでは1.69Gbpsが定義されていて、まったく値が収まらない！

実はradiotapのrateは、802.11仕様の"Supported rates" information elementの値と同じものだと気が付いた。このIEではrate一つをoctet(u8)で表現する。最上位ビットはBasic rateとして使うかどうかのフラグで、残りが500Kbps unitとなる。つまり0Kbps～63.5Kbpsまでが表現できる。使う際は1Mbpsから54Mbpsの値を取りうる。これ以上のrateは、ここでは表現しないということのようだ。

これ以上のrate(802.11n, 802.11ac)は、HT/[MCS](http://www.radiotap.org/defined-fields/MCS), [VHT](http://www.radiotap.org/defined-fields/VHT)も見るという事の様子。
unix系で一気にファイルの中身をかきかえたい

unixコマンドのメモ
#ex コマンドを使って検索ヒットした行を消す

たとえば、いくつかファイルがあって、その中の決まった文字列行を消し去りたいとする場合。
数枚のファイルならばviでまとめて開いて削除すればいいかもしれないが、
数百枚のファイルとなったら・・・

そんなときにすると便利な実行方法

たとえば「test-msg」という文字列を引っ掛けて引っかかった行を消したい場合

1.Hitするファイルリストを作る

```
grep -l "test-msg" * > ファイル名
```
とかやると、
「test-msg」文字が含まれるファイルリストが書かれたファイルができる。

```lang:/tmp/sample_lists
aaaa.txt
aaaa-1.txt
bbbbb.txt
:
```

2.消す作業を書いたスクリプトファイルを用意する

```lang:/tmp/ex-cmd
/test-msg/d
w
q
```

3.まずは1件ちゃんと消えるかを確認してみる

```
ex aaaa.txt < /tmp/ex-cmd
```

4.中身が意図したとおりに消えていればファイルリストを実行する

```
　% foreach i ( `cat /tmp/sample_lists`)
　foreach? ex $i < /tmp/ex-cmd
　foreach? end
```
こうすればファイルリストを最後まで実行してくれる。

他に書き換えたい時も書き換えたいコマンドを使用すれば同じような感じに実行できる
awscliメモ

MACからの操作。

* awscliはpythonなので入れる
  
        $ brew install python

* pipでインストール

        $ pip install awscli

* マネジメントコンソール画面からIAMユーザの作成
参考：http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/Using_SettingUpUser.html

* CSVのダウンロードはここでしかできないらしいので必ずしておく。

* IAMユーザを作成したら「ポリシーのアタッチ」選択し「AmazonEC2FullAccess」あたりの権限を選択する。ほかのでもよい。

* ダウンロードしたCSVをもとにIAMユーザ設定をローカルにしていく。

        $ aws configure
        AWS Access Key ID [None]: AKI***********HRQ
        AWS Secret Access Key [None]: ALuPJ**********************cNs41
        Default region name [None]: ap-northeast-1
        Default output format [None]: json

        $ ls -la ~/.aws/

        $ cat ~/.aws/config
        [default]
        output = json
        region = ap-northeast-1


        $ cat ~/.aws/credentials
        [default]
        aws_access_key_id = AKI***********HRQ
        aws_secret_access_key = ALuPJ**********************cNs41

ec2インスタンス一覧を出力する

        $ aws ec2 describe-instances

※「ポリシーのアタッチ」をしていないと以下のように権限がないと怒られる。

        $ aws ec2 describe-instances
    A client error (UnauthorizedOperation) occurred when calling the DescribeInstances operation: You are not authorized to perform this operation.
YEOMAN + angularJSでヘッダメニューにactiveクラスを自動付与する

#やりたいこと
ヘッダーのメニュー部分において、アクセスしているページに対応したハイライトを行いたい。

- ルートにいるときはHomeがハイライトされる
![Homeのハイライト](https://qiita-image-store.s3.amazonaws.com/0/60981/33467379-89f5-03a8-1491-9af4146c68f0.png)

- AboutページにいるときはAboutがハイライトされる
![Aboutのハイライト](https://qiita-image-store.s3.amazonaws.com/0/60981/17e7f5ce-c8ac-0e5c-e2d7-67a9b0072706.png)

# 環境
- YEOMANをいれたばっかり
    - angularJS
    - grunt
    - bower

#流れ
1. controllerにアクセスしているページのpathを取得
2. 取得した文字列とメニューの内容が合致するかチェックし、合致するメニューのliタグにactiveクラスを付与


## Controllerにアクセスしているページのpathを取得
```js:controllers/main.js
angular.module('myApp')
  .controller('MainCtrl', function ($scope, $location) {
	$scope.isActive = function (viewLocation) {
	     var active = (viewLocation === $location.path());
	     return active;
	};
  });
```

$location.path()で今アクセスしているページのpathを取得できます。
もし、isActiveで投げた文字列とpathが合致していたら、**true**が帰ってきます。




## 取得した文字列とメニューの内容が合致するかチェックし、合致するメニューのliタグにactiveクラスを付与
```html:index.html
<ul class="nav navbar-nav" ng-controller="MainCtrl">
  <li ng-class="{ active: isActive('/') }"><a href="#/">Home</a></li>
  <li ng-class="{ active: isActive('/about') }"><a ng-href="#/about">About</a></li>
  <li ng-class="{ active: isActive('/contact') }"><a ng-href="#/">Contact</a></li>
</ul>
```

ng-controllerでMainCtrlを指定して、その中で先ほど記述したisActiveを呼び出します。
trueであれば、activeクラスがliタグに付与されます。


#所感
今回は右も左も分からない状況だったので、MainCtrlに書いて操作していますが、タブメニューはウェブサイト全体に及ぶものなので、より正しい書くべき場所・書き方があると思います。(；´Д｀)
MainCtrlにたくさん書くことになったら重く?なりそうだし...
やはりapp.jsに書くべきなのかな...

activeクラスを付与する方法が掲載されているサイトはたくさんあったのですが、とりあえずYEOMANいれたけどcontrollerって何〜〜〜から入ったので、そんな人のために投稿しました。



# 参考
[How do I implement the bootstrap navbar active class with Angular JS - Stackoverflow](http://stackoverflow.com/questions/16199418/how-do-i-implement-the-bootstrap-navbar-active-class-with-angular-js/18071388#18071388)
Axlsxでセル内の改行を反映する


改行がうまく反映されなかったため調べていたところ、axlsxのissueの中に解決策が書かれていたのでそれをメモしておきます。

改行コードは`\r\n`です。

## 環境

* Mac Yosemite
* Ruby 2.2.1
* Rails 4.2.1
* axlsx_rails

## 解決策

以下を追加する。

```rb
xlsx_package.use_shared_strings = true
```

## 全コード

```rb:app/views/hoges/download.xlsx.axlsx
xlsx_package.use_shared_strings = true
xlsx_package.workbook do |wb|
  wb.add_worksheet do |ws|
  	ws.add_row ["abc\r\ndef"]
  end
end
```

## 参考URL
[https://github.com/randym/axlsx/issues/252#issuecomment-27264190](https://github.com/randym/axlsx/issues/252#issuecomment-27264190)
MS-IMEの変換がおかしい

ある日「なんか変換候補が少ないんです」と聞かれる
調べてみたらIMEの辞書が壊れてるらしい
辞書ファイルを修復すればとりあえずは治ります

![ime1.png](https://qiita-image-store.s3.amazonaws.com/0/31310/3b6fbd4a-39bc-3429-fc35-e2c97fda80c5.png)

IMEのところで右クリックして設定を選ぶ


![ime2.png](https://qiita-image-store.s3.amazonaws.com/0/31310/7f9e963c-a916-8280-4e9e-0002fec3909b.png)

全般タブのMicrosoft IMEを選択してプロパティ


![ime3.png](https://qiita-image-store.s3.amazonaws.com/0/31310/cab317f4-5e2a-d1cc-8bc8-fcbe0c95c31d.png)

「辞書/学習」タブの辞書ツール（画面真ん中あたり）の修復をクリック


![ime4.png](https://qiita-image-store.s3.amazonaws.com/0/31310/59f76262-3f40-f592-ebcb-3d537b1e6b70.png)

![ime5.png](https://qiita-image-store.s3.amazonaws.com/0/31310/4c0557a3-5d87-5615-0528-aaca04790937.png)

特に問題がなければ「はい」「はい」で


![ime6.png](https://qiita-image-store.s3.amazonaws.com/0/31310/7f0261d7-c769-df91-0758-ac05d5f4fb4c.png)

おしまい

単語登録とかしてるときれいさっぱり忘れることがあるので日ごろのバックアップは忘れずに
Kibana4でnot analyzedなFieldに対してフィルタをかけたいときの注意点


Kibana4ではフィルタをかけるとき、query_string queryを投げています。

このquery_string queryのデフォルトの挙動では、クエリ文字列を全て小文字に変換して検索するという仕様があります。

そのため、特にnot analyzedのような大文字がインデックスされているフィールドに対しては、クエリ文字列上で明示した大文字の部分がヒットしない、という事が起きます。

この挙動を防ぎ、記述した通りのクエリ文字列で検索するためkibana4では、
<code>Settings &gt; Advanced &gt; query:queryString:options </code>

に対して以下の設定を追記するといいでしょう。

デフォルト：
```json:default
{ "analyze_wildcard": true }
```

追記後：
```json:lowercase_expanded_terms_false
{ "analyze_wildcard": true , "lowercase_expanded_terms" : false}
```

参考：
https://twitter.com/aya_eiya/status/600533055774687232
https://www.elastic.co/guide/en/elasticsearch/reference/1.x/query-dsl-query-string-query.html
IntelliJ 14.1.3 activatorのnew projectが読み込めない

IntelliJ 14.1.3で playのprojectがそのまま読み込めなくなったので
この様にすれば対応できます。。

```
activator new Hoge
cd Hoge
sbt gen-idea
```
ideaで開くでいいかと。projectのコンバートが走って14.1.3でも問題なく開けるかと。
grouped_collection_select の使い方

## 問題意識
Ruby on Rails で OPTGROUP によるプルダウンメニュー／セレクトボックスの多層メニューを実現したい。

![NS_OptGpTest_no20.gif](https://qiita-image-store.s3.amazonaws.com/0/26146/fbc9eb2f-3d18-a8cc-fb2f-db51dda4d116.gif)

みたいなもの。

## 解決方法
grouped_collection_select を使う。
[ここ](http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/grouped_collection_select)のAPI解説がとてもよい。英語だがしっかり読めば理解できる。

要するに、親が複数の子要素を持つ場合、親要素のリスト、親要素から子要素を取り出すメソッド名、親要素の名前を取り出すメソッド名、子要素の名前と値を取り出すメソッド名等を指定することで、OPTGROUP と OPTION からなる HTML 断片を生成してくれる。

一瞬引数が多くてビビるが、理解してしまえば、すごく便利。
オレオレ .agignore

[TheSilverSearcher](https://github.com/ggreer/the_silver_searcher)便利ですよね。
前は find grepで頑張ったり ackとか grinとか使ってたんですが、
ag が圧倒的なのでもうこれなしでは生活できないレベルです。

ただ、デフォルトだと.binとかも検索対象に入っちゃって厳しかったので、[yuyuchu3333さんの記事](http://qiita.com/yuyuchu3333/items/4c57186e37db9eb3db15)を参考に除外対象の設定しました。

```~/.agignore
*.bin
*.swp
*.bak
*.old
*.egg
*.egg-info
*.crt
*.key
*.pem
*.pub
*.cert
*.csr
*.zip
*.tar.gz
*.jpeg
*.png
*.gif
.vim/bundle
.vim/dict
.git
id_rsa
tmp
old
zsh-completions
lib
libs
node_modules
tags

```
【EC-CUBE】テンプレートのコメントアウト

EC-CUBEはテンプレートにSmartyを使っている。

通常、Smartyのコメントアウトは以下のように行う。

```smarty
{* 以下のdiv要素はコメントアウトされている *}
{*
<div>
  <span>Hello, world!</span>
</div>
*}
```

でもEC-CUBEのテンプレートでは上記のようにすることはできない。

次のように、Smartyのコメントを<!-- -->で囲むような形をとる。

```smarty
<!--{* ここがコメントアウトされる *}-->
```

以上。
JRubyからApache DrillにJDBC接続

JRubyからApache DrillにJDBC接続するサンプルです。
Embededモードで動かしています。
接続URLを修正すればDistributedモードのDrillbitノードにも接続できるはずです。

環境
JRuby1.7.20
Apache Drill 1.0.0 RC1 (GAリリースが近づいて参りました！）

```ruby(test.rb)
require 'rubygems'
require 'java'

Java::org.apache.drill.jdbc.Driver;
conn = java.sql.DriverManager.get_connection('jdbc:drill:zk=local', "", "")
stmt = conn.create_statement
rs = stmt.execute_query('SHOW DATABASES')

while (rs.next) do
  puts rs.getObject(1)
end

rs.close
stmt.close
conn.close
```

```sh
jruby -J-classpath jars/*:jars/3rdparty/*:jars/jdbc-driver/*:jars/classb/*:jars/ext/* test.rb
```
jQuery datepicker使う際、古いjQueryのバージョンを使わなくてよい方法

jQuery datepickerはinputなどの入力の際、カレンダーを表示して直感的に日付の入力を行える公式が配信しているライブラリファイルです。
>http://blog.jqueryui.com/2011/05/jquery-ui-1-8-13/

ですがこれを使用するにはjQueryのバージョンが1.90未満などではないと動かない為、最新のバージョンを使うライブラリファイルとの統合ができません。

その際、jQuery本体の読み込み後にjquery-migrate-1.0.0.jsを読み込ませると上手く動くようになります。

参考サイト
>http://javascript.webcreativepark.net/library/jquery-migrate
でも書かれていますが、このプラグインはjQuery 1.9.0で廃止になった機能を補完してくれるため最新のjQueryを使っていてもその機能を壊すことなく古い機能も使えるようになります。

古いライブラリファイルを使う際は使ってみてください。
journalctl 最低限覚えておくコマンド

# 最低限覚えておくコマンドはこれだけ

**もし本当にオプションを全部忘れてしまった場合は、単に`journalctl`とタイプすれば、保存されているログを全部表示できる。**

長い行が切り詰められて表示されている場合は、矢印キー（→）を押せば右にスクロールできる。

## 最近のメッセージを表示（-e）

```
journalctl -e
```

## -x をつけると詳細情報も表示される（-xe）
```
journalctl -xe
```

## tail -fのようにログを監視する（-f）

```
journalctl -f
```

## 特定サービスのメッセージだけを表示

`-u ユニット名`で指定する。
ユニット名とは`systemctl`で表示される`sshd.service`など。`.service`は省略できる。
ワイルドカードとして`*`（アスタリスク）が使える。

```
journalctl -u sshd
journalctl -u httpd
journalctl -u nginx
journalctl -u mysqld
journalctl -u cronie
journalctl -u updatedb
journalctl -u 'up*'
```

systemdユニットになっていないコマンドのログを検索するには

```
journalctl /usr/bin/crond
```

のように実行ファイルのフルパスを指定すればよい。


# いくらか優先度が落ちるコマンド

## ログの末尾だけ表示(-n）

`tail -n 100`のようにログの末尾だけ表示する。

```
journalctl -n
journalctl -n 100
```


## 起動時からの全メッセージを表示（-b）

```
journalctl -b
journalctl -b 2          # 2回前の起動時のログを表示
```


# 参考情報

もっと詳しいことが知りたくなったら

[Arch Wikiのjournalの部分](https://archlinuxjp.kusakata.com/wiki/Systemd#Journal)
[man journalctlの日本語訳](https://sites.google.com/site/kandamotohiro/systemd/man-journalctl-no-yi)
ツール・フレームワーク・ライブラリ等の共有レベルを考える


はじめに
=======

ツール、フレームワーク、ライブラリのようなものがどの程度共有されているかの目安を考えたメモです。
ITエンジニアの成果物を想定していますが、ある程度他のケースでも言えることかなと思います。

概要
======

以下のようになります。

* LV0: 自分でも共有できてない
* LV1: 自分では再利用できている
* LV2: 再利用するために切りだされ、共有スペースに置いてある
* LV3: 自分以外の誰か一人が使うことができている
* LV4: 訓練された人ならば使うことができている
* LV5: 組織標準であり、使うべき人であれば使えている

有用なものであればLV4~5を目指しましょう。皆が幸せになれます！

詳細
======

LV0: 自分でも共有できてない
------------
自分で再び利用しようとしても使えないという状態。

本来再利用できるものであるとすれば良くない状態です。
以下の様な原因が考えられます。

* 「モノ」としての再利用性が低い（汎用的でない、依存関係が多すぎる）
* 管理が悪い（どこにあるかわからない）

LV1: 自分では再利用できている
-----------

自分がそれを必要としたら、低コストに再利用できる状態。
「オレオレライブラリ」「オレオレフレームワーク」と呼ばれるものです。

何か作ったら少なくともこのレベルにしておくとエンジニアとして少し楽ができます。
未来の自分は使い方を忘れているかもしれないので、 **重要なことはドキュメントを書いておく(自分のために)**と良いですよ。


LV2: 再利用するために切りだされ、共有スペースに置いてある
------------
ツール、ライブラリ、フレームワークという「モノ」が実体として確立しており、git、パッケージマネージャ、ファイル共有、等で共有されている状態。

自分が利用する際にも、手元のLocal DISKからでなく、その共有スペースから利用することが多いような状態です。

LV3: 自分以外の誰か一人が使うことができている
---------------
LV2になっている「モノ」が、誰でも良いので「他人」も使ったことがある状態。

自分以外の「他人」が、その「モノ」の意義・意味を理解していて、実際に使える状態で、使ったことがある。その「他人」が非常に優秀なので使うことができているという状態を含みます。

※LV2とLV3は順番が逆になることもあるかもしれません。

LV4: 訓練された人ならば使うことができている
-----------
その「モノ」を使うためのトレーニングが存在して、それを実施することである程度技能がある人なら使える状態。

ほとんどの世の中のフレームワーク（Rails, Cocoapods等）はこのレベルといえます。

LV5: 組織標準であり、使うべき人であれば使えている
--------------
組織内のほとんどのひとがそれを使っている状態。

LV4が非常に普及している状態と言えます。
IT業界でいえば、gitなどはそれに該当するのではないでしょうか。(そうでもない？）


自分で作ったモノをレベルアップさせるための指針
================
LV0 ⇒ LV1: 自分では再利用できている
--------------
今までやった仕事の中で、使えそうなモノを整理しておきましょう。
これができないと中々生産性というのは上がっていかないでしょう。

**「エンジニアは楽をするための努力を惜しまない」**

という感じです。

LV1 ⇒ LV2: 再利用するために切りだされ、共有スペースに置いてある
--------------
毎回過去のプロジェクトから再利用している状況だとそれ以上の進展がなかなか得られません。
ちょっと気合を入れて、「モノ」を分離して切り出しておきましょう。
意外とそういう作業からよい知見が得られることもあります（可搬性・独立性・保守性等）。

分離したモノはせっかくなので皆にシェアすると「Open風味なエンジニア」街道まっしぐらで良いと思います。
あと **自分にはわかるくらいのドキュメント** もあると、数年後困らないです。

**「3ヶ月後の自分は他人」**

という感じです。


LV2 ⇒ LV3: 自分以外の誰か一人が使うことができている
--------------
自分以外の誰かにそのライブラリの有用性を説明して、実際に使ってもらいましょう。
意外とその「自分以外の誰か」が使うための敷居というのは高いもので、ここを乗り越えられるかは大きなポイントになるでしょう。

ある程度のドキュメンテーションも必要になります。
しかし、このドキュメンテーションは「**とても優秀なあの人ならわかるはず**」というようなものでよくて、基本的な説明(一般的なツールの操作とか)などは最初は不要です。
「設置方法」「普通の使い方」「(必要なら)自分しか知らない内部の仕組み」くらいを書いておけば良いでしょう。

LV3 ⇒ LV4: 訓練された人ならば使うことができている
--------------
LV2~3をクリアしたらLV4になる準備ができているということになります。
属人性はほとんど排除されているので、あとは「有用性」「使うための知識」が他の人に伝われば良いことになります。

有用性は別途説明しましょう。
使うための知識が準備したドキュメントだけで伝われば良いですが、それだけでは伝わらないこともあります。そういう場合は「研修」のような場を設けて伝えることも視野にいれましょう。

＃もちろんわざわざ研修してまで使ってもらうのは、相当な有用性がある場合だけになりますが。


LV4 ⇒ LV5: 組織標準であり、使うべき人であれば使えている
--------------

LV5になるモノはほんのごく一部と言えるでしょうが、そうなれば嬉しい限りですね。
GASで商品管理表を自動で色分け


共有している商品管理表の各商品が、現在どの状態にあるかを自動で色付けして確認できるようにする。

・管理表サンプル
![スクリーンショット 2015-05-19 14.13.19.jpg](https://qiita-image-store.s3.amazonaws.com/0/47052/9708346b-b161-f65e-7551-dae689b12128.jpeg "スクリーンショット 2015-05-19 14.13.19.jpg")

・メニューバーに「ツール」を追加。その中にある「色付け」を押す。
![スクリーンショット 2015-05-19 14.13.31.jpg](https://qiita-image-store.s3.amazonaws.com/0/47052/9a949aa2-bfd0-4b83-b04d-5512255b30f5.jpeg "スクリーンショット 2015-05-19 14.13.31.jpg")

・自動で色付け！
![スクリーンショット 2015-05-19 14.13.52.jpg](https://qiita-image-store.s3.amazonaws.com/0/47052/17fac15b-75e9-2126-e2f6-a220cd5ef6f1.jpeg "スクリーンショット 2015-05-19 14.13.52.jpg")

・以下コード

```gs:コード.gs
var validColNum = 5;

var checkPaymentCol = 3;
var soldDateCol = 4;
var checkSoldCol = 5;

var lightPink = "#FFB6C1";
var lightYellow = "#FAFAD2";
var lightBlue = "#87CEFA";
var grey = "#797979";

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();

//メニューバーに追加
function onOpen() {
  var menus = [
    {name: "色付け", functionName: "putColor"},
  ];
  ss.addMenu("ツール", menus);
}

//色付け
function putColor(){

  for(var i = 2; i <= sheet.getLastRow(); i++) {
    
    if(!sheet.getRange(i, 1).isBlank()) { //商品入力あり
    
      if(sheet.getRange(i, checkPaymentCol).isBlank()) { //支払まだ:ピンク
        for(var x = 1; x <= validColNum; x++) {
          sheet.getRange(i, x).setBackground(lightPink);  
        }
      } 
      
      if(!sheet.getRange(i, checkPaymentCol).isBlank()) { //支払済:ブルー
        for(var x = 1; x <= validColNum; x++) {
          sheet.getRange(i, x).setBackground(lightBlue);
        }
      }
      
      if(!sheet.getRange(i, soldDateCol).isBlank()) { //売上あり:イエロー
        for(var x = 1; x <= validColNum; x++) {
          sheet.getRange(i, x).setBackground(lightYellow);
        }
      }
    
      if(!sheet.getRange(i, checkSoldCol).isBlank()){ //入金あり:グレー
          for(var x = 1; x <= validColNum; x++) {
            sheet.getRange(i, x).setBackground(grey);
        }
      }
      
    }
  }
}





```
MQTT-SNを簡単にテストする方法　その３

#Arduino Ethernetで MQTT-SN クライアントを動かしてみよう#
[**Arduino Ethernet**](http://www.arduino.cc/en/Main/ArduinoBoardEthernet) は８ビットマイコンを使用したコンピュータでEthernetコントローラーを内蔵しています。　主な仕様は以下の通りです。
>* マイクロコントローラ	ATmega328
* 作動電圧　　　　　　	　5V
* 入力電圧　　　　　　	7-12V
* デジタルI/O ピン　　　14 (そのうち4本が PWM 出力可能)
* アナログ入力ピン　　　	6
* I/Oピン出力電流　　　	40 mA
* フラッシュメモリ　　　32 KB (ATmega328)
* SRAM	                 2 KB (ATmega328)
* EEPROM	         1 KB (ATmega328)
* Clock Speed	        16 MHz
* W5100 TCP/IP Embedded Ethernet Controller

1970年代ならば最先端のコンピューターです。


##用意するもの##
* Linux、Windows、Macなんでも良い。　開発環境として [**ArduinoIDE**](http://www.arduino.cc/en/Main/Software) 　バージョン1.6.4 
* Arduino　Ethernet Rev3
* [USB-シリアル変換アダプター](https://www.switch-science.com/catalog/1032/)
* インターネットルーター　DHCPサーバー付

##Arduinoクライアントの作成##
**step1.  ソースコードの準備**    
>必要なソースコードは [**その１**](http://qiita.com/TomoakiYAMAGUCHI/items/26ea7861aafbaae80ca1)で githubからホームディレクトリーにダウンロードされています。
AsyncMQTT-SN/AsyncClient/src/libにあるソースコードを全てzip形式で一つに圧縮して名前を **MQTT-SNAsyncClient.zip** にします。

**step2. ライブラリーとしてIDEに登録します。**     

> * AruduinoIDEを起動します。
* スケッチ > Include Library > Add .ZIP Library... とクリックして、MQTT-SNAsyncClient.zip ファイルを指定します。　これで登録は完了です。　　　　
　　　　
>* もう一つ、Arduinoが提供するEthernetUDPライブラリにマルチキャスト機能を追加します。追加方法は [**ここ**](https://github.com/arduino/Arduino/pull/1531) を参照してください。

**step3. クライアントのソースコードを作成します。**  
> * スケッチ > Include Library とクリックするとメニューの一番下に  今登録したライブラリーが**MQTT-SNAsyncClient** と表示されているはずなので、これを選択します。 エディターにライブラリーに登録されたincludeファイルが表示されます。

> ![ArduinoIDE.png](https://qiita-image-store.s3.amazonaws.com/0/41752/f1cf2ceb-c959-c04d-46c1-3088ff533c40.png)

> * エディターに表示されている内容すべてを AsyncClient/src にある Application.**ino** ファイルの内容で上書きします。 
* Linux用のコードとは、PUBLISHするトピックとsetup()関数の内容が少しだけ違います。

**step4. クライアントのソースコードを修正します。**  
>* Arduino Ethernet は DHCPプロトコルをサポートしないため、IPアドレスに固定アドレスを割り当てます。（DHCPサーバに手動でMACとIPアドレスを設定します）
* Arduino Etherは基盤毎にMACアドレスが6個の16進数で表示されていますので、この値と固定で割り当てたIPアドレスでソースコードを書き換えます。　

>> 変更する箇所を太文字で表記しています。
>> {　**192**, **168**, **1** , **10**　},          // Local IP     (for Arduino App)
>> {　**0x90**, **0xa2**, **0xda**, **0x01**, **0x01**, **0x01**　}       // MAC address  (for Arduino App)

```cpp:Application.ino
#ifdef NETWORK_UDP
UDP_APP_CONFIG = {
    {
      	"LinuxClient",      //ClientId
        {225,1,1,1},        // Multicast group IP
        1883,               // Multicast group Port
        {0,0,0,0},          // Local IP     (for Arduino App)
        12001,              // Local PortNo
        {0,0,0,0,0,0}       // MAC address  (for Arduino App)
    },
```

**step5. コードをコンパイルしてArduinoに書き込む。**  
>* 黄色で囲ってあるボタンを押すとコンパイルが実行され、エラーが無ければシリアル通信でFlashメモリにロードモジュールが書き込まれます。　
リセットするとロードしたプログラムが起動します。

> ![ArduinoCompile.png](https://qiita-image-store.s3.amazonaws.com/0/41752/aa567cec-0183-e8c1-6423-28268b4660fc.png)

これで、LinuxクライアントとArduinoクライアントとゲートウェイの完成です。
LEDの点滅が確認できましたか。

![NCM_0267.JPG](https://qiita-image-store.s3.amazonaws.com/0/41752/83333e9b-424a-7b43-bcfa-1a63953d228e.jpeg)
ゲートウェイに Rspberry Pi + Wifi USB を使用しています。


[**その１** へ戻る](http://qiita.com/TomoakiYAMAGUCHI/items/26ea7861aafbaae80ca1)
アプリを多言語化したいので、日本語が書いてある行をgrep検索で洗い出したい

ずっと日本語メインで作ってきたアプリを、国際化して多言語をあつかえるようにしなければいけなくなりました。ソースコードにハードコーディングされている日本語を洗い出す必要があります。

ひとつひとつファイルを精査していては時間がかかるので、grep検索でユニコード文字が使われている箇所を探して、そのリストをベースに国際化をしていくようにします。

普通のgrepコマンドでも探すことができますが、今回はgrepよりも高速な[The Sliver Searcher]の`ag`コマンドを使って探してみます。Silver Searcherでユニコードを検索するコマンドは次のようになります。

```console
$ ag '[\x80-\xFF]'
```

僕の環境では、コンソール上では文字化けしていましたが、一旦ファイルに書き出したり、クリップボードにコピーすると文字化けしてないデータが手に入ります。

```console:ユニコードが使われている箇所をファイルに書き出す例
$ ag '[\x80-\xFF]' > need-to-internationalize.txt
```

```console:ユニコードが使われている箇所をクリップボードにコピー(OSX)
$ ag '[\x80-\xFF]'  | pbcopy
```

検索して見つかった箇所には、もちろんコメントや日本語向けのドキュメントなど、国際化の必要のないものも引っかかります。それらは、テキストエディアやGoogle Spreadsheetsなどを活用して取り除き翻訳が必要な箇所を絞り込んでいきます。

[The Sliver Searcher]: https://github.com/ggreer/the_silver_searcher
ChromeとSafariで"Cache-Control: no-cache"が効かなかった

Webページのキャッシュを残さないようにしたとき四苦八苦したので備忘録として書いてきます。  
とりあえず問題としては2種類あった。

##問題1##

ブラウザバック時に問題があったのでキャッシュを残さないようにしようとした。  
最初は下記の通りにPHP側で設定してた。

```php:cache.php
<?php
header("Cache-Control: no-cache");
header("Pragma: no-cache");
```

これだとChromeとSafariでは残るらしく、ブラウザバックでキャッシュからページを表示していた。なので、ググってみたところ下記のようにヘッダーを設定すればいいよという内容を見つけたので修正。

```php:cache.php
<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
```

で、ChromeとSafariで確認するとちゃんとキャッシュが残らないようになっていた。

##問題2##

問題1の対応をした後、iOS7のSafari7で確認するとページがキャッシュを使って表示されていた。  
原因としては過去のキャッシュが残っていただけだったのだが、それに気づくのに小一時間ほどかかった。。。

どうもURLをキーにしてキャッシュを取り出しているのか、キャッシュを残さないようにしても過去のキャッシュが残っていればそれを使ってページを表示するっぽい。
Lravel5のMiddlewareを使って多段階認証


###やりたいこと

APIなどの認証でtoken(ID,PW)でそもそも、APIを使わせるかどうかという認証の他に、認証後、特定のパラメータが付与されているかどうか等、多段階のパラメーターチェックを行いたい場合がある。

だらだら書くと、

```php

//認証
if(!Auth) return error;

//その他の条件チェック
if(!A) return error;
if(!B) retunn error;
if(!C) return error;
if(!D) return error;

if(!isset(x)) return error;
if(!isset(y)) return error;

//メイン処理
$ans = x + y;
return $ans;
```
のような感じになり、ソースがかなり汚染され、凹む。

メインの処理は、

```
$ans = x + y;
return $ans
```

なのだが、その手前の処理がグチャグチャする。

常に同じ処理ならまだいいのですが、あるrouteはABCを評価、別のrouteはACDを評価とかなると、管理もややこしい。

これをMiddlewareを使って、整理したい。

###想定シチュエーション

* まずは、tokenでAPIを認証
* その後、端末番号を認証（登録された端末かチェック）
* 上記２つを通貨したもののみ、処理

といった感じ。登録された端末からのみ、APIを利用させたいようなシーン。

###結論

下記のようにroute,middleware,kernel.phpを定義すればできる。

####route（ルートから書いてみる・本当はMiddlewareの定義が先）

http://servername/app_root/public/hoge?taken=12345&term_id=67890

とかでアクセスして動くかどうか試す。

middlewareは配列で渡してやれば、その順番通りに実行され。この場合、まず、tokenチェック、そして端末番号チェック。

```php
Route::get('hoge',['middleware'=>['token','term'],function(){
	return "hoge";
}]);
```

もちろん、以下のとおり、Middlwareの定義、Kernel.phpへの登録が必要。

token評価用のミドルウエア。

```php:app/Http/Middleware/TokenAuth.php
<?php namespace App\Http\Middleware;

use Closure;

class TokenAuth {

	public function handle($request, Closure $next)
	{

		//token取得
		$token = $request->input('token');

		//評価
		if($token != "12345"){
			return "token error";
		}

		//問題ないなら次の処理へ
		return $next($request);
	}

}
```

端末番号評価用のミドルウエア。

```php:app/Http/Middleware/TermAuth.php
<?php namespace App\Http\Middleware;

use Closure;

class TermAuth {

	public function handle($request, Closure $next)
	{

		//端末番号取得
		$term_id = $request->input('term_id');

		//評価
		if($term_id != "67890"){
			return "term id error";
		}

		//問題なければ次の処理へ
		return $next($request);
	}

}
```

Kernel.phpへの登録（抜粋）。

```php:Kernel.php
	protected $routeMiddleware = [
		'auth' => 'App\Http\Middleware\Authenticate',
		'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
		'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
		'term' => 'App\Http\Middleware\TermAuth',
		'token' => 'App\Http\Middleware\TokenAuth',
	];
```

これでいちおう動く。

評価の数だけMiddlewareを作成して、必要なルートにだけ適用すればいい。
もちろんControllerのコンストラクタで適用をコントロールすることもできます。

###Groupを使う

当然、あるルートの全てに同じミドルウエアを定義したい場合がある。
その場合は、

```php
Route::group(['middleware'=>['token','term']],function(){

	Route::get('hoge',function(){
		return "hoge";
	});

	Route::get('foo',function(){
		return "hoo";
	});

});
```
などとする。
Parseで認証用Emailを再送する方法

#Parseには認証用Emailの再送機能が存在しない
Parseを使えばEmail認証機能が簡単に実装できるのですが、再送機能が存在しないようなので困りました。

検索すると2年程前の公式フォーラムでのやりとりがいくつか引っかかるのですが、そこではUserテーブルのemailカラムを更新すれば同じ値で更新したとしても送信されると中の人が答えています。
しかし実際は同じ値だと送信されないようです。
中の人は送信されると言い張っているのですが、僕も試したところ送信されませんでした。

なので、一度空にしてから元の値に更新するという方法で実装してみました。

##Client側(JavaScript SDK)
```js
    Parse.Cloud.run('resendEmailVerification', {})
    .then(function(result) {
        console.log(result);
    }, function(error) {
        console.error(error);
    });
```

##Server側(Cloud Code)
```js
Parse.Cloud.define("resendEmailVerification", function(request, response) {

    var user = request.user;
    var email = user.get("email");
    user.set("email", "");
    user.save()
    .then(function() {
        user.set("email", email);
        return user.save();
    })
    .then(function() {
        response.success("Successfully resent verification email.");
    }, function(error) {
        //emailの削除だけが成功した場合はよろしくない・・・
        response.error("RESEND_VERIFICATION_EMAIL_FAILED");
    });

});
```
Cloud Codeは使わずにすべてClient側でやってしまってもいいのですが、以下で説明するようなエラー対応はServer側の方がやりやすいと思います。

##2度目の更新でコケるとuserのemailが空になってしまう

空の値で更新->元の値で更新という2段階を経ているのですが、2つ目がコケた時はそのuserのemailカラムが空になってしまいます。

そうなると運営側で対応するしかなくなるので、元のEmailとuserIdをログに吐いたりエラー通知をメールで飛ばすようにする等の対応が必要かもしれません。

再送機能は必要としている人が多そうなのでParse側で実装して欲しいですね。
rvmでruby2.1.6をコンパイル中にOSXが再起動する問題

2回発生したのでレポートの中身を見てみた。

```
      Kernel Extensions in backtrace:
         com.kaspersky.kext.klif(3.0.5d45)[3D7EB379-CE07-01F7-CABB-EABC6EB917F3]@0xffffff7f90164000->0xffffff7f90177fff
            dependency: com.apple.iokit.IOStorageFamily(1.8)[A3CC4E44-8E10-3D9A-BA8E-95743E79D125]@0xffffff7f8fd7d000
```

犯人はカスペルスキーか……。
止めてインストールしたら成功しました
windows8でスクロール中でもピンチインなどで行う拡大を禁止する

スマホのスクロール時の拡大を止めるにはメタタグとcssでなんとかなった経験がある。

```html
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
```

```css
body {
  -webkit-text-size-adjust: 100%;
}
```

でもwindows8では上記のメタタグは効かない。

なので公式サイトを見てみると、今回の事象用に便利なcssプロパティが用意されていた
>https://msdn.microsoft.com/ja-jp/library/hh920761.aspx

```css
body {
-ms-content-zooming:none;
}
```

これだとスクロール中にピンチインされても拡大されなくなった。ハマったのでメモしておきます。
NetBeansで個人的に使用しがちなショートカットキー

| コマンド | 機能 |
|:-----------|:------------|
|	Ctrl + C	|	空選択で一行コピー	|
|	Ctrl + V	|	貼り付け	|
|	Ctrl + Shift + ↓	|	一行真下にコピー	|
|	Alt + Shift + ↓	|	選択行を下に移動	|
|	Crtl + Shift + Space	|	関数のドキュメント表示	|
|	Ctrl + F3	|	単語選択で検索	|
|	F3	|	次を検索	|
|	Shift + F3	|	前を検索	|
|	Ctrl＋[	|	対応する括弧に移動	|
|	Ctrl /	|	選択ブロックのコメント化 ON/OFF	|
| Ctrl + ; | 文末にコロン( ; )つける |
UIImageViewにborderを設定する


* UIViewと同じやりかたではできないっぽい
* border描画用のlayerをつくって、addLayerしたら描画できた

```objective-c
#import "MMNSBorderdImageView.h"

#import <QuartzCore/QuartzCore.h>

@implementation MMNSBorderdImageView

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        CALayer *borderLayer = [CALayer layer];
        CGRect borderFrame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
        [borderLayer setBackgroundColor:[UIColor clearColor].CGColor];
        [borderLayer setFrame:borderFrame];
        [borderLayer setBorderWidth:1.0];
        [borderLayer setBorderColor:[UIColor blackColor].CGColor];
        
        [self.layer addSublayer:borderLayer];
    }
    return self;
}

@end
```

http://stackoverflow.com/questions/11192190/set-border-around-uiimageview
atom scriptでrbenv globalの環境を使う

mac環境でatomのプラグインscriptからrubyを実行するとき困ったのでメモ。

http://qiita.com/takeyuichi/items/e32d7b4b551e434c5262　

からお知恵を拝借

結論としては、atomの初期化ファイル(init.coffee)で、rbenvのパスを通してあげればよい


```js:init.coffee
process.env.PATH = ["/Users/xxx/.rbenv/bin", process.env.PATH].join(":")

```

環境変数が設定されたかどうかについては,consoleを開いて確認すればよい。
winser を使って Let's Chat の自動起動を設定する

# 概要
Let's Chatをnpmのwinserを使ってサービス化します

# 手順
１、winserをインストール
　　`c:\(let'schatのinstall path)> npm install winser`
２、Let's Chatをサービスに登録する
　　`c:\(let'schatのinstall path)> node_modules\.bin\winser -i --startcmd node`
　　* `The program "lets-chat" was installed as a service.`と表示されればOK
> Options:
> --startcmd [command]  use this command for start service [npm start]

３、登録したサービスの設定画面を表示する
　　`c:\(let'schatのinstall path)> node_modules\winser\bin\nssm.exe edit lets-chat`
　　* この`lets-chat`は、Let's Chatのpackage.jsonに記述するnameプロパティの値です

４、「Arguments」に起動するプログラムを追記する
　　* 設定画面の「Application」タブを開くと、「Path」が「node」、「Startup directory」が「(let'schatのinstall path)」になっているはず
　　* 「Arguments」に「app.js」を追記
　　* 「Edit service」を押下して終了

５、Windowsのサービスに`lets-chat`が追加されているので、Let's Chatを開始する

# 備考
* サービスが正常に起動できない場合は、インストールの不備やsettings.ymlなどが間違っている可能性があります。
* コマンドプロンプトでLet's Chatのインストールフォルダまで移動し、`node app.js`を実行してみると何かわかるかもしれません。
** 正しく設定できていれば、上記コマンドでLet's Chatが起動します

# まとめ
`--startcmd`を使うところとサービス設定するところがわかりにくかったので、記事を作ってみました。

# 追記
* kounoikeさんにアドバイス頂きました。ありがとうございます！
** 「最初に一回だけmigroose.cmdを実行しといたほうがよい」
複数行パターンの一括置換

perl のワンライナーで処理します。

```
perl -0777 -i -pe 's/foo\nbar/foo bar/gm' foobar.text
```

## 例

Angular 1.x + babel + [ng-annotate](https://github.com/olov/ng-annotate) のプロジェクトで以下のように書いていたのですが、babel をバージョンアップしたら動かなくなりました。

```js
// @ngInject
export default class FooController {
}
```

そこで、以下の形式に変換します。

```js
export default /* @ngInject */ class FooController {
}
```

grep してマッチしたものだけ処理したいので、xargs を使います。

```
git grep --name-only '// @ngInject' | xargs perl -0777 -i -pe 's/\/\/ \@ngInject\nexport default class/export default \/* \@ngInject *\/ class/gm'
```

## 追記

やっぱり、以下の置換をしたほうが良いことがわかったので・・・

```js
// @ngInject
export default class FooController {
  constructor(foo, bar) {
  }
}
```

```
export default class FooController {
  // @ngInject
  constructor(foo, bar) {
  }
}
```

結局こんな感じで落ち着きました。

```
git grep --name-only '// @ngInject' | xargs perl -0777 -i -pe 's/\/\/ \@ngInject\n(.*)class (.*)(\n+)  constructor/$1class $2$3  \/\/ \@ngInject\n  constructor/gm'
```
メモ：Objective-C　〜　swift

Objective-C　から　Swiftを呼び出す。

Swiftでの記述

```
//
// Swift
//
//	NSObject継承
public class SwiftClass : NSObject {
}

//	@objc クラス
@objc public class SwiftClass_2 {
}

//	@objc プロトコル
@objc public protocol SwiftProtocol {
}
```

Objective-C（利用側）での記述。

```
//
// Objective-C
//
@protocol NativeBluetooth <SwiftProtocol>
@property (nonatomic) SwiftClass *obj;
@property (nonatomic) SwiftClass_2 *obj2;
@end

// 例
-(void) method {
    [swiftClass run];
}
```
MQTT-SNを簡単にテストする方法　その２

#MQTT-SNゲートウェイを動かしてみよう#
MQTT-SNの通信では **MQTT-SN**メッセージを **MQTT**メッセージ に変換してブローカーと仲介する**MQTT-SNゲートウェイ**が必要となります。　MQTT-SNクライアント(UDP)とMQTTブローカー(TCP/IP)は直接通信することはできません。 
その２では、MQTT-SNゲートウェイを作成してクライアントとブローカー間の通信を行います。　
さらに、シェアードメモリ上のリングバッファに出力されている通信ログをモニターしてみます。　
>RaspberryPiなどHDDのないマシンでは、ファイルをFlashメモリに作成するので、メモリの寿命を心配してSRAM上のリングバッファに書き出しています。

##用意するもの##
* クライアント用LinuxマシンとC++開発環境 
* ゲートウェイ用LinuxマシンとC++開発環境 　
* インターネットルーター　DHCPサーバー付

##ゲートウェイの作成##
**step1.  ソースコードの準備**    
**step1.  ホームディレクトリーで、Githubからライブラリーをダウンロードします。**    
>$ git clone https://github.com/ty4tw/AsyncMQTT-SN.git 

>AsyncMQTT-SN/AsyncGateway/srcにゲートウェイのソースコードとAsyncMQTT-SN/AsyncGateway/src/libに必要なライブラリーのソースコードが入っています。

**step2. ソースコードをコンパイルします。**    
>`$ cd AsyncMQTT-SN/AsyncGateway`
`$ make DEFS=-DNETWORK_UDP`
コンパイルエラーがなければゲートウェイをコピーします。
`$ make install`
実行モジュール **TomyGateway** がホームディレクトリーにコピーされます。

**step3. ゲートウェイのコンフィグレーションファイルを作成します。**    
>コンフィグレーションファイル **/usr/local/etc/tomygateway/config/param.conf**  を作成します。

```text:param.conf

BrokerName=test.mosquitto.org
BrokerPortNo=1883
SecureConnection=NO
#BrokerPortNo=8883
#SecureConnection=YES
StableNetwork=YES
GatewayID=1
GatewayName=TomyGateway-01
KeepAlive=900
#LoginID=
#Password=
SerialDevice=/dev/ttyUSB0
BroadcastIP=225.1.1.1
GatewayPortNo=2000
BroadcastPortNo=1883
```
>**BrokerName** で使用するプローカーのドメイン名、**BrokerPortNo** でブローカーのポートを指定します。
ブローカーとTLSで接続する場合は **BrokerPortNo**=8883 　**SecureConnection**=YES に変更します。
StableConnection はG3モデムを使用する場合などレスポンスが遅いか不安定な場合 NO にすることで CONNECTの処理が変わります。NOにするとCONNECTに時間がかかります。

**step5. リングバッファを使用するために必要なキーファイルを作成します。** 
>次の３つの空ファイルをキーファイルをとして作成します。
1) /usr/local/etc/tomygateway/config/**rbmutex.key**
2) /usr/local/etc/tomygateway/config/**ringbuffer.key**
3) /usr/local/etc/tomygateway/config/**semaphore.key**

**step6. ゲートウェイを起動します。** 
ただし、クライアントとは異なるマシンで実行する必要があります。
`$ ./TomyGateway`

異常終了しなければ、たぶん動いています。　動いていることを確認するために通信ログを見てみましょう。　


##ログモニターの作成##
**step1. ログモニターのコンパイル。** 
>`$ cd AsyncMQTT-SN/LogMonitor`
`$ make`
コンパイルエラーがなければログモニターをコピーします。
`$ make install`
実行モジュール **LogMonitor** がホームディレクトリーにコピーされます。

**step2. ログモニターの起動。** 
>'$ sudo ./LogMonitor

>ログが表示されます。


**ここで、Linuxクライアントを起動してください。　クライアント・ゲートウェイ・プローカー間で行われているメッセージ交換内容が表示されているはずです。**
![Screenshot from 2015-05-20 05:37:02.png](https://qiita-image-store.s3.amazonaws.com/0/41752/9ccc3a24-e441-e178-856d-cc523032a54e.png)


つぎは、[**その３**](http://qiita.com/TomoakiYAMAGUCHI/items/50bfc1842d77fc8ad0fd) でArduino用のクライアントを作成し、クライアント間で通信して、LEDを点滅させてみます。
【CakePHP】printfデバッグ用のメソッドまとめ


CakePHPでのprintfデバッグで使えるメソッドをまとめる。

##画面に出力
phpのvar_dump()やprint_r()はpreタグをつけないと配列やオブジェクトの結果が見づらいが、CakePHPのdebug()やpr()ならpreタグ付きで出力されるので見やすい。

出力するメッセージは文字列（数値）、配列、オブジェクトなんでもOK。

１．debug()

```php
debug('メッセージ');
```

また、第三引数にtrueを渡すとバッグトレース付きで出力してくれる。

```php
debug('メッセージ',null,true);
```

app/Config/core.phpのdebugが0（本番モード）の場合、出力されない。
そのため、var_dump()などに比べソースの中にdebug()を消し忘れて本番で表示されてしまう心配がない。（もちろん消し忘れはだめだけど。）
逆にdebug()しても出ない場合は、debugが0でないか確認すること。

２．pr()
print_r()の短縮形。print_r()に比べてpreタグ出るし、書くの楽。

```php
pr('メッセージ');
```

##ログに出力
ログをapp/tmp/logs/error.logに出力してくれる。
ログファイルをtailfしながらデバッグする。

出力するメッセージは文字列（数値）、配列、オブジェクトなんでもOK。

１．$this->log()
Cakeで用意されているクラスの大本に定義されているので、どこからでも呼ぶことができる。

```php
$this->log('メッセージ');
```

自分の環境では、$this->log()の結果に実行ファイルと行番号が出すためCakeに手を加えている。

ファイル：lib/Cake/Core/Object.php
※直接修正するより、appの下に同じファイル作ってオーバーライドする方法の方がいいのか？？指摘頂けるとありがたいです。

※行番号とファイルの取得はググった結果を組み合わせて書いてるけど、もっとシンプルな書きかたがあるような気がしていて、こういうのあるよというのがあれば教えて頂けるとありがたいです。

```php
public function log($msg, $type = LOG_ERR, $scope = null) {
  if (!is_string($msg)) {
    $msg = print_r($msg, true);

    //追加部分 start
    //デフォルトのログのみを対象にするため。
    if($type === LOG_ERR){
      //ファイル取得
      $trace = Debugger::trace(array('start' => 1, 'depth' => 2, 'format' => 'array'));
      $file = str_replace(array(CAKE_CORE_INCLUDE_PATH, ROOT), '', $trace[0]['file']);
      //行番号取得
      $line = $trace[0]['line'];
      //メッセージ作成
      $lineInfo = sprintf('%s (line %s)', $file, $line);
      $msg = "{$lineInfo} $msg";
    }
    //追加部分 end
  }

  return CakeLog::write($type, $msg, $scope);
}

```

２．LogError()

```php
LogError('メッセージ');
```
うららかな春の日、Parsecに思う

#じゃあ書いてよ、的な
[なんだかすげえと思った話](http://tokyo.yapcasia.org/sessions/learning_haskell.html)だけど、ちょっともやもやする。
> 正規表現ベースのパーサはメンテナンスしにくいのに気づいた？ Parsec を使って 15分で Perl6 の完全なパーサを書く方法を勉強しましょう。

だったらさ、だったらさ、C99, C++, Java, ruby, perl, python, HTML, PHP, ECT, CSS, Stylus,  Javascript, CoffeeScript, SQL, bash scriptくらいでいいからさ、完全なパーサのサンプル群をどっかにまとめて置いといてよ！うえーん

ほんと頼んます、大学院生(14)。15分/個×15個 = 225分。半日じゃないですかー、やだもー。

元言語のパーサが再利用性の高い状態で存在すると、「ちょっとした拡張をしたオリジナルプリプロセッサがいつでも簡単に作れます」状態になるし、そうすれば、プリプロセッサだって解法のひとつ、になるじゃん？　Haskellの数学的な記述で書かれたオリジナル文法なら、もうそれはコードの一部。

#趣味だからこそ
もう仕事でコーディングすることはなくて、今は所謂経営コンサルなので、本格的なコーディングはもう老後のオープンソースかな、とは思っているのだけれど。しかし、趣味だからこそ、辛いことはしたくない。なんのためにやっているかわかんなくなるからね。

[画面遷移の件](http://qiita.com/mrpepper/items/5750257057e44cb01fb3)なんかもそうだけど、やっぱり標準的な機能だけでは効率的に書きづらいものというのはあるわけで、なんかコピぺっぽい行動を強いられる度に、げんなりするのですよ。

設定ファイルをまるでコンパイルするかのように字句/構文解析してタスクツリーを組み立てて、組み立て終わったらぶん回るnginxなんて、設定ファイルをソースコードに見立てれば、ある意味丸ごと「俺様言語」だよね。そういうの、もっとあって良いと思うんだ。
ArchLinuxにLightdm、Cinnamonそれから日本語入力(ibusで詰まったのでまとめ)

ArchlinuxにLightDMとCinnamonとIM,IME入れたときのメモ
特にibusの設定の情報はたくさんあるけれども、使える状態にならないものが多かったのでそのまとめ
ArchLinux自体のインストールは紹介しません

xServerインストールまだなら

```shell-session
sudo pacman -S xorg-server xorg-server-utils xorg-xinit xorg-xclock
```

Cinnamonインストール

```shell-session
sudo pacman -S cinnamon cinnamon-control-center cinnamon-screensaver muffin nemo nemo-fileroller
```

lightdmインストール

```shell-session
sudo pacman -S lightdm lightdm-gtk-greeter 
greeterは後で好きなのに設定
```

ibusとmozc

```shell-session
sudo pacman -S ibus ibus-mozc
```

.xprofileに以下追記

```shell-session
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
ibus-daemon --xim --replace &
```
    
これで日本語入力できるはず
RailsじゃないRspec3環境を構築してGuardで自動実行する方法

# はじめに

[RailsじゃないRspec3環境を構築する方法](http://qiita.com/yusabana/items/db44b81bdddf6ed0e9f5) という記事でRailsじゃないプロジェクトでrspec3を導入する方法が紹介されています。
このページを参考にしてrspecをスムーズに導入できましたが、しばらく作業していたら次はrspecコマンドを実行するのが面倒になってきました。
guardを導入してファイルが更新されたタイミングで自動的にテストが走るように設定したので、その方法をメモします。

# 前提

[元記事](http://qiita.com/yusabana/items/db44b81bdddf6ed0e9f5) と同じ環境を前提としています。
つまりbundlerでgemの管理をして、rspec3以上を導入して、`bundle exec rspec`でテストが動くような状態です。
ファイル構成は以下のとおりです。

```
rspec_test
├── Gemfile
├── Gemfile.lock
├── lib
│   └── hello.rb
└── spec
    ├── hello_spec.rb
    └── spec_helper.rb
```

# 手順

## 1. guard-rspecを導入

[guard-rspec](https://github.com/guard/guard-rspec) というgemを導入します。

```diff:Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem 'rspec', '>= 3.0.0'
+ gem 'guard-rspec', require: false
```

## 2. Guardfile を生成

`guard init rspec` を実行します。Guardfileが作られます。

## 3. Guardfile を編集

Guardfileを以下のように編集します。

```rb:Guardfile
guard :rspec, cmd: 'bundle exec rspec' do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { "spec" }
end
```

例えば、hello.rbが変更された場合、`bundle exec rspec hello_spec.rb`が実行されます。

`cmd` というオプションで実際に実行するコマンドを指定します。bundler経由で`rspec`を実行しているので `bundle exec rspec`と指定する必要があります。

## 4. 実行

ターミナルで `bundle exec guard` を実行するとファイル監視が始まります。Ctrl-Dで終了できます。

## 5. (おまけ) 通知を表示する

実行後にMac OSXの通知センターを使って結果を表示するには [terminal-notifier-guard](https://github.com/Springest/terminal-notifier-guard) を使います。(Mac以外の人は他の通知gem用を使ってください。）

1. terminal notifierをインストール `brew install terminal-notifier`
2. Gemfileにterminal-notifier-guardを追加して、guardを再起動。

```diff:Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem 'rspec', '>= 3.0.0'
gem 'guard-rspec', require: false
+ gem 'terminal-notifier-guard', '~> 1.6.1'
```
CentOS7 設定


## 時刻

```
# timedatectl list-timezones
...
Asia/Tokyo
...
# timedatectl set-timezone Asia/Tokyo
# timedatectl status
```

###ntpを使って時刻をあわせる

```
# yum install -y ntp
# systemctl start ntpdate.service
# systemctl enable ntpdate.service
```

## ロケール

```
# localectl list-locales
...
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
...
# localectl set-locale LANG=ja_JP.utf8
# localectl
System Locale: LANG=ja_JP.UTF-8
```

## ホスト名

```
# vi /etc/hostname
foo.bar.jp
```
heroku forkコマンドで環境を複製


### 目的
外部の提携先にサービスを触って貰う場合や、
データ移行やDBの変更を伴う機能を試したい場合に作成する

今回はstaging環境からdevelopを構築する
heroku forkコマンドでフォークすることで、環境を簡単に複製することができる

## 準備
herokuコマンドのアップデート

```sh
> heroku update

```

## 環境をフォークする

stagingの環境をforkしてあげる

forkコマンドで環境の複製をしてやると、以下のことが行われる

* 新しいApps(環境)の生成
* fork元と同じアドオンの追加
 * (注意)同じプランが追加されるので、プランを変更しい場合はfork完了後にすぐに変更すること
* PostgreSQLデータベースのコピー
 * (注意)他のDBの場合はAddonを追加するだけ
* fork元の環境変数のコピー

```sh
> heroku fork --from staging --to develop

# 旧コマンド heroku fork -a staging develop

```
--from : fork元 
--to: fork先

PostgreSQLのデータのコピーと環境変数のコピーはつい先日まで手動だった気がする


## Schedularで定期実行するタスクのコピー
手動実行するしか無いので一つづつ見ながら追加すること

```
> heroku addons:open scheduler -a staging
> heroku addons:open scheduler -a develop
```

## git pushでDeploy可能にする
git pushでデプロするために、remoteリポジトリの設定をする

```
> git remote add develop git@heroku.com:develop.git
# 確認
> git remote -l
```

ref:https://devcenter.heroku.com/articles/fork-app#scheduler