OmniAICreator/Qiita-1.07M huggingface dataset:
Macにnano(エディタ)をインストールする


##Debianを使い始めて、nanoが使いやすい！

CentOSばかり触っていて、Debianを使ったことがないなーと思っていたので、Debianを触り始めました。

Debianでは(?)、nanoエディタがデフォルトのようなので、
実際に触って使ってみたところ、結構使いやすい！と感じました。

そこで、Macでもnanoを使おう！と思い、試してみました。

##インストール

```
brew install nano
```

まずは単純にインストールしてみると、

```
Error: No available formula for nano 
Searching taps...
homebrew/dupes/nano
```

nanoはないよ、と言われましたが、tapを探してくれて
homebrew/dupes のリポジトリにあるみたい。

```
brew tap homebrew/dupes
Cloning into '/usr/local/Library/Taps/homebrew-dupes'...
remote: Reusing existing pack: 1163, done.
remote: Total 1163 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1163/1163), 226.83 KiB | 93.00 KiB/s, done.
Resolving deltas: 100% (610/610), done.
Checking connectivity... done.
Tapped 39 formula
```

tapの追加完了。

では、早速nanoを再度インストール。

##参考
[Homebrew で nanoエディタ](http://d.hatena.ne.jp/yutoichinohe/20130331/1364717123)
インストール後に初めて知りましたが、nanoはMacに入っている！？
でもバージョンが古いようなので、結果的にはOK？w
Adopting Modern Objective-C（ドキュメントメモ）

#instancetype
インスタンス生成するとき，instancetypeを使う

例：
```objc
+ (id)init;
+ (id)factoryMethod;
```

良い書き方：

```objc
+ (instancetype)init;
+ (instancetype)factoryMethod;
```
#Properties
getter,setter書くよりpropertiesを設定する

例：
```objc
- (NSString *)title;
- (void)setTitle:(NSString *)title;
```

良い書き方：

```objc
@property (copy,nonatomic) NSString *title;
```

#Enumeration
typedef enum  Cのenum使うよりNS_ENUM, NS_OPTIONSを使う

##NS_ENUM：
```objc
enum {
        UITableViewCellStyleDefault,
        UITableViewCellStyleValue1,
        UITableViewCellStyleValue2,
        UITableViewCellStyleSubtitle
};
typedef NSInteger UITableViewCellStyle;
```
良い書き方：

```objc
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
        UITableViewCellStyleDefault,
        UITableViewCellStyleValue1,
        UITableViewCellStyleValue2,
        UITableViewCellStyleSubtitle
};
```

##NS_OPTIONS：
```objc
num {
        UIViewAutoresizingNone                 = 0,
        UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
        UIViewAutoresizingFlexibleWidth        = 1 << 1,
        UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
        UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
        UIViewAutoresizingFlexibleHeight       = 1 << 4,
        UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
typedef NSUInteger UIViewAutoresizing;
```
良い書き方：

```objc
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
        UIViewAutoresizingNone                 = 0,
        UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
        UIViewAutoresizingFlexibleWidth        = 1 << 1,
        UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
        UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
        UIViewAutoresizingFlexibleHeight       = 1 << 4,
        UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
```
Rails 勉強メモ ー プロジェクト作成 ー

Railsの勉強をはじめたのでとりあえずProjectを作成してページを表示するところまでの流れを確認するためのコマンドのメモ。

Project作成
`rails new myapp`

作成したプロジェクトに移動
`cd myapp`

SublimeTextでGemFileを開いて編集(必要に応じて)
`subl Gemfile`

Gemfileの次のコードがコメントアウトされているので#をはずす
`gem 'therubyracer', platforms: :ruby`

Gemfileの更新
`bundle update`

Gemfileの再適用？
`bundle install`

テストサーバー起動
`rails server` または `rails s`
(サーバー終了はCtrl+c)

Scaffoldコマンドでアプリ作成
`rails generate scaffold User name:string score:integer`

DB作成
`rake db:migrate`

サーバーにアクセスしてすると次のページが作成されている。
http://0.0.0.0:3000/users

現在のディレクトリを確認
`pwd`

Modelの作成
`rails g model Project title`
・rails gは省略形
・Projectはモデルの名称。単数形で最初は大文字。

新しくmigrateファイルが作成されたときは次のコマンドで反映させる。
`rake db:migrate`

DBにアクセス
`rails db`

sqlite内の確認
`.schema`

query
`select * from projects;`

db exit
`.exit`

Modelの編集
`rails console`

Project内に作成
`p = Project.new(title: "p1")`
`p.save`

createはnewとsaveを一度にできる
`p = Project.create(title: "p2")`

rails consoleはexitで終了できる

Controllerの作成
`rails g controller Projects`
・controllerは複数形。
・viewも同時に作成される

プロジェクト内のconfigフォルダ内のroutes.rbファイルの編集
`resources :products`
・上の処理を追加する

保存して次のコマンドでルーティング一覧を確認できる
`rake routes`

appフォルダ→controllerフォルダ内にあるproject_controller.rbを編集

```rb:project_controller.rb
class ProjectsController < ApplicationController

	def index
		@projects = Projects.all
	end

end
```

つづいてviewの編集同じようにviewsフォルダ内にindex.html.erbを作成する

```erb:index.html.erb
<h1>Projects</h1>

<ul>
	<% @projects.each do |project| %>
	<li><%= project.title %></li>
	<% end %>
</ul>
```

これでrails sでサーバを起動して/projectsにアクセスするとページが表示される。


ここまでがmodel,view,controller作成の基本的な流れ。


configのrotues.rbに次のように追加するとrootが設定される。

```rb:rotues.rb 
root 'projects#index'
```
コールバック関数


正直、こうしてまとめておくほどの内容ではないとは思うのですが。
まあ一応、誰かの助けになるかもしれないし。

とりあえず言語はCで。

## これはコールバック関数なのか？

人の書いたソースを読んでいて、hogehoge_callback()という関数が出て来た。
名前からコールバック関数だと思ったのだが、どうにもその使われ方が、コールバック関数っぽくない。

## コールバック関数ってなんだっけ？

そも、私のコールバックに関する認識が合ってるのか？
ちょっとコールバック関数がゲシュタルト崩壊してきたので、ググってみる。

[wikipedia コールバック_(情報工学)](http://ja.wikipedia.org/wiki/コールバック_(情報工学))

ううん、わかったような、わからないような……。
つまり、関数ポインタに渡される関数がコールバック関数である、と？

でもさー、別に普通の関数呼び出しじゃいけないのん？
そりゃあね、

> イベントの発生を検知するための処理と、そのイベントが起こった時に実行すべき個々の処理を分離して記述することができる。
[e-Words コールバック関数](http://e-words.jp/w/E382B3E383BCE383ABE38390E38383E382AFE996A2E695B0.html)

ていうのはあるかもしれんけど。
非同期で呼び出されるならともかく、同期で呼び出されるなら普通の関数呼び出しで良くね？

## 呼び出した側、呼び出された側、どっち？

で、グーグル先生と相談してみたら、こういう解説を見つけた。

[2010-09-09 コールバックの薦め](http://d.hatena.ne.jp/prettysoft/20100909/1283529670 "プログラミングの教科書を置いておくところ")

> 「呼び出し返す」とはつまり「（関数を）呼び出し返す」ということです
この「呼び出し返される関数」のことを「コールバック関数」と言います
……
またもう一つここで注目して欲しいのは「呼び出した側」と「呼び出された側」という２つの主体が存在していることです
……
「コールバック」と言うためには、そこに意味上の分断がある必要があります
……
即ち、その境界を越えて「呼び出された側」から「呼び出した側」へと「コール」し返す行為を「コールバック」と言うのです
ですから「コールバック」というのは「ある意味上の境界を越えて境界を越えてコールバック関数を呼び出す行為」であるとも言えます
そして意味上の境界を越えて処理が戻ってくるわけですから呼び出し返される「コールバック関数」というのは「呼び出した側」の主体に属するものであるということもわかります
「呼び出した側」の主体に属するのですから「コールバック関数」は「呼び出す側」が指定すべきものであるということもわかりますね

なーるーへーそー。
この説明なら納得出来ます。
ありがとうございました。

## で、結局、これはコールバック関数なのか？

結論から言うと、見ていたソースでは、以下の二つの意味でXX_callback()という関数名が使われていた。

1. (後で関数を)コールバック(してもらう事を依頼する)関数
2. (本来の意味での)コールバック関数

ううん、これ、１に関しては、少なくとも引数の数と種類が同じなら、一つの関数にまとめておくべきだよね……。

以上。
[JavaScript] プロパティ確認のメソッドなどが継承追ったり列挙不能も考慮するか

## プロパティ確認のメソッドなどが継承追ったり列挙不能も考慮するか　の自分用メモ

* 2015/08/22
  * 廃止された for each-in を削除
  * for-of を追加し、Iterator とまとめる

||列挙可能のみ|列挙不能も|
|:-:|:-:|:-:|
|自身のみ|①|②|
|継承追う|③|④|

#### ① 自身のみ 列挙可能のみ

* `Object#propertyIsEnumerable(key)` ... 真偽値
* `Object.keys(obj)` ... 配列
* `for-of Iterator(obj)` ... key, value のループ
* `for-of Iterator(obj, true)` ... key のループ

#### ② 自身のみ 列挙不能も

* `Object#hasOwnProperty(key)` ... 真偽値
* `Object.getOwnPropertyNames(obj)` ... 配列

#### ③ 継承追う 列挙可能のみ

* `for-in` ... propのループ

#### ④ 継承追う 列挙不能も

* ドットアクセス（`.`）・ブラケットアクセス（`[` `]`）
* `in` 演算子 ... 真偽値

##確認

```js
var parent = {};
var obj = Object.create(parent);
Object.defineProperties(parent, {
  'parent2': { value: 'p2', enumerable: false },
  'parent1': { value: 'p1', enumerable: true },
});
Object.defineProperties(obj, {
  'self2': { value: 's2', enumerable: false },
  'self1': { value: 's1', enumerable: true },
});

// ① 自身のみ 列挙可能のみ
obj.propertyIsEnumerable('no'); //=> false
obj.propertyIsEnumerable('parent2'); //=> false
obj.propertyIsEnumerable('parent1'); //=> false
obj.propertyIsEnumerable('self2'); //=> false
obj.propertyIsEnumerable('self1'); //=> true
Object.keys(obj); //=> ['self1']
for(let key of Iterator(obj, true)) console.log(key); //=> 'self1'
for(let[key, val] of Iterator(obj)) console.log(key, val); //=> 'self1' 's1'

// ② 自身のみ 列挙不能も
obj.hasOwnProperty('no'); //=> false
obj.hasOwnProperty('parent2'); //=> false
obj.hasOwnProperty('parent1'); //=> false
obj.hasOwnProperty('self2'); //=> true
obj.hasOwnProperty('self1'); //=> true
Object.getOwnPropertyNames(obj); //=> ['self2', 'self1']

// ③ 継承追う 列挙可能のみ
for(let key in obj) console.log(key); //=> 'self1', 'parent1'

// ④ 継承追う 列挙不能も
'no' in obj; //=> false
'parent2' in obj; //=> true
'parent1' in obj; //=> true
'self2' in obj; //=> true
'self1' in obj; //=> true
```
Ubuntu 13.10でkeymapを修正する方法

職場でHHK使ってたら日本語キーボードでのEscapeキーの場所がどうにも遠く感じるようになったので、keymapを書き換えます。

# やりたいこと
以下のようにキーをremapする

* 無変換キー → 全角/半角
* 全角/半角 → エスケープ

無変換キー本来の機能は潰れますが、そもそもほとんどまともに使用したことがなかったので問題ないです。

# やり方
だいたい次の説明通りです。

* [keyboard - How do I remap certain keys? - Ask Ubuntu](http://askubuntu.com/questions/24916/how-do-i-remap-certain-keys#answer-24930)

```shell-session
sudo apt-get install xev xmodmap
xmodmap -e "keycode 102 = Zenkaku_Hankaku" -e "keycode 49 = Escape"
xmodmap -pke > ~/.Xmodmap
echo "xmodmap $HOME/.Xmodmap" >> ~/.bashrc
```

# 終わり
ホームディレクトリにファイルとしてキーマップを保存するようになったので、これでOSを入れ替えてもキーマップは再設定する必要がなくなりました(xmodmapが入っていれば)。

# 2014/03/23追記

どうやらubuntu 13.10か13.04から.xinitrcが実行されないようです。
なんとかならないかと調べてみたんですがubuntuの仕様変更ゆえやむなし？しょうが無いのでbashrc(zshrc)に書いてます。
ただ、この方法だとconsole開かないと反映されない・・・
ParseのREST APIでユーザー認証とデータの読み書き


[Parse](https://www.parse.com/)のREST APIを試してみた。やりたいことは次の二つ。

* username/passwordでサインアップ
* サインアップしたユーザーにしかread/writeできない権限でデータをポスト

### サインアップ

まずはサインアップ。

`/users`に対して`username`と`password`をPOSTする。データ形式は`application/json`しか受け付けないらしい。

```
$ curl -X POST \
       -H "X-Parse-Application-Id: $PARSE_APP_ID" \
       -H "X-Parse-REST-API-Key: $PARSE_REST_API_KEY" \
       -H 'Content-Type: application/json' \
       -d '{"username":"myname", "password":"hoge"}' \
       https://api.parse.com/1/users
```

成功すると次のようなデータが返ってくる。

```json
{
    "createdAt":"2014-03-21T14:32:04.522Z",
    "objectId":"3t829izrt4",
    "sessionToken":"yeoql2dvn7whpm4tbe61viscv"
}
```

この`objectId`と`sessionToken`は後から使う。

ちなみに`objectId`や`sessionToken`は`/login`にリクエストすることで再取得可能。

```
$ curl -X GET \
       -H "X-Parse-Application-Id: $PARSE_APP_ID" \
       -H "X-Parse-REST-API-Key: $PARSE_REST_API_KEY" \
       'https://api.parse.com/1/login?username=myname&password=hoge'
```


### データの追加

次に、`Note`というClass（RDBでいうテーブルにあたるもの。ParseではClassと呼ぶらしい）に今サインアップしたユーザーにしか読み書きできないデータを追加する。

```
$ curl -X POST \
       -H "X-Parse-Application-Id: $PARSE_APP_ID" \
       -H "X-Parse-REST-API-Key: $PARSE_REST_API_KEY" \
       -H 'Content-Type: application/json' \
       -d '{"text": "hoge", "ACL": {"3t829izrt4": {"read": true, "write": true }}}' \
       https://api.parse.com/1/classes/Note
```

POSTするデータの`ACL`にユーザーのobjectIdをキーにしてread、writeがtrueになるようなオブジェクトを指定することでそのユーザーにしか読み書きできないようにできる。

### データの取得

つくったデータが自分にしか読めないか確認してみる。`X-Parse-Session-Token`にユーザー`sessionToken`を指定するのがポイント。

```
$ curl -X GET \
       -H "X-Parse-Application-Id: $PARSE_APP_ID" \
       -H "X-Parse-REST-API-Key: $PARSE_REST_API_KEY" \
       -H "X-Parse-Session-Token: yeoql2dvn7whpm4tbe61viscv" \
       https://api.parse.com/1/classes/Note

{"results":[{"text":"hoge","createdAt":"2014-03-21T14:45:50.148Z","updatedAt":"2014-03-21T14:45:50.148Z","objectId":"7Ki9ZmPC2b","ACL":{"3t829izrt4":{"read":true,"write":true}}}]}
```

取得できてる。

自分しか読めないかどうかは別のユーザーを作ってみて同じリクエストを投げてみればわかる。

```
$ curl -X GET \
       -H "X-Parse-Application-Id: $PARSE_APP_ID" \
       -H "X-Parse-REST-API-Key: $PARSE_REST_API_KEY" \
       -H "X-Parse-Session-Token: utbstfsrvvlt2osvfayqnx44" \
       https://api.parse.com/1/classes/Note

{"results":[]}
```

このように確かに他のユーザーからは取得できないのがわかる。

### データの更新

データの更新も同じように`X-Parse-Session-Token`をつけて投げるだけ。

```
$ curl -X PUT \
       -H "X-Parse-Application-Id: $PARSE_APP_ID" \
       -H "X-Parse-REST-API-Key: $PARSE_REST_API_KEY" \
       -H "X-Parse-Session-Token: yeoql2dvn7whpm4tbe61viscv" \
       -H 'Content-Type: application/json' \
       -d '{"text": "updated!"}' \
       https://api.parse.com/1/classes/Note/7Ki9ZmPC2b
```

できてしまえば簡単だけどできることが多くてドキュメントから目的のものを探すのが大変だった。
Ajax依存サイトにおけるGoogle Analyticsトラッキングコードの正しい使い方(jQuery編)

##Google Analyticsって便利だよね、うんうん
WEBサービスを作ったらアクセス解析をしたいですね。そうすると多くの人はGoogle Analyticsを利用することになります。言わずと知れたGoogle社製アクセス解析サービスです。

アカウントを作ってホストを登録しますとこんなJSのコード（トラッキングコード）が発行されます。
（これは拙作 http://j.inthemaking.net/ のもの）

```html
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-48716649-1', 'inthemaking.net');
  ga('send', 'pageview');

</script>

```

Googleが解説するとおりにこのコードをページ(text/html)のどこかにペーストしておけばそれだけで、訪問者のページビューごとにリクエストの詳細がgoogle-analytics.comに送信されます。こんな簡単に高度なアクセス解析が始められるんですからたいしたものです。

##しか〜し！Ajaxに弱くね？
しかし、一点困ったことがあります。言われたとおりにコードを設置しても、ページ内にある、非同期通信でリクエストされる他のコンテンツはカウントされません。上述のコードは「ページ」(document単位)での利用を前提にしているからですね。これはAjax依存サイトには手痛いです。

とりわけ、拙作 http://j.inthemaking.net/ の場合は、完全Ajaxサイトでして、GET / で返される text/html 中のJSによって、画面に表示されるすべての動的なコンテンツをjsonフォーマットで非同期取得する仕様です。ページ遷移はまったくありません。ユーザがページリロードを行わずにAjaxだけで利用し続ければ、その後はPVも訪問数まったくカウントされません。いやいや困った。。。

##かんたん解決策
さて、前置きが重くなりましたが、解決策です。しかも、けっこう簡単です。

今回のサービスではAjaxライブラリとしてjQueryを使っています。
jQueryの場合、
ajaxSuccess( handler(event, XMLHttpRequest, ajaxOptions) )
というAjax設定メソッドが用意されています。これを使うとフロントエンドアプリケーションで **Ajaxリクエストが成功に終わった場合に常に行うこと** がグローバルに定義できます。

さっそくやってみます。

```js
$(document).ajaxSuccess(function(event, xhr, settings){
    ga('send','pageview', settings.url);
});
```

これをお決まりのアレの直後にでも書いておきます。こんな感じ。
(直前に書いても、ready()の前にメソッドチェーンしてもいける気がしますが検証はしてません)

```js
$(document).ready(function(){
    $(document).ajaxSuccess(function(event, xhr, settings){
        ga('send','pageview', settings.url);
    });
```

これだけです。あっさり。 **ほらAnalyticsがXHRに反応してます。**
![スクリーンショット 2014-03-21 23.37.30.png](https://qiita-image-store.s3.amazonaws.com/0/4335/73d7e4ce-c39a-5a0d-650c-f889f3c2fb0b.png)

カウントしたくないXHRがあればif文でフィルターするなりすればいいでしょう。

以上です！

* * *
#告知
というか宣伝ですが、このエントリーも関係してますが、
###2chまとめ巡査長β2
http://j.inthemaking.net/
というのを俺得用に作ってみました。2chまとめサイトのまとめです。PCでも見れますがスマホ用です。
よろしければ暇つぶしに使ってご感想いただければ嬉しいです。
rbenvでrubyの2.0.0がないよって言われたとき

# rbenv alias

```
$ bundle config
rbenv: version `2.0.0' is not installed
```

ってのがでたときに

```
$ brew install rbenv-aliases

$ rbenv alias --auto

$ bundle config
Settings are listed in order of priority. The top value will be used.
path
Set for your local app (/Users/blabbers/repos/rspec_rails_4/.bundle/config): "vendor/bundle"

disable_shared_gems
Set for your local app (/Users/blabbers/repos/rspec_rails_4/.bundle/config): "1"
```

これで大丈夫！

## github

https://github.com/tpope/rbenv-aliases
Pythonで実行時間を計測する方法 その2

# Pythonで実行時間を計測する方法 その2

[実行時間を計測するためのデコレータ その1](http://qiita.com/intermezzo-fr/items/9ac2916a9155d5317ebc)で使ったデコレータは実行時間を返していました。
デコレートする関数のもともとの値を返しつつ、実行時間を表示するには以下のようにする。
printで標準出力に出力していますが、loggingモジュールなどを使うのもいいと思います。

## timeデコレータの再定義

```py
def time(func):
    """
    デバッグ用デコレータ
    実効時間を表示するデコレータ
    """
    import functools
    import datetime
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = datetime.datetime.today()
        print '-------------------------------------------------------------'
        print func
        print '----------------------------------'
        print 'start:', start
        result = func(*args, **kwargs)
        end = datetime.datetime.today()
        print 'end:', end
        print '----------------------------------'
        print 'running:', end - start
        print '-------------------------------------------------------------'
        return result
    return wrapper
```

## timeデコレータの実行

[実行時間を計測するためのデコレータ その1](http://qiita.com/drafts/9ac2916a9155d5317ebc/)で使ったtestfunc1に対して、新しいデコレータを用いてみました。

```pycon
>>> testfunc1(rangelist)
-------------------------------------------------------------
<function testfunc1 at 0x01c40590>
----------------------------------
start: 2014-03-21 23:21:01.947000
end: 2014-03-21 23:21:02.362000
----------------------------------
running: 0:00:00.415000
-------------------------------------------------------------
```

ちゃんと実行時間が表示されました。

## 何もしないデコレータ

デバッグしたくないときに、いちいち関数定義を書き換えに行くのが面倒なときは、何もしないデコレータでtimeデコレータを上書きすればよいです。
なお、使ってみればわかると思いますが、IPython等でtabによる引数の補完ができなくなります。せっかくfunctools.wapasを用いているのだからdocstringをちゃんと書けば、docstringはデコレータでラップした関数でも表示できます。

```py
def time(func):
    """
    何もしないデコレータ
    """
    import functools
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper
```
PHP5.6.0α PHPで累乗根を求める

PHPには立方根など累乗根(冪根)を求める関数がありませんでした。

自作関数が[StackOverflow](http://stackoverflow.com/questions/11242920/calculating-nth-root-with-bcmath-in-php)にありましたが、わりとめんどいです。
というかこのNRoot()、NRoot('64','3')に'3'、NRoot('65','3')に'4'、NRoot('66','3')に'5'を返してくるんだがこれ合ってるのか？

[PHP5.6](https://github.com/php/php-src/blob/php-5.6.0alpha3/NEWS)では、このような怪しい自作関数に頼る必要はありません。

> 23 Jan 2014, PHP 5.6.0 Alpha 1
> Added gmp_root() and gmp_rootrem() functions for calculating nth roots.

```php
<?php
	gmp_root('63', '3'), // 3
	gmp_root('64', '3'), // 4
	gmp_root('65', '3'), // 4
	gmp_rootrem('63', '3'), // 3あまり36
	gmp_rootrem('64', '3'), // 4あまり0
	gmp_rootrem('65', '3')  // 4あまり1
```

便利。
まあ累乗根なんていつ使うんだよという話ですが。
あとあくまで整数部分だけを返してくる関数なので、小数点以下まで求めたい場合はいったん1000を掛けてから計算してやる必要があります。

ところで、GMP演算の返り値はGMPオブジェクトです。
これまでGMPリソースを扱う場合は、ただの足し算でも
`$c = gmp_add($a, $b);`
などと書く必要がありました。

PHP5.6では[GMPの演算子オーバーロード](https://wiki.php.net/rfc/operator_overloading_gmp)もサポートされました。

```php
<?php
	gmp_init(1) + 2; // GMP(3)
	gmp_init(1) + '1234567890123456789012345678901234567890'; // GMP(123456789012345678901234567891)
	1 + '1234567890123456789012345678901234567890'; // float(1.2345678901235E+29)
```

GMPオブジェクトに対して演算を行った場合、GMPとして透過的に取り扱ってくれます。
これでもう`gmp_add(gmp_add(gmp_add(gmp_add(gmp_init(1), 2), 3), 4), 5);`なんて書かずにすみます。

もうひとつ数学関連の機能追加がありました。

> 13 Feb 2014, PHP 5.6.0 Alpha 2
> Added T_POW (**) operator

```php
<?php
	print(5 ** 3); // 125
	2 ** 3 ** 4;	// float(2.4178516392293E+24)
	gmp_init(2) ** 3 ** 4; // GMP(2417851639229258349412352)
```

累乗演算子が追加になった模様。
こちらはpow()やgmp_pow()があるのであまり恩恵はない気もしますが、上記演算子オーバーロードと合わせるとその威力は歴然。

マニュアルの[演算子](http://www.php.net/manual/ja/language.operators.precedence.php)の項目にはまだ載っていません。
優先順位は「*/%」のひとつ上で、かなり優先度高めでした。

これでPHPでも実用的な数学計算が行えますね。
まあそういうのはFORTRANやMATLABとかに任せとけよって話ですが。
Clojure CookbookのCreative Commons公開版をKindleで読む

## Clojure Cookbook出版!
Clojure Cookbookが米国で出版されました[1][2]. この書籍は，クリエイティブ・コモンズ（非営利・改変禁止）ライセンスでgithubにおいて公開されています[3].

というわけで，貧乏な人間としては，mobiフォーマットに変換してKindleで読めるようにしたいですね！　注:貧乏で無い人はお金を出して買いましょう.

さて，githubのREADME.mdを見ればわかるように,この本はasciidocというツールを用いて書かれています。以下の手順を踏むことで、これをmobiフォーマットに変換することが可能です。環境はMacOS Xを想定しています。インストール以外は他プラットフォームでも同じはずです。

## 準備
macportsを使って必要なツールをインストールします。

```lang:sh
$ sudo port install asciidoc 
```

次に、Clojure Cookbookのリポジトリを手元に落としておきます

```lang:sh
$ git clone https://github.com/clojure-cookbook/clojure-cookbook.git
$ cd clojure-cookbook
```

変換のための下準備が必要なので以下のコマンドを実行します

```lang:sh
$ SOURCE_HIGHLIGHT_DIR=/opt/local/share/source-highlight ./script/asciidoc/bootstrap_osx.sh
```

注：環境によってsource-highlightがインストールされている場所が異なると思います。もし上記の場所で無い場合は探してください。

## 変換
いよいよ変換します。まずはHTMLに変換してみます。

```lang:sh
$ asciidoc -n -d book -b html5 -a toc2 -a toclevel=2 book.asciidoc
```
このコマンドでbook.htmlというファイルが生成されたはずです。ブラウザで開いてみます。

![Screen Shot 2014-03-21 at 19.23.22.png](https://qiita-image-store.s3.amazonaws.com/0/17540/b77bd9bb-56f0-4657-3495-388e4e8979f5.png)


`-a toc2`オプションによって、左側に目次が表示され、右側に本文が表示されています。

次に、mobiへ変換するための段階としてepubフォーマットを生成します。以下のコマンドを実行します.

```lang:sh
$ a2x -a toc2 -a toclevel=2 -k -f epub -d book --icons --fop book.asciidoc
```
これによって、book.epubが生成されたはずです.

最後にepubをKindle用フォーマットのmobiへ変換しましょう.これはいろいろやり方があるのですが,ここではCalibre[4]というツールを使いました.この部分は省略します。Calibreは電子書籍を管理できる多用途のGUIツールで、直感的に使うことができますので説明はあまり要らないと思います。

Enjoy Clojure programming!

参考文献：
[1] http://clojure-cookbook.com/
[2] http://www.amazon.co.jp/dp/B00IT6XZ0O/
[3] https://github.com/clojure-cookbook/clojure-cookbook
[4] http://calibre-ebook.com/
UIGraphicsBeginImageContextの無駄

よく、以下のようなコードでオフスクリーンコンテキストを作成し、
描画の後画像を得るサンプルを見ます。
コードが単純なためか、非常に広く使われていると思います。

```objc
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(1024, 1024), NO, 1.0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextFillEllipseInRect(context, CGRectMake(0, 0, 1024, 1024));
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
```

ですが、これは本来やらなくていい処理をしていると思いませんか？
というのも、
描画のためのコンテキストを一度作成し、UIGraphicsGetImageFromCurrentImageContextでわざわざコピーしてきているのです。
メモリを用意して、そこに描画して、それをそのまま画像にすれば、
この無駄なコピーは本来発生しないはずなんです。
その点を考慮に入れると、本来最小限のコードは例えば以下のようになるかと思います。

補助関数

```objc
static void bufferFree(void *info, const void *data, size_t size)
{
    free((void *)data);
}
static size_t align16(size_t size)
{
	if(size == 0)
		return 0;
    
	return (((size - 1) >> 4) << 4) + 16;
}
```

メイン処理

```objc
    size_t width = 1000;
    size_t height = 1000;
    size_t bitsPerComponent = 8;
    size_t bytesPerRow = align16(4 * width);
    size_t bufferSize = bytesPerRow * height;
    uint8_t *bytes = malloc(bufferSize);
    CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrderDefault;
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
    CGContextRef context = CGBitmapContextCreate(bytes, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo);
    CGContextClearRect(context, CGRectMake(0, 0, width, height));
    CGContextFillEllipseInRect(context, CGRectMake(0, 0, width, height));
    CGContextRelease(context);
    context = NULL;
    
    CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, bytes, bufferSize, bufferFree);
    size_t bitsPerPixel = 32;
    CGImageRef image = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitmapInfo, dataProvider, NULL, NO, kCGRenderingIntentDefault);
    CGDataProviderRelease(dataProvider);
    dataProvider = NULL;
    CGColorSpaceRelease(colorSpace);
    colorSpace = NULL;
    
    CGImageRelease(image);
```

ポイントはCGBitmapContextCreateに自分で用意したメモリを使ってもらう点です。
描画が終われば、即座にコンテキストは捨ててしまい、
ラスターデータだけが残るので、そのままCGImageのバッファとして、CGDataProviderCreateWithDataを通して使用します。
bytesPerRowを16バイトアラインメントが推奨されているので、対応してあげる事、
など少し気を配っておいた方がいい点もあります。

というわけで、これにより無駄なコピーを避ける事ができます。
若干コードが多いため、
使い回すなら、関数やクラスに加工して使うと良いでしょう。

画像の扱いは負荷が高いため、
気づくとCPU負荷があがりすぎていたりすると思いますので、気になる場合は試してみてはいかがでしょうか。
ScrapyでItem Pipelineにsettingsを渡す方法

from_settingsだけ定義すると、Item Pipelineごして有効にならない。
下記のように、__init__でちゃんと定義し直す必要がある。

```py
class MySQLStorePipeline(object):

    @classmethod
    def from_settings(cls, settings):
        return cls(settings.get('DB_SETTING'))

    def __init__(self, db_settings):
        db.init_session(db_settings)

    def process_item(self, item, spider):
        shop = Shop(
            brand_id=1,
            name=item['name'],
            address=item['address'])
        db.db_session.add(shop)
        db.db_session.commit()
        return item
```
python+OpenCVで顔認識をやってみる

「顔認識ってサクッとできないのー？」って聞かれたので試してみた。
細かいチューニングとかはできてない。

#インストール
Macだと結構簡単。OpenCVをbrewを使ってインストールする。
pythonはbrewで入れたものを使ってる。
numpyも必要みたいだけど、インストール済みだったんで省略。
どうやら、OpenCVをインストールする時にPython用のパッケージcv2がsite-packageにコピーされるみたいなので、インストール順としてはPython→numpy→OpenCVがいいみたい。

```bash:bash
brew tap homebrew/science
brew install opencv
```

#Pythonで動かす

とりあえず、先にコードを晒す。
試行錯誤に使った時のコメントも、汚いけど残しておくことにした。
パラメータチューニング用の説明まで残しているがｗｗｗ

```python:recognize.py
# -*- coding: utf-8 -*-

import cv2

#HAAR分類器の顔検出用の特徴量
#cascade_path = "/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml"
cascade_path = "/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"
#cascade_path = "/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_alt2.xml"
#cascade_path = "/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_alt_tree.xml"


image_path = "lena.jpg"

color = (255, 255, 255) #白
#color = (0, 0, 0) #黒

#ファイル読み込み
image = cv2.imread(image_path)
#グレースケール変換
image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)

#カスケード分類器の特徴量を取得する
cascade = cv2.CascadeClassifier(cascade_path)

#物体認識（顔認識）の実行
#image – CV_8U 型の行列．ここに格納されている画像中から物体が検出されます
#objects – 矩形を要素とするベクトル．それぞれの矩形は，検出した物体を含みます
#scaleFactor – 各画像スケールにおける縮小量を表します
#minNeighbors – 物体候補となる矩形は，最低でもこの数だけの近傍矩形を含む必要があります
#flags – このパラメータは，新しいカスケードでは利用されません．古いカスケードに対しては，cvHaarDetectObjects 関数の場合と同じ意味を持ちます
#minSize – 物体が取り得る最小サイズ．これよりも小さい物体は無視されます
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
#facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=3, minSize=(10, 10), flags = cv2.cv.CV_HAAR_SCALE_IMAGE)

print "face rectangle"
print facerect

if len(facerect) > 0:
	#検出した顔を囲む矩形の作成
	for rect in facerect:
		cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)
	
	#認識結果の保存
	cv2.imwrite("detected.jpg", image)
```

今回は学習用の画像を用意していないので、OpenCVに一緒に付いているHAAR分類器の特徴量を利用している。HAAR分類器についてはこちらを参照（[第１０回CV勉強会 OpenCV祭り 物体検出徹底解説！](http://www.slideshare.net/takmin/opecv-object-detectiontakmin opencv)）。
有名なレナさんの画像だとどの特徴量でも認識できたが、他の画像で試すとhaarcascade_frontalface_default.xmlはあんまり上手く認識できなかったので、色々試したほうが良さげ。


元の画像
![lena.jpg](https://qiita-image-store.s3.amazonaws.com/0/12165/5ac8989e-8710-214d-1c2a-008476953a94.jpeg)

認識後の画像
![detected.jpg](https://qiita-image-store.s3.amazonaws.com/0/12165/b4ff469a-5ae3-0220-63bc-6a4e8fd633fb.jpeg)
１文字削除して次の行に


htmlとscriptがごちゃごたしているときとか、タブがうまく動かないので、C-d C-nが使うことが多かったので、あまり使わないけど打ちやすい場所にバインドしてみた

```
;; 1文字削除して次の行に
(global-set-key "\C-x\C-n" (kbd "C-d C-n"))
;; 2文字削除して次の行に
(global-set-key "\C-c\C-n" (kbd "C-d C-d C-n"))
```

```
C-u 5 C-x C-n
```
とかで5行分1文字削除することができる
Pythonで実行時間を計測する方法 その1

# Pythonで実行時間を計測する方法 その1

IPythonで実行時間を計測するには、%timeitなどのマジックコマンドを用いればいいのですが、IPythonが入っていない環境で実行時間を計測したくなった場合は以下のようにデコレータを用いる方法があります。

> 続き: [Pythonで実行時間を計測する方法 その2](http://qiita.com/intermezzo-fr/items/f8263f171c597eec875e)

## timeデコレータの定義

高階関数を定義するのに便利な[functools](http://docs.python.jp/2/library/functools.html)を使って、デコレータを定義します。
functoolsをデコレータで用いる意味については、この記事の末尾の参照の記事を見てください。

```py
def time(func):
    import functools
    import datetime
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = datetime.datetime.today()
        result = func(*args, **kwargs)
        end = datetime.datetime.today()
        return end - start
    return wrapper
```

## timeデコレータで関数をデコレート

[Pythonのリスト内包表記](http://qiita.com/intermezzo-fr/items/43f90e07e4cebe63aeb6)で使った関数に対してデコレータを試します。
上で定義したtimeデコレータを使うには、関数定義が始まる前の行に@timeを付けます。
もともとの関数の中身は何も変えていないことに注目して頂きたいと思います。

```py
# 1. testfunc1: 空リストを用意してappend
@time
def testfunc1(rangelist):
    templist = []
    for temp in rangelist:
        templist.append(temp)

# 2. testfunc2: 1+appendをオブジェクト化
@time  
def testfunc2(rangelist):
    templist = []
    append = templist.append
    for temp in rangelist:
        append(temp)

# 3. testfunc3: リスト内包表記
@time
def testfunc3(rangelist):
    templist = [temp for temp in rangelist]
```


## デコレータ付き関数の実行

デコレータを付けた関数を呼び出してみました。

```pycon
>>> rangelist = range(1,10000000)
>>> testfunc1(rangelist)
datetime.timedelta(0, 0, 303000)
>>> testfunc2(rangelist)
datetime.timedelta(0, 0, 267000)
>>> testfunc3(rangelist)
datetime.timedelta(0, 0, 70000)
```

## 10回実行して平均をとる

10回実行して、平均をとるには以下のようにします。

本当は、一回目の結果を捨てたり、いろいろしないといけない気がしますが、気にしないことにします。

```pycon
>>> print reduce(lambda x, y: x + y, [testfunc1(rangelist) for temp in range(10)])/10
0:00:00.266600
>>> print reduce(lambda x, y: x + y, [testfunc2(rangelist) for temp in range(10)])/10
0:00:00.246300
>>> print reduce(lambda x, y: x + y, [testfunc3(rangelist) for temp in range(10)])/10
0:00:00.056100
```

> sumを使ったらうまくいかなかったので、reduceにしました。

## 参考
functoolについては、以下のサイトを参考にしました。

* [スコトプリゴニエフスク通信 - デコレータを書く時にはfunctools.wrapsを使おう](http://perezvon.hatenablog.com/entry/20090427/1240838573)
* [kk6のメモ帳* - Pythonのデコレータを理解するときに残したメモ](http://kk6.hateblo.jp/entry/20120616/1339803112, "kk6のメモ帳*")
ScrapyをScriptから実行する際のスクリプト

[Run Scrapy from a script](http://doc.scrapy.org/en/latest/topics/practices.html)

Scrapyの公式ドキュメントにあるようなスクリプトだと、なぜかちゃんと動かなかった。
（クローリング対象は日本語のサイト）

```py
spider = FollowAllSpider(domain='scrapinghub.com')
settings = get_project_settings()
crawler = Crawler(settings)
crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
reactor.run()
```

そこで、コマンドラインツール(scrapy crawl hogehoge)からの実行と同じように、Log周りの記述を修正したら動いた。

```py
spider = FollowAllSpider(domain='scrapinghub.com')
settings = get_project_settings()
crawler = Crawler(settings)
crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
log.start_from_crawler(crawler)
crawler.configure()
crawler.crawl(spider)
crawler.start()
reactor.run()
```

原因は、log.start()で実行すると、logがcrawlerを受け取らないからっぽい。
が、crawlerがないと動かない理由は不明。

```py:scrapy/log.py
def start_from_crawler(crawler):
    return start_from_settings(crawler.settings, crawler)
```
【Windows】バッチファイルで文字列操作

# 部分文字列

文字列の5番目から2文字を抽出。(一文字目が0番目)

```bat
C:\>set V=ABCDEFGHIJKL
C:\>echo %V:~5,2%
FG
```

# 置換

文字列 "/" を " "(空白) に置換する

```bat
C:\>set dt=%date%
C:\>set dt
dt=2011/08/24
C:\>echo %dt:/= %
2011 08 24
```

# 参考サイト

http://www.atmarkit.co.jp/ait/articles/0405/01/news002.html
twicli プラグイン regexp 使用例


みなさん快適な [twicli](http://www.geocities.jp/twicli/) ライフを満喫しているでしょうか？
今更ながら使い始めたプラグインが便利なので紹介します。

標準のプラグインで regexp.js というツイートを抽出するプラグインがあります。
抽出だけでなく、タイムラインからツイートを非表示にすることもできるので、普段は目にしたくないツイートを分けておくことができます。
解説は [twicliプラグイン：ID/発言内容抽出タブ追加 - Okiraku Programming](http://d.hatena.ne.jp/NeoCat/20090101#20090101fn2) を読んでください。

私は、こんな感じで設定しています。

- TL
    - 特定サービスからのツイートは別タブへ
    - 特定の言葉が入っていたら別タブへ
    - アニメのハッシュタグは別タブへ
    - 基本的に無視したいサービスだけど、特定アカウントのものだけはTLに流す
- ほか
    - 特定アカウントからのツイートは抹消
    - 特定サービスからのツイートは抹消

```
別::via (foursquare|TwiroboJP|Tweet Old Post|twimaker|DIVA.NET|World Community Grid|DeemoRayark|このまま死ぬ #konomamashinu|Ask.fm|Animetick|Rebootter|IFTTT|SoundTracking|autotweety.net|Bitly|ブクログ\(booklog.jp\)):1
別::提督|艦これ|艦コレ|frontale|村上春樹|shindanmaker.com|spulse|ingress|ゴリ貴族|NEWGAME!|ドルトムント|フロンターレ:1
別::#(danmachi|wagnaria|nicoch):1
含:./kotobamemo:via twittbot.net:1

別:toohenboku|CheckNAU|mashupplus|JapanTrending|qecicufuxudi1|gundamfanclub|trendpartner|100pFollow|trendpartner|info_box_sky::4
別::via (dlvr.it|おいでよ パクツイの森|診断くん|トルネ|あにみた！|WiTwit|Fitbit|ツイ廃あらーと|リプライ数チェッカ|ツイ助。|Paper.li):4
別::#torne:4
```

他にも色々と抽出のパターンが解説に書かれているので、今までの不満を解消できるかもしれません。お試しあれ。
Rails2.3系:ハッシュからモデルをcreateするときidを指定したい

id は黙示的に protected になっているため、ハッシュ内に {:id => 999, … } などと指定しても、rails側で無視されてしまう。

ググってみたら StackOverFlow のページが出てきたのでそれを参考にユーティリティクラスを作ってみた

```ruby:utility.rb
# -*- coding: utf-8 -*-
class Utility
  def self.disable_protection(*model_classes)
    model_classes.each do |clazz|
      clazz.send(:define_method, :attributes_protected_by_default) do
        []    # 通常 ["id", "type"] を返すところ、空の配列にすることで全てのカラムに対してハッシュから値を格納できるようにする
      end
    end
  end
end
```

使い方

```
Utility.disable_protection(Hoge)
result = Hoge.create(:id => 999, :name => "hoge")
```

※注意: disable_protection を呼び出した以降、スクリプト終了までの間Hogeはprotection無しの状態になるので seed など特定の場面でのみ使用すべき。


# 参考

http://stackoverflow.com/questions/431617/overriding-id-on-create-in-activerecord
Cocos2d-x V3.0 rc0をインストールしてみた


##ここからダウンロード
http://www.cocos2d-x.org/download

`Download v3.0rc0` からどうぞ。
zipで落ちてくるので、てきとうなところに解凍しましょ。

##プロジェクト作る
```bash
$ cd cocos2d-x-3.0rc0/
$ ./setup.py
```

`android-ndk` `android-sdk` `ant` の場所を聞かれるので、それぞれの場所を教えてあげましょう。

```bash
$ source ~/.bash_profile
```
bash_profieを反映します。
`setup.py` がパスを通してくれたようで、cocosコマンドが使えるように！

```bash
$ cocos new TestPj -p com.hoge.testpj -l cpp -d ~/Documents/
```
とすると新しくCocosプロジェクトを作成できます。

- `TestPj ` : プロジェクト名
- `-p com.hoge.testpj` : Androidのパッケージ名
- `-l cpp` : 言語 (`cpp`か`lua`が選べます)
- `-d ~/Documents/` : 作成場所

これで作成完了。

##iOSで動かしてみる
```bash
$ cd ~/Documents/TestPj
$ cocos run -p ios
```
これだけ。iOSシミュレータが起動し、ターミナルにはログとか出ます。簡単になりましたなー。

##Androidで動かしてみる
```bash
$ cd ~/Documents/TestPj
$ cocos run -p android
```
いけるかな？と思ったんだけど、ANT_ROOTが無ぇ！って怒られたので `.bash_profile` を編集しました。

```.bash_profile
export ANT_ROOT=/YOUR_PATH/apache-ant-1.9.3/bin
export PATH=$ANT_ROOT:$PATH
```
この2行追加して

```bash
$ source ~/.bash_profile
```
で

```bash
$ cd ~/Documents/TestPj
$ cocos run -p android
```

見事に動きました。簡単になりましたなー（2回め）。
UIGraphicsBeginImageContextWithOptionsを多用する場合


[Blockを使って変数スコープを作成するカテゴリ(tomohisaotaさん)](http://qiita.com/tomohisaota/items/b506dadb3583a943fcf7)の投稿を見て思い出したのですが、以前開発していたアプリでは、UIGraphicsBeginImageContextWithOptionsを使った以下のようなコードが頻出していました。

```objectivec:Before
- (void)before
{
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), NO, 0);
    CGContextRef c = UIGraphicsGetCurrentContext();
    
    // 描画コード
    
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    // imgを使ってなんかする
}
```

検索したら36個も...

毎回初期化と後始末付近は同じパターンなので、お決まりの部分は共通化してBlocksでやった方が賢いかもしれませんね。

## 共通化したソース

```objectivec:UIImage+TSKit.m
@implementation UIImage (TSKit)

+ (UIImage *)ts_imageWithSize:(CGSize)size opaque:(BOOL)opaque scale:(CGFloat)scale render:(void (^)(CGContextRef c))render
{
    UIGraphicsBeginImageContextWithOptions(size, opaque, scale);
    render(UIGraphicsGetCurrentContext());
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

@end
```

## 使い方サンプル

```objectivec
- (void)after
{
    UIImage *img = [UIImage ts_imageWithSize:CGSizeMake(100, 100) opaque:NO scale:0 render:^(CGContextRef c) {
        // 描画コード
		CGContextSetRGBFillColor(c, 1, 0, 0, 1);
        CGContextFillEllipseInRect(c, CGRectMake(0, 0, 100, 100));
    }];
    
    // imgを使ってなんかする
}
```


「よく使うカテゴリー集！」のような物にはもう入っていそうではありますが...

まだ自分でも使っていないので、使用感はよくわかりません(^_^;)
Ubuntu 13.10でRubyからMeCabを使えるようにしたメモ

# MeCabをインストール

apt-getかaptitudeでインストールする。

```shell-session
sudo aptitude install mecab mecab-ipadic-utf8
```

`mecab`が使えるようになる。

```shell-session
$ mecab
吐き気を催す邪悪とは
吐き気	名詞,一般,*,*,*,*,吐き気,ハキケ,ハキケ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
催す	動詞,自立,*,*,五段・サ行,基本形,催す,モヨオス,モヨオス
邪悪	名詞,一般,*,*,*,*,邪悪,ジャアク,ジャアク
と	助詞,格助詞,一般,*,*,*,と,ト,ト
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
```

# Rubyバインディングをインストール

libmecab-devも必要らしい。

```shell-session
sudo aptitude install libmecab-dev
```

バインディングはMeCabとバージョンを合わせたほうがいいらしい。
今回は0.993。

```shell-session
$ mecab -v
mecab of 0.993
```
ここから選ぶ→ [Downloads - mecab - Japanese morphological analyzer - Google Project Hosting](https://code.google.com/p/mecab/downloads/list?can=2&q=ruby&sort=-filename&colspec=Filename%20Summary%20Uploaded%20ReleaseDate%20Size%20DownloadCount)

環境に合ったものが見つかったらダウンロードしてRubyGemsにインストール。

```

wget https://mecab.googlecode.com/files/mecab-ruby-0.993.tar.gz
tar zxvf mecab-ruby-0.993.tar.gz
cd mecab-ruby-0.993/
gem build mecab-ruby.gemspec
gem install mecab-ruby-0.99.gem
```
インストールが終わったら、ダウンロードしたものは消してOK。

# 使ってみる

```rb:test.rb
require 'MeCab'

m = MeCab::Tagger.new ("-Ochasen")
print m.parse ("ようこそ...『男の世界』へ....")
```

```shell-session:結果
ようこそ	ヨウコソ	ようこそ	感動詞		
...『	...『	...『	名詞-サ変接続		
男	オトコ	男	名詞-一般		
の	ノ	の	助詞-連体化		
世界	セカイ	世界	名詞-一般		
』	』	』	記号-括弧閉		
へ	ヘ	へ	助詞-格助詞-一般		
....	....	....	名詞-サ変接続		
EOS
```

さっきダウンロードしたフォルダに「test.rb」というサンプルも入っているので、そちらも実行してみるとベネ

# 参考にしたページ
- [テキストマイニングの初歩 Rubyで形態素解析を行う〜ruby-mecab | Scimpr Blog](http://blog.scimpr.com/2012/09/13/ruby%E3%81%A7%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90%E3%82%92%E8%A1%8C%E3%81%86%E3%80%9Cruby-mecab/)
- [ubuntu 11.10 にmecab, mecab-rubyをインストールする - Qiita](http://qiita.com/foloinfo/items/b6ef9d3cdb9f437ee8f2)
- [スクリプト言語のバインディング](https://mecab.googlecode.com/svn/trunk/mecab/doc/bindings.html)
某リネームツールの真似をバッチでどこまで出来るかやってみた

## 何故やろうとした
某リネームツールが便利そうだなぁと思いつつも、社内規定のシガラミとか製品マシンに入れるのはちょっと・・・ってな人に向けて。

（主に自分のため）

## どうなった

こうなった

[Gist - tren](https://gist.github.com/wokowa/9679723)

一応、バッチファイルをダブルクリックすれば、起動場所のファイル一覧（ディレクトリ含む）をメモ帳で開いて、書変えて保存後に閉じれば名前変えてくれます。

引数にディレクトリパスと対象ファイルも取れます。

ユーザテンポラリに一時ファイルを２つぐらい作るので気になる人は実行しないように。（処理終わったら消しますけどね）

## オプション・・・

途中で力尽きたので、オプションなんて無かった。

そもそもWSHとか使えって話ですね。（そうじゃない）
あるコミットがどのリリースか見つける

```bash
$ git name-rev コミットのハッシュ
```

#出力にbranchを含めたくない場合
```bash
$ git name-rev --tags コミットのハッシュ
```

#git logにtagをつけて出力
```bash
$git log HEAD~2..HEAD | git name-rev --stdin --tags
```
webistrano+apacheを使ってみる(ec-cubeを使ったサイト用検討)




デプロイツールソリューション検討
------------------------------------------------

	Mina Rocketeer Capistrano Fabric Cinnamon
	Webistrano

今回はGUIを使うことが前提だったので他のモノの方がPHPには向いていそうだったがCapistranoを使ってみる

導入メモ
------------------------------------------------

gitでレポジトリ管理

	サブディレクトリでデプロイする方法もありそうなので、ひとまずルートでgit initしておく

capistranoインストール

	capistranoは割とすぐ入った。
	gem install capistrano

webistranoインストール

	少しややこしくてちょっと手間取る
	rubyのバージョン周りの注意点はyum任せだったので元から0.8.7とかだったので苦労せずスルー。

	yum install make gcc-c++ curl-devel openssl-devel zlib-devel httpd httpd-devel ruby-devel rubygems mod_ssl
	// MySQLログインしてdatabase追加
	create database webistrano_development;
	create database webistrano_test;
	create database webistrano_production;

	// maigrate
	RAILS_ENV=development bundle exec rake db:migrate
	RAILS_ENV=test bundle exec rake db:migrate
	RAILS_ENV=production bundle exec rake db:migrate

	基本は下記を参考
	http://www.maepachi.com/blog/entry/120
	apacheで動かすのでdeployerは作らなかった
	passengerを使ってapacheユーザーでプロセスを起動しているので権限周りがまだ制限された状態
	権限周りは今後検討、ひとまずはapacheユーザーで出来る範囲でいい

webistrano設定

	デフォルトがsubversionの設定になっていてちょっと手間取る
	迷ったのは、repositoryの指定をローカルのURIにすること
	repository:file:///path/.git
	sshの秘密鍵指定（ローカルに接続して検証）
	ssh_keys:hoge
	あとは実行ユーザーがapacheで出来ないことある。
	サーバーの再起動とかいろいろ権限が足りない。
	sudoの設定もしたくないし、、apacheで動かすのやめるかも。
	passengerの設定でクリアできるのかも知れないけどひとまず保留。
	(->権限あるユーザーでsshでログインすればできた、、use_sudoとrunnerでremoteのユーザーを帰れるけど、、ファイル権限はrecipes実行で変えればいいのかな。)

インストール後
------------------------------------------------

currentの下にsimlinkで反映する仕組みだとインストールしてから気づいた。
（simlink少し不安。Rocketeerもsimlinkでリリースを切り替えるみたい。大本のディレクトリ構成もcurrentとかでそろえるかなあ。）
あとgitにpush,pullみたいな感じじゃ無くて別管理なのね。これはメリットとデメリットがありそう。
（releaseを指定してロールバックとかはrecipeを使えば出来るのかな。）
もうすこし使ってみて考える。
ec-cubeのテンプレだけデプロイとかしたいんだけどうまく出来るかとか。

公開鍵暗号にしたらエラーが出た
------------------------------------------------

	Net::SSH::AuthenticationFailed

・今回は「解決法1: net-sshのバージョンを2.7.0に固定する」で対応。

```test.rb
equire 'rubygems'
require 'net/ssh'
Net::SSH.start("example.ppp", "hohoho", :keys => ['/foo/hoge.key'], :verbose => :debug) {|x| p x }
```

＞テストスクリプトは大丈夫だったけど、だめでした。

・ssh_configに追加

	RSAAuthentication yes
	PubkeyAuthentication yes

＞だめでした。

・結局

鍵ファイルの権限がapacheでwebistrano側のユーザーを別の一般ユーザーに変更したのが原因っぽい。

上記のtest.rbをそれらのユーザーでsudoしてみて検証したら分かった。

ほか参考

Net::SSH::AuthenticationFailed 鍵 - Google 検索
http://goo.gl/nDMTpE

chef soloでAuthenticationFailedといわれたときの対応
http://goo.gl/QlMNqx

capistrano3 sshの設定で躓く. - Qiita
http://goo.gl/bP1WSx


メモ
------------------------------------------------

ロールをwebにしているとdeploy:web:disableとかできる
recipesはひとまずは簡単に作れそうなので便利につかえそう
deploy:rollbackはdeployしたreleaseを戻すとは限らない、setupとかの分を戻すかも？？ので注意。

参考
------------------------------------------------

git
	
	http://nob-log.info/2013/03/18/ec-cube-git-guide/

Capistranoインストール
	
	$ sudo gem install capistrano
	(http://d.hatena.ne.jp/yamada6789/20110108/1294450383)

Webistranoインストール

	http://hiro1986.hateblo.jp/entry/2013/12/10/143700
	http://www.maepachi.com/blog/entry/120

サブディレクトリのみ処理

	http://tesiri.hateblo.jp/entry/2013/11/29/180241
【HTML】input type="image"で画面遷移

こんにちは。  
input typeによる画面遷移はsubmint もしくはbuttonでjs指定させれだけだと思っていました。  
  
どうやら
```html
input type="image"
```
ただどうやら調べてみるとtype="image"の場合は  
valueを指定しないとnameで指定したパラメータを渡すことができないらしい。  
hiddenを使って対策もできるらしい。  
  
そして、  
クリックした画像の座標が飛んでくるらしい。w
  
それではこれからも宜しくおねがいします。
HTML5モバイルアプリ用UIフレームワーク「ionic」を使ってみる


ionic <http://ionicframework.com/>

Apache Cordovaを利用したハイブリッドアプリ開発のためのiOS7ライクなangular.jsベースのUIフレームワークという点では、
国産のOnsen UI(<http://onsenui.io/>)と似ています。

プロジェクトテンプレートの作成まですべてコマンドで完結するので簡単に試してみる事ができます。

cordova,ionicのインストールからシミュレータを起動するまで

```
$npm install -g cordova
$npm install -g ios-sim
$npm install -g ionic
$ionic start myApp
$cd myApp 
$ionic platform ios
$ionic emulate ios
```


このように簡単に始める事ができますが、angular.jsベースなので基本的に学習コストが高い事、
また現在α版であることなど、利用に際しては留意しておきたいところです。
GNU Screenを使おう


terminalで作業するときに、複数terminalを開きたいときは多いと思います。
ただ、複数terminalのWindowを開いてしまうと、terminalの切り替えをするのは大変だと思います。
そんなときは、GNU Screenを使いましょう。

起動は

```shell-session
$ screen
```

で起動できます。
Macはデフォルトで入っているはず。
Ubuntuとかは、

```shell-session
$ sudo apt-get install screen
```

で入れられます。

それから、sshでサーバーで作業しているときに、接続がきれてしまっても、screenを起動し直せば再開ができます。
もし接続が切れてしまった場合、sshで入り直して、

```shell-session
$ screen -ls
```

でセッション番号を調べて

```shell-session
$ screen -r (セッション番号)
```

で再びアタッチできます。


## .screenrc

screenの設定ファイルは.screenrcです。これをホームディレクトリに置いておきます。
screenでコマンドをうつときのエスケープはデフォルトでは
Ctrl-aになっていますが、Ctrl-aは行頭に移動するときによくつかうので、
ここをCtrl-t に変えたいと思います。

そのときは、.screenrcに

```:.screenrc
escape ^t^t
```

と書いておいてください。

## コマンド

主な各種コマンドです。

| コマンド | 説明       |
|:-----------|:------------|
| c      |新しいウィンドウを作る|
| n     |次のウィンドウに飛ぶ|
| p       |前のウィンドウに飛ぶ|
| k         |現在のウィンドウを破棄|



(他にも機能はあるので、気が向いたら随時更新していきます。)
選択したセルの index path 情報の引き回し方に困ったの時のメモ


テーブルビューのセルに対してジェスチャリコグナイザを設定し、そのアクションでは Image Picker Controller を用いて写真を扱いながら、最終的に当該セルのサブビュー（イメージビュー）を更新するという機能を実現したかった。


##対象となる処理の概要
1.セルのサブビュー（イメージビュー）をロングプレスするとジェスチャリコグナイザ起動

2.ジェスチャリコグナイザに対応するメソッド内でアクションシート起動

3.アクションシートの選択結果をもとにデリゲートメソッド`-actionSheet:clickedButtonAtIndex:`で処理を振り分け（ここではカメラ or カメラロール起動で写真を選ぶ）

4.画像が選択されたら、デリゲートメソッド`-imagePickerController:didFinishPickingMediaWithInfo:`内で CoreData の対応する画像パスレコードを登録 or 更新する(delete & insert 処理を行う)

5.この画像パスを使って、`-tableView:cellForRowAtIndexPath:`内で、セルのサブビュー（イメージビュー）にサムネイル画像を設定する(Asset Libraryを使い、1件ごとにキーを用いて画像パステーブルを検索し、結果が返ってくればそれを設定する)


##問題点とアプローチ
このとき、4.のプロセスで情報を更新をする際、更新対象となるキー値を取得する方式でハマった。
`-imagePickerController:didFinishPickingMediaWithInfo:`で使える情報の中には、（当然だが）前画面で選択したセルの情報はないからだ。

アプローチとしては、2.のタイミングで取得した index path 情報を引き回す方法を探していたがうまいやり方に辿りつけなかったので、とりあえずブリッジ役としてのインスタンス変数を用意して、保持することにした。
結果、振る舞いとしては満足したものとなった。

```objc
//ジェスチャリコグナイザに対応するメソッド内でブリッジ役のインスタンス変数を利用
- (void)didLongPress:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        CGPoint longPressLocation = [gestureRecognizer locationInView:self.tableView];
        NSIndexPath *longPressedIndexPath = [self.tableView indexPathForRowAtPoint:longPressLocation];
        _longPressedRowAtIndexPath = longPressedIndexPath.row; //インスタンス変数に入れてあとから利用する
```
##継続して知りたいこと
この方法で一応目的は達成したものの、インスタンス変数の使い方としてなんだか気持ち悪い（メソッド間の単なる橋渡し的な使い途しかない）。
ジェスチャリコグナイザから取得した index path 情報を後続の処理（この場合、Image Picker Controllerのデリゲートオブジェクト、つまりself）まで引き渡す良い方法、またはセオリーってあるのだろうか。
Mojo::JSONの挙動について


Mojo::JSONは、「Perlのデータ構造」と「JSON文字列」で、相互に変換してくれるモジュールです。


「Perlのデータ構造」から「JSON文字列」に変換する場合はencodeメソッドを使用し、
「JSON文字列」から「Perlのデータ構造」に変換する場合はdecodeメソッドを使用します。

注意が必要なのは、
Mojo::JSONのencode/decodeが、
Encodeのencode/decodeに合わせたような挙動になっていることです。

## encodeメソッド

encodeメソッドに渡すデータの中に日本語などの文字列がある場合は、
utf8フラグを付けておく必要があります。
付けなかった場合は、文字化けが起こります。

```perl:sample.pl
use strict;
use warnings;
use Encode;
use Mojo::JSON;

my $parser = Mojo::JSON->new;

my %data = (
    'name' => decode_utf8('太郎') # utf8フラグを付ける
);

my $json = $parser->encode(¥%data);
print $json; # utf8フラグが付いていない状態になっている
```

コメントに書いたとおり、encodeメソッドで返ってくるJSON文字列はutf8フラグがついていません。

Mojo::JSON::encodeメソッドでは、

```
JSON文字列に変換する + utf8フラグを外す
```

といった処理が行われています。

もし、この処理の後にこのJSON文字列をPerl内で処理する場合は、
再びEncode::decodeでutf8フラグを付ける必要があります。


## decodeメソッド

decodeメソッドに渡すJSON文字列は、
utf8フラグが付いていない状態にする必要があります。
付けている場合は、正常に変換されません。

```perl:sample.pl
use strict;
use warnings;
use utf8;
use Encode;
use Mojo::JSON;

my $parser = Mojo::JSON->new;

# use utf8; により自動的にutf8フラグがつく
my $json = '{"name": "太郎"}';


my $data = $parser->decode(
	encode_utf8($json) # decodeに渡す場合はutf8フラグを外す
);

# decodeの返り値はutf8フラグがつくので、出力時はutf8フラグを外す
print encode_utf8( $data->{name} );
```

サンプルではわざとらしく「use utf8」でフラグをつけていますが、
実際には、DBやファイル読み込みで取得したデータに、
utf8フラグが付いていたりするので、
decodeメソッドに渡すときは注意が必要です。

## render(json => \%data)

Mojolicious::ControllerのrenderメソッドでJSONを返すときも注意が必要です。
下記に示すように、renderメソッドに渡すデータはutf8フラグが付いている必要があります。

```perl:sample.pl
use Mojolicious::Lite;
use utf8;

get '/' => sub {
    my $self = shift;

    # use utf8; により自動的にutf8フラグがつく
    my %data = ('name' => '太郎');

    return $self->render(json => \%data);
}

app->start;
```

また、partialでJSON文字列を受け取るときは、
その文字列にはutf8フラグが付いていないことに注意する必要があります。

```perl:sample.pl
use Mojolicious::Lite;
use utf8;
use Encode;

get '/' => sub {
    my $self = shift;

    my %data = ('name' => '太郎');

    # $json には、utf8フラグが付いていないJSON文字列が入る
    my $json = $self->render(partial => 1, json => \%data);

    # renderで描画する場合は、Encode::decodeを使う
    $self->render(json => decode_utf8($json));
} => 'index';

app->start;

__DATA__

@@ index.html.ep
<% my ($json) = @_; %>
<%= $json %>
```

----

Mojo::JSONを使うときは、utf8フラグに注意する必要があるという話でした。
swich構文でローカル変数を使いたい時のメモ


かなり初歩的なことだと思いますが、メモ。
##問題
switch構文内でローカル変数を使いたい時、こんなふうに記述するとコンパイルエラーになる。

```objc
switch (cellNumber) {
    case 1:
        NSString *viewDataKey = @"Name";
        …
    …
}
```
switch構文内で変数を宣言すると、コンパイルエラーになるのは、C言語の特性(C89)を引き継いでいるから、ということなのだろうか？C++(99)であれば、これは許容されるらしい。

##回避策
コンパイルエラーを回避するには2通りあって、それはこのようになる。

```objc
//switch構文のスコープが開始する前に宣言する
NSString *viewDataKey;
switch (cellNumber) {
    case 1:
        viewDataKey = @"Name";
    …
}

//case内の記述を{}で囲む
switch (cellNumber) {
    case 1: {
        NSString *viewDataKey = @"Name";
        …
    }
    …
}
```
ただ、switch構文内で変数を宣言する方式（後者）は、初期化処理を飛び越えてしまう可能性がある点で、とてもこわいものなのだそうだ。

[参考](http://stackoverflow.com/questions/1115304/can-i-declare-variables-inside-an-objective-c-switch-statement)
RSpecでModelのテストをするときは、リレーションをchange from/toとしてテストしないように注意する


## 問題: なぜかfailするテスト

````ruby
  it 'adds comment' do
    post = Post.create(text: 'Hello!')
    comment = Comment.new(text: 'Hi!')
    expect{post.comments << comment}.to change{post.comments}.from([]).to([comment])
  end
````

このテストを実行するとfailします。

````text
result should have initially been [], but was #<ActiveRecord::Associations::CollectionProxy [#<Comment id: 1, text: "Hi!", post_id: 1, created_at: "2014-03-21 01:51:44", updated_at: "2014-03-21 01:51:44">]>
./spec/models/comment_spec.rb:7:in `block (2 levels) in <top (required)>'
````

なぜでしょうか？

## failする原因: post.commentsは実は配列ではない

`post.comments`は配列ではなくリレーションなので、比較される寸前までデータベースに問い合わせない、というのが主要な原因です。

`post.comments << comment`の実行前に`post.comments`はいったんRSpec側に実際の`from`の値として保存されますが、まだデータベースに問い合わせていません。

そして、`post.comments << comment`の実行後に`post.comments`の値を`from`と`to`のそれぞれで評価します。

しかし、どちらもこのタイミングでデータベースに問い合わせるので、`from`にもデータベースに保存された`comment`が返ってきてしまいます。

結果として、「`from`の値は`[]`ではなかった」と判断されてfailするわけです。

## 解決策: 明示的に配列に変換する

`change{}`の中をリレーションではなく、確実に配列として返すようにします。具体的には`post.comments.to_a`です。
こうすれば、`post.comments << comment`の実行前にデータベースへの問い合わせが発生し、`[]`が実際の`from`として保存されます。


````ruby
  it 'adds comment' do
    post = Post.create(text: 'Hello!')
    comment = Comment.new(text: 'Hi!')
    expect{post.comments << comment}.to change{post.comments.to_a}.from([]).to([comment])
  end
````

## 参考情報
この問題は前回のQiita記事のテストを書き直している最中に遭遇しました。(原因を特定するまでに結構時間がかかってしまった・・・)

- [[初心者向け] Railsで関連するデータ(親子関係)を保存する方法あれこれ](http://qiita.com/jnchito/items/7f41ff3df900909952db)

しっかり読めていませんが、たぶん同じようなことを言っている記事がこれです。

- [ActiveRecord Lazy Scope Evaluation](http://railsadventures.wordpress.com/2012/11/09/activerecord-lazy-scope-evaluation/)

リレーションに関しては以下の書籍の「056 リレーションを理解する」を読むとわかりやすいです。

- [Rails3レシピブック 190の技](http://www.amazon.co.jp/gp/product/4797363827?ie=UTF8&camp=1207&creative=8411&creativeASIN=4797363827&linkCode=shr&tag=junic05-22&qid=1395368495&sr=8-1&keywords=rails3+%E3%83%AC%E3%82%B7%E3%83%94)
いろいろなSSH鍵形式の整理


いろんな形式があって、Poderosaで使うときはどれ？Macで使うときはどれ？ Puttyで使うときはどれ？
といつも混乱するので整理しておきます。

（整理中）

## .ppk

あとで書く

## .pem

あとで書く

## .key

あとで書く


## ppk から RSA private keyに変換 (Linuxにて)

```
$ sudo yum install -y putty
$ puttygen putty_key.ppk -O private-openssh -o ~/.ssh/from_putty_key_rsa

```

引用元：
http://chocolapod.sakura.ne.jp/blog/entry/64