OmniAICreator/Qiita-1.07M huggingface dataset:
Project Euler 18 

問題
---
以下の三角形の頂点から下まで移動するとき, その数値の和の最大値は23になる.

3
7 4
2 4 6
8 5 9 3
この例では 3 + 7 + 4 + 9 = 23.

以下の三角形を頂点から下まで移動するとき, その最大の和を求めよ.
(略)
注: ここではたかだか 16384 通りのルートしかないので, すべてのパターンを試すこともできる. Problem 67 は同じ問題だが100行あるので, 総当りでは解けない. もっと賢い方法が必要である.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2018

回答
---
めんどくさいので再帰で終わらせた。

```
def get_next_max(i,j,L1,L2):
  if L2[i][j] == 0:
    if i == len(L1)-1:
      L2[i][j] = L1[i][j]
    else:
      L2[i][j] = L1[i][j] + max(get_next_max(i+1,j,L1,L2),get_next_max(i+1,j+1,L1,L2))
  return L2[i][j]
    
def main():
  L1 = [
    [75],
    [95, 64],
    [17, 47, 82],
    [18, 35, 87, 10],
    [20, 04, 82, 47, 65],
    [19, 01, 23, 75, 03, 34],
    [88, 02, 77, 73, 07, 63, 67],
    [99, 65, 04, 28, 06, 16, 70, 92],
    [41, 41, 26, 56, 83, 40, 80, 70, 33],
    [41, 48, 72, 33, 47, 32, 37, 16, 94, 29],
    [53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14],
    [70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57],
    [91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48],
    [63, 66, 04, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31],
    [04, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 04, 23]
  ]
  L2 = [[0 for j in range(len(L1[i]))] for i in range(len(L1))]
  
  ans = get_next_max(0,0,L1,L2)
  #print ans 
```
Project Euler 17

問題
---
1 から 5 までの数字を英単語で書けば one, two, three, four, five であり, 全部で 3 + 3 + 5 + 4 + 4 = 19 の文字が使われている.

では 1 から 1000 (one thousand) までの数字をすべて英単語で書けば, 全部で何文字になるか.

注: 空白文字やハイフンを数えないこと. 例えば, 342 (three hundred and forty-two) は 23 文字, 115 (one hundred and fifteen) は20文字と数える. なお, "and" を使用するのは英国の慣習.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2017

回答
---
甚だめんどくさし。

```
def get_x(num):
  x=num%10
  L1 = ['', 'one','two','three','four','five','six','seven','eight','nine']
  return L1[x]

def get_xx(num):
  L2 = ['']*10+['ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen']
  L3 = ['','','twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety']
  
  xx = num % 100
  if xx < 10:
    return get_x(xx)
  elif xx < 20:
    return L2[xx]
  else:
    return L3[xx//10] + get_x(xx)

def get_xxx(num):
  xxx = num//100
  xx = num%100
  
  if xxx:
    if xx:
      return get_x(xxx)+'hundredand'+get_xx(xx)
    else:
      return get_x(xxx)+'hundred'
  else:
    return get_xx(xx)

def get_xxxx(num):
  if num == 1000:
    return 'onethousand'
  else:
    return get_xxx(num)

def main():
  s = ''
  for i in range(1,1001):
    s += get_xxxx(i)
  print len(s)

main()
```
commit時のログで特定のキーワードにより処理分岐させる方法（subversion）

subversionへのソースコミット時に
特定のキーワードをコミットログに記載して、
ログの内容によってコミット前処理を変える方法

svn：version 1.7.18 (r1615261)
OS:centos6.5
リポジトリ名：sample

cd /var/www/svn/sample/hooks/
cp pre-commit.tmpl pre-commit
chown apache:apache pre-commit
chmod 755 pre-commit
vi pre-commit

```lang:pre-commit
#!/bin/sh

REPOS="$1"
TXN="$2"
KEYWORD1="^\[key1\]"
KEYWORD2="^\[key2\]"
KEYWORD3="^\[key3\]"
KEYWORD4="^\[key4\]"

SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | grep $KEYWORD1 >/tmp/test
if [ `$SVNLOOK log -t "$TXN" "$REPOS" | grep $KEYWORD1 | wc -l` -ge 1 ];then
$SVNLOOK log -t "$TXN" "$REPOS" | grep $KEYWORD1 >/tmp/svnhooklog
echo '-----------------' 1>&2
echo 'key1' 1>&2
echo '-----------------' 1>&2
exit 1
elif [ `$SVNLOOK log -t "$TXN" "$REPOS" | grep $KEYWORD2 | wc -l` -ge 1 ];then
$SVNLOOK log -t "$TXN" "$REPOS" | grep $KEYWORD2 >/tmp/svnhooklog
echo '-----------------' 1>&2
echo 'key2' 1>&2
echo '-----------------' 1>&2
exit 1
elif [ `$SVNLOOK log -t "$TXN" "$REPOS" | grep $KEYWORD3 | wc -l` -ge 1 ];then
$SVNLOOK log -t "$TXN" "$REPOS" | grep $KEYWORD3 >/tmp/svnhooklog
echo '-----------------' 1>&2
echo 'key3' 1>&2
echo '-----------------' 1>&2
exit 1
fi
exit 0
'''
そういえば、post-commitでやってもいいんですね。
Tmar:こんなBDD(振る舞い駆動開発)ツールがあった。

###Tmarとは
[公式サイト](http://www.tmar-test.com)
BDD(振る舞い駆動開発)ツール。Cucumberとか、JBehaveとか、色々あるうちの一つ。
groovyにテストフレームワークとして、めちゃめちゃ優秀なSpockっていうのがある。表形式でテストデータを記述できるので、非常にケースが読みやすい。
Spockについては下記
[Spock 公式](https://code.google.com/p/spock/)

qiitaで探しても色々ある。

TmarはJspressoというツールベンダーが開発しているみたい。
BDDを進める上で参考になる気がするので、シェア

###Tamrの特徴
* Cucumberと同じく、テストコードと別ファイル（*.text.tmar）に仕様を記述する。
* 表形式で仕様を記述でき、テストコードではそれをテストに利用できる。
* 表形式だけでなく、自然言語でも記述可能。
* テストコードはgroovyで書く。
* Eclipse Pluginがとても便利
* テスト結果がHTMLレポートとして出力される。Living Document



###例
```text:sample.test.tmar
要件01_会員の年齢によって入場料が変化すること

/each 
[会員年齢 |入場料? 
| 5   | 300 

表のカラムとして文章でデータを記述
/inline 
会員年齢が[12]歳以上ならば [500]

/inline 
会員年齢が[11]歳以下ならば [300] 
```

テストコード

```groovy:Spec01.groovy
package com.sample

class Spec001 extends Tmar4Spock {

	def test() {
		when:
		Member sut = new Member();
		sut.age = tmar.会員年齢
		tmar.入場料 = sut.fea
		
		then:
		//tmarによるアサーション
		tmar.asserts()
		where:
		tmar << getData('test')
	}
}

```


###DB内のテーブルデータのアサーション
DBの状態の検証もできる。

```text:Spec02.test.tmar
要件02_登録したテーブルの確認


データベースに登録したデータの定義
/table country
[code | name  | 
| FR  |France | 
| BR  |Brazil |    

sqlで結果を取得し、アサーション
/each 
[アサーション条件 | 結果?              | 
| 結果が含まれる |? in @country  | 
| 結果と一致する | ? match @country | 
```

テストコード

```groovy:Spec01.groovy
package com.sample

import groovy.sql.Sql;

import org.jspresso.contrib.tmar.core.Tmar4Spock

import spock.lang.Shared;

import com.sample.tmar.Member;

class Spec002 extends Tmar4Spock {

	@Shared sql = Sql.newInstance("jdbc:postgresql://localhost:5432/postgres", "postgres", "postgres")
	
	def test() {
		
		when:
		def rows=sql.rows("SELECT code,name FROM country")
		tmar.結果 = rows

		then:
		tmar.asserts()

		where:
		tmar << getData('test')
	}
}

```

Tmarファイルに記述するテーブルはexcelでかいたものを貼り付けることができる。
Project Euler 16

問題
---
2の15乗 = 32768 であり, これの数字和 ( 各桁の和 ) は 3 + 2 + 7 + 6 + 8 = 26 となる.

同様にして, 2の1000乗 の数字和を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2016

回答
---
map()関数を使う練習。

```py
def main():
  t = 2**1000
  ans = sum(map(lambda x : int(x), str(t)))
  print ans
```

追記:数学的アプローチ(Nは進数を表す数で、本問では10進数)

```py
def main2():
  t = 2**1000
  N = 10
  ans = 0
  while t:
    (t, r) = (t//N, t%N)
    ans += r
  print ans
```
Project Euler15 「格子経路」 

問題
---
2×2 のマス目の左上からスタートした場合, 引き返しなしで右下にいくルートは 6 つある.
![image](https://qiita-image-store.s3.amazonaws.com/0/70480/febbabc5-5414-2a07-10a6-89d8e0f741c3.png)
では, 20×20 のマス目ではいくつのルートがあるか.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2015

回答方針1
---
組み合わせの数でも求められるけど、せっかくなので別なアルゴリズムを試したい。
あるマスからゴールまでの道のりの数は、当該マスに隣接する進行方向の２マスそれぞれからのゴールまでの道のりの数の和に等しい。
→再起しかない！
![pe15.png](https://qiita-image-store.s3.amazonaws.com/0/70480/b8aca2f7-3080-df72-fda1-079620dc9406.png)

コード1
---
```
def f(L,a,b):
  if not L[a][b]:
    if a == len(L)-1 or b == len(L)-1:
      L[a][b] = 1
    else:
      L[a][b] = f(L,a+1,b) + f(L,a,b+1)
  return L[a][b]

def main():
  #(x,y) = (2,2)
  (x,y) = (20,20)
  L = [[0 for i in range(0,y+1)] for j in range(i,x+1)]
  ans = f(L,0,0)
  #print ans
```

回答方針2
---
ウェブを調べると、ゴールまでの道のりの数ではなく、起点からの道のりの数をfor文でどんどん求めいくやり方が見受けられた。実際に試してみたがfor文のほうが遥かに速かった。
少し考察したところ、アルゴリズムとして当該やり方の方が効率良さそうである。
![pe15_2.png](https://qiita-image-store.s3.amazonaws.com/0/70480/f2f8d636-7984-1139-003a-a13cea19cec4.png)

せっかくなので、対称性も勘案して半分だけ求めるようにしてみた。
![image](https://qiita-image-store.s3.amazonaws.com/0/70480/63d2c558-e4ee-ccca-2772-fd6c0e44a9e1.png)

コード2
---

```
def g(L,a,b):
  if a == 0:
    return 1
  elif a == b:
    return L[a-1][b]*2
  else:
    return L[a-1][b]+L[a][b-1]
  
def main2():
  seq = range(21)
  L = [[0 for i in seq] for j in seq]
  
  for a in seq:
    for b in seq[a:]:
      L[a][b] = g(L,a,b)
  #print L[20][20]
```
Elastic Beanstalkのインスタンスにsshコマンドでsshする方法

```
eb ssh -o [env name]
```

でポートを開いた間ままの状態にして

```
ssh -i [private key] [public IP]
```

で接続。

http://stackoverflow.com/questions/27157630/aws-ssh-to-ec2-with-elastic-beanstalk-command-line-interface-eb-cli-3-x
WindowsにRubyの開発環境(RubyMine)構築

# Ruby開発環境構築
## Rubyインストール
インストーラーに従ってインストール。

RubyInstallerをダウンロード＆インストール
http://rubyinstaller.org/downloads/
※20150301かつ64bit版の最新は以下のURL
http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.1.5-x64.exe?direct

## DEVELOPMENT KITインストール

gemを利用するために、DEVELOPMENT KITをダウンロードする

DEVELOPMENT KITをダウンロード
http://rubyinstaller.org/downloads/
※20150301かつ64bit版の最新は以下のURL
http://cdn.rubyinstaller.org/archives/devkits/DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe

ダウンロードすると自己解凍書書庫になっているので、ダブルクリックして、
Rubyのインストールフォルダにdevkitsというフォルダを作成して、解凍。

C:\Ruby21-x64\devkits

その後、コマンドプロンプトを管理者モードで起動する。

```shell-session
C:\WINDOWS\system32>cd C:\Ruby21-x64\devkit
C:\Ruby21-x64\devkit>ruby dk.rb init
[INFO] found RubyInstaller v2.1.5 at C:/Ruby21-x64

Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.
C:\Ruby21-x64\devkit\ruby dk.rb install
[INFO] Updating convenience notice gem override for 'C:/Ruby21-x64'
[INFO] Installing 'C:/Ruby21-x64/lib/ruby/site_ruby/devkit.rb'
```

## RubyInstallerの不具合修正

### SSL認証局ダウンロード
[ここ](https://raw.githubusercontent.com/rubygems/rubygems/master/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem)から証明書ファイルをダウンロード

### SSL認証局保存先を確認

```shell-session
C:\Ruby21-x64\devkit>gem which rubygems
C:/Ruby21-x64/lib/ruby/site_ruby/2.1.0/rubygems.rb
```

rubygems.rbがある場所がSSL認証局の保存場所

### SSL認証局保存

以下の場所にダウンロードした認証局を保存

```shell-session
C:/Ruby21-x64/lib/ruby/site_ruby/2.1.0/AddTrustExternalCARoot-2048.pem
```

参考URL:SSL upgrades on rubygems.org and RubyInstaller versions
https://gist.github.com/luislavena/f064211759ee0f806c88

## 基礎的なgemをインストール

```shell-session
C:\Ruby21-x64\devkit>gem update --system
C:\Ruby21-x64\devkit>gem update rake
C:\Ruby21-x64\devkit>gem install json
C:\Ruby21-x64\devkit>gem install handler
C:\Ruby21-x64\devkit>gem install rails
```
※エラーが出た場合、エラーに従って、処理を行う。

# RubyMineをインストール

RubyMineをインストール
※有償なので注意。

RubyMine
https://www.jetbrains.com/ruby/download/

# その他
Rails開発のイケてるIDE RubyMineを使う（1）紹介編
http://techracho.bpsinc.jp/morimorihoge/2012_08_01/5921
メインの開発ツールをVimからRubyMineに変更した理由
http://qiita.com/jnchito/items/cb05bb14d89095e5cc0b
RubyMine の使い方
http://qiita.com/imk2o/items/c649a5edee1f088343f5
with構文(Python)


　with構文を使うとついつい忘れてしまうclose()を省略することができる上に可読性も上がるので便利。

<h1>用法</h1>
```plaintext
with ファイル読み込み as 変数:
    ~~~~
```
<h1>例</h1>
　text.txtに対して、「Hello, world!」と書き込む場合は次のようになります。

```py:python
#with文使用
with open("text.txt", 'w') as text:
    text.write("Hello, world!")
```
 これをwith文無しに書こうとすると次のようになります。

```py:python
#with文不使用
text = None
try:
  text = open("text.txt", 'w')
  try:
    text.write("Hello, world!")
  except:
    raise
finally:
  if text:
    text.close()
```
[Objective-C] GCDで複数の非同期処理の終了を待つ



前にも[[Objective-C] GCDについての備忘録](http://qiita.com/edo_m18/items/2f8c6bde4492ef116ed0)というメモを書きましたが、最近知った新しい方法も合わせてメモ。

jQueryの`when`とかと似たような仕組みです。

## サンプルコード

なにはともあれ、コードを見てもらったほうが早いでしょう。

```objc:gcd
dispatch_group_t group = dispatch_group_create();

// グループのカウントをひとつ増やす？
dispatch_group_enter(group);
[aClass loadFromNetwork:^(BOOL success) {
	// do something.
	
	// グループのカウントをひとつ減らす？
	dispatch_group_leave(group);
}];

dispatch_group_enter(group);
[aClass2 loadFromNetwork:^(BOOL success) {
	// do something.
	dispatch_group_leave(group);
}];

// 以降、必要なだけ繰り返す。

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
	// do something when all dispatches are done.
});
```


使っているのは

- dispatch_group_t
- dispatch_group_enter
- dispatch_group_leave
- dispatch_group_notify

の4つです。

イメージとしては`dispatch_group_enter`でカウントを1増やし、`dispatch_group_leave`でカウントを1つ減らす感じです。

そしてカウントがすべて0になったら`dispatch_group_notify`が呼ばれる、と。

使うシーンとしては、例えばいくつかのAPIを同時に叩いて、全部のリクエストが返ってきたらなにか表示する、みたいなときに使えます。
Atom の Window: Run Package Specs で動く Jasmine のバージョン

# 問題

Atom の "Window: Run Package Specs" ( `window:run-package-specs` ) で動く Jasmine のバージョンが分からない。

# 解決策

以下に追った結論・手順を示す。

## 結論

**Atom v0.184.0 では Jasmine 1.3.1 。**

`atom/atom` の `./vendor/jasmine.js` の末尾のバージョンを確認。

## 手順

1. `WorkspaceElement` `window:run-packages-spec` https://github.com/atom/atom/blob/v0.184.0/src/workspace-element.coffee#L148
2. `WorkspaceElement#runPackageSpecs` https://github.com/atom/atom/blob/v0.184.0/src/workspace-element.coffee#L115-L117
3. `AtomApplication` https://github.com/atom/atom/blob/v0.184.0/src/browser/atom-application.coffee#L236-L237
4. `AtomApplication#runSpecs` https://github.com/atom/atom/blob/v0.184.0/src/browser/atom-application.coffee#L443-L464
5. `./spec/spec-bootstrap.coffee` https://github.com/atom/atom/blob/v0.184.0/spec/spec-bootstrap.coffee
6. `./spec/jasmine-helper.coffee` https://github.com/atom/atom/blob/v0.184.0/spec/jasmine-helper.coffee
7. `./vendor/jasmine.js` https://github.com/atom/atom/blob/v0.184.0/vendor/jasmine.js#L2662-L2667

# 関連

- Jasmine 1.3 ドキュメント http://jasmine.github.io/1.3/introduction.html
Paiza.ioでGo言語で独自の共有ライブラリを使うには

# Paiza.ioに用意されていない共有ライブラリを使う準備

## 使いたい共有ライブラリを作る

linux,amd64であればOK

## ネットから落とせるようにする

これをプログラム実行時DLすれば良い。

# フツーにCgoで共有ライブラリを扱う際の問題

Paiza.io側に存在しない共有ライブラリを使いたい場合、
cgoでフツーに書くことが出来ない。

フツーの共有ライブラリの使い方

```go
// #cgo LDFLAGS: -L. -lhoge
```

これだと、リンカが動く際に使いたい共有ライブラリlibhoge.soが
存在しないと動かない。

でも、このlibhoge.soは動かそうとしているGo言語のソースが動いて
初めてダウンロードされ、ローカルから参照可能になる。

# dlopenすればいい

例えば、

```c
int foo(char *p)
```

なる関数が、libhoge.soにあり、これを使いたい場合、
以下の様なコードで動かせる。

```go
/*
#include <dlfcn.h>
static void my_dlopen(char *param) {
    void *handle;
    int (*func)(char*) = dlsym(handle, "foo");
    (*func)(param);
    dlclose(handle);
}
*/
import "C"
```

# 注意点

1秒以内にDLから実行までが完了しないと時間切れになり、
実行結果が得られない。

# 関連投稿

- [LD_LIBRARY_PATHとPythonとPaiza.io問題あるいはpaiza.ioでmrubyを動かしhttp2通信する - Qiita](https://qiita.com/kjunichi/items/30e972c50049d0168f07)

# 関連記事

- [node-ffiをGoで入門してElectronを使って応用してみる](http://abrakatabura.hatenablog.com/entry/2015/12/11/000722)
- [WindowsでmrubyからGoで作ったライブラリを呼び出して、Webカメラの画像をコマンドプロンプトに表示した](http://abrakatabura.hatenablog.com/entry/2017/09/01/072123)
- [RustでGoのライブラリを使うときのCargoのbuild.rsの書き方](http://abrakatabura.hatenablog.com/entry/2017/10/22/110223)
Maven2とMaven3の切り替え


ライブラリ管理に使っているmavenのバージョンがアプリごとに異なる場合のMac上での切り替え方法です。

## 前提

* Mac
* mavenのパッケージ管理をHomebrewで行っている
* maven3（またはmaven2）だけがインストール済で、後から追加したい

## やり方

### maven2を追加する

※ maven2とmaven31を読み替えても基本的には同じ

maven3のシンボリックリンクを無効にする。

```
brew unlink maven31
```

maven2をインストールする。

```
brew install maven2
```

確認。

```
$ mvn -v
Apache Maven 2.2.1 (r801777; 2009-08-07 04:16:01+0900)
Java version: 1.8.0_20
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x" version: "10.9.5" arch: "x86_64" Family: "mac"
```

### mavenのバージョンを切り替える

Homebrewで異なるバージョンのMavenをインストール済みであること。
maven2 => maven3 に切り替える。（逆も同じ）

```
brew unlink maven2
brew link maven3
```

確認。

```
$ mvn -v
Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-18 00:22:22+0900)
Maven home: /usr/local/Cellar/maven31/3.1.1/libexec
Java version: 1.8.0_20, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.9.5", arch: "x86_64", family: "mac"
```

## 注意点

`brew doctor` したときに以下の警告が出ます。そりゃそうだ。

```

Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:

    maven2

```
以上。
クラスへの機能のちょい足し

クラスにある機能をちょい足ししたいときに継承をつかうと便利です。

例えば、std::stringの+=演算子はcharを受け取ることができますが、暗黙の変換によって好ましくない引数を受け付けます。

```
std::string str = "abc";
str += 'd'; // OK
str += 10;  // OOPS! no warning or error
```

ユーザは"abcd10"という入力をしたつもりでも、`10`は実際にはchar型に変換され、'd'のときと同じ関数によって処理されます。よって、意図しない動作を引き起こしていると言えます。（C言語では文字リテラルはint型ですが、C++ではchar型です。）
しかし、これの解決のためだけに自分でstringクラスを定義したくないので、ちょい足しをしましょう。

```
namespace my
{
template < class tchar,
           class traits = std::char_traits < tchar >,
           class alloc = std::allocator < tchar > >
class basic_string : public std::basic_string < tchar, traits, alloc >
{
public:
  using base = std::basic_string < tchar, traits, alloc >;

  using base::base;
  using base::operator +=;
  template < class Ty > basic_string& operator += ( Ty ) = delete; // ちょい足し
};
using string = basic_string < char >;
using wstring = basic_string < wchar_t >;
} // namespace my
```

コンストラクタも他の機能も全てベースクラスの流用です。流用に明示が必要な関数だけ書いてあげましょう。この場合、コンストラクタと+=演算子が明示してあります。これがないと関数が隠蔽されてしまい、元の機能が利用できません。

オーバーロード解決は暗黙の型変換よりもテンプレートを優先しますので、簡単なちょい足しで意図しない操作を防ぐことが出来ました。

```
std::string str1;
str1 += 10; // OOPS, operator +=( char ) is called.
my::string str2;
str2 += 10; // error, operator +=( int ) is deleted function.
```

もっとも、整数つなげたいのならstd::ostringstreamを使うべきで、+= 演算子で整数をつなげてはいけないのですが、エラーにすらならないのはさすがに不親切ですよね。

継承によるちょい足しはベースにしたクラスと互換性があるので、独自のものを使って困るということはたぶんありません。というか、互換性がなくなるほどの改造はちょい足しの範疇に入りません。特に、デストラクタにはよく注意する必要があります。
Rails開発でCIから複数のサービスにカバレッジを送信する


CoverallsとCodeClimateにそれぞれカバレッジの見やすさやGitHub連携のメリットがあるように感じたのでとりあえず両方に送信したかったけど、よく分からないままコピペすると上手くいかなかったのでメモ
最終的に以下で上手くいきました。これではCoverallsとCodeClimateにカバレッジを送信しています。

各CI環境で `COVERALLS_REPO_TOKEN` と `CODECLIMATE_REPO_TOKEN` を環境変数に指定してください。

```ruby
formatters = [SimpleCov::Formatter::HTMLFormatter]
formatters << Coveralls::SimpleCov::Formatter if ENV['COVERALLS_REPO_TOKEN']
formatters << CodeClimate::TestReporter::Formatter if ENV['CODECLIMATE_REPO_TOKEN']

SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[*formatters]
SimpleCov.start 'rails'
```
javascriptで中間の明度を取得する

## 同じ色相で2つの色の中間の明度を取得する

同じ色相で、グラデーションが掛かっている部分の一番明るい色と一番暗い色の中間の色が取れないかと思い作成。

[デモ](http://codepen.io/sowork/pen/azKjav)

![Screen Shot 2015-03-01 at 3.57.36.png](https://qiita-image-store.s3.amazonaws.com/0/43937/de836610-456d-a124-be6b-8594acfe21e8.png)


```html

<section id="lowColor" class="color-sec">
<h1>low color</h1>
<!-- .low-color // --></section>

<section id="midColor" class="color-sec">
<h1>mid color</h1>
<!-- .mid-color // --></section>

<section id="highColor" class="color-sec">
<h1>high color</h1>
<!-- .high-color // --></section>
```

リファクタリング前

```js

// 取得したい中間色に対する2色を設定する（16進数のみ）
var color1 = '#171a46';
var color2 = '#414eac';

// 中間色を返す関数
function getMedianColor(color1,color2){

	color1 = color1.match(/\w/g).join('');
	var r1 = color1.substr(0,2);
	r1 = parseInt('0x'+r1);
	var g1 = color1.substr(2,2);
	g1 = parseInt('0x'+g1);
	var b1 = color1.substr(4,2);
	b1 = parseInt('0x'+b1);

	color2 = color2.match(/\w/g).join('');
	var r2 = color2.substr(0,2);
	r2 = parseInt('0x'+r2);
	var g2 = color2.substr(2,2);
	g2 = parseInt('0x'+g2);
	var b2 = color2.substr(4,2);
	b2 = parseInt('0x'+b2);

	var r3 = (r1+r2)/2;
	r3 = r3.toString(16);
	var g3 = (g1+g2)/2;
	g3 = g3.toString(16);
	var b3 = (b1+b2)/2;
	b3 = b3.toString(16);

	var bgclr = '#'+r3+g3+b3;

	return bgclr;

}

// 生成された中間色をbackgroundに設定する
$('#midColor').css('background',getMedianColor(color1,color2));
```

リファクタリング後

```js

// 取得したい中間色に対する2色を設定する（16進数のみ）
var color1 = '#171a46';
var color2 = '#414eac';

// 中間色を返す関数
function getMedianColor(color1,color2){

	color1 = getColorBase10(color1);
	color2 = getColorBase10(color2);

	// 16進数を10進数に変換する
	function getColorBase10(base16){

		var rgb = [];
		var color = '';

		base16 = base16.match(/\w/g).join('');

		for(var i=0; i<base16.length;i+=2){
			color = base16.substr(i,2);
			color = parseInt('0x'+color);
			rgb.push(color);
		}

		return rgb;
	}

	// 2色間の「r」「g」「b」それぞれの平均値を取得して
	// 16進数に戻す
	function getColor(color1,color2){

		var rgb = [];

		for(var i=0; i<color1.length; i++){
			rgb.push((color1[i]+color2[i])/2);
			rgb[i] = rgb[i].toString(16);
		}

		return '#'+rgb.join('');
	}

	return getColor(color1,color2);
}

// 生成された中間色をbackgroundに設定する
$('#midColor').css('background',getMedianColor(color1,color2));
```
centos に python 環境を作る

# CentOS6.5 にpython環境(vimとか)を作ったときのメモ

## 作りたい環境

+ vim : 7.4
+ python : 2.7
+ 

## vagrantで立てたCentOS6.5にいろいろ入れる

+ python
[PyenvをCentOS6.3でセットアップする](http://qiita.com/yuta_h3/items/2988c4d0811bf8c344c0)

上記のサイトを参考にさせてもらうと、簡単に入った。

+ vim

[CentOSにVimをインストール](http://qiita.com/rkaneko/items/fbba826efa2dfc8d0905)  
[え？君せっかく Python のバージョン管理に pyenv 使ってるのに Vim の補完はシステムライブラリ参照してるの？](http://lambdalisue.hatenablog.com/entry/2014/05/21/065845)  

上記のサイトの一部分を変更

```
sudo yum install mercurial
cd /usr/local/src
sudo hg clone https://vim.googlecode.com/hg/ vim
sudo ./configure --enable-multibyte --with-features=huge --enable-cscope --enable-gui=gtk2 \
--disable-selinux --prefix=/usr/local \
--enable-xim --enable-fontset \
--enable-gpm \
--with-python-config-dir=/home/vagrant/.pyenv/shims/ \
--enable-fail-if-missing \
--enable-pythoninterp=dynamic
sudo make && sudo make install
```

+ zsh

```
sudo yum install zsh
```

+ wget 

```
sudo yum install wget
```

思ったより何も入っていなかった。
OpenRestyのre.matchとstring.matchの性能差

[OpenResty](http://openresty.org/)で正規表現を利用する場合、
高機能な[re.match](https://github.com/openresty/lua-nginx-module#ngxrematch)を利用したくなりますが
Lua純正の[string.match](http://www.rtpro.yamaha.co.jp/RT/docs/lua/tutorial/library.html#string.match)と比較してどの程度性能に差があるのかを調べてみました。

## 環境
[Dockerfile](https://github.com/toritori0318/Dockerfiles/tree/master/openresty-pcre-bench)を公開しているので、こちらで再現できると思います。

### サーバ

- EC2: t2.medium

## ベンチマークコマンド

re.matchがOpenRestyのコアライブラリのため
HTTP経由でベンチマークを取っています。
``c``というパラメータを付けると正規表現のループ回数を指定できます。

```
curl localhost/lua/string_match\?c=10000000
```

## ソースコード
[こちら](https://github.com/toritori0318/Dockerfiles/blob/master/openresty-pcre-bench/nginx-2nd.conf) をご参照ください。

## 結果

短いほど良い値です。

 パス | pcre_jit | かかった時間(sec)
------|-----------|----------
string_match | - | 2.18
re_match | off | 12.86
re_match | on | 12.63
re_match_optimize | off | 5.55
re_match_optimize | on | 4.48

## まとめ

性能だけ比較すると string_match の勝ち。
re_matchを利用してもoptimizeオプションを付けておけば
だいぶマシになりました。
またre_matchの非optimize時、メモリがモリモリ増えてしまって大変でした。
optimize必須ですね。
CentOS 6.6にNode.jsをパッケージインストールする


以下のサイトのまま．
yumでNode.jsが管理できることがポイント．

[Installing Node.js via package manager](https://github.com/joyent/node/wiki/installing-node.js-via-package-manager)
Enterprise Linux and Fedora

make環境を入れておく．

```
#yum install -y gcc-c++ make
#curl -sL https://rpm.nodesource.com/setup | bash -
```

リポジトリが登録されるので，インストール．

```
#ls /etc/yum.repos.d
...
nodesource-el.repo
#yum install -y nodejs
#node -v
v0.10.36
#npm -v
1.4.28
```
esa.io pplog emoji FizzBuzz #esa_io #pplog #fizzbuzz

## :chicken: 概要
esa.io の Emoji に :esa: :esa2: :pplog: が追加されたので記念に FizzBuzz してみた。
FizzBuzz のロジック自体はごく普通の Ruby の FizzBuzz です

## :baby_chick: プログラム
~~~ruby
print (1..100).each_with_object([]) { |i, memo|
  memo << case
  when i % 15 == 0 then ':esa2:'
  when i % 5 == 0 then ':esa:'
  when i % 3 == 0 then ':pplog:'
  else i
  end
}.join
~~~

## :baby_chick: 出力

![esa_pplog_fizzbuzz.png](https://qiita-image-store.s3.amazonaws.com/0/43480/26283dbd-d8bb-b14e-74f9-6031bd0f81ad.png)

リンク先でも確認可能
[EsaPPlogFizzBuzz](http://esa-pages.io/p/sharing/912/posts/78/e1fe31fd5c7fc1835215.html)
文字列を配列にする方法

##配列に見えて、そうでない文字列
問題
文字列Sには、料理のさしすせそ「砂糖、塩、酢、醤油、味噌」が順番に入力されている。この文字列を「砂糖→塩→酢→醤油→味噌」と表示をしてください。

仮に、こういう問題が出てきたとき、文字列Sの長さ分for文でやっていけばいいと見えます。

```javascript
var s = "砂糖、塩、酢、醤油、味噌";
for (var i =0; i < s.length; i++) {
   document.write(s[i]);
};
```

これだと、砂糖、塩、酢、醤油、味噌と表示されます。しかし、

```javascript
var s = "砂糖、塩、酢、醤油、味噌";
for (var i =0; i < s.length; i++) {
   document.write(s[i]+"→");
};
```

とすると、砂→糖→、→塩→、→酢→、→醤→油→、→味→噌→となります。へんてこな答えになってしまいました。

##文字列を配列にする
そこで、変数.split("区切りたい文字、改行などの記号")を使うと、文字列を配列にすることができます。

```javascript
var s = "砂糖、塩、酢、醤油、味噌";
var c = s.split("、");//「、」毎に取り出す。
for (var i =0; i < c.length; i++) {0 = i < 5。
    if(i <= (c.length-2)){//c[0]→c[1]→c[2]→c[3]→c[4]とするので、c[3（5-2）]まで。
   document.write(c[i]+"→");
} else {
    document.write(c[i]);
}
};
```

これで、砂糖→塩→酢→醤油→味噌と表示させることができました。ポイントは、```var c = s.split("、");```で、区切った数だけc[0]、c[1]、C[2]・・・と配列で取り出していることです。

###さらには、数値変換も
数字の文字列だったら、配列で取り出したあとに```Number(配列[i]);```で、数値に変換することもできます。これで、数字の大小の比較、計算ができます。

##まとめ
僕が苦労した、配列に見えてそうでない文字列を配列にするための```変換.split(" ");```の紹介でした。
Visual Studio Tools for Unity勉強会に行って来た。

## 概要
https://unity-bu.doorkeeper.jp/events/20353
日時：2015/02/24
会場：品川グランドセントラルタワー 日本マイクロソフト　品川本社

## Visual Studio Tools for Unityの紹介
MSの大西さんが、デモを交えながら、VSTUの機能紹介をされてました。

* VSUT自体はUnityとVSの仲介をするツール。
* デバッグそのものはVisualStudioの機能を使う。
* 対応言語はC#限定。

#### デバッグ機能について
* メニューの「Attach to Unity And Play」で、ネイティブ時と同様に、実行しながらのデバッグが可能。
* ブレークポイントの条件設定も可能。
    * 赤丸を右クリックするとメニューが出るのでそこで設定。
* Unityエディタで実行中でも、プロセス指定でのアタッチでデバッグ可能。
* WebPlayer用のアプリの場合、DevelopmentモードとscriptDebugをONにした上で、プロセスアタッチすればデバッグ可能。


#### 入力支援機能について
* VSTUのインストールで新規作成ファイルにMonoBehaviourが追加。
* 右クリック→implement Mono Behaviourでオーバーライド可能なメソッドの一覧が出るので、任意のメソッドにチェックをつけてスケルトンを作成できる。
* メソッド等に合わせてCtrl+Alt+mでUnityドキュメントを表示
* Ctrl+Shift+Qで単語の頭文字だけでインテリセンスが聞く
    * 例えばGetValue()だとGVで候補が出る。

#### その他
* VS2010,2012,2013に対応。Expressはダメ。条件次第ではComunity版が無償で使えるのでそれで。
* 公式サイト(英語）のChangeLogでとりあえず変更点が押さえられる。
* VS2015だとUnityで使うシェーダーコードも書ける。
* 意見は公式サイトのUserVoiceで受付中。また、DLサイトにFAQのリンクがあるので、質問を書いておくと開発者が答えてくれる。

#### FAQ
* モデルデータ（.fbx)を開くときにモデリングツールではなくVSが開くのをやめたいがどうすればいいか？
    * ファイルの関連付けを消せばOK
    * なおVSでもモデリング機能がある（ので、インストール時にファイルの関連付けがされる）。
* Unityで使用すると改行コード混在エラーが出るのを軽減できない？
    * Program files/Unity/Editor/Data/Resource/ScriptTemplateの下にテンプレートがあるので、これの文字コードをWindowsのそれにすることで解消できる。
* UnitTestについては？
    * ネイティブと同様プロジェクト作成時にUnitTest用のものがあるのでそこから作る。
    * ただし、UIに絡むものではなく、スクリプト単体で動くものに限る。
    * VSの最上位エディションが必要だけど、クラス図などもVSで書ける。


## LTタイム
3名の方が発表されてました。

#### Boo.langをSATUGAIする方法
* サジェストでBoo.lang（というコード上では使わないモジュール）が先頭に出てくるのを防ぎたい
    * VSUTがプロジェクトを生成する際に、プロジェクトファイルのリンクモジュール情報にBoo.langを混ぜ込むのが原因。
    * ProjectFilesGeneratorクラスをoverrideしてプロジェクトファイル生成処理をフックしてやることで除外する処理を書ける。
    * XMLでプロジェクトファイルのデータが渡ってくるので、LINQtoXMLを使うと、特定のタグを簡単に除去できる。

#### 私のVisualStudio環境
* 実際に会社で使っているツール等び紹介
    * StudioStyle
    * Claudia IDE
    * ReSharper
    * Live template
    * SandCastleHelpFileBuilder

#### T4を使ってみた
* Parse(mBaaS)でオブジェクトを永続化する時に、データ項目名が違うだけの同じようなシリアライズクラスを何度も作るのがめんどくさい
* なのでT4を使って、そういうクラスを自動生成したい。
    * T4はVisual Studioのテキストテンプレート。
    * JSPに近い感じでテキスト内に処理ブロックを書く事ができる。
    * LINQが使える。
    * ファイルの読み込みもできる。
        * パラメーター名だけ外部ファイルに持たせてそこだけ編集すれば、あとはT4がテンプレートに従ってファイルを書いてくれる。
* サードパーティのプラグインを使うと、色分けしてくれて便利

## まとめ
VSUTはUDPでUnityエディタと接続しているそうで、デバッグ開始時にややもたつくことがあるようですが、始まってしまえば、全IDE中最強と言っても良い強力なデバッグ機能を使えるというのは、WindowsでUnityを扱うPGにとってはかなり魅力だと思います。

MSは近年、OSSに積極的だったりと、R&Dを中心に大変革しているそうで、これまでのOSとオフィスソリューションから積極的に方向性を変えようとしているとのことでした。
VSUTも、VS Community版の使用制限が、以前のMSと比べるとかなり緩いと思いますので、一度試してみてはいかがでしょうか？

※でも会場のmac率はやっぱり高かった･･･
Rubotyのデータ永続化にLevelDBを使う


# はじめに
チャットボットフレームワークといえばGithub製のHubotが有名ですが、私はRubyが好きなので @r7kamura さん作の[Ruboty](https://github.com/r7kamura/ruboty)を使ってます。

RubotyにはBrainというデータを持つ仕組みがあり、標準ではメモリに保存されます。
メモリに保存するだけではデータの永続化ができないので、永続化にはプラグインを使用します。

この記事では、RubotyのデータをローカルのLevelDBに保存して永続化する方法を紹介します。
LevelDBを使うので、Redisのようにサーバを建てる必要はありません。

Rubotyを自前のサーバで運用してて、無駄なサーバは建てたくないという人には向いています。
逆に、RubotyをHerokuなどローカルでのファイルが永続化されない環境で運用してる人には向いてません。
（ほとんど後者だと思いますがw）

Rubotyについては[r7kamuraさんのブログ](http://r7kamura.hatenablog.com/entry/2014/05/31/190240)を御覧ください。

# LevelDB
[LevelDB](https://github.com/google/leveldb)はGoogle製のKVSです。
InfluxDBやRiakのバックエンドに使われています。

Google先生は

> LevelDB is a fast key-value storage library

と表現してます。

よくあるDBはサーバーを建てたり運用したりとめんどくさいですが、LevelDBの場合はライブラリから直接ファイルを操作するためサーバは不要です。
操作もとてもシンプルで、基本は`Put(key, val)`と`Get(key)`と`Delete(key)`だけです。

そのためLevelDBをバックエンドにしてリッチなインターフェースを提供する、みたいな形で使われることが多いようです。
KyotoCabinetなんかのKVSライブラリと似ています。

# ruboty-leveldb
RubotyのLevelDBでのデータ永続化を行うのは非常に簡単で、Rubotyの`Gemfile`に`gem "ruboty-leveldb"`を追加するだけです。

ただし、実行する環境にSnappyという圧縮ライブラリをインストールする必要があります。

## Snappyインストール

### Mac
MacだとHomebrewでインストールできます。

```bash
brew install snappy
```

### CentOS 6 / 7
CentOSはyumでインストールできます。

```bash
sudo yum install snappy
```

### Ubuntu
Ubuntuはapt-getでインストールできます。

```bash
sudo apt-get install snappy
```

## Ruboty作成
では実際にLevelDB BrainのRubotyを作ってみます。

```bash
mkdir ldb-ruboty
cd ldb-ruboty
bundle init
echo 'gem "ruboty-leveldb"' >> Gemfile
echo 'gem "ruboty-alias"' >> Gemfile
bundle install --path vendor/bundle
```

Rubotyを起動して、データの永続化を確認します。
確認にはaliasを使います。

```bash
$ bundle exec ruboty
Type `exit` or `quit` to end the session.
> ruboty alias name -> nownabe
Registered alias: name -> nownabe
> ruboty list alias
name -> nownabe
> quit

$ bundle exec ruboty
Type `exit` or `quit` to end the session.
> ruboty list alias
name -> nownabe
> quit
```

1度終了してもaliasは登録されたままになっているので、データが永続化されていることがわかります。

データの実態は、Rubotyを起動したら作成される`ruboty.ldb`というディレクトリになります。
これはLevelDBのファイル群です。

```bash
$ ls
Gemfile  Gemfile.lock  ruboty.ldb  vendor
```

このディレクトリは、`LEVELDB_PATH`という環境変数で指定できます。

# おわりに
Rubotyのデータ永続化にRedisみたいなリッチなDBは必要ないと言う方は、是非試してみてください。
Scala.jsで触るServiceWorker


[js_of_ocamlで触るService Workier - Qiita](http://qiita.com/derui@github/items/e89f6c3ce999ed97bb47 "js_of_ocamlで触るService Workier - Qiita")

というのを見て、Scala.jsで似たような実験プロジェクトをやってたのを思い出したので紹介しておく。

[mizchi-sandbox/scala-js-in-service-worker](https://github.com/mizchi-sandbox/scala-js-in-service-worker "mizchi-sandbox/scala-js-in-service-worker")

ServiceWorkerの中で、こんなコードが動く。

```scala
package mz
import scala.scalajs.js
import js.annotation.JSExport
import js.Dynamic.global

object Main extends js.JSApp {
  def main(): Unit = {
    global.proxy.get("/users/:id", (m: js.Dynamic) => {
      js.Dynamic.literal(`id` = m.id)
    })
  }
}
```

クライアントから次のようなコードをJSを実行するとちゃんとproxyされる。

```javascript
require('whatwg-fetch');
fetch('api/users/mizchi')
.then(function(d){return d.json()})
.then(console.log.bind(console));
// > Object {id: "mizchi"}
```

(これはfetchポリフィルを使っているが実際にやることはXHR相当)


globalを経由しているので型は効かないのだが、proxyでルーティングを行っている。自作のsabizanっていうライブラリを使っている。

[mizchi/sabizan](https://github.com/mizchi/sabizan "mizchi/sabizan")

今はまだunsafeな状態だが、これのラッパー関数を書けば型で守れそう。

## 問題

closure libraryに依存しないよう、毎度 sbt fullOtpJS する必要があって、ビルド時間かかる…
[CakePHP 2.3.9]'column <>' => $valueで期待する動作をしない事があったので次の3パターンを試す


## 検証

### $valueがscalarの場合(問題ない)

* 問題なく動作する。

```php
$value = 1;
$this->Comment->find('all', array(
    'conditions' => array(
        'id <>' => $value,
    ),
));
```

* 次のようなSQLができた。

```sql
SELECT "Comment"."id" AS "Comment__id"
FROM "public"."comments" AS "Comment"
WHERE "id" <> 1
```

### $valueがarrayで2件以上含まれる場合(問題ない)

* 問題なく動作する。

```php
$value = array(2, 3);
$this->Comment->find('all', array(
    'conditions' => array(
        'id <>' => $value,
    ),
));
```

* 次のようなSQLができた。

```sql
SELECT "Comment"."id" AS "Comment__id"
FROM "public"."comments" AS "Comment"
WHERE "id" NOT IN (2, 3)
```

### $valueがarrayで1件のみ含まれる場合(問題あり)

* 問題が生じて動作しない。

```php
$value = array(4);
$this->Comment->find('all', array(
    'conditions' => array(
        'id <>' => $value,
    ),
));
```

* 次のようなSQLができた。

```
SELECT "Comment"."id" AS "Comment__id"
FROM "public"."comments" AS "Comment"
WHERE id <> = (4)
```

```
Error: SQLSTATE[42883]: Undefined function: 7 ERROR: operator does not exist: integer <> LINE 1: ...d" FROM "public"."comments" AS "Comment" WHERE id <> = (4) ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
```

## 'NOT' => array('column' => $value)だと安全な様子

### $valueがscalarの場合

```php
$value = 1;
$this->Comment->find('all', array(
    'conditions' => array(
        'NOT' => array(
            'id' => $value,
        ),
    ),
));
```

```sql
SELECT "Comment"."id" AS "Comment__id"
FROM "public"."comments" AS "Comment"
WHERE NOT ("id" = 1)
```

### $valueがarrayで2件以上含まれる場合

```php
$value = array(2, 3);
$this->Comment->find('all', array(
    'conditions' => array(
        'NOT' => array(
            'id' => $value,
        ),
    ),
));
```

```sql
SELECT "Comment"."id" AS "Comment__id"
FROM "public"."comments" AS "Comment"
WHERE NOT ("id" IN (2, 3))
```

### $valueがarrayで1件のみ含まれる場合

```php
$value = array(4);
$this->Comment->find('all', array(
    'conditions' => array(
        'NOT' => array(
            'id' => $value,
        ),
    ),
));
```

```sql
SELECT "Comment"."id" AS "Comment__id"
FROM "public"."comments" AS "Comment"
WHERE NOT (id = (4))
```
Clojureの標準にないけど欲しい関数

って結構ありませんか？
よく使ったり使わなかったりする汎用的に使える関数がこちら

```clj
(defn third [coll] (second (next coll)))
```

secondがあるならthirdもほしい
thirdぐらいまでは結構使いませんかねえ？

```clj
(defmacro def-nth* [index]
  `(defn ~(symbol (str "nth" index))
     ([coll#] (nth coll# ~index))
     ([coll# not-found#] (nth coll# ~index not-found#))))
(doseq [i (range 10)] (eval (list 'def-nth* i)))
```

あんまり使わないけど、`nth0`～`nth9`までの関数を↑で定義して使える

```clj
(defn ->int [x] (Integer/parseInt x))
(defn ->long [x] (Long/parseLong x))
(defn ->double [x] (Double/parseDouble x))
```

何回も定義してる気がする。めんどいから標準でほしい

```clj
(defn indexed [coll] (map vector (range) coll))
(defn some-indexed [f coll]
  (->> (keep-indexed f coll)
       (filter identity)
       first))
```

some-indexedは結構使う機会多い気がします。


```clj
(defn cons-last [x coll] (concat coll [x]))
```

リストの最後に追加するやつ標準になんでないんでしょうか？


```clj
(defn drop-nth [n coll]
  (mapcat butlast (partition-all n (cons-last nil coll))))
```

最近使ったけどあまり使わないかな。take-nthのdrop版

```clj
(defn nth-select [coll indices]
  (map #(nth coll %) indices))
```

リストの中のほしい番号の分だけ取り出す。
リストに対するindexに基づいたアクセスはvectorにすれば結構いける関数多い（update-inなど）ですがselect-keysはマップになってしまうので仕方なく定義しとく

他にもこういうの使うよとか、こっち使えばいいよとかあれば教えてほしい・・・
Scrum Gathering Tokyo 2015: Scrum Patterns : The New Defacto Scrum Standard

Jim ("Cope") Coplien さんありがとう。

2014/11/4 に受けた、"Scrum Tuning using Organizational Patterns" の再受講、って感じだった。本当に良かった。

全部英語だったので、僕が理解できたことだけメモ：

# Daily Scrum

毎日再計画する、ただそのためにあるんだよ。

# Scrum Guide

チェスのルールみたいなもんだ。
覚えたからと言って、上手くいくわけじゃないんだよ。

# Management

Scrum にプロジェクトマネージャーはいらない。deadweightさ。
自分たちでマネージするからなんだよ。

# Stable teams

チームを長い期間維持するんだ。改善と成長を考えるなら当然のことだよ。

# Kanban

かんばんを勘違いしてる奴らが多すぎる。
列ごとに別のマネージャーがいて生産性重視で個別最適で動くとどうなる？
もしどっかが故障するとどうなる？
在庫の山さ。

かんばんの本質は、「一個流し」と「むらがる」ことなんだ。
チームの周りに作業台を囲むように置いて、みんなで作り上げるんだよ。

# Bug Tracking System

それはリーンなのかい？今すぐ直すんだ。

# Pattern


Scrumは素早く、簡単で、楽しくあるべきだ。

パターンは特定の文脈における問題を解決するために、スクラムガイドを強化する。
多くの人に証明されたパターンが実際の運用と改善の助けになるんだよ。

# Culture

日本は極めて階層的でマネージャー文化。
とっても難しいけど致命的って程じゃない。

Scrumは日本から生まれたんだ。
根底に信頼と協力があることを忘れないで。
チャレンジしよう。

# おまけ：

kiro さんが、「Scrumは補助輪だ。ScrumMasterの最後の仕事は、Scrumを捨てることなんだよ」っておっしゃってた。
PHPで配列内に重複する要素があるかないか判定する関数


**注意：コメントによりよい手法が書かれています**

## 概要

PHPで配列内に同じ要素があるかないか判定したかったが、調べてもダイレクトに使えそうな組み込み関数がなかったので書いてみた。

## コード

重複判定のために書いたのは、**配列内の全ての要素が一意であるか**調べる関数。

つまり
* 返り値がtrueなら**配列内に重複要素はない**
* 返り値がfalseなら**配列内に重複要素あり**
となる。


```php:
// 配列内の全ての値が一意かチェックする
function isUniqueArray ($target_array) {
  $unique_array = array_unique($target_array);
  if (count($unique_array) === count($target_array)) {
    return true;
  }
  else {
    return false;
  }
}
```

## 解説

PHPの組み込み関数であるarray_unique(\$array)は、引数の$arrayから重複要素を削除した配列を返す。つまり、重複要素**削除前の配列内要素数と削除後の配列内要素数**を比較し、要素数が同じであれば重複はないというだけのことである。

## まとめ

記事にするほどのことでもなかったが、なんとなく不便だったのでメモ代わりに。あと、調べても同じことで困ってる人がちらほらいたのになぜか複雑なことをやっていたので。
psでCOMMANDに特定のパターンを含むプロセスだけをきれいに出力する 

grep しちゃうとヘッダ部分が出力されない。

きれいに表示させるなら `pgrep -d, -f パターン | xargs -r ps uwp` のように `pgrep` と `xargs` を組み合わせて使う。プロセステーブルを2回スキャンするのが欠点と言えば欠点である。

`ps auxww | sed -n '1p; /sed -n /d; /パターン/p'` なんて方法もある。

xargs の -r は GNU 拡張なので、汎用性でいうと後のほうかな。
activeadmin+paperclipで画像管理機能導入メモ

![スクリーンショット_2015-02-28_23_09_54.png](https://qiita-image-store.s3.amazonaws.com/0/24870/9ce8ee91-edae-44a0-00e8-ac9c3f273f73.png)

![スクリーンショット_2015-02-28_23_10_05.png](https://qiita-image-store.s3.amazonaws.com/0/24870/d1a852bf-60d8-b80a-63ee-d239435f4af3.png)

 #メモなのでところどころ怪しいです

# 参考（詳しい）
- http://morizyun.github.io/blog/active-admin-gem-rails/
- http://ruby-rails.hatenadiary.com/entry/20140716/1405443484
- http://qiita.com/hkusu/items/3b0fb7f94a254e2ed6fd


# 前提
- すでに activeadmin 導入済み（ /admin が使える）
- Imagemagickいれておく（$ brew install imagemagick）

# paperclip導入
```rb:Gemfile
gem 'paperclip'
```

# Pictureモデル準備
```
$ bundle exec rails g picture name:string photo:attachment
$ bundle exec rake db:migrate
```

```rb:db/migrate/20150228120636_create_pictures.rb
class CreatePictures < ActiveRecord::Migration
  def change
    create_table :pictures do |t|
      t.string :name
      t.attachment :photo

      t.timestamps
    end
  end
end
```

```rb:app/models/picture.rb
class Picture < ActiveRecord::Base

  has_attached_file :photo, styles: { medium: "300x300>", thumb: "100x100>" }
  validates_attachment :photo, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] }

end
```

# ActiveAdminに追加
```
$ bundle exec rails g active_admin:resource Picture
```

```rb:app/admin/picture.rb
ActiveAdmin.register Picture do
  permit_params :id, :name, :photo

  index do
    column "ID", :id
    column "name", :name
    column "thumb", :photo do |obj|
      image_tag(obj.photo.url(:thumb))
    end
    actions
  end

  form multipart: true do |f|
    f.inputs Picture do
      f.input :name
      f.input :photo, as: :file, hint: image_tag(f.object.photo.url(:medium))

      f.actions
    end
  end

  show do |b|
    attributes_table do
      row :name
      row :photo do
        image_tag(b.photo.url(:medium))
      end
      row :url do
        b.photo.url
      end
      row :url_medium do
        b.photo.url(:medium)
      end
      row :url_thumb do
        b.photo.url(:thumb)
      end
    end
    active_admin_comments
  end

end
```

ほかのModelにも似たような手順で機能追加できそう。
Apacheを用いたReverseProxyでのProxy Error(502)について

リバースプロキシサーバへアクセス後、しばらく時間を置き、再度アクセス（ブラウザの更新ボタン押下）すると502エラーが表示される。
アドレスバーに再度URLを入力し、アクセスすると問題なくページが表示される。

## Proxy Error 発生時の状況

### 事象発生環境
Reverse Proxy Server: CentOS 6.5 / httpd.x86_64 2.2.15-31.el6.centos
Backend Server: Windows Server 2008 R2 / IIS 7
Browser: Windows 8.1 / Internet Explorer 11

### Apache 設定

```
# cat /etc/httpd/conf.d/proxy.conf
<Location /iis>
</Location>

ProxyPass /iis http://172.31.12.130/
ProxyPassReverse /iis http://172.31.12.130/
```

### Proxy Error (502) Internet Explorer 11
![502proxyerror.png](https://qiita-image-store.s3.amazonaws.com/0/64827/3197ba66-9cb0-fae7-1440-f63727a66f29.png)


### Apache Access Log

```
# tail -f /var/log/httpd/access_log
127.0.0.1 - - [28/Feb/2015:22:12:32 +0900] "GET /iis/ HTTP/1.1" 502 465 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; MASPJS; rv:11.0) like Gecko"
```

## 事象の改善方法
調べているといくつか設定方法はあることがわかった。以下に調べた範囲の情報を記載します。

### 1. proxy-initial-not-pooled
下記サイトを参考に設定しました。
http://qiita.com/mist_dev/items/e902854998074fe4bef1

```
# cat /etc/httpd/conf.d/proxy.conf
<Location /iis>
  SetEnv proxy-initial-not-pooled 1
</Location>

ProxyPass /iis http://172.31.12.130/
ProxyPassReverse /iis http://172.31.12.130/

# /etc/init.d/httpd graceful
```

### 2. force-proxy-request & proxy-nokeepalive
下記サイトを参考に設定しました。
http://startnews24.com/?p=23553
http://se-suganuma.blogspot.jp/2011/07/apachereverse-proxy502-proxy-error.html

```
# cat /etc/httpd/conf.d/proxy.conf
<Location /iis>
  SetEnv force-proxy-request-1.0 1  
  SetEnv proxy-nokeepalive 1 
</Location>

ProxyPass /iis http://172.31.12.130/
ProxyPassReverse /iis http://172.31.12.130/

# /etc/init.d/httpd graceful
```

### 3. retry & keepalive
下記サイトを参考に設定しました。
http://serverfault.com/questions/185894/proxy-error-502-reason-error-reading-from-remote-server-with-apache-2-2-3-de
http://stackoverflow.com/questions/169453/bad-gateway-502-error-with-apache-mod-proxy-and-tomcat

```
# cat /etc/httpd/conf.d/proxy.conf
<Location /iis>
</Location>

ProxyPass /iis http://172.31.12.130/ retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse /iis http://172.31.12.130/

# /etc/init.d/httpd graceful
```

## 結果
１と２の設定をそれぞれ試してみたが、今のところは502がでていないので改善されている模様。

※同様の内容が下記で議論されていました。
http://stackoverflow.com/questions/12303087/502-proxy-errors-between-iis-and-apache2

## 補足
リバースプロキシに関する設定は下記サイトを参考としました。
http://dev.classmethod.jp/server-side/server/introduction_mod_proxy/

各環境変数の意味は下記サイトを参照。
http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy_http.html
Ansibleで設定ファイルの行を書き換える

すでにある環境に対して、Ansibleで構成変更するとき、lineinfile で行を置き換えるのではなく、既存の行の一部を変更したいことがある。

しかし、このようなときに、冪等性を確保するのは意外に難しい。正規表現では、最小一致や否定先読みアサーションを使ったとしても、うまく行を選択できないか、あるいは複数回実行すると、そのたびに変更されてしまったりする。

とりあえず、grepで書き換えるべきかどうかを判定して、必要なときだけ書き換えるようにしてみた。

```
- hosts: servers
  vars:
    httpd_conf: /etc/apache2/apache2.conf
  tasks:
    - name: grep %{Session}C
      command: grep '^LogFormat[[:space:]].*%{Session}C.*[[:space:]]combined' {{httpd_conf}}
      register: grep
      ignore_errors: True
      failed_when: False
      changed_when: False
    - name: change httpd.conf
      lineinfile:
        backup=yes
        backrefs=yes
        dest={{httpd_conf}}
        state=present
        regexp="^(LogFormat\s+\")(.*)(\"\s+combined)$"
        line="\1\2 \\\\\"%{Session}C\\\\\" \3"
      when: grep.rc == 1
```
Spark CoreとSpark CloudからIoTデバイスとクラウドの関係を考える

昨年購入したまま放置していた[Spark Core](https://www.spark.io/)をようやく遊べる時間が作れました。Spark CoreはArduino互換のマイコンボードです。Wi-Fiモジュールを搭載しているのでインターネット経由でリモートデバイスのプログラムの更新ができます。Sparkデバイスには[Spark Cloud](https://www.spark.io/features)というBaaSとセットで使う魅力があります。


## IoTデバイスは小型Linuxサーバーかマイコンか

### 小型Linxサーバーとクラウド

一番よく使っている[BeagleBone Black](http://beagleboard.org/)はARM Linuxサーバーとしての楽しみがあります。BeagleBone Blackを搭載した[Ninja Sphere](https://ninjablocks.com/)は[Snappy Ubuntu Core](http://www.ubuntu.com/things)でアプリの管理が可能になり汎用的なデバイスが作れそうです。Intel EdisonはSDカードサイズでWi-FiとBluetoothが使える超小型コンピューターです。Arduinoと組み合わせてGPIOを使うというより、超小型のx86 Linuxサーバーの方に魅力を感じてしまいます。

ただし、どうしてもマシンスペックは低く制約も多いため、クラウドで使えるLinuxサーバーと全く同じには使えません。エッジのLinuxベースのIoTデバイスでちょっと重い処理ができるメリットはありますが、今では500円/月でクラウドのLinuxサーバーが使える時代になりました。コネクテッドデバイスはなるべくハードウェアの制御に特化して、分散処理やデータストアを考えると、なるべくロジックはクラウド上で実装しておいた方がよい気がします。

### マイコンとクラウド

Spark デバイスは[HacksterのSparkプロジェクト](http://spark.hackster.io/)にあるように、ミニマルにハードウェアの制御に向いています。Kickstarterで資金調達している[Spark Electron](https://www.kickstarter.com/projects/sparkdevices/spark-electron-cellular-dev-kit-with-a-simple-data)はさらにおもしろくてSIMカードが刺せます。Spark Cloudやリモートデバイス管理の特徴とあわせると可能性がもっと広がります。

## Spark Cloud

Spark CoreなどのSparkデバイスの魅力はSpark Cloudにつながっているところです。デバイスはSpark Cloudとセキュアな暗号化通信をします。また最初からデバイスがCloudにつながっているので、IFTTTなどのWebサービス連携サービスや自動化と相性が良いです。

### 特徴

[Features](https://www.spark.io/features)に書いてある特徴を簡単にまとめます。

* Arduinoと同じ[Wiring](http://wiring.org.co/)言語や、Node.js、Pythonでもプログラムできる
* ハードウェア制御の[REST API](http://docs.spark.io/api/)と[Spark-CLI](https://github.com/spark/spark-cli)が使える
* インターネット経由でプログラムの書き換えができる
* AtomベースのWeb IDEでコーディングとデプロイができる
* コミュニティーが開発したライブラリをWeb IDEから読み込める
* デバイス間でpub/subのリアルタイム通信
* RSA, AES, SSL/TLSのセキュア通信
* [IFTTT](https://ifttt.com/)の[Spark Channel](http://docs.spark.io/ifttt/)

2015年にはクラウドのバックエンドサービスが充実するようです。

* プライベートクラウド
* デバイスのダッシュボード
* データ可視化

### spark-server

自分のクラウド上にSpark Cloudのオープンソース版を構築できる[spark-server](https://github.com/spark/spark-server)もあります。Spark Cloudと同じREST APIとSpark-CLIが使えるようです。しばらく更新されていなかったのですが今日コミットがたくさん入りました。これで安心して試すことができます。
SKK の句讀點を「、。」と「，．」で toggle できるやうにした．

次のやうに init.el に書いてやればいい．

```init.el
(defun toggle-skk-kutouten-type nil
  (interactive)
  (cond
   ((equal skk-kutouten-type 'en)
    (setq-default skk-kutouten-type 'jp))
   ((equal skk-kutouten-type 'jp)
    (setq-default skk-kutouten-type 'en))
   ((t nil))))


(global-set-key (kbd "<f7>") 'toggle-skk-kutouten-type)
```
UIDから各種ソーシャルのマイページにアクセスする方法


とりあえずDBにIDっぽいものはあるけど…って時のあれこれ。

間違ってるところとか別のサービスだとこうだよ!!みたいなのあったら教えて下さい。


## FACEBOOK

https://www.facebook.com/xxxx

以下のURLにリダイレクトする。アプリが認証でもらったIDは↓のyyyyのIDとは別物みたいです。
https://www.facebook.com/profile.php?id=yyyy

## TWITTER

昔は別のURLがあったけどもう使えなくなってる。

https://twitter.com/intent/user?user_id=XXXX

## google

https://plus.google.com/xxxx/posts

## hatena

こちらは文字列のID

http://profile.hatena.ne.jp/xxxx
CentOS6.6に php5.5をインストールしてみる、違う方法①

前の投稿より簡単にインストールできたのでこっちの方法も投稿します。

参考にさせてもらったサイト
http://blog.ybbo.net/2014/01/22/%E3%80%90%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%80%91centos6%E3%81%ABphp5-5%E3%82%92yum%E3%81%A7%E7%B0%A1%E5%8D%98%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/

環境
CentOS:6.6 (64bit)

# リポジトリを追加する
まずepelのリポジトリを追加します。

```
sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

次にremiのリポジトリを追加します。
```
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

これでレポジトリの追加は完了です。


# php5.5をインストールする
では php5.5をインストールしていきましょう。

```
yum install php --enablerepo=remi-php55
```

上記でphp5.5がインストールできます。

# phpのバージョンを確認

```
php -v
PHP 5.5.22 (cli) (built: Feb 18 2015 17:54:45)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
```
Railsのフォーム基本的な作成方法まとめ（form_forとかform_tag）


railsでフォームを作ろうとすると知っていれば簡単だけど、知らないと調べる面倒っていうのが結構あるのでまとめてみました。
rails4系対応です。


# form_forとform_tag

フォームを宣言するメソッドとして
form_forとform_tagがあります。

## form_for


こっちはモデルに基づいたフォームを作成するのに向いています。
基本的にフォームの項目とモデルの属性は一致しているものなので、こっちを使うことが多いのかな・・・と思っています。

```erb
<% form_for(@article) do |f| %>
  <div><%= f.text_field :title, class: "hogehoge" %></div>
  <%= f.submit %>
<% end %>

```

管理画面で作成した記事をフロントで表示させたい、でも使うモデルは一緒なんて言う場合結構困ったりします。
例えば管理画面が http://www.example.com/admin
なんて言う場合は、下記のようになります。

```erb
<% form_for([:admin, @article]) do |f| %>
<% end %>
```

## form_tag

モデルに基づかないフォームを作成するときはこちら。

```erb
<% form_tag(:controller => article, :action => create) %>
  <div><%= text_field :title, class: "hogehoge" %></div>
  <%= submit_tag "作成" %>
<% end %>
```


# テキストボックス

f.text_field(プロパティ名, [オプション])

```erb
<%= f.text_field :title, class: "hogehoge" %>
```

オプションでスタイル指定やclass名の指定ができます。

# テキストエリア

f.text_area(プロパティ名, [オプション])

```erb
<%= f.text_area :content, class: "hogehoge", size: "100x50" %>
```

テキストボックスとほぼ一緒。
サイズ指定が、cols x rowsになってます。

# セレクトボックス
f.collection_select(プロパティ名, オブジェクトの配列, value属性の項目, テキストの項目 [, オプション])

```erb
<%= f.collection_select :category, Category.all, :id, :category_name, include_blank: true %>
```

Categoryモデルを別途作成しておけば、簡単にカテゴリー一覧が入ったモデルの作成ができます。

# チェックボックス
f.collection_check_boxed(オブジェクト名, プロパティ名, オブジェクトの配列, value属性の項目, テキストの項目 [, オプション])

```erb
<%= f.collection_check_boxes(:article, :tag_ids, Tag.all, :id, :tag_name) do |b| %> 
  <%= b.label {b.check_box + b.text} %>
<% end %>
```

いわゆる多対多のモデルで使用するパターンが多いのかなと思ってます。
知っていれば、こんな簡単にできるのか！と思うのですが知らないと結構はまる。。。

StrongParameters対応としては

```rb
params.require(:article).permit({:tag_ids=>[]}
```

こんな感じです。

# ラジオボタン

f.collection_radio_buttons(オブジェクト名, プロパティ名, オブジェクトの配列, value属性の項目, テキストの項目 [, オプション])

```erb
<%= f.collection_radio_buttons(:article, :type_ids, Type.all, :id, :type_name) do |b| %>
  <%= b.label {b.radio_button + b.text} %>
<% end %>
```

チェックボックスとほぼ一緒。