OmniAICreator/Qiita-1.07M huggingface dataset:
volatile変数をインクリメントしてはいけない


## 問題提起

[Java逆引きレシピ](http://www.shoeisha.co.jp/book/detail/9784798122380)を読んでたら

```java:Count.java
Class Count {
  private volatile int count;

  public void increment() {
    count++;
  }

  @Override
  public String toString() {
    return "count: " + count;
  }
}
```

というようなコード例が見られたが、synchronizedされていない状態でvolatile変数をインクリメント、もしくはデクリメントするのはやめよう。

## 原因

インクリメントもしくはデクリメントはatomicな操作ではないため。もう少し具体的に書くと、インクリメントの動作の流れは以下の通り。

1. 現在の値を取得
2. 1.で取得した値に+1した値を代入

ここで、1と2の操作の間に別のスレッドによって何らかの値が代入されると、想定外の動作となってしまう。

## 修正方法

[AtomicInteger](http://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html)や[AtomicLong](http://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/atomic/AtomicLong.html)という便利なクラスが標準で用意されているので、複数スレッドからsynchronizedなしに参照される値には、もれなくこちらを使いましょう。

```java:Count.java
import java.util.concurrent.atomic.AtomicInteger;

Class Count {
  private AtomicInteger count = new AtomicInteger();

  public void increment() {
    count.incrementAndGet();
  }

  @Override
  public String toString() {
    return "count: " + count.get();
  }
}
```

Java8以降では、[LongAdder](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html)というクラスも用意されています。JavaDocによると、以下のような特徴があるようです。

> This class is usually preferable to AtomicLong when multiple threads update a common sum that is used for purposes such as collecting statistics, not for fine-grained synchronization control.

> This class extends Number, but does not define methods such as equals, hashCode and compareTo because instances are expected to be mutated, and so are not useful as collection keys.

後半は注意ですね。HashMapのKeyに入れたりするのはやめましょう。

## 歯止め

先ほどのコードで静的解析ツールの[Findbugs](http://findbugs.sourceforge.net/)を使うと警告が出るので、導入するのもよいと思います。この件以外にも様々なバグが見つかるので非常に便利です。

## おわりに

こんな誤植を見つけてしまいましたが、良い本だと思います。AtomicInteger, AtomicLongの説明も載っていますし、LongAdderはこの本で初めて知りました。そもそも、逆引きはすごい便利です。[Kindle版](http://www.amazon.co.jp/dp/B00JS1EHH4)もあるよ。
画像ファイル(jpg, png)のサイズをまとめて最適化する on Linux

画像ファイルには余計な情報が色々と埋め込まれていたりします。
そういったものを除去することで、画像のファイル容量を減らすことができます。

##JPEGの最適化（ロスレス）
jpegoptimを使用します。
###jpegoptimのインストール
CentOSはepelからyumコマンドでインストールできます。(リポジトリに[epelを追加](http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=centos+epel&sort=rel)しておいてください。)

```bash:CentOS
$ sudo yum --enablerepo=epel install jpegoptim
```

ubuntuはapt-getでインストールします。

```bash:ubuntu
$ sudo apt-get install jpegoptim
```
### jpegoptimでJPEGを最適化
--strip-all をつけて実行します。

```bash:
$ jpegoptim --strip-all ファイル名
```

##PNGの最適化（ロスレス）
optipngを使用します。

###optipngのインストール

```bash:CentOS
$ sudo yum install optipng
```

ubuntuはapt-getでインストールします。

```bash:ubuntu
$ sudo apt-get install optipng
```
###optipngでPNGを最適化
ファイル名を渡すだけです。

```bash:
$ optipng ファイル名
```

## フォルダ配下すべて最適化させる
シェルにしてしまって、サクッと容量をへらします。
画像の多いWebサイトなどでは、定期的にシェルを流してみるのも良いかもしれません。

```bash:
#!/bin/bash
find /your/images -type f -iname *.jpg -print | sudo xargs jpegoptim --strip-all
find /your/images -type f -iname *.png -print | sudo xargs optipng
```
Macだと標準入力の最大文字数は1024文字(？)

Goの標準入力のサンプル(下記)をMacで動かしていたら1024文字以上入力できなくて、returnも押せなかった。(1文字消したらreturnできたから、return込みで1024文字)
http://golang.org/pkg/bufio/#example_Scanner_lines

```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		fmt.Println(scanner.Text()) // Println will add back the final '\n'
	}
	if err := scanner.Err(); err != nil {
		fmt.Fprintln(os.Stderr, "reading standard input:", err)
	}
}
```

最初、Goの最大文字数制限に引っかかっているのかと思って調べていたが、実はMacの制限らしい。
[MacOSX 10.6.7 cuts off stdin at 1024 chars](http://superuser.com/questions/264407/macosx-10-6-7-cuts-off-stdin-at-1024-chars)
[pexpect can't pass input over 1024 chars?](http://stackoverflow.com/questions/9218499/pexpect-cant-pass-input-over-1024-chars)
公式なドキュメントは見つからなかったので確信は持てない。
この制限を変えられる設定とかも見つけられませんでした。

まぁ、標準入力なら1024文字あれば大丈夫でしょうけど。
nginxでwordpressのパーマリンクをデフォルト以外に対応する

## パーマリンク対応

wordpressのパーマリンクを変更すると、RestfulAPIみたいに、ディレクトリ階層のURLに変更することができます。

![Screen Shot 2015-04-25 at 02.53.34.png](https://qiita-image-store.s3.amazonaws.com/0/69798/64de5066-d97f-217b-cff4-35a96527bc37.png)


ngix + php−fpmでは、nginx側でURLを処理して適切にphp-fpmへ渡してあげないといけません。（JavaEEのようにコンテキストを持たないので。。。）

[nginx本家のドキュメント](http://nginx.org/en/docs/http/ngx_http_core_module.html)に説明があったので、それを元に設定してみます。

```text:nginx.conf
中略…

server {

中略…
# URL デフォルトのリンクから変更した場合、URLでトライて、見つからないソースは、@wordpressロケーションとして飛ばします。
location / {
    try_files $uri $uri/ @wordpress;
}
# index.php など、通常の.phpでのアクセス。見つからなければ@wordpressロケーションとして飛ばします。
location ~ \.php$ {
    try_files $uri @wordpress;
    fastcgi_pass …;
    fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
    その他fastcgiの設定…
}

# 階層型URLのパーマリンクでアクセスされた場合、（.phpで実行されなかった場合）wordpressのトップページのindex.phpへ投げてしまいます。
location @wordpress {
    fastcgi_pass …;

    fastcgi_param SCRIPT_FILENAME /path/to/index.php;

    その他fastcgiの設定…
}
```


##実装例
```text:nginx.conf

中略

server {
    listen       80;
    server_name  yourhost.com;
    root         /usr/share/nginx/wordpress;
    index        index.php

    charset utf-8;

    location / {
        try_files $uri $uri/ @wordpress;
    }

    location ~ \.php$ {
        try_files $uri @wordpress;
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /usr/share/nginx/wordpress$fastcgi_script_name;
        include       fastcgi_params;
    }

    location @wordpress {
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /usr/share/nginx/wordpress/index.php;
        include       fastcgi_params;
    }

    error_page 404 /404.html;
    location = /40x.html {
    }
    
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

中略

```
【ハンズオン資料】電話API Twilio 初心者向け

このページは、Twilioのハンズオン参加者向けで作成しました。

**■ Twilio公式ドキュメント**
 ◎ <a href="http://jp.twilio.com/docs">Twilio公式ドキュメント</a>
 ◎ <a href="https://jp.twilio.com/docs/api/twiml">TwiML</a>
 ◎ <a href="https://jp.twilio.com/docs/api/rest">REST API</a>
 ◎ <a href="https://jp.twilio.com/docs/howto">サンプルコード</a>
 ◎ <a href="https://jp.twilio.com/docs/libraries">Helper ライブラリ</a>

**■ 新規アカウント登録（無料）**
https://jp.twilio.com/try-twilio/kddi-web

・新規登録ガイドライン（ブログ）
http://twilio.kddi-web.com/blog/developper/entry000195.html

**■ ハンズオンで使うコード**
・*テキストを音声へ：Say*
・ドキュメント：https://jp.twilio.com/docs/api/twiml/say

```xml:twiml-say.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say language="ja-jp">テキストを音声に変換します。</Say>
</Response>
```

・*録音：Record*
・ドキュメント：https://jp.twilio.com/docs/api/twiml/record

```xml:twiml-record.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say language="ja-jp">録音を行います。メッセージを残してください。</Say>
    <Record />
</Response>
```

・*音声ファイルの再生：Play*
・ドキュメント：https://jp.twilio.com/docs/api/twiml/play

```xml:twiml-play.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say language="ja-jp">音声ファイルを再生します。</Say>
    <Play>{音声ファイルのURL}</Play>
</Response>
```

・*通話処理の分岐：Gather*
・ドキュメント：https://jp.twilio.com/docs/api/twiml/gather

```xml:twiml-gather.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Gather timeout="10" finishOnKey="*">
        <Say>電話機の数字ボタンを押してください。</Say>
    </Gather>
</Response>
```

・PHPライブラリーから発信

```php:calling.php
<?php

require('../Services/Twilio.php');

$account_sid = "ACxxxxxxxxxxx";
$auth_token = "xxxxxxxxxxxx";

$client = new Services_Twilio($account_sid, $auth_token);

$call = $client->account->calls->create("+8150xxxxxxx", "+8180xxxxxxx", "http://xxxxxxx/say.xml", array("Method" => "GET"));
echo $call->sid;
```

■ コマンド
<b>scp</b> : scp -P 22 [filename] twilioapistudy@xxx.xxx.xxx.xxx:/var/www/html/twilio/xxxx/
例) scp -P 22 incomming.xml twilioapistudy@xxx.xxx.xxx.xxx:/var/www/html/twilio/xxxx/<br />
<b>mkdir(ディレクトリの生成)</b> : mkdir [option] [ディレクトリ名]
<b>rm(ディレクトリやファイルの削除)</b> : rm [option] [ディレクトリもしくはファイル名]
[option] -d：ディレクトリ削除、-r,-R：ディレクトリ無いのファイルを含めて削除

**■ TwilioJP-UG**
https://twiliojp-ug.doorkeeper.jp/

**■ Twilioのコミュニティ**
◎ twitter : @twilioforkwc
◎ facebook page : https://facebook.com/TwilioforKWC
◎ facebook group: https://facebook.com/groups/twilioforkwc
◎ SlideShare : http://slideshare.net/twilioforkwc
◎ Doorkeeper：http://twiliomeetup.doorkeeper.jp
◎ GitHub：https://github.com/twilioforkwc
◎ YouTube：https://youtube.com/user/twilioforkwc
Re:VIEWでHighlight

Highlightができるようになったのでメモ

## config.yml

```yaml
highlight:
   html: pygments
   latex: listings
```


## epub

###emlistを以下のように変更

```
//emlist[][c#]{
void OnGUI ()
{
    GUILayoutOption[] options = new [] {
        GUILayout.Width (96),
        GUILayout.Height (96)
    };
    EditorGUILayout.ObjectField (null, typeof(Texture2D), false, options);
    EditorGUILayout.Space ();
    EditorGUILayout.ObjectField (null, typeof(Sprite), false, options);
}
//}
```


### pdf

###emlistを以下のように変更

```
//emlist[][[Sharp\]C]{
void OnGUI ()
{
    GUILayoutOption[] options = new [] {
        GUILayout.Width (96),
        GUILayout.Height (96)
    };
    EditorGUILayout.ObjectField (null, typeof(Texture2D), false, options);
    EditorGUILayout.Space ();
    EditorGUILayout.ObjectField (null, typeof(Sprite), false, options);
}
//}
```

### layout.tex.erb の更新

カスタマイズしていたので以下のdiffを見ながらコマンドを追加していく

https://github.com/kmuto/review/commit/72356f39eab02416533ded3e8c91f9c40fda1d4a#diff-7d42a816b7b2ed41a8257510a9883706R9

### jlisting.sty 追加

http://www.takunoko.com/blog/mac%E3%81%ABjlisting-sty%E3%82%92%E5%B0%8E%E5%85%A5-tex/


### 試しにスタイルを変更してみる

適当に見つけたこれ

https://gist.github.com/Cheesebaron/d840258a9c41619dbdf0

Good!

![ss 2015-04-25 1.22.05.png](https://qiita-image-store.s3.amazonaws.com/0/5549/1132e77a-cfc6-99f9-06a7-a8bba2235d24.png)


## 問題

C# の言語設定、pygments では c# 、listingsでは [Sharp]C なので辛い...
cd to... (Finderからワンクリックでターミナルを開く）


密かに愛用していたcdto,
使ってたのは一つ古いバージョンだったことに気づいた。
配布元もGoogleCodeからgithubへ移行されておりました。

- https://github.com/jbtule/cdto


### 使い方メモ

zip解凍したらappをFinderのツールバーへもってけばいいんだが、"unsigned"のを持って行くと動かない様子。
"terminal"のを使うのが正解のようです。

コツは「⌘押しながらドラッグんドロップ」。

![finder.png](https://qiita-image-store.s3.amazonaws.com/0/9039/7c6387d3-180b-6b89-99aa-480aadb726c5.png "finder.png")

以上
ジョブスケジューリングを行う rufus-scheduler gem を試す #ruby

## :gem: 概要
ジョブスケジューリングを行う rufus-scheduler gem を試しました

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> インストール

~~~bash
$ gem install rufus-scheduler
~~~

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### サンプルコード: in

~~~ruby:in.rb
require 'rufus-scheduler'

scheduler = Rufus::Scheduler.new
puts Time.now
scheduler.in '10s' do
  puts Time.now
  puts "10秒後に通知"
end

sleep(15)
puts Time.now
~~~

* 出力確認

~~~bash
% ruby in.rb
2015-04-24 22:20:58 +0900
2015-04-24 22:21:08 +0900
10秒後に通知
2015-04-24 22:21:13 +0900
~~~

### サンプルコード: at

~~~ruby:at.rb
require 'rufus-scheduler'

scheduler = Rufus::Scheduler.new
puts Time.now
scheduler.at '2015/04/24 22:30:00' do
  puts Time.now
  puts "2015/04/24 22:30:00 に通知"
end

sleep(15)
puts Time.now
~~~

* 出力確認

~~~bash
% ruby at.rb
2015-04-24 22:29:49 +0900
2015-04-24 22:30:00 +0900
2015/04/24 22:30:00 に通知
2015-04-24 22:30:04 +0900
~~~

### サンプルコード: every

~~~ruby:every.rb
require 'rufus-scheduler'

scheduler = Rufus::Scheduler.new
puts Time.now
scheduler.every '2s' do
  puts Time.now
  puts "2秒おきに通知"
end

sleep(10)
puts Time.now
~~~

* 出力確認

~~~bash
% ruby every.rb
2015-04-24 22:27:04 +0900
2015-04-24 22:27:07 +0900
2秒おきに通知
2015-04-24 22:27:09 +0900
2秒おきに通知
2015-04-24 22:27:11 +0900
2秒おきに通知
2015-04-24 22:27:13 +0900
2秒おきに通知
2015-04-24 22:27:14 +0900
~~~

## その他
cron 形式もサポート。
詳細は、 GitHub の README 参照。

<i class="fa fa-external-link" style="font-size:1em;"></i> [rufus-scheduler GitHub](https://github.com/jmettraux/rufus-scheduler)

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [rufus-scheduler GitHub](https://github.com/jmettraux/rufus-scheduler)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [rufus-scheduler RubyGems](https://rubygems.org/gems/rufus-scheduler)
Python2で競技プログラミングする時に知っておきたいtips(その他の言語仕様編)


[Python2で競技プログラミングする時に知っておきたいtips](http://qiita.com/lethe2211/items/b91cc9e2b355ad32f1e6)の，その他の言語仕様についての部分を分割しました．

Pythonのバージョンは**2.7.5**（Python3では，入出力などの仕様が大きく異なるので，他の記事を参照することをおすすめします）．

## グローバル変数

[Python bite: グローバル変数へのアクセス | Inside ASCADE](http://inside.ascade.co.jp/node/41)

[関数の中でグローバル変数に代入する](http://www.ops.dti.ne.jp/ironpython.beginner/global.html)

全探索を書く際などにグローバル変数を用いることがあるが，Pythonでは，関数内からグローバル変数にアクセスする際に注意する点がある．

```python
# 関数内に変数の参照しかない場合
a = 'abc'

def function():
    print a

function() # 'abc'


# 関数内での変数への再代入を含む場合
a = 'abc'

def function():
    a = 'def'
    print a 

function() # def
print a # abc
```

上の例のように，関数内からグローバル変数を参照することはできるが，その関数内で同名のローカル変数に代入を行うと，その関数内ではローカルスコープとして扱われてしまう．
このため，そのままでは関数内でグローバル変数の値を変更することはできない．

```python
a = 'abc'

def function():
    global a
    a = 'def'
    print a

function() # def
print a # def
```

`global a`によって，変数aがグローバル変数であることを宣言することにより，関数内でグローバル変数の書き換えができる．
MacのKarabinerでAtom使用中はEmacsModeから除外する方法

Karabiner → Preferences → Misc & Uninstall → Open private.xml

private.xmlを以下のように修正

```xml:private.xml
<?xml version="1.0"?>
<root>
  <replacementdef>
    <replacementname>EMACS_MODE_IGNORE_APPS</replacementname>
    <replacementvalue>
      Atom,
    </replacementvalue>
  </replacementdef>
</root>
```

Karabiner → Preferences → Cange Key → Reload XML

で反映
Memcached 1.4.23, 1.4.24 リリースノート概観

Memcached 1.4.23 が 2015/4/19 にリリースされました。
2015/4/25 にリリースされた 1.4.24 では、クリティカルなバグが修正されています。

- [Release notes for Release 1.4.23 - Memcached - Google Project Hosting](https://code.google.com/p/memcached/wiki/ReleaseNotes1423)
- [Release notes for Release 1.4.24 - Memcached - Google Project Hosting](https://code.google.com/p/memcached/wiki/ReleaseNotes1424)

1.4.23 については、手元にざっと日本語訳したものがありますが、ライセンスがよくわからなかったので公開しません。(有識者の方はお知らせ下さい。)

概要と、コメントのみ記しておきます。
まだ動かして試してはいません。

## 概要

* コア部分の LRU アルゴリズムを大幅に書き換えたようです。
   * LRU を HOT, WARM, COLD の3つの領域に分けて、アクティブなアイテムを HOT に、非アクティブなアイテムを COLD に置いて、COLD のものから eviction させるというやり方。
   * バックグラウンドでスレッドが動き、この 3 つの LRU 領域の間でアイテムを行き来させる。
      * バックグラウンドのスレッドは expire したアイテムの削除もやってくれる。
   * オプションを指定しなければ以前のバージョンと同じように動作する。
   * OpenBSD の 2Q アルゴリズムというものをベースにしているそうです。
      * http://www.tedunangst.com/flak/post/2Q-buffer-cache-algorithm
* 性能向上
   * 新機能を有効にすれば大幅にメモリ効率が改善する可能性があります。
* バグ修正
   * flush_all がスレッドセーフでなかった問題
   * stats コマンドでクラッシュする問題(1.4.24)
* その他変更点
   * (たぶん 1.4.10 で導入された) spinlocks がなくなった。性能向上がなかったため。
      * (spinlocks について参考) https://code.google.com/p/memcached/wiki/ReleaseNotes1410

## 所感

コア機能を書き換えたため不安定になったのか、1.4.24 のリリースまでにいくつか Issue が報告されていました。  

* https://code.google.com/p/memcached/issues/list
* https://groups.google.com/forum/#!forum/memcached

2015/4/26 現在、報告されている致命的なバグはないようです。
が、現時点では、バージョンアップする場合は慎重に実施した方がよいように思います。
Swift1.2 で追加されたSet<T> を使ってみた。

# はじめに

Swift1.2からNSSetの代替としてSet<T>が追加されたので使ってみた。

# NSSetとの違い

* 型がある

```swift
var oldSet = NSSet(array: ["oldValue1", "oldValue2"])
var oldValue1: String
oldValue1 = oldSet.anyObject() as! String //キャストが必要

var newSet = Set<String>(arrayLiteral: "newValue1", "newValue2")
var newValue1: String
newValue1 = newSet.first!                 // キャスト不要
```


* Mutableの扱い

```swift
var oldMutableSet = NSMutableSet(array: ["oldValue1", "oldValue2"]) // NSMutableSet として宣言する必要がある
oldMutableSet.addObject("oldValue3")

var oldImmutableSet = NSSet(array: ["oldValue1", "oldValue2"]) // NSSetで宣言するとImmutableになる
oldImmutablSet.addObject("oldValue3")                          // コンパイルエラー

var newMutableSet = Set<String>(arrayLiteral: "newValue1", "newValue2") // varで宣言すれば自動でMutableになる
newMutableSet.insert("newValue3")

let newImmutableSet = Set<String>(arrayLiteral: "newValue2", "newValue2") // letで宣言すると自動でImmutableになる
newImmutableSet.insert("newValue3")                                       // コンパイルエラー
```

# 既存のプロジェクトに導入する際の注意点

これまでNSSetを引数に取っていたメソッドの引数がNSSetからSet<T>に変更されている。

```swift
/* SKScene のtouchesBeganの例 */

// Xcode6.2まで
override func touchesBegan(touches: NSSet, withEvent event: UIEvent)

// Xcode6.3から
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)

```
そのまま移行しようとするとビルドエラーになる。
ELB の ComodoSSL 証明書を更新

たまにしかやらないもんだから、すぐ忘れてしまう。

# 作業の流れ

1. 秘密鍵/CSRの発行
2. 証明書の申請
3. 証明書をELBに設置


# 詳細
## 1. 秘密鍵/CSRの発行

Webサーバーの秘密鍵と公開証明書署名要求(CSR)の対を生成します。

```
$ openssl req -new -newkey rsa:2048 -nodes -keyout private.key -out server.csr
```

対話形式で色々質問されるので、入力します。

```
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:23Ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your Company Inc.
Organizational Unit Name (eg, section) []: (blank)
Common Name (e.g. server FQDN or YOUR name) []:*.example.com
Email Address []:mail@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
```

`private.key` と `server.csr` の２つのファイルが生成されるので、無くさないように保管しておきましょう。

## 2. 証明書の申請

1. で作成した `server.csr` を使って Comodo に証明書発行を依頼します。
Web上の申請画面から行ってください。詳細は割愛します。

## 3. 証明書の設置

Comodo から証明書群が zip 形式で届きますので、展開してください。 
以下のものが含まれてると思います。


```
1.AddTrustExternalCARoot.crt (ルート証明書)
2.COMODORSAAddTrustCA.crt    (中間証明書 その1)
3.COMODORSADomainValidationSecureServerCA.crt (中間証明書 その2)
4.STAR_example_com.crt   (サーバ証明書)
```

この４つと `1.` で作成した `private.key` をELBに登録していきます。

----

AmazonWebConsole を開きます。
EC2 > Load Balancers > Listeners > SSL Certificate カラムの `Change` をクリックすると以下のような画面が表示されます。

![UploadSSLCertificate.png](https://qiita-image-store.s3.amazonaws.com/0/8963/5720c311-2286-ef08-c7f8-0487dfaa474b.png)

この4項目を登録する必要があります。

|項目|入力するもの|
|:--|:--|
|Certificate Name|名前（ただの識別子なのでなんでも良い）|
|Private Key|`1.` で作成した `private.key` |
|Public Key Certificate| サーバ証明書（ `STAR_example_com.crt` ）を `pem` 形式にしたもの|
|Certificate Chain|中間証明書とルート証明書をつないだもの|

### `Public Key Certificate` に関して

送られてきたサーバ証明書（ STAR_example_com.crt ）を、 `pem` 形式のファイルに変更してやる必要があります。
※直接 `crt` -> `pem` にはいけないので、一度 `der` 形式に変換します

```
$ openssl x509 -in STAR_example_com.crt -out STAR_example_com.der -outform DER
$ openssl x509 -in STAR_example_com.der -inform DER -out STAR_example_com -outform PEM
```

出来上がったサーバ証明書（ `STAR_example_com.pem` ）の中身をコピーして貼っつけてください。

### `Certificate Chain` に関して

Comodoから送られてきたファイルのうち、残りの証明書

```
1.AddTrustExternalCARoot.crt (ルート証明書)
2.COMODORSAAddTrustCA.crt    (中間証明書 その1)
3.COMODORSADomainValidationSecureServerCA.crt (中間証明書 その2)
```

を全て順番に貼っつけていきます。
$順番が大事$なので、そこだけ気をつけてください。

具体的には以下の順番となります。

1. COMODORSADomainValidationSecureServerCA.crt
2. COMODORSAAddTrustCA.crt
3. AddTrustExternalCARoot.crt

予め一つのファイルにしておくと確実です。

```
$ cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > CertChain.bundle
```

出来上がった `CertChain.bundle` の中身をコピーして、貼り付けます。
※各証明書を各々コピーして貼っつけてもOKです。 `---BEGIN CERTIFICATE---` と `---END CERTIFICATE---` の行を消さないように注意してください

---

最終的に以下のようになってればOKです。

![Uploaded.png](https://qiita-image-store.s3.amazonaws.com/0/8963/8cc4155b-8f1e-d778-6288-d24307b6081f.png)

あとは `SAVE` を押して登録した証明書に忘れずに変更してください。

設置した証明書が動いてるかの確認は以下のようなサイトでできます。
https://www.wormly.com/test_ssl

# 参考
- http://comodo.jp/support/crt/dtl_51
- http://serverfault.com/questions/643401/cant-get-network-solutions-certificate-chain-working-with-ec2-elastic-load-bala
Raspberry PiでArduino IDE BETAの使い方

最近2も出て盛んなRaspberry Pi。あれこれDIYに便利ですよね。ところで、1ボードマイコンつながりでArduinoも便利ですよね。するとArduino IDEをRaspbeerry Piで使いたくなると思います。
しかし、Debianにおける現在のArduino IDEのパッケージ提供はバージョン1.0.1のみです。

> 追記：2016/10現在のjessieレポジトリでも1.0.5

また、公式から提供されるビルド済みArduinoはx86 or amd64向けのみで、ARM CoreをつんだRaspberryではそのまま使うことができません。
つまり、Arduino IDEのバグを見つけても解決できません。
それどころか、Arduino Dueのような最新のボードを利用することもできません。
そこで本稿では、Raspberry PiでArduino IDE BETAバージョンを使う方法を記します。

この記事ではバージョン1.5.6-r2BETAを対象とします。
他バージョンを使おうとしている人の手助けになれば幸いです。

1. Arduino IDE（ビルド済み版）のダウンロード
欲しいバージョンのLinux32bit向けビルド済み版をダウンロードし、展開します。
    * http://www.arduino.cc/en/Main/Software
    * previous release -> Arduino 1.5.6-r2 BETA -> Linux 32bit
    * `tar xzf arduino1.5.6-r2.tar.gz`

2. 必要なパッケージのインストール
rasbianの現在の標準であるwheezyではなく、テスト中のjessieを利用します。
本稿では両レポジトリを使用する手段を使いますが、jessieにアップグレードしてしまっても構いません。
    1. JAVAランタイムのインストール
      * ref: http://playground.arduino.cc/learning/linux
         * ~~`apt-get install oracle-java8-jdk`~~
         * `apt-get install oracle-java8-jre`
      * openjdk-6-jre以降でも構いません
    2. jessieレポジトリを追加し、wheezyのほうを優先設定にする
      * ref: https://nicohood.wordpress.com/2015/01/24/installing-avr-gcc-4-8-1-and-arduino-ide-1-6-on-raspberry-pi/
      * 上記URLのステップ2まで行う
      * 必要なパッケージをインストールする、依存関係が壊れるためアンインストールされるパッケージもあるはずです。
         * `apt-get -t jessie install gcc-avr avrdude avr-libc libjssc-java libastylej-jni gcc-arm-none-eabi bossa-cli`
 
3. Arduino IDEの設定を書き換える
    * ref: http://make.kosakalab.com/arduino/raspberry_pi/index.html
    * Arduino IDEの起動に必要なライブラリを整える
      * `$ cd [arduino-dir]/lib`
      * `$ cd libastylej.so libastylej.so.old`
      * `$ ln -s /usr/lib/jni/libastylej.so ./`
    * avrコンパイラの設定を変更する
      * `$ cd [arduino-dir]/hardware/arduino/avr/`
      * 'platform.txt'を以下のように編集する
    * armコンパイラの設定を変更する
      * `$ cd [arduino-dir]/hardware/arduino/sam/`
      * 'platform.txt'を以下のように編集する

      > 追記：Arduino IDEのバージョンが上がり、保存先が変更になりました
      > ~/.arduino15/packages/arduino/hardware/sam/[version]/platform.txt

4. 2-2にてアンインストールされたものに必要なものがあれば再インストールする
    * `apt-get -t jessie install [package]`とオプションをつけてjessie版インストールを試みましょう 

```diff:hardware/arduino/avr/platform.txt
- compiler.path={ide.path}/tools/avr/bin/..
+ compiler.path=/usr/bin/
```
```diff:hardware/arduino/avr/platform.txt
- tools.avrdude.config.path.linux={runtime.ide.path}/hardware/tools/avrdude.conf
- tools.avrdude.cmd.path={runtime.ide.path}/hardware/tools/avr/bin/avrdude
- tools.avrdude.cmd.path.linux={runtime.ide.path}/hardware/tools/avrdude
- tools.avrdude.config.path.linux={runtime.ide.path}/hardware/tools/avrdude.conf
+ tools.avrdude.config.path=/etc/avrdude.conf
+ tools.avrdude.cmd.path=/usr/bin/avrdude
+ tools.avrdude.cmd.path.linux=/usr/bin/avrdude
+ tools.avrdude.config.path.linux=/etc/avrdude.conf
```
```diff:hardware/arduino/sam/platform.txt
- compiler.path={runtime.ide.path}/hardware/tools
+ compiler.path=/usr/bin/
```
```diff:hardware/arduino/sam/platform.txt
- tools.bossac.path={runtime.ide.path}/hardware/tools
+ tools.bossac.path=/usr/bin/
``` 

Arduino開発者の手助けになれば幸いです。
CSV のヘッダー行の日本語をシンボルに変換して要素にアクセスしたりとか

半年に一回ぐらい CSV を読み込む必要に迫られて、その度にリファレンスで CSV 読み込み時のオプションを調べているので、よく使うやつを書いておく。

# 毎回やりたいこと

例えば以下の様な CSV があったとして、毎回次のようなことをやりたいと思ってリファレンスを調べる。

- `each` でイテレーションするときにヘッダー行は含めたくない
- 各行は配列ではなくヘッダー行の各要素をキーにするハッシュっぽく扱いたい
- ハッシュのキーは「名前」や「部署」ではなく `:row` や `:department` のようなシンボルにしたい
- 数字は文字列ではなく数値として取得したい
- 空白行はスキップしたい

```test.csv
ID,名前,部署,入社年度
1,山田太郎,人事部,2000

2,山田花子,経理部,2015
```

# やり方

以下のようにすればできる。

```ruby
require 'csv'

HEADER_TO_SYM_MAP = {
  'ID' => :id,
  '名前' => :name,
  '部署' => :department,
  '入社年度' => :year_joined
}

header_converter = lambda { |h| HEADER_TO_SYM_MAP[h] }
csv = CSV.read('test.csv', headers: :first_row, header_converters: header_converter, converters: :integer, skip_blanks: true)

csv.each do |row|
  p row
  HEADER_TO_SYM_MAP.values.each { |k| puts "#{k} : #{row[k]}" }
end
```

こんな結果になる。

```
#<CSV::Row id:1 name:"山田太郎" department:"人事部" year_joined:2000>
id : 1
name : 山田太郎
department : 人事部
year_joined : 2000

#<CSV::Row id:2 name:"山田花子" department:"経理部" year_joined:2015>
id : 2
name : 山田花子
department : 経理部
year_joined : 2015
```

# オプションの説明

### headers

`:first_row` を指定しておくと、一行目をヘッダとして扱い、以降の列が配列ではなく、ヘッダ行の各要素をキーとしてハッシュっぽくアクセスできる Row オブジェクトになる。配列を渡せばそれをヘッダー行として扱ってくれる。

### converters/header_converters

converters は各行のコンバータを、header_converters はヘッダー行の変換を行うコンバータを指定する。[CSV::Converters](http://docs.ruby-lang.org/ja/2.2.0/method/CSV/c/Converters.html) に書いてあるように、数字の変換などは予め用意されていてシンボルを渡すだけでできる。また、上記の例のように lambda を渡して自分で変換ルールを指定することもできる。

### skip_blanks

true なら空行をスキップする


---

自分が使うのはこれぐらいです。他にも良いやり方があるよ、という方はぜひコメント下さい。
SpringでDIされるオブジェクトのMockテスト その2


[「SpringでDIされるオブジェクトのMockテスト」](http://qiita.com/nyasba/items/cd72231f56536a9ef199)の続きです。

その後いろいろ書いていて、これが一番かなという結論に達したので紹介します。


## (4) MockitoとReflectionUtilsを使う

(3)とやってることは同じです。

```
@ContextConfiguration(locations = "classpath:context.xml")
class ServiceASpec extends Specification {

    @Autowired
    private ServiceA serviceA

    def setup() {
        RepositoryB repositoryB = Mockito.mock(RepositoryB.class)
        ReflectionTestUtils.setField(serviceA, "repositoryB", repositoryB)
    }

    def "RepositoryBをMockにしたテスト"() {
        when:
        sut.order1("test")

        then:
        // repositoryB.save("test")が1回呼ばれた
        Mockito.verify(repositoryB).save("test")
        
        // 上記以外でMockが呼ばれていない
        Mockito.verifyNoMoreInteractions(repositoryB)
    }
}
```

Assertionの結果はこのように出力されます。わかりやすい。

```結果
Argument(s) are different! Wanted:
repositoryB.save(
    "test"
);

Actual invocation has different arguments:
repositoryB.save(
    "test1"
);
```
PayPal Adaptive Payments 決済状態の更新時の通知の判別

Paypal Adaptive Payments chained paymentにて第2受取人がPENDINGになったあと、
第2受取人が受取処理を行った際に通知されるIPNにtransaction_typeが存在しないため、
どの値を元にPENDINGの解消を判別すればいいかわかりません。
An error occurred while installing nokogiri (1.6.3.1), and Bundler cannot continue.

```
bundle install
```

してたら下記のエラーが起きた場合の対処。

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/me/.rbenv/versions/2.1.6/bin/ruby extconf.rb --use-system-libraries
Building nokogiri using system libraries.
libxml2 version 2.6.21 or later is required!
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/me/.rbenv/versions/2.1.6/bin/ruby
	--help
	--clean
	--use-system-libraries=true
	--with-zlib-dir
	--without-zlib-dir
	--with-zlib-include
	--without-zlib-include=${zlib-dir}/include
	--with-zlib-lib
	--without-zlib-lib=${zlib-dir}/lib
	--with-xml2-dir
	--without-xml2-dir
	--with-xml2-include
	--without-xml2-include=${xml2-dir}/include
	--with-xml2-lib
	--without-xml2-lib=${xml2-dir}/lib
	--with-libxml-2.0-config
	--without-libxml-2.0-config
	--with-pkg-config
	--without-pkg-config
	--with-xslt-dir
	--without-xslt-dir
	--with-xslt-include
	--without-xslt-include=${xslt-dir}/include
	--with-xslt-lib
	--without-xslt-lib=${xslt-dir}/lib
	--with-libxslt-config
	--without-libxslt-config
	--with-exslt-dir
	--without-exslt-dir
	--with-exslt-include
	--without-exslt-include=${exslt-dir}/include
	--with-exslt-lib
	--without-exslt-lib=${exslt-dir}/lib
	--with-libexslt-config
	--without-libexslt-config

extconf failed, exit code 1

Gem files will remain installed in /Users/me/dev/work/zzz/xxx/vendor/bundle/ruby/2.1.0/gems/nokogiri-1.6.3.1 for inspection.
Results logged to /Users/me/dev/work/zzz/xxx/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-14/2.1.0-static/nokogiri-1.6.3.1/gem_make.out
An error occurred while installing nokogiri (1.6.3.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.3.1'` succeeds before bundling.
```

下記によると、

http://stackoverflow.com/questions/26631482/gem-install-nokogiri-v-1-6-3-1-on-os-x-10-10-yosemite-not-installing

```bash
> brew update
> brew install libxml2 libxslt libiconv

> brew --prefix libxml2
/usr/local/opt/libxml2

> brew --prefix libxslt
/usr/local/opt/libxslt

> brew --prefix libiconv
/usr/local/opt/libiconv

> gem uninstall nokogiri

> gem install nokogiri -v 1.6.3.1 -- --with-xslt-dir=/usr/local/opt/libxslt --with-iconv-dir=/usr/local/opt/libiconv --with-xml2-config=/usr/local/opt/libxml2/bin/xml2-config --with-xslt-config=/usr/local/opt/libxslt/bin/xslt-config

```

で、上記は本家サイトの下記にも書かれていたことだったので従っておくべきなのでしょう。

http://www.nokogiri.org/tutorials/installing_nokogiri.html#mac_os_x

私の手元ではこれで問題なくいけた様子です。一旦gemを綺麗にした方が良いかもしれません。
intel 8080 アセンブラ　16bit加減算

#de + hl = hl
```
add16:
	dad	d
	ret       
```
[今すぐ実行](http://jsdo.it/ohisama1/ckAh)
#de - hl = hl
```
sub16:
	mov	a, e
	sub	l
	mov	l, a
	mov	a, d
	sbb	h
	mov	h, a
	ret    
```
[今すぐ実行](http://jsdo.it/ohisama1/j9mx)
intel 8080 アセンブラ 16bit乗算

#de * hl = hl
```
mul16:
	mov		b, h
	mov		c, l
	lxi		h, 0
mul1:
	mov		a, c
	rrc
	jnc		mul2
	dad		d
mul2:
	xra		a
	mov		a, b
	rar
	mov		b, a
	mov		a, c
	rar
	mov		c, a
	ora		b
	rz
	xra		a
	mov		a, e
	ral
	mov		e, a
	mov		a, d
	ral
	mov		d, a
	ora		e
	rz
	jmp		mul1
```
#補足
 [今すぐ実行](http://jsdo.it/ohisama1/vTei)
[iBooks Author] HTMLウィジェットの制作はじめました

Linux使いがMac始めました。

### HTMLウィジェットの作り方

公式ヘルプが2つあるの、なんでだろう。

[iBooks Author：HTML ウィジェット作成について](https://support.apple.com/ja-jp/HT5068)
[iBooks Author での HTML ウィジェット作成について](https://support.apple.com/ja-jp/HT204433)


### 公式ヘルプに従ったInfo.plist

```jade:Info.plist.jade
doctype xml
doctype plist PUBLIC "-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd"

plist(version="1.0")
  dict
    key CFBundleDevelopmentRegion
    string English

    key CFBundleDevelopmentRegion
    string English

    key CFBundleDisplayName
    string Hello World

    key CFBundleIdentifier
    string com.apple.widget.HelloWorld

    key CFBundleName
    string Hello World

    key CFBundleShortVersionString
    string 1.0

    key CFBundleVersion
    string 1.0

    key Height
    integer 768

    key MainHTML
    string HelloWorld.html

    key Width
    integer 1024

    key IBNotifiesOnReady
    true/

```

### 参考文献

 * [iBooks Author応用: HTMLウィジットを使う](http://yoppa.org/itunes13/4777.html)
 * [iBooks AuthorのHTMLウィジェットの作り方](http://wakufactory.jp/densho/iBooks/)
【自分用】新規ユーザを作成して、鍵ファイルを作成するshell

#概要#
ユーザと鍵を毎度毎度コマンドうつの面倒だからshellにしてみた。
自分用スクリプト第二弾。
rootで実行。対話的に動く。

#以下script#
```bash:useradd.sh

#!/bin/sh -x
clear

# input user information
echo "input User Name"
read UserName
echo
echo "input UID"
read UserID
echo
echo "input GroupName"
read GroupName
echo
echo "input GID"
read GroupID
echo
echo "input Password"
read PASSWD
echo

# confirm input data
echo "UserName:  ${UserName}"
echo "UID:       ${UserID}"
echo "GroupName: ${GroupName}"
echo "GroupID:   ${GroupID}"
echo "Password:  ${PASSWD}"
echo

echo "Are You OK?"
read RES
case ${RES} in
   Yes|yes|Y|y )
      break ;;
   No|no|N|n )
      exit ;;
   * )
      echo
      echo
      echo "input Yes or No"
      exit ;;
esac

# user/group create
echo
groupadd -g ${GroupID} ${GroupName}
useradd -g ${GroupID} -u ${UserID} ${UserName}
echo ${PASSWD} | passwd --stdin ${UserName}

# ssh key create
mkdir /home/${UserName}/.ssh
ssh-keygen -f /home/${UserName}/.ssh/rsa -t rsa -N ""

# ssh key change status
mv /home/${UserName}/.ssh/rsa /home/${UserName}/.ssh/${UserName}.pem
mv /home/${UserName}/.ssh/rsa.pub /home/${UserName}/.ssh/authorized_keys
chmod 700 /home/${UserName}/.ssh
chmod 600 /home/${UserName}/.ssh/*
chown -R ${UserName}. /home/${UserName}/.ssh
Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1

##はじめに
どうやらこのコンパイルエラー、出るパターンが複数あるようです。
厄介なのが、シンタックスエラーではないので何が原因か気がつきにくいという事。

##パターン1
http://stackoverflow.com/questions/26156561/xcode-6-0-1-command-applications-xcode-app-contents-developer-toolchains-xcoded

私がつまづいたのは上記の割りかし簡単な内容でした。
最適化時にコンパイルエラーが出るみたいで、最適化無しでコンパイルを一度掛けたらいけました。
プロジェクトファイル -> Target -> Build Settings ->
Swift Compiler - Code Generation (Xcode6.3で下から４番目の項目) ->
Optimization Level -> Release -> `Fastest` を `None` へ変更

コンパイル時間が死ぬほど長くなりました。(初回だいたい2〜3分掛かった。

##パターン2
http://stackoverflow.com/questions/26156561/xcode-6-0-1-command-applications-xcode-app-contents-developer-toolchains-xcoded
こちらでいくつかパターンが記載されてました。
多分、全パターン記載されてると思います。(ぶん投げ


##おわりに
初投稿記事です。いい加減な感じがプンプンしますね。
お粗末様でした。
IntelliJ で最近検索した結果をすぐに出す

普通は `Cmd + E` で最近見たソース/パネルの一覧にアクセスできるけど、  検索結果にフォーカスがある状態で `Cmd + E` すると、最近検索した結果を再度表示できます。

`Option + F7` で繰り返し Find Usage して大元の呼び出しを探すなどしているとき、ひとつ前の Find Usage 結果にすぐに戻れるのはとっても便利。もちろん普通のテキスト検索で、調べてるキーワードが複数あるときも有用です。
レスポンシブデザインでも便利な Modernizr


## JavaScript

### ブラウザ幅で分岐

Bootstrap参考：
xs: 0, sm: 576px, md: 768px,
lg: 992px, xl: 1200px

```
const mq = [];
mq.mobile  = Modernizr.mq('(max-width: 575px)');
mq.tablet  = Modernizr.mq('(min-width: 576px) and (max-width: 991px)');
mq.desktop = Modernizr.mq('(min-width: 992px)');

if ( mq.mobile ) { モバイル表示のみ処理させたい処理 }
if ( mq.desktop ) { デスクトップ表示のみ処理させたい処理 }
```

### タッチデバイスなら touchイベント、以外は clickイベント

clickイベントはタッチデバイスでも有効だが、touchイベントの方が圧倒的にレスポンス良いのでそちらを使う

``` javascript
var clickEvent = Modernizr.touch ? 'touchend' : 'click';

$('#hoge').on(clickEvent, function () {
  //処理
});
```

### ブラウザが特定のCSS3プロパティやHTML5の機能に対応していたら処理

例) Transitions (CSS3アニメーション) 対応ブラウザのみ実行

``` javascript
if(Modernizr.csstransitions) {
  //処理
}
```


```
// 一例
// audio, applicationcache, backgroundsize, borderimage, borderradius,
// boxshadow, canvas, canvastext, cssanimations, csscolumns,
// cssgradients, cssreflections, csstransforms, csstransforms3d,
// csstransitions, draganddrop, flexbox, fontface, geolocation,
// hashchange, history, hsla, indexeddb, inlinesvg, localstorage,
// multiplebgs, opacity, postmessage, rgba, sessionstorage, smil,
// svg, svgclippaths, textshadow, touch, video, webgl, websqldatabase,
// websockets, webworkers
```

[» Modernizr JS object property 一覧 (公式サイト)](http://modernizr.com/docs/)

------------------------------------------------------------


## CSS/Sass

後で追加

<!--

html5.siv を含む。

前もってhtml要素に no-js クラスを付けとく。
JavaScript がONならModernizrが動的にそのクラスを js に替えくれるので、JSのON/OFF時各対応のCSSを書くことができる。

``` CSS
/* JavaScriptがOffの場合のみ表示 */
.no-js header[role=banner]:before {
  content: "当Webサイトは、JavaScript を On にしないと適切にご覧いただけません。";
  background-color: red;
  color: #FFF;
  font-weight: bold;
}
```

そのブラウザが対応してないCSSプロパティやの機能にはbodyタグに no-XXXX クラス が付く

``` CSS
.rgba #foo    { color: rgba(0,0,0,0.6); }/* 対応時の記述 */
.no-rgba #foo { color: #666; }/* 非対応時の記述 */
```


★★背景グラデーション。プリフィックスは省略 (gulp等で自動付加)

``` CSS
.hoge {
	background: linear-gradient(white, gray);
}

.no-cssgradients .hoge {/* IE9以下 */
  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#CCC',endColorstr='#666');
}
```


★★background-sizeをサポートしている場合はフィットさせる

``` CSS
#category_header {
  background: #E7E7E7 no-repeat left center;
}
  .backgroundsize #category_header {
    background-image: url(img/header_category_glass_2x.jpg);
    background-size: cover;/* IE8は非対応 */
  }
  .no-backgroundsize #category_header {
    background-image: url(img/header_category_glass.jpg);
  }
```

-->
最近、便利なツールが多すぎて何を使えばよいのかわからない、そんな人におすすめするツール

##Packer

https://www.packer.io

[Docker](https://www.docker.io/)と同じような感じのツール。コンテナや仮想化。基本的には、[Rocket](https://github.com/coreos/rkt)と[Vagrant](https://www.vagrantup.com/)を使うのがおすすめだけど、Packerもいい感じかもしれない。

##Grunt

http://gruntjs.com/

Web開発でローカルビルドの自動化に役立つツール。

##Wercker

https://app.wercker.com/

[Travis CI](http://travis-ci.com/)や[CircleCI](http://travis-ci.com/)が有名なCIサービス。ビルドの自動化など。

##Hugo

http://gohugo.io/

[Octopress](https://github.com/imathis/octopress)や[Middleman](https://github.com/middleman/middleman)が有名な静的サイトジェネレーター。

##Bitbucket

https://bitbucket.org/

[GitHub](https://github.com/)が有名なGitリポジトリ管理サイト。プライベートリポジトリが設定可能。

##GitBook

https://www.gitbook.com/

サイトジェネレーターとしても、書籍ジェネレーターとしても使用できる。テキスト編集に興味があるなら[Pandoc](http://sky-y.github.io/site-pandoc-jp/users-guide/)というツールを知っておいても損はないかもしれない。また、おすすめのMarkdownエディタは、[Haroopad](http://pad.haroopress.com/)です。

##Atom

https://atom.io/

これは使ったことがないのだけど、[Atom](https://atom.io/)がすごく流行ってるらしいし、良いらしいです。これは、エディタです。[neovim](https://github.com/neovim/neovim)というものも出てきています。


##awesome-go

https://github.com/avelino/awesome-go

golangで書かれたツールがまとめられています。


##Arch Linux

https://www.archlinux.org/

Linux OSです。最近、ますます本格的にArch Linuxを使い出した。特に、調べものは、[Arch wiki-jp](https://archlinuxjp.kusakata.com/wiki/%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA:%E7%9B%AE%E6%AC%A1), [Arch wiki-en](https://wiki.archlinux.org/index.php/Table_of_contents)で行うと良いです。

##Numix

http://numixproject.org/

Numixは、Linuxのデスクトップに使えるテーマです。

通常: https://github.com/numixproject/numix-icon-theme
丸型: https://github.com/numixproject/numix-icon-theme-circle

##IcoMoon

https://icomoon.io/


[Font-Awesome](http://fortawesome.github.io/Font-Awesome/)などが有名なアイコンフォントです。



##Copy

https://www.copy.com/

[Dropbox](https://www.dropbox.com/ja/)の代わりに使えるクラウドドライブ。
【Swift】UIImageをリサイズする


```swift:UIImageExtension.swift
extension UIImageExtension {

	func resize(size: CGSize) -> UIImage {
		let widthRatio = size.width / self.size.width
		let heightRatio = size.height / self.size.height
		let ratio = (widthRatio < heightRatio) ? widthRatio : heightRatio
		let resizedSize = CGSize(width: (self.size.width * ratio), height: (self.size.height * ratio))
		UIGraphicsBeginImageContextWithOptions(resizedSize, false, 2)
		drawInRect(CGRect(x: 0, y: 0, width: resizedSize.width, height: resizedSize.height))
		let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
		UIGraphicsEndImageContext()
		return resizedImage
	}
	
	// 比率だけ指定する場合
	func resize(#ratio: CGFloat) -> UIImage {
		let resizedSize = CGSize(width: Int(self.size.width * ratio), height: Int(self.size.height * ratio))
		UIGraphicsBeginImageContextWithOptions(resizedSize, false, 2)
		drawInRect(CGRect(x: 0, y: 0, width: resizedSize.width, height: resizedSize.height))
		let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
		UIGraphicsEndImageContext()
		return resizedImage
	}
}
```

**Aspect比**を保ってリサイズするようにしました。
[Metal] Uniform変数を使ってシェーダにデータを送る


日本語が少ないのはいいんだけど、英語の記事もなんだか少なくて細かいところがわかりづらくて四苦八苦。
基本的なUniform変数の取り扱いも若干手間取ったのでメモ。

## データの準備

「[iOSの新グラフィックAPI - Metal入門してみる](http://qiita.com/edo_m18/items/0fd6971c98c27a125d6e)」でも書いたけど、Metalの特徴としてCPUとGPUのメモリ共有があります。
なので、データの準備がかなり楽にできます。こんな感じ↓

```objc:type-define
struct AnyUniforms {
	bool  useHoge;
	float size;
	float offset[2];
};
```

まずはこんな感じで構造体を定義します。
これをなにがしかのヘッダファイルで宣言しておき、ObjC側とシェーダ側双方に読み込ませます。

## ObjC側の準備

```objc
id <MTLBuffer> buffer = [device newBufferWithLength:sizeof(struct AnyUniforms)
                                            options:MTLResourceOptionCPUCacheModeDefault];

struct AnyUniforms *circleBuf = (struct AnyUniforms*)[buffer contents];
buffer->useHoge   = YES;
buffer->offset[0] = 0.5;
buffer->offset[1] = 0.5;
buffer->size      = 0.35;
```

準備はこんな感じで行います。
バッファを取得して直に値を設定します。

### GPUに送信

GPU側に伝えるにはMTLRenderCommandEncoderの`setFragmentBuffer:offset:atIndex:`メソッドを使って伝えます。

```objc
[renderEncoder setFragmentBuffer:buffer offset:0 atIndex:0];
```

## シェーダでデータを使う

送られたデータは以下のようにして使うことができます。

```metal
fragment half4 frag(VertexOut input [[stage_in]],
                    constant AnyUniforms &any_uniforms [[buffer(0)]]) {
	if (any_uniforms.useHoge) {
		// ...
	}
}
```

OpenGLのバインド的な処理がなくて非常に分かりやすくデータを扱えるのがいいですね。
【Swift】UIImageを左右反転させる	


こんな感じで実現できました。

```swift:UIImageExtension.swift
extension UIImage {
	func flipHorizontal() -> UIImage {
		UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
		let imageRef = self.CGImage
		let context = UIGraphicsGetCurrentContext()
		CGContextTranslateCTM(context, size.width, size.height)
		CGContextScaleCTM(context, -1.0, -1.0)
		CGContextDrawImage(context, CGRect(x: 0, y: 0, width: size.width, height: size.height), imageRef)
		let flipHorizontalImage = UIGraphicsGetImageFromCurrentImageContext()
		UIGraphicsEndImageContext()
		return flipHorizontalImage
	}
}
```

これも同様に結構使えました。
【Swift】UIImageの色を変える（塗りつぶす）


こんなシンプルな内容

**2018/01/18 更新**

## Swift4

```swift:UIImageExtension.swift
extension UIImage {
    func tint(color: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        color.setFill()
        let drawRect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        UIRectFill(drawRect)
        draw(in: drawRect, blendMode: .destinationIn, alpha: 1)
        let tintedImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return tintedImage
    }
}
```

## Swift2

```swift:UIImageExtension.swift
extension UIImage {
	func tint(color: UIColor) -> UIImage {
		UIGraphicsBeginImageContextWithOptions(size, false, 0)
		color.setFill()
		let drawRect = CGRectMake(0, 0, size.width, size.height)
		UIRectFill(drawRect)
		drawInRect(drawRect, blendMode: kCGBlendModeDestinationIn, alpha: 1)
		let tintedImage = UIGraphicsGetImageFromCurrentImageContext()
		UIGraphicsEndImageContext()
		return tintedImage
	}
}
```

同じ画像の色違いを表示したい時には使える関数だと思います。
jQueryでページ遷移時にajaxっぽくフェードアウトさせる

## それっぽくしたい
ajaxのなめらかなページ遷移（フェードアウト）を静的なページでも再現できないかと試行錯誤したときのメモ。

## HTML
```html
<div class="loading" id="loading"></div>
```

## CSS
```css
.loading {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 99999;
    background-color: #fff;
}
```

## JavaScript
```js
var $loading = $('#loading');
var speed    = 500;

// 読み込みが終わったらフェードイン
$(window).on('load', function() {
    $loading.fadeOut(speed);
});

// target="_blank"が設定されていないaタグをクリックしたら実行
$('a[target!="_blank"]').on('click', function(e) {
    e.preventDefault();

    // hrefからリンクを取得
    var link = $(this).attr('href');

    // リンク内にアンカーが含まれていなければ
    if (!link.match(/#/i)) {

        // フェードアウト完了後、リンク先へ移動
        $loading.fadeIn(speed, function() {
            location.href = link;
        });

    }

});
```

## 注意点
- それっぽくなので過度な期待はしない
- 背景が白くないとページ遷移した際にチラつく
- location.hrefによる遷移なので不具合が出てくるかも
- 色々なアニメーションをサクッと実装するなら[Animsition](http://git.blivesta.com/animsition/)を使おう

##参考
[静的なサイトの画面遷移時にAJAX風のアニメーションを追加する（jQuery）](http://html-five.jp/479/)
C#で素因数分解

# C#で素因数分解するプログラム

コンソール入力から値を受け取り、因数分解後の要素を出力するプログラムです。
今回はC#らしく素因数要素をIEnumerable<int>で返すように実装しています。

```csharp:Prime.cs
public class Prime{
    public static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        Console.WriteLine("{0} = {1}", n, string.Join(" x ", PrimeFactors(n)));
    }
     
    public static IEnumerable<int> PrimeFactors(int n)
    {
        int i = 2;
        int tmp = n;
         
        while (i * i <= n) //※1
        {
            if(tmp % i == 0){
                tmp /= i;
                yield return i;
            }else{
                i++;
            }
        }
		if(tmp != 1) yield return tmp;//最後の素数も返す
    }
}
```

```text:実行例1
> 18
18 = 2 x 3 x 3
```

```text:実行例2
> 2048
2048 = 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2
```

```text:実行例3
> 2146654199
2146654199 = 46327 x 46337
```

##※1
素因数分解は、

```math
「合成数 x は p \leq \sqrt{x} を満たす素因子 p をもつ」
```

という性質を用いて高速に求めることができます。ここではsqrt計算するコストより2乗するコストが安いだろうということでiを2乗した数とnを比較しています。
Dockerfileのみで管理 or Dockerfile＋Chefレシピで管理　どっちがいいの？

ちょこっと触っていたのですが、
DockerfileとChefレシピって使い方かぶってませんか？

区分けが曖昧でベストエフォートがわからない。
とりあえず個人的なまとめをおいておきますね。


##ChefとDockerの登場背景
###Chef
大量にVMが出てきて、設定が面倒だどうしよう？という経緯。
###Docker
外部の影響を受けないコンテナをいつでもどこでも簡単に立ち上げよう

それぞれコンセプトが違う。

でもコンセプトが違うのは、使わない理由にならないので置いとく。
使えればいいんだ使えれば。

##機能的に
Dockerで出来ることは、Chefでできる。
でもChefで出来ることで、Dockerが出来ないことはある。
※base imagesを読み込むとかその辺は排除
例えばif文（条件付きアクション）はChefで出来るけど、Dockerでは難しい。（シェルにすればいい）


##今立ててるコンテナに対して
Chefなら、いま起動しているコンテナに対して、すぐに設定変更できる。
コンテナが100個あってもできる。

Dockerfileに直書きだとムリ。
もう一回コンテナ作りなおして、入れ替えないと駄目。

##現在のサーバの設定を確認するには？
複数使うと、Dockerfile＋Chefレシピみないといけない
めんどう。
たいへん。

##複数使うの大変
DockerとChefそれぞれ書くの大変。
書き方も違うし。（言語が違う）

学ぶのも学習コスト高い。
それならDockerfileだけでいいんじゃ。

##まとめ
#Docker+Chefのメリット
・いま起動しているコンテナに対して、すぐに設定変更できる。
・条件分岐処理を使いたい時は簡単

#Dockerだけのメリット
・Chef学ばなくていい
・現行サーバの設定確認する時Dockerfileだけで済む


思いついたのがこんなもんだけなんですが、何かあったら教えていただけると幸いです。
setTimeoutの限界を超える

# はじめに
ループしながらDOM（プログレスバーなど）を更新したい際、`setTimeout`を使うと思います。
しかし、その際`setTimeout`の 4ms がネックになることがあります。
アニメーションよりも速度が優先される場合、この 4ms は無駄です。

また、`setTimeout`や`requestAnimationFrame`はページがノンアクティブになると、分解能が 1000ms に落ちます。

# 参考
もう5年前の記事ですが、こんなものがありました。
postMessageを利用したものです。
[setTimeout with a shorter delay](http://dbaron.org/log/20100309-faster-timeouts)

クロスブラウザ対応したものもありました。
[Cross-browser-compatible setZeroTimeout](https://gist.github.com/mathiasbynens/579895)

# コード
少々改良しました。

```js:setZeroTimeout.js
var setZeroTimeout = (function(global) {
    var timeouts = [];
    var messageName = "zero-timeout-message";
    
    function handleMessage(event) {
        if (event.source == global && event.data == messageName) {
            if (event.stopPropagation) {
                event.stopPropagation();
            }
            if (timeouts.length) {
                timeouts.shift()();
            }
        }
    }
    
    if (global.postMessage) {
        if (global.addEventListener) {
            global.addEventListener("message", handleMessage, true);
        } else if (global.attachEvent) {
            global.attachEvent("onmessage", handleMessage);
        }
        
        return function (fn) {
            timeouts.push(fn);
            global.postMessage(messageName, "*");
        }
    } else {
        return function () {
            setTimeout(fn, 0);
        }
    }
}(window));
```

## 使い方
ループしながらDOMを更新します。

```js:example.js
function loop() {
    // DOMを更新するプログラム
    // ...
    setZeroTimeout(loop);
}
loop();
```
# デモ
要素をクリックするとカウントが始まります。
[setZeroTimeout - JSFiddle](https://jsfiddle.net/kou/j73tLum4/8/)

# 最後に
ノンアクティブでも分解能が落ちません。
git で clone せずに特定のファイルを取り出したい

# git で clone せずに特定のファイルを取り出したい

## 追記：
書いた後に調べたら`git archive`でできそう。
https://www.glpgs.com/e-blog/archives/175
けど、sha1でのコミット指定はできないっぽい。

```bash:駄目
git archive --remote ssh://some_repos.git 9ad97486f5d75898af6a8a706db43f579df38300:app/modules/ | tar x
```
ブランチかタグ指定じゃないと駄目なのかな。
https://confluence.atlassian.com/display/STASHKB/git+upload-archive+archiver+died+with+error


## 要fetch

sha1で特定のコミット指定して落としてくるならこうかな？

```bash:git_partial_export.sh
#!/bin/bash

# 出力するダミーのリポジトリ
git init /tmp/partial_export
cd /tmp/partial_export

# 参照したい remote を追加
git remote add another ssh://some_repos.git
git fetch another

# 取り出したいファイルとかフォルダとか
git config core.sparsecheckout true
echo "app/modules/lib" > .git/info/sparse-checkout

# コミットを指定して取り出す
git read-tree -m -u 310ba582c49637d4a14da9ad23af04d0ef0e1a62

# かくにん
tree /tmp/partial_export
```
Macの辞書ファイルを作るスクリプト

githubで使える絵文字のmarkdown形式でサジェスト？してくれる、辞書ファイルを作るくそみたいなスクリプト
作ったファイルを設定で取り込めば"えじ"で変換すると:hoge:みたいな感じでgithubで使える絵文字がでてくれます。

http://www.emoji-cheat-sheet.com
から絵文字を持ってきてます。

#### create_emoji_dictionary.sh
```bash
#!/bin/sh
EMOJI_DIR=/tmp/emoji_`date +"%Y%m%d_%H%M%S"`
mkdir -p $EMOJI_DIR
python emoji_to_dic.py > $EMOJI_DIR/mardkdown_utf8.txt
iconv -f utf-8 -t utf-16 $EMOJI_DIR/mardkdown_utf8.txt > $EMOJI_DIR/mardkdown.txt
open $EMOJI_DIR
```

#### emoji_to_dic.py
```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import codecs
import sys
import urllib
from HTMLParser import HTMLParser

'''
Fixed variables
'''
url = 'http://www.emoji-cheat-sheet.com/'

'''
Parser
'''
class EmojiParser(HTMLParser):
  def __init__(self):
    HTMLParser.__init__(self)
    self.isToken = False
    self.token = ''

    '''
    ' Find software version tag.
    '''
  def handle_starttag(self, tag, attrs):
    self.isToken = False 
    attrs = dict(attrs)
    if tag != 'span':
      return
    if 'class' not in attrs:
      return
    if attrs['class'] != 'name':
      return
    self.isToken = True

  '''
  ' Extraction version data.
  '''
  def handle_data(self, data):
    data = data.strip('\ \n:')
    if not self.isToken:
      return
    if not data:
      return
    print u'"えじ",":' + data + u':","普通名詞"'

def GetParser():
  return EmojiParser()

'''
Main.
'''
if __name__ == "__main__":
  parser = GetParser()
  if not parser:
    print 'none parser.'
    sys.exit(1)
  sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
  parser.feed(urllib.urlopen(url).read())
```
キーボードのタッチが後ろに伝搬してしまうバグ対応

# Issue
iOSには
1. iOSにてキーボードウィンドウを出す
2. ホームボタンなどでアプリをバックグラウンドにする
3. アプリをフォアグラウンドにもどす
と、すると、キーボードの変換などをタッチした時に後ろのビューにタッチが伝搬してしまうというバグがあります。

# Action
アプリがフォアグラウンドになるタイミングでUITextEffectsWindowのプロパティをごにょごにょすると後ろのviewのHitTestが発火しなくなります。

```objc
- (void)applicationWillEnterForeground:(UIApplication*)application
{
  NSArray* windows = [[UIApplication sharedApplication] windows];
  if ([windows count] > 1)
  {
    for (UIWindow* w in windows) {
      if(!w.opaque && [[NSString stringWithFormat:@"%@", [w class]] isEqualToString:@"UITextEffectsWindow"])
      {
        BOOL hidden = w.hidden;
        // 1度HiddenをYESにする
        w.hidden = YES;
        w.hidden = hidden;
        break;
      }
    }
  }
}
```
※UITextEffectsWindowはプライベートAPIなのでクラス名でフィルタしてUIWindowオブジェクトとして処理しています。