OmniAICreator/Qiita-1.07M huggingface dataset:
ブロックの中では continue ステートメントは使えない.

for in 文の中でcontinue文を使うことはできますが、 blockで囲ってしまうとビルドエラーになります。

```objc
    for (NSNumber *num in @[@1,@2,@3,@4]) {
        continue;
        dispatch_async(dispatch_get_main_queue(),^{
            continue; // これが原因でビルドエラー (continue statement not in loop statement)
        });
    }
```
文字列の途中に改行を入れたりできます。

文字列について, 改行を途中に入れるなど様々な書き方ができます.

```objc
    NSLog(@"hogefuga");
    NSLog(@"hoge""fuga");
    NSLog(@"hoge" "fuga");
    NSLog(@"hoge"
    "fuga");
```

出力結果はいずれも同じです。

```

2013-10-31 17:12:25.712 RSS[3689:60b] hogefuga
2013-10-31 17:12:25.713 RSS[3689:60b] hogefuga
2013-10-31 17:12:25.713 RSS[3689:60b] hogefuga
2013-10-31 17:12:25.714 RSS[3689:60b] hogefuga
```
ARC #016参加メモ


A - クイズゲーム
[http://arc016.contest.atcoder.jp/tasks/arc016_1](http://arc016.contest.atcoder.jp/tasks/arc016_1)
入力でクイズゲームの選択肢がN個であることと正解がMであることが示され、１〜Nまでの数でM以外を出力するという。

私の提出

```py:a.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import timeit
import time
import sys
import io
import re
import math
import random
#start = time.time()
#start = time.clock()
i = 1
j = 0
n,m=map(int,raw_input().split())
while True:
    i=random.randint(1,n)
    if i != m:
        print i
        break
```
遊び心を込めて乱数で出力させました。
他にrandom使っている人はちょっと見かけてないので・・・・・

楽で早く、確実なのは選択肢が最低2であることに合わせて選択肢がそれ以上であろうとも正解が1なら2を出力、正解が2なら1を出力させるのが良かったようです。

B - 音楽ゲーム
[http://arc016.contest.atcoder.jp/tasks/arc016_2](http://arc016.contest.atcoder.jp/tasks/arc016_2)
xはそのまま素直に数えて、oは初出を数えて連続時は数えさせない処理でよかったのかな？
私の提出　まぁ大幅時間切れですけど

```py:b.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import timeit
import time
import sys
import io
import re
import math
j=[]
k=[]
l=0
ans=0
i=int(raw_input())
for x in xrange(i):
    j.append(str(raw_input()))
for y in xrange(9):
    h=0
    while h < i:
        if str(j[h][l])=='x': ans+=1
        if str(j[h][l])=='o':
            if h==0:
                ans+=1
            elif str(j[h-1][l])=='o':
                pass
            else:
                ans+=1
        h+=1
    l+=1
print ans
```

反省
h,lとかわからなくなる関数使わなくてもx,yをそのまま使えばよかった。
リスト操作とかまだまだ

いくつか他の方のも拝見した中で簡潔で分かりやすかったnekarugoさんのソース

```py:転載・引用.py
a = input()
inputs = [raw_input() for x in xrange(a)]
res = 0
for x in xrange(a):
 for y in xrange(9):
  if inputs[x][y] == 'x':res += 1
  if inputs[x][y] == 'o' and (x == 0 or inputs[x - 1][y] != 'o'): res += 1
 
print res
```
行数を受け取って、譜面をリストで受け取って。リストを[x][y]で縦に見ていって'x'があったならそのまま加算、'o'があった時はリスト最初の行なら加算、最初の行以降なら手前の行が'o'出ない場合に加算という処理(のはず・・・)基本方針は同じと思ってたら横に読んで'o'があったら一つ手前の行を確認する方針っぽいです。綺麗さにの絶望的な差は変わりませんが
C,D問は手つかずとなっております。
SublimeText3用、マルチカーソルに連番の数字を入力するプラグイン

SublimeTextをバージョン3にアップデートしたところ、[「Sublime Text 2でマルチカーソルに連番の数字を入力するプラグイン」](http://qiita.com/ryooo321@github/items/734a81a411d2f2eea6b3)が動作しなくなったため、ST3対応版を作ってみました。

プラグインの入力欄に「1」を入力しEnterすると、上のカーソルから順に1, 2, 3, 4,...と入力し、
「2 5 3」と入力すると00002, 00005, 00008, 00011,...と入力されます。


```python:multi_number_input.py
import sublime, sublime_plugin

class MultiNumberInputCommand(sublime_plugin.TextCommand):
    def on_done(self, arg):
        paramsArray = arg.split(" ")
        paramsArray.extend(['', '']) #minimum length is 3
        initial     = int(paramsArray[0]) if paramsArray[0] != '' else 1
        digits      = int(paramsArray[1]) if paramsArray[1] != '' else 1
        interval    = int(paramsArray[2]) if paramsArray[2] != '' else 1
        self.view.run_command('insert_numbers', {'args': [initial, interval, digits]})

    def run(self, edit):
            self.view.window().show_input_panel('Initial Digits Step | ex) 2 5 3: ', '', self.on_done, None, None)


class InsertNumbers(sublime_plugin.TextCommand):
  def run(self, edit, args):
    number = args[0]
    interval = args[1]
    digits = args[2]

    for region in self.view.sel():
        #for negative values
        if number < 0:
            my_digits = digits + 1
        else:
            my_digits = digits

        formatter = '{0:0' + str(my_digits) + 'd}'
        formatted = formatter.format(number)
        self.view.replace(edit, region, str(formatted))
        number = number + interval
```

オリジナル版からの変更点は

* ST3に対応した
* 未入力時は「1」として処理するようになった
* " by " ではなく単一スペースでパラメータを与えるようになった
* 桁数指定機能を実装した

桁数指定方法は「初期値 桁数 ステップ」としてください。例）

* 「2」 → 2, 3, 4, 5,...
* 「2 5」 → 00002, 00003, 00004, 00005,...
* 「2&nbsp;&nbsp;3」 → 2, 5, 8, 11,...
* 「2 5 3」 → 00002, 00005, 00008, 00011,...

PackageControllerからは追加できないので、手動でインストールしてください。
正直Pythonははじめてなので、変なところありましたらご教示いただけると幸いです。

https://github.com/airosB/sublime-multi-number-input
echo サーバを利用した websocket のサンプル（Server 編）

websocket を利用したサンプルを作成する.  
サーバには WebSocket.io という node のモジュールを利用する.  
https://github.com/LearnBoost/websocket.io  
（WebSocket のサーバ側の実装は, 他の言語でもいろいろとあるみたい）

WebSocket とは, TCP/IP のソケットを使った通信もどきをブラウザから実行できるというものである.  
これは確かにすごい.  
ってことで試してみた.

## WebSocket クライアント
以下が利用できるみたいなので拝借する.  
http://www.websocket.org/echo.html


## WebSocket サーバ

#### インストール

```
% npm install websocket.io
```

#### サーバのコード

```
% cat ws_server.js
var websocket = require('websocket.io');
exports.activateServer = function (port) {
    // サーバ構築
    var ws = websocket.listen(
        port,
        function () {
            console.log('Server running on ' + ':' + port);
        }
    );
    ws.on('connection', function (socket) {
        console.log('Connection began!');
        socket.on('message', function (messageEvent) {
            console.log('Recive msg!');
            console.log(messageEvent);
        });
    });
};
exports.activateServer('3001');
```

#### サーバの起動

```
% node ws_server.js
Server running on :3001
```

## 検証
http://www.websocket.org/echo.html  
の Location に, 上記の手順でサーバを設置したホストを指定し, Connect ボタンをクリックする.  
（例では port を 3001 にしてるので, それも忘れずに指定する.）  
Log: に CONNECTED と表示されれば, websocket を介したサーバとのコネクションの確立に成功したことになる.  
コネクションを確立した後は, メッセージを送ってみる.  
Message: に適当なメッセージを指定して, Send ボタンを押す.  
すると, サーバ側でメッセージが表示されたでしょ？

## 次にやること
WebSocket は, TCP/IP を利用して実装されている新しいプロトコルである.  
時間があれば以下のドキュメントを読んでおきたい.  
http://www.w3.org/TR/websockets
BitbucketのプライベートリポジトリをJenkinsからビルド


OSはUbuntu 12.04.3 LTSです。
今更ながらJenkinsをインストールします。

## インストール

```sh:
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
```
インストールすると、Jenkinsがデーモンとして登録されます。

## 起動

```sh:
sudo service jenkins start
```

デフォルトは8080ポートで開始されるので、ブラウザに表示されるのが嫌な人はリバースプロキシでなんとかします。

![jenkins1.png](https://qiita-image-store.s3.amazonaws.com/0/30739/690c8016-ac4e-fc87-e668-416c4315339a.png "jenkins1.png")

## セキュリティ設定

デフォルト設定のままでは、誰でも閲覧可能な状態になっています。
プライベートなネットワーク上であればデフォルトで全く問題ないですが、そうでない場合は問題なので __ログイン済みユーザーのみ閲覧可能な設定__ にします。

グローバルセキュリティ設定の権限の管理を、 __行列による権限設定__ にします。

あとは権限を下記の通り設定する事で、ログイン済みユーザーからのみJenkinsのページが閲覧可能になります。

* ユーザーを作成して、権限を付与
* 匿名ユーザーは権限を剥奪

![jenkins2.png](https://qiita-image-store.s3.amazonaws.com/0/30739/2297e388-859c-7954-78bb-1af256a5b88f.png "jenkins2.png")

## Jenkins がリポジトリにアクセスする準備

（Ubuntu上の）Jenkinsユーザーで公開鍵を作り、Bitbucketにデプロイキーとして作成した公開鍵を設定します。

![jenkins3.png](https://qiita-image-store.s3.amazonaws.com/0/30739/67020d29-40f6-551b-ab7e-1b6887ef8479.png "jenkins3.png")

sudoが使えない環境の際は、Jenkinsの画面からシェルを実行できるようなのでそちらから公開鍵の作成すれば大丈夫みたいです。

Bitbucket にデプロイキーを登録したので、Ubuntuに対してホストを認証させます。

```sh:
$ ssh bitbucket.org
The authenticity of host 'bitbucket.org (131.103.20.168)' can't be established.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'bitbucket.org,131.103.20.168' (RSA) to the list of known hosts.
PTY allocation request failed on channel 0
authenticated via a deploy key.

You can use git or hg to connect to Bitbucket. Shell access is disabled.
Connection to bitbucket.org closed.
```

## プロジェクトの設定

事前に管理画面からgit pluginをJenkinsにインストールしてください。

適当にプロジェクトを作り、リポジトリと認証トークンを設定します。
![jenkins4.png](https://qiita-image-store.s3.amazonaws.com/0/30739/a3c74387-a60c-7474-3091-aa4a806cbc68.png "jenkins4.png")


リモートからビルドの説明通りのアドレスにアクセスを行うとビルドが始まるようになります。

![jenkins5.png](https://qiita-image-store.s3.amazonaws.com/0/30739/80e0e576-8a7f-2cbd-df48-6bd31d35aaad.png "jenkins5.png")
【質問】【php】【php.ini】 session.save_handler = redis が、反映されません

こんにちは、php初心者のもんきです

最近、仕事の環境を変えて言語も変わりました。

phpです。

前までは、perlでした。

「おれ、来月からアメリカで仕事するから！」

「英語？」

「日本語喋れるから大丈夫でしょw」

こんな感じで渡米（転職）しました。

新人メジャーリーガー（新人phper）です。

#前置きが長くなりましたが、質問させてください。

SessionをRedisで管理したく、php.iniを下記のように設定しました。

```php:php.ini
[Session]
session.save_handler = redis
session.save_path = tcp://127.0.0.1:6379
```

その後、phpinfo()で確認したところ。

```\n:phpinfo()
session.save_handler	files
session.save_path	/var/lib/php/session
```

**変わらない！反映されない！どうして！**

環境は下記になります
sakura VPS
CentOS release 6.4 (Final)
PHP 5.5.5 (fpm-fcgi)
nginx/1.4.3


同様の問題にご経験のある方、または、何か思いついた方おりましたら助けてください
module_function と extend self

`module_function` と `extend self` の違いやモジュール関数についてよくわからなかったので調べた結果をまとめる。

`module_function` は、特異メソッドとプライベートメソッドを同時に定義するためのメソッドです。
特異メソッドであり、プライベートメソッドでもあるメソッドのことを「モジュール関数」と呼びます。

```rb
module M
  module_function

  def hoge
    'hoge'
  end
end
```

モジュール関数は (パブリックな) 特異メソッドであるので、モジュールをレシーバに指定して呼び出すことができます。

```rb
M.hoge # => 'hoge'
```

また、プライベートメソッドでもあるので `include` することでレシーバを省略して呼び出せるようになります。

```rb
class C
  include M

  def fuga
    hoge
  end
end

C.new.fuga # => 'hoge'
```

`include` してもそのクラスにパブリックメソッドが追加されるわけではありません。

```rb
C.new.hoge # => NoMethodError: private method `hoge' called
```

`extend self` は自身の持つメソッド全てを自身の特異メソッドとして定義します。
この場合、特異メソッドと定義したメソッドのスコープは同じになります。
つまり、パブリックメソッドとして定義するとモジュールを指定して呼べますが `include` した際にパブリックメソッドとして追加されるようになり、プライベートメソッドとして定義するとモジュールを指定して呼べず、 `include` した際にプライベートメソッドとして追加されます。
C++でProperty（getter/setter）

## C#のPropertyって便利だよね
http://ufcpp.net/study/csharp/oo_property.html

## C++でやるには？
とりあえず簡単に実装するなら名前を渡してメンバ変数とgetter/setterを定義するマクロ。
これは稀によく見る。
でもスマートじゃないよね。

## じゃあもうTemplateしかないっしょ
書いてみた。
https://github.com/HogeTatu/cpp_module/tree/master/Property

### Property基底
```cpp
template <typename T>
class Property
{
public:
	Property(T& value) : _value(value) {}
	Property(const Property& ref) : _value(ref._value) {}
	virtual ~Property() {}

	Property<T>& operator = (const Property<T>& ref)
	{
		this->_value = T(ref._value);
		return *this;
	}

protected:
	T&		_value;
};
```

### getter/setter有りなProperty
```cpp
template <typename T, class Getter = SimplePropertyGetter<T>, class Setter = SimplePropertySetter<T>>
class WritableProperty : public Property<T>, private Getter, private Setter
{
public:
	WritableProperty(T& value) : Property<T>(value) {}
	WritableProperty(const WritableProperty& ref) : Property<T>(ref) {}
	virtual ~WritableProperty() {}

public:
	operator const T& () const { return this->Get(this->_value); }
	const T& operator -> () const { return this->Get(this->_value); }

	WritableProperty<T, Getter, Setter>& operator = (const T& var) { this->Set(this->_value, var); return *this; }
};
```

### getterのみのProperty
```cpp
template <typename T, class Getter = SimplePropertyGetter<T>>
class ReadOnlyProperty : public Property<T>, private Getter
{
public:
	ReadOnlyProperty(T& value) : Property<T>(value) {}
	ReadOnlyProperty(const ReadOnlyProperty& ref) : Property<T>(ref) {}
	virtual ~ReadOnlyProperty() {}

public:
	operator const T& () const { return this->Get(this->_value); }
	const T& operator -> () const { return this->Get(this->_value); }
};
```

### デフォルトのgetterポリシー
```cpp
template <typename T>
struct SimplePropertyGetter
{
	static const T& Get(const T& value) { return value; }
};
```

### デフォルトのsetterポリシー
```cpp
template <typename T>
struct SimplePropertySetter
{
	static void Set(T& value, const T& var) { value = T(var); }
};
```

## 実装内容
メンバ変数の実体をコンストラクタで渡して処理を委託する。
getter/setterの振る舞いはポリシーで切り替えられるようにした。

## サンプル
こんなクラスがあったとして

```cpp
class Sample
{
public:
	Sample()
		: _foo1(1)			, foo1(_foo1)
		, _bar1("bar1")		, bar1(_bar1)
		, _foo2(2)			, foo2(_foo2)
		, _bar2("bar2")		, bar2(_bar2)
	{}
	
	cpp_module::WritableProperty<int>			foo1;
	cpp_module::WritableProperty<std::string>	bar1;
	cpp_module::ReadOnlyProperty<int>			foo2;
	cpp_module::ReadOnlyProperty<std::string>	bar2;

private:
	int				_foo1;
	std::string		_bar1;
	int				_foo2;
	std::string		_bar2;
};
```

こんな感じに書ける。

```cpp
Sample sample;

sample.foo1 = 10;
sample.bar1 = "sample.bar1";
output(sample.foo1);
output(sample.bar1);

//sample.foo2 = 20;					// コンパイルエラー
//sample.bar2 = "sample.bar2";		// コンパイルエラー
output(sample.foo2);
output(sample.bar2);
```

ちなみにポインタ型でプロパティを定義したら a->b の形でも参照できる。

Getter、Setterの振る舞いを変えたければ、自分でポリシーを定義して

```cpp
cpp_module::WritableProperty<int, CustomGetter, CustomSetter>	foo1;
```

みたいにしたらいい。

## ちょっと考えたけど思い付かなかったから匙を投げたもの

```cpp
sample.bar1.c_str()
```

がエラーになる。

```cpp
const std::string& bar1 = sample.bar1;
bar1.c_str();
```

だったらOK。
a.b のオーバーロードができないからなぁ。
「こんなやり方どう？」みたいなのあったら教えて下さい。
あと何かやらかしてたら指摘して頂けると勉強になります。
perlbrewとcpanmでPerl環境を作る


普段使っていないのですぐに忘れてしまう。いい加減メモしておく。シェルはzshを使っている。

まずはperlbrewを入れる。

```bash
$ curl -kL http://xrl.us/perlbrewinstall | bash
$ rehash
$ perlbrew init
```

.zshenvはこんな感じにしておく。

```zsh:.zshenv
if [ -d "$HOME/perl5/perlbrew" ]; then
  source $HOME/perl5/perlbrew/etc/bashrc
fi
```

使いたいPerlのバージョンを指定してインストール、この時GREP_OPTION環境変数が悪さをしてコンパイルがこけるので、GREP_OPTIONを消す

```bash
$ GREP_OPTIONS= perlbrew install perl-5.14.2
```

おわったらswitch

```bash
$ perlbrew switch 5.14.2
```

確認

```bash
$ which perl
/home/hagino3000/perl5/perlbrew/perls/perl-5.14.2/bin/perl
$ perl -v
This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux
```

cpanmのインストール

```bash
curl -L http://cpanmin.us/ | perl - App::cpanminus
```

以降はcpanmを使ってパッケージを入れる。
echo サーバを利用した websocket のサンプル（Client 編）

最近, WebSocket を勉強して試してみようと思ったが, サーバを立てるのが面倒だった.
そこで, echo サーバを利用した最短サンプルを作った.

echo サーバを利用したサンプルです.  
下が無料で使える echo サーバ.
http://www.websocket.org/echo.html

以下のコードを, html の script タグの中に書いて, ブラウザで開いてください.

```js
var ws = new WebSocket('ws://echo.websocket.org');
// WebsocketClient.readyState が OPEN になったときに呼ばれるコールバック
ws.onopen = function () {
    console.log("Connecting is success!!");
    ws.send("Hello world!");
};
// サーバからメッセージを受信したときに呼ばれるコールバック
// このコールバックの第一引数に messageEvent というオブジェクトが格納されている（...らしい）
// このオブジェクトの data 属性に受け取ったメッセージが格納されている.
ws.onmessage = function (me) {
    var recievedData = me.data;
    console.log("Message is exists!!");
    console.log("recievedData: " + recievedData);
};
```
Xcode の Command Line Tools をインストール

Xcode は 5 からなのか Mavericks からなのか、足りない Command Line Tools をアプリケーション設定からインストールすることができなくなったようで、

https://developer.apple.com/downloads/index.action (要ログイン)

から取得しないといけないのか何なのか。と思いきや、Homebrew の問題分析ツールをよく見ると...

```shell-session
$ brew doctor

...
Warning: No developer tools installed.
You should install the Command Line Tools.
Run `xcode-select --install` to install them.
```

これですね。ここにもそのように: [MavericksでCommand Line Developer Toolsをインストールする方法が変更 | Act as Professional - hiroki.jp](http://hiroki.jp/mavericks-command-line-developer-tools)

`xcode-select -h` ではこのオプション出てこなくて `man xcode-select` には書いてあるという意地悪な仕様がたまりませんな。
AFNetworking 2.0


1.3系を使っていたのですが、2.0系にバージョンアップして
色々変わっていたのでよく使うものだけ、備忘録がてらまとめてみました。

## Manager

1.3系ではAFHTTPRequestOperationを作成して、GET/POSTの設定等を
行っていましたが、2.0系からはそれを管理してくれるManagerが出来ました。

使い方は超簡単

```objectivec
    AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager];
    [manager GET:@"http://hoge/sample.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
		// 成功時の処理.
        }];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        	// 失敗時の処理.
    }];
```

これだけで勝手にJSONに変換して返してくれます。
JSONにパースできない場合はエラーになります。

*※ただし、後述のResponseSerializerは設定できない模様*
__追記 2013/11/08__
コメントでご指摘いただき、設定できることが判明したので設定方法を記載しておきます。

```objectivec
AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
```

## Request Serialization

今までquery stringとかpostの時のパラメータとかは
自分で加工してましたが、この子のおかげでもう必要なくなりました。
ありがとう！

```objectivec
// GETの時（POSTの場合は第一引数を"POST"に）
NSString* url = @"http://hoge/sample.json";
NSDictionary* param = @{@"ios":@"7.0", @"old":@[@"6.1", @"6.0"]};

[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString: url parameters:param];

// 勝手に作ってくれる！
// http://hoge/sample.json?ios=7.0&old[]=6.1&old[]=6.0

// AFJSONRequestSerializerの時はJSONにしてくれる
[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:param];

// 楽ですね！
// {"ios": "7.0", "old": ["6.1","6.2"]}
```

## Response Serialization
1.3系はレスポンスのパースをJSONやImageに切り替えたいときに
AFImageRequestOperationやAFJsonRequestOperation等
Operation単位で切り替えてましたが2.0系からはResponseSerializerという
クラスに切り出されてます。

```objectivec
// operationはそのままでserializerを切り替える
NSURL *URL = [NSURL URLWithString:@"http://hoge/sample.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
// こんな感じで設定
op.responseSerializer = [AFJSONResponseSerializer serializer];

// 後は呼ぶだけ
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    // 成功
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // 失敗
}];
[[NSOperationQueue mainQueue] addOperation:op];

```

個人的にはこれが一番よかったです。

## 最後に
これ以外の2.0の変更点は公式に書いてあるので、もし使う方は見てみると
「こんなこと出来るんだ」とちょっと楽しくなると思います。
ぜひ、活用して開発効率をあげてください！

## 参考
[公式](https://github.com/AFNetworking/AFNetworking "公式")
`return self`でメソッドチェーン


オープンソースを読んでいたら`return self`しているメソッドがあって、これをやると何が起きるのか知らなかったのでメモ。

```python
class Car1(object):
    def __init__(self):
        self.miles = 0
        self.gas = 0

    def drive(self, d):
        self.miles += d
        self.gas -= d
        return self

    def fill(self, g):
        self.gas += g
        return self


class Car2(object):
    def __init__(self):
        self.miles = 0
        self.gas = 0

    def drive(self, d):
        self.miles += d
        self.gas -= d

    def fill(self, g):
        self.gas += g


if __name__ == '__main__':
    car1 = Car1()
    car1.fill(100).drive(50)

    print 'car1 miles', car1.miles
    print 'car1 gas', car1.gas

    car2 = Car2()
    car2.fill(100).drive(50)

    print 'car2 miles', car2.miles
    print 'car2 gas', car2.gas
```

## 結果

```
car1 miles 50
car1 gas 50
Traceback (most recent call last):
File "chain.py", line 38, in <module>
car2.fill(100).drive(50)
AttributeError: 'NoneType' object has no attribute 'drive'
```

クラスのメソッドで`return self`をしない`Car2`のインスタンスででメソッドチェーンをやろうとするとエラーが起きる。
`return self`をやるとメソッドチェーンができるようになる。
`car1`なら何回`fill()`と`drive()`をつなげても良い。

## 参考
+ http://programmers.stackexchange.com/questions/29657/purpose-of-return-self-from-a-class-method
Firefox OS コードリーディングミートアップ @ Mozilla Japanに参加しました #FxOS

2013/11/04 に、[FxOS コードリーディングミートアップ](http://atnd.org/event/E0021277/0)という勉強会が Mozilla Japan のオフィスにて開催されました。僕は運営側というわけではなく一参加者ですが、写真を少し撮ったのでその模様を紹介したいと思います。

この会は、参加したメンバが各々 [Firefox OS](http://www.mozilla.jp/firefoxos/) や [Gecko](https://developer.mozilla.org/ja/docs/Mozilla/Gecko) のソースコードを読むという趣旨です。ですが僕は実はコードはあまり読まずに、Firefox OS 1.2 から利用可能になった Web Audio API の動作確認を行ったりしていました。

会場の様子です。今回の参加者は七人でした。大きなテーブルに皆で座って、議論しながらコードを読んでいます。（会場で写真オッケーな旨を確認しましたが、不都合があった場合はコメントをください）
![DSC01733.jpg](https://qiita-image-store.s3.amazonaws.com/0/322/dd18efcf-101e-c606-0be3-4de6f0e98f10.jpeg)

Element, HTMLElement, HTMLHogeElement に関する議論が白熱。
![DSC01727.jpg](https://qiita-image-store.s3.amazonaws.com/0/322/860b839f-df85-6db4-b186-c39c0beccd35.jpeg)

秘蔵の資料を見てｗｋｔｋしたり（文字が読めないので大丈夫なはずや）
![DSC01731.jpg](https://qiita-image-store.s3.amazonaws.com/0/322/95cebaec-80ed-4495-ae07-30a664ff70d4.jpeg)

シャレオツオフィスその一。
![DSC01736.jpg](https://qiita-image-store.s3.amazonaws.com/0/322/9e472e2c-4cd2-4231-3bee-ccc135a78feb.jpeg)

シャレオツオフィスその二。
![DSC01730.jpg](https://qiita-image-store.s3.amazonaws.com/0/322/677a1a6a-f25b-029f-7aac-34fb941aa059.jpeg)

ふぉくすけが出迎えてくれました！
![DSC01729.jpg](https://qiita-image-store.s3.amazonaws.com/0/322/0079f3c9-18e6-f5da-7633-f3f5dff0a9e6.jpeg)

雰囲気が伝わったでしょうか。Firefox OS 関係の勉強会ですと、[関東 Firefox OS 勉強会](http://atnd.org/events/44739)や[関西 Firefox OS 勉強会](http://atnd.org/events/44721)といった大規模の勉強会が有名ですが、今回のような小規模な勉強会は、参加者同士のコミュニケーションが濃密に取れ、大規模勉強会とは違った意味で有意義だったと感じています。コードリーディングに限らず、このような勉強会がまた開催されることを期待しています。
treeコマンド結果をVimで見たら罫線が制御文字扱い


されていた。
-Nオプションを付ける事で解消された。

```Bash
tree -N
```

ついでなので、エイリアスとした。

```Bash:.bashrc
alias tree='tree -N'
```

参照元はこちら。
>[tree コマンドで文字化け](http://qno.oops.jp/wp/macintosh/232.html "qnowpMac と オケ と プログラミング")
ADTをインストールしたとき最初に行うeclipseの設定変更

新しいPCを使うときやEclipseの調子がおかしくなったとき、Eclipseを再インストールすることがある。自分が最低限実施する設定変更があるが、設定の場所が深くて忘れやすいのでメモ。

なお以下の話は

* ADT Bundle内のEclipseベース
* for Linux(ubuntu)とfor Macで確認

の内容。

Linux では [Window] > [Preferences] のところが Macでは [ADT] > [環境設定] になる。それ以下の階層は同じ。


#設定変更

##行番号の表示
ソースコードの横に行番号を表示するための設定。

1. [Window] > [Preferences] > [General] > [Editors] > [Text Editors]
2. [Show line numbers] にチェックを入れて [OK]。

デフォルトでもいちおう下の方に表示されるがパッと見でわからない。

##スペースインデント
インデントをタブではなくスペースにするための設定。要はタブキーを押したときにタブ文字挿入ではなくスペースN文字分の挿入にするための設定。

1. [Window] > [Preferences] > [Java] > [Code Style] > [Formatter]
でプロファイルを編集。ただしbuilt-inのプロファイルは編集できないのでコピーを作成してそれを編集する形になる。
2. [New] を押し適当な [Profile name] を入力して [OK]。このときベースにする初期設定を選べるので適当に選択しておく。これで編集元のプロファイルができる。チェックボックスにチェックを入れておくと新しく作成したプロファイルの編集画面にそのまま遷移する。
3. [Edit] ダイアログで [Indentation] タブを表示。その中の [Tab policy] で [Spaces only] を選択。
4. [OK] を2回押して設定完了。

同じ画面で1タブをスペース何文字分にするかも設定できる。

##等幅フォント(Linux only)
等幅フォントにするための設定。
Mac版は日本語が等幅にならないだけなのでそのままでも気にならない。
Linux版(というかubuntu？)はスペース、半角英数、全角で幅が違うので見た目でネストのレベルが分からずデフォルトでは非常にコードが見づらい。

1. [Window] > [Preferences] > [General] > [Appearance] > [Colors and Fonts] > [Java] > [Java Editor Text Font]を選んで[Edit]を押す。
2. ファミリから [DejaVu Sans Mono]、スタイルから [Book] を選択して [OK]。
composer global

composer に global というコマンドが増えていたので試しました。

 - [http://getcomposer.org/doc/03-cli.md#global - Composer](http://getcomposer.org/doc/03-cli.md#global "Composer")

要するに COMPOSER_HOME で composer コマンドを実行するのと同じです。
COMPOSER_HOME はデフォルトだと `$HOME/.composer` です（Windows だと `%APPDATA%\Composer`）。

試しに phpunit をインストールします。

```console
$ composer global require 'phpunit/phpunit:*'
 :

$ ~/.composer/vendor/bin/phpunit --help
PHPUnit 3.7.28 by Sebastian Bergmann.
 :
```

環境変数 PATH も設定しておきます。

```console
$ echo 'export PATH=$HOME/.composer/vendor/bin:$PATH' >> .bash_profile
$ source .bash_profile
```

```console
$ which phpunit
~/.composer/vendor/bin/phpunit

$ phpunit --help
PHPUnit 3.7.28 by Sebastian Bergmann.
 :
```

パッケージの更新も require と同じように global をつければOKです。

```console
$ composer global update
```
Google App Engine for Go用のライブラリを書くときにソースがコンパイル通るかをチェックする

注意：この記事は公式ドキュメントに書かれた情報に基づいたものではなく試行錯誤した結果なので、無保証です。

# 動機

Google App Engine for Goのライブラリを書いていると、ソースを編集後dev_appserver.pyを起動してエラーになるというパターンが多々起きました。通常のgoのプログラムを書くときのようにgo buildでコンパイルが通るかをチェックしたいと思い、試行錯誤してみました。

なお、アプリケーションのソースのコンパイルチェックをするだけならこの記事の手順は不要です。
dev_appserver.pyを起動したままにしておいてソースを編集すると、コンパイルエラーがあるときはコンソールのログに出ます。

# 手順

環境変数GOPATHは事前に設定済みとします。

```shell-session
$ go get code.google.com/p/appengine-go
$ go get code.google.com/p/goprotobuf
$ cd $GOPATH/src
$ ln -s $GOPATH/src/code.google.com/p/appengine-go/appengine appengine
$ ln -s $GOPATH/src/code.google.com/p/appengine-go/appengine_internal appengine_internal
```

実行するとcan't load package: ... :no buildable Go source files in ...というエラーメッセージが出ますが大丈夫です。

# コンパイルチェック

Google App Engine for Goのライブラリの*.goソースがあるディレクトリに移動してgo buildでチェックできます。
【webkit】iframeを含むテキストをフォームで送信すると何も表示されない

webkitのX-XSS-Protectionの地雷のようです

iframeを含むテキスト(youtubeの埋め込みリンクetc）をフォームで
送信してそれを表示させようとすると、safariではabout:blank, chromeではdata:,としか表示されません
webkitのX-XSS-Protectionに引っかかって無効化されてしまうようです

回避するには、HTTPリクエストヘッダで
X-XSS-Protection:0とすれば良いです
Railsで実装するならならこんな感じ

```rb:some_controller.rb
response.headers["X-XSS-Protection"] = "0"
```

X-XSS-Protectionが無効になってしまうため、管理画面でしか使わないとか、
同じドメインだった時のみ無効化するとか、セキュリティに
気をつける必要があります

chromiumのissueにも上がっていますが未解決のようです
Reflective XSS Protection appears to target legitimate iframes as a false positive
https://code.google.com/p/chromium/issues/detail?id=98787
WIndowsのパッケージ管理システムChocolateyを使ってみた。

Windows上で　rmagick を使おうと思ったら「インストールディレクトリに半角スペース入ってるとダメ」という定番の指示があったので入れなおそうかとおもったけど、

いつもは homebrew や yum や apt-get を使ってるとパッケージ管理システムがないことが非常に不便に思えたので探してみた。

## インストール方法

公式にあるインストールスクリプトをコピペして実行すればOK

```
C:\> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin
```

んで、imagemagick入れようとしたら 無印と Install と Portable の3つがあってよくわからん。

調べてみたら無印は Install と Portableが使うメタ情報みたいなもんなんで、無印を入れることはないそうだ。
(そのわりにダウンロード数が多いけどなんでや！？)


## インストール先の変更

デフォルトで Program files に入るのをやめたかったのでやり方を調べた。

→ 個別にインストールコマンドオプションを調べないと無理だとわかる。 → 悲しみ

## 解決方法

解決なのかどうかわからないけど portable バージョンを選択すれば `c:\Chocolatey\bin` 配下に必要な実行ファイルへのリンク先を示した `*.bat` ファイルが作られるので、そこにリンクを貼っておけば全ての必要な実行ファイルにPATHが通ります。

例：

```
cinst imagemagick.tool
```


## 参考

ChocolateyFAQs · chocolatey/chocolatey Wiki
https://github.com/chocolatey/chocolatey/wiki/ChocolateyFAQs

Chocolatey Gallery | Packages matching imagemagick
http://chocolatey.org/packages?q=imagemagick

Changing tools folder - Google Groups
https://groups.google.com/forum/#!searchin/chocolatey/Program$20Files/chocolatey/wWAQ6HJx7U8/KFxhRsnSRn8J
homebrewで PostgreSQL 9.3へバージョンアップ方法


勝手に`brew updgrade postgresql`を実行してしまったら、下記のエラーで起動出来なくなりました

``` /usr/local/var/postgres/server.log
FATAL:  database files are incompatible with server
DETAIL:  The data directory was initialized by PostgreSQL version 9.2, which is not compatible with this version 9.3.0.
```

## 解決方法
参照リンクのままですが

* サービスを停止する

```
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

* 9.3バージョンのデータフォルダを作成する

```
initdb /usr/local/var/postgres9.3 -E utf8
```

* アップグレードを実行する

``` bash
pg_upgrade \
-d /usr/local/var/postgres \
-D /usr/local/var/postgres9.3 \
-b /usr/local/Cellar/postgresql/9.2.4/bin/ \
-B /usr/local/Cellar/postgresql/9.3.0/bin/ \
-v
```

* 前回異常終了だった場合はpidファイルが残されているので、それを削除する必要があります

```
rm /usr/local/var/postgres/postmaster.pid
```

* 下記のメッセージが表示されれば、正常終了

```
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    analyze_new_cluster.sh

Running this script will delete the old cluster's data files:
    delete_old_cluster.sh
```

* データフォルダを変更

```
cd /usr/local/var
mv postgres postgres9.2.4
mv postgres9.3 postgres
```

* サービスを起動

```
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

* 下記コマンドでアップグレード結果を確認

```bash
psql postgres -c "select version()"
...
PostgreSQL 9.3.0 on x86_64-apple-darwin13.0.0, compiled by Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn), 64-bit
(1 row)

psql -l
...
```

* クリーンアップ

```
brew cleanup postgresql
gem uninstall pg #すべてのバージョンを削除する
gem install pg
```

## 参考リンク
http://blog.55minutes.com/2013/09/postgresql-93-brew-upgrade/
[iOS][Objective-C] StoryBoardを使ったUI実装


##流れ

1. MainStoryboard.storyboardに右下ペインから任意のUIパーツを選択、ドラッグで設置。

1. UIパーツをViewController.hの@interface~@endの間にドラッグ。
　→設定ダイアログがポップアップされるので、任意値を設定。

1. この時点で、ViewController.mに設置したActionの定義が自動追記されているので、
メソッドの中身を追記していく。

##Sample
以下機能を持つサンプルをつくる。
・ボタンを押すとアラートダイアログが表示される
・ダイアログ内での選択に応じて表示文字列を変化させる。


1. MainStoryboard.storyboardにLabelとRoundRectButtonを設置

1. LabelとRoundRectButtonをViewController.hの@interface~@endの間にドラッグ。
設定ダイアログ内での値は

 ```Label
Connection:Outlet
Object:ViewController
Name:labelForAlertView
Type:UILabel
Storage:Weak
```
```RoundRectButton
Connection:Action
Object:ViewController
Name:showAlertView
Type:id
Event:TouchUpInside
Arguments:None
```
※Connection
　Buttonなどイベントを設置するものはAction
　　→メソッドとしてViewControllerに定義が自動追記される。
　特にイベント発火しないlabelなどのリソースはOutlet
　　→propertyとしてViewControllerに定義が自動追記される。

 するとViewController.h上に

 ```obj-c
@property (weak, nonatomic) IBOutlet UILabel *labelForAlertView

 - (IBAction)showAlertView;
```
の二つが自動生成される

1. ViewController.mに以下メソッドが自動追記されているので、

 ```obj-c
 - (IBAction)showAlertView {   
}
```
メソッドの中身を実装。

 ```obj-c
 - (IBAction)showAlertView {
    
	    UIAlertView *alertView = [
			[UIAlertView alloc] initWithTitle:@"たいとる" 
			message:@"本文" 
			delegate:nil 
			cancelButtonTitle:nil 
			otherButtonTitles:@"OK", nil
		];
	    [alertView show];
}
```
これで、RoundRectButtonをタップすると、alertViewが表示される。

 さらに、alertView内でのアクションを拾うメソッドを追記する。

 ```obj-c
- (void)alertView:(UIAlertView *)alertView
        clickedButtonAtIndex:(NSInteger)buttonIndex
{
    	if(buttonIndex == 0){
      	 	self.labelForAlertView.text = @"canceled";
    	} else if (buttonIndex == 1) {
        	self.labelForAlertView.text = @"ok is pushed";
    	}
}
```
buttonIndexは、alertView内でキャンセル選択で0、OK選択で1を返す。
ここではそれにあわせてlabelForAlertViewの値を書き換えている。

##参考

iPhoneアプリ開発超入門
http://www.sbcr.jp/products/4797369434.html
第15回オフラインリアルタイムどう書く rubyで golf


他の方が golf
http://qiita.com/cielavenir/items/732a3140efe3db571480
していると、golf したくなりますね。

```ruby
puts $<.map{|e|a,b=e.split(?/).map{|e|e.to_i(16).to_s(2).to_i};(a*2+b).to_s.gsub(/21|12/){|m|m[1,0]=?0;m}.split(/0+/).map{|c|x=c.to_i;"**JTRUZLSN"[x/7%10+x%4]}*''}
```

163バイト。シンタックスハイライトが乱れてるね。
[追記開始]
…Kobito 上では乱れてるけど、Qiita 上では乱れてない。そういうもん？
[追記終了]
改行と空白を適当に入れるとこんな感じ。

```ruby
puts $<.map{|e|
  a,b=e.split(?/).map{|e|
    e.to_i(16).to_s(2).to_i
  };
  (a*2+b).to_s
  .gsub(/21|12/){|m|m[1,0]=?0;m}
  .split(/0+/)
  .map{|c|x=c.to_i;"**JTRUZLSN"[x/7%10+x%4]} * ''
}
```

ciel さんと同じく、私のアイディアを元に。
[追記開始]
ciel さんの実装を大いに参考にさせていただきました。```puts $<.map``` で始まり、 ```*''}``` で終わっているところなんかはそのまま利用させていただきました。
[追記終了]
zip をやめて、
　もともと16進数→16進数と思って整数に→2進数と思って文字列に→10進数と思って整数に→上段の2倍と下段を加算→10進数と思って文字列に
という処理にした。
あと、「"313"ならN」 のような情報を短い文字数で実現するために怪しい計算を導入した。

プロゴルファーならもうすこし行けるんじゃないかと思うけど、私はこんなところで。
[Objective-C] デリゲート（Delegate）とは


##概要

あるクラスだけでは処理できない命令を、そのクラスの変わりに行うクラス（に引き渡すこと）。

- どのクラスもデリゲート（代理人）になることができる。

##デリゲートの手順

1. UIパーツとデリゲート（先のクラス）を接続する
1. デリゲート（先のクラス）にプロトコル名を書く
1. デリゲート（先のクラス）に処理を書く

##Sample
StoryBoardを使って、検索バー（UISearchBar）の処理をViewControllerにデリゲートしてみる。

※UISearchBarは「ユーザがタップした際にキーボードを表示する機能」や
「入力された文字列を自身の上に表示する機能」が用意されているが、
「入力された文字列をどのように扱うか」などは追加で（デリゲートして）実装する必要がある。

## UIパーツとデリゲート（先のクラス）を接続する

StoryBoard上で、処理をデリゲートに依頼するUIパーツ（今回はUISearchBar）を右クリックし、
delegateプロパティをViewControllerクラスにドラッグし接続する。

## デリゲート（先のクラス）にプロトコル名を書く

デリゲートされる側のヘッダファイル（今回はViewController.h）上で
「UISearchBarクラスの代理人であること」を宣言する。

```obj-c
@interface VIewController : UIViewController <UISearchBarDelegate>
```
（UISearchBarDelegateというプロトコルを宣言）

## デリゲート（先のクラス）に処理を書く

処理を書く場所はプロトコルによって定められている。
今回の例のようにSearchBarのデリゲートになった場合は、
searchBarSearchButtonClicked:メソッド内に処理を書く。

```obj-c
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
	//デリゲート側で行う処理
}
```

##参考

iPhoneアプリ開発超入門
http://www.sbcr.jp/products/4797369434.html
Lanica Platino を使ってみる（スプライトアニメーション）

引き続きLanica Platino。スプライトアニメーションを試してみる。

#Sprite Animation
[API Document](http://docs.lanica.co/docs/#!/api/SpriteSheet)を見て実装。画像もここから拝借。

```js:SpriteAnimation
var sheet = platino.createSpriteSheet({
    image: "spritesheet1a.png",
    width: 34,
    height: 42,
    border: 1,
});
scene.add(sheet);
sheet.animate(0, 5, 200, -1);
```

これだけ。
width、heightには、1フレーム分のサイズを指定する。
また、このサンプル画像は各フレーム画像の間に1pxのボーダーが入っているが、borderを指定するとこれを無視する。

ドキュメントを見る限り、「loop」パラメータは、0（ループなし）、-1（無限ループ）の2パターンしか無いっぽい。
Coronaとかである「往復ループ」のパターンが無いのは残念。そのうち追加されるかな。

なお、以下のようにフレーム数のindexを配列指定することも可能。

```js:SpriteAnimation
//sheet.animate(0, 5, 200, -1);
// ↑と同義
sheet.animate([0, 1, 2, 3, 4], 200, -1);
```

以上
コマンドライン引数

Go言語でコマンドライン引数を取り扱う際のメモ。

[flag - The Go Programming Language](http://golang.org/pkg/flag/ "flag - The Go Programming Language")

結論から、flagパッケージをimportすれば万事解決。

os.Argsでコマンドラインの引数を取ることも可能だけど、
機能が全然違うのでちょっと凝ったことをしたいならflagを使うのがいい。




```sample.go 
package main

import (
        "fmt"
        "flag"
        "os"
)

func main(){
        f := flag.Int("flag1", 0, "flag 1")
        flag.Parse()

        fmt.Println("os.Args: ", os.Args)
        fmt.Println("compare")
        fmt.Println("flag.Args: ", flag.Args())
        if *f == 100 {
            fmt.Println("Hello")
        }
}
```


```
% go build sample.go 

% ./sample  a b c
os.Args:  [./sample a b c]
compare
flag.Args:  [a b c]

```

flagパッケージを使うと指定したオプションとそれ以外に指定したパラメータは分けて返してくれる機能が備わっている


```
% ./sample  -flag1=1 a  
os.Args:  [./sample -flag1=1 a]
compare
flag.Args:  [a]
```

あと、ヘルプも-hで表示してくれる。

```
% ./sample   -h   
Usage of ./sample:
  -flag1=0: flag 1
```

pythonのargparse, optparse よりかは柔軟性が落ちる印象だけど普通のコマンドラインツール作るにはこれでかなり間に合いそうな印象。
dashboardからajaxで何かを更新する

管理画面のダッシュボードからちょっとした情報を更新するのにajaxでやりたいときは、独自phpを用意してもできるけど、wordpressの流儀に則ってやっておこう。

まず、ajaxでポストされた時に実行するコールバックを定義する。

```php
add_action( "wp_ajax_アクション名", "my_action_callback" );

function my_action_callback () {
  /** アクションの中身 */
}

```

次に、実際にpost処理を行うjsを書く。この時、ポストしたいパラメータに加えて、"action=上で指定したアクション名"も送信する。アクション名が"update_hoge"だとして、msgで文字列をもらうようなアクションだとすると、jQueryを使うとこんな感じになる。

```js
var data = { 
  action: "update_hoge",  //wordpressに実行するアクションを指示するため
  msg: "hello" //実際に送りたい内容
};
  
jQuery( ajaxurl, data, function( response ) {
  /** 完了時にコールバック */
} );
```

`ajaxurl`は、ajax-admin.phpへのurlで、wordpressのjsの方で定義されている値なので、特に宣言もなく利用できる。これを実行すると、wp_ajax_アクション名に指定したコールバックが呼ばれ、その中では$_POST変数からPOSTの内容が扱える。

あとは、`wp_add_dashboard_widget`を使って投稿用のフォームウィジェットをダッシュボードに追加して、post用のjsを、`admin_footer`アクションで出力するなどすれば良い。
Python 3.3でmatplitlibとpylabを使おうとしたら RuntimeError: Python is not installed as a frameworkというエラーが発生したときの解決方法


# 経緯

- pyenv
- virtualenv
- Python 3.3.1

で、Scikit-learnを使った機械学習をやろうと思い立った。ついでに図の可視化もやろうと考えてmatplotlibも使うことにした。matplotlibを簡単に使うためにpylabをimportしたところ、RuntimeError: Python is not installed as a frameworkというエラーが発生したので、matplotlibの設定を変えて、問題を解決した。


# インストール手順
```terminal
$ pip install scikit-learn
$ brew install freetype
$ sudo pip install python-dateutil
$ sudo pip install pyparsing
$ sudo pip install matplotlib
```

matplotlibのインストールには

- freetype
- python-deteutil
- pyparsing

が必要。ほかにも色々必要なものがある。詳しくは[公式ページ](http://matplotlib.org/users/installing.html)にて

なお、freetypeをbrew installしたら依存しているlibpngも入る。

参考 http://djakarta-trap.net/blog/2013/06/07/install_matplotlib/


# 問題発生
対話環境で

```python:ipython3
import pylab
```

とすると

```
RuntimeError: Python is not installed as a framework. The
Mac OS X backend will not be able to function correctly if Python
is not installed as a framework. See the Python documentation for
more information on installing Python as a framework on Mac OS X.
Please either reinstall Python as a framework, or try one of the other 
backends.
```

なるエラーが発生した。

## 調査
まず同様のエラーが起こって困っている人、そして解決した人がいないか調べた。

ytというmatplotlibを利用したプロジェクトでの議論 http://hg.yt-project.org/yt/issue/642/cannot-import-pylab-on-os-x-using

同じ問題にぶつかった日本語ブログ記事 http://asahima.hatenablog.com/entry/2013/10/11/201119

matplotlib本家githubでのissue https://github.com/matplotlib/matplotlib/issues/2361

どうも2013年10月段階でもまだ解決していないみたい。


## 原因
matplotlibの画像描画バックエンド（参考 http://matplotlib.org/faq/usage_faq.html#what-is-a-backend ）はデフォルトの設定ではCocoaのAPIを使ってレンダリングを行う"macosx"である。デフォルトではないバックエンドとしてGTKAggやQt4Aggがある。LinuxやWindowsから使うときは当然macosx以外のバックエンドを設定する。


### 僕の推論
※（この項の内容は想像で考えたことなので、間違っている可能性があります）

問題は、僕の環境ではpyenvを使ってOSXシステムにもとから入っているのとは違う場所にPython 3.3をインストールしていたことだ。この場合、CocoaのAPIで描画できない可能性があるので、pylabをimportしたときに、念のためにエラーを発生させてしまう。

※（推論終わり）

バックエンドをmacosx以外のものに指定すれば、問題は解決する。

## 解決方法
matplotlibをpipでインストールしたので、  ~/.matplotlib というディレクトリができているはずだ。そこにmatplotlibrcというファイルを作る。

``` ~/.matplotlib/matplotlibrc
backend : TkAgg
```

と、TkAggをバックエンドに使うよう指定する。

matplotlibrcの書き方参考 http://matplotlib.org/users/customizing.html

## 実験

こちらのブログ記事 http://sucrose.hatenablog.com/entry/2013/05/25/133021 にて紹介されている、sklearnの結果をpylabで可視化するコードを対話環境で実行した。

```
from sklearn.datasets import load_digits
import pylab as pl 
digits = load_digits()
pl.gray() 
pl.matshow(digits.images[0]) 
pl.show() 
```

![figure_2.png](https://qiita-image-store.s3.amazonaws.com/0/5960/dd65dfca-e724-8384-1b17-459d5b85a576.png "figure_2.png")

このように、TkAggでもきれいに図を描画できた。
Rails アプリケーション間での DB の共有 (SQlite)


マスタ系レコードを共有しながら，業務系アプリケーションを複数作っていくなら必須の情報なんだが，あんまり話題になってるのを見たことがない．

MySQL が自分の環境的にどうにも鬼門でうまく動かせた試しがなく，そこを何とかしてる時間もないので，SQlite で無理矢理にでも動かす．

1. 共通 DB の置き場を決め，各アプリケーションの database.yml から参照する．

  例えば "app1", "app2" とアプリケーションと同じレベルに "shared_db" みたいなディレクトリを作ってそこに sqlite3 ファイルを設置する．
  
  ``` database.yml

 　shared_db:
  　　adapter: sqlite3
  　　database: ../shared_db/shared_db.sqlite3
  　　pool: 5
  　　timeout: 5000
  ```2.  各モデルから 共通 DB に接続する．

  ``` company.rb

    class Company < ActiveRecord::Base
      establish_connection(:shared_db)
      …
    end

  ```

  親アプリの models 以下をロードパスに含める方法もあるようだが，結局，リレーションを宣言したりしないといけないので，DRY 原則には反するものの，子アプリでローカルファイルを持っていた方が分かりやすい．その際，必要最低限の表示用メソッドなどもコピーしておく必要がある．

* 検討事項
  * 共通 DB のレコード更新用に別のアプリを起動させておき，子アプリからはそこへのリンクを貼るようにする．(美しくない)
WindowsAzureWebサイトでNetCommons2のinstall.inc.phpをリードオンリーにしたり書き込み権限つけるスクリプト


NetCommons2はwebapp/config/install.inc.phpが書き込み禁止になってたらインストール済み、書き込み権限あればインストーラー実行という仕組みになってます。

でWindowsAzureWebサイトだと手動でファイルの書き込み権限変更できなくて、インストール後にあれこれやるのに困ったので、権限変更するだけのファイルを作りました。

webapp/configにUPしてブラウザでアクセスしてください。
使い終わったら削除してくださいね。他の人にWritableにされちゃうとインストーラ表示されちゃうんで(^^;

```php
<?php
if(isset($_POST['Writeable'])){
    chmod( "install.inc.php", 0644);
}
if(isset($_POST['ReadOnly'])){
    chmod( "install.inc.php", 0444);
}

?>
<html>
<body>
<form method="POST">
    <input type="submit" name="Writeable" value="Writeable" />
    <input type="submit" name="ReadOnly" value="ReadOnly" />
</fom>
</body>
</html>
```
PowerShellでSQL文の実行結果件数を取得してみました

次のようにして出来ました。

ポイントは、System.Data.Odbc.OdbcCommandクラスのExecuteNonQueryメソッドの戻り値で、件数を取得できるということですね。なんだか、試してみるまでもなかった気がする。。。

```ps1:OdbcCommand003.ps1
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$WarningPreference = "Continue"
$VerbosePreference = "Continue"
$DebugPreference = "Continue"

# ライブラリ読み込み
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data")

######################################################################
### 関数定義
######################################################################

# Updateの件数を取得するテスト
function U-Test-UpdateCount() {
    # コマンド実行（UPDATE）
    $odbcCmd.CommandText = "UPDATE TEST SET NAME='りんご類' WHERE name like 'りんご%'"
    $count = $odbcCmd.ExecuteNonQuery()
    Write-Debug "Update文の更新件数：$count"
}

# Deleteの件数を取得するテスト
function U-Test-DeleteCount() {
    # コマンド実行（DELETE）
    $odbcCmd.CommandText = "DELETE TEST WHERE name like 'りんご%'"
    $count = $odbcCmd.ExecuteNonQuery()
    Write-Debug "Delete文の削除件数：$count"
}

######################################################################
### 処理実行
######################################################################

# DB接続
$connectionString = "DSN=H2TestDsn;uid=sa;pwd=sa;"
$odbcCon = New-Object System.Data.Odbc.OdbcConnection($connectionString)
$odbcCon.Open()

# コマンドオブジェクト作成
$odbcCmd = New-Object System.Data.Odbc.OdbcCommand
$odbcCmd.Connection = $odbcCon

# コマンド実行（テーブル作成）
$odbcCmd.CommandText = "CREATE TABLE TEST (ID INT PRIMARY KEY, NAME VARCHAR(255))"
$odbcCmd.ExecuteNonQuery() | Out-Null

# コマンド実行（INSERT）
$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (100, 'りんご')"
$odbcCmd.ExecuteNonQuery() | Out-Null
$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (101, 'りんご２')"
$odbcCmd.ExecuteNonQuery() | Out-Null
$odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (102, 'りんご３')"
$odbcCmd.ExecuteNonQuery() | Out-Null

# テスト
U-Test-UpdateCount
U-Test-DeleteCount

# コマンド実行（SELECT）
$odbcCmd.CommandText = "SELECT * FROM TEST ORDER BY ID"
$odbcReader = $odbcCmd.ExecuteReader()
while ($odbcReader.Read()) {
    $odbcReader["ID"].ToString() + " " + $odbcReader["NAME"].ToString()
}
$odbcReader.Dispose()

# コマンド実行（テーブル削除）
$odbcCmd.CommandText = "DROP TABLE TEST"
$odbcCmd.ExecuteNonQuery() | Out-Null

# コマンドオブジェクト破棄
$odbcCmd.Dispose()

# DB切断
$odbcCon.Close()
$odbcCon.Dispose()
```
WindowsAzure用NetCommons2のinstall.inc.php


BASE_DIR, BASE_URL, DB設定不要でWindowsAzureのWebサイトにリンクされたClearDBのMySQLに接続できる設定ファイルになります。

webapp/config/へアップして使ってください。

```
<?php
/**
 * インストール時configファイル
 *
 * @package     NetCommons.component
 * @author      Noriko Arai,Ryuji Masukawa
 * @copyright   2006-2007 NetCommons Project
 * @license     http://www.netcommons.org/license.txt  NetCommons License
 * @project     NetCommons Project, supported by National Institute of Informatics
 * @access      public
 */
 
// ------------------------------------------
// 設定ファイルのパス(固定:変更不可)
// ------------------------------------------
define('INSTALL_INC_DIR', transPathSeparator(dirname(__FILE__)));
 
// ----------------------------
// ベースのURL値
// ----------------------------
if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']!='off') {
    $protocol = 'https://';
}else{
    $protocol = 'http://';
}
$url = $protocol . $_SERVER['HTTP_HOST'];
// AzureSubDirectoryCheck
$NCRootPath = dirname(dirname(dirname(__FILE__)));
$subPath = substr($NCRootPath, strpos($NCRootPath, 'wwwroot') + 7);
if($subPath){
    $subPath = str_replace(DIRECTORY_SEPARATOR, '/', $subPath);
    $url .= $subPath;
}

define('BASE_URL', $url);
// -------------------------------------------------
// ベースのURL値(ソースがあるCoreのNetCommonsのURL)
// 基本：BASE_URLと同じ
// -------------------------------------------------
define('CORE_BASE_URL', BASE_URL);
// ----------------------------
// NetCommonsのBaseディレクトリの設定
// ソース格納場所
// ----------------------------
if(!defined("BASE_DIR")) {
	define('BASE_DIR', dirname(START_INDEX_DIR));
}



// ----------------------------
// NetCommonsのHTDOCSディレクトリの設定
// 画像ファイル、CSSファイル格納場所
// デフォルト(START_INDEX_DIR)
// ----------------------------
define('HTDOCS_DIR', START_INDEX_DIR);

// ----------------------------
// テーマ用ディレクトリ
// デフォルト(BASE_DIR."/webapp/style)
// ----------------------------
define('STYLE_DIR', BASE_DIR . '/webapp/style');

// ----------------------------
// ファイルアップロード関連のディレクトリ設定
// (注意)ディレクトリ指定での最後に「/」をつけること
// デフォルト(BASE_DIR  . '/webapp/uploads/')
// ----------------------------
define('FILEUPLOADS_DIR', dirname(INSTALL_INC_DIR) . '/uploads/');

// ----------------------------
// データベース用設定値
// ----------------------------
// azure clearDB
$keys = array_keys($_SERVER);
$keyNameArray = preg_grep('/MYSQLCONNSTR/', $keys);
if(count($keyNameArray) > 0){
    $keyName = array_shift($keyNameArray);
    $dbString = $_SERVER[$keyName];

    $vars = explode(';', $dbString);
    $params = array();
    foreach ($vars as $value) {
        list($paramName,$paramValue) = explode('=', $value);
        $params[$paramName] = $paramValue;
    }

    $dbDns = sprintf('mysql://%s:%s@%s/%s',
        $params['User Id'],
        $params['Password'],
        $params['Data Source'],
        $params['Database']
        );
    define('DATABASE_DSN', $dbDns);

}else{
    define('DATABASE_DSN', 'mysql://user:pass@dbhost/dbname');
}
    define('DATABASE_PREFIX', 'netcommons2_');
    define('DATABASE_PCONNECT', 0);
    define('DATABASE_CHARSET',  'utf8');    


require_once BASE_DIR . "/webapp/config/maple.inc.php";
require_once BASE_DIR . "/webapp/config/define.inc.php";
?>
```
PowerShellでODBC接続してトランザクション管理してみた

次のようにして、トランザクション管理ができました。

ポイントは、次です。
１．System.Data.Odbc.OdbcConnectionクラスのBeginTransactionメソッドでトランザクションを開始し、トランザクションオブジェクトを取得する。
２．上記１で取得したトランザクションオブジェクトのCommitメソッドでコミット。
３．上記１で取得したトランザクションオブジェクトのRollbackメソッドでロールバック。

```ps1:OdbcCommand002.ps1
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$WarningPreference = "Continue"
$VerbosePreference = "Continue"
$DebugPreference = "Continue"

# ライブラリ読み込み
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data")

######################################################################
### 関数定義
######################################################################

# トランザクション管理して、コミットするテスト。
function U-Test-Commit() {
    # トランザクション開始
    $odbcTran = $odbcCon.BeginTransaction()
    $odbcCmd.Transaction = $odbcTran
    Write-Debug "トランザクション開始"

    # コマンド実行（INSERT）
    $odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (100, 'りんご')"
    $odbcCmd.ExecuteNonQuery() | Out-Null

    # コミット
    $odbcTran.Commit()
    Write-Debug "コミット"
}

# トランザクション管理して、ロールバックするテスト。
function U-Test-Rollback() {
    # トランザクション開始
    $odbcTran = $odbcCon.BeginTransaction()
    $odbcCmd.Transaction = $odbcTran
    Write-Debug "トランザクション開始"

    # コマンド実行（INSERT）
    $odbcCmd.CommandText = "INSERT INTO TEST (ID, NAME) VALUES (101, 'みかん？')"
    $odbcCmd.ExecuteNonQuery() | Out-Null

    # ロールバック
    $odbcTran.Rollback()
    Write-Debug "ロールバック"
}

######################################################################
### 処理実行
######################################################################

# DB接続
$connectionString = "DSN=H2TestDsn;uid=sa;pwd=sa;"
$odbcCon = New-Object System.Data.Odbc.OdbcConnection($connectionString)
$odbcCon.Open()

# コマンドオブジェクト作成
$odbcCmd = New-Object System.Data.Odbc.OdbcCommand
$odbcCmd.Connection = $odbcCon

# コマンド実行（テーブル作成）
$odbcCmd.CommandText = "CREATE TABLE TEST (ID INT PRIMARY KEY, NAME VARCHAR(255))"
$odbcCmd.ExecuteNonQuery() | Out-Null

# テスト
U-Test-Commit
U-Test-Rollback

# コマンド実行（SELECT）
$odbcCmd.CommandText = "SELECT * FROM TEST ORDER BY ID"
$odbcReader = $odbcCmd.ExecuteReader()
while ($odbcReader.Read()) {
    $odbcReader["ID"].ToString() + " " + $odbcReader["NAME"].ToString()
}
$odbcReader.Dispose()

# コマンド実行（テーブル削除）
$odbcCmd.CommandText = "DROP TABLE TEST"
$odbcCmd.ExecuteNonQuery() | Out-Null

# コマンドオブジェクト破棄
$odbcCmd.Dispose()

# DB切断
$odbcCon.Close()
$odbcCon.Dispose()
```
ODBCデータソースを作成するコマンド（Symfoware編）

次のコマンドで、SymfowareのODBCデータソースを作れました。

```bat:Odbcconf002.bat
odbcconf /A {CONFIGDSN "Symfoware ODOS" "DSN=｛DSN名｝|CLI_SERVER_SPEC=RDB2_TCP,｛IPアドレス｝,｛ポート番号｝|CLI_DEFAULT_SCHEMA=｛スキーマ名｝"}
```

ちなみに、CLI_SERVER_SPECやCLI_DEFAULT_SCHEMAの設定項目は、ネットではなかなか見つけられませんでした。そのため、一度、ODBCデータソースアドミニストレータから、SymfowareのODBCデータソースを作成し、レジストリをみて、上述の設定項目があることを知りました。

レジストリは、次の場所あたりに保存されるようです。
- HKEY_CURRENT_USER/Software/ODBC
- HKEY_LOCAL_MACHINE/SOFTWARE/ODBC

上記コマンドは、Windows XPで動作確認しました。Windows 7 (64bit)では、下記mameendomameさんのコメントにあるように、リンク先を参考にして、対応する必要があるようです。

# 変更履歴
2015/2/22　mameendomameさんからご連絡いただいた記述不備を修正し、動作環境について明記しました。ご指摘ありがとうございます！
コントローラの基本

コントローラの基本：
コントローラはアプリのリモコン。
個々のリクエストに応じた処理を担当。

rails generate controller name [option]
name=コントローラ名
options=動作オプション

option 一覧
他に応用可なもの
-f, --fource
-q, --quiet
-s, --skip

コントローラ用
-e, [--template-engin=NAME]
-t, --test-framework=NAME
--helper

コントローラ作成で作られるファイル：

/controls/hello_controller
コントローラ本体

/views/hello
スクリプト

/helpers/hello_helper.rb
コントローラ固有のビューヘルパー

test/unit/helpers/hello_helpers_test.rb
ビューヘルパーのテストスクリプト

/functional/hello_controller_test.rb
コントローラクラスのテストスクリプト

ーーー

rails generate controller XXXXで作成した自動生成ファイルは
rails destroy controller XXXXでまとめて削除できる。


コントローラクラスの基本：
最低限のコードは書いてあるので、必要に応じて追加する。
①ファイルはUTF-8で保存する。
#coding: utf-8
これがないとマルチバイト文字が文字化けするよ。

②大本のApplication controllerクラスを継承する。
要はapplication cssを経由することで各ページのスタイルの記述に専念できるのと同じ。

③具体的処理はdef index ~end のアクションメソッドで

④↑の役割はリクエスト情報の処理やモデルを呼び出したり、ビューに渡す変数の出力設定など。
e.g. 文字列を出力する場合は render :text => value←文字列

あまりコントローラから出力を直接作るのはよくない。
MVCの考え方から離れているから。
Ruby on Railsの基本

Railsでのアプリ開発はまず土台となるスケルトンから。
railsコマンドを使って最低限必要なファイルを自動的に作成できる。

構成確認：
app/public/script
の３つが良く利用するもの。

app内にアプリのコードの大部分を書く。

publicはアプリケーションの配下で唯一HTTP経由で公開されるフォルダ。
クライアントが直接アクセスする必要があるjavascript/images/htmlなどはここに。

scriptにはスクリプトファイルがある。コードの自動生成やサーバー起動の
ためのものが入っているから削除はダメ！

メモ：
MVCパターン
Model (ビジネスロジック)
View (ユーザーインターフェイス)
Controller (Model&Viewの制御)

Rails (フレームワーク開発)
DRY = Don't Repeat Yourself
CoC = Convention over Configuration
[cocos2d-x] cocos2d-x向け設定 仮まとめ

# Eclipse設定

## エディタのデフォルトEncodingがSJIS。これをutf8に変更する

cf.
http://next-nex.info/?s=2246

eclipse.appを右クリックで「パッケージを開く」し、
中のMacOS/eclipse.iniに
-Dfile.encoding=utf-8
を追加し、上書きする
Xcode5でMacRubyを利用できるようにしたが・・・、


##はじめに
http://macruby.org

RubyでGUIアプリケーションを作りたいと思っていました。そんなとき、MacRubyという存在を知りました。しかしその存在を知ったときにはすでに"Xcode 5"をインストールしていました。Xcode 5から、メモリ管理の方式が標準でARCとなりコンパイルエラーばかり起きたため、MacRubyを諦めざるを得ませんでした。
仕方なく他の方法でGUIアプリケーションに取り組もうとしたものの、TkやQtでも全くうまくいきませんでした。Gtk2やShoesは動かせましたが、あまりぱっとしませんでした。

やはりMacRubyを使いたくなり、調べた結果とりあえず利用できるようになったので方法をまとめます。

##MacRubyをXcode 5で利用するために
1. "MacRuby.Framework"の場所をXcodeに認識させる。
2. メモリ管理の方法がXcode 5から変更された（前述）ことに対応させる。

##1を解決しよう
http://sassembla.github.io/Public/2013:01:05%2014-54-54/2013:01:05%2014-54-54.html

ここを見ると、"MacRuby.framework"が入っているパスをプロジェクトに登録することで"MacRuby.framework"を読み込ませています。しかし、自分の環境では"MacRuby.framework"を認識してくれませんでした。
>
/Library/Framework

この中に"MacRuby.Framework"が入っているので、これを直接プロジェクトに読み込ませました。
サイドバーで"Add files to（プロジェクト名）"を選択し、"MacRuby.framework"を指定してください。その際、既に登録してある"MacRuby.framework"（赤字表記）は、サイドバーから削除してください。

##2を解決しよう
https://github.com/MacRuby/MacRuby/issues/226

ここでのやり取りを参考にしました。
"Build Settings"から"Objective-C Automatic Runtime Counting"を探し出し、パラメータを"No"にしました。

##終わりに
これで一応利用できるようになりました。めでたく"Build Succeeded"の文字を見ることができました。
黄色のエラーが２つ出てますが、気にしなくてもいいと思います。

##補足
現状ではOutletに接続できないようです・・・。

##2013年12月29日追記
MacRubyの情報がここ最近でてきていません・・・。
Xcode5ではRubyMotion（有償）しか選択肢が残されていないのかもしれません。