OmniAICreator/Qiita-1.07M huggingface dataset:
Perlでワンタイムパスワード認証を導入するために使えそうなライブラリ

# Perlでワンタイムパスワード認証を導入するために使えそうなライブラリ

## 概要

最近流行の不正ログインへの対策なんかで、ワンタイムパスワード(以下OTP)の導入がはやっている。
ユーザーがとても使いにくい点など、OTP認証についての議論はおいておいて、既存の認証のしくみに加えOTP認証を実装しようと思ったらどんな感じになるかを考え、実現するために必要そうなライブラリを用意した話。  

## ここでいうOTP関連の仕様

* [HOTP: An HMAC-Based One-Time Password Algorithm](http://tools.ietf.org/html/rfc4226)
* [TOTP: Time-Based One-Time Password Algorithm](http://tools.ietf.org/html/rfc6238)

もう一個関係ありそうなのがあるがこれは今回の話の対象外。

* [OCRA: OATH Challenge-Response Algorithm](http://tools.ietf.org/html/rfc6287)

## OTPの使いどころ

例えば、このように使われているのを見かけることがある。

1. 通常のパスワード認証 + OTP入力 : Googleなど
2. ユーザーが設定したPIN + OTPによる認証 : ハードウェアトークンを用いるSSL-VPN系のプロダクトとか
3. 10個の(一見ランダムな)数字を保存しておいて一回ずつ利用 : Googleのバックアップコードみたいなやつ

ここではこれらの方式が素晴らしく、導入すべきだという話ではない。
3つめはいくらでも簡単に実装できるので微妙だが、HOTP/TOTPの利用という観点からこれらの処理を細かく見ていく。  

### パスワード認証 + OTP認証

* Google Authenticator的なものにOTPの設定をする
 * OTP設定作成(TOTP)、DBなどに保存
 * 設定用URIを生成
 * QRコードなどで読み込ませる
* パスワード認証成功後、OTP入力を求め、入力されたOTPを検証
 * ユーザーに紐づくOTP設定をDBなどから読み込み
 * OTPの値を計算して比較

### PIN + OTP認証

* Google Authenticator的なものにOTPの設定をする
 * OTP設定作成(TOTP)、DBなどに保存
 * 設定用URIを生成
 * QRコードなどで読み込ませる
* PIN + OTP入力を求め、入力されたOTPを検証
 * ユーザーに紐づくOTP設定をDBなどから読み込み
 * OTPの値を検証

PIN + OTPの値は生で送っていいのか...とかは今回割愛する。
結局パスワードがPINになって一緒に送られるかどうかの話。

### 10個の(一見ランダムな)数字を保存しておいて一回ずつ利用

* 数字の払い出し
 * OTP設定作成(HOTP)、DBなどに保存
 * カウンタに用いる値を10個作成(連番でもランダムでも良い)、DBなどに保存
 * それぞれのOTPの値を払い出す
* OTPを受け取って検証
 * ユーザーに紐づくOTP設定をDBなどから読み込み
 * カウンタに用いる値(で有効なもの)をDBなどから読み込み
 * それぞれの値でOTPを生成し、それに含まれていたらそのカウンタの値を削除

## 必要な機能

Google Authenticattorへの設定用URLは仕様が公開されているのでそれにしたがって作成すれば良い。
[KeyUriFormat -  google-authenticator](https://code.google.com/p/google-authenticator/wiki/KeyUriFormat)

OTPの値の計算については、[Authen::OATH](https://metacpan.org/release/Authen-OATH) が使える。

あとはOTP設定の作成/保存と読み込みあたりを簡単にするしくみがあれば捗りそう。
データストア/既存のユーザーとの紐付けの部分はサービス独自なものであるので、後述するような"薄い"内部用HTTPサーバーのためのライブラリを検討した。

## 作ったもの

### Authen::OATH::KeyURI

[Authen::OATH::KeyURI](https://metacpan.org/pod/Authen::OATH::KeyURI)

Google AuthenticatorにHOTP/TOTPの設定を行うときに読み込ませるURIを生成するモジュール。  
生成したURIをリンク/QRコードなどで読み込ませることで設定が可能。

### Net::OATH::Server

[Net::OATH::Server](https://metacpan.org/pod/Net::OATH::Server)

(今のところは)InternalなOTP認証用HTTP Serverのための"薄い"PSGIアプリケーションを提供しているモジュール。

* このモジュールがやること
 * OTP設定のCRUD処理の"インターフェース"の提供
 * OTP設定のCRUD処理とOTPの検証(Login)処理のPSGIアプリケーションを提供
* 利用者がやること
 * インターフェースに従ってOTP設定のCRUD処理を"実装"
 * 提供されているPSGIアプリケーションを内部向けHTTP Serverとして動かす
 * Create機能で取得したOTP設定のidをユーザーに紐付け
 * Create機能で取得したOTP設定とAuthen::OATH::KeyURIからユーザー設定用URLを生成
 * OTP検証時にLogin機能を利用
 * 不要になったらDelete
 * 細かいパラメータを利用する場合はUpdate

![OTP設定処理](https://raw.githubusercontent.com/ritou/r-weblife/master/img/20141012_OTP/OTP_1.png "OTP設定処理")

![OTP認証処理](https://raw.githubusercontent.com/ritou/r-weblife/master/img/20141012_OTP/OTP_2.png "OTP認証処理")

これらを使うと、内部向けにHTTP Serverを立てて利用することでOTP認証を簡単に実装できそう。  
さすがにわざわざHTTP Serverたてるのもあれだなって言われそうなので、OTP設定のCRUD/Login部分をPSGIアプリケーションと切り離して、モジュールにして密結合な利用もできるようにする予定。

ちなみに、これをプロダクション環境で使う予定とかは今のところない。
mod_rewriteはなぜ.htaccessがないディレクトリも操作できるのか疑問

きっとこうなんだろうなを書いておく

1. mod_rewriteの初期設定は、まずアクセスされたディレクトリに一致する本当のフォルダとファイルがないかチェックする。

2. そしてなければ、ルートディレクトリにリダイレクトする。

という感じになっているんじゃないかと思う。

そして、.htaccessはアクセスされたディレクトリのみの設定ファイルである。

ただ他のディレクトリにある.htaccessの設定が適用されることがあるので、迷った。

.htaccessはやっぱり設定ファイルである。
上記の現象は、リダイレクトによる効果であると思う。

これが正しいかどうか検証してみて、追記します。

分かる人がいれば、教えてください。。
CentOS7 MySQL5.6 構築メモ

CentOS7にMySQL5.6をRPMを使ってインストールしたのでメモを残しておく

## MySQL RPM Install
```bash
# rpm -ivh http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
# yum install mysql-server
```

## MySQL Enable
```bash
# systemctl enable mysqld
```

## MySQL Server Start
```bash
# systemctl start mysqld
```

## MySQL Server Stop
```bash
# systemctl stop mysqld
```

## 文字コード確認
```mysql
> show variables like 'char%';
```
Yokohama.rb 2014年10月11日

#自己紹介

##serverspec

誰かが自己紹介で言及していた単語。
聞いたことなかったので軽く検索したら

* https://rubygems.org/gems/serverspec
* http://qiita.com/ando-masaki/items/b03342b465b7159ffe1f

のことみたい。
こういうちょっとしたことも勉強になる。

# レシピブック

## open と File.open

てっきり同じものだと思っていたんだけど、open と File.open は違うものなのであった。

```ruby
p open("|-") #=> #<IO:fd 8>
p File.open("|-") #=> Errno::ENOENT: No such file or directory @ rb_sysopen - |-
```

`open` は、厳密に書くと `Kernel.open` のことなんだけど、こちらはなんだかよくわからないものも open 出来てしまう。
一方、`File.open` だとファイルしか open 出来ないみたい。
ファイルを開く時は、これからは File.open と書くようにしたい。

# power_assert × rspec

rspec-power_assert ( see http://qiita.com/joker1007/items/88077d6b2affeb42aa1c )

power_assert が実現できたのは

* Ripper で、ちょっとつらい感じだけど AST が作れる。
* 2.0 で導入された TracePoint( see http://docs.ruby-lang.org/ja/2.1.0/class/TracePoint.html )で必要な情報を集められる

という二点。
AST が不完全である点が groovy より弱いところで、 power_assert の中は基本的に1行にするべきということになるらしい。

で。闇の力を使っている power_assert は、闇の力を使っている rspec と相性が悪いらしく、その調停をしたのが rspec-power_assert ということらしい。
rspec 以外にも闇の力を使っているgemとは相性が悪いらしい。

# ペアプロセッション

出題した。
問題は「めぐるセル(簡易版)」という名前で、詳細は以下。
http://nabetani.sakura.ne.jp/yokohamarb/2014.10.rotcell/


ペアプロだと（中央値で見ると）完成までの時間が長くなる（私見）ということで、時間的に厳しかった模様。

実装例は、今見つけている範囲では以下のとおり。

* https://github.com/ogawaso/rotcell
* https://gist.github.com/cowplace/a4eb0b149747633346a8
* https://gist.github.com/joker1007/0a0df2579896ed24732c
* https://github.com/cielavenir/procon/blob/25253705d86dfd73433738b74626a3ad8221e19f/hena/tyama_hena25_yokohamarb.rb
* https://gist.github.com/nabetani/98e52e7b5ee9dfba987a ( 私 )

神奈川ruby会議( http://regional.rubykaigi.org/kana01/ )でも出題しますよ。
いつものどう書く( http://yhpg.doorkeeper.jp/events/16017 )でも出題しますよ。
UbuntuでOpenCV3＆Python3の環境構築

# Ubuntuで環境構築
標準のパッケージではPython2用しかないので、自前で用意します。
cmakeのPython3.4の検出処理に問題があるようで、なかなかうまくいかなかったので、備忘録的にメモしておきます。

## 対象となる環境
* cmakeでpython3のライブラリのパスを取得できなくて、ターゲットのopencv_python3がunavailableになる
* （たぶんubuntu14.04ならpython3を検出できないと思う)

windows環境では比較的簡単にできたのに、Ubuntuでこんなに苦労するとは思いもしなかった。

## 下準備

### 必要なパッケージをインストール
参考にしたサイト[Installer Opencv 3 sur Ubuntu 14.04 Trusty](http://wiki.labomedia.org/index.php/Installer_Opencv_3_sur_Ubuntu_14.04_Trusty)　(英語じゃないけどそれなりに分かります)

```bash
sudo apt install libopencv-dev build-essential checkinstall cmake pkg-config yasm libtiff4-dev libjpeg-dev libjasper-dev \
libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev \
libv4l-dev python3-dev python3-numpy libtbb-dev libqt4-dev libgtk2.0-dev libfaac-dev libmp3lame-dev \
libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils python3.4-dev
```

### pyconfig.hをコピー
必要かどうか分からない
```bash
sudo cp /usr/include/python3.4m/pyconfig.h /usr/include/python3.4m/pyconfig.h_old
sudo cp /usr/include/i386-linux-gnu/python3.4m/pyconfig.h /usr/include/python3.4m/
```

### cmakeのファイルを編集
cmakeがpythonのバージョンで3.4があることを知らないので、教えてあげます。
[FindPython{Interp,Libs}: Search for Python 3.4. ](https://github.com/Kitware/CMake/commit/ab6201ab647c13fee44c44822b8502e9848faaaf)
編集対象は、
* Modules/FindPythonInterp.cmake
* Modules/FindPythonLibs.cmake
の二つです。

### ソースコードを取得
```bash
git clone https://github.com/Itseez/opencv.git
```

## cmake
cmake-guiでいろいろオプションを設定します
私の環境では、ファイルのハッシュが違うとかで、エラーになるので、WITH_IPP=OFFにする必要がありました。

### Pythonのライブラリを検出させる
+ pythonが見つからない状態(cmakeのログ)

```bash
Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.6", minimum required is "2.7") 
Could NOT find PythonLibs (missing:  PYTHON_INCLUDE_DIRS) (found suitable exact version "2.7.6")
Found PythonInterp: /usr/bin/python3.4 (found suitable version "3.4", minimum required is "3.4") 
Could NOT find PythonLibs (missing:  PYTHON_LIBRARIES) (Required is exact version "3.4.0")
```
+ Python、Python2、Python3のパスのエントリーを選択して、Remove Entoryをクリックで削除
+ 再度Configureを押す
+ pythonが見つかる状態(cmakeのログ)

```bash
Found PythonInterp: /usr/bin/python2.7 (found suitable version "2.7.6", minimum required is "2.7") 
Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython2.7.so (found suitable exact version "2.7.6") 
Found PythonInterp: /usr/bin/python3.4 (found suitable version "3.4", minimum required is "3.4") 
Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.4m.so (found suitable exact version "3.4.0")
```

+ そのままGenerateでMakefileを作成　(Configureを押すとPython、Python2、Python3のパスのエントリーが復活するので、この状態で再びConfigureを押してしまうと見つからない状態に逆戻りしてしまう)

## make
Makefileさえできてしまえば、後は問題ないはず

```bash
make -j4
sudo make install
```
Wine上でSSPを使い(first)さくらを起動する

Wine上でfirstさくらの全機能をSSP上で動かすやり方になります。

# 必要なもの

* Wine 1.6系以上 http://www.winehq.org/
* SSP 2.3.48以降 http://ssp.shillest.net/
* 伺か(materia) http://usada.sakura.vg/

以上3つとWineの動く非Windows環境を用意し、Wineをセットアップしてください。
Macな方はWineBottler (http://winebottler.kronenberg.org/) やら EasyWine ( http://matome.naver.jp/odai/2140238022377155001 ) やらというものがあるとのこと。

こちらではMac環境が無いので、**Wine+Ubuntuでの動作検証**になります。
機材があれば検証するのです（チラッチラッ

# 解凍

SSP・伺か(materia)共に自己解凍書庫になっているので、Wineを使い起動してください。
Zドライブ以下が元のOSのディレクトリツリーそのまんまのようなので、とりあえずhomeディレクトリにぶちまけてみました。
"ponapalt"の部分はあなたのユーザー名に変えてください。

伺か側を先に解凍し、SSPをその上からすべて上書きします。
上書きするかを質問されたら「すべて上書き」にします。

![Image1.png](https://qiita-image-store.s3.amazonaws.com/0/13745/49b5d352-9362-4250-e707-43530dd535cc.png)

### WineBottlerでは

**同じ場所に上書きでファイルを配置する**のがコツなので、materia → SSPの順でどこか同じ場所に解凍した上で、WineBottlerでインストール処理をしてください。

解凍した後の手順はこちら ( http://qiita.com/kinzal/items/2103f423c43d9ea5feb9 ) の中ほど「WineBotterでSSPをMacで起動できるようにする」と同じです。

### 他の環境でも

コツは上記の通りなので、ssp.exeとmateria.exeが一緒のフォルダに入っている状態で使えば、どんな環境でも同じです。

# 初期設定

**いまいちマウス操作がおかしい方へ**

そのまま動けばいいのですが、いまいちマウス操作の際の挙動がおかしいようなので、Wine設定 (Configure Wine) を開いて…

![w2.png](https://qiita-image-store.s3.amazonaws.com/0/13745/3ce4794a-8ab2-11a4-d3a0-91c3bdd18855.png)

ウインドウマネージャがなんたらかんたらいうのを2つともOFFにします。

![w3.png](https://qiita-image-store.s3.amazonaws.com/0/13745/670ae980-98c3-4e92-2124-080c492fb6cc.png)

# 起動方法

とりあえず解凍した場所を開きます。
先の通りhomeディレクトリにそのまま置いた場合は、たぶんすぐ見つかると思います。

![Image5.png](https://qiita-image-store.s3.amazonaws.com/0/13745/926402aa-97b2-ad8a-7a7c-00dd5fda0ba6.png)

**Ubuntu(Unity)限定**
ssp.exe上で右クリックしてプロパティを開き、「開き方」タブで規定のアプリケーションをWineに切り替えておいてください。
この操作は一度きりで良いです。

![Image4.png](https://qiita-image-store.s3.amazonaws.com/0/13745/f52355d6-91cd-578b-07ef-cde8238fa1b5.png)

SSP.exeをダブルクリックするとエミリが起動します。

![Image2x.png](https://qiita-image-store.s3.amazonaws.com/0/13745/ea77e101-c924-1908-fb8b-004b331cbced.png)

右クリックしてさくらを選ぶと、SSP 2.3.48以降なら何事もなく起動すると思います。

![Image3x.png](https://qiita-image-store.s3.amazonaws.com/0/13745/f7e58ead-1e2f-82ee-61e2-381be42fc262.png)

# ところで、なぜmateriaが動かないの？

現行Wine上では PdhVbAddCounter と PdhVbGetDoubleCounterValue がstubなため、materiaやfirst.dllがうまく動かないようです。

内部で一応pdh.dllをLoadLibraryして上の2つのAPIをGetProcAddressしてるみたいですけど、返り値をチェックしておらず問答無用でstubなやつを呼ぼうとして落ちます。

ダミーでも良いので上の2つを実装したらたぶん動くんじゃないかと思います。
Wineいじれる人に **丸投げ** するのでよろしくです。

# じゃあなぜSSPなら動くの？

いろいろ裏で怪しいことをやってます。
そのままだとDLLが足りないので、**なぜかmateria.exeのリソース内に入っている**DLLを取り出してきたり、上記を含むいろいろ不安定な部分のAPIを**インポートテーブルを直接書き換えてフック**してみたり…

プログラマの健康に害を及ぼす恐れがありますので、真似しないようにしましょう。
(組んでて吐きそうになりました)
TypeScript + Mocha + Testem + CircleCIでカスタムビルド設定



TypeScriptのプロジェクトで、テストをMocha + Chai + Sinon + Testemで書いています。
せっかくなのでCIに載せたいと思い、CircleCIを試してみました。
Testemでブラウザテストを実行できますが、CircleCIでは`test_ci`コマンドでXvfbでChromeとFirefoxのテストができます(PhantomJSも)。
CircleCIのデフォルトビルド設定ではテストが実行できないので、以下に各種設定とCicle.ymlによるカスタムビルド設定を共有します。

### ソースコード

今回の設定を反映したソースコードは[こちら](https://github.com/takei-shg/typescript-test)

- npmパッケージはローカルインストールで
- 各種コマンドはpackage.json内に設定し`npm run ${command}`で実行
- pre-mergeテストっぽく、masterにmergeしても大丈夫かをチェックするため、`git merge --no-commit origin/master
`をしてから`test_ci`を走らせる

と言った感じで書いております。

### 参照元

[本家の説明(Configuring CircleCI)](https://circleci.com/docs/configuration)

[本家の説明(Test Environment)](https://circleci.com/docs/environment)



### 基本事項

- x86_64 Ubuntu 12.04上で実行されます

### 設定可能項目

リポジトリホーム直下にcircle.ymlをセットすることで、ビルド内容をカスタマイズすることができます。

- machine
	- パッケージインストールや環境変数設定
- checkout
	- 対象リポジトリのカスタマイズ
- dependencies
	- プロジェクトspecificな環境構築
	- bundle installとか
- database
	- DB migration等
- test
	- テスト時の設定
- deployment
	- デプロイのカスタマイズ

各コマンドは異なるshellで実行されるため、環境変数は共有されません。
ゆえに、globalな環境変数を設定するときは、machine configurationの中でenvironmentで指定する必要があります。

### カスタムコマンドの実行タイミング指定

- pre : CircleCI defaultの前に実行
- override : CircleCI defaultの上書き
- post : CircleCI defaultの後に実行

### 設定してみた

#### machine
今回はTypeScriptコードに対するテストなので、machineの設定を以下にしました。

```circle.yml
machine:
  node:
    version: 0.11.13
```

Javaの場合はこんな感じ

```circle.yml
machine:
  java:
    version: openjdk8
```

#### checkout

リポジトリはそのままデフォルトです。
**新しいブランチをGithubにpushすると、自動的にそのブランチに対してテスト実行してくれます。**

#### dependencies

以下のコマンドを実行。TypeScriptのコンパイルとかしてます。CircleCIのデフォルトではnpm installだけ実行してくれますが、TypeScriptコンパイルが必要だったので`override`で追加。`post`でも良かったかも。

```circle.yml
dependencies:
  override:
    - npm install
    - npm run tsd_install
    - npm run bower_install
    - npm run build_staging

```

#### database

今回はなし。migration等行う場合はここで。

#### test

jsのテストを以下のように実行。

```circle.yml
test:
  override:
    - npm run test_ci
```

#### deploy

また今度。


### その他

- Githubでプルリク送ると、featureブランチの最新テスト結果を見てGithub側でgood to merge等のバッジを出してくれる。
- プルリクした時にマージ先のブランチへのpre-mergeテストをプルリクフックで実行してくれると嬉しいのだが(CircleCIの中の人によると、まだサポートはないとのこと)。
Draw Ellipse up on Sprite in Cocos2d-x 3.x

```cpp:SMDrawEllipse.h
class SMDrawEllipse : public Layer
{
public:
    static SMDrawEllipse* create();
    void init(float rx, float ry,float a, int segs, Color4F color);
private:
    void draw(Renderer *renderer, const Mat4& transform, uint32_t flags);
    void onDraw(const Mat4& transform, uint32_t flags);
    CustomCommand _customCommand;
private:
    float rx;
    float ry;
    float a;
    int   segs;
    Color4F color;
};
```

```cpp:SMDrawEllipse.cpp
#include "SMDrawEllipse.h"

SMDrawEllipse* SMDrawEllipse::create()
{
    return new SMDrawEllipse();
}

void SMDrawEllipse::init(float rx, float ry,float a, int segs, Color4F color)
{
    this->rx = rx;
    this->ry = ry;
    this->a = a;
    this->segs = segs;
    this->color = color;
}

void SMDrawEllipse::onDraw(const Mat4& transform, uint32_t flags)
{
    Director::getInstance()->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
    Director::getInstance()->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, transform);
    
    GLProgram *s_shader = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_U_COLOR);
    s_shader->retain();
    
    int s_colorLocation = s_shader->getUniformLocation("u_color");
    CHECK_GL_ERROR_DEBUG();
    
    
    const float coef = 2.0f * (float)M_PI / segs;
    
    int verticeCount = 2 * (segs + 1);
    
    float* vertices = new float[verticeCount];
    if(!vertices)
    {
        return;
    }
    memset(vertices, 0, sizeof(float) * verticeCount);
    
    float rads, distance, angle, j, k;
    for(int i = 0; i <= segs; ++i)
    {
        rads = i * coef;
        distance = sqrt(pow(sinf(rads) * rx, 2) + pow(cosf(rads) * ry, 2));
        angle = atan2(sinf(rads) * rx, cosf(rads) * ry);
        j = distance * cosf(angle + a);
        k = distance * sinf(angle + a);
        
        vertices[i*2] = j * CC_CONTENT_SCALE_FACTOR();
        vertices[i*2+1] = k * CC_CONTENT_SCALE_FACTOR();
    }
    
    s_shader->use();
    s_shader->setUniformsForBuiltins();
    s_shader->setUniformLocationWith4fv(s_colorLocation, (GLfloat*) &color.r, 1);
    
    GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION );
#ifdef EMSCRIPTEN
    setGLBufferData(vertices, 16);
    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, 0);
#else
    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices);
#endif // EMSCRIPTEN
    glDrawArrays(GL_LINE_LOOP, 0, (segs + 1));
    
    CC_SAFE_DELETE_ARRAY(vertices);
    
    CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, (segs + 1));
    
    Director::getInstance()->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}

void SMDrawEllipse::draw(Renderer *renderer, const Mat4& transform, uint32_t flags)
{
    _customCommand.init(_globalZOrder);
    _customCommand.func = CC_CALLBACK_0(SMDrawEllipse::onDraw, this, transform, flags);
    renderer->addCommand(&_customCommand);
}
```
Macでファイルの文字コードを調べる

Macでfileコマンドをつかってファイルの文字コードを調べました。

# fileコマンドで文字コードを調べる
fileコマンドに`--mime`オプションをつけます。

```bash:fileコマンドで文字コードを確認
file --mime hoge.php
hoge.php: text/x-php; charset=utf-8
```
hoge.phpの文字コードを、表示しています。

前はnkfコマンドというのを使っていたのですが、fileコマンドで見られるのですね。fileコマンドのほうが便利だと思いました(☝ ՞ਊ ՞)
質問　iOS8 Custom Keyboard

obj-c 初心者です。カスタムキーボードを作っています。キーボードの色を変えて　App groupsでデータを共有してキーボードの色を変えています。シュミレーターでは
キーボードの色が変るのですが、実機では色が変りません。シュミレーターの Open System Logでデータの共有は確認しています。実機ではログが確認出来ない為、どうして良いか分からず困っています。宜しくお願い致します。
[プロファイル]プログラムで時間が掛かっている場所を特定する(google-perftool)


# プロファイルが必要な時

作成したプログラムが思ったより性能がでてない！
ボトルネックがどこにあるのか分からないから調べたい！

そんな時にはプロファイリングツールを使いましょう。

# google-perftoolのインストール
http://goog-perftools.sourceforge.net/ の下の方のダウンロードページへのリンクからソースコードを落としてきます。
2014/10/11時点の最新版は gperftools-2.2.1.tar.gz。
解凍してからいつもの通りに ./configure,make,make install でインストール。

# graphvizのインストール
コマンドライン上だけでgoogle-perftoolを使う分には必要ありませんが、
google-perftoolはコールグラフという視覚的に分かりやすい図を作ってくれます。
この図はdot形式で生成されるので、このdot形式のファイルをepsなどの形式に変換するためのツール「graphviz」もインストールすると良いでしょう。

http://www.graphviz.org/ のDownloadページからソースコードを落としてきます。
また解凍して ./configure,make,make install ですが
ソースコードからインストールしようとすると、依存するライブラリが多いので./configureで文句を言われる可能性大です。
google-perftoolが生成するdotファイルをepsに変換するだけであれば、機能的に必要のないものがほとんどなので無視してmake, make installしましょう。

# 使い方
google-perftoolインストール先のlibディレクトリをLD_LIBRARY_PATHに追加。
./bash_profileなどに書いておく。

```bash
export LD_LIBRARY_PATH=/home/tanaka/lib:$LD_LIBRARY_PATH
```

プロファイルしたいプログラムのコンパイル時にlibprofiler.soをリンク。

```bash
$ g++ -o hoge.exe hoge.cpp -g -lprofiler
```

出力先の解析ファイル名を指定して、プログラムを実行。

```bash
$ export CPUPROFILE=prof.out; ./hoge.exe 
PROFILE: interrupts/evictions/bytes = xxx/x/xxxx
```

これでprof.outが生成されるので、元プログラムと解析ファイルを指定して結果を表示する。
実行時間が掛かっている関数のトップを見てみる。

```
$ pprof hoge.exe prof.out
Using local file prof.out.
Welcome to pprof!  For help, type 'help'.
(pprof) top
Total: 355 samples
     286  80.6%  80.6%      286  80.6% __write_nocancel
      16   4.5%  85.1%       16   4.5% __read_nocancel
      14   3.9%  89.0%       17   4.8% __lseek_nocancel
・
・
・
```

左から二列目がその関数が占めている実行時間の割合。
__write_nocancelはwrite(2)から最終的に呼ばれる関数なので、このプログラムはwrite(2)がボトルネックになっていることが分かる。

# コールグラフの作成

オブジェクトの大きさで実行時間の割合を表して、関数の呼び出し順にフロー図のような形式で視覚的に表示してくれるコールグラフは以下のようにして作成する。

```bash
$ pprof --dot hoge.exe prof.out > prof.dot
$ dot -T eps prof.dot > prof.eps
```

# その他のプロファイリングツール
よく使われるものに以下のものがある。

* perf　( Distributionによるが、Linuxカーネル2.6.31以降に標準搭載 )
* gperf ( gccでコンパイルしたプログラムしかプロファイルできない )
* oprofile

yumやapt-getが使える（その権限がある）環境であれば、perfやoprofileなどをインストールして使うのが簡単かもしれない。
（というのも、perfをソースコードから自分のホームディレクトリにインストールしようとしたらconfigureかmakeでめちゃくちゃこけて断念した。。）

google-perftoolはLinux kernel2.6.31以降であれば、ソースからのインストールで特につまづくことが少ないという点で使いやすいような気がする。
Gsonでenumをいい感じに処理する

javaのenum型をgsonでシリアライズ/デシリアライズする方法の紹介です

#### TL;DR

* ordinalの値は要素の追加や宣言の順番で変化してしまうので注意
* インスタンス変数として保持させたidを利用してデシリアライズを行う
* Gsonにenum用のJsonDeserializerをかませてインスタンスを作る

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

まずenumを作成します。
Enum#ordinalで序数がとれるので、この値を使って(デ)シリアライズするのがスマートな感じがしますが、
この値は要素の宣言順序などによって値が変化してしまう(らしい)ので利用するのは危険です。
そこでインスタンスフィールドを用意して各要素にユニークなidを振ります。
今回必要なメソッドは自分のidを返すメソッド(#getId)とidから要素を取得するスタティックなメソッドです(#fromId)

```java

public enum Platform {

    Twitter(0), TwitterDM(1);

    int id;

    Platform(int id) {
        this.id = id;
    }

    public int getId() {
        return this.id;
    }

    public static Platform fromId(int id) {
        for (Platform type : Platform.values()) {
            if (type.getId() == id) {
                return type;
            }
        }
        return null;
    }

}
```

次にDeserializerを作ります。
Deserializerは値をintで受け取ってEnumに変換するだけです。

```java

public class PlatformDeserializer implements JsonDeserializer<Platform> {

    @Override
    public Platform deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        int id = json.getAsInt();
        return Platform.fromId(id);
    }
}

```

あとはGsonBuilderで先ほどのDeserializerを登録してgsonのインスタンスを作ればenumを変換することが出来るようになります。 便利!!

```java
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Platform.class, new PlatformDeserializer());
gson = gsonBuilder.create();
```
json を pretty print するのに echo '{"apple": "red", "lemon": "yellow"}' | python -m json.tool は冗長じゃないですか？なので go でコマンド用意しました

# 概要
json をインデントしてきれいに表示する方法をググったら

```
echo '{"apple": "red", "lemon": "yellow"}' | python -m json.tool 
```
というのを見つけました．普段から python つかってるならあれだけど，引数書くのめんどいしちょっと大げさじゃないですかね．1コマンドで済ませたいところ．ちっちゃいコマンド作るのは go の得意分野なので用意してみました．って，書いてみてから別のツールがありそうな気がしてきたけど，go はクロスコンパイルできるので win, mac, linux といろいろ使えるからいいことにしました．

# コード
https://github.com/ikawaha/pretty/

これだけ．

```go:pretty.go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"os"
)

func main() {
	var j bytes.Buffer
	io.Copy(&j, os.Stdin)
	var dst bytes.Buffer
	if e := json.Indent(&dst, j.Bytes(), "", "    "); e != nil {
		fmt.Fprintln(os.Stderr, "pretty: %v", e)
	}
	fmt.Println(dst.String())
}
```

# インストール

```
go get github.com/ikawaha/pretty
```

# 使い方

標準入力から受けて標準出力に吐くだけ．

```
 $ echo '{"apple": "red", "lemon": "yellow"}' | pretty
{
    "apple": "red",
    "lemon": "yellow"
}
```
redisのUnixDomainSocket通信でのパーミッション設定


マニュアルのどこかに書いてあるのかもしれませんが、備忘録です。

```/etc/redis.conf
unixsocket /var/run/redis/redis.sock #socketファイルのパス
unixsocketperm 700 #socketファイルのパーミッション
```

ソースコードにはきちんとpermissionと書かれていたのに、設定ファイルだと中途半端に省略してあって分かりにくい。。

## 背景
gitlabのv7.3からproduction運用ではredisとアプリ間はソケットを用いて通信することを推奨されています。  
rootでgitlabとredisをインストールする場合は問題ありませんが、
一般ユーザーでgitlabを、rootでredisをインストールする場合にはパーミッションの注意が必要です。
windowsが再起動不可能に・・・

凄い久しぶりの投稿.先日起こった悲劇に関してです．予めですが，自分の対処法は間違っていたと思うので，反面教師程度に．

先日のこと，自分の使っているASUSのノートPCで，HD容量が大分圧迫されていると警告が出たので，ディスククリーンアップを実行．この際，windows updateにもチェックを入れたのだが，処理が一行に終了しないため，キャンセルして再起動．すると・・・

**windowsを修復できないとの文字が・・・トラブルシューティング画面が出てきてしまい，色々策を講じるも起動できない状態に・・・**

こんなこと初めてだったので，パニック状態．とりあえずデータをサルベージしなければと思い，ググってみてそれらしい方法が見つかった．どうやら，windows8のインストールディスクから起動し，外付けのHDにデータをコピーすればよさそうと分かった(実はここで既に勘違いをしていたのだが)．しかし，このPCには内蔵のDVDドライブがないので，USBの物をつなぎ，そこから起動することに．

**再度問題発生．Biosの設定変える必要があり，Bootの優先順位でUSBのDVDドライブを一番にしなければらないが，その方法が分からない．**

まぁここら辺は常識っちゃ常識だけど，PCごとにBIOS違ったりするから手順も違うことを知らなかったので．ここで結構悩んだ後，いい動画が見つかったため解決．
https://www.youtube.com/watch?v=X3GFZm9at6g

これでやっとインストールディスクから立ち上げられる・・・！ここまでで数時間かかったので，なんかやり遂げた感．そして次のコピーの段階へ．**どうやらプリインストールのWindows(WindowsPE)でコマンドプロンプトを立ち上げ，そこでxcopyのコマンドで丸ごとドライブの中身をコピーすれば良さそうと分かった．**

ここでプロンプトを立ち上げて気づく．**これってわざわざインストールディスクから起動しなくてもできたのでは・・・**実はこのPCは最初からでwin8が入っていたためか，初めからコマンドプロンプトは立ち上げられたのだった・・・ここら辺に気づかないのは本当に情けない・・・恐らく，最初から入っていない場合は必要な場合もあるのかな・・・

本当に時間の無駄でした．まぁちょっとここら辺の知識ついたかな・・・まぁその後無事データを回収して，なんとか事なきを得たものの，PCはほとんど初期化してしまったため，OfficeやらEclipseやらは入れ直しになり，今現在も修復中でございます．

ちなみになぜ起動しなくなったかの原因は不明だけど，どうやらディスククリーンアップでwindowsアップデートはチェックをつけない方がいいらしい．今度からは気を付けよ・・・
Elixir exits

# Elixir exits

## 概要
Elixir の exits について。

明示的にプロセスの終了を行う場合に exit シグナルを利用する。

## exits の例
### サンプル仕様

乱数 1-100 を生成します。
基本は FizzBuzz のルールで返却値を決定しますが、
11の倍数なら exit します。
50回繰り返して処理結果を確認します。

```ex
defmodule ExceptionSample do
  def random_exec do
    x = :random.uniform(100)
    strx = Integer.to_string(x)
    cond do
      rem(x, 11) == 0 -> exit "11 % 0 == 0"
      rem(x, 15) == 0 -> "FizzBuzz" <> strx
      rem(x, 5) == 0 -> "Buzz" <> strx
      rem(x, 3) == 0 -> "Fizz" <> strx
      true -> x
    end
  end

  def try_rescue do
    try do
      x = ExceptionSample.random_exec
    catch
      :exit ->
        IO.puts "catch exit"
    end
  end

  def try_rescue_times(0) do
    # do nothing
  end

  def try_rescue_times(n) do
    IO.inspect ExceptionSample.try_rescue
    try_rescue_times(n - 1)
  end
end

ExceptionSample.try_rescue_times(50)
```

* 出力

~~~
"FizzBuzz45"
73
"Buzz95"
"Fizz51"
32
"FizzBuzz60"
92
67
"Fizz48"
"FizzBuzz60"
"FizzBuzz15"
"Fizz21"
"Buzz70"
16
56
** (exit) "11 % 0 == 0"
    exits.exs:6: ExceptionSample.random_exec/0
    exits.exs:16: ExceptionSample.try_rescue/0
    exits.exs:28: ExceptionSample.try_rescue_times/1
    (elixir) src/elixir_lexical.erl:17: :elixir_lexical.run/3
    (elixir) lib/code.ex:316: Code.require_file/2
~~~

## 参照
* http://elixir-lang.org/docs/stable/elixir/Kernel.html#exit/1
* http://elixir-lang.org/getting_started/17.html#17.3-exits
PHPで、サイトをHTMLソースとして丸ごと保存する方法


ここでは、
・バーチャルドメイン: blog.example.com
・Basic認証をかけている
・PC/スマホページを同じURLで表示するサイトにおいて、スマホのページのHTMLを取得する
という前提条件で記述しています。


```
// Virtual HOST名
$virtual_host_name = "blog.example.com";

// User Agent （スマホのデバイスとして変更・・・スマホのUser Agentであれば、何でも良いです。）
$user_agent = "Mozilla/5.0 (Linux; Android 4.4.2; SOL23 Build/14.3.C.0.239) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36";

$options = array(
	'http' => array(
		"method" => "GET",
		"header" => "Host: {$virtual_host_name}\r\n" .
					　"User-Agent: {$user_agent}",
	),
);
$context = stream_context_create($options);

// HOST名
$host = "127.0.0.1";

// Basic認証を使用している場合、IDとパスワード+@マーク
$basic_auth = "yamada:xxxxx@";

// HTML取得
$target_url = "http://{$basic_auth}{$host}";
$site_html = file_get_contents( $target_url, false, $context);
```
Jenkins Stash通知プラグインのバグ

JenkinsからAtlassianのStashに結果を通知する[StashNotifier Plugin](https://wiki.jenkins-ci.org/display/JENKINS/StashNotifier+Plugin)というプラグインがあります。
このプラグインでは、Stashのcommitに[ビルドステータスのバッジ](https://developer.atlassian.com/stash/docs/3.0.1/how-tos/updating-build-status-for-commits.html)を表示することができます。

このプラグインにはStashとSSL通信する際、証明書エラーを無視するオプションがあるものの、
[現在バグで動作しません](https://github.com/jenkinsci/stashnotifier-plugin/issues/13)。

[最新のソースコード](https://github.com/jenkinsci/stashnotifier-plugin)では修正済みのようですが、
修正済みバージョンのプラグインはまだサイトからダウンロード出来ないようです。
自分でビルドするか、他の方法で回避するか、
最新版のプラグインがアップロードされるまで待ちましょう。
structとnilの比較

```go
type Point struct {
	x, y int
}

func main() {
	point := Point{x: 20, y: 50}
	if point == nil {
		fmt.Println("point is nil")
	}
}
```

こんな感じに`point == nil`のように比較するとコンパイルエラーなります。
`cannot convert nil to type Point`  

要は値とnilを比較するのがダメなので、
`&point == nil`のように参照と比較するとすれば良いです。

2014/10/15 追記
コメント頂きましたが、サンプルコードでは `zero value` で初期化されているので決してtrueになりませんが参照と比較しないとダメということで。
goのnil判定は思ったよりも複雑なようなので、タイトル「nilの判定方法」から変更しました。
Cloudwatchのalarmをcliから登録する手順

$AWS_CLOUDWATCH_HOME/credentialsを作成し、以下の内容を追加


```
AWSAccessKeyId=YOUR_ACCESS_KEY_ID
AWSSecretKey=YOUR_SECRET_KEY
```


```
export AWS_CREDENTIAL_FILE=$AWS_CLOUDWATCH_HOME/credentials
```


以下のシェルスクリプトを作成し実行
※cpu使用率が80%の状態が5分以上続く状態が2回継続したらalarm-actionsを実行

```
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id/`

mon-put-metric-alarm ec2-cpu_#{INSTANCE_ID} --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 2 --metric-name CPUUtilization --namespace AWS/EC2 --period 300 --statistic Average --threshold 80 --alarm-actions YOUR_ARN --region ap-northeast-1 --dimensions instanceid=#{INSTANCE_ID}
```
Groonga Cライブラリ テーブルのレコード参照

前回の投稿で、テーブルの作成やオープン操作を解説しました。
今回は、一歩進んでテーブルに登録されているレコードのアクセス方法を紹介します。
レコードを一意に表す値がレコードIDで、これを取得できれば、
カラムに格納されている特定のデータを参照することが出来ます。


## 主キー値によるレコードID取得
grn_table_get() 関数を使います。

```c:how_to_use_grn_table_get.c
 assert(grn_table_get(ctx, table, "test_record", strlen("test_record")) == record_id);
```

ちなみに、キー値がテキスト型以外の場合は char ポインタ型にキャストしましょう。

逆に、レコードIDから主キー値を取得したいときは grn_table_get_key() 関数を使います。

```c:how_to_use_grn_table_get.c
  char keybuf[16];
  int keylen = grn_table_get_key(ctx, table, record_id, keybuf, 16);
  assert(keylen == strlen("test_record"));
  assert(strncmp("test_record", keybuf, keylen) == 0);
```

grn_table_get_key() 関数ですが、
指定された ID のレコードが見つからない場合は 0 を返します。
レコードが見つかった場合は、パラメータに指定されたバッファに主キー値をコピーして、
主キー値の長さを返却値として返します。（コピーした長さではありません。）
文字列の末尾に NULL を追加するような処理は行いませんので、
返却される文字列長を使って適宜処理してください。

こちらも同様に、キー値がテキスト型以外の場合は char ポインタ型にキャストして受け取りましょう。

## テーブルカーソルによる巡回参照
特定のキー値やレコードIDを取得せずに、テーブルに含まれるレコードをなめたい場合には、
テーブルカーソルを使うことで実現可能です。
テーブルカーソルは、特定条件のレコードを特定の順番で参照できる機能です。

ちなみに、テーブルに存在するレコードは ID がすべて連番で揃っているという訳ではないので、
grn_table_size() で存在するレコードの総数を取得して、
レコードIDを 1 から順番になめるというアプローチは、
正しい結果が保障されませんのでご注意下さい。

####テーブルカーソルのオープン

```c:how_to_use_grn_table_get.c
  grn_table_cursor *table_cursor = grn_table_cursor_open(ctx, table, NULL, 0, NULL, 0, 0, -1,
                                                         GRN_CURSOR_BY_ID | GRN_CURSOR_ASCENDING);
```

カーソルのオープンには grn_table_cursor_open() 関数を使います。
grn_table_cursor_open() 関数にはパラメータが複数ありますが、
今回の投稿では単純な巡回で必要になるものに絞って説明します。

```c:groonga.h
GRN_API grn_table_cursor *grn_table_cursor_open(grn_ctx *ctx, grn_obj *table,
const void *min, unsigned int min_size,
const void *max, unsigned int max_size,
int offset, int limit, int flags);
```

min, min_size, max, max_size パラメータは、単純に巡回するだけであれば不要なので NULL や 0 を指定します。
offset パラメータに、カーソルの開始位置を指定します。
limit パラメータに、レコードの最大取得数を指定します。取得数の制限が不要であれば -1 を指定します。
flags パラメータに、GRN_CURSOR_* をフラグ指定して取り出すレコードを制限します。特に指定がなければ 0 でも構いません。フラグによってはサポートされるテーブルが限定されます。

- GRN_CURSOR_BY_ID: レコードIDでソートして取り出す
- GRN_CURSOR_BY_KEY: 主キー値でソートして取り出す（パトリシアトライ、ダブル配列トライでサポート）
- GRN_CURSOR_ASCENDING: 昇順で取り出す
- GRN_CURSOR_DESCENDING: 降順で取り出す

http://groonga.org/docs/reference/api/grn_table_cursor.html#c.grn_table_cursor_open

####テーブルカーソルを進める

```c:how_to_use_grn_table_get.c
  assert(grn_table_cursor_next(ctx, table_cursor) == record_id);
  // レコードの巡回が完了した
  assert(grn_table_cursor_next(ctx, table_cursor) == GRN_ID_NIL);
```

grn_table_cursor_next() 関数を使ってカーソルを次の位置に進めます。
そして、同時に次の位置のレコードIDを取得します。
ただし、巡回が完了している場合には GRN_ID_NIL が返されます。

注意点として、カーソルをオープン直後は現在位置は何も指しておりません。
現在位置を一つ目のレコードに進めるには、
grn_table_cursor_next() 関数を一度呼び出す必要があります。
grn_table_cursor_get_key() などの現在位置を参照する関数使う場合には、
気を付けましょう。

####テーブルカーソルのクローズ

```c:how_to_use_grn_table_get.c
  assert(grn_table_cursor_close(ctx, table_cursor) == GRN_SUCCESS);
```

grn_table_cursor_close() 関数を使います。
必ずしも巡回が完了している必要はありません。

## 後書き

以上です。
紹介した機能を利用したプログラムのソースコードを Gist にて公開しております。
投稿内で掲載しているサンプルコードは、このプログラムから切り出したものです。

[how_to_use_grn_table_get.c](https://gist.github.com/msh5/2dc2914fbc901b309511f7c9b95e3a46)

掲載している情報に関しましては、十分な検証を行っておりますが、
もし誤りがございましたら、コメントにてご指摘ください。
Sinatra で Rails Assets を使う


[Bower](http://bower.io) のパッケージを gem で透過的に管理できることで便利だという噂があるような気がする [Rails Assets](https://rails-assets.org) ですが、これを Sinatra の Web アプリケーションで使うという話です。

背景
-------

アセットパイプラインを使って Sinatra で Rails Assets を使うやり方は、これまでにもいくつかありました。

例えば、以下の記事で言及されています。

[Using Sinatra with Asset Pipeline and RailsAssets](http://howwedoapps.com/2014/06/22/using-sinatra-with-asset-pipeline-and-railsassets)

[Sinatraからrails-assets.orgを使う](http://aligach.net/diary/20140721.html)

それが先日、以下の issues を受けて、Rails 以外のアプリケーションでも、Sprockets を使って Rails Assets を使いやすくする修正が入っていました。

[Non-Rails Sprockets support](https://github.com/rails-assets/rails-assets/issues/128)

試してみると確かに便利に使えそうな感じだったので書いておきます。

使う
-------

Rails Assets のリポジトリになんかテスト用っぽい Sinatra アプリが入っていたのでそれを真似したやつです。
試しに jQuery と Bootstrap を使っています。

コードをそのまま載せた方が早いでしょう。

```text
.
├── Gemfile
├── app.rb
├── assets
│   ├── javascripts
│   │   └── all.js
│   └── stylesheets
│       └── all.css
├── config.ru
└── views
    └── index.erb
```

- Gemfile

```ruby
source 'https://rubygems.org'
source 'https://rails-assets.org'

gem 'sinatra'
gem 'sass'

gem 'sprockets'
gem 'sprockets-helpers'

gem 'rails-assets-jquery'
gem 'rails-assets-bootstrap'
gem 'rails-assets-bootstrap-css'
```

- app.rb

```ruby
Bundler.require

class App < Sinatra::Base
  set :assets, Sprockets::Environment.new(root)

  configure do
    RailsAssets.load_paths.each do |path|
      assets.append_path(path)
    end

    assets.append_path File.join(root, 'assets', 'stylesheets')
    assets.append_path File.join(root, 'assets', 'javascripts')

    Sprockets::Helpers.configure do |config|
      config.environment = assets
      config.prefix      = '/assets'
      config.digest      = true
    end
  end

  helpers do
    include Sprockets::Helpers
  end

  get '/' do
    erb :index
  end
end
```

- config.ru

```ruby
require 'sprockets'
require './app'

map '/assets' do
  run App.assets
end

run App
```

- views/index.erb

```html
<!doctype html>
<html>
<head>
  <title>Rails Assets Sinatra Integration</title>
  <meta charset="utf-8" />
  <link href="<%= stylesheet_path 'all' %>" rel="stylesheet" />
</head>
<body>
  <div class="container">
  <h1>Rails Assets Sinatra Integration</h1>
  <div class="row">
    <div class="col-xs-6 col-md-4" id="col-left">
      <button type="button" class="btn btn-primary">Yay!</button>
    </div>
    <div class="col-xs-12 col-md-8" id="col-right">
    </div>
  </div>
  </div>
  <script src="<%= javascript_path 'all' %>"></script>
</body>
</html>
```

- assets/javascripts/all.js

```javascript
//= require jquery
//= require bootstrap

$("#col-right").html("Rails Assets works like a charm in Sinatra!");
```


- assets/stylesheets/all.css

```css
/*
  *= require bootstrap-css
*/

#col-left {
  background-color: lightgray;
}

#col-right {
  background-color: cyan;
}
```

結果
--------

ちゃんといい感じになってる。

![スクリーンショット 2014-10-11 20.38.05.png](https://qiita-image-store.s3.amazonaws.com/0/29846/7608879e-5b81-c78a-d47a-5927ec5bf5e0.png "スクリーンショット 2014-10-11 20.38.05.png")
Goでデーモンを実装する

Goでは現在デーモンの実装は公式にサポートされていない。詳細は[issue 227](https://code.google.com/p/go/issues/detail?id=227)をご覧頂きたい。
そのため、現状はGoでforegroundで動くプログラムを作り、デーモン化はsupervisordなど外部のプログラムに任せるべきである。実際私もWebアプリケーションのデプロイはそうしている。

しかし、それでもGoだけでデーモンを立ち上げるプログラムを書きたいことがある。
その際に使える選択肢を紹介したい。（例をシンプルにするためいろいろ省略している。Macでは動いた。）

## 1. syscallでforkを行う
```go
_, ret, _ := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
if ret != 1 {
	// Exit parent
	os.Exit(0)
}

for {
	// do something in child process
}
```

syscallパッケージで普通にforkして親プロセスをexitする方法。
しかし、[issue 227](https://code.google.com/p/go/issues/detail?id=227)で言われてる通り、これは複数スレッドと相性が悪く、goroutineを使う多くのGoのプログラムのデーモン化には向かない。

## 2. 自身をexecする
```go
if len(os.Args) == 1 {
	// exec itself
	cmd := exec.Command(os.Args[0], "--child")
	cmd.Start()
} else {
	for {
		// do something in child
	}
}
```

自身のパスを`os.Args[0]`により取得し、`exec.Cmd.Start()`や`os.StartProcess()`により外部プログラムとしてexecする方法。
[build-web-application-with-golang](https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/ebook/12.3.md)では外部のプログラムに頼らない場合はこの方法が推奨されている。

### このやり方に使えるライブラリ
この方式でデーモンを実装するためのライブラリを紹介する。用途に合わせて好きなものを選べば良いと思う。

- [VividCortex/godaemon](https://github.com/VividCortex/godaemon)
 - APIがシンプル。デーモンで開きっぱなしにするファイルが指定できる。
- [sevlyar/go-daemon](https://github.com/sevlyar/go-daemon) 
 - シグナルハンドラを定義する機構がある。pidやログを書き出す先、working directory等の指定ができる。

## 3. serviceとして登録する
[takama/daemon](https://github.com/takama/daemon)を使って、init.dやlaunchctlにより自身をserviceとして登録し、OSの機能でstartする。
これは外部のプログラムに頼っているといえるが、Goだけで実装できるという点では変わらない。
ちゃんとserviceとして実装したい場合はこの方法を使うのが良い。

## まとめ

現在Go標準ライブラリではデーモンの実装はサポートされていないが、`os.StartProcess()`などで自身を実行することによりデーモンを実装することができる。
Scala IDE for Eclipse Luna (on Mac)

## 経緯

[怖くないScala勉強会](http://www.zusaar.com/event/12567004)に参加するにあたり、個人的にハマったので、Eclipse LunaでScalaを準備する方法を整理しておく。

## scala sbt, Typesafe Activatorの準備

[scala-sbt](http://www.scala-sbt.org/0.13.0/)と[Typesafe Activator](https://typesafe.com/activator)をインストールする。

```shell-sesseion
$ brew install sbt
$ brew install typesafe-activator
```

sbtを一度起動して、関連ファイルをダウンロードしておく。

```
$ sbt
```

後でScalaプロジェクトをEclipseプロジェクトに変換するために、Typesafe ActivatorにEclipseプラグインの設定を通しておく。

勉強会の事前資料や他のページの検索結果には、Scalaプロジェクトごとに設定する様な方法が書いてあるんだけど、私の環境ではどうしてもうまくいかなかった。[同様の事例](http://stackoverflow.com/questions/12983900/installing-sbteclipse)を参考に、 ~/.sbt/plugins/plugins.sbt に設定を記載する。空行は省略しない。

```shell-sesseion
$ vi ~/.sbt/plugins/plugins.sbt
```

```:~/.sbt/plugins/plugins.sbt
resolvers += Classpaths.typesafeResolver

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.5.0")
```

## Scala IDE for Eclipseの準備

EclipseにScala IDEをインストールする。

**2014年10月10日現在、Marketplaceからインストールすると、4.3（Kelper）まで対応のScala IDEがインストールされてしまい、4.4（Luna）では動作しない。**

Scala IDEの[Milestone](http://scala-ide.org/download/milestone.html)の情報を元に、EclipseのHelp→Install New Software から

	http://download.scala-ide.org/sdk/lithium/e44/scala211/dev/site

を Available Software Sitesに追加してインストールする。



## Scalaプロジェクトの作成とEclipseへのインポート

```shell-sesseion
$ activator ui
```

ブラウザでactivatorのホーム画面が表示されるので、メニューから'Hello Scala!'を選択する。

プロジェクトの作成パスを聞かれるので、好きなパスを入力(Ex: /path/to/hello-scala)して、'Create'ボタンを作成。

プロジェクトパスに移動して、hello-scalaをEclipse用のプロジェクトに変換する。

```shell-sesseion
$ cd /path/to/hello-scala
$ sbt eclipse
```

変換処理が終わり次第、EclipseのFile→Importでインポートして、Scalaプロジェクトとして読み込めることを確認して完了。

## 実行

Eclipse で Run → Run As → Scala Application を実行する。

もしくは、プロジェクトパスに移動して、activatorのコンソールで実行する。

```shell-sesseion
$ cd /path/to/hello-scala
$ activator console
scala> Hello.main(null)
```

	Hello, world!


## 参考

> https://github.com/mike-neck/scala-study
> http://lewuathe.com/blog/2013/09/13/sbttoeclipsedescalakai-fa-huan-jing/
> http://thachinohe.hatenablog.com/entry/scala_abc/004
OSXのAXIsProcessTrustedを使うスクリプトを何とかする

# はじめに

AXIsProcessTrustedを使ったスクリプトはターミナルで実行すると、
「システム環境設定」→「セキュリティとプライバシー」→「アクセシビリティ」で
ターミナルを許可しないと使えない。

ちなみに、ここ表示されるのは、そのアプリで、AXIsProcessTrustedを呼んで始めてリストアップされる模様

# スクリプトを個別に許可するには

Cocoaアプリとすればいい。
XCodeでフツーにフレームワークなどでリンクして、スクリプトエンジンを呼び出せるようなスクリプト言語であれば、この方法でOK

## Xcodeで扱えない言語

MacRubyはメモリ管理がGCを採用している為、現行のXCode6ではGCサポート終了しました！と冷たくあしらわれてしまう。

ケースでは、シェルスクリプトをCocoaアプリ化する方法が有効だった。
が、ミニマムな構成では、うまく行かず、一旦XCodeで空のアプリを作成して、このアプリの中身を差し替えることでうまく行った。

# まとめ

アクセシビリティでのアプリの判別なんとなくアプリ名でやってる感じがするが、
詳細が気になる。

# 関連記事

- [MacRubyのスクリプトをCocoaアプリ化出来た](http://abrakatabura.hatenablog.com/entry/2014/10/11/173122)
ARMのMCU/RTOS向け分析統合環境のアップグレード

ARMのMCU/RTOS向け分析統合環境のアップグレード
ピーター・クラーク
2013/12/3

ARMは、DS-5ストリームライン分析ツールをエンハンスしました。
これは、RTOSやCOretex-Mシリーズで動作するコードに適用できます。

ストリームラインは、ARM DS-5統合開発環境(以降、IDE)への入門として導入されました。
この機能は、SOCに搭載するLinux/Android OS上で動作するコードの解析をサポートします。
モバイルアプリケーション向けの、Coretex-AベースのマルチコアSOCなどで
利用される傾向があります。

「ストリームラインによってソフトウエア開発者は、CPUコアの使用率、分岐率、キャッシュ性能
等を見ることができます。さらに、Linuxカーネル、Mali GPU、フレームバッファの内部を調べる
ことができます」とARMシステムデザイン部門のギルハーム・マーシャルは語りました。

「その機能は、ボトルネックがソフトウエア、GPUいずれによるものなのか、
　リソースを上手に使うことによって再度最適化をどう行うかについて、ぱっとわかる
　ビジュアル表現を提供します。」

ARMは、現在、マイコン開発にもその機能を拡げつつあります。
「MCUはマルチコア化が始まったばかりです。開発者は理解を助けるためのよりよいツールを
求めています。我々はストリームラインをCortex-Mクラス、特にCortex-M3 やCortex-M4ベース
のデバイスにも持ち込んでいるところです。 」とマーシャルは語りました。

ここ数ヶ月は、リアルタイムOSに対する要望を整理することに費やしているとマーシャルは
いいます。それらは、API(アプリケーションプログラミングインタフェース)を通して
具体化されます。
「ストリームラインサポートはKeli RTXに対して用意されています。そして、オープンなAPIが、
他のRTOSでの利用できるように作成されました。ただし、FreeRTOS, エクスプレスロジック社の
ThreadX, ミクリウム社のuCOSについてはビルトインサポートを提供しています。」
とマーシャルは語りました。

ストリームラインは、ターゲットハードウエアへの接続が必要です。しかし、必ずしも
ETMトレースコアに依存しているわけではありません。
オプションとしてそれらを用いることで非浸食の解析を提供することができますが、
貴重なダイ領域を使用し、コスト面、消費電力面に敏感なMCUアプリケーションには
許容しがたいことになると、マーシャルは言います。

代わりに、RTOS/MCUアプリケーション向けに低浸食のITMインストルメンテーションコアを
利用することができます。これはCPUコアの中に置かれますが、APIの使用によって、ペリフェラル
の使用状態をキャプチャすることができます。

低消費電力設計の１つの大きな側面に、複数のスリープモードによって段階的に動作速度を
落とし、再び回復させる機能があります。正しく行われれば、この機能は低消費電力設計に
大きく貢献します。しかし、ストリームラインアナライザはCPUコアに接続し続ける必要が
ありますが、CPIの制御を失ってしまう可能性があります。
「スリープは我々が未だに取り組んでいるものの一つです」とマーシャルは言っています。

DS-5 は、コンパイラ、デバッガ、Linux版ストリームラインをフリーで利用できる
コミュニティエディションを用意しています。MCU/RTOS版の利用には、１ノードあたり
$6000掛かりますが、DS-5のプロフェッショナル版にアップグレードが必要です。
また、使用にあたっては選択したハードウエアがプローブボード上で利用可能かどうか、
開発中のカスタムICをサポート可能かどうかをARMのシステムデザイン部門に問い合わせるべきでしょう。

「モノのインターネット」がMCUの利用を加速するに連れて、
ソフトウエアの正確性と性能は、システムの鍵になりつつあります。
ARMはKeli開発ツールを通して、様々なMCUを直接サポートしますが、今日ではMPU(Cortex-A)、
グラフィクスエンジン(Mali), MCU(Cortex-M)などで構成される多数のデザインは、
互いに協調して設計されるようになっているとマーシャルは言います。

彼によると、ユーザはCortex-Mシリーズのさらに下位バージョンへもそのうち対応することを
期待してもらってもよいそうだ。

--
http://electronics360.globalspec.com/article/3815/arm-upgrades-ide-analysis-for-mcus-rtos
Yosys(1)

## Yosysについて ##

YosysはVerilog RTL向け合成フレームワークです。
今のところ、Verilog2005をサポートしており、さまざまなアプリケーション向けの
基本的な合成アルゴリズムを備えています。

Yosysは、スクリプトを使った既存の処理（アルゴリズム）とyosys独自のC++ベースの拡張による
追加処理を混在させた合成手法を提供します。

YosysはISCライセンスに基づいたフリーソフトウエアです。

## 使用例 ##

Yosysは合成スクリプトで制御されます。例えば、次に示すyosysスクリプトは、
（mytopというトップ階層を持つ）デザインをmydesign.v Verilogファイルから読み込み、
mycell.libというLibertyファイルを使ってゲートレベルネットリストに論理合成し、
synth.vという名前のVerilogネットリストに書き出します。

```lang:test.yosys

# デザインの読み込み
read_verilog mydesign.v
hierarchy -check -top mytop

# 高位要素
proc; opt; memory; opt; fsm; opt

# 内部のセルライブラリへのマッピング
techmap; opt

# FFのマッピング
dfflibmap -liberty mycells.lib

# ロジック部分のマッピング
abc -liberty mycells.lib

# クリーンナップ
clean

# 合成結果を書き出す
write_verilog synth.v

```

--
http://www.clifford.at/yosys/
[stackoverflow] vivadoで作成したIPcoreをそのままISEで使用することはできますか？

[Q]
vivadoで作成したIPcoreをそのままISEで使用することはできますか？

[A]
はい、必要なアウトプットがすべて生成されていれば、ISEプロジェクトでもそのIPコアをインスタンス化できるよ。 
もちろん、google翻訳がそこそこ良い仕事をしてることが前提だけど。
ここには、英語でポストすることで、多くのひとがそれなりのレベルで読み書きすることが
できるのでそうしてもらえると助かる。
 （訳注：英語サイトに日本語で質問が投稿されているため）

--
http://forums.xilinx.com/xlnx/board/crawl_message?board.id=NewUser&message.id=5980
[stackoverflow] Linux DMAドライバのインスタンス化および利用方法

[Q]
我々は、Zynq上で、たくさんのデータを素早く処理するために、カスタムのDMAデバイスを
動かしている。ベアメタルでは、すべてうまく動かすことができた。でも、Linux上だとうまく動かない。
我々の環境は、ARM linuxカーネルのver.3.9だ。 
今のところ、以下のコードの一部を使おうと考えている。
http://www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.txt

しかし、device構造体のインスタンス化のやり方に確信が持てない。
Thanks a lot! 

[A]
xilinx_axidma.cのコードで考えてみる。 
xdev->dev と chan->dev は、すでに &(op->dev)に初期化されている。
なので、xdev->dev と chan->devをDMA APIの最初のパラメタとして
渡すことができる。
xilinx_axidma.c.において、あなたがDMAバッファプールを作る必要はない。
一言で言えば、初期化は正しく行われているということだ。ここまでで、
DMA APIを使う準備はできている。
恐らく、あなたは単一のバッファではなく、Tx/Rxのリングバッファを作るんだろう。
FPGA上のDMAコントローラは、物理アドレスを使うのに対して、
カーネルモジュールは仮想アドレスを使う。
なので、バッファリング内のすべてのバッファに対するvaddrs/paddrs双方を
管理するなんらかの構造が必要となる。 
 
(1) DMAバッファを確保する方法

 　vaddr = (unsigned long) dma_alloc_coherent(xdev->dev, size, paddr, GFP_KERNEL);

返値は、確保したDMAバッファの仮想アドレスで、paddrには対応する物理アドレスが
格納される。FPGA上にあるDMAコントローラはpaddrを使うが、カーネルモジュールは
vaddrを使う。
 
(2) FPGA側からデータを受け取った後に、Dキャッシュを無効にするための以下の関数を呼ぶ。

　　dma_unmap_single(xdev->dev, paddr, length, DMA_FROM_DEVICE);
 
　　ここで、paddrはDMAバッファの物理アドレスである。 

(3) バッファ内容をFPGAに送る前に、Dキャッシュを吐き出すための以下の関数を呼ぶ。

 　　paddr = dma_map_single(xdev->dev, vaddr, length, DMA_TO_DEVICE);

　　paddrはDMAバッファの物理アドレスで、vaddrはそのDMAバッファの仮想アドレスである。

(4) 受信バッファの物理アドレスを取得する

　　paddr = dma_map_single(xdev->dev, vaddr, length, DMA_FROM_DEVICE);

(5) DMAバッファの解放方法

　　dma_free_coherent(xdev->dev, size, vaddr, paddr);

　　ここで、vaddrはDMAバッファの仮想アドレスであるのに対して、paddrは物理アドレス。

--
http://stackoverflow.com/questions/17913679/how-to-instantiate-and-use-a-dma-driver-linux-module
[stackoverflow] Zynq-7000で、シングルステップ実行は可能？



[Q]
私は、Zynq-7000のARMコア向けのLinuxを使いたいんだけど、ちょっと質問がある。
printkを使う代わりにIDEからカーネルのシングルステップでのデバッグってできるの？
ハードマクロ化されたARMコアで、カーネルのシングルステップ実行しつつ、レジスタとか
フラグ、プログラムカウンタなど全部見える？ 

[A]
PowerPCや(Xilinx SDKの)MicroBlaze向けEclipseベースのツールは、シングルステップ実行できるよ。
Zynq7000もサポートしてる。

以下、Xilinxのwebページから。


> SDKには、Zynq-7000 EPP, MicroBlaze™, PowerPCプロセッサをサポート> する統合デバッガが
> 含まれている。
> ブレークポイント、ウヲッチポイントの設定、ステップ実行、変数やスタック状態の表示、
> システム内のメモリ内容の表示が可能。
> さらに異なるプロセッサ（マルチプロセッサシステムで）で動作しているプログラムを同時にデバッグすることもできる。
> これらすべての機能を同じデバッグ環境で使うことができる。

http://stackoverflow.com/questions/15453895/can-zynq-7000-be-singled-steped
for(var i in array)で出てくる要素は数値ではなく文字列

#for(var i in Array)

時々勘違いしてハマる

```js:実験

var array = ['a', 'b', 'c'];
for(var i in array){
   console.log(typeof i, i);
}


```

```js:実行結果

string 0
string 1
string 2 

```

俺がハマった例として、オセロの盤面を扱った時など

```js:調べる

// オセロの盤面
var board = [];
for(var i = 0; i < 8; i++){
	board[i] = [];
	for(var j = 0; j < 8; j++){
		// ぜんぶ0
		board[i][j] = 0;
	}
}
// 28番目だけ1
board[4][3] = 1;

// 1であるマスが何番目か調べる
for(var i in board){
	for(var j in board[i]){
		// 期待する答えは28だが…
		if(board[i][j] == 1) console.log(i+j*8);
	}
}

```


```js:実行結果

424

```

i == 4, j == 3なので「4+3*8」になるはずが、
inで取り出した要素名はArrayであろうと文字列と化すので「"4"+"3"*8」となり「+」が文字列の連結扱いされて
「"4"+"3"*8」→「"4"+24」→「"424"」になっちゃいます
inで取り出した数値は、Number()などで変換してから使うと解決

#Array.forEach()

@opengl-8080 さんからいただいたコメントや、ちょこっと調べたところによると、
for(var i in array) で出てくるキーは、自分やフレームワークが追加したプロパティやメソッドも含まれるので、
配列としての走査には推奨されないようです。
モダンブラウザであれば、 Array.forEach() メソッドを使うとよいようです。
↓でforEach使ってみましたが、ちょっとスッキリしない書き方になりました。。。


```js:forEachバージョン

// オセロの盤面
var board = [];
for(var i = 0; i < 8; i++){
    board[i] = [];
    for(var j = 0; j < 8; j++){
        // ぜんぶ0
        board[i][j] = 0;
    }
}
// 28番目だけ1
board[4][3] = 1;


// 1であるマスが何番目か調べる
board.forEach(function(iVal, i){
	iVal.forEach(function(jVal, j){
		if(board[i][j] == 1) console.log(i+j*8);
	})
});


```

```js:実行結果

28

```

#for(var i of Array.keys())

@hikaru_oao さんからいただいたコメントによると、for-of という構文もあるそうです。
ただ、[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of)によると、安定してないとか変更の可能性があるとか、おどかしてきてるので、近い未来までのブラウザ互換性を期待するような商品に組み込むなどは避けた方がいいのかもしれません。

```js:Array.keys()とofのコンボバージョン

// オセロの盤面
var board = [];
for(var i = 0; i < 8; i++){
    board[i] = [];
    for(var j = 0; j < 8; j++){
        // ぜんぶ0
        board[i][j] = 0;
    }
}
// 28番目だけ1
board[4][3] = 1;


// 1であるマスが何番目か調べる
for (var i of board.keys()) {
    for (var j of board[i].keys()) {
        if (board[i][j] == 1) console.log(i+j*8);
    }
}

```

```js:実行結果

28

```

「of Array」にすると値を走査できるようです。
これはたいへんスッキリ書けますね！
isoイメージを格納したUSBメモリをMacで作成する手順

## 環境
OS : Mac

## Terminalを開く

## imgファイルに変換する
   `$ hdiutil convert -format UDRW -o hoge.img {isoファイル}`
   `$ mv hoge.img.dmg hoge.img`

## USBメモリの確認
   `$ diskutil list`

## アンマウント ※ USBメモリが /dev/disk1 として認識されている場合
   `$ diskutil unMountDisk /dev/disk1`

## ddコマンドでisoイメージをUSBメモリに書き込む
   `$ sudo dd if=hoge.img of=/dev/disk1 bs=1m`

## イジェクト
   `$ sudo diskutil eject /dev/disk1`
動的に追加したDOM要素にイベントハンドラを設定する


javascriptなどでready後に動的に追加したDOM要素に，イベントハンドラを設定するためには，onメソッドを使う必要がある．
参考にしたサイト

http://www.jquerystudy.info/tutorial/intro/event2.html
http://linuxserver.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/javascript/jquery/live.php
http://runble1.com/jquery-on-click/


##使い方
$(セレクタ).on(イベント名,要素,イベント{
});

セレクタには追加した要素の親要素を設定する必要がある
イベント名は'click'など



##サンプル
$('.task').on('click','div',function(){
// do something
);

##注意
似たようなメソッドにlive関数があるが，少なくともjquery5.0では廃止されている
Cocoapadsインストール時のエラーの対処方法


今さら感が漂うが、Cocoapadsのインストール時にエラーが出たので覚え書き。

##Cocoapadsインストール

`Ruby`の`gem`にて最新の`gem`に更新。

```
$ sudo gem update --system
```

`cocoapods`インストール。

```
$ sudo gem install cocoapods
Successfully installed cocoapods-0.34.2
Parsing documentation for cocoapods-0.34.2
1 gem installed
```


##エラー発生

`pod setup`を実行したらエラーが発生した。

```
$ pod setup
Setting up CocoaPods master repo
[!] The `master` repo is not a git repo.
```

そこで`cocoapods`を再インストールするために、関係するディレクトリを削除する。

```
$ rm -fr .cocoapods
$ rm -fr ~/Library/Caches/CocoaPods
```

##Cocoapads再インストール

やりなおし。

```
$ sudo gem update --system
$ sudo gem install cocoapods
```

##別のエラー発生

しかし今度は、下記のエラーが発生。

```
$ pod setup
Setting up CocoaPods master repo
[!] /usr/bin/git clone 'https://github.com/CocoaPods/Specs.git' master --depth=1

Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
```

どうやらライセンスに同意していないらしい。
何度もXcodeを再インストールしているからか、Xcodeライセンス内容が変更されたからかな？


##ライセンス同意
そこで、コマンドラインからライセンスに同意。

```
$ sudo xcrun cc
```

```
$ pod setup
Setting up CocoaPods master repo
Setup completed
```

エラーなく成功した。


##Podfileの作成

試しに対象プロジェクトディレクトリに移動して、`AFNetworking`ライブラリをインストールしてみる。

```
$ vi Podfile

platform :ios, "8.0"
pod 'AFNetworking', '~> 2.0'

```


```
$ pod install
Analyzing dependencies
Downloading dependencies
Installing AFNetworking (2.4.1)
Generating Pods project
Integrating client project

[!] From now on use `MyProject.xcworkspace`.

[!] The use of implicit sources has been deprecated. To continue using all of the sources currently on your machine, add the following to the top of your Podfile:

    source 'https://github.com/CocoaPods/Specs.git'

```

ライブラリが問題なく`CocoaPods`からインストールされている。
git add で fatal: Pathspec '/moge/hoge' is in submodule が出た時の対応

###現象
gitのリポジトリにディレクトリごと何かを追加した際に、ディレクトリがfileとして認識されてしまっていることがある。

```
$git status
On branch test_branch
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   .gitmodules
	new file:   moge/hoge  ->hogeは本当はディレクトリ
```

このまま気づかずにaddしてしまうと、gitにファイルとして認識されてしまう。ディレクトリの中身はindexされない。
無理やりディレクトリの中身をadd しようとすると以下のようなエラーがでてしまう。

```
$ git add moge/hoge/*
fatal: Pathspec 'moge/hoge/file' is in submodule 'moge/hoge'
```

###解決策

一旦 moge/hogeをgitレポジトリから省いて、再度追加してあげます。
git レポジトリのroot直下で以下実行。

```
git rm -rf --cached moge/moge/
git add moge/hoge
```
Android アイコン設定[web clip icon]

## AndroidでのWeb Clip設定方法です。

Web Clipとは、Webサイトへのショートカットを、ホーム画面上に追加できる機能のことです。（iPhoneやiPadだけでなく、Android搭載の端末でも機能します）

アイコンの設定方法

iPhoneの場合は、ルートディレクトリにアイコン画像をアップロードするだけで、オリジナルのアイコンが表示されるようになります。ただし、この場合はアイコン画像のファイル名を apple-touch-icon.png にしておく必要があります。

link要素を指定する場合は、任意のファイル名 + 任意の場所にアップロードすることができます。Androidの場合は、link要素でアイコン画像を指定しておく必要があります。（ルートディレクトリにアップロードしただけでは機能しません）

```index.html
<link rel="apple-touch-icon" href="icon.png">
```

検索した記事ではこのような設定でiPhoneもAndroidも動く的なことが書いてあったのですが、うごかないパターンもあるようです。

#### iPhoneで動かない現象

***href=""*** で指定したパスが絶対パスだと動かない。

#### Andoridで動かない現象

画像サイズが 120 * 120 でないと動かなかった（たぶん他のサイズでも動くけど、下限と上限の設定があると思う）