OmniAICreator/Qiita-1.07M huggingface dataset:
localStorageのstorageイベントのタイプ判定

`localStorage`には`storage`というイベントがあり，`localStorage`に変更があった場合に発火します

この`storage`イベントは`localStorage`を変更したドキュメント以外の，同じ`localStorage`を共有している`window`(タブ)で発火します。

変更を加えたドキュメント内では何も起きません。

`storage`イベントの`event`オブジェクトのプロパティには`localStorage`にどんな変更を加えたかの情報がないので，プロパティの値から判定する必要があります。（あるよね？）



## storageイベントが発火するタイミング

`storage`イベントは`localStorage`に変更が加えられたときにだけ発火します。変更がない場合には発火しません。


### 実行するメソッドと状況によるイベント発火の有無

| メソッド | 状況 | タイプ | イベント発火 |
|:----------|:---------|:----------:|:-----------:|
| .getItem(key) | すべて | 取得 | ☓ |
| .setItem(key, value) | keyが存在しない場合 | 追加 | ○ |
| | keyが存在してて既存のvalueとsetするvalueが違う | 更新 | ○ |  
| | keyが存在してて既存のvalueとsetするvalueが同じ | --- | ☓ |
| .removeItem(key) | keyが存在している | 削除 | ○ |
| | keyが存在しない | --- | ☓ | 
| .clear() | localStorage内にkeyが1つ以上存在している | 全削除 | ○ | 
| | localStorage内にkeyが1つも存在しない | --- | ☓  |

`.getItem()`ではあらゆる状況で発火しません。

`.setItem()`も`key`がすでに存在してる&&setする`value`が一緒の場合は発火しません。

`.removeItem()`は削除しようとした`key`が存在しない場合発火はしません。

`.clear()`は`localStorage`に値が1つも入っていない場合は発火しません。


### 各タイプの`event`オブジェクトのプロパティの値

それぞれのタイプごとのeventオブジェクト内の主要な(判定に使う)プロパティは以下のようになります。

| タイプ | key | oldValue | newValue |
|:------|:------|:------|:------|:------|
| 追加 | key | null | value |
| 更新 | key | oldValue | value |
| 削除 | key | oldValue | null |
| 全削除 | "" | null | null |

## タイプを判定する

基本的には`oldValue`と`newValue`の値のチェックで判定できます。

`clear`の判定には念のため`storageArea`の要素数をチェックしています。

```html:receiveStorageEvent.html
<h1>receiveStorageEvent</h1>
<script src="./detectStorageEventType.js"></script>
```

```js:detectStorageEventType.js
window.addEventListener("storage", function (event) {

	var oldValue = event.oldValue;
	var newValue = event.newValue;
	var storageArea = event.storageArea;

	/* console.log(event) */

	if( oldValue === null && newValue !== null){

		console.log( "type : add" );

	}else if( oldValue !== null && newValue === null){

		console.log( "type : remove" );

	}else if( oldValue !== null && newValue !== null){

		console.log( "type : update" );

	}else if( oldValue === null && newValue === null && storageArea.length === 0){

		console.log( "type : clear" );

	}
});

```



```html:sendStorageEvent.html
<h1>sendStorageEvent</h1>

<button id="set">set</button>
<button id="update">update</button>
<button id="get">get</button>
<button id="remove">remove</button>
<button id="clear">clear</button>

<script>
document.addEventListener( "DOMContentLoaded", function(){

	document.getElementById( "set" ).addEventListener( "click", function(){
		localStorage.setItem( "hoge", "setitem" );
	});

	document.getElementById( 'update').addEventListener( "click", function(){
		localStorage.setItem( "hoge", "update" );
	});

	document.getElementById( "get" ).addEventListener( "click", function(){
		localStorage.getItem( "hoge" );
	});

	document.getElementById( "remove" ).addEventListener( "click", function(){
		localStorage.removeItem( "hoge" );
	});

	document.getElementById( "clear" ).addEventListener( "click", function(){
		localStorage.clear();
	});
});
</script>

```

### つかいかた

同じブラウザで2つのHTMLファイルを開きます。

`sendStorageEvent.html`で`localStorage`の値を操作すると`receiveStorageEvent.html`のコンソールに各タイプの判定結果が出力されます。
Sass内で使っている画像がprecompileされない


Railsを使って開発しているときに、Sass内の `background-image` などで画像を参照している場合、
`rake assets:precompile`時にその画像が`public/`以下に生成されず、production環境で画像がなくなる、ということがあって困っていました。

そんなときに、`sass-rails`が`image-url`というhelperを提供していることを知りました。

```
// これを
background-image: url('/assets/logo.png')

// こうする
background-image: image-url('logo.png')

// data-urlとして埋め込みたい場合は
// こうする
background-image: asset-data-url("logo.png")

```

こうすることで`precompile`時に自動的に`public/`以下に画像を生成してくれてハッピーになれます。


なぜ知らなかった俺…
rails newでturbolinksとasset pipelineをオフにして生成する

https://github.com/hnakamur/rails-app-templates
にテンプレートと.railsrcがあります。

以下の設定をします。

- gitレポジトリ作成
- ./vendor/bundleにbundle install実行
- asset pipelineをオフにする
- turbolinksをオフにする
- mysql2 gemを追加
- rspecを使用

適宜カスタマイズしてご利用ください。

## セットアップ

git cloneしたらrailsrcを~/.railsrcにコピーして、-mオプションのパスを適宜変更します。

## 参考URL

下記のページを参考にしました。ありがとうございます！

- [Ruby - Rails 4 で turbolinks をオフにする方法 - Qiita \[キータ\]](http://qiita.com/kazz187/items/12737363d62b9c91993c)
- [rails newの-mオプションを使うと捗る - Qiita \[キータ\]](http://qiita.com/yuku_t/items/9e928f2ff21e93e5ac43)
- [The Asset Pipeline — Ruby on Rails Guides](http://guides.rubyonrails.org/asset_pipeline.html)
- [A startup template for Ruby on Rails 4 applications - The Changelog](http://thechangelog.com/a-startup-template-for-ruby-on-rails-4-applications/?utm_source=feedly)
javascriptで手っ取り早くPinterest風レイアウトを実現する

 ウィンドウサイズに応じて動的にいろいろ動かすってところまで対応するのはめんどくさそうだったので、レイアウトを組み立てるところまでのまとめ。

# 前提条件

* 並べる時は絶対配置で並べる (本家Pinterestも絶対配置)
* ウィンドウサイズをリサイズしてもカラム数は変わらない

# 参考サイト

http://www.atmarkit.co.jp/ait/articles/1306/10/news009.html

# レイアウトを組み立てる考え方

基本的には参考サイトに書いてあるとおり。

1. 配列を一つ用意し、カラム数分の要素を作る。
1. 配列の中の要素は各カラムの高さ(endY)の数値を持つ。
1. 新たに要素を並べる時には、配列の中から高さ(endY)が一番小さいカラムに対して並べる。
1. 配列の中の要素を、新たに並べたカラムの高さ(endY)に更新する。

※3と4を繰り返す

# 実装してみる

```js
function PinterestListView(listId) {

    var COLUMN = 4, // カラム数
        MARGIN = 15, // アイテムの上下マージン
        WIDTH  = 100, // アイテムのwidth
        columns  = [], // カラムごとの現在のendY値を格納する配列
        list = document.getElementById(listId); // アイテムを並べるbox

    /**
     * 次に追加するUnitのXY座標を返す
     */
    function getPosition() {
        var len = columns.length;
        
        if (len < COLUMN) {
            return {
                x: len * WIDTH + (len * 2 * MARGIN),
                y: 0
            }
        } 
        
        var minIndex = columns.indexOf(Math.min.apply(null, columns));
        return {
            x: minIndex * WIDTH + (minIndex * 2 * MARGIN),
            y: columns[minIndex]
        }
    }

    /**
     * 高さの最大値を取得
     */
    function getMaxHeight() {
        return Math.max.apply(null, columns);
    }

    /**
     * 追加したアイテムのendY値を上書きする
     */
    function pushUnit(height) {
        var len = columns.length;
        
        if (len < COLUMN) {
            return columns.push(height + (MARGIN * 2));
        }

        var minIndex = columns.indexOf(Math.min.apply(null, columns));
        return columns[minIndex] += height + (MARGIN * 2);
    }

    /**
     * アイテムを並べる
     */
    function layout(items) {
        for (var i = 0; i < items.length; ++i) {
            var item      = items[i],
                  position = getPosition();

            // 位置をセット
            item.style.top = position.y + 'px';
            item.style.left = position.x + 'px';

            // アイテムをHTMLに追加
            list.appendChild(item);

            // 追加したアイテムのendY値を配列に反映
            pushUnit(item.offsetHeight);

            // 現在のリストのheightをセット
            list.style.height = getMaxHeight() + 'px';
        }

        return list;
    }

    /*-------------------------------------------
      EXPORT
      -------------------------------------------*/
    return {
        layout: layout
    };
}
```

実際に動かしているサンプルはこちら。
http://jsdo.it/tanihiro/b5kyw

# 注意点

一箇所、indexOfを使用している箇所があるので、IEだとエラーが出てしまう。
【忘れがち】iPhone開発でTestflightを使う

＜開発者が、TestFlightで＞
・TestFlightのアカウントを作成
・Invitationより、テスターにメールを送信
　※端末ID（UID）を登録したいiPhone端末のメールアドレスに送ること

＜テスターが、iPhoneで＞
・受信したメールに従い、ユーザ登録
・デバイスを登録

＜開発者が、TestFlightで＞
・登録されたデバイスのUUIDをエクスポート

＜開発者が、AppDevCenterで＞
・Deviceで上記のUUIDファイルを、アップロードしてDeviceを追加
・ProvisioningFileに、デバイスを登録


＜開発者が、XCodeで＞
・Organizerより新しくしたProvisioningFileを更新
・スキームAdHocを作成し、CodeIdentityで上記ProvisioningFileを紐付け
・Archiveして、ipaファイルを作成

＜開発者が、TestFlightで＞
・Dashboardより、ipaファイルをアップロード
・AppのPermissionより、テスターにチェックを入れて、Updateをする
・Activityより、Email sentを確認

＜テスターが、iPhoneで＞
・受信したメールに従い、アプリをインストール


＜＜トラブルシューティング＞＞
・編集中。。。。。
BitNami Redmineでプラグインのインストール/アンインストール手順

# 環境

Windows XP
BitNami Redmine Stack 2.3.0-0

※C:\直下にインストール

# インストール

### 1.解凍したプラグインを設置

```
C:\BitNami\redmine-2.3.0-0\apps\redmine\htdocs\plugins
```

### 2.コマンドプロンプト「Use BitNami Redmine Stack」を起動

```
cd C:\BitNami\redmine-2.3.0-0\apps\redmine\htdocs
bundle install --without development test postgresql sqlite xapian
rake redmine:plugins:migrate RAILS_ENV=production
```

### 3.ツール「redmine manager tool」でRedmineを再起動

### 4.コマンドプロンプト「Use BitNami Redmine Stack」

```
rake tmp:cache:clear
rake tmp:sessions:clear
```


# アンインストール

### 1.コマンドプロンプト「Use BitNami Redmine Stack」を起動

```
cd C:\BitNami\redmine-2.3.0-0\apps\redmine\htdocs
rake db:migrate_plugins NAME=【プラグイン名】 VERSION=0 RAILS_ENV=production
```
memo: cuiのvimで、csapproxを使いつつリローダブルなvimrcにする方法

* 使用しているcolorschemeはgui用の色設定しかしない
* csapproxを使っている
* vimrcの再読み込み時、色設定がおかしくなる

詳しい原因まで追ってないけど、`so ~/.vimrc`するとcui用の色設定がおかしくなる。
`redir > log`と`highlight`で設定されてる色情報を、`so ~/.vimrc`の前後で出力して`diff -u`してみたら、
csapproxが設定するはずのcui用の設定がすべて失われてるのが原因だった。

じゃあ、強制的にcsapproxに仕事させるか、colorschemeのsnapshot取っておいてそいつを指定すればいい。
vimrcに次のどっちかを設定する。

```vim:append_to_your_vimrc
" 強制的に仕事させる
CSApprox!

" snapshot取る
CSApproxSnapshot ~/.vim/colors/snapshot_{colorscheme-name}.vim
colorscheme snapshot_{colorscheme-name}
```
[Ansible] yumモジュールにはパッケージ名以外にファイル名、URL、グループを指定できます

Ansibleのyumモジュールのnameパラメータには以下のものが指定できます。

- パッケージ名
    - 例: yum: name=nginx state=latest
- バージョン付きのパッケージ名
    - 例: yum: name=nginx-1.4.2 state=latest
- rpmのURL
    - 例: yum: name=http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present
- rpmのファイル名
    - 例: yum: name=/usr/local/src/nginx-release-centos-6-0.el6.ngx.noarch.rpm state=present
- グループ名 (@ + グループ名)
    - 例: yum: name="@Development tools" state=present
- * (state=latestと組み合わせて全パッケージをアップデートする指定)
    - 例: yum: name=* state=latest

詳しくは[yumモジュールのドキュメント](http://docs.ansible.com/yum_module.html)を参照してください。
iOS/Android アプリのアイコンつくるなら Makeappicon がべんり

iOS と Android アプリのアイコンは、端末に合わせていろんなサイズのものを作らないといけなくて大変です。
どんなサイズの画像を作るんだっけかなーと調べてたら、1枚画像をアップロードするだけで全部作ってくれるサービスがありました。

 http://makeappicon.com/

べんりだなー
コマンドラインからgnuplotへのワンライナー


最近、ネタが無いので、消化試合ですｗ

* 基本形

```sh
echo "pl 'hoge.dat'" | gnuplot
```

* 二つもいける

```sh
echo "pl 'hoge.dat', sin(x)" | gnuplot
```

* 複数行もいける

```sh
echo "set title 'the degree of ahoo'; pl 'hoge.dat'" | gnuplot
```

* 当然、eps出力＋表示もお手のもの

```sh
echo "set term post enha eps color; set output 'hoge.eps'; set title 'the degree of ahoo'; pl 'hoge.dat'" | gnuplot && open hoge.eps
```

まあ、読んでくれた人にとって、シェルとgnuplotの勉強になればいいか。
「連想げーむ」アプリを公開しました＆使用した技術紹介

iPhoneアプリを作れるようになったので、試しに自分で作ってリリースしてみました！
作ったものは「連想げーむ」という皆でマジカルバナナをするシンプルなアプリです。

![rensou.png](https://qiita-image-store.s3.amazonaws.com/0/17755/cfb3d80a-59f8-ee39-69e9-fe30db92d929.png "rensou.png")


[ダウンロードはこちらから！](https://itunes.apple.com/jp/app/minnade-jigeyou!sosharu-lian/id668351056?mt=8&uo=4)

アプリの詳細や開発の経緯などは、[個人ブログの方に書いた](http://u1fukui.hateblo.jp/entry/2013/08/31/150918)のでそちらをどうぞ。
ここでは、技術的な事をメモしとこうかと思います。


##コード
アプリ側：[u1fukui/rensou-ios](https://github.com/u1fukui/rensou-ios)
サーバ側：[u1fukui/rensou-server](https://github.com/u1fukui/rensou-server)

シンプルなアプリなので初心者の方の参考になればと思いましたが、サーバ側も用意しないといけないのでちょい面倒ですね…( ´Д`)
でもサーバを使うアプリの参考にはなるかと思います！

###技術的な特徴
- UINavigationControllerとUITableViewを使用したシンプルなアプリ
- StoryBoardを使用していない
- サーバとの通信処理がある


##使用したライブラリ、ツール、フレームワーク

###アプリ
- XCode
- CocoaPods (ライブラリ管理。[参考](https://github.com/mixi-inc/iOSTraining/wiki/10.2-CocoaPods))
- MKNetworkKit (通信処理。[参考](http://odoruinu.net/blog/mknetworkkit/))
- SVProgressHUD (通信中のプログレス表示。[参考](http://dev.classmethod.jp/smartphone/ios-loading-svprogresshud/))
- Flurry Analytics (行動解析。[参考](http://qiita.com/p_chin/items/34ea38c41d7fb220883a))
- Crashlytics (バグレポート。[参考](http://d.hatena.ne.jp/ntaku/20120904/1346724448))
- TestFlight (開発版アプリの配信。[参考](http://onthehammock.com/blog/2091))
- appledoc (ドキュメント生成。[参考](http://dev.classmethod.jp/smartphone/iphone/ios-appledoc-1/))
- GHUnit (テスト。[参考](https://github.com/mixi-inc/iOSTraining/wiki/11.2-GHUnit%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88))
- Jenkins (CIツール。[参考]())

気になっていたツールをひと通り試しました。
どれも定番のものだと思うので、使った事がないものがあれば一度使ってみる事をオススメします！

###サーバ
- Sinatra (Rubyで作りたかったので使用)
- Apache (既に使用していたので使用)
- Passenger (Apache上でSinatraアプリを動かすのに使う)
- Capistrano (デプロイツール。[参考](http://shusatoo.net/programming/ruby/ruby-beginner-capistrano-deploy/))

サーバ側は最低限の事しか出来てないです…。
Sinatraまだ分からない部分多いですが、簡単にサーバ側作れて素晴らしかった！

##感想
やはり簡単なアプリでも、ひと通り公開する所まで体験してみると理解が深まって良いです！業務ではないので、色々気軽に試せますしねー。リジェクトも怖くないｗ

また、気になってたけど使う機会がなかった技術を使う事が出来たのも良かったです！テストとかJenkinsとかまだ仕組み作っただけですけどねー。これからちゃんと中身充実させていきます。
あとCapistrano超便利でした！感動…。(*´Д`)


というわけで、簡単なものでもいいのでアプリ公開してみるといいよ！という話でした！！
IEはanchorタグのpathnameとlocationのpathnameで違う値を返す

IE で anchor タグの pathname プロパティを取得すると、先頭のスラッシュ（`/`）が無い。

URL が `http://hoge.com/fuga/piyo` の場合、

Firefox と Chrome は anchor も location も pathname プロパティは `/fuga/piyo` を返す。
IE の場合は anchor の pathname が `fuga/piyo` を返し、 location の pathname が `/fuga/piyo` を返す。

area タグの pathname プロパティも anchor タグと同じで、 IE の場合は先頭のスラッシュが無い。

サンプル
http://jsfiddle.net/opengl_8080/UsXyh/

#参考
+ [Location pathname Property](http://www.w3schools.com/jsref/prop_loc_pathname.asp)
+ [HTML DOM Area pathname Property](http://www.w3schools.com/jsref/prop_area_pathname.asp)
[Go] ネストしたmapをJSON出力するサンプル

```go
package main

import (
    "encoding/json"
    "os"
)

func main() {
    data := map[string]interface{} {
        "foo": "1",
        "bar": map[string]string{"hoge": "2"},
        "baz": []string{"a", "b"},
    }

    err := json.NewEncoder(os.Stdout).Encode(data)
    if err != nil {
        panic(err)
    }
}
```

実行結果

```
{"bar":{"hoge":"2"},"baz":["a","b"],"foo":"1"}
```

http://play.golang.org/p/b8Ov9AEoHC で試せます。
Gmailの件名をtwitterに投稿

はい、仕事中にメールは外部に・自由な宛先に送ってもセフセフだけどtwitterアクセスは出来ない、という環境を想定しております。
メールはtweet後に自動で削除されます。連動している証拠隠滅と重複して投稿しようとすることを防止する目的です。
はい、自宅なりレンタルなりで何処かに設置して定期的に動作させる必要があります。
[http://symfoware.blog68.fc2.com/blog-entry-891.html](http://symfoware.blog68.fc2.com/blog-entry-891.html)
Gmailの件名取得につきましては全面的にお世話になっております。というかコピペです。件名取得以外の要素をなるべく削り、投稿機能を付け足してメールを削除させるようにしただけです。全面的にお世話になりました。

```python:gmail_twitter.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import imaplib, email, email.Header
import sys
from urllib import urlencode

#私が独自にOauth認証のトークン入れているものです。
#別にしておかないと事故で公開が怖いのです。
import oat
"""
Gmail取得については全面的に
http://symfoware.blog68.fc2.com/blog-entry-891.html
より頂いております。
"""
class imap4mail(object):


    def __init__(self, data):
        """
        コンストラクタで与えられたメールデータの解析を実行する
        """
        self.files = {}

        #メッセージをパース
        msg = email.message_from_string(data)
        #タイトル取得
        self.title = self.decode(msg.get('Subject'))


    def decode(self, dec_target):

        """
        メールタイトル、送信者のデコード
        """
        decodefrag = email.Header.decode_header(dec_target)
        title = ''

        for frag, enc in decodefrag:
            if enc:
                title += unicode(frag, enc)
            else:
                title += unicode(frag)
        return title


def analize_mail(mail):

    #取得したメールの件名を投稿
    oat.client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST', urlencode({'status': mail.title.encode('utf-8')}))

if __name__ == "__main__":

    host = 'imap.gmail.com'
    user = 'example@gmail.com'
    password = 'password'
    mailbox = 'INBOX'

    #メールサーバ指定
    M = imaplib.IMAP4_SSL(host=host)
    #ログイン
    M.login(user, password)

    #メールボックス選択
    M.select(mailbox)

    typ, data = M.search(None, 'ALL')
    for num in data[0].split():
        typ, data = M.fetch(num, '(RFC822)')
        mail = imap4mail(data[0][1])
# twitterに投稿
        analize_mail(mail)
# 投稿後はメールを削除
        M.store(num, '+FLAGS', '\\Deleted')
    M.expunge()
    M.close()
    M.logout()
```

はい、コメントなども殆どそのままコピーです。私なんかがコメント変えたらアレですし。
UbuntuでCtrl-f で xterm が起動して大変ウザい

何もしてないのに(絶対何かしてる) いつのまにか Ubuntuで Ctrl+f を押すと xterm が起動するようになってた。
非常に鬱陶しいので xterm を起動しないようにしたい。

## 設定方法

1 `$ vi ~/.xbindkeysrc`
2. 全てコメントアウト 
3. `$ killall -HUP xbindkeys`

## 参考

shortcut keys - After upgrading to 11.10, when pressing Ctrl+F, Xterm is popping up - Ask Ubuntu
http://askubuntu.com/questions/66456/after-upgrading-to-11-10-when-pressing-ctrlf-xterm-is-popping-up
Windows上でLinux環境を利用しても重くならないようにするために

Windows上でCUIでLinuxを使用する方法です。

VMwareにLinuxをインストール(CUIでインストールとかある場合はそっちでインストール)

CUIで起動できるようにする。
(Ubuntuの場合はここを参考：http://jlinuxer.dip.jp/?p=703)

Linuxにssh-serverをインストール

WindowsにPuTTYをインストールしてVMのLinuxに接続する

PuTTY Connection Manager(PuTTY)をインストールして使うと下記のメリットがある。
・タブ切り替えができる
・コネクションを保存することができる。
・こまんどのコピペができる。

もっと良いやり方知ってるよって方は是非ご教授ください。
CentosとUbuntuのユーザーIDを合わせてみる

Centosでのuid・・・500
Ubuntuでのuid・・・1000

Ubuntu側のuidを500にする場合、以下の手順が良い。

```bash:
$ sudo vim /etc/passwd
$ sudo vim /etc/group
$ sudo chown -R username:username /home/username
```
「Y字路巡り」をjavascriptで解く

どう書くの問題面白いですね。

http://nabetani.sakura.ne.jp/hena/ord3ynode/

PHPものは既にあったのでjsでやってみました。
ちょっと時間がかかってしまったかな。

解決方法ですが、
rootは時計回りでルートを列挙します
どこから来たのかをposで記録し、handleに従ってnext,posを計算するのを
繰り返しています

```js:y-root.js
var root = {
    A: ['D', 'C', 'B']
  , B: ['A', 'C', 'E']
  , C: ['A', 'F', 'B']
  , D: ['A', 'E', 'F']
  , E: ['B', 'F', 'D']
  , F: ['C', 'D', 'E']
};

var test = function (input, output) {
    'use strict';
    var handle= {b: 0, r: -1, l: 1}
      , now   = 'A'
      , pos   = 2
      , next
      , result= input.split('')
                .map(function(x) {return handle[x]; })
                .reduce(function (x, y) {
                    next = root[now][(pos + y + 3) % 3];
                    pos  = root[next].indexOf(now);
                    now  = next;
                    return x + next;
                }, now);

    console.log(result === output);
};

var data = [
/*0*/ ["b", "AB" ],
/*1*/ ["l", "AD" ],
/*2*/ ["r", "AC" ],
/*3*/ ["bbb", "ABAB" ],
/*4*/ ["rrr", "ACBA" ],
/*5*/ ["blll", "ABCAB" ],
/*6*/ ["llll", "ADEBA" ],
/*7*/ ["rbrl", "ACADE" ],
/*8*/ ["brrrr", "ABEDAB" ],
/*9*/ ["llrrr", "ADEFDE" ],
/*10*/ ["lrlll", "ADFEDF" ],
/*11*/ ["lrrrr", "ADFCAD" ],
/*12*/ ["rllll", "ACFDAC" ],
/*13*/ ["blrrrr", "ABCFEBC" ],
/*14*/ ["brllll", "ABEFCBE" ],
/*15*/ ["bbrllrrr", "ABACFDEFD" ],
/*16*/ ["rrrrblll", "ACBACABCA" ],
/*17*/ ["llrlrrbrb", "ADEFCADABA" ],
/*18*/ ["rrrbrllrr", "ACBABEFCAD" ],
/*19*/ ["llrllblrll", "ADEFCBCADEB" ],
/*20*/ ["lrrlllrbrl", "ADFCBEFDFCB" ],
/*21*/ ["lllrbrrlbrl", "ADEBCBACFCAB" ],
/*22*/ ["rrrrrrlrbrl", "ACBACBADFDEB" ],
/*23*/ ["lbrbbrbrbbrr", "ADABABEBCBCFE" ],
/*24*/ ["rrrrlbrblllr", "ACBACFCACFDAB" ],
/*25*/ ["lbbrblrlrlbll", "ADADFDABCFDFED" ],
/*26*/ ["rrbbrlrlrblrl", "ACBCBADFEBEFDA" ],
/*27*/ ["blrllblbrrrrll", "ABCFDADEDABEDFE" ],
/*28*/ ["blrllrlbllrrbr", "ABCFDABCBEFDEDA" ],
/*29*/ ["lbrbbrllllrblrr", "ADABABEFCBEDEBCF" ],
/*30*/ ["rrrrbllrlrbrbrr", "ACBACABCFDEDADFC" ]
];

data.forEach(function (item) {
    test (item[0], item[1]);
});


```

時間はロジックを思いつくまで10分くらい
コードはテスト込みで30分くらいでした。

(追記)
問題のリンク張り忘れを追加しました

(変更)
タイトルを変更しました。時間追加。
rubyで高階関数が思うようにいかないんじゃよ。。。

最近rubyに可能性を感じ
--lambdaの中にifとか滅茶苦茶突っ込めるのって面白いんじゃないか!?--
pythonから改宗中。。。

調べ方が悪いのか、関数を引数に渡したいのだが上手いこといかない。
( ブロックを渡すというのはヒットする。違う、関数を渡したいんだ！！！ )

```rb
def quick_sort( seq )
    # do quick sort
end

# 引数にとった関数の実行時間を計測
def measure_time( seq, func )
    t0 = Time.now
    func.call( seq )
    t1 = Time.now
    p "#{t0 - t0} sec"
end

list = [3,2,1]
# レッツゴー
measure_time( list, quick_sort  )
# in `quick_sort': wrong number of arguments (0 for 1) (ArgumentError)
```
引数が足りないって。。。orz
す、全てが、、、

```

/　　　//　　　/　　　//　　　 ______　　　　　/　　　//　　　/
　/　// 　 /| 　 r'7＼　,.ﾍ‐'"´iヾ､／＼ﾆ''ｰ- ､.,　　 /　　　　/
　　/ 　 ／　|　 |::|ｧ'⌒',ヽ:::ヽrﾍ_,,.!-‐-'､二7-ｧ'´|､__
`'ｰ-‐''"　　 ヽ､_'´　　`|　|:::::|'"　　　　　　　二.,_> ,.へ_
　　　　　　　　 /　 ／/__/／　/ ／　／　 　　 　`ヽ7::/
　か　っ　す　 |　 ／　/／　メ,/_,,. /./　/| 　 i　　　Y　　　//
　ァ　 て　べ.　 |'´/ ∠. -‐'ｧ'"´'`iヽ./／ ﾒ､,_ﾊ　 ,　 |〉
　 |　 約　て　 ヽ! Ｏ .|/。〈ﾊ､　rﾘ　'´ 　 ,ｧ=;､`| ,ﾊ　|､　　/
　 |　 束　が　　　>　　o　 ゜,,´￣　　　. 　ﾄ i 〉.ﾚ'i　iヽ|ヽ､.,____
　 | 　し　 オ　　/　　 ハ |　u 　 ,.--- ､ 　`' ゜o Ｏ/､.,___,,..-‐'"´
　 |　 た　 ブ　 |　　/ 　ハ, 　 /　　　　〉　"从　 ヽ!　　/
　 |　 じ　 ジ 　|,.イ,.!-‐'-'､,ﾍ. !､_ 　 _,/　,.ｲﾍ. `　　ヽ.
　ッ　.ゃ　.ェ 　 |／　　　　 ヽ!7＞ｒｧ''7´|　/　',　 〉`ヽ〉
　! !　な 　ク　　 .',　　　　　　`Y_,/､レ'ﾍ/ﾚ'　　ﾚ'
　　　い 　.ト　 　 ヽ､_　　　　　!:::::ﾊiヽ.　　　//　　 /
　　　で 　 だ　　　.／‐r'､.,_,.イ＼/_」ヽ ', 　　　　　 /　 /
　　　す　 　　　　/　　　 `/:::::::/　/,」:::iﾝ､ /　　　 /
　　　　 　　　　 〈　 ,,..-‐''"´￣￣77ｰ--､_＼.,__　　/
　　　　　　,.:'⌒ヽ ´ 　 　　　　　 | |　 , i |ﾉ　　 `ヾr-､
```
(全てを棚に上げてのヤケクソ)

ちなみにpythonだとこう書ける。

```py
def quick_sort( seq ):
    # do quick sort
    return

def measure_time( func, seq ):
    import time
    start = time.clock()
    func( seq )
    end = time.clock()
    print str( end-start )

list=[3,2,1]
measure_time( quick_sort, list )
```

ううむ。
[Go] seelogでコンソールは色つきでファイルにもltsvでログ出力するサンプル

## seelogについて

Goのログ出力ライブラリはいくつかありますが、[cihub/seelog](https://github.com/cihub/seelog)がよく使われているとStackoverflowで読みました。

[ドキュメント](https://github.com/cihub/seelog/wiki)を見るとかなり高機能です。

- [フォーマット](https://github.com/cihub/seelog/wiki/Formatting)
    - 複数のフォーマットを定義して、ディスパッチャーやログレベル別に選択可能
- [ディスパッチャー](https://github.com/cihub/seelog/wiki/Dispatcher-reference)
    - 複数の出力先や、ログレベルによるフィルタリングをサポート
- [出力先](https://github.com/cihub/seelog/wiki/Receiver-reference)
    - ファイル、コンソール、ファイル・ローテーション、ファイル・バッファリング、SMTP、ネットワーク通信

また[ロガーのタイプ](https://github.com/cihub/seelog/wiki/Logger-types)には同期と非同期があり、[パフォーマンス](https://github.com/cihub/seelog/wiki/Performance)が重要な場合は非同期を使うのが良いそうです。

## サンプルプログラム

- LTSV形式
- 時刻はミリ秒まで出力
- コンソールはログレベルtrace, debug, infoは黒色で、warn, error, criticalは赤色で出力
- ファイルにも出力

```go
package main

import (
    log "github.com/cihub/seelog"
)

func configLogger() {
    config := `
<seelog type="sync">
    <outputs>
        <filter levels="trace,debug,info">
            <console formatid="ltsv"/>
        </filter>
        <filter levels="warn,error,critical">
            <console formatid="ltsv_error"/>
        </filter>
        <file formatid="ltsv" path="result.log"/>
    </outputs>
    <formats>
        <format id="ltsv" format="time:%Date(2006-01-02T15:04:05.000Z07:00)%tlev:%l%tmsg:%Msg%n"/>
        <format id="ltsv_error"
            format="%EscM(31)time:%Date(2006-01-02T15:04:05.000Z07:00)%tlev:%l%tmsg:%Msg%EscM(0)%n"/>
    </formats>
</seelog>`

    logger, err := log.LoggerFromConfigAsBytes([]byte(config))
    if err != nil {
        panic(err)
    }
    log.ReplaceLogger(logger)
}

func main() {
    configLogger()

    defer log.Flush()
    log.Info("Hello from Seelog!")
    log.Error("Error occurred!")
}
```

出力例

```
time:2013-09-11T21:46:42.260+09:00	lev:i	msg:Hello from Seelog!
time:2013-09-11T21:46:42.260+09:00	lev:e	msg:Error occurred!
```

コンソールでは2行目は赤色になります。
mac OSX で sedを使ってtabの文字列を置換

MacOSX上でsedを利用して、tab文字の置換をやろうとして、つまづいたのでメモ。

```
sed -e 's/\t/\"\t\"/g' 20130911.tsv >> 20130911_2.tsv
```
とかしてみたけど、全然効かず。
いろいろやってみて効いた方法が

```
sed -e 's/<C-v><tab>/\"<C-v><tab>\"/g' 20130911.tsv >> 20130911_2.tsv
```

　C-v → Ctr-v
　tab  → 普通にTABキー

これで実行したら出来た。
MacOS上だけなのかなー。
find の -exec optionの末尾につく \; と + の違い。

Emacsの `find-grep` で出てくるコマンド `find . -type f -exec grep -nH -e  {} +` の最後の + を見たことなかったのでStack Overflowで質問してみました。

まず「お前はちゃんと man を読め。」と怒られましたが、わかりやすいサンプル付きで説明がもらえたので良しとします。いつもありがとうございます。

## `-exec {} \;` と `-exec {} +`  の違い

まず `\;` の 頭についてるバックスラッシュはこれがないとセミコロンがシェルのコントロール文字列だと判別されるためについてるだけです。

そして肝心の違いですが `-exec {} \;` は find で見つかったそれぞれのファイルを別々にコマンドに渡して、 `-exec {} +` は可能な限りまとめて渡します。

言葉の説明だけだとよくわからないでしょうから実際の例を見てみましょう。

```
$ mkdir test
$ touch test/{a,b}
$ find test -exec echo foo {} \;
foo test
foo test/a
foo test/b
$ find test -exec echo foo {} +
foo test test/a test/b
```

あー、なるほど。

## 参考

emacs - find -exec should end with \; or +? - Super User
http://superuser.com/questions/643798/find-exec-should-end-with-or/643802?noredirect=1#643802
Mailchimpで部分的にトラッキングを切る

## 詐欺メール疑惑
[この記事](http://community.invisionpower.com/topic/371497-dont-use-mandrill/)にもあるように、Mandrillから送信したメールはthunderbirdでは詐欺メール扱いをされてしまう。

これはアンカータグに独自のトラッキングコードを埋め込む際、表示されるアドレスとリンク先の文字列が一致しないので問題が起こる。

こんなかんじ。

```
<a href="http://mandrillapp.com/track/click.php?u=30007695&amp;id=8aaa279216984ec0b5591b4095174bbb&amp;url=https%3A%2F%2Fcreativesurvey.com%2F&amp;url_id=e99cb8b0d417d3545c28b6206e5c8a614f397691" style="text-decoration:underline" target="_blank">https://creativesurvey.com/</a>
```

ちなみにhttp...から始まるURLのみ、この問題は起こる。
(例えば`<a href="https://creativesurvey.com">リンクはこちら！</a>`や、イメージタグが中に入っている場合は例外になる)

そのため、http...から始まるURLのトラッキングを外せば良い。

## 外さない
外したくない。
外しません、トラッキングコードは。

Mailchimpでは1つのURLのトラッキングコードを外すことは出来ず、全てONかOFFの指定しか出来ないので。

そこで、プログレッシブ・エンハンスメント的な考え方で

thunderbird => ひとまず詐欺メールにはならないように
他のメーラー => 普通にリンクが押せる

という挙動を目標にいろいろ試してみた。

結論から言うと、Mailchimp上ではリンクを指定しない、だけ。

thunderbird以外のメーラー(MacのMailやGmailなど)では、アドレスっぽい文字列は自動的にリンクにしてくれるため、リンクを指定しなくても良い。

1. Mandrilは、その時点でアンカータグがついていないのでトラッキングコードを付与しない。
2. メールが届くと、メーラーが自動でリンクにしてくれる。

thunderbirdに関しては、リンクは押せないけどアドレスは表示されている + 詐欺メールに入らないので、最低限の挙動はクリアかと。
Railsでモデル名を変更する

Railsでモデル名を変えようと思ったらめんどくさかったので記録しときます。

環境はRails4だけど、多分3でも一緒かと。

## 条件

多対多の関係をもつ list モデルと user モデルをつなぐためのモデル名を list_users にしてたけど、リストの中に入ってるユーザー達のようにしか思えないので editability に変更する。

## データーベースのテーブル名を変更

```
$ rails g migration RenameListUsersToEditability
```
と実行すると ${RAILS_APP}/db/20130911094949_rename_list_users_to_editability.rb というファイルが作成されるので

```ruby:20130911094949_rename_list_users_to_editability.rb 
class RenameListUsersToEditability < ActiveRecord::Migration
  def change
    rename_table :list_users, :editabilities #この行を追加！
  end
end
```

んで、 `$ rake db:migrate` でデータベースに反映する。

## モデル名の依存関係をチェック

Emacsで `grep-find` かもしくはそれで出てくるコマンド `$ find ${RAILS_APP}/app -type f -exec grep -inH -e list_user {} +`(-i でcase insensitive にしてる) で出てくる list_users を全部 editabilities に変更。

-i: 大文字小文字の違いを無視
-n: 行番号 も出力
-H: filename も出力

## ファイル名を変更

`${RAILS_APP}/app/models/list_user.rb` を editability.rb に名前を変更。

## モデル名を変更

今変更したファイルの中に書かれてるActiveRecordのモデル名を変更。

```ruby:${RAILS_APP}/app/models/editability.rb
class Editability < ActiveRecord::Base
  belongs_to :list
  belongs_to :user
end
```


## ちょっと気をつけること
初め editablilities にしないといけない部分を editability にしてたためエラーが発生して少しはまる。


## 参考

How do you write a migration to rename an ActiveRecord model and its table in Rails? - Stack Overflow http://stackoverflow.com/questions/471416/how-do-you-write-a-migration-to-rename-an-activerecord-model-and-its-table-in-ra
Re: MySQLで複数行を一括でUPDATEする

元ネタは半年前に書かれたやつだけど、最近はてなブックマークでみかけて気になったので。

- http://qiita.com/masuidrive/items/0671ea7efa91a99c0268

CREATE TABLE と JOIN を使わなくても、 INSERT ... ON DUPLICATE KEY UPDATE でいけるんじゃないかなと思った。

- http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html

```
> CREATE TABLE data(id INTEGER PRIMARY KEY, name VARCHAR(255), body VARCHAR(255));

> INSERT INTO data (id, name, body) VALUES
  (1, 'a', '001'),
  (2, 'b', '002'),
  (3, 'c', '003'),
  (4, 'd', '004'),
  (5, 'e', '005'),
  (6, 'f', '006')
;

> SELECT * FROM data;
+----+------+------+
| id | name | body |
+----+------+------+
|  1 | a    | 001  |
|  2 | b    | 002  |
|  3 | c    | 003  |
|  4 | d    | 004  |
|  5 | e    | 005  |
|  6 | f    | 006  |
+----+------+------+
6 rows in set (0.00 sec)

> INSERT INTO data (id, body) VALUES (1, 'aaa'), (4, 'ddd')
  ON DUPLICATE KEY UPDATE body=VALUES(body);

> SELECT * FROM data;
+----+------+------+
| id | name | body |
+----+------+------+
|  1 | a    | aaa  |
|  2 | b    | 002  |
|  3 | c    | 003  |
|  4 | d    | ddd  |
|  5 | e    | 005  |
|  6 | f    | 006  |
+----+------+------+
6 rows in set (0.00 sec)
```

Bulk insert 時の重複対策ぐらいにしか使った事がないので、実は  INSERT ... ON DUPLICATE KEY UPDATE には落とし穴があるのかもしれないけど。
Samba設定 @Debian

(・Θ・)ノ ユーザー名を`vagrant`として

```bash
aptitude install samba
smbpasswd -a vagrant
# Sambaログイン用パスワードを二度入力
vi /etc/samba/smb.conf
```

末尾に追加

```
[vagrant]
   read only = no
   path = /home/%U
```
Xcode Archive時に「library not found for -lPods」エラー

CocoaPodsを使っている環境で。
新しいConfiguration（Adhoc）を作ったあと、AdhocでArchiveしようとしたら出たエラー。

`$ pod install`しなおしてなかったので、Adhocの方にCocoapodsが適用されてなかったっぽいです。
pod installを再度したら、解決しました。

参考
http://stackoverflow.com/questions/9863836/library-not-found-for-lpods
iOS / Makefileで「Makefile:2: *** missing separator.  Stop.」でエラー

iOSアプリのビルド用にMakefile書いてたら、以下のエラーが出ました

```
Makefile:2: *** missing separator.  Stop.
```

書いてたMakefileはこんな感じ。

```
default:
  xcodebuild -workspace SampleApp.xcworkspace -scheme SampleApp -configuration Adhoc -sdk iphoneos clean build

adhoc:
  if [ -a build]; then rm -R build; fi;
  xcodebuild -sdk iphoneos -workspace SampleApp.xcworkspace -scheme SampleApp -configuration Adhoc clean build CONFIGURATION_BUILD_DIR=$(PWD)/build PROVISIONING_PROFILE=********-****-****-****-************
  xcrun -sdk iphoneos PackageApplication build/SampleApp.app -o $(PWD)/build/SampleAppAdhoc.ipa --embed SampleAdhoc.mobileprovision
```
 

xcodebuild/xcrun部分の字下げがタブでなくスペース2つだったのでこんなエラーが出てました。  
タブに直したらエラーが消えました。

あんましMakefileに馴染みがないからか、この辺は直感的にわからないですね（’ω｀）
リスト内包表記でifの判定

リスト内包表記を使用する場合、結果のリストに含めたくない要素をifを使うことで除外できる。
例えば以下のようなコード

```py
[ x for x in [1, 2, 3, ] if x > 2]
```

こうすると、出来上がるリストには3のみが含まれる。
この時、xに対して関数を適用して、尚且つ適用後の値でフィルタリングを行いたいというケースがある。
例えば以下のようなコード

```py
def f(x):
    x = x * 2
    return x

[ f(x) for x in [1, 2, 3, ] if f(x) > 2]
```

このようにすると、出来上がるリストには、4, 6が含まれる。
~~重要なのは、こうした場合メソッドfは各要素に対して1度しか実行されないということ。~~
ｰ> この部分は誤り。
jqGridで編集させたくないデータをPOSTする方法


## DBのプライマリキーや自動採番番号の取り扱い時に便利

`colModel`で`editable:true`、`hidden:true`にする。

全体を書くと以下の感じ。

```
$("#table").jqGrid({
	url: 'fuga.php',    // 初期表示用Ajax
	datatype: "json",
	colNames:["seq"],
	colModel:[
		{index:'SEQ',name:'SEQ',width:100,editable:true,hidden:true}   // DB自動採番号
	],
	editurl: 'hoge.php'  // 編集後のpost先サーバURI
});
```

1. fuga.phpでSEQの値を取得し、初期表示（SEQは非表示）。
2. 編集時でもSEQフィールドは編集できない。
3. 更新時にhoge.phpに編集不可のSEQデータを送信できる。


## jqGrid凄い奴だよ。でも余り使われてないのかなぁ

細かい情報少ないから手探り感が否めない。
ので、ちまちまと載せていくかな…。
Macへのphpenvの導入

OS Xでのphpenvの導入方法。
前に作業した時のメモが残ってたので公開しとく。

## install

```
git clone https://github.com/CHH/phpenv.git ~/phpenv
~/phpenv/bin/phpenv-install.sh

echo 'export PATH="/Users/shunsukemurakami/.phpenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(phpenv init -)"' >> ~/.bash_profile

source ~/.bash_profile
phpenv rehash
```

## php-builder
必要らしい

```
cd ~/.phpenv
mkdir plugins
cd !$
git clone git://github.com/CHH/php-build.git
curl https://raw.github.com/hnw/php-build/plugin-to-chh-phpenv/bin/rbenv-install > php-build/bin/rbenv-install
chmod 755 php-build/bin/rbenv-install
```

## setup
※ 一覧を見るには 
phpenv install --releases
を叩く。環境によっては超時間かかるかも。

### defaultのconfigureオプションを変更

~/.phpenv/plugins/php-build/share/php-build/default_configure_options
をお好みで変更する。

Apacheと連携させるので以下を追加した。
--with-apxs2=/path/to/apxs

#### 依存関係
必要に応じて追加する。

```
brew install re2c
brew install libmcrypt
```

これでうまくいくかと思いきや、XDebugのコンパイルでこける模様。
こちらの記事を参考にさせて頂いた。
http://hirobanex.net/article/2013/09/1379231000
autoconfを入れればOK。

```
phpenv install VERSION
# そのまま別のバージョンを入れるとlibphp5.soが上書きされるので別のとこに退避
cp -p /path/to/apache/libexec/libphp5.so ~/.phpenv/versions/VERSION/libexec
```

phpenv global VERSION
で使えるようになる。
お世話になりそうなリファレンス・チュートリアルサイトまとめ


都度都度ググったりするのめんどいので自分用にまとめました。新しいとこあれば随時追加していきます。
「俺、こんなとこも見るよ！」などあれば、コメントに書いていただければ追加します。

##ruby
- [公式サイト（英）](https://www.ruby-lang.org/en/)
- [公式サイト（日）](https://www.ruby-lang.org/ja/)
- [Ruby 標準ライブラリリファレンス（英）](http://www.ruby-doc.org/stdlib-2.0/)
- [Ruby コアリファレンス（英）](http://www.ruby-doc.org/core-2.0/)
- [RubyDoc.info（英）](http://www.rubydoc.info/)
- [チュートリアル（英）](https://www.ruby-lang.org/en/documentation/quickstart/)

##ruby on rails
- [公式サイト（英）](http://rubyonrails.org/)
- [リファレンス（英）](http://api.rubyonrails.org/)
- [リファレンス（日）](http://railsdoc.com/)

##rubygems
- [公式サイト（英）](https://rubygems.org/)

##slim
- [公式サイト（英）](http://slim-lang.com/)
- [リファレンス（英）](http://rdoc.info/gems/slim/frames)

##sass
- [公式サイト（英）](http://sass-lang.com/)
- [リファレンス（英）](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html)
- [チュートリアル（英）](http://sass-lang.com/tutorial.html)

##coffeescript
- [公式サイト（英）](http://coffeescript.org/)
- [リファレンス（英）](http://coffeescript.org/#language)
- [CoffeeScript 言語リファレンス（日）](http://memo.sappari.org/coffeescript/coffeescript-langref)

##compass
- [公式サイト（英）](http://compass-style.org/)
- [リファレンス（英）](http://compass-style.org/reference/compass/)

##bootstrap
- [公式サイト（英）](http://getbootstrap.com/)

##jquery
- [公式サイト（英）](http://jquery.com/)
- [リファレンス（英）](http://api.jquery.com/)

##omniauth-facebook
[ドキュメント（英）](http://rubydoc.info/gems/omniauth-facebook/1.4.1/frames)
一時変数を使わずに変数の内容を交換


Rubyだったら出来そうだなと思ったら出来た。

```ruby:irb_or_pry
[2] pry(main)> hoge = 'hoge'
=> "hoge"
[3] pry(main)> huge = 'huge'
=> "huge"
[4] pry(main)> hoge, huge = huge, hoge
=> ["huge", "hoge"]
[5] pry(main)> p hoge
"huge"
=> "huge"
[6] pry(main)> p huge
"hoge"
=> "hoge"
```

他のLLでも出来るのかな？
rubyでXML-RPCリクエストのスクリプトを書く方法


クライアントからXMLを送ってサーバーのAPIを叩くスクリプト


```sample.rb
require 'xmlrpc/client'

client = XMLRPC::Client.new2('APIのURL')
param = {'カラム名１' => '値', 'カラム名２' => '値', 'カラム名３' => '値'}

client.call('メソッド名', param)
```

主にサーバー側のデータを書き換えるために使う。
新たにgemのインストールは不要。
ISRefreshControl(iOS4-compatible UIRefreshControl)

## environment
Xcode: 4.6.3
Base SDK: iOS 6.1
Deployment Target: 5.1

## [ISRefreshControl](https://github.com/ishkawa/ISRefreshControl)

### Install from GitHub

```zsh:zsh
$ cd workspace
$ git clone https://github.com/ishkawa/ISMethodSwizzling.git
$ git clone https://github.com/ishkawa/ISRefreshControl.git
```

1. Drag ISMethodSwizzling/ISMethodSwizzling/ & Drop Xcode Project Navigator
2. Destination "Copy items into destination group's folder (if needed)" checked
3. Folders "Create groups for any added folders" checked
4. Add to targets main project checked
5. Do the same above action for ISRefreshControl

### For Example

```objc:uitableviewcontroller.m
#import "ISRefreshControl.h"

- (void)viewDidLoad
{
  self.refreshControl = (id)[[ISRefreshControl alloc] init];
  [self.refreshControl addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged];
}

- (void)refreshTableView:(ISRefreshControl *)refreshControl
{
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    sleep(1);
    dispatch_async(dispatch_get_main_queue(), ^{
      [refreshControl endRefreshing];
    });
  });
}
```

```objc:uiviewcontroller.m
#import "ISRefreshControl.h"

- (void)viewDidLoad
{
  ISRefreshControl *refreshControl = [[ISRefreshControl alloc] init];
  [self.tableView addSubview:refreshControl];
  [refreshControl addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged];
}
```
JavaScript の変数スコープで嵌る 1

## 問題
```js
(function (a) {
  console.log("outer:" + a);
  (function () {
    console.log("inner:" + a);
    var a = "piyo";
  })();
})("hoge");
```

↓下と同義

```js
(function (a) {
  console.log("outer:" + a);
  (function () {
    var a;
    console.log("inner:" + a);
    a = "piyo";
  })();
})("hoge");
```

結果 (出力)

```
outer: hoge
inner: undefined
```

## 結論
`var` キーワードを使い変数を宣言すると、その変数名では上位のスコープが参照されなくなるため、値が代入される前に参照すると undefined が返る。

ちなみに… `var` キーワードを取り払うと結果は次のようになる。

```
outer: hoge
inner: hoge
```

__同じ変数名を使いまわす時は要注意。__
__変数はスコープの上の方で宣言しよう。__
インスタンスメソッド内での @ と self の違い

`@hoge` は、インスタンス変数 @hoge を参照します。
`self.hoge` は、インスタンスメソッド hoge を呼び出します。
`self.hoge = ` は、インスタンスメソッド hoge= を呼び出します。

***
`attr_accessor` で `hoge`と`hoge=`を定義しておけば、`self.hoge`と`self.hoge=`を呼び出せます。

```rb
class Clazz
  attr_accessor :hoge

  def initialize(arg)
    @hoge = arg
  end

  def func
    puts self.hoge
  end
end

obj = Clazz.new 'instance var.'
obj.func #-> instance var.
```

***

メソッドが定義されていなければ、当然呼び出せません。

```rb
class Clazz
  def initialize(arg)
    @hoge = arg
  end

  def func
    puts self.hoge #-> undefined method `hoge' 発生
  end
end

obj = Clazz.new 'instance var.'
obj.func
```
***
paiza.ioでコードを公開しました。
ソースをいじりながら確認したい方はどうぞ。

http://stonhair.blogspot.jp/2014/12/blog-post.html
Flex / ActionScript 関係の情報源


## [adobe.com](www.adobe.com)

* [FlexおよびFlash Builderドキュメンテーション | Adobe Developer Connection [ADC]](http://www.adobe.com/jp/devnet/flex/documentation.html)

  * [Adobe Flex 4 Tutorials](http://help.adobe.com/en_US/Flex/4.0/FlexTutorials/index.html)

  * [ActionScript 3.0 Reference](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/index.html)

  * [Adobe ActionScript Cookbook](http://cookbooks.adobe.com/actionscript)

* [Adobe Flex 4 * Adobe Flex 4](http://help.adobe.com/ja_JP/Flex/4.0/UsingSDK/index.html)

* [ActionScript 3.0 ループ](http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7fcf.html)

### コンポーネント

* [Adobe Flex 4.6 * About creating advanced Spark components](http://help.adobe.com/en_US/flex/using/WS460ee381960520ad-2811830c121e9107ecb-7fff.html)

### video training

* [Flex in a Week video training](http://www.adobe.com/devnet/flex/videotraining.html)

* [Exercise 4.9: Animating components with effects](http://www.adobe.com/devnet/flex/videotraining/exercises/ex4_09.html)


## Open Adobe

* [Flex SDK / Wiki / About](http://sourceforge.net/adobe/flexsdk/wiki/About/)

## Apache Flex

* [Apach Flex](http://flex.apache.org/)
* [Apache Flex Wiki](https://cwiki.apache.org/confluence/display/FLEX/Apache+Flex+Wiki)
* [Apache Flex Blog](http://blogs.apache.org/flex/)

## ライブラリ/フレームワーク

* [Flash Daily: Stage3D Developer Resources](http://stage3d.flashdaily.net/) Stage3Dに関する情報のリンク集

* [Starling Framework - The Open Source Game Engine for Flash](http://gamua.com/starling/) 2Dゲーム向けフレームワーク

* [as3isolib - ActionScript 3 Isometric Library](http://code.google.com/p/as3isolib/) 俯瞰図型ゲーム作成用ライブラリ

## チュートリアル

* [Tile based games](http://www.tonypa.pri.ee/tbw/index.html) タイルベース型ゲーム（初代ゼルダなど）の作り方

* [kirupa.com - Isometric Transformation](http://www.kirupa.com/developer/actionscript/isometric_transforms.htm) 俯瞰型ゲームの作り方

* [Building a Peer-to-Peer Multiplayer Networked Game | Gamedevtuts+](http://gamedev.tutsplus.com/tutorials/implementation/building-a-peer-to-peer-multiplayer-networked-game/) P2P型マルチプレイヤーゲームの作り方
shoesを使って簡単なGUIを作成する


RubyのGUIライブラリにはWxRuby, FxRuby, QtRubyなど様々なものがあるようだが、その中の一つに [shoes](http://shoesrb.com/) がある。
簡易な記述でGUIアプリが作れるGUI界のSinatra的存在（？）。

# インストールして最初のアプリを作るまで

[ダウンロードページ](http://shoesrb.com/downloads.html) からshoesをダウンロード。
Mac OSXの場合、.app形式として配布されている。
shoes.app を起動して「Open an App」をクリックし、rubyのスクリプトを開くとGUIアプリケーションが起動できる。

スクリプトは以下のように書く。詳細はドキュメントを参照。

```ruby
Shoes.app do
   button("Click me").click do
     alert("Hello world")
   end
end
```

いちいちshoes.appを起動するのは面倒なので、コマンドラインから実行する。（Mac OSXの場合）

```sh
/Applications/Shoes.app/Contents/MacOS/shoes hello.rb
```

デバッグのためにコンソールを見たい時はアプリ上で alt + / を押す。

# 変更後すぐにアプリを起動する

Guardを使って、rubyを保存するとすぐにアプリが起動するように設定する。
Gemfileを編集する。

```ruby
source "https://rubygems.org"
gem "guard"
gem "guard-shell"
```

`bundle install` 後にGuardfileを以下のように編集する。

```ruby
guard 'shell' do
  watch(/(.*)\.rb$/) {|m| `/Applications/Shoes.app/Contents/MacOS/shoes #{m[0]}` }
end
```

`bundle exec guard` を実行してはguardを起動しておけばよい。
不規則な間隔のデータ点を曲面プロットする


x-y平面上のデータを描画することを考える。
散布図をプロットするだけならばplot3dでプロットできる

```R
library(rgl)
plot3d(x, y, z)
```

surface plotをしたい場合、データがx-y平面上に規則的に並んでいる必要がある。
データが規則的に並んでいない場合は補完をして規則的なデータ点を生成する必要がある。

akimaライブラリを使用して補完し規則的なデータを生成することができる。

```R
library(akima)
interpolated <- interp(x, y, z)
plot3d(x,y,z)  # 元のデータ点をプロット
surface3d(interpolated$x, interpolated$y, interpolated$z)  #補完したデータをプロット
```

デフォルトではx,y40点ずつ補完される。
より微細に補完したい時はxo, yoを指定する。

```R
finer <- interp(x,y,z,xo=seq(min(x),max(x),length=200),yo=seq(min(y),max(y),length=200))
surface3d(finer$x, finer$y, finer$z)
```

* sample
  * 黒い点がデータ点
  * 緑の綿が補完したデータをsurface3dで描画したもの
![kobito.1378877802.603817.png](https://qiita-image-store.s3.amazonaws.com/0/28792/57f4dd1e-f97e-e99f-f6de-73c52f62a804.png "kobito.1378877802.603817.png")
rubyでハッシュ(sha1)に変換する方法


gemのインストールは不要。
そのまま次のように書けば変換可能。


```sample.rb
require 'digest/sha1'
print Digest::SHA1.hexdigest('変換したい文字列');
```

このスクリプトを実行するとコマンドラインにハッシュ化した文字列が表示される。
jqGridのSelectBoxにnull値をセットする方法

## `"0:hoge;1:fuga"`の初期値（1番頭）をnull値にしたい

こんな感じで各値を指定できますので、`"0:hoge;1:fuga"`

以下の感じで`:;`を追記してやればいいみたいです。

```
":;0:hoge;1:fuga"
```

全体的にみると、以下の様な感じ。

```
var XXX=':;0:hoge;1:fuga';
$('#table').jqGrid({
  colModel:[ 
    {index:'X',name:'X',editable:true,edittype:"select",editoptions:{value:XXX},formatter:'select'}, 
  ]
});
```

## jqGridについて思ったこと

jqGridは汎用性高い分、オプションの数が半端ないので学習コストがそれなりに掛かる印象。
その分、メンテナンスし易く規則的で綺麗なコードでtableが扱えます。
巨大で複雑なtableで扱う場合、使えるか否か調査に十分な時間を割いて検証し、
使えるようなら使った方がいいと思います。

[jqGridの書籍](http://www.packtpub.com/learn-to-manage-your-data-with-jqgrid-library/book)も出ているみたいです
洋書しかないみたいですが、買うか迷うなぁ。
MySQLのデータディレクトリを移動する

##■/var/lib/mysqlから/test/mysqlに移動する
<br>

```
/etc/init.d/mysql stop
```
●mysqlの停止
<br>

```
cp my.cnf my.cnf.back
```
●my.cnfのバックアップ
<br>

```
vi my.cnf
```
●my.cnfの編集
<br>

```
socket　= /test/mysql/mysql.sock
log-slow-queries　=　/test/mysql
log-bin　=　/test/mysql/mysql-bin
innodb_data_home_dir = /test/mysql/
innodb_log_group_home_dir = /test/mysql/
```
●ログやらデータディレクトリやらの指定を新ディレクトリに変更する
<br>

```
vi /etc/init.d/mysql
```
●起動ファイルを編集する
<br>

```
datadir=/var/lib/mysql  →　 datadir=/test/mysql
```
●datadirを変更
<br>

```
cp -pR /var/lib/mysql/* /test/mysql
```
●ディレクトリお引越し
<br>

```
/etc/init.d/mysql start
```
●mysqlを起動
<br>

```
mysqladmin variables -u root -p | grep "/var/lib/mysql"
```
●旧ディレクトリに向いている設定が無いか確認
無ければ/var/lib/mysqlを削除して終了

#■追記
下記のエラーが出る場合はSELinuxを無効にする

```
Starting MySQL. ERROR! The server quit without updating PID file
```

●SELinux無効化

```
setenforce 0
```

●恒久的にSELinuxを無効化する

```
vim /etc/sysconfig/selinux
SELINUX=disabled
```
0.7.4以前のoFを0.8.0に持ってくる時の注意


main関数が、少し変わっている。

	int main( ){
	    ofAppGlutWindow window;
		ofSetupOpenGL(&window, 1920,1080, OF_WINDOW);
		// <-------- setup the GL context

		// this kicks off the running of my app
		// can be OF_WINDOW or OF_FULLSCREEN
		// pass in width and height too:
		ofRunApp( new testApp());
	}

0.8.0だとこんな感じ

	int main( ){
		ofSetupOpenGL(1280,720, OF_WINDOW);		
		// <-------- setup the GL context
	
		// this kicks off the running of my app
		// can be OF_WINDOW or OF_FULLSCREEN
		// pass in width and height too:
		ofRunApp( new testApp());
	}

ofAppGlutWindowインスタンスを中で作る、というかプラットフォーム別に分岐して、GLFWのウィンドウになってる。
0.7.4で作ってた物をそのまま持ってきてもビルドは通るんだけど、アンチエイリアスがかからなかったり、他にも何か不都合が出そうな気配なのでメモ。
Deviseのconfirmableでメール認証を後回しにする

## やりたいこと

deviseでconfirmableを有効にしてる場合、会員登録のフローでメールアドレスの確認が必要で面倒。
会員登録時のメール認証は省いて後から認証を行ってもらう形を取りたい。

## confirmableモジュール

confirmableモジュールの中で認証系を扱っているのは下記のコード。

``` ruby:github.com/plataformatec/devise/blob/master/lib/devise/models/confirmable.rb
def active_for_authentication?
  super && (!confirmation_required? || confirmed? || confirmation_period_valid?)
end
```

メール認証が完了してない場合に認証チェックメソッドを上書きしてる。これをメール認証が完了してなくても大丈夫なようにオーバーライドしたい。

## confirmableモジュールの上書き

deviseのinitializerあたりに下記コードを追加して対応。

``` ruby:config/initializer/devise.rb
Devise::Models::Confirmable.module_eval do
  def active_for_authentication?
    super # コメントアウト && (!confirmation_required? || confirmed? || confirmation_period_valid?)
  end
end
```

あとはlayoutsにてメールアドレスの確認を促すアラートを出せば良いかと思います。

``` erb:app/views/layouts/application.html.erb
<% if user_signed_in? && !current_user.confirmed? %>
  <div class="alert">
    メール認証が完了していません！
    <%= link_to "> 再送はこちら", new_user_confirmation_path %>
  </div>
<% end %>
```
メールの本人確認が出来ていない段階で本サイトにログインできているので、メールを飛ばしたり等の処理の所は気をつけた方がいいですね。
Chrome Extensionでgoogle apis client library for javascriptを使う

備忘録的な何か

Chrome Extensionを作る際に、google apis client for javascript(gapi)を使おうとすると
Content Security Policyに引っかかってしまう為、
以下の様な通常の読み込み方では、gapiを利用することができない。 （エラーとなる） 


```html

<!-- client libraryの読み込み -->
<script src="https://apis.google.com/js/client.js?onload=handleClientLoad"></script>
<script>
      function handleClientLoad() {
        // Step 2: Reference the API key
        gapi.client.setApiKey(apiKey);
        window.setTimeout(makeApiCall,1);
      }
      // Load the API and make an API call.  Display the results on the screen.
      function makeApiCall() {
        // Step 4: Load the Google+ API
        gapi.client.load('plus', 'v1', function() {
          // Step 5: Assemble the API request
          var request = gapi.client.plus.people.get({
            'userId': 'me'
          });
          // Step 6: Execute the API request
          request.execute(function(resp) {
            var heading = document.createElement('h4');
            var image = document.createElement('img');
            image.src = resp.image.url;
            heading.appendChild(image);
            heading.appendChild(document.createTextNode(resp.displayName));

            document.getElementById('content').appendChild(heading);
          });
        });
      }
</script>
```

gapiを利用するためには、今のところchromeチームが出しているCSPに引っかからないライブラリ経由で、gapiをロードしたり、apiの呼び出しをする必要があるみたい。

https://github.com/GoogleChrome/chrome-app-samples/tree/master/gapi-chrome-apps-lib

使い方とかは、リンク先を見てください。
使えないことはないのですが、完成はしてない雰囲気が...

google apis client library for javascriptはappengineのCloud Endpintでも利用される為、
Chrome Extensionから利用しようとした時にハマりどころなので、覚えておくと得です。

一応今自分で作ってるChrome Extensionが使ってるので参考にしてください。
https://github.com/soundTricker/gas-library-box
間違ったlistenToの使い方

深夜や疲れたときにやってしまう間違い

```ts:間違い
class View1 extends Backbone.View{
	constructor(options?){
		super(options);
	}
	render(){
		//buttonAとbuttonBを生成する
		var buttonA = new Backbone.View();
		var buttonB = new BackBone.View();
		this.append(buttonA.$el).append(buttonB.$el);
		//buttonAイベント「submit」が呼ばれたらbuttonBをrenderしたい
		this.listenTo(buttonA,'submit',buttonB.render);
		return this;
	}
}
```
buttonAのsubmitイベントが呼ばれたらbuttonB.renderを呼びたいんですが、うまくいかないです。
View1.renderが呼ばれます。
メソッドを呼ぶコンテキストがlistenToのオブジェクトに固定されるためのようです。
固定されているのが悪いのではなく、イベント購読を直接関係のない第三者に知らせても意味ないのでした。


```ts:正しい
class View1 extends Backbone.View{
	constructor(options?){
		super(options);
	}
	render(){
		//buttonAとbuttonBを生成する
		var buttonA = new Backbone.View();
		var buttonB = new BackBone.View();
		this.append(buttonA.$el).append(buttonB.$el);
		//buttonAイベント「submit」が呼ばれたらbuttonBをrenderしたい
		buttonB.listenTo(buttonA,'submit',buttonB.render);
		return this;
	}
}
```
redis.pyのConnectionPoolの実装よんだ


利用できるコネクションと使ってるコネクション

_available_connections で利用できるコネクションのlist
_created_connections で今まで作ったコネクションの総数
_in_use_connection で今使っているコネクションのset

get_connectionメソッドで_available_connectionsから利用できるコネクションがあればpopでとってくる。ないならmake_connectionで新規コネクションをつくり、_in_use_connectionにaddする

releaseメソッドでコネクションをpookに返却する。(_in_use_connectionからremoveし、_available_connectionsとappend)

disconnectでpoolの開放

実際でどうつかわれるかは

StrictRedisクラスのexecute_commandメソッドで
poolからget_connectionメソッドでコネクションを取得
コネクションを利用してコマンドを実行し、コマンドの実行が正常でも異常でも終了したら(finally)releaseでコネクションを返す(異常の場合はpoolからのコネクションを破棄し、新しいコネクションを生成)

ふぅ
css反映されない

```html
<!doctype html>
<html lang="ja">
<head>
<meta http-equiv="content-Type" content="text/html; charset=utf-8">
<meta http-equiv="content-script-type" content="text/javascript">
<meta http-equiv="content-style-type" content="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=0" />
<meta name="format-detection" content="telephone=no" />

<title>Search</title>
</head>
<link href="/******/*****.css" rel="stylesheet" type="text/css" media="all" />
<script type="text/javascript" src="/js/jquery-1.10.2.min.js"></script>
<script src="/js/csv2table-0.02-b-4.3.1.js" type="text/javascript" charset="utf-8">
</script>
<script type="text/javascript">
	$(document).ready( function() {
		$("input:button").click(function(){
			var csv = 'http://*****/*****/****.csv';
			var word = 'like %' + $('#key').val() + '%';
			var param = { select : [0,1,2,3,4,5], where : [{'コード':word},'||',{'商品名':word}]};
			$('#view0').csv2table( csv, param );
		});
	});
</script>
</head>
<body>
<h3>Search</h3>
<input id="key" type="text" />
<br />
<input type="button" value="検索" />
<div id="view0"></div>
</body>
</html>
```
上記ソースを書きましたが外部にcssを抜き出すも、検索後表示される表がcssを反映しておりません。
ご教授願います。