OmniAICreator/Qiita-1.07M huggingface dataset:
geoip-c(0.9.1)のGeoIP::Organization#look_upにはメモリリークするバグがある


## 現象

ISP別のアクセス数を調べるために、td-agentにGeoIP Organizationを組み込んで当該IPアドレスのISPをログに落とすようにしたところ、td-agentプロセスがメモリリークする現象に遭遇した。
GeoIP Cityのみを使用していたときは問題なかった。

メモリリークを確認するために、ローカル環境でGeoIP::Organization#look_upを100万回ループしたときのメモリ使用量を10万回毎に見てみた。

```ruby:check_memoryleak.rb
require 'geoip'

db = GeoIP::Organization.new('GeoIPOrg.dat')
for i in 1..1000000 do
  db.look_up('8.8.8.8')
  puts `ps -o rss= -p #{Process.pid}`.to_i if i % 100000 == 0
end
```

結果

```
% ruby check_memoryleak.rb
44868
48228
49576
51300
53196
56084
57004
58308
59872
61080
```

回数が増えるにつれてメモリ使用量が増え続けている、つまりメモリリークしていることが分かる。

## 原因

ソースを読んでみると、geoip-cからGeoIP_name_by_addr()というGeoIPライブラリの関数を呼び出す箇所がある。
この関数はIPアドレスからISPもしくは組織名の文字列を返すもので、この文字列のメモリ領域はライブラリ内部でmallocして確保している。
このため、コール元(geoip-c側)でこの領域を解放する必要があるが、それが漏れているためメモリリークしていた。

## 対処法

Pull Requestを送って修正してもらったので、そのうちgeoip-c 0.9.2が出ると思うが、手っ取り早く対処するには以下のように修正すればよい。

1) geoip-cのソースがあるディレクトリに移動する

```
% cd `find ~/.rbenv -name 'geoip-c-0.9.1' -type d`
% cd ext/geoip
```

2) free()を追加

```
@@ -126,6 +126,7 @@
   VALUE result = rb_hash_new();
   if(value) {
     rb_hash_sset(result, key, encode_to_utf8_and_return_rb_str(value));
+    free(value);
     return result;
   } else {
     return Qnil;
```

3) リコンパイル

```
% make clean
% make install
```

ここで、再度GeoIP::Organization#look_upを100万回ループしたときのメモリ使用量経過を見てみる。

```
% ruby check_memoryleak.rb
42140
43076
43076
44836
45708
45708
45720
45868
45868
45868
```

45868バイト以降は増えていないのでメモリリークが解消されたことが確認できた。

以上
Swiftで重い処理の処理時間を測定する


# 概要

Swiftでも、rubyの[Benchmark](http://docs.ruby-lang.org/ja/2.1.0/class/Benchmark.html#M_MEASURE)のように簡単に処理時間を計算するメソッドを書いた。
このメソッドを使うと、アプリの速度改善に役立つ。

# Benchmarkクラス

```swift:Benchmark.swift

import Foundation

class Benchmark {

  // 開始時刻を保存する変数
  var startTime: NSDate
  var key: String

  // 処理開始
  init(key: String) {
    self.startTime = NSDate()
    self.key = key
  }
  
  // 処理終了
  func finish() {
    let elapsed = NSDate().timeIntervalSinceDate(self.startTime) as Double
    let formatedElapsed = String(format: "%.3f", elapsed)
    println("Benchmark: \(key), Elasped time: \(formatedElapsed)(s)")
  }

  // 処理をブロックで受け取る
  class func measure(key: String, block: () -> ()) {
    let benchmark = Benchmark(key: key)
    block()
    benchmark.finish()
  }
}

```

# 使い方

## 1. ブロックを渡す場合

```swift:Sample1.swift
Benchmark.measure("重いかもしれない処理1", block: {
  sleep(1)
  return
})

// => "Benchmark: 重いかもしれない処理1, Elasped time: 1.023(s)"
```

## 2. インスタンスを使う場合

基本的には「1」の使い方でいいが、測定したい部分(`block`の中)で定義した変数はそのブロックから出ると使えなくなってしまう。

```swift:Sample2-NG.swift
// 生成に時間が掛かる重いクラス
class MyHeavyClass {
  init() {
    sleep(1)
  }
  
  func myMethod() {
  }
}

Benchmark.measure("重いかもしれない処理2", block: {
  let myHeavyValue = MyHeavyClass()
})

myHeavyValue.myMethod()
// => Use of unresolved identifier 'myHeavyValue'
```

その場合は以下の方法を使う。

```swift:Sample2-OK.swift
let myBenchMark = Benchmark(key: "重いかもしれない処理2")
let myHeavyValue = MyHeavyClass()
myBenchMark.finish()
// => "Benchmark: 重いかもしれない処理2, Elasped time: 1.025(s)"

myHeavyValue.myMethod()
```

# ソースコード

https://github.com/tadyjp/BenchMark.playground
ここからダウンロードして試せます。

## 参考

- http://docs.ruby-lang.org/ja/2.1.0/class/Benchmark.html#M_MEASURE
- http://nshipster.com/benchmarking/
メンバ関数ポインタを配列で管理して読みやすくする



cocos2d-xだとメソッドを呼び出したSenderのタグで処理を分けたりすることも多いかもしれません。しかし、多くなった時の処理が大変になります



```cpp:

enum struct ButtonType
{
	Sound,
	Notification
}


void onTouchButton(Ref* pSender)
{
	Node* node = dynamic_cast<Node*>(pSender);
	int tag = node->getTag();
	ButtonType type = static_cast<ButtonType>(tag);
	
	if(type == Sound)
	{
		sound();
	}
	 else if(type==Notification)
	{
		notify();
	}
}



```

これだと、if文がどんどん増えて冗長になりますよね。なので、そもそもよぶメソッドを関数ポインタにしてstatic_castをほどこしてよぶようにします。



```cpp:Menuのenum

enum struct Menu
{
	HELP,
	PLAY,
	TITLE,
	RANKING
};


void (*fptrs[])() =
{
	&showHelp,
	&showPlay,
	&showTitle,
	&showRanking,
};

// 使い方
(this->*fptrs[static_cast<int>(Menu::HELP)])();


````
fluent-plugin-mackerelでhttpdのステータスコードを送信

td-agent、mackerelエージェントインストール済みとします
#やりたいこと
httpdのlogからstatus codeの数をカウントしてmackerelのダッシュボードに表示

# 手順
## fluent-plugin-datacounterの導入
```bash
# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-datacounter
```
## fluent-plugin-mackerelの導入
```bash
# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-mackerel
```

## td-agent.conf
```
<source>
  type tail
  format apache2
  path /var/log/httpd/access.log
  pos_file /var/log/td-agent/access.log.pos
  tag data.httpd.accesslog
</source>
<match data.httpd.accesslog>
  type datacounter
  count_interval 1m
  count_key code
  tag mackerel.httpd.accesslog
  outcast_unmatched yes
  pattern1 2xx ^2\d\d$
  pattern2 3xx ^3\d\d$
  pattern3 404 ^404$
  pattern4 4xx ^4\d\d$
  pattern5 5xx ^5\d\d$
</match>

<match mackerel.httpd.accesslog>
  type mackerel
  api_key YOUR_API_KEY
  service YOUR_SERVICE_NAME
  metrics_name http_status.${out_key}
  out_keys data.httpd.accesslog_2xx_count,data.httpd.accesslog_3xx_count,data.httpd.accesslog_404_count,data.httpd.accesslog_4xx_count,data.httpd.accesslog_5xx_count
</match>

```

# td-agentのリロード
```
# service td-agent reload
```

# 画面で確認
![Screen Shot.jpeg](https://qiita-image-store.s3.amazonaws.com/0/26917/2869a3f9-0694-dd71-79d0-463e429cc03d.jpeg "Screen Shot.jpeg")

出来ました。
EditorconfigをEmacsで使う(OSX)

# Editorconfigとは
Editorconfigはタブ幅の設定や改行などの設定を統一した設定ファイル(.editorconfig)で様々なEditorに反映させることが出来るツールです。

複数人で行うプロジェクトでみんながそれぞれ違うエディタを使っていてもコーディングルールを簡単に統一出来るので、非常に重宝します。



# Editorconfigのインストール

OSXの場合、homebrewを使って簡単にインストールできます。

````
$ brew install ediorconfig

````

# EditorconfigのEmacsプラグインを設定する

次にEditorconfingをEmacsで使うためのプラグインをインストールします。
自分はcaskを使っているのでCaskに以下を追記してインストールしました。

````elisp:Cask
(depends-on "editorconfig")

````

````
$ cask install
````

Editorconfigはプラグインから先ほどhomebrewでインストールしたEditorconfigのコマンドを実行するため、その実行PATHを設定しないといけません。

emacsのinit.elファイル以下を追記します。

````elisp:.emacs.d/init.el
(setq edconf-exec-path "/usr/local/bin/editorconfig")

````

あとはエディタの設定をしたいプロジェクトのトップディレクトリに.editorconfigを設置すれば反映します。
Yosemiteに変えたらgem installできなくなった件

**追記：El Capitanにバージョンアップして当該の症状が出た場合にも、同じ方法で解決できたとのコメントをいただきました。**

「またか」という感じですが、OSXをYosemiteにバージョンアップしたらgemの調子がおかしなことになりました。使っていたバージョンは、rbenvでインストールした2.1.1です。

```bash:terminal
ERROR:  Loading command: install (LoadError)
	dlopen(/Users/yoshiyuki/.rbenv/versions/2.1.1/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle, 9): Symbol not found: _SSLv2_client_method
  Referenced from: /Users/yoshiyuki/.rbenv/versions/2.1.1/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle
  Expected in: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
 in /Users/yoshiyuki/.rbenv/versions/2.1.1/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle - /Users/yoshiyuki/.rbenv/versions/2.1.1/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass
```

こんな感じのエラーです。なんかopensslが見当たらなくなっているみたい。
解決策は、

1. homebrew経由でopenssl入れてパスの変更 
2. rbenvのrubyを再インストール

これでいけました。

```bash:terminal
$ brew install openssl
$ brew link openssl --force
$ rbenv uninstall 2.1.1
$ rbenv install 2.1.1
```

同じ症状でお困りの方いらっしゃいましたら、是非一度お試しください。
Spring Boot でコマンドラインアプリケーションを作成する


コマンドライン引数を指定して起動するようなアプリをSpring Bootで作成する場合は `CommandLineRunner` を使います。

```java
@EnableAutoConfiguration
@ComponentScan
public class Application implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) {
        // Do something...
    }
}
```

[Spring Boot Reference Guide 20.6 Using the CommandLineRunner](http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-command-line-runner) でも書かれているように `CommandLineRunner` を実装したクラスに `@Component` を付与しておけば、コンポーネントスキャンで拾って勝手に実行してくれます。

また、 `CommandLineRunner` 実装クラスが複数ある場合、`org.springframework.core.Ordered` インターフェースや `org.springframework.core.annotation.Order` アノテーションを使うと実行順序を指定することができます。

```java:Application.java
@EnableAutoConfiguration
@ComponentScan
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
```

```java:DefaultCommandLineRunner.java
public class DefaultCommandLineRunner implements CommandLineRunner {
    public void run(String... args) throws Exception {
        System.out.println(Arrays.asList(args).stream().collect(Collectors.joining(",", getClass().getSimpleName() + "[", "]")));
    }
}
```

```java:Runner1.java
@Component
@Order(3)
public class Runner1 extends DefaultCommandLineRunner {}
```

```java:Runner2.java
@Component
@Order(2)
public class Runner2 extends DefaultCommandLineRunner {}
```

```java:Runner3.java
@Component
@Order(1)
public class Runner3 extends DefaultCommandLineRunner {}
```
```
$ java -jar build/libs/ordered-command-line-runner-examples-1.0.0.jar hoge moge hage

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.1.8.RELEASE)


Runner3[hoge,moge,hage]
Runner2[hoge,moge,hage]
Runner1[hoge,moge,hage]
```

ちなみに、順序を指定しなくてもエラーにはなりません。
どんな局面で使うのか分かりませんが・・・。
Alminium (Redmine)をスマホから利用する

http://redminepm.jp/

を使うと良い。

# セキュリティレベルを上げるには

* ポート番号を80番から変更 (apache or ルータ or iptables 等)
* [AlminiumでBasic認証を追加 - Qiita](http://qiita.com/tukiyo3/items/20f9f481757610fceca6) (apache)
* 接続元IP制限 (apache or ルータ or iptables 等)
* 認証を何度も間違えた場合、接続を拒否 (fail2ban)
* localhostからしか接続できないようにして、SSH Tunnelで接続 (apache + sshd + [JuiceSSH](https://play.google.com/store/apps/details?id=com.sonelli.juicessh&hl=ja) + 課金)

# 対応していないこと

* [クライアント証明書を要求するサイトの構築（Apache+OpenSSL）その2 - Qiita](http://qiita.com/tukiyo3/items/9633b8b5f63e887f55b1)だとスマホアプリ側が対応していない。

# Alminiumからメールを送ってもらうには

* [Alminiumでメール送信できるようにする - Qiita](http://qiita.com/tukiyo3/items/9734ab0b5c20c0d99e10)

# Alminiumってどうやってインストールするの？

* [ALMiniumが動作するdockerイメージを作成した - Qiita](http://qiita.com/tukiyo3/items/f07df454c85e4e8a0ef3)を使う。

## config.session_store 値を変えること。

 * [複数のredmineを1ドメインで動作せる時のsession_store設定 - Qiita](http://qiita.com/tukiyo3/items/86b4209fc36ac94ceefd)
AlminiumでBasic認証を追加

```bash:認証設定
htpasswd -c /opt/alminium.htpasswd yamada
```

* /opt/alminium.htpasswd に yamada ユーザと、暗号化されたパスワードが格納される。

```diff:/etc/httpd/conf.d/redmine.conf
  <VirtualHost *:80>
  ServerName localhost
  DocumentRoot /opt/alminium/public
  
  ExpiresActive On
  ExpiresByType application/x-javascript A259200
  ExpiresByType application/javascript A259200
  ExpiresByType image/png A2592000
  ExpiresByType image/jpeg A2592000
  ExpiresByType image/gif A2592000
  ExpiresByType text/css A2592000
  
  #RewriteEngine On
  #RewriteCond %{SERVER_PORT} 80
  #RewriteCond %{SERVER_NAME} !localhost
  #RewriteRule ^(.*)?$ https://%{HTTP_HOST}$1 [R,L]
  
+ # Basic Auth
+ <Directory /opt/alminium/public/>
+   AuthUserFile /opt/alminium.htpasswd
+   AuthGroupFile /dev/null
+   AuthName "Please enter ID and password"
+   AuthType Basic
+   require valid-user
+   order deny,allow
+ </Directory>
  
  </VirtualHost>
```

```bash:設定適用
/etc/init.d/httpd restart
```
e-Stat を使って統計情報を取得してみる

はじめに
-------
今日 (2014/10/31) から政府の統計情報にアクセスできる　
Web API が公開されたらしい。
http://www.e-stat.go.jp/api/

利用できるデータの一覧は下記 URL にある。
国勢調査から勤労統計からいっぱいある。
http://www.e-stat.go.jp/api/api-info/api-data/

なんか面白そう！
ということで使ってみた記録。


登録
---
1. まずは、このページにアクセスして、利用者登録を行う。
   http://www.e-stat.go.jp/api/regist-login/
   メールアドレスと名前なんかを入力。

2. メールアドレスにお知らせが届いているのでクリックしてアクティベート。

2. 次に、ログイン。アプリケーション ID をゲット。一人 3 ID までらしい。これ以降、アプリケーション  ID を xxx とする。


データ取得とプロット
-------------------

手順は以下の通り。
1. getStatsList にアクセスして適当な ID を取り出す。
2. getStatsData にアクセスして、データを取り出す。
3. カテゴリ名と VALUES のデータを取り出す。
3. 最後に解析。今回は年齢ピラミッドをプロット。

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

import httplib2
import lxml.etree
import pylab
import matplotlib.font_manager as fm

# 初期設定
h = httplib2.Http('.cache')
key = "xxx"
baseUrl = "http://api.e-stat.go.jp/rest/1.0/app"
statsCode = "00200521"

# 政府統計コード 00200521 の最初のデータ
# (昭和 55 年の国勢調査) のデータ ID を取ってくる
print "getStatusList..."
cmd = "%s/getStatsList?appId=%s&statsCode=%s"
response, content = h.request(cmd % (baseUrl, key, statsCode))
xml = lxml.etree.fromstring(content)
dataid = xml.xpath('//LIST_INF')[0].attrib["id"]


# データ ID をキーに実際のデータを取り出す
print "getStatusData..."
cmd = "%s/getStatsData?appId=%s&statsDataId=%s"
response, content = h.request(cmd % (baseUrl, key, dataid))
xml = lxml.etree.fromstring(content)


# カテゴリ名の取り出し
categories = {}
for c in xml.xpath("//CLASS_OBJ"):
    categories[c.attrib["id"]] = {"name": c.attrib["name"],
                                  "labels": {}}
    print c.attrib["id"]
    for label in c.xpath("CLASS"):
        print label.attrib["name"], label.attrib["code"]
        categories[c.attrib["id"]]["labels"][label.attrib["code"]] = label.attrib["name"]


# 値の取り出し
values = [{"cat01": v.attrib["cat01"],
           "cat02": v.attrib["cat02"],
           "cat03": v.attrib["cat03"],
           "area": v.attrib["area"],
           "value": int(v.text)}
          for v in xml.xpath('//VALUE')]


# 年齢層 (cat03) ごとの集計
c = categories["cat03"]
data   = []
labels = []
for code in sorted(c["labels"].keys())[1:]:
    labels.append(c["labels"][code])
    data.append(sum([v["value"] for v in values if v["cat03"] == code]))
print data


# プロット
width = 0.5
x = pylab.arange(len(data))
prop = fm.FontProperties(fname='/Library/Fonts/Osaka.ttf') # for mac
pylab.barh(x, data, width)
pylab.yticks(x + width / 2, labels)
pylab.show()

```

結果はこちら

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/29984/83c4e36c-1d0b-803a-84d1-42b7ad6b7294.png)




参考情報
-------
公式のマニュアル
http://www.e-stat.go.jp/api/wp/wp-content/uploads/2014/10/API-spec.pdf

ウェブのAPI を触るインターフェース
http://www.e-stat.go.jp/api/sample/testform/
「addEventListener」を使って、「続きを読む」の仕掛けを作ってみる。


ココでは、前回に投稿した[「イベント処理」](http://qiita.com/tsukishimaao/items/b1d12eb4c34abcf31d3a)の中の「addEventListener」をりようして１つのサンプルを作ってみようと思います。

完成イメージ↓

![js_ivent_004.png](https://qiita-image-store.s3.amazonaws.com/0/35975/ff74ae7c-f002-079c-8ae0-a278829ce5ba.png "js_ivent_004.png")

## 完成コード


まず先に完成のコードを書きます。以下です。

```html

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<title>「続きを読む」を出す</title>

<style type="text/css">
  .cont {
	  display: none;
  }
</style>
<script type="text/javascript">
  window.addEventListener('load', function() {
    document.querySelector('#seminar+p a').addEventListener('click', function(e) {
      e.preventDefault();
	  document.querySelector('#seminar+p a').style.display = 'none';
	  document.querySelector('#seminar~.cont').style.display = 'block';
    }, false);  
  }, false);
</script>
</head>
<body>
<h1 id="seminar">セミナーについて</h1>
<p>テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト<a href="#">続きを読む</a></p>
<p class="cont">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
</body>
</html>

```


## ① 続きの部分を表示されない様にする。

最初に「続き」にあたる部分の`<p>`タグを、
`<p class="cont">`とクラス指定してあらかじめ冒頭部分の「スタイルシート」で

```css

<style type="text/css">
  .cont {
      display: none;
  }
</style>

```
「display: none」にして、表示されない様にします。

## ② クリックすると続きが表示されるjavascriptを書く

次に「続きを読む」をどの様に指定するかですが、こういう事です。


「IDの`#seminar`の中の「最初の`<p>`タグ=`+p`」の中の`a要素`」＝`#seminar+p a`

↑これがクリックされると続きの部分以下↓

「IDの`#seminar`の以降に出てくる「class="cont"」で指定した部分」=`#seminar~.cont`が表示される。

この様に動かすためjavascriptは以下になります。


```js

<script type="text/javascript">
  window.addEventListener('load', function() {
    document.querySelector('#seminar+p a').addEventListener('click', function(e) {
      e.preventDefault();
      document.querySelector('#seminar+p a').style.display = 'none';
      document.querySelector('#seminar~.cont').style.display = 'block';
    }, false);  
  }, false);
</script>


```

上のコードの
`document.querySelector('#seminar+p a').style.display = 'none';`

ではクリックした後は「続きを読む」の部分は表示されない様にあえて設定しています。

その代わり↓

`document.querySelector('#seminar~.cont').style.display = 'block';`

と「display=ブロック」にする事によって、クリック後に表示される様になる仕組みです。


## 完成サンプル

以下完成サンプルです。

結果 : [http://m-uehara.com/js_002/js_ivent_004.html](http://m-uehara.com/js_002/js_ivent_004.html "出来上がり")
td-agentをroot権限で起動する

/var/log/messages他、root所有のファイルを読み取りたい場合など。
運用は慎重に行う必要がありますがこのような起動方法もあるということで。

## /etc/sysconfig/td-agent を作成
```
DAEMON_ARGS="--user root"
TD_AGENT_ARGS="/usr/sbin/td-agent --group root --log /var/log/td-agent/td-agent.log"
```

## td-agent再起動
```
# /etc/init.d/td-agent restart
```
縦書き表示するCSS

CSSで文庫小説のように縦書きを実現できるようなので試しました。

# 縦書き表示をする
-webkit-writing-modeと-webkit-text-orientationを使います。

```css:縦書き表示のCSS
p {
  -webkit-writing-mode: vertical-rl;
  -webkit-text-orientation: upright;
}
```

## 反映の例
ツイッターのツイートを縦書き表示にしてみました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/bd7f23d8-2fab-a7ea-315d-c35108cdd023.png" width="340" />


縦書すると顔文字が変になります。
スマホだとそこそこ使えたりするのかな(☝ ՞ਊ ՞)
zsh でマルチバイト文字列を測る

zsh でマルチバイト文字列の文字数、表示幅、バイト数を調べる方法です。

```zsh
LANG=ja_JP.utf8
str='ほげほげ'
print ${#str}    # => 4 (文字数)
print ${(m)#str} # => 8 (表示幅)
LANG=C
print ${#str}    # => 12 (バイト数)
```
21日でC++を習得する！ (Teach Yourself C++ in 21 days!)

Teach Yourself C++ in 21 days!
http://abstrusegoose.com/249

（参考訳）
> 1〜10日目：変数、定数、配列、文字列、式、文、関数...を習得する。
> 11〜21日目：プログラムの流れ、ポインタ、参照、クラス、オブジェクト、継承、ポリモーフィズム...を習得する。
> 22〜697日目：趣味のプログラミングを沢山こなす。ハックを楽しみつつも失敗から学ぶことは忘れない。
> 698〜3648日目：他のプログラマ達と交流する。プログラミングのプロジェクトで共に働き、彼らから学ぶ。
> 3649〜7781日目：高度な論理物理学を取得し、量子重力理論の統一理論を定式化する。
> 7782〜14611日目：生物化学、分子生物学、遺伝学...を習得する。
> 14611日目：生物学の知識を使って若返りの薬を作る。
> 14611日目：物理学の知識を使って次元転移装置[^1]を組み立て、21日目へタイムリープする。
> 21日目：若かりし自分自身と置き換える。
>
> 知る限りでは、これこそ「21日でC++を習得する」最も簡単な方法です。

[^1]: 原文では"flux capacitor"。[映画「バック・トゥ・ザ・フューチャー」](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%AD%E3%83%AA%E3%82%A2%E3%83%B3_%28%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%9E%E3%82%B7%E3%83%B3%29)が元ネタ。

# 関連
- [Teach Yourself Programming in Ten Years](http://www.norvig.com/21-days.html) / [プログラミングを独習するには10年かかる](http://www.yamdas.org/column/technique/21-daysj.html)
- [Webコミック「21日でC++を習得する方法」](http://gihyo.jp/dev/clip/01/orangenews/vol56/0009)
SendGrid+Ruby+UTF-8でメールを送信する

クラウドメールサービス[SendGrid](https://sendgrid.kke.co.jp)を使ってRubyからメールを送ってみます。
SendGridを使ってメールを送る方法はいくつかあります。詳しくは[公式ブログ](https://sendgrid.kke.co.jp/blog/?p=1300)を参照してください。

- SMTP
- Web API
- マーケティングメール機能

今回はSMTPとX-SMTPAPIを組み合わせて宛先毎に内容の異なるメールを送ってみます。

# SMTP
SMTPはWeb APIに比べて細かいメール送信パラメータを指定できるのがメリットですが、それが面倒な場合、デメリットにもなります。今回はUTF-8でメールを送ります。JISで送るバージョンは[こちら](http://qiita.com/awwa/items/f3b1aed64a18d7d6734a)。

# X-SMTPAPI
名前がSMTPっぽくて紛らわしいですが、[X-SMTPAPI](https://sendgrid.kke.co.jp/blog/?p=1300)はSendGrid独自の拡張ヘッダです。これを利用するとメール送信時にSendGridの様々な機能を使うことができます。今回は、To、Substitution、Sectionを利用してメールの件名や本文内の特定のキー文字列を宛先毎に異なる値に置換してメールを送ってみます。

# とりあえず送ってみる
以下の手順で[サンプルコード](https://github.com/SendGridJP/sendgrid-smtp-ruby-example)をクローン、.envファイル編集、実行してください。
Rubyは2.1.0で動作確認しています。

```text
git clone https://github.com/SendGridJP/sendgrid-smtp-ruby-example.git
cd sendgrid-smtp-ruby-example
cp .env.example .env
# .envファイルを編集してください
bundle install
ruby -f sendgrid-smtp-utf8.rb
```

### .envファイルの編集
```text
SENDGRID_USERNAME=SendGridユーザ名
SENDGRID_PASSWORD=SendGridパスワード
TOS=you@youremail.com,friend1@friendemail.com,friend2@friendemail.com
FROM=you@youremail.com
```
SENDGRID_USERNAME:SendGridのユーザ名を指定してください。
SENDGRID_PASSWORD:SendGridのパスワードを指定してください。
TOS:宛先をカンマ区切りで指定してください。
FROM:送信元アドレスを指定してください。

指定したアドレスにメールは届きましたか？

# コード

```rb
# -*- encoding: utf-8 -*-
require 'mail'
require 'dotenv'
require 'smtpapi'

Dotenv.load
sendgrid_username = ENV["SENDGRID_USERNAME"]
sendgrid_password = ENV["SENDGRID_PASSWORD"]
from = ENV["FROM"]
tos = ENV["TOS"].split(',')

# smtpapi
smtpapi = Smtpapi::Header.new
smtpapi.set_tos(tos)
smtpapi.add_substitution("fullname", ["田中 太郎", "佐藤 次郎", "鈴木 三郎"])
smtpapi.add_substitution("familyname", ["田中", "佐藤", "鈴木"])
smtpapi.add_substitution("place", ["office", "home", "office"])
smtpapi.add_section('office', '中野')
smtpapi.add_section('home', '目黒')
smtpapi.add_category('Category1')

mail = Mail.new(:charset => "UTF-8") do
  from from
  to tos
  subject "[sendgrid-smtp-ruby-example] フクロウのお名前はfullnameさん"
  add_file "./gif.gif"
end
mail["x-smtpapi"] = smtpapi.to_json

text_plain = Mail::Part.new do
  body "familyname さんは何をしていますか？\r\n 彼はplaceにいます。"
  content_type "text/plain; charset=UTF-8"
end
text_html = Mail::Part.new do
  body "<strong> familyname さんは何をしていますか？</strong><br />彼はplaceにいます。"
  content_type "text/html; charset=UTF-8"
end
mail.part :content_type => "multipart/alternative" do |p|
  p.html_part = text_plain
  p.text_part = text_html
end

mail.delivery_method(:smtp,
  address: "smtp.sendgrid.net",
  port: 587,
  domain: "gmail.com",
  authentication: :login,
  user_name: sendgrid_username,
  password: sendgrid_password
)
mail.deliver
```

基本的には[JISバージョン](http://qiita.com/awwa/items/f3b1aed64a18d7d6734a)ほぼ同じですが、文字コードの変換周りがなくなり少しスッキリと書けました。
libGDXの基礎９　音を鳴らす

libGDXとはWindows、Linux、Mac、Android、iPhone、HTMLに対応したクロスプラットフォームゲームライブラリです。有名なIngressでも利用されています。欧米ではわりとメジャーどころです。

#音を鳴らす準備

ゲームでは音も大事な要素です。

今回は効果音を出してみます。

適当な音声ファイルを用意します。wavが良いでしょう。

16bit無圧縮PCMを選んでください。8bitははねられますので。手元にツールがない場合は変換にはitunesを利用するとよいでしょう。

#ソース

準備

```java
Sound sound = Gdx.audio.newSound(Gdx.files.internal("hoge.wav"));
```

再生

```java
sound.play();
```

解放

```java
sound.dispose();
```

簡単ですね。

Soundクラスには音量やピッチ、パンなどの機能がありますのでJavadocを見てみるとよいでしょう。
作成中の Vim プラグインの動作確認をしたいときのためのの便利コマンド

# 基本編
Vim プラグインを作っているときに、その動作を確認したいことがよくあります。
そういうときは、下のようなコマンドを vimrc に書いておくと便利です。

```vim
command! -bang -nargs=* PluginTest call PluginTest()
function! PluginTest()
  execute '!vim -u NONE -i NONE -N --cmd "set rtp+=' . getcwd() . '"'
endfunction
"}}}
```

これで `:PluginTest` とやると、現在のカレントディレクトリが `runtimepath`
に追加された状態の真新しい Vim を (サブシェル上で) 立ち上げることができます。
(プラグインの動作を確認するときは vimrc を読み込まずに素の Vim を起動したほうが設定に依存した問題に
気づけたりするので良いです)

まぁなので前提としてプラグインを作成しているときはカレントディレクトリがプロジェクトのルートに
あることを期待しています。

# 応用編
人によっては現在編集中のバッファの親ディレクトリがカレントになるようにしている人もいることでしょう。
その場合は適宜プロジェクトルートを探すような処理
(例えば `git rev-parse --show-toplevel`)
を挟むと良いでしょう。

それと、全くの素の Vim だとシンタックスハイライトや ftplugin さえ無効になるのでさすがに辛いです。
なので予め下記のような最低限の設定をした min.vimrc みたいなものを用意しておいて、
それを `-u min.vimrc` で読み込むようにしておくと ftplugin や filetype に依存するプラグインでもストレスなく
動作確認ができます。

```vim
syntax on
filetype plugin indent on
```

あとは GVim はサブシェルという考え方がないので `!vim` が使えません。
あるいは端末 Vim の場合でも GVim 固有の動作 (e.g. `balloon-eval`) を確認したい時もあるので
`gvim` と `vim` を切り替えられるようにしておくと便利です。

さらに、Ex コマンドから立ち上げるのがメインのプラグイン (e.g. unite.vim, vimfiler, agit.vim)
だと毎回 Ex コマンドを打ち込むのは面倒なので引数でコマンド名を受け取るようにしましょう。

ということで僕の vimrc に書いてあるバージョンは下記のような感じになっています。

```vim
command! -bang -nargs=* PluginTest call PluginTest(<bang>0, <q-args>)
function! PluginTest(is_gui, extraCommand)
  let cmd = a:is_gui ? 'gvim' : 'vim'
  let extraCommand = empty(a:extraCommand) ? '' : ' -c"au VimEnter * ' . a:extraCommand . '"'
  execute '!' . cmd . ' -u ~/.vim/.min.vimrc -i NONE -N --cmd "set rtp+=' . getcwd() . '"' . extraCommand
endfunction
"}}}
```

# 謝辞
実はこのアイデアは僕のオリジナルではないです。

thinca さんがライブコーディングでこれと似たようなことをやっていたのを見て参考にしました。
thinca さんの実装がどうなっているかは知らないのですが、基本は似たようなことをしていて、
あとは上の応用編にあるような追加のオレオレ設定をしているのではないかなと予想します。

みなさんもオレオレ `:PluginTest` コマンドを作りましょう。
podコマンドのバージョン固定


# `CocoaPods`のインストールといえば

```shell
$ gem install cocoapods
```

って書いてある事が多い。

これだと

- 複数人で開発する時に別々のバージョンが入る事がある
- そのせいで、`Podfile.lock`に差分が出る

という事故がたまーに起きる。

なので、

```shell
$ gem install cocoapods -v x.x.x
```

という感じで指定する。

でも、別のプロジェクトだとバージョンが違うとか起こる…。

というわけで、僕は`bundler`を使って入れています。

# `bundler`を使う

bundleを使っておけば、`CocoaPods`以外に使いたい`gem`が出てきても`Gemfile`に追加すれば良いので便利。

- [Houston](https://github.com/nomad/Houston)
- [Shenzhen](https://github.com/nomad/shenzhen)

とか。

## `bundler`のインストール

```shell
$ gem install bundler
```

## Gemfile作成

```shell
$ cd $PROJECT_ROOT
$ cat > Gemfile <<EOD
source 'https://rubygems.org'

gem 'cocoapods'

<<EOD
```

- 任意のバージョンで固定したい場合

```shell
$ gem 'cocoapods', '0.33.1'
```

とか書く。

## `bundle install`

```shell
$ cd $PROJECT_ROOT
$ bundle install --path=vendor/bundle --binstubs=vendor/bundle/bin
```

## `pod install`

- `Podfile`を用意してから

```shell
$ cd $PROJECT_ROOT
$ bundle exec pod install
```

# おまけ

`direnv`を入れておくと`bundle exec`が要らなくなって便利

## install

```shell
$ brew install direnv
```

- Hookの登録

```~/.zshrc
eval "$(direnv hook zsh)"
```

## 設定

```shell
$ cd $PROJECT_ROOT
$ cat > .envrc <<EOD
export PATH=$PWD/vendor/bundle/bin:$PATH
EOD
$ direnv allow
```

これで、`PROJECT_ROOT`に`cd`すれば

```shell
pod install
```

と使えるようになる。
C のソースコードからコメントと空行を削除する

# 概要
C/C++ のソースコードからコメントと空行を削除したいなーってことありますよね?例えばコメントと空行以外の行数を数えたいときとか。そんなときに使うスクリプトです。今回は Perl を使い正規表現で置換しました。

# スクリプト
```pl:rmcom.pl
#!/usr/bin/env perl

my $str = join('', <>);
my $comment_re = qr[(?:\A|(?<!\\))(?:/\*.*?\*/|//[^\r\n]*)]ms;
my $non_comment_re = qr[(?:\A|(?<!\\))((["'])(?:\\.|(?:(?!\2|\\).))*\2)]ms;

$str =~ s[$non_comment_re|$comment_re][$1]gms;
$str =~ s[$non_comment_re|[[:blank:]]+(?:(?=\r)|$)][$1]gms;
$str =~ s[$non_comment_re|^[\r\n]+][$1]gms;

print $str;
```
文字列リテラルの中を処理しないようにするため `$non_comment_re` の最初のキャプチャーグループをそのまま出力します。バックスラッシュによるエスケープも認識します。

# 使い方
```shell-session
rmcom.pl **/*.c | wc -l
```
などとすれば OK です。
MySQLへのCSVファイルのロード方法の覚え書き。


```load_data.sql
mysql> load data local infile "hoge.csv" 
mysql> into table hoge 
mysql> fields terminated by "," 
mysql> enclosed by '"' 
mysql> lines terminated by '¥n';
```

ちなみに、localを記述しないと下記エラーが発生する。

```
Access denied for user 'db_name'@'localhost' (using password: YES)
```
[要root化] androidでシステムアプリとしてinstallする方法

## 概要
androidのsystem/priv-appにアプリをインストールする方法。
## やる意味
user appでは呼ぶことの出来ないAPIを呼ぶことが出来る。
## 手順
1. /system領域のremount
<pre>
$ adb shell
$ su
# mount -o rw,remount /system
</pre>
2. apkの配置
<pre>
$ adb push YourApp.apk /sdcard/
$ adb shell
$ su
# mkdir /system/priv-app/YourApp
# cp /sdcard/YourApp.apk /system/priv-app/YourApp
# chmod 644 /system/priv-app/YourApp/YourApp.apk
</pre>
3. 再起動
<pre>
$ adb shell
$ su
# reboot
</pre>
4. 完了

## 参考にしたサイト 
http://www.addictivetips.com/mobile/how-to-install-any-app-as-system-app-on-android/
Chrome Extensions | Keyconfig で独自ショートカットを作成

# Chrome Extensions | Keyconfig で独自ショートカットを作成

## 概要
Chrome Extensions Keyconfig で独自ショートカットを作成します。
## 経緯
GitHub の検索欄のように、よく使う機能に対してショートカットキーでアクセスできると便利です。
Qiita についても要望エントリを作成しました。(タイトルは別の要望内容に見えますが、要望の1つにショートカットキーアクセスが含まれています)
[Qiita要望 | 非ログイン時のトップページへの検索窓設置](http://qiita.com/tbpgr/items/c853c0c6359103a9cd38)

そのうち機能が実装されるような気がしますが、それまでの暫定措置として
Chrome 拡張を探しました。

※以前に類似のツールとして、 vim ライクにブラウザ操作ができる Vichrome Extensions を試用したことがあるのですが
そのときは、サイトによって動いたり動かなかったりしたので使用をやめました。

## Keyconfig
下記よりインストールします。
[Google Play Keyconfig](https://chrome.google.com/webstore/detail/empty-title/okneonigbfnolfkmfgjmaeniipdjkgkl?hl=ja)

## ショートカットの一覧
左上の type key her , add の部分で好きなショートカットを追加できます。

![keyconfig.png](https://qiita-image-store.s3.amazonaws.com/0/43480/38d9b73e-e6df-048e-29d6-55bb0770e78f.png)

## よく利用しそうなショートカット
vim ライクな操作が可能です

### hjkl
上下左右にスクロール。

### ESC
ノーマルモードと制限モードの切り替え。
迂闊にショートカットキーを暴発させたくない場合は制限モードにする。
ESCを押すとブラウザの左下に現在のモードがポップアップ表示されます。

![keyconfig_mode.png](https://qiita-image-store.s3.amazonaws.com/0/43480/6c393104-a32a-43bc-b5b6-e76ce45347eb.png)

### a a
a を2回押すと、最初のフォームにフォーカスします。
Qiita のページを開いた直後に検索にフォーカスしたければ、 このショートカットを利用します。

### Hit a hint
Hが予約されていたので、Hint => Question から連想して ? キーを割り当てました。

画面上でアクションのトリガーとなる全ての要素にショートカットキーが割り振られ、
そのキーがポップアップ表示されます。
該当キーを押下すれば、該当要素にフォーカスします。

こんなのが表示されます。

![keyconfig_hint.png](https://qiita-image-store.s3.amazonaws.com/0/43480/5f109915-2553-d95f-ff6d-289b7adf6957.png)

上記の画像で言うと、例えば「 ff 」をタイプすると、
「Ruboty | Testable Ruboty 。 賛否はさておきテスト付きの Ruboty Handler を作成してみた。 #ruboty」の
リンクにフォーカスされ、 Enter を押せばリンク先に移動できますし、 Ctrl + Enter を押せば新規タブを開きつつ移動します。

### c o n f i g
config 、と入力すると Keyconfig Extensions の設定画面が開く。
この設定を作った作者さんセンスがあるな、と思った。

また、この応用で自分でもキーワードをショートカットに設定すると
コマンドを覚えるための敷居が下がりそうだし、ある程度長くなれば
キー競合もしなくなる。

## 参照
[Google Play Keyconfig](https://chrome.google.com/webstore/detail/empty-title/okneonigbfnolfkmfgjmaeniipdjkgkl?hl=ja)
[Qiita要望 | 非ログイン時のトップページへの検索窓設置](http://qiita.com/tbpgr/items/c853c0c6359103a9cd38)
コマンドラインツールであらゆる言語が使われていても行数を測定する

# 準備
プログラマにとって行数は少なければ少ないほどエレガント。
使っているIDEのプラグインでステップ数をカウントできれば良いかもしれないが、IDEによっては手頃なプラグインがなかったり特定言語に対してしか使えないものも多く不便。

しかし最近のIDEには大抵ターミナル（コマンドプロンプト）が付いているので、そこで実行できるものを一つ持っていると便利だ。（わざわざステップ数知るためにIDE起動しなくて済むし）

まずclocというコマンドを使うのでインストールする。
Macユーザーならhomebrewでインストールするが吉。

```shell-session
brew install cloc
```

その他の方は http://cloc.sourceforge.net 見てファイト。

# 使う

```shell-session
cloc [対象のディレクトリ]
```

で使える。超簡単。
細かく設定したい人は

```shell-session
cloc --help
```

でヘルプを読めるが、そのままシンプルに使っても充分な気がする。

例えば俺の作ったAndroidアプリのディレクトリで実行してみると

```shell-session
cloc app/src/main/
```

こんな感じでディレクトリを指定して

```shell-session
     100 files
     573 text files.
     564 unique files.                                          
      17 files ignored.

http://cloc.sourceforge.net v 1.62  T=4.16 s (132.5 files/s, 33163.3 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
XML                            204            362           7566          45933
Javascript                     128           5113           4432          27884
Java                           162           6251           7973          19282
HTML                            31            631             12           9344
C++                              3            161            300            895
C/C++ Header                     6            107            162            792
CSS                              3             76              3            334
JSON                            10              0              0            201
SASS                             1              3              0             17
Ruby                             1              7             10             10
make                             1              0              0              5
SQL                              1              0              0              2
-------------------------------------------------------------------------------
SUM:                           551          12711          20458         104699
-------------------------------------------------------------------------------
```

という感じに結果が得られる。
ファイル数、空行、コメント、コードの各行数が分かるし、それらを言語ごとに教えてくれるので、なんか過不足ない気がする。
キャノピークラスタリング

# キャノピークラスタリング
[Canopy_clustering_algorithm](http://en.wikipedia.org/wiki/Canopy_clustering_algorithm)

キャノピークラスタリングとは[教師なし学習](http://ja.wikipedia.org/wiki/%E6%95%99%E5%B8%AB%E3%81%AA%E3%81%97%E5%AD%A6%E7%BF%92)の手法の一つである。

K平均法や階層的クラスタリングの前処理として使用される。

膨大なデータに対するクラスタリングの高速化を目的とする。
クラスタをいくつに分類するかを予めキャノピークラスタリングで出すことで、クラスタリングを素早くやろうということ。

↓のサイトの画像でイメージが掴める。（本文になんて書いてあるかさっぱり分からんけど）
http://www.shahuwang.com/2012/08/14/canopy%E8%81%9A%E7%B1%BB%E7%AE%97%E6%B3%95.html

# 要するに
クラスタリングの高速化手法なので、使おう。
（という認識で良い？）

# 参考
http://db-event.jpn.org/deim2014/final/proceedings/D5-4.pdf
Ruboty | Gemfury に登録した Private な Gem を利用した Ruboty を Heroku にデプロイして、 Slack と連携する #ruboty #gemfury #slack

# Ruboty | Gemfury に登録した Private な Gem を利用した Ruboty を Heroku にデプロイして、 Slack と連携する
## 概要
Ruboty で利用する自作 Handler は、 ChatOps の性質上、外部公開できないものもあると思います。
そういった際に、下記記事で紹介している gemfury など、 Private な Gem を管理できる
クラウドサービスや社内サーバーに geminabox を利用した gem server を立てることになると思います。

今回は、 Gemfury を利用したケースを紹介します。
## 自作 Ruboty Handler gem の作成
下記記事を参照。
[Ruboty | 自作 Handler gem の作成](http://qiita.com/tbpgr/items/a7ac8aaec55ee1bf79f0)

## Gemfury への登録方法
下記記事を参照。
[Gemfury | クラウドパッケージリポジトリ Gemfury の登録、疎通確認まで](http://qiita.com/tbpgr/items/7298faf1242370bde2ce)

## Heroku への Ruboty のデプロイ
Ruboty の作者である @r7kamura さんの下記記事を参考に Heroku にデプロイを行います
[Ruby製HubotクローンのRubotyをSlackで動かす](http://qiita.com/r7kamura/items/8d1b98e28154de6030b9)

* 上記の手順で fork したリポジトリの Gemfile を下記のように編集します。

~~~ruby
source "https://rubygems.org"

gem "rake"
gem "ruboty-alias"
gem "ruboty-cron"
gem "ruboty-google_image"
gem "ruboty-redis"
gem "ruboty-slack"
gem 'gemfuryに公開したgem名', :source => "https://#{ENV['GEMSPEC_KEY']}@gem.fury.io/your_account/"
~~~

* heroku に push します

~~~
$ git push heroku master
~~~

* heroku コマンドで環境変数 **GEMSPEC_KEY** を追加します

~~~
$ heroku config:add GEMSPEC_KEY="your_gemfury_token"
~~~

## 動作確認

仮に "gemfury test" に対して "gemfury_test" と返却するだけの Ruboty Handler を作成したとします。

* Slack 画面キャプチャ

![ruboty-gemfury_test.png](https://qiita-image-store.s3.amazonaws.com/0/43480/adaeb166-a2f0-4d18-6c0a-51e082693f19.png)

## 補足
この記事を作成し終わった後に気付いたのですが、これと同等のことを行う
Heroku add-on がある模様。 onz
https://devcenter.heroku.com/articles/gemfury

## 参照
* [Ruboty | 自作 Handler gem の作成](http://qiita.com/tbpgr/items/a7ac8aaec55ee1bf79f0)
* [Gemfury | クラウドパッケージリポジトリ Gemfury の登録、疎通確認まで](http://qiita.com/tbpgr/items/7298faf1242370bde2ce)
* [Ruby製HubotクローンのRubotyをSlackで動かす](http://qiita.com/r7kamura/items/8d1b98e28154de6030b9)
配列をオリジナルデータは変更せずにソートしたい

# 概要

要素数が多い or 格納要素のサイズが大きくてソートに時間がかかるなどの理由でオリジナルの配列は触りたくないけど、ソートした結果が欲しいという状況がときどきあります。

そんなときはオリジナル配列要素のポインタを要素とする配列を作ってそれをソートすると便利です。

オリジナル配列を変更することは無いですし、ソートの過程で動くデータがポインタなので、要素交換のコストが小さく高速です。

# 方法

下の例ではくだもの構造体のベクトルからポインタのベクトル作り、そのベクトルをソートしています。

### サンプルコード

```cpp
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

//! くだもの構造体
struct Fruit
{
	Fruit(int _id, int _price, string _name)
		: id(_id),
		price(_price),
		name(_name)
	{ }

	int id;			//!< 品番.
	int price;		//!< 値段.
	string name;	//!< 名前.
};

int main() {

	// オリジナルデータ作成
	std::vector<Fruit> vec;
	vec.push_back(Fruit(0, 150, "apple"));
	vec.push_back(Fruit(1, 110, "orange"));
	vec.push_back(Fruit(2, 350, "strawberry"));
	vec.push_back(Fruit(3, 160, "persimmon"));
	vec.push_back(Fruit(4, 100, "kiwi"));
	
	// 参照配列作成
	std::vector<const Fruit*> ref;
	for	(const Fruit& f : vec)
	{  // ポインタをコピー
		ref.push_back(&f);
	}
	
	std::sort(ref.begin(), ref.end(),
		[] (const Fruit* l, const Fruit* r)
		{	// 名前順にソート
			return l->name < r->name;
		});

	cout << "ソート結果：\n";
	for (const Fruit* f : ref)
	{
		cout << f->id << ", " << f->price << ", " << f->name << endl;
	}
	
	cout << "\nオリジナルは変わってないよ：\n";
	for (const Fruit& f : vec)
	{
		cout << f.id << ", " << f.price << ", " << f.name << endl;
	}
	
	return 0;
}
```

### コンソール出力

```
ソート結果：
0, 150, apple
4, 100, kiwi
1, 110, orange
3, 160, persimmon
2, 350, strawberry

オリジナルは変わってないよ：
0, 150, apple
1, 110, orange
2, 350, strawberry
3, 160, persimmon
4, 100, kiwi
```

# 注意点

この例のようにオリジナルデータが動的配列の場合、 resize や push_back などでメモリの再確保が行われると、ポインタの配列は壊れてしまいます。

それに気づかずにポインタ経由で要素を参照しようとすると、無効なメモリアクセスが発生するため注意が必要です。

### 大変なことになる例

```cpp

int main() {

	// オリジナルデータ作成
	std::vector<Fruit> vec;
	vec.push_back(Fruit(0, 150, "apple"));
	vec.push_back(Fruit(1, 110, "orange"));
	vec.push_back(Fruit(2, 350, "strawberry"));
	vec.push_back(Fruit(3, 160, "persimmon"));
	vec.push_back(Fruit(4, 100, "kiwi"));
	
	// 参照配列作成
	std::vector<const Fruit*> ref;
	for	(const Fruit& f : vec)
	{  // ポインタをコピー
		ref.push_back(&f);
	}
	
	std::sort(ref.begin(), ref.end(),
		[] (const Fruit* l, const Fruit* r)
		{	// 名前順にソート
			return l->name < r->name;
		});

    "メモリ再確保 (=ref 内のデータが無効化)"
    vec.resize(100);

	cout << "ソート結果：\n";
	for (const Fruit* f : ref)
	{    これをやると大変なことになる！
		cout << f->id << ", " << f->price << ", " << f->name << endl;
	}
	
	return 0;
}
```
Gemfury | クラウドパッケージリポジトリ Gemfury に build した gem を公開する方法 #gemfury

# Gemfury | クラウドパッケージリポジトリ Gemfury に build した gem を公開する方法

## 概要
クラウドパッケージリポジトリ Gemfury への公開鍵登録方法について

## 手順
仮に gottani gem の version 3 を bundle の rake build を利用して、build し、
Gemfury に公開するとします。

~~~
$ gem build gottani.gemspec
$ curl -F package=@<file> https://your_gemfury_token@push.fury.io/your_account/
~~~

## 結果確認
![gemfury_publish_build_gem.png](https://qiita-image-store.s3.amazonaws.com/0/43480/30b9a54e-5360-85ce-76bc-4dba6169b007.png)

## 参照
* [gemfury](https://gemfury.com/)
* [gottani gem](https://github.com/tbpgr/gottani)
Gemfury | クラウドパッケージリポジトリ Gemfury の登録、疎通確認まで #gemfury

# Gemfury | クラウドパッケージリポジトリ Gemfury の登録、疎通確認まで

## 概要
クラウドパッケージリポジトリ Gemfury の登録、疎通確認までについて。

Gemfury => Gem + fury だろうか？
fury => 狂乱、猛威、激怒、激高、憤激、激憤

アイコンが、ドラゴンボールみたいにオーラをまとって飛んでいる Ruby 風なので
滾っている様を表しているのか？

![gemfury icon](https://d20hvmyj2v2b8k.cloudfront.net/assets/landing/logo-8ec69d3933f9c74b0fb322e97e5721b9.png)

## 用途
RubyGems に公開できないが、 geminabox など自前の gem server を構築・運用する手間を省きたい。
そんなケースで クラウドパッケージリポジトリ Gemfury の利用が考えられます。
14日の無料お試し期間付。

お試し以降の価格については、下記参照
[gemfury pricing](https://gemfury.com/plans)

Gemfury は RubyGems 以外にも、

* PHP Composer
* Node.js npm
* Python PyPI
* NuGet
* apt / deb
* yum / rpm

などにも対応している。
今回は RubyGems の話。

## 手順
[gottani gem](https://github.com/tbpgr/gottani) を対象とします。

* pricing の画面から Create a Free Acount のボタンを押下
![gemfury_start1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/a1ab8ec6-9773-6732-8c52-07672eb2dcd4.png)

* アカウント作成画面に Username, Email, Password を登録して Create New Account
![gemfury_start2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/8cd78fae-bac6-72c0-27da-a2e5436cecbb.png)

* ログインが成功し、 Get Start ページが表示されます

* gem remote のリポジトリを登録します

~~~bash
$ git remote add fury https://your_account@git.fury.io/your_account/<package-name>.git
$ git push fury master
~~~

* 登録されたことを確認します
![gemfury_start3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/96a0a303-5543-45e4-4ff0-d4029c648caf.png)

* 登録した gem をインストールしてみます
    * Repos メニューでリポジトリのURLを取得できます
    * URLはシークレットトークンを含んでおり、ユーザーごとに異なります
    * ※外部公開するリポジトリの Gemfile などから呼び出す場合はトークン部分を環境変数に設定すること

* Gemfile

~~~ruby
source 'https://your_token@gem.fury.io/your_account/'
# 外部公開する Gemfile の場合はハードコードせずに環境変数経由で設定
# source "https://#{ENV['GEMSPEC_KEY']}@gem.fury.io/your_account/"

gem 'gottani'
~~~

* インストール実行

~~~bash
$ bundle install
~~~

* インストール確認

~~~bash
$ gem list | grep gottani
gottani (0.0.2)
~~~

* gottani を呼び出す rb を作成・実行してみます

~~~ruby
require 'gottani_core'

text =<<-EOS
root
    child1
        child1_1
            child1_1_1
            child1_1_2
        child1_2
    child2
        child2_1
    child3
EOS

gottani_core = Gottani::Core.new :space4, text
print gottani_core.to_markdown
~~~

出力

~~~markdown
# root
## child1
### child1_1
#### child1_1_1
#### child1_1_2
### child1_2
## child2
### child2_1
## child3
~~~

## 参照
* [gemfury](https://gemfury.com/)
* [gemfury pricing](https://gemfury.com/plans)
* [gottani gem](https://github.com/tbpgr/gottani)
Ruboty | Heroku にデプロイした ruboty のプロセスが status 143 で exit してしまう #ruboty #heroku

# Ruboty | Heroku にデプロイした ruboty のプロセスが status 143 で exit してしまう #ruboty #heroku
## 概要
Heroku にデプロイした ruboty のプロセスが status 143 で exit してしまう事象が発生。
対応方法について。

## 現象
Heroku に Ruboty をデプロイして Slack と連携していたのですが、
スリープ状態になったプロセスが反応しないため、
`heroku restart` で再起動を実行しましたが、動きません。
`heroku logs` で確認したところ、再起動直後に即 exit していました。

logs を確認したところ、再起動直後に即停止してしまっているようです。

~~~bash
$ heroku logs
2014-10-31T01:00:04.752860+00:00 heroku[bot.1]: Starting process with command `bundle exec ruboty`
2014-10-31T01:00:05.675499+00:00 heroku[bot.1]: State changed from starting to up
2014-10-31T01:00:04.954595+00:00 heroku[bot.1]: Stopping all processes with SIGTERM
2014-10-31T01:00:10.282889+00:00 heroku[bot.1]: Process exited with status 143
2014-10-31T01:14:14.371609+00:00 heroku[bot.1]: State changed from up to starting
2014-10-31T01:14:16.510806+00:00 heroku[bot.1]: Starting process with command `bundle exec ruboty`
2014-10-31T01:14:17.124073+00:00 heroku[bot.1]: State changed from starting to up
2014-10-31T01:14:17.223039+00:00 heroku[bot.1]: Stopping all processes with SIGTERM
2014-10-31T01:14:19.109616+00:00 heroku[bot.1]: Process exited with status 143
~~~

## 対応
正常に起動するまで `heroku restart` をたたく
愚直・・・
Elixir Functions As Arguments

# Elixir Functions As Arguments

## 概要
Elixir の Function を引数で渡します。

## サンプル
2つの数値を合計して、基数を指定して返却する関数を返却する
関数を作成し、それを関数に渡して実行します。

~~~
sum_to_s_f = fn (base) -> 
  fn (a, b) ->
     Integer.to_string(a + b, base)
  end
end

defmodule Sum do
  def call_sum(fun, a, b) do
    fun.(a, b)
  end
end

sum_base10 = sum_to_s_f.(10)
IO.puts Sum.call_sum(sum_base10, 10, 6)
sum_base2 = sum_to_s_f.(2)
IO.puts Sum.call_sum(sum_base2, 10, 6)
sum_base8 = sum_to_s_f.(8)
IO.puts Sum.call_sum(sum_base8, 10, 6)
sum_base16 = sum_to_s_f.(16)
IO.puts Sum.call_sum(sum_base16, 10, 6)
sum_base36 = sum_to_s_f.(36)
IO.puts Sum.call_sum(sum_base36, 10, 6)
~~~

* 出力

~~~
16
10000
20
10
G
~~~
素のconsole.logを使わない


最初から大層なライブラリを使えとは言わない。とりあえずラップしておけ。
あとから実装はいくらでも入れ替えられる。

```javascript
window.myLogger = (function() {
	// 例えばHerokuを使っている場合
	var isProduction = location.hostname.match(/\.herokuapp\.com/) !== null;

	return {
		debug: function() {
			if (!isProduction) {
				console.debug.apply(console, arguments);
			}
		},
		info: ...
	};
})();
```
EC2仮想化方式メモ


AWS EC2の仮想化方式は、大きく分けて2つ。
* PV（準仮想化）
* HVM(完全仮想化)。


その内、PVには仮想化方式が2種類ある。


## PV(Paravirtual)
1つは、PV。
あらかじめAWSで用意されたkernel（AKI）とinitrd(ARI)で起動される方式。
ルートデバイス不要。/bootなくても起動できるよ。


もう1つは、PV-GRUB。別名、UPK(User Provided Kernel)。
ユーザーが指定したkernel（AKI)で起動される方式。
起動時にルートデバイス内のgrub.conf読みに行く。パスの固定必要。/boot必要ね。

awsdocumentation:
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/UserProvidedKernels.html


## HVM(Hardware-assited VM)

HVMは、HW層までまるっと仮想化。
通常の物理サーバのOSと同じ起動シーケンスを行う。(BIOS→MBR→bootローダ→kernel→init→inittab→rcスクリプト)
GPUインスタンス使う場合は必須。拡張ネットワーク使う場合も必須。
/bootないと起動できないよね。


* 各EC2インスタンスのサポート一覧
http://aws.amazon.com/jp/amazon-linux-ami/instance-type-matrix/


## PV,HVMどっちがすごいの?
かつては、PVはHVMよりもパフォーマンスが優れていたが、最近はそうでもなくむしろHVMのが優れものみたい。
これはPVではHVMのHWをエミュレートするオーバーヘッドを回避できたことに起因していたけど、最近ではHVMでもPVと同様のことができるドライバできたためめ。




  

その他参考URL:

http://kanny.hateblo.jp/entry/2014/01/19/182759
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/virtualization_types.html




Thanks!
行列のRankを求めるプログラム

```c:rank.c

int rank(int mat[][100], int n){	
	int ltmp[100], tmp, a_tmp[100], b_tmp[100];
	int i, j, k;
	int count;
	int all_zero;
	
	for(i = 0; i < n; i++){
		all_zero = 0;
		if(mat[i][i] == 0){ 
			for(j = 0; j < n; j++){
				if(mat[j][i] != 0){
					for(k = 0; k < n; k++){
						tmp = mat[i][k];
						mat[i][k] = mat[j][k];
						mat[j][k] = tmp;
					}
				} else if(j == n - 1)
					all_zero = 1;
			}
		}
		

		
		if(!all_zero){		
			for(j = i + 1; j < n; j++){
				for(k = 0; k < n; k++){
					a_tmp[k] = mat[i][k] * mat[j][i];
					b_tmp[k] = mat[j][k] * mat[i][i];
				}
				for(k = 0; k < n; k++)
					mat[j][k] = b_tmp[k] - a_tmp[k];
			}
		}
	}
	
	
	count = 0;
	for(i = 0; i < n; i++){
		if(mat[i][n] == 0)
			count++;
	}
	
	return (n - count);
}

```

時給すら発生しないのに、頼まれたので書いた。
ループが多すぎる。何か良い方法はないだろうか。
Macのターミナルでよく使うコマンドにエイリアスを作りました

Macでよく使うコマンドのエイリアスを作ろうと考えました。

エイリアスを設定することでコマンドの入力効率が改善し、ターミナルの作業スピードが向上します。

# エイリアスを作成
まずは`ls -la`コマンドのエイリアスを`la`と`ll`に指定しました。

```bash:bash_profileにエイリアスを記入
vi ~/.bash_profile

alias la='ls -la'
alias ll='ls -la'
```
即時反映したい場合は、sourceコマンドで反映します。

```bash:bash_profileの内容を読み込む
source ~/.bash_profile
```

# その他よく使うコマンドにエイリアスを指定
VagrantやGitなどよくつかうコマンドを指定しました。

## Vimにエイリアスを追加
viと打ったときにVimへのエイリアスを追加します。

```bash:bash_profileにVimのエイリアスを記入
vi ~/.bash_profile

alias vi='vim'
```

## Vagrantコマンドのエイリアスを追加
Vagrant系のコマンドのエイリアスを追加します。

```bash:bash_profileにVagrantのエイリアスを記入
vi ~/.bash_profile

alias vh='vagrant halt'
alias vr='vagrant reload'
alias vs='vagrant ssh'
alias vu='vagrant up'
```

## Dockerコマンドのエイリアスを追加
Docker系のコマンドのエイリアスを追加します。

```bash:bash_profileにDockerのエイリアスを記入
vi ~/.bash_profile

alias d='docker'
alias d-c='docker-compose'
```

## Gitコマンドのエイリアスを追加
Git系のコマンドのエイリアスを追加します。

```bash:bash_profileにGitのエイリアスを記入
vi ~/.bash_profile

alias gb='git branch'
alias gc='git checkout'
alias gcb='git checkout -b'
alias gs='git status'
alias gst='git status'
alias gcm='git checkout master'
alias gpom='git pull origin master'
alias gmm='git merge master'
```
オプションも含んでエイリアスにできるので便利です。

新しくブランチを作るときに`git checkout -b ブランチ名`とするのですが、

```bash:新しいブランチを作成
gcb ブランチ名
```
上記のようにするだけで新規ブランチを作成できました。


# エイリアスを設定した感想
よく使うコマンドのタイプ量が少なくなるので便利になりますね(☝ ՞ਊ ՞)
【俺みたいな】ニュースアプリ的なタブを作ろう【初心者ほいほい】


どうも僕です。

ニュースアプリ的なタブ作りたいですよね。

作りたいですよね？

ということで非常にシンプルではありますが作ってみました。
参考にして頂けたら幸いです。

![iOStabpic.png](https://qiita-image-store.s3.amazonaws.com/0/42310/9e5d0ecb-7f9c-85a9-8c55-ab8a4dc8365a.png "iOStabpic.png")


##そーすはこちら

githubにて、ちょこんと置いてます。

[github:tabsample](https://github.com/mmusasabi/tabSample)

既に僕自身色々此方のソースを拡張していじっていますが、
一応雛形となるようにシンプルに纏めてみました。

署名が入っていますが転用は全然構わないのでお好きにどうぞ。

##ReadMe的な。

githubの方に書けよ！
という突っ込みは既に閉店ガラガラ故、此方でお願い致します☆

と言っても語ることも特に多くはありません。
このプログラムは
tabVIew・・・タブの見た目部分
TabViewController・・・タブを量産して表示。タップ時の挙動や色の変化部分。
この２つで出来ています。

ソースが汚くて読めない！という点以外特記事項は無いのですが
初心者向けと言うことでTabViewControllerの方を少し解説しますね！

###viewDidLoadの記述部分

```objective-c
    
    NSArray *tabList = @[@"1", @"2", @"3", @"4", @"5",
                         @"6", @"7", @"8", @"9", @"10"];
    
    for (int i = 1; i <= _tabCount; i++) {
        UIButton *tab = [[tabVIew alloc]initWithFrame:CGRectMake(_screenW/4 * (i-1), 0, _screenW/4, _screenH/9) :i :tabList[i-1]];
        tab.tag = i;
        [tab addTarget:self action:@selector(touch:) forControlEvents:UIControlEventTouchUpInside];
        [_tabScrollView addSubview:tab];
        
        if (i == 1) {//最初のタブをクリック済みにする。
            [self touch:tab];
            _nowSelected = 1;
        }
    }

```

このソースを見ていて詰まる部分があるとすれば、間違いなくfor文の中です。

此方はtabViewに記述されているタブのレイアウトを利用して、タブのインスタンスを大量生産していますね。
しかし、そのままだとそれぞれのインスタンスを区別する方法がなくなってしまいます。

なので
>tab.tag = i;

としています。

###changeSelectColorの色変化部分

それぞれタブはタップされるとtouchメソッドが動きます。
引数にbuttonがありますが、先ほどtagで登録したものが
button.tagで取得することが出来ます。
これでそれぞれどのタブがタップされたか区別できますね！

```objective-c
//タップされたタブの色を変化させる。
- (void)changeSelectColor:(UIButton*)button{
    UIView *underBar = [self.view viewWithTag:(UNDER_BAR_TAG)];
    button.backgroundColor   = [self getTabColor:(int)button.tag];
    underBar.backgroundColor = [self getTabColor:(int)button.tag];
    
    UILabel *tabName;
    tabName = (UILabel*)[button viewWithTag:(LABEL_TAG + button.tag)];
    tabName.textColor = [UIColor whiteColor];
}
```

この部分のソースや他の部分でもところどころ出てくる
> viewWithTag

これ。こいつを利用することで、tagを識別してviewを選択することが出来ます！
便利ですね。

###tagさん便利！でも。。。

初心者あるあるというか、まぁ僕が嵌った点がいくつかありまして

- 0は使えない。

- ユニークな数字じゃないと駄目。

0は使えないんです。使うと取得できないどころか、変にselfが入ってしまうみたいで挙動がおかしなことになります！

また、当たり前ですけど、数字が被ると正しく取得できません！

この２つは使う上で注意です。

###拡張するなら？

タブが乗ってるViewはおそらく閉じることがないので
シングルトンにしてしまうと良いかもしれませんね。

そしたら例えば、下部に表示するViewをスワイプした時に
隣のタブをタップするメッセージを投げれば...


##以上です

objective-cはなかなか面倒くさいですね＼(^o^)／
というのもTitaniumでJS使ってたからなんですけど...

ですが、いろいろな機能実装が割りとスムーズにできて楽しいです。
Titaniumは敷居が低くて良いのですが、現状だとなかなか高い汎用性があるとはいえません。

やはりクオリティ高いものを作ろうと思うと現状はネイティブが良いですね。
can't create socket: Permission denied

#背景
itermでtmuxを開いて作業をしていたとき誤ってタブを消してしまった。
なのでまた新しいタブを開いて、
```tmux a```
とうったら
```can't create socket: Permission denied```
と言われてしまった

#解決法
tmuxは(/tmp/tmux-[uid]/default)を生成するがなぜか書き込めない。
権限を777にしてもだめ
しょうがないからソケットを指定してあげたらいけた
```tmux -S /tmp/tmux-[uid]/default```
AmazonLinuxにNokogiriを入れようとすると落ちるlibxml2のアレ(2014年10月時点)

# 環境
  - Amazon Linux
  - version 2014.09

# tr;dl

https://forums.aws.amazon.com/message.jspa?messageID=544154

```sh
$ sudo yum install -y patch
```

# 概要

いつものNokogiriのインストールで落ちる件ですが、Amazon Linuxで

- gcc
- ruby-devel
- libxml2
- libxml2-devel
- libxslt
- libxslt-devel

※ http://www.nokogiri.org/tutorials/installing_nokogiri.html

をインストールしても落ちたので、調べてみたら[こちら](https://forums.aws.amazon.com/message.jspa?messageID=544154)のフォーラムに書いてある`yum install patch`をやると通りました。
MySQLキャッシュのON/OFF確認コマンド

◆確認コマンド
`select @@global.query_cache_type;`

```lang:結果のサンプル
mysql> select @@global.query_ca
+---------------------------+
| @@global.query_cache_type |
+---------------------------+
| OFF                       |
+---------------------------+
```

◆値の意味

```lang:「OFF」または「0」の場合
キャッシュOFF(キャッシュしない、キャッシュ結果を読まない)
```

```lang:「ON」または「1」の場合
キャッシュなしオプションを付けない限りキャッシュする
※次のようなクエリだとキャッシュしない
「SELECT SQL_NO_CACHE id, vakue FROM table;」
```

```lang:「DEMAND」または「2」の場合
キャッシュありオプションを付けたときに限りキャッシュする
※次のようなクエリだとキャッシュする
「SELECT SQL_CACHE id, value FROM table;」