OmniAICreator/Qiita-1.07M huggingface dataset:
Scheme手習いメモ (3章 - 偉大なるCons)

##rember
アトム `a` と ラット `lat` を引数にとり、ラットに含まれる最初の `a` を取り除いたラットを返す関数 `rember` を定義する。

復習すると、アトムはリストではないなんらかの要素で、ラットは、アトムからなるリストだった。ちなみに、

>「rember」とは remember a member (メンバーを除く) という意味

らしいです。

```Lisp:rember.scm
(define rember
  (lambda (a lat)
    (cond
      ((null? lat) (quote ()))
      ((eq? (car lat) a) (cdr lat))
      (else (cons (car lat)
                  (rember a (cdr lat)))))))

(define a 'and)
(define lat '(bacon and potatos))
(print (rember a lat))
```

出力は　`(bacon potatos)` 。 `cons` を使った再帰のしかたが分かった。

##firsts
リストのリストを受け取り、各々のリストの最初の要素からなるリストを生成する関数 `firsts` を定義する。

```Lisp:firsts.scm
(define firsts
  (lambda (l)
    (cond
      ((null? l) quote ())
      (else (cons (car (car l))
                  (firsts (cdr l)))))))

(print (firsts '((a b) (b c) (d e))))
```

出力は `(a b d)` 。再帰は自然にしろと言われた。では、不自然な再帰というのはどういうものなのだろう。

##insertR
アトム `new`, アトム `old`, ラット `lat` を引数にとり、ラットに出てくる最初の `old` の右に `new` を挿入したラットを返す関数 `insertR` を定義する。

```Lisp:insertR.scm
(define insertR
  (lambda (new old lat)
    (cond
      ((null? lat) (quote ()))
      (else (cond
              ((eq? (car lat) old)
               (cons old
                     (cons new (cdr lat))))
              (else (cons (car lat)
                          (insertR new old
                                   (cdr lat)))))))))

(define new 'topping)
(define old 'fudge)
(define lat '(ice cream with fudge for dessert))
(print (insertR new old lat))
```

出力は `(ice cream with fudge topping for dessert)` 。

##multirember
 `rember` はラットから特定の要素を**ひとつだけ**削除する関数であった。ラットから特定の要素を**全部**削除する関数 `multilember` を定義する。

```Lisp
(define multirember
  (lambda (a lat)
    (cond
      ((null? lat) (quote ()))
      (else
        (cond
          ((eq? (car lat) a)
           (multirember a (cdr lat)))
          (else (cons (car lat)
                      (multirember a
                                   (cdr lat)))))))))

(define a 'cup)
(define lat '(coddee cup tea cup and hick cup))
(print (multirember a lat))
```

出力は `(coddee tea and hick)` 。

##multisubset
3章最後。アトム `new`, `old` とラット `lat` を引数にとり、ラットに含まれる `old` を**全て** `new` に置き換える関数を定義する。

```Lisp:multisubset.scm
(define multisubset
  (lambda (new old lat)
    (cond
      ((null? lat) (quote ()))
      (else
        (cond
          ((eq? (car lat) old)
           (cons new
                 (multisubset new old
                              (cdr lat))))
          (else (cons (car lat)
                      (multisubset new old
                                   (cdr lat)))))))))


(define old 'fudge)
(define new 'topping)
(define lat '(fudge cream with fudge for dessert))
(print (multisubset new old lat))
```

出力は `(topping cream with topping for dessert)` 。
CentOSにRVMと最新版Ruby&Railsをインストールする

2012年8月17日 クリーンインストールしたCentOSで検証。

## 1. 必要なライブラリのインストール
Railsや開発に必要なライブラリをインストールします。

```
$ sudo yum install -y git zlib-devel perl-ExtUtils-MakeMaker httpd httpd-devel openssl-devel libyaml-devel libxml2-devel libxslt-devel libffi-devel readline-devel pcre-devel iconv-devel sqlite-devel mysql mysql-server mysql-devel postgresql postgresql-server postgresql-devel curl-devel nkf
```

## 2. RVMのインストール
次にRVMをインストールします。
成功すると、ホームディレクトリに.rvmが置かれ、.bash_profileに.rvmへのパスが追記されます。

```
$ cd ~/
$ bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
$ ls -la

drwxrwxr-x  23 is0me test 4096  8月 16 16:52 2012 .rvm
[...]
```

```bash:.bash_profile
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
```

.bash_profileを読み込み直し、rvmコマンドを使えるようにします。

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

## 3. Rubyのインストール
インストールしたRVMを使い、Rubyをインストールします。
まずは、最新版のバージョンを確認します。

```
$ rvm list known|grep 2.0.0

[ruby-]2.0.0-rc1
[ruby-]2.0.0-rc2
[ruby-]2.0.0[-p0]
rbx-2.0.0-rc1
```

最新版をインストールする場合は、

```
$ rvm install 2.0.0
```

バージョンを指定する場合は、以下のように入力しインストールします。

```
$ rvm install 2.0.0-rc1
```

インストール後、そのバージョンをデフォルトに設定しておきます。
RVMを使うことで複数のバージョンを使い分ける事が楽になります。
同時に、gemコマンドも使えるようになります。

```
$ rvm use 2.0.0 --default
Using /usr/local/rvm/gems/ruby-2.0.0-p0

$ ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-linux]

$ gem -v
1.8.24
```

## 4. Ruby on Railsをインストール
最後にRailsのインストールです。

```
$ gem install rails 
$ rails -v

Rails 3.2.8
```

後々必要になるので、rakeもインストールすれば完了です。
rakeは、DBをマイグレーションするのに必要になります。

```
$ gem install rake
```

Apache上でRails3を動かす場合は、passengerをインストールしてください。
[Apache上で、Rails3を動かす](http://qiita.com/items/17ea5fda87ace28c5caa)
Vimからmilkodeのgmilkコマンドを使う(Quickfix版)

* [Windowsに ソースコード検索エンジン「Milkode」をインストールする #Windows #milkode #Ruby - Qiita](http://qiita.com/items/5eae5c581dc37b6efbe4)

以前こちらの記事で紹介した Milkode ですが、これをインストールすると、gmilk コマンドが使えるようになります。（コマンドライン版）


こんな感じで、登録してあるソースコードから、さくっと該当行を検索してきれくれます。

![gmilkコマンド検索例](https://lh5.googleusercontent.com/-p0w5VNOvcWg/UC0ElMgLufI/AAAAAAAAEhQ/ZlirQaWGmvc/s800/2012-08-16_23h20_59.png)

# これは、ぜひVimから利用したい

Vim からこのコマンドを実行して、検索結果をQuickfixに表示してみたいなと思い、調べてみました。

# ソースコード

.vimrc に以下のように書きます。

```vim
" gmilk コマンドの結果でQuickFixする
command! -nargs=1 Gmilk call s:Gmilk("gmilk -a -n 10", <f-args>)

function! s:Gmilk(cmd, arg)
	silent execute "cgetexpr system(\"" . a:cmd . " ". a:arg . "\")"
	if len(getqflist()) == 0
		echohl WarningMsg
		echomsg "No match found."
		echohl None
	else
		cwindow
		redraw!
	endif
endfunction

```

gmilk コマンドの引数については、コマンドプロンプトから `gmilk --help` で参照してください。

# 使い方

```vim
:Gmilk [検索したい語句]
```

# 実行例

![実行結果](https://lh4.googleusercontent.com/-cfI_tBPwSIc/UC0EkyM7DuI/AAAAAAAAEhM/_qkjSrOzcLo/s800/2012-08-16_23h18_28.png)

# あとがき

で、Quickfix ってどう使うんだっけ？（ぇ
Milkode と連携する Unite プラグインどこかに転がってないかしら・・・

# 本日覚えたコマンド

* `:cex[pr] {expr}`	{expr}の結果を使ってQuickFixリストを作成する
* `:sil[ent]`	{command} を静かに実行します。メッセージは表示されず、メッセージ履歴にも残りません。
* `:exe[cute] {expr1}`	{expr1}の評価結果の文字列をExコマンドとして実行する。
* `:cw[indow]`	QuickFixウィンドウを開く

# 参考

* [tips/66 - VimWiki](http://vimwiki.net/?tips%2F66)
* [quickfix - vimdoc-ja](https://sites.google.com/site/vimdocja/quickfix-html)
* [コマンドを定義する — 名無しのvim使い](http://nanasi.jp/articles/code/command/command.html)
XcodeでOrganization Nameを設定する



Xcode **4.4** からプロジェクトを作成すると、**Organization Name**という設定項目が追加されている。

![sc1](https://dl.dropbox.com/u/8932138/screenshot/xcode_44_org_2012-08-16_1438.png)

この項目の値はファイルテンプレートの__MyCompanyName__に適応されるようだ。

プロジェクト作成後、あるいはXcode 4.3以前で生成したXcodeプロジェクトはどうすればよいかというと、プロジェクトの設定から変更できる。

![sc2](https://dl.dropbox.com/u/8932138/screenshot/xcode_44_org_2012-08-16_1439.png)

変更すると以後の新規作成したファイルヘッダに適応される。

![sc3](https://dl.dropbox.com/u/8932138/screenshot/xcode_44_org_2012-08-16_1440.png)
画像の角丸＋シャドウ加工

viewを二重に入れ子にするしかないらしい


```objective-c
        innerImageView.image = img;
        [innerImageView.layer setMasksToBounds:YES];
        [innerImageView.layer setCornerRadius:5.0f];
        [outerImageView addSubview:innerView];
        
        outerImageView.layer.shadowColor = [[UIColor blackColor] CGColor];
        outerImageView.layer.shadowOffset = CGSizeMake(0, 0.1f);
        outerImageView.layer.shadowOpacity = 0.8;
        outerImageView.layer.shadowRadius = 5.0f;
        outerImageView.clipsToBounds = NO;
```

UITableViewでこれやろうとすると狂ってしまう
zshプロンプトで、gitブランチの状態で色変えたり。vcs_infoを利用する版

zshの右プロンプトに以下の情報を表示する。

* カレントディレクトリがgitリポジトリだった場合
 1. リポジトリルートからの相対パス(25文字以上は前半を省略)
 2. リポジトリルートのパス(ホームディレクトリは~に省略。15文字以上は前半を省略)
 3. カレントブランチ
     * 状態によって色を変える
* そうじゃなかった場合は、カレントディレクトリだけ表示

zshに組込まれてるvcs_infoは、上の1と2をやるのにとても便利なのと、gitコマンドなくてもエラーになったりしないという利点があるので利用する。

```zsh

autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git 

# 下のformatsの値をそれぞれの変数に入れてくれる機能の、変数の数の最大。
# デフォルトだと2くらいなので、指定しておかないと、下のformatsがほぼ動かない。
zstyle ':vcs_info:*' max-exports 7

# 左から順番に、vcs_info_msg_{n}_ という名前の変数に格納されるので、下で利用する
zstyle ':vcs_info:*' formats '%R' '%S' '%b' '%s'
# 状態が特殊な場合のformats
zstyle ':vcs_info:*' actionformats '%R' '%S' '%b|%a' '%s'

# 4.3.10以上の場合は、check-for-changesという機能を使う。
autoload -Uz is-at-least
if is-at-least 4.3.10; then
    zstyle ':vcs_info:*' check-for-changes true
    zstyle ':vcs_info:*' formats '%R' '%S' '%b' '%s' '%c' '%u'
    zstyle ':vcs_info:*' actionformats '%R' '%S' '%b|%a' '%s' '%c' '%u'
fi

# zshのPTOMPTに渡す文字列は、可読性がそんなに良くなくて、読み書きしたり、つまりデバッグが
# 大変なため、文字列を組み立てるのは関数でやることにする。
# そのほうが分岐などを追加するのが楽。
# この先、追加で表示させたい情報はいろいろでてくるとおもうし。
function echo_rprompt () {
    local repos branch st color

    STY= LANG=en_US.UTF-8 vcs_info
    if [[ -n "$vcs_info_msg_1_" ]]; then
        # -Dつけて、~とかに変換
        repos=`print -nD "$vcs_info_msg_0_"`

        # if [[ -n "$vcs_info_msg_2_" ]]; then
            branch="$vcs_info_msg_2_"
        # else
        #     branch=$(basename "`git symbolic-ref HEAD 2> /dev/null`")
        # fi
        
        if [[ -n "$vcs_info_msg_4_" ]]; then # staged
            branch="%F{green}$branch%f"
        elif [[ -n "$vcs_info_msg_5_" ]]; then # unstaged
            branch="%F{red}$branch%f"
        else
            branch="%F{blue}$branch%f"
        fi

        print -n "[%25<..<"
        print -n "%F{yellow}$vcs_info_msg_1_%F"
        print -n "%<<]"

        print -n "[%15<..<"
        print -nD "%F{yellow}$repos%f"
        print -n "@$branch"
        print -n "%<<]"

    else
        print -nD "[%F{yellow}%60<..<%~%<<%f]"
    fi
}

setopt prompt_subst
RPROMPT='`echo_rprompt`'
```
Macに入れてるツール等


入れてるアプリをメモしておく
詳細はググるURLとか変わるしメンテ面倒だし(-_-;)

## パッケージ管理
・homebrew
→ macportsより依存関係でインストールされるソフトが少ない、sudo使わなくて良い等便利
・MacPorts
→ LAMP環境作ったり色々

## IDE
・Xcode
→ 安定
・eclipse
→ PHP,Android開発
・NetBeans
→ あんまし使ってない

## ストレージ
・Evernote
→ WebClip,ノート
・Dropbox
→ SugarSyncより使い慣れてるから使ってる

## コミュニケーション
・Skype
→ 連絡ツール
・Limechat
→ IRCクライアント
・Adium
→ MSN,Skype等なんでもござれ
・夜フクロウ
→ Twitter

## エディタ
・Sublime Text
→ 恋するエディタｗ
・CotEditor
→ 軽い
・Emacs
→ カスタマイズの結果抜けだせません
### あんまし使わない↓
・mi
・TextWragler

## メーラ
・Sparrow
→ オサレ
・Thunderbird
→ 慣れてる

## ブラウザ
・Firefox
→ よく使うVimperator最高です＾ｑ＾
・Google Chrome
→ メモリすごく使ってる気がする・・・。

## 差分
・DiffMerge
→ ディレクトリ比較できる
・p4merge
→ あんまし使ってない

### その他
・Alfred
→ Spotlightよりはコッチ派
・Growl
→ 山ライオンになって通知センター入ったけど、どうだろ？
・Google日本語入力
→ 無料だし
・ClipMenu
→ クリップボード管理
・FileZilla
→ FTPツール
・Macfusion
→ マウント管理
・Hoster
→ HOSTファイル管理
git push時にhungる


下記みたいなエラーが出たら

```
fatal: The remote end hung up unexpectedly
fatal: expected ok/error, helper said '2004?D??w?$??=`
                                                      ??I?Ӑ
                                                           ??}????6?.??jY?x^???h}]???"?]???l'
```

push時のサイズを増やしましょう。

If any errors occur during a push, run this command to resize the buffer (to 50 MB):

```
git config --system http.postBuffer 52428800
```
空白文字を含んだ文字列をNSXMLParserでparse

iPhoneプログラミングでXMLを使いたいときにはNSXMLParserを使います。他にもいろいろあるけれど、僕は一番手頃だと思います。
そんなわけでNSXMLParserを使っていて空白文字の扱いでつまづいた箇所。

```xmlparser.m
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    if( [currentElement isEqualToString:@"WantedString"] ){
         NSLog(@"%@",string);
    }
}

```

これで得たいタグに入っていた時にその値である文字列が表示されるはずなのですが、途中に改行文字や空白文字が入っているとうまくいかない模様。
調べてみると空白文字などがあると、途中で終わってしまうみたいなので、それをappendStringしてあげるのでいいとのこと。

```xmlparser.m

NSMutableString *wantedString;

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    wantedString = [NSMutableString string];
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    if( [currentElement isEqualToString:@"WantedString"] ){
         [wantedString appendString:string];
    }
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    NSLog(@"%@", wantedString);
}
```

とやるとすべての文字が含まれて表示されるようになりました。
newのつけ忘れに対応する書き方


エラー出してあげたほうが良い気もするけど、、こういう書き方もあるんだというメモ。

```:javascript
function SomeClass(){
    return (this instanceof SomeClass) ? this.init() : new SomeClass();
}

SomeClass.prototype.init = function(){
    console.log('SomeClass.init')
}

var hoge = SomeClass();
// >> SomeClass.init

var fuga = new SomeClass();
// >> SomeClass.init
```
ChefのScript(bash)リソースでflagsを使って例外停止

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

chefのscriptリソースにbashを選ぶと、そのままではスクリプトの途中でエラーが出ても停止しない。

```ruby:recipe.rb
script "echo_test" do
  interpreter "bash"
  code <<-"EOH"
      ehco
      echo
  EOH
end
```

Scriptリソースは単に`code`の中身をファイルに書いてbashで実行している、exitコードは最後に実行したコマンドに依存するため、上記レシピではtypoの`ehco`があっても続きが実行されてしまう。

## flagsを使う

`flags "-e"`を指定すると、bashに -e `("set -e" と同じ)`オプションをつけてくれるので止まる。

```ruby:recipe_with_exception.rb
script "echo_test" do
  interpreter "bash"
  flags "-e"
  code <<-"EOH"
      ehco
      echo
  EOH
end

```

## 実行例

```
---- Begin output of "bash" -e "/tmp/chef-script20120815-11796-1cn4njv" ----
STDOUT: 
STDERR: /tmp/chef-script20120815-11796-1cn4njv: line 1: ehco: command not found
---- End output of "bash" -e "/tmp/chef-script20120815-11796-1cn4njv" ----
Ran "bash" -e "/tmp/chef-script20120815-11796-1cn4njv" returned 127
```

`ehco: command not found` で無事に止まった。
バックグラウンドジョブを継続する方法


## はじめに
バックグラウンドジョブを起動したプロセス(ログインシェル)を終了すると子プロセスであるバックグラウンドジョブをハングアップシグナル(HUP)によって終了させる。
親プロセスであるシェルが終了すると子プロセスはゾンビプロセスとなってしまうので、親プロセスは子プロセスであるバックグラウンドジョブを kill(kill -HUP) する。

## nohup コマンド
```
$ nohup ./process.sh &
```

バックグラウンドジョブをログアウト後も実行させる場合は nohup コマンドを使う。
nouhp コマンドはLinux以外のUnix系のOSなら大概使える。
もしも無かったら GNU の coreutils にある。

処理中に出力されたメッセージはプログラムを実行したディレクトリの nohup.out に出力される。
プログラムを実行したディレクトリに書き込み権限がなければ $HOME/nohup.out に出力される。

& はプロセスをバックグラウンドで実行するという意味。

### 標準出力先を指定する
```
$ nohup ./process.sh > out.log &
```
標準出力先が out.log になる。
標準エラー出力は普通に使った時と同じように nohup.out に出力される。

### 標準エラー出力先を指定する
```
$ nohup ./process.sh > out.log 2> err.log &
```
標準出力先が out.log になる。
標準エラー出力先は err.log となる。

### 実行中のプロセスを終了する
nohup で実行中のプログラムを終了させるにはプロセスIDを調べて kill コマンドで強制終了する。

## disown コマンド
ログアウトしたいのに nohup コマンドをつけずにジョブを開始してしまった場合には disown コマンドを使う。
jobs コマンドでジョブ番号を確認して disown コマンドの引数に指定する。

```
$ jobs
[1]+  Running  process.sh

$ disown %1
```
ジョブ番号を指定せずに実行したすると現在のジョブを、オプションで -a(--all)を指定すると全てのジョブをデーモンプロセス化する。

## 最後に
tmux とか　screen 使った方が楽
「filterM で powerset」をC#らしく

(2025/6)
さすがにコード例が古いので、コレクション式を使って書き換え。

`filterM` は.NETにはないので、無理に実装を合わせる必要はない。
特に、`Func<int, IEnumerable<bool>> pred = x => new[] { true, false };` の部分をラムダ式にする意味はない。
やってることは直積なんだから、`[true, false]` でいい。

```cs
List<int> xs = [1, 2, 3, 4];
List<List<int>> ys = PowerSet(xs);

foreach (var l in ys)
{
    Console.WriteLine($"[{string.Join(", ", l)}]");
}

List<List<T>> PowerSet<T>(List<T> xs)
{
    List<T> newAdd(List<T> l, T x) => [.. l, x];
    List<bool> flags = [true, false];
    List<List<T>> folder(List<List<T>> acc, T x)
    {
        var col =
            from f in flags
            from l in acc
            select f ? newAdd(l, x) : l;
        return [.. col];
    }
    List<List<T>> state = [[]];
    return xs.Aggregate(state, folder);
}
```

---

前回の 『[「filterM で powerset」をC#に翻訳](http://qiita.com/items/90a3e9894dabe8cec8d0)』はHaskellからの翻訳なのでC#的にいろいろ無理があった。特に再帰のところ。
[熟練した C# 使いは再帰を書かない？](http://d.hatena.ne.jp/NyaRuRu/20080127/p2) その通り。ではどうするか。Aggregateを使う。

```c#:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var array = new[] { 1, 2, 3, 4, 5 };
        Func<int, IEnumerable<bool>> pred = x => new[] { true, false };

        foreach (var l in array.WhereMany(pred))
        {
            Console.WriteLine(l.ToStringEx());
        }
    }
}

public static class EnumerableEx
{
    public static IEnumerable<IEnumerable<T>> WhereMany<T>(
        this IEnumerable<T> source,
        Func<T, IEnumerable<bool>> predicates)
    {
        return source.Aggregate(
            Enumerable.Repeat(new LinkedList<T>(), 1),
            (acc, x) => acc.SelectMany(q => Accumulate(q, x, predicates))
        );
    }

    private static IEnumerable<LinkedList<T>> Accumulate<T>(
        LinkedList<T> q,
        T x,
        Func<T, IEnumerable<bool>> predicates)
    {
        foreach(var b in predicates(x))
        {
            if (b)
            {
                q.AddLast(x);
                yield return q;
                q.RemoveLast();
            }
            else
            {
                yield return q;
            }
        }
    }

    public static string ToStringEx<T>(this IEnumerable<T> source)
    {
        var strings = source.Select(x => x.ToString());
        return "[" + string.Join(", ", strings) + "]";
    }
}
```
RubyでTwitter、つぶやく。

[The Twitter Ruby Gem](http://twitter.rubyforge.org)

```ruby:twitter.rb
#! /usr/bin/ruby

require 'rubygems'
require 'twitter'

message = "OAuth test."

Twitter.configure do |config|
  config.consumer_key = 'Consumer key'
  config.consumer_secret = 'Consumer secret'
  config.oauth_token = 'Access token'
  config.oauth_token_secret = 'Access token secret'
end

client = Twitter::Client.new

# ツイート
# 全く同じメッセージはエラーになるので注意。
client.update(message)
```
@付き発言だけ消したTwitterタイムラインを表示する埋め込みHTML

こんな感じ。
http://is0.me/twitter.html

```html:index.html
<div id="twitter_div">
    <ul id="twitter_update_list" style="list-style:none"></ul>
</div>
<script type="text/javascript" src="http://is0.me/js/blogger.js"></script>
<script type="text/javascript" src="http://twitter.com/statuses/user_timeline/is0me.json?callback=twitterCallback2&amp;count=5"></script>
```

呼び出しているJavaScriptはこちら

```js:blogger.js
function twitterCallback2(twitters) {
  var statusHTML = [];
  for (var i=0; i<twitters.length; i++){
      var username = twitters[i].user.screen_name;
      if(twitters[i].text.match(/¥B@([_a-z0-9]+)/ig)) {
          continue;
      }
      var status = twitters[i].text.replace(/((https?|s?ftp|ssh)¥:¥/¥/[^"¥s¥<¥>]*[^.,;'">¥:¥s¥<¥>¥)¥]¥!])/g, function(url) { return '<a href="'+url+'">'+url+'</a>';});
    statusHTML.push('<li>'+relative_time(twitters[i].created_at)+'<br /><span>'+status+'</span><br><hr></li>');
  }
  document.getElementById('twitter_update_list').innerHTML = statusHTML.join('');
}

function relative_time(time_value) {
  var values = time_value.split(" ");
  time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
  var parsed_date = Date.parse(time_value);
  var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
  var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
  delta = delta + (relative_to.getTimezoneOffset() * 60);

  if (delta < 60) {
    return 'less than a minute ago';
  } else if(delta < 120) {
    return 'about a minute ago';
  } else if(delta < (60*60)) {
    return (parseInt(delta / 60)).toString() + ' minutes ago';
  } else if(delta < (120*60)) {
    return 'about an hour ago';
  } else if(delta < (24*60*60)) {
    return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
  } else if(delta < (48*60*60)) {
    return '1 day ago';
  } else {
    return (parseInt(delta / 86400)).toString() + ' days ago';
  }
}
```
カスペルスキーのサイトからウィルスレベルをスクレイピングして、つぶやく。

Gem::Tiwtter、Gem::Mechanize必須。

```ruby:kaspersky.rb
#! /usr/bin/ruby -Ku

#require 'kconv'
#require 'oauth'
require 'rubygems'
require 'mechanize'
require 'twitter'
require 'date'

date = Time.now.strftime("%H:%M:%S").to_s

agent = Mechanize::new
agent.user_agent_alias = "Windows IE 9"

agent.get('http://www.securelist.com/en/')  
agent.page.encoding = "EUC-JP"

activity = agent.page.search('span.m').to_s
activity = activity.scan(/Internet threat level:../)

threat_level = activity[0].split(' ')

case threat_level[3]
when "1"
 message = "[Threat level 1] The Internet threat alert status is currently normal."
when "2"
 message = "[Threat level 2] The Internet threat alert status is currently raised."
when "3"
 message = "[Threat level 3] The Internet threat alert status is currently high."
when "4"
 message = "[Threat level 4] The Internet threat alert status is currently critical.(http://www.securelist.com/en/)"
else
 message = "kaspersky_bot is busy..."
end

oauth = Twitter::OAuth.new('consumer token', 'consumer secret')
oauth.authorize_from_access('access token', 'access secret')

client = Twitter::Base.new(oauth)
client.update(date + message)
```
Sublime Text で pythonbrew

==========================

Sublime TextのPluginのPythonのバージョンは2.6.7なのでバージョンを3.2や2.7などから切替えて使いたいです。

Macでversion_info.pyをcommand+bでBuildすると2.7.1のバージョンが表示されます。

```python:version_info.py
import sys
print sys.version_info
```

    sys.version_info(major=2, minor=7, micro=1, releaselevel='final', serial=0)

pythonbrewのpathがSublime Textに通っていないのでバージョンの切替が反映されませんので、少しpythonbrewに手をいれて対応させます。

## pythonbrewのバージョンの切替でシンボリックリンクを作成

pybrewのswitchとuseでバージョンを切替えたときにカレントバージョンのシンボリックリンクを作ります。
run_commandの最後に追加します。（switchとuseは同じコードです。）

```python:~/.pythonbrew/scripts/pythonbrew/commands/switch.py
def run_command(self, options, args):

  # (略)

  path = os.path.abspath(os.path.join(PATH_PYTHONS, '..', 'current'))
  if os.path.isdir(path):
      os.unlink(path)
  os.symlink(os.path.abspath(os.path.join(PATH_PYTHONS, pkgname)), path)
```

```python:~/.pythonbrew/scripts/pythonbrew/commands/use.py
def run_command(self, options, args):

  # (略)

  path = os.path.abspath(os.path.join(PATH_PYTHONS, '..', 'current'))
  if os.path.isdir(path):
      os.unlink(path)
  os.symlink(os.path.abspath(os.path.join(PATH_PYTHONS, pkgname)), path)
```

##Sublime Textにpathを設定
PackagesのPythonのPython.sublime-buildにpathを追加します。
(userは任意に変更して下さい。)


```json:Python.sublime-build
{
  "cmd": ["python", "-u", "$file"],
  "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
  "selector": "source.python",
  "path": "/Users/user/.pythonbrew/current/bin:/usr/bin:/bin:/usr/sbin:/sbin"
}
```


## pythonbrewでバージョンを切替えてバージョンを確認

まずはuseで確認

    $ pybrew use 2.7.2

command+bでバージョンを確認すると2.7.2が表示されます。

    sys.version_info(major=2, minor=7, micro=2, releaselevel='final', serial=0)

つぎにswitchで確認

    $ pybrew switch 2.6.7

command+bでバージョンを確認すると2.6.7が表示されます。

    (2, 6, 7, 'final', 0)


**バージョンの切替がSublime Textに反映されるようになりました。**
ON/OFF 切り替えスイッチを簡単に実装する

iOS アプリ開発で ON/OFF 切り替えスイッチを作成したいときがある。そういうときは `UISwitch` を使うのが標準的な方法なんだけど、文言は変更できないし画像も設定できないので、たいてい役に立たない。

なので画像や文言を設定できる ON/OFF 切り替えスイッチを `UIButton` で実装してみた。

スイッチの宣言、配置はこんな感じ。

```objective-c
UIButton* mySwitch = [UIButton buttonWithType:UIButtonTypeCustom];

// OFFの画像設定
[mySwitch setBackgroundImage:[UIImage imageNamed:@"btn_off" forState:UIControlStateNormal];
// OFFでボタンをタップ中の画像設定
[mySwitch setBackgroundImage:[UIImage imageNamed:@"btn_off" forState:UIControlStateHighlighted];
// ONの画像設定
[mySwitch setBackgroundImage:[UIImage imageNamed:@"btn_on" forState:UIControlStateNormal | UIControlStateSelected];
// ONでボタンをタップ中の画像設定
[mySwitch setBackgroundImage:[UIImage imageNamed:@"btn_off" forState:UIControlStateHighlighted | UIControlStateSelected];

[mySwitch addTarget:self action:@selector(mySwitchDidTap:) forControlEvents:UIControlEventTouchDown];

// 適当に配置
mySwitch.frame = CGRectMake(10, 10, 100, 44);
[self.viwe addSubView:mySwitch];
```

これは背景画像を設定する例で、 `forState:UIControlStateNormal | UIControlStateSelected` のように指定するのがポイント。

タイトル文言を設定したいときは `[mySwitch setTitle:@"ON" forState:UIControlStateNormal | UIControlStateSelected]` のように指定すればOK。

ボタンをタップしたときの処理はこんな感じ。

```objective-c
-(void)mySwitchDidTap:(UIButton *)sender
{
  sender.selected = !sender.selected;
  if (sender.selected) {
    // ON に変わった場合
    // 何か処理...
  } else {
    // OFF に変わった場合
    // 何か処理...
  }
}
```

selected プロパティを使って ON/OFF を切り替える。

似たようなことするライブラリみたいなのもあるけど、この方法で簡単にスイッチが作れると思う。
MinGWでVimをビルド。(+lua,+python)


MinGWでVimをビルドの手順
------------------------

Lua、PythonとMinGWをインストールし、以下のコマンドを実行すればよい。

>git clone https://github.com/vim-jp/vim.git
>cd ..\vim\src
>set C_INCLUDE_PATH=C:\\Python27\\include
>set path=C:\MinGW\bin
>mingw32-make -f Make_ming.mak GUI=yes IME=yes MBYTE=yes ICONV=yes PYTHON="C:\Python27" DYNAMIC_PYTHON=yes PYTHON_VER=27 CSCOPE=yes NETBEANS=no LUA="C:\Program\ Files\Lua\5.1" DYNAMIC_LUA=yes

補足
----

* RubyとPerlはめんどかったのでインストールしなかった。
* NETBEANSは使う予定ないからnoにした。
* C_INCLUDE_PATHにC:\\Python27\\includeを指定しておかないとPython.hがないと怒られる。
* ビルド時間は1分くらい。
* http://vim-jp.org/docs/build_windows_mingw.html
* http://code.google.com/p/vim/source/checkout
* http://tech.groups.yahoo.com/group/vim/message/82006
* https://groups.google.com/forum/?fromgroups#!forum/vim_dev
コメント中に 'TODO' や 'FIXME' と書くと, Vimではそれがハイライトされる

このハイライトは, syntax file

```vim
$VIMRUNTIME/syntax/*.vim
```

で定義されている.
よって, filetypeごとにハイライトされる文字が異なる.

ざっと見たところ, 以下の文字がよくハイライトされる.

> TODO FIXME XXX NOTE

詳しくは, 各filetypeのsyntax file

```vim
$VIMRUNTIME/syntax/*.vim
```

を見る.


# 参考

なお, [`$VIMRUNTIME`](https://vim-jp.org/vimdoc-ja/starting.html#$VIMRUNTIME)の値はVimで,

```vim:Vim
:echo $VIMRUNTIME
```

とすれば, 確認できる.

現在のバッファの[filetype](https://vim-jp.org/vimdoc-ja/filetype.html)は

```vim:Vim
:set filetype
```

で確認できる.

例えば,

```vim
filetype=python
```

のsyntaxは,

```vim
$VIMRUNTIME/syntax/python.vim
```

で定義されている.

# 参照
https://vim-jp.org/vimdoc-ja/syntax.html#group-name
Markdownでスタイルシート

**CSS**のファイルを適当なディレクトリに配置して,
**Markdown**のファイルに一番上に,

```html:TopOfYourMarkdownFiles
<link href="/path/to/hoge.css" rel="stylesheet"></link>
```

と追記する.

Markdown用のスタイルシート作成については下記が参考になる.

https://github.com/simonlc/Markdown-CSS

https://github.com/kottkrig/Markdown-CSS

↑simonlc/Markdown-CSSのFork

https://github.com/jasonm23/markdown-css-themes

↑simonlc/Markdown-CSSのFork


これらのスタイルシートをそのまま使用する場合は,
Markdownのファイルに以下のように追記する.

```html:TopOfYourMarkdownFiles
<link href="https://raw.githubusercontent.com/simonlc/Markdown-CSS/master/markdown.css" rel="stylesheet"></link>
```

```html:TopOfYourMarkdownFiles
<link href="http://jasonm23.github.io/markdown-css-themes/markdown.css" rel="stylesheet"></link>
```
Python でホスト名を取得する


色々な環境でを動かしていたり、アプリケーションサーバが複数ある場合に、どの環境からメールが送信されたのかわかりづらい。

なのでメールのサブジェクトにホスト名を含めて送信する。
socketモジュールでホスト名を取得することができるので、これをプレフィックスにしてメールを送信する。

## socket


``` settings.py
from socket import gethostname
EMAIL_SUBJECT_PREFX = '[%s]' % gethostname()
```

## os
またはosモジュールのunameから取得することもできる。

``` settings.py
import os
EMAIL_SUBJECT_PREFIX = '[%s]' % os.uname()[1]
```


## platform
同様にplatformモジュールでも。

```settings.py
import platform
EMAIL_SUBJECT_PREFIX = '[%s]' % platform.uname()[1]
```
15分でCocosBuilderをさくっと試してみるまとめ

CocosBuilderは無料のツールで,これを使うとcocos2dのレイアウトをInterfaceBuilderのようにGUI上で操作できるようになります。

viewのプログラミングは面白くないしめんどくさいので、こういうツールをつかって楽しましょう。

###CocosBuilderを入手
***
[ここ](http://cocosbuilder.com/?page_id=11)から最新版のApplicationとExamplesをダウンロードしてきて解凍。


###プロジェクト作成
***
 cocos2dのテンプレートからcocos2d iOSのプロジェクトを作成。


###読み込み用のファイルを追加
***

上で落としてきたExampleの
 **CocosBuilder-2.0-rc3-examples** > **Add to Your Project** > **cocos2d-iphone** 
 を、上でつくったプロジェクトにドラッグアンドドロップ。
 
###レイヤーを追加
***
メニューバーの **File** -> **New** -> **File…** から cocos2dv2.x の CCNode class を選択してnextをクリック。

Subclass of CCLayerを指定して追加。

ここでは"CCBTest"という名前にしておきます。

###CocosBuilderプロジェクトを作成
***
CocosBuilderを起動して、**File** -> **New** -> **New Project…** から適当なところにプロジェクト作成。

ここでは"CCBTest"という名前にしておきます。

###CCBプロジェクトの設定
***

**・素材の場所を指定**

**File** -> **Project Settings…** から,

![Screenshot1](http://cl.ly/image/0m3j0P1k0e0o/screenshot1.png)

をクリックし、上でつくったcocos2dのプロジェクトのResourcesフォルダを指定。

**・Publish先を指定**

![Screenshot2](http://cl.ly/image/290L2P1I1w0u/screenshot2.png)

をクリックして、上でつくったcocos2dプロジェクトのResourcesフォルダを指定。

最後に **Publish to zip file** にチェックをいれてDone。

###パーツの配置
***
**File** -> **New** -> **New File…** から、

![Screenshot3](http://cl.ly/image/0o422U0R2O1U/ScreenShot3.png)

上のように設定してCreate。

名前は一応上でつくったLayerに合わせておいて（ここではCCBTest）、
StructureのCCLayerを選択し、右のCodeConnectionsを以下のように設定。

![Screenshot4](http://cl.ly/image/003N2k1r1b2F/screenshot4.png)

これでxcode側でつくったCCBTestレイヤーとリンクします。

それができたら、**Object** -> **Add Object** からいろんなパーツをぺけぺけ置いたりして画面をつくりましょう。作り終わったら **File** -> **Save** で保存。

保存ができたら、**File** -> **Publish** を実行。

"ccb.zip"というファイルが上で指定したPublish先に生成されるので、それを上でつくったxcodeプロジェクトにドラッグアンドドロップ。

###ビルド設定の変更
***

######・Preprocessor Macrosに、**"CCB_ENABLE_UNZIP"**を追加

![Screenshot4](http://cl.ly/image/0W2m1g3w0V0d/screenshot5.png)


######・AppDelegateにCCBReaderをインポート
**#import "CCBReader.h"**をAppDelegate.mに追加。

######・サンプルのレイヤーをつくったやつに入れ替えてみる

Appdelegate.m の *- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions* の先頭に,

	[CCBFileUtils sharedFileUtils];
を追加。
（*[director_ setView:glView];*の前ならどこでもいいけど、わかりやすいように先頭に。）

さらに AppDelegate.m 76行目あたりの、

	[director_ pushScene: [IntroLayer scene]]; 


を、

    [CCBReader unzipResources:@"ccb.zip"];
    CCScene* scene = [CCBReader sceneWithNodeGraphFromFile:@"CCBTest.ccbi"];
    [director_ pushScene: scene];

に変更してビルド。


さきほどつくった画面が表示されるはずです。


***
###おしまい！
メンバ変数にリンクしたりするのもかんたんなので、ここまでやってみて興味でてきた人は[CocosBuilderのUser Guide](https://github.com/cocos2d/CocosBuilder/blob/master/Documentation/1.%20User%20Guide.md)を参考にやってみると楽しいとおもいます！(・∀・)
PHPで使うGoFパターン ひとり Advent Calendar - CoR


CoRって?
--
いままでカタカナ表記を頑に守ってきたのですが、こいつは名前が長いので略式表記にします。"Chain of Responsibility"です。イメージはDNSですかね。

はじめのDNS「jp? ああ、あいつに聞くか」
JPのDNS「co?ああ、あいつだ」
coのDNS「aainc?ああ、ああ、あいつだ」
aaincのDNS「ブログ? ああ、それならあそこだ」

と、いう感じでIPアドレスに解決します。これをオブジェクト指向でやるのがCoRです。

CoRの構造
--

* Client - 使う人
* IHandler - 上記の例で言えばDNSサーバーのインターフェース。単純なので今回は抽象クラスにします。
* 実Handler - 上記の例で言えば実際のレベルごとのDNSです

```
<?php
function say ( $l ) { print "$l\n"; }

abstract class HandlerBase {
  private $_Next       = array ();
  private $_Dictionary = array ();
  public function query ( $query ) {
    if ( !$query ) throw new Exception ( 'クエリが無いっす' );
    $elms = preg_split ( '#\.#', $query );
    $elm  = array_pop ( $elms );
    if ( !$elms ) return $this->_Dictionary[$elm];
    else          return $this->getNext($elm)->query ( join ( '.' , $elms ) );
  }

  public function setNext ( $key, $obj ) {
    if ( !( $obj instanceof HandlerBase ) )
      throw new Exception ( 'そんなオブジェクト無理だもん' );
    $this->_Next[$key] = $obj;
    return $this;
  }

  public function getNext ( $elm ) {
    if ( $this->_Next[$elm] ) return $this->_Next[$elm];
    else                      throw new Exception ( 'Nextないっす' );
  }

  public function setDictionary ( $dict ) {
    $this->_Dictionary = $dict;
    return $this;
  }
}

class DNS extends HandlerBase {
}

$hoge = new DNS ();
$hoge->setDictionary ( array (
  'wiki' => '1.1.1.2',
  'blog' => '1.1.1.3',
));

$fuga = new DNS ();
$fuga->setDictionary ( array (
  'wiki' => '2.1.1.2',
  'blog' => '2.1.1.3',
));

$com = new DNS ();
$com->setDictionary ( array (
  'hoge' => '1.1.1.1',
  'fuga' => '2.1.1.1',
))
->setNext ( 'hoge', $hoge )
->setNext ( 'fuga', $fuga );

$tld = new DNS ();
$tld->setNext ( 'com', $com );

say ( $tld->query ( 'hoge.com' )      == '1.1.1.1' ? 'OK' : 'NG' );
say ( $tld->query ( 'wiki.hoge.com' ) == '1.1.1.2' ? 'OK' : 'NG' );
say ( $tld->query ( 'blog.fuga.com' ) == '2.1.1.3' ? 'OK' : 'NG' );
say ( $tld->query ( 'fuga.com' )      == '2.1.1.1' ? 'OK' : 'NG' );
```

とりあえず今回は単純なので具象クラスは一個にしちゃいましたが中間のレベルの具象クラスを目的に特化させて派生したものをsetNextする設計でも良いです。

どういう時に使うの?
--
身も蓋もない言い方をすると「そういうデータ構造を表す場合に使う」ということになります。
具体的には以下。

* MVCフレームワークやAPIでのURLのルーティング
* ツリー構造の検索
* ファイルシステムのラッパ

どちらかというと業務からは遠いですね。(勿論、そういうデータ構造を扱うならば使うでしょう)
ライブラリの設計者などがよく使うかも知れません。

端書き
--
このパターンはインタンスの生成が複雑になり易いです。FactoryMethodやAbstractFactoryを併用しましょう。
「filterM で powerset」をC#に翻訳

powerset（べき集合）というのは、すべての部分集合を集めた集合。

元ネタだったqiitaの記事「filterM で powerset」が消えてるから、記憶から再構成。

```hs
powerset :: [a] -> [[a]]
powerset =  filterM (const [True, False])
```

（ちなみに、Haskellには `subsequences` という関数があって、上記powersetと等価である。）

C#にはモナドクラスなんてないからfilterMもないわけで、リスト（IEnumetrable<T>）に特化した形で書くしかないからおいしくはない。

```c#:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var array = new[] { 1, 2, 3, 4, 5 };
        Func<int, IEnumerable<bool>> pred = x => new[] { true, false };

        foreach (var l in array.WhereMany(pred))
        {
            Console.WriteLine(l.ToStringEx());
        }
    }
}

public static class EnumerableEx
{
    public static IEnumerable<IEnumerable<T>> WhereMany<T>(
        this IEnumerable<T> source,
        Func<T, IEnumerable<bool>> predicates)
    {
        return source.GetEnumerator().WhereMany(predicates);
    }

    public static IEnumerable<IEnumerable<T>> WhereMany<T>(
        this IEnumerator<T> source,
        Func<T, IEnumerable<bool>> predicates)
    {
        if (!source.MoveNext())
            return Enumerable.Repeat(Enumerable.Empty<T>(), 1);

        var x = source.Current;
        var yss = source.WhereMany(predicates);
        return from b in predicates(x)
               from ys in yss
               select (b ? Enumerable.Repeat(x, 1).Concat(ys) : ys);
    }

    public static string ToStringEx<T>(this IEnumerable<T> source)
    {
        var strings = source.Select(x => x.ToString());
        return "[" + string.Join(", ", strings) + "]";
    }
}
```
JBoss 関連リンク


JavaEE準拠のアプリケーションサーバである、JBoss の関連リンクをまとめます。

アプリケーションサーバとしての JBoss には、コミュニティ版である AS と、商用(RedHatサポート)版である EAP がありますが、JavaEE プログラミングを行う上では大きな差はありません(※)ので、AS向き、EAP向きにこだわらず列挙していきます。

※ 乱暴な例え話で恐縮ですが、 Linux で言えば、Fedora と Red Hat Enterprise Linux の違いのようなものです。詳しくは以下のリンクで紹介されています。
[コミュニティ版JBoss ASとエンタープライズ版JBoss EAPの違い](http://d.hatena.ne.jp/nekop/20110516/1305526652)

なお、2012/08月現在、AS のメジャーバージョンは 7、EAP のメジャーバージョンは 6 です。EAP 6 は AS 7 をベースに開発されていますので、EAP 6 の記事を読まれた後、AS で試す場合は、AS 7 を利用する必要がありますのでご注意ください。AS 6 以前と AS 7 では、設定方法がかなり異なります。

* [AS コミュニティサイト](http://www.jboss.org/jbossas)
* [EAP マニュアル](http://docs.redhat.com/docs/ja-JP/JBoss_Enterprise_Application_Platform/index.html)
* [JBoss Developer Framework(JavaEEプログラミング情報サイト。サンプルが盛りだくさんです)](http://www.jboss.org/jdf/)
* [Hot to JBoss(JBoss EAP向け情報サイト)](http://howtojboss.com/)
* [Middleware Magic(JBoss や WebLogic Serverの情報サイト)](http://middlewaremagic.com/)
githubのpull requestの基本


pull requestつくる手順。まだよくわかっていません。子細な点でもよいので、気になるところがあればツッコミください。


##1.githubアカウントをつくる
Signup and Pricingからどうぞ


##2.githubのブラウザ上からpullrequestを送りたいリポジトリのページからforkする
右上のfolkからどうぞ

##3.ローカルにcloneする

```sh
%git clone repositry_name.git```

##4.適宜編集する

##5.下記の手順でブランチを切る

下記はオレオレメモ
git branch -aはただの確認コマンド
本命は、git checkout -b branch_name

```sh
%git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

%git checkout -b testb
M	spec/BowlingTest.js
M	src/Bowling.coffee
M	src/Bowling.js
Switched to a new branch 'testb'

%git branch -a        
  master
* testb
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
```

##6.commitしてgithub上の自分のリポジトリにpushする

```sh
%git add .
%git commit -m "fix bug"
%git push origin testb
```

##7.github上の自分のリポジトリのページのpull requestを送る
適宜メッセージを編集してください

##(8.pull requestを送られた方は、ブラウザ上からmergeできる)
ただ、普通はローカルでmergeして検証してから上にあげるらしい
IEバージョン別に、違うCSSを指定したいときは

IEと別のブラウザで、同じ値を指定しても微妙にpaddingやmarginの見え方が違ってしまいます。
細かく調整する方法として、下記のように書くことでバージョン別にCSSを指定できます。

■ 値の末尾に「\9」をつけると、IE8以下のみに適用(IEにだけCSSを指定したい場合、これを使えばOK)
■ キーの頭に「*」をつけると、IE7以下のみに適用
■ キーの頭に「_」をつけると、IE6のみ（IE5にも効くのかは不明）に適用（IE6だけ動きがおかしいときは、これを使えばOK）

```
#selector {
    width: 10px; /* 全てのブラウザに適用 */
    width : 12px\9; /* IE8以下に適用 */
    *width : 11px; /* IE7以下に適用 */
    _width : 15px; /* IE6に適用 */
}
```
IE6などでも、要素の透過度を指定する

CSS3に対応していないIEでも、要素の透過度を指定することが出来ます。

```
#selector {
   opacity: 0.10;/* CSS3対応ブラウザ（Firefox, Chrome, Safariなど）向け*/
   -moz-opacity: 0.10;/* Firefox older*/
   filter: alpha(opacity=10);/* Netscape*/
   -ms-filter: alpha(opacity=10);/* IE6+ */
}
```
長い単語を要素内で改行したいときのCSS

Divなどの要素内では、1つの単語の長さ ＞ 要素の幅 になると、
単語が要素からはみ出してしまいます。
下記のようなCSSを指定することで、単語の途中でも強制的に、
要素の幅に合わせて改行することが出来ます。

```
<div>abcdefghijklmnopqrstuvwxyz</div>
```

```
div{
    width:50px; /*※必ず幅を指定してください*/
    word-wrap:break-word;
}
```
Macbook Pro いじり日記


##インストールしたもの
* kobito
* Microsoft Office for Mac 2011
 * Remote Desktop Connection Client for Mac
 * Work,Excel,PowerPoint
* Windows Live Mesh
* KeepassX
* Adobe Flash
* Google Chrome
* Atok
* Github
* homebrew
  * http://mxcl.github.com/homebrew/



##App Storeからインストールしたもの
* Tiwtter
* LimeChat
* Xcode
* Reeder
* Keynote

##Xcodeの設定
* gitなどの開発系コマンドが無い
  * メニュー [Xcode]- [Preferences] – [Downloads]タブ内 [Components] から
[Command Line Tools] をインストール

## Retina Native化
* setResXをインストール
![setResX](http://farm9.staticflickr.com/8427/7784619888_c354a4324a_m_d.jpg)
  * http://osxdaily.com/2012/06/18/3-ways-to-run-a-retina-macbook-pro-at-2880x1800-native-resolution/
Express で、コントローラーは別のファイルの場所に書きたい。


とりあえず、expressの情報をコントローラーに渡せば解決した。


app.js

```
var app = express();
TodoController = require("./controllers/todos_controller")(app);
```

TodoControllerにファイルを渡す。次に、

todos_controller.js

```

var TodoController = function(app){

	app.get('/todos', function(req,res){
			console.log("hello");
	});
	app.post("/todos",function(req,res){
	});
};

module.exports = TodoController;

```
gitの設定

>git初心者のためのgit講座ぽいのを書いていたら副産物的にできたのでちょっと別枠で書き出しました。

gitの設定の仕方は`~/.gitconfig`内で色々設定できます。
例えば、僕の.gitconfigには

```.gitconfig
[user]
    name = asonas
    email = hzw1258@gmail.com
[core]
    excludesfile = ~/.gitignore #共通でignoreしたいファイルたち

[alias]
    graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
    st = status
    df = diff
    co = checkout
    last = show -1 HEAD --stat -p
    ci = commit
    bull = pull
    dfc = diff --color-words

[color]
    ui = true
    diff = true

```

みたいなことを書いてます。
正直なところ、`.gitconfig`になにも設定しなくても、gitは使えるのですが、最低限設定して欲しいのが`[color]`オプションでしょうか。

## color
このオプションを設定していないと
![image](http://c714091.r91.cf2.rackcdn.com/5db18632771ced7abb1815dd34f6e8da1dc8f1ec38.png 'before')

![image](http://tardis1.tinygrab.com/grabs/5db18632779efad135a63d53811f5566e182fe5eaf.png 'before')

というような色味の無いstatusとdiffになっちゃう
これを解消するために3行ほど追記する

``` .gitconfig
[color]
    ui = true
    diff = true
```
これを書いてあると

![image](http://tardis1.tinygrab.com/grabs/5db1863277f9d7eefce3956cb3b8c866aabd1bff0a.png)

こういうふうにカラーな感じになります。
また、編集したファイルの差分を見るときも

![image](http://tardis1.tinygrab.com/grabs/5db186327731603ef7b415c6d33f7c03af8c83cc54.png)

こうやってみるとどこを編集したかが一目瞭然でわかりやすい。便利
gitを使う上でというか、バージョン管理システムを使う上で、そのリポジトリの状態(status)とその差分(diff)はよく見る。
だから、リポジトリの状態は見やすくしておきたいのでcolorオプションは、必須とも言えるオプションじゃないかなと思います。


## alias
ほとんどは長いコマンドを短くするために設定していますが、

```
graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
```

などは指定しておくと便利だと思います。
こんな感じで表示されます。

![image](http://tardis1.tinygrab.com/grabs/5db1863277588bdf6d549886f927dd69f36bf8a426.png)

上の画像はなにが起きているかというと、リポジトリの歴史をひとつの線でたどることができます。
画面の真ん中よりしたの方の`07e4aa2`っていうコミットの線をたどるとdevelopブランチからmasterブランチにマージされたのだとわかるよね。

ブランチを切れば歴史が分岐するから`git graph`コマンドでは線も分岐するし、マージをすれば線がマージされる。

`git graph`は、最初は戸惑うかもしれないけど、誰かと一緒に作業をしたり、ブランチを切るような事があればぜひともaliasに追加したいですね。
似たファイルをまとめてマークするコマンドを追加する

![before](http://gyazo.snca.net/551a280eb5521a57305a65a8f05841d4.png)

こんな感じにファイルが並んでいるときに、

:mark_similars

すると、

![after](http://gyazo.snca.net/cee5ef2694253428d229bf8d2afe2fb5.png)

同じような名前のファイルだけ、マークできる!

rc.conf で適当にマッピングしておくと便利。


```commands.py
from ranger.api.commands import *


class mark_similars(Command):
  """
  :mark_similars [<NAME>]

  Mark all similar files by the name.
  """
  do_mark = True

  def execute(self):
    from re import compile, sub, I, UNICODE

    arg = self.rest(1)
    if not arg:
      arg = self.fm.thisfile.basename

    pattern = compile('^' + sub(r'[^ァ-ヶぁ-ん一-龠a-zA-Z]+', '.+', arg) + '$', I | UNICODE)

    cwd = self.fm.thisdir
    for file in cwd.files:
      if pattern.search(file.basename):
        #cwd.mark_item(file, val=self.do_mark)
        cwd.toggle_mark(file)

    self.fm.ui.status.need_redraw = True
    self.fm.ui.need_redraw = True
```
:find コマンドの Migemo 版、:mfind

基本的な部分は、:find そのままです。

当然のように cmigemo コマンドとその辞書が必要です
(cmigemo 入れたら入ると思います)

当初は、PyMigemo を使おうとしたんですが、Python3 ではインストールできず、Python 知らない自分が大変そうなので、
popen で cmigemo コマンドをこっそり起動して使ってます。

rc.conf で

```rc.conf
map f console mfind 
```

とかすると便利でしょう。(行末の空白を忘れずに入れよう!)

```commands.py
# Copyright (C) 2012 anekos
# Copyright (C) 2009, 2010, 2011 Roman Zimbelmann <romanz@lavabit.com>
# This configuration file is licensed under the same terms as ranger.
#
# ranger - http://ranger.nongnu.org/

class mfind(Command):
  """
:mfind <EXPR{2,}>

Migemized find.
"""

  tab = Command._tab_directory_content
  last_rexpr = None
  migemo = None

  def get_instance (self):
    if not self.migemo:
      from subprocess import Popen, PIPE
      self.migemo = Popen(["cmigemo", "-q", "-d", "/usr/share/migemo/utf-8/migemo-dict"], stdout=PIPE, stdin=PIPE)
    return self.migemo

  def get_rexpr (self, expr):
    if not expr or len(expr) <= 1:
      return None

    m = self.get_instance()
    m.stdin.write(bytearray(expr + "\n", "UTF-8"))

    migemo_result = str(m.stdout.readline(), "UTF-8").rstrip()
    try:
      import re
      return re.compile(migemo_result, re.L | re.U | re.I)
    except:
      return None

  def execute (self):
    if self.quick():
      self.fm.move(right=1)
      self.fm.block_input(0.5)
    else:
      self.fm.cd(self.rest(1))

    # for n/N (search_next)
    if self.last_rexpr:
      self.fm.thistab.last_search = self.last_rexpr
      self.fm.search_method = 'search'

  def quick(self):
    cwd = self.fm.thisdir
    arg = self.rest(1)
    if not arg:
      return False

    if arg == '.':
      return False
    if arg == '..':
      return True

    rexpr = self.get_rexpr(arg)
    self.last_rexpr = rexpr

    if not rexpr:
      return False

    count = 0
    deq = deque(cwd.files)
    deq.rotate(-cwd.pointer)
    i = 0
    for fsobj in deq:
      from re import search
      if search(rexpr, fsobj.basename):
        count += 1
        if count == 1:
          cwd.move(to=(cwd.pointer + i) % len(cwd.files))
          self.fm.thisfile = cwd.pointed_obj
      if count > 1:
        return False
      i += 1

    return count == 1
```
mkseldir - mkdir して、さらにそれを選択するコマンド

デフォルトの :mkdir コマンドの改良版。
mkdir した後に、そのディレクトリを選択します。

作者からコメントをもらったので更新
----------------------------------

```commands-mkseldir2.py
from ranger.api.commands import *
class mkseldir(Command):
  """
  :mkseldir <dirname>

  Creates a directory with the name <dirname>, and select it.
  """

  def execute(self):
    from os.path import join, expanduser, lexists
    dirname = join(self.fm.thisdir.path, expanduser(self.rest(1)))
    if not lexists(dirname):
      self.fm.mkdir(dirname)
      if lexists(dirname):
        self.fm.thisdir.load_content(schedule=False)
        self.fm.select_file(dirname)
      else:
        self.fm.notify("Failed to mkdir!", bad=True)
    else:
      self.fm.notify("file/directory exists!", bad=True)
```


以下は古いバージョン
----------------------------

```commands.py
from ranger.api.commands import *

class mkseldir(Command):
  """
  :mkseldir <dirname>

  Creates a directory with the name <dirname>, and select it.
  """

  def execute(self):
    from os.path import join, expanduser, lexists
    dirname = join(self.fm.thisdir.path, expanduser(self.rest(1)))
    if not lexists(dirname):
      self.fm.mkdir(dirname)
      if lexists(dirname):
        item = ranger.fsobject.directory.Directory(dirname, path_is_abs=True)
        item.load()
        self.fm.thisdir.files.append(item)
        self.fm.select_file(dirname)
      else:
        self.fm.notify("Failed to mkdir!", bad=True)
    else:
      self.fm.notify("file/directory exists!", bad=True)
```

Veedrac さんに教えてもらいました!!!
https://bbs.archlinux.org/viewtopic.php?pid=1155529#p1155529
9/3 Sendagaya.rb #17


# RESTの執筆ネタ

## 関係テーブルをリソースにする例
n:nが現れるもの全部。1:nでもOK。

### DHHのやつ (1)
`users <--(n:n)--> groups`
↓
`users <--(1:n)--> memberships <--(n:1)--> groups`
POST /memberships (w/ user_id=1&group_id=2) => memberships#create
 or
POST /users/1/memberships (w/ group_id=2)

### DHHのやつ (2)
n:nではない例。
`accounts <--(1:n)--> plans`
↓
`accounts <--(1:n)--> subscriptions <--(1:1)--> plans`
POST /accounts/1/subscriptions

### DHHのやつ (3)
`kases`
POST /kases/1/close => kases#close
↓
`kases <--(1:1)--> closures <--(n:1)--> people`
POST /kases/1/closure => closures#create
↓

```
kases <--(1:n)--> progresses <--(n:1)--> initiator (people)
  (opened, reviewed, closed) <--(n:1)--> verifier (people)
```
POST /kases/1/opened => openeds#create
POST /kases/1/reviewed => revieweds#create
POST /kases/1/closed => closeds#create

名前がいまいち（要再考）だけど、controllerも継承してつくればいいよね。
controllerもなんかおかしい？とPaulさんに指摘されたので、もう少し考えよう。


```
class OpenedsController < ProgressesController
...
```


### fukajunさんの

`events <--(n:n)--> users`
↓
`events <--(1:n)--> attendances <--(n:1)--> users`
Rails on HerokuでStaging

本番と同一の環境で色々試したいので作ることに。というか最初からやっておくべきだった。
####Staging用にHerokuAppを作る
`$ heroku create yourapp-staging --remote staging`
####環境設定ファイルをコピー
`$ cp config/environments/production.rb config/environments/staging.rb`
適宜設定を変えるのも良いと思います。
####Herokuの環境変数を設定
`$ heroku config:add RACK_ENV=staging RAILS_ENV=staging --remote staging`
####git pushする際のキーワードを変更
`git push heroku master`とかしていると自分がどこにpushしてるのか分かりにくく感じたので、.git/configを編集しました。

```git:.git/config
# [remote "heroku"]
# を下に置換
[remote "production"]
```

これで本番環境は`git push production master`、staging環境は`git push staging master`で出来るようになった。
####Staging環境に鍵をかける
あんまり人に見られる物でもないので、Basic認証をかけます。

```ruby:app/controller/application_controller.rb
class ApplicationController < ActionController::Base

  before_filter :password_protected if Rails.env.staging?
 
  protected
  def password_protected
    authenticate_or_request_with_http_basic do |username, password|
      username == "name" && password == "password"
    end
  end
 
end
```

#####追記
コメントで頂いた記法（Rails3.1以降）では簡潔に書けるようになってるみたいです

```ruby:app/controller/application_controller.rb
class ApplicationController < ActionController::Base
  http_basic_authenticate_with :name => "name", :password => "password" if Rails.env.staging?
end
```

綺麗でいいですね。

####その他
AmazonS3等を利用する際は同一のサーバを使うので、違うKeyを使うなどして対応します。

```
$ heroku config:add S3_KEY=XXX --remote staging
$ heroku config:add S3_SECRET=YYY --remote staging
```
ActiveRecordのsave/create/updateコールバックを一時的に消す

バージョンによって方法が違うみたい．
AR2系なら[StackOverflow](http://stackoverflow.com/questions/632742/how-can-i-avoid-running-activerecord-callbacks)を参考に．

## 環境
ActiveRecord 3.2.6

## 方法
```ruby
MyModel.reset_callbacks :create
MyModel.reset_callbacks :save
MyModel.reset_callbacks :update
```

実装はactivesupport(!=activerecord)の`lib/active_support/callbacks.rb`にある．
ディレクトリ配下のファイルに対して、MD5ハッシュ値を取得する

指定されたディレクトリ配下のファイルに対して、MD5ハッシュ値を取得するスクリプト
 
下記ブログを参考に作成
PowerShell でハッシュ値を計算する(http://blogs.gine.jp/taka/archives/1369)

```powershell:GetMD5.ps1
param($path)

function GetMD5{
    param($fileName)
    
    $stream = New-Object IO.StreamReader $fileName

    # MD5ハッシュ値を計算する
    $md5 = [System.Security.Cryptography.MD5]::Create()
    $hash = $md5.ComputeHash($stream.BaseStream);
    $result = [System.BitConverter]::ToString($hash).Replace("-","").ToLower()

    $result
}

Get-ChildItem $path  | ?{ !$_.PSIsContainer } |
%{
    echo ($_.Name + "`t" + (GetMD5 $_.FullName))
}
```
Cocoa Podsセッティング

Hoge.xcodeprojのある階層に
Podfileと.Podsディレクトリを作成

Podfileの中身はこんな感じ
***
xcodeproj './Hoge.xcodeproj'
platform :ios

pod 'AFNetworking'

target :test, exclusive: true do
  link_with 'HogeTests'
  pod 'OCMock'
  pod 'NLTHTTPStubServer'
end
***

 pod install
でHoge.xcworkspaceが出来上がる
SubversionのリポジトリをGitのbareリポジトリとして移行する

SubversionのリポジトリをGitのbareリポジトリとして移行したい場合は、このようにするとできるようです。

```bash
git init --bare --shared=true foo.git
cd foo.git
git --bare svn init -s file:///path/to/svn/repo
git --bare svn fetch
```

`--shared`や`-s|--stdlayout`は状況に合わせて。


実際にやってみた例：

```bash
$ git init --bare --shared=true foo.git
Initialized empty shared Git repository in /path/to/foo.git/

$ cd foo.git
$ git --bare svn init file:///path/to/svn/foo

$ git --bare svn fetch
        A       test.txt
r1 = b4e77596a114e2bbf8ad2d137e32f4a4778ee8cd (refs/remotes/git-svn)
        M       test.txt
r2 = 2be192a6a6c50f24aab03a99e7087c174898fe81 (refs/remotes/git-svn)
        M       test.txt
r3 = c54ca3c61befaec9ba16cf177c082ca7502dbe89 (refs/remotes/git-svn)
```

`init`、`svn init`、`svn fetch`の三段階でやらないとだめみたいで、`git --bare svn clone ...`はうまくいきませんでした。

`git svn clone`で手元に持ってくるのはよくありますが、最初からbareリポジトリとして移行する方法があまり見当たらなかったので書いてみました。
PHP Fatal error:  Trait method display has not been applied, because there are collisions with other trait methods on XXXX


こんな感じのコードで怒られた。

```php
<?php
trait BaseModule
{
    function display()
    {
        echo "BaseModule::display\n";
    }
}

trait ModuleA
{
    use BaseModule;
}

trait ModuleB
{
    use BaseModule;
}

class Test
{
    use ModuleA;
    use ModuleB;
}

(new BaseModule)->display();
```

Rubyとかだとどうなってるんだろうと思って試してみた。

```ruby
module BaseModule
  def dispay
    puts "BaseModule::display"
  end
end

module ModuleA
  include BaseModule
end

module ModuleB
  include BaseModule
end

class Test
  include ModuleA
  include ModuleB
end

Test.new.display
```

Rubyは期待通りに

```command
BaseModule::display
```

って表示される。

うーん。`insteadof`で回避できるらしいが…。