OmniAICreator/Qiita-1.07M huggingface dataset:
gsub meets hash

## 無慈悲な置換

``` ruby
text = "可愛い女の子かと思った？ 残念！ さ や か ち ゃ んでした！"

lexicon = {
  "残念"=> "そうよ",
  "さ や か ち ゃ ん" => "にこにー",
  "でした！" => "よ！ にっこにっこにー"
}

terms = lexicon.keys.map { |key| Regexp.escape(key) }.join("|")
#=> "残念|さ\\ や\\ か\\ ち\\ ゃ\\ ん|でした！"
pattern = Regexp.new(terms)
#=> /残念|さ\ や\ か\ ち\ ゃ\ ん|でした！/

text.gsub(pattern, lexicon)
#=> "可愛い女の子かと思った？ そうよ！ にこにーよ！ にっこにっこにー"
```

## 参考

* [Two years of RubyTapas (free episode!)](http://devblog.avdi.org/2014/09/24/two-years-of-rubytapas/)
* [instance method String#gsub](http://docs.ruby-lang.org/ja/2.1.0/method/String/i/gsub.html)
スマホの検証にSafariを使う場合のUA設定

スマホサイトの動作確認（PC上で）する場合、safariを使っています。
他のブラウザのUA偽装をするアドオンでも良いのですが、safariでチェックする方が
信頼性があります（iPhone上のsafariと同等との話を何処かで見た気がする…）

ただ、このままだとUAはiPhoneのsafariになってしまうので、Androidを追加。
もちろん実機での確認もしますが、開発中はPC上で確認すると思います。
safariでUAを設定する方法を備忘録。

Windowsの場合、C:\Program Files\Safari\Safari.resources\ 配下にある以下のファイルを編集する。
自分の場合は所持しているSOL25（XPERIA ZL2）の設定にしてみた。

```xml:UserAgents.plist
<dict>
	<key>name</key>
	<string>SONY SOL25</string>
	<key>version</key>
	<string>11.11</string>
	<key>platform</key>
	<string>Android</string>
	<key>user-agent</key>
	<string>Mozilla/5.0 (Linux; U; Android 4.4.2; ja-jp; SOL25 Build/xxxx) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30</string>
</dict>
```

これで、ユーザーエージェントの項目に「SONY SOL25」が追加される。
Terminal.appでObjective-Cをコンパイルする using Makefile

Makefileを使って簡単にTerminal.appでObjective-Cをコンパイルします

まず、Makefileを用意します

```Makefile:Makefile
LDFLAGS=-framework Foundation
```

以上です。

簡単なソースコードを用意します。

```objc:Hoge.m
int main(int argc, const char *argv[]) {
    NSLog(@"Hoge!");
    return 0;
}
```
一応objcです。

ではコンパイルしましょう。

```bash
$ make hoge
cc -framework Foundation  hoge.o   -o hoge
$ ls
hoge hoge.m
```
hoge.mがコンパイルされhogeが出来ました。
簡単ですね。

少し複雑にしましょう。foo.mとbar.mをコンパイルしfoobarを作ります。
Makefileに追加します。

```Makefile:Makefile
LDFLAGS=-framework Cocoa

foobar: foo.o bar.o
	$(CC) $(LDFLAGS) $^ -o $@

```
こんな感じ。\$(CC)の前はタブです。
$(CC)のラインになんか変な記号が書いてますが気にしなくて良いです。ここは固定です。

注意すべき点は依存ファイルに書くのは \*.mではなくそれから生成される\*.oだということです。

ではコンパイルしましょう。

```bash
$ ls
bar.m foo.m
$ make foobar
cc    -c -o foo.o foo.m
cc    -c -o bar.o bar.m
cc -framework Foundation foo.o bar.o -o foobar
$ ls
bar.o foo.o foobar bar.m foo.m
```
foobarが出来ました。
簡単ですね。

これでプログラムを修正するたびに長ったらしいコマンドを打ち込む必要がなくなりました。
make便利です。


オブジェクトファイルの生成ルールは？
そもそも始めのMakefileはルールすらないよ？
何が行われているのか詳細が知りたい人は「Makefile 暗黙のルール」をググろう！
Makefileの奥は深いですよ！
[clang,llvm] clang・llvm開発時のリンクオプションの簡単な見分け方

clang/llvmのC++APIを叩く時のコンパイルオプションの設定は意外と面倒である。
特にclangを使いたい時はllvm-configは役に立たないし、リンク順序などはかなり深くclangの開発に携わっていないと理解不能である。

最も簡単な調べ方はclangのmake時のコンパイルオプションを見る事である。
一度ビルドしたllvm/clangのRelese(またはDebug+Assertions等)フォルダからclangのbinファイルを消して、make -nすればよい。

clangのビルドは普通は
LLVM_BUILD_DIR/tools/clang/tools/driver/
にあるmakefileで行われる。
なので、このディレクトリでmake -nすればコンパイルコマンドが見られる。

私の環境では
 -lclangFrontendTool -lclangFrontend -lclangDriver -lclangSerialization -lclangCodeGen -lclangParse -lclangSema -lclangRewriteFrontend -lclangRewrite -lclangStaticAnalyzerFrontend -lclangStaticAnalyzerCheckers -lclangStaticAnalyzerCore -lclangARCMigrate -lclangAnalysis -lclangEdit -lclangAST -lclangLex -lclangBasic 
        -lLLVMOption -lLLVMObjCARCOpts -lLLVMLinker -lLLVMIRReader -lLLVMipo -lLLVMVectorize -lLLVMInstrumentation -lLLVMBitWriter -lLLVMAsmParser -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMProfileData -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMTarget -lLLVMX86Desc -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMMC -lLLVMX86Utils -lLLVMCore -lLLVMSupport   -lz -lpthread -ltinfo -lrt -ldl -lm
がリンク用のオプションであった。
これに llvm-config --cxxflagsのコマンドとリンクフォルダ指定オプション(-L/LLVM_CLANG_LIB_DIR/)を足せばうまくいく。
iOS8 の iPad で actionSheet から presentViewController する

iOS8 / iPad では、actionSheet の delegate 内から presentViewController でビューコントローラを表示させることができません。具体的には、以下のようなエラーだけがでて何も起こりません。

```
Warning: Attempt to present <...> on <...> which is already presenting 
```

ワークアラウンドとして、以下のように presentViewController: を遅延実行させると正常動作します。

```objc
dispatch_async(dispatch_get_main_queue(), ^ {
    [self presentViewController:vc animated:YES completion:nil];
});
```

参考: [Presenting a view controller modally from an action sheet's delegate in iOS8](http://stackoverflow.com/questions/24854802/presenting-a-view-controller-modally-from-an-action-sheets-delegate-in-ios8)
AFNetworking(NSURLSessionTask)で通信するときの標準フロー

AFNetworkingを使ったHTTP通信（自分の場合はREST APIの利用）する時にリクエストパラメータやカスタムヘッダを利用する機会がある。
このときどの情報を/どこに/どのように/設定するのかこんがらがったので、実装した順にまとめておく。

なお、通信関連の操作は`AFHTTPSessionManager`のサブクラスで行っているので、`self`オブジェクトはこれを指す。
もう少し基本的な話は[こちら](http://qiita.com/rooooomania/items/9d57a2e7bce897972f3f)にまとめている。
##1. リクエストパラメータを設定する
リクエストパラメータの設定は、GET/POST操作にて、操作対象のデータを特定したり絞り込みたい時によく使う。

```objectivec
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
parameters[@"key1"] = @"value1";
parameters[@"key2"] = @"value2";
...
```

##2. リクエストパラメータが付加された`NSMutableURLRequest`オブジェクトを作る
requestSerializer を使って、NSMutableURLRequest を生成する。

```objectivec
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"GET" URLString:@"urlString" parameters:parameters error:nil];
```

##3. カスタムヘッダを設定する
カスタムヘッダは、メタ情報を設定する時によく使う。例えば、`Content-Type`の設定など。

```objectivec
[request setValue:@"value1" forHTTPHeaderField:@"HeaderField1"];
[request setValue:@"value2" forHTTPHeaderField:@"HeaderField2"];
```

##4. （番外）ベーシック認証用の情報をカスタムヘッダに付与する
もし、通信にベーシック認証が必要な場合は2.の`NSMutableURLRequest`を生成する前に次のメソッドを実行する。

```objectivec
[self.requestSerializer setAuthorizationHeaderFieldWithUsername:self.account password:self.password];
```


* 3.の方式で設定することもできるがBase64エンコーディングが必要だったりする[1]。
* 認証チャレンジ時にコールバックされるデリゲートメソッドにログイン情報を設定することもできる[2]。

[1]:http://d.hatena.ne.jp/white_silhouette/20080916/1221566535
[2]:http://cocoadocs.org/docsets/AFNetworking/2.4.1/Classes/AFURLSessionManager.html#//api/name/setTaskDidReceiveAuthenticationChallengeBlock:

##5. `NSURLSessionTask`を使って通信を行う
ここでは、サブクラス`NSURLSessionDataTask`を使って、GETメソッドを処理している。


```objectivec
NSURLSessionDataTask *getTask = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        //エラーハンドリング
        }
    //responseObjectを使って何かする
}];
[getTask resume];
```
「数字6桁パスワードのMD5ハッシュ値の総当たり」をGolangでやってみた

今更だけど qiita でたまたま目についたので Golang ではどんなものなのかやってみた。
他の言語については[ここ](http://qiita.com/soyiharu/items/825e4f9c631ae753247d)から参照されたし。

実行環境
-------
OS: Ubuntu 14.04 LTS
CPU： Intel(R) Core(TM) i7-4510U CPU @ 2.00GHz
言語: go version go1.3 linux/amd64

ソースコード
---------
まずは愚直にやってみたバージョン。
他の言語と比べてもかなりシンプルな方ですね。

```lang:bruteforce.go
package main

import (
	"crypto/md5"
	"fmt"
	"os"
	"bytes"
	"encoding/hex"
)

const NUMMAX = 1000000

func main() {
	pw, _ := hex.DecodeString(os.Args[2])

	for i := 0; i < NUMMAX; i++ {
		sum := md5.Sum([]byte(fmt.Sprintf("%s$%06d", os.Args[1], i)))
		if bytes.Equal(pw, sum[:]) {
			fmt.Printf("Solved: %06d\n", i)
			return
		}
	}
}
```

実行結果
-------
```lang:shell
$ time go run bruteforce.go hoge 4b364677946ccf79f841114e73ccaf4f
Solved: 567890

real	0m0.566s
user	0m0.540s
sys	0m0.027s
```

なんとコンパイル込みで約**0.56**秒でした。
この時点で結構早かったので高速化する気が一気に失せました。。。

ちなみにコンパイルして実行した結果は以下の通り。

```lang:shell
$ go build bruteforce.go
$ time ./bruteforce hoge 4b364677946ccf79f841114e73ccaf4f
Solved: 567890

real	0m0.445s
user	0m0.434s
sys	0m0.012s
```

コンパイルにかかっている時間は0.1秒のようです。
普段Scala使ってるとこのコンパイル速度は驚異的ですね！

続いて、皆さん並列実行版も計測してらっしゃるので、Goroutine版も用意しました。
並列化してもコードはシンプルでいいですね！

```lang:bruteforce2.go
package main

import (
	"crypto/md5"
	"fmt"
	"os"
	"bytes"
	"encoding/hex"
	"runtime"
	"sync"
)

const NUMMAX = 1000000

func main() {
	numCPU := runtime.NumCPU()
	runtime.GOMAXPROCS(numCPU)
	pw, _ := hex.DecodeString(os.Args[2])
	var wg sync.WaitGroup
	var once sync.Once
	wg.Add(1)

	for i := 0; i < numCPU; i++ {
		go func(start, step int) {
			defer once.Do(wg.Done)
			for j := start; j < NUMMAX; j += step {
				sum := md5.Sum([]byte(fmt.Sprintf("%s$%06d", os.Args[1], j)))
				if bytes.Equal(pw, sum[:]) {
					fmt.Printf("Solved: %06d\n", j)
					return
				}
			}
		}(i, numCPU)
	}

	wg.Wait()
}
```

実行結果
-------
```lang:shell
$ go build bruteforce2.go
$ time ./bruteforce2 hoge 4b364677946ccf79f841114e73ccaf4f
Solved: 567890

real	0m0.256s
user	0m0.812s
sys	0m0.028s
```
約**0.25**秒でした。
個人的にはもっと速度出てほしかったですけど、十分かな？
Ultrabookでこの速度なので、デスクトップとか4コアとかのCPUだともっと早いと思う。

まとめ
----
Golang で書いたコードは速いし書くのは簡単だし、オススメ
Running Kubernetes Example on Fedora Atomic with flannel

やっと Kubernetes Example が動く Fedora Atomic の Vagrant box が出来たのでご報告。

https://vagrantcloud.com/yungsang/boxes/fedora-atomic

[CoreOS の時](http://qiita.com/yungsang/items/530ae3d3277d2fba3343)と同じように、コードは、
Running Kubernetes Example on Fedora Atomic with flannel
https://github.com/YungSang/fedora-atomic-kubernetes-flannel
に置きました。

Kubernetes Example のステップは CoreOS の場合と同じです。
**(dockerfile/redis が更新されてパッチは必要無くなりました。)**

```
$ open http://192.168.12.11:8000
$ open http://192.168.12.12:8000
```
Knockout.js，Scoket.ioとNode.jsで簡単なチャットアプリのサンプル

チャットアプリを開発する機会がありました．そのたたき台となる基本的なチャットをつくるのに，せっかくなので使ったことのないKnockout.jsを使ってみました．

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/150/5bc66a1f-0512-799e-5df8-70844f944d69.gif)

ソースコードはここ https://github.com/tsuwatch/knockoutjs-socket-node-chat

依存パッケージは以下．

```json:package.json
"dependencies": {
  "express": "~4.9.0",
  "body-parser": "~1.8.1",
  "cookie-parser": "~1.3.3",
  "morgan": "~1.3.0",
  "serve-favicon": "~2.1.3",
  "debug": "~2.0.0",
  "jade": "~1.6.0",
  "stylus": "0.42.3",
  "socket.io": "1.1.0"
}
```
Knockout.jsは3.2.0で，Node.jsはv0.10.32です．

数あるフロントエンドのフレームワークからKnockout.jsに決めた理由は，Angular.jsまで多機能である必要がなく，一番シンプルで学習コストが低くいと思ったからです．フレームワークの比較に関しては詳しい方が書かれている記事がたくさんありますので，そちらを読むのが良いと思います．

使ってみた個人的な印象としては，

* 自由度が高い
* 双方向バインディングだけ欲しいときに使える
* jQueryと併用できて便利（アニメーションを使ったバインドなどができるらしい）
* 大規模化すると結局複雑になっていきそう

今までは全部jQueryでやっていたけど，双方向バインディングはKnockout.js，その他はjQueryでやろうというコンセプトのように感じました．


## 参考にしたサイト
* チャット
    * https://github.com/Aaronontheweb/nodebootcamp-chat
    * https://github.com/Automattic/socket.io/tree/master/examples/chat
* Knockout.js
    * http://learn.knockoutjs.com
    * http://kojs.sukobuto.com/docs
* Socket.io
    * http://socket.io/get-started/chat/
Scala + Playでwarファイル作成


## はじめに

ひさしぶりにScala + Play Frameworkを使ってみたら、[昔書いた記事](http://qiita.com/JunSuzukiJapan@github/items/bffaed961d487e7c8546)のとおりでは、warファイルを作成できなくなっていた。
しかも、playコマンドがなくなって（？）、activatorというコマンドを使うようだ。

いろいろ調べて、今（２０１４年９月）のScala + Playでwarファイルを作成できたので備忘録としてまとめておく。


## 使用しているバージョン

Scala 2.11.2
Play 2.3.4

## activatorコマンドのメモ

### プロジェクトの新規作成

```bash:
$ activator new my-first-app play-scala
```

### プロジェクトの実行

```bash:
$ cd my-first-app
$ activator run
```

または、

```bash:
$ activator start
```

runとstartの違いは、ホットデプロイできるのがrun。主に開発時に使うようだ。
実際の運用時に使うのがstartと思われる。

### Eclipseでインポート

```bash:
$ activator eclipse
```

と実行しておいてから、Eclipseで、File->Importする。


## play2-war-pluginの導入

warファイルを作成するには、[play2-war-plugin](https://github.com/play2war/play2-war-plugin)を導入する必要がある。

以前はプラグインを使うときには、project/Build.scalaにいろいろ設定を書いていたが、Build.scalaはもう使わないようだ。
プラグインなどの設定は、build.sbtとproject/plugins.sbtに書く。

play2-war-pluginに関係するところだけ抜粋する。

```scala:build.sbt
import com.github.play2war.plugin._

name := "appname"

version := "1.0-SNAPSHOT"

Play2WarPlugin.play2WarSettings

Play2WarKeys.servletVersion := "3.0"
```

>Play2WarKeys.servletVersionの値が3.0なのは、AWSのElastic BeanstalkがTomcat7だから。

```scala:plugins.sbt
// Comment to get more information during initialization
logLevel := Level.Warn

// The Typesafe repository
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

// Use the Play sbt plugin for Play projects
addSbtPlugin("com.github.play2war" % "play2-war-plugin" % "1.3-beta3")
```

## warファイルの作成

プロジェクトのホームディレクトリで以下のコマンドを実行する。

```bash:
$ sbt war
```

**sbt** です。 **activator** ではありません。
正直、activatorから実行する方法がわかりませんでした…。


## 参考URL

http://cs.hatenablog.jp/entry/2013/12/15/234618
https://github.com/play2war/play2-war-plugin/wiki/Configuration
別 remote の commit を pull(merge) する


諸事情でソースコード管理が分化しちゃってる場合とか。
あんま無いだろうけど、別々の Github Enterprise インスタンス、とかね。

`git@xxx:sample.git` に、`git@yyy:sample.git` の修正を引っ張ってくる。

適当な名前で remote 登録。今回は upstream で。

```bash
$ git remote add upstream git@yyy:sample.git
```

remote が追加されたこと確認して

```bash
$ git remote -v
origin	git@xxx:sample.git (fetch)
origin	git@xxx:sample.git (push)
upstream	git@yyy:sample.git (fetch)
upstream	git@yyy:sample.git (push)
```

fetch しーの

```bash
$ git fetch --all
Fetching origin
Fetching upstream
...
```

upstream から、欲しい branch を pull する。今回は master。
origin 側に独自に修正入れて無ければ、Fast-forward になりそう。

```bash
$ git pull upstream master
From yyy:sample
 * branch            master     -> FETCH_HEAD
Updating d2aed11..c812006
Fast-forward
...
```

終わったら origin に push しておく。

```bash
$ git push origin master
```

(追記)
ngyuki さんから下記指摘いただきました。

>pull って fetch + merge なのでその手順でやるなら fetch → merge の方が良いかなと思います。

知らなかった…ってことで、`man git-pull` 確認。まんま書いてありましたね…。
ご指摘の通り、敢えて fetch 別に叩いてるなら、merge のほうが自然ですね。

```bash
More precisely, git pull runs git fetch with the given parameters and calls git merge to merge the retrieved branch heads into the current branch. With --rebase, it runs git rebase instead of git merge.
```
geminabox の基本操作

# Ruby | geminabox の基本操作
## 概要
geminabox の基本操作

## 前提
* geminabox サーバー構築済み
* クライアントにも geminabox gem をインストールする

~~~bash
$ gem install geminabox --no-ri --no-doc
~~~

ちなみにクライアントに geminabox をインストールすると、
`gem inabox` コマンドが追加される関係で、今まで
`gem i gem_name` でインストール出来ていたのが
`gem install gem_name` と明示する必要がでてきます。

## gem の公開（CLI）
* gottani gem の version 0.0.2 を公開する場合

~~~
$ gem inabox ./pkg/gottani-0.0.2.gem
~~~

![geminabox_inabox.png](https://qiita-image-store.s3.amazonaws.com/0/43480/df8bcd8c-5a24-09df-f417-d951dc3235f2.png)

## gem の公開（GUI）
* gottani gem の version 0.0.2 を公開する場合
* geminabox のトップページを表示し、 Upload Another Gem リンクを選択

![geminabox_upload1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/2cb2a4da-6648-8ad4-5da4-3fc32a8c74f3.png)

* ファイルを選択ボタンを押下し、 gem を選択後、 Upload ボタンを押下し、 gem をアップロードする
* シンプルな完了メッセージのみの画面が表示されます

~~~
Gem gottani-0.0.2.gem received and indexed.
~~~

* トップページに戻ってアップロードされたことを確認します

![geminabox_inabox.png](https://qiita-image-store.s3.amazonaws.com/0/43480/df8bcd8c-5a24-09df-f417-d951dc3235f2.png)

## gem のダウンロード
* 該当 gem の download リンクを選択します。

![geminabox_inabox.png](https://qiita-image-store.s3.amazonaws.com/0/43480/df8bcd8c-5a24-09df-f417-d951dc3235f2.png)

## gem のインストール
* geminabox サーバーの情報を登録する

~~~bash
$ gem sources -a http://your_geminabox_server:your_port/
~~~
※設定内容は `~/.gemrc` に保存されている

* .gemrc を確認してみる

~~~bash
$ cat ~/.gemrc
---
:backtrace: false
:bulk_threshold: 1000
:sources:
- https://rubygems.org/
- http://your_geminabox_server:your_port/
:update_sources: true
:verbose: true
~~~

* 通常通り install する

~~~bash
$ gem install gottani
$ gem list | grep gottani
gottani (0.0.2)
~~~
RubyKaigi2014の知見。geminabox gem で Private な Gem Server を構築 #rubykaigi

# Ruby | RubyKaigi2014の知見。geminabox gem で Private な Gem Server を構築 #rubykaigi
## 概要
geminabox は RubyKaigi2014の初日（2014/09/18）に Takumi Miura さんが
「"Gem of this Week" - building culture and making gem」
という講演の中で紹介していた gem です。

geminabox は private な gem Server を作成するための gem です。
RubyGems に公開するようなたぐいではない gem とかありますよね。
業務特有のビジネスロジックを含み、公開出来ないようなものなど。

* [RubyKaigi 2014 1日目まとめ #rubykaigi](http://qiita.com/tbpgr/items/7761e85325e2e61f69ac)
* [ "Gem of this Week" - building culture and making gem スライド](http://mitaku.github.io/blog/2014/09/22/rubykaigi-2014-speech/)
* [Gem in a Box GitHub](https://github.com/geminabox/geminabox)
* [Gem in a Box RubyGems](http://rubygems.org/gems/geminabox)

## 前提
動作確認環境は以下。

OS: Ubuntu1404.LTS
Ruby: 1.9.3系

GitHub の geminabox のREADMEの説明によると Ruby 2系には対応していない模様。
ただ、Travis CIの結果を見ると 2.0 でテストが成功しているので現在は問題ないのだろうか？
README.md を信じて 1.9 系でインストールしました。
（2014/09/25現在）

## インストール

Web Server は unicorn である必要はありません。

~~~bash
$ gem i unicorn --no-ri --no-doc
$ gem i geminabox --no-ri --no-doc
~~~

## 設定手順

* config.ru を作成

~~~bash
# 任意の名前のディレクトリを作成
$ mkdir rubygems
$ sudo mkdir /var/geminabox-data

$ cat <<EOS > config.ru
require "rubygems"
require "geminabox"

Geminabox.data = "/var/geminabox-data"
run Geminabox::Server
EOS
~~~

※ Geminabox.data のフォルダは書き込み権限を設定しておくこと

* 起動スクリプトを Rakefile で作成

~~~ruby
task :start do
  system("unicorn -p 2000 -D")
end

task :stop do
  pids = `ps -ef | grep 'unicorn master' | awk -F ' ' '{print $2}'`
  pid = pids.each_line.map(&:chomp).first
  if $?.exitstatus == 0
    system("kill -QUIT #{pid}")
  else
    puts "Not Running Unicorn Process"
  end
end

task :restart => [:stop, :start] do
end
~~~

* ブラウザから確認

~~~bash
$ rake start
~~~

![geminabox_top.png](https://qiita-image-store.s3.amazonaws.com/0/43480/0a4e84fe-80c4-1bda-d5bb-cccb9b93ffa9.png)

* 停止

~~~bash
$ rake stop
~~~

## 参照
* [Gem in a Box GitHub](https://github.com/geminabox/geminabox)
* [Gem in a Box RubyGems](http://rubygems.org/gems/geminabox)
* [RubyKaigi 2014 1日目まとめ #rubykaigi](http://qiita.com/tbpgr/items/7761e85325e2e61f69ac)
* [ "Gem of this Week" - building culture and making gem スライド](http://mitaku.github.io/blog/2014/09/22/rubykaigi-2014-speech/)
複数ターゲット時の Objective-C から Swift の呼び出し

Swift から Objective-C を呼び出す際、"モジュール名-Swift.h" ヘッダを import する必要があります。

1プロジェクト中にターゲットが複数ある場合、ターゲット毎にモジュール名が異なっているため、このままだとヘッダファイル名が決められません(あるターゲットではコンパイルできるけど、他のターゲットにするとヘッダが見つからなくなる)。

この場合、プロジェクトの Build Settings にある "Product Module Name" を全ターゲットで合わせれば OK です。ヘッダは "ProductModuleName-Swift.h" を import します。

"Product Name" のほうはターゲット毎に別々にしても問題ありません。
Elixir パターンマッチ

# Elixir パターンマッチ

## 概要
Elixir のパターンマッチについて

## match operator
~~~
iex(1)> x=99
99
iex(2)> 99=x
99
iex(3)> 100=x
** (MatchError) no match of right hand side value: 99
    :erl_eval.expr/3
~~~

## Pattern matching
~~~
iex(1)> {x, y, z} = {:atom, "string", 23}
{:atom,"string",23}
iex(2)> x
:atom
iex(3)> y
"string"
iex(4)> z
23
iex(5)> {a, b, c} = {:atom, "string"}
** (MatchError) no match of right hand side value: {:atom,"string"}
    :erl_eval.expr/3
~~~

## Head, Tail
~~~
iex(1)> [head | tail]=[1,2,3,4,5]
[1,2,3,4,5]
iex(2)> head
1
iex(3)> tail
[2,3,4,5]
iex(4)> [h|l]=[1,2,3,4,5]
[1,2,3,4,5]
iex(5)> h
1
iex(6)> l
[2,3,4,5]
~~~

## The pin operator
値の上書きをせずにパターンマッチしたい場合に、 pin operator を利用

~~~
iex(1)> x=:hoge
:hoge
iex(2)> ^x=:hige
** (MatchError) no match of right hand side value: :hige
    :erl_eval.expr/3

iex(2)> ^x=:hoge
:hoge

# 公式ドキュメントではエラーにならないはずだが、実際に試したらエラーになった
# http://elixir-lang.org/getting_started/4.html#4.3-the-pin-operator
iex(3)> {x,^x}={:hige,:hoge}
** (MatchError) no match of right hand side value: {:hige,:hoge}
    :erl_eval.expr/3

# 不要な値がある場合は _ (アンダースコア)で読み捨てる
iex(3)> [h|_]=[1,2,3]
[1,2,3]
iex(4)> h
1
iex(5)> _
** (ErlangError) erlang error: {:unbound_var,:_}
    :erl_eval.exprs/2
~~~

## 参照
http://elixir-lang.org/getting_started/4.html#4.1-the-match-operator
RubyKaigi2014の知見。Rubyで強力なパターンマッチを利用できる Egison gem をインストール #rubykaigi

# Ruby | RubyKaigi2014の知見。Rubyで強力なパターンマッチを利用できる Egison gem をインストール #rubykaigi
## 概要
RubyKaigi2014で話題になった、強力なパターンマッチを利用できる Egison gem をインストールして
簡単な動作確認をしてみます。
ちなみに読み方は「えじそん」ではなく、「えぎそん」。江木さんが作ったから。

[Egison GitHub](https://github.com/egison/egison-ruby)
[Egison RubyGems](http://rubygems.org/gems/egison)

## インストール

~~~bash
$ gem i egison --no-ri --no-doc
Fetching: egison-1.0.0.gem (100%)
Successfully installed egison-1.0.0
1 gem installed
~~~

## 動作確認
作者の江木さんの記事を参考に四つ子素数を出力してみます。

[続編 - RubyにHaskellよりも強力なパターンマッチを実装した](http://qiita.com/egisatoshi/items/dfa13e45edbc71430048)
[四つ子素数 Wikipedia](http://ja.wikipedia.org/wiki/%E5%9B%9B%E3%81%A4%E5%AD%90%E7%B4%A0%E6%95%B0)

~~~ruby
require 'egison'
require 'prime'
require 'pp'

include Egison

twin_primes = match_stream(Prime) {
  with(List.(*_, _x, __("x + 2"), __("x + 6"), __("x + 8"), *_)) {
    [x, x + 2, x + 6, x + 8]
  }
}

pp twin_primes.take_while { |e|e.last <= 10_000 }
~~~

* 出力

~~~
$ ruby quadruplets_primes.rb
[[5, 7, 11, 13],
 [11, 13, 17, 19],
 [101, 103, 107, 109],
 [191, 193, 197, 199],
 [821, 823, 827, 829],
 [1481, 1483, 1487, 1489],
 [1871, 1873, 1877, 1879],
 [2081, 2083, 2087, 2089],
 [3251, 3253, 3257, 3259],
 [3461, 3463, 3467, 3469],
 [5651, 5653, 5657, 5659],
 [9431, 9433, 9437, 9439]]
~~~

## 参照
[Egison GitHub](https://github.com/egison/egison-ruby)
[Egison RubyGems](http://rubygems.org/gems/egison)
[Egison Ruby スライドショー](http://www.slideshare.net/rakutentech/ruby-egison)
[RubyにHaskellよりも強力なパターンマッチを実装した](http://qiita.com/egisatoshi/items/38f7f8aef32ac67ccd4b)
[続編 - RubyにHaskellよりも強力なパターンマッチを実装した](http://qiita.com/egisatoshi/items/dfa13e45edbc71430048)
Bashをv4.3.25最新版へアップグレードする


### 環境
Ubuntu 14.04LTS
MacOSX Mavericks 10.9.5

### 脆弱性のチェック（CVE-2014-6271）

```
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
```

* 以下のように表示されると脆弱性があるらしい

```
vulnerable
this is a test
```

### Bashのインストール（Ubuntu）

* bashのインストール

```
$ mkdir src
$ cd src
$ wget http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
$ #download all patches
$ for i in $(seq -f "%03g" 0 25); do wget     http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-$i; done
tar zxvf bash-4.3.tar.gz 
$ cd bash-4.3
$ #apply all patches
$ for i in $(seq -f "%03g" 0 25);do patch -p0 < ../bash43-$i; done
$ #build and install
$ ./configure && make
$ sudo make install
$ cd .. 
$ cd ..
$ sudo rm -r src
$ bash --version
GNU bash, バージョン 4.3.25(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>
```

### Bashのインストール（MacOSX)

* 既存のbashの退避

```
$ which bash
/usr/local/bin/bash
$ sudo mv /usr/local/bin/bash /usr/local/bin/bash.old
```

* Bashのインストール

```
$ brew update
$ brew install bash
$ brew upgrade bash
$ bash --version
GNU bash, バージョン 4.3.25(1)-release (x86_64-apple-darwin13.4.0)
Copyright (C) 2013 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

```

### 脆弱性の確認

* 以下のコマンドを実行する。

```
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
```

* 以下のように表示されれば該当の脆弱性はなくなっているらしい

```
bash: 警告: x: ignoring function definition attempt
bash: `x' の関数定義をインポート中にエラーが発生しました
this is a test
```

### 参考URL
* GNU bash の脆弱性に関する注意喚起
https://www.jpcert.or.jp/at/2014/at140037.html


* ask Ubuntu 「What is the CVE-2014-6271 bash vulnerability, and how do I fix it?」
http://askubuntu.com/questions/528101/what-is-the-cve-2014-6271-bash-vulnerability-and-how-do-i-fix-it
[done]斜めにトリミングされた画像を表示する方法


下記の画像のように1〜9に画像をあてはめて切り抜きたいと思っています。
おしえてください。
ライブラリやヒントになるようなURLでも構わないので、よろしくお願いします。

![スクリーンショット 2014-09-25 20.16.19.png](https://qiita-image-store.s3.amazonaws.com/0/1630/2552054c-be22-2b2c-861f-9e40b60fe4ae.png "スクリーンショット 2014-09-25 20.16.19.png")


##前提

1.Chromeで表示できる(他のブラウザでも実現できると尚可)
2.9つの画像と6つの画像の区切りの角度を与えると、上記のような画像を表示するhtmlを返す関数が欲しい
3.html+css+jsのみで実現できる
4.9つの画像はすべて合同な長方形
l2tp-ipsec-vpnによるVPN接続がうまく行かない場合に試してみること

# 結論

以下を追加する．

```text:/etc/ppp/xxx.options.xl2tpd
password "your password"  # nameの直後，usepeerdnsよりも前に記述
mtu 1200
mru 1200
```

# LinuxでVPN接続

LinuxでVPN接続する場合に利用するプログラムに`l2tp-ipsec-vpn`がある．

* [Linux から L2TP/IPsec で VPN](http://blog.hktechno.net/2013/02/linux-l2tpipsec-vpn.html)

これを使ってVPN接続を試みたが，どうにも接続できない．．．

コードレベルでの原因解析は行っていないが，とりあえず安定した接続が得られるようになったので，どうやったかをまとめておく．

# 繋がらない．．．

必要な情報を入力して接続を試みたが，繋がらない．何が起こっているのか調べるために，ログを出力させるように変更した．

```text:/etc/xl2tpd/xl2tpd.confからの抜粋
; noになっていたのをyesに
debug avp = yes
debug network = yes
debug packet = yes
debug state = yes
debug tunnel = yes
```

```text:/etc/ppp/xxx.options.xl2tpdからの抜粋
dubug # debugを有効に
#dump
#record /var/log/pppd
```

`xxx.options.xl2tpd`の`xxx`は，`l2tp-ipsec-vpn`で追加した接続名に読み替えること．

あと，設定ファイルにコメントで書いてあるとおり，これらのファイルは`l2tp-ipsec-vpn`で設定を書き換えると上書きされて元に戻るので注意すること．

ログを確認したところ，どうやら認証で失敗しているようだ．パスワードもちゃんと入力してあるのに，おかしい．．．

Googleで調べたところ，GUIから入力したパスワードがちゃんと供給されていないような記述を見かけた（ページのURIは忘れてしまったが）．そこで，`xxx.options.xl2tpd`にGUIで入力したものを追記した．

```text:/etc/ppp/xxx.options.xl2tpdからの抜粋
name "your name"
password "your password" # ここを追加
```

接続できた．

かなり致命的な不具合だと思うのだが，放置されているのだろうか？

# 接続が安定しない．．．

とりあえず接続できるようになったのだが，接続が安定しない．

* ブラウザでページを見ていると通信エラーが発生することがある
    * Gmailで顕著

VirtualBoxのゲストOSとしてLinuxを動かしていたため，ネットワークアダプターが原因かと思ってNATからBridgeに変えてみた．すると今度は，

* 突然切れて，再接続を試みるが失敗する

挙動は変わったが，どうしてこうなるのか理解できない．．．

Googleでいろいろ調べてみたところ，以下が見つかった．

* [[Openswan Users] OpenSWAN + xl2tpd failing tunnel transmission](https://lists.openswan.org/pipermail/users/2011-April/020387.html)

どうもこれのようだ．`ifconfig`で確認するとMTUが1500になっている．

L2TPでは通常IPsecと併用する．トンネリングする場合は，もろもろのヘッダサイズを差し引いて考える必要があるため，少し減らした値に設定する必要がある．専門外なので細かいことまでは分からないが，利用しているプロバイダやルーターにも依存するようだ．

上記ページでは多くのクライアントで1200に設定していると書いてある．少し小さい気もするが，安全を考えてこれを設定してみた．

```text:/etc/ppp/xxx.options.xl2tpdからの抜粋
mtu 1200
mru 1200
```

安定した．
iOS8 Today Extensionの使い方


#Today Extension


## Today Extensionでできること
App Extension Programming Guide
https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/NotificationCenter.html


### Today Extensionとは
iOS8からの新機能で、端末の画面の上を引っ張ると出てくるところに表示されているカレンダー・天気予報みたいなウィジェットを自分で作ることができる便利な機能です。


### appleが想定しているTodayの利用方法
* today上で簡単なタスクがこなせる
* 興味のある情報が見たいときにtodayを開くことで、すぐ確認できる


### デザイン, UI など
* todayではスクロール操作が難しいので避けた方がいい
* シンプルな操作がいい
* キーボードが使えない
* viewの高さは、端末の高さが上限 ←意外と大切



##実装方法
###準備
File → New → Target でToday Extensionを選ぶ。

###更新直前に呼ばれるメソッド
```Objective-C
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
completionHandler(NCUpdateResultFailed);  //データ取得に失敗
completionHandler(NCUpdateResultNoData);  //データ更新されなかった
completionHandler(NCUpdateResultNewData); //データ更新に成功
}
```
`completionHandler(NCUpdateResultNewData)`を呼ぶとsnapshotがとられ、表示される
ここが1日に1回呼ばれるらしいです。時間は不明。background fetchにちょっと似ている気がしました。



### Today Extensionからアプリを開く
`NSExtensionContext`の`-openURL:completionHandler:`でアプリを開くことができる

ユーザーがパスコードをかけている場合は、パスコードを挟むみたいです。



###どうやって既存のクラスを利用するか
todayはtargetが違うので、Xcode6,iOS8から使えるようになったembedded Frameworkを利用するのがすっきりして良さそうですが、
iOS7にも対応させるなら、todayのcompile Sourcesに必要な物だけ追加するのが楽そうな気がしました。

CocoaPodsを利用している場合は、Podfileの設定も忘れずにした方が良いです。




### アプリ間のデータ共有
iOS8から導入されたApp Groupsを使うと共有できます。
https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW6



##実装していて困ったこと

* たまにdebugされなくなってしまう
* たまに端末が勝手に再起動する
Androidでよく書く基本的な記述集(その２)

今回はトーストやアラートなどに関する記述です。

#トーストを表示したい

```java:MainActivity
Toast.makeText(this, "トースト", Toast.LENGTH_SHORT).show();
```
第一引数がContext,第二引数がメッセージ,第三引数が時間。
時間はToast.LENGTH_SHORTまたはToast.LENGTH_LONGが存在する。
show()メソッドで表示する。

#アラートを表示したい
ビルダーオブジェクトを生成する。

```java:MainActivity
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
```
この生成したオブジェクトにタイトルやメッセージ、リスナーなどをセットして行きます。



```java:MainActivity
alertDialogBuilder.setTitle("タイトル");//タイトルをセットする
```



```java:MainActivity
alertDialogBuilder.setMessage("タイトル");//メッセージをセットする
```



```java:MainActivity
//肯定な場合のボタンをセットする
//第一引数にボタンの表示メッセージ、第二引数にリスナー
alertDialogBuilder.setPositiveButton("肯定", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {

    }
});
```



```java:MainActivity
//中立な場合のボタンをセットする
alertDialogBuilder.setNeutralButton("中立", new DialogInterface.OnClickListener() {
    
     @Override
     public void onClick(DialogInterface dialog, int which) {
     }
});
```



```java:MainActivity
//否定な場合のボタンをセットする
alertDialogBuilder.setNegativeButton("否定", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    }
});
```



```java:MainActivity
//キャンセルが可能かどうか
alertDialogBuilder.setCancelable(true);
```



```java:MainActivity
//セットし終わったらにcreate()メソッドでalertDialogオブジェクトを生成
AlertDialog alertDialog = alertDialogBuilder.create();
```



```java:MainActivity
//show()メソッドでダイアログを表示
alertDialogBuilder.show();
```
今開いているファイルの再読み込み（git-gutter も更新）

Emacs ではテキスト編集だけしたいので、git 操作は基本的に生でやっています。

しかし、`git add/commit` を端末で実行すると git-gutter の情報が更新するタイミングが無かったり、`git checkout` した時にバッファがチェックアウト時の変更についてきてくれない問題があります。

`C-xC-v` だとインタラクション発生するしカーソルが最上部に戻ってきてしまうのでつらい。

インタラクション無しのコマンド一発でファイル再読み込みするためのコマンド作った:

```el
(defun kui/revert-buffer ()
  "Execute `revert-buffer' without confimations if it was not edited only."
  (interactive)
  (if (not (buffer-modified-p))
      (let ()
        (revert-buffer t t)
        (message "revert the current buffer"))
    (error "ERROR: The buffer has been modified")))

;; F5 キーで revert-buffer
(global-set-key (kbd "<f5>")
                'kui/revert-buffer)
```

ファイルバッファ以外では試していないのでどうなるかわかりません。
amazon linuxでbashの脆弱性対策にパッチを当ててソースビルド #shellshock

# 概要
* 昨日今日でbashの脆弱性の話が盛り上がってる [bashの脆弱性(CVE-2014-6271) #ShellShock の関連リンクをまとめてみた - piyolog](http://d.hatena.ne.jp/Kango/20140925/1411612246)
* お家?のaws心配だけどyumあぷでしとけばいいんでしょ? → あぶで来てなくてぐぬぬ
* ソースビルドでパッチあてればいいんですね、わかります(←今ここ
* ※やっつけなので自己責任で+まだ全部の穴は防げてないっぽいですしおすし
* 追記1 yumでも対応したっぽいですね。 [AmazonLinuxにおけるBash脆弱性対応](http://qiita.com/s_osa/items/338032128fcd8a5019d9)
* 追記2 もう一つの脆弱性も対応されたっぽいけどソースはどこだろう? [【Bash脆弱性 続報】 Red Hat Enterprise LinuxおよびFedora向けのセキュリティアップデートがリリース、残されていた脆弱性に対応：CodeZine](http://codezine.jp/article/detail/8162)
* 追記3 パッチは全部当てるっぽい。やってる人いたので手順変更。 [Ubuntu - Bashをv4.3.25最新版へアップグレードする - Qiita](http://qiita.com/ryosy383/items/698b5cafc9b08925bb98)

## やってみた
```
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test
### なるほどだめだ

$ sudo su -
# yum install patch
### patch入ってなかった...

# cd /usr/local/src
# wget https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
# tar zxf bash-4.3.tar.gz
# cd bash-4.3
# wget http://ftp.gnu.org/gnu/bash/bash-4.3-patches/bash43-{001..025}
# cat bash43-{001..025} |patch -p0
### パッチを全部あてる

# export PATH="/usr/bin:$PATH"
# ./configure
# make
# make install
### ただしbashは/usr/local/bin/bashに入る(普段のは/bin/bash)

# mv /bin/bash /bin/bash.old
# ln -s /usr/local/bin/bash /bin/bash
### 取り急ぎ移動させとく

# env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test
### やったぜ
```
　
以上。あとから手順作ったので順番右往左往してたらめんご。
swift サンプルサイト・サンプルコード集

#参考サイト
##逆引き
逆引きSwift(iOS編)
https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios

#サンプルコード
##Game
2048 for Swift
https://github.com/austinzheng/swift-2048

##tools
A Hacker News reader in Swift
https://github.com/Dimillian/SwiftHN

##tutorial
サイト: http://jamesonquave.com/blog/tutorials/
コード: https://github.com/jquave/Swift-Tutorial

##デザインパターン
https://github.com/ochococo/Design-Patterns-In-Swift
case class の key value

```scala
def caseClass2Pair[T <: Product](a: T): Seq[(String, Any)] = {
  a.getClass.getDeclaredFields.map(_.getName).toList zip a.productIterator.toList
}
```

REPL

```
scala> case class Foo(a: Int, b: String)

scala> caseClass2Pair(Foo(1, "two"))
res1: Seq[(String, Any)] = List((a,1), (b,two))
```
領域からはみ出てる文字列をCSSだけで「・・・」にする


site: http://develo.org/text-overflow-ellipsis

サイトを作っていると、デザイン的に一行におさめたい・・。という時があります。

そういう時はJavascriptで文字制限したり。予めサーバー側で文字制限した文字列を渡してもらうなどして対処していたのですが

CSSでできないのかなぁ・・。といろいろ試したところ少しつかいどころに制限はありますができるようです！

[DEMO](http://jsrun.it/kamem/oga4)

1行の場合
---

### HTML

<pre class="prettyprint lang-html"><code>&lt;p&gt;テストテストテストテストテストテストテストテストテスト&lt;/p&gt;</code></pre>

### CSS

<pre class="prettyprint lang-css"><code>p {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}</code></pre>

floatしている場合
---

### HTML

<pre class="prettyprint lang-html"><code>&lt;ul&gt;
	&lt;li&gt;カテゴリー : HTML,CSS,Javascript&lt;/li&gt;
	&lt;li&gt;タグ : jQuery&lt;/li&gt;
	&lt;li&gt; テストテストテストテストテストテストテストテストテスト&lt;/li&gt; 
&lt;/ul&gt;</code></pre>


### CSS
<pre class="prettyprint lang-css"><code>li {
	float: left;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

li:last-child {
	float: none;
}
</code></pre>

ポイントは「last-child」で最後のタグはfloatしないことです。
最後をfloatしないことにより、タグが親タグの幅いっぱいに広がり親タグの範囲での文字制限をすることができます。

最後のタグをfloatしている場合は、タグが次の行に落ちてしまいます。


または幅を指定しての文字制限も可能です。
文字数で制限したい場合には「em」を使うとよいです。

### 5文字制限したい場合のCSS
<pre class="prettyprint lang-css"><code>li:last-child {
	float: none;
	width: 5em
}</code></pre>
Raspberry PiとArduinoでシリアル通信

Raspberry PiとArduinoでシリアル通信をしてみた。

Arduinoには、シリアル通信をエコーするプログラムを書き込んでおく。

```c
void setup()
{
  Serial.begin(9600);
  while (!Serial) {
  }
}

void loop()
{
  if (Serial.available()) Serial.write(Serial.read());
}
```

[Raspberry PiをWiFi接続できるようにしてあるので](http://qiita.com/k_kinukawa/items/bcfa20c6b579a119823a)sshでログイン。
cuコマンドを入れる。

```console
$ sudo apt-get install cu
```

ArduinoとはUSBケーブル一本つなぐだけでOK。

![IMG_3465.JPG](https://qiita-image-store.s3.amazonaws.com/0/8748/f08584f4-3c18-b37c-e12c-b71437759eea.jpeg)

dmesgを確認すると、ttyACM0がそれっぽい。

```bash
$ dmesg
...
...
[89367.152516] cdc_acm 1-1.3:1.0: ttyACM0: USB ACM device
```

ACMとかCDCってなんだ？と思ったら、[こちらのページ](http://www.recursion.jp/avrcdc/driverj.html)によるとUSB上でRS-232Cを使うためのクラスみたいです。

cuコマンドでArduinoと通信する。

```bash
$ cu -l /dev/ttyACM0 -s 9600
Connected.
hogefuga~.
Connection to 10.0.1.26 closed.
```
入力した文字がそのままターミナルに出力される。
終了するときは~.（チルダドット）。
sshも終了されてしまうが。

とりあえず、これでRaspberry PiとArduinoでシリアル通信の確認ができる。
あとはもう少しArduino側のプログラムを書いてやれば、Raspberry PiからArduinoにつながったセンサーのデータを自由に読み出したりアクチュエーターを動かしたりすることができるようになると思う。
XCodeで自動的にビルドバージョンのインクリメント

Testing ok under Xcode 11.4.1

---

Credit goes to [Sekati's gist](https://gist.github.com/sekati/3172554)

In xcode 5, select ```Editor -> Add Build Phase -> Add Run Script Build Phase```
And then drag the added phase under ```Link Binary with Libraries```

####Increment build number on building
```sh
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
```

####Increment version number on archiving
and select Run script only when installing (would effect )

```sh
VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
NEWSUBVERSION=`echo $VERSIONNUM | awk -F "." '{print $3}'`
NEWSUBVERSION=$(($NEWSUBVERSION + 1))
NEWVERSIONSTRING=`echo $VERSIONNUM | awk -F "." '{print $1 "." 2$ ".'$NEWSUBVERSION'" }'`
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $NEWVERSIONSTRING" "${PROJECT_DIR}/${INFOPLIST_FILE}"
```

> **Note:**
>- The above is only valid when initiating (build, archive) from Xcode
>- Make sure the initial build number is integer. (Ex. 1, or 0)
>- PlistBuddy is the helper tool to read and write values to plists
Jadeでhtmlを複数行コメントアウトしたい


Jadeを使ってhtmlの複数行コメントアウトを書きたいとき、
なぜか今までうまいやり方が見つかっていなくて、

```
|<!--
	|<div>
		|<p>hoge</p>
	|</div>
|-->
```

だとか

```
//<!--
//	<div>
//		<p>hoge</p>
//	</div>
//-->
```

だとか、すごい面倒なやり方でやっていました・・。

が、正しいやり方は以下のようです。やっと発見できました。

```
//
	<div>
		<p>hoge</p>
	</div>
```

コメントアウト文 // を書き、実際にコメントアウトさせたい対象をインデントさせるだけ。

簡単ですね。
Laravel で Model オブジェクトを新規データとしてコピーする


`replicate()`っていうのを使う。

こんな感じ。

```php
$user = User::find(1)
$new_user = $user->replicate();
$new_user->name = 'new name';
$new_user->save();
```


内部的には、こんな感じで実装されている。

```php
	/**
	 * Clone the model into a new, non-existing instance.
	 *
	 * @param  array  $except
	 * @return \Illuminate\Database\Eloquent\Model
	 */
	public function replicate(array $except = null)
	{
		$except = $except ?: [
			$this->getKeyName(),
			$this->getCreatedAtColumn(),
			$this->getUpdatedAtColumn(),
		];

		$attributes = array_except($this->attributes, $except);

		with($instance = new static)->setRawAttributes($attributes);

		return $instance->setRelations($this->relations);
	}
```


参考）
http://stackoverflow.com/questions/18322214/laravel4-duplicate-copy-table-row
Raspberry PiをHubot化してSlackで戯れてみる

# やりたいこと
自宅のネットワーク環境にあるRaspberry PiでHubotを動かす。
Slackを使ってHubotと会話する。
Raspberry PiのTCPポート9999番を使ってHubotを起動。

# Rasberry Piの準備
Type-Bを利用。

# Raspberry PiへOSインストール
Arch Linuxを選択。

# ベース環境をインストール
以下のパッケージを導入。
1. Node.js
  `sudo pacman -S nodejs`
2. Redis
  `sudo pacman -S redis`
3. Hubot本体とCoffe-Script
  `sudo npm install -g hubot coffee-script`

# Redisの起動
`sudo systemctl start redis`

# Hubotの実行環境をインストール
Hubotのディレクトリを作成し，そこへHubotの実行環境を構築する。
1. Hubotのディレクトリ作成
　　`cd ~`
   `hubot --create hubot`
2. Hubotの次項環境をインストール
   `cd hubot`
   `npm install`
3. Slackとの連携パッケージをインストール
   `npm install hubot-slack --save`

# Slack側の設定
1. 上部のメニューからConfigure Integrationsを選択
![スクリーンショット 2014-09-25 16.06.22.png](https://qiita-image-store.s3.amazonaws.com/0/52750/d03456e2-8149-9582-3971-bfdfcecd9a6a.png "Menu")
2. Add New IntegrationからHubotを追加
3. Hubotへ施すSlackの固有情報を取得  
Setup InstructionsのExpandボタンを押下。
![スクリーンショット 2014-09-25 16.07.03.png](https://qiita-image-store.s3.amazonaws.com/0/52750/a9b879c5-cb25-3628-3b4b-0f7586005a3f.png "Integrations")
`Configure the following options`の値をメモ。  
HUBOT_SLACK_TOKEN=xxxxxxxxxx  
HUBOT_SLACK_TEAM=yyyyyyyy  
HUBOT_SLACK_BOTNAME=slackbot
4. Slackからアクセスする際のRaspberry Piのアドレスを登録
5. Save Integrationsを押下して設定を保存

# Hubot用の起動スクリプトを作成する
Hubotディレクトリ以下に作成。

```bash:setup.sh

export HUBOT_SLACK_TOKEN=xxxxxxxxxx
export HUBOT_SLACK_TEAM=yyyyyyyy
export HUBOT_SLACK_BOTNAME=slackbot

export PORT=9999

./bin/hubot --adapter slack
```

# 自宅ブロードバンドルーターからポート開放
ポート9999に対する通信を，Raspberry PiのIP(ココでは192.168.24.11)へ転送するように設定。
ブロードバンドルーターはBUFFALOのWZR-HP-G302Hを利用。
![スクリーンショット 2014-09-25 16.29.06.png](https://qiita-image-store.s3.amazonaws.com/0/52750/4ea93772-2b1e-6dea-c5e9-17c43a9866a8.png)

別途，DDNSなどでドメイン名を取得しておけば便利。


# Hubotの実行

`sh setup.sh`


# テスト
![スクリーンショット 2014-09-25 16.26.07.png](https://qiita-image-store.s3.amazonaws.com/0/52750/7963cc42-d11e-e987-2e54-fccec5f14ab4.png "hubot in slack")
できた！
既にgit管理下に入ってしまっているファイルを.gitignoreでしたいとき


### 対処方法１: 管理対象及びファイル自体も削除する

```
git rm -f hogehoge.js
```

### 対処方法２：管理対象のみから削除する

```
git rm --cached -f hogehoge.js
```
OS Xのbashを更新する（brew編）

## Introduction

　先日からbashの脆弱性についてのtweetが投稿されまくっています．環境変数に文字列を代入しているだけのはずが，なぜかevalされるのが原因のようです．
　外部コマンドを実行する際にも，bash経由でコマンドが実行されるとのことです．よって，CGIを動かしているWebサーバに対して，この脆弱性を使ってイタズラするのは意外と簡単な場合もあるようです．
　referenceで紹介しているページには，簡単な確認用のコードが載っているので使ってみてください．

## OS Xのbashを更新しよう

　本来はAppleがCommand Line Toolsを更新してくれると良いのですが，脆弱性を抱えたまま待っているというのも良くないと判断しました．そこで（私のMacは特にサービスを提供しているわけではありませんが）OS Xのbashを更新してみましょう．私は普段からbrewを使っているので，今回もbrewを使います．

```
$ brew update
$ brew upgrade bash
```

「はい，これでお終い」と思ったらreadline絡みでエラーが出てしまいました．

```
$ bash
dyld: Library not loaded: @@HOMEBREW_PREFIX@@/opt/readline/lib/libreadline.6.dylib
  Referenced from: /usr/local/bin/bash
  Reason: image not found
zsh: trace trap  bash
```

そのような場合はreadlineを再インストールすれば良いようです．

```
$ brew rm -f readline
$ brew install readline
$ brew link readline --force
```

 この作業により，```/usr/local/bin/bash```が作られます．ただし元からある```/bin/bash```はそのままです．特にサービスを起動しておらず，パスの順序を正しく設定していればこれで問題無いと思います．
 実際に確認すると，環境変数xの定義に失敗していることが分かります．

```
$ env x='() { :;}; echo vulnerable' bash -c "echo hello"
bash: 警告: x: ignoring function definition attempt
bash: `x' の関数定義をインポート中にエラーが発生しました
hello
```

## reference

[OS XのBashの脆弱性CVE-2014-6271を修正する方法](http://applech2.com/archives/41014500.html)

## 追記（2014/9/30）

Appleより，update版のbashが提供されています．こちらも併せてご利用ください．（まだ何の対策も行っていない人は，こちらのアップデートのみで構いません）

[OS X bash Update 1.0 – OS X Mavericks](http://support.apple.com/kb/DL1769?viewlocale=en_US&locale=en_US)
郵便番号検索で有用なファイルの配布場所

# 情報

[1]: http://www.post.japanpost.jp/zipcode/download.html
[2]: http://jusyo.jp/index.html
[3]: http://zipcloud.ibsnet.co.jp/

現状以下のようなサービスから郵便番号検索に使えるデータが配布されている。



## [日本郵便株式会社][1]

1. CSV

いわずと知れた原本

## [住所.jp][2]

1. CSV
1. TSV
1. Access 2000 (現在MSはsupportしてません)
1. MySQL
1. SQLite

重複した郵便番号でもユニークになる住所コードがある

## [zipcloud][3]

1. CSV

[日本郵便株式会社][1]のデータを簡易加工したデータ



# さいごに


他にも知ってる人がいたら情報プリーズ
【Titanium】dataCollectionを使ったTableViewからListViewへのお引越し


お引越ししたほうが便利だったので、お引越ししました。

dataCollectionというのはSQliteを使ってテーブルを制作した際に、
そのデータを使って自動的に当てはめてレコードをリストに追加していける素晴らしい機能です。

Alloyフレームワークを使ってアプリ制作しているのですが、この機能をテーブルビューの方で使ってると、セクション分けて別のリストを並べる作業がおもったより面倒だったので、思い切って引越ししました。

前の物件はこんな感じです。

```xml
<TableView id="Bookmark" dataCollection="bookmark" dataTransform="transformBookmark" editable="true">
	<TableViewRow 	id="tblrBookmark" id="{id}">
		<ImageView id="imgLogo" 		image="{logo}"/>
		<Label 		id="lblFcName" 		text="{name}"></Label>
		<Label 		id="lblCatchcopy" 	text="{catchcopy}"></Label>
	</TableViewRow>
</TableView>
```
- {id}こんな感じで指定するとテーブルの要素そのまま引っ張ってこれます。
- dataTransformはjsの方に記述してある関数が指定してあります。

```js
function transformBookmark(model) {
	var transform = model.toJSON();
	transform.name = transform.fcName + "\n" + transform.company;
	return transform;
}
```
こんな感じでxmlで代入できるようにしてあります。


新居は此方。新しくセクションもテンプレートも追加出来るので便利ですね。


```xml

<ListView id="Bookmark" defaultItemTemplate="favoriteList" exitOnClose="false" fullscreen="false" onItemclick="openDetail">
	<Templates>
		<ItemTemplate id="tblrBookmark" name="favoriteList">
			<ImageView id="imgLogo"  bindId="imgLogo"/>
			<Label id="lblFcName" 	 bindId="lblFcName"></Label>
			<Label id="lblCatchcopy" bindId="lblCatchcopy"></Label>
		</ItemTemplate>
	</Templates>

	<ListSection id="bookmark" dataCollection="bookmark" dataTransform="transformBookmark">
    	<ListItem template="favoriteList" title="{id}"
                	imgLogo:image ="{logo}"
                	lblFcName:text="{name}"
                	lblCatchcopy:text="{catchcopy}"
                	accessoryType="Ti.UI.LIST_ACCESSORY_TYPE_DISCLOSURE"/>
       </ListSection>
	</ListView>

```


リストビューは現行バージョン（SDK3.3)でもまだ使いにくい部分は多いですけど、非常に便利ですね。

公式ドキュメントは詳しく書いてあって分かりやすいんですけど、日本語の情報ももっと公開されて欲しいですね(´・ω・`)
データ分析と統計処理の基本的な手順の整理 (4)

[前回](http://qiita.com/ynakayama/items/8fe96b4f5ba6a225b1de)の続きで[社会統計の 3 つのポイント](http://qiita.com/ynakayama/items/7917f0f5eb556862642c)のうち 2 つ目の標本から母集団を推測する話です。このあたりは今までに何度も書いてきた部分なので復習してみましょう。

## 標本抽出

分析してこれから知りたいと思う集団全体を **母集団 (population)** と呼びます。


[母集団からの標本抽出](http://qiita.com/ynakayama/items/1494cf4fdf988e1c7c7c)や[標本抽出法](http://qiita.com/ynakayama/items/d7f6989a4e17ed8a05ec)についてはすでに書きました。

統計学では多くの場合母集団の平均や分散があらかじめ判明していることはほとんどなく、それらを推定するために検定などをします。母集団から抽出した標本の標本調査によって母集団の性質を一定の信頼度によって調べることができます。

母集団について完全に知ることが困難な理由はいくつかあります。
* 日本人全体、世界全体という風に、母集団が非常に大きな主語となっている
* 母集団の数自体は大きくないが、出荷予定あるいは出荷済み製品すべての検査が困難であるといったように、全数調査が現実的でない
* 来年の経済成長率のように将来の要素を含むため現時点では測定が不可能であり推定せざるをえない
といったものが考えられます。

## 推定

現実の経済分析や政策の評価、顧客調査などのためにデータを数値として利用するには、その平均や分散がわからなければなりません。母数は現実の問題では未知であり、手元のサンプルから **推定 (estimation)** することになります。

**区間推定 (interval estimation)** は母数が含まれる値の範囲を推定します。この際に必要な情報は主に次のものです。

* 標本平均
* 標本比率
* 標準誤差の推定値
* 推定の誤差 (標準誤差) をどの程度まで抑えるか

統計学で言う自由度とは、自由に設定できる余地のある値の数のことを指します。[自由度と検定](http://qiita.com/ynakayama/items/1cc7fa06ad4315425c0c)では自由度の定義と検定への応用を説明しました。

不偏性とは、推定量の期待値をとった場合、真の母数の値となることです。つまり平均的に過大・過小の推定がないことです。これを満足する推定量が **不偏推定量 (unbiased estimator)** です。

標本平均、標本分散の不偏性はとくに大切です。標本平均はつねに母平均の不偏推定量になります。

```py3
# 500 個の正規分布にしたがうサンプルデータを用意する
data = np.random.normal(loc=100, scale=25, size=500)

# 平均を求める
mu = np.mean(data)
#=> 99.416556898424659

# 分散を求める
s2 = np.var(data, ddof=1) # 不偏分散
#=> 685.08664455245321

# 90% 信頼区間
from scipy.stats import norm
rv = norm()
z = rv.ppf(0.995)

# 100(1-σ)% 信頼区間
r = np.array([-z, z]) * np.sqrt(25/500)
#=> array([-0.36780045,  0.36780045])
mu + r
#=> array([ 99.04875645,  99.78435735]) # 区間推定
```

上の例では N = 500 としていますが、この N が大きくなれば[大数の法則](http://qiita.com/ynakayama/items/6b89cb451a73ae7a8990)に基づき正規分布の値に近づいていきます。

## 検定

母数の分布について何らかの仮定をした際には[分布の適合度を検定](http://qiita.com/ynakayama/items/5ab69d6d06d61148a689)します。各水準の母平均に差があるか検定するには[分散分析 (analyds of variance)](http://qiita.com/ynakayama/items/d332d77ae40a6827345b)をします。

[等分散仮説の検定](http://qiita.com/ynakayama/items/a8d9da8215670b8d7317)において[母分散が等しいか否かに関わらず、 t 検定においてはウェルチの検定を使う]
(http://qiita.com/ynakayama/items/b9ec31a296de48e62863)べきです。

実際のところ、最近の R で t 検定をすると既定でウェルチの検定がおこなわれることになります。 Python (SciPy) でも同様にするべきです (equal_var=False オプションを指定)。とはいえ母分散が既知かどうか、未知であるが等しいか、等しいとは言えないかということは把握しておきましょう。

次回はこの続きで、変量の関連を調べる話です。
IntelliJ IDEAでpropertiesファイルを日本語(各国の言語)で表示する

IntelliJ IDEAでpropertiesファイルを日本語(各国の言語)で表示する方法について紹介します。

基本的には、File > Settings > File Encodings を選択し、画面最下部の「Transparent native-to-ascii conversion」をチェックするだけです。![n2a.png](https://qiita-image-store.s3.amazonaws.com/0/43869/2ee001f5-a697-3375-1dba-4db7b60f5576.png)

このチェックを入れておくと、native2asciiにより自動的に読み取り可能な状態で表示できるようになります。

![edit.png](https://qiita-image-store.s3.amazonaws.com/0/43869/3014f912-f820-136a-4fe5-809a2facdac6.png)

上のように日本語以外の文字列も変換されています。

プロパティエディタ下部の「Recource Bundle」タブをクリックすると言語ごとのプロパティ値を並べて表示することもできます。

![multilang.png](https://qiita-image-store.s3.amazonaws.com/0/43869/4f7057bf-44cf-bba1-8a78-b38e32d6f384.png)
Cakephp model エラーメッセージの日本語化（プラグイン対応版）

# モデル

```php:AdminsAppModel.php
<?php

App::uses('AppModel', 'Model');

class AdminsAppModel extends AppModel {
	public function beforeValidate($options = array()) {
		foreach ($this->validate as $key => $errors) {
			foreach ($errors as $check => $error) {
				$this -> validate[$key][$check]["message"] = __d('admins', $check);
			}
		}
		parent::beforeValidate($options);
		return true;
	}
}
【取り急ぎ】UbuntuにShellShock(bash脆弱性4種盛) 対策のパッチを適用

#10月15日以前にお読みいただいた方へ
更に更にパッチが公開されております。アップグレードを強く推奨します。

これで報告されていた全ての脆弱性にパッチが当たった……のではないかな。

#極めて重大な脆弱性とは

OpenSSL脆弱性HeartBleed以上の影響との噂も。
とりま「shellshock」で検索してください。

[piyolog bashの脆弱性(CVE-2014-6271) #ShellShock の関連リンクをまとめてみた](http://d.hatena.ne.jp/Kango/20140925/1411612246)


Ubuntuにもパッチが来てます。
LTSなら10.04からパッチが配信されています。
[USN-2362-1: Bash vulnerability](http://www.ubuntu.com/usn/usn-2362-1/)
[USN-2363-2: Bash vulnerability](http://www.ubuntu.com/usn/usn-2363-2/)
[USN-2364-1: Bash vulnerabilities](http://www.ubuntu.com/usn/usn-2364-1/)
[USN-2380-1: Bash vulnerabilities](http://www.ubuntu.com/usn/usn-2380-1/)

##2014-10-15時点でのbash最新版
Ubuntu 14.04 LTS:bash 4.3-7ubuntu1.5
Ubuntu 12.04 LTS:bash 4.2-2ubuntu2.6
Ubuntu 10.04 LTS:bash 4.1-2ubuntu3.5

#当環境での実施内容

$ sudo aptitude update
$ aptitude -s -V upgrade bash
$ sudo aptitude -V upgrade bash
$ aptitude show bash 
$ sudo reboot

aptitude -s -V upgrade bash で、アップグレード前のバージョンの上がり方と依存関係を確認。

#余談
ITmediaの記事では「（2）bashを代替シェルに入れ替える」とあるので、
zsh普及のチャンスかもしれませんなあ（他人事

タイトルを４種盛にしました。これで終わってくれる事を願います。
そいやfedoraがbashからdashに変えるか、ってな話があったんですが、
Debian,Ubuntuの方はどうなんだろう。dashの本家だし。
Macのウインドウの移動とリサイズを手軽に


##目的
Macのウインドウの移動はタイトルバーをドラッグ、
リサイズはウインドウ右下をドラッグで行いますが、
そこまでカーソルを移動してドラッグするのが面倒なので、
BetterTouchToolsを使ってもっと簡単に行えるように設定します。

##インストール
[BetterTouchTool](http://blog.boastr.net/downloads-secondbar-bettertouchtool-2/)からダウンロードしてインストールしてください。

##設定
BetterTouchToolsをインストールしたらアプリを開いてください。
![スクリーンショット-2014-09-24-16.35.jpg](https://qiita-image-store.s3.amazonaws.com/0/34439/b04f9a49-59ea-4492-1777-68d6e2b9b273.jpeg "スクリーンショット-2014-09-24-16.35.jpg")


1. Advanced
2. Action Settings (Window Snapping etc.)
3. Window Moving & Resizing

をクリックします。

####4のWindow under cursorを選択
これで対象のウインドウ上にカーソルがあれば、そのウインドウがアクティブでなくても移動/リサイズすることが出来ます。
と思っていたら、その隣のFocused Windowを選択しても同じ動作になりました。
どちらでもいいのかも・・・

####5のMove windows:でウインドウの移動に使用する修飾キーを指定
ウインドウ上にカーソルを起き、ここで指定したキーを押しながらマウスを動かすとウインドウを移動させることが出来ます。

私はShift + Ctrlを指定しました。
最初Commandを指定していたのですが、ブラウザで新規タブを開くのにCommand + クリックを使う際、Commandを押しながらリンクにカーソルを合わせていたらウインドウが移動して使いにくかったので、Shift + Ctrlに変更しました。

※Commandの次はShift単体にしたのですが、文字列選択の際にShiftを押したままマウスを動かしたらウインドウが移動してしまったので、Shift + Ctrlにしました。
Shift + Ctrlならホームポジションからの移動が少なく押し間違いもしにくいので。

#####6のResize windows:でウインドウのリサイズに使用する修飾キーを指定
ウインドウ上にカーソルを起き、ここで指定したキーを押しながらマウスを動かすとウインドウをリサイズさせることが出来ます。

####7のbring moving window to frontのチェックを外す
このチェックを外すことでアクティブなウインドウの背後にあるウインドウを非アクティブのまま移動/リサイズさせることが出来ます。