OmniAICreator/Qiita-1.07M huggingface dataset:
boost使ってUTF-16 LEのiniファイルを簡単に読む方法

概要
====
以下のようなini ファイルのSection情報のkeyとValueをすべて取得する方法を示す。

```:data.ini
[Data]
value = 3
str = Hello
```

[GetPrivateProfileSection](http://msdn.microsoft.com/ja-jp/library/cc429770.aspx)を利用する方法を検討したが、実装が分かりにくくなるため、boostのptreeを利用した。

技術的課題
==========
読み込みたいファイルがUTF-16LEでエンコードされていたため、ファイルの読み込もうとすると[boostjp](https://sites.google.com/site/boostjp/tips/ini)で紹介されているコードでは`read_ini`例外が送出されて終了してしまった。

```cpp
#include <iostream>
#include <string>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include <boost/optional.hpp>

using namespace boost::property_tree;

int main()
{
    ptree pt;
    read_ini("data.ini", pt);

    if (boost::optional<int> value = pt.get_optional<int>("Data.value")) {
        std::cout << "value : " << value.get() << std::endl;
    }
    else {
        std::cout << "value is nothing" << std::endl;
    }

    if (boost::optional<std::string> str = pt.get_optional<std::string>("Data.str")) {
        std::cout << "str : " << str.get() << std::endl;
    }
    else {
        std::cout << "str is nothing" << std::endl;
    }
}
```

解決方法
========

_wfopenを利用してファイルを読み込む方法~
----------------------------------------

一度、wstringstreamに入れてread_iniでアクセスする

```cpp
#include <wchar.h>
#include <sstream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>

using namespace boost::property_tree;

int main()
{
    FILE *fp = _wfopen(L"data.ini", L"r, ccs=UTF-16LE");
    std::wstringstream wss;
    
    wchar_t str[1024];
    while (fgetws(str, 1024, fp) != NULL){
            wss << str;
    }
    
    wptree pt;
    read_ini(wss, pt);
    const wptree& settings = pt.get_child(L"Data");
    for (wptree::const_iterator i = settings.begin(); i != settings.end(); ++i){
            std::wstring key = i->first;
            std::wstring value = i->second.get_value<std::wstring>();
    }
    fclose(fp);
}
```
バイナリとして読み込んで、UTF-16LEでデコードする方法
----------------------------------------------------
試行錯誤する中で、以下の方法でも読み込みに成功した。
しかし`imbue`まわりの知識が曖昧なので、`_wfopen`を利用する方法を採用した。
あと、C++11からしか`codecvt`がサポートされない。

```cpp
#include <wchar.h>
#include <iostream>
#include <codecvt>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>

using namespace boost::property_tree;

int main()
{
    std::wifstream ifs("data.ini", std::ios::binary);
    ifs.imbue(std::locale(std::locale(), 
              new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>));
    
    boost::property_tree::wptree pt;
    read_ini(ifs, pt);
    
    const boost::property_tree::wptree& settings = pt.get_child(L"Data");
    for (wptree::const_iterator i = settings.begin(); i != settings.end(); ++i){
    	std::wstring key = i->first;
    	std::wstring value = i->second.get_value<std::wstring>();
    }
}

```
分かったこと
===========
+ wifstreamは普通に`std::wifstream in(L"test.txt");`のようにopenするとデータをうまく読めない
+ 設定ファイルをUTF-16 LEで定義するとboostを利用したアクセスでは一工夫必要
+ `boost` 便利
do式とif式


ghcを使用している場合、
以下のように書くと構文エラーが出る。

```haskell:error.hs
sat p = do x <- item
        if p x then return x else failure
```

ifはdoよりも右側に字下げする必要がある。

```haskell:ok.hs
sat p = do x <- item
           if p x then return x else failure
```

Haskell 2010以前は、then節 と else節 も字下げする必要があったらしい。
ステータスバーの文字色を変更する

変更できなくて詰んでたので残しとく。

環境はiOS7

info.plistに以下２つのkeyとvalueを追加する

* **View controller-based status bar appearance**
 - NO : アプリ全体で設定
 - YES : ViewControllerごとに設定できる
* **Status bar style**
 - Gray style (default) : 文字色が黒になる
 - Transparent black style (alpha of 0.5) : 文字色が白になる**(iOS7以降では非対応)**
 - Opaque black style : 文字色が白になる**(iOS7以降では非対応)**
 - UIStatusBarStyleLightContent : 文字色が白くなる(iOS7以降)
 
 `Transparent black style`と`Opaque black style`の違いが分かんない。。。

追記(10/16)
`Transparent black style`と`Opaque black style`はiOS6以前に利用されていた項目で、iOS7以降では無くなったため指定しても変化がありませんでした。

@kishikawakatsumiさんコメントありがとうございました！

iOS7以降では`UIStatusBarStyleLightContent`が利用できるようになりました。
これを利用するとステータスバーの文字色が白くなります。

@tomohisaotaさんコメントありがとうございました！
PHPで数値文字参照

「あ」が「＆＃12354;」になるようなやつ。(&#は半角で)
mb_convert_encoding()でできるのを知った。

```php
// 日本語文字列 -> 数値文字参照
$value = mb_convert_encoding($value, 'HTML-ENTITIES', 'UTF-8');

// 数値文字参照 -> 日本語
$value = mb_convert_encoding($value, 'UTF-8', 'HTML-ENTITIES');
```
PDF とトンボ

# はじめに

　PDF を扱う iOS のアプリを作るにあたって PDF の知識が必要になったので、関連する情報をここにまとめました。トンボに関しては学校のデザイン講習でさらっと教わりましたが、やはり昔の印刷業から引き継いできているものなので、その辺りも多少なりとも理解する必要がありました。
　背景にある目的が iOS SDK の Core Graphics フレームワークで PDF を描画する事にあるので、この記事では要点だけをまとめたいと思いますが、内容は特に iOS に限ったものではありません。

# トンボ

　トンボとは印刷物の位置合わせと裁断のキリトリ線の役割を果たす印のことで、トリムマークとも呼ばれます。このトンボの規格は日本と西洋では微妙に異なり、日本式は印が二重線なのが特徴です。Illustrator の日本語版では「日本式トンボ」が標準で有効になっています。これは環境設定から変更可能です。
　この記事では日本式トンボを扱います。

## 角トンボとセンタートンボ

　角トンボは四隅に配置されるトンボで、裁断位置を決定します。

**角トンボ**
![cornertombo.png](https://qiita-image-store.s3.amazonaws.com/0/3603/81422147-283b-f0e0-d3db-58d70accfb13.png)

　センタートンボは各辺中央に配置されるトンボで、印刷物の中央線を決定します。中心に円が付くこともあります。このトンボの形が昆虫のとんぼに似ているのがトンボの由来のようです。

**センタートンボ**
![centertombo.png](https://qiita-image-store.s3.amazonaws.com/0/3603/7f726d10-a7ac-efeb-77ce-4fd53294af88.png)


## 外トンボと内トンボと塗りたし

　外トンボは角トンボの外側にある二本の線のことです。各四隅の外トンボ同士を直線で繋ぎ、裁断領域の外側に出来る領域を「塗りたし」と呼びます。印刷内容はこの塗りたしまで描画します。
　塗りたしは文字通り塗りを足すための領域です。印刷内容を実際よりも一回り大きく描画しておき、最後に塗りたし部分を裁ち落とすことで隅々まで塗り残しのないきれいな印刷物に仕上げることが出来ます。塗りたしの幅（外トンボと内トンボの距離）は約3mmです。
　内トンボは塗りたしを裁ち落とすにあたってそのキリトリ線を決定するための印です。外トンボと同様に、各四隅の内トンボ同士を直線で繋ぎます。

　慣れていないと間違って外トンボで裁ち落としてしまうというのは稀によくあります。

# 用語の照らし合わせ

　冒頭で述べた目的を達成するにあたり、ここが一番重要になります。
　Core Graphics でも CGPDFBox として enum 定義されています。

## Art Box

　Art Box とは印刷内容のうち、実際に描画される領域を長方形で括った領域のことです。 PDF など DTP からの概念になります。

　CGPDFBox では kCGPDFArtBox に相当します。

## Trim Box

　Trim Box とは内トンボを結んで作った領域で、塗りたしを裁ち落とした後の大きさを示す領域です。これが実際の裁ち落とし済み印刷物の大きさに相当します。

　CGPDFBox では kCGPDFTrimBox に相当します。

## Bleed Box

　Bleed Box とは外トンボ同士を結んで作った領域で、塗りたしを含めたものになります。

　CGPDFBox では kCGPDFBleedBox に相当します。

## Media Box

　Media Box とは紙の境界です。トンボも印刷内容もこの中に収めます。

　CGPDFBox では kCGPDFMediaBox に相当します。

## Crop Box

　Crop Box とは描画内容を切り取るための領域です。Crop Box が設定されている PDF をビューアで開くとこの領域のみを描画します。

　CGPDFBox では kCGPDFCropBox に相当します。

# Illustrator でトンボ（トリムマーク）を追加する

　Trim Box に相当する長方形を配置し、選択状態で効果（フィルタ）メニューから `トリムマーク` を実行します。
![menu.png](https://qiita-image-store.s3.amazonaws.com/0/3603/092d2063-2b08-81fb-235d-9cf5325a6b4d.png)

　これにより角トンボとセンタートンボが追加されます。図では Media Box（アートボード、Illustrator における印刷可能領域）と Trim Box である長方形オブジェクトを同じ大きさにしたため、トンボが Media Box に収まっていません。印刷データとして出力する場合、これは本来は間違いです。
　この PDF をグラフィックスコンテクスト上に描画する際に指定するオプションとしては、Media Box でも Trim Box でも同一となります。
![tombo.png](https://qiita-image-store.s3.amazonaws.com/0/3603/002f0079-1860-b346-c640-7c999d9827d2.png)
vimで文字が削除出来ないと思ったらバックスペースが効かなくなった


##はじめに
`vim`を最新版にしようといろいろいじってたらおかしくなりました。
`vim`でインサートモード中はバックスペースが効くのですが、文字入力後に一度ノーマルモードに戻って、もう一度インサートモードになって先ほどの文字を消そうをすると消 え な い 。

##対策
以下のコードを`.vimrc`に記述して解決しました。

```bash:.vimrc
set backspace=indent,eol,start
```

##コントロールコード
ちなみに、`vim`でコマンドラインモードになってバックスペースを入力すると`^H`と入力されてしまいました。
この`^H`というのは **コントロールコード** と呼ばれるものです。 **制御コード** とも呼ばれますね。同じ意味です。

キーバインドを変更する時などにコントロールコードを入力しなければならない場合があります。
表示上では`^H`となっていますが、この文字通りに入力してもコントロールコードとしての意味を持ちません。
`vim`で入力する場合は、`Ctrl + v`を押してバックスペースや`Ctrl + h`を押すと対応するコントロールコードが入力出来ます。
`vim`で色つけておけば、キーボードから直接入力した場合と`Ctrl + v`と対応するキーを入力した場合では色が変わるのでわかりやすいと思います。

##おわりに
こういう現象が起こった方は参考にしてみてください。
コントロールコードの入力方法は勉強になりました。
今回は以下の記事を参考にさせて頂きました。ありがとうございます。

>cygwin vimで\<BS>,\<DEL>が効かないとき
>http://blogs.yahoo.co.jp/momongamemonga/39861534.html
swift 数値の文字列フォーマット変換 桁数丸め

Javaのstring.formatに似たようなのを探したらあった

swift - String formatting of a Double - Stack Overflow <http://stackoverflow.com/questions/24047374/string-formatting-of-a-double>

>var str = NSString(format: "%.2f", 42.12312312313)

結果

>42.12
rm コマンドと削除対象確認

こんにちは。
rm コマンドは -i オプションを持っていますが、事前にまとめて削除対象を確認する仕組みを持っていないのが残念です。

次善策ですが、下記例のように削除対象を事前に確認した後、rm コマンドの削除対象指定は手打ちせずシェル履歴呼び出しを使うと危険低減できそうです。

```
$ ls -ld files*
 :
 :
$ rm -v files*
```

```
$ ls -l directory | head -n 20
 :
 :
$ rm -rv directory
```
* BSD系は```-v```だけで良いようですが、Linuxでは```-f```もつける必要があるようです。
DashのMDN JavaScript Docsetの日本仕様を作りました

DASHのjavascriptのdocsetの日本語版がなかったので作りました。

https://github.com/fainder/Dash-Docset-JavaScript-ja

英語のものから強引に日本語仕様にしたので、まだインデックスが切れているページがありますが、主要なところはカバーできていそうです。

見つけ次第、pushしておきます。

ライセンス辺りが怪しそうなので、とりあえずということで。
問題なければそのまま公開しておきます。

次回のポストはDASHのdocsetの日本語化を少し書こうと思います！
MacでCocos Code IDEを使ってみる その１


今までxcodeで開発していましたが、
なんでも。Cococs Code IDEが便利ということで、
試しに使ってみることにしました。

##ダウンロード
[公式サイト](http://www.cocos2d-x.org/wiki/Cocos_Code_IDE)からMac用をダウンロード
僕の場合は、cocos-code-ide-mac64-1.0.0-rc2.dmgがダウンロードされました。


cocos-code-ide-mac64-1.0.0-rc2.dmgをダブルクリックし、
いつものごとく、Applicationsフォルダにドラックアンドドロップ。



##立ち上げる。

起動すると、workspaceを聞かれる。
任意のフォルダを選択して、「OK」ボタンをクリック。


![スクリーンショット 2014-10-15 22.42.59.png](https://qiita-image-store.s3.amazonaws.com/0/25562/ac9e2354-23bf-6a47-8585-4d69c5e822d0.png "スクリーンショット 2014-10-15 22.42.59.png")


起動しました。

![スクリーンショット 2014-10-15 22.43.29.png](https://qiita-image-store.s3.amazonaws.com/0/25562/a989b330-db34-e1dd-c363-9fedd770cf0d.png "スクリーンショット 2014-10-15 22.43.29.png")


##試しに新規プロジェクトを作成してみる。
####1.上の画像に、[javascript]と[lua]が表示されていますが、[lua]の部分をクリック。
Luaの設定画面が開くの、[Lua Frameworks]の部分に、cocos2dxのSDKをインストールした場所を指定してOKする。

####2.メニューのFile→New→Cocos Lua Projectを選択して、プロジェクトを作成する。

![スクリーンショット 2014-10-15 22.56.01.png](https://qiita-image-store.s3.amazonaws.com/0/25562/4f9d5e49-0f1b-0769-b701-3e0baa2552e9.png "スクリーンショット 2014-10-15 22.56.01.png")

####3.projectNameなどはそのままで[next]をクリックし、そのまま[finish]を選択。

![スクリーンショット 2014-10-15 22.58.25.png](https://qiita-image-store.s3.amazonaws.com/0/25562/3768ae20-46e2-bb12-383a-eed5de7fcc25.png "スクリーンショット 2014-10-15 22.58.25.png")


##シミュレーションを立ち上げてみる。
これで新規プロジェクト作成完成。この状態で、サンプルが付加されているので、
そのまま実行することが可能です。

ちなみに、srcフォルダ配下には、

* GameScene.lua
* main.lua

の２つのファイルができてました。

それでは実行。おお、うごいてるー。

![スクリーンショット 2014-10-15 23.15.39.png](https://qiita-image-store.s3.amazonaws.com/0/25562/0ca0e1a6-5771-02cd-dc70-acb38e8b323e.png "スクリーンショット 2014-10-15 23.15.39.png")


##さて
さて、ここから本番はここからです。
基本はC++のプロジェクトとして作成して、Lua Bindingしてみたいなーと思います。
でもそれはまた次回で。
Docker Registryの保存先をGoogle Cloud Storageにする。

ちょっと友達とWebサービスを作るか的な話になり
サーバーを動かすのにDocker使うぜ
この前いった[gcp ja night #28](http://k2lab.hateblo.jp/entry/2014/09/18/025422)でもらったクーポンもあるし
とりあえずお試しでGCP使うぜーということでDocker Registryの保存先をGCSにすることになりました。

そして色々ハマったのでメモしときます。

# 前提
環境は`Mac OSX 10.9.5`を使用しています。
gsutil version: 4.6

```text
$ docker version
Client version: 1.2.0
Client API version: 1.14
Go version (client): go1.3.1
Git commit (client): fa7b24f
OS/Arch (client): darwin/amd64
Server version: 1.2.0
Server API version: 1.14
Go version (server): go1.3.1
Git commit (server): fa7b24f
```

boot2dockerで動かしてます。
VirtualBoxのポートフォワーディングの設定、`localhost:5000`にマッピング済みです。

事前にprojectは課金設定まで済ませています。

# ストレージの作成
gsutilを使ってストレージを作成します。
`-p`でプロジェクトを指定し
`-l`でリージョンを指定しておきます。
リージョンがUSで構わない場合はなくても大丈夫です。

```bash
$ gsutil mb -p <project> -l ASIA gs://unique-storage-id
```

# 認証情報を格納したコンテナの作成

以下のコマンドを使い

```bash
$ docker run -ti --name gcloud-config google/cloud-sdk gcloud auth login
```

OAuth認証を済ませましょう。

あともしかしたら役に立つかもなのでプロジェクトのセッティングもしておきます。

```bash
$ docker run -ti --volumes-from gcloud-config google/cloud-sdk \
    gcloud config set project <project>
```

# DockerRegistryを実行

your-secondary-emailに認証したemailを入れて実行します。

```bash
$ docker run -d -e GCS_BUCKET=<unique-storage-id> GCP_ACCOUNT=your-secondary-email -p 5000:5000 \
    --volumes-from gcloud-config google/docker-registry
```

これで`docker ps`で動いてるなーと確認できればOKです。

# docker push
以下のコマンドでpushできるか確認しておきましょう。

```
$ docker tag <image_id> localhost:5000/<name>
$ docker push localhost:5000/<name>
```

# まとめ

docker-registryをサービスを動かすインスタンスでも動かせば
他の認証とか用意しなくても動かせるって[記事](http://qiita.com/spesnova/items/658a47e40eaea5b5a5f4)がありましたので
あとはtravisでよしなにするスクリプト組めばdeployの心配はなくなるかな？
マウスカーソルの画像ファイル(*.cur)からホットスポット座標を取得するワンライナー

　Windows で使われるマウスカーソルのデータ (拡張子.cur) には、マウスポインタの先っちょが画像のどのピクセル位置に対応しているかを表す "ホットスポット座標" というものが埋め込まれている。
　これをシェルスクリプトで取得する。

```bash
#!/bin/bash

##
# ホットスポットの x 座標を取得する.
# 引数には、取得したい .cur ファイルのファイルパスを指定する
function get_cursor_hotspot_x { (
	local FILE_PATH=$1
	od -N 2 -j 10 -t u "$FILE_PATH" | awk '{print $2}' | head -1
) }
 
 
##
# ホットスポットの y 座標を取得する.
# 引数には、取得したい .cur ファイルのファイルパスを指定する
function get_cursor_hotspot_y { (
	local FILE_PATH=$1
	od -N 2 -j 12 -t u "$FILE_PATH" | awk '{print $2}' | head -1
) }

```

# 参考

* [wikipedia: ICO (ファイルフォーマット)](http://ja.wikipedia.org/wiki/ICO_%28%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%29)
* [ICO(CUR) ファイルフォーマット](http://www.setsuki.com/hsp/ext/ico.htm)
homebrew-cask でのアプリのアップグレード

こんにちは。
homebrew-cask は、現状は、アプリのアップグレード関係はあまり万全ではないようですが、私は下記例の手順でやっています。

```
$ rm -v /Library/Caches/Homebrew/google-chrome-latest.dmg 
/Library/Caches/Homebrew/google-chrome-latest.dmg
$ brew cask install --force google-chrome
==> Downloading https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg
$ ls /Library/Caches/Homebrew/google-chrome-latest.dmg 
/Library/Caches/Homebrew/google-chrome-latest.dmg

```

なお fetch --force を使えば、最新ダウンロードを行ってくれるので、上記の rm コマンドの代わりに、こちらの方が良いかも。

```
$ brew cask fetch --force google-chrome
$ brew cask install --force google-chrome
```

さらに割り切るならば、既存ダウンロード物を全て消去してからでも良いかも。

```
$ brew cask cleanup
$ brew cask install --force google-chrome
```

---
なおディレクトリ調べについては、

```
$ brew --cache
/Library/Caches/Homebrew
$ brew cask doctor | grep -A 2 'Cached Downloads'
==> Homebrew-cask Cached Downloads:
/Library/Caches/Homebrew
/Library/Caches/Homebrew/Casks
$ brew cask doctor | grep -A 1 'Staging Location'
==> Homebrew-cask Staging Location:
/opt/homebrew-cask/Caskroom
```
FacebookがSSL3.0の脆弱性対応をしたため、急にFBログイン出来なくなった件

保守しているアプリが急にFBログインできなくなりました。
>OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server hello A: sslv3 alert handshake failure

こんなエラーが吐かれていた。
どうやらsslv3での接続がうまくいってないようす。
しばらく経ってsslv3の脆弱性を知る。
それに伴いfacebookがsslv3接続を拒否したことを知る。
じゃあ、sslv3で接続しないければいいということでfbログインに利用していたgemのfb_graphを調べる。
fb_graphで利用しているgemのhttpclientが2.3.*だとデフォルトでsslv3で接続するらしい。
https://github.com/nov/fb_graph/issues/372
fb_graphをbundle updateして接続したらうまくいきました。
Unityで経過時間を表示させる

# 作りたいもの
ゲームによくある、画面左上などに経過時間表示させるやつ
今回はボタンを押すと経過時間を表示し、もう一度押すとリセットするものを作る

# 準備
+ NGUIのインポート(2.7.0 フリー版)
+ 適当なフォント(ttfファイル)

# 手順
### スクリプト
```csharp:ElapsedTime.cs
public class ElapsedTime: MonoBehaviour {

    UILabel label;
    System.DateTime startTime;
    System.DateTime elapsed;
    bool onClick = false;


	void Start () 
    {
	    this.label = GetComponent<UILabel>();
        this.elapsed = System.DateTime.Now;
        Initialize();
	}
	
	void Update () 
    {
        if (this.onClick)
        {
            System.DateTime now = System.DateTime.Now;
            if (now != this.elapsed)
            {
                System.TimeSpan deltaTime = now - this.startTime;
                this.label.text = deltaTime.Hours.ToString("D2") + " : " + deltaTime.Minutes.ToString("D2") + " : " + deltaTime.Seconds.ToString("D2");
                this.elapsed = System.DateTime.Now;
            }
        }
	}

    // NGUIのButtonをクリックすると呼ばれるメソッド
    void ButtonOnClick()
    {
        if(this.onClick) 
        {
            this.onClick = false;
            Initialize();
        }
        else
        {
            this.startTime = System.DateTime.Now;
            this.onClick = true;
        }
    }

    void Initialize()
    {
        const string DEFAULT = "00 : 00 : 00";
        this.label.text = DEFAULT;
    }
}
```

### NUGI部分
1. NGUIメニューの Open the UI Wizard からUIを作成
2. NGUIメニューの Open the Font Maker でUIFontを作成(TypeをDynamicにしてttfファイルを選択)
3. NGUIメニューの Open the Wedget WizardからLabelとButtonをUIのPanel下に作成(Atlasはサンプルのものを使用)
4. Labelの名前をTimeLabelに変更 上記のElapsedTime.csと作ったUIFontをアタッチする
5. ButtonにAddComponent > NGUI > Interaction > Button Messageをアタッチする
6. InspenterからButton MessageのTargetにTimeLabelをアタッチし、FunctionNameをButtonOnClickと入力、TriggerをOnClickにする
7. TimeLavel、Buttonの位置や大きさを適当に調節
SSL 3.0を受け付けているかを確認するツール作ったのでドヤ顔で公開する。

SSL 3.0に、通信の中身を覗かれてしまう脆弱性が発見されました。

詳細は[こちら](http://googleonlinesecurity.blogspot.jp/2014/10/this-poodle-bites-exploiting-ssl-30.html)をご覧ください。

サーバを運営している方は、ユーザの情報を守るためにもSSL 3.0を使わないようにしましょう。各ブラウザの[対応状況](http://ja.wikipedia.org/wiki/Transport_Layer_Security)を見ても、SSL 3.0は塞いでしまって問題無いと考えます。

もし、自分のサイトでSSL 3.0を受け付けているかわからない方や、きちんと塞げているか自信のない方のために、SSL 3.0を受け付けているか否かを確認できるツールを作成しました。

# [SSL 3.0 checker](http://checksslv3.herokuapp.com/)
塞げているときは、
![スクリーンショット 2014-10-15 22.02.49.png](https://qiita-image-store.s3.amazonaws.com/0/25176/acf8fa50-6c2c-f4bd-19e0-1bab57b49edc.png)

SSL 3.0を受け付けているときは、
![スクリーンショット 2014-10-15 22.02.30.png](https://qiita-image-store.s3.amazonaws.com/0/25176/1f239e53-3ba2-2a64-f362-1b1e60681455.png)

と表示されます。

設定のお供にお使いください。

なお、きちんと作ったつもりではいますが、なんの品質保証ありません。ご利用は自己責任でお願いします。
何か問題を見つけられた方は、コメントでご指摘をお願いします。
STL コンテナを代入できる選択ソートテンプレート関数

## 概要

STL のソート関数テンプレートは非常に便利だが、この関数を適用するためにはコンテナにランダムアクセスイテレータが定義されている必要がある。

そのため、 std::list など、ランダムアクセスイテレータが使えないコンテナについては自前でソート関数を書く必要がある。

そこで、 Wikipedia の記事を参考にして選択ソートのテンプレート関数を書いた。計算量 O(n^2) だが Bubble sort よりは早い。

## アルゴリズム

Wikipedia より引用

> データ列中で一番小さい値を探し、1番目の要素と交換する。次に、2番目以降のデータ列から一番小さい値を探し、2番目の要素と交換する。これを、データ列の最後まで繰り返す（厳密には、データ列の最後より1つ手前までの繰り返しでよい。一つ前まで交換済みであれば、最後（残り）は必ず最大値になるからである）。大小が入れ替わる降順の場合も同様の手法。

[記事リンク](http://ja.wikipedia.org/wiki/%E9%81%B8%E6%8A%9E%E3%82%BD%E3%83%BC%E3%83%88)

## コード
```cpp

#include <iostream>
#include <list>
using namespace std;

//! 選択ソートテンプレート関数
template <typename InIt, typename Pred>
void select_sort(InIt init, InIt last, Pred pred)
{
	for(InIt curr = init; curr != last; ++curr)
	{
		InIt itMin = curr; 

		// curr 以降のデータ列中で最小の要素を探す
		for(InIt it = curr; it != last; ++it)
		{
			if(pred(*it, *itMin))
			{
				itMin = it;
			}
		}
		
		// curr と見つかった最小要素の値を交換
		std::swap(*itMin, *curr);
	}
}

// 実行例
int main()
{
    // リストコンテナを定義
	std::list<int> lst = { 5, 4, 8, 7, 9, 1, 0 };
	
	cout << "最初\n";
	for(int i : lst) { cout << i << ", "; }
	
	select_sort(lst.begin(), lst.end(),
		[](const int& a, const int& b) -> bool
	{
		// 昇順ソート
		return a < b;
	});
	
	cout << "\n\n昇順\n";
	for(int i : lst) { cout << i << ", "; }
	
	select_sort(lst.begin(), lst.end(),
		[](const int& a, const int& b) -> bool
	{
		// 降順ソート
		return a > b;
	});
	
	cout << "\n\n降順\n";
	for(int i : lst) { cout << i << ", "; }
	
	return 0;
}

```

## コンソール出力
```
最初
5, 4, 8, 7, 9, 1, 0, 

昇順
0, 1, 4, 5, 7, 8, 9, 

降順
9, 8, 7, 5, 4, 1, 0, 

```

## メモ

内部で使っているイテレータ `itMin` をポインタにするともっと早くなるのかなぁ……
Rubyを勉強して覚えた事を簡単にまとめてみた


Rubyをちょっと勉強しているんだけど覚えたことをなかなかアウトプットしきれていないので
現時点で把握している内容を簡単にまとめてみました。

何か文字列を表示する。

```ruby:plac.rb
printf "Hello Ruby¥n"
print "Hello Ruby¥n"
puts "Hello Ruby"
p "Hello Ruby"
```

実行してみるとこんな感じ。

```
$ ruby plac.rb
Hello Ruby
Hello Ruby
Hello Ruby
"Hello Ruby"
```

pメソッドに関してはオブジェクトの内容を表示しています。


<h1>ループについて</h1>
1から10まで表示する。
1.While

```ruby:plac.rb
i=1
while i<=10
  puts i
  i += 1
end
```

2.until

```ruby:plac.rb
i=1
until i>10
  puts i
  i += 1
end
```

3.for文①

```ruby:plac.rb
for i in 1..10
  puts i
end
```

4.for文②

```ruby:plac.rb
ar = [1,2,3,4,5,6,7,8,9,10]
for i in ar
  puts i
end
```

1〜4の結果は全て同じ。
これを出力すると

```
$ ruby plac.rb
1
2
3
4
5
6
7
8
9
10
```

というかある人からのアドバイスによるとRubyではfor文は使わないらしい...(´・ω・｀)
じゃあfor文を使わずにどう回せばいいのさ('A`)

<h1>そんなときはeachとかtimesとかuptoとかdowntoを使えばいいよ</h1>

はいまずeach文

```ruby:plac.rb
(1..10).each{|num|
  puts num
}
```

次はtimes

```ruby:plac.rb
10.times{|num|
  puts num+1
}
```

表示結果は0からnum-1なので+1しています。

upto

```ruby:plac.rb
1.upto(10){|num|
  puts num
}
```

downtoは逆に10から1ずつ減らして表示する

```ruby:plac.rb
10.downto(1){|num|
  puts num
}
```

うん...確かにfor文なんかより簡単で読みやすいですはい
そしてもっと簡単に書く方法があり...
<h1>表示するだけならオブジェクトとして出力してもいいんでしょ？</h1>

```ruby:plac.rb
p (1..10).to_a
```

結果

```
$ ruby prac.rb
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

1行で表示できちゃったよ
す...素晴らしい:(；ﾞﾟ'ωﾟ'):
これがいわゆるショートコーディングと言われるやつですか・ｘ・
Vimの起動が遅い場合にやったこと

以下コマンドで所要時間をファイルに書き出す(fooは適当なファイル名でOK）
> $ vim --startuptime foo

出力結果を確認
> $ cat foo

以下のような形で各所要時間をファイルに書き出してくれる
> 1
 2
 3 times in msec
 4  clock   self+sourced   self:  sourced script
 5  clock   elapsed:              other lines
 6
 7 000.003  000.003: --- VIM STARTING ---
 8 000.071  000.068: Allocated generic buffers
 9 000.134  000.063: locale set
10 000.138  000.004: window checked
11 000.660  000.522: inits 1
12 000.667  000.007: parsing arguments
13 000.668  000.001: expanding arguments
14 000.676  000.008: shell init
15 000.918  000.242: Termcap init
16 000.953  000.035: inits 2
17 001.008  000.055: init highlight
18 001.662  000.225  000.225: sourcing /usr/share/vim/vim72/syntax/syncolor.vim
19 001.787  000.408  000.183: sourcing /usr/share/vim/vim72/syntax/synload.vim
20 016.369  014.532  014.532: sourcing /usr/share/vim/vim72/filetype.vim
21 016.411  015.107  000.167: sourcing /usr/share/vim/vim72/syntax/syntax.vim
22 016.469  000.012  000.012: sourcing /usr/share/vim/vim72/filetype.vim
23 016.562  000.055  000.055: sourcing /usr/share/vim/vim72/ftplugin.vim

.vimrc内の各設定にかかった時間を知りたい場合は、以下NeoBundleプラグインを導入
> NeoBundle 'git://github.com/mattn/benchvimrc-vim.git'

その後、Vimを再起動してプラグインインストール
> :NeoBundleInstall

Vim画面より.vimrcを開いて以下を実行
> :BenchVimrc

各設定毎にかかった時間が表示されます。
>41   0.000008 00041: set tabstop=4
42   0.000008 00042: set softtabstop=4
43   0.000007 00043: set shiftwidth=4
44   0.000014 00044: set expandtab
45   0.000009 00045: set autoindent
46   0.000009 00046: set backspace=indent,eol,start
47   0.000008 00047: set wrapscan
48   0.000008 00048: set showmatch
49   0.000007 00049: set wildmenu
50   0.000009 00050: set formatoptions+=mM
51            00051:
52   0.000008 00052: set nobackup
53   0.000010 00053: set noswapfile
54            00054:
55            00055: "ファイル形式検出、プラグイン、インデントをO
56   0.039253 00056: syntax on
57   0.000220 00057: filetype plugin indent on

##参考
* http://mattn.kaoriya.net/software/vim/20120315221158.htm
* http://blog.takuma7.com/blog/2014/01/02/vim-setting/
ViewControllerのToolBarを出したり消したり

二つの画面、仮にAとBとする、を遷移させた時にAではNavigationControllerによるツールバーを表示させたいけど、Bでは表示させたくないとき

```swift:ViewControllerA(ToolBar残す)
    override func viewWillAppear(animated: Bool) {
        self.navigationController?.setToolbarHidden(false, animated: true)
    }
```

```swift:ViewControllerB(ToolBar消す)
    override func viewWillAppear(animated: Bool) {
        self.navigationController?.setToolbarHidden(true, animated: true)
    }
```

最初はviewDidLoad()に書いてたんだけど、それだとB(ToolBar消したい方)からA(ToolBar残したい方)に戻った時にToolBarが消えたままになってしまった。
どうやらviewDidLoad()は初回読み込み時にしか呼ばれないらしく、画面上に現れた時はviewWillAppear関数が呼び出されるらしい。

間違ってたらゴメンナサイ
Microsoft.VisualBasic.FileIO.TextFieldParser は空行を読み飛ばす

csv の詳しい仕様は知りませんが、とりあえずそのような挙動を取るようです。

[MSDN：TextFieldParser.ReadFields メソッド ](http://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.fileio.textfieldparser.readfields%28v=vs.110%29.aspx)

> ReadFields が空白行を検出した場合は、空白行がスキップされて次の空白でない行が返されます。

-----

例えば下記のような CSV ファイル

```test.csv
"hoge


fuga"
```

ちょっと分かりにくいですが、1行1列の CSV ファイルです。唯一のフィールドの文字列 hoge⇔fuga 間に空行があります。

このファイルを TextFieldParser を使用して出力すると…

```csharp
var textParser = new Microsoft.VisualBasic.FileIO.TextFieldParser("/path/to/test.csv");
textParser.SetDelimiters(",");

while (!textParser.EndOfData)
{
	var fields = textParser.ReadFields();
	Console.WriteLine(fields[0]);
}
```

下記が出力されました。

```
hoge
fuga
```

設定するメソッドなどはないらしい。
なんだかとってももったいない気持ち。
Material Design風のNavigation drawer

@Deprecated sdk 5.0を使いましょう

support.v4に含まれるActionBarDrawerToggleがdeprecatedになったので
support.v7のActionBarDrawerToggleを使いましょう


https://github.com/ChrisRenke/DrawerArrowDrawable
の方が素晴らしいdrawableを作ってくれていたので、

AndroidStudioが自動生成したNavigation drawerのコードをベースに、
サンプルを書いてみました。

https://github.com/sis-yoshiday/MaterialNavDrawer
徒然なるままに、Vue.js の ViewModel を関数で生成してみる


**Vue.js** で ViewModel を View にバインドする際、`new Vue({..})` という風に、引数に キー＆バリュー のオブジェクト `{..}` を渡すのですが、

あれ？ **外部に公開したくない** データや、煩雑な計算用の一時データを ViewModel のメンバーとして保持するにはどうするんだ？と思ったので、試しにやってみました。

> 情弱というか、あまり Vue.js を理解していないので、違ったらコメントください！

### ViewModel

オブジェクトを生成する関数 `makeVewModel()` を実装します。変数 `count` は外部に公開されず、メソッドを通してのみアクセスできます。（いわゆるクロージャ。）

`new Vue()` の引数に、この「オブジェクトを作る関数」を指定します。

> 下記は CoffeeScript 記法です。

```coffeescript:app/scripts/main.coffee
$ ->

  makeViewModel = () ->

    count = 0

    obj =
      el: "#demo"
      data:
        firstName: "太郎"
        lastName: "山田"
        message: ""
      methods:
        displayCount: ->
          @message = count + " 回です。"
          count++
          return

    return obj

  new Vue makeViewModel()

  return
```

### View

まあ、こっちは普通に。

```html:app/index.html
<div id="demo">

  <h4><font color="orange">普通のデータタバインド</font></h4>

  <p>
    <input v-model="lastName"/> <input v-model="firstName"/>
  </p>
  <p>
    {{lastName}} {{firstName}}
  </p>

  <hr>

  <h4><font color="orange">クリックカウントの表示</font></h4>

  <p>
    <button class="btn btn-primary" v-on="click: displayCount">カウント</button>
  </p>
  <p>
    {{message}}
  </p>

</div>
```

## 動作確認

こんな感じです。

![スクリーンショット 2014-10-15 20.46.58.png](https://qiita-image-store.s3.amazonaws.com/0/35733/05f0387f-d33e-134c-e3be-2c26e55265e1.png "スクリーンショット 2014-10-15 20.46.58.png")

デモをこちらにも置きました。（GitHubページ）
⇒ http://hkusu.github.io/Vue.js_closure_demo/dist/

# おわりに

一応、実現できました。

が、コンストラクタ関数を利用すれば済む話でもあります..
（作法的にどうなんだろう？）

# ほか

- ソースコード一式は GitHub に置きました。
	- ⇒ https://github.com/hkusu/Vue.js_closure_demo
- Vue.js の環境構築手順はこちら
	- ⇒ [シンプルな MVVM ライブラリ『Vue.js』の環境構築と使ってみた感想](http://qiita.com/hkusu/items/8af744662999de618bb8)
MQTTInspector のビルド


#概要
iOS で MQTT を使ったアプリケーションのサンプルが見たかったので MQttInspector をビルドしてみました。少しバタバタしましたので、どなたかの参考になることもあるかと思い、僭越ながらメモを残させていただきます

#MQTTInspector のダウンロードと最初のビルド
[MQTTInspector](http://jpmens.net/2013/11/19/mqtt-inspector-for-ios/) の[リポジトリ](https://github.com/ckrey/MQTTInspector) を clone して、

```
git clone https://github.com/ckrey/MQTTInspector.git
```

MQTTInspector.xcodeproj を x-code で開き、ビルドすると以下のように MQTTClient.h がないとのエラーになります

![スクリーンショット 2014-10-15 20.13.20.png](https://qiita-image-store.s3.amazonaws.com/0/46544/829b1dec-9a91-74b7-1c5f-11f5a04c5018.png "スクリーンショット 2014-10-15 20.13.20.png")

MQTTClient.h ってなんだろう？とヒントを求めて[MQTTInspecor の github のwiki ページ](https://github.com/ckrey/MQTTInspector/wiki) を見ると、以下のように「MQTT-Client-Framework に依存」とのことでしたので、これをビルドすることに

![スクリーンショット 2014-10-15 20.14.13.png](https://qiita-image-store.s3.amazonaws.com/0/46544/06c13369-24f0-377c-76e5-be4ea37eac3c.png "スクリーンショット 2014-10-15 20.14.13.png")

#MQTT-Client-Framework のビルド
そこで、MQTT-Client=Framework の[リポジトリ](https://github.com/ckrey/MQTT-Client-Framework)を clone して

```
git clone https://github.com/ckrey/MQTT-Client-Framework.git
```

MQTTClient.xcodeproj を x-code で開き、ビルドすると以下のようにシェルスクリプトのエラーが出るのですがビルドは成功して libMQttClient.a はできています

![スクリーンショット 2014-10-15 20.14.55.png](https://qiita-image-store.s3.amazonaws.com/0/46544/5ff13803-cd35-4a02-9351-a615a956f916.png "スクリーンショット 2014-10-15 20.14.55.png")

![スクリーンショット 2014-10-15 20.15.14.png](https://qiita-image-store.s3.amazonaws.com/0/46544/5fa3e0ca-ef32-b438-7b05-78a6193fa837.png "スクリーンショット 2014-10-15 20.15.14.png")

# build settings を修正して MQTTInspector を再度ビルド
まず、問題の MQTTClient.h を解決するため、MQTTInspector.xcodeproj の build settings の Search Paths の Header Search Paths に、先ほどビルドした MQTT-Client-Framework のパスを下の写真のように追加します

![スクリーンショット 2014-10-15 20.16.44.png](https://qiita-image-store.s3.amazonaws.com/0/46544/4b93395e-1bbb-b9c4-ad97-f99e55be3b84.png "スクリーンショット 2014-10-15 20.16.44.png")

この状態でビルドすると、まだ下のようにエラーが残ります

![スクリーンショット 2014-10-15 20.17.11.png](https://qiita-image-store.s3.amazonaws.com/0/46544/5cb8f6f1-dba2-09cf-e48d-0be7ab129d60.png "スクリーンショット 2014-10-15 20.17.11.png")

作者の ckrey さんのパスがそのまま残っているので、自分のパスを追加します（変更したほうがよかったかも）

![スクリーンショット 2014-10-15 20.18.00.png](https://qiita-image-store.s3.amazonaws.com/0/46544/44beaf84-0f67-b760-d459-de920b4cad7a.png "スクリーンショット 2014-10-15 20.18.00.png")

これで無事にビルドできました
Elixir Comprehensions(内包表記) into

# Elixir Comprehensions(内包表記) into

## 概要
Elixir の Comprehensions(内包表記) into について。

Comprehensions（内包表記）の結果を別の型で持たせたい場合に、into を利用します。

into に指定するには [Collectable protocol](http://elixir-lang.org/docs/stable/elixir/Collectable.html) を実装している必要があり、
[List](http://elixir-lang.org/docs/stable/elixir/List.html) / BitString / [Map](http://elixir-lang.org/docs/stable/elixir/Map.html) / [HashDict](http://elixir-lang.org/docs/stable/elixir/HashDict.html) / [HashSet](http://elixir-lang.org/docs/stable/elixir/HashSet.html) / [IO(IO.Stream)](http://elixir-lang.org/docs/stable/elixir/IO.html) が指定可能。

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

~~~
nums = 1..100 |> Enum.take(50)
ret = for num <- nums, into: [9999] do
  num * 3
end
IO.puts "nums = "
IO.inspect nums
IO.puts "ret = "
IO.inspect ret

ret = for num <- nums, into: "" do
  "#{num * 3}"
end

IO.puts "ret = "
IO.inspect ret
~~~

* 出力

~~~
nums =
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
 43, 44, 45, 46, 47, 48, 49, 50]
ret =
[9999, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57,
 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, 108, 111,
 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147, ...]
 ret =
"369121518212427303336394245485154576063666972757881848790939699102105108111114117120123126129132135138141144147150"
~~~

## 参照
http://elixir-lang.org/docs/stable/elixir/Collectable.html
http://elixir-lang.org/docs/stable/elixir/List.html
http://elixir-lang.org/docs/stable/elixir/Map.html
http://elixir-lang.org/docs/stable/elixir/HashDict.html
http://elixir-lang.org/docs/stable/elixir/HashSet.html
http://elixir-lang.org/docs/stable/elixir/IO.html
http://elixir-lang.org/getting_started/18.html#18.2-bitstring-generators
多数のフィードを扱う上でのあれこれ

[昨日](http://qiita.com/ynakayama/items/de19da95cb56763d757d)は巷で人気の機械学習を利用し、テキストデータの中から興味関心にそった内容をピックアップするという話をしました。

RSS/Atom フィードは、外部から出力されるものですから、実際問題としては提供元によってかなりブレがあります。予想もしていない文字列やバイトコードが混入していることもまれではありません。

こういった問題はひとつひとつ手作業で対処していくしかないのですが、現実にはなかなか泥臭いことになることが結構あります。

今回は経験則的に得られた Tips を載せていきます。

### ストップワードを除去する

たとえば新聞社のフィードを購読すると、タイトルのほとんどに「日経」などの新聞社名や「新聞」といった文字、要約フィードから本文へのリンクとなる「全文」、掲載された「写真」といった文字が入ってきます。

こういった語句を分類に利用してしまうと、精度の低下やノイズの発生につながってしまいます。

しかもどの文字を除去したからそれで良いという正解があるわけではなくて、たとえばある月からニュースのタイトルのフォーマットが変わったということがあると、すぐに対応しないとそれまでの間に出力結果がおかしなことになってしまいます。

ストップワードはあらかじめテキストファイルやデータベース、インメモリといった場所に格納しておいて、管理者がすぐに更新できるようにしておく必要があります。

```rb
def exclude_words
  words = Array.new
  open(@exclude_txt) do |file|
    file.each_line do |line|
      words << line.force_encoding("utf-8").chomp
    end
  end
  return words
end
```

上のようにストップワードの語彙群を返すメソッドを用意しておきます。実際の処理でこの配列と付き合わせて語彙を処理対象外にするわけです。

### リダイレクトリンクを書き換える

フィードの中には link のアドレスがリダイレクトする前提になっているものもあります。たとえば Google News がそうですし、記事そのものでなくはてなブックマークのコメント欄が格納されているもの、それ以外にも短縮 URL を利用しているものなど色々なケースが考えられます。スクレイピングと組み合わせている場合、ひどいケースではフィードの link にアドレス自体がきれいにおさまってない状態で流れてくるといった場合もあります。

これらについても収集しているフィードをよく吟味して、ひとつひとつ自分の望んだ形式に書き換えるようにしていく必要があります。

たとえば Google News の場合はこんな感じで良いでしょう。

```rb
def rewrite_google_link(feed)
  if feed.link.index("http://news.google.com")
    matched = feed.link.match(/(&url=)/)
    unless matched.nil?
      new_link = matched.post_match # &url= から後ろだけを持ってくる
      feed.link = new_link unless new_link.nil?
    end
  end
  return feed
end
```

### 処理結果をロギングする

前述したように、日々フィードを収集するプロセスの動きを監視して、なにか変化があった場合はすぐに対応をしなければなりません。そのためには一連の流れをロギングし、必要に応じてメッセージや途中経過を出力しておくことが大切です。

Ruby にそなわっている標準の Logger は、レベルに応じたログの出力はもちろん、ログファイルのローテーションなどもできるスグレモノです。これを利用して日々ロギングし、定期的に処理の経緯をチェックすると良いでしょう。

puts メソッドを書き換えてしまうのもひとつの手です。

```rb
require 'logger'
LOG_LEVELS = ['info', 'warn', 'error', 'none']

def level(level)
  @level = level
end

def logger
  @logger ||= Logger.new(STDOUT)
end

def puts(level=:info, message)
  if LOG_LEVELS.index(@level).to_i > LOG_LEVELS.index(level).to_i
    return
  end
  logger.send(level, message)
end
```

こうしておけば puts メソッドで、外部から与えたレベル以上のメッセージを Logger を利用して出力することができます。

## まとめ

紹介した以外にもたくさんのノウハウがあります。どのみち分類の精度は日々チューニングをしていくことになりますので、あわせてフィードが適切に処理されているかという観点で見ていけば良いでしょう。大切なのは継続的に処理の流れをチェックし、日々改善していくという姿勢です。
git filter-branchでリポジトリから機密情報を削除

参考:

[git filter-branchで大事なデータを消去・上書き - Qiita](http://qiita.com/wnoguchi/items/62f5e64ef2ae14b4f0ee)

## git filter-branch

```bash:filter-branchを使う
git filter-branch -f --index-filter \
 'git rm --ignore-unmatch data/WindowsXP-KB835935-SP2-JPN.exe' HEAD
```

途中以下で止まることがある。

> git insufficient permission for adding an object to repository database ./objects

これは .git/objects/ 内のパーミッションがおかしい。


```bash:uidが自分以外のものを調査
find .git/objects ! -uid `id -u`
```

```bash:たいがいrootユーザが原因
find .git/objects -uid 0
```

> Warning: commit message does not conform to UTF-8.
You may want to amend it after fixing the message, or set the config

コミット時の文字コードが悪かった様子。無視


# 本当はこれがやりたかった

* WindowsXP-KB835935-SP2-JPN.exe
* WindowsXP-KB936929-SP3-x86-JPN.exe

200MB、300MBとか巨大なファイルをコミットされた・・・
しかもコミットされたのが結構過去なのでまいった。

.git/objects/ 以下のサイズがその分食っているので消したくて調べた。
-> これやってもサイズ減ってくれなかった。
Vagrant基礎コマンドまとめ

##仮想マシンイメージのインストール
* VirtualBoxのインストール
    * https://www.virtualbox.org/wiki/Downloads
* Vagrantのインストール
    * http://downloads.vagrantup.com/
* 仮想マシンイメージを以下URLより選択
    * http://www.vagrantbox.es/
* 以下手順で仮想マシンをインストール

> $ cd Vagrant/
$ mkdir localdev
$ cd localdev
$ vagrant box add ＜※Vagrantイメージ名＞　＜※仮想マシンイメージインストール元URL＞
$ vi VagrantFile
以下編集
 #config.vm.network :private_network, ip: "192.168.33.10"
 ↓
 config.vm.network :private_network, ip: "192.168.33.10"

## vagrantバージョン確認
>$ vagrant -v

## Vagrant状況の確認
>$ vagrant status

## vagrant起動
>$ vagrant up

## vagrant停止
>$ vagrant halt

## vagrant 再起動
>$ vagrant reload

## vagrant スリープ
>$ vagrant suspend

## vagrant スリープ復帰
>$ vagrant resume

## vagrant ssh接続
>$ vagrant ssh

## 仮想マシンの削除
>$ vagrant destroy
HEROKU_URL が効かず Hubot がアイドル状態になる問題の対策

**2015年10月追記：** Heroku の無料プランが改訂されて dyno のアイドル条件が厳しくなり、30分以上アクセスがない dyno はスリープするようになった。また24時間のうち6時間以上はスリープ状態でなければならないルールも加わった。

---

**TL;DR:** `HEROKU_URL` での ping をやめて、 [Uptime Robot](http://uptimerobot.com) などのモニタリングサービスを使う。 Hubot には適当に200を返すハンドラを書く。

---

2014年9月30日ごろから、 Heroku に置いた Hubot のプロセスが起動後しばらくしてアイドル状態に入るようになった。

元々 Heroku の無料プランでは1時間アクセスのない web dyno をアイドルするようになっている。 Hubot にはこの対策が組み込まれていて、環境変数 `HEROKU_URL` をセットすると、自分に向けて定期的に HTTP リクエストを出してアイドルを防ぐようになっている。

ところが、最近になって Heroku プラットフォームに変更があったらしく、自分に向けたリクエストが `Request Interrupted` なる理由で失敗するようになった。 web プロセスは失敗したリクエストに関知しないので、しばらくするとアイドル状態になってしまう。

リクエストが失敗するとおおよそ以下のようなログが出る（抜粋、一部伏せ字）：

```
$ heroku logs
2014-10-14T06:40:15.984974+00:00 app[web.1]: [Tue Oct 14 2014 06:40:15 GMT+0000 (UTC)] INFO keep alive ping!
2014-10-14T07:00:15.980907+00:00 heroku[router]: sock=backend at=error code=H18 desc="Request Interrupted" method=POST path="/hubot/ping" host=(***).herokuapp.com request_id=(***)
ba08941 fwd="(***)" dyno=web.1 connect=0ms service=1ms status=503 bytes=140
```

Hubot のリポジトリにも同様の issue が報告されている：[Hubot idling on Heroku after 503s · Issue #779 · github/hubot · GitHub](https://github.com/github/hubot/issues/779)

失敗するのは自分に向けたリクエストだけなので、 web プロセスを生かしておくには外部からリクエストを送ればよい。上記 issue には [Uptime Robot](http://uptimerobot.com) を使って解決したというコメントがあった。これは無料で50サイトまでの生存確認をしてくれるサービスらしい。

Uptime Robot にアカウントを作り、 Hubot インスタンスを HTTP でモニタリングするように設定した：

![スクリーンショット 2014-10-15 19.55.20.png](https://qiita-image-store.s3.amazonaws.com/0/735/fa344940-5b93-4a63-0fa8-3cf6b04c97a9.png)

モニタ先が404を返すとダウンしているとみなされるようなので（きちんと確認していないが……）、200を返すハンドラを Hubot に仕込んだ：

```coffeescript:scripts/ping-listener.coffee
# Description:
#   Handles GET /

module.exports = (robot) ->
  robot.router.get '/', (req, res) ->
    res.send 'pong'
```

これで Hubot が生き続けるようになった。
iOS8:UISplitViewControllerのMasterViewにUITabBarController追加する


##概要
UISplitViewController の MasterView に UITabBarController を追加した所、iPhone でUITableViewController のセルをクリックして DetailView への遷移がプッシュではなくモーダルで表示されてしまうので解決方法のメモです。

##StoryBoard の設定
![ios8_tabnavi.png](https://qiita-image-store.s3.amazonaws.com/0/37947/2e3b0366-71c3-0f5f-44f2-ccd277e50b36.png "ios8_tabnavi.png")

##下記コードを AppDelegate.swift へ追加
```
    func splitViewController(splitViewController: UISplitViewController, showDetailViewController vc: UIViewController, sender: AnyObject?) -> Bool {
        if splitViewController.collapsed {
            let primaryTab = splitViewController.viewControllers.first as! UITabBarController
            let primaryNavi = primaryTab.selectedViewController as! UINavigationController
            let detailNavi = vc as! UINavigationController
            if let detail = detailNavi.topViewController {
                primaryNavi.pushViewController(detail, animated: true)
            }
            return true
        } else {
            return false
        }
    }
    
    func splitViewController(splitViewController: UISplitViewController, separateSecondaryViewControllerFromPrimaryViewController primaryViewController: UIViewController) -> UIViewController? {
        let primaryTab = splitViewController.viewControllers.first as! UITabBarController
        let primaryNavi = primaryTab.selectedViewController as! UINavigationController
        
        if primaryNavi.viewControllers.count > 1 {
            return primaryNavi.popViewControllerAnimated(false)
        } else {
            return nil
        }
    }
```
Capistrano3でローカルリポジトリをdeployする

# やりたいこと
Capistrano3で開発中のブランチを検証環境に気軽にぶん投げれる用にしたい。

プロトタイプみたいなのを検証環境に上げたいときに、リモートブランチにpushしてからdeployするのはめんどくさかったりするので好きじゃない。
Capistrano2だと scm :copy使えたけど Capistrano3からなくなったのが悪い。
近いようなことができるGemがみつかったのでこれを使うことにした。
（https://github.com/xuwupeng2000/capsitrano-scm-gitcopy）
# 手順

```rb:Gemfile
+ capistrano-scm-gitcopy
```

```rb:deploy/local.rb
+ set :rails_env, :staging
+ set :repo_url, ->{ "file://" + Dir::pwd + "/.git" }
+ set :scm, :gitcopy
+ ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call
```

他の設定は基本的なCapistrano3と同じなので省略。

# 使い方

```cap local deploy``` でリモートブランチからデプロイするのと同じように更新がかけられる。

れっつカジュアルdeploy
iOS 8 ではプライバシー設定への導線が分かりやすくなる

# 端末設定への導線

iOS ではいままで、アプリから明示的に端末設定（いわゆる「設定」アプリ）へ遷移することは、ある一時期を除いて基本的には許可されていませんでした。
しかし、iOS 8.0からはこれが許可されるようになりました。

具体的には次のコードでアプリから端末設定への遷移（アプリの切り替え）が行えます。

```
NSURL *URL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:URL];
```

例として、CLLocationManager から `CLAuthorizationStatus` を取得して、位置情報サービスが許可されていなければ前述のコードにより端末設定まで遷移する、ということが出来ます。

これの良いところは、遷移先がアプリ専用の設定画面だということです。明示的に設定画面を用意していない場合は設定のトップ画面になるそうですが、プライバシー系サービスを利用する場合には自動的に作られるようです。
![alert.png](https://qiita-image-store.s3.amazonaws.com/0/3603/5806cc98-b6d4-41f5-be99-de48e306eaac.png)

そこには既に「プライバシー」という項目があるので、iOS 初心者のユーザーであっても端末設定内で迷うこと無く位置情報サービスの項目まで辿り着いてもらうことが可能かと思います。

![privacy.png](https://qiita-image-store.s3.amazonaws.com/0/3603/8c5220a3-c19b-a0dc-e8e0-dbe787d4b12b.png)

※もちろん、プライバシーであることに変わりはないので、ユーザーに対してプライバシー情報へのアクセスを無理矢理に許可させるような作りにしてしまうのもあまりよろしくはないのかな、とも思います。

位置情報サービス全体がオフとなっている場合はユーザーに大元の「プライバシー」まで辿っていってもらわなければなりません。

----

今回は位置情報サービスのみ扱いましたが、表記には「プライバシー」とあるので、その他のプライバシー系情報、例えば「写真」や「連絡先」へのアクセス設定もここにまとめられるのではないかと思います。であれば、同様の方法でアプリから設定への導線を確保することが出来ますね。

# 追記

`UIApplicationOpenSettingsURLString` を使って「設定への遷移」を実装したアプリが無事審査を通過しました。
Xamarin.Android Theme 記述方法について


こんにちは。エクセルソフトの田淵です。

Android の Activity に Style を参照させたり、直接 Theme を指定したり、良く書き方を忘れて検索するのでメモとして残しておきます。

> 2015/5/3 追記：Material Design の設定方法は、
[Xamarin.Android で Material Design を使用する方法 (Android 5.x のみ) - Qiita](http://qiita.com/ytabuchi/items/7fb0e19d394331220a57)
[Xamarin.Android で Material Design を v7 AppCompat で使用する方法 (Android 2.x/4.x も含む) - Qiita](http://qiita.com/ytabuchi/items/85a78d405e1ca01850cd)
のエントリーに記載しました。併せてご参照ください。


# Theme の種類

Theme.Holo
Theme.Holo.NoActionBar
Theme.Holo.Light.DarkActionBar
Theme.Holo.Light.NoActionBar.FullScreen
Theme.DeviceDefault

あたりを覚えておけば大丈夫そうです。DeviceDefault は API 14 以上みたいです。


ここは通常の Android 開発と同じですので、詳しくは [R.style | Android Developers](http://developer.android.com/reference/android/R.style.html) や [Styling the Action Bar | Android Developers](https://developer.android.com/training/basics/actionbar/styling.html) を参照してください。

# Styles.xml (@style/xxx) で指定する方法

例えば以下のように指定します。

```XML:Resources/values/Styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- the theme applied to the application or activity -->
    <style name="MyTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/MyActionBar</item>
        <item name="android:windowBackground">@drawable/bg</item>
    </style>

    <!-- ActionBar styles -->
    <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
        <item name="android:background">#4AA3DF</item>
    </style>
</resources>
```

これで Holo Light を使用してウィンドウの背景を drawable/bg.png に、ActionBar の色を #4AA3DF に設定しています。

## Activity に Style を指定する場合

スタイルを Activity.cs に次のように設定します。

```Activity.cs
[Activity(Label = "AndroidApp", MainLauncher = true, Theme = "@style/MyTheme")]
```

## 全体に指定する場合

AndroidManifest.xml に次のように設定します。

```Properties/AndroidManifest.xml
<application android:label="AndroidApp" android:theme="@style/MyTheme">
```



# 直接指定する方法

カスタマイズの必要もなく、例えば NoActionBar だけ指定したい場合などは次のように直接指定しても大丈夫なようです。

```Activity.cs
[Activity(Label = "AndroidApp", MainLauncher = true, Theme = "@android:style/Theme.Holo.Light.NoActionBar")]
```

```Properties/AndroidManifest.xml
<application android:label="Android" android:theme="@android:style/Theme.Holo.Light.NoActionBar">
```

# Xamarin 気になった方は

是非 [ダウンロード(直接)](http://xamarin.com/download) / [ダウンロード(弊社経由)](https://www.xlsoft.com/jp/products/download/index.html?option=Xamarin&r=ythb) して触ってみてください。
[学習用リソース](http://ytabuchi.hatenablog.com/entry/2014/08/26/191759) や [JXUG リンクページ](http://jxug.org/links.html) に参考資料を纏めてますので併せてどうぞ。

<a href="http://blog.hatena.ne.jp/ytabuchi/ytabuchi.hatenablog.com/subscribe">私のはてなブログも購読いただいたりすると嬉しいです。</a>

以上です。
【Rspec】メソッドが呼び出される順序をテストする

スタブして、`ordered`をつける。

```rb
Class AAA
  def abc_def
    puts_abc
    puts_def
  end

  def puts_abc
    puts 'abc!'
  end

  def puts_def
    puts 'def!'
  end
end
```

```rb
describe '#abc_def' do
  let(:aaa) { AAA.new }
  it do
    expect(aaa).to receive(puts_abc).ordered
    expect(aaa).to receive(puts_def).ordered
    aaa.abc_def
  end
  # => Success

  it do
    expect(aaa).to receive(puts_def).ordered
    expect(aaa).to receive(puts_abc).ordered
    # ↑順序が逆
    aaa.abc_def
  end
  # => Failure/Error:
  #     received :puts_abc out of order
end
```
VPCを超えて、Elastic BeanstalkのMySQLサーバーに接続するメモ


## 参考サイト

[RDSにSSHのポートフォワーディングでMySQLに接続する方法 CakePHP編](http://blogs.yahoo.co.jp/same_yh_id/62263141.html)


## 手順

### １．[Key Pairを作成](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html#having-ec2-create-your-key-pair)しておく

### ２．Elastic Beanstalk作成時に、Key Pairを指定しておく

### ３．EC2インスタンスに結びついているSecurity GroupのInboundタブで、ssh（２２番）ポートを開けておく。
（SourceのところはMy IPを選ぶのがいいかも？）

### ４．sshのポートフォワーディング

```shell:
$ ssh -f -N -L 3307:dev-ss.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 ec2-user@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com -p 22 -i my-keypair-ec2user.pem
```



| 対応表         |                                                        |
|:--------------|:-------------------------------------------------------|
| EC2のPublic DNS | ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com |
| RDSのEndpoint | dev-ss.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com |
| Key Pair | my-keypair-ec2user.pem |



### ５．好きなMySQLクライアントでlocalhost:3307に接続する

コンソールクライアントの場合：

```shell:
$ mysql -u dbuser -p -h localhost --port=3307
```
「平均被ストック数は9」「被ストック数100以上の記事は1%」…QiitaAPIv2で1万件の投稿を分析して分かったこと

QiitaAPIがv2になったことで取得出来る記事数が増えました。
そこで、最新の1万件の投稿を取得して、被ストック数についていくつか分析してみました。
（頑張ればより多く（99%近く。100%は多分不可能）の記事も取得可能ですが、取得に時間と手間がかかりそうなので、ひとまず簡単に取得可能な最新1万件を取得してみました）

### データ取得

被ストック数を取得するには、[投稿の取得API(`GET /api/v2/items`)](http://qiita.com/api/v2/docs#get-/api/v2/items)だけでは出来ません（返答JSONに被ストック数は含まれません）。投稿を取得した後にそれぞれの記事に対してストックユーザを`GET /api/v2/items/:item_id/stockers`で[取得](http://qiita.com/api/v2/docs#get-/api/v2/items/:item_id/stockers)する必要があります。すなわち、以下のような流れになります。

1. 10000万件の投稿を取得
2. 10000万件全ての投稿に対してストックユーザを取得

300件/h可能なので、2.で、1万件取得するのに大体30hくらいかかるはずです。

#### 注意点
* 利用可能数以上のリクエストを送ると「Rate limit exceeded」エラーが返ってくるので1時間待機等の処理を入れるとよいと思います。
* タイミングによっては「502: Bad Gateway」エラーが返ってくるので、再リクエストを要求する処理も入れるとよいと思います。

#### サンプルコード
1.の10000万件取得の部分の抜粋（基本部分のみ）です。

```php:get.php
<?php
ini_set('display_errors', 1);
$context = stream_context_create(array(
        'http' => array('ignore_errors' => true,
        'header' => "Authorization:Bearer *****")
));

for($i = 1; $i < 101; $i++){
                $url = 'http://qiita.com/api/v2/items?page='.$i.'&per_page=100';
                $res = file_get_contents($url, false, $context);
                $filename = './'.$i.'txt';
                file_put_contents($filename, $res);
        }

}
```

### 被ストック数の分布について

分析結果です。
まず、ヒストグラム（度数分布）で分布のイメージを示します。**ほとんどの投稿（80%以上）が被ストック数10以下**であるとわかります。


![Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/50690/83ab1cb7-72d6-1119-4ca7-1c6169fbf969.png)

以下が具体的な割合になります。QiitaのTwitterで投稿されるような**100以上の注目の記事は全体の1%程度**であると分かります。

|   範囲  | 割合(%) |
|:-------:|---------------------|
| 0       |        15.5         |
|   1-9   |        66.1         |
|  10-19  |        12.0         |
|  20-39  |         3.8         |
|  40-59  |         1.1         |
|  60-79  |         0.5         |
|  80-99  |         0.2         |
| 100-299 |         0.6         |
|   300-  |         0.4         |

また、**平均ストック数**は「**9.3**」でした。ただし、**中央値**は「**4**」でしたので、記事を投稿した際、最も可能性の高い被ストック数という意味では「4」になるかもしれません。
被ストックはQiita利用のモチベーションになるので、記事を投稿した際の目安にするのもよいかもしれないなと思います。
9章 ラウンディングエラー(丸め誤差)

##プログラマーの時給とバグ修正に要した時間からバグ修正のコストを算出してみる

```
#アカウントテーブル
CREATE TABLE `Accounts` ( 
  `account_id` int(10) unsigned NOT NULL,
  `hourly_rate` FLOAT, #時給
  PRIMARY KEY (`account_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#バグ管理テーブル
CREATE TABLE `Bugs` ( 
  `bug_id` int(10) unsigned NOT NULL,
  `assigned_to` int(10) unsigned NOT NULL, #修正担当
  `hours` FLOAT, #バグの修正時間
  PRIMARY KEY (`bug_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
上記のようなテーブルがあったとして、下記のようなSQLを組むことでバグごとの修正コストは算出できる。

```
SELECT b.bug_id, b.hours * a.hourly_rate AS cost_per_bug
FROM Bugs AS b
 INNER JOIN Accounts AS a ON b.assigned_to = a.account_id;
```
さて、ここでhours(バグの修正時間)やhourly_rate(時給)にFLOAT型を使うと何が起きるのか、というのが今回のお話。

## 9.1 目的：整数の代わりに小数値を使用する
小数を使えば時給はセント単位まで計算できるし、時間も分、秒単位まで計算できて正確・・なはず・・

## 9.2 アンチパターン：FLOATデータ型を使用する
#### 9.2.1 丸めが避けられない
無限小数を扱った途端に誤差が発生する。だってプログラムは有限小数しか扱えないから
1/3は0.333などの値に丸めなければならないため。

#####10進数の有限小数を2進数で表現すると無限小数になってしまう問題
例：10進数の0.3を2進数で表現すると・・

```
0.3
x 2
----
0.6
x 2
----
1.2
x 2
----
0.4
x 2
----
0.8
x 2
----
1.6
x 2
----
1.2

0.01001...
```

####9.2.2 SQLでのFLOATの使用

```
SELECT hourly_rate FROM Accounts WHERE account_id = 123;
59.95

SELECT hourly_rate * 1000000000 FROM Accounts WHERE account_id =123;
59950000762.939

SELECT * FROM Accounts WHERE hourly_rate = 59.95
Empty set

SELECT * FROM Accounts WHERE ABS(hourly_rate - 59.95) < 0.000001;
これなら値は出るがしきい値を適宜設定する必要がある
```
#####浮動小数点計算は掛け算を使用した際に誤差がさらに大きくなる。
例)0.999を1000回掛けると0.36769..になる。複利計算などで起きがち

##9.3 アンチパターンの見つけ方
FLOAT,REAL,DOUBLE,PRECISIONなど小数を扱う型の設定があれば誤差は生じると考えて良い

##9.4 アンチパターンを用いても良い場合
科学技術計算

##9.5 解決策：NUMERICデータ型を使用する
DECIMALでもOK。つまりは固定小数点を使えという話。
無限小数は扱えないが、2進数変換による誤差は避けられる。

```
CREATE TABLE `Accounts` ( #アカウントテーブル
  `account_id` int(10) unsigned NOT NULL,
  `hourly_rate` NUMERIC(9,2), #時給
  PRIMARY KEY (`account_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `Bugs` ( #バグ管理テーブル
  `bug_id` int(10) unsigned NOT NULL,
  `assigned_to` int(10) unsigned NOT NULL, #修正担当
  `hours` NUMERIC(9,2), #バグの修正時間
  PRIMARY KEY (`bug_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

さきほどのFLOATのときと同じ計算をしてみると・・

```
SELECT hourly_rate FROM Accounts WHERE account_id = 123;
59.95

SELECT hourly_rate * 1000000000 FROM Accounts WHERE account_id =123;
59950000000.00 #FLOATのときは59950000762.939だった

SELECT * FROM Accounts WHERE hourly_rate = 59.95
+------------+-------------+
| account_id | hourly_rate |
+------------+-------------+
|        123 |       59.95 |
+------------+-------------+
1 row in set (0.00 sec)

```

## まとめ
概算以外で小数点計算を行う場合はFLOAT型ではなくNUMERIC型(DECIMAL型)を使いましょう。
ページのJavaScriptを動的に書き換えて実行する

DevToolsで動的にページのJavaScriptを書き換えて実行できるのを数ヶ月前まで知らなかったのでメモ。

![dynamic-compile.gif](https://qiita-image-store.s3.amazonaws.com/0/5538/0e284f4b-9d44-534e-6d20-a1cfcbdbbb78.gif)

上のGIFでは、DevToolsのSourcesタブから、ページ内で読み込まれているJavaScriptのファイルを選択して、`onkeydown`で呼ばれる関数の中を書き換えて、`⌘ + s`で保存してる。そのあとtextareaに文字を入力すると、書き加えたコード（ここで追加してるのは`console.log`ね）が実行されて、文字列が下部のConsoleに出力されてるのがわかる。

---

ちなみに、1行目にブレークポイントを置いて停止している間に書き換えることもできる。当然、全部削除して保存すると何も実行されなくなる。

---

HTTPSでローカルプロキシしにくいページとかでデバッグするのに便利かなーと思った。