OmniAICreator/Qiita-1.07M huggingface dataset:
ブランチの切り替えをしなくてよくなるコマンド git worktree がすごい！


masterブランチでちょっとした変更をしたいんだけど、devブランチで作業しているから切り替えるのはめんどくさい。
そんな時は**git worktree**を使ってみてください。複数のブランチを切り替えずに操作できます。
※git worktreeを使うにはGit 2.7.0以降が必要です。それ以前のバージョンだとgit worktree listがありません。

## ブランチの追加

操作したいブランチはこんな風に持ってくることができます。

```bash
git worktree add <作業ディレクトリ> <ブランチ名>
```

すると、作業ディレクトリ以下に指定したブランチの中身がリンクされます。
たとえば、`git worktree add ./worktree-dev dev`とコマンドを打つと、./worktree-devディレクトリが作成され、その下にdevブランチの内容ができるわけです。

git worktreeは今いるブランチに**影響を与えません**。
つまり、作業中であっても操作したいブランチを持ってこれます（厳密にはsubmoduleと同じリンクディレクトリができます）。

commitなどはさっきの作業ディレクトリ以下に移動して行うというルールがあるだけで、基本的には今まで通りでOKです。

ちなみに、すでにブランチがある場合は作業ディレクトリを省略すると、ブランチ名のディレクトリで作成してくれます。

```bash
git worktree add dev
```

## ブランチの削除
使い終わったブランチは作業ディレクトリを削除してください。
そののちに

```bash
git worktree prune
```

とコマンドを打てばキレイになくなります。

## ブランチの一覧
現在リンクされているブランチを確認するにはこんな感じ。

```bash
git worktree list
# こんな感じで一覧が見れます
# /Users/shibukk/git-worktree-test               6d44d5d [master]
# /Users/shibukk/git-worktree-test/worktree-dev  894cec9 [dev]
```

## 応用編
git worktreeを使えば、さくっと修正してpull requestを投げるためのブランチを1行で作れます。
`-b`は新規ブランチを一緒に作成するオプションです。

```bash
git worktree add hotfix-1 -b hotfix-1
```

なので、bashrcにこんな感じで指定のディレクトリにブランチを作成する関数を用意しておき、`.gitignore`でそのディレクトリを無視するようにしておくと便利です。

```bash:.bashrc
function gwt() {
    GIT_CDUP_DIR=`git rev-parse --show-cdup`
    git worktree add ${GIT_CDUP_DIR}git-worktrees/$1 -b $1
}
```

```bash:.gitignore
git-worktrees/*
```

```bash
# これだけでpull request用のブランチができる
gwt <新規ブランチ名>
```

なお、`git rev-parse --show-cdup`でリポジトリのrootを探すようにしているので、どのディレクトリにいてもgit-worktrees以下に作ってくれます。

ちなみに移動や削除もあると便利なので、以下の記事のシェルスクリプトを参考にすると良さそうです。
[git worktreeの操作を便利にする](https://qiita.com/mh_mobiler/items/1378eb037d72064772af#zshrc%E3%81%AB%E8%A8%98%E8%BC%89%E3%81%AE%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E5%85%A8%E6%96%87)

## 注意点
ローカルブランチがないとエラーになります。
リモートブランチにはあるという場合は、`-b`を使えば問題ありません。

また、既に作業ツリーが存在しているブランチをチェックアウトしようとすると`fatal: 'hotfix-1' already exists`みたいなエラーになるので、このエラーが出た場合は`git worktree list`を使って作業ツリーがないか確認してみてください。
作業ツリーがあった場合は上記のブランチ削除を実行すればOKです。
EmbulkのJavaコードで使われているコーディングスタイルAirliftってどんなスタイル？


[Embulkのソースコードスタイルチェック方法 (Java編)](http://qiita.com/hiroysato/items/584eafb4a94a961fa571) で自分の書いたプラグインのスタイルをチェックした。

修正した結果を踏まえて、指摘を受けた点についてメモをした。
詳しくは、[こちら](https://github.com/airlift/codestyle)を参照

その他色々あると思うけど、そのうち追加する予定。

## 空白

### ifやwhile

空白を開け、{の前も空白を開ける

ダメ

```java
if(x > 0){
```

OK

```java
if (x > 0) {
```

### if分などの()の前後は、空白を入れない。

ダメ

```java
if ( x > 0 ) {
```

OK

```java
if (x > 0) {
```

### elseやcatch, finally

独立した行にする。(※、つまり``}``を独立した行にしろということ)

ダメ

```java
} else if (x < 0) {
```

OK

```java
}
else if (x < 0) {
```

### カンマの後は、スペースを入れる

ダメ

```java
foo(boolean a,int x,int y,int z)
```

OK

```java
foo(boolean a, int x, int y, int z)
```

### 複数行の改行を入れない

ダメ

```java
package com.intellij.samples;


import com.intellij.idea.Main;
```

OK

```java
package com.intellij.samples;

import com.intellij.idea.Main;
```
elastic beats のfilebeatsをいじってみたぞメモ

elastic searchの仲間でbeatsがあります。これが凄いと[こちらの記事](http://acro-engineer.hatenablog.com/entry/2015/12/15/234056)でみたので、どんなものか、ちょっと触ってみましたので、そのメモです。

beatsにはログ取集系のfilebeatとリソースの状況をみるtopbeat、通信の状況をみるpacketbeatがあります。

今回はfilebeatです。

## インスートール
1. インストールは簡単で、サイトから環境に合わせてtarをダウンロードして展開します。macの場合は[ここ](https://download.elastic.co/beats/filebeat/filebeat-1.0.1-darwin.tgz)からダウンロードします。

![filebeatのダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/1686/769b22aa-3fbb-aaec-cd33-e81e6862a257.png)

2. ダウンロードしたら、それを解凍します。以上で終わりです。

## 設定
解凍した中には３つのファイルがあります。

```
filebeat
filebeat.yml
filebeat.template.json
```

filebeat.ymlの中身を見てみると、input先のログの指定とoutput先にelasticsearchやその他もろもろの設定をします。

```
filebeat:
  # List of prospectors to fetch data.
  prospectors:
    # Each - is a prospector. Below are the prospector specific configurations
    -
      # Paths that should be crawled and fetched. Glob based paths.
      # To fetch all ".log" files from a specific level of subdirectories
      # /var/log/*/*.log can be used.
      # For each file found under this path, a harvester is started.
      # Make sure not file is defined twice as this can lead to unexpected behaviour.
      paths:
        - /usr/local/project/famiphotos/log/rails_application*.log
      # - c:\programdata\elasticsearch\logs\*

・・・・・・・
・・・・・・・・
・・・・・・・・・

# Configure what outputs to use when sending the data collected by the beat.
# Multiple outputs may be used.
output:

  ### Elasticsearch as output
  elasticsearch:
    # Array of hosts to connect to.
    # Scheme and port can be left out and will be set to the default (http and 9200)
    # In case you specify and additional path, the scheme is required: http://localhost:9200/path
    # IPv6 addresses should always be defined as: https://[2001:db8::1]:9200
    hosts: ["192.168.25.50:9200"]

```

これを実際起動していくとfluentdと同じように指定したログがドンドンelasticsearchの方に格納されていきます。

で、サイトではこれをkibanaで見る方法まで記載あれてました。dashboardのテンプレートもあるので、手厚いサポートだなと思いました。
一番いいと思ったのは、こういうソリューションがフリーで使えるという点かと思います。

今後もちょくちょく情報を追記していきますが、一旦今日はここまで。
メンチン待ち当てゲームを作ってみた

# メンチン待ち当てゲームを作ってみた

[こちら](http://qiita.com/satthi/items/575b323578010a89c120)の続編になります。

コードは[こちら](https://github.com/satthi/majong_menchin_machi)(割と前回のコードを使いまわししてます。)

## やったこと

前回のシャンテン数のプログラムをベースにしました。

### 判定の仕方について

- 13枚分でテンパイかどうかを判定
- 1マン～9マンまでをそれぞれ1枚加えた場合に上がりかどうかを判定
- その上がり牌のリストと、回答したリストが一致しているかをで正解かどうかを判定

### 上がり判定について

基本はシャンテン数が「-1」であれば上がりです。ただし、「メンツ」が4つでかつ、「ターツ」が一つの場合も、-1となりますのでこの場合は上がりでないという処理を追加しています。(0としています)

### 外部からの入力について

```java
BufferedReader bin = new BufferedReader(new InputStreamReader(System.in)); 
String answer = bin.readLine(); 

```

こんな感じで、入力を受け付けることができたので、入力値を配列に分解して上がり牌かどうかを判定しました。

### 回答時間について

```java
long start = System.currentTimeMillis();
```

これで簡単に現在時刻を取得できたので楽にできた！

## おまけ

元々のプログラムがシャンテン数を計算するためのプログラムだったので、所々決め打ちしてた影響で、シャンテン計算のやり方も修正が必要だった。

~~計画性って大事ね！~~

後、意外とメンチンって13枚そろってもテンパイしないのな・・・。
＞からの次のネタが決まりました！
VbStrConv.Wide and VbStrConv.Narrow are not applicable to the locale specified.

英語ロケールなどでうまく動かない場合はLCIDを指定すればよい

```before.vb
 Return StrConv("１２３－４", VbStrConv.Narrow)
```

```after.vb
 Private ReadOnly _LCID As Integer = New System.Globalization.CultureInfo("ja-JP", True).LCID
 Return StrConv("１２３－４", VbStrConv.Narrow, _LCID)
```
Mongodb 最短入門(2)数万件いれて探してみた

#MongoDB　+ python の検索APIを作る

[Mongodb 最短入門(1)EC2にインストール&起動&いきなり数万件入れてみた](http://qiita.com/tottoko/items/db306eb668167937a1ac)　の続き


## MongoDB + python で検索

数万件もはいっても,日本語で部分一致でも検索できたよ。
(1)でEC2のt2.microで1Gくらいのテキスト量のデータをいれてみました。
けっこう軽い

### python の正規表現をオブジェクトで渡す

- コマンドラインだと、jsavascriptの正規表現を使います。
- pythonの正規表現でオブジェクトにして渡してあげたら、部分一致や正規表現が使える
- jsonでなくbsonで入ってるので、bsonのユーティリティ使います。

> python search.py

```py:search.py
# coding: utf-8
import pymongo
from bson.json_util import loads
from bson.json_util import dumps
import re

client=pymongo.MongoClient()
#database
db=client.test

regx = re.compile("ピンク", re.IGNORECASE)
cursor = db.honyarara.find({"title":regx})

for document in cursor:
    print dumps(document)

```


## APIサーバーにしてみます。
MongoDBにいれたデータを検索して、結果をjsonで返すCGIにしてみます

### python CGI起動　**ッターン!**
> python -m CGIHTTPServer &

こちら↓参照
[一行でCGIサーバー(1)python編](http://qiita.com/tottoko/items/15312af7eca45c67f4fd)

### URLにアクセスしてJSONがでるか確認

> curl http://127.0.0.1:8000/cgi-bin/search.py?q=test

今回は q=<>で渡された単語をtitle,もしくはkana という2個のフィールドを **OR検索** します

こんなデータがあるとして→`{"title":"test mongo!","kana":"てすと"},{},{},,`


```py:search.py
#!/usr/bin/python
# coding: utf-8

import pymongo
from bson.json_util import dumps
import re
import json
import cgi

print "Content-type: text/html\n\n"

client=pymongo.MongoClient()
#database test
db=client.test
#クエリを取得
form = cgi.FieldStorage()
#qというリクエスト変数があったら
if(form.has_key("q")):
    q = form["q"].value
    regx = re.compile(q, re.IGNORECASE)
#正規表現をフィールドにセットしてmongoの find メソッドで取得
    cursor = db.honyarara.find({
    "$or": [
    {"title":regx},
    {"kana":regx}
    ]
    })

else:
    print "{}"
    exit()

#リストにいれて、、bson → jsonの文字列　→ jsonから変数に変換
items=[]
for document in cursor:
    items.append(json.loads(dumps(document)))

#配列からjsonに変換
print json.dumps({"items": items }) 

```


## MongoDBの初期化

### 良い子は真似してはいけませんが、最初からやり直したいとき

- 停止する
> service mongod stop

- `/etc/mongo.conf` にかいてある データディレクトリを確認 `/var/lib/mongo`
- ざっくり中身を消す。もしくはmongodユーザーの権限でディレクトリを作りなおす
- もしくはconfで別の場所を指す
- で、再起動
> service mongod start

MySQLの作法にならっていてパスなどは同じようになっているらしい。昔のMyISAMで、ざっくりファイルを消したり移動したりが大丈夫、懐かしい。。
SlackのBotkitをWindowsで実行する

インストール方法の詳しい内容は

本家サイト
https://github.com/howdyai/botkit
または
Slackの新しいフレームワークBotkitを試してみる
http://qiita.com/icb54615/items/af08862dfaefbf2bbcbe
BotkitでSlackのBotをサクッと作る方法
http://toach.click/2016/01/10/slack-botkit/

を参照してインストールして下さい。

ここでは、説明書そのままではwindowsで動かない部分だけ説明いたします。

説明書では
token=\<MY TOKEN\> node bot.js
で実行してと書いてあるがwindowsだと環境変数の設定ができないためエラーになる
```c:\bot\botkit > token=<MY TOKEN> node bot.js```
これだとエラー


取りあえず動かすためには
```c:\bot\botkit > set token=MY TOKEN
(<>はいらないよ。自分のtokenで置き換えてね)```
とタイプした後に
```c:\bot\botkit > node bot.js```
こう実行する。

最終的にはheroku.comとかに上げるのだろうから
テストを実行するだけならこれで充分だと思います。

herokuにデプロイするための参考記事
http://blog.horimisli.me/entry/botkit-heroku-redis
Oracle Databaseで大きなダミー表を作る

検証用に大きなダミー表が必要な場合の作成メモ。

```sql
CREATE TABLE smalltable AS
  SELECT rownum AS num, dbms_random.string('A', 100) AS str
  FROM (SELECT 0 FROM dba_objects WHERE rownum <= 1000);

SELECT TO_CHAR(bytes / 1024 / 1024, '9,999,990.900') AS "MB"
FROM user_segments
WHERE segment_name = 'SMALLTABLE';

CREATE TABLE bigtable AS
  SELECT
    t1.num * 1000000 + t2.num * 1000 + t3.num AS num,
    t1.str AS str1,
    t2.str AS str2,
    t3.str AS str3
  FROM smalltable t1, smalltable t2, smalltable t3;

SELECT TO_CHAR(bytes / 1024 / 1024, '9,999,990.900') AS "MB"
FROM user_segments
WHERE segment_name = 'BIGTABLE';
```
戻り値の型のみが異なるメソッドを持つ複数のインタフェースを実装する

戻り値の型のみが異なるメソッドを持つインタフェースが複数あったとします。
通常これらのインタフェースを同時に実装したり拡張したりすることはできません。

```java:コンパルエラー
    interface A { int foo(); }
    interface B { String foo(); }
    interface AB extends A, B { }
```

```java
エラー: 型Bと型Aが適合していません。両方ともfoo()を定義していますが、戻り値の型が無関係です
    interface AB extends A, B { }
    ^
エラー1個
```

戻り値の型がともにインタフェースである場合も同様です。

```java:コンパイルエラー
    interface X {}
    interface Y {}
    interface A { X foo(); }
    interface B { Y foo(); }
    interface AB extends A, B {}
```

```java
エラー: 型Bと型Aが適合していません。両方ともfoo()を定義していますが、戻り値の型が無関係です
    interface AB extends A, B {}
    ^
エラー1個
```

ただし後者の場合は両方の戻り値の型を拡張するインタフェースを定義するとコンパイルできるようになります。

```java:コンパイルOK
    interface X {}
    interface Y {}
    interface A { X foo(); }
    interface B { Y foo(); }
    interface XY extends X, Y {}
    interface AB extends A, B { XY foo(); }
```

あるいは両方の戻り値の型を実装するクラスであっても構いません。

```java:コンパイルOK
    interface X {}
    interface Y {}
    interface A { X foo(); }
    interface B { Y foo(); }
    class XY implements X, Y {}
    interface AB extends A, B { XY foo(); }
```

絶対できないと思ってStackoverflowで質問したら回答があったのでびっくりしました。
[How can I implement Function and BiFunction at the same time?](http://stackoverflow.com/questions/34669586/how-can-i-implement-function-and-bifunction-at-the-same-time)
piculet - piculetを使ってみてはまったところ


Security Groupを別のAWSアカウントに移行する時に、piculetを使用した時のメモ
ruby2.0以上が必須など、インストールなどに戸惑ったので念のため

#### 環境

* OS:Ubuntu 14.04.1 LTS

#### インストール

##### ruby2.0以上が必要なので事前にrubyをインストール

```
sudo add-apt-repository -y ppa:brightbox/ruby-ng
sudo apt-get update
sudo apt-get install ruby2.1 ruby2.1-dev
```

##### piculetインストール

```
gem install piculet --no-ri --no-rdoc
```

#### 移行元からSecurity Groupをエクスポート

##### credentials設定

```
vi ~/.aws/credentials
------------------------------------------------------------
[default]
aws_access_key_id=<移行元のアクセスキー>
aws_secret_access_key=<移行元のシークレットキー>
------------------------------------------------------------
```

##### Security Groupエクスポート

```
piculet -e -r ap-northeast-1 -n <SecurityGroup> > Groupfile
```

* 複数登録されているSecurity Groupのうちの1つのみを移行するため「-n」オプション使用して明示的に指定

#### Security Groupをインポート

##### credentials設定

```
vi ~/.aws/credentials
------------------------------------------------------------
[defaults]
aws_access_key_id=<移行先のアクセスキー>
aws_secret_access_key=<移行先のシークレットキー>
------------------------------------------------------------
```

##### piculetのインポートコマンドをdry-run

```
piculet -a -r ap-northeast-1 -n <SecurityGroup> --dry-run
```

* 想定どおりの結果になるか確認
* Security Groupを明示的に指定しないと、完全同期しようとするので要注意！！

##### piculetのインポート

```
piculet -a -r ap-northeast-1 -n <SecurityGroup>
```

#### ※参考
* http://makaaso.hatenablog.com/entry/2016/01/12/182748
sqlcmdについて

#Sqlcmdのまとめ

##パス
基本的には下記のパスに配置されている。

```
C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE
```
##オプション
|オプション　引数|概要|
|:-----------|:------------|
|[-U login id]||
|[-P password]||
|[-S server]||
|[-H hostname]||
|[-E trusted connection]||
|[-d use database name]||
|[-l login timeout]||
|[-t query timeout]||
|[-h headers]||
|[-s colseparator]||
|[-w screen width]||
|[-a packetsize]||
|[-e echo input]||
|[-I Enable Quoted Identifiers]||
|[-c cmdend]||
|[-L[c] list servers[clean output]]||
|[-q "cmdline query"]||
|[-Q "cmdline query" and exit]||
|[-m errorlevel]||
|[-V severitylevel]||
|[-W remove trailing spaces]||
|[-u unicode output]||
|[-r[0|1] msgs to stderr]||
|[-i inputfile]||
|[-o outputfile]||
|[-z new password]||
|[-f <codepage> | i:<codepage>[,o:<codepage>]]||
|[-Z new password and exit]||
|[-k[1\|2] remove[replace] control characters]||
|[-y variable length type display width]||
|[-Y fixed length type display width]||
|[-p[1] print statistics[colon format]]||
|[-R use client regional setting]||
|[-b On error batch abort]||
|[-v var = "value"...]||
|[-A dedicated admin connection]||
|[-X[1] disable commands, startup script, enviroment variables [and exit]]||
|[-x disable variable substitution]||
|[-? show syntax summary]||
CS-Cart: 通知関数fn_set_notificationの使い方

CS-Cartでは、処理の成功・失敗などをUIにフィードバックできる通知(notification)の機構がある。Ruby on Railsなどのフレームワークでよく見かけるflash的なものだ。

この通知は、`fn_set_notification`を実行すると使うことができる。

## `fn_set_notification`

通知関数の引数などは次のようになっている。

```php
/**
 * Sets notification message
 *
 * @param string $type notification type (E - error, W - warning, N - notice, O - order error on checkout, I - information)
 * @param string $title notification title
 * @param string $message notification message
 * @param string $message_state (S - notification will be displayed unless it's closed, K - only once, I - will be closed by timer)
 * @param mixed $extra extra data to save with notification
 * @param bool $init_message $title and $message will be processed by __ function if true
 * @return boolean always true
 */
function fn_set_notification($type, $title, $message, $message_state = '', $extra = '', $init_message = false)
```

## サンプル

```php
fn_set_notification('E', __('error'), '失敗しました');
fn_set_notification('W', __('important'), '注意してください');
fn_set_notification('W', __('warning'), '注意してください');
fn_set_notification('N', __('notice'), '成功しました');
fn_set_notification('N', __('congratulations'), 'ついに成功しました');
fn_set_notification('S', __('notice'), 'アップデートがあります');
fn_set_notification('W', __('warning'), '問題が有ります。<a href="#">詳しく</a>');
```

<img width="559" alt="Screen Shot 2016-01-12 at 18.21.25.png" class="img-thumbnail" src="https://qiita-image-store.s3.amazonaws.com/0/889/7a6661c3-66ae-e660-6b5f-36caaa443a22.png">
CSV形式のデータのRによる重回帰分析のメモ

###CSV形式で以下のようなデータがあった時の基本的な重回帰分析のフローのメモです。
ファイル名:data.csv

Y|X1|X2|X3
---|---|---|---
1|2|3|4
5|6|7|8
9|10|11|12
13|14|15|16
17|18|19|20
21|22|23|24
25|26|27|28
29|30|31|32
33|34|35|36
37|38|39|40


####データ読み込み
```
sample=read.csv("data.csv")
```
####線形重回帰
```
model=lm(Y~., data=sample)
```
####その要約出力
```
summary(model)
```
####変数選択実行
```
smodel=step(model)
```
####その要約出力
```
summary(smodel)
```
【自分用】Gitまとめ

#git ステージング操作
##全ての変更をステージングに追加する
```
git add -all
```
##ステージングの状態を確認する
```
git status
```

#git commit 操作
##コミットする（メッセージ付き）
```
git commit -m "メッセージ"
```

##コミットログの一覧
```
git log
```
-n <d>で<d>で指定した部分だけのコミットログを表示する

#git branch 操作
##ブランチのチェックアウトと作成
```
git checkout -b <ブランチ名>
```
##ブラントのチェックアウト
```
git checkout <ブランチ名>
```
##ブランチの削除
```
git branch -d <ブランチ名>
git branch -D <ブランチ名>
```
-d または –delete はマージされたブランチは削除できる
-D は容赦なく（irrespective）ブランチを削除する

##リモーブランチの削除
```
git push <リモート> :<ブランチ名>
```

#Gitのクローン
```
git clone <リモートリポジトリ> <クローン先>
```


#ファイル、フォルダの名前変更
Gitでは小文字大文字の変更を認識しない、そのため下記のコマンドでファイル名を変更する必要がある。

```
git mv -f <旧ファイル名> <新ファイル名>
```

フォルダは一旦別名に変更する必要がある。
※ファイルの名前変更でも有効。

```
git mv <旧フォルダ名> <一時的なフォルダ名>
git commit .
git mv <一時的なフォルダ名> <新フォルダ名>
git commit .
```

#git stash 操作
##作業途中の内容を一時退避

```
git stash save <メッセージ>
```

##退避された一覧

```
git stash list
```

##退避された内容の適用

```
git stash apply <stash番号>
```

##退避された内容の削除

```
git stash drop <stash番号>
```

#git reset 操作
##ひとつ前のコミットを削除する

```
git reset --hard HEAD^
```
Slim 3 Frameworkでtwigを使う

メモとして残しておく

## app/settings.phpの編集

```php

return [
    'settings' => [
        
        ・・・

        // View settings
        'view' => [
            'template_path' => '{テンプレートのパス}',
            'twig' => [
                'cache' => '{キャッシュのパス}',
                'debug' => true,
                'auto_reload' => true,
            ],
            'extension' => [
                \Twig_Extension_Debug::class
            ]
        ],
        
        ・・・
    ],
];

```

## app/dependencies.phpの編集

```php

<?php

$container = $app->getContainer();

// Twig
$container['view'] = function ($c) {
    $settings = $c->get('settings');
    $view = new \Slim\Views\Twig($settings['view']['template_path'], $settings['view']['twig']);
    // Add extensions
    $extensions = $settings['view']['extension'];
    foreach ($extensions as $extension_class) {
        $view->addExtension(new $extension_class);
    }
    return $view;
};

```


## viewを表示してみる
public/index.php

```php

<?php
require __DIR__ . '/../vendor/autoload.php';


$settings = require __DIR__ . '/../app/settings.php';
$app = new \Slim\App($settings);

require __DIR__ . '/../app/dependencies.php';

$app->get('/', function ($request, $response, $args) {
    $view = $this->get('view');
    $view->render($response, '{テンプレートの名前}', []);
    return $response;
});

$app->run();


```
ブラウザ上のクリックした要素のXpathを取得する

Chrome DevToolsにあるCopy Xpathの機能を手元で実装したかった。このときのメモです。

ブラウザ上の要素をクリックしたときに、その要素のXpathを取得するように実装します。

ターゲットの要素から親を登っていって、兄弟要素があればそのindexを取得、というのを再帰していってタグ名を付け足していく感じです。

```js
function getXpath(element) {
  if(element && element.parentNode) {
    var xpath = getXpath(element.parentNode) + '/' + element.tagName;
    var s = [];

    for(var i = 0; i < element.parentNode.childNodes.length; i++) {
      var e = element.parentNode.childNodes[i];
      if(e.tagName == element.tagName) {
        s.push(e);
      }
    }

    if(1 < s.length) {
      for(var i = 0; i < s.length; i++) {
        if(s[i] === element) {
          xpath += '[' + (i+1) + ']';
          break;
        }
      }
    }

    return xpath.toLowerCase();
  } else {
    return '';
  }
}
```

取得すると``/html/body/div[2]/div[3]/div/div/div[1]/div[4]/div/div[2]/div/div``って感じのXpathが取得できる。


あとはクリックイベントをつけるだけ。

```js
document.addEventListener('click', function(e){
  console.log(getXpath(e.target));
});
```

これでどこをクリックしてもXpathが取得できるようになります。



これをブックマークレットにしておけば、非エンジニアでもXpathが扱えるようにできます。
[babel-cli] babelのコマンドライン実行( es6 to es5)

npmのバージョンは下記の通り

```
$ npm -v
2.10.1
```

babel 6.X.Xから、インストールパッケージは babel ではなく babel-cliになったとのこと

http://babeljs.io/blog/2015/10/31/setting-up-babel-6/es

インストール

```bash
# 作業ディレクトリで初期化
$npm init

# babel-cliのインストール
$npm install --save-dev babel-cli

# このままでは変換できないので、
# es5への変換に必要なプラグインが一通りはいった
# プリセットをインストール
# https://babeljs.io/docs/plugins/preset-es2015/
$npm install --save-dev babel-preset-es2015
```

このあと.babelrcを作成して、
es2015プリセットを使用すると教えてあげる

```json:.babelrc

{
    "presets": ["es2015"]
}
```

テスト用es6でかかれたファイルを用意

```javascript:test.js
const obj = (() => {
  return {
    method() {
      alert('Hello Babel!');
    }
  };
})();
```

変換

```bash
$ ./node_modules/.bin/babel test.js
'use strict';

var obj = function () {
  return {
    method: function method() {
      alert('Hello Babel!');
    }
  };
}();

```

無事変換されました
MySQL 5.7.5+ でのGROUP BYエラー



メモ

## 結論

* 5.7.5で仕様変わったから、my.cnfを変更して、前の動作させる



## エラー内容


```
Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'arashi_cake_web.c.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
```


## 設定

```my.cnf
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
```



## 参考


* [installation - Getting this SQL Error: GROUP BY incompatible with sql_mode=only_full_group_by - Craft CMS Stack Exchange](http://craftcms.stackexchange.com/questions/12084/getting-this-sql-error-group-by-incompatible-with-sql-mode-only-full-group-by)
[ATOM]キーボードマクロ作ってみた


## はじめに

個人的に、Emacsではキーボードマクロを多用するのだが、Atomにはなさそうだ。
ありそうな気がして探してみたけれど、さっぱりみつからなかった。

これ以上探す時間が惜しいので、勉強がてら自分でパッケージを作ってみました。

## インストール

Atomの設定を```cmd+,```で開いたら、左側の「+Install」を選んで

[atom-keyboard-macros](https://atom.io/packages/atom-keyboard-macros)

で検索するとでると思います。

## ショートカットキー

- ```ctrl-x (```  マクロの記録開始
- ```ctrl-x )```  マクロの記録終了
- ```ctrl-x e```  記録したマクロの実行

## 苦労話

以下、余談。

苦労したのが、キーダウンイベントの取得。

NodObjCでも使って低レベルでやらなければいけないかと思ったり、
atom.keymaps.handleKeyboardEventをのっとればいけるんじゃないかと試してみたり……。

結局、辿り着いた答えが

```
window.addEventListener('keydown', this.newHandleKeyboardEvent.bind(this), true)
```

みたいにwindowにイベントリスナーを追加するだけとか……。
ビンパッキング問題の解き方

# <i class='fa fa-star' /> 組合せ最適化問題の解き方の工夫
[組合せ最適化](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721)問題では、特有の難しさがあります。同じ問題であっても複数のモデル化の方法があり、モデルごとに優劣があります。モデル化の仕方が重要になります。
ここでは、ビンパッキング問題を例に、工夫の仕方を説明します。

# <i class='fa fa-star' /> ビンパッキング問題とは

<table>
<tr><td>容量$c(\gt 0)$の箱と$n$個の荷物$N=\{1,\dots,n\}$が与えられている。荷物$i \in N$の容量を$w_i(\gt 0)$とする。全ての荷物を詰合わせるのに必要な箱の個数を最小にする詰合わせを求めよ。</td></tr>
</table>

例えば、いくつかの重量物を10tトラックで運ぶ場合に、なるべく少ないトラック数を求めるような問題です。

参考
[ビンパッキング問題 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%B3%E3%83%91%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C)


# <i class='fa fa-star' /> 素直なアプローチ

そのまま定式化してみましょう。

<table>
<tr><td colspan="3">1段階定式化</td></tr>
<tr><td>$\mbox{objective}$</td><td>$\sum_i{y_i}$</td><td>箱数</td></tr>
<tr><td rowspan="2">$\mbox{variables}$</td><td>$x_{ij} \in \{0, 1\} ~ \forall i, j$</td><td>荷物$i$に箱$j$を入れるかどうか</td></tr>
<tr><td>$y_j \in \{0, 1\} ~ \forall j$</td><td>箱$j$を使うかどうか</td></tr>
<tr><td rowspan="3">$\mbox{subject to}$</td><td>$\sum_j{x_{ij}} = 1 ~ \forall i$</td><td>荷物$i$をどれかの箱に入れる</td></tr>
<tr><td>$\sum_i{w_i x_{ij}} \le c ~ \forall j$</td><td>箱$j$の容量を満たす</td></tr>
<tr><td>$x_{ij} \le y_j ~ \forall i, j$</td><td>$y$に関する制約</td></tr>
</table>

実は、この定式化は、ソルバーにとって解きにくい形となっており、計算に非常に時間がかかります。

# <i class='fa fa-star' /> 2段階で解く方法
箱の数を仮に固定して解が存在するかどうかを調べ、外側のループで箱の数を変えていく方法の方が結果的に早く解くことができます。

以下に、箱の数を固定した場合の定式化AとBを示します。

<table>
<tr><td colspan="3">2段階定式化A</td></tr>
<tr><td>$\mbox{objective}$</td><td>なし</td><td></td></tr>
<tr><td>$\mbox{variables}$</td><td>$x_{ij} \in \{0, 1\} ~ \forall i, j$</td><td>荷物$i$に箱$j$を入れるかどうか</td></tr>
<tr><td rowspan="2">$\mbox{subject to}$</td><td>$\sum_j{x_{ij}} = 1 ~ \forall i$</td><td>荷物$i$をどれかの箱に入れる</td></tr>
<tr><td>$\sum_i{w_i x_{ij}} \le c ~ \forall j$</td><td>箱$j$の容量を満たす</td></tr>
</table>

<table>
<tr><td colspan="3">2段階定式化B</td></tr>
<tr><td>$\mbox{objective}$</td><td>$y$</td><td>容量を超える分</td></tr>
<tr><td rowspan="2">$\mbox{variables}$</td><td>$x_{ij} \in \{0, 1\} ~ \forall i, j$</td><td>荷物$i$に箱$j$を入れるかどうか</td></tr>
<tr><td>$y \ge 0$</td><td>容量を超える分</td></tr>
<tr><td rowspan="2">$\mbox{subject to}$</td><td>$\sum_j{x_{ij}} = 1 ~ \forall i$</td><td>荷物$i$をどれかの箱に入れる</td></tr>
<tr><td>$\sum_i{w_i x_{ij}} \le c + y ~ \forall j$</td><td>箱$j$の容量を満たす</td></tr>
</table>

以下のような特徴があります。

定式化|解が存在するとき|解が存在しないとき
:--|:--|:--
2段階定式化A|非常に時間がかかる|すぐに終わる
2段階定式化B|すぐに終わる|非常に時間がかかる

このことから、AとBを並列に実行すれば、解が存在するかどうかすぐにわかります。
箱の数は2分探索すれば、効率的に求められます。

#### 頭の体操 (答えはコメント欄参照)

    並列にしないで､時間のかからない方法はあるか？


# <i class='fa fa-star' /> 近似解法でよい場合
厳密解法の定式化では解の対称性(箱Xと箱Yを交換してもよいこと)があるため、効率がよくありません。そこで、実務では近似解法を使うことが多くなるでしょう。
ビンパッキング問題を解く近似解法として列生成法があります。近似解法ではありますが、精度が期待できます。ただし、複雑な方法なので、説明は省略します。興味のある方は、比較的わかりやすい論文([はじめての列生成法](http://www.orsj.or.jp/archive2/or57-04/or57_4_198.pdf))をお読みください。
なお、Pythonでは、"pip install ortoolpy"でインストールできるortoolpy.binpackingで列生成法を行っています。

その他の近似解法としてよく使われるのは、貪欲法や局所探索法ですが、ここでは省略します。

# <i class='fa fa-star' /> 一般的な工夫
組合せ最適化問題は、指数オーダーであることが多いです。このことから、問題が分割できれば、近似解になりますが、高速化することができます。一般的には、[分割統治法](https://ja.wikipedia.org/wiki/%E5%88%86%E5%89%B2%E7%B5%B1%E6%B2%BB%E6%B3%95)と呼ばれます。

以上
Xcode 7.3 betaでプラグインを使う方法


Xcode 7.3 がリリースされましたね :)
https://developer.apple.com/xcode/download/

さて毎回困るのが、インストールする度にプラグインが動かなくなることです。

以下の方法で簡単に動くようになります。

#### 1. DVTPlugInCompatibilityUUIDsを調べる

```
defaults read /Applications/Xcode-beta.app/Contents/Info DVTPlugInCompatibilityUUID
```
- `Xcode-beta.app`とbetaバージョンを指定します
- `E71C2CFE-BFD8-4044-8F06-00AE685A406C` と出力されると思います

#### 2. 調べたDVTPlugInCompatibilityUUIDを追加する

```
find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults write FILE DVTPlugInCompatibilityUUIDs -array-add E71C2CFE-BFD8-4044-8F06-00AE685A406C
```

#### 3. Xcodeを再起動する
プラグインを有効にするかポップアップが表示されるので、**Load Bundle**を選択する

これで無事にプラグインが使用できるようになると思います
IPアドレスとセグメントの対比表をsqlite3に登録して参照しやすくする

## はじめに
- 「このIPアドレスが所属するセグメントはどれだ！」というのを一発で分かるようにしたかった。
- そこで、sqlite3に全てのIPを登録して参照するようにした。
- ものすごい力技なので、良い方法があればご教授ください。

## 要件
- sqlite3
- perl-Net-IP → ipcountコマンドに必要


## テーブル作成

```console
$ echo 'create table segment(IP varchar(255) primary key, Seg varchar(255) );' | sqlite3 segment.db
$ echo '.schema' | sqlite3 segment.db
CREATE TABLE segment(IP varchar(255) primary key, Seg varchar(255) );
```

## データ用意

```segments.txt
192.168.0.0/24         セグメントA
192.168.0.1/24         セグメントB
```

## スクリプト用意

```bash:import.sh

#!/bin/bash

# IPアドレス表記 -> 32bit値 に変換
function ip2decimal(){
    local IFS=.
    local c=($1)
    printf "%s\n" $(( (${c[0]} << 24) | (${c[1]} << 16) | (${c[2]} << 8) | ${c[3]} ))
}

# 32bit値 -> IPアドレス表記 に変換
function decimal2ip(){
    local n=$1
    printf "%d.%d.%d.%d\n" $(($n >> 24)) $(( ($n >> 16) & 0xFF)) $(( ($n >> 8) & 0xFF)) $(($n & 0xFF))
}

# IFS を改行文字にする
IFS='
'

for i in $(cat segments.txt)
do
    # リストを分解
    network=$( awk '{print $1}' <<<$i )
    segment=$( awk '{print $2}' <<<$i )

    # 最初と最後のIPを32bit値 に変換
    start=$(ip2decimal $(/usr/bin/ipcount $network | awk '{print $2}'))
    end=$(ip2decimal $(/usr/bin/ipcount $network | awk '{print $4}'))

    # IPアドレスとセグメント名の組合わせを登録
    for ip in $(seq $start $end)
    do
        addr=$(decimal2ip $ip)
        echo "INSERT INTO \"segment\" VALUES('$addr', '$segment');"  | sqlite3 segment.db
    done
done

```

## スクリプト実行

```console
$ bash import.sh
```
IP多いと時間かかります…

## テスト
```lang:console
$ echo "select * from segment WHERE IP='192.168.0.1';" | sqlite3 ./segment.db
192.168.0.1|セグメントA
```

## 謝辞

`ip2decimal` 及び `decimal2ip` は、[harasouさんの投稿](http://qiita.com/harasou/items/5c14c335388f70e178f5) を参考にさせていただきました。この場を借りてお礼申し上げます。
Laravel5でFORMの作成＜記事更新中＞

Laravelには便利なライブラリがいろいろあるそうです。
ライブラリをインストールするにはComposerを使用します。

Composerはインストールしてある状態です。
参考：[MAMPにLaravel5を使える環境を作ってみる](http://qiita.com/tagosaku324/items/0c51a400e0402b6ca2ad)

Laravel のViewでFormを記述するには直接HTMLを記述する方法とヘルパー関数を使う方法があるそうです。
それぞれ試してみます。

随時メモを追加していきます。


#ヘルパー関数パッケージ使用する場合
Form用のヘルパー関数パッケージ：LaravelCollective/html
参考URL：
[初めてのLARAVEL 5.1 : (16) FORMの作成](https://laravel10.wordpress.com/2015/03/08/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-16-form%E3%81%AE%E4%BD%9C%E6%88%90/)
・[LaravelCollective/htmlに関するGithub](https://github.com/LaravelCollective/html)
・[LaravelCollective公式サイト](https://laravelcollective.com/)

パッケージを追加する場合composer でインストール方法とcomposer.jsonに追記する方法があります。
公式サイトに書かれているほうがいいのかなと個人的には思っています・・

＜1. [初めてのLARAVEL 5.1 : (16) FORMの作成](https://laravel10.wordpress.com/2015/03/08/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-16-form%E3%81%AE%E4%BD%9C%E6%88%90/)での方式＞

```title:composerでインストール
$composer require laravelcollective/html
```

＜2. [LaravelCollective公式サイト](https://laravelcollective.com/)の方式＞

```title:composer.jsonに追記7行目あたり
"require": {
    "php": ">=5.5.9",
    "laravel/framework": "5.2.*",
    "laravelcollective/html": "5.2.*"
},
```
```
$composer update
```
##2の方式でLaravelCollective/htmlを追加する
私の環境ではcomposerは~/bin/composer.pharとして置いています。
参考：[MAMPにLaravel5を使える環境を作ってみる](http://qiita.com/tagosaku324/items/0c51a400e0402b6ca2ad)

```
$ /usr/bin/php ~/bin/composer.phar update
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing laravelcollective/html (v5.2)
    Downloading: 100%         

Writing lock file
Generating autoload files
> php artisan optimize
Generating optimized class loader
```
追加されました。次にライブラリの有効化をします。
config/app.phpは初期状態なのでタイムゾーンや日本語設定なども行います。

```titile:config/app.php
  1 <?php
  2 
  3 return [
  :
 55     'timezone' => 'Asia/tokyo',
  :
 68     'locale' => 'ja',
  :
124     'providers' => [
125         Collective\Html\HtmlServiceProvider::class,
  :
173     'aliases' => [
174         'Form' => Collective\Html\FormFacade::class, //追加
175         'Html' => Collective\Html\HtmlFacade::class, //追加
  :
```
[AngularJS] 目次


1. [初めの一歩](http://qiita.com/Koizumi-Greenwich/items/5f1799589eb335c6d68e)
2. [モジュール、コントローラー、サービス≪改訂≫](http://qiita.com/Koizumi-Greenwich/items/789276986bc3ff967eaa)
3. [サービス定義≪改訂≫](http://qiita.com/Koizumi-Greenwich/items/4464986399d3462e6ef7)
4. [$watch](http://qiita.com/Koizumi-Greenwich/items/539ccc4b995305d7ff00)
5. [イベント処理](http://qiita.com/Koizumi-Greenwich/items/12a65385177ebbb488d5)
6. [カスタムフィルタ](http://qiita.com/Koizumi-Greenwich/items/87e447fd329fd7c00fa6)
7. [ディレクティブ](http://qiita.com/Koizumi-Greenwich/items/287d36dfeb70333e00a4)
8. [カスタムディレクティブ](http://qiita.com/Koizumi-Greenwich/items/35becc74c18b2e854d09)
9. [ルートスコープ](http://qiita.com/Koizumi-Greenwich/items/aa3ac1aafbf1ec2a0c62)
roadworker - roadworkerを使ってみてはまったところ


Route53に登録してあるドメインを別のAWSアカウントに移行する時に、roadworkerを使用した時のメモ
ruby2.0以上が必須など、インストールなどに戸惑ったので念のため

#### 環境

* OS:Ubuntu 14.04.1 LTS

#### インストール

##### ruby2.0以上が必要なので事前にrubyをインストール

```
sudo add-apt-repository -y ppa:brightbox/ruby-ng
sudo apt-get update
sudo apt-get install ruby2.1 ruby2.1-dev libpcap-dev
```

##### roadworkerインストール

```
gem install roadworker --no-ri --no-rdoc
```

#### 移行元からDNSレコードをエクスポート

##### credentials設定

```
vi ~/.aws/credentials
------------------------------------------------------------
[default]
aws_access_key_id=<移行元のアクセスキー>
aws_secret_access_key=<移行元のシークレットキー>
------------------------------------------------------------
```

##### DNSエクスポート

```
roadwork -e -o Routefile --split
```

* 複数登録されているDomainのうちの1つのみを移行するため「--split」オプション使用

#### DNSレコードをインポート

##### credentials設定

```
vi ~/.aws/credentials
------------------------------------------------------------
[defaults]
aws_access_key_id=<移行先のアクセスキー>
aws_secret_access_key=<移行先のシークレットキー>
------------------------------------------------------------
```

##### roadworkerのインポートコマンドをdry-run

```
roadwork -a -f Routefile --dry-run
```

* 想定どおりの結果になるか確認

##### roadworkerのインポート

```
roadwork -a -f Routefile
```

#### ※参考
* http://makaaso.hatenablog.com/entry/2016/01/12/171557
利用しているRedmineのバージョンを確認する。

Redmineのバージョンを確認する方法です。

方法としては「1.管理画面で確認」「2.コマンドで確認」「3.ソースコードで確認」の３通り紹介します。

# 1.管理画面で確認
##### 1-1.管理者権限のあるアカウントでRedmineへログインします。
##### 1-2.「管理」をクリックします。
<img width="332" alt="20160112_redmine01.png" src="https://qiita-image-store.s3.amazonaws.com/0/82090/df5492e0-2af2-5c90-4946-9db76e5d44ab.png">

##### 1-3.「情報」をクリックします。
<img width="202" alt="20160112_redmine02.png" src="https://qiita-image-store.s3.amazonaws.com/0/82090/84d8540b-d699-5aa6-382b-ba8baeeac291.png">

##### 1-4.画面上部に表示されます。
<img width="995" alt="20160112_redmine03.png" src="https://qiita-image-store.s3.amazonaws.com/0/82090/ee8ee97a-9344-6619-97d5-78f4e01f30a7.png">

バージョンの他にも、
・Redmineのインストールの正常性
・データベースの種類
・Rdmineの実行環境
などが確認できます。


# 2.コマンドで確認
##### 2-1.サーバへログインし、Redmineをインストールしたディレクトリへ移動します。
##### 2-2.以下のコマンドを実行します。
※旧バージョンだとscript/aboutの場合があります。

```bash:コマンド
$ ruby bin/about 
```

```output:実行結果
Environment:
  Redmine version                3.2.0.stable
  Ruby version                   2.0.0-p647 (2015-08-18) [x86_64-linux]
  Rails version                  4.2.5
  Environment                    production
  Database adapter               Mysql2
SCM:
  Subversion                     1.8.13
  Git                            2.4.3
  Filesystem                     
Redmine plugins:
  no plugin installed
```

管理画面で表示されているものと同等の内容が確認できます。


# 3.ソースコードで確認
##### 3-1.サーバへログインし、Redmineをインストールしたディレクトリへ移動します。
lib/redmine/version.rbの冒頭にバージョンを表す数値が定義されています。

```bash:コマンド
$ cat lib/redmine/version.rb 
require 'rexml/document'

module Redmine
  module VERSION #:nodoc:
    MAJOR = 3
    MINOR = 2
    TINY  = 0
```

以上の３つの方法がありますが。
管理権限付きのユーザーを持っているのであれば「1.管理画面で確認」を行うのが一番良さそうです。
もし、管理画面へログインするアカウントがい場合は「2.コマンドで確認」が有効です。
また、「3.ソースコードで確認」は一応紹介しましたが、これを行うのであれば、「2.コマンドで確認」を行う方が良いです。
[自分用メモ]Androidで余った幅いっぱいに広げる時の注意

- 端(上端,下端,右端,左端)のViewを幅いっぱいにする場合はLinearLayoutを使うと楽
- 真ん中のViewを幅いっぱいにする時はRelativeLayoutを使うと楽

参考: [LinearLayoutとRelativeLayoutの使い方をまとめてみた - プログラミング雑記](http://d.hatena.ne.jp/Korsakov/20110131/1296504108)
Xvfb上にブラウザ起動し画面キャプチャ

## 参考

* [Using firefox on a headless server to make screenshots of websites • Jerel Unruh](http://jerel.co/blog/2010/10/using-firefox-on-a-headless-server-to-make-screenshots-of-websites)

## 準備

```bash:インストール
sudo apt-get install -y \
  Xvfb midori imagemagick
```

```bash:Xvfbサーバ起動
Xvfb :1 -screen 0 800x600x8 &
```

### アプリケーション起動

```bash:
DISPLAY=:1 midori --private http://myserver.com
```

### 画面キャプチャ

```bash:画面キャプチャ
DISPLAY=:1 import -window root -crop 800x600+0+0 \
 -resize 400x300 -quality 90 \
 /tmp/screenshot.jpeg
```

* /tmp/screenshot.jpeg を確認

### 10秒後アプリケーション終了

```bash:~/bin/capture.sh
export DISPLAY=:1

pgrep Xvfb || Xvfb $DISPLAY -screen 0 800x600x8 &
midori --private http://www.cnn.com &
sleep 10
import -window root -crop 800x600+0+25 -resize 400x300 -quality 90 /tmp/screenshot.jpeg
pkill midori
```

### 関数化

```bash:~/bin/capture.sh
#!/bin/sh
export DISPLAY=:1

xvfb_start() {
  pgrep Xvfb || Xvfb $DISPLAY -screen 0 800x600x8 &
}

capture() {
  midori --private "$1" &
  sleep 10
  import -window root -crop 800x600+0+25 -resize 400x300 -quality 90 /tmp/screenshot.jpeg
  pkill midori
}

xvfb_start
capture "http://www.cnn.com"
mv /tmp/screenshot.jpeg cnn.jpeg
```
iOS ReminderへのSwiftからの新規登録

iOS Reminder関係の処理についてスニペットをいくつか見かけるけど、基本的なことが書いてなかったので、Error処理 Swift2.0から変更に成った部分も合わせてまとめてみる。
＊いつも読んでるだけだったのでたまにはと思い初投稿。

## サンプルソースコード

```lang:swift

/* Step1: EKEventStoreインスタンスの作成 */
var eventStore = EKEventStore()

/* Step2: EKReminderインスタンスの作成と必要な情報のセット */
var NewReminder: EKReminder = EKReminder(eventStore: eventStore)
NewReminder.title = "新しいReminder"
NewReminder.calendar = eventStore.defaultCalendarForNewReminders()

/* Step3: Step2で作ったリマインダーインスタンスを保存する */
do {
     try eventStore.saveReminder(NewReminder, commit: true)
} catch let error{
     print(error)
}
```
        
## それぞれの解説
### Step1: EKEventStoreインスタンスの作成
EKEventStoreは本体内に存在するカレンダーやReminderの情報をRead & Writeできるクラス。カレンダー・Reminderで似ている関数も多いがデータ構造の違いもあり全て同じではない。なお処理が重いらしいのであまりたくさんインスタンス作らない方が良いらしい。

### STEP2: EKReminderインスタンスの作成と必要な情報のセット
EKReminderはリマインダーのためのオブジェクト。タイトルやプライオリティ・期限などをセットできる。eventStoreから取得して項目を編集しても良いが、今回は新規リマインダー作成のため新しくインスタンスから作成。EKReminder.calendarは、どのリストに登録するのかを指定する項目。defaultCalendarForNewReminders()はその端末内でデフォルト設定してあるリストを自動的に参照指定している
なおiOSの[設定->リマインダー->デフォルトのリスト]で設定ができる

### Step3: Step2で作ったリマインダーインスタンスを保存する
SWIFT2.0からdo catchが使えるので、それに合わせて。Objective-Cとはerrorの引数がないなど多少違うので過去記事見ていると若干迷うかも？ 

##### 参考 
[EKEventStore Class Reference](https://developer.apple.com/library/ios/documentation/EventKit/Reference/EKEventStoreClassRef/#//apple_ref/occ/instm/EKEventStore/saveReminder:commit:error:)
[Swift2.0で追加された try, do-catch, defer を試してみる](http://llcc.hatenablog.com/entry/2015/06/16/235054)


## その他メモ

#### 1) 既存のReminderの編集方法は？
基本的にsaveReminderで保存の仕方は同じ。
EKReminder.calendarItemIdentifier 
EKReminder.calendarItemExternalIdentifier
この辺をキー(*1)としてその他の項目を編集して、上記と同じようにEKEventStore.saveReminderに投げるだけで良い。

*1: これらのIDについては端末によって異なるっぽいが未検証

#### 2) パーミッション問題
そもそもMKEventStoreへアクセスする際にパーミッション周りで引っかかる人も多いようなので、その辺については下記を参照。
[iOSでカレンダーにアクセスしてイベントを取得する](http://qiita.com/ichiroc@github/items/3bb3813884fd61a161bd)

#### 3) 詳細なサンプル
そもそもReminder Managerみたいなクラス作って完成したと喜んでたら、そもそもちゃんと作り込んでいる人がいた。なんかほとんど似てる。。
[EventKit reminders manager : How to retrieve, create, and edit reminders from within your app in Swift](http://sweettutos.com/2015/11/25/eventkit-reminders-manager-how-to-retrieve-create-and-edit-reminders-from-within-your-app-in-swift/)
ターミナルで特定のポートを調べる


### 特定のポート番号のプロセスを調べる
```bash:
lsof -i:〇〇
```

### 現在のプロセスで文字列検索
```bash:
ps aux | grep 〇〇
```

### kill
```bash:
sudo kill -9 〇〇(PID)
```
monitで監視、アラート通知

## 参考

* [M/Monit | Wiki](https://mmonit.com/wiki/Monit/ConfigurationExamples)
* [WEB系各社で使われている監視ツールまとめ - mikedaの日記](http://mikeda.hatenablog.com/entry/2015/10/17/134805)


## インストール

* 依存パッケージがほぼない。

```bash:
sudo apt-get install -y monit
```

## 設定

> include /etc/monit/conf.d/*

* /etc/monit/monitrc は編集しない。最終行で上記があるので外出しする。


```apache:/etc/monit/conf.d/check_hosts.conf
#------------
# メール設定
#------------
# 指定しないとメールが飛ばなかった
set mailserver localhost

# アラート通知先
set alert mymobile@address.com


#--------------
# httpサーバ設定
#--------------
# monitのステータスをwebで見れる。localhostのみ許可
set httpd port 2812 and
   use address localhost
   allow localhost


#--------------
# 監視対象
#--------------
# http://server1.hoge.jp/ が停止・復旧したらメール通知
check host server1 with address server1.hoge.jp
    if failed url http://server1.hoge.jp/
    then alert

# server2.hoge.jp:22 が停止・復旧したらメール通知
check host server2 with address server2.hoge.jp
    if failed port 22
    then alert
```

## サービス起動

```bash:syntaxチェック
sudo monit -t
```

```bash:monit再起動
sudo systemctl restart monit
```

![monit.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cdd231b0-a0cc-6fea-4f73-71b37f6b33d9.png)

* http://localhost:2812

### 監視間隔

> set daemon 120

* 2分おきに監視(初期値)
CentOS7でDockerコンテナの自動起動


こちらの記事でSupervisordで自動起動する方法を書いてましたが、CentOS7のServiceだとこう書くのかなっというのがあったので再考してみます。

> [Dockerのコンテナ間でMySQL通信する方法（と、自動起動設定）](http://qiita.com/goosys/items/317ea5032e9c3914905a)

参考はこちら

> [再起動後もコンテナを自動起動する](http://qiita.com/tukiyo3/items/928d1902db6372e491c2)
> [AWS+CoreOS+Dockerでコンテナの自動起動 1](http://qiita.com/aki/items/979b25ff555eb7ab96fc)

# 構成と構想

* DB用コンテナ＋NginxProxyコンテナ＋サービス用コンテナ（複数）の構成
* 指定した順番通りに起動したい
* サービス用コンテナは日々増減するので、その都度修正が必要ないようにしておきたい
* サービス用コンテナは```Deployed-```で始まる```name```を持っている
* それら以外のコンテナはビルド用だったりするので、自動起動に含めたくない

# 設定する

```bash
$ sudo sh -c 'cat << EOF > /usr/lib/systemd/system/docker_autostart.service
[Unit]
Description=auto start of docker containers
After=docker.service
Requires=docker.service

[Service]
ExecStart=/bin/bash -c "/usr/bin/docker start mysql nginx-proxy \$(docker ps -aq --filter='"'"'name=deployed-'"'"')"

[Install]
WantedBy=multi-user.target
EOF'
```

```bash
$ sudo systemctl enable docker_autostart.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker_autostart.service to /usr/lib/systemd/system/docker_autostart.service.
```

これで、serviceに```docker_autostart```というサービス（unitっていうのかも？）が登録されるみたいです。
こうしておくと、再起動後にも（Dockerの起動完了を待って）コンテナが順番通りに起動します。


# 確認

```bash
$ sudo systemctl start docker_autostart
$ sudo systemctl status docker_autostart.service
● docker_autostart.service - auto start of docker containers
   Loaded: loaded (/usr/lib/systemd/system/docker_autostart.service; enabled; vendor preset: disabled)
   Active: deactivating (stop) since Tue 2016-01-12 15:42:47 JST; 9s ago
  Process: 4606 ExecStart=/bin/bash -c /usr/bin/docker start mysql nginx-proxy $(docker ps -aq --filter='name=deployed-') (code=exited, status=0/SUCCESS)
 Main PID: 4606 (code=exited, status=0/SUCCESS);         : 4764 (docker)
   Memory: 1.6M
   CGroup: /system.slice/docker_autostart.service
           └─control
             └─4764 /usr/bin/docker stop mysql nginx-proxy 79999cd8360a

Jan 12 15:42:46 localhost.localdomain systemd[1]: Started auto start of docker containers.
Jan 12 15:42:46 localhost.localdomain systemd[1]: Starting auto start of docker containers...
Jan 12 15:42:47 localhost.localdomain bash[4606]: mysql
Jan 12 15:42:47 localhost.localdomain bash[4606]: nginx-proxy
Jan 12 15:42:47 localhost.localdomain bash[4606]: 79999cd8360a
```
```bash
$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                         NAMES
79999cd8360a        my/stg_php            "/home/projects/servi"   4 days ago          Up 3 minutes        22/tcp, 80/tcp                deployed-www
67eda42c8aab        docker.io/mysql:5.6   "/entrypoint.sh mysql"   4 days ago          Up 3 minutes        0.0.0.0:33061->3306/tcp       mysql
fe44df169237        jwilder/nginx-proxy   "/app/docker-entrypoi"   2 weeks ago         Up 3 minutes        0.0.0.0:80->80/tcp, 443/tcp   nginx-proxy

```

# おわり

ファイル１つ作ってコマンド１つ送るだけで出来たのでお手軽でした。
めでたしめでたし。
mov -> gif

よく QuickTime Player で iPhone の動画とって gif にして社内で共有することがあるので、その時に使ってるコマンドをメモ。

必要なもの: ffmpeg, gifsicle (どっちも brew で入る)

```bash
ffmpeg -i input.mov -vf "scale=320:-1" -pix_fmt rgb24 -r 30 -f gif - | gifsicle --delay=3 --optimize=3 > output.gif
```

これでバグ報告するの捗る……ような気がしてます。

## 参考

- https://gist.github.com/dergachev/4627207
  - これそのまま使うと scale がいい感じにならないのと、フレームレートが厳しいので、そこだけ調整
【C++】void*を使った構造体やクラスの判別方法


# **voidポインタを使ったクラス・構造体の判別方法**

タイトルの通り、void*を使ったりtemplateを使って汎用性のあるコード作れると役に立つなと思いませんか？
現在、アルゴリズムを作りつつ得たノウハウをメモとして残します。


## 1. **そもそも、voidポインタって何？**
  【void*】とは、どんな型のポインタにも対応できる万能ポインタの事です。
【void*】が指している型は、charやint、short, long, (複合体である)structやclassかもしれない・・・
だからこそ、汎用性が高いのに使いにくいのが【void*】です。

## 2. **void*を使ってクラスや構造体を切り分けるとはどういうこと？**
void*とは、何でも表現できるのにそれを切り分けるようにするとはどういうこと？ と思った方もいらっしゃると思います。
切り分けるために必要なキーワードは、『フラグ・ID』です。
構造体やクラスの頭に必ず、識別子に代わるIDがあれば判別できると思います。
例えば、

```cpp:ssample.cpp
typedef struct stSample {
  char  m_ID; // ← このように、先頭に識別の役割をするIDを置く
  char* m_pData;
} Sample;
```

すると、メモリの配置としては以下のようなイメージになっていると思います。

![定義した構造体がメモリ上でどのようにマップされるか.png](https://qiita-image-store.s3.amazonaws.com/0/107688/a2f51d15-8fd8-7aac-6336-55c0ccb091b6.png)

32bit CPUの場合は、ポインタで扱うアドレス自体が4Byteなので、ポインタの変数の部分が4Byteになってます。
※ これは、double*でもvoid*でも『ポインタ』であればみな同じです。 (64bitでは、8Byteになります。)
ポイントは、定義順に前から詰めてメモリ上にマップされるということを理解頂ければと思います。

## 3.**実際に簡単なコードでイメージしてみましょう**
こんな感じで書いてみました。 (コンソールのコードですみません。)
あまり意味のないコードですみません…

```cpp:sample.cpp
enum structType {
  structType_1 = 1,
  structType_2
}

typedef struct stSample1 {
  char  m_ID;
  char* m_pData;
} Sample1;

typedef struct stSample2 {
  char    m_ID;
  double m_Data;
} Sample2;

void disp(void* pData);

void main() {
  Sample1 sample1;
  Sample2 sample2;

  sample1.m_ID = structType_1;
  sample1.m_pData = "てすと";
  sample2.m_ID = structType_2;
  sample2.m_Data = 0.125;

  disp(sample1);
  disp(sample2);
}

void disp(void* pData) {
  // ((char*)pData)[0]　が 2.の画像にある【m_ID】を表しています。
  switch( ((char*)pData)[0] ) {
  case structType_1:
    Sample1* pTmp = (Sample1*)pData;
    printf("Data: %s\n", pTmp->m_pData);
    break;
  case structType_2:
    Sample2* pTmp = (Sample2*)pData;
    printf("Data: %f\n", pTmp->m_Data);
    break;
  }
}
```

## 4.**セキュリティーを意識する**
3.で書いたコードですと外部公開する場合に、IDを改ざんされて意図しない動作に陥る可能性があります。
その場合は、以下のようにアクセス制限を付与すると安全になります。 (ただし、C言語では無理です。)
賛否両論あるかとは思いますが、、、

```cpp:sample.cpp
enum structType {
  structType_1 = 1,
  structType_2
}

typedef struct stSample1 {
private:
  char  m_ID;

public:
  stSample1() {
    m_ID = structType_1;
  }

public:
  char* m_pData;
} Sample1;

typedef struct stSample2 {
private:
  char    m_ID;

public:
  stSample1() {
    m_ID = structType_2;
  }

public:
  double m_Data;
} Sample2;
```

# **まとめ**
  void*を使った構造体やクラスの判別方法を書きました。
クラスや構造体の先頭に識別用の変数を用意してあげる事で、アドレスの頭からIDの変数の型のByte分だけ取得することで、
識別用の変数にあたる値を取れるので、利用できるよって話でした。
Git ファイル/ディレクトリ名の大文字・小文字変換

ファイル/ディレクトリ名を大文字⇆小文字変換してもgitの差分として反映されないようです。
以下、ファイル/ディレクトリ名を大文字⇆小文字変換する方法です。

# ファイル名の大文字⇆小文字変換

`-f`オプションを追加して名前を変更します。
file.js→File.js

```
$ git mv -f file.js File.js
```

# ディレクトリ名の大文字⇆小文字変換

ファイル名みたいにディレクトリ名だと`git mv -f`で大文字⇆小文字変換できないので、`core.ignorecase`を変更します。
※デフォルト(true)の状態だと大文字・小文字認識されない。

```
$ git config core.ignorecase false
```

これでエディタなどでディレクトリ名の大文字⇆小文字変換してもgitの差分として認識されます。
Swift2 背景グラデーションの各種設定

### 背景グラデーション
色の設定と角度の設定
![img.png](https://qiita-image-store.s3.amazonaws.com/0/54553/3666b066-d841-0646-a221-b432ded279d2.png)


```swift:ViewController.sift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let gradientLayer = CAGradientLayer()
        let angle:String = "0"
        
        let start:CGPoint
        let end:CGPoint
        
        
        gradientLayer.frame = self.view.bounds
        
        // グラデーションの色
        let red = UIColor.redColor().CGColor
        let green = UIColor.greenColor().CGColor
        let yellow = UIColor.yellowColor().CGColor
        let blue = UIColor.blueColor().CGColor
        let purple = UIColor.purpleColor().CGColor
        
        // グラデーションの角度
        switch (angle) {
        case "0":
            start = CGPointMake(0.5, 0.0);
            end = CGPointMake(0.5, 1.0);
            break;
        case "45":
            start = CGPointMake(1.0, 0.0)
            end = CGPointMake(0.0, 1.0);
            break;
        case "90":
            start = CGPointMake(1.0, 0.5);
            end = CGPointMake(0.0, 0.5);
            break;
        default:
            start = CGPointMake(0.5, 0.0)
            end = CGPointMake(0.5, 1.0)
            break;
        }
        
        gradientLayer.colors = [red, green, yellow, blue, purple]
        gradientLayer.locations = [0.0, 0.25, 0.5, 0.75, 1.0]
        gradientLayer.startPoint = start
        gradientLayer.endPoint = end
        // self.view.layer.addSublayer(gradientLayer)
        self.view.layer.insertSublayer(gradientLayer, atIndex: 0)
    }
}
```
yaml: 配列と hash の cheat sheet

code

```cheet_sheet.rb
require 'yaml'

array_of_string = ['a', 'b', 'c']
array_of_array = [
                  ['a1', 'a2'],
                  ['b1', 'b2'],
                  ['c1', 'c2'],
                 ]
array_of_hash = [
                 {'k1' => 'v1'},
                 {'k2' => 'v2'},
                 {'k3' => 'v3'},
                ]
hash_of_string_to_string = {
  'k1' => 'v1',
  'k2' => 'v2',
  'k3' => 'v3',
}
hash_of_string_to_array = {
  'k1' => [ 'a1', 'a2' ],
  'k2' => [ 'b1', 'b2' ],
  'k3' => [ 'c1', 'c2' ],
}
hash_of_string_to_hash = {
  'k1' => { 
    'K11' => 'V11',
    'K12' => 'V12' 
  },
  'k2' => {
    'K21' => 'V21',
    'K22' => 'V22',
  },
  'k3' => {
    'K31' => 'V31',
    'K32' => 'V32',
  },
}
puts 'array_of_string'
puts YAML.dump(array_of_string)
puts
puts 'array_of_array'
puts YAML.dump(array_of_array)
puts
puts 'array_of_hash'
puts YAML.dump(array_of_hash)
puts
puts 'hash_of_string_to_string'
puts YAML.dump(hash_of_string_to_string)
puts
puts 'hash_of_string_to_array'
puts YAML.dump(hash_of_string_to_array)
puts
puts 'hash_of_string_to_hash'
puts YAML.dump(hash_of_string_to_hash)
```

実行結果

```
array_of_string
---
- a
- b
- c

array_of_array
---
- - a1
  - a2
- - b1
  - b2
- - c1
  - c2

array_of_hash
---
- k1: v1
- k2: v2
- k3: v3

hash_of_string_to_string
---
k1: v1
k2: v2
k3: v3

hash_of_string_to_array
---
k1:
- a1
- a2
k2:
- b1
- b2
k3:
- c1
- c2

hash_of_string_to_hash
---
k1:
  K11: V11
  K12: V12
k2:
  K21: V21
  K22: V22
k3:
  K31: V31
  K32: V32
```