OmniAICreator/Qiita-1.07M huggingface dataset:
テキストボックスに入力した全角英数字を半角に変換する（AngularJS版）

[AngularJS Advent Calendar 2014](http://qiita.com/advent-calendar/2014/angularjs) の 13日目の投稿です。

javascript で全角英数字を半角英数字に変換するときは、
いつも [こちら](http://d.hatena.ne.jp/Rewish/20100427/1272296260) の記事を参考にさせていただいているのですが、
今回はこれをAngularJSで使ってみようと思います。

## AngularJS なら即時変換も簡単！

日本語ローマ字モードで全角英数字のみ入力される、という条件で書いてみます。
(今回、記号の入力に対する処理は省略します。)

```html:sample.html
<div ng-app="myApp" ng-controller="SampleCtrl">
    <input type="text" ng-model="hoge" ng-change="strReplace()" />
    <p>{{hoge}}</p>
</div>
```

```javascript:sample.js
var myApp = angular.module('myApp',[]);

myApp.controller('SampleCtrl', ['$scope', function($scope) {
    $scope.hoge= "";
   
    // テキストボックスに文字が入力されたらイベント発火
    $scope.strReplace = function () {
        var str = $scope.hoge;

        // 1文字ずつ変換されていくので、正規表現のグローバルマッチ(g)は不要
        if (str.match(/[^0-9a-zA-Z]/)) {
            str = str.replace(/[Ａ-Ｚａ-ｚ０-９]/, function(s) {
                return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
            });
            $scope.hoge= str;
        }
    };
}]);
```

デモは[こちら](http://jsfiddle.net/64ndnm9m/)
どうでしょう、入力したそばからどんどん変換されていきます！

## 問題点：　日本語の母音は残ってしまう

デモを動かしてみた方、お気付きかもしれません。
日本語の母音(あ、い、う、え、お) だけは半角英字に変換されず残ってしまいます。

日本語ローマ字入力の未確定文字(Enterキーを押す前の文字) への対応は
各言語共通の悩みのようで、技術Blog等にはほとんど書かれていません。
おそらくここからは個人のセンスが問われそうです。

幸い今回のサンプルでは
「ぎゃ(gya)」「ぁ(la)」「ん(n)」などの子音部分だけは変換できているので、
どうにかしなければいけないのは「あ～お」の5文字のみ。

というわけで、次のように対応してみました。
(決してスマートなやり方ではない。。。)

## 苦し紛れの回避策

```html:sample2.html
<div ng-app="myApp" ng-controller="SampleCtrl">
    <input type="text" ng-model="hoge" ng-change="strReplace()" ng-blur="vowelReplace()"/>
    <p>{{hoge}}</p>
</div>
```

```javascript:sample2.js
var myApp = angular.module('myApp',[]);

myApp.controller('SampleCtrl', ['$scope', function($scope) {
    $scope.hoge= "";
   
    // テキストボックスに文字が入力されたらイベント発火
    $scope.strReplace = function () {
        var str = $scope.hoge;

        // 1文字ずつ変換されていくので、正規表現のグローバルマッチ(g)は不要
        if (str.match(/[^0-9a-zA-Z]/)) {
            str = str.replace(/[Ａ-Ｚａ-ｚ０-９]/, function(s) {
                return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
            });
            $scope.hoge= str;
        }
    };

    // ***** ここからが変更箇所です *****
    // 日本語母音はフォーカスアウト時に変換
    $scope.vowelReplace = function () {
        $scope.hoge= replaceVowel($scope.hoge);
    };
}]);

function replaceVowel(str) {
    // テキストボックス内に「あいうえお」が含まれていたら「aiueo」に変換するだけ。
    if (str.match(/[あ-お]/g)){
        str = str.replace(/[あ]/g, "a");
        str = str.replace(/[い]/g, "i");
        str = str.replace(/[う]/g, "u");
        str = str.replace(/[え]/g, "e");
        str = str.replace(/[お]/g, "o");
    }
    return str;
}
```

デモは[こちら](http://jsfiddle.net/64ndnm9m/1/)

いかがでしょうか。もっといいやり方があればコメントいただけると嬉しいです。
以上、ありがとうございました。
キーボードレイアウト変更（ubuntu）

毎回忘れるので、キーボードレイアウト変更方法の備忘。
英語→日本語。

・恒久対応
`dpkg-reconfigure keyboard-configuration`

Generic 105-key (Intl) PC → Japanese → Japanese → The default for the keyboard layout → No compose key

・一時的なレイアウトの変更
`dpkg-reconfigure console-data`
Subversionのhook scriptでリポジトリを作る

Apacheとmod dav svnでリポジトリを公開している環境で，管理者権限がないユーザーでも新規リポジトリを作れるようする方法。

svnのhook scriptでうまくいったのでメモしておきます。

# リポジトリ管理用のリポジトリを作る

まず，Apacheが動いているサーバでリポジトリを管理するためのリポジトリを作ります。たとえばsvn_adminなどにしておきます。

     $ svnadmin create /path/to/svn_admin

# 管理用リポジトリのチェックアウト

svn_adminを同じサーバの適当な場所にチェックアウトします。

     $ svn co file:///path/to/svn_admin /tmp/svn_admin

ownerをapache:apacheにします。

     $ chown -R apache:apache /tmp/svn_admin

repositories.txtといった名前でファイルを追加します。

     $ cd /tmp/svn_admin
     $ touch repositories.txt
     $ svn add repositories.txt
     $ svn ci -m "add"  repositories.txt

# hook scriptの準備

次のようなpost-commit を用意して　svn_admin/hooks　に置きます。

```sh:post-commit
#!/bin/sh

svn up /tmp/svn_admin/
repo=`head -1 /tmp/svn_admin/repositories.txt`
svn create /path/to/$repo
```

これでsvn_adminのコミット権限を持っているユーザなら repositories.txt にリポジトリ名を書いてコミットすれば新規リポジトリが作れます。
コミット履歴にリポジトリを作成したユーザや時間が残るのでイタズラされることもないでしょう。
Firefox で HTTP/2 プロキシーを使う

Firefox で HTTP/2 プロキシーを使う方法を説明する記事です.

従来, HTTP プロキシーへの接続は平文の HTTP を使うことが一般的でした.
[セキュア Web プロキシー](http://www.chromium.org/developers/design-documents/secure-web-proxy)というのが最近出てきました.
リンク先から分かるようにもともと Chromium 発祥のもののようですが, クライアントと HTTP プロキシー間の通信路を SSL/TLS で暗号化するというものです.
Google の [Data Compression Proxy](https://developer.chrome.com/multidevice/data-compression) もセキュア Web プロキシーの一形態でクライアントと HTTP プロキシー間に SPDY プロトコルを使っています.
SPDY プロトコルを使っているため SPDY プロキシーと呼ばれることもあります.
HTTP/2 プロキシーも同様に, セキュアプロキシーの一形態であり, クライアントと HTTP プロキシー間を HTTP/2 プロトコルを使います.

まず HTTP/2 プロキシーを用意しましょう.
[nghttp2](https://nghttp2.org) プロジェクトで開発している [nghttpx](https://nghttp2.org/documentation/nghttpx.1.html) を HTTP/2 プロキシーとして使うことができます.
nghttpx は HTTP/2 プロキシーのフロントエンドとして機能し, 別途用意する HTTP/1 プロキシーをバックエンドとして使います.
この HTTP/1 プロキシーとしては Squid や Trafficserver など, 従来の HTTP/1 フォワードプロキシーならなんでも使うことができます.
ここでは Squid を使うことにします.
Squid が 127.0.0.1:3128 を listen しているとし, nghttpx を同じホストの 8443 ポートで動作させる場合は以下のように nghttpx を起動します:

```
$ nghttpx -s -f'*,8443' -b127.0.0.1,3128 server.key server.crt
```

`-s`は HTTP/2 プロキシーとして動作させるオプションです.
server.key と server.crt はそれぞれサーバーの SSL/TLS 秘密鍵と証明書のファイルパスです (PEM 形式).

次に Firefox の設定です.
この原稿執筆時点での最新 stable である Firefox 34 を前提に説明します.
まず about:config で `network.http.spdy.enabled.http2draft` を true にして HTTP/2 を有効にします.
セキュア Web プロキシーを使う場合は PAC ファイルを作成する必要があります.
PAC ファイルはネットワーク経由でもローカルファイルシステムから直接読み込むこともできます.
以下のような PAC ファイルを作成します:

```javascript

    function FindProxyForURL(url, host) {
        return "HTTPS SERVERADDR:8443";
    }
```

SERVERADDR は nghttpx が動いているサーバーのホスト名です.
このホスト名は重要で, Firefox は SSL/TLS ハンドシェークでのサーバー証明書確認の際にこのホスト名を元に証明書を確認を行います.
ホスト名が CN や subjectAltName 記載のものと違う場合はエラーになってプロキシーとして使うことがきません.
当然証明書チェーンが検証されるので自己署名証明書の場合はエラーになってしまいます.
自己責任でこのような証明書を受け入れる場合は, Firefox の URL に HTTP/2 プロキシーのアドレスを "https://" を前につけて入力してセキュリティ例外を設定します.
上記の PAC ファイルだとすべてのトラッフィクを HTTP/2 プロキシーへ送信します.
https URI は従来どおり CONNECT メソッドで接続した後, 個々のストリームで end-to-end 暗号化されるのでプロキシーにおいて通信内容を見ることはできませんが, https URI はプロキシー経由したくないという場合はそういうふうに記述することも可能です.
PAC ファイルの記述サンプルについては [Ilya の記事](https://github.com/igrigorik/node-spdyproxy/tree/master/pac) を参考にしてください.
PAC ファイルの指定の方法は従来と同じです.
ローカルファイルシステムから参照する場合は, file:// スキームが使えます.

この時点で HTTP/2 プロキシー経由で通信ができるはずです.
動かない場合は １ 度 Firefox を再起動してみるといいでしょう.
一番躓きやすいのでは SSL/TLS 証明書の部分だと思います.

実は Android の Firefox でも同様の設定を施すことが可能です.
Android 版 Firefox ではプロキシーを設定する専用画面がありませんが, about:config からすべて設定可能です.
PAC ファイルの指定は `network.proxy.autoconfig_url` で指定します.
このPACファイルを有効にするため, `network.proxy.type` を2にします.
`network.http.spdy.enabled.http2draft` も忘れずに true にしておきましょう.
これで Android 版 Firefox からも HTTP/2 プロキシーを使うことができるようになったはずです.
証明書の扱いはデスクトップ版と同じですから上で述べたような方法で対処してください.

余談ですが, 現在の仕様では "HTTP2.0" ではなく "HTTP/2" もしくは "HTTP2" が正しい名称です.
シェルスクリプトで並ばずお寿司

クローラー／スクレイピング Advent Calendar 2014, 12月13日担当記事です. 

## はじめに

お寿司を手頃な価格で美味しく食べたいです.

[寿司アドベントカレンダー2013](http://www.adventar.org/calendars/70)を眺めていると, [美登利寿司](http://www.sushinomidori.co.jp/index.html)というお寿司屋さんが大変良さそうだと言う結論になりました. 一旦異論は認めません. 

ただ, [美登利寿司](http://tabelog.com/tokyo/A1318/A131812/13001480/)は大変な行列のようで, 時間を間違えると824分待ちになるみたいです. 

並ぶのは嫌ですから, 空いているタイミングを狙いたいです. 

## 寿司屋待ち行列の長さを観測したい

美登利寿司は, 実際に並ぶのではなく, Web上で登録して並ぶ形式みたいです. 

文章だとよく分かりませんね. [こんな感じ](http://www.sushinomidori.co.jp/machi.html)です.

![スクリーンショット 2014-12-12 17.00.06.png](https://qiita-image-store.s3.amazonaws.com/0/5897/985d6bdb-8dc3-960a-7193-bfe6e54b95d9.png)

http://www.sushinomidori.co.jp/machi.html

順番受付を行って, 入店間際にアラートメールが来るシステムです. いい時代になりました. 

...ここに, 全店の行列の長さ情報が乗っていますね. 

今回はここのデータを利用します. 

最も空いている店に最もすんなり入れる時間が知りたいので, このページをスクレイプして, 定期的に行列の長さ情報を取得してみました. 


## 行列の長さ推移をグラフに
スクレイプに用いたコードとデータ, そして解析結果を[github](https://github.com/gghatano/midori_sushi)にアップしてあります. 

wgetしてgrepしてsedするスクリプトを, 研究室のサーバーで回し続けてデータを取りました. 

各店舗の行列の長さを20分おきに観測して, 得られた行列の長さ時系列データをグラフにしてみ
ました. 

上から, 赤坂, 銀座, 吉祥寺, 渋谷, 玉川店の, 行列の長さ推移です. 

平日と土日で色を分けています. 

![unnamed-chunk-3-1.png](https://qiita-image-store.s3.amazonaws.com/0/5897/03a95ad8-d1c7-70df-890c-1bb829bfb4e7.png)

渋谷店はすぐにいっぱいになっています. 

赤坂店が比較的空いているように見えます. 

赤坂店に注目してみます. 1日の行列の長さ推移. 12月6日のグラフです. 

![unnamed-chunk-4-1.png](https://qiita-image-store.s3.amazonaws.com/0/5897/273996b0-cf06-6b59-e246-a7830c623270.png)

15時くらいが空いていますね. 

## 結果

12月13日に行ってきました. 

<blockquote class="twitter-tweet" lang="ja"><p>行くぜ</p>&mdash; はたむ (@gg_hatano) <a href="https://twitter.com/gg_hatano/status/543633163629510656">2014, 12月 13</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p>いい寿司だった(1800円)</p>&mdash; はたむ (@gg_hatano) <a href="https://twitter.com/gg_hatano/status/543680533209690112">2014, 12月 13</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

お金を気にせず食べて1800円でした.

## まとめ

美登利寿司の行列の長さ推移データを作ってグラフにしてみました. 

安くていい寿司でした. また行きます. 

以上です.
CUDAもOpenCLも使えるC++向け線形代数ライブラリViennaCLの紹介（はじめに）

あなたの重い計算はどこから？私は行列計算から！
という風邪薬のCMがそろそろ聞こえてくる冬の寒い中皆様いかがお過ごしですか。

重い行列計算どうしようと悩んでいる方、行列計算を高速化する方法としてGPGPUの出番です。
ただ、GPGPUやろうとすると、CUDAとOpenCLがあってどっちやればいいんやねん！！ってなりますよね。

そんなあなたに、[ViennaCL](http://viennacl.sourceforge.net/)をオススメします！

名前の通り、元はOpenCLを対象としたライブラリだったのですが、いつしかCUDAもOpenMPも使えるようになってました。

特徴をまとめると以下の様な感じです。

* OpenCL対応
* CUDA対応
* OpenMP対応
* C++用ヘッダライブラリ
* boost::uBLASと互換性のあるインターフェース

最後のインターフェースが個人的には重要で、これのおかげでポータビリティがあがってとても開発がしやすいです。
しかもよくあるLAPACKや線形代数ライブラリというと、ビルドやインストールが大変で環境によっては使えなかったりするのですが、ヘッダライブラリなのでincludeするだけです。便利！

なので導入は簡単です。
[ViennaCLをダウンロード](http://viennacl.sourceforge.net/viennacl-download.html)してきて、適当なところにおいてincludeするだけ。
今のところ私は、MSVCでもgccでもclangでも使えています。
（詳しい使い方は次回以降説明します）

あと、開発はとても活発で、[Githubのレポジトリ](https://github.com/viennacl/viennacl-dev)でその様子が見えます。
ダウンロードするぐらいならここをチェックアウトした方が使いやすいかもしれません（私はそうしています）。
あと、[割に長ったらしいIssueを投げたけど2日で解決してくれたり](https://github.com/viennacl/viennacl-dev/issues/112)というのも開発の活発さを物語っています。

というわけで、ViennaCLのすごさがなんとなーく分かったところで、次回以降、使い方やその性能を紹介したいと思います。
CapistranoでCakePHPのデプロイ時にはまったこと

常識かもしれませんが、はまったので書きます。

## TL;DR
Capistranoを使用したCakePHPのデプロイ時には

- キャッシュを削除
- webサーバを再起動

したほうが良さげ？

## 前提

- CakePHP 2.4.10
- 引継ぎ案件、運用中
- 訳あってファイルキャッシュ
- もろもろサーバ数は6+α。やってられないのでcap3導入
- 微妙なディレクトリ構成
- AWS ELB使用

DocumentRootは、/var/www/html
デプロイ先は、/home/cap
以下のようなシンボリックリンクを貼って対応
```
/var/www/html/cake -> /home/cap/current/path/to/app
```

## 問題1　デプロイ直後に`PHP Fatal error:  Class 'XXX' not found in ...`

app/tmp/cache/persistent/xxx_cake_core_file_map にデプロイ前のパスが設定されたままで、アクセス時に古いリリースを参照するためエラーになっていた。

### 対応
デプロイ時にファイルキャッシュを削除する（すみません、力技です）。

```ruby:deploy.rb
set :cake_cache, '/path/to/cake/app/tmp/cache'
set :cache_dirs, %W{#{fetch(:cake_cache)}/models #{fetch(:cake_cache)}/persistent #{fetch(:cake_cache)}/views}
 
namespace :misc do
 
  desc "Clear cache in :cache_dirs."
  task :clear_cache do
    on roles(:web) do
      dirs = fetch(:cache_dirs)
      if dirs.is_a?(Array)
        dirs.each do |d|
          path = shared_path.join(d)
          if test "[ -d #{path} ]"
            execute "rm -f #{path}/*"
          end
        end
      end
    end
  end
 
end
 
after 'deploy:updated', 'misc:clear_cache'
after 'deploy:reverted', 'misc:clear_cache'
```

## 問題2 たま〜にデプロイ直後にPHP Fatal error:(ry

キャッシュ削除前のapacheのプロセスが残っていたため、デプロイ後にデプロイ前のパスが設定されたキャッシュが作成された、と考えた。


### 対応
apacheを再起動する

```ruby:deploy.rb
namespace :deploy do
 
  desc 'Restart httpd'
  task :restart do
    on roles(:web) do
      execute :sudo, :service, "httpd", "graceful"
    end
  end
 
  after :publishing, :restart
  after :finishing, 'deploy:cleanup'
 
end
```

## まとめ
とりあえず、問題2の対応以後は、問題なくデプロイ出来ています。
あまりCakePHP関係なくてすみません。
完了したタスクを自動で削除する(Slack x Trello)

## はじめに
Trelloはスクラム風のプロジェクト管理に便利です。どんなリストを用意しているかはプロジェクトによりますが、だいたいToDo、InProgress、Doneの３つくらいでしょうか？

Doneになったタスクは真面目なスクラム開発ならスプリントレビューで確認しますが、もっとライトなプロジェクト向けにDoneのタスクを自動で削除してくれるbotを作りました。

## 機能
以下の２つの機能があります。
* 毎週月曜日の朝９時にDoneにあるタスク一覧をSlackに投げる
* 午後6時になるとDoneにあるタスクを自動削除

本当にタスクが完了したのかを確認しないまま削除してしまうとさすがに問題があるので、朝１で一覧をSlackに投げるようにしています。これによって「この機能本当に終わったの？」とか言った会話が生まれ、いつの間にかタスクが消えていたという事態を防げます。

## 内容
hubotを作成し必要なパッケージをインストール

```
npm install cron time node-trello --save
```

以下のコードを`/scripts`に配置。

``` /scripts/cron.coffee
# Description:
#   cron scripts
#

module.exports = (robot) ->
  Trello = require("node-trello")
  t = new Trello(process.env.HUBOT_TRELLO_KEY, process.env.HUBOT_TRELLO_TOKEN)

  cron = require('cron').CronJob

  # set cron: Show Done List
  new cron('0 0 9 * * 1', () ->
    postDoneCards()
  , null, true, 'Asia/Tokyo').start()

  # set cron: Close Done List
  new cron('0 0 18 * * 1', () ->
    closeDoneCards()
  , null, true, 'Asia/Tokyo').start()

  postDoneCards = () ->
    getCards (cards) ->
      if !cards.length
        postMessage "今回のスプリントでの完了タスクはありません。次がんばろう"
        return

      text = buildMessage cards
      postMessage text

  closeDoneCards = () ->
    getCards (cards) ->
      for card in cards
        closeCard(card)

      postMessage "完了したカードを削除しました"

  buildMessage = (cards) ->
    text = "今回のスプリントで完了したタスクがあります\n"
    text += "夜には自動で削除されます。本当に完了したかもう一度確認してください\n"
    text += "****************************************************\n"
    for card in cards
      text += "* #{card.name}\n"

    return text

  getCards = (callback) ->
    t.get "/1/lists/#{process.env.HUBOT_TRELLO_DONE_LIST}/cards", {}, (err, data) ->
      if err
        console.log err
        postMessage "Trelloからカードを取れませんでした..."
        return

      callback(data)

  closeCard = (card) ->
    t.put "/1/cards/#{card.id}/closed", {value: true}, (err, data) ->
      if (err)
        console.log err

  postMessage = (message) ->
    robot.messageRoom process.env.SLACK_CHANNEL_FOR_CRON, message
```

各種環境変数を設定。TrelloAPIの使い方は以下の記事で書いていますので参考にどうぞ。
http://qiita.com/KeitaMoromizato/items/8d56951f7e6fa57f9a93

```
HUBOT_TRELLO_KEY=xxxxxxxxxxxxxxx
HUBOT_TRELLO_TOKEN=xxxxxxxxxxxxxxx
HUBOT_TRELLO_DONE_LIST=xxxxxxxxxxxxxxx(削除対象のリストID)
SLACK_CHANNEL_FOR_CRON=xxxxxxxxxxxxxxx
```

完了！
apt-getについてメモ

# apt-getでinstallしたものを完全uninstallする方法
apt-getでインストールしたものを完全消去するには

```
sudo apt-get --purge remove <package name>
```
となります

# apt-get update と apt-get upgrade の違い
まず、ubuntu用のパッケージを作っている人は、ある程度プログラムが出来上がると、それをネット上に公開します。もし、使っている人が更新をしたいのであれば、それが自分のパソコンに入っているものよりも新しいのかどうか、比較しなければなりません。

それを行うために、ネット上にはバージョン管理を行うデータベースがあって、まずそこからデータを持ってきて照合を行う必要があります。
データベースは、１つではなく、複数存在することもあります

apt-get update は、データベースからリストをとってくる処理を行います。
apt-get upgrade は、データベースからとってきたリストをもとに、自分のソフトが最新かどうかチェックし、最新でなければ更新を行います。
GoogleのreCAPTCHAをPHPで使う

##目的
Googleが提供している新しいreCAPTCHAAPIを使ってみる。
https://www.google.com/recaptcha/intro/index.html

##Site key/SecretKey発行
管理画面にアクセスしてSite key/SecretKeyを発行する
https://www.google.com/recaptcha/admin
Label:なんでも良さげ
Domains:使用するサイトのドメイン。1行1ドメイン。

##クライアントサイド
javascriptを読み込み
`<script src='https://www.google.com/recaptcha/api.js'></script>`

HTML記述
`<div class="g-recaptcha" data-sitekey="{{SITEKEY}}"></div>`

##サーバサイド
GoogleAPIに対してリクエストを発行します。

```php:recaptcha.php
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array(
	'secret' => '{{SECRETKEY}}',
	'response' => $_REQUEST['g-recaptcha-response'],
	'remoteip' => $_SERVER['REMOTE_ADDR'],
);
$url .= '?' . http_build_query($data);
$header = Array(
	'Content-Type: application/x-www-form-urlencoded',
);
$options = array('http' =>
	array(
		'method' => 'GET',
		'header'  => implode("\r\n", $header),
		'ignore_errors' => true
	)
);
$apiResponse = file_get_contents($url, false, stream_context_create($options));
$jsonData = json_decode($apiResponse, TRUE);
if($jsonData['success'] !== TRUE){
	echo '失敗した';
}
```

##まとめ
簡単にCAPTCHAが実装できます。
さらに、正規ユーザが読めない文字を解読する必要がないのでいいと思います。
型引数の制約によるオーバーロード

(Swift 1.1, 2.1 で確認済み）

[SwiftのcountElements()を自前で実装する（or C++のSTLのような総称的な操作を行う）](http://qiita.com/gfx/items/2255400805c21c007d32)でサラっと触れましたが、Swiftでは型引数の制約（constraint）が違うとオーバーロードできるようです。典型的な使い方は、まさに件のエントリで触れたように、CollectionType.Indexがランダムアクセス可能かどうかで使うアルゴリズムをを静的に切り替えるというようなことです。

単純化すると次のようになるでしょうか。

```swift
protocol P {
    typealias I
}

struct A<T>: P {
    typealias I = T
}

func f<T: P where T.I: IntegerType>(a: T) -> String {
    return "f for T.I: IntegerType"
}

func f<T: P where T.I == String>(a: T) -> String {
    return "f for T.I == String"
}

f(A<Int>()) // "f for T.I: IntegerType"
f(A<UInt8>()) // "f for T.I: IntegerType"
f(A<String>()) // "f for T.I == String"
// f(A<String?>()) // compile error
```

`A<Int>` と `A<String>` で呼び出すf()を変えていますが、Aという具体的な型ではなくPという抽象型を介しているのが特徴です。実際には、オーバーロードによって挙動を変えるのではなく、まさにcountElements()の例のように、特定の条件を満たした時に効率のよいアルゴリズムを採用するという分岐に使うといいと思います。

ただしこの型引数の制約によるオーバーロードは、総称関数にしか使えません。総称型はそもそも型引数の違いによってオーバーロードできないからです。
Eclipse経由でGitHubへ接続する方法

# はじめに
WindowsへCygwinのインストール不要。
PowerShellを使って、SSH認証の公開鍵と秘密鍵を作成し、Eclipse経由でGitHubへ接続する方法。

# 手順
## OpenSSHのインストール
1. PowerShellを管理者権限で起動する
1. Chocolateyをインストールする　
> PS C:\> Set-ExecutionPolicy RemoteSigned
> PS C:\> iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))

1. chocolateyにてOpenSSHをインストールする
> PS C:\> cinst openssh

1. PATHを通す　
> PS C:> $Env:Path += ";C:\Program Files (x86)\OpenSSH for Windows\bin"

[Chocolaty経由でインストールできるソフト](Chocolaty経由でインストールできるソフト)

## SSH認証の公開鍵と秘密鍵の作成
1. コマンド実行
> PS C:> ssh-keygen

1.  鍵の作成場所の指定
> PS C:> Enter file in which to save the key (/.ssh/id_rsa): C:\Users\mekagazira-m\\.ssh\id_rsa

1.  パスフレーズの指定(未入力で進む)
> Enter passphrase (empty for no passphrase):
> Enter same passphrase again:

1. 鍵の確認
> PS C:\> ls  C:\Users\mekagazira-m\.ssh
> 
> 
>     ディレクトリ: C:\Users\mekagazira-m\.ssh
> 
> 
> Mode                LastWriteTime     Length Name
> \----                -------------     ------ ----
> -a---        2014/12/31      0:25       1671 id_rsa
> -a---        2014/12/31      0:25        409 id_rsa.pub

## GitHubへの鍵の登録

1. GitHubにログインして、[Settings]≫[SSH keys]≫ボタン[Add SSH key]を押下する
1. 先ほど作成した公開鍵(id_rsa.pub)をKeyの部分に貼り付けて登録する。

## PowerShellより登録した鍵のテスト
1. 以下のコマンドを実行
> PS C:\>   ssh -i  C:\Users\mekagazira-m\.ssh\id_rsa  git@github.com

1. 以下のメッセージが出れば良いとのこと
> PTY allocation request failed on channel 0
> Hi mekagazira! You've successfully authenticated, but GitHub does not provide shell access.
> Connection to github.com closed.

## Eclipseのsshの設定を公開鍵認証方式にする

1. Eclipseの[ウィンド]≫[設定]≫[一般]≫[ネットワーク設定]≫[SSH2]≫[認証方式]の優先認証方法の選択から、passwordのチェックをはずす

## GitHubにrepositoryを作成する

1. テスト用に「test」リポジトリを作成する

## EGitにGitHubリポジトリの設定をする

1. EGitのGitリポジトリビューの[Gitリポジトリーを複製し、このビューへ追加]を選択する

1. [URIの複製]を選択する

1. [URL]へGitHubにて作成した「git@github.com:mekagazira/test.git」をコピペして
[完了]を押下する


# 参考にしたサイト
http://wwld.jp/2014/08/14/powershell-openssh.html
http://design1.chu.jp/setucocms-pjt/?p=580
http://qiita.com/t-kashima/items/251acd9ce70ce8929836
設定後に見つけた以下のサイトも良さそう
http://blog.drunkardz.co/2013/07/eclipse-4-3-kepler-%E3%81%AE-%E8%A8%AD%E5%AE%9A-github-wssh-%E7%B7%A8/
capybara-webkit インストール時のトラブルシューティング #02


# 環境

| 項目         | バージョン |
|:------------|:----|
| OS          | CentOS 6.5 |
| Ruby        | ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-linux] |
| Rails       | 4.1.6 |
| xml2-config | 2.7.6 |
| xslt-config | 1.1.26 |


# 状況

1. `rails new` で新規プロジェクトを作成
2. Gemfile に `capybara` と `capybara-webkit` を追加
3. `bundle install` を実行
4. 次のエラーが発生

```bash:エラー
[vagrant@vagrant-centos65 foo]$ bundle
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
# --- 省略 ---
Using capybara 2.4.4

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

    /home/vagrant/.rbenv/versions/2.1.3/bin/ruby extconf.rb 
Command 'qmake -spec linux-g++ ' not available

Makefile not found

Gem files will remain installed in /home/vagrant/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.3.1 for inspection.
Results logged to /home/vagrant/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/extensions/x86_64-linux/2.1.0-static/capybara-webkit-1.3.1/gem_make.out
An error occurred while installing capybara-webkit (1.3.1), and Bundler cannot continue.
Make sure that `gem install capybara-webkit -v '1.3.1'` succeeds before bundling.
```

# 対策

このページの CentOS 6.5 の場合の手順に従って作業する。
[Installing Qt and compiling capybara webkit · thoughtbot/capybara-webkit Wiki](https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit#centos-65)

1.Qtのソースをダウンロード

```bash
$ cd ~/Downloads
$ wget http://download.qt-project.org/official_releases/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz 
```

2.configure

```bash
$ tar xzvf qt-everywhere-opensource-src-4.8.6.tar.gz
$ cd qt-everywhere-opensource-src-4.8.6
$ ./configure

Which edition of Qt do you want to use ?

Type 'c' if you want to use the Commercial Edition.
Type 'o' if you want to use the Open Source Edition.

o
{--SNIP--}
Qt is now configured for building. Just run 'gmake'.
Once everything is built, you must run 'gmake install'.
Qt will be installed into /usr/local/Trolltech/Qt-4.8.6

To reconfigure, run 'gmake confclean' and 'configure'.
```

この時にこんなエラーが表示された時は [Qtインストール時のトラブルシューティング] を参照。

```bash:エラー
# ---省略---
Basic XLib functionality test failed!
 You might need to modify the include and library search paths by editing
 QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /home/vagrant/Downloads/qt-everywhere-opensource-src-4.8.6/mkspecs/linux-g++.
```


3.コンパイル

```bash
$ gmake
```

4.インストール

```bash
$ sudo gmake install
$ sudo ln -s /usr/local/Trolltech/Qt-4.8.6/bin/qmake /usr/bin/qmake
```
capybara-webkit インストール時のトラブルシューティング #01


# 環境

| 項目         | バージョン |
|:------------|:----|
| OS          | CentOS 6.5 |
| Ruby        | ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-linux] |
| Rails       | 4.1.6 |


# 状況

1. `rails new` で新規プロジェクトを作成
2. Gemfile に `capybara` と `capybara-webkit` を追加
3. `bundle install` を実行
4. 次のエラーが発生

```bash:エラー
[vagrant@vagrant-centos65 foo]$ bundle
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
Using rake 10.4.2
# --- 省略 ---
Installing mini_portile 0.6.1
Installing nokogiri 1.6.5
Installing xpath 2.0.0
Installing capybara 2.4.4

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

    /home/vagrant/.rbenv/versions/2.1.3/bin/ruby extconf.rb 
Command 'qmake -spec linux-g++ ' not available

Makefile not found

Gem files will remain installed in /home/vagrant/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/capybara-webkit-1.3.1 for inspection.
Results logged to /home/vagrant/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/extensions/x86_64-linux/2.1.0-static/capybara-webkit-1.3.1/gem_make.out
An error occurred while installing capybara-webkit (1.3.1), and Bundler cannot continue.
Make sure that `gem install capybara-webkit -v '1.3.1'` succeeds before bundling.
```

# 対策

```bash
$ sudo yum install -y libxml2-devel
$ sudo yum install -y libxslt-devel
```
Golang+Revel環境でAngularJSを使うTips

#目的:
 Revel内でAngularJSを使うのに少しコツがいるので環境絡みをまとめておく
#環境:
 go version 1.3.1
 revel
 angularJSは最新のもの
#概要:
　このような環境でAngularJSを使うにはいくつか問題があります。参考文献にもありますがdelimiterが被りっているてんです。どちらかを{{ }}以外にしないとrevelの方が優先されてしまいます。そこで参考文献を参照して自由度が高いrevelのdelimiterを変更しました。その後AngularJSを被せるという方針にしました。
#ソースコードと詳細説明:
　revel側のdelimiter変更方法です。こちらは参考文献そのままです。私は"[[ ]]"に変更しました。

```/conf/app.conf
template.delimiters="[[ ]]"
```

を追加しています。重要なのは"[[ ]]"の部分です。必ず"[["の次にスペースを入れてください。入れないとErrorになります。変更後は自動生成されるhtmlないの"{{ }}"は無効になるので"[[ ]]"に一括変換しています。

　次にAngularJSのsetupですが、とりあえず動かしたかったので以下のようにしました。単純にlink貼っただけです。以下の1行をheader.htmlに追加しました。

```/app/views/header.html
<script src="http://code.angularjs.org/1.2.9/angular.min.js"></script>
```

これで終了です。実際の動作を確認するためにサンプルを動かしてみます。

```Index.html
[[set . "title" "Home"]]
[[template "header.html" .]]

<header class="hero-unit" style="background-color:#A9F16C">
  <div class="container">
    <div class="row">
      <div class="hero-text">
        <h1>It works!</h1>
        <p></p>
      </div>
    </div>
  </div>
</header>

<div class="container">
  <div class="row">
    <div class="span6">
      [[template "flash.html" .]]
      <div ng-init="qty=1;cost=2">
        <b>Invoice:</b>
        <div>
          Quantity: <input type="number" ng-model="qty" required>
        </div>
        <div>
          Costs: <input type="number" ng-model="cost" required>
        </div>
        <div>
          <b>Total:</b> {{qty * cost | currency}}
        </div>
      </div>
    </div>
  </div>
</div>

[[template "footer.html" .]]
```

無事に動きました。

#参考文献
設定完了:http://qiita.com/koizuka/items/972b35a5024d1d63d127
サンプル:http://dev.classmethod.jp/client-side/javascript/angularjs-2/
uGUI ボタンのクリックイベントを取得する


ボタンをクリックしたら、ログ出力するサンプルを作成するまでの手順です。

- Hierarchy から Create -> UI -> Button を選択
  - Canvas の子として Button が作られる
- Project から Create -> C# Sprite で ButtonHandler.cs を作成
  - ボタンクリック時のコールバックメソッド `OnClick` を定義
  - このとき必ず public メソッドにする必要がある! (後述のメニュー項目に表示されない)
  - JavaScript だと public 不要なので、C# ではまってしまった。


```csharp
using UnityEngine;
using System.Collections;

public class ButtonHandler : MonoBehaviour {
	void Start () {
	}

	void Update () {
	}

	public void OnClick() { // 必ず public にする
		Debug.Log ("clicked");
	}
}
```

- BunttonHandler.cs を Button にアタッチする
- `On Click ()` の `+` を押して、自分自身(Button) をアタッチしてから、`ButtonHandler.OnClick` を選択。

![onclick.png](https://qiita-image-store.s3.amazonaws.com/0/1900/28e298c5-1b09-1ea2-4c7f-4e1f2c61f35c.png "onclick.png")

実行して、ボタンをクリックすると "clicked" とログ出力されます。

### 確認環境

- OS X 10.10.1
- Unity 4.6.1
Gumby公式からダウンロードしたフレームワークを使うとIconsが正しく表示されない件


何故か`css/gumby.css`の`icon-xxx`各種にある`content`要素のUnicodeが`\\xxxx`となってしまっている。
バックスラッシュを1つにすれば良いので、全ての`\\xxxx`を`\xxxx`にしたら表示されるようになった。

2015年の年越しは上記の発見に費やした悲しみ。

##追記
カスタマイズせず`Donwload Gumby`を押してダウンロードしたやつ（Gumby-master）は上記の現象が起こる。
何かしらカスタマイズして`Build Gumby`からダウンロードしたやつ（gumby-v2）はそのまま使用して大丈夫なようだ。
WKWebViewで読み込んでいるHTMLソースを取得する方法


WKWebViewの例が見当たらなかったのでメモ。
UIWebViewの例も併記しておきます。

HTMLソースを取得するならどっちでも良さそうですけど、
他のことするならクロージャで処理できるWKWebViewの方が良さそうです。

### WKWebViewの場合
```swift
var webView = WKWebView()
webView.evaluateJavaScript("document.body.innerHTML", completionHandler: { (html, error) -> Void in
}
```

### UIWebViewの場合
```swift
var uiview = UIWebView()
let html = uiview.stringByEvaluatingJavaScriptFromString("document.body.innerHTML")
```

### bodyだけじゃなくて全体が欲しい場合
`"document.body.innerHTML"`を
`"document.getElementsByTagName('html')[0].innerHTML"`に書き換えます。
この部分はJavaScriptなので必要に応じて書き換えればいろいろできます。
私のおすすめプログラミング学習Webサービス一覧（※随時更新中）

# <i class="fa fa-github" style="font-size:1em;"></i> 目次

 <i class="fa fa-book" style="font-size:1em;"></i>  [ドットインストール](http://dotinstall.com/)
 <i class="fa fa-book" style="font-size:1em;"></i>  [CodeUpStart](https://www.codeupstart.com/)
 <i class="fa fa-book" style="font-size:1em;"></i>  [Code4Startup](https://code4startup.com/)
 <i class="fa fa-book" style="font-size:1em;"></i>  [Dash](https://dash.generalassemb.ly/) 
 <i class="fa fa-book" style="font-size:1em;"></i>  [シラバス](https://cyllabus.jp/)
 <i class="fa fa-book" style="font-size:1em;"></i>  [Progate](http://prog-8.com/) 


# <i class="fa fa-book" style="font-size:1em;"></i> [ドットインストール](http://dotinstall.com/) 

> 《言語》
> ほぼすべての（プロプライエタリ系以外の）
> 主要なプログラミング言語・フレームワーク・開発ツールはあると言っても
> 過言ではない。（40？50？いやもっとか？）`（2015/1/1現在）`

![画面](http://dotinstall.com/package_img/basic_dotinstall/screen_2.png)
  
```
【所感】
言わずもがな。
これのおかげで私は今エンジニアとして存在している。
感謝してもしきれない。
```

# <i class="fa fa-book" style="font-size:1em;"></i> [CodeUpStart](https://www.codeupstart.com/)

> 《内容》
> 「Bootstrapを使ったポートフォリオサイト」
> 「PythonとFlaskを使ったKickstarter風サイト」
> 「IonicとAngularを使ったTinder風サイト」

![画面](https://s3-us-west-2.amazonaws.com/codeupstart-press-assets/default-facebook-share-image)
  
```
【所感】
英語だが、動画なので大体わかるかと。
今後追加予定のコース（「Airbnb with Python/Django」「Instagram with Swift」）も楽しみである
```

# <i class="fa fa-book" style="font-size:1em;"></i> [Code4Startup](https://code4startup.com/)

> 《内容》
> 「Airbnb」,「TaskRabbit」,「Tinder」,「Etsy」といった
> 実在するWebサービスを作っていく。
> 一部有料。

![画面](https://biz.moneyforward.com/blog/wp-content/uploads/2015/10/e4bf2567f315cace3ac249234d406261.png)

```
【所感】
これも英語だが、動画なので・・まあ大体わかるかと。
今の所、無料コースが３つ、有料コースが４つ。
```

## <i class="fa fa-book" style="font-size:1em;"></i> [Dash](https://dash.generalassemb.ly/) 
> 《言語》

> - HTML
> - CSS
> - Javascript

> `（2015/1/1現在）`

![画面](http://cdn0.sbnation.com/assets/3399329/dash-html2.jpg)

```
【所感】
おされ。
対話形式（？）で画面構築してゆくというのが、
なんともイイ。
```

# <i class="fa fa-book" style="font-size:1em;"></i> [シラバス](https://cyllabus.jp/) 

> 《言語》

>  * Rails
>  * Vagrant
>  * UNIX (shell)
>  * .. and more !!

> `（2015/1/1現在）`

![画面](https://files.value-press.com/czMjYXJ0aWNsZSMzODQ2NCMxMzM5NjEjMzg0NjRfVHdzQmRSZlRNQS5wbmc.png)

```
【所感】  
東京理科大学在学中の方々より創業された  
インターネット関連企業のサービス、だそうです。  
個人的には一番いま注目・応援中。
```

# <i class="fa fa-book" style="font-size:1em;"></i> [Progate](http://prog-8.com/) 
> 《言語》

> - HTML / CSS
> - PHP
> - jQuery

> `（2015/1/1現在）`

![画面](http://prog-8.com/images/top_editor_2.png)

```
【所感】  
UIはとてもシンプルであっさりしている。  
もっとコマが増えてゆくことを願いたい。
```

以上

---
【編集履歴】

`（2015/1/1）`：初版
Mackbook air に開発環境を作る個人的メモ


##Command Line ToolsとHomebrewのインストール。

このあたりの記事を参考に。
http://tsuchikazu.net/mac_rail_setup/

```:shell
rbenv global 2.1.5
ruby --version
```

バージョンは2.0.0まま…
→これは後でなおすとして。
同じような症状もありそうだし↓
qiita.com/inTheRye/items/891212e0cce0f4799690

##MySqlのインストール

```:shell
brew install mysql
```

##powderのインストール

あとはbundlerとrails.

とりあえずここまで。

あとapacheとphpも入れないとか。

####apacheとphpはデフォルトで入ってるらしい。

すごいな。

とりあえずapache2.4系はアクセス許可の書き方が違うよ問題でハマる。↓
https://www.softel.co.jp/blogs/tech/archives/3142
hubot-slackを使うDockerコンテナを作成するまでメモ


[hubot-xmppを使う場合の説明](http://qiita.com/satzz@github/items/c86ce5d8d3918c1d6dee)に対し、[そもそも最新のhubot-slackで十分というご指摘](https://twitter.com/mako0901/status/549452482623987712)をいただいた。実際楽だったので修正して再掲。
[@mako0901](https://twitter.com/mako0901)さんありがとうございます。



### 制約等

- herokuの代わりにローカルのCentOS 6.5で動かす
- Slackのprivate groupでも使えるようにするため、adapterとして新しめの`hubot-slack`を使う

### バージョン
以下で行っているが、バージョンの制約については未検証

- `Docker` 1.3.2
- `nodebrew` 0.7.5
- `node` 0.10.35
- `npm` 1.4.28
- `yo` 1.3.3
- `coffee` 1.8.0
- `hubot` 2.11.0
- `hubot-slack` 3.2.1

### 準備
- Hubotのintegrationを追加する。ユーザー追加は不要。
 - https://TEAM.slack.com/services/new  (TEAMを該当チームに修正）
- bot名を指定し、HUBOT_SLACK_TOKENを取得しておく

### Dockerfile
試行錯誤の結果以下のようになっている。

- 変更の影響範囲を最小限にする意図で、node関連の作業はnon-rootユーザーのディレクトリで、`npm install`はグローバルインストールなしで行うようにしている。
- hubotの作成はinteraction無視で自動にしている。`yes | yo hubot --defaults`
- 以前と異なり、private groupにログインさせることができる。


```Dockerfile:
FROM centos:centos6
RUN sed -i 's/mirrorlist=http/#mirrorlist=http/g'                                    /etc/yum.repos.d/CentOS-Base.repo
RUN sed -i 's!#baseurl=http://mirror.centos.org!baseurl=http://ftp.riken.jp/Linux!g' /etc/yum.repos.d/CentOS-Base.repo
RUN yum -y install which
RUN yum -y install perl
RUN yum -y install tar
RUN yum -y install gcc-c++
RUN yum -y install libicu-devel.x86_64
RUN useradd hubot


USER hubot
RUN mkdir /home/hubot/myslackbot
WORKDIR /home/hubot/myslackbot

RUN curl -k -L git.io/nodebrew | perl - setup
ENV PATH /home/hubot/.nodebrew/current/bin:$PATH
RUN nodebrew install v0.10.35
RUN nodebrew use 0.10.35
ENV PATH /home/hubot/myslackbot/node_modules/.bin:$PATH

RUN npm install  generator-hubot
RUN npm install  yo
RUN npm install  coffee-script
RUN npm install  hubot
RUN npm install  hubot-slack

RUN yes | yo hubot --defaults

ENV HUBOT_LOG_LEVEL     debug

#https://TEAM.slack.com/services
ENV HUBOT_SLACK_TOKEN xxxx-XXXXXXXXXXXXXXXXXXXXXXXXXXXX
RUN hubot -a slack
```
これを`docker build .`する。


### 対話
`/invite`して`<botname> echo happy new year`とか打ってみる。


`HUBOT_LOG_LEVEL`を`debug`にしていると、`docker logs CONTAINERID`などでdebug logが見られる。単純ではあるが、adapterが受け取った文字列がscriptに渡されて正規表現マッチさせている様子がわかる。

```console:
[Wed Dec 24 2014 11:41:33 GMT+0000 (GMT)] DEBUG Received message: 'satodabot echo happy new year' in channel: gt, from: satoda
[Wed Dec 24 2014 11:41:33 GMT+0000 (GMT)] DEBUG Message 'satodabot echo happy new year' matched regex //^\s*[@]?satodabot[:,]?\s*(?:ECHO (.*)$)/i/
[Wed Dec 24 2014 11:41:33 GMT+0000 (GMT)] DEBUG Sending to gt: happy new year
```


### 検証パスした事項
- `package.json`を外から`ADD`するようにしてもいいかもしれないが、うまくできなかった(いずれにしても`yo hubot`が必要?)
- (hubot関係ないけど)`yum`のrepository指定は外してもよいかも

### 宿題
- 接続・プロセス管理、デーモン化
- hubot logにredisとかherokuのエラーやメッセージが出ているので、使わなくするか、エラーが出ないようにする
ruby2.2.0 の整数演算が速くなっている

手元の ruby を 2.2.0 にした。

気になることがあったので、ベンチマーク。

測ってみたら、なんか除算がめちゃくちゃ早くなっている。

![スクリーンショット 2015-01-01 17.20.40.png](https://qiita-image-store.s3.amazonaws.com/0/6854/faff408e-b664-22e0-85ae-2cedc7a242a2.png "スクリーンショット 2015-01-01 17.20.40.png")

なんか10倍ぐらい。

除算は、100000桁の整数を50000桁の整数で割るという計算。
乗算は、10000桁の整数を100個掛ける計算。
素因数分解は、3203431780379 × 179953 ぐらいの、ふたつの素数の積がターゲット。

除算10倍もそうとうすごいけど、乗算も素因数分解も倍ぐらいなので相当すごい。

開発の方々、ありがとうございます。

測定は、以下のソースコードで行った。

```ruby
require "benchmark"
require "prime"

A=[  3203431780379,  3203431780391,  3203431780487,  3203431780517,  3203431780561,]
B=[  179953,  179957,  179969,  179981,  179989]

def b
  3.times.map{
    Benchmark.realtime do
      yield
    end
  }.min
end

def nums( size, count )
  count.times.map{
    size.times.map{ |n| [*1..9].sample }.join.to_i
  }
end

NUMS=nums( 100000, 10 )
DENS=nums( 50000, 10 )
MULS = nums( 10000, 100 )

div=b{
  NUMS.map{ |n| DENS.map{ |d|
    n/d
  }}
}

mul=b{
  MULS.inject do |acc,v|
    acc * v
  end
}

factor =b{
  A.zip(B).each do|x,y|
    Prime.prime_division(x*y)
  end
}

puts [
  RUBY_DESCRIPTION,
  div,mul,factor
].join(",")
```

なんか書捨て感満載の雑なソースコードですいません。
Kobito2.xのデータ保存場所


Mac + dropbox でデータ共有を行おうとして
kobitoのデータ保存場所を調べましたが2.0になった際に変更があったみたいなのでメモ

###旧保存場所
`~/Library/Kobito/`

###新保存場所
`~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito`

データ移行、dropboxでの共有の際などの参考にどうぞ
技術系の電子書籍を無料配布してるサイト


DRMフリーのePub/PDFのみ。
iPhoneのiBooksに何も入ってなくて寂しい人にもおすすめ。

## LPIC
- [Linux標準教科書](http://www.lpi.or.jp/linuxtext/text.shtml)
- [Linuxサーバー構築標準教科書](http://www.lpi.or.jp/linuxtext/server.shtml)
- [高信頼システム構築標準教科書](http://www.lpi.or.jp/linuxtext/system.shtml)
- [Linuxセキュリティ標準教科書](http://www.lpi.or.jp/linuxtext/security.shtml)

## 達人出版会
- [ケヴィン・ケリー著作選集　１ - 達人出版会](http://tatsu-zine.com/books/kk1)
- [ケヴィン・ケリー著作選集　２ - 達人出版会](http://tatsu-zine.com/books/kk2)
- [ケヴィン・ケリー著作選集　３ - 達人出版会](http://tatsu-zine.com/books/kk3)
- [CSS 2.1仕様 日本語訳 EPUB版 - 達人出版会](http://tatsu-zine.com/books/css21)
- [FuelPHP Advent Calendar 2012 - 達人出版会](http://tatsu-zine.com/books/fuelphpadvent2012)
- [FuelPHP Advent Calendar 2013 - 達人出版会](http://tatsu-zine.com/books/fuelphpadvent2013)

## O'Reilly
- [O'Reilly Japan - EPUB 3とは何か？](http://www.oreilly.co.jp/books/9784873115528/)
- [O'Reilly Japan - Cloudera Impala](http://www.oreilly.co.jp/books/9784873116723/)

## Git関連
###[Pro Git 日本語版電子書籍公開サイト](https://progit-ja.github.io/)
[公式の日本語訳](http://git-scm.com/book/ja/v1)とは別の翻訳。


### [サルでもわかるGit入門](http://www.backlog.jp/git-guide/)
Backlogの人が自社サービスをもっと使ってもらうためにGitを布教する電子書籍を無料配布してる。(んだと思う)

## Android関連
### [Androidアプリのセキュア設計・セキュアコーディングガイド](https://www.jssec.org/report/20130423_securecoding.html)
[日本スマートフォンセキュリティ協会](https://www.jssec.org/)が公開してる文書。

## その他配布サイト
数が多いので一つ一つリンクを書けません。
電子書籍というよりただのPDFかも。

### [Apple Developer 日本語ドキュメント](https://developer.apple.com/jp/devcenter/ios/library/japanese.html)
Appleの日本語ドキュメント。Mac/iOSアプリの開発者が対象です。
- [iOSヒューマンインターフェイスガイドライン](https://developer.apple.com/jp/devcenter/ios/library/documentation/MobileHIG.pdf)
- [セキュアコーディングガイド](https://developer.apple.com/jp/devcenter/ios/library/documentation/SecureCodingGuide.pdf)
等は他の環境でも役にたつかもしれません。

### [IPA 独立行政法人 情報処理推進機構 書籍情報](http://www.ipa.go.jp/sec/publish/index.html)
一部がPDFで無料ダウンロードできます。[SEC journal](http://www.ipa.go.jp/sec/secjournal/index.html)も

### [YAMAGATA Hiroo: The Official J-Page](http://cruel.org/jindex.html)
翻訳文書のPDFがいくつか置いてあります。

エリック・レイモンド
- [「伽藍とバザール」](http://cruel.org/freeware/cathedral.html) →[PDF](http://cruel.org/freeware/cathedral.pdf)
- [ 「ノウアスフィアの開墾」](http://cruel.org/freeware/noosphere.html) →[PDF](http://cruel.org/freeware/noosphere.pdf)
- [「魔法のおなべ」](http://cruel.org/freeware/magicpot.html) →[PDF](http://cruel.org/freeware/magicpot.pdf)

PDFではないですが [How To Become A Hacker: Japanese](http://cruel.org/freeware/hacker.html) も面白いです。

# 有料サイト
記事タイトルと異なりますが、有料で技術書を配布しているサイトも一応書いておきます。

- [O'Reilly Japan Ebook Store](http://www.oreilly.co.jp/ebook/)
- [達人出版会](http://tatsu-zine.com/)
- [Gihyo Digital Publishing](https://gihyo.jp/dp)
- [オーム社eStore](http://estore.ohmsha.co.jp/titles)
- [ブックパブ](http://bookpub.jp/books/category/9)

# 蛇足
まとめてて、別に電子書籍に拘る必要ないじゃんって思いました。まる

# 参考URL
- [DRMフリーの技術書を扱っている出版社 ＋その他大手（2013年前期） - Enable](http://ymkjp.blogspot.jp/2013/01/drm-2013.html)
- [[電子書籍]技術系の電子書籍を買えるサイト](http://itevangelist.net/blog/digital_book_web_site/)
日本語文字列のURLエンコード時に潜む罠（iOS7 以上）



ユーザが入力した文字列などをURLエンコードしてサーバにPOSTすることはよくあると思います。
iOS 7.0 からNSStringに下記のカテゴリメソッドが追加され、Core Foundationの関数を使う必要がなくなり便利になりました。

```
func stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacters: NSCharacterSet) -> String?
```

## 日本語をエンコードする際の罠
このメソッドを使って日本語文字列をエンコードする場合、注意が必要です。
マルチバイト言語の扱いに問題があるようで、1,000文字程度の日本語をエンコードすると、EXC_BAD_ACCESSの例外が発生し、アプリがクラッシュします。


![Screenshot 2015-01-01 17.32.54.png](https://qiita-image-store.s3.amazonaws.com/0/31069/1c173262-dc82-1032-bd9c-38803d0b7186.png "Screenshot 2015-01-01 17.32.54.png")


## 対処方法
非常に残念なのですが、iOS7以前で使っていた```CFURLCreateStringByAddingPercentEscapes()```を使います。

```
func encode(string: String) -> String {
    let charactersToBeEscaped: CFStringRef = ":/?&=;+!@#$()',*"
    return CFURLCreateStringByAddingPercentEscapes(
            nil,
            string,
            nil,
            charactersToBeEscaped,
            CFStringBuiltInEncodings.UTF8.rawValue)
}
```


## 検証環境
- Xcode 6.1.1
- iOS SDK 8.1

## 参考
- https://github.com/Alamofire/Alamofire/issues/206
- https://gist.github.com/clowwindy/0d800f07a5e95e5c4dd0
エラーの時にOptional型を返すのはよくない

SwiftにはOptional型がありますが、エラーの時にOptional型を返すと、エラーの情報を返せないのでよくないと思っています。どんな実装でもいいのでEither的な型を使いましょう。

すでに様々な実装がありますが、私も作ってみました。まだインターフェイスを固定したくないのでCarthageやCocoaPodsには対応してませんが、デファクトなものがなければこれで行くつもりでいます。

* https://github.com/gfx/Swift-SwiftEither

使い方は[README#SYNOPSIS](https://github.com/gfx/Swift-SwiftEither#synopsis)のとおりです。

## Either Chaining

optional chainingに相当するchain()メソッドと、null coalescing operatorに相当するfallback()メソッドがあります。

成功状態を返すsuccess()と、失敗状態とエラー情報を返すfailure()があるとして、chain()は以下のように使います。

```swift
// 最初の値が成功状態であれば、chain()のブロックを実行してその値を返す
success("success").chain({ (m) -> Either<String, Error> in
    return success("chained")
}) // success("chained")

// 最初の値が失敗状態であれば、最初の値をそのまま返す
// エラー情報をそのまま持っているので正しくエラーハンドリングが可能
failure("error!").chain({ (m) -> Either<String, Error> in
    return Either(success: "chained")
}) // "error!"
```

## Fallback Operation

null coalescing operatorに相当するのはfallback()メソッドです。エイリアスとして「??」演算子もあります。

```swift
// 最初の値が成功状態であれば、それをそのまま返す
success("success").fallback({
    return success("chained")
}) // "success"

// 最初の値が失敗状態であれば、fallback()の引数ブロックを実行してその値を返す
// つまり、ある値が失敗したら次の演算にフォールバックする
failure("error!").fallback({
    return success("fallback")
}) // "fallback"

// 演算子のほうが挙動はわかりやすいかも
failure("error!") ?? success("fallback") // success("fallback")

// 演算子の右辺値は生の値でもよい
failure("error!") ?? "fallback" // success("fallback")
```

## Unwrapping

Optional型のようにoptional bindingはありませんが、switchによるパターンマッチで同じことができます。実際、optional bindingはパターンマッチの糖衣構文にすぎません。

```swift
switch success("foo") {
case .Success(let s):
    // 成功状態の場合
    // sは参照型のコンテナなので値を得るには.valueが必要
    s.value // "foo"
case .Failure(let f):
    // 失敗状態の場合
    // f.valueはError型
    f.value.reason // not reached
}
```

successValueとfailureValueがそれぞれOptional型を返すので、入っている値が確定しているならそれでもかまいません。


```swift
(success("foo").successValue)! == "foo" // true
(failure("foo").failureValue)! == "foo" // true
```

## 捕捉

Swiftにはタプルがあるので、エラーを返すときにgolangのように `(T?, Error?)` というタプルを返すこともできます。しかし、これは戻り値をOptional型にせざるをえません。Optional型はエラー情報を持たないEither型とも考えられるため、それならば結局Either的なものを返すほうがシンプルでいいと思います。
Githubに接続できない時の対処法

# はじめに
SSH接続するなんて、慣れた人には簡単なことでしょう。
しかし、たまに自分でも「あれ、これなんだっけなー」と思うことがあるので、ここによくある事例をまとめておくことにしました。
接続でコケた場合は参考にしてください。

# GithubにSSH接続できないパターン

### 接続先サーバに公開鍵を登録していない

「鍵登録なんて忘れるわけないじゃん」と思うかもしれませんが、これで何度も苦しんでいる人を見かけたのでもう一度確認しましょう。
Githubに繋ぐには公開鍵・秘密鍵を作成し、公開鍵をGithubに登録する必要があります。また、秘密鍵は自分のサーバに置く必要があります。
また、鍵の作り方がわからない人は「ssh-keygen」で調べてみましょう。

### 秘密鍵が読めてない

Githubに公開鍵を登録したのはいいものの、SSH接続時に自サーバに置いた秘密鍵がうまく読めてないパターンがあります。
SSHで接続する際にデフォルトで読みにいく秘密鍵のパスは「~/.ssh/id_rsa」「~/.ssh/id_dsa」「~/.ssh/identity」のいずれかです。それ以外のパスで置いても読み込まれません。
また、パスがちゃんとしてるのに上手く読んでくれない場合は、「~/.ssh/config」の設定値を確認しましょう。もしかしたら変なパスを読みにいくような設定になっているのかもしれません。
もしconfigファイルがない場合は以下のように作って明示的に設定してあげてもよいです。

```bash
Host github
User git
Hostname github.com
Port 22
IdentityFile ~/.ssh/id_rsa # 秘密鍵のファイルパスを指定
```

### 秘密鍵のパーミッションがおかしい

```bash
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```

SSH接続をしようとしてこんな派手なエラーメッセージが出たら、秘密鍵のパーミッションがおかしいです。パーミッションが777とかになっていませんか？0600でないと怒られます。秘密鍵ファイルのパーミッションを確認しましょう。

### ssh-add していない

```bash
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
```

鍵がちゃんとしていても、ssh-addを忘れていると上記のようなエラーが出ることがあります。Macなどではssh-addは不要ですが、CentOSでは必要です。まずは「ssh-add -l」して状態を確認。読み込んでほしい秘密鍵のパスがちゃんと出てこればOKです。出てこなければ、ssh-addしましょう。

```bash
eval `ssh-agent`
ssh-add ~/.ssh/id_rsa
```

### それでもダメなら

```bash
ssh -vT git@github.com
```
を打つとデバッグしてくれます。接続できない場合はどこかしらでエラーが出ると思うので内容を確認しましょう。
Githubのドキュメント( https://help.github.com/articles/error-permission-denied-publickey )も参照。

# Githubにpush出来ないパターン

GithubにSSH出来た後で `git push` に失敗するパターンがあります。

### httpsでcloneしてsshでpushしようとしたパターン

以下のようなエラーが出た場合です。
httpsでcloneしたリポジトリはそのままではsshでpush出来ません。

```
fatal: remote error:
You can't push to git://github.com/****/****.git
Use https://github.com/****/****.git
```

originを書き換えてあげる必要があります。
参考： http://qiita.com/ryokbys/items/9ac2accdc3b907961526
MacでAndroidStudioインストール時にandroid studio was unable to find jvmと出る

MacOSX YosemiteでAndroidStudioのインストールについてである。

インストーラは
http://developer.android.com/sdk/index.html
から可能だが、同時にJDKのインストールも求められる。

指示の内容通りにJDKをインストールしても
android studio was unable to find jvm
というエラーが表示されることがある。

WindowsではPATHの設定が必要だが、Macでも必要であることが原因。
以下をコマンドラインから入力で解決した。
`launchctl setenv STUDIO_JDK /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk`
vagrant-notify+terminal-notifierでvagrantからローカルに通知をする


##環境
- ホストOS: MacOS10.10
- Vagrant version: 1.6.3
- ゲストOS: CentOS6.5


## 準備

### vagrant-notifyをホストにインストール

```
$ vagrant plugin install vagrant-notify
```


#### ＊nokogiriのインストールでこけたら

インストールしようとすると以下のようなエラーが出て少しはまった

```
An error occurred while installing nokogiri (1.6.5), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.5'` succeeds before bundling.
```


ログを見ると

```
libiconv is missing.  Please locate mkmf.log to investigate how it is failing.
```

libiconvが足りないそうなので、インストールする

```
$ brew tap homebrew/dupes
$ brew install libiconv
```

が、まだダメ。どうやらnokogiriのバージョンをシステムのものに明示的に指定しないとだめっぽいので以下のようにする

```
$ export NOKOGIRI_USE_SYSTEM_LIBRARIES=true
```


### terminal-notifierをインストールする

```
$ brew install terminal-notifier
```

#### terminal-notifierの使用例

```
$ echo 'Piped Message Data!' | terminal-notifier -sound default
$ terminal-notifier -title '?' -message 'Check your Apple stock!' -open 'http://finance.yahoo.com/q?s=AAPL'
```


### notify-sendスクリプトを作成する

```
$ cd /usr/local/bin
$ cd vim notify-send
$ sudo chmod u+x notify-send
```

```/usr/local/bin/notify-send
#!/bin/zsh

terminal-notifier -title "$2" -message "$3" -sound default
```


## vagrant上で通知スクリプトがちゃんと動くか確認する


```
$ vagrant up
$ vagrant ssh
$ notify-send title message
```

## guardの通知と連携するためにスクリプト変更

```/usr/local/bin/notify-send
#!/bin/bash
while getopts t:h:i:u:i:c: OPTION
do
  case $OPTION in 
    t) TIME=$OPTARG;;
    h) ;;
    i) IMAGE=$OPTARG;;
    u) ;;
  esac
done
shift `expr $OPTIND - 1`
MESSAGE=$*
terminal-notifier -title "$1" -message "$MESSAGE" -contentImage "$IMAGE" -sound default

```
AWSにNode.jsをインストール+バーション管理


### 概要
AWSのEC2のLinux(Red Hat Enterprise Linux Server release 7.0)にNode.jsを使えるようにセットアップします。
また、バージョンを管理・変更出来るようにnodebrewでインストールします。

### 手順
#### wgetとvimのインストール

```
$ sudo yum -y install wget
$ sudo yum -y install vim
```

#### nodebrewのインストール
https://github.com/hokaccha/nodebrew から取得インストールします。  

```
$ wget git.io/nodebrew
$ perl nodebrew setup
```

#### コマンドパスを通す

```  ~/.bashrc
$ vim ~/.bashrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

#### nodebrewインストール確認

```
$ nodebrew -v
```

#### nodeインストール
今の安定版は0.10.26なのでこのバージョンをインストールします。

```
$ nodebrew install-binary v0.10.26
```

#### nodeを利用出来るように使用バージョンを指定

```
$ nodebrew use v0.10.26
```

#### node利用確認

```
$ node -v
```

インストールしたバージョンが表示されればOKです。
Dockerfile EXPOSE / --publish-all / --publish の使い分け

Docker には以下の 3種類ポートの共有についての設定があると思う。

- Dockerfile EXPOSE
- docker run / create -P, --publish-all=true|false
- docker run / create -p, --publish=[]

それぞれについて使い分けを説明する。

# Dockerfile EXPOSE

Docker コンテナ間のポート共有の為の仕組み。

未検証だが、一つのホストに複数の用途が異なるコンテナを立てる場合に用いると思う。

詳しく -> https://docs.docker.com/reference/builder/#expose

# docker run / create -P, --publish-all=true|false

Dockerfile EXPOSE で指定したポートをホストに公開する設定。

但し、ホスト側の `49153-65535` の間のポートで公開されるため、プログラムから Docker コンテナを立ち上げ、コンテナごとにポートを指定する場合に用いると思う。

詳しく -> https://docs.docker.com/articles/networking/#binding-ports

# docker run / create -p, --publish=[]

`-p 3306:3306` といった設定で `host:guest` のポートをつなぐ。

シンプルに Docker コンテナで Web アプリケーションサーバを起動して外部に公開する場合に利用すると思う。

詳しく -> `man docker run` or https://docs.docker.com/articles/networking/#binding-ports
plackupできねぇ！


cpanmでplackをインストール済みなのにplackupできない現象が発生。なんじゃこりゃ！前はできたのに。

```terminal
% plackup
zsh: command not found: plackup
```

そもそもplackupってインストールされているの？

```terminal
% find . -name plackup
./.cpanm/work/1419639327.83630/Plack-1.0033/blib/script/plackup
./.cpanm/work/1419639327.83630/Plack-1.0033/script/plackup
./.plenv/versions/5.20.1/bin/plackup
```

plackup自体はインストールされていることが確認できた。
PATHが通ってないのかと思ったらPATHは通っている模様。~/.plenv/shimsディレクトリにPATHが通っているので問題ない。

```terminal
% echo $PATH 
/Users/ingktds/.mysqlenv/bin:/Users/ingktds/.mysqlenv/shims:/Users/ingktds/.mysqlenv/mysql-build/bin:/Users/ingktds/.rbenv/shims:/usr/local/bin:/usr/local/mysql/bin:/Applications/MacVim.app/Contents/MacOS:/Users/ingktds/.plenv/bin:/Users/ingktds/.plenv/shims:/Users/ingktds/.rbenv/shims:/Users/ingktds/.rbenv/bin:/Users/ingktds/.nodebrew/current/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

plenvのサイトに説明が載っていた。
以下引用。


> Rebuild the shim executables. You should do this any time you install a new Perl executable (for example, when installing a new Perl version, or when installing a cpanm that provides a command).

>```
$ plenv rehash
```

新しいPerlバージョンをインストール時や新しくCPANモジュールをインストールする時はplenv rehashをする必要があるみたいです。

[plenv](https://github.com/tokuhirom/plenv "plenv")

plenv rehashした後にplackupしたら問題なく起動することができました。

```terminal
% plenv rehash
% plackup app.pl 
HTTP::Server::PSGI: Accepting connections at http://0:5000/

```

plenv rehashでググったらpapixさんの記事が見つかりました。

[plenv環境下でcpanmを使ってモジュールを導入した後にrehashを忘れて辛い](http://blog.papix.net/entry/2013/01/27/235957 "plenv環境下でcpanmを使ってモジュールを導入した後にrehashを忘れて辛い")

同じような現象でハマっていたようですね。シェルスクリプトを利用して強制的にrehashする工夫がされていまいした。追記ではcpanmが実行された際に自動的にrehashされるようになったとの内容がありましたが私のはされないのはなんで？この辺りはもう少し調べる必要がありそうでうす。
Rails 4.2にアップデートすると、"ArgumentError: wrong number of arguments (2 for 1)"というエラーが出てテストが失敗する場合

## 問題

既存のRailsプロジェクトを4.2にアップデートして、RSpec等のテストを実行すると、以下のようなエラーが出てフィーチャスペックやコントローラスペックが失敗する場合があります。

```
ArgumentError: wrong number of arguments (2 for 1)
./app/controllers/contacts_controller.rb:39:in `block (2 levels) in create'
./app/controllers/contacts_controller.rb:37:in `create'
./spec/controllers/contacts_controller_spec.rb:125:in `block (6 levels) in <top (required)>'
./spec/controllers/contacts_controller_spec.rb:124:in `block (5 levels) in <top (required)>'
./spec/rails_helper.rb:40:in `block (3 levels) in <top (required)>'
./spec/rails_helper.rb:39:in `block (2 levels) in <top (required)>'
-e:1:in `<main>'
```

## 原因

Turbolinksのバージョンが古いとこのエラーが起きるようです。

https://github.com/rails/turbolinks/commit/153f1b0f04c718442cfd73365a2778dfe1a1c5c7

最低でも2.2.3以上に上げる必要があるみたいです。

https://github.com/rails/turbolinks/blob/master/CHANGELOG.md#turbolinks-223-august-19-2014

## 解決策

Turbolinksをアップデートしましょう。

```
bundle update turbolinks
```

同じような問題に遭遇した人は参考にしてみてください。