OmniAICreator/Qiita-1.07M huggingface dataset:
Servlet3.0でFilterの順序を指定する

`@WebFilter` アノテーションで Filter を定義できるようになったけど、順番は指定できない。残念です。

順番を指定したい場合は `web.xml` に記述する。
ただし、 `@WebFilter` で `filterName` と `urlPatterns` を指定していれば、 `url-pattern` タグは内容を省略可能。

```java:HogeFilter.java
package sample.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(filterName="hoge-filter", urlPatterns="/hoge")
public class HogeFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
    }

    @Override public void init(FilterConfig filterConfig) throws ServletException {}
    @Override public void destroy() {}
    
}
```

```java:FugaFilter.java
package sample.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(filterName="fuga-filter", urlPatterns="/fuga")
public class FugaFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
    }

    @Override public void init(FilterConfig filterConfig) throws ServletException {}
    @Override public void destroy() {}
    
}
```

```xml:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">
  
  <filter-mapping>
    <filter-name>hoge-filter</filter-name>
    <url-pattern />
  </filter-mapping>
  
  <filter-mapping>
    <filter-name>fuga-filter</filter-name>
    <url-pattern />
  </filter-mapping>
</web-app>
```

`url-pattern` タグを完全に消してしまうと XML のスキーマ定義に違反してしまうので、タグだけ書く必要がある。

#参考
- [java ee - How to define Servlet filter order of execution using annotations - Stack Overflow](http://stackoverflow.com/questions/6560969/how-to-define-servlet-filter-order-of-execution-using-annotations)
Ruby勉強メモ


勉強した(または教えてもらった)分法やメソッドのちょっとした使い方を適当に更新していく。

###1.gets

キーボードから入力された値を文字列で返すメソッド。しかも改行される。

```ruby:sample_gets.rb

puts gets #=>キーボードで入力した値が文字列で出力される。 

#キーボードで1を入力
puts gets.to_i #=>1(数値)

#キーボードで1を入力
puts gets.to_s #=>"1"(文字列)

#プログラムを起動してから、入力をさせる時はこんな使い方をする。
puts ">このまま実行する場合は「Y」、終了する場合は「N」を入力して下さい。"
input = gets.to_s

if input == "Y"
	処理1
elsif input == "N"
	処理2
end

```

###2.%w

要素に空白を含まない文字列の配列を作成する時、「""」や「''」を使用せずに配列が作成出来る。

```ruby:sample_%w.rb

array = %w[red blue yellow] # array = ["red","blue","yellow"]と同じ

```

###3.puts "#{var}"

「""」内に#{var}を入れることで、Rubyで作成した式が展開される。
ちなみに「''」ではそのまま表示される。

```ruby:sample.rb

var = "sample"
puts "#{var}が表示された" #=>sampleが表示された
puts '#{var}が表示された' #=>#{var}が表示された

```

その他随時更新。
Shellの出力でカーソルを移動させる

#文字を1文字削除

```bash
$ echo "Hello World\b\b\b\b\bWorld"
Hello World
```

#カーソルを左に移動

```bash
$ echo "Hello World$(tput cub 5)World"
Hello World
```

#カーソルを上に移動

```bash
$ echo "\n$(tput cuu1)Hello World"
Hello World
```

`$(tput cuu1)`の代わりに`\033[A`でもよい

#カーソルを右に移動

```bash
$ echo "Hello \n$(tput cuu1)$(tput cuf 6)World"
Hello World
```

`$(tput cuf1)`の代わりに`\033[C`でもよい

#現在の行を削除

```bash
$ echo "Hello \n$(tput cuu1)$(tput dl1)Hello World"
Hello World
```

`$(tput dl1)`の代わりに`\033[M`でもよい

#参考

http://wiki.bash-hackers.org/scripting/terminalcodes
http://linuxcommand.org/lc3_adv_tput.php
RuboCop | Style/AlignHash | EnforcedHashRocketStyle

# RuboCop | Style/AlignHash | EnforcedHashRocketStyle

## 概要
RuboCopの「Style/AlignHash EnforcedHashRocketStyle」警告について。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:---|:---|:---|:---:|
|EnforcedHashRocketStyle|key|キー左揃|○|
|EnforcedHashRocketStyle|separator|キー右揃、=>を揃える|--|
|EnforcedHashRocketStyle|table|キー左揃、=>を揃える|--|

## EnforcedHashRocketStyle

key, separator, tableの各値での rubocop 実行結果をまとめます。

### 検証プログラム

enforced_hash_rocket_style.rb

~~~ruby
h_key = {
  'name' => 'tanaka',
   'age' => 33
}

h_separator = {
  'name' => 'tanaka',
   'age' => 33
}

h_table = {
  'name' => 'tanaka',
  'age'  => 33
}

print h_key
print h_separator
print h_table
~~~

### EnforcedHashRocketStyle key(デフォルト) でチェックした場合

.rubocop.yml

~~~yaml
AlignHash:
  EnforcedHashRocketStyle: key
~~~

キーが右揃えになっている h_separator のみ警告発生

~~~ruby
$rubocop enforced_hash_rocket_style.rb
Inspecting 1 file
C

Offenses:

enforced_hash_rocket_style.rb:8:4: C: Align the elements of a hash literal if they span more than one line.
   'age' => 33
   ^^^^^^^^^^^

1 file inspected, 1 offense detected
~~~
### EnforcedHashRocketStyle separator でチェックした場合

.rubocop.yml

~~~yaml
AlignHash:
  EnforcedHashRocketStyle: separator
~~~

キーが左揃えになっている h_key/h_table で警告発生

~~~ruby
$rubocop enforced_hash_rocket_style.rb
Inspecting 1 file
C

Offenses:

enforced_hash_rocket_style.rb:3:3: C: Align the elements of a hash literal if they span more than one line.
  'age' => 33
  ^^^^^^^^^^^
enforced_hash_rocket_style.rb:13:3: C: Align the elements of a hash literal if they span more than one line.
  'age'  => 33
  ^^^^^^^^^^^^

1 file inspected, 2 offenses detected
~~~
### EnforcedHashRocketStyle key(デフォルト) でチェックした場合

.rubocop.yml

~~~yaml
AlignHash:
  EnforcedHashRocketStyle: table
~~~

ファットアローが揃っていない h_key で警告発生
キーが右揃えになっている h_separator で警告発生

~~~ruby
$rubocop enforced_hash_rocket_style.rb
Inspecting 1 file
C

Offenses:

enforced_hash_rocket_style.rb:3:3: C: Align the elements of a hash literal if they span more than one line.
  'age' => 33
  ^^^^^^^^^^^
enforced_hash_rocket_style.rb:8:4: C: Align the elements of a hash literal if they span more than one line.
   'age' => 33
   ^^^^^^^^^^^

1 file inspected, 2 offenses detected
~~~

## 補足
この警告は `rubocop -a` で修正可能です。
Frisby.jsのTips（Custom Matcherの使い方）

REST APIのテストフレームワークである[Frisby.js](http://frisbyjs.com)のTips。

```json:sample.json
{
    "member": [
        {
            "name": "tomute",
            "hobby": "ski"
        },
        {
            "name": "tom",
            "hobby": null
        },
        {
            "name": "kate",
            "hobby": "football"
        }
    ]
}
```

上記のようにnullが含まれるようなJSONが返ってくるAPIを、以下のようにexpectJSONTypes()でStringとして検証すると、「Error: Expected 'null' to be type 'string' on key 'hobby'」というようなエラーになってしまう。

```js:test_spec.js
frisby.create('Test using a path as the paramater')
    .get('http://localhost:3000/test')
    .expectJSONTypes('member.*', {
        "name": String,
        "hobby": String
    })
    .toss()
```

このような場合にはFrisby.jsが用意するCustom Matcherを利用して、以下のような検証コードにすれば良い。

```js:test_spec.js
frisby.create('Test using a path as the paramater')
    .get('http://localhost:3000/test')
    .expectJSONTypes('member.*', {
        "name": String,
        "hobby": function(val) { expect(val).toBeTypeOrNull(String); }
    })
    .toss()
```

Frisby.jsが用意するCustom Matcherには他にもtoMatchOrBeNull、toMatchOrBeEmpty、toBeTypeOrUndefined等がある。
また自身でCustom Matcherを作成する事も可能である。
Ruby, Pythonのモジュールインストールガイド

# はじめに
Ruby / PythonなどのLL言語は簡単に開発を始めることができ、多くの便利なライブラリ（正式にはモジュールですので以下モジュール）が開発されています。例えば以下の例が挙げられます。

* Rubyのモジュール: Nokogiri <br> 使用例:　http://shgam.hatenadiary.jp/entry/2013/11/09/192509

* Pythonのモジュール: NumPy <br> 使用例:  http://qiita.com/wellflat/items/284ecc4116208d155e01

このようなモジュールを使うことで、短い時間で開発が可能です。しかし、LL言語の取っ掛かりやすさとは異なり、モジュールの導入はお世辞にも簡単とは言えない現状だと思います。私自身、モジュールのインストール時にエラーが発生し、そのメッセージを元に解決策を探すことが良くあります。解決策が見つかったとしても「よく分からないが何となくこれで直った」という例がしばしばあり、そのような情報だけでは応用がききません。

モジュールインストールは、基本的には単純な作業をするだけなので慣れれば簡単です。しかし自力で問題を解決できるようになるための、まとまった情報が無いようなので記録していこうと思います。

## 対象
OS: *nix系
言語: Ruby / Python
読者: RubyやPythonをインストールし、プログラムを書き始めてみた人

## ゴール
この投稿は、Ruby / Pythonでのモジュールインストールの基本的な知識と、今後起こりうるトラブルに対し応用のきく対応方法を文章化することを目的としています。

# モジュールの種類
読者の方ならご存知の通り、モジュールはソースコードの中で以下のように読み込みます。
(例1)
Ruby:
`require "some_module"`
Python:
`import "somemodule"`

このように読み込まれるモジュールですが、実際にロードしているファイルによって説明のため以下の2つのパターンに分けることができます。

## 1. ピュア Ruby / Python モジュール
この場合、(例1)でロードしているファイルはモジュール検索対象ディレクトリ内にある
Ruby:
some_module.rb
Python:
somemodule.py
です。
これらのファイルの中で標準ライブラリ以外モジュールを追加で読み込んでいなければ、そのファイルで依存関係は完結しています。
素のRuby/Pythonコードなので、ご想像付くと思いますがインストールは非常に簡単です。

## 2. 拡張モジュール
この場合、(例1)でロードしているファイルは、同じくモジュール検索対象ディレクトリにある
Ruby:
some_module.so
Python:
somemodule.so
です。インストールでつまづきやすいモジュールはこれです。

このファイルは、CやC++でコンパイルされたプログラム（実質的には）です。
従って、このような拡張モジュールを使うためにはインストール作業中にCやC++のソースコードをコンパイルする必要があります。
もちろんコンパイル済みのファイル（バイナリ）が提供されていれば必要はありません。しかし、提供されているケースはそれほど多くなく、大抵はコンパイルを行う必要があります。

すなわち、インストール中のコンパイルで発生する問題や依存関係の解決が、Ruby / Python モジュールのインストールトラブルの解決です。

解決策を簡潔にまとめたいところですが、自力で解決をするために、モジュールコンパイル時の問題はどこで発生するのか、依存関係はどこで生じるのかを次にまとめたいと思います。

# モジュールはどのように構成されているか
## 依存関係（Ruby API / Python API）
## 依存関係（C / C++）
## ビルドオプション

# モジュールのインストール
## 案1: OSのパッケージ管理システムを使う
## 案2: Ruby / Pythonのパッケージ管理システムを使う

# インストールに失敗した時の対処

# ケーススタディ

<br>
<br>
ゆっくりペースになると思いますが、随時更新していきます。

（2014.06.17）「モジュールの種類」の内容を追加しました
Mining of Massive Datasets Chap. 1.2


[Mining of Massive Datasets](http://infolab.stanford.edu/~ullman/mmds.html)の1.2節の概要を書きます。

# 1.2 Statistical Limits on Data Mining


- 大量データの中に隠れているunusual eventsを見つけること
- "Bonferroni's Prnciple"を含むデータマイニングに対する過信について議論する

# 1.2.1 Total Information Awareness


- Total Information Awareness([wikipedia](http://en.wikipedia.org/wiki/Total_Information_Awareness),[ALC](http://eow.alc.co.jp/search?q=Total+Information+Awareness))
  - 2002年、ブッシュ政権がテロリストの攻撃を追跡するためにクレジットの引き落としなど様々な情報からマイニングすることを推奨していた
  - その時作られたDARPAのプロジェクト。プライバシーの問題を指摘され終了している
- 技術的な懸念
  - 「テロリスト」かどうかは、どれだけ念入りに「探す対象」を定義するかに依存している
  - テロリストに見える振る舞いを見つけようとすることも、無実に見える行動を見つけないことも、テロリズムではないが違法な行動も見つけることができる
  - それにより、警察が訪れることも起こりうる

# 1.2.2 Bonferroni's Principle

- 大規模データのマイニングでは、意味のないパターンを「発見」してしまうリスクがある
  - 一定量のデータからある種のイベントを探そうとする時、ランダムなデータからでもイベントとして判断される(偽陽性)データが存在し、その数はデータサイズに応じて増える
- Bonferroniの補正([★](http://d.hatena.ne.jp/NATROM/20040823))をおこなうと、統計的に偽陽性が得られる確率を目標とする値に調整できる
  - 有意水準を検定の回数で割ることで、試行回数を増やして出やすくなる有意差を厳し目にチェックできる
- Bonferroniの補正を雑にしたものがBonferroni's Principle

# 1.2.3 An Example of Bonferroni's Principle
- 感覚的には[誕生日のパラドックス](http://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9)に似ているかも

## 設定
犯罪組織のペアがホテルで、悪事の密談をしているかを検出したいとする

## 前提

1. 犯罪組織の可能性を疑われている追跡対象者は10億人いる
2. 全員100日に1日はホテルに行く
3. 1つのホテルは100人入ることができ、100,000ホテル存在する(つまり、10億人の1％はある日どこかのホテルを訪れることができる)
4. 1000日のホテルの記録を調べることができる

## 計算
AさんとBさんが、ある日同じホテルに居る確率は

$ Aさんがあるホテルに居る確率 \times Bさんがあるホテルに入る確率 \times 2つのホテルが同じ確率 = $
$ 1/100 \times 1/100 \times 10^{-5} = 10^{-9} $

AさんとBさんが、2日同じホテルにいる確率は

$ 10^{-9} \times 10^{-9} = 10^{-18} $

日付の組み合わせは

$ _{1000}C_2 = 5 \times 10^{5} $

AさんとBさんが特定の2日に、同じホテルにいる確率は

$ 5 \times 10^{5} \times 10^{-18} = 5 \times 10^{-13} $

人の組み合わせは

$ _{10^{9}}C_2 = 5 \times 10^{17} $

疑わしい人のペアの数は

$ 5 \times 10^{17} \times 5 \times 10^{-13} = 250,000 $


もし、本当に犯罪活動をしていたのが10ペアだとした時、警察は10ペアのために25万人を捜査しないといけない。
yumdownloaderでソースrpmをダウンロードする

# 環境

```
$ cat /etc/centos-release
CentOS release 6.5 (Final)
```

# 手順

## yum-utilsのインストール

```
$ sudo yum install yum-utils
```

## ソースrpm用リポジトリの追加

拡張子が`*.repo`ならロードされるので、既存ファイルを書き換えなくてもファイルの追加でOK。
バージョンを動的に指定する方法がわからなかったので、今回はとりあえず決め打ちで。

```/etc/yum.repos.d/CentOS-Base-Src-6.5.repo
[base-src]
name=CentOS-6.5 - Base - Source
baseurl=http://vault.centos.org/6.5/os/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#released updates
[updates-src]
name=CentOS-6.5 - Updates - Source
baseurl=http://vault.centos.org/6.5/updates/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that may be useful
[extras-src]
name=CentOS-6.5 - Extras - Source
baseurl=http://vault.centos.org/6.5/extras/Source/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
```

リポジトリがされたことを確認。

```
$ yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
repo id                               repo name                                               status
base                                  CentOS-6 - Base                                         4,802
base-src                              CentOS-6.5 - Base - Source                              2,132
extras                                CentOS-6 - Extras                                          12
extras-src                            CentOS-6.5 - Extras - Source                                9
updates                               CentOS-6 - Updates                                        745
updates-src                           CentOS-6.5 - Updates - Source                             200
repolist: 7,900
```

## ソースrpmのダウンロード

`yumdownloader`コマンドでソースrpmをダウンロードする。

```
$ yumdownloader --source neon
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
neon-0.29.3-3.el6_4.src.rpm                                                  | 875 kB     00:02
```

# 参考

http://server-setting.info/centos/yum-srpm-download.html
JavaでThread-safeなequalsを実装する


Javaで`equals`をThread-safeに実装する話です。

まずはThread-safeでない`equals`の実装を示します。

```java:Thread-safeでない実装
class Foo {

	private int[] data;

	...

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (!(o instanceof Foo)) return false;

		Foo that = (Foo) o;

		for(int i = 0; i < data.length; i++) {
			if(data[i] != that.data[i]) {
				return false;
			}
		}

		return true;
	}

	...
}
```

次はThread-safeな`equals`の誤った実装を示します。

```java:誤った実装
public boolean equals(Object o) {
	if (this == o) return true;
	if (!(o instanceof Foo)) return false;

	Foo that = (Foo) o;

	synchronized(this) {
		synchronized(that) {
			for(int i = 0; i < data.length; i++) {
				if(data[i] != that.data[i]) {
					return false;
				}
			}
		}
	}

	return true;
}
```

この実装は一見うまく動くように見えますが、
次のような過程でデッドロックが発生します。

1. スレッド1が`foo1#equals(foo2)`を呼んで`foo1`のロックを獲得する。
1. スレッド2が`foo2#equals(foo1)`を呼んで`foo2`のロックを獲得する。
1. スレッド1が`synchronized(that)`で`foo2`のロック獲得を待つ。
1. スレッド2が`synchronized(that)`で`foo1`のロック獲得を待つ。

デッドロックが発生する理由は単純です。
2つ以上のオブジェクトのロックを獲得する際に、
ロックの獲得順序を一定にするという基本原則に反しているからです。

しかし、`foo1`と`foo2`は対等です。これらに一定の順序付けをすることは可能でしょうか。

それは、`System#identityHashCode(Object)`を使うと可能です。
`identityHashCode`は引数のオブジェクトを一意に表すint型の値を返します。
例えばこの値が大きい方から先にロックを獲得するというルールを定めると、
2つのオブジェクト間で一定の順序でロックを獲得することができます。

最後に、`identityHashCode`を利用したThread-safeな`equals`の実装を示します。

```java:正しい実装
public boolean equals(Object o) {
	if (this == o) return true;
	if (!(o instanceof Foo)) return false;

	Foo that = (Foo) o;

	// Decide lock order
	Foo firstLock, secondLock;
	if(System.identityHashCode(this) > System.identityHashCode(that)) {
		firstLock = this;
		secondLock = that;
	} else {
		firstLock = that;
		secondLock = this;
	}

	// Lock and Compare
	synchronized(firstLock) {
		synchronized(secondLock) {
			for(int i = 0; i < data.length; i++) {
				if(data[i] != that.data[i]) {
					return false;
				}
			}
		}
	}

	return true;
}
```

それぞれの実装を3000回試行したところ、
誤った実装ではデッドロックが14回発生しましたが、正しい実装では0回でした。
Amazon SES を使ってメールを送ろう(Eメール認証編)


# Amazon SESとは
Amazon Simple Email Service(以下 SES)は大規模でEmail配信できるシステムです。従量課金で使えてPostfixのような煩わしい設定などと格闘しなくても済むすばらしいサービスです。

突然Emailの配信システムが必要になったときにシステム構築しようとしたら多額の費用がかかってしまいますよね。

SESなら1000通当たり0.1$という値段でメールを送信してくれます。

ただ、SESを使用するときには以下の点に注意しなければいけません。

* 初期状態では1日に200通、1秒間に1送信、送信先への認証必須という制限があります。
* 制限以上に送信する場合や多数の人に送信する場合は申請を通す必要があります。

# じゃあ使ってみよう

## コンソールへアクセス
まずはamazonのマネージメントコンソールにログインします。

![ses01.png](https://qiita-image-store.s3.amazonaws.com/0/6027/9b721720-2a13-2709-a778-5143d3c02aad.png "ses01.png")


マネージメントコンソールのメニューからSESを選択します。
その後にSESのロケーションを選択します。

* 米国東部 (北バージニア)
* 米国西部 (オレゴン)
* EU (アイルランド)

ここでは日本に近いであろうオレゴンを選択しました。

## Eメールアドレスの認証

![ses02.png](https://qiita-image-store.s3.amazonaws.com/0/6027/27339ca1-30e7-363b-2e2e-8af7fe9ca4d7.png "ses02.png")

認証にはドメイン認証とEメールアドレスの認証の2つがあります。
今回はEメールアドレスの認証を行います。
左メニューのVerified SendersのEmail Addressesを選択します。

![ses03.png](https://qiita-image-store.s3.amazonaws.com/0/6027/2d4c95ef-db53-c902-162c-4427940da185.png "ses03.png")


画面の上にVerify a New Email Addressというボタンがあるのでそれをクリックし、Eメールアドレスを入力します。
しばらくするとそのアドレスにメールが送られてくるのでURLをクリックすればStatusがverifiedになると思います。これでEメールの送信元、送信先として使うことができるようになりました。
[Rails4,Rails5] erbファイルをSlimに一括変換するGemとRubyワンライナー

## HTMLやerbをslimに変換する「html2slim」

slim-templateで公開されている [html2slim](https://github.com/slim-template/html2slim) は、htmlやerbを、slimに変換してくれます。

````
gem install html2slim
````

Gemをインストールすると、html2slimとerb2slimのコマンドが使えるようになります。

## app/views/ 以下の.erbを、slimに一括変換するRubyのワンライナー

````
for i in app/views/**/*.erb; do erb2slim $i ${i%erb}slim && rm $i; done
````

ファイルの書き換えではなく、同名の.slimファイルを新規に作成し、古い.erbファイルを削除。erb2slimの-d optionは使われていません。
Swiftでは複数の戻り値を一度にreturnできる。String, Integer, Doubleを同時にreturnするサンプル

# String, Integer, Doubleを同時にreturnする
```lang:メソッド.swift
func mixedValuesReturnTest() -> (String, Integer, Double) {
    return ("test", 100, 3.79)
}
```

```lang:呼び出し元.swift
var mixedValues = mixedValuesReturnTest()
println(mixedValues.0)
println(mixedValues.1)
println(mixedValues.2)
```

### 実行結果
test
100
3.79

# 分かりにくいので戻り値それぞれに名前をつける
```lang:メソッド.swift
func namedValuesReturnTest() -> (name: String, level: Integer, point: Double) {
    return ("test", 100, 3.79)
}
```

```lang:呼び出し元.swift
var namedValues = namedValuesReturnTest()
println(namedValues.name)
println(namedValues.level)
println(namedValues.point)
```

### 実行結果
test
100
3.79

他の言語では常識なんでしょうか？ Obj-Cしか知らないとびっくりしますね！

# 補足
* 通常は"mixedValues."のドットを打ったタイミングで、補完候補が表示されます。Integer level, String name, Double point という具合に。(表示順はメソッドで定義した順番とは異なり、戻り値の名前の文字コード順です)
* ソースコードの中に日本語があると補完が効かない場合があるようです。補完が効かない場合は日本語の削除をためしてみてください。
出典： [xcode6βで補完機能を使う方法 - Qiita](http://qiita.com/ktanaka117/items/73c1b802faa2e28d3332)(助かりました！どうもありがとうございます！)
* 例によって、お気づきの点がありましたら気軽にコメントおねがいします
「オーバークロックで社会貢献！」(BOINC & WCG) ＠ 名古屋ギークバー

「オーバークロックで社会貢献！」(BOINC & WCG) ＠ 名古屋ギークバー
http://geekbar.doorkeeper.jp/events/12114
オーバークロック (Overclocking) とは、クロック同期設計の機器の動作クロックの周波数を定格の最高を上回る周波数にすることを指します。

簡単に言うと、CPUにおいて表示性能以上の性能を引き出すものです。

そのOCによる性能強化を活用して、グリッドコンピューティングによる社会貢献活動を行う TEAM SHACHI-HOKO の活動を紹介します。

吉原 清一 / @DOSV_LAB

AnjoHeartsPROJECT /TEAM SHACHI-HOKO
https://www.facebook.com/kiyokazu.yoshihara
TEAM SHACHI-HOKO広報担当。旧DOS/Vラボ管理人。
興奮すると単語の語尾が妙に上がる。
「エアフローなんて関係ないんすよ！」ととにかく回転数の高いファンとピンクが大好き。(￣ー￣)ｂｸﾞｯ!

BOINC

BOINC(Berkeley Open Infrastructure for Network Computing) は、1999年に公開された SETI@Home（単独運用は2005年まで） の実証結果をうけ、柔軟性と汎用性を高めたグリッドコンピューティングプラットフォームです。

関連ソフトウェアは LGPL で公開され、多岐にわたる科学技術分野での大規模演算に活用されています。

http://boinc.berkeley.edu/
http://ja.wikipedia.org/wiki/Berkeley_Open_Infrastructure_for_Network_Computing

WCG (World Community Grid)

WCG はグリッド・コンピューティング技術を用いて世界中のパソコンから集めた処理能力を結集することで仮想的なスーパーコンピューターを作り出し、それを基盤として社会的に意義の高い研究活動に世界最大規模の演算能力を提供する人道的活動です。

おもに未知のウイルスや病原体への対応、新薬の開発、病気の処置法の探求など、生体工学分野を中心に人類の脅威とされる課題がテーマに選ばれています。

また、IBM社はグローバルにWCGの活動を支援しています。

http://www.worldcommunitygrid.org/index.jsp?language=ja_JP
http://ja.wikipedia.org/wiki/World_Community_Grid
http://www-06.ibm.com/ibm/jp/company/society/wcg/

TEAM SHACHI-HOKO （チーム鯱）

TEAM SHACHI-HOKOは、空冷/水冷/極冷でオーバークロックをやっている向上心の高いオーバークロッカーチームです。主なメンバーは水冷でオーバークロックを行っています。

オーバークロックはプログラミングとも非常に係わってくる部分かと思いますので、多くの技術者の方と交流できれば幸いです。

https://sites.google.com/a/shachi-hoko.jp.net/team-shachi-hoko/

![（透明化済）ShachiRed_2.png](https://qiita-image-store.s3.amazonaws.com/0/44312/4346b149-531e-847f-dc40-8046af79c86f.png)
ユニティちゃんゲームジャム @ GMO Yoursの個人的さっくり振り返り

これを作った
https://dl.dropboxusercontent.com/u/39517918/Game/ucgj2014/ucgj2014.html

使っているもの
* EasyMaskTransition
** シーン遷移の演出
* NGUI
** UI全般
* Mobile Cartoon GUI
** パネルとかボタンの絵素材
* Unityちゃん2Dアセット
** 主役


良かった事
* 形になった！
* 企画がスムーズに決まった
* 皆のゲームイメージがなんとなくある程度共通になってる感があった
* 強い人が居た
* メンバー全員に経験になった感あった
* わりと教え合ったりワイワイできた感はあった

形になった件について効果があったと思う事
* タスクを取る度に優先度みたいな話を結構な頻度した
* タスク小さい単位で分割した（コミットの粒度を小さくした）
* 最初のマイルストーンの時に必要な事を付箋紙でまとめてあと何ができれば発表会の目標が完了できるかを目で確認できるようにした（ぷちかんばん）

企画がスムーズに決まった件について
* ブレストした
* ブレストする際に「ユニティちゃん+(が、を、から、に等)+動詞」にしぼった
** やっぱり動詞は組み合わせし易い！


悪かった事
* 忙しくなった時に他の人を構えなくなっていた
* 昼間あまり作業してなかった感ある（サポートチャンピオン感ある）
* 作業がちょっと偏っていた
* お昼ごはんで行く先々が昼間やってなかった…
* 一部の人を放置してしまった
* 音の部分に開発リソースをさけなかった




つくったゲームはこちら
http://unityroom.com/game/000059
Eclipseでタブ切り替えのショートカットを登録する方法

#概要
Eclipseでファイルとファイルの切り替えをショートカットで行う方法を記載します

#環境
Mac OSX 10.9.3
Eclipse 4.3.1

#ショートカットの登録方法
* ツールバーのADT＞環境設定をクリック
* 一般＞キーを選択
* フィルター入力のところに「タブ」と入力します
* コマンドの項目の「次のタブ」「前のタブ」が対象です。最初は「バインディング」のところが空白だと思います。それぞれの行を選択し、下の方にある「バインディング」にショートカットコマンドを入力します(コマンドは一例です)
 * 次のタブはoption+command+→
 * 前のタブはoption+command+←
* 最後に「適用」を押して終了です。

これでファイル間の移動がこのショートカットでできるようになります。
forkした後のtime関連関数が遅い



Rubyのプログラムを
https://github.com/grosser/parallel
で並列化させてCPUを使いきろうと試みたのですが、むしろ遅くなった。

ruby-profしたら、Timeの関数の何かがfork前は速いのにfork後に遅くなっていることがわかった。


```
def foo(m)
  100000.times do
    t = Time.now
    t.send(m)
  end
end

[:getgm,:getlocal,:to_s,:gmtime,:utc,:dup].each do |m|
  t = Time.now
  foo(m)
  puts "parent: #{m} #{Time.now-t}"

  pid = Process.fork do
    t = Time.now
    foo(m)
    puts "child : #{m} #{Time.now-t}"
  end
  Process.wait(pid)
end
```

```
% ruby a.rb
parent: getgm 0.169444
child : getgm 4.888034
parent: getlocal 0.180136
child : getlocal 4.901886
parent: to_s 0.31005
child : to_s 5.122047
parent: gmtime 0.145516
child : gmtime 4.936325
parent: utc 0.145516
child : utc 4.940859
parent: dup 0.104069
child : dup 0.099137
```

time.cを追ってlocaltimeとtzsetがひどく遅いことがわかりました。
https://github.com/ruby/ruby/blob/trunk/time.c#L829


```
// gcc a.c && ./a.out
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/wait.h>

void foo(char* s)
{
  struct timeval tv1;
  struct timeval tv2;
  gettimeofday(&tv1, NULL);
  for(int i=0; i<10000; i++){
    time_t t;
    tzset();
    t = time(NULL);
    localtime(&t);
  }
  gettimeofday(&tv2, NULL);
  printf("%6s %8ld usec\n", s, (tv2.tv_sec  - tv1.tv_sec)*1000*1000 + tv2.tv_usec - tv1.tv_usec);
}

int main()
{
  pid_t pid;
  tzset();
  printf("tzname=%s\n", tzname[0]);
  pid = fork();
  if(pid!=0){
    printf("parent pid=%d\n", pid);
    foo("parent");
    int status;
    waitpid(pid, &status, 0);
  }else{
    printf("child  pid=%d\n", pid);
    foo("child ");
  }
}
```


TZをいろいろ変えると速くなることがわかりました。


```
tkrimac2:~/tmp% ./a.out
tzname=JST
parent pid=18410
child  pid=0
parent     6797 usec
child    447324 usec

tkrimac2:~/tmp% TZ=JST-9 ./a.out
tzname=JST
parent pid=18412
child  pid=0
parent     5599 usec
child      5682 usec

tkrimac2:~/tmp% TZ=UTC+0 ./a.out
tzname=UTC
parent pid=18414
child  pid=0
parent     5714 usec
child      5762 usec

tkrimac2:~/tmp% TZ=JST ./a.out
tzname=UTC
parent pid=18416
child  pid=0
parent     6724 usec
child    335606 usec

tkrimac2:~/tmp% TZ=UTC ./a.out
tzname=UTC
parent pid=18418
child  pid=0
parent     7096 usec
child    297855 usec
```


Rubyのほうも同じ速さになりました。

```
% TZ=JST-9 ruby a.rb
parent: getgm 0.144426
child : getgm 0.146893
parent: getlocal 0.145261
child : getlocal 0.148292
parent: to_s 0.257256
child : to_s 0.26556
parent: gmtime 0.117557
child : gmtime 0.127873
parent: utc 0.123133
child : utc 0.121378
parent: dup 0.095217
child : dup 0.098818
```


TZを設定すればよいということがわかった。

```
% uname -a
Darwin tkrimac2.local 13.2.0 Darwin Kernel Version 13.2.0: Thu Apr 17 23:03:13 PDT 2014; root:xnu-2422.100.13~1/RELEASE_X86_64 x86_64
```
Linuxではためしてません。
使用しているポートのプロセスを調べる方法

# だれ？ポート使っているのは？
って思うときありますよね。そんなときは ```lsof```コマンド。実は、Apache が起動しなくて何かしたっけ？と30分位はまったのでいつもの自分メモ。

## あれ？怒られるｗ
Apache がなにをやっても起動しなく出ていたログ。誰か（プロセス）がすでにポートを使用しているという風に怒られ Apache が起動できません。

```lang:command
# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
                                                           [FAILED]
```

## おまえか！！
と、```lsof```コマンドを実行してみる。どうやら nginx が起動していたでござるった。
そりゃ ```Address already in use``` と怒られますね。

```lang:command
$ lsof -i | grep http
nginx     2945         root    7u  IPv4  15378      0t0  TCP *:http (LISTEN)
nginx     2946          git    7u  IPv4  15378      0t0  TCP *:http (LISTEN)
```
SwiftでUIImagePickerControllerを使ってみた

#SwiftでUIImagePickerControllerを使ってみた
SwiftでUIKit使ってみようということで定番のカメラアプリをUIImagePickerControllerを使って作ってみました。サンプルのソースをgithubにあげました。[SwiftCam](https://github.com/ktanaka117/SwiftCam)

基本的にはObjective-Cで書く方法と同じなのですが、微妙に引数や型が違かったりしたので、そこはUIImagePickerControllerの元ファイルをたどって見てもらえばObjective-Cではこういう名前のメソッドだったけどSwiftではこう書いてねっていうのが英語で書いてあります。

#使ってみて気付いたこと
##カメラ起動のタイミング
Objective-Cの時と同様、imagePickerはviewDidAppearのタイミングでカメラを起動してやります。
viewDidLoadの中でself.presentViewController(imagePicker, animated: true, completion: nil)でカメラを起動しようとすると _whose view is not in the window hierarchy!_ というエラーで怒られます。
調べたところ、このエラーはiOSのライフサイクルイベントが絡んでいる様です。自分もこれから調べたものを詳しく詳しく読んでみます。
とりあえずはviewDidAppearで起動してやればオーケー。

##Selectorの指定の仕方
UIImageWriteToSavedPhotosAlbumメソッドのcompletionメソッドとしてimageDidFinishSavingWithErrorContextInfoメソッドを独自に用意して書きました。
その時UIImageWriteToSavedPhotosAlbumの中でSelectorの指定の仕方ってSwiftだとどうするんだろうと詰まりました。
結局のところソースの通りObjective-Cの時とそんな変わらず、複数の引数があったとしても

 "関数名:仮引数:仮引数:"

のように書いて出来ました。
あとはNSErrorで書いていたところをNSErrorPointerで書けっていうのもほうほう、というところ。

#その他気をつけたいこと
##関数の中で関数を書いてもエラーが出ない
Objective-Cだと関数の中で関数を宣言して書くとかそもそも有り得なかったし気にもしていなかったところなんですが、Swiftだとそれが可能です。可能であるがゆえに気付かないでviewDidAppearの中でデリゲートメソッドを書いて「あれ、なんでここ通ってないの？」ってことになりました。
気をつけましょう。

#追記2014.11.07
久々にUIImagePickerControllerを使おうとしたところ、

```
Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.
```

というエラーが出てきました。
調べているとiOS7に移行した際にも出たエラーのようで、iOSのバグのようです。
エラー文から察するに「ViewControllerのViewのロード前にModalでUIImagePickerControllerを呼び出そうとしている」ということだと思い、NSTimerでUIImagePickerControllerを遅延呼び出ししてみましたがそれでもエラーは出ました。

引き続き回避策を探していきます。
今Swift学習中にみてる動画など

iOS開発とかMacでXCode自体が初めてだったり、
そもそも自分のレベルが低かったりで全然わからなくて悩みどころ。

今のところ上から順番に見て学習している。

公式サイト
Appleでのドキュメントなど
Appleで検索でてくるところ

--

Youtube

Swift Tutorial のビデオ
[Introduction to SWIFT]
http://youtu.be/9_hAGoth6BI

変数からクラスの継承くらいまで浅く解説している。
ドキュメントよめるならそっちの方がいいかも

Swift Tutorial で ToDoアプリの作成
[Swift Tutorial - To Do App]
http://youtu.be/war0gHL26ns

・iOSでの単純なToDOアプリの作成
30分くらいの動画。
なんとか動画どうりには物を作れたが・・・。
@IBOutletとかようわからんかった。

--

Qiita内

・SwiftとSpriteKitを使って一分でゲームを作る

一分ではちょっと無理だったけど、動くものは作れた！

--

Youtube

YoutubeになんかいろいろSwiftのチュートリアル動画がいろいろあがっているのでチラチラみながらやっている

Swift Tutorial for iOS: Part1 App Structure & XCode Basics
http://youtu.be/hndtcLKY6wc

若干どもってる感じで聞きづらいと感じたが、基本の基本という感じで
XCodeの画面の説明から入ってくれる。
ただ、どうも本当の初心者向けというかちょっとプログラミング経験者向けな感じで
そこそこ用語が混じってきてるような。
まぁ、DevProgrmはいらないと現状使えないし本当の初心者は少ないのかな。

YouTubeで、音声の字幕化をしてくれる機能に今更気づいた。

Swift Tutorial for iOS: Part2 Simple and Cool App
http://youtu.be/9rq4P-L-z8U

Part1の続き。
テキストフィールドとボタン、ラベルの簡単な機能説明と確認。

ToDoAppで手動で@IBOutletとかを書いて関連づけていたのが
ストーリーボードからのアシスタントエディタでマウスから
コードをポトペタできるのに驚く。

うちのマウスがMicrosoftのだからなのか
動画で左クリックで選択後に、そのままドラッグといってるようだが
選択後に右でドラッグしないとコード側にポトペタできない。


Swift Tutorial for iOS: Part 3 - Login App Verify Credentials 
http://youtu.be/2TcTm79k4qY

Part3。内容的には特に新しいこともなくPart2のおさらいで
なんちゃってログイン画面を作る。
TFSのGitとRedmineを連携させる(途中)

途中まで。あとは、リモートリポジトリの更新をサーバ側から通知するようにさせるだけ・・・

やりたいことは、
Redmineのリポジトリ設定にTFS発のGitをセットしてチケットとコミットを紐付けることと、
Redmineを触っていない他のチームのコミットとかも混じってくるので、
リアルタイムでリモートリポジトリの情報を反映するようにすること。

# 環境について
## リモートリポジトリ
TFSのGit。2013。
Gitのアドレスは、ソース＞エクスプローラ＞右上の”複製”に記載されているURL。

## Redmine
Win7機。
msysgitとTortoiseGit。

# Redmine側
## サーバでの操作
Win7の中にて。

TortoiseGitで任意のディレクトリに”Git 複製”する。
URLにTFS Gitのパスを。
そのままデフォルトでOK。

クローンしている最中にポップアップでユーザとパスワードを聞かれる。
（pullするときのGitに必要なメールアドレスとかとは別）
ので、TFSに入るときのログイン/パスワードを入れる。
ADと連動してるのでRedmine機のログイン/パスワードを入れた。

隠しファイルの表示をONにしておくと、
クローンしたフォルダに”.git”フォルダが出来る。
（”.git”フォルダの中身は、hookとかinfoとかのフォルダたちがいる）
これができていれば、RedmineとGitの連携はもう簡単。

## ブラウザでの操作
Redmineブラウザにて。

リポジトリセッティングしたいプロジェクトの、
設定＞”リポジトリ”タブ

 * リポジトリ種類：Git
 * メインリポジトリ：チェックする
 * URL：↑の".git"フォルダのフルパス。　例）C:\Git\xxxProject\\.git
 * パスのエンコーディング：デフォルトのまま（UTF-8）
 * コミットを表示するか的な：チェックする

OK！

”リポジトリ”タブにファイル等が表示されていればOK。

### 「エントリまたはリポジトリが存在しません」的なエラー。
設定したのに404が表示されることがあった。

* ".git"じゃなくてクローンしてきたルートフォルダのパスを設定してた

あるのになんでないの！と思っていた。
あのなんとかと呼ばれている”.git”フォルダの中身を参照しなきゃいけないらしい。


# TFSのGitの更新を自動反映するようにする
なんせローカルフォルダの中身を見ているだけなので、
当然pullしたりしてリモートから情報を取ってこないと、いつまでも古いまま。

## TFSアクセスの際にユーザ/パスワードを聞かれないようにする。
ユーザフォルダ直下に、`_netrc`というファイルを作成する。

```_netrc
machine TFSのホスト名
login ユーザ名
password パスワード
```

## リモートリポジトリが更新されたらローカルリポジトリを更新する
計画中。。。TFSのGitのビルド設定に、それを実装させようかと思っている。
いまさらtwitter botで自動ふぁぼテロを行ってみた

twitterで特定の言葉をつぶやいた人を自動でfavる事ができます。
前提：PHPが初心者レベルで使えること。twitter利用経験がありfavなどの意味が分かること。

1.twitterでアカウント登録
2.[twitter api](https://dev.twitter.com/) に登録
 2.1 右上のsign in からtwitterのusernameとpasswordを入力
 2.2 右上の自分のアイコンを選択し、my application
 2.3 Create New Appをクリック
 2.4 Application detailsの内容を決める
  2.4.1 name =　アプリ名　必須　自分で使う場合は適当でいい
  2.4.2 detail = 詳細　必須　自分で使う場合は適当でいい
  2.4.3 Website = webのURL　自分で使う場合はtwitterアカウントでも書いておけばいい
  2.4.4 callback url はしかと
3.登録できたら　API keysをクリック
 3.1 API key,API secretをメモ帳などにメモる(これがconsumerKey,consumerKey secretになります)
 3.2 Permissionsをread and writeにしてupdate setting
 3.3 API keysに戻りcreate my access tokenをクリック
 3.4 Access token,Access token secret をメモ帳などにメモる
 3.5 Test OAuthをクリックしても3.1,3.4と同じ情報が得られます
※ここからは独学
4.config fileをつくる。メモったtokenなどを入力して下さい。

```php:apiconfig.php
<?PHP
$consumerKey = '5WcZFXlCgt4W**********PRiXh';
$consumerSecret = 'RxfZ*********qyv9DSZXf3rTa3ZeSTApy3JEfeBnmswacNph';
$accessToken = '2517489452-iJkLo0S*********1eOQEy30AhP2DglRtNpuO';
$accessTokenSecret = '**********nfkYEtqSKXiaCQ93QCrvAjXhc6evcEXx5DCo';
?>
```
これで設定完了
5.[twitter oauth](https://github.com/abraham/twitteroauth/)を使うためダウンロード。解凍してひとまず必要なのはtwitteroauthフォルダのtwitteroauth.phpだけ。さっきのapiconfig.phpと同じフォルダ／ディレクトリに置く。
6.twitter で任意の文字を検索してふぁぼるコードファイルを作成

```php:fav.php
<?php

// TwitterOAuth呼び出し
require_once("twitteroauth.php");
// api設定ファイル呼び出し
require_once("apiconfig.php");

//twitterと連結
$TwitterOAuth = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret);
if($TwitterOAuth){
//'q' => '検索したいワード'を入力.count/検索する数は任意（ただし180以下） 
	$status = $TwitterOAuth->get('search/tweets', array('q' =>'ファボれよ','count' => 40));
//favったツイートの結果を表示
	foreach($status->statuses as $result){
		echo '<img src ="'.$result->user->profile_image_url.'"><br>';
		echo $result->created_at.':' ;
		echo $result->user->name.'<br>' ;
		echo $result->text.'<br>' ;
		$idstr = $result->id_str ;
		$status = $TwitterOAuth->post('favorites/create', ['id' => $idstr]);
	}
}
?>
```

参考：[PHP - TwitterOAuthの正しい使い方 - Qiita](http://qiita.com/rana_kualu/items/357a031c0453a3538ad3)
[REST API v1.1 Resources | Twitter Developers](https://dev.twitter.com/docs/api/1.1)
SwiftでObjCコードを書き換えてみる(Objective-C-HTML-Parser)

ObjCで書かれた[Objective-C-HTML-Parser](https://github.com/zootreeves/Objective-C-HMTL-Parser)をSwiftに。
今回はオリジナルから下記の機能だけ抜き出してみました。

* ノード検索
* 属性名取得
* テキスト取得(コンテンツ取得)

コードは[GitHub](https://github.com/tid-kijyun/Swift-HTML-Parser)に置いています。

## 事前準備
1. libxml2.dylibをリンク。
1. libxml/HTMLtree.hをブリッジングヘッダでinclude

ブリッジングヘッダは、XCodeのプロジェクトの下記で指定します。
"Build Settings > Swift Compiler - Code Generation > Objective-C Bridging Header"
または、ObjCファイル(.m)を追加するときに作るか聞いてくるのでそちらでも。

ファイル名は"[プロジェクト名]-Bridging-Header.h"という名前にします。
特に決まっているわけでは無いので好きな名前でもOK。

## ポインタ型のキャスト方法
`UnsafePointer<T>.init<U>(_ from: UnsafePointer<U>)`
がやってくれました。

例えば unsigned char* を char* にキャストしたい時はこんな感じです。

```swift
var xxx : CUnsignedChar[] = [0x68, 0x6f, 0x67, 0x65, 0x00]
var hoge : CMutablePointer<CUnsignedChar> = &xxx

var fuga = UnsafePointer<CChar>(hoge.value)  // unsigned char* を char*にキャスト

println(String.fromCString(fuga))
```

ちなみに、型の対応は下記の通りです。

|C Type|Swift Type|
|:-----------|:------------|
|char|CChar|
|unsigned char|CUnsignedChar|
[Interacting with C APIs - Primitive Types](https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/InteractingWithCAPIs.html) より抜粋

*-補足-*
*冒頭のイニシャライザの引数fromの前に付いている'_'は、匿名引数という意味です。*
*付けると引数名を省略できます。*

## Generatorをインナークラスにできない？
HTMLNodeクラスのGenerator(HTMLNodeGenerator)をインナークラスにすると、
コンパイルエラーが出たのでとりあえず別クラスにしました。
確認した限り、XCodeでプロジェクトを作った場合のみ発生します。
Playgroundとコマンドラインでは通るので要調査。

```swift:test.swift
// エラー確認用の最小コード(PlaygroundだとOK)
class HTMLNode : Sequence {
    class HTMLNodeGenerator : Generator {
        func next() -> HTMLNode? {
            return nil
        }
    }

    func generate() -> HTMLNodeGenerator {
        return HTMLNodeGenerator()
    }
}
```

## 使用例
```swift:main.swift
import Foundation

let html = "<ul><li><input type='image' name='input1' value='string1value' class='abc' /></li><li><input type='image' name='input2' value='string2value' class='def' /></li></ul><span class='spantext'><b>Hello World 1</b></span><span class='spantext'><b>Hello World 2</b></span>"

var err : NSError?
var parser     = HTMLParser(html: html, error: &err)
if err {
    println(err)
    exit(1)
}

var bodyNode   = parser.body

if let inputNodes = bodyNode?.findChildTags("b") {
    for node in inputNodes {
        println(node.contents)
    }
}

```
xcode6βで補完機能を使う方法

#xcode6βで補完機能を使う方法
cocoaの関数名やクラス名は以前から長過ぎて覚えていられないと言われている中で、6月15日現在、xcode6βでは補完が効かないと言われています。
これではとてもじゃないですが、写経ひとつ満足に出来ません。

しかし、
###ソースコードの中から日本語を無くす
ことによって補完機能が使用出来ます。
ちなみにバージョンは6.0です。

ダブルクォーテーションで文字を入力する部分はもちろん、コメントでの日本語もしっかりと消しておきましょう。
ふと気付きにくい部分ですが、ソースファイルの一番上の _created by Hoge_ の著名の部分が日本語名になっていることがあるのとファイルの制作年(2014年とか)にも要注意です。



##追記：2014/06/19
xcode6-Beta2が公開されましたが、この問題は解決されていませんでした。
このバージョンでも日本語を使わずにコードを書くことをおすすめします。
Swift で Enumerable モジュールを作ってみた

# 試しに Enumerable モジュールを作ってみた

無限リストを扱え、メソッドチェーンでリストを加工出来る Enumerable モジュールをSwiftで書いてみました。

→ [Enumerable.swift](https://github.com/FUKUZAWA-Tadashi/swift_enumerable/blob/master/Enumerable.swift)

例えば、こんな使い方が出来ます。

```swift
import Enumerable

var x = Enumerable(sequence: 1...100)
println(x.filter{$0 % 2 != 0}.map{$0 * 3}.take(10).toArray())

//=> [3, 9, 15, 21, 27, 33, 39, 45, 51, 57]
```

その他のサンプルプログラムはこちら
→ [enumerable_sample.swift](https://github.com/FUKUZAWA-Tadashi/swift_enumerable/blob/master/enumerable_sample.swift)

## クロージャで実装

当初は Generator を使って作ってみていたのですが、next() の型宣言まわりでどうにも上手く行かないケースがあり、大変苦労したあげく断念しました。
苦労した理由はこれ → [protocol はジェネリックに出来ない](http://qiita.com/FUKUZAWA-Tadashi@github/items/574ee6bad0a5cd04b9dd#2-11)
クロージャで実装する事を思いついたのでやってみると、あっさり実装できて、しかもシンプルになりました。

Generatorでの実装はこれ → [BadEnumerable.swift](https://github.com/FUKUZAWA-Tadashi/swift_enumerable/blob/master/BadEnumerable.swift)
一応そこそこには動きますが、複雑な事をするとコンパイラが死にます。
コンパイル出来ないものがこれ → [badEnumerable_sieve.swift](https://github.com/FUKUZAWA-Tadashi/swift_enumerable/blob/master/badEnumerable_sieve.swift)
ジェネレータの中でジェネレータを生成して、その中でさらにジェネレータを… と重ねていくのですが、
型チェックで無限ループに陥ってしまっているのかも知れません。
ランダムな名前を返してくれる関数

```py3:
import random

def natural(n, f=0):
    """自然数を返す"""
    if n < f:
        return f
    else:
        return int(round(n))

def nrg(mu, sigma=1.2, f=0, t=None):
    """ガウス分布を自然数にして返す"""
    num = natural(random.SystemRandom().gauss(mu, sigma), f)
    if (t is not None) and (num > t):
        return t
    else:
        return num

def rchp(seq, i=1):
    """リストからランダムチョイスしたリストを返す"""
    return [random.SystemRandom().choice(list(seq)) for n in range(i)]

def uwords(fword, lword):
    """ユニコード連続文字"""
    return {chr(  n  ) for n in range(  ord( str(fword) ),  ord( str(lword) ), +1  )}

class wset:
    """ひらがな、カタカナ文字の定数"""
    hira = uwords("ぁ", "ん") | {"ゝ", "ゞ"}
    kata = uwords("ァ", "ヾ") - {"・", "ヵ", "ヶ"}
    thira = hira - {"ぁ", "ぃ", "ぅ", "ぇ", "ぉ", "っ", "ゃ", "ゅ", "ょ", "ゝ", "ゞ", "ゎ", "ー", "ん"}
    tkata = kata - {"ァ", "ィ", "ゥ", "ェ", "ォ", "ッ", "ャ", "ュ", "ョ", "ヽ", "ヾ", "ヮ", "ー", "ン"}
    dhira = thira  | {"きゃ", "きゅ", "きょ", "ぎゃ", "ぎゅ", "ぎょ", "しゃ", "しゅ", "しょ", "じゃ", "じゅ", "じょ", "ちゃ", "ちゅ", "ちょ", "にゃ", "にゅ", "にょ", "ひゃ", "ひゅ", "ひょ", "みゃ", "みゅ", "みょ", "りゃ", "りゅ", "りょ","ゝ", "ゞ", "ー", "ん"}
    dkata = tkata | {"キャ", "キュ", "キョ", "ギャ", "ギュ", "ギョ", "シャ", "シュ", "ショ", "ジャ", "ジュ", "ジョ", "ニャ", "ニュ", "ニョ", "ミャ", "ミュ", "ミョ", "ヒャ", "ヒュ", "ヒョ", "チャ", "チュ", "チョ", "リャ", "リュ", "リョ", "ヴァ", "ヴィ", "ヴェ", "ー", "ン"}

def rname(segment=2.4, namerange=5.3, hiragana=wset.dhira, katakana=wset.dkata, sep=" = "):
    """（人間の想像力を超えた）ランダムな名前を返す"""
    rsam = random.SystemRandom().sample
    rint = random.randint
    segs = []
    namerange -= 1
    for n in range(nrg(segment, 0.5, 1)):
        choicer = rint(0, 100)
        if choicer <= 10:
            l = rchp(wset.thira,1) + rchp(hiragana, nrg(namerange))
        else:
            l = rchp(wset.tkata,1) + rchp(katakana, nrg(namerange))
            
        segs.append(''.join(l))
    return sep.join(segs)

print(rname())
```

乱数って良いですよね！　
だいぶ前ですが、ランダムな名前を返してくれる関数を書いたので投稿しました。
ヒトが思いつかない独特な名前の生成に困ったら使ってみてください。
Swiftのfor-in文で"1..<3"と"1...3"のちがい

# Xcode6 beta3での変更点
Xcode6 beta3 で 「x以上y未満」を表すfor-in文の記法が変更されました。
* beta2まで：1..3
* beta3から：1..<3
すごくわかりやすくなりましたね。
「x以上y以下（yを含む）」はbeta3以降も「1...3」のままです。
[Swift Language Changes in Xcode 6 beta 3](https://developer.apple.com/swift/blog/?id=3)


# for i in 1..<3 実行例
```lang:test.swift
for i in 1..<3 {
    println("value \(i)")
}
```

### 実行結果
value 1
value 2

# for i in 1...3 実行例
```lang:test.swift
for i in 1...3 {
    println("value \(i)")
}
```

### 実行結果
value 1
value 2
value 3

# まとめ
* `for i in x..<y` の場合は、yは含まない
* `for i in x...y` の場合は、yを含む
Mac OS 10.9 で Docker を 1.0 にアップデート

自分用の作業記録。

既にいろんな方がインストールやアップデートの方法を詳しく書いてくれているので、それらを参考にした。

[公式ドキュメント](https://docs.docker.com/installation/mac/)
[Mac OSXユーザー向けDocker 1.0アップグレード](http://dev.classmethod.jp/tool/docker-1-0-mac-osx-upgrade/)
[Mac OS X に Docker 1.0 をインストールする](http://qiita.com/hakobera/items/db73c5531d65cfeed7ce)


## 古いDockerをアンインストール

まずは Homebrewで入れた ``docker`` と ``boot2docker`` をアンインストールする。

```console
% brew uninstall boot2docker docker
Uninstalling /usr/local/Cellar/boot2docker/0.8.0...
Uninstalling /usr/local/Cellar/docker/0.10.0...
```


## homebrew-cask を使って Docker 1.0 をインストール

Docker 1.0 からはインストーラを使ってインストールするように変更になったようだ。インストールするアプリは Homebrew の Brewfile で管理したいので ``homebrew-cask`` を使ってインストールする。

```bash:Brewfile
# setup brew cask
tap phinze/homebrew-cask
install brew-cask

# cask packages
cask install boot2docker
```

Brewfile に上記を追加して ``brew bundle`` でインストール。

```console
% brew bundle
```


## Docker の起動

[公式のマニュアル](https://docs.docker.com/installation/mac/) に従って boot2docker を再起動させる。

```console
% boot2docker stop
% boot2docker download
% boot2docker start
```

環境変数に設定する値も変更になっているので再設定が必要となる。設定する値は ``boot2docker start`` を実行した際に出力されるほか、 ``boot2docker ip`` で確認できる。自分は ``.zshenv`` で環境変数が設定されるようにした。

```bash:.zshenv
DOCKER_HOST=tcp://192.168.XX.YYY:2375
export DOCKER_HOST
```

無事に Docker 1.0 が使えるようになった。

```console
% docker version
Client version: 1.0.0
Client API version: 1.12
Go version (client): go1.2.1
Git commit (client): 63fe64c
Server version: 1.0.0
Server API version: 1.12
Go version (server): go1.2.1
Git commit (server): 63fe64c
% docker run ubuntu echo hello world
hello world
```
エクセルのカラムを数値に変換する関数

```py3:
def colnum(colname, _A2Z="ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
    result = 0
    for looc, colchar in enumerate(colname[::-1]):
        point = _A2Z.index(colchar)
        result += ((len(_A2Z) ** looc)) * point
    return result
```
pythonでエクセルを扱うxlrdでカラムの数値を返してくれる関数が無かったため書いてみたが、
よく見たらxlwtの方に該当の関数が含まれていたため無駄でしたというお話。
xlutilsがまだpython3に対応していないので、
これらを使ってpython3でエクセルの編集は出来ないんですね
Rubyで配列の一部を抜き出す時に末尾までいったら始めに戻る

こんな感じに配列の一部を抜き出す時に末尾までいったら先頭に戻って必要な要素数を取ってきたかったので

```rb
foo = [1,2,3,4,5,6]

index = 3
lengh = 3
foo.values_at_loop(index, length) # => [4,5,6]

lengh = 2
foo.values_at_loop(index, length) # => [4,5]

index = 5
foo.values_at_loop(index, length) # => [6,1,2]

index = 6
foo.values_at_loop(index, length) # => nil
```

こんなの書いた。ちょっと冗長な気がするのでもっとスッキリ書く方法があったら誰か教えてください。

```rb
class Array
  def values_at_loop(index, length)
    if index + length <= self.size
      self.values_at(index..(index+length-1))      
    else
      self.values_at(index..(self.size-1), 0..(index+length-1 - self.size))
    end
  end
end
```
class と const宣言

classとconst宣言
C++メモ（個人的なメモです．間違っているかも）
### constメンバ関数
constメンバ関数は， **オブジェクト内部が変更されない事**を宣言する（ただしconst_cast指定された場合を除く：追記中）
そのためconstメンバ関数でメンバ変数を変更する記述は，コンパイルエラーとなる

```c++
class ABC{
private:
  int value;

public:
  ABC()              : value(0){} // Default Constructor
  ABC(const ABC &abc): value(0){  // Copy    Constructor
    value = abc.value;
  } 
  ABC(int val)  : value(val){ 
    cout << "preset(value) = " << value << endl;
  }

  /// 
  void  add(int val){        // 非const関数
    value += val;
    cout << "add value = " << value << endl;
  }

  /// 
  void  add(int val)  const{ // const関数　オブジェクトを変更しない
    //value += val; // コンパイルエラー
    cout << "value = " << value << endl;
  }
};
```


### const修飾されたクラスオブジェクト変数　と，constメンバ関数
const修飾されたクラスオブジェクト変数は， **オブジェクト内部が改変されない事を保障**しなければならない（ただしconst_cast指定された場合を除く：追記中）
そこで C++ではこのような場合，その **constメンバ関数のみの呼出しのみ許可**することによって行っている．

```c++
#include<iostream>
using namespace std;

class ABC{
private:
  int value;

public:
  ABC()              : value(0){} // Default Constructor
  ABC(const ABC &abc): value(0){  // Copy    Constructor
    value = abc.value;
  } 
  ABC(int val) : value(val){ 
    cout << "preset(value) = " << value << endl;
  }

  void  add(int val){        // 非const版 add()関数
    value += val;
    cout << "[     ]add value = " << value << endl;
  }

  void  add(int val)  const{ // const版 add()関数　オブジェクトを変更しない
    //value += val; // コンパイルエラー
    cout << "[Const]add value = " << value << endl;
  }
};

///
///
int main(){
        ABC abc(100);       // const修飾 なし
  const ABC abc_const(200); // const修飾 有り

  abc.add(10);              // 非const版 add()を呼び出し）
  abc_const.add(10);        // const版　 add()を呼び出し）
  //       :
  //       :
};

```

以下のようにconstメンバ関数の定義箇所を外した状態で，const修飾されたクラスオブジェクト変数を定義すると，コンパイルエラー

```c++
#include <iostream>
using namespace std;

class ABC{
private:
  int value;

public:
  ABC()              : value(0){} // Default Constructor
  ABC(const ABC &abc): value(0){  // Copy    Constructor
    value = abc.value;
  } 
  ABC(int val)  : value(val){ 
    cout << "preset(value) = " << value << endl;
  }

  void  add(int val){        // 非const関数
    value += val;
    cout << "add value = " << value << endl;
  }

  /***
  ///void  add(int val)  const{ // const関数　オブジェクトを変更しない
  ///  //value += val; // コンパイルエラー
  ///  cout << "value = " << value << endl;
  ///}
  ***/

};

///
///
int main(){
        ABC abc(100);       // OK          （非constのaddを呼び出し）
//const ABC abc_const(200); // コンパイルエラー(非constのaddが呼び出されるため，またはconstのaddが無いため)
       :
       :
};
```
さくらのVPSを借りてchefファイルで設定を行う

下記のchefファイルを使います。
https://github.com/YusukeHigaki/sakura_chef.git

1. chefファイルをダウンロード
`git clone https://github.com/YusukeHigaki/sakura_chef.git`

2. data_bag_keyをコピー
ローカルに保存してあるdata_bag_keyをトップディレクトリ以下にコピー

3. nodeとワークステーションをひもづける
`knife solo prepare root@153.121.58.179`
これ結構時間かかります。
もし
```ERROR: Net::SSH::HostKeyMismatch: fingerprint xxxxxx```
などと出てくる場合は`~/.ssh/known_hosts`に接続しようとしているサーバーのIPが残っているので削除

4. jsonファイルを編集
`vim nodes/153.121.58.179.json`
sshのport番号を任意のものに変更してください

5. 実行
`knife solo cook root@153.121.58.179`

6. 確認
http://153.121.58.179/ にアクセスして、
「chefによりサーバーのセットアップが完了しました！」
と出ていれば成功。
createElementとかやっちゃダメ。Twitter製のテンプレートエンジンを使いましょう。 - hogan.js -

Webページを作るとき、JavaScriptでHTMLを書く時があります。そんな時、document.getElementById("div")とかいって、DOM操作しちゃう時がありますが、そんなことをしてはダメです。絶対。DOM操作は読みにくいし、タグとJavaScriptの2つの方法で画面を作るなんて、メンテナンス性も劣るし、ダメダメです。
画面はHTMLタグで書きましょう。JavaScriptで動的に画面を切り替えたい場合も、テンプレートエンジンを使いましょう。

JavaScriptのテンプレートエンジンにはいくつも実装がありますが、ここではTwitter社が作ったテンプレートエンジン、[Hogan.js](http://twitter.github.io/hogan.js/)をご紹介します。

# hogan.jsのセットアップ
HTMLで一つのJavaScriptを読み込むだけです。

```html:htmlから抜粋
<script src="http://twitter.github.com/hogan.js/builds/3.0.1/hogan-3.0.1.js"></script>
```

[Hogan.js](http://twitter.github.io/hogan.js/)のトップページにその時の最新バージョンのURLが乗っているので、最新版を使うとよいでしょう。

# サンプル
Githubに[サンプル](https://github.com/ukiuni/HoganInspet)を公開しています。

# 解説
[index.html](https://github.com/ukiuni/HoganInspet/blob/master/WebContent/index.html)をご覧ください。
テンプレートとなる部分はこちら

```html:
<div id="userArea">
	<h2 align="right">USER INFO</h2>
	<div>{{name}}</div>
	<div>{{description}}</div>
</div>
```

サーバから受け取った情報とテンプレートから、HTMLを出力しているのがこちらです。

```js:
$.getJSON("api/user", {
	name : "aUserName"
}, function(data) {
	$("#userArea").html(Hogan.compile($("#userArea").html()).render(data));
});
```

サーバからはJSONを受け取っています。

```js:サーバから受け取っているJSON
{"name": "aUserName", "description", "This user is a user."}
```

簡単ですね。JSONのフィールド名と、テンプレート中の{{}}がマッピングされて、出力されます。その機能を持っているのが、

```js:
Hogan.compile("テンプレート").render("マッピングするデータ");
```

です。
簡単ですね。

# 覚えておくといい、+1の使い方。
幾つか、覚えておくといいHoganの使い方がありますので、ご紹介します。

## 配列を使ったレンダリング
配列を使うときのサンプルです。

```js:index.htmlからかいつまみ
var template = Hogan.compile($("#messageInner").html());
var renderdArray = data.map(function(message) {
	return template.render(message);
});
$("#messageInner").html(renderdArray.join(" "));
```

配列の要素一つ一つをレンダリングして、最後に結合しています。

## データを加工してレンダリング
日付をformatしてレンダリングしたい場合などに使えます。

```js:index.htmlからかいつまみ
var formatDate = function() {
	return function() {
		var date = new Date(this.createdAt);
		var retdate = date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + date.getDate() + " " + date.getHours() + ":" + date.getMinutes();
		return retdate;
	};
}
message.formatDate = formatDate;
template.render(message);
```

関数を引数に返す関数を定義して、データに追加します。ここでは、messageというデータにformatDateという関数を追加しています。この関数は、テンプレート中で{{formatDate}}として呼び出すことができます。

いかがでしたか？テンプレートエンジンを使って、綺麗にブラウザ上の処理をつくりましょう！
GenymotionでAndroid2.3系のデバッグ


大分シェアが減ってきたとはいえ､プロダクションでは今後1年くらいは2系のサポートは切れそうにない｡特にGingerBreadは未だに15％程のシェアを占めている｡

個人で開発している時は実機を用意するのも一苦労なので､そういう時は[Genymotion](http://www.genymotion.com)を使って2.3.7の高速エミュレータを使ってデバッグするのが良い｡

Genymotion､リリースされた当初は4.x系しかエミュレータを選べなかったが､最近になって2.3.7のみ使用する事ができるようになっていて大変便利｡エミュレータよりはるかに高速に動作する｡

![スクリーンショット 2014-06-15 18.png](https://qiita-image-store.s3.amazonaws.com/0/240/dda9b2e4-1b9b-af2d-0a14-a619108317e6.png "スクリーンショット 2014-06-15 18.png")
python-argparseで辞書型のオプションを与える

#問題
コマンドラインオプションで，複数の値を入れたいが，リスト形式じゃなく，名前付きの辞書として入れたい

つまり
``` hoge.py --param a=foo --param b=bar ``` ってしたときに param = {"a": "foo", "b": "bar"]という引数を取り出したい．

#解決策
オリジナルのargparse.Actionを定義します．Actionを継承したクラスを作って，__call__メソッドをオーバーライドすれば良いです．

valuesに生の文字列が入ってるくるので，それをnamespaceに適切に追加してけばいいのですが，今回の問題ではnamespace.paramが既に存在している可能性があるのでそのチェックを入れます．ちなみにself.destには"param"という文字列が入ってきます．

```py
import argparse
class ParamProcessor(argparse.Action):
    """
    --param foo=a型の引数を辞書に入れるargparse.Action
    """
    def __call__(self, parser, namespace, values, option_strings=None):
        param_dict = getattr(namespace,self.dest,[])
        if param_dict is None:
            param_dict = {}

        k, v = values.split("=")
        param_dict[k] = v
        setattr(namespace, self.dest, param_dict)
```


#使ってみる
```py
parser=argparse.ArgumentParser()
parser.add_argument("--param", action=ParamProcessor)

args = parser.parse_args()
print(args.param)
```

```
$ python hoge.py --param foo=a --param bar=b
>>> {'foo': 'a', 'bar': 'b'}
```