OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7での基本操作[ネットワーク周り]


NetworkManager様に逆らっては生きていけないようなのでとりあえずまとめ。



## ホストネーム

### 確認

```
hostnamectl [status]
nmcli g hostname
```

### 設定

```
hostnamectl set-hostname centos7.youyo.info
```

## IPアドレス

### 確認

```
nmcli c show enp5s0
```


### 設定

- 追加

```
nmcli c add autoconnect yes type ethernet con-name enp5s0 ifname enp5s0 ip4 10.0.0.210/24 gw4 10.0.0.1
nmcli c up ethernet-enp5s0
```

- 修正

```
nmcli c modify enp5s0 ipv4.addresses "10.0.0.220/24 10.0.0.1"
nmcli c modify enp5s0 +ipv4.dns "8.8.8.8 8.8.4.4"
```

- 反映

```
systemctl restart network.service
```

- 削除

```
nmcli c delete enp5s0
```


## 便利パッケージ

コマンド補完が強力になる。必須。

```
yum install bash-completion
```
シートの最後の行をコピーして次の行にコピーする

スプレッドシートを使って定期的にデータを取得していると
シートの最後の行をコピーして次の行にコピーしたいことが多くあるのでまとめておきます

`{sheet}.getLastRow();` という関数があるのでこちらを使いました。

```js
var spreadsheet = SpreadsheetApp.openById('hoge');
var sheet = spreadsheet.getSheetByName("fuga");

function copyLastRow() {
  var lastRow = sheet.getLastRow();
  var copyRow = lastRow + 1;  
  sheet.getRange(lastRow,1,1,10).copyTo(sheet.getRange(copyRow,1));
}

// コピーした後に日付(1行目)と更新する値(8行目)を変更するスクリプト
function pushWeeklyData() {
  var lastRow = sheet.getLastRow();
  var copyRow = lastRow + 1;  
  sheet.getRange(lastRow,1,1,10).copyTo(sheet.getRange(copyRow,1));
  
  var today = getToday();  
  var data  = getData('hoge');  
  sheet.getRange(copyRow,1).setValue(today);
  sheet.getRange(copyRow,8).setValue(data);
}

function getToday() {
  return Utilities.formatDate(new Date(),"JST","yyyy/MM/dd");
}
function getData(param) {
  return 'hoge!';
}
```
Lombok

# Lombokとは？
JavaのボイラープレートコードをシンプルにしてくれるJavaのライブラリです。非常に強力です。
例えばJavaBeansコードを書く際に、本ライブラリを使用すればgetterメソッド・setterメソッドをコード上に直接書かなくて済みます。
またプログラムが手続き的ではなく、宣言的になり可読性が高まります。
（Lombokは内部的にAST変換を利用しています。）

<br>

続きは以下を参照ください（内容を移動させました）

[**Lombokを開発環境にインストールする（Eclipse）**](https://blog.y-yuki.net/entry/2016/09/11/064316)

[**Lombokを用いた開発 (1)**](https://blog.y-yuki.net/entry/2016/09/27/054642)

[**Lombokを用いた開発 (2)**](https://blog.y-yuki.net/entry/2016/09/28/003000)

[**Lombokを使った開発ひと巡り**](http://blog.y-yuki.net/entry/2016/10/15/165320)
Teratermマクロ(鍵認証接続)

よく使うTeratermでのSSH接続マクロのメモです。
※Terterm : Version 4.8.5
※拡張子.ttlをteraterm-macroに関連付けて利用するとダブルクリックで接続できるようになります。

```bash:username@hostname.ttl
;==============================================
;; 接続先IPアドレス
HOST='192.168.xx.xx'
;; ポート番号(SSH:22)
PORT='22'
;; ユーザ名
USERNAME='username'
;; キーファイル名
KEY_FILE='id_rsa'
;; 設定ファイル(任意)
INI_FILE='TERATERM.INI'
;==============================================

;; マクロを配置したフォルダに秘密鍵のファイルを置く場合。
;; それ以外は適宜KEY_FILE_PATHの値を鍵ファイルのパスに変更する。
MACRO_DIR=''
KEY_FILE_PATH=''
;; マクロを配置したフォルダの絶対パス取得
getdir MACRO_DIR
;; 鍵ファイルパス生成
strconcat KEY_FILE_PATH MACRO_DIR
strconcat KEY_FILE_PATH '\'
strconcat KEY_FILE_PATH KEY_FILE

;; 設定ファイルパス生成(任意)
strconcat INI_FILE_PATH MACRO_DIR
strconcat INI_FILE_PATH '\'
strconcat INI_FILE_PATH INI_FILE

;; 接続コマンド生成
COMMAND = HOST
strconcat COMMAND ':'
strconcat COMMAND PORT
strconcat COMMAND ' /ssh /2 /auth=publickey /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /keyfile='
strconcat COMMAND KEY_FILE_PATH
;; 設定ファイル読み込み(任意)
;; strconcat COMMAND ' /F='
;; strconcat COMMAND INI_FILE_PATH

;; 接続
connect COMMAND
 
end
```

接続できない場合は以下の関数を使って文字列を表示してみる。
※パスに空白等が入ると接続できない可能性があります。

```bash:マクロデバッグ用関数
messagebox <message> <title>
```

※COMMANDに/F='ファイルパス'を追加指定すると設定ファイルを読み込むことも可能です。

参考URL：Teratermマクロ - コマンド一覧
http://ttssh2.sourceforge.jp/manual/ja/macro/command/
他人のDockerfileを再利用して楽をする


[Docker Advent Calender](http://qiita.com/advent-calendar/2014/docker) 22日目の記事です。
Dockerfileを書くのってだるいですよね。今日は他人のDockerfileを利用して楽をする方法を紹介します。ちなみに全然大したことしてません。

あるミドルウェアやアプリケーションを使いたい場合、apt-get installやbrew installではなくdocker pull ***でミドルウェアやアプリケーションを立ちあげられるのは"""時代"""を感じさせるのですが、docker repositoryにイメージがない場合ってありますよね。

自分の場合elasticsearchのイメージはあるけど、kuromojiやtwitter-riverのプラグインが最初から入っているイメージはありませんでした。

そこでおすすめなのは既存のdocker imageを再利用して自分好みのdocker imageを作る方法です。

まず、[docker repository](https://registry.hub.docker.com/)で使えそうなイメージを探します。オフィシャルのイメージはないようですが、[elasticsearchのイメージ](https://registry.hub.docker.com/u/dockerfile/elasticsearch/)があったのでそれを利用します。

[Dockerfile](https://github.com/dockerfile/elasticsearch/blob/master/Dockerfile)を見ると、/elasticsearchにインストールされていることがわかりますので、
次のようなDockerfileを書きます。

```
FROM dockerfile/elasticsearch
# FROMに使いたいイメージを指定する。

RUN /elasticsearch/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/2.2.0
# 好きなコマンドを実行する

```

あとはdocker buildするだけです。

```
docker build -t elasticsearch-kuromoji .
```

### まとめ
[オフィシャルのDockerfile](https://github.com/docker-library)を読むとこんな技があるのかと役に立つのでお勧めです。
すべてのソフトウェアのdocker imageが公開されて、我々がDockerfileが書かなくて良い未来が来ることを願っています。
[Unity] 文字列をメソッド拡張して Debug.Log をカラフルにしよう


タイトルはちょっとふざけてますが, 地味に実用性あるかなと
思ったりするエントリーです.

前回, 『[[Unity] Debug.Log で出力する文字の色を変えよう](http://qiita.com/phi/items/d98a177f4e12426d9f4f)』というエントリーを
書かせてもらいました.

んで, 引き続き調べてみると色以外にもサイズ変えたりボールドにしたり
できるみたいですねこれ!! めっちゃ便利♪
http://docs.unity3d.com/Manual/StyledText.html

ただ, 色とかサイズとかスタイルとか同時に指定してたら
文字列がタグだらけになってしまいます.

そこで今回は, そうならないように文字列クラス(string)をメソッド拡張しちゃって
スマートにデコれるようにしてみました.って話です.

※実際に使いたい方は, gist に書いたので[こちら](https://gist.github.com/phi-jp/76929afd625a872ff1ed#file-stringextensions-cs)から StringExtensions.cs を
ダウンロードしてプロジェクトに追加して使ってください.


![1.png](https://qiita-image-store.s3.amazonaws.com/0/7756/b5aeb330-50da-78a5-86a4-2ec7f22e112d.png "1.png")


## string をメソッド拡張してタグ付けを楽にする

オレオレコードを書きたい自分としてはすごく嬉しい C# のメソッド拡張使います.
んで下記のように string を拡張します.

```csharp
using System;
 
namespace tm.Extensions {
 
    public static class StringExtensions {
 
        public static string Coloring(this string str, string color) {
            return string.Format ("<color={0}>{1}</color>", color, str);
        }
        public static string Red(this string str) {
            return str.Coloring ("red");
        }
        public static string Green(this string str) {
            return str.Coloring ("green");
        }
        public static string Blue(this string str) {
            return str.Coloring ("blue");
        }
 
        public static string Resize(this string str, int size) {
            return string.Format ("<size={0}>{1}</size>", size, str);
        }
        public static string Medium(this string str) {
            return str.Resize (11);
        }
        public static string Small(this string str) {
            return str.Resize (9);
        }
        public static string Large(this string str) {
            return str.Resize (16);
        }
 
        public static string Bold(this string str) {
            return string.Format ("<b>{0}</b>", str);
        }
        public static string Italic(this string str) {
            return string.Format ("<i>{0}</i>", str);
        }
    }
 
}
```

## 使い方

`using tm.Extensions;` すると上記のメソッド拡張が有効になるので
あとはこんな感じで書けばデコった文字が Unity の Console パネルに表示されます.

```csharp
// color
Debug.Log ("Hello, world(Red)".Red ());
Debug.Log ("Hello, world(Green)".Green ());
Debug.Log ("Hello, world(Blue)".Blue ());
// size
Debug.Log ("Hello, world(Medium)".Medium());
Debug.Log ("Hello, world(Small)".Small());
Debug.Log ("Hello, world(Large)".Large());
// style
Debug.Log ("Hello, world(Bold)".Bold());
Debug.Log ("Hello, world(Italic)".Italic());
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/7756/b5aeb330-50da-78a5-86a4-2ec7f22e112d.png "1.png")


## OnGUI でも♪

もちろん[前回](http://qiita.com/phi/items/d98a177f4e12426d9f4f)同様, OnGUI の GUI.Label とかでも使えます!

```csharp
void OnGUI() {
GUI.Label (new Rect(10, 10, 100, 100), "Hello, world".Red().Large().Italic());
}
```

![2.png](https://qiita-image-store.s3.amazonaws.com/0/7756/784f3948-d2e3-4567-9747-9121adfb4a88.png "2.png")
関数内のstatic変数が初期化するのはその行が実行されるとき

以下の内容は間違ってる部分があります、正しくはコメントを参考してください。

---

当たり前だけと多くのサイトでは誤解しやすいように書かれています、
関数内のstatic変数はプログラムが実行されるときではなく関数が実行されるときでもはく
その行が実行されるときに初期化されます。

テストコード

```c++
#include <iostream>

int static_int(int value) {
	std::cout << "create " << value << std::endl;
	return value;
}

void hoge(int i) {
	std::cout << "call hoge" << std::endl;
	if (i >= 0) {
		std::cout << "if i positive" << std::endl;
		static int ii = static_int(i);
		std::cout << ii << std::endl;
	} else {
		std::cout << "if i negative" << std::endl;
		static int ii = static_int(i);
		std::cout << ii << std::endl;
	}
}

int main() {
	hoge(1);
	hoge(2);
	std::cout << "---" << std::endl;
	hoge(-1);
	hoge(-2);
	return 0;
}
```

実行結果

```text
call hoge
if i positive
create 1
1
call hoge
if i positive
1
---
call hoge
if i negative
create -1
-1
call hoge
if i negative
-1
```

* 実行結果から分かること

    * static変数はその行が実行されるときに初期化されます

    * static変数の初期化に普通の変数を使えます（実際に使うのは控えてください）

    * static変数の初期化は一回しかしません（マルチスレッドでなければ）

基本的にstatic変数を一回目の実行結果を保存して二回目以降で使う変数だと思えばいいでしょ。

マルチスレッドの場合はコンパイラによっては一回以上初期化されることがあります、
上記の例ではstatic_int関数が複数回実行され、iiは最後に実行した回の結果になります。
詳しくはthreadsafe-staticsを検索してください。
logrotateによるApacheログローテーション設定

Apacheのログファイルはrotatelogsでローティションさせる事が出来ますが、logrotate.dでもApacheのログファイルをローティションさせる事が可能です。以下はlogrotateにより1日単位でApacheのログローティションさせる場合の設定メモです。

/etc/logrotate.d/httpdに以下のように記述しておくと、1日単位でApacheログファイルをローティション出来ます。AmazonLinux + Apache2.2.29環境で確認しました。

■環境
AmazonLinux
Apache2.2.29

■ログローティションさせたいApacheログファイル
/var/log/httpd/access_log
/var/log/httpd/error_log

■ログローティション設定
以下のファイルを作成します。

``` 
# vi /etc/logrotate.d/httpd
/var/log/httpd/*log {
    daily
    missingok
    rotate 7
    notifempty
    sharedscripts
    compress
    delaycompress
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}
```

```
# chmod 644 /etc/logrotate.d/httpd
```

■ログローティション設定テスト
エラーが出ない事を確認します。

```
# logrotate -dv /etc/logrotate.d/httpd
reading config file /etc/logrotate.d/httpd
reading config info for /var/log/httpd/*log

Handling 1 logs

rotating pattern: /var/log/httpd/*log after 1 days (7 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/httpd/access_log
  log does not need rotating
considering log /var/log/httpd/error_log
not running postrotate script, since no logs were rotated
```

■ログローティション結果確認
日単位でログローティションされている事を確認します。

```
# ls -lrt /var/log/httpd/
　(略)
-rw-r--r-- 1 root root     607 12月 20 03:09 error_log-20141219.gz
-rw-r--r-- 1 root root    2569 12月 20 03:09 access_log-20141219.gz
-rw-r--r-- 1 root root 2523077 12月 21 03:31 access_log-20141221
-rw-r--r-- 1 root root     215 12月 21 03:32 error_log-20141220.gz
-rw-r--r-- 1 root root   50743 12月 21 03:32 access_log-20141220.gz
-rw-r--r-- 1 root root     332 12月 21 03:32 error_log-20141221
-rw-r--r-- 1 root root     256 12月 21 03:32 error_log
-rw-r--r-- 1 root root 1931294 12月 21 20:41 access_log
# 
```
[Unity] Debug.Log で出力する文字の色を変えよう



Unity の Debug.Log って見づらくないですか？
どうにかこうにかできないかなと思い調べてたら色付けできるみたいですねこれ！
http://docs.unity3d.com/ScriptReference/Debug.Log.html

ってことでそのメモです.

![1.png](https://qiita-image-store.s3.amazonaws.com/0/7756/57098183-5f5b-69cd-d57b-a3a785f14101.png "1.png")



## Debug.Log で出力する文字の色を変える

文字列をタグで囲うと, その情報が反映された状態で
表示されるみたいです.

```csharp
Debug.Log ("<color=red>Hello, world!</color>");
```

Unity の Console パネルに赤く Hello, world! と表示されるのが
わかるかと思います.

![1.png](https://qiita-image-store.s3.amazonaws.com/0/7756/57098183-5f5b-69cd-d57b-a3a785f14101.png "1.png")



## GUI の Label とかも同じ方法でいけるみたい

下記のコードを書くと

```csharp
void OnGUI() {
    GUI.Label (new Rect(10, 10, 100, 100), "<color=red>Hello, world!</color>");
}

```

こんな感じで表示されます!

![2.png](https://qiita-image-store.s3.amazonaws.com/0/7756/7fee3327-2ba9-ad1a-dcaa-becb1bc9a4bd.png "2.png")


## 活用例

数値が一定以上にいったらコンソールの色を変えるとかすると
便利かもなぁなんて思いました.


```csharp
if (this.num < 10) {
    Debug.Log (this.num);
} else {
    Debug.Log ("<color=red>" + this.num + "</color>");
}
```
milkcocoaのremoveメソッドとセキュリティルールで少しハマった件


こんにちは[LIG](http://liginc.co.jp)のエンジニア[のびすけ](http://liginc.co.jp/member/member_detail?user=nobisuke)です。

milkcocoaでデータ削除するときはremoveメソッドを使います。
[ドキュメント](https://mlkcca.com/document/api-js.html)にあるように書くと以下のようになります。
ちなみに以下のコードはnode.jsです。

```app.js
var MilkCocoa = require('./milkcocoa');
var milkcocoa = new MilkCocoa('https://{your-app-id}.mlkcca.com');
var dataStore = process.argv[2]; //引数にデータストア名を指定して実行

var db = milkcocoa.dataStore(dataStore);
console.log(dataStore + 'deleteing');

var count = 0;

db.query().limit(10000).done(function(data) {
    console.log(count);

    data.forEach(function(value) {
        db.remove(value.id);
        count++;
        console.log(count);
    });
});
```

実行するときはこんな感じです。

```
$ node app (データストア名)
```

実際に実行すると以下のようになります。

```
$ node milkdel.js demoDs
demoDs deleteing
connected
0
1
2
3
・
・
・
10000
```


##セキュリティルール

上手く行かなかった例

データストアを削除したいのでremoveだけ許可にしていました。

```
demoDs {
 permit : remove;
 rule: true;
}
```

この時点で実行すると

```
$ node milkdel.js demoDs
demoDs deleteing
connected
(反応なし)
```

という感じになってつまりました苦笑

現時点では **データストアをまるっと消すメソッドは無い**ため、`queryを使って取得` -> `removeで削除ループ`という実装になります。

```
demoDs {
 permit : query, remove;
 rule: true;
}
```

モチロンallでもok

```
demoDs {
 permit : all;
 rule: true;
}
```

でもセキュリティルールはちゃんと設定したほうが安心ですよ!
to_a使って年月日一覧表示

## 一覧表示で年月日表示
※ 今年の一覧取得

```rb
dates = (Date.today.beginning_of_year..Date.today.end_of_year).to_a
=>
 [Wed, 01 Jan 2014,
 Thu, 02 Jan 2014,
 Fri, 03 Jan 2014,
 Sat, 04 Jan 2014,
 Sun, 05 Jan 2014,
       ~
 Sat, 27 Dec 2014,
 Sun, 28 Dec 2014,
 Mon, 29 Dec 2014,
 Tue, 30 Dec 2014,
 Wed, 31 Dec 2014]
```

viewで

```rb
dates.each do |date|
  date.to_s # yyyy-mm-dd
  %w(日 月 火 水 木 金 土)[date.wday] # 曜日
  # dateはDate型です よしなに使えたりしますね
end
```

シンプルでいいね！


@jnchito さんから編集リクエストを頂きました！以下になります！
大変勉強になります。

Rangeをループさせるだけであれば `to_a` なしで実行できます。

````rb
dates = Date.today.beginning_of_year..Date.today.end_of_year
dates.each do |date|
  date.to_s
  %w(日 月 火 水 木 金 土)[date.wday]
end
````

Railsで日付を文字列に変換する場合は、yamlで事前にフォーマットを定義しておくと手軽にシステム全体のフォーマットをコントロールできます。
さらに、将来日本語以外のフォーマットが必要になったときも切り替えがラクです。

````yaml
# config/locales/ja.yml
ja:
  date:
    abbr_day_names:
      - 日
      - 月
      # ...
    abbr_month_names:
      -
      - 1月
      - 2月
      # ...
    day_names:
      - 日曜日
      - 月曜日
      # ...
    formats:
      default: ! '%Y/%m/%d'
      long: ! '%Y年%m月%d日(%a)'
      short: ! '%m/%d'
````

````rb
>> I18n.locale 
:ja
# defaultのフォーマットを使う
>> I18n.l Date.today 
"2014/12/23"
>> I18n.l Date.today, format: :long 
"2014年12月23日(火)"
>> I18n.l Date.today, format: :short 
"12/23"
# ymlに定義していないフォーマットを使いたい場合
>> I18n.l Date.today, format: '%a' 
"火"

# ロケールをenに変更する
>> I18n.locale = 'en'
"en"
>> I18n.l Date.today 
"2014-12-23"
>> I18n.l Date.today, format: :long 
"December 23, 2014"
>> I18n.l Date.today, format: :short 
"Dec 23"
>> I18n.l Date.today, format: '%a' 
"Tue"
````
xlwingsを使うぜ

# まえがき

[Excel Advent Calendar 2014](http://qiita.com/advent-calendar/2014/excel)
に空きがあったので、
前々からやりたかった「xlwings」の記事を書いた。
ちなみに僕はBlogあるので、Qiitaに何もなかったからいい機会だ。

# xlwingsとは？

VBAでマクロなんて書きたくない人用にPythonでマクロが書けるモジュール。

公式サイトはここですね。
[xlwings](http://xlwings.org/)

## インストール

```
pip install xlwings
```

virtualenvでインストールすると上手く実行できないようだ（多分）。
OSのPythonにインストールした方がいい。

## サンプルの実行

http://xlwings.org/quickstart/

ここにクイックスタートが有る。
しかし、僕は少しハマったのでクイックではなくなったが・・。

まず、Excel自体をどこかに保存しておく。
僕はMac OS Xを使ってるので、

`/Users/shinriyo/Documents`へ、「ブック1.xlsx」の名前でExcelファイルを保存した。
※日本語でOK！でしたが、怖い人は半角英数字で。

```py:mymodule.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
from xlwings import Workbook, Range

def rand_numbers():
    """ produces standard normally distributed random numbers with shape (n,n)"""
    wb = Workbook.caller()  # Creates a reference to the calling Excel file
    n = Range('Sheet1', 'B1').value  # Write desired dimensions into Cell B1
    rand_num = np.random.randn(n, n)
    Range('Sheet1', 'C3').value = rand_num
```

のように「mymodule.py」を「ブック1.xlsx」と同じ階層に置く。
**同じ階層に置く**ことが**重要！**（大事なことなので二回言いました。）

`/Library/Python/2.7/site-packages/xlwings`に`xlwings.bas`ファイルがあるはず。

↓このように。
![bas.png](https://qiita-image-store.s3.amazonaws.com/0/11951/d8802635-8da8-8f59-af31-2a3082891f9d.png)

マクロを作成し、
![Screen Shot 2014-12-21 at 7.20.43 PM.png](https://qiita-image-store.s3.amazonaws.com/0/11951/f1c8302d-4a57-c20b-e0b2-93fdba47fce6.png)

VBAのコードは

```vbnet
Sub RandomNumbers()
    RunPython ("import mymodule; mymodule.rand_numbers()")
End Sub
```

そうしましたら、マクロ上でこのようにインポート。
![import.png](https://qiita-image-store.s3.amazonaws.com/0/11951/91db05ee-0f25-322a-c451-640e1aff3025.png)

そして、Excel上のB1には任意の数字を記載。

![Screen Shot 2014-12-21 at 8.19.26 PM.png](https://qiita-image-store.s3.amazonaws.com/0/11951/1b47ce2b-c4d7-8d23-abd4-fcb3302783eb.png)

## RandomNumbersを実行！

![Screen Shot 2014-12-21 at 7.27.18 PM.png](https://qiita-image-store.s3.amazonaws.com/0/11951/8a44ce5c-3e83-95d8-905e-7d6c40dd88f5.png)

すると先ほどの画像のようになる。
たてよこに5追加される。

![Screen Shot 2014-12-21 at 8.00.39 PM.png](https://qiita-image-store.s3.amazonaws.com/0/11951/0aaaefcd-a4de-e99d-5c69-afd8e2e0b924.png)

```py
Range('Sheet1', 'C3').value = u'日本語'
```
などで日本語も出来るので実験してみるといい。
MeteorのTraker.autorunがClientでしか動かない問題をなんとかしたい



MeteorのTracker.autorunはとても便利なんですが、
clientでしか動かないため、server内で処理させたい場合どうすればいいんでしょうか？


# curser.observeを使う

大概の場合はCollectionの変更を検知して何かを実行させたいというパターンですので以下で対処します。


```js:server/autorun.js

Meteor.startup(function(){
    Players.find().observe(
        {
            'changed': function (oldDocument,newDocument) {
                console.log("player changed!!");
                //何かServerにさせたい処理をここに書く
                Meteor.call("sendAppleNotifications");
            }
        }
    );

});
```
そもそもTracker.autorunがanywhereだったらよかったのに・・・。
１年間ScalaAndroidをやってみて

まず、年賀状プロジェクトの関係で時間が想像以上に割けず現時点で記事がheader level 2以下を書けなかったことを謝罪します！！！
header level 2以下の内容は年明けに更新します。

# 共通ライブラリのSNAPSHOTを更新してpublishLocalすると依存しているプロジェクトの実行前にproguardが走る
# ProguardがScalaのコンパイルより遅い
# というかdexも遅い
# AndroidのCPUが遅くJSONのパースが遅い
# Dispatch rebootはhttpsでどうしようもないエラーが出る
# AndroidのAPIがUnitしか返さない
# ContextとLifecycleがやばい
# 素直にvarを使う
# android-sdk-pluginのproguardCacheが難解
# apklibはAndroidStudioで読めない
# android-sdk-pluginでCrashlyticsの導入が面倒くさい
# lazy val view = Fragment#getView().findView(TR.view_id)でクラッシュ
# Scalaのマクロが遅すぎてAndroidStudioのindexが終わらない
# android-sdk-pluginのmultidexでproguardが不要になりrunタスクの時間短縮に繋がる可能性有り
# android-sdk-plugin感謝
# play-json感謝
# play-json-twenty-three感謝
Mac OS X MarvericksへのTeX環境のインストール


MacにTeX環境を導入するのは2回目になります．
TeXのインストールも簡単になってはきましたが，それでも詰まる箇所がいくつかあるので，メモしておきます．

# ここでやっていること
Macに日本語TeX環境(pLaTeX)を導入したい．
ついでに統合開発環境としてTexmakerを導入したい(WindowsやLinuxでも使える．卒論の時はすごくお世話になった)．

TeXは論文を書く時に動けば十分だと思っており，あまり細かいことは気にしていない．

OS: Mac OS 10.9.5


1. MacTeX 2014のインストール
	Windowsでは，ディストリビューションとしていつもTeX Liveを使っていたが，MacではMacTexという便利なパッケージがあるみたい．

	[MacTeX - TeX Users Group](http://tug.org/mactex/)
からMacTeXのpkgをダウンロードしてインストール．

	これだけで，platex，xdvi，dvipdfmxといったおなじみのコマンドはすでに動くはず．

2. Texmakerのインストール
	[Texmaker (free cross-platform latex editor) ](http://www.xm1math.net/texmaker/download.html#macosx)
から"TexmakerMacosxLion.zip"をダウンロードしてインストール．

	ここまではTeX Wikiの通りにやれば問題なく進む．

3. Texmakerの環境設定
	[Texmaker/設定/OS X - TeX Wiki](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Texmaker%2F%E8%A8%AD%E5%AE%9A%2FOS%20X)
	に従って，TeXMaker上で叩くコマンドを設定する．
	
	まず，メニューの"texmaker"->"Preferences"->"Commands"タブから，
	> LaTeX: "/usr/texbin/platex" -synctex=1 -interaction=nonstopmode %.tex
	> Bib(la)tex: "/usr/texbin/upbibtex" %
	> Dvipdfm: "/usr/texbin/dvipdfmx" %.dvi

	のように変更する(これは最低限の設定なので，他の処理系を使いたい人は適宜行う)．
	"LaTeX"のところ，TeX Wikiには

	> "/usr/texbin/uplatex" -synctex=1 -interaction=nonstopmode %.tex

	と書いてあったけど，実際にコンパイルしてみると，

	> ! LaTeX Error: Encoding scheme `JY1' unknown.

	のようなエラーが出て動かなかった．
	エンコーディング関係らしいけど，よくわからないので今回は無視．
	
	次に，タブを"Quick Build"に切り替えて，"Quick Build Command"を"Latex + dvipdfm + View PDF"にする．
	これで，Quick Buildした時に上で設定したコマンドが起動するようになる．

	ついでにフォントも設定しておく．
	タブを"Editor"に切り替えて，"Editor"->"Editor Font Family"から設定できる．
	自分はメイリオ厨なので，ヒラギノフォントを眺めつつメイリオに設定する．

4. 内蔵ビューアで和文フォントが出力されない問題の解決
	そのままF1キーでQuick Buildを行うと，Texmakerに内蔵されているPDFビューアで日本語が表示されなかった．
	外部ビューアでも見られることは見られるけど，内部ビューア機能は割と便利だと思ってるので使いたい．

	http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Texmaker#m8993d2f
	に解決策が載っていたので試す．
	
	```bash
	$ brew install poppler
	$ sudo mkdir -p /Users/pascalbrachet/poppler64/share
	$ sudo ln -s /usr/local/share/poppler /Users/pascalbrachet/poppler64/share/poppler
	```

	1回Texmakerを再起動するとうまく動くようになった(気がする)．
	
5. バックスラッシュを入力しようとすると，円記号が入力される
	これも，
	http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Texmaker#u2a90df7
	に解決策があった．
	* Karabinerを使うと良いらしい
		* https://pqrs.org/osx/karabiner/index.html.ja
	* http://www.monochrome-photo.info/?p=23410
	
	追記："option+'\'"で問題なく表示される(少なくとも自分の環境では)

6. 日本語に赤い線が入ってうっとうしい
	デフォルトで英語用のスペルチェックが働いているらしい．
	これを無効にしておく．

	メニューの"texmaker"->"Preferences"->"Editor"タブから，"Spelling dictionary"の"Inline"と書かれたチェックボックスをオフにする．

これぐらいやっておけば，ストレスなく書き進められると思います．

# 参考
* http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/install_ptex.html
Hello BLE


#はじめに
この記事は、BLEをこれから勉強する・利用する人のためにまとめたものです。
本記事では少しBLEの歴史などを見ながら、BLEの概観をキャッチアップできる情報をお届けできたらと思っています。

#BLE(Bluetooth Low Energy)のちょっとした歴史
>Bluetooth Smart was originally introduced under the name Wibree by Nokia in 2006.[2] It was merged into the main Bluetooth standard in 2010 with the adoption of the Bluetooth Core Specification Version 4.0.
[参考:wiki]([http://en.wikipedia.org/wiki/Bluetooth_low_energy)

もともとはNokiaで生まれたWibreeという無線通信技術として紹介されたそうです。
2010年に上記の技術を標準として取り込んだものがBleutoth4.0と呼ばれています。

#Bluetooth Low Energy != Blutooth4.0
あくまでBlutooth Low EnergyはBluetooth4.0を構成する一つの技術です。
これについては、以下の記事に詳細に記述されています。
>まず明らかにしておきたいのは、「Bluetooth Low Energy(LE)」と「Bluetooth 4.0」という用語の定義は同じではない、ということです。「Bluetooth LE」は Bluetooth 4.0 で新たに追加された新しい通信方式ですが、「Bluetooth 4.0」は以前の Bluetooth バージョンの仕様全て(2.1 で追加された高速モードの EDR や、3.0 で追加された超高速モード HS も)を含んでいいます。つまり「Blueotooth X.X」という表記はプロトコル仕様であってハードウェア仕様を示すものではなく、ハードウェア拡張仕様についてはバージョンの後につく「EDR」とか「HS」とか「LE」によって示されるのです[参考：Bluetoothのはなし@サイレックス](http://www.silex.jp/blog/wireless/2012/10/bluetooth2.html)


#デバイスがBLEに対応しているかどうかを見極めるには？
「Bluetooth Smart」というブランド名が付いたデバイスは利用可能です。
>Bluetooth Smartはブランド名であり、Bluetooth Low Energy（Bluetooth LE）が省電力通信を行う規格名である」[参考：Bluetooth SMART]([http://k-tai.impress.co.jp/docs/column/keyword/20130702_606028.html)


##(※1)Bluetooth Smart Ready productsとは
>These phones, tablets, PCs, or TVs can connect with both traditional Bluetooth products and super energy-efficient Bluetooth Smart sensors
ざっくりいうと、スマホなどBLEを受け取れるデバイスのこと。

##(※2)Bluetooth Smart productsとは
>The next generation of super energy-efficient Bluetooth products that send information to Bluetooth Smart Ready products.
ざっくりいうと、スマホなどのBluetooth Smart Readyプロダクトに対して、信号を送れるもの。
[※1、※2の詳細については次のURLで確認してみて下さい：Bluetooth-Smart Devices-List](http://www.bluetooth.com/Pages/Bluetooth-Smart-Devices-List.aspx#Smart)


##もっとつっこんだ技術仕様について
こちらの記事にまとめられているため、そちらを参照していただけるとより技術的な理解を深めることができます。
* 例：電波強度、通信間隔など [参考記事->Bluetooth 4.0 および Bluetooth Low Energy (BLE) に関する技術情報のまとめ](http://qiita.com/shu223/items/9488fc314ff5cd70a8a3)


#iBeaconとは
>iBeaconとは、iPhoneのiOS7に標準搭載されたことで、いま注目を集めているBluetooth Low Energy（BLE）を使った新技術です。ネットから店舗への誘導などに使える、新しいO2Oの切り札としてマーケッターの期待を集めています。
>iBeaconは、発信側のビーコン端末とビーコン端末からの受信に対応したiPhoneアプリの2つの組み合わせによって、初めて成り立ちます。ただし、端末が飛ばすのは識別に必要な数字のみで、画像や音声などのデータが送信されるわけではないのが注意点です。
 [参考:iBeaconとは？](http://smartphone-ec.net/ibeacon/system.html)

##iBeaconの応用例
2014年12月21日現在、以下のようなことに使われています。
O2Oつまり、ネット上（オンライン）から、ネット外の実地（オフライン）での行動へと促す施策のことや、オンラインでの情報接触行動をもってオフラインでの購買行動に影響を与えるような施策へのキーデバイスになりつつあります。
>[O2Oの定義の参照](http://web-tan.forum.impressrd.jp/g/o2o)

応用例は次の通りです。
* [そら用心:Beaconを利用した天気予報アプリ](http://www.appbank.net/2014/12/02/iphone-application/936036.php)
* [JR東京駅のiBeaconナビゲーション](http://weekly.ascii.jp/elem/000/000/285/285616/)
*[ビーコンエリア内PUSH型情報配信サービス PlusZone](http://www.nesic.co.jp/solution/sp/pluszone.html)
* [おもてなしBeacon](http://www.aplix.co.jp/app/omotenashi/)

> [参照元：iBeacon Develop, Facebook](https://www.facebook.com/ibeacondev?fref=nf)

#おわりに
今回は、BLEの概観に関する情報をメインに掲載しました。
また、もっと深く知りたいと思われる方に参考になるURLを掲載しています。
最後に、本記事がBLE開発のはじめの一歩に役立てられれば幸いだと思っています。
PHPで文字化け対処　CentOS6.6 

http://tsuttayo.jpn.org/php/char_trn/


php.ini を変更してもなおらず、、、

httpd.conf に以下文字を追加したら文字化け解消された。


/etc/httpd/conf/httpd.confに次の行を追加します。（初期値ではコメントアウトされているそうです）
DefaultLanguage ja
ターミナルにクリップボードの中身を貼り付けたときに確認画面を表示させる(Windows編)

# 実現したいこと
teratermにはターミナルにalt+vなどで貼り付けの動作をしたときに、クリップボードの中身を表示させる機能があります。
一般的な設定では、クリップボード内が複数行の場合に表示されると思います。


![スクリーンショット 2014-12-21 18.01.06.jpg](https://qiita-image-store.s3.amazonaws.com/0/32492/5db5fa7d-4e91-eeaa-4fb0-abd5906b3248.jpeg)


teratermのように他のターミナルでも、複数行の貼り付けをした際に確認画面が表示されるようにする方法を紹介します。

但し、teratermのように確認画面内で内容の修正ができるというところまでは残念ながらできませんのでご了承ください。

# AutoHotkeyの設定

確認画面表示を実現させるためにAutoHotkeyを利用します。

基本的なAutoHotkeyの利用方法などについては割愛します。

設定ファイルには以下のように設定します。
※以下はminttyの場合の設定です。
MaxLineCount は警告画面に表示させる最大行数です。任意に書き換えていただいて構いません。

```
; minttyでクリップボードが複数行の貼り付けをしようとするときに確認画面を表示する

CopypasteMsgbox() {
  ;改行をデリミタとしてstrout変数にクリップボードの内容を配列として格納
  StringSplit, strout, clipboard, `n

  line = ---------------------
  MaxLineCount = 40
  ;要素数が1を超える(2以上)の場合は警告画面を表示する
  If(strout0 > 1) {   ; コピーしたテキストが2行以上の場合
    Loop, parse, clipboard, `n, `r
    {
      LineCount += 1
      If(LineCount = MaxLineCount) {
        ClipboardContext = %ClipboardContext%%A_LoopField% .........`n
        break
      }
      ClipboardContext = %ClipboardContext%%A_LoopField%`n
    }

    MsgBox, 308, 貼り付け警告, %line%`n%ClipboardContext%%line%`n`n全%strout0%行の内容を貼り付けますか?

    Haystack = %clipboard%
    Needle = \n
    StringGetPos, pos, Haystack, %Needle%
    if pos >= 0
      MsgBox, The string was found at position %pos%.


    ; Yesを選択した場合、貼り付け実行 
    IfMsgBox, Yes
    {
      send, +^v
    }
  } else { 
    ; 要素数が1行の場合は画面を表示せず貼り付け
    send, +^v
  }
}

;classがminttyの場合
#IfWInActive,ahk_class mintty

;ctrl+shift+vを押下したときの動作
+^v::
CopypasteMsgbox()
#IfWInActive
return


;shift+Insを押下したときの動作
+Ins::
CopypasteMsgbox()
#IfWInActive
return
```

画面イメージは以下のようになります。

![スクリーンショット 2014-12-21 19.08.14.jpg](https://qiita-image-store.s3.amazonaws.com/0/32492/31adced8-1948-9f8e-35b5-d4b54562767b.jpeg)


```
#IfWInActive,ahk_class mintty
```
上記の部分を変更すればmintty以外のターミナルでも同様に確認画面を表示させることができると思います。


ahk_class は WindowSpy(AutoHotkeyをインストールしたフォルダにある AU3_Spy.exe)を利用することで確認することが可能です。
おすすめSwift講座Youtube動画まとめ

## チュートリアル編

[Basic SWIFT Programming Tutorials - rm2kdev](https://www.youtube.com/playlist?list=PL_4rJ_acBNMHa_RGZigG2nQI3aL1kTa4r)
[Swift Tutorials - Novall Khan](https://www.youtube.com/playlist?list=PLNh8C75j8VxZdSBzSKwAClGulfUwmajzH)
[Apple Swift Programming Language Tutorial Series - Skip Wilson](https://www.youtube.com/playlist?list=PLfOZCUzRoPfKeOS_pwpiqbdviGcCOcTYb)
[Swift Programming Intermediate - MadApper](https://www.youtube.com/playlist?list=PLDj3dknzoPvNd8vE1Gv9-YW3wsjiWHv_J)
[Swift Programming: Introduction - MadApper](https://www.youtube.com/playlist?list=PLDj3dknzoPvMYvf3skevfJb3zV3qt1_Fp)

## 応用編

[Swift & Databases - Skip Wilson](https://www.youtube.com/playlist?list=PLfOZCUzRoPfL_jWKT3adSYvrTA1eL2vY5)
[Swift Games - Skip Wilson](https://www.youtube.com/playlist?list=PLfOZCUzRoPfKiIrTkFGmUqO6vNYHvh_sB)
[Swift Tutorials - SwiftDevs](https://www.youtube.com/playlist?list=PLmZvzOzm178qKQgLz4RJU0f7Qjn4ouVlc)
[Swift - Brian Advent](https://www.youtube.com/playlist?list=PLY1P2_piiWEY3W_aGo7r2OZmsk6Ww757Y)
[RSS](https://www.youtube.com/playlist?list=PLuZEqxdBDSXE5t61BuCwfexXMRx_AnlRh)
[Core Data App](https://www.youtube.com/playlist?list=PLuZEqxdBDSXGH6_8S5jc-0javTMQhRtx5)
CentOS7.0/64bitでメールサーバ構築

[Postfix Advent Calendar 2014](http://qiita.com/advent-calendar/2014/postfix)の 24日目の記事です。

未完成のまま長期間放置してすいません、ほかにもまとまった記事がありますので削除します(2016/8/2)

すいませんが、完成していません。 (2014/12/24, 22:24) 某所に提出する資料を兼ねてるため、近日中に最後まで完成させます。
rakeで動かしたバッチ処理で、exception_notificationを使ってSlackに通知を飛ばす

## 今回の記事のポイント

- exception_notificationでSlackに対応しているのは4.1.0.rc1のみ
- `rails runner`で動かした時、exception_notificationが正常に動作しない
- 処理をrakeに移しexception_notification-rakeを使用すれば動作する
- exception_notification-rakeはexception_notificationの4.1.0.rc1に対応していない
- exception_notificationの4.0.1を手動でSlackに対応させる

### 下準備
```lang:Gemfile
gem 'exception_notification', '4.0.1'
gem 'exception_notification-rake'
gem 'httparty'
gem 'slack-notifier'
```
この時点では、exception_notificationはSlackに対応していません。

### exception_notificationをSlackに対応させる
[github](https://github.com/smartinez87/exception_notification/blob/master/lib/exception_notifier/slack_notifier.rb)からslack_notifierのファイルを持ってきて、lib以下に配置する

```lang:lib/exception_notifier/slack_notifier.rb
module ExceptionNotifier
  class SlackNotifier

    attr_accessor :notifier

    def initialize(options)
      begin
        webhook_url = options.fetch(:webhook_url)
        @message_opts = options.fetch(:additional_parameters, {})
        @notifier = Slack::Notifier.new webhook_url, options
      rescue
        @notifier = nil
      end
    end

    def call(exception, options={})
      message = "An exception occurred: '#{exception.message}' on '#{exception.backtrace.first}'"
      @notifier.ping(message, @message_opts) if valid?
    end

    protected

    def valid?
      !@notifier.nil?
    end
  end
end
```

libディレクトリの自動読み込みを行っていない場合は追加しておく

```lang:config/application.rb
    config.autoload_paths += %W(#{config.root}/lib)
```

### Slackの設定を追加する

```lang:lib/exception_notifier/slack_notifier.rb
      message = "@group An exception occurred: '#{exception.message}' on '#{exception.backtrace.first}'"
```

```lang:config/initializers/exception_notification.rb
  :slack => {
    :webhook_url => "[Your webhook url]",
    :channel => "#exceptions",
    :link_names => true
```
ここで、`lib/exception_notifier/slack_notifier.rb`を、Slackのグループに対してmentionを飛ばすように書き換える。同時に、`config/initializers/exception_notification.rb`でlink_namesを指定しておかないと、mentionが有効にならないので注意。
Goでニコニコ生放送のRSSから開場日時や放送開始日時を抽出してみる

[GAE (Go/Python) もくもく勉強会 in 横浜タネマキ vol.12](http://connpass.com/event/10472/) で調べた結果のメモ。標準ライブラリだけで行けた。

``` go:parsenicoliverss.go
package main

import (
	"encoding/xml"
	"fmt"
	"io/ioutil"
	"net/http"
)

type Item struct {
	XMLName     xml.Name `xml:"item"`
	Title       string   `xml:"title"`
	Description string   `xml:"description"`
	OpenTime    string   `xml:"http://live.nicovideo.jp/ open_time"`
	StartTime   string   `xml:"http://live.nicovideo.jp/ start_time"`
}

type Channel struct {
	XMLName xml.Name `xml:"channel"`
	Title   string   `xml:"title"`
	Items   []Item   `xml:"item"`
}

type Rss struct {
	XMLName xml.Name `xml:"rss"`
	Channel Channel  `xml:"channel"`
}

func main() {
	res, err := http.Get("http://live.nicovideo.jp/rss")
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		panic(err)
	}

	r := Rss{}
	if err := xml.Unmarshal(body, &r); err != nil {
		panic(err)
	}
	fmt.Printf("RSSタイトル: %s\n", r.Channel.Title)
	fmt.Println("----------")
	for _, v := range r.Channel.Items {
		fmt.Printf("番組タイトル: %s\n", v.Title)
		fmt.Printf("番組説明文: %s\n", v.Description)
		fmt.Printf("開場日時: %s\n", v.OpenTime)
		fmt.Printf("放送開始日時: %s\n", v.StartTime)
		fmt.Println("----------")
	}
}
```
NetworkManagerでDHCPサーバーからIPを取得できない時

Fedora 21 Serverをインストール後、DHCPからIPv4を拾えなかったので調べてみた。

https://wiki.archlinux.org/index.php/NetworkManager_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29#dhclient_.E3.81.A8_DHCP_.E3.81.AB.E9.96.A2.E3.81.99.E3.82.8B.E5.95.8F.E9.A1.8C

問答無用でまずこれを試せ、って感じで書いてあるところをみると、よくある問題なのだろう。確かに`nmcli c show ethdev`すると、この設定は空になっている。MACアドレスの前に01を付けたものをIDに設定する：

```
nmcli c modify ethdev ipv4.dhcp-client-id 01:00:ab:cd:ef:12:34
```

反映には再起動が必要らしいので、そのあと：

```
nmcli c down ethdev
nmcli c up ethdev
```

ステータスは：

```
nmcli c show ethdev
```

で確認できる。`ip address`でIPを確認するなど。自分の場合は再起動しなくてもIP取ってくれた（ような気がする）。

ついでに`nmcli`の使い方も勉強できて一石二鳥だった。`ifconfig`なんてないし、`vi /etc/sysconfig/network-scripts/ifcfg-ethdev`は今時いじるものではないのでちゅういだ。あと`netstat`は`ss`。これはテストにでる。
Not Serializableなフィールドを持つオブジェクトをGsonでパースする

Gsonを使って、Serializableじゃないフィールドを持つクラスをパースしようとするとエラーになります。

#問題

パースしたいModel。

```java
public class Sample {
    @SerializedName("title")
    private String title;

    private NotSerializableObject object;
}
```

パースするコード。

```java
new Gson().fromJson(sampleJson, Sample.class);
```

出力されるエラー。

```java
java.lang.AssertionError
    at com.google.gson.internal.bind.TypeAdapters$EnumTypeAdapter.<init>(SourceFile:733)
    at com.google.gson.internal.bind.TypeAdapters$26.create(SourceFile:762)
    at com.google.gson.Gson.getAdapter(SourceFile:356)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(SourceFile:82)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(SourceFile:81)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(SourceFile:118)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(SourceFile:72)
```

#解決

Serializableじゃないフィールドを持つクラスをパースするときは、そのフィールドに`transient`をつけます。

```java
private transient NotSerializableObject object;
```

ただし、transientを使うとそのフィールドはSerializeの対象から外れてしまうので注意が必要かもしれません。
typedef は C++11 ではオワコン

昨日 `typedef` について大阪 C++ 勉強会でちょっと話題が出ていて，そういえば `typedef` がどうしてダメで型エイリアスだと良いのかみたいな話あまりまとまってない気がしたのでメモ．

`typedef` はこんな感じの構文でした．

```
typedef {oldtype} {newtype};
```

これは C++11 では `using` 型エイリアスを使って書けます．

```
using {newtype} = {oldtype};
```

この時点だとどっちでも良い感じがしますが，例えば関数ポインタなんかは `using` のほうが見やすいです．

```cpp
typedef void (*f)(int, char);
using f = void (*)(int, char);
```

また，`using` のほうはテンプレート化することができます．

```cpp
template<class Value>
using dict = std::map<std::string, Value>;
```

これは `typedef` に対して非常に大きな利点です．

例えば，自分用のアロケータを使った `std::vector` を使いたいとします．
`using` エイリアスを使うとこんな感じに書けます．

```cpp
template<class T>
struct greate_allocator;

template<class T>
using greate_vector = std::vector<T, greate_allocator<T>>;

template<class T>
struct greate_stack {
    greate_vector<T> buffer;  // 使ってみる
};
```

これを C++03 まででやろうとすると若干面倒でした．

```cpp
template<class T>
struct greate_allocator;

template<class T>
struct greate_vector {
    typedef std::vector<T, greate_allocator<T>> type;
};

template<class T>
struct greate_stack {
    typename greate_vector<T>::type buffer; // 使ってみる
}
```

メンバ型を使っていますが，`::type` をつけないといけないことや，場合によって `typename` を付けないといけないのが面倒ですね．`typename` を付けないといけないのは，`::type` が本当に型を表すメンバなのかがこの時点では分からない（`T` 次第）ためです．

## 結論

型エイリアス使おう．
Rails4.2 アップグレード時のエラーなどのメモ


- PostgreSQL 9.4.0
- ruby 2.1.3


発生ごとに追記予定。

### PG::ProtocolViolation: ERROR:  bind message supplies 0 parameters, but prepared statement "" requires 1


参考コード

```
scope :with_closed_business_days, ->(account) do
      business_days = BusinessDay.where(account_id: account.id).closed_week.arel.as('business_days')
      
      select(calendars[Arel.star])
      .joins(calendars.join(business_days)
        .on(calendars[:wday].eq(business_days[:wday])).join_sources)
    end
```   

scopeの引数がSQLにbind?されないエラー。
以前は

`business_days = BusinessDay.where(account_id: account.id).closed_week.arel.as('business_days')`の箇所を、`business_days = account.closed_week.arel.as('business_days')`としていた場合に出ていた気がする。

なのでwhereの箇所を変更するといけた。


 ```
   scope :with_closed_business_days, ->(account) do
      business_days = BusinessDay.closed_week.arel.as('business_days')

      select(calendars[Arel.star])
      .where(business_days[:account_id].eq(account.id))
      .joins(calendars.join(business_days)
        .on(calendars[:wday].eq(business_days[:wday])).join_sources)
    end
 
 ```

  **のですが！**、これだと、left outer joinのarelテーブルでは解決できないのでした。そこで色々と試しましたところ。
  
whereの箇所をarel_tableで記述するといけました。arel_table使うときはすべてarel_tableで書くのか？  

```
scope :with_closed_business_days, ->(account) do
      business_days = BusinessDay.arel_table
      business_days = BusinessDay
        .where(business_days[:account_id].eq(account.id)).closed_week.arel.as('business_days')

      select(calendars[Arel.star])
      .joins(calendars.join(business_days)
        .on(calendars[:wday].eq(business_days[:wday])).join_sources)
    end
```  
  
 
 
 
### slim-railsのバージョン依存がずれる
 
 
 `gem 'slim-rails', github: 'ericboehs/slim-rails'`
 上記で一時的に管理
 
 
### config/application.rb 

追記
`config.active_record.raise_in_transactional_callbacks = true`

### ActiveJob

Mailerのdeliverメソッドを`deliver_now`に変更。
job管理は`que`を使っているが、ActiveJobとの絡みは別途


これでテストは通ったのでゆっくり新機能をみてみます。
RubyMineで画面分割など便利なショットカートキー

## 二段階のショットカートキー
最初に紹介しておきたいのは、RubyMineのショットカートキー設定は、二段階の設定ができます。要するにEmacsまたはVimのような感じに、「Ctrl+w, v」で画面を縦分割とかができたりします。

設定方法も簡単で、ショットカートキー設定画面で「Second Stoke」のチェックボックスをチェックして、下のテキストボックスで二番目のキーを入力するだけ。

![Screen_Shot_2014-12-21_at_11_23_53.png](https://qiita-image-store.s3.amazonaws.com/0/4777/b80beeb6-cae3-e162-9c42-88ae2e92f1c4.png)

## 画面分割
上記前提で、個人的にRubyMineでの画面分割ショットカートキーは下記のように設定しています。

- CTRL+w, vで縦分割
![Screen Shot 2014-12-21 at 11.30.50.png](https://qiita-image-store.s3.amazonaws.com/0/4777/ad13786f-44ef-36cb-6f73-e8ef911f6b5e.png)

- CTRL+w, sで横分割
![Screen Shot 2014-12-21 at 11.32.01.png](https://qiita-image-store.s3.amazonaws.com/0/4777/40f8b220-bc18-8f00-0104-861cc07dd4e6.png)

## 分割しているパネル間の移動

- CTRL+w, nで次のパネル
![Screen Shot 2014-12-21 at 11.33.40.png](https://qiita-image-store.s3.amazonaws.com/0/4777/ebdb9939-c453-7ea1-e2b2-388a4104a3ab.png)

- CTRL+w, pで前のパネル
![Screen Shot 2014-12-21 at 11.34.15.png](https://qiita-image-store.s3.amazonaws.com/0/4777/e41d71e1-d1af-b236-dbc8-f0c7f1de65e4.png)

上記のように設定すれば、普通にVimのように気軽に画面を分割できます。
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/4777/d1bc681e-77cc-fc51-5419-8495dfefb2b2.png "sample.png")

### 残念なところ
上記設定のように「次」「前」のパネルへ移動できますが、今のところ「左」のパネル・「右」のパネルへの移動は、設定項目がないようです。

## ツールパネルのショットカートキー
エディター領域以外は、プロジェクトパネルや差分パネルなど、いろいろ便利なパネルがあります。

デフォルトでの下記ショットカートキーをよく使っています。
- CMD+1：プロジェクトパネル
![Screen_Shot_2014-12-21_at_16_51_22.png](https://qiita-image-store.s3.amazonaws.com/0/4777/f346298f-901b-c66d-c38c-1fd7c2d75016.png)

- CMD+9：で差分パネル
![Screen_Shot_2014-12-21_at_16_54_04.png](https://qiita-image-store.s3.amazonaws.com/0/4777/e0782a1c-9ac5-192d-03a4-959377ad4648.png)

### パネルを閉じるショットカートキー
上記のショットカートキーで必要なパネルを開けますが、閉じるのは、デフォルトShift+ESCになっています。

個人的には、ESCでパーネルを閉じるように設定しています。
![Screen Shot 2014-12-21 at 16.46.57.png](https://qiita-image-store.s3.amazonaws.com/0/4777/5aa70699-860b-0664-2719-72c46b5c142b.png)
スクリプトで定義した変数を REPL からアクセスする


[CodeIQ](https://codeiq.jp/) や [Project Euler](https://projecteuler.net/) にチャレンジしているとき、ちょっとした計算を行いたい場合がある。

スクリプトで定義した変数に REPL からアクセスする方法です。Python, Ruby それぞれの方法を紹介します。

### Python

`ipython3` を使います。`pip3 install ipython` でインストールできます。

```i.py
# coding: utf-8

a = 10
b = 20
```

`%run` コマンドでスクリプトを実行します。


```
$ ipython3
In [1]: %run i.py

In [2]: a
Out[2]: 10

In [3]: b
Out[3]: 20
```

### Ruby

Pry を使います。


```i.rb
a = 10
b = 20

binding.pry
```

```
$ pry i.rb
[1] pry(main)> a
=> 10
[2] pry(main)> b
=> 20
```
&quot;java.lang.NoClassDefFoundError: com.google.android.gms.gcm.GoogleCloudMessaging&quot; を解決する


# 問題

Google Play Services の機能を使用するプラグインを書いて実機で動かしたとき上記のエラーが発生してアプリが落ちる。

# 解決

Android SDK の中に含まれる Google Play Services 関連の jar ファイルを Asset/Plugins/Android フォルダの中に格納しておく。

具体的な場所は

```
{Android SDK インストール先}/sdk/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
```
bundle備忘

bundleメモ。
本当に当たり前のことを当たり前にまとめる備忘録。
なので順番考えずテキトーに増えたり減ったりする。

#■コマンド
###◯インストール

* Gemfileに新しいgemを追加したときに実施する。


```lang:インストールするお
bundle install
```

```lang:パスを決めてインストールするお
bundle install --path vendor/bundle
```
※1度このコマンドでやれば、後はpathオプションは不要。

```lang:本番環境で使用するgemはローカル環境で不要！
bundle install --without production
```

※1度このコマンドでやれば、後はwithoutオプションは不要。

```lang:※の※
1回やればOKなオプション：recommend optionって言うらしいです

```

###◯アップデート

* Gemfileに既に記載したgemについて、バージョンを修正したときに実施する。

```lang:アップデートするお
bundle update
```


###◯アンインストール

* 間違ってインストールしたお…みたいなときに実施する。

```lang:まずはコマンドでアンインストール
bundle exec gem uninstall [gemの名前]
```

この後Gemfileを修正する。
それで再度bundle installをする。(lockファイル書き換えのため)

※Heroku使ったここでつまったのでメモ↓

```lang:Heroku用メモ
* 発生したエラー:sqlite3はHerokuじゃ使えない
(でも開発とかでは入れときたい)

①sqlite3をアンインストールする
②Gemfileから該当行をコメントアウトする(使わない場合は削除でOK)
③bundle install
④Gemfileでsqlite3をdevelopmentだけ反映するよう、group化
⑤bundle install
⑥git add、commit
⑦デプロイする

```

コミットし忘れていつまでもエラーが出てましたｗｗｗ

ちなみにこの後assetsのプリコンパイルエラーが発生。
config.assets.initialize_on_precompile = false
をconfig/application.rbに追記したらOK。

###◯いろいろ確認

* インストールしたgemを確認したい。
* gemが使用できるか確認したい。

```lang:インストールしたgemの確認
bundle list
```

```lang:gemが使えるか確認(使えないgemについて教えてくれる)
bundle check
```
Slack の知っておきたい豆設定まとめ

Slack でのちょっとした設定まとめです。

# こんな設定したかった編
# 1つのクライアントで複数のチームにログインする
単に複数チームにログインできるだけでなく、別メールアドレスアカウントのチームでも、ログインできる。
以下の設定から、他のチームへのログイン画面を呼び出す。
![Screen_Shot_2014-12-21_at_4_14_11_PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/8517cdaa-6366-323b-7bf4-36991926ebe0.png)

チームドメインを入力してログインする。
![Screen Shot 2014-12-21 at 4.14.22 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/40f1569a-b65c-3c47-18a0-fbb1f601c478.png)

成功すると、一番左にカラムが表示されるようになる。これでチームを自由に行き来できる。
![Screen_Shot_2014-12-21_at_4_06_42_PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/e5e50639-5c3b-44e0-2668-a7e0f1cff853.png)


## "@ channel" でも通知が来ないようにする
自分宛メンションだけ反応したい時など、全体通知が来て欲しくない時の設定。

Account > Notification で、
channel を無視 + 自分へのメンション通知 という設定ができる。
https://チーム名.slack.com/account/notifications

"Suppress @ everyone mentions" のチェックを付けると、channel の時でも通知を OFF にできる。

![Screen_Shot_2014-12-21_at_3_47_56_PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/ab910be8-cb1f-7fed-e9c0-8a8dd538ab73.png)


ちなみに、以下の様な設定画面からは、"customize your notification settings" で詳細設定画面に遷移できる。
![Screen_Shot_2014-12-21_at_3_28_37_PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/c4bcbfde-5642-2dec-4783-b2ca002d291d.png)


# こんな設定もあるんだよ編
## 離席中に来た通知をモバイルに送る
### スマートフォンへ Push 通知
通知に対して一定時間反応がない時、モバイルの方に通知してくれる。
デフォルトでは、デスクトップでの通知が2分以上既読にならなかった時。

![Screen Shot 2014-12-21 at 4.22.03 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/e2b8c930-a91b-144f-7a08-ef44797ae98e.png)

## メールでの通知
ダイレクトメッセージや自分宛てのメンションが、ログアウト状態だったり、通知が受け取られなかった時に、メールで通知してくれる。デフォルトでは、15分に1回の間隔。

![Screen Shot 2014-12-21 at 4.25.58 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/99f533f9-089b-50aa-bb64-00875867df02.png)


## テーマを変える
Slack > Preferences > Sidebar Theme
![Screen Shot 2014-12-21 at 4.04.54 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/b3dc9843-06ef-bdd9-1120-3c752e58df89.png)


## 表示カラムを小さくする
IRCっぽくなる

Slack > Preferences > Message Display > Compact
![Screen_Shot_2014-12-21_at_4_06_30_PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/ab973e56-eeff-f168-f033-b3721a4dbde9.png)

これが
![Screen Shot 2014-12-21 at 4.06.42 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/239d8c54-d042-1ce1-1196-e3f9cbe58878.png)
こうなる！
![Screen Shot 2014-12-21 at 4.06.09 PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/d32e25d7-53e2-c8b0-63b7-74145fc76c03.png)


## なんか…こう…物足りない ってとき
やってみよう！
![Screen_Shot_2014-12-21_at_4_30_53_PM.png](https://qiita-image-store.s3.amazonaws.com/0/1635/58dbf194-a173-06e9-8f4e-d619dc3cd03f.png)
Awk深いトレジャーデータのAPI

#awk深いよTreasure!

こんにちは、トレジャーデータで~~ギャグ~~オープンソース事業を担当しています、[@kiyototamura](https://twitter.com/kiyototamura)です。ふだんはもっぱらFluentdの仕事をしております。

[R](http://docs.treasuredata.com/articles/r-language)や[Tableau](http://blog.treasuredata.com/2014/09/22/4-steps-to-big-data-analytics-with-tableau-and-treasure-data/)など、様々なツールとサクッと連携できるトレジャーデータですが、なかなか知られていない機能として、awkとのインテグレーションが~~あります~~あるわけないでしょ！

てか、若いみなさんはawkが何かすら知らないと思いますので、簡単に説明しておくと、**ファイルや標準入力に対して手軽にストリーム処理ができるスクリプト言語です。**さらにワンライナーに特化したperlだと思ってください。~~え、perlも使ったことない？~~

awkは非常に便利でして、[統計的処理にも非常に向いています](http://antibayesian.hateblo.jp/entry/2014/09/15/162605)。今回はawkのGNU版であるgawkから頑張ってトレジャーデータを使ってみたいと思います。

#トレジャーデータのREST API

最近は[webコンソール](https://console.treasuredata.com)が充実しているため、あまり知られていないかもしれませんが、トレジャーデータには[RESTfulなAPI](http://docs.treasuredata.com/articles/rest-api)があります。なので、HTTP(S)での通信をサポートしている言語からはさくっとクライアントライブラリが作れたりします。というかHTTPはしょせんアプリケーションレイヤーなので、要はTCPでの通信ができればいいわけです。

# （たぶん）あまり知られていないgawkの機能

意外と知られていないのですが、gawkはTCPおよびUDPでの通信をサポートしています。そのインターフェースがなかなかイカしており、特殊ファイルというものに`|&`という演算子を使ってデータを書き込んだり、そっからデータを読みだしたりします。特殊ファイルは文字列で定義され、

```
"/net-type/protocol/localport/hostname/remoteport"
```

という感じになります。例えば`api.treasuredata.com`のポート80番にTCPでデータを送る場合、

```
print hello |& "/inet/tcp/0/api.treasuredata.com/80"
```

という風になります。詳しくは[公式ドキュメント](http://www.gnu.org/software/gawk/manual/gawkinet/html_node/Gawk-Special-Files.html)をご参照ください。

ということで、gawkでTCP通信ができることがわかりました。後はおわかりですよね(^ω^)

#ということでtd.awkしてみた

```awk
BEGIN {
  http_service="/inet/tcp/0/api.treasuredata.com/80"
  printf("GET /v3/database/list HTTP/1.1\r\nHost: http://api.treasuredata.com/\r\nAuthorization: TD1 %s\r\n\r\n\n", ARGV[1]) |& http_service
  RS= "\r\n"
  FS=": "

  while ((http_service |& getline) > 0)
    if ($1=="Content-Length") content_length=int($2)
    else if ($1=="transfer-encoding") chunked=1
    else if ($0~/^$/) break
  end

  if (chunked) { content_length=0 }

  while ((http_service |& getline) > 0)
    if (chunked && /^[0-9a-f]+$/)
      content_length += strtonum("0x"$0)
    else if (!/^[0-9a-f]+$/)
      buf=buf $0
    else if (/^$/)
      break
  end
  close(http_service)
  print substr(buf, 0, content_length)
}
```

このスクリプトは、`/v3/database/list`エンドポイントを叩き、所望のAPIキーに紐づいているデータベースを取ってきます。いろいろなことをやっていますが、本質的にはHTTPのリクエストを送って、レスポンスをパースするだけです。HTTPでは各ヘッダがCRLFで分けられており、ヘッダ名と値が": "で区切られているので、うまくawkのRS/FS変数を変更して使い~~キレイに~~パースしているところがワンポイントです。~~しかしchunked responseのパースでちょっと嵌った。~~

APIキーには、CLIの最初の引数が使われる設定となっています。ですので、仮にこのスクリプトが`td.awk`というファイル名で保存されていたとし、

```shell-session
gawk -f td.awk `td apikey:show`
```

と実行すると...

```
{"databases":[{"name":"testdb","count":5000,"created_at":"2012-10-22 08:17:18 UTC","updated_at":"2012-10-22 08:17:18 UTC","organization":null,"permission":"administrator"},（以下略)
```

とちゃんとレスポンスが返ってきました！

#ここまでやって気づいたこと

そうです、テキストデータのストリーム処理のための言語であるawkなんですが、JSONはパースできないんですね。なのでここで[jq](http://stedolan.github.io/jq/)にアウトプットをパイプして…と夢が広がりますね。

教訓: awkからトレジャーデータを使うのは、まだまだ敷居が高そうです>_<
ドント方式による当選者数をAWKで計算する

現在、衆院選の選挙方式は「小選挙区比例代表並立制」と呼ばれる方式でおこなわれております。この中で比例代表選挙での当選者の決定方法は「ドント方式」と呼ばれるアルゴリズムで算出されます。ドント方式をAWKで実装してみました。

```awk 
{
    seats = $1;
    parties = NF - 1;
    print "#votes for each party:"
    for(i = 2; i <= NF; i++){
        print "party ",i-1,":" ,$i
        a[i-1] = $i
        b[i-1] = $i
    }
}
END{
    for(i = 1; i <= parties; i++){
        q[i] = 2;
        win[i] = 0;
    }
    for(j = 1; j <= seats; j++){
        indx = max_index(b)
        win[indx]++;
        b[indx] = a[indx]/q[indx]
        q[indx]++;
    }
    print("--------------")
    print("party: #winner")
    for(i = 1; i <= parties; i++){
        print(i,": ", win[i])
    }
}                            
function max_index(a) {
    for(i in a){
        v_max   = a[i];
        v_index = i;
        break
    }
    for(i in a){
        if(a[i]  > v_max){
            v_max   = a[i];
            v_index = i;
        }
    }
    return v_index;
}
```

以下のように、標準入力から当選者数、政党１の得票数、政党２の得票数、…と入力値を与えて使用します。

```
$ echo 7 400 60 150 330 160 | gawk -f dhondt.awk
#votes for each party:
party  1 : 400
party  2 : 60
party  3 : 150
party  4 : 330
party  5 : 160
--------------
party: #winner
1 :  3
2 :  0
3 :  1
4 :  2
5 :  1
```

最大値の計算はhttp://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_064
を参考にしました。
UbuntuのgeditでLaTeXを快適に打つための設定

Ubuntuで$\LaTeX$を打つ際に[gedit](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0032)を使っているのですが、補完機能がないのでどうにも使いづらい、ということでgeditにプラグインを追加して使いやすくしてみました。

#手順
1. 端末から``sudo apt install gedit-plugins gedit-latex-plugin``を入力し、geditのプラグインをインストールします。
2. geditを開き、<編集>ー<設定>を開きます。
3. <プラグイン>タブを開くとプラグインの一覧が出てくるので、LaTeX PluginとSyncTeXを有効にします。

#プラグインについて
##LaTeX Plugin
画像の挿入やコマンド補完など、痛いところに手が届くプラグインです。コンパイル(ビルド)も端末を使わずにできるようになります。
##SyncTeX
$\LaTeX$とgeditの間で同期を取るプラグインです。これを使うことで、完成品のpdfを開いたままコンパイルしてエラーになる、ということがなくなります。