OmniAICreator/Qiita-1.07M huggingface dataset:
clangを使ったCのコード補完

※この記事は私の<a href="http://ponpoko1968.hatenablog.com/entry/20101030/1288395400">個人ブログ</a>からの転載です。

私は、iOS/Objective-Cのコーディングには専らEmacsを使っています。下記ブログのおかげでかなり快適なObjective-Cのコーディング環境が手に入りました。

(1) <a href="http://sakito.jp/emacs/emacsobjectivec.html">Emacs で iPhone アプリ開発を快適にするための設定</a>

ただ若干気になるところとして、auto-complete-modeの補完候補の精度がXcodeのそれと比べて若干落ちることがあります。

====

Xcodeだと、たとえば、

```objc
  Foo a;
  [a xx
```


クラスFooのaオブジェクトのメソッド呼び出しの文脈では、Fooが実装する"xx"で始まるメソッドの候補をサジェストしてくれます。emacsでも文脈に応じた補完を実現したいものです。

そこで、Google先生に聞いてみたところ、

(2) <a href="http://mike.struct.cn/blogs/entry/15/">Clang Completion Source for AutoComplete in Emacs</a>

というのを見つけました。(※リンク切れてました。ソースは<a href="https://github.com/mikeandmore/auto-complete-clang">ここ</a>から取得できます。）

ClangというのはLLVMコンパイラプロジェクトの成果の一つで、C言語系のプログラミング言語の構文解析エンジンのフロントエンドとして動作し、ソースコードの静的解析を行うことで、シンボルの補完やソースのインデクシングを提供するものと言うことです。

上のページで公開しているauto-comple-clang.elは、auto-complete-modeの補完ソースとして、clangの解析結果を使うというものです。

XcodeがインストールされたMacOSXにはclangコマンドがすでにインストール済みと言うことで、早速上のページからauto-comple-clang.elをダウンロードして、試してみました。


まず、auto-comple-clang.elをload-path上のディレクトリに置いて、objc-mode編集時の補完ソースをclangに設定します。

```lisp
(require 'auto-complete-clang)

(add-hook 'objc-mode-hook
         (lambda ()
           (push 'ac-source-clang-complete ac-sources)
	   ...
         ))
```


次に、clangに渡すインクルードファイルのパスなどを設定します。

```lisp
(setq clang-completion-flags (list "-Wall" "-Wextra" "-fsyntax-only" "-ObjC" "-std=c99" "-isysroot" "/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk" "-I."  "-D__IPHONE_OS_VERSION_MIN_REQUIRED=30200"))
```

なお、(1)のサイトを参考にしてflymakeも設定している人は、flymake-objc-compile-default-optionsや、flymake-objc-compile-optionsの内容を設定すればよいかと思います。

```lisp
(setq clang-completion-flags (append flymake-objc-compile-default-options flymake-objc-compile-options ))
```

iOSプログラマで、ここまで読んでいただいた方には申し訳ないのですが、実は、どうやら最新のバージョン2.8においても、objective-cのクラスやメソッドを認識する機能が実装されていないようで、C言語の関数しか補完候補に現れません。

なので現状は、私が求めている結果は得られていませんが、、(2)のサイトによると、C++ならテンプレートクラスも含めばっちり補完してくれるらしいので、専らC++を書かれる方には相当便利な機能では無かろうかと思います。

2010/11/1補記：
どうやらobjective-Cクラス/メソッドも認識しているようです。私の勘違いでした。他のauto-complete情報源と併せて設定したり試行錯誤していたせいかもしれません。すくなくとも現状、ac-sourcesにac-source-clang-completeのみを設定する限りにおいてはうまく補完できるようになりました。

ちなみに、clangを直接たたいて、現状の動作を確認するには、下記のような引数で実行します。
```clang   -cc1  -D__IPHONE_OS_VERSION_MIN_REQUIRED=30200  -isysroot  /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk   -I. -fblocks  -std=c99 -code-completion-at test.m:23:13  test.m 2
```

-code-completion-at の後の引数に、対象となるソースファイル名と、補完したいカーソル位置の行番号、カラムを指定します。-fblocksをつけないとiOS4で導入されたblocksを用いたヘッダの箇所がコンパイルエラーとして認識されてしまいます。
スーパーファミコンをハック

秋葉原でスーパーファミコンのソフトを発見したので、Arduinoでスーパファミコンソフトをハックしてみた。

```
【実験した作業】
　① ROMの取り込み
　② エミュレータでの起動
　③ Androidでの起動
```

## パーツの買い出し

```
① Arduino Uno
② カードエッジコネクタ(2.54ピッチ)
③ 74HC245
④ 74HC377  * 3個
⑤ ケーブル
⑥ ブレッドボード
```

![IMG_0001_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/f36140d3-cfb0-3abc-6bda-21bd3607a826.jpeg)

## 配線作業

地道に配線作業

![IMG_0091.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/88651dcc-3906-ec76-9358-b0f3466b9c82.jpeg)


![IMG_0105.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/6085634a-0ce5-105f-be0f-59293e5c6a3c.jpeg)


![sfc.png](https://qiita-image-store.s3.amazonaws.com/0/52867/fa0d2374-88a8-996c-1332-0e07677430a9.png)

ROMの吸出しは可能だが、チェックサムエラーに。
もう少し改善が必要かも。

※参考サイト（配線図があります）
http://hongkongarduino.web.fc2.com
複数EC2インスタンスへのrailsデプロイ


掲題の通りの事やりたいと思います。
今回使うec2-capは、tagでデプロイ対象と成るサーバーを識別します。

ELBからサーバーIPを引っ張らずtagを採用したのは、外部に公開しないjobのみが動くサーバーも対象に含めるためです。
なお、jobはrails側のビジネスロジックを再利用しているため、同じリポジトリに含まれているイメージです。

## require

- ruby2.1.2
- rails4.1.1
- capistrano gem (3.2.1)
- ec2-cap gem
- dotenv
    - localからデプロイするために入れています

## EC2にデプロイ用ユーザーの作成

Groupを作成

```
# group名
Deploy

# policy
Deploy-20140907
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1410068314000",
      "Effect": "Allow",
      "Action": [ "ec2:Describe*" ],
      "Resource": [ "*" ]
    }
  ]
}
```

User作成

- deploy
- group : Deploy

## 対象と成るEC2インスタンスにタグを追加

- Project : hoge
- Roles : app
- Stage : production

各々のタグにおいて、複数付与する必要が有る場合はカンマ区切り

## cap-ec2設定

capの基本的な設定は省きます。

Install gems

```
$ vi Gemfile
group :development do
  gem 'capistrano', '~> 3.0'
  gem 'capistrano-rails', '~> 1.1'
  gem 'cap-ec2'
end

$ bundle
```

Envirnoments

```
$ vi .env
AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY
```

Configure capisitrano

```
$ vi Capfile
require "dotenv"
Dotenv.load('.env')

require 'cap-ec2/capistrano'

$ vi config/deploy
set :ec2_region, %w{ ap-northeast-1 }

$ vi config/production.rb
set :stage, :production
set :branch, ENV['BRANCH'] || 'master'
set :ssh_options, {
  user: 'hogehoge',
  keys: %w(~/.ssh/id_rsa)
}
set :rails_env, :production

# cap-ec2
ec2_role :app, ssh_options: fetch(:ssh_options)
```

## deploy

```
$ bundle exec cap production deploy
```
Mac OSXでディスク換装後Virtual Boxが動かなくなる

MacbookのハードディスクをSSDに換装後、Virtual Boxで仮想マシンを起動するとエラーが発生して動かなくなる。

Virtual Boxはインストール時、MacOSXのカーネルにドライバーを仕込むのだが、ハードディスク換装時に新規OSインストール−＞データ移行という手順でやったので、カーネルの状態が換装前の状態から引き継がれなかったのが原因。

Virtual Boxを再インストールして解決したが、意外な盲点だったな。Vitual Box以外にも問題が発生するアプリケーションがありそうな気がする。
【プログラミング48(/2 -1)手】Meditator


## ポイント

オブジェクトが互いに参照しまくっていると
（n対nの関係になっていると）
オブジェクトの責任がよくわからなく、煩雑になってしまいがち。
結果、オブジェクトの実装を変更しずらい、人間が理解しずらくなってしまい
メンテナンス性が落ちるなどの弊害がある。

それを解決するために、
Mediator（仲介者）を立てようじゃないか
という発想。

## サンプルコード

<script src="https://gist.github.com/onody/3a336b6a51023703eac4.js"></script>
https://gist.github.com/onody/3a336b6a51023703eac4

## 所感

・やってみたけど、この書き方も慣れていないと、
　少々複雑な気はしている。
　このパターン自体になれればそうでもないのかもしれない。

・「仲介してシンプルに。」
　たしかに、そういった側面もあるけど、
　仲介者の仕事が増えすぎたら、
　また分散させる必要があるとおもう。
　また、他のデザインパターンで解決できそうなのがあるかもなので、
　引き続きパターンを学んでいきたい。

## 参考にしたサイト

http://sourcemaking.com/design_patterns/mediator
http://www.itsenka.com/contents/development/designpattern/mediator.html
http://capm-network.com/?tag=%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Mediator
Unityでgifアニメを分解して一枚づつ順番に表示してgifアニメに戻す。

※Unityにはちゃんと、連番アニメーションする仕組みがあります！！
[正式な方法はこちらをご覧ください](http://japan.unity3d.com/developer/document/tutorial/2d-shooting-game/game/01.html)
--
まあ、Unityでやるのにまったく意味ない事なんだけども
まったく意味ない事でも使い方によっては意味がある事もあります。

まず、用意したgifアニメ画像をバラバラに分解するのにImage Magicを使おうと思います。
インストールするには色々な方法があるようですが、
今回は[Cactuslab](http://cactuslab.com/imagemagick/)さんが提供しているインストーラーを使いました。

インストーラーはこちらを使っています。
![スクリーンショット 2014-09-07 17.07.13.png](https://qiita-image-store.s3.amazonaws.com/0/38279/b30df653-0c3f-e9e4-d1bc-d760118326ad.png)

無事にインストールできたら、目的のgifを分解してみましょう。
convert +adjoin -coalesce 指定の画像名.gif　変更後の画像名.gif
これで分解できましたね。

こいつをunityにドラック&ドロップで持って行きます。
それから、planeにマテリアルを設定してgif画像を貼っても動かないので少しスクリプトを書きました。

![スクリーンショット 2014-09-07 17.13.09.png](https://qiita-image-store.s3.amazonaws.com/0/38279/09637752-80e1-6cf0-b24d-e88a6500896d.png)

ちなみに、こんな感じで走っている連番画像になります。
![スクリーンショット 2014-09-07 17.15.13.png](https://qiita-image-store.s3.amazonaws.com/0/38279/78737eaa-5158-e004-43ce-4ea80d24dfe6.png)

```C#:gifアニメ風スクリプト
using UnityEngine;
using System.Collections;

public class gifAnim : MonoBehaviour {
    public Texture[] PlayerTexture;
    public float gifNum = 0;
    public float fps = 24;
    
    void Update () {
        gifNum = Time.time * fps;
        gifNum = gifNum % PlayerTexture.Length;
        renderer.material.mainTexture = PlayerTexture[(int)gifNum];
        Debug.Log( Mathf.Floor(gifNum));
    }
}
```
連番の画像はインスペクターの方で設定しています。
![スクリーンショット 2014-09-07 17.22.43.png](https://qiita-image-store.s3.amazonaws.com/0/38279/ee96fc22-cc95-9968-7569-2d234ed22cf8.png)

はい！これで完成。
再生するとこんな感じでアニメーションします。
[モックマン走る](https://www.youtube.com/watch?v=DYkBMv4mWUg&feature=youtu.be)

![スクリーンショット 2014-09-07 17.02.05.png](https://qiita-image-store.s3.amazonaws.com/0/38279/99633a98-1f6c-e8cd-4159-eaec9cba4477.png)
Macボタン記号の覚え書き

仕事でWindows、プライベートでMacな私だが、どうしても未だ記号が覚えられないので覚え書き。特に上から3種類。

　⌘：Command
　⌥：Option
　⌃：Control
　⇧：Shift
　⇪：Caps Lock
　fn：Function

ちなみに、^（キャレット）と ⌃（Control）は異なります。改めて知った。ｗ
rbenvでrubyのバージョンをすぐに変える方法。[自分用まとめ]

```
brew upgrade ruby-build
```

で色々とインストールできるものが増える

```
rbenv install -l
```

で確認できる

```
rbenv versions
```

で今使えるrubyのバージョンが分かる

```
rbenv install 2.1.2
```

でインストールなう

```
(development)$ rbenv versions
  system
* 2.1.0 (set by /Users/fujitakazuhijiri/.rbenv/version)
  2.1.1
  2.1.2
```
```
rbenv global 2.1.2;rbenv rehash
```

んで

```
(development)$ rbenv versions
  system
  2.1.0
  2.1.1
* 2.1.2 (set by /Users/username/.rbenv/version)
```

で終了。
FuelPHPでセッション共有時の注意点

#TL;DR
FuelPHPでセッション情報をMemcacheやRDBMSなどを使って複数ノードで共有する場合には、

* app/config/crypt.php

を複数ノードで同じ値となるように設定する必要がある。

#背景
Webアプリを複数ノードで構成して、ロードバランサでセッション維持をしない場合には、どのノードにユーザの再アクセスがあってもセッションを維持するために、セッションストアとしてMemcacheやRDBMSなどを使うと思います。
例えば、以下のような構成。
![AWS Design.png](https://qiita-image-store.s3.amazonaws.com/0/508/733b7bfd-9703-739d-a4f1-441b14ac3e76.png)

このような構成を FuelPHP で行う場合の注意点を書いておきます。
図と、以降の説明では ElastiCache（Redis）を使っていますが、注意点についてはRDBMSだろうが普通のMemcacheだろうが同じです。

#セッションストアの指定

FuelPHP では、セッションストアの指定を app/config/session.php でまず指定します。（なお、環境に応じて設定を変更したい場合は、 config/staging/session.php などに記述すればOK）

Redisを使うのであれば、session.phpの記述は以下のようになります。

```php:session.php
<?php

return array(
    'driver' => 'redis',
    'redis' => array(
        'cookie_name' => 'fuelrid',
        'database' => 'default',
    ),
);
```

さらにRedisの場合は、db.phpに接続先の情報を記述します。

```php:db.php
<?php

return array(
        'redis' => array(
            'default' => array(
                'hostname' => 'xxxxxx.yyyyyy.nnnn.apne1.cache.amazonaws.com',
                'port' => 6379,
                'timeout' => null,
            )
        ),
);
```

セッションストアとして他のシステムを使う場合はなどは、下記公式ドキュメントを参照するとよいです。

* http://fuelphp.jp/docs/1.7/classes/session/config.html

#暗号キー設定

で、ここからが重要で、これだけの設定だけでは、本質的にはセッションの共有ができません。
ロードバランサが別ノードに新たにリクエストを振るたびに、セッションが維持できないという症状がでます。（環境の作り方次第では、下記情報が同じになっているので、意図せず正しくは動作することもあります）

これは、FuelPHP ではセッションIDをCookie名に設定する時に暗号化を行っているのですが、この時に使用する暗号キーがノード毎に異なることが原因です。
この暗号キーはデフォルトでは設定されておらず、必要となったときに初めて app/config/crypt.php に自動的に生成されます。

ファイルの内容は以下のようなものです。

```php.crypt.php
<?php
return array(
  'crypto_key' => '9eEBP8okkcz4xAo9rU5h4f7Q',
  'crypto_iv' => 'HncqRUWjEl2Y53sqawnK4Y7Q',
  'crypto_hmac' => 'ra4OxkVxYthofVMlAk0ncQrQ',
);
```

**この内容を複数のノードで同じとなるようにします。**

crypto_key, crypto_iv, crypto_hamc の３つが必要となり、それぞれ以下の条件を満たす必要があります。そうでなければ、再作成されてしまいノード毎に異なることになってしまします。

* base64デコード可能な文字列
* 文字列の長さは４の倍数

core/classes/crypt.php の _init() メソッドを見るとわかると思います。

そこからの抜粋で下記のようなコードで暗号キーに必要な値を生成できます。

```php
<?php

function safe_b64encode($value)
{
	$data = base64_encode($value);
	$data = str_replace(array('+','/','='), array('-','_',''), $data);
	return $data;
}


$crypto = '';
for ($i = 0; $i < 8; $i++)
{
	$crypto .= safe_b64encode(pack('n', mt_rand(0, 0xFFFF)));
}

echo $crypto . "\n";
```

#参考

* http://madroom-project.blogspot.jp/2013/03/fuelphpredis.html
* http://9jp.info/archives/12368
* http://dev.classmethod.jp/cloud/aws/php-session-elasticache/
* http://qiita.com/supertaihei02/items/f3ef9148fd5235ee2816
grunt-wiredep使用の環境でangular-i18nをbowerでインストールしたら注入できないとメッセージ

AngularJSリファレンス読了。これは良い本。

で、フィルタのi18nの項をみて、早速いれてみたら、grunt-wiredepを使っているGruntのタスクで注入出来ないとメッセージが出て、htmlファイルのコメントの間にi18nへのscriptタグが挿入されない。
ちなみにgenerator-angularで作ったプロジェクトで、bowerでi18nを入れての話。

```zsh
% bower install angular-i18n --save

% grunt serve

# .......略...............

Running "wiredep:app" (wiredep) task
app/index.html modified.

angular-i18n was not injected in your file.
Please go take a look in "/home/vagrant/myApp/client/bower_components/angular-i18n" for the file you need, then manually include it in your file.

Running "wiredep:sass" (wiredep) task

angular-i18n was not injected in your file.
Please go take a look in "/home/vagrant/myApp/client/bower_components/angular-i18n" for the file you need, then manually include it in your file.
```
```index.html
  <!-- bower:js -->
  <!-- 略 -->
  <script src="bower_components/angular-i18n/angular-locale_ja-jp.js"></script>
  <!-- ↑これが入って欲しいが入らない -->
  <!-- endbower -->
```

angular-i18nのbower.jsonを確認するとmainが指定されていない。
まあ色々な言語のパッケージが入ってるし、勝手にロケールを解決してくれるとも思えないので、そりゃそうか。
なので、bower.jsonにこうした。

```bower.json
  "overrides": {
    "angular-i18n": {
      "main": "angular-locale_ja-jp.js"
    }
  }
```

これでgrunt serveなりwiredepのタスクが含まれたタスクを実行すると…OK.注入された。  

```index.html
  <!-- bower:js -->
  <!-- 略 -->  
  <script src="bower_components/angular-i18n/angular-locale_ja-jp.js"></script>
  <!-- endbower -->
```
cocos2dx 3.0系で初期画面の色を変更する

* .hファイルの修正

`class HelloWorld : public cocos2d::Layer`を下記に変更。

```:HelloWorldScene.h
class HelloWorld : public cocos2d::LayerColor
```

* .cppファイルの修正

```:HelloWorldScene.cpp
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
    if(!LayerColor::initWithColor(Color4B(255, 255, 255, 255)))
    {
        return false;
    }

```

できました。 :tada: 
参考URL：http://stackoverflow.com/questions/12117250/how-to-set-background-color-of-layer-in-cocos2d-x
ソーシャル異議ありスクリプト


想定プラットフォーム
==============================

USTREAM

	あまりスクリプトでのエンタメ的な部分が実装されないけど一部エンドユーザーにはスタンダード。

ニコニコ

	スクリプトは自由度が高い、ニコニコユーザーのコメントは時に怖い。

ほか

	よくわからん。

概要
==============================

何かの問題やモノを申したい事件を中継する際、完全なエンドユーザーだと大体荒れる。
ある程度の合意の取れる識者の意見を上手にリアルタイムにピックアップして共有したい。
表現の方向性としては某裁判ゲーム的な感じはありかも。
ある程度信頼できるモデラーが事実などをツダってる想定。

実装検討
==============================

APIでのタイムライン取得：有用だが後回しの方が早いかな
USTREAMのタイムラインをポップアップするとスクリプトをブックマークレットで付与できる状態になる
USTREAMはjQueryを使っている模様なのでそれにのっかるか。仕様変更したらブックマークレット読み込みかな。
動画側にもブックマークレットで受信と表示のスクリプトを読み込む。
独自ページが設置できればそちらで対応するのもありか。ただ、少なくとも入力側の取得はiframeの内部がアクセスできないのでAPIを使うことになる。面倒なので後回し。

> フローとUI

* UIとしてはタイムラインの一部をダブルクリックかトリプルクリックで文字選択し、それに対してコメントをつけて送信
* サーバーでエコーサーバー的に処理
* 各動画側で表示。邪魔にならない位置にフロート・意義の対象になるコメントがわかるようにする・コミカルな表示

> タイムラインとの紐付け

タイムラインのIDと紐付けすることを考えるとややこしいし、別に無くてもいい気もする。
配信開始日時、意義発信日時と該当コメントと対象コメント、くらいを別で保存しとけばいいかなあ。
プラットフォームとの整合性とかAPI数とか気にしたくないし。でも通信量が増えるか。

> クロスドメイン

あ、もしかすると他ドメインに送信できない可能性はあるなあ。うん、ダメだな。
あとは受信もNGだったらAPIを使うしかなくなるか。jsonpでいけるのかね。なんか面倒になってきた。

memo
==============================

なんかちょっとひねりがたりないとか、いろいろ自己突っ込みはあるが省く
こういうのって、著作とか規約的に問題あったりしないだろうか。
Vagrant で開発した Rails アプリケーションを Vagrant share でアクセスしてみよう

# 環境
* Vagrant の VM が動くこと
    * version 1.5 以上
* vagrant share を使えるようにする
    * http://qiita.com/kasaharu/items/9a75933173bf2b303bf7

## Vagrant 内の環境
* rails がインストール済み

```bash
$ rails -v
Rails 4.1.5
```
* nginx がインストール済み

```bash
$ nginx -v
nginx version: nginx/1.4.6 (Ubuntu)
```

# Rails アプリケーションの配置
* 今回はテスト用のアプリを作成する

```bash
$ pwd
/home/vagrant
$ rails new test_app
$ cd test_app
```

# Nginx の設定ファイル編集
* 設定ファイルを下記のように編集

```/etc/nginx/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
#  デフォルトで読み込む設定ファイルを読まないようにする
#    include /etc/nginx/conf.d/*.conf;

    server {
# リクエストを受けるポート
        listen   80;
        server_name localhost;

        location / {
# 80 ポートで受けたリクエストを 3000 ポートに中継する
            proxy_pass http://127.0.0.1:3000;
        }
    }
}
```

* 設定ファイルの再読み込み

```bash
$ sudo service nginx reload
$ sudo service nginx restart
```

* うまく再読み込み出来ない場合は Vagrant を再起動する

```bash
# ホスト側で操作
$ vagrant halt
$ vagrant up
```

# Rails アプリケーションのバックグラウンド実行と share
* Rails アプリケーションをバックグラウンドで実行する

```bash
$ pwd
/home/vagrant/test_app
$ nohup rails s &
```

* vagrand share を実行する

```bash
# ホスト側で操作
$ vagrant login
In a moment we'll ask for your username and password to Vagrant Cloud.
After authenticating, we will store an access token locally. Your
login details will be transmitted over a secure connection, and are
never stored on disk locally.

If you don't have a Vagrant Cloud account, sign up at vagrantcloud.com

Username or Email: 
Password (will be hidden): 
You're now logged in!

$ vagrant share
vagrant share
==> default: Detecting network information for machine...
    default: Local machine address: 192.168.33.10
    default: Local HTTP port: 3000
    default: Local HTTPS port: disabled
==> default: Checking authentication and authorization...
==> default: Creating Vagrant Share session...
    default: Share will be at: generous-mandrill-8127
==> default: Your Vagrant Share is running! Name: generous-mandrill-8127
==> default: URL: http://generous-mandrill-8127.vagrantshare.com
```

* 一番下に表示されている URL : http://generous-mandrill-8127.vagrantshare.com にアクセスする
** Welcome aboard ページが表示される

![スクリーンショット 0026-09-07 15.27.29.png](https://qiita-image-store.s3.amazonaws.com/0/28573/4c47ce6d-83ae-1ac5-bccd-bc5a2179b059.png)

* Ctrl + c で vagrant share を終了する
ビット演算 [6]：変数内の特定のビットを交換する

ビット演算 [6] では、排他的論理和（^）を用いて、異なる変数の同じ位置のビットを交換する方法を示したが、そのテクニックを使ってひとつの変数内の特定のビットを交換することも可能だ。

変数 x の交換したいビットを mask1, mask2 とし、それらが n ビット離れている場合（ただし mask1 >> n = mask2 とする）、反転マスクを以下のように計算することが出来る。

> auto t = ((x >> n) ^ x) & mask2;
> t |= t << n;

この反転マスクを用いると、以下の文で mask1, mask2 の部分を交換することができる。

> x ^= t;

例えば、変数xの下位4bitと、そのすぐ上の4bitを交換したい場合は、以下のように記述する。

> auto t = ((x >> 4) ^ x) & 0x0f;
> t |= t << 4;
> x ^= t;

もし、ｘの値が 0x123 であれば、上記を実行後は 0x132 となる。
ビット演算 [5]：2つの変数の特定のビットを交換する

排他的論理和は x^x = 0, x^0 = x であり、交換法則も成り立つので、
x^(x^y) = y, y^(x^y) = x である。
従って、変数 x, y をそっくり交換したい場合は以下のように記述できる。

> auto t = x ^ y;
> x ^= t;
> y ^= t;

特定のビットのみを交換したい場合は、t の計算時にその部分をマスクしてやるとよい。
例えば、変数 x, y の下位４bitの部分だけを交換したい場合は以下のように記述するといいぞ。

> auto t = (x ^ y) & 0x0f;
> x ^= t;
> y ^= t;

x = 0x123, y = 0xabc の場合、上記を実行すると x = 0x12c, y = 0xab3 になるぞ。
ビット演算 [4]：特定のビットを反転する

排他的論理和(^）は、ビットの値が同じ場合は0、異なる場合は1を返す。
x ^ 1 = ~x, x ^ 0 = x なので、見方を変えると、0ならば反転、0ならば元の値のままとなる。
従って、特定のビットを反転したい場合は、そのビットを立てたマスクと排他的論理和(^）演算を行うといいぞ。

例えば、変数xの下位４ビットを反転したい場合は、以下の様に記述する。

> x ^= 0x0f;
ビット演算 [3]：特定のビットを0にする

変数の特定のビットの値を 0 にしたい場合は、そのビットのマスクの反転と算術論理積を行うといいぞ。

例えば、x の下位4ビットを0にしたい場合は以下のように記述する

> x &= ~0x0f;
ビット演算 [2]：特定のビットを1にする

算術論理和（|）は、0 & 0 の場合のみ 0 で他は 1 を返す。
（1|0 = 1, 0|1 = 1, 1|1 = 1）
見方を変えると x | 1 = x, x | 0 = x となるので、
１にしたい場所のビットを１にした mask と、ビットを立てたい変数との算術論理和演算を行うと、目的とする場所のビットを立てる（１にする）ことが出来るぞ。

例えば、変数 x の下位4bitをすべて1にしたい場合は、以下のように記述する。

x |= 0x0f;
ビット演算 [1]：特定のビットの状態のみを取り出す

算術論理積（&）は、1 & 1 の場合のみ 1 で他は 0 を返す。
（1&0 = 0, 0&1 = 0, 0&0 = 0）
見方を変えると x & 1 = 1, x & 0 = 0 となるので、
取り出したい場所のビットを１にした mask と、調べたい変数との算術論理積演算を行うと、目的とする場所のビットのみを取り出すことが出来るぞ。

例えば、変数 x の下位4bitのみを取り出したい場合は、以下のように記述する。

> x & 0x0f
Mac OS XでCordovaを使ってiOSアプリを開発するとき、tmux上でシミュレータを起動させるとエラーになる。

Mac OS XでCordovaを使ったハイブリッドアプリを開発するとき、Terminal.appでtmuxを起動させた上で

```
> cordova emulate ios
```

コマンドを使いiOSシミュレータを起動させると、こんなかんじのエラーになる↓

```
Error: /Users/hoge/Desktop/hello/platforms/ios/cordova/run: Command failed with exit code 1
    at ChildProcess.whenDone (/usr/local/lib/node_modules/cordova/node_modules/cordova-lib/src/cordova/superspawn.js:135:23)
    at ChildProcess.EventEmitter.emit (events.js:98:17)
    at maybeClose (child_process.js:743:16)
    at Process.ChildProcess._handle.onexit (child_process.js:810:5)
```

どうやらPasteboard周りのtmuxのバグのようで、pbcopyとpbpasteがtmuxでうまく動かないことに起因するエラーらしい。

[Simulator session timed out" error · Issue #15 · phonegap/ios-sim](https://github.com/phonegap/ios-sim/issues/15)

この問題を回避するためのラッパープログラムを開発している方がいるので、そちらを利用すれば問題なく起動することができる。

[ChrisJohnsen/tmux-MacOSX-pasteboard · GitHub]( https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard)

常にtmuxを使っているから、tmuxに起因することだなんて気付かなかった。まさかこんな罠があるとはね...
bleveでGoに検索機能を用意する


## bleveとは
http://www.blevesearch.com/

簡単に言うとテキスト検索エンジンです。
Go言語の様々な構造体をインデクシングして、任意のワードで検索できます。

bleveの特徴としては非常にシンプルなインターフェースで使えるので組み込みが楽ということが一番に挙げられます。
とはいえインデックスデータのバックアップやtf-idfでのスコアリングなどの機能も用意されていますし、コマンドラインツールもセットされています。

内部ではboltdbをデフォルトのデータストアとして使うようになっています。単純なkey/valueストアなので他のDBへの移行も可能かもしれません。

デモはこちらにあります。
http://wikisearch.blevesearch.com/search/

## 使い方

```go:sample.go
package main

import (
	"fmt"
	"github.com/blevesearch/bleve"
)

// 検索対象の構造体
type Document struct {
	Title string
	Body  string
	Like  int
}

func main() {
	// 新しいIndexを開く
	mapping := bleve.NewIndexMapping()
	index, _ := bleve.New("example.bleve", mapping)

	// 適当なデータをインデックスに登録する
	data := map[string]Document{
		"id1": Document{"test", "Lorem ipsum dolor sit amet,", 1},
		"id2": Document{"test2", "This is text.", 10},
	}
	for id, doc := range data {
		index.Index(id, doc)
	}

	// 検索してみる
	query := bleve.NewMatchQuery("text")
	search := bleve.NewSearchRequest(query)
	searchResults, _ := index.Search(search)

	// 結果を表示
	for _, match := range searchResults.Hits {
		fmt.Printf("ID: %v\n", match.ID)
		fmt.Printf("Score: %v\n", match.Score)
		doc := data[match.ID]
		fmt.Printf("Doc: %#v\n", doc)
	}
}

```

実行

```shell:
$ go run bleve.go
ID: id2
Score: 0.7071067690849304
Doc: main.Document{Title:"test2", Body:"This is text.", Like:10}
```

これだけでIndexを自動保存しつつ検索することができるので非常に手軽ですね。

インデックスのカスタマイズなどはWikiやサンプルを読んでmappingをいじりましょう。

Tokenizerのカスタマイズやデータストアの変更などは追って調べてみようかと思います。

## 参考
- bleve https://github.com/blevesearch/bleve
- bleve GoDoc http://godoc.org/github.com/blevesearch/bleve
Macでgitからマージツールを使う

長らくMacから簡単に使えるマージツールを探していたのですが、元々インストールしていたXcodeとSourcetreeに入っていたとは・・・。
XcodeかSourcetreeが入っていればopendiffというマージツールが使えます。
設定は以下。

`git config --global diff.tool opendiff`

## 使い方
現在のワークスペースでの編集分を確認できます。
`git difftool -d`

今いるHEADと一つ前のコミットを比較する
`git difftool -d HEAD^`

任意のブランチ間の差分を比較する
`git difftool -d branch1 branch2`
CentOS6.5にMongoDBをインストールする


# はじめに
CentOS 6.5に、MongoDBの最新版をインストールする方法です。
現在の最新版は2.6.4です。

[公式のCentOSへのインストール手順](http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/)にそってインストールしていきます。

## 環境
* CentOS 6.5 64bit


# 手順
## MongoDBレポジトリ追加
今回はMongoDBのレポジトリからyumでインストールします。
まずはレポジトリを追加します。

```:/etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

## インストール
`mongodb-org`というパッケージをインストールします。

```bash
$ sudo yum install -y mongodb-org
```

このパッケージは、次の4種類のパッケージをインストールしてくれます。

```bash
============================================================================
 Package                  Arch         Version          Repository     Size
============================================================================
Installing:
 mongodb-org              x86_64       2.6.4-1          mongodb       4.6 k
Installing for dependencies:
 mongodb-org-mongos       x86_64       2.6.4-1          mongodb       6.8 M
 mongodb-org-server       x86_64       2.6.4-1          mongodb       9.0 M
 mongodb-org-shell        x86_64       2.6.4-1          mongodb       4.3 M
 mongodb-org-tools        x86_64       2.6.4-1          mongodb        89 M

Transaction Summary
============================================================================
Install       5 Package(s)
```

それぞれ、

* mongodb-org-server: MongoDBサーバのmongodやinitスクリプト
* mongodb-org-mongos: シャーディングを管理するmongosサーバ
* mongodb-org-shell: クライアントシェル
* mongodb-org-tools: mongodumpやmongotopなどの周辺ツール群

## 起動
起動します。
これも、一般的なコマンドで一発です。

```bash
$ sudo service mongod start
Starting mongod:  [  OK  ]
```

# 確認
動作確認のため、ちょろっとmongoシェルを使ってみます。

```bash
$ mongo
MongoDB shell version: 2.6.4
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
> use test
switched to db test
> db.fish.insert({name: "マグロ"})
WriteResult({ "nInserted" : 1 })
> db.fish.find()
{ "_id" : ObjectId("540bd2d7a3754bda459c21ad"), "name" : "マグロ" }
> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
> show dbs
admin  (empty)
local  0.078GB
> exit
bye
```

よさそうです。

# おわりに
非常に簡単でした。
実際の用途では設定ファイルの`/etc/mongod.conf`を編集したり、ReplicaSetやShardingを組むことになると思います。
[Unity] VisualStudio 2010 ExpressでUnityする

# はじめに

Unityを使い始めましたが、案の定MonoDevelopではやってられなくなりました。
ということで、使い慣れているVisualStudio 2010 Expressにできないか調べてみました。
2012以降はちょっと……。

 [1] VSToolsを使う - http://qiita.com/gc-j-lee/items/de6d12b42756b205214a

Pro版ではできるようですが、Express版では少し制限がありまそうです。
以下の方法がオーソドックスなようですが、私の環境では、C#ファイルがVSで開くようになったものの、インテリセンスが効かなかったので、使えませんでした。

 [2] Expressで使う - http://qiita.com/nishiken1112/items/87b38b19ca9a5f4a5798

しかし、いつの間にか、slnファイルができていて、直接VSで開けてしまいましたので、経緯を書いておきます。

# 経緯

1. VSToolsを入れる（[1]を参照）
2. Proでないと直接開けないよ、と文句を言われる。（MonoDevelopのまま）
3. VSを開くバッチファイルをつくって、Editorに設定する。（[2]を参照）
4. Syncしたら、エラーが出た。
5. C#ファイルを開いたらVSが立ち上がるようにはなった。（ソリューションにはならず）
6. VisualStidio 2010 Expressを開く
7. VSからUnityでつくったプロジェクトの直下にあるプロジェクト名-csharp.slnを開く
8. いつもの感じになった！

# あとがき

もしかしたら何もしなくてもslnファイルができていて、VSから開けたのかもしれませんが、元に戻してできなくなったらいやなので、謎のままにしておきます。
Unityは、更新したファイル群を自動反映してくれますので、VSで編集、Unityでビルド＆実行、という形でスムーズに開発できそうです。
何か不都合が出るかもしれませんが、しばらくこれでやってみます。
CentOS 6.x で日本語環境を整える為の手っ取り早いコマンド

サーバーに日本語環境が構築されていなくて、日本語フォントを使うシェルプログラムを作った時に困ったので、メモ。


```
sudo yum groupinstall "Japanese Support" 
```

これだけでうまくいきました。

サーバー構築時にやっておくべきでしたね。
たった一つのcutを通せば、Apacheログは驚くほど扱いやすくなる


こんな感じのログがあったとして、

```bash:httpd-access.log
192.168.0.1 - - [17/Apr/2014:11:22:33 +0900] "GET /index.html HTTP/1.1" 200 43206 "https://www.google.co.jp/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"
```

`"mozilla/5.0 (Windows NT 6.1 …… Safari/537.36"`

の部分がほしい場合、ワンライナーで書くと以下の様な感じになりました。

```bash:ワンライナー
$ for i in `cat httpd-access.log | tr ' ' '\n' | nl -n ln | grep Moz | cut -d ' ' -f 1`;do cat httpd-access.log | cut -d ' ' -f $i- ;done
```

ちなみに、これを一発でやろうとすると、こうなります。

```bash:
$ cut -d ' ' -f 12- httpd-access.log
```

ワンライナーの大半は、何個目からキーワードである`Moz...`が始まるのかを調べるための処理です。今回は、改行して、行数から判断しました。

`cut`は、区切り文字を設定でき、更に、`-f`で`~より前`,`~より後`を指定できるので便利です。

```bash:
$ cut -d '"' -f -1-3-
```

ネタ元:

[たった6個のsedを通せば、Apacheログは驚くほど扱いやすくなる - Qiita](http://qiita.com/richmikan@github/items/fcf457041bb3c0e60179)


##追記

スクリプトらしきものを作りました。あくまでネタですので、ご了承ください。あと、ログはネタ元を引用しました。

```bash:
$ ./apache_cut.sh httpd-access.log Moz Chr
```


```bash:apache_cut.sh
#!/bin/zsh

sfile=${0:a:t}

case $1 in
    -[hH]|-[hH]elp)
        echo "
            引数1...ファイル名
            引数2...キーワード1
            引数3...キーワード2
            $ ./$sfile httpd-access.log Moz Chr
        "
        ;;
    *)

case $# in
    1)
        cat $1
        ;;
    2)
        for i in `cat $1 | tr ' ' '\n' | nl -n ln | grep $2 | cut -d ' ' -f 1`;do cat $1 | cut -d ' ' -f $i- ;done
        ;;
    3)
        key1=`cat $1 | tr ' ' '\n' | nl -n ln | grep $2 | awk 'NR==1' | cut -d ' ' -f 1`
        key2=`cat $1 | tr ' ' '\n' | nl -n ln | grep $3 | awk 'NR==1' | cut -d ' ' -f 1`
        cat $1 | cut -d ' ' -f $key1-$key2
        ;;
    *) echo no var;;

esac
;;

esac
```

https://gist.github.com/cd6fd9765bf89644843d
PostgreSQLを使ったRailsアプリケーションをwerckerでbuildしてたらlibruby.soでLoadErrorが出た。

postgresqlを使ってbuildしようとしたらエラーが出た。

##結論
結論から先に言うと、

```yaml
box: wercker/rvm
```

RVM使えって話っぽい。

##詳細
こんな感じの wercker.yml で、

```wercker.yml
box: wercker/ubuntu12.04-ruby2.0.0
services:
    - wercker/postgresql
build:
    steps:
        - bundle-install
        - rails-database-yml:
            service: postgresql

        - script:
            name: echo ruby information
            code: |
                echo "ruby version $(ruby --version) running"
                echo "from location $(which ruby)"
                echo -p "gem list: $(gem list)"

        - script:
            name: Set up db
            code: bundle exec rake db:schema:load RAILS_ENV=test

        - script:
            name: rspec
            code: bundle exec rspec
```

Set up dbのところでエラー。

```
cd $WERCKER_SOURCE_DIR
$ export WERCKER_STEP_ROOT="/wercker/steps/wercker/script/0.0.0"
$ export WERCKER_STEP_ID="162fb6ee-500d-4ef8-8de7-47a3f945dcc2"
$ export WERCKER_STEP_NAME="script"
$ export WERCKER_REPORT_NUMBERS_FILE="$WERCKER_REPORT_DIR/$WERCKER_STEP_ID/numbers.ini"
$ export WERCKER_REPORT_MESSAGE_FILE="$WERCKER_REPORT_DIR/$WERCKER_STEP_ID/message.txt"
$ export WERCKER_REPORT_ARTIFACTS_DIR="$WERCKER_REPORT_DIR/$WERCKER_STEP_ID/artifacts"
$ mkdir -p $WERCKER_REPORT_ARTIFACTS_DIR
$ export WERCKER_STEP_TEMP="/tmp/$WERCKER_STEP_ID"
$ source '/wercker/wercker-build-essentials/init.sh'
$ mkdir -p $WERCKER_STEP_TEMP
$ bundle exec rake db:schema:load RAILS_ENV=test
rake aborted!
LoadError: libruby.so.2.0: cannot open shared object file: No such file or directory - /cache/bundle-install/ruby/2.0.0/gems/pg-0.17.1/lib/pg_ext.so
/cache/bundle-install/ruby/2.0.0/gems/pg-0.17.1/lib/pg.rb:4:in `require'
/cache/bundle-install/ruby/2.0.0/gems/pg-0.17.1/lib/pg.rb:4:in `<top (required)>'
/pipeline/build/config/application.rb:14:in `<top (required)>'
/pipeline/build/Rakefile:4:in `require'
/pipeline/build/Rakefile:4:in `<top (required)>'
(See full trace by running task with --trace)
```

rvmを使うことにして、

```
box: wercker/rvm
```

ってやったら動いた。

あ、ちゃんとバージョンも指定しよう。

```
    steps:
        - rvm-use:
            version: 2.1.2
        - bundle-install
        - #以下同様...
```
xdebugのリモート設定

```bash
$ sudo yum install php-pecl-xdebug --enablerepo=epel --enablerepo=remi --enablerepo=remi-php55
```

```ini:/etc/php.d/xdeubg.ini
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.remote_host=リモート先のサーバーIP
xdebug.remote_handler=dbgp
xdebug.remote_autostart=1
xdebug.remote_mode=req
xdebug.remote_connect_back=1
xdebug.idekey=デバッグのキー文字列
```

IntelliJの設定は[ここ](http://www.karakaram.com/phpstorm-vagrant-remote-debug)を参照
BitbucketでPort:22でエラーが発生した場合の対処法

VagrantのCentOS環境下で、Bitbucketにpushできなかったのでメモ

<br />

設定ファイルを以下のようにして設定

```
$ vi ~/.ssh/config
```

```
Host bitbucket.org
  User git
  Port 22
  Hostname bitbucket.org
  IdentityFile ~/.ssh/id_rsa
```

接続テスト

```
$ ssh -T git@bitbucket.org
ssh: connect to host bitbucket.org port 22: Connection timed out
```
とエラーが出る。どうやら、Port:22がいけないようなので、設定ファイルを変更します。

<br />

```
$vi ~/.ssh/config
```

```
Host bitbucket.org
  User git
  Port 443
  Hostname altssh.bitbucket.org
  IdentityFile ~/.ssh/id_rsa
```

ssh.bitbucket.org ではなく、 altssh.bitbucket.org であることに注意（私はかなり長い間気づきませんでした）
接続テスト

```
$ ssh -T git@bitbucket.org
```

これで通りました。

<br />

もしかすると、こんなエラーが出るかもしれません。

```
Bad owner or permissions on /home/vagrant/.ssh/config
```

configファイルのアクセス権限に問題があるようなので、chmodコマンドを使って権限を書き換えます。

```
$ chmod 600 ~/.ssh/config
```

<br />

参考文献
http://garbers.co.za/2014/03/03/connecting-to-bitbucket-on-https-port/
http://morizyun.github.io/blog/ssh-key-bitbucket-github/
http://futuremix.org/2005/10/openssh-config-permission
RSpecのany_instance deprecation修正方法

# はじめに
RSpec3でany_instance.stubを含むテスト実行時に、以下のdeprecateメッセージが表示された。
メッセージを表示させない方法が見つけにくかったのでメモしておく。
初学者（自分）は、エラーメッセージで検索できないと対応が難しい。
```
Using `any_instance` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated. Use the new `:expect` syntax or explicitly enable `:should` instead.
```

# 環境
|モジュール|バージョン|
|:---|:---|
|ruby|ruby 2.1.2p95|
|rails|Rails 4.1.1|
|rspec|3.0.4|
# 修正方法
allow_any_instance_ofを使う。
ClassNameは適当に置き換えてください。
## 修正前
```rb
      # ClassName.any_instance.stub(:save).and_return(false)

```
## 修正後
```rb
      allow_any_instance_of(ClassName).to receive(:save).and_return(false)
```
# 参考
[RSpec any_instance deprecation: how to fix it?](http://stackoverflow.com/questions/24595203/rspec-any-instance-deprecation-how-to-fix-it)
ひとりTDDBC（LRUCache）

# これは何？

TDDBCというイベントがあります。

- 何かを作るお題がある（制限時間あり）
- それをTDDでペアプログラミングする
- それぞれのペアの、テストとプロダクションコードをレビューし合う

というとても楽しいイベントですが、
これは、そのTDDBCをひとりでやってみるものです。

# お題

*LRUCache*

[t_wadaさんのTDDBCお題スライド P.5](http://www.slideshare.net/t_wada/tddbc-exercise)

# 進め方

開発はGithubのリポジトリでやります。

@t_wadaさんのTDDBCのお題は、最初に簡単な仕様が示され 
それが終わると、次に仕様変更が待っているという流れになっているので 
仕様変更の単位でIssueとbranchを切っていきます。

# レビュー

とりあえず、最初の仕様を満たすものができました。
https://github.com/haazime/tddbc_lru_cache/tree/feature/basic

## インタフェース

```rb
# 大きさ2でLRUCacheを生成する
cache = LRUCache.new(2)

# データを入れる
cache[:x] = :xray
cache[:y] = :yankee
cache[:z] = :zulu

# データを取り出す
cache[:z] #=> :zulu

# サイズ2なので最も使われていない（最初に入れられた）:xは消える
cache[:x] #=> nil

# キャッシュの内容をHashにする
cache.to_hash
# => 
{
  y: :yankee,
  z: :zulu
}
```

## テスト

```rb
RSpec.describe LRUCache do
  context 'サイズが2の時' do
    let(:cache) { LRUCache.new(2) }

    it ':aが消える' do
      cache[:a] = 'alpha'
      cache[:b] = 'bravo'
      cache[:c] = 'charlie'
      expect(cache.to_hash).to match(
        b: 'bravo',
        c: 'charlie',
      )
    end

    it ':bが消える' do
      cache[:a] = 'alpha'
      cache[:b] = 'bravo'
      cache[:a]
      cache[:c] = 'charlie'
      expect(cache.to_hash).to match(
        a: 'alpha',
        c: 'charlie',
      )
    end
  end
end
```

テストの構造は、状況ごとに細かく```context```を作り、```before```で
その状況をセットアップするような構造が好みなのですが
今回はネストが深くなりそうだったので、```it```ブロックの中で
コンテキストを作りつつ、検証もするようにしてみました。

また、```LRUCache#to_hash```を使って、

- データが消えていること
- 消えてなかったデータはそのままになっていること

を同時に検証しています。

マッチャーは```match```を使っていますが、今考えると```eq```でよかったかもしれません。

## プロダクションコード

```rb
def initialize(capacity)
  @capacity = capacity
  @container = {}
  @stored_key_order = []
end
```

キャッシュデータは、そのキーと値を```@container```にそのまま```Hash```で持ちます。

最も使われていないデータのキー（サイズを超えた時にどのデータを消すか）を決めるために
```@stored_key_order```に```Array```で持ちます。

```rb
def []=(key, value)
  @container[key] = value
  @stored_key_order << key
  if @stored_key_order.size > @capacity
    @container.delete(@stored_key_order.shift)
  end
end
```


データが入れられた時、キャッシュサイズを超えている場合は
```@stored_key_order```の先頭にあるキーを```@container```から削除します。


```rb
def [](key)
  @stored_key_order.delete(key)
  @stored_key_order << key
  @container[key]
end
```


最近取り出されたデータのキーは、```@stored_key_order```の末尾に移動します。


```@stored_key_order``` という名前は、データを入れた時のキーの順序という意図でしたが、
実際の役割は 
次にキャッシュサイズを超えた時に消されるキーの優先順位
になっているので、それにふさわしい名前に変えたほうがよさそうです。

# つづく

[ひとりTDDBC（LRUCache）仕様変更その1](http://qiita.com/haazime/items/769e86bf81a9709f9c6a)
Device Mode ＆ Mobile Emulation


[Device Mode & Mobile Emulation - Google Chrome](https://developer.chrome.com/devtools/docs/device-mode)
こんなんあったわ。知らんかった。

![スクリーンショット 2014-09-07 9.07.13.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3984b9ca-b2c5-b8b5-a805-6600888891a1.png "スクリーンショット 2014-09-07 9.07.13.png")

ガラケーには対応していない。
[Fire Mobile Simulator](https://chrome.google.com/webstore/detail/firemobilesimulator-for-g/mkihbloiacgiofaejgagokalpeflnmbe)を使えばいいのかな。
円の中心までベジェ曲線を引くときに円との交点に矢印終端を配置するサンプル

# はじめに
[SVG - 円の中心までベジェ曲線を引くときに終端の矢印を円の外周に置いたがイマイチなサンプル - Qiita]( http://qiita.com/hnakamur/items/ba9fe9a5a698045c7519 )を改善したサンプルを作りました。

今度はきちんとベジェ曲線と円との交点に矢印終端を配置するようにしました。交点の計算は[JavaScript - 2つの曲線（3次、2次ベジェ曲線、直線と楕円弧）の交点を分割方式で求める - Qiita]( http://qiita.com/hnakamur/items/8564d1404767f1284399 )に書いた方法を使っています。

交点を求めたあとは、de Casteljau's algorithmを使って始点から交点までで分割したベジェ曲線を新たにSVGで描画してmarker-end属性で矢尻を設定しています。

de Casteljau's algorithmについては下記を参照しました。

- [de Casteljau's algorithm | A Primer on Bézier Curves]( http://pomax.github.io/bezierinfo/#decasteljau )
- [Computer Aided Geometric Design - Dr. Thomas W. Sederberg (PDF, 12.1MB)](http://tom.cs.byu.edu/~557/text/cagd.pdf)のp.20 "2.3 The de Casteljau Algorithm"

# デモ
デモ： http://bl.ocks.org/hnakamur/b8af8ae9007674d18b2b
ソース： https://github.com/hnakamur/d3.js-drag-bezier-curves-example/tree/bezier_arrowhead_at_intersection_to_circle

# スクリーンショット

[SVG - 円の中心までベジェ曲線を引くときに終端の矢印を円の外周に置いたがイマイチなサンプル - Qiita]( http://qiita.com/hnakamur/items/ba9fe9a5a698045c7519 )で試した3パターンの配置のスクリーンショットを貼っておきます。

![arrowhead_at_intersection-00.png](https://qiita-image-store.s3.amazonaws.com/0/3227/067eac96-4cb6-1508-f03a-9376471626e0.png)

![arrowhead_at_intersection-02.png](https://qiita-image-store.s3.amazonaws.com/0/3227/bb186cb5-28f0-7068-87dc-61667849f942.png)

![arrowhead_at_intersection-03.png](https://qiita-image-store.s3.amazonaws.com/0/3227/04d7a051-1759-ff29-dfe2-5dd7bb8acd37.png)

いい感じです。ただ、最後の例は円の中心に向いていないので、こういう配置は避けるほうが良いと思いました。

更に良くない配置の例を示します。
![arrowhead_at_intersection-04.png](https://qiita-image-store.s3.amazonaws.com/0/3227/0b5f8996-a9fc-09d6-d240-f0440df1bad6.png)

これを見て、まず、矢尻に真ん中の線は含めないほうが良いということがわかりました。ただ、その対応をしたとしてもベジェ曲線の回りこみが激しいので、矢尻の両側の線と干渉してしまい、見た目がイマイチです。ということで、こういう配置も避けるべきだと思います。
Macのfindでhidden fileを除いて検索する方法

Macのfindコマンド（BSD版）でドットファイルとドットディレクトリを除いて検索する方法。

```bash:command
find . -type d -name  '.*' -prune -or -not -name '.*' 
```

```-not name '.*'```だけだとドットディレクトリ内にあるドットファイルじゃないファイルに引っかかるので、ドットディレクトリ内に入らないように```-type d -name '.*' -prune```とする必要がある。
fuelPHPでURLエンコードしたパラメータをpost もしくは getしたい場合


かなりてこずりました。
とりあえず、

jQueryのajaxメソッドにdataパラメータとして渡すgetでなく、URL直打ち (?param=hoge) の方法でajaxを叩き、
サーバー側では Input::get('param')
として取得する方法にすればなんとかとれた。
InfratasterでMySQLのテストをする時のパスワードの扱い

チップスと言うよりは相談です。みなさんどうやっているのか、いい方法があったらぜひ教えてください。

---

[Infrataster][infrataster]で`mysql.user`テーブルの内容（要はユーザーの存在やアクセス元ホストの許可状況）のテストをする時、今はMySQLの`root`ユーザーでアクセスしています。そうすると、アクセス時のパスワードは直接リポジトリーに入れたくないので、たまたま構築に[knife-solo][knife-solo]を使っていることもあって、[knife-solo_data_bag][knife-solo_data_bag]のEncrypted Data Bagの機能を使って管理しています。

[knife-solo_data_bag][knife-solo_data_bag]では、秘密情報を暗号化して保存することができて、こんなふうにして復号します：

    $ knife solo data bag show mysql root --secret-file=./data_bag_key

ご想像の通り「data_bag_key」というファイルに鍵を保存して、それを使って復号するようになっています（だからこのファイルはリポジトリーに入れていません）。で、これは鍵のファイルだから、と`root:root`、`0600`で保存しています。だから、実は、上のコマンドはこんなふうにして実行しています：

    $ sudo knife solo data bag show mysql root --secret-file=./data_bag_key

で、ようやく本題なんですが、`root`でMySQLに接続するということはパスワードが必要で、そのためには上の鍵ファイルを読み取らなくてはいけません。そんなわけで、`spec_helper.rb`にこう書いています。

```spec_helper.rb
require 'json'
require 'infrataster/rspec'
require 'infrataster-plugin-mysql'

mysql_config = JSON.parse(`sudo knife solo data bag show mysql root --secret-file=./data_bag_key -F json`)

Infrataster::Server.define(
  :db,
  '192.168.33.10',
  mysql: {user: 'root', password: mysql_config['password']},
  vagrant: true
)
```

やってみれば、やらなくてもちゃんと読めばすぐ分かりますが、テストの度に`sudo`のパスワードを入力しなくてはいけません。

そこの面倒臭さを除けばまあ機能してはいるんですが、みなさんはこの辺どうしているんでしょう？　やっぱり環境変数？

[infrataster]: http://infrataster.net/
[knife-solo]: http://matschaffer.github.io/knife-solo/
[knife-solo_data_bag]: http://thbishop.com/knife-solo_data_bag/
PhalconのDbAdapterにchareset=utf8を渡す（MySQL）

PHP 5.3.7以上では、PDOで、以下のような形で文字コード設定を行えます。

```php
$con = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'dbuser', 'password');
```

PhalconのDbAdapterで同じことをやりたい場合、以下のように書きます。

```php
$db = new Phalcon\Db\Adapter\Pdo\Mysql([
    'dsn'      => 'mysql:host=localhost;dbname=test;charset=utf8',
    'username' => 'dbuser',
    'password' => 'password',
]);
```

又は

```php
$db = new Phalcon\Db\Adapter\Pdo\Mysql([
    'host'     => 'localhost',
    'username' => 'dbuser',
    'password' => 'password',
    'dbname'   => 'test',
    'charset'  => 'utf8',
]);
```

内部では、hostやcharsetをdsnとして組み立てて、PDOのコンストラクタに渡してます。したがって、どちらの書き方をしても結果は同じです。
2つの曲線(3次、2次ベジェ曲線、直線と楕円弧)の交点を分割方式で求める

# 多次元方程式を解いて交点を求める方式は不安定

[JavaScript - kld-intersectionsを使って2つのベジェ曲線の交点を求めてみた - Qiita]( http://qiita.com/hnakamur/items/4cd5d25ff4019cfa1a1e )では、[kld-intersections]( https://www.npmjs.org/package/kld-intersections )と[kld-polynomial]( https://www.npmjs.org/package/kld-polynomial )を使って2つの曲線の交点を多次元方程式の解を求める方式を使いましたが、あるべき交点を見落とすケースがありました。

その後、自分でも[Durand–Kerner法]( http://en.wikipedia.org/wiki/Durand%E2%80%93Kerner_method )を使って[多次元方程式の解を求める方式を試してみた](https://github.com/hnakamur/d3.js-drag-bezier-curves-example/tree/314f6c637d8caf7b3cb5a38d69f73cb3c4564ffb)のですが、さらに見落としが増えてしまうという残念な結果になりました。

[Computer Aided Geometric Design - Dr. Thomas W. Sederberg (PDF, 12.1MB)](http://tom.cs.byu.edu/~557/text/cagd.pdf)を読むとm次曲線とn次曲線の交点は無限遠点と複素数座標も含めるとmn個あるという話が書いてあります。このうちの実数の解で曲線パラメータtが0と1の間にあるものが求める交点というわけです。

が、実装してみると誤差が大きくてうまく行きませんでした。多次元方程式を数値計算で解くアルゴリズムは多数あるので、極めれば行けるかもしれませんが、曲線を分割する方式を試すことにしました。

# 曲線を分割して交点を求める方式のほうが安定

## デモ

[An example of drawing intersections of a cubic bezier curve and an elliptic arc]( http://bl.ocks.org/hnakamur/7dfb57d5f299255cf59a )

3次ベジェ曲線と楕円弧の交点を求めて表示するデモです。
交点は青い丸で表示しています。
3次曲線の制御点はドラッグで移動可能です。

## 今回の実装についてのメモ

### 曲線の分割方式

曲線を分割して交点を求める方式にもBezier Clippingなどいろいろあるようなのですが、今回はシンプルな方法を選びました。

[Computer Aided Geometric Design - Dr. Thomas W. Sederberg (PDF, 12.1MB)](http://tom.cs.byu.edu/~557/text/cagd.pdf)の"7.6 Interval subdivision"の"Figure 7.3: Interval preprocess and subdivision"のように、最初はX軸かY軸に平行な点で分割します。

X軸とY軸に平行なバウンディングボックスを求めて相手の曲線を分割したセグメントのバウンディングボックスと重ならないものは除外し、重なるものは曲線パラメータtを半分の点で分割します。

これを繰り返して曲線のセグメントが十分直線に近くなったら、2つの曲線のセグメントを2つの直線と近似して交点を求める、という方法です。

本来は十分直線に近くなったらというのを計算で判定すべきところですが、今回の実装では判定をサボって、分割を一定回数繰り返したら直線で近似しています。
具体的には、最初にX軸Y軸に平行な点で分割した後、2分割を5回繰り返し、つまり32分割したら直線として近似しています。

### SVGの楕円弧のパラメータ指定から中心と開始角度と終了角度を求める方式

SVGでは楕円弧は中心の座標は指定しないで
[8.3.8 The elliptical arc curve commands]( http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands )のようにパラメータを指定するようになっています。これはパスを書く処理を現在位置から目標位置まで曲線を書くという方式に揃えたいからのようです。

ですが、曲線の交点を求めるためには中心の座標も知りたいところです。[Implementation Requirements – SVG 1.1 (Second Edition)]( http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes )にアルゴリズムの説明があるのですが、[StackOverflowで見つけたコメント](http://stackoverflow.com/questions/9017100/calculate-center-of-svg-arc#comment22550259_12329083)によると一部動かない場合があるので
http://svn.apache.org/repos/asf/xmlgraphics/batik/branches/svg11/sources/org/apache/batik/ext/awt/geom/ExtendedGeneralPath.java を参照したほうが良いとのことでした。このファイルの `computeArc` を移植して楕円弧上の点を計算するようにしました。

# 今後の課題

上記の曲線分割方式で交点を求めるのは幾何学的に解釈できるので非常にわかりやすいので良かったです。ただ、曲線が接する場合は、分割した直線が交わるのではなく重なることになると思うので、その場合をどうするかが課題です。現状は接する場合は交点として検出していないです。
テーブルセルを開いたり閉じたりするUIを作る


iOS7のカレンダーは、Eventを入力するとき開始時間等Cellをタップすると、Cellがパカっと開くようになっている。あんな感じのUIを作る方法をご紹介。ストーリーボードとちょっとしたコードだけで簡単に実装できますよ。

##ストーリボードの事前準備
1.TableViewControllerをストーリーボードに貼り、スタティックなCellのモードにする。
2.任意Cellをオブジェクトブラウザから貼り付けたものに変えることで（ContentView付き）中に色々な部品（Pickerとか）を貼れるようになる。
3.Cellに貼った中身はHiddenにしておき、コードによって開いた時だけ表示するように変更する。

##コードを書く
CellにはIDかTagをつけるかして、個別にCellを認識できるようにするか、スタティックなCellの順番で固定的に動作するようなコードを追加。
tableView:didSelectedIndexPath:内でcellForRowAtIndexPath:でテーブルセルを引っ張ってくるようなコードは気をつけたほうがいいかも。
cellを基本にしてあまり変な加工すると落ちる。インデックスパスで扱ってるうちは軽いのだが…

##コードサンプル
以下のサンプルは、ストーリーボードに３つのスタティックセルと、アウトレット接続したピッカービューがあると動作する。

```source.m
#define OPEN_CELL_PATH  1
#define END_INDEX_PATH  2
#define COLUMNS_HEIGHT_NORMAL 50
#define COLUMNS_HEIGHT_OPENED COLUMNS_HEIGHT_NORMAL + COLUMNS_HEIGHT_OPEN_MARGIN
#define COLUMNS_HEIGHT_OPEN_MARGIN  192

@interface TATableViewController ()
<UITableViewDelegate>
{
    BOOL _rowOpenPath;
}
@property (weak, nonatomic) IBOutlet UIPickerView *rangePickerView;
@end

@implementation TATableViewController


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section
{
    return 3;
}

- (CGFloat)tableView:(UITableView *)tableView
 heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.row) {
        case 0:
            break;
        case OPEN_CELL_PATH:
            if(_rowOpenPath){return COLUMNS_HEIGHT_OPENED;}
            return COLUMNS_HEIGHT_NORMAL;
        case END_INDEX_PATH:
            break;
    }
    return COLUMNS_HEIGHT_NORMAL;
}

- (void)tableView:(UITableView *)tableView
 didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView beginUpdates];     //Update 開始
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    if (indexPath.row == OPEN_CELL_PATH)
    {
        if (_rowOpenPath == NO)
        {   //open
            _rowOpenPath = YES;
            self.rangePickerView.hidden = NO;
            NSIndexPath* last = [NSIndexPath indexPathForRow:END_INDEX_PATH
                                                   inSection:0];
            [tableView scrollToRowAtIndexPath:last
                             atScrollPosition:UITableViewScrollPositionBottom
                                     animated:YES];
            
        }
        else
        {   //close
            _rowOpenPath = NO;
            self.rangePickerView.hidden = YES;
        }
    }
    [tableView endUpdates];
}
@end
```
CocoaPodsを削除してみたメモ


あんまりないかと思いますがプロジェクトにCocoaPodsをいったん入れてみたけどがやっぱ元に戻そうというときの手順です。

### 関連ファイルを削除 
下記画像の選択してあるファイル削除します。

![スクリーンショット 2014-09-07 1.34.38.png](https://qiita-image-store.s3.amazonaws.com/0/8868/26736e61-f6de-83c1-5d35-e58248fef2dd.png "スクリーンショット 2014-09-07 1.34.38.png")

### スクリプト等を削除
プロジェクトを開いて矢印の４つ削除します。

![スクリーンショット_2014-09-07_1_40_22.png](https://qiita-image-store.s3.amazonaws.com/0/8868/c2fbf55a-388b-0835-21f1-e8fa9d6d6b74.png "スクリーンショット_2014-09-07_1_40_22.png")

以上。

※一応ビルドが通って普通に動いただけなので足りない手順があったら教えてくださいm(_ _)m
コマンドライン上で文字の見えないパスワード入力を実現する

## 関数・バッチファイル定義

以下のように関数を定義します。

```php:
function prompt($message = 'prompt: ', $hidden = false) {
    if (PHP_SAPI !== 'cli') {
        return false;
    }
    echo $message;
    $ret = 
        $hidden
        ? exec(
            PHP_OS === 'WINNT' || PHP_OS === 'WIN32'
            ? __DIR__ . '\prompt_win.bat'
            : 'read -s PW; echo $PW'
        )
        : rtrim(fgets(STDIN), PHP_EOL)
    ;
    if ($hidden) {
        echo PHP_EOL;
    }
    return $ret;
}
```

Windowsに対応する場合、以下のファイルを、関数を定義したファイルと同じ階層に設置してください。

```bat:prompt_win.bat
SetLocal DisableDelayedExpansion
Set "Line="
For /F %%# In ('"Prompt;$H & For %%# in (1) Do Rem"') Do (
    Set "BS=%%#"
)

:loop_start
    Set "Key="
    For /F "delims=" %%# In ('Xcopy /L /W "%~f0" "%~f0" 2^>Nul') Do (
        If Not Defined Key (
            Set "Key=%%#"
        )
    )
    Set "Key=%Key:~-1%"
    SetLocal EnableDelayedExpansion
    If Not Defined Key (
        Goto :loop_end
    )
    If %BS%==^%Key% (
        Set "Key="
        If Defined Line (
            Set "Line=!Line:~0,-1!"
        )
    )
    If Not Defined Line (
        EndLocal
        Set "Line=%Key%"
    ) Else (
        For /F "delims=" %%# In ("!Line!") Do (
            EndLocal
            Set "Line=%%#%Key%"
        )
    )
    Goto :loop_start
:loop_end

Echo;!Line!
```

## 使い方

```php
$id = prompt("ID: ");
$pw = prompt("PW: ", true);
var_dump($id, $pw);
```

#### Windowsでの実行結果

![Windows](https://qiita-image-store.s3.amazonaws.com/0/25060/2171c8e0-fc30-b8eb-b2f9-6706a18afe91.png)

#### Linuxでの実行結果

![ss+(2014-09-07+at+01.47.30).png](https://qiita-image-store.s3.amazonaws.com/0/25060/c47b3189-14c2-766a-4204-96cca2795646.png)
改行コード、空白、改行を無視してdiffを取る


##改行コードを無視する
ファイルの差分を取得できるdiff,便利だけど改行コードの違いも取得してきてしまう時がある.

以下2ファイルを用意
改行コードを表示するため -b オプションを付けバイナリモードで表示

```vim
$ vim -b hoge.html
<html>^M
  <head>^M
    <title>hoge</title>^M
  </head>^M
  <body>^M
  </body>^M
</html>^M
```

```vim
$ vim -b foo.html
<html>
  <head>
    <title>foo</title>
  </head>
  <body>
  </body>
</html>
```

diffを取る

```bash
$ diff foo.html hoge.html 
1,7c1,7
< <html>
<   <head>
<     <title>foo</title>
<   </head>
<   <body>
<   </body>
< </html>
---
> <html>
>   <head>
>     <title>hoge</title>
>   </head>
>   <body>
>   </body>
> </html>
```

本来ならtitleタグの行のみ差分として出力されるべき.
しかし改行コードもdiffの対象となっているため、全行が差分として出力されている.

--strip-trailing-crオプションをつけて実行.

```bash
$ diff --strip-trailing-cr hoge.html foo.html 
3c3
<     <title>hoge</title>
---
>     <title>foo</title>
```

無事,ファイル内容の差分のみ取得できた.

##空白、改行も無視する
以下2ファイルを用意

```bash
$ diff hoge.html foo.html 
1,13c1,7
<     <html>
< 
<       <head>
< 
<         <title>hoge</title>
< 
<       </head>
< 
<       <body>
< 
<       </body>
< 
<     </html>
---
> <html>
>   <head>
>     <title>foo</title>
>   </head>
>   <body>
>   </body>
> </html>
```

以下のオプションを追加($diff helpより抜粋)

```bash
  -w  --ignore-all-space  Ignore all white space.
  -B  --ignore-blank-lines  Ignore changes whose lines are all blank.
```

```bash
$ diff -Bw hoge.html foo.html
4,6c3
< 
<         <title>hoge</title>
< 
---
>     <title>foo</title>
```

hogeの前後一行が取得できているのは謎だが,空白、改行を無視できた