OmniAICreator/Qiita-1.07M huggingface dataset:
指定したキーでソートするstd::sort

std::sortの引数を短くしたい。毎回こういうのを書くのはちょっと面倒。

```cpp
std::sort(idols.begin(), idols.end(),
  [](const Idol& lhs, const Idol& rhs){ return lhs.production_id < rhs.production_id; });
```


たいていの場合、ソート範囲はコンテナ全体で、比較するキーの抽出方法は比較演算子の左右で同じ、なので下記のラップ関数sort_byを書いてみた。

```cpp
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

template<
  typename Inputs,
  typename Functor,
  typename T = typename Inputs::value_type>
void sort_by(Inputs& inputs, Functor f) {
  std::sort(std::begin(inputs), std::end(inputs),
    [&f](const T& lhs, const T& rhs){ return f(lhs) < f(rhs); });
}

struct Idol {
  std::string name;
  int production_id;
};

int main() {
  std::vector<Idol> idols = {
    {"Takane", 961},
    {"Kotori", 765},
    {"Mai",    876}
  };

  sort_by(idols, [](const Idol& idol){ return idol.production_id; });

  for (const auto& idol : idols) {
    std::cout << idol.name << std::endl;
  }

  return 0;
}
```

実行結果：[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](http://melpon.org/wandbox/permlink/cG4feXENULXgMiL5)

```
Kotori
Mai
Takane
```
iOS8でABPeoplePickerNavigationControllerの変更点


### 変更点
iOS7まで呼ばれていた以下のデリゲートメッソドが呼ばれなくなった。

```objc
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
 
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
```

iOS8では以下のデリゲートメッソドとプロパティが新しく追加された。

```objc
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
 
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
 
 
@property(nonatomic,copy) NSPredicate *predicateForEnablingPerson
@property(nonatomic,copy) NSPredicate *predicateForSelectionOfPerson
@property(nonatomic,copy) NSPredicate *predicateForSelectionOfProperty

```

### 既存コードの対応方法

１、新しく追加された`peoplePickerNavigationController:didSelectPerson`メッソド内で既存の`peoplePickerNavigationController:shouldContinueAfterSelectingPerson`を呼ぶ。

```objc
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
    [self peoplePickerNavigationController:peoplePicker shouldContinueAfterSelectingPerson:person property:property identifier:identifier];
}
 
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person
{
    [self peoplePickerNavigationController:peoplePicker shouldContinueAfterSelectingPerson:person];
}
```


２、`peoplePickerNavigationController:shouldContinueAfterSelectingPerson`の戻り値で行った制御は新しいプロパティで行う

```objc
peoplePicker.predicateForSelectionOfPerson = [NSPredicate predicateWithFormat:@"%K.@count <= 1", ABPersonPhoneNumbersProperty];

//peoplePicker.predicateForSelectionOfPerson = [NSPredicate predicateWithFormat:@"%K.@count <= 1", ABPersonEmailAddressesProperty];
```

### 問題点

Blockを利用してpredicateを設定するとアプリが終了しちゃう、、、

```objc
peoplePicker.predicateForSelectionOfPerson = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return YES;
}];

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSBlockPredicate cannot be encoded or decoded'
```
Objective-cのランタイムを利用して、isEqualを手軽に作る

Objective-Cのランタイム関数の中には、クラスのメタ情報を取得出来るものがあります。今回は、そいつを利用してプロパティの情報を取得し、オブジェクト同士を比較するisEqualをお手軽に生成します。


```objc
#import <objc/runtime.h>

// クラスの実装

- (BOOL)isEqual:(id)other
{
    if (self == object) {
        return YES;
    }
    if (object == nil || ![object isKindOfClass:[self class]]) {
        return NO;
    }

    // クラス名からメタデータを取得
    const char *className = NSStringFromClass(self.class).UTF8String;
    id clazz = objc_getClass(className);

    // プロパティのリストを取得
    unsigned int count;
    objc_property_t *properties = class_copyPropertyList(clazz, &count);

    for (int i = 0 ; i < count; i++) {
    	//property_getName でプロパティの名前が取れる
        NSString *propertyName = [NSString stringWithUTF8String:property_getName(properties[i])];
        id myProperty = [self valueForKey:propertyName]; //valueForKeyで値を取得
        id otherProperty = [other valueForKey:propertyName];
        // 比較
        if (myProperty == nil && otherProperty == nil) {
            continue;
        }
        if (![myProperty isEqual:otherProperty]) {
            return NO;
        }
    }

    return YES;
}
```


めっちゃ簡単だった。

全部のプロパティで比較をしてしまっているので、場合によっては使えないこともあるかもしれませんが、プロパティの増減があっても耐えられますね。嬉しい。
【GoogleAnalitycs】ガラケーでユニバーサルアナリティクスのページビューカウントを取得する【ガラケー】


```php
$cid = sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
// 32 bits for "time_low"
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
// 16 bits for "time_mid"
mt_rand( 0, 0xffff ),
// 16 bits for "time_hi_and_version",
// four most significant bits holds version number 4
mt_rand( 0, 0x0fff ) | 0x4000,
// 16 bits, 8 bits for "clk_seq_hi_res",
// 8 bits for "clk_seq_low",
// two most significant bits holds zero and one for variant DCE1.1
mt_rand( 0, 0x3fff ) | 0x8000,
// 48 bits for "node"
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
);

$data['v']   = '1';
$data['tid'] = 'UA-xxxxx-x'; // UAのコード
$data['cid'] = $cid;
$data['t']   = 'pageview';
$data['dh']  = $_SERVER['HTTP_HOST'];
$data['dp']  = $_SERVER['REQUEST_URI'];
$data['dt']  = 'PageTitle'; // ページのタイトル


$url = 'http://www.google-analytics.com/collect'; // This is the URL to which we'll be sending the post request.
$content = http_build_query($data); // The body of the post must include exactly 1 URI encoded payload and must be no longer than 8192 bytes. See http_build_query.
$content = utf8_encode($content); // The payload must be UTF-8 encoded.
$user_agent = $_SERVER['HTTP_USER_AGENT']; 

$url  = 'http://www.google-analytics.com/collect';
$url .= '?v='.$data['v'];
$url .= '&tid='.$data['tid'];
$url .= '&cid='.$data['cid'];
$url .= '&t='.$data['t'];
$url .= '&dh='.$data['dh'];
$url .= '&dl='.$data['dl'];
$url .= '&dr='.$data['dr'];
$url .= '&dp='.$data['dp'];
$url .= '&dt='.$data['dt'];

```

で、ページフッターあたりに

```
<img src="<?php echo $url;?>">

```
ファイルを任意サイズで切り出す

バイト数指定すると割と早く処理できる。
バイト数は、less で検索して`=`で表示される結果で調べてる。
tailで`+`指定は推奨されないとか書いてあるけど便利。

### 先頭から指定したSバイト数だけ切り出す

普通の使い方だこれ。`-n`で行数指定の方が簡単。

```
$ head -c S ファイル名 > 切り出し先ファイル名
```

### 先頭から指定したSバイト目以降を切り出す

```
$ tail -c +S ファイル名 > 切り出し先ファイル名
```

### 先頭からSバイト目以降、Nバイトを切り出す

```
$ tail -c +S ファイル名 | head -c N > 切り出し先ファイル名
```

### 参考

[tail - cat line X to line Y on a huge file - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/47407/cat-line-x-to-line-y-on-a-huge-file)
Deep Security as a Serviceって何よ？

日々、犬のエサやりに奮闘するケンイちです。
Deep Security as a Service（以下DSaaS）について今回は勉強していきたいと思います。

---
### DSaaSとは
-
皆さんご存知のトレンドマイクロがクラウド上で提供する、SaaS型のサーバ向けセキュリティサービスです。
つまりDeep SecurityをSaaSにしたものってことだね。
、、、でDeep Security（以下DS）って何よ？
そもそもDSで何が出来るのか等々、理解していないことだらけ、、、
ちゃんとお勉強してみましょう！


### DSとは
-
DSはエージェント型と仮想アプライアンス型によって、物理/仮想/クラウドと、環境にあった対策をしてくれるセキュリティソフトウェア。
管理サーバ（DSマネージャ）を建て、統一したセキュリティポリシーで、保護モジュールを管理することができるみたい。
、、、いまいち良く分からない。このあたりはIT業界3ヶ月目の自分では全てを理解することができないようですね（他人事
分からないままでは良くないので、具体的にどんな機能等があるのか調べてみました！


#### DSの6つの機能
1. ウイルス対策（webレビュテーション機能付き）
2. webアプリケーション保護
3. 侵入検知・防止（ホスト型IDS/IPS）
4. ファイアウォール
5. ファイルやレジストリなどの変更監視
6. セキュリティログ監視

色々な機能があるんですね、、、


#### 対応OS
Windows、Linux、Solaris、、、色々なOSに対応しているみたいです。
これは、DSを導入する上でハードルがグッとさがる要素ですね。しかも、色々なOSに対応しているということは、混在化した環境に対して有効だということですね。


#### DSのいろいろ
DSはサーバセキュリティに必要な機能を全て実装している。
負荷テストにより、高負荷時にもDSによってサーバの稼働に影響がないことが確認されている。
AWS上のシステム保護で、たくさんの実績がある。

なるほど。DSいれておけばサーバセキュリティは安泰なんですね。
で、それをSaaS型として新たに提供したものがDSaaSであると、、、ゴクリ


### まとめ
-
ここで、SaaSのメリットを考えてみましょう。
1. 申し込んだらスグ使える
2. 大きな初期投資がいらない
3. リスク管理、セキュリティなどが強化される
4. 費用を圧縮できる

他にもあるだろ？というツッコミもあるかもしれませんが、主なメリットはこの4つだと思います。

これらを纏めると、DSaaSはDSの多機能且つ高機能なものを、すぐに、費用を抑えて、セキュアに、利用できるということ。これは、非常に魅力的ですね！

また、AMIMOTO AMIのオプションとしてDSaaSが提供されていますし、今後DSaaSの利用は拡大していきそうです。

DSaaS、、、恐るべし
CoffeeScriptだけで簡単に作れるステートマシン

jQueryとJavaScript(CoffeeScript)を使った開発をしていて、ユーザーからの入力のイベント処理とAjaxによる通信のイベント処理がごちゃごちゃになって困ったことはありませんか？

私は最近までよくフラグだらけになる失敗をしました。

このような問題を解決する道具のひとつとしてステートマシンがあります。

CoffeeScriptを使って試行錯誤した結果、短く簡単に作れるようになったので紹介してみたいと思います。

demo_state_machine.coffeeはサンプルのソースコードです。

DemoSMがステートマシンで、アクションのハッシュを引数にして関数として呼び出します。

ステートマシンに対してイベントを送る(sm().ev1(), sm().ev2()などをコールする)と、内部のステートが変わりアクションが実行されます。

デバッグモードも用意してあり、sm.setDebugMode(true)すると、内部のステートの遷移がコンソールに出力されます。

```coffeescript:demo_state_machine.coffee
DemoSM = (actions) ->
  currentState = null
  inTransition = false
  debugMode = false

  setState = (state) ->
    throw 'Recursive call of setState is forbidden' if inTransition
    inTransition = true
    currentState.Exit() if currentState
    currentState = state
    console.log "ENTER STATE: #{state.name()}" if debugMode
    currentState.Entry()
    inTransition = false

  defaultAction = -> null

  class StateBase
    name: -> 'StateBase'
    Entry: defaultAction
    Exit: defaultAction
    ev1: defaultAction
    ev2: defaultAction

  STATE1 = new class extends StateBase
    name: -> 'STATE1'
    Entry: -> actions.onEntry 'STATE1'
    Exit: -> actions.onExit 'STATE1'
    ev1: -> setState STATE2

  STATE2 = new class extends StateBase
    name: -> 'STATE2'
    Entry: -> actions.onEntry 'STATE2'
    Exit: -> actions.onExit 'STATE2'
    ev2: -> setState STATE1

  setState STATE1

  self = -> currentState
  self.setDebugMode = (mode) -> debugMode = mode
  self.isDebugMode = -> debugMode
  self.isInTransition = -> inTransition
  self

sm = DemoSM
  onEntry: (name) -> console.log "#{name}: onEntry"
  onExit: (name) -> console.log "#{name}: onExit"

sm.setDebugMode true
sm().ev1()
sm().ev1()
sm().ev1()
sm().ev2()
sm().ev1()
```

動作の確認は、開発環境を用意しなくてもWeb上から行うことが出来ます。

http://larryng.github.io/coffeescript-repl/

サンプルであげたようなソースコードを定義ファイルから自動生成するツールを作成中なので、もしも需要がありそうなら公開したいと思います。
tmuxショートカットメモ


基本的に自分用メモです。

# tmuxとは？
[こちら](http://d.hatena.ne.jp/eco31/20101126/1290725841)が詳しい（手抜き）。

# キーバインドのプレフィックス
- デフォルトは`<C-b>`
- Screenが`<C-a>`なので、そちらにバインドしてる人の記事をよく見る

# 基本のコマンド
参考サイトは[こちら](http://room6933.com/mymemo/tmux/tmux-basic.html)。
プレフィックスはデフォルトのキーバインドです。

## ウィンドウ操作
|コマンド|アクション|
|:-----:|:-----:|
|C-b c|ウィンドウの新規作成|
|C-b ,|ウィンドウ名を変更|
|C-b w|ウィンドウ一覧表示／移動|
|C-b p|前のウィンドウへ移動|
|C-b n|次のウィンドウへ移動|
|C-b l|最後に移動したウィンドウへ移動|
|C-b ウィンドウ番号|指定したウィンドウへ移動
|C-b &|ウィンドウを強制終了|
|tmux ls|セッションの確認|
|tmux rename -t 0 hoge|セッション名0をhogeに変更|
|C-b Spaceキー|ウィンドウ配置の変更|

## ペイン操作
|ショートカット|アクション|
|:--:|:---:|
|C-b "|ペイン分割（横）|
|C-b %|ペイン分割（縦）|
|C-b !|ペイン分割解除|
|C-b x|ペイン強制終了|
|C-b o|ペイン間移動|
|C-b {|ペイン入れ替え|

## アタッチ、デタッチ
|ショートカット|アクション|
|:--:|:---:|
|C-b d|デタッチ|
|tmux a|最後に作成されたセッションにアタッチ|
|tmux a -t セッション名|指定したセッションにアタッチ|

## コピーモード
|ショートカット|アクション|
|:--:|:---:|
|C-b [|コピーモードに入る|
|Space|コピーの始点を選ぶ|
|Return|コピーの終点を選ぶ（tmuxのバッファにコピーされる）|
|C-b ]|ペースト|
Mac OS X にて、#include <Magick++.h>を含むファイルをg++ XXX.cc -o XXX 的なコンパイルに通す

==============


~~~main.cc
#include <Magick++.h>
#include <iostream>
int main () { return 0; }
~~~

なんですか
----------
これは、とある実験室のUbuntuで動いていたc++プログラムのひとつである。
ImageMagick という、画像を扱うライブラリを使用していた。
これを、Mac OS X のターミナル上で走らせたかった。gcc自体はよく動いていた。

２０１０年の解決と、２０１１年の解決と、２０１３年の解決と、２０１４年の解決がまるで違うので注意。はまりまっくって腰痛い。

決して、includeに強制的に追加するようなことはしてはならない。。。（自戒）

あと海外サイトで、微妙に現時点では解決できない方法であふれているのに注意。

２０１４年１０月初頭時点でのMac OS での解決方法
-----------



### １. http://cactuslab.com/imagemagick/ からインストールをする。

> To simplify the process of installing ImageMagick on Mac OS X, Cactuslab has put together an installer package. The installer puts ImageMagick into /opt/ImageMagick and adds it to your PATH by creating an entry in /etc/paths.d/.

をよく読むこと。

### ２．公式サイトを見る。

見るべき場所は、http://imagemagick.org/script/magick++.php

~~~
$ g++ `Magick++-config --cxxflags --cppflags` -O2 -o demo demo.cpp \
  `Magick++-config --ldflags --libs`
~~~

なら通りますよ、と。まだ通らない模様。

すると PKG_CONFIG_PATH が無いよ的なエラーが出る。ImageMagick.pc があるフォルダを探す。今回は、/opt/lib/pkgconfig にあった。決して/usr/local/以下で無い。よって、、、

### ３．パスを追加する。

~~~.bash_profile

# ★追加
export PKG_CONFIG_PATH="/opt/lib/pkgconfig"

~~~


### ４．コンパイルにはオプションを追加する。

さっきいった通り。

~~~

$ g++ `Magick++-config --cxxflags --cppflags` -O2 -o main main.cc `Magick++-config --ldflags --libs`

~~~
python の sqlite3 で datetime 型を扱う方法

pythonの標準ライブラリ sqlite3 でdatetime型を(擬似的に)扱う方法を紹介します。

SQLite3 にはいわゆる日付型(datetime型)は存在しませんが、
Python側から見るとあたかもSQLiteがdatetime型をもっているかのような振る舞いをさせることができます。

# とりあえずコード
こんなかんじで

```py
import sqlite3
import datetime

# DBを開く。適合関数・変換関数を有効にする。
conn = sqlite3.connect(':memory:', 
detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)

# "TIMESTAMP"コンバータ関数 をそのまま ”DATETIME” にも使う
sqlite3.dbapi2.converters['DATETIME'] = sqlite3.dbapi2.converters['TIMESTAMP']

# カーソル生成
cur = conn.cursor()

# datetimeという型名のカラムを持つテーブルを作成
cur.execute("create table mytable(comment text, updated datetime);"

# datetimeなカラムに、文字列表現 と datetime でそれぞれ投入してみる。
cur.executemany("insert into mytable(comment, updated) value (?,?)",
        [["text_formated.", "2014-01-02 23:45:00"],
        ["datetime_class.", datetime.datetime(2014,3,4, 12,34,56)]])


ret = cur.execute("select * from mytable;")

for row in ret.fetchall():
  print "'%s'" % row[0], row[1], type(row[1])

## こんな↓感じで、datetimeとして宣言したカラムはdatetime型を返してくれる。
# text_formated. 2014-01-02 23:45:00 <type 'datetime.datetime'>
# datetime_class. 2014-03-04 12:34:56 <type 'datetime.datetime'>
```

datetime型に見えるのはPythonから見た時だけで、SQLiteデータベースに格納されている実際のデータ形式は "2014-01-02 23:45:00" や "2014-03-04 12:34:56" という**単なる文字列データ**です。

実はpython標準ライブラリの `sqlite3/dbapi2.py` 内で、「timestamp」というSQL型名をPythonのdatetimeにしてくれる「変換(converter)関数」があらかじめ定義されています。

# 仕組み
この自動変換動作は `sqlite3.connect()` する際に `detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES` と指定すると有効になります。

converter関数のリストは`sqlite3.dbapi2.converters`に入っているので、
`sqlite3.dbapi2.converters['DATETIME'] = sqlite3.dbapi2.converters['TIMESTAMP']` というふうに、既に登録されている型名`TIMESTAMP`用のconverter関数をそのまま`DATETIME`用としても登録します。

上記は datetime.datetime(YYYY,MM,DD,hh,mm,ss)[Python] -> "YYYY-MM-DD hh:mm:ss"[sqlite3] についてしか説明してません。じゃあ上記の逆パターンである "YYYY-MM-DD hh:mm:ss"[sqlite3] -> datetime.datetime(YYYY,MM,DD,hh,mm,ss)[Python] はどこでやってんだ、って話については省略します。ざっくりいうと`datetime`を投げた時にSQLite側に文字列として投入してくれる「適合(adapter)関数」というものが `sqlite3/dbapi2.py` 内であらかじめ定義されています。

詳しいことは、Python標準ライブラリ・リファレンスの [11.13.5.4. デフォルトの適合関数と変換関数 - SQLite](http://docs.python.jp/2/library/sqlite3.html#id7) を読むといいです。
MacOS XでPHPデバッガのCodebugを使う方法

#Codebugとは？
- http://codebugapp.com/
- PHPのデバッガ
- xdebugのリモートデバッグ機能を利用する
- ブレークポイントやステップ実行などが可能
- IDEを利用して無くとも、PHPデバッグがGUIで実行可能

##必要な環境
- MacOS X （ここではOS X Mavericksを前提に進めます）
- PHP（Mavericksにはデフォルトでインストール済み）
- Apache（こちらも同様）
- xdebug Ver.2以上

##xdebugをインストールする
1. ターミナルを開く
2. PECLでxdebugをインストールする
  * `$ sudo pecl install xdebug`

##xdebugをPHPで有効にする
1. 下記を`php.ini`の最終行に追加する（手元の環境では`/etc/php.ini`）

```
zend_extension=/usr/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_port=9000
xdebug.remote_autostart=1
xdebug.remote_connect_back=1
```

2. Apacheを再起動して`php.ini`を有効にする
 - `$ sudo /usr/sbin/apachectl restart`

##Codebugをインストールする
1. http://codebugapp.com/ より、ダウンロードする
2. ダウンロードした`Codebug.dmg`をダブルクリックして開く
3. Codebug本体をアプリケーションへコピーする
![Codebug.png](https://qiita-image-store.s3.amazonaws.com/0/2576/451ef5f3-6c28-091d-844a-4a249ff66359.png)

##テスト用のPHPを設置する
- 設置する場所　`/Library/WebServer/Documents/`
- `test.php`を設置する

```php:test.php
<?php
$a = 100;
$b = array(1,2,3);
xdebug_break();
$c = NULL;
$d = "test";
```

##Codebugを起動する
- Application > Codebug をクリックして起動

##Codebugを設定する
- 左上メニュー Codebug > Preference にて`Listen on Port`に`php.ini`に設定したデバッグポートを設定

![Codebug_Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/2576/17ed91a0-b072-8385-3cb5-f692e905fd66.png)

##Codebugを有効にする
- ウィンドウ右上の電源ボタンをONにする
 
![Codebug_first.png](https://qiita-image-store.s3.amazonaws.com/0/2576/13c2acb1-3b69-c3ee-597c-4b7dddffaed6.png)

##`test.php`にアクセスしてデバッガを体感する
- http://localhost/test.php にアクセスすると、1行目が実行される前でブレークされる
- このまま実行したければ、左上の一番左のボタン（Continue）を押せばそのまま実行される

![Codebug_firstline.png](https://qiita-image-store.s3.amazonaws.com/0/2576/f1b18a0a-a9c6-ec5a-c8e5-ae977666ca61.png)


##ブレークポイントを設定する
- 行番号をクリックすると赤丸が付きブレークポイントが作成される
- Continueボタンを押した後に、ブレークポイント行で処理がストップする
- その時点での変数値等が、下部のインスペクタエリアで確認出来る

##`xebug_break();`を設定する

- `xdebug_break();`をPHP内に設置すると、自動的にその次の行が実行される前にブレークされる


##参考文書
- [Codebugドキュメント](http://codebugapp.com/support/documentation/)
構造体の値を別の構造体の値へコピーする

メモ。

```go
type Src struct {
	Name    string
	Age     uint16
	Address string
}

type Dst struct {
	Name string
	Age  uint16
}
```

例えば上のような2つの構造体があったとして

```go
s := &Src{"A", 12, "Japan"}
d := new(Dst)
copyStruct(s, d)

fmt.Println(*d) // {A, 12}
```

みたいに、必要なフィールドだけ移すための`copyStruct()`関数を考える。

http://play.golang.org/p/0kPRs3vGUa

```go
func copyStruct(src interface{}, dst interface{}) error {
	fv := reflect.ValueOf(src)
 
	ft := fv.Type()
	if fv.Kind() == reflect.Ptr {
		ft = ft.Elem()
		fv = fv.Elem()
	}
 
	tv := reflect.ValueOf(dst)
	if tv.Kind() != reflect.Ptr {
		return fmt.Errorf("[Error] non-pointer: %v", dst)
	}
 
	num := ft.NumField()
	for i := 0; i < num; i++ {
		field := ft.Field(i)
 
		if !field.Anonymous {
			name := field.Name
			srcField := fv.FieldByName(name)
			dstField := tv.Elem().FieldByName(name)
 
			if srcField.IsValid() && dstField.IsValid() {
				if srcField.Type() == dstField.Type() {
					dstField.Set(srcField)
				}
			}
		}
	}
 
	return nil
}
```
プレースホルダーを使って文字列に値を埋め込む

### やりたいこと

[I18n](http://edgeguides.rubyonrails.org/i18n.html) ではプレースホルダーを使った値の埋め込みができます。

``` yaml
ja:
  hidamari:
    explanation: '%{number}号室には%{name}さんが住んでいます。'
```

``` ruby
I18n.t('hidamari.explanation.', { number: 201, name: 'ゆの' })
#=> "201号室にはゆのさんが住んでいます。"
```

これを I18n 無しでも同じようなことができないかなと思いました。

### 結論

[String#%](http://docs.ruby-lang.org/ja/2.1.0/class/String.html#I_--25) もしくは [Kernel.#format (Kernel.#sprintf)](http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/m/sprintf.html) を利用すれば `I18n.t` と同じような使い方が可能です。  
※ String#% は Kernel.#format の糖衣構文です。

``` ruby
'%{number}号室には%{name}さんが住んでいます。' % { number: 201, name: 'ゆの' }
#=> "201号室にはゆのさんが住んでいます。"

'SELECT * FROM girls WHERE age < %{age} AND name LIKE \'%%%{name}%%\'' % { age: 18, name: '杏子' }
#=> "SELECT * FROM girls WHERE age < 18 AND name LIKE '%杏子%'"
```

ちなみに上記の例のように `%` をエスケープしたい場合は、文字列中で `%%` と書けば OK です。
Xcode6のiPhone Simulatorのディレクトリが分かりにくかったけどいいアプリめっけた！

自分のブログからの転載になります。
<a href="http://studio405.hatenablog.jp/entry/2014/10/02/231605">Xcode6のiPhone Simulatorのディレクトリが分かりにくかったけどいいアプリめっけた！</a>


以下、転載


Xcode6でiPhone Simulatorのディレクトリが以下のように変わっていました。
/Users/[User]/Library/Developer/CoreSimulator/Devices/[DeviceID]/data/Containers/Data/Application/[App]

[DeviceID]と[App]は英数字で意味のない文字列なので、見てもまったく分かりません。
基本的にSQLiteのDBファイルのパスを知りたい時だけなので滅多に参照しません。
よって覚えてません！ｗ

Xcode5の時は以下のパスだったので比較的分かりやすかったんですけどね。
/Users/[User]/Library/Application Support/iPhone Simulator/[iOS Version]/Applications/[App]


で、数日前にパスが思い出せないのでググってたところ、いいアプリを見つけました。

<a href="http://kfi-apps.com/apps/simpholders2/">SimPholders2</a>

インストールするとツールバーに常駐するのでそこから操作になります。
このアプリは最近使ったアプリやビルドされたSDKのバージョン毎に分類されています。
参照したいアプリを選べばディレクトリをFinderで開けるようになってます。

![SimPholders2.png](https://qiita-image-store.s3.amazonaws.com/0/2015/37b62244-511d-3c8f-26cc-912e7a9796ab.png)

これで訳の分からん文字列を記憶する必要がなくなりました。
やったね！（そもそも記憶できてないけどｗ）
【初心者向け】Jenkinsをとりあえず入れてみたい！(2)～Jobを作ってみる～

【初心者向け】Jenkinsをとりあえず入れてみたい！(2)～Jobを作ってみる～
です。
前回はJenkinsを導入するとこまでいきました。
今回はとりあえずJobを作ってみます!

### jobを作ってみる！

1.Jenkinsを起動する
[前回の記事](http://qiita.com/chihiro/items/6d5d076e1dda3ec20926)の手順5にもあるようにしてコマンドラインでJenkinsを起動します。

```lang:コマンド
cd jenkins(jenkinsをインストールしたディレクトリに移動する) 
java -jar jenkins.war
```

起動し終わったら

```lang:ブラウザ
http://localhost:8080
```

にアクセスすると、Jenkinsダッシュボードが表示されます。

2．新規作成
左側のメニューから「新規ジョブ作成」を押します。
![jenkins_create_new.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/85b2a6ae-f78d-c750-cb77-13c201a82ae1.jpeg)

すると以下の画面が表示されます。

![jenkins_create_title.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/3019495c-b063-343a-a551-e40a6472762f.jpeg)

「ジョブ名」に作成するジョブの名前を入れます。
今回は「hello jenkins」とします。
ジョブ名の下にいくつかジョブの形式について選択できます。今回は「フリースタイル・プロジェクトのビルド」を選択します。
「OK」ボタンで中身のないジョブが出来上がります。

3．新規作成(中身を作る)
2でOKボタンを押すとジョブの中身を作成する画面が表示されます。

![jenkins_create_detail.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/03d9a465-6d78-86f1-771e-69d8c0b8fbb2.jpeg)

いろいろと設定できるのですが、今回はジョブを作成して動かしてみることが目的なので、必要最低限のさらに必要最低限くらいしか設定しません。
画面をスクロールしていくと、下のほうに「ビルド手順の追加」という項目があります。

![jenkins_create_build.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/62f68ad8-f5dd-9cee-4c26-cedef6bcddab.jpeg)

この中から、「Windowsバッチコマンドの実行」を選択するとテキストボックスが表示されます。(シェルを実行する環境がないのでこれにしました。)
ここに

```lang:Windowsバッチコマンドの実行のテキストボックス
echo "Hello jenkins!"
```

と記入します。
最後に「保存」ボタンをクリックして、ジョブの作成完了です。

4.実行してみる
作成が完了すると、プロジェクト(ジョブ)の画面が表示されます。
左側のメニューに「ビルド実行」という項目があるので、ここをクリックします。

![jenkins_start.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/c1034971-6da7-0310-a81a-ba3130e058a5.jpeg)

これでジョブが実行されました。
「ビルド履歴」に実行状況が表示されます。

5.結果を確認する
ビルド履歴の中の今実行したジョブの右側に「▼」があると思います。
ここをクリックすると、「コンソール」というものがあると思います。

![jenkins_menu.JPG](https://qiita-image-store.s3.amazonaws.com/0/45528/ace52440-c5e0-fb03-1426-0ca1d924bd39.jpeg)

このコンソールをクリックすると実行の結果が表示されます。

ここに、

```lang:コンソール
"Hello jenkins!"
```

とでていると思います。

これでジョブの実行は成功です！

次回はプラグインを入れてみようと思います。
scikit.learn を pip でインストールする

いろいろと紛らわしいパッケージがあるのでメモ

```bash
sudo pip install scikit-learn
```

これを入れると、最新バージョン 0.18.1 が入る。 (2017/01/30 現在)

他にも、 sckits.learn があるが、これだと 0.8.1 が入るので、 API の形式がちょっと違う。
【追記2014/11/14】FB-messengerの特定のユーザーへのURL Scheme【iOS】

swarmというアプリをいじってて思ったことがあったのですが**</br>FBmessengerの特定の人のページにスキーム飛ばしてるやん！**</br>てわけで調べて見ました。

#しかしできないｗｗｗｗ

```NSURL *myURL = [NSURL URLWithString:[NSString stringWithFormat:@"fb-messenger://user/%@",(ユーザーID)];```
```[[UIApplication sharedApplication] openURL:myURL];```

この記述で起動すると...</br>



![image (3).png](https://qiita-image-store.s3.amazonaws.com/0/55608/8f97031c-ac77-9a14-f57a-bdac00cb7be9.png)

とまあこんな感じにidが渡っていません（泣）
あと一息で行けそうなのにもかかわらず行けなくて辛いです...



どなたか解決案をご存じの方がいらっしゃったら教えて下さい。

#追記 2014/11/14
どうやらGraphAPI2.0以降ではアプリ内に独自のFacebookIDが作られてしまい、そのIDをパラメータとしてFB-messengerに渡してもオリジナルのFacebookIDと違うので意味が無いみたいです...残念。
Cocos2d-xでRx.cppを使う


[Rx.cpp](https://rxcpp.codeplex.com/)というC++用のリアクティブプログラミングのライブラリがあります。
Cocos2d-xで[Rx.cpp](https://rxcpp.codeplex.com/)を使おうとすると、iPhone用のビルドで次のようなエラーが出ます。

```
.../Rx/v2/src/rxcpp/schedulers/rx-currentthread.hpp:35:16: error: thread-local storage is unsupported for the current target
        static RXCPP_THREAD_LOCAL current_thread_queue_type* queue;

...

.../Rx/v2/src/rxcpp/rx-util.hpp:14:28: note: expanded from macro 'RXCPP_THREAD_LOCAL'
#define RXCPP_THREAD_LOCAL __thread
```

エラーメッセージに書いてあるとおり、iPhoneではthread-localがサポートされていないとのことなので、このままではビルドが通りません。

## 解決方法

githubの[issue](https://github.com/Reactive-Extensions/RxCpp/issues/19)が上がっていて、forkした[こちらのブランチ](https://github.com/notlion/RxCpp/tree/experimental-ios)には修正がコミットされています。こちらを使いましょう。

ただしベースが少し古いので、本家の最近のコミットは反映されていません。
[こちらのブランチ](https://github.com/gamako/RxCpp)に、本家のわりかし最近のコミットをベースにマージしたものをPushしておきました。横着したい方はお使いください。

<https://github.com/gamako/RxCpp>
PhantomJSをCentOS６にインストール

```
su -
cd /usr/local/src/
wget https://phantomjs.googlecode.com/files/phantomjs-1.9.0-linux-x86_64.tar.bz2
tar jxfv phantomjs-1.9.0-linux-x86_64.tar.bz2
cp phantomjs-1.9.0-linux-x86_64/bin/phantomjs /usr/bin/
```

あらかんたーん
５分くらいだった。

`phantomjs --version`と打ってみて、バージョンが表示されたらOK。

最初32bitなのに64bitのファイルをダウンロードしていて、
`バイナリファイルを実行できません`エラーに阻まれた。情けないのう。。。
ちゃんと32bit用のファイルを解凍して同じ手順を踏んだら解決した。

公式ダウンロードページ
http://phantomjs.org/download.html
デザインの基礎

## デザインの前提
* format(判型)
* orientation(標定)
* grid systems
* composition(構図)
* eye movement(導線)
* theme

## デザインの要素
* line
* color
* shape
* texture
* space
* form
* typography

## ゲシュタルト原則
* proximity(近接)
* similarity(同類)
* closure(閉合)
* common fate(共通運命)
* figure ground rerationship(図と地の関係)
* good continuation(良い連続)

## デザインの原則
* unity(統一)
* balance(バランス)
* hierarcy(階層)
* scale/proportion(尺度/割合)
* dominance/emphasis(支配/強調)
* similarity and contrast(類似と対比)
* rhythm(リズム)
* variety(多様性)


> 参考
> http://webnaut.jp/design/620.html
UI要素の並列配置で気をつける事

## 比較する目的以外に、要素を並列におくこと
### なぜ？
* ポジティブ
 * 1つの事に集中しやすくなり、効率があがる
* ネガティブ
 * ユーザーが比較という行為に移りやすい
 * 比較かそうでないかの判断が増える

![1400587559395-2014-05-20 08.00.56.png](https://qiita-image-store.s3.amazonaws.com/0/18469/947471eb-c07a-27c7-97a3-428bc431139f.png)
Nginxが謎のエラーを吐いたのでEmacsで解決した


##問１：以下のnginx.confがエラーとなる理由を指摘せよ。（３点）

![スクリーンショット 2014-10-02 23.09.05.png](https://qiita-image-store.s3.amazonaws.com/0/54292/34e59ba0-1889-2692-cce9-eeccb2600beb.png "スクリーンショット 2014-10-02 23.09.05.png")




##答え：
9行目の一見スペースに見える奴がその実\ufffc。

っていうふざけた事象に遭遇した。こんなん判るわけないのでもともと入れてたEmacsのwhite spaceで見えるようにした。

```lisp:init.el
(setq whitespace-display-mappings
      '(
        (space-mark ?\u3000 [?\u3000])
        (space-mark ?\ufffc [?_])
        ;; WARNING: the mapping below has a problem.
        ;; When a TAB occupies exactly one column, it will display the
        ;; character ?\xBB at that column followed by a TAB which goes to
        ;; the next TAB column.
        ;; If this is a problem for you, please, comment the line below.
        (tab-mark ?\t [?\u00BB ?\t] [?\\ ?\t])))

(setq whitespace-space-regexp "\\([\u3000\ufff9-\ufffc]+\\)")
(set-face-foreground 'whitespace-space "cyan")
(set-face-background 'whitespace-space "cyan")
```


![スクリーンショット 2014-10-02 23.12.27.png](https://qiita-image-store.s3.amazonaws.com/0/54292/79deb28d-4d83-6ecc-ee18-b4d224bff8c0.png "スクリーンショット 2014-10-02 23.12.27.png")

これでもう\ufff9-\ufffcに怯えることもなくなった。
オレオレgit-flow

前提としてgitのインストール済みとする

## 環境設定
Homebrewでgit-flowをインストール

```
$ brew install git-flow
```

リポジトリの初期化

```
$ git flow init -d
```

## 操作

### git-flowの作業フロー
1 ブランチの作業開始
2 ブランチの共有
3 ブランチの取得
4 コミットのプッシュ
5 コミットの取り込み
6 ブランチの作業終了


### git-flowのコマンド

``` 
$ git flow ｛ブランチ種別｝ ｛コマンド｝
```

| ブランチ種別 |日本語   |
|:-----------|:------------|
| master      |マスターブランチ  |
| release     |リリースブランチ マスターから派生する  |
| develop    |開発ブランチ|
| feature    |開発ブランチ|
| hostfix     |緊急バグ対応ブランチ|
| rebase     |リベース|

| コマンド | 内容   |
|:-----------|:------------|
| start      |ブランチ作成  |
| finish     |ブランチ終了  |
| publish    |ブランチを公開|
| track      |ブランチを取得|
| pull       |コミットを取得|
| rebase     |リベース|
ios developerに開発用デバイスを追加する(xcode6.0, ios8)

## ios developerに開発用デバイスを追加する(xcode6.0, ios8)

iphoneアプリ開発時に新しく購入した機種でテストしたい場合、
testflightを入れる前にappleに登録しなければならない。
その、フローが結構面倒なので備忘録として。。

前提として1通りCertificates,Identifers,Devices,Provisioning Profilesの登録は済ませているものとする。

1. 追加したいiphoneとmacをつなぐ
2. xcodeを起動する
3. windowメニューからdeviceを選択
4. DEVICESの項目に接続したiphoneが表示されるので選択
5. safariを立ち上げ、apple devcenterに移動
6. ログイン後、iOS Developer ProgramメニューのCertificatesを選択
7. Devicesメニューを選択
8. +ボタンをクリックし、追加したいiosのNameとUUIDを入力
   UUIDは4で表示されるIdentiferを使用
9. Provisioning Profilesより追加したいファイルを選択
10. editをクリックし、先ほど追加デバイスにCHECKを入れる
11. downloadをクリック
12. downloadしたProvisioning fileをダブルクリック
13. xcodeに移動し、DEVICESにある追加した端末を右クリック
14. 右クリックメニューからshow provisioning fileを選択
15. 表示ボックス内にProvisioning fileが追加されていればok
swiftのOptional変数について

いろいろ調べて見た結果下記のようなことなのかなぁと思った次第。
取り合えずメモ代わりに。

# Optional変数

* swiftの変数はいわゆるC++などで言うリファレンス。
* 何も参照していない変数は、nilが入っている。
* が、普通に宣言した変数にnilを入れることができない。
* 宣言時に型名の後ろに?を入れることで、nilをとることができるようになる。

```swift
var optional_value : String? // nilが入ってる。
var str : String = "sample"
optional_value = str         // OK
str = optional_value         // NG
```

Optional変数は、ベースになる型をラップしているイメージ。というかだからwrapping、って呼ばれてるんだ、っと気づいた。
ラッピングを解かないともとの型としては使えない。

## ラッピングをとく。

```swift
var optional_value : String? // nilが入ってる。
optinal_value!               // nilなら実行時エラー
if let val = optional_valu {
    val                      // nilかどうかをチェックしてからvalに代入
}
```

## 何のためにあるのか

* nilが入っている可能性がある値を明示的にする。
* これにより、コンパイラのnil値アクセスのチェックが簡単になる。
* nilを返すことがある可能性のある関数の戻り値を使うときはOptional変数で受けてラッピングを解いてから使う。この作法により、プログラマもnilの存在を意識したコードに注意が行くようになる。
PHPにおける加算子（$i++）と代数演算子（$i=$i+1）の動作の違いについて

何となくやっていたら、どハマったのでメモ…。

PHPは演算の際に型の自動変換を行うことがあります。


>PHP の自動型変換の例の一つは、代数演算子 '+' です。 オペランドのどれかが float の場合、全てのオペランドは float として評価され、結果は float になります。 その他の場合、オペランドは整数として解釈され、結果も整数になります。
（PHP: 型の相互変換 - Manual http://php.net/manual/ja/language.types.type-juggling.php ）

###　変数内が数値のみの場合
例えば、以下のような場合、文字列型の「"0"」が演算時に自動的にキャストされ、数値型の「1」になります。
このように、変数の中身が**数値のみの場合は、加算子`$i++`と代数演算子`$i=$i+1`で動作は同じ**です。

```lang:test.php
$str = "0";    //string(0)
++$str;          //integer(1)

$str = "0";    //string(0)
$str = $str + 1;     //integer(1)
```

###　変数内に文字を含んでいる場合
ところが、**文字列中に数字以外の文字がある場合は、加算子`$i++`と代数演算子`$i=$i+1`で動作が異なってきます。**以下に例を示してみます。

```lang:test.php
$str = "1a";   //string(1a)
++$str;         //string(1b)　文字列型のまま

$str = "1a";   //string(1a)
$str = $str + 1;//integer(2)　数値型に変換される
```
すなわち、加算子`$i++`の場合は、文字列型のまま1つ分進めます(1aから1bに)が、代数演算子`$i=$i+1`はaの文字を無視して先頭の「1」だけ取り出して「2」にしています。

代数演算子はこのような場合、**一番先頭の数値を取り出す**ようです。例えば、以下の場合は、先頭の「9」を取り出して「10」にしています。

```lang:test.php
$str = "9a1a1";   //string(9a1a1)
$str = $str + 1;//integer(10)　数値型に変換される
```

また、先頭が文字以外の場合は、代数演算子で演算すると、自動的に「1」になります。

```lang:test.php
$str = "a100";   //string(a)
$str = $str + 1;//integer(1)　数値型に変換される
```


参考：
PHP の演算子のちょっとした振る舞いの違いに要注意 | バシャログ。 http://c-brains.jp/blog/wsg/14/03/19-100000.php

PHP: 加算子/減算子 - Manual http://php.net/manual/ja/language.operators.increment.php

PHP: 型の相互変換 - Manual http://php.net/manual/ja/language.types.type-juggling.php
CoffeeScript超入門

## CoffeeScriptってなんね？
### 読み方
http://yomikata.org/word/coffeescript

### サイト
http://coffeescript.org/

### CoffeeScriptとは
>CoffeeScript はプログラミング言語のひとつである。コードはJavaScript のコードに変換される。
Ruby や Python、Haskell [1] から影響を受けたシンタックスシュガーの導入により、JavaScript に比べ簡潔さと可読性を向上させたほか、配列内包 (Array comprehensions) やパターンマッチといった機能を追加している…

wikipediaより

### 要するに
* JavaScriptにコンパイルできる小さな言語
* DocumentCloudのJeremy Ashkeans氏によって開発された
* 構文がRubyやPythonに似ている
* コンパイル後はJavaScriptとして動作するため実行速度面ではほぼ変わらない
* ブラウザ用の開発にもサーバサイドの開発にも使える
* Rails3.1以降ではデフォルトの開発言語として採用(自動的にコンパイル)

### なぜCoffeeScript？

#### 背景
javascriptが比較的自由な言語なので、運用管理がたいへん。。。
自作機能などの衝突が怖い。。。

#### 長所
大きなところでは
* タイプ数が少ない
* ソースの可読性が高まる
* クラスやクロージャーの作成が簡単

少しだけテクニカルなところだと
* グローバル汚染を防げる
* 細かいタイプミスが減る
* 比較が曖昧でなくなる
* 他にもいろいろ、ええ感じにしてくれる

#### 短所
* コンパイルが必要
* ランタイムエラーの発生箇所がわかりずらい
* そもそもjavascriptの知識がないときつい

## 実践
#### 代入
varを使わなくてもok

```ruby:コンパイル前
say = 'hello'
```

#### 関数呼び出し
```ruby:コンパイル前
alert 'hello'
```

#### 分岐
```ruby:コンパイル前
weather = '晴れ'
if weather is '晴れ'
  alert '晴れだよ'
else
  alert '違うよ'
```

#### 演算子（and, or, not など）
| CoffeeScript | JavaScript |
|:-----------|:------------|
| is       |       ===  |
| isnt     |      !== |
| not       |        ! |
| and        |          && |
| or       |       || |
| true, yes, on    |     true |
| false, no, off     |     false |
| @, this      |     this |
| of      |     in |
| in       |     無し |

#### ループ

```ruby:コンパイル前
for i in [0..3]
    alert i
```

#### 関数

```ruby:コンパイル前
hello = ->
    alert "Hello!"
```

```ruby:コンパイル前
hello = (name) ->
    alert "Hello, #{name}!"

hello("じげんぶ")
```

#### 暗黙的なreturn

```ruby:コンパイル前
$(function() {
  return $('#btn').on('click', function() {
    return console.log('クリック');
  });
});
```

```ruby:コンパイル後
$(function() {
  $('#btn').on('click', function() {
    console.log('クリック');
  });
});
```

#### 明示的にreturnする

```ruby:コンパイル前
$ ->
  $('#btn').on 'click', ->
    console.log 'クリック'
    return
  return
```

```ruby:コンパイル後
$(function() {
  $('#btn').on('click', function() {
    console.log('クリック');
  });
});
```

### jQueryとcoffeescript

#### DOM生成後にhtmlを操作できるようにするおまじない

```ruby:コンパイル前
$ ->
  # jQueryスクリプト
```

```ruby:コンパイル後
$(function() {
  // jQueryスクリプト
});
```

#### pタグのテキストカラーを赤にする

```ruby:コンパイル前
$ ->
  $('p').css('color', 'red')
```

```ruby:コンパイル後
$(function() {
  return $('p').css('color', 'red');
});
```

#### @はthisに変換される

```ruby:コンパイル前
$ ->
  $('#btn').on 'click', ->
    console.log @
    return
  return
```

```ruby:コンパイル後
$(function() {
  $('#btn').on('click', function() {
    console.log(this);
  });
});
```

##### jqueryオブジェクトを取得したい場合

```ruby:コンパイル前
$ ->
  $('#btn').on 'click', ->
    console.log $ @
    return
  return
```

```ruby:コンパイル後
$(function() {
  $('#btn').on('click', function() {
    console.log($(this));
  });
});
```
pyenvはどのようにバージョンを切り替えているのか?


# はじめに
Pythonのバージョンを切り替える便利ツール、 [ **pyenv**](https://github.com/yyuu/pyenv)  、意味もわからずに、 **pyenv local**つかっていたのですが、ふと[pyenvのページ](https://github.com/yyuu/pyenv#how-it-works)を見るとどのように動くか丁寧に説明してあることに気づきました。こちらはその抄訳となります。
MITライセンスなので、許諾はいらないとおもっていますが、なにかあれば指摘ください。

## pyenvの動作の仕組み

**pyenv** は **python**のコマンドをシム実行ファイル( **shim executables** )で横取りして、どのPythonのバージョンで実行するかを決め、あなたのアプリケーションに正しいPythonのインストール環境を渡します。シム実行ファイルは **PATH**環境変数の仕組みを利用しています。

##PATHについて理解する

 **python**や **pip**のようなコマンドを実行した場合、OSは一連のディレクトリから、その名前の
実行ファイルを探します。ディレクトリのリストはPATH環境変数で定義れていて、:(コロン)
で区切られたディレクトリのリストです。

- PATH環境変数から **pip**の実行ファイルを探す
- PATHの先頭にある **~/.pyenv/shims**ディレクトリの **pip**を見つける
- この **pip**を実行し、コマンドを **pyenv**に渡す

## **Python**バージョンの選択

シムの実行時、pyenvはどの Pythonのバージョンを利用するか、以下の順番で確認をします。

1. (定義されていれば)PYENV_VERSION環境変数。現在のシェルセッション中で、
   **pyenv shell**コマンドを用いることで、この環境変数を設定することができます。

2. (もし存在すれば)カレントディレクトリ中にある . **python**-version ファイル。
   **pyenv local** コマンドでこの内容を変更できます。

3. 親ディレクトリ中の . **python**-version ファイル。一つずつ、ルートまで遡ります。l

4. グローバルな **~/.pyenv/version** ファイル。 **pyenv global**コマンドで変更できます。

5. 上記が全てない場合は **"system"**  Pythonが実行

注意: pyenv global 3.4.1 2.8.8のように複数のバージョンを一度に有効にできます。 
これは[tox](https://pypi. **python**.org/pypi/tox)のような **python**2と3を並行して利用する場合に利用します。

## **Python**のインストール場所

pyenvがバージョンを決定すると、コマンドを正しい **Python**のバージョンに渡します。
各 **Python**のバージョンは、**~/.pyenv/versions** の下にインストールされています。例えばこんな感じです。

- ~/.pyenv/versions/2.7.6/
- ~/.pyenv/versions/3.3.3/
- ~/.pyenv/versions/pypy-2.2.1/

# おわりに

pyenvの話でしたが、rbenvもほぼ同様の仕組みで動いています。次はpyenv と vritualenv、rbenv と bundlerを調べたいとおもいます。
VimでJazzを聴く

覚書きまでに

## mplayerをインストール

```
brew install mplayer
```

or

```
sudo apt-get install -y mplayer
```

を実行

## .vimrcに追記
```
NeoBundleLazy 'supermomonga/jazzradio.vim', { 'depends' : [ 'Shougo/unite.vim' ] }
if neobundle#tap('jazzradio.vim')
  call neobundle#config({
        \   'autoload' : {
        \     'unite_sources' : [
        \       'jazzradio'
        \     ],
        \     'commands' : [
        \       'JazzradioUpdateChannels',
        \       'JazzradioStop',
        \       {
        \         'name' : 'JazzradioPlay',
        \         'complete' : 'customlist,jazzradio#channel_id_complete'
        \       }
        \     ],
        \     'function_prefix' : 'jazzradio'
        \   }
        \ })
endif
```

## BundleInstall
```
:NeoBundleInstall
```

完了

##  操作コマンド
:Unite jazzradio            ->jazz一覧
:JazzradioUpdateChannels    ->再生リストをアップデートする
:JazzradioPlay [channel_id] -> 再生
:JazzradioStop              -> 停止


今回は、UniteとNeoBundleがインストールされているのが前提で記載しています。


## 参考
http://blog.supermomonga.com/articles/vim/jazzradio-vim-released.html
MacOSX(Marvericks) アップデート後、 Homebrew のリンク,パスが切れた

#bashのアップデート
http://www.jpcert.or.jp/at/2014/at140037.html
以上の記事などを参考にして頂ければいいと思いますが、
##Shellshock
まぁ色々な記事で問題になっている,
bashの脆弱性が発見されたので、bashを最新版にアップデートしました。
まだアップデートしていない人は以下の記事などを参考にアップデートして下さい。
http://alblue.bandlem.com/2014/09/bash-remote-vulnerability.html
私は基本的にmacportsではなく、brewで管理していたので、
```$brew upgrade bash```
で問題なくすみました。
##bash installしたものがない
数日後macOSのアップデートをした結果、
bashがない？
と言われ、色々確認したところ、
brew installしたもののパスが切れてました。
##brew link を個々で設定する
brewのlinkを再度設定することにしました。
初めにinstallしたリストを確認して、
```$brew list```
installされていれば、linkを張り直したいものを選択
```$brew info bash```
すると
```http://www.gnu.org/software/bash/
/usr/local/Cellar/bash/4.3.x8 (x9 files, x.4M)
  Built from source
/usr/local/Cellar/bash/4.3.25 (x9 files, x.4M) *```
このような形でinstallされたものが確認できます。
installした最新のversionを
```$brew switch 4.3.25```
のように指定します。
```$brew which bash```
でlinkを確認します。
bash: 4.3.25
などと出れば問題なくlinkが繋がってます。
MySQLでrootのパスワードを忘れた時のリセット方法

MySQLでrootのパスワードを忘れた時のパスワードリセット方法です。セーフモードで立ち上げてrootのパスワードを上書きします。

まずMySQLを停止します。

```
$ sudo service mysqld stop
mysqld を停止中:                                           [  OK  ]
```

MySQLをセーフモードで起動します。

```
$  sudo /usr/bin/mysqld_safe -u root --skip-grant-tables &
mysqld_safe Logging to '/var/log/mysql/mysqld.log'.
mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
```

MySQLをパスワードなしで立ち上げます。

```
$ mysql mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or ¥g.
Your MySQL connection id is 16
Server version: 5.5.37-log MySQL Community Server (GPL) by Remi

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '¥h' for help. Type '¥c' to clear the current input statement.
```

ここでrootユーザのパスワード空に書き換えます。
クエリが問題なく実行されたらmysqlを再起動します。

```
mysql> UPDATE user SET Password='' WHERE Host='localhost' and User='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>  FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)


$ sudo service mysqld restart
mysqld を停止中:                                           [  OK  ]
mysqld を起動中:                                           [  OK  ]
```

セーフモードではない状態でMySQLを起動してrootのパスワードが更新されているかを確認します。

```
$ sudo mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or ¥g.
Your MySQL connection id is 33
Server version: 5.5.37-log MySQL Community Server (GPL) by Remi

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '¥h' for help. Type '¥c' to clear the current input statement.
```
  
  
パスワードを忘れないのが一番ですが、忘れた時のためにメモしておきます。
Kandan | Media の削除方法

# Kandan | Media の削除方法

## 概要
Media の削除方法

## 詳細
### 組み込みの削除機能がない！？
Kandan はファイルのアップロードをした後に削除する手段がありません。
[Issue](https://github.com/kandanapp/kandan/issues/298) はあるようですが、ここ最近全く commit がないことからいつ改善されるか不明。
（プルリクも放置され続けているので、仮にこちらで削除機能を作っても、すぐには取り込まれない雰囲気。
それどころか、デモサーバーがエラーの状態のままでずっと放置されている。もうメンテしないのだろうか？）

### ファイルの保存場所
アップロードしたファイルは

%kandan%/public/system/attachments/files/000/000

配下に下記のような構成で保存されます。

~~~
.
┣ 001
┃ ┗ original
┃     ┗ file1.txt
┣ 002
┃ ┗ original
┃     ┗ file2.txt
┣ 003
┃ ┗ original
┃     ┗ file3.txt
┣ 004
┃ ┗ original
┃     ┗ file4.txt
┗ 005
    ┗ original
        ┗ file5.txt
~~~

## 削除手順

* Kandan サーバーにログイン
* %kandan%/public/system/attachments/files/000/000 配下の該当ファイルを削除
* ファイルを削除しただけでは、 MEDIA の表示は消えません。 DB から該当データを削除する必要があります。

![media.png](https://qiita-image-store.s3.amazonaws.com/0/43480/eabd13e8-75e4-da86-d609-e6717654db2a.png)

* 仮に選択すると下記のようなエラーになります
![media_delete1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/5c40e090-567c-e47d-158c-3d7091f6d66e.png)

* rails console を起動
* Attachment Modelを操作して該当レコードを削除

~~~bash
$ cd %kandan%
$ rails console
# 削除対象のidを調べる
[1] pry(main)> file = Attachment.where(file_file_name: 'file_name.txt')).pluck(:id))
6
[2] pry(main)> Attachment.delete(6)
  SQL (2.4ms)  DELETE FROM "attachments" WHERE "attachments"."id" = 6
=> 1
~~~

* 画面から表示が消えたことを確認

![media_delete2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/f4eca934-d0c6-8127-88c2-9fa29caeef68.png)

## 補足
Kandan の代替ツールが見つかったら早いところ乗り換えたいところです。
通知系や、UI、権限管理など細かいところで使いにくさを感じているのですが、
本家が全然メンテしていないようなので進化も期待出来ない状況です。

Private な環境にインストールできて、 Hubot-Adapter に対応している
チャットツールをご存じの方は教えていただけると嬉しいです。
Travis-CIでSwift libraryをテストする

Travis CIがこのほどXcode 6をサポートしました。

* [The Travis CI Blog: Status update on the Xcode 6 and iOS 8 rollout](http://blog.travis-ci.com/2014-09-26-status-update-on-xcode6-and-ios8-rollout/)

Xcode 6をサポートしたということは、Swiftもサポートしたということです。これでようやくOSSなSwift libraryをCIできるようになりました。めでたい :congratulations: 

さっそくSwiftライブラリをCIしてみましたが、ハマりどころが沢山ありましたので共有します。以下のプロジェクトで実際にCIでunit testを実行しているのでご覧ください。

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

## Travis CIの設定のポイント

ポイントは以下のとおり。

* test schemeをsharedにする
  * Xcodeのscheme managerでtest用のschemeをsharedにし、リポジトリにコミットする。これがないとtest schemeを認識できません
* 最新のxctoolを使う
  * xcodebuildでパラメータを変えて試してみたのですがどうしてもうまく行きませんでした
  * Travis CIが用意しているxctoolだとバージョンが低いので、xctool 0.2.1 以上にアップデートして使う必要があります
* .travis.yml の xcode_sdk ないし xctool の -sdk オプションに iphonesimulator を指定する
  * xctool testコマンドは自動的に -sdk iphonesimulator を指定してもよさそうですが、0.2.1 の時点だと明示的に指定する必要がありました

## .travis.yml (xctool版)

これを踏まえると.travis.ymlは以下のようになります。実際には、makeコマンドにこの設定を全部いれて、.travis.ymlはmake一発にしておくほうが簡単かもしれないですね。

```
language: objective-c
before_script:
    - brew update && brew upgrade xctool
xcode_project: JsonSerializer.xcodeproj
xcode_scheme: JsonSerializerTests
xcode_sdk: iphonesimulator
```

ところでTravis CIのために試行錯誤する場合、一度branchを作ってそこで試行錯誤し、終わったらそのブランチを `git merge --squash` するとメインストリームにtravisのためだけの試行錯誤の記録を残さずに済むのでいいですね。

## 追記: xctoolがうまくいかないとき

どういう条件かわかりませんが、xctoolではだめでxcodebuildを使わなければならないプロジェクトもあります。たとえば次のリポジトリがそうです。

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

その場合、Makefileでxcodebuildを呼ぶようにして、.travis.ymlはmakeコマンドを呼ぶだけにして解決できます。
SwiftでreadonlyなプロパティをObjective-C側に公開する


`Objective-C`の時に、特定のプロパティを`readonly`で公開するというのを結構やっていた。

いきなり全部を`Swift`にするのは怖いから徐々に浸食していこうと思っているんだけど、併用している時にはどう書けばいいんだろう？

と思ったのでメモってみた。

# よく書くパターン(Objective-C)

```objc:Sample.h
#import <Foundation/Foundation.h>

@interface Sample : NSObject

@property (nonatomic, copy, readonly) NSString *item1;

@end
```

```objc:Sample.m
#import "Sample.h"

@interface Sample () 

@property (nonatomic, copy) NSString *item1;

@end

@implementation Sample
@end
```

# Swiftで書くと

```swift:Sample.swift
import Foundation

class Sample: NSObject {
  private(set) var item1 = ""
}
```

# ちなみに

```swift:Sample.swift
import Foundation

class Sample: NSObject {
  var item1 = ""
  private(set) var item2 = ""
  private var item3 = ""
}
```

と書くと

```objc:PROJECTNAME-Swift.h
@interface Sample : NSObject
@property (nonatomic, copy) NSString * item1;
@property (nonatomic, readonly, copy) NSString * item2;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
```

という感じになるらしい。
覚え書き 003[Xcode6 SizeClasses-AutoLayout/LaunchScreen]

# SizeClasses
Xcode6からxibとかの仕様が変更されました．
それについて，調べました．
先駆者たちのわかりやすいサイトを載せておきます．

## 参考URL
[SizeClassesとXcode6でのAutoLayoutの謎マージン - Qiita](http://qiita.com/uskiita/items/c643f5868f60b496911e)
[Xcode6情報｜山下寛人オフィシャルブログ](http://ameblo.jp/vegetable-it/entry-11898189678.html)

# LaunchScreen
LaunchScreenが，xibファイル対応になりました．
使い勝手が良いので，使ってみる価値あり．
詳しい情報は，参考URLに．

## 参考URL
[[iOS 8/Xcode 6] Launch Screen (スプラッシュ画面) を Interface Builder で作成できるようになりました ｜ Developers.IO](http://dev.classmethod.jp/references/ios8-launch-screen-xib/)
C++でpythonを拡張する(Boost.NumPy)



## 何故C++のクラス・関数をPythonにバインドするか？
C++11は非常に便利になった。Boost使えばさらに便利だ。
しかし、pythonはもっと使いやすい。
NumPyをベースにしたプロジェクト群(SciPy, matplotlib, pandas, ...)
は共通の基盤の上に非常に使い易く整備されている上に、そこそこ高速に動作する。
C++を使うべきか、Pythonにバインドして使うべきか、
また私の中で結論はでていないが、とりあえずバインドするための情報をまとめる。

## どうやってバインドするか？

問題は2つある。

- 単純にPythonにバインドする方法
- NumPyにバインドする方法

Pythonを使う理由の一つにNumPyのベースのライブラリを使用する事があるので、
NumPyの`ndarray`等に変換できる必要がある。

基本となるのは[Python C API](http://docs.python.jp/2.7/c-api/index.html)と[NumPy C API](http://docs.scipy.org/doc/numpy/reference/c-api.html)である。
これらを通してC++の関数やクラスをPythonにバインドする。
C++は当然Python C APIを直接呼びだせるが、
参照カウントを自分で制御しないといけない。
これは無理ゲーすぎるので、その辺をC++らしくラップしたのがBoost.Pythonである。
スマートポインタで参照カウントは管理してくれる。

一方で、NumPy C APIはPython C APIとは別物であるため、
Boost.Python自体にはNumPyのAPIのラッパーは含まれていない。
そこでBoost.PythonをベースにNumPyのためのインターフェイスを
実装したものがBoost.NumPyである。
現在Boost sandboxに入ってると書いているが、
Boost本体の開発がGithubに移ってからSandboxは運用されていないようだ。
開発は[github](https://github.com/ndarray/Boost.NumPy)で行われている。
Boostとしての立ち位置はよく分らない。

## Install

```console
git clone https://github.com/ndarray/Boost.NumPy
cd Boost.NumPy
```

した事前提で話を進める。

### documentのビルド

```console
cd libs/numpy/doc
make
```

として`libs/numpy/doc/_build/html/index.html`を開けばドキュメントが見れる

### cmakeによるインストール

上述のドキュメントに詳しくある(略)
python3環境でコンパイルするには少し変更が必要となる。

## 使い方

SciPyの各種アルゴリズムを使うためには
`numpy.ndarray` を引数にして同じ`ndarray`を返す関数が必須。

NumPyの肝であるndarrayをC++で作る

```
project/CMakeLists.txt
        numpy.cpp
```

```cpp:numpy.cpp
#include "boost/numpy.hpp"

namespace p = boost::python;
namespace np = boost::numpy;

np::ndarray new_zero1(unsigned int N) {
  p::tuple shape = p::make_tuple(N);
  np::dtype dtype = np::dtype::get_builtin<double>();
  return np::zeros(shape, dtype);
}

BOOST_PYTHON_MODULE(mymodule) {
  Py_Initialize();
  np::initialize();

  p::def("new_zero", new_zero1);
}
```

こんな感じで書く。かなり直感的に書ける。

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
# set(CMAKE_VERBOSE_MAKEFILE 1)

find_package(Boost COMPONENTS python3 REQUIRED) # for python3
find_package(PythonLibs REQUIRED)
include_directories(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})

add_library(mymodule SHARED numpy.cpp)
target_link_libraries(mymodule ${Boost_LIBRARIES} ${PYTHON_LIBRARY} boost_numpy)
set_target_properties(mymodule PROPERTIES PREFIX "") # 接頭辞'lib'を省略するため
```

```command
cmake .
make
```

これで`mymodule.so`ができる。
set_target_propertiesを書かないと`libmymodule.so`となる。
LIBRARYだったりLIBRARIESだったりするので注意する。

もっと詳しい使い方は次回。
【Yahoo!ショッピング】SHPカテゴリの検索が出来ない

SHPカテゴリ/スペック検索API を利用しようとしているのですが、

検索ワードを指定しても、正しい検索結果でないと思われるカテゴリー情報が返ってきます。。
(ストアエディタ上での検索結果と比較済み)

どの検索ワードでも同じカテゴリー情報が返ってきます。

また、startなどの値も変更しても、同じ情報しか返ってきません。

検索ワードを空にすると、必須エラーがちゃんと返ってきます。

何がいけないのでしょうか。

ご回答よろしくお願いい致します。
C++11をC++03に戻さなきゃいけなくて辛い話（書きかけ）

C++11使えないC++とかもはやC++使う意味がないこの世の中ですが、どうしてもC++11に対応してない酷コンパイラ様（某ふじなんとか社製）のためにC++03に戻すお仕事をしています。

あまりにも色々つらいので、つらかったことをまとめておいたら、少しでも似たような境遇の人の救いになるかなと思ってまとめてみます。

まだ作業中ですので、増えたら増えた時に書いてきます。

### autoがない
ひとつずつやっていけば直せるけど地味にメンドイですね。
特にイテレータまわりが大変です。``std::map< std::string, std::vector< std::pair<int, double> > >::iterator``とかなんなんでしょう・・・。

### ラムダ式がない

なんといってもコレが一番きつかった。
C++11で[こんなコードがあるとします](http://melpon.org/wandbox/permlink/LB6C5VcGBdzKMrqd)。

```cpp:
#include<iostream>
#include<vector>
#include<numeric>
#include<cmath>

int main()
{
    constexpr double offset = 1.5;
    
    const std::vector<double> values = {1.1, 1.2, 1.3, 1.4, 1.5};
    
    // こんな感じでstd::accumulateなどで外の変数（クロージャ）を使いたい
    const double result = std::accumulate(values.cbegin(), values.cend(), 0.0,
        [&offset](const double sum, const double val)
        {
            return sum + std::sin(offset + val);
        });
    
    std::cout << result << std::endl;
    
    return 0;
}
```

C++03では当然ラムダ式が使えません。
となるとファンクタの出番です。
（クロージャのないラムダ式なら関数ポインタでもなんとかなりますが）

試行錯誤した結果[C++03ではこんな風になりました](http://melpon.org/wandbox/permlink/zYH4oBRbMFuREv55)

```cpp:
#include<iostream>
#include<vector>
#include<numeric>
#include<cmath>

// クロージャありのラムダ式をファンクタにする場合こんな風にするしかない
// （しかもC++03では関数スコープ内のローカル型はテンプレート引数に使えないから、外に出さなきゃいけない）
struct Lambda
{
    // メンバー変数でコピー走らせたくないから参照にする
    const double& offset;
        
    // 参照を持つメンバー変数はコンストラクタが必要（引数を参照にするのを忘れないこと！）
    Lambda(const double& offset) : offset(offset) {}
        
    double operator()(const double sum, const double val)
    {
        return sum + std::sin(offset + val);
    }
};

int main()
{
    const double offset = 1.5;
    
    std::vector<double> values;
    values.push_back(1.1);
    values.push_back(1.2);
    values.push_back(1.3);
    values.push_back(1.4);
    values.push_back(1.5);
    
    const double result = std::accumulate(values.cbegin(), values.cend(), 0.0, Lambda(offset));
    
    std::cout << result << std::endl;
    
    return 0;
}
```

つらいですね。