OmniAICreator/Qiita-1.07M huggingface dataset:
API通信を書きたいときに見るメモ

API通信前後の処理について、忘備用メモです。


#環境
iOS7(Xcode5、iPad、iPadAir)
MacBookAir

#呼び出し方
##GETメソッド/クエリ文字列　

```objc
NSURL *url;
NSMutableURLRequest *request;

//URL作成
url     = [NSURL URLWithString: [NSString stringWithFormat:@"http://XXXXXXXX req_param=%@",@"user01"]];

//リクエスト作成
request = [NSMutableURLRequest requestWithURL:url];

//HTTPリクエスト送信
NSHTTPURLResponse *response = nil;
NSError *error          = nil;
NSData *result          = [NSURLConnection sendSynchronousRequest:request
                                                  returningResponse:&response
                                                              error:&error];
```

##POSTメソッド

```objc
NSURL *url;
NSMutableURLRequest *request;

//パラメータの組み立て
NSMutableDictionary *mutableDic = [NSMutableDictionary dictionary];
  //★APIの形式に合わせて組み立てる
[mutableDic setValue:user_id forKey:@"user_id"];
  //★入れ子の場合は配列のオブジェクトなどをそのまま格納できる
[mutableDic setValue:answers forKey:@"answers"];
NSData *body    = [NSJSONSerialization dataWithJSONObject:mutableDic options:NSJSONWritingPrettyPrinted error:Nil];

//リクエスト作成
url     = [NSURL URLWithString:@"http://XXXXXXXX"];
request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:body];

//HTTPリクエスト送信
NSHTTPURLResponse *response = nil;
NSError *error          = nil;
NSData *result          = [NSURLConnection sendSynchronousRequest:request
                                                  returningResponse:&response
                                                              error:&error];


```

#レスポンスを扱うには
##HTTPステータスコードの取得

```objc
int statusCode = [response statusCode];
```

##エラーコードの取得

```objc
int errorCode = error.code;
```

##JSONをパース

```objc
NSError *perthError     = nil;
NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:result options:0 error:&perthError];
```
Play Framework 1.2.x ハマったことのちょいメモ

Play Framework も今となっては 2.2.x の時代。
そんな中、 1.2.x のお話しではあるが...

# ハマった現象

どう見ても Model に問題が無く、コンパイルも通り、Play! のお作法に従っているのに、

> The type <Model ClassName> is already defined

というエラーが出てしまう。

本当に問題があるケースも無いとは言えないが、case-insensitive な Filesystem 上で動かしている場合は、
単なるうっかりスペルミスで、該当クラス名の先頭を小文字にしていないかを確認しよう。

Play は Java ランタイム上で動いており、当然 case-sensitive なので、先頭小文字のまま、
素直に Model クラスを探しに行く。
ところが、 Filesystem は case-insensitive なおかげで、先頭大文字の、Model クラスを見つけてくる。

で、エラーに先頭大文字の Model クラスを表示しちゃう訳だ。

Model クラスをチェックしまくったのに、原因は Controller クラス側のスペルミスでした！

こんな、うっかりミス、滅多にやる人はいないかもしれないが、割とよくハマるのでメモ。
3/14日のJavaScript学習内容

text:独習JavaScript

本日の学習内容
4章ビルトインオブジェクト
　　・Date
　　・Array
　　・String
　　・Math　　　　　　　　　　　　　　　　　　　　　　　　各オブジェクトの復習

P189-P199 6.3クラス定義とコンストラクタ

まだ各メソッドなどは覚えられていませんが、基本的なJavaScriptに関する基礎知識や仕組みは理解してきました。

ただ６章のオブジェクト指向プログラミングがなかなか理解できずに困っています。
クラスやコンストラクタと言われても、？となってしまいます。
ですので、６章に少し時間をかけようと思います。

次回も引き続きクラスについての内容をやっていきます。
iCloud の どこでも My Mac で SSH ログインする


# OSX 10.9.2 では以下のようにしてできた

```dns-sd -E``` でドメインをしらべる。


``` bash
hoge@iMac:~$ dns-sd -E
Looking for recommended registration domains:
DATE: ---Fri 14 Mar 2014---
16:44:20.839  ...STARTING...
Timestamp     Recommended Registration domain
16:44:20.839  Added     (More)               local
16:44:20.840  Added                          icloud.com
                                             - > btmm
                                             - - > members
                                             - - - > 999999999
```


icloud.com 以下の階層を逆順につなげたアドレスを ```dns-sd -B _ssh``` にわたして、
どこでも MyMac に登録されている機械を一覧する。

``` bash
hoge@iMac:~$ dns-sd -B _ssh 999999999.members.btmm.icloud.com
Browsing for _ssh._tcp.999999999.members.btmm.icloud.com
DATE: ---Fri 14 Mar 2014---
16:45:40.965  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
16:45:41.685  Add        3   0 999999999.members.btmm.icloud.com. _ssh._tcp.           fooMac
16:45:41.685  Add        2   0 999999999.members.btmm.icloud.com. _ssh._tcp.           barMac
```

ドメインにユーザー名と Instance Name を追加したもので ssh 接続する

``` bash
hoge@iMac:~$ ssh hoge@fooMac.999999999.members.btmm.icloud.com
```


## 以下は古い

1. iClound にコンピュータを追加
1. ```mDNS -E``` コマンドで icloud のドメインを取得する

	```bash
	myMac:~ hoge$ mDNS -E
Looking for recommended registration domains:
Talking to DNS SD Daemon at Mach port 5891
13:08:41.371  Recommended Registration Domain local. Added
13:08:41.371  Recommended Registration Domain 999999999.members.btmm.icloud.com. Added
```

1. [ssh 接続したいコンピュータ名].999999999.members.btmm.icloud.com で接続できる

	```
	ssh myMac.999999999.members.btmm.icloud.com
	```
JavaScriptの勉強5日目：2014年3月14日(金)

一か月ぶりです。

本日は復習を兼ねて、ドットインストール上にあるJavaScriptを使ったゲームの作成を行った。

割り勘電卓、5秒をあてるストップウォッチ、神経衰弱の作成に挑戦したが神経衰弱のバグが修繕出来ず、途中で終わった。

5秒をあてるストップウォッチはこれ以上機能の拡張のしようがないと感じたが、割り勘電卓はアイデア次第でいくらでも改善できると感じた。

具体的には、1円単位で割り勘にしたり、男女、年齢で払う金額の比重を考慮したりなど。(神経衰弱のバグを直すのに追われて実際に拡張はできていない。)


こういった視点は、いいものを作る上で重要だと思うので、今後も大切にしていきたい。
gitで直近のコミットで修正されたファイルリストを取得する

gitをあまり使っていなかったのですが、最近になって勉強を始めています。
使ってみると、色々と便利ですね。主に[Eclipse](https://www.eclipse.org/)の[EGit](https://www.eclipse.org/egit/)と[Brackets](http://brackets.io/)の[Brackets Git](https://github.com/zaggino/brackets-git)で使っています。

色々と調べたところ、bare repositoryをサーバーに作っておくと、ローカルからのGit Pushをトリガーとしてshell scriptで処理が書けるという事を知り、ちょっと便利そうなものを[githubに公開](https://github.com/yoshinari/gitPostReceiveHookScript)しました。
_typoとかで何回も公開し直すという情けない状態ですが..._

このhookを設定すると、以下の事が可能になります。Webサイトの更新を想定しています。
* 同一サーバーの指定ディレクトリに更新ファイルを配置する
* リモートのサーバーにscpでファイルを転送する
* リモートのサーバーにftp (ncftp)でファイルを転送する

しかし、リモートサーバーに転送する機能は、更新の有無に関わらず、すべてのファイルを転送し、削除すべきファイルも削除できない、という使わない方が良いロジックです。

この部分に関しては、git logコマンドを使って転送用のファイルリストと削除用のファイルリストを作ってしまえば、効率的なプログラムに修正できそうです。

ファイルリストを作成するためのコマンドは以下の通りです。（この例では画面表示）

転送用ファイルリスト：
`git log --name-status -p -1 | egrep "^[AM]\s.*" | awk '{print $2}'`

削除用ファイルリスト：
`git log --name-status -p -1 | egrep "^D\s.*" | awk '{print $2}'`


以上、qiitaへの初投稿でした。
Gitでバイナリファイルがコンフリクトした際の対処方法

## 対処方法

※masterブランチにいてdevelopブランチをマージした場合

```bash
# developブランチの対象ファイルを採用
git checkout --theirs 対象ファイル
# masterブランチの対象ファイルを採用
git checkout --ours 対象ファイル
```

ちなみにmasterブランチのをそのまま採用って場合はいちいち```git checkout --ours 対象ファイル```しなくてもよいみたい。

SourceTreeでも出来ないんだろうか。。


## 参考リンク
http://blog.ruedap.com/2011/07/20/git-merge-conflict-binary-file
正規表現に自信が無い人も安心 visual-regexp.el

**正規表現にイマイチ自身が無くて、文字列置換などで活用できてない。**

そんな時には visial-regexp.el を使おう。

# visual-regexp.el 公式
https://github.com/benma/visual-regexp.el

# 準備
load-path の通った所に glone してくる

```shell-session:
$ cd load-path-dir
$ git clone https://github.com/benma/visual-regexp.el.git
```

# 設定

公式のままｗ

```el:
(require 'visual-regexp)
(define-key global-map (kbd "C-c r") 'vr/replace)
(define-key global-map (kbd "C-c q") 'vr/query-replace)
(define-key global-map (kbd "C-c m") 'vr/mc-mark)
```

# 使い方

設定したキーバインドでってのは当たり前だが、まずは `vr/query-replace` を試すと、
何となくこんなものってのが掴めるはず。

正規表現にマッチした箇所がハイライトされるので、納得できる所で `RET` 、
置換後の文字列も `=>` の後ろに入力内容通りに表示される。
`query-replace` 同様に `y` なら置換、 `n` ならそのままで次の候補に移動。

これで、 `replace-regexp` が使いこなせなくても、大丈夫になるはず。

正規表現で会話できる系の人は、 `replace-regexp` で頑張ってください。
Heroku Schedulerの設定がUTCだったのでHerokuのTimeZoneをJSTに変更してもかわらなかったお話

タイトルがそのまま結論なんですが。。。
Scheduler=cronだろうという安易な考えでHerokuのタイムゾーン変更しました。
結果はタイトルの通りで何も生産していませんが、、

# Scheduler入れる
```
$ heroku addons:add scheduler:standard 
```

# Schedulerの設定画面を開く
```
$ heroku addons:open scheduler
```

![Open_Heroku_Scheduler.png](https://qiita-image-store.s3.amazonaws.com/0/18843/30a61cf5-807d-cb12-33dc-e172c6f4993e.png)

ここで、JSTじゃなくてUTCなんだーと気付く。
タイムゾーン変更したら反映されるのではと？←
**ほぼ！ほぼ！無理だろう** と思いつつ
試してみることに。

# 自分の環境確認
```
$ rails c
Loading development environment (Rails 4.0.2)
[1] pry(main)> Time.now                                                                                                                                                                   
=> 2014-03-08 12:39:34 +0900
[2] pry(main)> exit                   
```
# Herokuの環境確認
```
$ heroku run console
Running `console` attached to terminal... up, run.6407
Loading production environment (Rails 4.0.2)
irb(main):001:0> Time.now
=> 2014-03-08 03:40:34 +0000
irb(main):002:0> exit
```

# HerokuのTimeZone変更
```
$ heroku config:add TZ=Asia/Tokyo
Setting config vars and restarting kimatakubot... done, v12
TZ: Asia/Tokyo
```

# Herokuの環境確認
```
$ heroku run console
Running `console` attached to terminal... up, run.9850
Loading production environment (Rails 4.0.2)
irb(main):001:0> Time.now
=> 2014-03-08 12:41:42 +0900
irb(main):002:0> exit
```

# Heroku logで確認
```
$ heroku logs
2014-03-14T00:00:41.942770+00:00 heroku[api]: Starting process with command `bundle exec rake XXXX` by scheduler@addons.heroku.com
2014-03-14T00:00:46.491058+00:00 heroku[scheduler.XXXX]: Starting process with command `bundle exec rake XXXX`
2014-03-14T00:00:47.056171+00:00 heroku[scheduler.XXXX]: State changed from starting to up
2014-03-14T00:00:53.268497+00:00 heroku[scheduler.XXXX]: Process exited with status 0
2014-03-14T00:00:53.274715+00:00 heroku[scheduler.XXXX]: State changed from up to complete
```
まぁそうだろうなと思いながら結果をみたらやはりUTCのままでしたorz
※ このlogとconsoleで日付が全然違いますが動作確認はその場で取っております
JavaScript で、オセロを作ってみる。

JavaScriptの学習のため、オセロを作ります。

<br/>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>







はい。
こちらが出来上がったものです。
https://github.com/murabo/reversi
<br/><br/>

対人のみで遊べるオセロの開発時間：3h
<br/><br/>
CPUモード追加&リファクタリング：4h弱
<br/><br/><br/>

感想：
元々はサーバ側の開発が多かったので、リアルタイムに動くのが非常に楽しかった。
CPUモードはチャレンジしてみよう的なノリだったが、(弱いけど)完成できて達成感!w

<br/><br/>
今後：
nodeとjQueryなんかを学習して、もっとリッチで、面白いものを作りたい。
Laravelを90分だけさわってみる。

# Laravel Quickstart
http://laravel.com/docs/quick

## Installation
`$ laravel new blog
`
You have arrived.が表示された。

## Routing
```php:app/routes.php
Route::get('users', function()
{
    return 'Users!';
});
```
Users!が表示された。

```php:app/views/layout.blade.php
<html>
    <body>
        <h1>Laravel Quickstart</h1>

        @yield('content')
    </body>
</html>
```
```php:app/views/users.blade.php
@extends('layout')

@section('content')
    Users!
@stop
```
```php:app/routes.php
Route::get('users', function()
{
    return View::make('users');
});
```
Laravel Quickstart
Users!
が表示された。

## Creating A Migration

```php:app/config/database.php 
		'mysql' => array(
			'driver'    => 'mysql',
			'host'      => 'localhost',
			'database'  => 'laravel_test',
			'username'  => '',
			'password'  => '',
			'charset'   => 'utf8',
			'collation' => 'utf8_unicode_ci',
			'prefix'    => '',
		),
```

`$ php artisan migrate:make create_users_table
`

```php:app/database/migrations/2014_03_14_071230_create_users_table.php
	public function up()
	{
		Schema::create('users', function($table)
		{
			$table->increments('id');
			$table->string('email')->unique();
			$table->string('name');
			$table->timestamps();
		});
	}

	public function down()
	{
		Schema::drop('users');
	}
```
`$ php artisan migrate
`
テーブルできた。すげぇ。
表示テストのために手動で1行入れとく。

## Eloquent ORM
```php:app/routes.php
Route::get('users', function()
{
    $users = User::all();

    return View::make('users')->with('users', $users);
});
```

## Displaying Data
```php:app/views/users.blade.php
@extends('layout')

@section('content')
    @foreach($users as $user)
        <p>{{ $user->name }}</p>
    @endforeach
@stop
```
表示されたよ。。。
[iOS] プロビジョニングファイルと証明書の意味


いまだになにがどうしてどうなる、みたいなところが明確ではありません。
ので、把握するという意味でメモを残しておこうと思います。

## iOS実機にアプリをインストールするために必要なもの

* 正規開発者証明書
* デバイス識別子
* アプリケーションID
* プロビジョニングファイル


### デバイス識別子

開発中（やアドホック用）の、アプリを動かしたいデバイスの識別子

### アプリケーションID

アプリケーションを識別するID

### プロビジョニングファイル

開発中（やアドホック用）アプリを、iPhone/iPadの実機にインストールするために必要。
プロビジョニングファイルは、`アプリケーションID`、`デバイス識別子`、`正規開発者証明書`の関係をまとめたファイルです。
これを実機に登録しておくことで、条件にあったアプリをインストールすることが可能になります。


##大まかな流れ

大まかな流れは以下になります。

1. Mac上で公開鍵・秘密鍵を生成し、公開鍵を含めたCSR（Certificate Signing Request - 証明書署名要求）をAppleに送り、 **正規開発者証明書** を発行してもらう ※1
2. 取得後、証明書をMacのキーチェーンに登録する
3. 証明書やアプリID、デバイスなどの情報を元に **プロビジョニングファイル** を作成する

※1...この証明書は、開発用・配布用の1つずつ必要となります。

### なぜこうする？

なんでこんなめんどくさいことをするのでしょうか。
アプリを実機にインストールするには色々な懸念事項を払拭する必要があるのです。
（例えば悪意ある第三者からのアプリを本物と間違えてインストールしないようにしたり、など）

そこで、「誰のどのマシンでどのデバイス向けに作られたアプリか」、というのを色々な技術を利用して「本物のアプリである」というのをiOSデバイスに識別させているのです。

発行手順やら登録手順やら色々あって混乱してしまいますが、一言で言えば **信頼のおける相手からのアプリだけインストールできるようにする** ということをあれこれやっている、というわけですね。

### つまり

以上を前提に必要な情報を見返してみると、「証明書」と「デバイス情報」と「アプリID」を明確にした上で、それらの関係をまとめる「プロビジョニングファイル」を作成し、それを実機に登録することで「本物のアプリを識別する」という内容になるわけです。

仕組みを理解しておくと問題が起きたときに問題箇所を特定するのに役立つので覚えておくといいと思います。
*やっと、プロビジョニングファイルの仕組みを把握できた気がします( ;´Д`)*


## 証明書について

これはiOS関係ないですが、CSRとかなんでやるのでしょうか。
自分もまだ本を読んでなんとなく理解したにすぎないですが、公開鍵・秘密鍵だけでは問題があるからのようです。

秘密鍵で暗号化するだけでは、悪意ある第三者になりすましをされる可能性がある、と。
（公開鍵を偽装して渡されたら本物のアプリがインストールできない？）

そこでこの鍵の仕組みを、Appleの証明書を利用することで解決しよう、というのがここでの話になります。
つまり、第三者的な位置にAppleが立つことによって、「渡された公開鍵が本物であるという証明をする」というわけです。
（ちょっと具体的なことはまだ理解しきれていないので説明できませんが、要は公開鍵・秘密鍵方式の鍵を証明する、ということが目的です）

・・iOSアプリの申請大変ですね( ;´Д`)


## 参考記事

ちなみにこちらの[iOSアプリのプロビジョニング周りを図にしてみる](http://qiita.com/fujisan3/items/d037e3c40a0acc46f618)という記事に、内部でどういうことをやっているのか、というのを図解してくれていました。
これをしっかり把握できれば、多少のエラーや問題が起きた時は対処できそうな気がします。


### 手順

ちなみに上記で図解しているものを箇条書きにすると以下の感じ。

1. 自分のPC上で、秘密鍵／公開鍵ペアを生成する
2. CSR（Certificate Signing Request - 証明書署名要求）を、(1)の公開鍵を付けてAppleに送る
3. (2)の公開鍵を含む証明書を作り、認証局の秘密鍵で暗号化
4. (3)の証明書をダウンロードし、キーチェーンへ登録
5. [DevCenter] App IDを登録
6. [DevCenter] Deviceを登録
7. (3), (5), (6)の情報を関連付ける＝プロビジョニングファイルの作成（つまりプロビジョニングファイルにはこの3つの情報が格納される）
8. プロビジョニングファイルをダウンロードし登録
9. ビルド設定を行う（BundleID, コードサイニング）
10. ビルド、アーカイブ（ipaファイル作成 ※）

※ ipaファイルにはアプリ本体とプロビジョニングファイルを含み、さらにそれ全体を(1)で生成した秘密鍵で暗号化（コードサイニング）

つまり、最初のほうで送った公開鍵がプロビジョニングファイルに含まれ、さらにそれが認証局によって暗号化されています。
この仕組が第三者からの改変を防いでくれる、ということのようです。
ubuntu rpm,yumコマンド対応表

| centos                     | ubuntu                                                   |
|:---------------------------|:---------------------------------------------------------|
| rpm -qa                    | dpkg -l                                                  |
| rpm -qa --last             | ls -tl /var/lib/dpkg/info/                               |
| rpm -ql                    | dpkg -L                                                  |
| rpm -qf                    | dpkg -S                                                  |
| rpm -qi                    | apt-cache show                                           |
| rpm -q --scripts           | cat /var/lib/dpkg/info/{package_name}.{pre,post}{inst,rm}|
| rpm -ivh                   | dpkg -i                                                  |
| rpm -Uvh                   | dpkg -i                                                  |
| rpm -e                     | dpkg -r                                                  |
| yum install                | apt-get install                                          |
| yum check-update           | apt-get -s upgrade                                       |
| yum update                 | apt-get upgrade                                          |
| yum update package         | apt-get install package                                  |
| yum remove                 | apt-get remove                                           |
| yum search                 | apt-cache search                                         |
| yum list                   | apt-cache search all                                     |
| yum info                   | apt-cache showpkg                                     |
| yum install --downloadonly | apt-get -d install (/var/cache/apt/archives/ に保存)     |
Githubにあるチュートリアルのライブラリを検討する


# チュートリアルのライブラリの検討

画面初期起動時に使い方を説明する画面を一般的にはチュートリアルと言ったりイントロダクションと言うようです。自力で実装したほうが早そうですがgithubにあるものはどういう特徴があるのかを調べてみました。

念のため、チュートリアルというのは使い方を体験を通じて説明する手段を一般的に指すことなので、この「スワイプして画面を切り替えること」自体をチュートリアルというのではありません。

## MYBlurIntroductionView

![MYBlurIntroductionView
](https://raw.github.com/MatthewYork/MYBlurIntroductionView/master/Resources/Images/MYBlurIntroductionView.gif)

MYBlurIntroductionViewはスワイプ後のテキストのアニメーションが特徴の様子。cocoapodsでインストールできます。

```
$pod try MYBlurIntroductionView
```

## AOTutorial

https://github.com/Appsido/AOTutorial

![AOTutorial](https://github-camo.global.ssl.fastly.net/590d325fbabe9d6227085a5946b255468fa58d44/687474703a2f2f7075626c69632e6170707369646f2e636f6d2f6950686f6e652f7075626c69632f414f5475746f7269616c2f414f5475746f7269616c53637265656e5f312e302e706e67)

AOTutorialはテキストはスワイプ出来るけども、ロゴとボタンはスクロールしないという画面を実現出来る様子。でもこれだけだと自力で実装したほうが早い気がしてしまいます。

## EAIntroView

https://github.com/ealeksandrov/EAIntroView

![EAIntroView](https://raw.github.com/ealeksandrov/EAIntroView/master/2.png)

EAIntroViewは何をスクロールさせて、何をスクロールさせないかを指定できる。例えばボタンはスクロールしないようにしたりだとかを指定します。

デモプロジェクトを起動すると、カスタムする内容に合わせてサンプルコードを確認できるのが便利。カスタマイズするパターンをテーブルビューにあらかじめ並べてくれています。

![IMG_1776.PNG](https://qiita-image-store.s3.amazonaws.com/0/16400/8606c076-aeb9-2bdf-47dd-655646c25322.png "IMG_1776.PNG")

ここまでやってくれると、実装中に要件が変わった時なんかにサクッと変更も出来そうで良いですね。

これもcocoapodsでインストールできます。

```
$pod try EAIntroView
```
Amazon SES + Resque + ResqueMailerでメールを非同期配信


Ruby 2.1.1 Rails 4.1.0rc1にて動作確認。
Rails内からSES経由でのメール送信をキューを利用した非同期配信したかったので、設定してみました。

## 初期設定
ResqueでRedisを使用するため、事前にインストールしておきます。

- Gemfile

```gemfile
gem 'aws-ses', '~> 0.5.0', :require => 'aws/ses'
gem 'resque', :require => 'resque/server'
gem 'resque_mailer'
gem 'daemon-spawn', :require => 'daemon_spawn'
```

## SESの設定

事前にAmazon SESのメール認可設定やアクセスキーの取得が必要になります。
こちらなどが参考になります。
[RailsのActionMailerからAmazon SESのSMTPでメールを送信する](http://blog.digital-squad.net/article/389286395.html)

まずはRailsのAction MailerからSES経由でメール送信できるようにします。

```/app/config/initializers/aws_ses.rb
require 'aws/ses'
ActionMailer::Base.add_delivery_method :ses, AWS::SES::Base,
  :access_key_id     => 'アクセスキーID',
  :secret_access_key => 'シークレットアクセスキー'
```

```/app/config/environments/production.rb
# 〜〜〜省略

  config.action_mailer.default_url_options = { :host => 'hogehoge.com' } #SES上でverify登録した送信用メールアドレスのドメイン

  config.action_mailer.raise_delivery_errors = true

  config.action_mailer.delivery_method = :ses

```

## メーラーの作成
SampleMailerクラスを生成します。

```
$ rails g mailer SampleMailer send_mail
```

```ruby
class SampleMailer < ActionMailer::Base
  default from: "sample@hogehoge.com" # SESのコンソール上で認可済のアドレス

  def send_mail
    @greeting = "Hi"
    mail to: "user@sample.com", subject: "ActionMailer test"
  end
end
```

メールテンプレートの修正が必要な場合は、send_mailアクションに対応したhtmlとtxtテンプレートが生成されているので、そちらを修正します。

## Resqueの設定

```/app/config/initializers/resque.rb
Resque.redis = 'localhost:6379'
Resque.redis.namespace = "resque:ignition:#{Rails.env}"

```

```/app/config/routes.rb
  # resqueの管理画面を使用する場合のみ追記 Productionでは弾くこと
  mount Resque::Server, :at => "/resque"

```

Resque用のrake taskを作成します。

```/app/lib/tasks/resque.task
require 'resque/tasks'
task "resque:setup" => :environment

```


## 動作確認

- worker立ち上げ

```
QUEUE=mailer rake resque:work
```

- コンソール上で実行

```ruby
SampleMailer.send_mail.deliver
```

## workerをバックグラウンドで動かす
/app/bin配下に任意の名前で実行ファイルを作って、chmod +xします。
ここではresque_mailerという名前で作成します。

```/app/bin/resque_mailer
#!/usr/bin/env ruby
require File.expand_path('../../config/application', __FILE__)
Rails.application.require_environment!

class ResqueWorkerDaemon < DaemonSpawn::Base
  def start(args)
    @worker         = Resque::Worker.new('mailer')
    @worker.verbose = true
    @worker.work
  end

  def stop
  end
end

ResqueWorkerDaemon.spawn!({
                              :processes   => 1,
                              :working_dir => Rails.root,
                              :pid_file    => File.join(Rails.root, 'tmp', 'pids', 'resque_worker.pid'),
                              :log_file    => File.join(Rails.root, 'log', 'resque_worker.log'),
                              :sync_log    => true,
                              :singleton   => true,
                              :signal      => 'QUIT'
                          })

```

設定後、以下のコマンドでバックグラウンドで起動できるようになります。

```
$ RAILS_ENV=production ./bin/resque_mailer start
```
DelayedJobの殺し方

注：最新のDelayedJobはうまくいってるらしいです。

## 経緯

Railsのバックグランドタスクのために、delayed_jobを利用することにした。
アプリケーションの更新などを行う場合、実行中のjobを停止する必要がある。
ところが、古いdelayed_jobはSIGTERMを受けても実行中のjobを停止させない。
より正確に言えば、delayed_jobはSIGTERMを受け取ると、現在のjobが終わるまで走り続け、その後死ぬ。
ので、`kill` サクッと殺すために以下の修正を行った。

## 殺すところから始めよう

job自体を殺すのは簡単で、SIGTERMをtrapしてExceptionを投げれば良い。

```rb
Signal.trap(:SIGTERM){ raise SignalException.new('SIGTERM') }
```

しかしこれだとdelayed_jobがtrapしているものを上書きしてしまうため、
実行中のjobは例外によって停止するが、その後workerは次のjobを実行してしまう。

## 最終的に

最終的に以下のコードに落ち着いた。

```rb
module TrapSignal
  def before
    @term_action = trap(:SIGTERM) {
      @term_action.call                   # delayed_jobのループを止める
      raise SignalException.new(:SIGTERM) # 実行中のjobを止める
    }
  end

  def after
    trap(:SIGTERM, @term_action) # trapを元に戻す
  end
end
```

```rb
class MyJob < ActiveRecord::Base
  include TrapSignal

  def perform
    # 実行したい処理
  end
end
```
FIRフィルタの実装4 Double Size Circular Buffer

```cpp

//コア部分

// N : number of coefficients
// h(n) : filter coefficients, n = 0,…N-1
// x(n) : stored input data, n = 0,…2N-1
// input sample : variable that contains the newest input sample
// index1 : the first place in x[n] where the new sample is to be stored
// index2 : the second place in x[n] where the new sample is to be stored

// variable are initialized to the following values
int index1 = 0;
int index2 = N;

// As a new sample is received put it in two places
x[index1] = input_sample;
x[index2] = input_sample;

ynew = 0;
for (i=0;i<N;i++){
	ynew = ynew + h[i]*x[index2-i];
{
index1 = (index1+1)%N;
index2 = index1 + N;



// 関数実装
double fir_filter (double input, double fir_coeff[], double fir_buffer[], unsigned *index, unsigned length){

	double output;
	unsigned idx;

	fir_buffer[*index]        = input;
	fir_buffer[*index+length] = input;

	*index=*index+1;
	if(*index==length) *index=0;

	output = 0;
	for (idx=0;idx<length;idx++){
		output = output + fir_coeff[idx]*fir_buffer[*index+idx];
	}

	return output;
}
	



---------------------------
# define FIR_LEN 1000
double x,y;
double fir_buffer[2*FIR_LEN];
double fir_coeff[FIR_LEN];
unsigned fir_ix;
unsigned temp;

double fir_filter(double, double[], double[], unsigned*, unsigned);

void main (void){
	// initialize FIR Filter
	for (temp=0;temp<FIR_LEN;temp++){
		fir_coeff[temp]=0.0;
		fir_buffer[temp]=0.0;
		fir_buffer[temp+FIR_LEN]=0.0;
	}
	// impulse response of echo
	fir_coeff[490]=1;
	fir_coeff[440]=0.6;
	fir_coeff[200]=0.3;
	fir_coeff[130]=0.6;
	fir_coeff[0]=0.4;
	fir_ix=0;

	//main part
	y = fir_filter(x,fir_coeff,fir_buffer,&fir_ix,FIR_LEN);
}
	
	


```
VimにActionScriptシンタックス追加

##やりたい事

vimでActionScriptのソースファイルをシンタックスハイライトさせたい。

##環境

Windows７
GVIM 7.3 kaoriya

##手順

###1.シンタックス設定用ファイル(actionscript.vim)をDLする

http://www.vim.org/scripts/script.php?script_id=1585

###2.ファイルをvimのsyntaxディレクトリに配置

VIM_DIR\vim73\syntax\actionscript.vim

###3._vimrcに設定を追加

```vim:_vimrc
au BufNewFile,BufRead *.as set filetype=actionscript
```
FIRフィルタの実装3 Circular Buffer

```cpp
// N : number of coefficients
// h(n) : filter coefficients, n = 0,…N-1
// x(n) : stored input data, n = 0,…2N-1
// input sample : variable that contains the newest input sample
// index : variable that contains the current place where the new sample is to be stored

x[index] = input_sample
// Filter the data
ynew = 0;
for (i=0;i<N;i++){
	if((index-i)<0){
		ynew = ynew + h[i]*x[index-i+N];
	} else {
		ynew = ynew + h[i]*x[index-i];
	}
}
index = (index+1)%N;


```
パレットを作ってみる

## はじめに

パレットを作ってみました。パレット自体は目新しいアイデアではないかもしれませんが、ベースボールにおける素振りみたいなことは続けたほうが良いと思い、少し手を動かしてみました。

ここでパレットと呼んでいるものは、テーブル要素のstyle属性でbackgroundに値を指定して、色を並べたものです。簡単に言ってしまえば色を並べたものです。

## どんなものが出来上がるか？

次のような表示になります。
![Rgb_sample.png](https://qiita-image-store.s3.amazonaws.com/0/29884/3b20a4e2-349b-a911-b6eb-235fd372c88a.png)


## それをどうやって作るか？

フレームワークにRailsを使います。まず、新規にアプリケーションを作成します。適当なディレクトリで次のようなコマンドを実行します。

> $ rbenv exec rails new palette

_palette_ディレクトリが作られるので、そのディレクトリに移動します。次に、コントローラとビューを用意するために、次のようなコマンドを実行します。

> $ cd palette
> $ rbenv exec rails generate controller Rgb sample

細かい説明は省略しますが、ここまでの手順はシンプルです。（ひとによっては、Gemfileを用意して、bundlerでRailsをbundleするかもしれません）

最後に、ビューを実装するために、次のようなコマンドを実行します。

> $ vim ./app/views/rgb/sample.html.erb

実装は次のようになります。詳しくは説明しませんが、Kernel#formatがポイントだと思います。

``` sample.html.erb
<h1>Rgb#sample</h1>
<p>Find me in app/views/rgb/sample.html.erb</p>

<% count = 0; rows = [0xF00, 0xE00, 0xD00, 0xC00, 0xB00, 0xA00, 0x900, 0x800, 0x700, 0x600, 0x500, 0x400, 0x300, 0x200, 0x100, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF]; columns = [0x0, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0] %>
<table>
  <% rows.each do |row| %>
  <% columns.each do |column| %>
  <% if count == 0 || count % 16 == 0 then %>
  <tr>
  <% end %>
  <td style="background:#<%= format("%03X", row + column) =%>; width:20px; height:10px"></td>
  <% count += 1 %>
  <% if count != 1 && count % 16 == 0 then %>
  </tr>
  <% end %>
  <% end %>
  <% end %>
</table>
```

Kernel#formatの使い方については次のコマンドで確認できます。

> $ ri format

## まとめ

特に目新しいことはなにもないのですが、手を動かしてなにかを作ってみると、作ってみたいものが見つかるかもしれません。

例えば、テーブル要素の隙間をなくして、隣り合うテーブル要素に同じ色を指定すれば、いろいろな形を表現できると思います。その形を変えるスクリプトを用意してみても面白いかもしれません。
FIRフィルタの実装2 Double Size FIFO Buffer

```cpp
// N : number of coefficients
// h(n) : filter coefficients, n = 0,…N-1
// x(n) : stored input data, n = 0,…2N-1
// input sample : variable that contains the newest input sample
// index : variable that contains the current place where the new sample is to be stored

x[index] = input_sample;
// Filter the data
ynew = 0;
for (i=0;i<N;i++){
	ynew = ynew + h(i)*x(index-i);
}
index = index + 1;

if (index>=2*N){
	for (i=N-2;i>=0;i--){
	x[i+N+1] = x[i];
}
index = N-1;
}

```
FIRフィルタの実装1 FIFO(first-in-first-out) Buffer

```cpp
// N : number of coefficients
// h(n) : filter coefficients, n = 0,…N-1
// x(n) : stored input data, n = 0,…N-1
// input sample : variable that contains the newest input sample

// Shift in the new sample. Note the data is shifted starting at the end

for (i=N-1;i>=0;i--){
	x[i+1] = x[i];
}
x[0] = input_sample
// Filter the data
ynew = 0;
for (i=1;i<N;i++){
	ynew = ynew + h(i)*x(i)
}

```
3月14日は円周率の日！ということで円周率を求めるプログラムを書こう！


# 3月14日

3月14日は何の日ですか？
え、ホワイトデー？
誰だいそんなこと言っているやつは？
そんなリア充イベントにうつつ抜かしてるんじゃねー！
俺にはホワイトデーなんてかんけーねーんだよ！

3月14日は
3.14ということで円周率の日なんですよ！

ということで、円周率を求めるプログラムを書いてみます。

# ライプニッツの公式
円周率をもとめるのには、ライプニッツの公式というのがあります。
詳しい説明はwkipedia見てね!
http://ja.wikipedia.org/wiki/ライプニッツの公式

ということで、以下に書いてみます。

```pi.c
#include <stdio.h>
#include <math.h>

double leibniz(int n){
  int i=0;
  double ret = 0.0;
  for (i = 0; i < n;i++) {
    ret += pow(-1, i) / (2 * i + 1);
  }
  return 4 * ret;
}

int main(void){
  printf("%1.9f\n", leibniz(10));
  printf("%1.9f\n", leibniz(100));
  printf("%1.9f\n", leibniz(1000));
  printf("%1.9f\n", leibniz(10000));
  printf("%1.9f\n", leibniz(100000));
  printf("%1.9f\n", leibniz(1000000));
  printf("%1.9f\n", leibniz(10000000));
  printf("%1.9f\n", leibniz(100000000));
  printf("%1.9f\n", leibniz(1000000000));
  return 0;
}
```

gccでコンパイルするときは、-lmオプション忘れないでね!
結果は以下のようになります。

```shell-session
$ ./a.out
3.041839619
3.131592904
3.140592654
3.141492654
3.141582654
3.141591654
3.141592554
3.141592644
3.141592653
```

# モンテカルロ法

モンテカルロ法というのはシミュレーションを乱数を用いて行う手法で、これを使って円周率を求められるようです。

長さ1の正方形の中をランダムな値でn個プロットしていき、それが正方形の一点を中心として半径1の扇形に入る点をr個としたときに、

```
n : r = 1 : π/4
```

というカタチが成り立つのを利用します。

```pi2.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* n : r = 1 : pi/4 */
double montecarlo(int n) {
  int i, r;
  double x, y;
  for (i = 0, r = 0; i < n; i++) {
    x = (double)rand()/(RAND_MAX+1.0);
    y = (double)rand()/(RAND_MAX+1.0);
    if ((x*x + y*y) < 1.0)
      r++;
  }
  return 4.0* r / n;
}

int main(void){
  printf("%1.9f\n", montecarlo(10));
  printf("%1.9f\n", montecarlo(100));
  printf("%1.9f\n", montecarlo(1000));
  printf("%1.9f\n", montecarlo(10000));
  printf("%1.9f\n", montecarlo(100000));
  printf("%1.9f\n", montecarlo(1000000));
  printf("%1.9f\n", montecarlo(10000000));
  printf("%1.9f\n", montecarlo(100000000));
  printf("%1.9f\n", montecarlo(1000000000));
  return 0;
}
```

とすると、

```shell-session
$ ./a.out
3.600000000
2.720000000
3.216000000
3.145600000
3.140280000
3.141728000
3.141824800
3.141367920
3.141588128
```

になりました。

# ガウス＝ルジャンドルのアルゴリズム
上記の２つ書いたら、
「そんな収束の遅いアルゴリズムなんて使ってんじゃねー！」的に指摘されてしまったので、
ガウス＝ルジャンドルのアルゴリズムを使って計算してみます。
私、このアルゴリズム詳しくないので、Wikipediaのをそのままコード化してしまいました><
http://ja.wikipedia.org/wiki/ガウス＝ルジャンドルのアルゴリズム


```pi3.c
#include <stdio.h>
#include <math.h>

double GaussLegendre(int n) {
  int i;
  double a = 1.0, b = 1.0 / sqrt(2.0), t = 1.0 / 4, p = 1.0, tmp = 0;
  double ret;
  for (i = 0; i < n; i++) {
    tmp = a;
    a = (tmp + b) / 2;
    b = sqrt(tmp * b);
    t = t - (p * (a - tmp) * (a - tmp));
    p = 2 * p;
  }
  return (a + b) * (a + b) / (4 * t);
}

int main(void){
  printf("%1.20f\n", GaussLegendre(1));
  printf("%1.20f\n", GaussLegendre(2));
  printf("%1.20f\n", GaussLegendre(3));
  printf("%1.20f\n", GaussLegendre(4));
  printf("%1.20f\n", GaussLegendre(5));
  return 0;
}
```

結果は以下です。
確かに収束速い…。

```shell-session
$ ./a.out
3.14057925052216857509
3.14159264621354283875
3.14159265358979400418
3.14159265358979400418
3.14159265358979400418

```


# その他

たぶんその他にも円周率を求める方法あると思うので、教えてくれたらうれしいです。
またなにか不備がありましたらコメントください。
GitHub を使いやすくする Chrome Extension 5 選

## Pretty Pull Requests (Github)

[Chromeウェブストア - Pretty Pull Requests (Github)](https://chrome.google.com/webstore/detail/pretty-pull-requests-gith/ljnjpkadhhcdniohpfilddnhahoigdec)

Pull Request を読むときに便利なエクステンション。

ファイルをアコーディオンで開閉したり、追加された行または削除された行のみを表示することができる。
長い PR を読むときに特に便利。

## GitHub Wiki Search

[Chromeウェブストア - GitHub Wiki Search](https://chrome.google.com/webstore/detail/github-wiki-search/gdifdhnjmjaidbajhapmbcbnoocoeooc)

GitHub Wiki を検索するためのエクステンション。シンプルで使いやすい。
検索語をハイライトしてくれたり、検索中はプログレスバーがでたりと気が効いている。
これを使わずに検索しようとすると GitHub Wiki の git リポジトリをクローンして、 git grep するはめになる。

## GitHub.Expandinizr

[Chromeウェブストア - GitHub.Expandinizr](https://chrome.google.com/webstore/detail/githubexpandinizr/cbehdjjcilgnejbpnjhobkiiggkedfib)

GitHub の横幅を広くしてくれるエクステンション。
大きいディスプレイを使っていると GitHub の横幅の狭さがイライラしてくるので、このエクステンションは地味に便利。
表示が崩れるときはブラウザのズーム比率を少し変えて調節するといい。

## Emoty

[Chromeウェブストア - Emoty](https://chrome.google.com/webstore/detail/emoty/kgljgnbhcigffgoifhjbbifhbdkapmgm)

絵文字選択を助けるエクステンション。
GitHub の絵文字の補完は便利だけど、一覧で絵文字を探したいときにこのエクステンションが便利。

[LGTM](https://chrome.google.com/webstore/detail/lgtm/ihckpnhmmfhihijdjnnjfjogoajgdklf)

似たようなのりで LGTM の画像をランダムに拾ってくるエクステンションもレビューのときに使ってみると面白い。

## Night Reading Mode

[Chromeウェブストア - Night Reading Mode](https://chrome.google.com/webstore/detail/night-reading-mode/chcciiimjmlgcoabgfdhkfjdcgfpgndi)

ブラウザを色反転するエクステンション。
コードを読むとき白背景は目に悪いのでこのエクステンションで色反転して黒背景にしよう。
ドメイン毎に反転するかどうか選べるので使い勝手が良い。

背景色や文字色だけを暗くするエクステンションもあるが、僕の感覚としてはページまるごと色反転した方が読みやすい。
Kobito 複数PCでの共有


最近Kobito使いだしましたが、いくつかの環境で、データ共有したかったので調べてみました。
ググったら `Kobito.db` を共有すればいいことがわかったけど、いざやってみたら`Kobito.db-wal`も必要だったというお話。

データの格納場所：`~/Library/Kobito/`

- Kobito.db
- Kobito.db-shm
- Kobito.db-wal
- Kobito.db.1.8.10.bak

他の記事見てみると、`Kobito.db`をDropboxディレクトリに置いて共有しているけど、実際には、他のファイルも必要みたい。bakはまぁいらないと思うので除外しました。

***

## Dropboxで共有
Kobitoアプリを終了した際にKobito.dbに反映される仕組みのようなので、他のPCに反映させたい場合は、一度アプリを閉じる必要がある。なので作業する際もアプリを閉じた状態で行いましょう。

1.Kobitoアプリを閉じる(cmd + Q)

2.Dropboxディレクトリにコピー

```
$ mkdir -p ~/Dropbox/kobito
$ cp ~/Library/Kobito/Kobito.db* ~/Dropbox/kobito
```

3.シンボリックリンク作成

```
$ rm ~/Library/Kobito/Kobito.db*
$ ln -s ~/Dropbox/kobito/Kobito.db ~/Library/Kobito/
$ ln -s ~/Dropbox/kobito/Kobito.db-shm ~/Library/Kobito/
$ ln -s ~/Dropbox/kobito/Kobito.db-wal ~/Library/Kobito/
```
## Gitで共有
会社のPCでも共有したいけど、Dropbox入れられないので gitで共有することにした。

共有すべきファイルは3つだと思ってたんだけど、何も変更しなくても`Kobito.db-shm`は変更されてしまうみたいで、やってみたら、このファイルはなくても大丈夫だったので、一旦除外してあります。ここらへんよくわからないままやってますので注意。

```
$ cd ~/Dropbox/kobito
$ git init 
$ cat << EOF > .gitignore
Kobito.db-shm
EOF
$ git add .
$ git commit -m "initial commit"
```

とりあえずGithubでリポジトリ作って共有。今のところ公開されてていいものしかないけど、プライベートリポジトリ作れるところのほうがいいでしょう。

```
$ git remote add origin git@github.com:akokubu/kobito.git
```

共有したいPCで作業

```
$ rm -rf ~/Library/Kobito/
$ git clone git@github.com:akokubu/kobito.git Kobito
```
Interface Builder(Xcode)のカラーピッカーで16進カラーコードを指定できるようにする


![スクリーンショット 2014-03-14 12.00.11.png](https://qiita-image-store.s3.amazonaws.com/0/21397/9a185d8b-7930-01dc-b20c-ba1d953f598b.png "スクリーンショット 2014-03-14 12.00.11.png")

こんな感じに使えます。

アプリで使うカラーパレットを16進カラーコードで管理してる方も多いと思います。
その時、WebみたいにInterface Builderのカラーピッカーで直接16進カラーコードが指定できたらいいなーと思って探したところ、いい感じのプラグインがあったので紹介します。

## Hex Color Picker を導入する
まずは、[こちら](http://wafflesoftware.net/hexpicker/)からプラグインファイルをダウンロードしてください。
[Hex Color Picker](http://wafflesoftware.net/hexpicker/)

![スクリーンショット 2014-03-14 12.10.25.png](https://qiita-image-store.s3.amazonaws.com/0/21397/8f268ab8-2051-de30-07f3-10ebd5c72806.png "スクリーンショット 2014-03-14 12.10.25.png")

![91195_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/21397/2cdc7a50-1086-3814-5a97-f2e21a87a7c6.jpeg "91195_4.jpg")


1. Finderで移動／フォルダへ移動を選択します。
2. 「フォルダの場所を入力」テキストボックスに ~/Library と入力し、「移動」をクリック


![スクリーンショット 2014-03-14 11.56.56.png](https://qiita-image-store.s3.amazonaws.com/0/21397/6b5975d9-5e53-5dc4-1eab-ac5962c1bb70.png "スクリーンショット 2014-03-14 11.56.56.png")

開いたライブラリフォルダの中に **ColorPickers** というフォルダががあるので、その中にダウンロードしたプラグインファイルを入れてください。
これで終わりです！
次から起動したときにInterface Builderのカラーピッカーから16進カラーコードを指定できるようになります。
Gitをインストールしたらやること

# Git settings
************************************************************

## メールアドレスとユーザ名設定
`$ git config --global user.name <userName>`  
`$ git config --global user.email <mailAddress>`  

## カラフル設定
`$ git config --global color.ui auto`  

## コミットメッセージのテンプレートを設定
`$ git config --global commit.template $HOME/.gitmessage.txt`  

## エイリアス設定
`$ git config --global alias.co checkout`  
とかでも出来るけど、めんどいので  
.gitconfigを直接編集してwq

## コミットログ編集用エディタをviに変更
`$ git config --global core.editor 'vi -c "set fenc=utf-8"'`  

## 以上を適用した .gitconfig は以下
``` .gitconfig
    [user]
        email = <mailAddress>
        name = <userName>

    [color]
        ui = auto

    [commit]
        template = /home/<userName>/.gitmessage.txt

    [alias]
        lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
        lga = log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
        co = checkout
        br = branch
        ci = commit
        st = status

    [core]
        editor = vi -c \"set fenc=utf-8\"
```

## プロンプトに現在のブランチ名を表示させる
* .bashrcに以下を追加  
`$ vi $HOME/.bashrc`

```.bashrc
    # git show branch name
    PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
```

* 反映  
`$ source $HOME/.bashrc`

## 参考
* [7.1 Customizing Git - Git Configuration](http://git-scm.com/book/en/Customizing-Git-Git-Configuration)
* [美しき git log --graph のエイリアス](http://blog.toshimaru.net/git-log-graph/)
* [git コミットログ編集用エディタをvimにする](http://hikm.hatenablog.com/entry/20110323/1300887533)
* [Gitを使い始めたらやっておきたい便利な設定いろいろ](http://blog.asial.co.jp/845)
Google Places APIの文字列検索

## 周辺検索を使う方法
#### 概要
* テキスト検索と違って、リクエストは1回分で済む
* 並べ替えができる

### nameパラメータを指定する
* エイリアスを含めたプレイス名を検索
* 半角・全角を厳密に識別するため、実用性は微妙

### keywordパラメータを指定する
* 名前、タイプ、住所とユーザのクチコミや第三者のコンテンツも対象となる
* 半角・全角も同一視してくれるため、使うならこっち

### 実験
* 緯度経度、radiusの最大値50,000mの範囲外だと、検索結果は0件になる
* `rankby=distance`とすると、radiusが強制的に50kmとなる。条件的には上記と同様であるが、50kmの範囲内で該当するものを返す。ただし、この結果は無理矢理返しているような内容になる（例えば、大阪市内で「青森」と検索すると、[近畿青森県人会, 青森放送 大阪支社]などが結果として返される）
* あくまで緯度経度ありきでの検索になる模様

## テキスト検索を使う方法
#### 概要
* 緯度経度情報は不要
* 「東京 ラーメン」という具合にフリーワード検索ができる
* この文字列に一致した候補を、関連性の高い順で返す
* リクエストの消費回数は10回分となるので、使い過ぎには注意
* 並び替えはできない

### location, radiusパラメータを指定したとき
* 範囲内の結果は、範囲外のものよりも優先して返す
* 知名度が高い場合、範囲外であっても結果に含まれる可能性がある
 
### 実験
* 緯度経度を指定し、指定範囲から大きく外れた場所（例えば、大阪の緯度経度で「北海道 ゴルフクラブ」など）を検索文字列として渡した場合、恐らく、該当がないなどの理由で緯度経度・範囲指定を無視し、通常のテキスト検索が行われる模様
* 期待される検索キーワードが「大阪 ラーメン」や「ラーメン」といった地名+αになっているせいか、地名のみの検索には極端に弱い模様（この仕様はGoogle Mapsと同じ）
Pythonで動的にメソッドを呼ぶ

基本かもしれないですけど。

なんで今更？ってtornado使ってWebSocketでやりとりしていた時

Javascriptでコールバックメソッド名送る
→ tornadoで指定されたメソッドを実行して、Javascriptにコールバック関数名送る
→ Javascriptで指定されたコールバック関数を実行する

ってやりたくて文字列からメソッドを呼び出しをしたかったのです。

まずはJavascript、WebSocket接続してtornado側の呼び出しメソッド名とその他のパラメータを送ります。
パラメータはJSONで送ってます。

```js:
var ws = new WebSocket('ws://server/ws');
var p = {};
// callbackメソッド名
p['callback'] = 'wake_up';
// その他のパラメータ
p['msg'] = 'Wake Up!!!!';
ws.send(JSON.stringify(p));
ws.onmessage = function(e) {
    var data = JSON.parse(e.data);
    console.log(data['message']);
};
```

tornado側、on_messageのgetattrが今回の表題のメイン部分です。

```py3:app.py
from tornado import ioloop,web,websocket
import json
# callbackクラス
from callback import Callback

class WSHandler(websocket.WebSocketHandler):
    # メッセージが来た時
    def on_message(self, message):
        data = json.loads(message)
        # Callbackクラスのインスタンス作成
        cb = Callback(data)
        # メソッド呼び出し
        result = getattr(cb, data['callback'])()
        
        # Javascriptに返す値
        return_value = {}
        return_value['message'] = result

        # WebSocketでメッセージ送信
        self.write_message(json.dumps(return_value))

handlers = [
    (r'/ws', WSHandler),
]

settings = dict(
    debug = False,
)

app = web.Application(handlers, **settings)
app.listen(sys.argv[1])
ioloop.IOLoop.instance().start()
```

呼び出されるメソッドです。

```py3:callback.py
class Callback(data):
    def __init__(self, data):
        self.data = data

    def wake_up(self):
        return self.data['msg']
```

これでブラウザのコンソールに'Wake Up!!!!’と表示されるはずです。


getattrの使い方は以下の通りです。詳細は公式ドキュメントに委ねます。

```py3:
cb = Callback(data)
result = cb.wake_up()

# 上記は下記コードと同じです
result2 = getattr(cb, 'wake_up')()

# 因みに以下のようにやると返り値が返らずオブジェクトが代入されます
result3 = getattr(cb, 'wake_up')
```


最初上のresult3のようにやってしまい？？？ってなりましたが、考えてみればですよね〜ってなりました。。。

2013-03-15追記
微妙に間違いを修正しました。
失礼しました。
Bashメモ


## ファイルを1行ずつ読む

while の標準入力に渡してあげる。

例１）

```
while read line; do
  echo "LINE: $line"
done < {ファイル名}
```

例２）

```
cat {ファイル名} | while read line; do
  echo "LINE: $line"
done
```


## 標準出力と標準エラー出力をファイルに追記

```
exec >> ./log.txt  2>&1
```


## ファイルがシンボリックリンクか判断する

```
if [ -L hoge.txt ]; then
  echo "hoge.txt is symbolic link"
fi
```

なお、ディレクトリでも同様に判定できるけど、最後に / つけると常にfalseになるみたい。

```
if [ -L /var/www ]; then
  echo "/var/www is symbolic link"
fi
# => OK

if [ -L /var/www/ ]; then
  echo "/var/www/ is symbolic link"
fi
# => NG
```

参考: man test


## 列を縦にする

```
$ cat hoge.csv | head -n 1 | perl -pe 's/,/\n/g'
```

## 1行目を取り除く（ヘッダ行など）

```
$ tail hoge.csv -n +2 > hoge-2.csv
```
ubuntu visudoをvimに設定

```
root@hoge:~# update-alternatives --config editor
There are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
  3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    10        manual mode

Press enter to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in manual mode.
```
忘れがちなgitコマンドメモ

## コマンド

```
# 削除されたリモートブランチのローカルに残った参照を削除する
$ git remote prune origin

# mergeを取り消す
$ git reset --hard ORIG_HEAD

# コミットの取り消し
$ git reset --soft HEAD^    # ステージ済み状態に戻す（作業ディレクトリの変更は保たれる）
$ git reset HEAD^           # ステージ前状態に（作業ディレクトリの変更は保たれる）
$ git reset --hard HEAD^    # 作業ディレクトリの変更も取り消し  
$ git revert HEAD           # 直前のコミット取り消し（取り消したログを作成）

# 操作の取り消し
$ git reflog    # まずHEADの履歴を見る
$ git reset --hard HEAD@{3}     # 指定の場所（今回はHEAD@{3}）まで巻き戻す
```

## リンク
### Gitでブランチを作るのを忘れてmasterにコミットしてしまったときの対処法
<http://qiita.com/atskimura/items/a90dfa8bfc72e3657ef9>
MojoliciousでMiddleman的な静的ファイル生成アプリを作る


[MojoliciousでMiddleman的（静的HTML書き出し）なことをする](http://qiita.com/mozquito/items/4f204d74249b17b53f6e)のあとPHPで簡単なTwitterライクなデモサイトを作らされていたら思考が停止してしまっていました。
実践でいくつか使いつつブラッシュアップしていった結果少し洗練されたものになってきたので今更になって書いておきます。

PHPって6,7年ぶり位に触った気がしますがこれくらいかったるいのなら、いっそJavaとかJava上のなにかとかのほうが覚悟がきまってていいんじゃないのかな？と思いました。ほんとになんでみんなPHP使ってるの？。

ということで[MojoliciousでMiddleman的（静的HTML書き出し）なことをする](http://qiita.com/mozquito/items/4f204d74249b17b53f6e)をプラグイン化してGithubにあげてみました。CPANはまだよくわからない未開の地でした。

- [Mojolicious::Plugin::Korpokkur](https://github.com/mozquito/Mojolicious-Plugin-Korpokkur)




## インストール方法

```
cpanm git@github.com:mozquito/Mojolicious-Plugin-Korpokkur.git 
```

または

```
cpanm https://github.com/mozquito/Mojolicious-Plugin-Korpokkur/archive/0.02.tar.gz 
```

でインストール出来ると思います。
こういったものは初めてなので不味い書き方とか依存の問題とかあるかもしれないです。


##使い方

pluginをそのまま実行できるコマンドがついてるので通常はそれを使います。


基本的には下記のような手順で作業することになります。

1. `pokkur generate sites サイト名(フォルダ名)` サイト構築キット一式を生成する
2. `cd サイト名` サイトフォルダに移動
3. `kpokkur` テストサーバーhttp://localhost:3000で起動
4. genareteで生成されたkorpokkur.yamlとsitemap.yamlを設定する
5. 通常の静的フォルダはpublicフォルダにいれる（画像、js、cssやkorpokkurで管理しないHTMLなど）
5. sitemap.yamlとstashフォルダ、templatesフォルダを変更してページを作成していく
6. サイトが完成すれば`pokkur publish`でサイトを生成する。

url_forやurl_relなどのhelper関数をテンプレートで使うことで静的サイトでもwordpressのように動的なページ変えることができます。

### Command pokkurについて

pokkurというコマンドがインストールされますがこれは単にプラグインをロードしていくつかのコマンドを追加するようにカスタマイズしたMojolicious::Liteアプリケーションです

#### pokkur genarate site

```
pokkur gerarate sites <site_name>
```

サイトを生成するために必要なskeletonをセットアップします。

```
pokkur gerarate sites <site_name> <theme名>
```
ホームディレクトリに.korpokkurというディレクトリを作成してテーマを入れておくと使えるというものです

#### pokkur publish

```
pokkur publish
```

サイトを生成します。
カレントディレクトリにwwwというディレクトリ名でpublicフォルダ（生成するもの以外の静的ファイル）と生成したファイルを組み合わせたサイト一式を生成します。納品するときやdeployするときに使います。

### Command kpokkur

```
kpokkur
```
pokkurをアプリケーションサーバー（テストサーバー）として立ち上げます。Mojoliciousのmorboサーバーで立ち上がります。必要ファイルが監視されるように設定しているので再起動することなく変更が反映されます。通常 <http://localhost:3000/>でサイトを見ることが出来ます。morboと同じ形でport番号とかも変えられます。

### 設定ファイル korpokkur.yaml
サイト全体の設定を行うファイルです。
プラグインの設定やサイト共通のデータなど(jsやcssの設定やグローバルリンク）を書きます

### 設定ファイル2 sitemap.yaml

ページを生成するメタデータです。
一意のID(URLのリファレンスとしても使える)、description,keywords、template、url。
sitemap.yamlで設定したページが管理、出力されます。（別途publicフォルダを用いてその他のHTMLが共存可能です）

``` sitemap.yaml
p1: #id
    description: meta description
    keywords: meta keywords
    template: template名 
    path: index.html #url
```



### 設定ファイル3 stash/<リファレンス名>.yaml

ページごとにsitemap.yamlで設定したIDごとにstashを設定出来ます。
データはhash形式で受け取ります。hashの中身は自由です。テンプレートには$hash_keyで呼び出せます。

```yaml:stash/id名.yaml
section: |-
    # markdown
    markdownや様々なデータを記述していく
    再利用可能なデータにしておくのがベスト
```



## Korpokkurを使う上での考え方

- HTML5は再利用性が高いので再利用可能なように構築する。
- Text::Xslateを使う（他でも流用しやすいので）
- 再利用可能なパーツはmacro化しておく
- Markdownを上手く使う
- urlはいつでも変更できるので最初は仮URLでもよい。
- 文章や再利用できそうなデータはstashに書く
- ページと対になるテンプレートをページごとに作成し直接書いていってもいい
- 応用したいことがあったらMojoliciousとText::Xslateの機能を使って拡張する
rails newしたらconfig.generatorsをまず設定しよう


## rails gで不要なファイルが生成される・・・

Railsで開発する際に、rails gコマンドは欠かせないと思います。
しかし、特にscaffoldやcontrollerの生成時には不要なファイルが生成される場合があります。
例えば、apiを提供するアプリケーションにjsやcssのファイルは必要ありません。

## config.generators

application.rbのconfig.generatorsでrails gで生成されるファイルを設定できます！

例えば、

* apiだからjsとかcssとかいらないな
* view_helperもいらないな
* viewのテンプレートエンジンもひとまずなしで
* viewとview_helperのテストはなくていい
* fixtureはfactory_girlがいいな。

であれば、こんな感じで設定します

```ruby:application.rb
config.generators do |g|
  g.stylesheets false
  g.javascripts false
  g.helper false
  g.template_engine false 
  g.test_framework :rspec, view_specs: false, helper_specs: false, fixture: true
  g.fixture_replacement :factory_girl, dir: "spec/support/factories"
end
```

実行結果はこんな感じ。

```
> rails g controller hoge/users index
create  app/controllers/hoge/users_controller.rb
 route  get "users/index"
invoke  rspec
create    spec/controllers/hoge/users_controller_spec.rb
invoke  assets
invoke    js
invoke    css
```

もちろん、テンプレートエンジンにerbを使いたければ

```ruby:application.rb
  g.template_engine :erb
```

と書けば生成されます。

この設定を使っているプロジェクトはテンプレートエンジンとしてrablを使用しているのですが、rablはどうも認識されないもよう・・・

config.generatorsを設定してスマートなシステムを作りましょう！

## さらに詳しい説明

[ruby/rails/RailsGuidesをゆっくり和訳してみたよ/Creating and Customizing Rails Generators](http://wiki.usagee.co.jp/ruby/rails/RailsGuides%E3%82%92%E3%82%86%E3%81%A3%E3%81%8F%E3%82%8A%E5%92%8C%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%82%88/Creating%20and%20Customizing%20Rails%20Generators)
会社を上場させたいのですが、プログラミングは自分で学ぶべき？

会社を上場させたいのですが、プログラミングは自分で学ぶべき？

１、米国のビリオネア起業家はほぼ全員PGができるので、
今、コードの勉強を一から自分でしているが、
それよりお金を使ってコーダーを雇うべきか？
日本だと孫正義、三木谷、藤田などコーディングできない経営者でも上場したりしてる。
さっさとプログラマを雇って起業したほうがいいのか？

２、コーダーを雇うなら一ヶ月どの程度かかるのか？

３、やるならどの言語を、

４、どのレベルまでやるべきか？
今phpとjavaをやっている。本当に基礎で、変数、forなどの概念は理解しているが自分で一からコードは書けないレベル。あと勉強中は利益がないので結構キツイ。

よろしくお願いします。
JSHintでJavaScriptの予約語をチェックする


チェックに使った.jshintrcはこちら
[.jshintrc日本語版 - Qiita](http://qiita.com/maccotsan/items/0fb82ccab014f49ff95d)

以下のリストは[O'Reilly Japan - JavaScript 第6版](http://www.oreilly.co.jp/books/9784873115733/)#2.4.1 予約語より抜粋。

"Not error"とコメントされていないのは全て（正しく）エラーになっている。

```example.js
	// 予約語
	var break = 1;
	var delete = 1;
	var function = 1;
	var return = 1;
	var typeof = 1;
	var case = 1;
	var do = 1;
	var if = 1;
	var switch = 1;
	var var =1;
	var catch = 1;
	var else = 1;
	var in = 1;
	var this = 1;
	var void = 1;
	var continue = 1;
	var false = 1;
	var instanceof = 1;
	var throw = 1;
	var throw = 1;
	var while = 1;
	var debugger = 1; // Debug: trueなのにError
	var finally = 1;
	var new = 1;
	var true = 1;
	var with = 1;
	var default = 1;
	var for = 1;
	var null = 1;
	var try = 1;

　	// 将来に向けての予約語
	var class = 1;
	var const = 1;
	var enum = 1;
	var export = 1;
	var extends = 1;
	var import = 1;
	var super = 1;

	// strictモードでは予約語
	var implements = 1;
	var let = 1;
	var private = 1;
	var public = 1;
	var yield = 1;
	var interface = 1;
	var package = 1;
	var protected = 1;
	var static = 1;
	var arguments = 1;
	var eval = 1;

	// JAVAの予約語
	var abstract = 1;
	var double = 1;
	var goto = 1;
	var native = 1;
	var static = 1;
	var boolean = 1;
	var enum = 1;
	var implements = 1;
	var package = 1;
	var super = 1;
	var byte = 1;
	var export = 1;
	var import = 1;
	var private = 1;
	var synchronized = 1;
	var char = 1;
	var extends = 1;
	var int = 1;
	var protected = 1;
	var throws = 1;
	var class = 1;
	var final = 1;
	var interface = 1;
	var public = 1;
	var transient = 1;
	var const = 1;
	var float = 1;
	var long = 1;
	var short = 1;
	var volatile = 1;

	// グローバル変数/関数
	var arguments = 1;
	var encodeURI = 1; // Not error
	var Infinity = 1;
	var Number = 1; // Not error
	var RegExp = 1; // Not error
	var Array = 1; // Not erro
	var encodeURIComponent = 1; // Not error
	var isFinite = 1; // Not error
	var Object = 1; // Not error
	var String = 1; // Not error
	var Boolean = 1; // Not error
	var Error = 1; // Not error
	var isNan = 1; // Not error
	var parseFloat = 1; // Not error
	var SyntaxError = 1; // Not error
	var Date = 1; // Not Error
	var eval = 1;
	var JSON = 1; // Not Error
	var parseInt = 1; // Not Error
	var TypeError = 1; // Not Error
	var decodeURI = 1; // Not Error
	var EvalError = 1; // Not Error
	var Math = 1; // Not Error
	var RangeError = 1; // Not Error
	var undefined = 1;
	var decodeURIComponent = 1; // Not Error
	var Function = 1; // Not Error
	var NaN = 1; // Not Error
	var ReferenceError = 1; // Not Error
	var URIError = 1; // Not Error
```

# 結果

## グローバル変数/関数がほとんどチェックされない

以下のようなのが通ってしまうのはどうしたものか。。

```example.js
var encodeURI = 1;
encodeURI("a");
// NotError
```

## debuggerのエラー抑制がされない
.jshintrcのdebugオプションをtrueにしてもエラーに。