OmniAICreator/Qiita-1.07M huggingface dataset:
Sinatra/Padrinoで特殊なMime Typeを登録する

[`mime_type`](http://www.sinatrarb.com/intro#Mime%20Types) というクラスマクロがあります。

以上、よろしくお願いします。

## ＊　＊　＊

これだけではあれなのでコードサンプルでも

```ruby:app.rb
require 'sinatra'
require 'json'
require 'msgpack'

configure do
  mime_type :msgpack, "application/x-msgpack"
end

get '/hello.?:format?', :provides => [:json] do
  JSON.dump({hello: "world", data: [1, 2, 3, 99]})
end

get '/hello.?:format?', :provides => [:msgpack] do
  {hello: "world", data: [1, 2, 3, 99]}.to_msgpack
end
```

```sh
$ ruby app.rb &
$ curl -H "Accept: application/json" http://localhost:4567/hello.json
{"hello":"world","data":[1,2,3,99]}

$ curl -H "Accept: application/x-msgpack" http://localhost:4567/hello.msgpack
��hello�world�data�

$ curl -H "Accept: text/html" http://localhost:4567/hello.json
#=> Sinatra doesn't know this ditty!
```

## Padrino なら

`config/apps.rb` で

```ruby:config/apps.rb
Padrino.configure_apps do
  #...
  mime_type :msgpack, "application/x-msgpack"
end
```

こんなんが良さそう。
XPCOM使って現在開いているページの証明書情報を引っ張ってくる

もう死んだテクノロジーですのでみなさま興味ないかと思いますが、firefoxのXUL拡張でサーバ証明書情報を取ってくる方法は以下の通りになります。gBrowser.addEventListener("load", handler, true); 的なことをやっておいてhandlerの中で

```
      var Ci = Components.interfaces;
      var status = gBrowser.securityUI
            .QueryInterface(Ci.nsISSLStatusProvider)
            .SSLStatus;
      if (status) {
        var cert = status.serverCert;
        alert("Common Name: " + cert.commonName
              + "\n Organization: " + cert.organization
              + "\n Issuer = " + cert.issuerOrganization
              + "\n SHA1 fingerprint = " + cert.sha1Fingerprint);
      }
```

解説は省略します。

参考
https://developer.mozilla.org/en-US/docs/How_to_check_the_security_state_of_an_XMLHTTPRequest_over_SSL
可変長引数を引き回す

可変長引数を引き回したい場合，
つまり可変長引数を受け取るメソッド内で，受け取った引数を他のメソッド（こちらも可変長引数を受け付ける）にしたいとき，少し注意が必要なことをいつも忘れるのでメモ．

```ruby:
def foo(*args)
  p args
end

def bar(*args)
  foo(args)
end

def hoge(*args)
  foo(*args)
end
```

実行結果は以下のとおり

```
bar(1, 2, 3, 4, 5)  #=> [[1, 2, 3, 4, 5]]
hoge(1, 2, 3, 4, 5) #=> [1, 2, 3, 4, 5]
```

この結果を見れば明らかで，可変長引数を受け取った後の（アスタリスクのついていない） args は配列なので，
一回展開してから渡さないと，もう一回り配列にくるまれちゃうということ．

要するに簡単にまとめると，可変長引数を可変長引数のまま引き回すには受け取り側も呼び出し側もアスタリスクをつければよい，ということ，なはず．
目視でエンコーディングを判別するコツ


## ShiftJIS

- ASCII 文字はそのまま1バイトで表現
- ASCII以外は2バイト単位になっている。
- 8??? という値の繰り返しが多い。

## UTF-8

- ASCII 文字はそのまま1バイトで表現
- １文字が 1バイト 〜 3バイト 単位（可変）で構成される。
- ひらがな、カタカナが　e380?? 〜 e383?? あたりのバイト列になっている。
ソリューション内のドキュメント全てを対象に未使用のusing削除および並び替えをする

VSの便利な機能として、未使用のusing削除および並び替えというものがあります。
参考：[usingの並べ替え](http://msdn.microsoft.com/ja-jp/library/vstudio/bb514113.aspx)

しかし、これは単一のドキュメントしか対象にできません。
ソリューション内のドキュメントに対して一括で操作したいと考える方も多いと思います。
え？ [PowerCommands](http://visualstudiogallery.msdn.microsoft.com/e5f41ad9-4edc-4912-bca3-91147db95b99/) あるから困らない？ｱｰｱｰ、ｷｺｴﾅｲｰ

ということで、一括で操作を行う方法について記します。
そして、今回は [Roslyn CTP - September 2012](http://msdn.microsoft.com/en-us/vstudio/roslyn.aspx) を使いたいと思います。
※Roslyn は VB と C# に対応しているため、VB の import に対しても有効です

＼ﾛｯｽﾞﾘｰﾝ／
はーい！ゆるぷろ、はっじまっるよー

方針としては、
1.ソリューションのパスからドキュメントの一覧を取得
2.そのドキュメント全てに **RemoveUnnecessaryImports()** と **OrganizeImports()** を適用
3.適用したドキュメントを上書き保存
の順になります。
以下サンプルです

```csharp:sample.cs
using System;
using System.IO;
using System.Linq;
using System.Text;
using Roslyn.Services;

namespace ConsoleApplication1
{
	class Program
	{
		static void Main(string[] args)
		{
			if (args.Length == 0)
				throw new ArgumentException("*.sln path を設定してください");

			var path = args.Single();

			var solution = Workspace.LoadSolution(path).CurrentSolution;

			foreach (var document in solution.Projects.SelectMany(p => p.Documents))
			{
				var newDocument = document.RemoveUnnecessaryImports().OrganizeImports();

				using (var writer = new StreamWriter(document.FilePath, false, Encoding.UTF8))
					newDocument.GetText().Write(writer);
			}
		}
	}
}
```
apache/ubuntuでvirtual hostを設定したメモ


## ubuntuのバージョン

```
$  cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.1 LTS"
```

## ドメインのゾーン編集
※sakuraインターネットで借りた。

| エントリ名 | タイプ | データ |
|:-----------:|:------------:|:------------:|
| @       |        NS |     default     |
| @     |      NS |    default    |
| @       |        A |     [your IP]     |
| @         |          MX |      10 @      |
| mail       |       CNAME |    @    |
| ftp    |     CNAME |   @    |
| www    |     A |   [your IP]    |
| *    |     CNAME |   www    |

## apacheの設定
```
 vi /etc/apache2/sites-available/virtual.host

下記のような感じでかく。
<VirtualHost *:80>
	ServerName sub.example.com
	ServerAdmin webmaster@virtual.host
	DocumentRoot  /path/to/sub/doc
	ErrorLog /var/log/apache2/virtual.host.error.log
	CustomLog /var/log/apache2/virtual.host.access.log combined
	LogLevel warn
</VirtualHost>
```

有効化

```
$ a2ensite virtual.host 
↓
/etc/apache2/sites-enabledにsymlinkができる
```

再起動

```
$ sudo service apache2 reload
```

##確認
下記二つが正しく表示されているか確認

http://sub.example.com

http://example.com
Chromeの新規タブを上書きするエクステンションを作りたいときの manifest

```
{
  "name": "拡張の名前",
  "version": "0.0.1",
  "manifest_version": 2,
  "description": "説明",
  "chrome_url_overrides" : {
    "newtab": "index.html"
  },
  "permissions": [
    "tabs"
  ],
  "homepage_url": "URL",
  "icons": {
    "16": "icon16.png",
    "48": "icon48.png",
    "128": "icon128.png"
  }
}
```

# デフォルトのホーム画面を表示させる

```
chrome.tabs.update( {url:"chrome-internal://newtab/"} );
```
CoffeeScriptとはなんぞや？

#CoffeeScriptとはなんぞや？

→JavaScriptのコードを生成するためのコンパクトなrubyライクなスクリプト言語
→安全で、高性能なJavaScriptのコードを自動的に作成できる！
→Javascriptと比べて2分の1から3分の1の量で記述可
→自動でコンパイルする手段は幾つもあるので手間は増えない
→jQueyとの組み合わせ可能

※慣れないうちは、本家サイトでの簡易インタプリタで実際にJavaScriptの対応関係を確認しながらコーディングするのがオススメ。
[CoffeeScript ](http://jashkenas.github.com/coffee-script/)


###・直感的な演算子

| CoffeeScript|   Javascript |
|:-------|--------:|
| is |    ===/== |
| isnt | !==/!= |
| not  |  !  |
| and    |  &&  |
| or  | ||  |
| yes  |  true  |
| no  |  false  |
| @  |  this  |

※ A is yes  →  A === true

###・基本的な文法

```*.js.coffee
if i is 0
 window.alert'正解'
```
↓

```*.js
if(i===0){
 window.alert('正解');
}
```

######・ブロックはインデントで表現
--------------------------------------

######・メソッド等の引数を表すカッコが不要
---------------------------------------

###### ・; が不要
---------------------------------------


```*.js
var name = '森山';
 window.alert("こんにちは"+name+"です");
}
```
↓

```*.js.coffee
name = '森山'
 window.alert"こんにちは！#{name}です"
```

###### ・変数宣言が不要
---------------------------------------
###### ・ダブルクウォート("")のなかでは#{変数名}の形式で呼び出せる！
---------------------------------------

```*.js
if(name != 'undifined' && name != null){
 window.alert("こんにちは"+name+"です");
}
```
↓

```*.js.coffee
 window.alert"こんにちは！#{name}です" if name?
```

###### ・便利な ？演算子の使用が可能に！
---------------------------------------
###### ・倒置法での記述も可能
---------------------------------------

```*.js
var name;
introduction = function(name){
   if(name==null){name == "名無し"}
   alert("こんにちは"+name+"です！");
}

introduction('森山');
```
↓

```*.js.coffee

introduction = (name='森山') ->
   alert "こんにちは#{name}です！"

introduction '森山'
```

###### ・関数は基本 (引数) ->式で記述
---------------------------------------
###### ・デフォルト値も設定可能
---------------------------------------
###CoffeeScriptでjQuery使う

```*.js
  $(function(){
    //jQueryスクリプト
   });
```
↓

```*.js.coffee
  $ ->
      //jQueryスクリプト
```

######クリックイベントを使う

```*.js
  $('#btn').click(function(){
     alert ("こんにちは");    
   });
```
↓

```*.js.coffee
  $('#btn').click ->
     alert "こんにちは#{name}です！"
```

######イベントの引数の設定

```*.js
  $('#btn').click(function(e) {
     e.preventDefault();
     alert ("こんにちは");
   });
```
↓

```*.js.coffee
  $('#btn').click (e) ->
     alert "こんにちは"
```

######liveの使い方

```*.js
  $('#btn').live('click',(function(e) {
     e.preventDefault();
     alert ("こんにちは");
   });
```
↓

```*.js.coffee
  $('#btn').live 'click', (e) ->
     e.preventDefault()     
     alert "こんにちは"
```
######thisの使い方

```*.js
  $('#btn').click(function(e) {
     e.preventDefault();
     alert ($(this));
   });
```
↓

```*.js.coffee
  $('#btn').live 'click', (e) ->
     e.preventDefault();
      alert @
```

###使ってみての感想

■思っていたより簡単だった
→1日ぐらいあればキャッチアップ可能
■少し読みづらい点がある...がその分短くなったのでトレードオフかな...と思っている。
■ちなみにjavascriptファイルを書き換えた所449行が360行に短くなった
sftpはできるがsshでのログインはできないよう設定する


ユーザーに対してsftpによるファイル転送は許可するがsshでのログインはさせないようにする設定。

以下のように、 `~/.ssh/authorized_keys` 内の行の先頭に `command="/usr/libexec/openssh/sftp-server"` を追加すればよい。

``` ~/.ssh/authorized_keys
command="/usr/libexec/openssh/sftp-server" ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1AVovvW0+Gzdiem48Tj6jt9zcGv0vQ+RKyUwaxBPgeRWgqNEeENwu1BlmRsKjW2MdTIBYW1QGep7oU/cxJLB2cyo0ijANNkmErWxYCI1soKcc46XK2KVHyoXafLnyp+F8Oh0HJxiUBZTF6HpEWdcZWhzAhw9k+a+n9r2dkB4ntBycNSBaQIhqHDuGpL3Sjsq+51objXsr8p2JjqbYKVnB2gCyovc7m5p13k+r+HGmgt0qPI1kN3d0t2ZQHBRdJ1SfcqI2KfSK8hOm8eJwEJm3pBvviitW1sVKz+n2fBsTasvOtgZ8YhrMuYjW5uHqAhn8AOLaEoy2YBdlFaHsMw0VQ== example_user@example_host
```
PostgreSQL幾何データ演算子


```sql:2点間の距離を調べる
select point(5, 5) <-> point(10, 10)  ;-- →２点間の距離
```

```sql:包含判定
select box(point(0, 0), point(10, 10)) ~ box(point(5, 5), point(20, 20)) ;--含まれるか　→　偽
select box(point(0, 0), point(10, 10)) ~ box(point(0, 0), point(20, 20)) ;--含まれるか　→　真
```

```sql:重なり判定
select box(point(0, 0), point(10, 10)) && box(point(5, 5), point(20, 20)) ;--重なっているか　→　真
```

```sql:はみ出し判定
select box(point(0, 0), point(10, 10)) &< box(point(5, 5), point(20, 20)) ;--右にはみ出しているか　→　真
select box(point(0, 0), point(10, 10)) &> box(point(5, 5), point(20, 20)) ;--左にはみ出しているか　→　偽
select box(point(0, 0), point(10, 10)) &<| box(point(5, 5), point(20, 20)) ;--上にはみ出しているか　→　真
select box(point(0, 0), point(10, 10)) |&> box(point(5, 5), point(20, 20)) ;--下にはみ出しているか　→　偽
```
簡単なレコメンドやクラスタリングを行うのに使える。
http://shimz.me/blog/sql/2556
neo4jインストール手順@ubuntu


ubuntu`DISTRIB_RELEASE=12.04`でneo4jをインストールした時のメモ

```
$ sudo -s
# wget -O - http://debian.neo4j.org/neotechnology.gpg.key | apt-key add - 
# echo 'deb http://debian.neo4j.org/repo stable/' > /etc/apt/sources.list.d/neo4j.list
# apt-get update
# apt-get install neo4j
$ cd /var/lib/neo4j
$ ./bin/neo4j start
```

ここで次のようなwarningがでる。

```
WARNING! You are using an unsupported version of the JDK. Please use JDK 6.
```

OpneJDKではダメみたいなので、Sun-java6を入れて、切り替える。

```
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer
sudo apt-get install oracle-java7-installer
screnn (OK)(OK)

$ sudo update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-6-oracle/jre/bin/java          1063      auto mode
  1            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      manual mode
  2            /usr/lib/jvm/java-6-oracle/jre/bin/java          1063      manual mode
  3            /usr/lib/jvm/java-7-oracle/jre/bin/java          1062      manual mode
```

再度起動するも、下記のwarningが出る。

```
WARNING: Max 1024 open files allowed, minimum of 40 000 recommended. See the Neo4j manual.
```

ファイルのシステムリソースが足らないようなので設定を変える。


```
$ sudo vi /etc/security/limits.conf
下記４行追加
---
neo4j        hard        nofile        100000
neo4j        soft        nofile        40000
root         hard        nofile        100000
root         soft        nofile        40000
---

$ sudo vi /etc/pam.d/su
下記１行追加
---
session    required   pam_limits.so
---
```

外部からadminツールを使うときは、下記のようにする。

```
sudo vi ./conf/neo4j-server.properties

下記をチェック外して、IPを書き換える。
org.neo4j.server.webserver.address=0.0.0.0

$ ./bin/neo4j start
```

とりあえずここまで。

## 参考
http://docs.neo4j.org/chunked/1.6.2/configuration-linux-notes.html#_setting_the_number_of_open_files
Git Extensionsで行うこわくないマージ

# Git Extensionsでおこなう、こわくないマージ
Git Extensionsでマージ作業をしてみます。一部画面はまだ現在のリリース版のGit Extensions 2.43とは異なることがあります。

## まっすぐなリポジトリの準備
まずは図に示すような、README.mdファイル一個、masterブランチ一個しかないまっすぐなリポジトリを準備してみます。
![merge01.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge01.png)

## testブランチの作成
masterブランチからtestブランチを作成します。
![merge02.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge02.png)

まだ何もコミットしていないのでmasterブランチとtestブランチの内容は同一です。
![merge03.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge03.png)

## testブランチへのコミット
README.mdを以下のように編集してtestブランチにコミットします。

```markdown:README.md
# Testing

testing repository

## Hello Git!
Hello, Git world!
```

## masterブランチへのコミット
masterブランチをチェックアウトします。
![merge05.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge05.png)

README.mdを以下のように編集してmasterブランチにコミットします。

```markdown:README.md
# Testing

testing repository

## Hello Git
Hello, git world!
```

これでmasterブランチとtestブランチで内容が別れてしまいました。
![merge06.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge06.png)

## testブランチのマージ
現在いるmasterブランチに、testブランチをマージします。
![merge07.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge07.png)

現在のブランチ: master、マージ対象: testとしてマージします。
![merge08.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge08.png)

どちらのブランチもREADME.mdを変更しているため、競合 (CONFLICT) が発生してしまいましたが落ち着いて「OK」を押しましょう。
![merge09.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge09.png)

「マージ競合の解決をしますか？」と聞かれます。「はい」を押すとKDiff3を使ったマージツールが起動するのですがいまいち使いやすくないので、ここは「いいえ」を押してください。
![merge09-2.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge09-2.png)

## マージ作業
現在マージ作業中である警告がダイアログ右下に表示されているはずです。ここからエディタなどを用いて手作業でマージをおこなっていきましょう。
![merge10.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge10.png)

README.mdが以下のような状態になっています。

```markdown:README.md
# Testing

testing repository

<<<<<<< HEAD
## Hello Git
Hello, git world!
=======
## Hello Git!
Hello, Git world!
>>>>>>> test
```

これは``<<<<<<< HEAD``と``=======``に囲まれる部分がHEAD (現在のブランチ = master) の変更、
``=======``と``>>>>>>> test``に囲まれる部分がtestブランチの変更であるという意味です。

両方の変更を取り込み以下のように編集します。

```markdown:README.md
# Testing

testing repository

## Hello Git
Hello, Git world!
```

いつもどおりにコミットしてみましょう。
![merge15.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge15.png)

無事testブランチの内容がmasterブランチにマージされました。
![merge16.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge16.png)

コミットのグラフも「ここでマージしたよ」というのがわかりやすい表示になっていて、嬉しいですね。

## Tips
コミット画面から「ファイルの履歴」などを選ぶと、そのファイルに関連する変更を確認できてマージの参考になります。是非役立たせてください。
![merge13.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge13.png)
選択して、
![merge14.png](https://raw.github.com/hogelog/gitextensions-tips/master/merge/merge14.png)
各コミットの変更を確認したり。
MySQL varchar, charの注意事項


## varchar, charの注意事項
デフォルトだと大/小文字は区別されないのでBINARY属性を指定しよう

> CREATE TABLE hoge(
> id int not null auto_increment,
> name varchar(128) default null,
> PRIMARY KEY (id));
>
> INSERT INTO hoge values('hoge'),('Hoge');
>
> SELECT * FROM hoge WHERE name = 'hoge';
> +----+------+
> | id | name |
> +----+------+
> |  1 | hoge |
> |  2 | Hoge |
> +----+------+
> 2 rows in set (0.06 sec)

二件引っかかる
ということでBINARY属性を付与

> mysql> ALTER TABLE hoge MODIFY name varchar(128) BINARY DEFAULT NULL;
> Query OK, 2 rows affected (0.70 sec)
> Records: 2  Duplicates: 0  Warnings: 0
>
> mysql> select * from hoge where name = 'hoge';
> +----+------+
> | id | name |
> +----+------+
> |  1 | hoge |
> +----+------+
> 1 row in set (0.02 sec)

OK
AppleScriptでクロージャー


~~~~~applescript:closure_of_applescript.scpt
(* closure of applescript *)

on theClosure()
    script outer
        property x : 0
        script inner
            set x to x + 1
        end script
    end script
    return inner of outer
end theClosure

set s to theClosure()

run s
run s
run s
run s
run s
-- result : 5
~~~~
Mac OS X + MonoでSystem.Data.SQLiteを動作させる

案外ハマる。ハマりどころは3つ

 * System.Data.SQLiteでよく使うスキーマ調査用のsqlite3_column_database_name は、Mac OS X向け標準ビルドのSQLiteに含まれない
 * Monoは今のところ(3.0.3時点)Mac向けに32bitバイナリしか提供していないし、32bitバイナリから64bitビルドされたライブラリのロードは出来ない
 * MonoのDLL検索は(DllMapを定義していない限り)libsqlite3.0.dylibとなる(Windows環境から類推されるlibsqlite3.dylibとかではない。ちなみにサフィックスは .dylib, .dylib.so, .dylib.bundleを探してくれる)

対応方法はこんな感じ。

http://sqlite.org/sqlite-autoconf-3071502.tar.gz

からソースを拾ってきて展開。

```
$ ./configure CFLAGS="-DSQLITE_ENABLE_COLUMN_METADATA -m32"
$ make
```

で得られる.lib/libsqlite3.0.dylib を適当な場所へコピーするか、make installしてよしなにする。

SQLiteのソース読まないと案外気付かないところでハマったハマった(ﾉ∀`)
exception_notificationの例外メールのテンプレートを変える

いちいち調べるの面倒なのでメモ。

何のことはなく、`app/views/exception_notifier/`に`_title.text.erb`みたいな感じでテンプレートを置くだけ。置き換わってくれる。
新しいセクションを追加するなら、（たぶん）config/initializersのどこぞに書いてある

```ruby
Rails.application.config.middleware.use ExceptionNotifier,
  :email_prefix => "[アプリケーション名] ",
  :sender_address => %{"送信者名" <送信元メールアドレス>},
  :exception_recipients => %w{送信先メールアドレス}
```

に、`:sections => %w{request session environment backtrace}`を足してあげればよし。
`app/views/exception_notifier/`以下に新しいパーシャルを作った上で、上記の`:sections`に追加してやれば、それもレンダリングされるっぽい。

ドキュメントによると、デフォルトでサポートしてる情報は

* @controller: the controller that caused the error
* @request: the current request object
* @exception: the exception that was raised
* @backtrace: a sanitized version of the exception's backtrace
* @data: a hash of optional data values that were passed to the notifier
* @sections: the array of sections to include in the email

だそうで、ここに新たな情報を追加したい場合は

```ruby
  class ApplicationController < ActionController::Base
    before_filter :log_additional_data
    ...
    protected
      def log_additional_data
        request.env["exception_notifier.exception_data"] = {
          :document => @document,
          :person => @person
        }
      end
    ...
  end
```

とかする。で、新しく追加したパーシャルなり既存のパーシャルを上書きするなりで呼び出してやったりやらなかったり。
RVMの--rvmrcオプションが個人的に捗る

passenger の standalone について調べていたんですが、
偶然見つけたサイトで、見たことのないオプションを見つけました。

http://lab.unicast.ne.jp/2012/01/09/rvm-%E3%81%A8-phusion-passenger-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AE-ruby-ruby-on-rails-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92/

```
$ rvm --rvmrc --create 1.8.7@rails-2.3.11
```
いつも、echo "rvm use ruby-1.9.3-p374@hoge" > .rvmrc
とかやっていたので、これはよさそう。
Padrino 0.10 系とXSS

* https://github.com/padrino/padrino-framework/issues/987

0.10 系のタグ描画系ヘルパーは `content_tag` というメソッドを利用していて、これは基本的に入力値の安全性を気遣ってくれない。典型的なのが `link_to` ヘルパーで、

```ruby
link_to(@label, url_for(:users, :edit, :id => @user.id))
```

この `@label` が外部入力値由来で、適切にエスケープ処理がされていないとXSSを引き起こすことがある。上記のissue #987の議論にもある通り、rack-protection gem [*1] の、 `Rack::Protection::EscapedParams` ミドルウェアなどを利用することができるので、いわゆる持続型XSS（データベースの値にXSSを仕掛けるようなパターン）に対しては一定の抑止力を持っているわけが、普通にQuery Stringに値を仕込まれているような場合は自分達で気をつけるしかないだろう。

現在のmasterでは内部で `ActiveSupport::SafeBuffer` を利用するようになっている。Edge Padrino、あるいはこれからリリース予定の 0.11 系ではこの問題は解消される（0.10.8 出せば良いのにな〜というのは思うけど、後方互換性がない変更なので出しづらいようだ）。

* https://github.com/padrino/padrino-framework/blob/master/padrino-helpers/lib/padrino-helpers/tag_helpers.rb

とは言えこの実装にXSSのおそれはないか？ という問題意識は、フレームワークがどうであれ常に持ち合わせておくべきだろう。

### 注記

[*1] Sinatra系のフレームワークではデフォルトで有効になっている。古いPadrinoのバージョンで作られたテンプレートを使い回している時は、明示的に `enable :protection` する必要がある……。
レビューの仕方

gitでレビューするときに、どんな感じにやっているか、をメモしておく。

## レビュー対象のブランチ名をおしえてもらう。

## リポジトリを更新し、対象のブランチをチェックアウト

```sh
$ git remote update
$ git checkout feature/target
```

$ git checkout origin/feature/target -b feature/target -t

昔はこんな感じにしていたが、今はorigin/を省略してcheckoutすれば自動でこうなるようだ。

## origin/masterとのコミットの概要をざっと眺める。

```sh
$ git log --stat --reverse origin/master..HEAD
```

## 動作確認
テスト動かしたり、軽く動作をみたりする。

## 各コミットの内容を見る

```sh
$ git log --stat --reverse origin/master..HEAD -p
```

## origin/masterとの最終的な差分を確認

```sh
$ git diff origin/master..HEAD
```
Rubyで標準入力からCSVをパース

CSVを標準入力から読み込んで標準出力に吐き出す、いはゆる UNIX のフィルタプログラムみたいな感じ。

ぐぐってもちゃんとした方法が出てこないので、コード全体を掲載。

これが模範解答。

```csv_filter.rb
#!/usr/bin/env ruby

require 'csv'
CSV(STDIN).each do |row|
  puts "''#{row[1]}'' #{row[2]}"
end
```

別解。シェルからワンライナー。

```bash
% ruby -rcsv -e"CSV(STDIN).each{|r|puts %Q(''#{r[1]}'' #{r[2]})}" < hoge.csv
```

最初に書いた、(自称)70点の回答。

```csv_filter.rb
#!/usr/bin/env ruby

require 'csv'
CSV.filter(ARGF, open(File::NULL, ?w)) do |row|
  puts "''#{row[1]}'' #{row[2]}"
end
```

`File::NULL` は知名度低い気がしますが、UNIX風のOSなら `/dev/null` 、Windowsなら `NUL` といふファイルが開かれます。

書き込み先を `File::NULL` にして、オプション `'w'` で開かないと、行単位の内容が `STDIO` に出てきちゃいます ヾ(〃＞＜)ﾉﾞ☆ 

なんでこんな仕様なの…


 * `CSV::IOReader`
   * 全然だめです。1.8以前専用です。
 * `open(ARGF).each_line` して `CSV.parse_line`
   * **だるい**
How to inherit Error class in CoffeeScript


This does NOT works well:

```coffeescript
class MyError extends Error

myError = new MyError("This is my original error")
```

```coffeescript
console.log myError
# [Error: This is my original error]

console.log "name: " + myError.name
# name: Error

console.log "message: " + myError.message
# message: This is my original error

console.log myError instanceof Error
# true

console.log myError instanceof MyError
# false
```

This works well:

```coffeescript
class MyError
	constructor: (@message)->
		@name = @constructor.name
	@:: = new Error()
	@::constructor = @

myError = new MyError("This is my original error")
```

```coffeescript
console.log myError
# { message: 'This is my original error', name: 'MyError' }

console.log "name: " + myError.name
# name: MyError

console.log "message: " + myError.message
# message: This is my original error

console.log myError instanceof Error
# true

console.log myError instanceof MyError
# true
```

## By the way, what is Qiita?

Visit [Qiita and Kobito - Great Duet to manage your knowledge.](http://qiita.com/items/392a2ff258a3c26adbfe) ;)
なぜGoogleはJSONの先頭に while(1); をつけるのか

Stack Overflowに面白い質問があったので紹介する

- [javascript - Why does Google prepend while(1); to their JSON responses? - Stack Overflow](http://stackoverflow.com/questions/2669690/why-does-google-prepend-while1-to-their-json-responses)

## 質問

Googleのサービス内で使われるJSONの先頭に `while(1);` てついているのは何故？
例えばGoogle Calendarではカレンダーを切り替えるときに以下のような内容のデータがサーバから返される。

```javascript:json
while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],['remindOnRespondedEventsOnly','true'],['hideInvitations_remindOnRespondedEventsOnly','false_true'],['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]
```

これ以外にもGoogleのサービスでは `&&&START&&&` とか `while(1); &&&START&&&` てのが先頭に入ってたりするんだけど、これは一体何？

## 解答

これはクロスサイト・リクエスト・フォージェリ対策。
例えばGoogleが `gmail.com/json?action=inbox` というURLを持ってて、そこにユーザのCOOKIEでアクセスすると最新50件のメールが取れるとする。悪意のあるサイトからはsame-origin policyでAjaxではアクセスできないが、scriptタグのsrc属性に直接入れることでJSONを取得することはできてしまう。そして [ArrayコンストラクタやそのアクセッサメソッドをオーバライドすることでJSONの値にアクセスできてしまう。](http://ejohn.org/blog/re-securing-json/)
先頭に `while(1);` とかシンタックスエラーになる文字列があればこれを抑制できる。Ajaxではレスポンスを文字列として扱うことができるけれどscriptタグでは即実行されるため、これら余分な箇所を取り除くことができないからだ。

### 余談

- 最近のWebブラウザでは組み込み型のコンストラクタの再定義はできないようになっている。
- FacebookのJSONの先頭には `for(;;);` がついているらしい。こっちの方が1文字短い。
- 古いブラウザのセキュリティホールに対応するためのバッドノウハウなので、相当セキュリティに気を使わなければならないようなページでなければ必要ない。
- 「CSRF対策」というよりは「JSON hijacking対策」という方が適切。
- より正確に言うならAjaxでアクセスできないのはSame-Origin Policyと[Cross-Origin Resource Sharing](http://www.w3.org/TR/cors/)が設定されていないため。

### 合わせて読みたい

- [ GoogleのJSON(モドキ)の先頭にwhile(1); がつく理由 - 葉っぱ日記](http://d.hatena.ne.jp/hasegawayosuke/20130206/p1)
Facebook API を $.Deferred で管理

複数の Facebook API を全部 $.Deferred にする
init とかの部分は略

```javascript
// ログイン Deferred
var $login = $.Deferred(function ($dfd) {
    FB.login(function (response) {
        if (response.authResponse) {
            $dfd.resolve(response);
        } else {
            $dfd.reject(response);
        }
    });
}).promise();

// FB.api の Deferred ラッパー、可変引数
function fbDfd() {

    var $dfd = $.Deferred(),
        args = [],
        i;

    for (i = 0; i < arguments.length; i++) {
        args[i] = arguments[i];
    }

    args.push(function (response) {
        if (!response || response.error) {
            $dfd.reject(response);
        } else {
            $dfd.resolve(response);
        }
    });

    FB.api.apply(this, args);

    return $dfd.promise();
}

//  ログイン後にAPIを呼び出す。 複数 API も then で連結可能
$login.then(
    function (response) {
        return fbDfd('/me/friends');
    }
).done(function (response) {
    console.log(response); // FB.api のレスポンス
});
```
必要ライブラリがありません事案の救世主apt-file

gemなど入れる時の哀しみ

```````````
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /home/hash/.rvm/rubies/ruby-1.9.3-p327/bin/ruby extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
`````````````

何入れたらいいもんだかわからない. そこでapt-file

````````````
$ sudo apt-get install apt-file
$ apt-file update
$ apt-file search libpq-fe.h
libpq-dev: /usr/include/postgresql/libpq-fe.h
```````````

```````
$ sudo apt-get install libpq-dev
```````

素晴らしい
PullRequestの続き


PullRequestを送った後に、修正やら追加のcommitを送りたい場合がある。こういった場合はもうひとつPullRequest送る方法もあるが基本的にPullRequestを送ったbranchにcommitをPushすれば自動的に追加されるのがGihHubのよいところ。

こんな感じで追加が行われる。非常に便利。

![screen_shot](http://lewuathe.com/images/screen_shot.png "screen_shot")
perl の不思議な振る舞い

perl は文字列と文字列、文字列と数値でビット演算することができる。
文字列と数値だと文字列と数値が両方共整数に変換されて、整数と整数のビット演算になる。
文字列と文字列だと、文字ごと（バイトごと？）のビット演算になることと、そうでもないことがある。

具体的には以下のとおり：

```perl
# v5.12.4
use strict;

my $a="13e";
my %ha=("13e"=>"13e");

print "--- string & string --\n";

print( ( $a & "24{" ), "\n" ); # 00a。文字ごとに bit演算。
print( ( (keys(%ha))[0] & "24{" ), "\n" );# 00a。同上。
print( ( (values(%ha))[0] & "24{" ), "\n" );# 00a。同上。

print "--- string & number --\n";

print( ( $a & 24 ), "\n" ); # 8。文字を数値化してから bit演算。
print( ( (values(%ha))[0] & 24 ), "\n" ); # 8。同上。
print( ( (keys(%ha))[0] & 24 ), "\n" ); # 8。同上。

print "--- string & string again --\n";

print( ( $a & "24{" ), "\n" ); # 8。さっきと違う
print( ( (keys(%ha))[0] & "24{" ), "\n" ); # 00a。さっきと同じ。
print( ( (values(%ha))[0] & "24{" ), "\n" ); # 8。さっきと違う。
```

理解し難い。

他にも、hash の イテレーションの振る舞いとか、 $a, $b が特別扱いになっていることとかいろいろあったけど、この、文字列に対するビット演算の記憶がもっとも受け入れがたい気がする。

`keys` と `values` で振る舞いが異なることには今日気がついた。バージョンによって振る舞いが変わるかもしれないとも思うが、試していない。

たぶん、文字列とビット演算するなということなんだと思う。
push したタイミングで Trac のチケットへコミットコメントを反映するフックスクリプト

# 前提
Trac のプラグイン CommitTicketReferenceMacro、CommitTicketUpdater を有効にしておく。

# Git のフックスクリプト
```sh:post-receive
#!/bin/sh
#
# An example hook script for the "post-receive" event.
#
# The "post-receive" script is run after receive-pack has accepted a pack
# and the repository has been updated.  It is passed arguments in through
# stdin in the form
#  <oldrev> <newrev> <refname>
# For example:
#  aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master
#
# see contrib/hooks/ for a sample, or uncomment the next line and
# rename the file to "post-receive".

#. /usr/local/share/git-core/contrib/hooks/post-receive-email

GIT_APP="/usr/local/bin/git"
TRAC_ADMIN="/usr/local/bin/trac-admin"
TRAC_ENV="【Tracのenvへのパス】"
REPO_NAME="【Tracに登録したGITリポジトリ名】"
LOG="/dev/null"

while read oldrev newrev refname; do

    echo "oldrev=${oldrev}, newrev=${newrev}, refname=${refname}" >> "${LOG}"

    from_rev=`git log -n 1 --reverse --pretty=format:%h ${oldrev}`
    to_rev=`git log -n 1 --reverse --pretty=format:%h ${newrev}`

    echo "from_rev=${from_rev}, to_rev=${to_rev}" >> "${LOG}"

    added_flag="0"
    for rev in `${GIT_APP} log --reverse --pretty=format:%h`; do

        if [ "${added_flag}" = "1" -o "${from_rev}" = "" ]; then
            echo "rev=${rev}" >> "${LOG}"
            ${TRAC_ADMIN} "${TRAC_ENV}" changeset added "${REPO_NAME}" "${rev}"
        elif [ "${from_rev}" = "${rev}" ]; then
            added_flag="1"
        fi
    done
done

${TRAC_ADMIN} "${TRAC_ENV}" repository resync "${REPO_NAME}"
```

# 心配事
ブランチをマージした後 push すると、チケットがコメントだらけになってしまうかも？
Macにnodeのインストール


##grepを入れ替え
Mac標準のgrepだと、

```
egrep: warning: recursive search of stdin
```

みたいな感じのエラーが出るので、brewでgrepをインストールする。

```zsh
% brew install grep
```

環境変数のPATHは、/usr/local/binを先にしておく。
念の為、確認。

```zsh
% which grep
/usr/local/bin/grep
```


##nodeをnaveを使ってインストール

```sh
% mkdir ~/.nave
% cd ~/.nave
% git clone git://github.com/isaacs/nave.git
% ./nave/nave.sh use latest
```

##npmもインストール
以下のコマンドでインストール

```zsh
% curl https://npmjs.org/install.sh | sh
```

##確認
```zsh
% node -v
v0.9.8
% npm -v
1.2.4
```
[Python]各hash

```python
import hashlib
val = "samplehost@example.com"

# Python2
# >>> [i for i in dir(hashlib) if i.find("sha") != -1]
# ['sha1', 'sha224', 'sha256', 'sha384', 'sha512']

md5val = hashlib.md5(val).hexdigest()
sha1val = hashlib.sha1(val).hexdigest()

# Python3
# >>> sha1val = hashlib.sha1(val).hexdigest()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: Unicode-objects must be encoded before hashing

val = val.encode("ascii")
sha1val = hashlib.sha1(val).hexdigest()
```
Railsの脆弱性とPadrinoへの影響

ブログ記事が上がっていました。

* http://www.padrinorb.com/blog/sleep-well-yaml-vulnerabilites-and-padrino

## 概要

* **基本的には影響はない**
* そうは言っても依存関係上Railsのコンポネントが含まれていて、少しでも怪しいと思った場合アップグレードした方が良い
* 有名なgemでは、Rack::Parser、Rack::PostBodyToParamsはアップグレードの必要がある
* 安全かどうかを確認するため、以下のステップを踏むと良い
    * HTTPでデータをやり取りしているライブラリを調べ、`YAML.load`をしていないか確認する。また、外部データを受け入れるかどうか確認する。
    * [safe_yaml](https://github.com/dtao/safe_yaml) gem を利用できないか試す
    * XmlMiniを利用していないか確認する
        * 利用していた場合はバージョン0.5.2以降に上げる
* ちなみに、Padrino 0.11 からはXSS対策のための`ActiveSupport::SafeBuffer`の利用など、いくつかセキュリティFIXが入る
* RailsコミュニティやRubygems.org管理者の早急な対応に感謝する

この邦訳はざっくりなのでツッコミをお待ちしています。公式の日本語サイトにも転載しないといけませんね……。
変数の値に改行コードが含まれているか調べる

変数に格納されたテキストが複数行か、つまり改行コードを含んでいるか調べます。
Bash で動作を確認しました。

```sh
var="line1
line2
line3"
[[ ${var/$'\n'} == $var ]] || echo 'newline(s) in $var'
```
rubyのインストールで`error: no acceptable grep could be found`

rubyのインストールで`error: no acceptable grep could be found`
## 状況
`rbenv install 1.9.3-p374` したら以下のようなエラーが出てインストールに失敗する

```
checking for grep that handles long lines and -e... configure: error: no acceptable grep could be found in
```

もちろんgrepコマンドはある

```
$ which grep
/usr/bin/grep
```

## 原因
GREP_OPTIONSに`--color=always`を指定していたことが原因らしいが，これ以上はわからず…

## 解決方法
```
GREP_OPTIONS= rbenv install 1.9.3-p374
```


同じことがnokogiriのインストールでも起きた．
jQueryのchange()の注意点

jQueryのchange()メソッドを使うときブラウザ間の挙動に注意しなければならない。
Firefoxではinputのcheckboxをクリックした際focusは外れてイベントが発火するが、IEやChromeでは外れずイベントが発火しない。
ちなみにjQuery1.5の話なので最新版だと違うかもしれない。
何か歴史的な経緯のためjQueryの古い版を使っている人は注意したほうがいい。
Team DashBoard にカスタムdatapointsのソースを定義する

## Team DashBoard ってなんや

* https://github.com/fdietz/team_dashboard
* http://docs.komagata.org/5027

KPI見るよ系の中でも断然見やすい、というか普通の人が見ていて抵抗感がない感じがする。

内部ではツイブー（隠語）とかbackbone.jsとか使ってて激しい目。

## カスタムのデータソースを書く

`app/models/source/datapoints` などに置く。READMEと微妙に違うんですけど。。。

```ruby:app/models/source/datapoints/hoge.rb
module Sources
  module Datapoints
    class Hoge < Sources::Datapoints::Base

      # ここをtrueにするとソース一覧に出てくる模様
      def supports_target_browsing?
        true
      end

      # データの元になるJSONの元になるべきHashを返す
      # from, to は一年単位とかになることもあるので、適宜集計して見やすくすると良さそう
      def get(targets, from, to = Time.now.to_i, options = {})
        Rails.logger.debug "from: #{Time.at(from)}"
        Rails.logger.debug "to  : #{Time.at(to)}"
        range = from.step(to, 60)
        samples = enum_for :get_rand_numbers
        targets.map do |t|
          { :target => t, :datapoints => (samples.take range.to_a.size).zip(range) }
        end
      end

      # 設定で見つけるべきグラフのターゲットの一覧を返す。options[:pattern]を元にフィルタのロジックも実装できる
      def available_targets(options = {})
        pattern = options[:pattern] || ""
        targets = ["udzura.foo", "udzura.bar"]
        if pattern.present?
          targets.select{|t| t =~ /#{pattern}/}
        else
          targets
        end
      end

      def get_rand_numbers
        loop { yield rand * 1000 }
      end
    end
  end
end
```

特定のフォーマットのHashさえ返せば良いので、RDDToolとかMongoDBとかをデータソースに適当に取ってくるようなやつを書けば便利そう。デフォルトではそんな有益なソースはないんですけどね（……）

## レイルズ

CactiやGrouthForecastの代わりに使うにはそもそも的に機能割と少ない（ユーザ権限管理とかないし）んだけど、そこはRailsなので拡張すれば良いかな〜という気持ちがある。

と言いつつ、よく考えたら分析的に見るには向かないのかもなあという思いは少しあったりする。
Emacs Lisp の reduce

毎度使い方忘れるのでメモ。

```scm
(require 'cl-seq)

;; (or (or (or "a" "b") "c") "d") と同じ
(reduce (lambda (result item) (or result item))
        '("a" "b" "c" "d"))
;; => "a"

;; フィルタ関数を順番にかける
(reduce (lambda (res fun) (funcall fun res))
        '(;; 元になる文字列
          "hoge"

          ;; o を a に置換 => "hage"
          (lambda (str) (replace-regexp-in-string "o" "a" str))

          ;; 先頭文字を大文字に変換 => "Hage"
          (lambda (str) (capitalize str))

          ;; 同じ文字列を2回繰り返す => "HageHage"
          (lambda (str) (concat str str))))
;; => "HageHage"
```
Cocoaでベーシックなカスタムボタンを表示する

コードを用意しました。
https://github.com/Ushio/CocoaBasicButton-10.8-Framework

AppKitとUIKitではViewとCALayer関連で結構差があり、
カスタムボタン一つ作るのにも一苦労です。
今回作成したボタンは、
・contentsCenterによって、画像を端っこは引き延ばされずに任意の矩形のみ引き延ばす
　　（uiimage resizableImageWithCapInsets:相当の機能）
・LayerBackedView描画システム
・CALayerとCIFilterの連携（こちらはCocoaのみ？）
・簡単なAutoLayoutの活用
等の要素が入っています。

しっかりスタディしたい方は、WWDC2012、Session 217 Layer-Backed Views AppKit +CoreAnimationをご覧ください。

それにしてもCocoaの資料が結構少なくて苦労しています・・・
MySQLダンプデータをujis → utf8


ujisなダンプデータの変換に関してです。
nkfでドカンでも良かったんだけど、

``` nkfでドカン
$ nkf -E -w hoge.sql > hoge_utf8.sql
```
構文エラーになりやがったので、面倒だけど以下手順でutf8に変換しました。

## 変換用データベースを用意し、ujis環境にリストア

my.cnfを修正。

```
[ujis ~] $ sudo vi /etc/my.cnf
```

``` my.cnf
[mysql]
default-character-set=ujis <<<<<<<<<<<<<<< ここ

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set=ujis <<<<<<<<<<<<<<< ここ

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
```
MySQL再起動する。

```
[ujis ~] $ sudo /etc/init.d/mysqld restart
```

リストア。

```
#ダンプデータにCREATE文が無ければデータベースを作る。
[ujis ~] $ mysql -u root -e "CREATE DATABASE hoge;"
[ujis ~] $ mysql -u root [hoge] < hoge.sql
```
## 全テーブルの文字コードをUTF8に変換

```
[ujis ~] $ mysql -u root hoge -e "ALTER TABLE fuga CHARSET=utf8;"
[ujis ~] $ mysql -u root hoge -e "ALTER TABLE fugo CHARSET=utf8;"
・・・
```

## ダンプ実行

```
[ujis ~] $ mysqldump -u root hoge --database > hoge_utf8.sql
```

## ダンプデータのujis系をutf8系に置換

`ujis → utf8` と `ujis_bin → utf8_bin` を実行。

```
#確認
[ujis ~] $ grep "character set ujis\|collate ujis" hoge_utf8.sql
#問題無さそうならsedで置換、問題があればVimでコツコツ置換。
[ujis ~] $ sed -i -e 's/\(character set \|collate \)ujis/\1utf8/' hoge_utf8.sql
```

## utf8環境のMySQLにリストア

```
[utf8 ~] $ mysql -u root < hoge_utf8.sql
```
MailChimpのsubscribe/unsubscribe

[tatemae-consultancy/hominid](https://github.com/tatemae-consultancy/hominid)というgemを使ってサービスの設定状況とMailChimpのsubscribe/unsubscribeを連携する．


```ruby:user.rb
class User < ActiveRecord::Base
  after_create do
    subscribe_mailchimp
  end

  after_update do
    if email.present? && email_was.present? && email != email_was
      begin
        mailchimp.list_update_member(mailchimp_list_id, email_was,
          { EMAIL: email}, 'html', false)
      rescue => e
        logger.error "Failed to update newsletter: #{url_name} #{e}"
      end
    end
    true
  end

  before_destroy do |user|
    unsubscribe_mailchimp
  end

  def subscribe_mailchimp
    return if email.blank?
    mailchimp.list_subscribe(mailchimp_list_id, email, {}, 'html',
      false, true, false, false)
  rescue => e
    logger.error "Failed to subscribe newsletter: #{url_name} #{e}"
  end

  def unsubscribe_mailchimp
    return if email.blank?
    mailchimp.list_unsubscribe(mailchimp_list_id, email, false, false, false)
  rescue => e
    logger.error "Failed to unsubscribe newsletter: #{url_name} #{e}"
  end

  def mailchimp
    Hominid::API.new(APP_CONFIG['mailchimp']['api_key']) # Do not cache.
  end

  def mailchimp_list_id
    APP_CONFIG['mailchimp']['list_id']
  end
end
```
enumで複数の要素を持たせるときのアンチパターンとその解決法

twitterで[こんな定義をネタにしてました](https://twitter.com/cz75hiro/status/288895345939841026)が、｢じゃあどうすればいいのか｣という話もしておこうかと思います。

```csharp
//アンチパターン
enum Hoge{
  A = 1,
  B = 2,
  C = 3,
  D = 4,
  AB = 12,
  CD = 34
}
```

このコードの駄目な点は

+ ｢BC｣のような要素が欲しいとき、新たに定義を書く必要がある。
+ 複合要素の値と単要素との差を、文字列としてしか判断できない
+ 複合要素内に、ある1要素を含んでいるかどうかを調べるのが面倒
+ 要素の値に一意性が無い(例：CはA+Bの値と同じなので、ABの複合フラグとの差異が取りにくい)

といった箇所です。


---
複数の要素を｢AB｣や｢CD｣のように同時に取りたい場合、下記3+1点に注意します。

1. 各要素の値を、ビットフラグとして考える
2. 複合要素には各要素の論理和を取る(例：AとBの複合フラグの時は｢A | B｣)
3. Flags属性を付ける
4. そもそも複合要素を定義しない(ただし状況による)

4はちょっと特殊な話になりますので、1-3を踏まえ、列挙の定義をこのように修正します。

```csharp
//修正その1
[Flags]
enum Hoge{
  A = 1,
  B = 2
  C = 4,
  D = 8,
  AB = A | B,
  CD = C | D
}
```
---
##解説
####1.各要素の値を、ビットフラグとして考える
複数の要素を同時に表現するためには、列挙の各要素を
ビットフラグとして考えるべきです。つまり、2進数で表した時

|要素|2進数|10進数|
|:--:|:---:|:----:|
|A   |0001 |1     |
|B   |0010 |2     |
|C   |0100 |4     |
|D   |1000 |8     |
|AとB|0011 |3     |
|CとD|1100 |12    |

となるよう定義すれば、複数の値を取ったとしても、他の要素の値と重複することが無いため、
今後E、F…と要素が増えても安定した値を保つことができます。

---
####2.複合要素には各要素の論理和を使う
修正後のソースは

```csharp
AB = A | B
```

と定義しましたが、

```csharp
AB = 3
```

と定義しても同じ意味を持ちます。
しかし前者の方が可読性に勝りますし、値の計算ミスも避けることができますので、
リテラルで書く必要がない箇所は、リテラルを書かないようにしましょう。

---
####3.Flags属性を付ける
.net系言語には属性というものがあり、それを付加することでプログラムの挙動を変えることが可能です。
修正後のソースに付加したFlags属性は、列挙変数の出力文字列を、フラグ表示に適した形に整えてくれます。
Flags属性が無い場合、各要素の値の定義があれば、その要素名が表示され、なければ数値として表示されます。

```csharp
  //Flags属性なし
  Console.WriteLine(Hoge.AB);          // ｢AB｣が出力される
  Console.WriteLine(Hoge.AB | Hoge.C); // ｢7｣が出力される
```

Flags属性を付加した場合は、常に各要素の論理和が判断され、その結果を出力してくれます。

```csharp
  //Flags属性あり
  Console.WriteLine(Hoge.AB);                  // ｢AB｣が出力される
  Console.WriteLine(Hoge.AB | Hoge.C);         // ｢AB, C｣が出力される
  Console.WriteLine(Hoge.A | Hoge.B | Hoge.C); // これも｢AB, C｣と出力される
```

---
####4.そもそも複合要素を定義しない
上記の｢修正その1｣にはもう一つ問題点があります。
この列挙の定義は、AB、CDという複合フラグには対応していますが、
今後｢AC｣や｢BD｣、はたまた｢ABCD全部｣といった値が欲しくなった時、
再度このソースを修正しなければいけないということです。

こういった複合フラグについては、列挙の定義に含ませるのは、
汎用性を考えるとあまり好ましくないと思いますので、
どうしても、という理由がなければ、
下記のように変数に直接入れてしまうのが良いと思われます。

```csharp
//修正その2
[Flags]
enum Hoge{
  A = 1,
  B = 2,
  C = 4,
  D = 8
}

//使用するとき
var AB = Hoge.A | Hoge.B;
var CD = Hoge.C | Hoge.D;
var ABCD = Hoge.A | Hoge.B | Hoge.C | Hoge.D;
```

---
####列挙をビットフラグとして扱った時の強み
各要素の和が、複合要素の合計値と重複しない場合、
｢複合要素の値と1要素との論理積｣と、｢その1要素｣を比較することで、
複合要素内に、その要素が含まれているかを調べることができます。
これを利用し、下記のようなコードを書くことで、フラグの存在チェックを行うことができます。
アンチパターンにあるような定義の仕方だと、
｢要素の値を文字列化し、桁を区切って、文字位置を検索して…｣
といった処理が必要になり、非常に面倒です。

```csharp
//要素を持っているかを調べる
var ab = Hoge.AB;
var cd = Hoge.CD;

bool HasC;                      // Cの要素を保持しているか
HasC = (ab & Hoge.C) == Hoge.C;	// false
HasC = (cd & Hoge.C) == Hoge.C; // true
```

また、.net4からは、列挙にHasFlagというメソッドが追加されていますので、

```csharp
HasC = ab.HasFlag(Hoge.C);	// false
```
といった記述が可能になり、自前でメソッドを用意しなくてよくなっています。
Podfile でローカルディレクトリにある podspec を指定する

あるライブラリのオレオレ podspec を書いたがなんらかの理由で公開できない、または公開が面倒な場合は、 podspec をローカルに置いて Podfile から参照することができる：

```ruby
### ディレクトリ構成の例
# FooProject/
# Podfile
# Specs/
#   BarLib/
#     0.0.1/
#       BarLib.podspec
# Source Files...

### Podfile
pod 'BarLib', podspec: 'Specs/BarLib/0.0.1/BarLib.podspec'
```

`pod` メソッドの `:podspec` オプションに、ローカルの podspec のパス（絶対パスまたは Podfile からの相対パス）を指定すればいい。上記のディレクトリ構成は CocoaPods の標準に従っているが、このとおりでなくても構わない。
Railsでnewとbuildのちがい

例えばブログアプリケーションを作成するために以下のようなアソシエーションを作ったとする。

```
$ rails g scaffold post title:string body:text
$ rails g scaffold comment post:references body:text
```
Commentのコントローラーには所属するpostをインスタンス変数に呼び出す。
フィルタを使う。

```
class CommentsController < ApplicationController
  before_filter :load_post

  def load_post
    @post = Post.find(params[:post_id])
  end
```

ここでお馴染みの**newメソッド**でインスタンスを作成している

```
Comment.new
```

は

```
@post.comments.build
```
と**build**を使うと親モデルに対する外部参照キーを自動でセットできるらしい。
結構よく出てくるので覚えておく。
bytesプラグマ

bytes - 文字単位ではなくバイト単位の意味論を強制する Perl プラグマ - perldoc.jp http://perldoc.jp/docs/modules/bytes-1.03/bytes.pod

bytesプラグマをuseすると、useしたレキシカルスコープ内で、
いろいろなサブルーチンの挙動が変わるらしい。
おそらく一番使われるのが文字数のサイズを取得するlengthを、
バイトサイズを取得するためにbytes::lengthとしてつかことなんじゃないでしょうか。

```perl
use strict;
use warnings;
use utf8;
use 5.010;

say length "aaa";               # => 3
say length "あああ";            # => 3

{
    say length "aaa";           # => 3
    say length "あああ";        # => 3

    use bytes;
    say length "aaa";           # => 3
    say length "あああ";        # => 9
}

say length "aaa";               # => 3
say length "あああ";            # => 3
```
Railsのresourcesが親子関係にあるときのroutes.rbの書き方

Railsで簡単なブログアプリケーションを作っていたとする。
`posts`で記事のリソースを作り、`posts`に紐づくように`comments`のリソースが親子関係にあるとき。

##routes.rbの書き方

```
  resources :posts do
    resources :comments
  end
```

##rake routesで確認

```
post_comments GET    /posts/:post_id/comments(.:format)          comments#index
                  POST   /posts/:post_id/comments(.:format)          comments#create
new_post_comment GET    /posts/:post_id/comments/new(.:format)      comments#new
edit_post_comment GET    /posts/:post_id/comments/:id/edit(.:format) comments#edit
     post_comment GET    /posts/:post_id/comments/:id(.:format)      comments#show
                  PUT    /posts/:post_id/comments/:id(.:format)      comments#update
                  DELETE /posts/:post_id/comments/:id(.:format)      comments#destroy
（...後略...）
```

ネストされたリソースではURLパターンは「/posts/:post_id」、Urlヘルパーには「post_」という接頭辞が付与される。
GNU Source-highlightの結果をlvに渡すコマンドlvc


GNU Source-highlight便利ですよね。
まだ入れていない人は、[ここ](http://nippondanji.blogspot.jp/2011/11/less.html)とか参考にして入れると幸せになれると思います。
ちなみに、brewで入れる場合は[こちら](http://d.hatena.ne.jp/jitsu102/20111111/1320999134)が参考になります。
Cygwinでも入れられます。apt-cygとかで入れたら、findで/usr/binあたりをsrc-hilite-lesspipe.shを探してみてください。

で、普段使っているのはlessではなくlvなのですが、わざわざ``less file | lv -c``をやるのが面倒だったので、bashの関数作りました。
これを、.bash_profileあたりにでも登録すればいいと思います。

```bash:.bash_profile
function lvc() { if [ -f $1 ]; then less $1 | lv -c; fi;  }
```

使い方は、

```
 $ lvc source-name
```

でOK。ソース編集しなくてもいいけど、色つけて見たいという時におすすめ。
インデントによる構造のパース


http://hackage.haskell.org/package/indents-0.3.0 あるけど、こんな感じで十分では？ と、まだ深く考えてないけど思った。

```haskell:
module Main (main) where
import Text.Parsec
import Control.Monad

main :: IO ()
main = print $ parse block "" "  hoge\n  boo hoge\n    hahaha\n"

block :: Parsec String () [String]
block = do
  (Indent n) <- indent
  ls <- sepBy line (try (sameIndent n) <|> return ())
  return ls
  where
    sameIndent n = count n space >> notFollowedBy space >> return ()

line :: Parsec String () String
line = do 
  start   <- noneOf " \r\n"
  content <- many (noneOf "\r\n")
  (newline >> return ()) <|> eof
  return (start:content)

newtype Indent = Indent Int

indent :: Parsec String () Indent
indent = do
  str <- many space
  return . Indent . length $ str
```
CORESERVERでサーバー借りたらまずやるべきこと


よく忘れるのでメモ。

# 1. シェルをbashに変更

デフォルトのシェルは `/bin/rbash` になってるので、`/bin/bash`に変更する。まず`chsh`と撃つ。

	~> chsh
	Changing login shell for you.
	Password: 
	Enter the new value, or press return for the default.
        Login Shell [/bin/rbash]: /bin/bash
	Shell changed.

で、一旦シェルを再起動すれば`bash`が使える。

# 2. git をインストール

これを参考にgitをインストール。
[CORESERVERにgitをインストールする](http://qiita.com/items/8e533a9c168e269c4191)

ちなみに、サーバー開設してからすぐだと`meke`でエラーが出るかも。この場合はしばらく放置してからやり直そう。Naverまとめでも見ててください。`user block quota exceeded`エラーも同様。

	Q. サーバアカウントを新規登録しましたが、すぐに「Disk quota exceeded (ディスク容量超過)」になってしまいます。

	取得したばかりのサーバアカウントは、XREA+ や CORESERVER であっても、しばらくは 50 MB のディスク容量しか使用できません。およそ半日 ～ 1 日が経過すると本来の容量が使用できるようになりますので、取得したばかりの場合は、少し時間をおいてください。 
http://www.hayawakari.com/xrea/?FAQ%2FFTP



# 3. サーバー間コピー

必要であれば、前のサーバーからデータをコピーする。FTPの情報だけあれば一瞬でコピーが完了するので便利。
Perl 6 の for ループが lazy になった

Rakudo Star 2013.01 より [for ループがデフォルトで lazy な挙動をするようになった](http://rakudo.org/2013/01/30/rakudo-star-2013-01-released/)。これが何を意味するか正確には把握していないが、**ブロックの末尾にある for ループが LEAVE フェーズより後に実行される**ようになったことには注意が必要そうだ：

```perl
use v6;

sub f() {
    LEAVE { say 'leaving' }
    for 1..3 {
        say $_;
    }
}

f;
say 4;

# => leaving
# => 1
# => 2
# => 3
# => 4
```

当然ながら、 for ループの後に文が続く場合、ループは文より先に実行される：

```perl
use v6;

sub f() {
    LEAVE { say 'leaving' }
    for 1..3 {
        say $_;
    }
    say 'returning';
}

f;
say 4;

# => 1
# => 2
# => 3
# => returning
# => leaving
# => 4
```
manageSpaceActivityによるデータ管理

アプリ管理画面には、アプリデータを削除するためのボタン[データを消去]が用意されています。
開発者は[データを消去]ボタンが押された場合に、データの消去ではなく指定のActivityを起動するようカスタマイズすることができます。

```xml
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:manageSpaceActivity=".DataManagementActivity" >
```

参考：http://yuki312.blogspot.jp/2013/01/androidmanagespaceactivity.html

これを指定すると、[データを消去]ボタンが[容量を管理]ボタンに変更され、ボタン押下時に指定のActivityが起動されます。
net.socket()の再利用


Issueに上がっていたので自分で試したらいろいろ分かった。

###socketの再利用にはhandle(中身はpipe)の初期化に時間がかかる

これは[Issac](https://github.com/isaacs)が言ってた。確かにソースを見るとC++でのwrapがされてたから重たいのだろう。でも処理の重たさよりも重要なのが２つ目。

###単一のイベントループ上だとうまくreuseできない

理由がよく分からないけれど１つ目だとうまくいくけれど、２つ目だとうまくいかない

```うまくいくやつ
var net = require('net');

var socket = new net.Socket();

socket.on('close',function(){
	console.log('close');
	process.nextTick(function(){
		socket.connect(80, "www.google.com");
	});
});

socket.connect(80, "www.google.com");

socket.destroy();
```

```エラーがでるやつ
var net = require('net');

var socket = new net.Socket();

socket.on('close',function(){
	console.log('close');
	socket.connect(80, "www.google.com");
});

socket.connect(80, "www.google.com");

socket.destroy();
```

`process.nextTick`の部分は`setTimeout`にしてもうまく言ったので多分socketが一度閉じられてからconnectするまでの間をイベントループ上でずらす必要があるんじゃないかと考えた。

処理が重いから？
同じ形式で保存されている複数ファイルの中から、特定のキーのユニークな数を知りたい

以下の中から、idで保存されているものをとりだし、数える

```
a.txt
aaa:1 bbb:2 id:3 ddd:4
aaa:5 bbb:6 id:7 ddd:8
aaa:9 bbb:10 id:11 ddd:12
aaa:13 bbb:14 id:15 ddd:16

b.txt
aaa:17 bbb:18 id:19 ddd:20
aaa:21 bbb:22 id:23 ddd:24
aaa:25 bbb:26 id:27 ddd:28
aaa:29 bbb:30 id:15 ddd:16

c.txt
aaa:29 bbb:30 id:15 ddd:16
```

こんな感じで保存されている場合、以下のコマンドを実行すると

```
user:~$ grep id *.txt | awk -F ' ' '{print $3}' | sort | uniq | wc -l
7
```

数は9件だけど、uniqで絞ってるので、7件になる
Rails 3のURLに小数点を含める方法


緯度/経度/海抜高度でリソースを取得したいので、URLにこんな感じで小数点を含めたい

```URL
/satellites/33.2095213/129.7922366/10.3
```

そのまま取ろうとしてもピリオドが邪魔してRouting Errorになる。
こんなときはconstraintsを指定すれば取得できる。

```config/routes.rb
DECIMAL_PATTERN = /.*/
get 'satellites/:latitude/:longitude/:elevation' => 'satellites#position', :constraints => { :latitude => DECIMAL_PATTERN, :longitude => DECIMAL_PATTERN, :elevation => DECIMAL_PATTERN }
```
koalaを使って写真のタグ付けを行う

koalaでは写真のアップロードはあってもタグ付けは用意されていません。
なので 

`put_object`

メソッドを使います。

流れとしては、
写真を投稿する -> 投稿した写真のIDを使ってタグ付けする

という流れになります。

``` ruby
graph = Koala::Facebook::API.new(access_token)
result = graph.put_picture("sample.jpg", {:message => "めっせーじ"} )

params = {
  :to => my_friend_id,
  :x  => tags_x,
  :y  => tags_y
}

tags_result = graph.put_object(result["id"], "tags", params)
```

`put_obejtect` メソッド を使えば koalaで標準で用意されているメソッド以外にも
拡張してfacebookのGraph API を使うことができます。
[Python2]日付文字列→UnixTime→日付文字列

```python
# Python2
import datetime, time

base_data = "Feb 27 00:51:29 2021 GMT"
date_time = time.strptime(base_data, "%b %d %H:%M:%S %Y GMT")
unix_time = int(time.mktime(date_time))
gen_based = datetime.datetime.fromtimestamp(unix_time).strftime("%b %d %H:%M:%S %Y GMT")

# >>> print base_data
# Feb 27 00:51:29 2021 GMT
# >>> print date_time
# time.struct_time(tm_year=2021, tm_mon=2, tm_mday=27, tm_hour=0, tm_min=51, tm_sec=29, tm_wday=5, tm_yday=58, tm_isdst=-1)
# >>> print unix_time
# 1614354689
# >>> print gen_based
# Feb 27 00:51:29 2021 GMT

# >>> base_data == gen_based
# True
```