OmniAICreator/Qiita-1.07M huggingface dataset:
指定されたファイルをコピーするプログラムを作ってみた


```ruby:filecopy.c
/*ファイルの読み込み、書き込みを行って、指定されたテキストファイルをコピーするプログラム*/

#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 500

main()
{
	FILE *fp1, *fp2 ;
	char *p ;
	char str[MAX_LENGTH] ;
	char ReadFileName[100] ;
	char WriteFileName[110] ;
	
	printf("\nコピーするファイル名を、半角換算100文字以内で入力してください。\n例：test.txt\n\nファイル名：");
	gets( ReadFileName );
	fp1 = fopen ( ReadFileName , "r") ;
	
	while (fp1 == NULL)
	{
		printf("\n\n\n指定されたファイルは存在しません。存在するファイル名を入力してください。\nファイル名：");
		
		gets( ReadFileName );
		fp1 = fopen ( ReadFileName , "r") ;
	}
	
	strcpy(WriteFileName, "");
	strcat(WriteFileName, "copy_of_");
	strcat(WriteFileName, ReadFileName);
	fp2 = fopen ( WriteFileName , "w");
	
	p = fgets(str, MAX_LENGTH , fp1);
	
	while (p != NULL)
	{
		fprintf(fp2, str);
		p = fgets(str, MAX_LENGTH , fp1);
	}
	
	fclose(fp1);
	fclose(fp2);
	
	printf("\n\n指定されたファイルのコピーが完了しました。\n\n");
	
}

```

動かしてみたら出来たのだが…………

![filecopy.png](https://qiita-image-store.s3.amazonaws.com/0/46217/be1fa4d6-e58a-ef34-b650-7a8eabbd22cb.png)
右：コピー元　左：コピー後

はて？　何故文字が変わってしまうのだろうか…………？
binding-generatorで変換したクラスのメモリ解放をLuaのGCに任せる

C++で作ったクラスをLuaから扱う場合、binding-generatorを使うとGlueCodeの生成が自動化できて便利ですが、何も設定しないとLuaからインスタンス化したC++のオブジェクトが解放されません。

```cpp
class Hoge {
public:
    Hoge(){};
    ~Hoge(){ log("release"); };
};
```
```lua
local hoge = Hoge:new()
hoge = nil
collectgarbage("collect") -- releaseは表示されない
```
これは、cocos2dxで使われるほとんどのクラスが独自のReferenceCountでメモリ管理されており、シーンを切り替えたタイミングやretainしたものをreleaseしたタイミングでメモリが解放されるからだと思われます。

Luaからインスタンス化したクラスをLuaのGCのタイミングで解放するには、binding-generatorに渡す.iniファイルの最後の設定を変更します。

```ini
# Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'.
script_control_cpp = yes
```
コメントにも書かれている通り、script_control_cppをyesにします。これでLuaのGCでメモリが解放されます。

```lua
local hoge = Hoge:new()
hoge = nil
collectgarbage("collect") -- releaseが表示される
```

## リンク
* [【cocos2d-x 3.0】binding-generatorでScript Bindingを自動化する方法](http://qiita.com/giginet/items/6dd0c2e178ec8ef44927)
開発中の PHP7 を Mac でデバッグビルドする

現在、PHP のパフォーマンスを改善するための大改修が行われており、それは PHP7 としてのリリースが進められています。
詳細は以下のページ等を参照してください。

* [PHPNG (next generation)](https://wiki.php.net/phpng)
    * [PHPNG Implementation Details](https://wiki.php.net/phpng-int)
    * [Upgrading PHP extensions from PHP5 to NG](https://wiki.php.net/phpng-upgrading)
* [PHPNG a New Core for PHP7](https://drive.google.com/file/d/0B3UKOMH_4lgBUTdjUGxIZ3l1Ukk/view)
* [PHPNGの動向](http://www.slideshare.net/hnw/phpcon-20141011)
* [PHP7はなぜ速いのか（zval編）](http://d.hatena.ne.jp/hnw/20141207)
* [PHP7はなぜ速いのか](http://www.slideshare.net/hnw/php7)

私も新しい PHP の内部構造に興味を持ったので、まずは手元でビルドしてみることにしました。
(内部構造についての記事も正月休み中に書きたい)

# ソースコードをチェックアウト

PHP7 の開発版は GitHub 上の master ブランチから取得することができます。

というわけで git で clone するのみです。
歴史あるリポジトリなのでそれなりに時間がかかります。

```
$ git clone git@github.com:php/php-src.git
```

# ビルドに必要なツール・ライブラリの用意

## re2c のインストール

Homebrew でインストールします。

```
$ brew install re2c
```

## bison のインストール

これも Homebrew でインストールしたいところですが、PHP のビルドに必要なものより新しいもの (2014/12/29 現在では 3.0.2) が入ってしまいます。
PHP のビルドには 2.7 が必要なので、それをどうにか入れる必要があります。

以下の記事で Homebrew の Formula を用意してくださってました。

* [MacにあたらしめなPHPを簡単便利に入れる方法たくさん](http://uzulla.hateblo.jp/entry/2013/12/29/224058)

記事中の方法にちょっと手を加えて、以下のようにインストールしました。
(`curl` に `-L` を追加)

```
$ curl -L https://raw.github.com/uzulla/homebrew-versions/bison27/bison27.rb > ~/bison27.rb
$ brew install ~/bison27.rb
$ rm ~/bison27.rb
```

# ビルド・インストール

`./configure` 実行時に環境変数として bison 2.7 のパスを指定します。
また、デバッグ用のビルドなので、不要な拡張は一切入れないよう `--disable-all` を指定し、gdb を使うために `--enable-debug` を指定しています。
`--prefix` でインストール先のディレクトリを指定していますが、これは各自好きにしましょう。

```
$ cd php-src
$ ./buildconf
$ YACC=/usr/local/opt/bison27/bin/bison ./configure --disable-all --enable-debug --prefix=$HOME/php7
$ make
$ make install
```

ビルドについてはこの記事を参考にしました。

* [PHPソースコードリーディング入門(とっかかり編)](http://blog.anatoo.jp/entry/20111031/1319991834)

# バージョンの確認

インストールが完了したらバージョンを確認してみましょう。

```
$ ~/php7/bin/php -v
PHP 7.0.0-dev (cli) (built: Dec 29 2014 15:24:09) (DEBUG)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2014 Zend Technologies
```

正常にインストールできたようです。
SwiftでDatePicker付きUITextField

webではよくある「テキストフィールドをクリックすると DatePicker が現れるやつ」
これを Swift で実装してみた

```
import UIKit

public class UIDatePickerTextField: UITextField {

    override public func awakeFromNib() {
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("handleFocused:"), name: UITextFieldTextDidBeginEditingNotification, object: nil)
    }
    
    public func handleFocused(notification: NSNotification!) {
        var datePickerView  : UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePickerMode.Date
        self.inputView = datePickerView
        datePickerView.addTarget(self, action: Selector("handleDatePicker:"), forControlEvents: UIControlEvents.ValueChanged)
    }
    
    public func handleDatePicker(sender: UIDatePicker) {
        var dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "yyyy/MM/dd"
        super.text = dateFormatter.stringFromDate(sender.date)
    }
}
```
fluetnd + MongoDBでExceded maximum insert size of xxxx が出る件について

### 問題
fluentdでMongoDBに入れようとした時に以下のエラーが出た

<pre>
Exceded maximum insert size of 8388608
</pre>

原因はfluentdがチャンクをドバっとMongoDBに書き出すときに、ドキュメント群のサイズが閾値を超えたことが原因。

ここで不思議に思ったのが、MongoDBには書き込むクエリのサイズが16MByteという制限があるが、なぜかエラーメッセージには8MByteという制限が書いてある。

この差は何なのか？

ソースコードを読むと、以下の箇所で問題になっている。

<pre>
 /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/mongo-1.8.6/lib/mongo/collection.rb	
1072     def insert_documents	
（中略）	
1102       if message.size > @connection.max_message_size		
1103         raise InvalidOperation, "Exceded maximum insert size of #{@connection.max_message_size} bytes"	★	
1104       end				
</pre>

つまりこれはMongoDB自体の制限ではなくrubyのMongoDBドライバが算出する`@connection.max_message_size`という値によるもの。(この値はBSONのライブラリあたりに依存している模様）

### 対策

調べていくと、rubyのMongoDBドライバを1.9.0で、この部分のロジックが修正されており、閾値以上のドキュメント群は分割してバッチインサートしてくれるということがわかった。

* JIRA: https://jira.mongodb.org/browse/RUBY-533
* 修正コミット: https://github.com/mongodb/mongo-ruby-driver/commit/f54f10f7e24bd8dfe975b1df832531a0446a22e5

よって、対策は、

**rubyのMongoDBドライバを1.9.0以上に上げる**

でよいだろう。


### 効果の確認
以下再現のコードを rubyのMongoDBドライバ1.9.0未満と1.9.0以上で打ち比べてみるとわかる。前者はエラーになるが後者はすんなり入る。

```rb
require 'mongo'
str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
10.times { str += str }
ary = []
1000.times { ary << {"a" => str} }
con = Mongo::Connection.new
con["test"]["mycol"].insert(ary)
```


### 最後に

以下のブログなどでは「buffer_chunk_limitを調整すること」を対策として挙げられていますが、必要ない気がします。
* http://blog.stanaka.org/entry/2013/02/22/171053
* http://d.hatena.ne.jp/ckreal/20111116/1321455441
Swiftでtextarea

xcodeで開発するiOSのUI部品でテキストエリアに対応するものが見当たらなかったので実装してみた

```
import UIKit

public class UITextArea: UITextView {

    var placeholder: String!
    var placeholderColor: UIColor!
    lazy var placeholderLabel: UILabel = UILabel()
    var tipFontSize: CGFloat = 14

    required public init(coder: NSCoder) {
        super.init(coder: coder)
        self.layer.borderColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.1).CGColor
        self.layer.borderWidth = 0.8
        self.layer.masksToBounds = true
        self.layer.cornerRadius = 8.0
    }
    
    override public func awakeFromNib() {
        super.awakeFromNib()
        if (self.placeholder == nil) {
            self.placeholder = ""
        }
        if (self.placeholderColor == nil) {
            self.placeholderColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.2)
        }
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "textDidChanged:", name: UITextViewTextDidChangeNotification, object: nil)
    }
    
    public func textDidChanged(notification: NSNotification!) {
        
        if self.placeholder!.utf16Count == 0 {
            return
        }
        
        if self.text.utf16Count == 0 {
            self.viewWithTag(999)?.alpha = 1.0
        } else {
            self.viewWithTag(999)?.alpha = 0.0
        }
    }
    
    func setText(text: String) {
        super.text = text
        self.textDidChanged(nil)
    }
    
    override public func drawRect(rect: CGRect) {
        if 0 < self.placeholder!.utf16Count {
            self.placeholderLabel.frame = CGRect(x: 8, y: 6, width: self.bounds.size.width - 16, height: 0)
            self.placeholderLabel.text = self.placeholder
            self.placeholderLabel.tag = 999
            self.placeholderLabel.alpha = 0
            self.placeholderLabel.textColor = self.placeholderColor
            self.placeholderLabel.backgroundColor = UIColor.clearColor()
            self.placeholderLabel.font = UIFont.systemFontOfSize(self.tipFontSize)
            self.placeholderLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
            self.placeholderLabel.numberOfLines = 0
            self.addSubview(self.placeholderLabel)
        }
        self.placeholderLabel.sizeToFit()
        self.sendSubviewToBack(self.placeholderLabel)
        
        if self.text.utf16Count == 0 && 0 < self.placeholder!.utf16Count {
            self.viewWithTag(999)?.alpha = 1.0
        }
        
        super.drawRect(rect)
    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
}
```
OS X Server に I, Librarian 3 をインストール

グループ内でPDFを共有、管理するためのPDFマネージャ [I, Librarian](https://i-librarian.net/) を、OS X Server 10.8 にインストールしてみた。

## 設置まで

1. [ダウンロード](https://i-librarian.net/download.php) のページから、OS X用のパッケージをダウンロード（2014.12.28時点でバージョン3.1）。
2. Webサーバのコンテンツを格納したディレクトリの任意の場所に展開。デフォルトでは  `/Library/Server/Web/Data/Sites/Default/` 以下。トップディレクトリ名も任意のものに変更。
3. chown で、apacheがアクセスできるようにファイルのオーナーを変更。権限はそのままで問題ないはず。（/bin 以下には poppler, ghostscript 等の実行ファイルが含まれているので、これらのファイルには実行権限が必要）

    $ sudo chown -R \_www:\_www _\<I, Librarian をインストールしたディレクトリ\>_

4. php.ini や httpd.conf で、PHP の環境変数を `upload_max_filesize 400M`, `post_max_size 800M` に変更。
5. Pdftk をインストール

    $ brew pull https://github.com/Homebrew/homebrew/pull/25953
    $ brew install pdftk

6. Tesseract OCR をインストール

    $ brew install tesseract

## 初期設定

1. 配置したURLにアクセスすると、ユーザ認証画面になるので、新規ユーザを作成する。最初のユーザは Super User になる。
2. ログインしたら、上方のメニューバーから、[Tools] → [Installation Details] と進み、各要件が [**OK**] と判定されているか確認する。（問題があると [**!!!**] と表記される）
3. `upload_max_filesize`, `post_max_size` は、値によっては推奨値以上を設定していても [**!!!**] となる場合があるようだが、設定できていれば気にしない。


## 付記
* I, Librarian 3.1 では、`robot.txt`を介して、デフォルトですべてのクローラの巡回を拒否している。

## Brewのghostscriptを使う

1. I, Librarian 3.1 内のghostscriptによるPDFからのアイコン（png）作成に不具合が出ることがあったので、brewでインストールした `/usr/local/bin/gs` を使うように変更した。
2. Apache2が `/usr/local/bin/` を見にいくように `PATH` を変更する。 `/System/Library/LaunchDaemons/org.apache.httpd.plist` に `PATH` を追加。

```
　　　　<key>EnvironmentVariables</key>
　　　　<dict>
　　　　　　　　<key>PATH</key>
　　　　　　　　<string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string>
　　　　　　　　:
　　　　　　　　:
　　　　</dict>
```

3. Webサーバを再起動
4. I, Librarian 3.1 の `/functions.php` 665行目からの関数 `select_ghostscript()` を以下のように書き換えた。

```
function select_ghostscript() {

    global $selected_ghostscript;

    $selected_ghostscript = exec('which gs');
    return $selected_ghostscript;
}
```

## Yosemite + Server 4 に更新

* YosemiteのPHPは `imagecreatefrompng()` が使えないため、I, Librarian の  `icon.php` で不具合を起こす。以下の URL などを参考に、HomebrewなどのPHPをインストールし、apacheにそちらを使わせることで解決する。
* http://stackoverflow.com/questions/26493762/yosemite-php-gd-mcrypt-installation/26505558#26505558
* 再起動するごとに、`Library/Server/Web/Config/apache2httpd_server_app.conf` がデフォルトに置き換えられてしまい、OS XのPHPに戻ってしまう！置き換えに使われていると思われる`httpd_server_app.conf.default`も書き換えてみるが、これでいいのかは現在未確認。
Rails4.2で簡単な掲示板を作ってみるテスト

# はじめに

## 簡単な掲示板を作ることにしたので最新を試すことにした。

とりあえずこれに沿ってやる。
http://qiita.com/ms2sato/items/d2bcfe295ceb379ea082

bundle installで下記のエラー！

```:terminal
$ bundle install --path vendor/bundle
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/ms2/.rbenv/versions/2.1.3/bin/ruby extconf.rb 
checking if the C compiler accepts ... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using packaged libraries.
-----
The file "/usr/include/iconv.h" is missing in your build environment,
which means you haven't installed Xcode Command Line Tools properly.

To install Command Line Tools, try running `xcode-select --install` on
terminal and follow the instructions.  If it fails, open Xcode.app,
select from the menu "Xcode" - "Open Developer Tool" - "More Developer
Tools" to open the developer site, download the installer for your OS
version and run it.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/ms2/.rbenv/versions/2.1.3/bin/ruby
	--help
	--clean
	--use-system-libraries
	--enable-static
	--disable-static
	--with-zlib-dir
	--without-zlib-dir
	--with-zlib-include
	--without-zlib-include=${zlib-dir}/include
	--with-zlib-lib
	--without-zlib-lib=${zlib-dir}/lib
	--enable-cross-build
	--disable-cross-build

extconf failed, exit code 1

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

iconv足らないけど？って言われてるっぽい。コメントにそれっぽいことが出ているので下記を試したら「Command Line Tools」をインストールする？って聞かれたのでYES。

```
 $ xcode-select --install
```

あとは問題なく成功。


springが最初から動くようなので`bin/rake`とか`bin/rails`でコマンドを弄れば良いらしい。

```
$ bin/rails g scaffold comment title:string body:text status:integer
$ bin/rake db:migrate
```

でとりあえず簡単なコメント掲示板が完成した。ふーーー、つかれたー（何もしていない）。
オブジェクト・ストレージのユーザーネームとAPI Keyの取得方法

SoftLayerのオブジェクト・ストレージをAPIから利用するためには、ユーザー名とAPI Keyが必要です。これらの情報はSoftLayerのカスタマー・ポータルから、閲覧・取得することができます。

まずは、SoftLayerのカスタマー・ポータルにログインし、トップ画面を表示します。その後、次の画面のようにメニューバーから「**Storage**」 -> 「**Object Storage**」をクリックします。

![Screen Shot 2014-12-29 at 13.26.17.png](https://qiita-image-store.s3.amazonaws.com/0/58050/d1766f0b-fc29-b596-11fb-ae166a4ad9d0.png)

次のような画面が表示されるので、利用するオブジェクト・ストレージをクリックして選択します。ここでは、Dallas 5を選択しました。

![Screen Shot 2014-12-29 at 13.26.39.png](https://qiita-image-store.s3.amazonaws.com/0/58050/94ee59a2-b371-9005-d880-aa749d3277f9.png)

次の画面が表示されるので「**View Credentials**」をクリックします。 

![Screen Shot 2014-12-29 at 13.26.55.png](https://qiita-image-store.s3.amazonaws.com/0/58050/14d19c27-9c00-d166-bcaf-6811ea93a012.png)

次のようにユーザーネームとAPI Keyを閲覧することができます。また、この情報は選択されたオブジェクト・ストレージのみで有効なので注意しましょう(この場合はDallas 5でのみ利用できます)。

![Screen Shot 2014-12-29 at 13.27.14.png](https://qiita-image-store.s3.amazonaws.com/0/58050/41a10b28-94cf-a3c3-6ce6-8c72c428cc10.png)
コレグラフ開発者向けリンク集


以下Pepper/NAO用コレグラフの開発者向けリンク集をまとめています。

ロボット技術系リンク集 / Tech. Links
http://robotstart.co.jp/linkdev.html
ほぼ毎日更新しております。

以下は開発者以外の方に向けたリンク集です。参考まで。

ロボット一般系リンク集 / Links
http://robotstart.co.jp/link.html

他によい情報ありましたらお知らせください。

----------------------
robot start inc.
Scala + Play2 開発環境構築

Scalaの開発環境構築したのでまとめてみました。

環境
OS: MacOS 10.9.5
Scala ver. : 2.11.10
Scala Framework: Play2

* Java, Homebrewはすでに入っているものとします。

<h1>Scalaインストール</h1>

```
$ brew install scala
```

とすると、/usr/local/Cellar/scala/2.11.10 というディレクトリができます。（バージョンはそのときによって異なります）

次にパスの設定をします。

```
$ export SCALA_PATH=/usr/local/Cellar/scala/2.11.0
$ export PATH=$PATH:$SCALA_HOME/bin
```

としてあげて、

```
$ scala -version
```

を入力して

```
Scala code runner version 2.11.0 -- Copyright 2002-2013, LAMP/EPFL
```

と出れば成功です。
これでScala実行環境ができました。
また、

```
$ scala
```

と入力すると対話型コンソールが使用できます。試しにhello worldを出力してみましょう。

```
scala> println("hello world")
hello world
```

```
scala> :quit
```

で抜けることができます。これだけでscala実行環境の確認はできますが、scalaファイルを作成し、コンパイルして、実行してみようと思います。

任意のディレクトリにHelloWorld.scalaというファイルを作成し、以下を記述します。

```
object HelloWorld extends App{
 println("hello world");
}
```

上記ファイルを保存し、

```
$ scalac HelloWorld.scala
```

でコンパイルして実行すると

```
$ scala HelloWorld
hello world
```

と表示されます　^_^

<h1>Playフレームワーク</h1>
scala実行環境ができたのでscalaフレームワークのPlayをインストールしていきます。

Playフレームワークは<a href="https://www.playframework.com/download">ここ</a>でダウンロードします。とりあえず2.2.6を落としてみました。

解凍し、パスを設定します。

```
$ export PLAY_PATH=/path/to/play-2.2.6
$ export PATH=$PATH:$PLAY_PATH
```

これでplayコマンドが使用できます。

```
$ play
Getting com.typesafe.play console_2.10 2.2.6 ...
...
...
```

これでPlayフレームワークのインストールは完了です。


<h1>プロジェクト作成</h1>

プロジェクトを作成するには

```
$ play new プロジェクト名
```

を入力します。作成されたプロジェクトディレクトリに移動し、

```
$ play
```

と入力すると、そのディレクトリにあるプロジェクトが現在使用中のplayプロジェクトとしてセットされます。そして

```
$ run
```

を入力するとローカルサーバが起動します。
ブラウザでhttp://localhost:9000/ にアクセスすると
![スクリーンショット 2014-12-29 12.50.50.png](https://qiita-image-store.s3.amazonaws.com/0/58014/34ceb808-7c4e-e096-60c2-1f47578f44d3.png)

のページに行くことができます。


以上、簡単ではありますが、scalaインストールからPlay導入までのまとめでした。最後までお読みいただきありがとうございました。
【hubot】0からhubot入れてみる


とりあえずローカルで動くところまで。
node.js使ったことなかったので色々入れる。

- nvm
- node.js(npm)
- coffee script
- redis
- hubot

環境：OS X 10.9.5

## nvm

```
$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ sudo vi ~/.bash_profile
```

.bash_profileに記述：

```
#nvm
export NVM_NODEJS_ORG_MIRROR="https://nodejs.org/dist"
source ~/.nvm/nvm.sh
```

再読込：

```
$ source .bash_profile
```

## node.js(npm)

```
$ nvm ls-remote
$ nvm install v0.11.14
$ nvm alias default v0.11.14
```

npmを利用してSocket.io入れる

```
$ npm install socket.io
$ npm ls
```

## coffee script

```
$ npm install -g coffee-script
```

## redis

brewで入れる：

```
$ brew install node redis
```

起動：

```
$ redis-server &
```

## hubot

```
$ npm install -g hubot
```

```
$ hubot --create tars
'hubot --create' is deprecated. Use the yeoman generator instead:
    npm install -g yo generator-hubot
    mkdir -p tars
    yo hubot
See https://github.com/github/hubot/blob/master/docs/README.md for more details on getting started.
```

怒られたのでyeoman generator入れる：

```
$ npm install -g yo generator-hubot
$ mkdir -p tars
$ yo hubot
```

hubot起動：

```
$ bin/hubot
```

### hubotコマンド作成

```
$ cd scripts
$ vim hello.coffee
```

hello.coffeeに記述：

```
module.exports = (robot) ->
    robot.respond /I am (.*)/i, (msg) ->
      msg.send "Hello, world! #{msg.match[1]}"
```

再度起動：

```
$ bin/hubot
Hubot> hubot I am kz56cd
Hello, world! kz56cd
```

----

## 参考

- [Macでhubotを試す最速手順](http://qiita.com/akira-hamada/items/328eaae55680eec7165f)
- [hubot --createで怒られた](http://qiita.com/ky7ieee/items/017307f58bcf829b2355)
実行時に Node.js のバージョンを確認する方法

Node.js 実行時に自分のバージョンが知りたいときがあったりします。
その場合は以下でバージョンを知ることができます。

`````````````````````````
> process.versions.node
'0.10.33'
`````````````````````````

process.versions はそれ以外のいろいろなバージョンがわかります。

````````````````````````
> process.versions
{ http_parser: '1.0',
  node: '0.10.33',
  v8: '3.14.5.9',
  ares: '1.9.0-DEV',
  uv: '0.10.29',
  zlib: '1.2.3',
  modules: '11',
  openssl: '1.0.1j' }
> 
````````````````````````

v8 のバージョンも確認できます。
rbenvでのrubyのバージョン切り替えが上手く行かなくなったのでメモ

## 基本的な管理の仕方

rbenvで調べればいくらでもやり方は載っているので割愛。
うちはmac、homebrewで管理してるので基本的には下記のような管理。

[rbenvでMacにRuby 2.2.0 インストール（オプション指定最新版](http://qiita.com/riocampos/items/0df10dd7956ce9de0ffb)
[brewでインストールしたrbenvをupgradeしてruby2.0.0をインストールする](http://qiita.com/yujiroarai/items/56f40b0a1fecff2cd11c)

## なぜかRuby 2.1.5 は無いよと怒られる

```shell-session:shell
$ brew update
$ brew upgrade ruby-build
```

ruby-buildを最新化して、

```shell-session:shell
$ rbenv install 2.1.5
$ rbenv global 2.1.5
```

としただけ。

```shell-session:shell
rbenv versions
  system
  2.0.0-p598
* 2.1.5 (set by /usr/local/var/rbenv/version)
```

きちんとインストールされて、globalのrubyもセットされる。
だが、利用しているrubyのバージョンを確認しようとすると

```shell-session:shell
$ ruby -v
rbenv: version `2.1.5' is not installed
```

となって怒られる。

# ~/.rbenv を消去したらきちんと認識された

ただしいやり方かは分からないので注意。

```shell-session:shell
$ brew info rbenv
rbenv: stable 0.4.0, HEAD
https://github.com/sstephenson/rbenv
/usr/local/Cellar/rbenv/0.3.0 (32 files, 160K)
/usr/local/Cellar/rbenv/0.4.0 (31 files, 152K) *
  Built from source
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/rbenv.rb
==> Caveats
To use Homebrew's directories rather than ~/.rbenv add to your profile:
  export RBENV_ROOT=/usr/local/var/rbenv

To enable shims and autocompletion add to your profile:
  if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
```

とすると、homebrew が管理する rbenv は /usr/local/var/rbenv にあって、
それ使いたい場合は、RBENV_ROOTの環境変数設定してねと書いてあったので、

```shell-session:.bashrc
$ export RBENV_ROOT=/usr/local/var/rbenv
```

としたのだけれど、どうも~/.rbenv が残っているとそっちを見に行こうとする様だった。
ちなみに、/usr/local/var/rbenv/versions にはちゃんと2.1.5が入っているのだけれど、
~/.rbenv/versions には2.1.5が入っていないようだった。

ひとまず解決はされたのでメモ。
Ruby技術者認定試験Silver version 2.1 90点くらいを狙う方法（ついでにGoldも）

先日、[Ruby技術者認定試験Silver version 2.1](http://www.ruby.or.jp/ja/certification/examination/)を受験して合格してきました。

[Ruby技術者認定試験Silver version 2.1 必勝合格法](http://qiita.com/5t111111/items/9c50013f1a91b7dd702a)を参考に勉強したところ、1週間で90点とれたよ！というお話です。

>おそらく、ここで書いた内容に沿ってしばらく勉強するだけで、普段 Ruby を使っていなくてもプログラミング経験者であれば90点くらいは余裕で狙えるでしょう。

元記事の方に感謝しつつ、今後受ける方のために補足をつらつらと書いていきます。

# 1. :calendar: 受験日を決める :calendar: 
[プロメトリック](http://it.prometric-jp.com/testlist/ruby/index.html)で受験することになるので、5日以上前に申し込む必要があります。
※予約完了メールが来ますが、試験当日に持っていく「確認書」はログインして印刷する必要があるので注意。当日慌てました…。

# 2. :octocat: 勉強する :octocat: 
## :books: 本を読む :books: 
[Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応](http://www.amazon.co.jp/Ruby公式資格教科書-Ruby技術者認定試験-Silver-Gold対応-EXPERT/dp/4774150010/)
1. なんとなく一通り読む。
2. 巻末の模擬試験をやってみる。
3. 間違えた箇所を実際にirbもしくはpryで確認する。
4. 該当箇所の周辺を読み返す。
5. 後日、もう一回やってみる。

[パーフェクトRuby](http://www.amazon.co.jp/パーフェクトRuby-PERFECT-SERIES-6-Rubyサポーターズ/dp/4774158798/)
※試験に受かるだけでなくきちんと勉強したい人向け
1. なんとなく一通り読む。
2. 上記の模擬試験で弱かった箇所は、実際に動かして再度確認する。
Rubyの勉強会にでかけると筆者の方に会えたりします。サインをもらってテンションをあげましょう。
例えば、[Shibuya.rb](http://shibuyarb.doorkeeper.jp/)とか。

## :computer: Minitukuの下記コースを一通りやる :computer: 
[Ruby技術者認定試験（Silver）対策コース](http://www.minituku.net/courses/1049510743/lessons/57884527/drills/775230600?locale=ja)

# 3. :muscle: 補強する :muscle: 
[Ruby 2.1.0 リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.1.0/doc/index.html)
公式リファレンスを眺めつつ、ほぼ同じ動作をするメソッドなどを整理していきます。
Hash#delete_if
Hash#reject!

Hash#each
Hash#each_pair

Hash#has_key?
Hash#include?
Hash#key?
Hash#member?

Enumerable#inject
Enumerable#reduce

などなど

[map と collect、reduce と inject ―― 名前の違いに見る発想の違い](http://magazine.rubyist.net/?0038-MapAndCollect)
試験に直接関係ないですが、読むと知識が深まります。気分転換に。
[第42回　Ruby 2.1の新機能(CTC教育サービスが提供するテクニカルコラム)](http://www.school.ctc-g.co.jp/columns/inst/inst42.html)
差分の勉強用に。
[知って得する！５５のRubyのトリビアな記法](http://melborne.github.io/2013/03/04/ruby-trivias-you-should-know-4/)
気分転換に。

# 4. :tada: 合格しに行く :tada: 
ここまでやっていれば合格するはずです。
あとは気持ちの問題だと思うので、気楽に！

# 5. :rocket: おまけ :rocket: 
そのままの勢いで、[メタプログラミングRuby](http://www.amazon.co.jp/%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Ruby-Paolo-Perrotta/dp/4048687158)を読んでGoldを受けにいくと受かります。受かりました。
現在、javascriptによる、WordPressよりカスタマイズしやすいCMSを作成中

Node.jsでCMSを作成してまーす。
WordPressよりカスタマイズしやすいCMSを作成中です。
どうぞよろしくーー。

この正月の暇つぶしでもいいので、業界情報とか、
skypeでチャットできたらいいなぁと思ってます。
意外と知らない？！Sublime TextのSyntax highlightの色を変える方法


![](https://qiita-image-store.s3.amazonaws.com/0/63640/3c15bea4-7567-553d-6fc9-ba1a34e02810.png "logofix.png")

今回はSublime Text自体の背景色や文字色を変更する方法をご紹介します。
見やすくて自分に合ったカラーを選んで作業効率が高められるといいです(>ω<)

# SublimeText＞Preferences＞Color Scheme＞ 自分の好きなカラーテーマ

![スクリーンショット 2014-12-29 12.08.48.png](https://qiita-image-store.s3.amazonaws.com/0/63640/d94306dc-00ab-28ea-e764-6994e4331afb.png "スクリーンショット 2014-12-29 12.08.48.png")
簡単すぎて、びっくりですね。


# 黒背景が嫌な人におすすめなのは「IDLE」

![スクリーンショット 2014-12-29 12.14.58.png](https://qiita-image-store.s3.amazonaws.com/0/63640/2205c23d-3d78-b170-93df-4784e3f4ae18.png "スクリーンショット 2014-12-29 12.14.58.png")

わたしは大抵、IDLEかAmyを使っています。選んだカラースキームによってあたるSyntax highlight(シンタックスハイライト)も微妙に変わっているので、長めのコードを書いたファイルを開いて色々試してみるのが良いと思います。

# 一覧があればいいのに！
わたしは今、いちいちSublimeText＞Preferences＞Color Scheme＞ 自分の好きなカラーテーマと選んで「これは見ずらい」「これはシンタックスが気に入らない」などと確認してはColor Scheme＞ 自分の好きなカラーテーマと開いたり閉じたりしています。
どなたかColor Schemeのテーマ一覧がのっているようなサイトがあったら教えてください(>o<)
PDP-11のgccクロスコンパイル環境の構築メモ

PDP-11用のgccクロスコンパイラ環境の構築メモ。
結局、必要な情報はツールのURLとビルドオプションだったりするが、
メモ代わりにシェルスクリプトを書く。(注：bashでしか試していない）

スクリプト:
- pkginst.sh
- pkg-binutil.sh
- pkg-gcc.sh
- pkg-gmp.sh
- pkg-mpc.sh
- pkg-mpfr.sh 

####実行手順
1. pkginst.shをPATHの通ったフォルダーに置く
2. 以下の順番に実行

```
　$ pkg-binutil.sh
　$ pkg-gmp.sh
　$ pkg-mpfr.sh
　$ pkg-mpc.sh
　$ pkg-gcc.sh
```

####コード
```sh:pkginst.sh
#!/bin/sh

download(){
	URL=$1
	FILE=`basename $URL`
	if [ ! -e $FILE ] ;then
		curl -O $URL
	fi
	echo $FILE
}
expand(){
	FILE=$1
	case $FILE in
		*\.gz)
			tar xfz $FILE
			;;
		*\.bz2)
			tar xfj $FILE
			;;
	esac
	echo $FILE | sed -e "s/.tar.*//g"
}
mkinst(){
	DIR=$1
	FLGS=$2
	OPTS=$3
	pushd $DIR
	mkdir build; cd build
	echo "configure ..."
	CFLAGS=$FLGS ../configure $OPTS
	echo "make ..."
	make
	sudo make install
	popd
}

FILE=`download $1`
DIR=`expand $FILE`
mkinst $DIR "$2" "$3"
```

```sh:pkg-binutils.sh
#!/bin/sh
pkginst "http://www.ring.gr.jp/archives/GNU/binutils/binutils-2.25.tar.bz2" \
	"-Wno-error=deprecated-declarations" \
	"--target=pdp11-aout --disable-nls --prefix=/usr/local/pdp11-aout"
```

```sh:pkg-gmp.sh
#!/bin/sh
pkginst "http://www.ring.gr.jp/archives/GNU/gmp/gmp-5.1.3.tar.bz2" \
	"" \
	"--prefix=/usr/local/gmp"
```

```sh:pkg-mpfr.sh
#!/bin/sh
pkginst "http://www.ring.gr.jp/archives/GNU/mpfr/mpfr-3.1.2.tar.bz2" \
	"" \
	"--prefix=/usr/local/mpfr --with-gmp=/usr/local/gmp"
```

```sh:pkg-mpc.sh
#!/bin/sh
pkginst "http://ftp.gnu.org/gnu/mpc/mpc-1.0.1" \
	"" \
	"--prefix=/usr/local/mpc --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr"
```

```sh:pkg-gcc.sh
#!/bin/sh
pkginst "http://www.ring.gr.jp/archives/GNU/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2" \
	"" \
	"--target=pdp11-aout \
	--disable-nls \
	--disable-threads \
	--disable-shared \
	--disable-libssp \
	--enable-languages=c \
	--with-gmp=/usr/local/gmp \
	--with-mpfr=/usr/local/mpfr \
	--with-mpc=/usr/local/mpc \
	--prefix=/usr/local/pdp11-aout"
```

以上。

-----
(2020/10/3修正：mpcのダウンロード先変更）
コレグラフボックスライブラリ一覧【tablet】（ver. 2.0.5）


コレグラフボックスライブラリ一覧

Creation Date : 2014/10/14
Last Modified Date : 2014/5/19
 [robot start inc.](http://robotstart.co.jp/ "robot start inc.")

-------------------------------------------------------------------------------
tablet　タブレットを持つ(Pepperのような)ロボット用ボックス群
-------------------------------------------------------------------------------
###▼tablet（タブレット）
##　■Show Image（画像を表示する）
　　- 事前に読み込ませた画像(JPG/PNG/GIF)をディスプレイに表示します。
　　　画像ファイルをhtmlディレクトリを作成した上で、インポート。
　　　パラメータボタンをクリックし、ImageUrlに画像ファイル名を入力
　　　すると表示されます。
　　　（ビヘイビアをディレクトリ外に移動するおまじないが必要です。）

　　　入力：onStart（バン）
　　　　　　onStop（バン）
　　　　　　onHideImage（バン）
　　　　　　onPreLoadImage（バン）

　　　出力：onStopped（バン）

　　　ボックス設定：なし

　　　パラメータ：画像URL

##　■Play Video（動画を再生）
　　- 動画を再生します。
　　　割り込み、一時停止、ビデオを再開ができます。
　　　ビデオが開始または終了するときに、イベントを取得することができます。
　　　（ビヘイビアをディレクトリ外に移動するおまじないが必要です。）

　　　入力：onStart（バン）
　　　　　　onStop（バン）
　　　　　　onPauseVideo（バン）
　　　　　　onResumeVideo（バン）

　　　出力：onStarted（バン）
　　　　　　onStopped（バン）

　　　ボックス設定：なし

　　　パラメータ：動画パス

##　■Touch Detection（タッチの検出）
　　- タブレットがタッチされたときに、イベントを送ります。
　　（パラメータは、変数Actionを [On touch down]にセットします。）

　　　入力：onStart（バン）
　　　　　　onStop（バン）

　　　出力：onTouched（ダイナミック）

　　　ボックス設定：なし

　　　パラメータ：アクション（オンタッチムーブ、ダウン、アップ）

##　■Show App（アプリの表示）
　　- もしアプリが存在している場合、タブレット内のアプリケーションを読み込みます。
　　　そのアプリをwebviewで表示します。

　　　入力：onStart（バン）

　　　出力：onSuccess（バン）
　　　　　　onFailure（バン）

　　　ボックス設定：なし

　　　パラメータ：なし

##　■Show Web View（ウェブの表示）
　　- タブレットでウェブ（HTMLコンテンツ）を表示します。

　　　入力：onStart（バン）

　　　出力：onStopped（バン）

　　　ボックス設定：なし

　　　パラメータ：なし

##　■Hide Web View（ウェブを隠す）
　　- タブレットでウェブ（HTMLコンテンツ）を隠します。

　　　入力：onStart（バン）

　　　出力：onStopped（バン）

　　　ボックス設定：なし

　　　パラメータ：なし

-------------------------------------------------------------------------------
command -h | vim -R - でvimで読めない時の対処

`command -h`でよく調べるのですが出力が多いのでvimで検索することが多い。

```bash:
Xvnc -h 2>&1 | vim -R -
```

もしくは

```bash:
Xvnc -h 2> a.txt
vim a.txt
```

みたいにすればよい。
Dockerコンテナ上でサウンドデバイスを使って音を鳴らしたい

# 前提
- Linux
- ```OSS(Open Sound System)```を使う

#手順

## ホスト上でOSSを有効化する
この辺を参考にしました。
http://hidefumi-h.blog.so-net.ne.jp/2014-05-09

## docker run コマンド実行
- ```/dev/dsp```をマウントする
- デフォルトではデバイスへの書き込みは制限されているようなので、特権モードで起動する

こんなコマンドになる

```shell-session
docker run -it --privileged --volume /dev/dsp:/dev/dsp:rw centos/centos6 /bin/bash
```

## 注意事項
- ```/dev/```ごとマウントするとその他諸々のパーミッションやらが上書きされてホストで色々問題が出るのでやらない方が良い（一回やってしまったｗ）

# まとめ
- Dockerコンテナ上でホストのデバイスを使うことは可能
- 権限周り要注意
- 他のデバイスを使いたいときにも応用できそう
XojoでFinderと同じ文字列照合

XojoでFinderと同じ文字列照合をするメソッドです。

```vbnet

Function FinderCompare(str1 as String, str2 as String) As Integer

  Declare function localizedStandardCompare lib "Cocoa" selector "localizedStandardCompare:" (s1 as CFStringRef, s2 as CFStringRef) as Integer
  
  Return localizedStandardCompare(str1, str2)
  
End Function
```
戻り値は、-1、0、1の3つ。
* str1 < str2 … -1
* str1 = str2 … 0
* str1 > str2 … 1

これを利用して、ListBoxのCompareRowsイベントに以下のように書いておくと、Finderと同等のソートをするようになりますよ。

```vbnet
  result = FinderCompare( me.Cell(row1,column), me.cell(row2,column) )
  
  Return True
```
![FinderSort.png](https://qiita-image-store.s3.amazonaws.com/0/27806/0771366e-622d-65d1-7b5f-bc6bb784e9a7.png)
モバイル利用するMacBook Proのゆる〜いセキュリティ考

#ゆる〜いセキュリティを考える
円安の影響を受ける前に、MacBook Pro (Retina, 13-inch, Mid 2014)（以下、MBP）を購入しています。
当然、モバイル利用をするので、ゆる～くセキュリティをみてみた。
先ずは「システム環境設定」にある「セキュリティとプライバシー」と「App Store」ですね。

##セキュリティとプライバシー
「アップルメニュー」から「システム環境設定」を選択。
「セキュリティとプライバシー」をクリックする。
![スクリーンショット 2014-12-09 21.01.22.png](https://qiita-image-store.s3.amazonaws.com/0/26668/6d2689fe-3124-f185-b1f0-3c3ffcf8f793.png)
中を見てみると…
![スクリーンショット 2014-12-09 21.02.28.png](https://qiita-image-store.s3.amazonaws.com/0/26668/ea4937c6-ce6b-6862-8cb6-6b6eda1bea4a.png)
一般、FireVault、ファイアウォールおよびプライバシーがあります。

###一般
パスワード、スクリーンセーバの設定とダウンロードしたアプリケーションの実行許可を設定できます。

####一般の設定変更
スリープとスクリーンセーバの解除にパスワード要求が5分後からになっています。
モバイルで利用するなら即時に変更して問題ないと思います。
![スクリーンショット 2014-12-09 21.07.32.png](https://qiita-image-store.s3.amazonaws.com/0/26668/3841f0c3-9c5c-d0d0-fcf3-16045e908c72.png)
あとで関連項目のスクリーンセーバの設定もします。

###FireVault
内蔵Diskを暗号化します。
メールなどデータをMBP内に置かれる方は検討しても良いでしょう。
私の場合はメールやデータはクラウド上に置いていて、MBPには暫定的に置く程度なので実施しません。

###ファイアウォール
主に外部からのアクセスを制御します。

####ファイアウォールの設定変更
デフォルトでは”切”になっています。問答無用で”入”に設定して使用しましょう。
![スクリーンショット 2014-12-09 21.04.08.png](https://qiita-image-store.s3.amazonaws.com/0/26668/bc5e6923-299e-609c-34a0-47257b3f9062.png)

###プライバシー
アプリのアクセスを制御します。

##App Store
「アップルメニュー」->「システム環境設定」->「App Store」を選択。
![スクリーンショット 2014-12-29 12.27.56.png](https://qiita-image-store.s3.amazonaws.com/0/26668/af806bbb-dc6b-5773-6fa6-100741df741e.png)
「OS Xアップデートをインストール」のチェックをする。
これでAppleからのアップデートがある程度受けられる格好になる。
![スクリーンショット 2014-12-29 12.28.13.png](https://qiita-image-store.s3.amazonaws.com/0/26668/8881c21e-7ca9-e74c-66f0-5691035dee1f.png)

##簡単な追加事項
「セキュリティとプライバシー」の「一般」で「スリープとスクリーンセーバの解除にパスワード要求」を「すぐに」へ変更しました。
関連する項目の「デスクトップとスクリーンセーバ」で「スクリーンセーバ」の設定も変更しておきましょう。
![スクリーンショット 2014-12-09 21.09.46.png](https://qiita-image-store.s3.amazonaws.com/0/26668/e77a5a3c-b144-0bfc-1fb9-ba1edde60721.png)
デフォルトは20分の設定ですが、外出先で不意に席を外すことを考えると1分程度の設定でも問題ないと思います。
![スクリーンショット 2014-12-09 21.11.10.png](https://qiita-image-store.s3.amazonaws.com/0/26668/0054f319-b299-c15f-1f91-46f6e935c790.png)

##物理セキュリティ
私の場合、普段よりモバイル製品にはプライバシーフィルターを使用しています。
結構重要だと思うのですけど。
![IMG_6832.JPG](https://qiita-image-store.s3.amazonaws.com/0/26668/30814454-ca44-19e9-9ee2-1265ff3cf562.jpeg)
中身はこんな感じです。
![IMG_6831.JPG](https://qiita-image-store.s3.amazonaws.com/0/26668/b16c2b99-e370-357b-371b-cb21a6fb657a.jpeg)
###使用前
![IMG_6826.JPG](https://qiita-image-store.s3.amazonaws.com/0/26668/d377a609-eaa2-36ee-d0b3-9435b0527b26.jpeg)
###使用後
![IMG_6825.JPG](https://qiita-image-store.s3.amazonaws.com/0/26668/416f5bc6-c978-c54f-cc00-fd0272499280.jpeg)
それなりに視線を遮ります。

##その他
今は、フリーで使用できるウイルス対策ソフトClamを使用しています。
そろそろWindowsでも使用しているNorton系を入れようと考えています。

20141229 initial
20150104 App Storeについて追加
cocoapods "pod install" のエラー


Mac OS X Yosemite にアップグレードし、rbenvでruby2.1.5を導入。  
`gem install cocoapods`でpodをインストール。  
`pod install`をすると以下のようなエラーが出た。

```
$ pod install

Analyzing dependencies
/Users/user_name/.rbenv/versions/2.1.5/lib/ruby/2.1.0/pathname.rb:425:in `open': No such file or directory @ dir_initialize - /Users/user_name/.cocoapods/repos (Errno::ENOENT)
	from /Users/user_name/.rbenv/versions/2.1.5/lib/ruby/2.1.0/pathname.rb:425:in `foreach'
	from /Users/user_name/.rbenv/versions/2.1.5/lib/ruby/2.1.0/pathname.rb:425:in `children'
	from /Users/user_name/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/cocoapods-0.35.0/lib/cocoapods/sources_manager.rb:63:in `all'
	from /Users/user_name/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/cocoapods-0.35.0/lib/cocoapods/user_interface/error_report.rb:130:in `repo_information'
	from /Users/user_name/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/cocoapods-0.35.0/lib/cocoapods/user_interface/error_report.rb:34:in `report'
	from /Users/user_name/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/cocoapods-0.35.0/lib/cocoapods/command.rb:58:in `report_error'
	from /Users/user_name/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/claide-0.7.0/lib/claide/command.rb:300:in `handle_exception'
	from /Users/user_name/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/claide-0.7.0/lib/claide/command.rb:274:in `rescue in run'
	from /Users/user_name/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/claide-0.7.0/lib/claide/command.rb:264:in `run'
	from /Users/user_name/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/cocoapods-0.35.0/lib/cocoapods/command.rb:45:in `run'
	from /Users/user_name/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/cocoapods-0.35.0/bin/pod:43:in `<top (required)>'
	from /Users/user_name/.rbenv/versions/2.1.5/bin/pod:23:in `load'
	from /Users/user_name/.rbenv/versions/2.1.5/bin/pod:23:in `<main>'
```

## 解決法
最近の環境では以下のコマンドを使う必要があるようです。
`pod setup`
vimをアップデートすると同時にHomebrew管理に移行する

#あらすじ
##viとvi-improved
Linuxに触りたての頃、cdでディレクトリ移動、lsでフォルダ内を表示、rmで削除、っていう流れで、ファイル編集はviコマンド！と間違えてるような間違えてないような、適当な感じで覚え、.bashrc一つ編集するのに四苦八苦しながら:wq、:q!を覚えたのは懐かしい思い出です。（カーソル移動は矢印キー）

さてようやく最近になってviは古く、実体はvimである、かなりヤバいテキストエディタである、崇拝者が何千人もいる、ということをだんだんと理解してきました。

##7.3
OSにプリインストールされているだけでビルトインではないことを知った僕は、引数なしのvimコマンドを実行し、バージョンが現行より大分古い7.3であることを確認しました。

もっとvimを使いこなし一人前のスーパーハカーになるためにもこのままではいけない。。

#Homebrew
というわけで、Homebrewに上がっているバージョンのvimをインストールし、既存のものからそっちに移行します。

まずは厳かに、

```zsh:Terminal
% brew info vim
vim: stable 7.4.488, HEAD
http://www.vim.org/
Conflicts with: ex-vi
Not installed
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/vim.rb
==> Dependencies ...
```

ふむ。バージョンは7.4.488。。最新版はもう少し上だがまあ許容範囲内でしょう。

えいや。

```zsh:Terminal
% brew install vim --with-lua
==> Installing vim dependency: lua
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/lua-5.2.3_1
######################################################################## 100.0%
==> Pouring lua-5.2.3_1.yosemite.bottle.tar.gz
?  /usr/local/Cellar/lua/5.2.3_1: 13 files, 308K
==> Installing vim
==> Downloading http://ftp.debian.org/debian/pool/main/v/vim/vim_7.4.488.orig.ta
######################################################################## 100.0%
==> Patching
==> ./configure --prefix=/usr/local --mandir=/usr/local/Cellar/vim/7.4.488/share
==> make
==> make install prefix=/usr/local/Cellar/vim/7.4.488 STRIP=true
?  /usr/local/Cellar/vim/7.4.488: 1600 files, 26M, built in 88 seconds
```

無事、インストール完了！

#移行
と銘打ちましたがPATHの設定がちゃんとしていればちゃんと新しいvimが読み込まれ、設定とかhistoryとかも引き継いでくれるはずです。

`echo $PATH | tr ":" "\n"`を実行し

```zsh:Terminal
% echo $PATH | tr ":" "\n"
/usr/local/bin
/usr/bin
/bin
/usr/local/sbin
/usr/sbin
/sbin
/opt/X11/bin
/Users/***/bin
```

このように/usr/local/binが/usr/binよりも上に来ていれば自動的に新しい方のvimが読み込まれます。

もしそうでなかったら各種rcファイルに`export PATH=/usr/local/bin:$PATH`を記述するか、/etc/pathsを編集し並べ替えます。

一旦Terminalを閉じるか、別のウインドウを開いて、vimと入力し、バージョンが変わっていれば成功！

```zsh:Terminal
1 
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                              VIM - Vi IMproved                                
~                                                                               
~                               version 7.4.488                                 
```

やったね！これで新しいvimが使い放題！アップデートも`brew update && brew upgrade`で簡単！
Perl で子プロセスが入力を読めない問題


# 問題

問題は、このスクリプトを実行しても何も出力しないことだ。
なぜ何も出力されないかというと、3行目の ``<>`` で何も読み込まれないから。


```pl
$_ = do { local $/; <> };
if (open(CHLD, '|-') == 0) {
    print <>;
    exit;
}
print CHLD $_;
```


# 考察

## コマンドを実行すると動く

出力する部分を外部コマンドで実行すると問題なく動作する。

```pl
$_ = do { local $/; <> };
if (open(CHLD, '|-') == 0) {
    exec "cat" or warn $!;
    exit;
}
print CHLD $_;
```

## 読み込む場所を変えると動く

fork した後で親プロセスがデータを読み込むように変更してもうまくいく。

```pl
if (open(CHLD, '|-') == 0) {
    print <>;
    exit;
}
$_ = do { local $/; <> };
print CHLD $_;
```
## @_ に読み込めば問題ない

これは不思議なのだが、次のプログラムは問題なく動作する。

```pl
@_ = <>;
if (open(CHLD, '|-') == 0) {
    print <>;
    exit;
}
print CHLD @_;
```

ところが、読み込んだ後で STDIN の状態を調べるとやはり動かなくなってしまう。

```pl
@_ = <>;
warn "eof\n" if eof STDIN;
if (open(CHLD, '|-') == 0) {
    print <>;
    exit;
}
print CHLD @_;
```

## 原因は STDIN の eof フラグが立っていること

問題の原因は、fork した子プロセスが STDIN から読み込もうとした時に eof の状態にあるからだ。

親プロセスが STDIN を最後まで読み込んだことで、STDIN のファイルハンドルに eof フラグが立つ。その後 ``open(CHLD, '|-')`` で fork すると、子プロセスの STDIN はパイプに置き換えられるのだが、どうも eof フラグはそれまでのままになっているようだ。

# 解決策

処理系のバグと言っていいような気もするが、修正を待っても仕方ないので対処方法を考える。

## seek は使えない

まず思いつくのは `seek` を使うことだ。`seek STDIN, 0, 0` すると、ファイルの先頭に入出力ポジションを設定することができる。しかし、パイプに ``seek`` はできないので、この場合はうまくいかない。

## 読んでみる

eof 状態のファイルハンドルから読み込みを行っても何も返ってはこないが、それによって eof フラグは解除される。だから、とりあえず読んであげればよい。

```pl
$_ = do { local $/; <> };
if (open(CHLD, '|-') == 0) {
    <> if eof STDIN;
    print <>;
    exit;
}
print CHLD $_;
```

## fdopen する

上のやり方でも機能的には問題ないのだが、どうも苦し紛れ感が拭えない。

次のようにすると C の fdopen 相当のことができる。そうすることでファイルハンドルが初期化されるようで、無事読み込めるようになる。

```pl
$_ = do { local $/; <> };
if (open(CHLD, '|-') == 0) {
    open STDIN, '<&', 0 if eof STDIN;
    print <>;
    exit;
}
print CHLD $_;
```

## pipe を使う

当たり前かもしれないが、自分で pipe を準備すれば問題なく動作する。
しかし、こういうのが面倒だから用意されている機能のはずなのだが...

```pl
$_ = do { local $/; <> };
pipe PIN, POUT or die;
if (fork == 0) {
    close STDIN;
    open STDIN, '<&PIN';
    close PIN;
    close POUT;
    print <>;
    exit;
}
close PIN;
print POUT $_;
```

# 結論

上の選択肢の中では fdopen 相当のことをやるのが最善だろうか。

ということで [greple][greple] には、[このようなパッチ][1142c4d]を当てることにした。

[greple]:https://github.com/kaz-utashiro/greple
[1142c4d]:https://github.com/kaz-utashiro/greple/commit/1142c4d

なぜこのような修正が必要になったかというと、大量のファイルを検索する時に出力フィルタを設定すると、何も出力しなくてもファイルの数だけプロセスが起動されてしまうからだ。だから、データを読み込んでから子プロセスを作成する必要がある。

greple の `-Mical` というモジュールを使うと、OS X のカレンダーファイルを全部検索することができる。これはイベント毎に別ファイルになっているので、大量のファイルが対象になるのだ。ヒット数が多いと極端に遅くなってしまうが、ヒットしないファイルの処理は速いので、2011年製 MBP で 13000個以上のファイルを検索しても1秒やそこらの実用的な時間で終了する。

# 追記

v5.20.1 では直っていない。
v5.26.0 でも直っていない。
v5.28.0 でも直っていない。
v5.30.3, v5.34.0 でも直ってない。
v5.38.2 でも直っていない。
OCRA OATH Challenge-Response Algorithm

メモ。正しさはもちろん保証されない

# 課題

HOTP的にカウンターをシェアしたくない

HOTPではサーバとクライアントのカウンタがズレると認証できなくなる。一般ユーザで目にするのは「何回もOTPを空撃ちすると役に立たなくなる」という現象。自分はこれが大変嫌いで自分で雑に使う際は時間ベースのTOTPにしたくなる。銀行等で配布されるトークンは耐タンパ性も考えて作りこまれたトークンだが、こういうものはHOTPを採用していて、またボタンにロック機構があるわけでもないのでカウンタのズレが容易に起こる。先日バッグに入れてしばらく置いておいたら振込できなくなった。次の小学生のいたずらはバッグの外にふらふらしているOTPトークンの空打ちかもしれない。

TOTP以外の方法にOCRAがある。これは秘密情報を共有した後、サーバがChallengeを発行してクライアントがそれに基づいたResponseを返して認証するというChallenge-ResponseをOTPに導入したもの。

RFC6287として仕様が記述される。ただしこれはCategoryとしてはInformational。HOTPもそうみたいなんだけど。

# 構成の概要

最初に秘密情報を共有する方法自体については特に規定はないようだ。秘密情報のフォーマットについてとその交換のされ方には規定がある。個人的にメモしときたいところを書く

    OCRA = CryptoFunction(K, DataInput)
    DataInput = {OCRASuit | 00 | C | Q | P | S | T}

* OCRASuite ... レスポンス生成に用いるアルゴリズムを指定する値。後述
* C ... 8バイトカウンタ。認証する側で共有
* Q ... 128バイトのChallenge
* P ... 認証する側が保持するPIN/passwordのハッシュ
* S ... セッション情報を記述する512バイト文字列。UTF-8
* T ... UTCの1970年1月1日からの秒・分・時間によるカウント。timestampっぽいが単位は変えられる

OCRASuiteに応じてCを使うか使わないか、Tの単位は何か、といったことを指定できる。RFC内の一例では"OCRA-1:HOTP-SHA512-8:C-QN08-PSHA1"とある。OCRA version 1を用い、sha512をハッシュ関数として使い、Cも用いた上でそれを8文字の数字に切り詰める、など。

CやPは認証を要求する側が解釈しなければならない(MUST)フィールドで、認証フロー自体に影響を与えるかはOCRASuiteによるようだ。

Sはオプショナルで使う必要はない。ただ、TLSのセッション情報を含めるといった対応でセキュリティを強化するのに使うことが勧められてはいる (Page 18のIC8)

# その他

何らかの形でChallengeをそのクライアントに都度ぶちこむ必要がある。そのChallengeを人に入力させるのはしんどいだろうから、ネットワーク接続なり他の方法で入れることになる。

より安全を期するなら、クライアントはまずそのChallengeを発行した主体自体も認証したい。というわけでRFCには双方向Challenge-Responseの規定もある。このレベルだとネットワーク接続で直接クライアントが秘密を取りに行く、といった方が自然に見えるかもしれない。「てめぇのChallenge解いてやるから俺のChallengeをまず解け」という俺様クライアントを実装することになる。こちらの事例は見たことがまだない。

最終的にユーザが認証を要求した側に送信するものはPINコード数桁で、ここはHOTP等と同じように出来る (数字に切り詰めない方法もある)。

OCRAでは2要素認証はMUST。単に1つのボタンを押せばPINが出ることは許されない。上記のChallenge入力も有り、ハードウェアトークンでの実装は少々難しい印象を受ける。
Deviseでセッションのタイムアウトまでの時間を延ばす方法

## 1. 概要

Deviseのセッションのタイムアウトまでの時間は、デフォルトで30分と、サービスの性質によっては短い場合もある。
ここでは、タイムアウトまでの時間を延ばす方法について示す。

## 2. 動作環境

```
$ bundle exec gem list | grep devise
devise (3.4.1)
```

## 3. 方法

以下の3つの手順がある。

(1) モデルに`devise :timeoutable`を設定する
(2) initializers で `config.timeout_in`を設定する
(3) `flash`の不要なメッセージを削除する

### (1) モデルの設定

DeviseにはTimeoutableというモジュールがある。
以下のように、モデルの設定に`:timeoutable`を追加する。

```rb:app/models/user.rb
class User < ActiveRecord::Base
  devise ..., :timeoutable
end
```

原理としては、最後にアクセスした時間をセッションに記憶しておき、これと2で設定する時間との差分からタイムアウトかどうか判断している。
そのため、マイグレーションを追加する必要はない。

- http://www.rubydoc.info/github/plataformatec/devise/master/Devise/Models/Timeoutable

### (2) initializersの設定

`timeout_in`の値は、標準では30分に設定されている。
この数値を変更することで、タイムアウトまでの時間を延ばすことができる。

```rb:config/initializers/devise.rb
# ==> Configuration for :timeoutable
# The time you want to timeout the user session without activity. After this
# time the user will be asked for credentials again. Default is 30 minutes.
# config.timeout_in = 30.minutes
config.timeout_in = 1.hour
```

### (3) flashの削除

以上まででタイムアウトの時間を延ばすことはできる。
ただ、Deviseの実装の都合上、タイムアウト時に`flash[:timedout] = true`という不要な`flash`が格納されてしまう。

- https://github.com/plataformatec/devise/blob/a93edc72fd9f6cc5839dd74107b215a81c16dc37/lib/devise/failure_app.rb#L94

`flash`を表示している場合、これを削除する必要がある。
（`flash`の表示方法は様々なので、ここでは一例を示す）

```haml:app/views/layouts/_flash.html.haml
- if flash.any?
  - flash.each do |key, value|
    - next if key == 'timedout'
    
    ...
```

## 参考

- https://github.com/plataformatec/devise/issues/1777
- https://github.com/activeadmin/activeadmin/issues/1005
api設計時のページング設計メモ

limitとoffsetが一般的らしい。

>Facebook uses offset and limit
> Twitter uses page and rpp (records per page)
> LinkedIn uses start and count

　
>I recommend limit and offset. It is more common, well understood in leading databases, and easy for developers.


RESTful API Design: can your API give developers just the information they need? | Google Cloud Blog
https://cloud.google.com/blog/products/api-management/restful-api-design-can-your-api-give-developers-just-information-they-need
Lucene Index 考察(2)

##概要
前回はIndexの構成、関連file種別及びその内容を見てみました。
今日は、Solrの様々なコマンド実行時、Index(のsegment)が実際どうように変化するかを見てみましょう。  

##Solrコマンド
今日検証するのはadd,update,atomic updates,delete,rollback,softcommit,optimizeなどのコマンドです。

##検証前準備
* 検証のため、solrconfig.xmlから自動コミット設定(autoCommit,autoSoftCommit)をコメントアウト(無効に)しています。
* Solr各種コマンドのリクエスト発行には、cURL(Client for URLs)のコマンドラインツールを使用します。
* Mac OS X環境で検証していますので、他のOSでは適宜コマンドを変えて頂きたく。

##検証開始
###add command
####まず、1document登録します。
* 登録用XMLファイル test-add1.xml

```
$ cat test-add1.xml
<add>
<doc>
  <field name="id">USD</field>
  <field name="name">One Dollar</field>
  <field name="manu">Bank of America</field>
  <field name="manu_id_s">boa</field>
  <field name="cat">currency</field>
  <field name="cat">USD</field>
  <field name="features">Coins and notes</field>
  <field name="price_c">1,USD</field>
  <field name="inStock">true</field>
</doc>
</add>
```
* dataディレクトリを削除し、solr起動

```
$ rm -Rf $SOLR_HOME/collection1/data
$ java -jar start.jar
```
* add

```
$ curl http://localhost:8983/solr/collection1/update -H "Content-Type: text/xml" --data-binary @test-add1.xml 
```
* dataディレクトリを確認(inode numberを表示)  
segment情報のみで関連ファイルはできていません(commitがまだなので)。

```
$ ls -lRi $SOLR_HOME/collection1/data
total 0
24661705 drwxr-xr-x  5 mingchunzhao  staff  170 12 25 04:26 index
24661709 drwxr-xr-x  3 mingchunzhao  staff  102 12 25 04:31 tlog

/Users/mingchunzhao/study/solr-4.10.2/example/solr/collection1/data/index:
total 16
24661708 -rw-r--r--  1 mingchunzhao  staff  36 12 25 04:26 segments.gen
24661707 -rw-r--r--  1 mingchunzhao  staff  53 12 25 04:26 segments_1
24661706 -rw-r--r--  1 mingchunzhao  staff   0 12 25 04:26 write.lock

/Users/mingchunzhao/study/solr-4.10.2/example/solr/collection1/data/tlog:
total 8
24664242 -rw-r--r--  1 mingchunzhao  staff  205 12 25 04:31 tlog.0000000000000000000
```
* commit

```
$ curl http://localhost:8983/solr/collection1/update?commit=true
```
* dataディレクトリを確認  
commitしたらIndexにデータが反映され、各種ファイルができあがりました(中身は前回みましたので割愛)。

```
$ ls -lRi $SOLR_HOME/collection1/data
total 0
24661705 drwxr-xr-x  15 mingchunzhao  staff  510 12 25 04:40 index
24661709 drwxr-xr-x   3 mingchunzhao  staff  102 12 25 04:31 tlog

/Users/mingchunzhao/study/solr-4.10.2/example/solr/collection1/data/index:
total 96
24665192 -rw-r--r--  1 mingchunzhao  staff   149 12 25 04:40 _0.fdt
24665188 -rw-r--r--  1 mingchunzhao  staff    63 12 25 04:40 _0.fdx
24665184 -rw-r--r--  1 mingchunzhao  staff  1211 12 25 04:40 _0.fnm
24665187 -rw-r--r--  1 mingchunzhao  staff    42 12 25 04:40 _0.nvd
24665190 -rw-r--r--  1 mingchunzhao  staff    81 12 25 04:40 _0.nvm
24665189 -rw-r--r--  1 mingchunzhao  staff   334 12 25 04:40 _0.si
24665185 -rw-r--r--  1 mingchunzhao  staff    83 12 25 04:40 _0_Lucene41_0.doc
24665186 -rw-r--r--  1 mingchunzhao  staff    82 12 25 04:40 _0_Lucene41_0.pos
24665191 -rw-r--r--  1 mingchunzhao  staff   771 12 25 04:40 _0_Lucene41_0.tim
24665193 -rw-r--r--  1 mingchunzhao  staff   375 12 25 04:40 _0_Lucene41_0.tip
24665195 -rw-r--r--  1 mingchunzhao  staff    36 12 25 04:40 segments
SolrEntityProcessorを用いたSolr Index移行(3.x→4.x)

##SolrEntityProcessorとはなに？
DIH(DataImportHandler)の拡張機能であるSolrEntityProcessorは、異なるSolrインスタンスやコア間でデータインポートを行う手段を提供してくれます。  
特にSolr 3.xから4.xへIndexを移行する場合、Indexフォーマットが変わったためIndexファイルをそのままコピーしても使用できませんので、SolrEntityProcessorを使って柔軟なIndexのマイグレーションが可能となります。  
但し、当たり前ですがIndexの移行ですので、移行対象フィールドはスキーマ定義で**stored=true**になっている必要があります(stored=falseはIndexにフィールド値を持たないので)。

###図示はこんな感じ
![image](https://cloud.githubusercontent.com/assets/7663531/5388269/25a36efe-812b-11e4-8d86-bce95bd14e2e.png)

##指定可能なパラメータの中から重要なものをピックアップ
* query：データ取得に使用するクエリで、Solr標準のリクエストパラメータを使用できます。
* rows：毎回のリクエストで取得するドキュメント数です。小さくし過ぎるとデータ取込にその分往復が発生し時間が長引きます、大きくし過ぎると一回のリクエストで大量にデータが処理されメモリ消費やネットワーク負荷が増えます。
* wt：レスポンスデータのフォーマットをjavabinかxmlに指定できます。javabinはバイナリ形式で高速ですが異なるSolrバージョンで互換性が心配でしたが、Solr3.5とSolr4.10.2の間で試したところ問題ありませんでした(データ互換性が気になる方はxmlを指定してください)。
* timeout：クエリのタイムアウト時間を分単位で指定します。データインポートセッションがハングアップ状態に陥りなかなか終わらない場合に役立ちます。

##やってみましょう
ここでは、Solr3.5のIndexをSolr4.10.2へ移行するといったシナリオで説明します。  
* 移行対象フィールドにおいてSolr3.5とSolr4.10.2のスキーマ定義が一致しているかを確認します(stored=trueも)。
* Solr4.10.2側で以下の設定を行います。

 - solrconfig.xmlを編集します。
    
    + DIH関連jarが参照できるように<lib>ディレクティブを指定します。
    
     ```
      <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />
     ```
    + requestHandler /dataimportを設定します。 
    
     ```
     <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
       <lst name="defaults">
         <str name="config">data-config.xml</str>
       </lst>
     </requestHandler>
     ```

 - data-config.xmlを作成します(solrconfig.xmlと同じディレクトリ)。

   ```
   <dataConfig>
     <document>
       <entity name="sep" processor="SolrEntityProcessor" url="http://xxx.xxx.xxx.xxx:8983/solr" query="*:*" rows="1000" timeout="5" wt="xml"/>
     </document>
   </dataConfig>
   ```

* Solr3.5とSolr4.10.2をそれぞれ起動します。
* Solr4.10.2に対し、full-importリクエストを発行します。  
リクエストは直ぐ終わりレスポンスが返されますが、実際importはこれから非同期で実行されます。  
**注意：full-importはIndexを全部削除してからデータを取り込みます。元のIndexデータを残したい場合はdelta-importを使ってください。**  

  ```
  $ curl "http://localhost:8983/solr/dataimport?command=full-import"
  ```
* データインポートが終わったら(終了したかはsolr.logでcommit情報を確認してください)、Solr4.10.2のIndexに登録されたドキュメント数が期待とおりになっているか確認します。

##まとめ
使ってみた感じ、自由にクエリが書けて且つ対象フィールドが指定可能で、一回リクエストの処理量も指定できるなど、使い勝手がよいと思いました。
![te02](https://cloud.githubusercontent.com/assets/7663531/5560221/309efd24-8dbe-11e4-947e-a98df650e243.gif)