OmniAICreator/Qiita-1.07M huggingface dataset:
suinさんのじゃんけんをFRP風に書いてみた。


## 元ネタ
http://qiita.com/items/29f87d5ddef78ecb69ff

## RFPとは?
functional reactive programmingのことです。
詳細は[こちら](http://maoe.hatenadiary.jp/entry/20100109/1263059731)。

## どんな時に役立つの？
webとかでイベントがどんどん発火する時、簡単かつ清潔に対応するが出来ます。例えば

```JavaScript
var plus = $("#plus").asEventStream("click").map(1);
var minus = $("#minus").asEventStream("click").map(-1);
var both = plus.merge(minus);

both.onValue(function(val) { /* val will be 1 or -1 */ });
```

jQueryセレクターから簡単にevent streamを生成して操作する事が可能になります。

## [Bacon.js](https://github.com/raimohanska/bacon.js)
ブラウザ、Node.js両方とも使えるRFPライブラリです。

## コード

beats関数は[元ネタ](http://qiita.com/items/29f87d5ddef78ecb69ff)の物をそのまま使っています。

```coffee-script
Bacon = require 'baconjs'

you = new Bacon.Bus()
opponent = new Bacon.Bus()

result = you.toProperty()
            .combine(opponent.toProperty(), beats)
            .onValue (d) -> console.log d

you.push 'paper' # you: paper
opponent.push 'paper' # you: paper, opponent: paper => false
opponent.push 'rock' # you: paper, opponent: rock => true
you.push 'scissors' # you: scissors, opponent: rock => false
opponent.push 'paper' # you: scissors, opponent: paper => true
```

コンセプトとしてはこんな感じになります。
![概要](https://raw.github.com/wiki/raimohanska/bacon.js/baconjs-combine.png)
JavaScriptで複数行文字列

[Firefoxがver.17からFunction.toStringがコメントを含めたコードを返すようになっていた](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/toString)ので、
こんな書き方もできるようになったのかなぁと。


```js:
var text = function() {/*
<html>
    <title>hello</title>
</html>*/
}.toString().match(/.*\r?\n([\s\S]*)\*\//)[1];

console.log(text);
//<html>
    //<title>hello</title>
//</html>
```

### 長所
1. 事前の準備がいらない。

### 短所
1. きたない。
2. ブラウザの実装依存。
3. 正規表現を書くのが面倒。
4. minifyされると死ぬ。
mysql.sock（またはmysqld.sock）の設定


`/etc/my.cnf` あるいは `~/.my.cnf` などで以下のように設定する。（環境・インストール方法によって設定場所は異なる）

```
[mysqld]
socket=/tmp/mysqld.sock
```

詳しくは以下のページ参照：
[MySQL :: MySQL 4.1 リファレンスマニュアル :: 4.1.2 my.cnf オプション設定ファイル](http://dev.mysql.com/doc/refman/4.1/ja/option-files.html)
Source Map V3の不満点。

CoffeeScriptの開発過程に溜まった愚痴です、別に1.6.2の動作に支障は有りませんので、無視しても構いません。

Source Map V3 specは[こちら](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit)。

## unicode
例えば`sourcesContent`にunicodeのソースコードを入れます。base64 encodingを前提にしているがunicode charactersのencodingについて一言も語っていない。

現段階では

```JavaScript
function utf8_to_b64(str) {
    return window.btoa(unescape(encodeURIComponent(str)));
}
```

```JavaScript
new Buffer(v3SourceMap).toString('base64');
```

どちらも文字化けする

## IEとの相性が悪い

`//@ sourceMappingURL=`

いくつかのファイルを圧縮処理した場合IEの[conditional comments](http://support.microsoft.com/kb/323487/en)にハマりやすい。
Titaniumでif文の中で関数をつくるとエラーになる。

ひょんなことから調べてみました。

[MOZILLA DEVELOPER NETWORK](https://developer.mozilla.org/ja/)には、

* * *

*JavaScript では、条件に基づいて関数を定義することもできます。例えば次の関数の定義は、変数 num が 0 に等しい場合のみ myFunc という関数を定義します:*

```javascript:JavaScript
if (num == 0){
  function myFunc(theObject) {
    theObject.make = "Toyota"
  }
}
```
*num が 0 に等しくない場合は関数が定義されず、その関数を実行しようとしても失敗します。*

*ECMAScript は、このようにコンテキスト内で関数が現れることを認めておらず、別の関数内またはプログラムのトップレベルのみとしています。よって、この例は ECMAScript として不正です。*

*警告: この非標準構造は、別の JavaScript の実装では異なる扱いを受けますので、可搬性があるコードを記述する際は避けるべきです。さもなければコードが、あるブラウザでは動作するが別のブラウザでは動作しない状態になるかもしれません。*

* * *

という[記載](https://developer.mozilla.org/ja/docs/JavaScript/Guide/Functions)がありますが、Titaniumにおいては別の関数内またはプログラムのトップレベル以外で関数宣言を行うと、しっかりエラーになってビルドができないようです。
 
 
 
```javascript:JavaScript
// エラーになります
if (num === 0) {
    function hello() {
        alert("hello");
    })();

    hello();    
}
```
 
 
 
どうしてもif文の中で関数を定義して実行したい場合は関数式を使えば一応動きます。

```javascript:JavaScript
if (num === 0) {
    var hello = function() {
        alert("hello");
    })();

    hello();    
}
```

```javascript:JavaScript
if (num === 0) {
    (function() {
        alert("hello");
    })();
}
```
 
 
 
また、if文のなかでつくった関数を再帰的に呼び出したい場合は、名前付きの関数式をつかえば実現できる気がします。

```javascript:JavaScript
if (num === 0) {
    var infinityHello = function hello() {
        alert("hello");
        setTimeout(hello, 1000);
    })();

    infinityHello();    
}
```

```javascript:JavaScript
if (num === 0) {
    (function hello() {
        alert("hello");
        setTimeout(hello, 1000);
    })();
}
```
iPhoneのWEBアプリをMacのWebインスペクタでデバッグ

iPhoneのSafariで動くWEBアプリを簡単にデバッグしたいなら、Webインスペクタを使おうよって話です。

前準備
akira_simpsonさんによるとこの機能はSafari6以上からだそうです。というわけでSafariのVer6以上を用意する（フォロー感謝！）。
MacとiPhoneをコードで接続しておく。

iPhone側
設定＞Safari＞詳細>Webインスペクタ
をONにする。
Safariのデバッグしたいアプリを立ち上げる。

Mac側
Safariを立ち上げる
環境設定＞詳細＞メニューバーに”開発”メニューを表示
をONにする。
開発メニューを見ると自分のデバイス名が表示されているはず。
そこからデバッグしたいアプリ情報を選択。

あとはWebインスペクタが立ち上がるので、まるでPC上のSafariをデバッグするかのような雰囲気でデバッグできる。

ブレークポイントも置ける。
Elementも選択して内容を見られる。
コンソールも出る。

費用対効果高いと思うのでお試しあれ。2年程前に一生懸命電話側のconsoleに出していたのが嘘のよう。
EBS ボリュームの snapshot をとるスクリプト


ちょっと kobito からの投稿テストを兼ねて。
EC2 は EBS ボリュームの snapshot 取っておけばバックアップになるので以前書いたスクリプト。

    class AWSBackuper(object):
        def __init__(self, access_key, secret_key, region="ap-northeast-1"):
            self.access_key = access_key
            self.secret_key = secret_key
            self.region = region
            self.set_ec2connection()
    
        def set_ec2connection(self):
            self.ec2connection = boto.ec2.connect_to_region(self.region, aws_access_key_id=self.access_key, aws_secret_access_key=self.secret_key)
    
        def create_snapshot(self, volume_id, description=None):
            self.ec2connection.create_snapshot(volume_id, description)
    
        def rotate_snapshot(self, volume_id, num):
            snapshot = {}
            for x in self.ec2connection.get_all_snapshots():
                if(x.volume_id == volume_id):
                    tmp = {x.id:x.start_time}
                    snapshot.update(tmp)
    
            snapshot = sorted(snapshot.items(), key=lambda (k, v): (v, k), reverse=True)
            for i in range(int(num), len(snapshot)):
                try:
                    self.ec2connection.delete_snapshot(snapshot[i][0])
                except:
                    continue
    
        def add_tags_to_snapshot(self, volume_id):
            tags = self.ec2connection.get_all_volumes(volume_id)[0].tags
    
            for snapshot in self.ec2connection.get_all_snapshots():
                if(snapshot.volume_id == volume_id):
                    for key, value in tags.items():
                        snapshot.add_tag(key, value)
    
    if __name__ == '__main__':
    
        execfile(sys.argv[1])
        backuper = AWSBackuper(access_key, secret_key)
    
        for volume_id in volume_ids:
            backuper.create_snapshot(volume_id, 'auto backup')
            print "%s is backed up." % (volume_id)
            backuper.rotate_snapshot(volume_id, generation_limit)
            print "%s is rotated snapshots." % (volume_id)
            backuper.add_tags_to_snapshot(volume_id)
            print "%s is added tags." % (volume_id)

このスクリプトは config ファイルとなる python スクリプトを指定して起動する。

    # your volume_ids 
    access_key, secret_key = 'YOUR ACCESS KEY', 'YOUR SECRET KEY'
    volume_ids = [
        'vol-target-id1',
        'vol-target-id2',
        'vol-target-id3',
    ]
    generation_limit = 7

あとはこんなふうに起動するだけ

    python ebs-backuper.py config.py
windowsでmahout

山形のohisamaです。
##環境
>eclipse indigo
mahout 0.5
windows 7

##アイテムベース　レコメンダー

```java:ohi1.java
import java.io.File;
import java.util.List;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;

public class ohi0 
{
	private ohi0()
	{
	}
	public static void main(String[] args) throws Exception
	{
		DataModel model = new FileDataModel(new File("test.csv"));
		UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
		UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);
		Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);
		List<RecommendedItem> recommendations = recommender.recommend(1, 2);
		for (RecommendedItem recommendation : recommendations)
		{
			System.out.println(recommendation);
		}
	}
}
```
windowsでmahout

山形のohisamaです。
mahout始めました。
##環境
>eclipse indigo
mahout 0.5
windows 7

##ユーザーベース　レコメンダー

```java:ohi0.java
import java.io.File;
import java.util.List;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;

public class ohi0 
{
	private ohi0()
	{
	}
	public static void main(String[] args) throws Exception
	{
		DataModel model = new FileDataModel(new File("data.csv"));
		UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
		UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);
		Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);
		List<RecommendedItem> recommendations = recommender.recommend(1, 2);
		for (RecommendedItem recommendation : recommendations)
		{
			System.out.println(recommendation);
		}
	}
}
```
Introduction of jQuery

````index.html
<!DOCTYPE html>
<html lang="ja">
<head>
     <meta charset="utf-8">
     <title>jQuery Practice</title>
</head>
<body>
     <h1>jQuery</h1>

     // Reading jQuery
     <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
     <script>
          // When Readling html has done, start to execute jQuery
          $(document).ready(function(){
               // Write here jQuery Code
          }
     </script>
</body>
</html>
````

As comments, you should get ready to use and code jQuery like above.

But this is not normally used style.
You can rewrite like this.

````index.html
<script>
    $(function(){
        hogehoge
    }
</script>
````

And one more, if you want to use jQuery in local to some reasons, e.g. keep site speed, you should download jQuery code from here-><http://jquery.com/>, and write like this.


````index.html
<script src="~~(path)~~~/jquery-1.9.1.min.js"></script>
````


anyway this is first step to use jQuery.
Ruby/RackでログをLTSVで出す

今更感が強いですが実際ログをLTSVにすると扱いやすい場面に最近遭遇したので。

```ruby:ltsv_formatter.rb
require 'logger'

class Logger
  class FreeFormatter < Formatter
    Format = "%{label}, [%{time}#%{pid}] %<severity>5s -- %{progname}: %{message}\n"

    attr_accessor :format

    def initialize(format=self.class::Format)
      @format = format || Format
      super()
    end

    def call(severity, time, progname, msg)
      @format % {
        :label => severity[0..0],
        :time => format_datetime(time),
        :pid => $$,
        :severity => severity,
        :progname => progname,
        :message => msg2str(msg)
      }
    end
  end

  class LTSVFormatter < FreeFormatter
    Format = %w[severity time progname pid message].map {|field|
      "#{field}:%{#{field}}"
    }.join("\t") + "\n"

    private

    def format_datetime(time)
      if @datetime_format.nil?
        time.strftime("%Y-%m-%dT%H:%M:%S.") << "%06d" % time.usec
      else
        super
      end
    end
  end
end

if __FILE__ == $0
  logger = Logger.new($stderr)
  logger.formatter = Logger::FreeFormatter.new
  logger.debug 'hello'
  logger.info 'world'
  logger.formatter = Logger::LTSVFormatter.new
  logger.warn 'hi'
  logger.error 'again'
end
```

```ruby:ltsv_logger.ru
class LTSVLogger < Rack::CommonLogger
  FORMAT = %w[host user time method path query version status size].map {|field| "#{field}:%{#{field}}"}.join("\t") + "\truntime:%<runtime>0.4f\n"

  def log(env, status, header, began_at)
    now = Time.now
    length = extract_content_length(header)

    logger = @logger || env['rack.errors']
    logger.write FORMAT % {
      host:    env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-",
      user:    env["REMOTE_USER"] || "-",
      time:    now.strftime("%d/%b/%Y %H:%M:%S"),
      method:  env["REQUEST_METHOD"],
      path:    env["PATH_INFO"],
      query:   env["QUERY_STRING"].empty? ? "" : "?"+env["QUERY_STRING"],
      version: env["HTTP_VERSION"],
      status:  status.to_s[0..3],
      size:    length,
      runtime: now - began_at }
  end
end

use LTSVLogger
run lambda {|env|
  [200, {'Content-Type' => 'text/plain'}, ['Hello, LTSV']]
}
```
iOSアプリ開発で格段に開発速度を高めているXCodeの機能


## 概要
2013/3/26にTwitterで縦書の俳句を投稿出来るアプリ「[俳句ったー](http://bit.ly/Haikutter)」をリリースしました。

開発のきっかけはTwitterの公式ウェブサイトが改行コードに対応しこれは**ネタアプリチャンス**だと思い作りました。

> 3/14(木) 公式ウェブサイトが改行コードに対応
3/15(金) 帰りがけに「ねぇねぇ、[@yoshiakist](http://qiita.com/users/yoshiakist)くん、デザインやらない？」と話す
3/16(土) [@yoshiakist](http://qiita.com/users/yoshiakist)「デザイン出来ましたよw」
3/17(日) 寝坊して昼くらいからコーディング 翌0:30 **Submit!!**

# つれー実質8時間くらいしかコーディングしてないわー してないわー
という格段に開発速度を早めているXCodeの機能を紹介します。

## Storyboard

メインのStoryboardです。主要な画面遷移になります。

![ss](http://f.cl.ly/items/0E1a2u0J2M1e3O1D101a/スクリーンショット_2013_03_27_1_43.png)
図のように、ViewController同士の画面遷移と画像設定などの各Viewのプロパティが書けるので、UI周りのコードはほぼ書いてません。
一見変わった画面遷移っぽいですがビューのアニメーションの都合でこういう構成にしました。真ん中のInput View Controllerが起点となって画面遷移が行われます。


## Xib

俳句のプレビュー画面です。

![ss](http://f.cl.ly/items/3m3r0o1N2l3c1a0p2V1R/スクリーンショット_2013_03_27_1_49.png)
Viewのみが必要な場合はXibを使います。こちらもStoryboardと同じくUIのコードはほぼ書いてません。文字が適当に打ってあるのは体裁を調整するためです。
なぜここだけStoryboard外でXibなのかは、入力画面からプレビューへの遷移を紙をめくったようなアニメーションにしたかったからです。(アニメーションを気にしなければStoryboardだけで済みました。)

```objectivec:
/* 入力画面からプレビューへの画面遷移はこんな感じのコードです */
UINib *nib = [UINib nibWithNibName:@"Preview" bundle:nil];
self.preview = [[nib instantiateWithOwner:self options:0] objectAtIndex:0];
// -- いろいろ設定などする ---    
[UIView transitionFromView:self.view
                    toView:self.preview
                  duration:0.6f
                   options:UIViewAnimationOptionTransitionCurlUp
                completion:nil];
```
nibファイルからXibで設定したUIのViewが取り出せるというイメージです。

## ContainerView

ViewControllerに子のViewControllerを持たせられる素晴らしい機能です。
上のStoryboardの画像で確認出来るように(一番左のContainer)、柔軟な画面設計が実現します。

## その他

俳句ったーに限った話ですが、Twitterの投稿は`Social.framework`の`SLComposeViewController`に丸投げでアカウント認証やTwitterAPIを気にせず済みますので早いです。
注意したところは、縦書を全角スペースで体裁整えているので俳句の字余りによってはTwitterの投稿制限である140文字を意外とすぐ超えてしまいます。
そして`SLComposeViewController`の`setInitialText:`は140文字を超える文字を渡すことが出来ない(空の文字列になる)ので、渡す前に確認する必要があります。

```objectivec:
/* 元のコードからは改変してますがツイートの投稿画面表示はこんな感じです */
if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] &&
    text.length <= 140) {

    SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    [vc setInitialText:text];
    [self presentViewController:vc animated:YES completion:nil];
}
```

## 参考サイト

[初めての Storyboard in iOS 5 Part 1](http://www.raywenderlich.com/ja/25696/初めての-storyboard-in-ios-5-part-1)
[iOS5では使えない…Xcode4.5の新機能、StoryboardでのContainer Viewが便利！](http://www.zero4racer.com/blog/942)

## まとめ

- Storyboard、Xibを使用することによりUI周りのコードは9割くらい削減出来ます。レイアウトの変更も容易ですし、何よりも**UIに関することはここを見ればいい**ということが明確になるのがいろいろ捗ります。
- Sotryboard、XibでautoresizingMaskを適切に設定していれば、3.5inch、4inchの画面サイズもだいたいは対応出来ると思います。(俳句ったーの場合完全に対応出来るパターンです。)
- ContainerViewを使えば更にStoryboardの自由度がアップ。
- Storyboard、Xib、ContainerViewなど新しい機能はそれなりに学習コストがかかりますが、対象のアプリが使用出来るiOSのバージョンだったら使わない理由はないと個人的には思います。

なんかUI周りの話しかしませんでしたが、それだけUI周りをコードで書くのは時間がかかるしメンテも大変だなぁって話でした。
windows版 SourceTreeでWinMergeを使うための.gitconfig設定

#SourceTreeについてくるgitを利用している場合
#####_WinMergeU.exeを指定している部分は自分の環境に合わせて読み変えてください_

***

##Diffに使いたい場合
Tools > options から
Diffタブを選択

External Diff Tool が
System Default になっていることを確認

```git:.gitconfig
[diff]
    tool = WinMerge
[difftool "WinMerge"]
    cmd = \"C:/WinMerge/WinMergeU.exe\" -e -ub -dl \"$LOCAL\" -dr \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"
```

#### オプションの説明
* `-e` ESCで閉じれるようする
* `-ub` 最近使ったファイルリストに追加しない
* `-dl` 左側のタイトルバーを設定。テンポラリファイルが指定されているのかわかりやすいようにするために指定
* `-dr` -dlの右側バージョン

***

##Mergeに使いたい場合
Tools > options から
Diffタブを選択

Merge Toolが
System Default になっていることを確認

```git:.gitconfig
[merge]
    tool = WinMerge
[mergetool "WinMerge"]
    cmd = \"C:/WinMerge/WinMergeU.exe\" //e //u //wl //wr \"$LOCAL\" \"$BASE\" \"$REMOTE\" //o \"$MERGED\"
	trustExitCode = true
```

#### オプションの説明
* `//e` ESCで閉じれるようにする
* `//u` 最近使ったファイルリストに追加しない
* `//wl` 左側を読み取り専用で開く
* `//wr` 右側を読み取り専用で開く
* `//o` マージ後のファイル名

***

win7、SourceTree 0.9.0.5 で動作しているので、多分これでいけるはず。

##起動オプションの指定方法について補足

* ハイフンで指定する場合は特に気にする必要なし
* スラッシュで指定する場合は `/` ではなく `//` で指定する必要がある模様

その他オプションの詳細についてはググるといいと思います！
SSH 中継サーバを超えて rsync プロトコルで同期する

例えば **hogeserver** を経由して **ftp.riken.jp** から rsync で同期する場合下記のように環境変数 `RSYNC_CONNECT_PROG` を指定します。

```console
$ RSYNC_CONNECT_PROG='ssh hogeserver nc %H 873' \
$ rsync -rptzv --delete rsync://ftp.riken.jp/centos/6/os/x86_64/ centos/6/os/x86_64/
```
HGTS #1

# 基本
* 開発＆リリースが早すぎなので、継続的なメンテナンスや、テストを前もって計画するのが不可能
* テストは開発の負担になるべきではない。テストは開発を遅らせるべきではない。
* テスターの人数は少ない。テスターを増やすな。
* ソフトウェアのクオリティはテスターの責任じゃない。すべてのエンジニアはテスター。

* テストはソフトウェアのクオリティを上げる手段ではない。
* クオリティを上げるなら、少しコーディングしたらテストする。コーディングはテストと同時に進行すべき。これでクオリティが保障される。
* クオリティを上げるにはバグを発見する手段を探すではなく、バグを回避する手段を探すだ。

>余談：Testing on the Toilet 
> http://www.flickr.com/photos/dullhunk/1019220380/sizes/l/in/photostream/
> http://commondatastorage.googleapis.com/gtb/TotT-2008-08-14.pdf?hl=ja (100回目)
> http://commondatastorage.googleapis.com/gtb/TotT-2013-03-20-state-vs-interactions-public.pdf (最新号)

# roles

## The Software Engineer (SWE)
* プロダクトのフィーチャーを書く
* 自分が作ったフィーチャーのユニットテストも書く

## The Software Engineer in Test (SET)
* テスト自動化等のコードを書く
* リファクタリングのこともする
* SWEのテストに役に立つコード、テストフィーチャーを書く

## The Test Engineer (TE)
* コードを書く人がいれば、書かない人もいる
* テスト自動化のコードを書く
* SWEとSETのつながりな存在
* ユーザの立場でソフトウェアのクオリティを見る、意見を出す

# 組織構成の話
* テスターはデベロッパーと同じプロダクトチームに配属される
* SWEはFA(Focus Area)単位でプロダクトマネージャーに報告する
* SETとTEはそういう人に報告しなく、Engineering Productivityのリーダーに報告する（配属もその人が優先度と必要性によって調整する）
* SETとTEを移動させる。アイディアを全社内で流通させる。

# 製品の話
* 最低限有用なプロダクトを最初バージョンとして作る
* 非常に小さいフィーチャーを少しづつリリースする
* 必ずdevチャンネルを経由させる（プロダクトの価値を証明するため）

# テストの分類
> small, medium, large だけ
> しかしこういう命名は重要じゃない。重要なのは全員がテストの規模に対する認識が一致していること

## small
* 自動テストが多い
* 機能面、データ破壊、エラーの条件、off-by-oneミス（境界ミス）等のテスト
* SWEが書く
* モック・fake環境を使う

## medium
* 自動テストが多い
* 復数の（連動している）機能(nearest neighbor functions)のテストが多い
* SETが機能開発の前期からこういうテストを計画し、なんじゃらのテストコードを入れる
* 開発の後期にはTEが手動か自動でこういう中規模のテストを実行する

## large
* ３つをそれ以上の機能をユーザ視点でテストする
* 経過より結果のほうを重視する
* コーディングはSWE, SET, TEが全員参加
* モックは使わない

# 手動か、自動か
* 人間が関与しなくていいテストは、自動化
* UIとか人間の目で見て確認する必要があるものなら、手動で
** グーグルにも手動テストをたくさんやってる
Ubuntu 12.10 にRiak 1.3.0 を用意する


## 参考
[Installing on Debian and Ubuntu](http://docs.basho.com/riak/latest/tutorials/installation/Installing-on-Debian-and-Ubuntu/)

## インストール手順

Ubuntu 12.10 のリポジトリがないようなのでソースからインストールする（2013年3月26日現在）
// [7つのデータベース 7つの世界](http://goo.gl/iwyK4) でもそのように勧められている．

### Erlang をインストール
[Installing Erlang](http://docs.basho.com/riak/latest/tutorials/installation/Installing-Erlang/) を参考にソースからビルド

```bash
$ sudo apt-get install build-essential libncurses5-dev openssl libssl-dev
$ wget http://erlang.org/download/otp_src_R15B01.tar.gz
$ tar zxvf otp_src_R15B01.tar.gz
$ cd otp_src_R15B01
$ ./configure && make && sudo make install
```

### Riak 1.3.0 をインストール

```bash
$ sudo apt-get install libssl0.9.8
$ wget http://downloads.basho.com.s3-website-us-east-1.amazonaws.com/riak/1.3/1.3.0/riak-1.3.0.tar.gz
$ tar zxvf riak-1.3.0.tar.gz
$ cd riak-1.3.0
$ make rel
```

## 動作テスト
[Starting a Riak Node](http://docs.basho.com/riak/latest/tutorials/installation/Post-Installation/) に従いRiakを起動してみる．

```bash
$ cd riak-1.3.0 # ソースのディレクトリ内
$ rel/riak/bin/riak start
$ rel/riak/bin/riak attach
# Erlang コンソール内で
q().
$ rel/riak/bin/riak ping
pong
```

利用するポートの設定でWARNINGが出るが，実際に使うときに設定すれば良いだろう．
Mavenで生成したtargetフォルダ下の権限を変更する


src/main/resources下に置いているファイル達は、元の権限がどうであれtarget/classes下に吐き出されると644になってしまう。resources下に実行形式ファイルを置いている関係で、どうしてもclasses下のファイルを755にする必要があったので方法をメモってみる。

やり方としてはpomに以下のpluginを追加する。

```xml:pom.xml
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-antrun-plugin</artifactId>
	<version>1.6</version>
	<executions>
		<execution>
			<id>process-classes</id>
			<phase>process-classes</phase>
			<configuration>
				<target>
					<chmod file="target/classes/chromedriver" perm="755"/>
				</target>
			</configuration>
			<goals>
				<goal>run</goal>
			</goals>
		</execution>
	</executions>
</plugin>
```

このプラグインはmavenの任意フェーズにantタスクを仕込めるもの。自分の環境ではtestフェーズより前でJUnitから利用するSeleniumドライバに実行権を与える必要があったので、process-classesでドライバの権限を755にしてる。

他にもmaven-assembly-pluginを使う方法もあるみたいだけど、こっちはうまく権限が変えられなかった。
[How do I set directory permissions in maven output? - Stack Overflow](http://stackoverflow.com/questions/7478495/how-do-i-set-directory-permissions-in-maven-output)

antrun pluginはもちろんbuild.xmlも実行できるので、今回の例以外にもいろいろ使えそう。
jQuery:post処理の戻り値について

jQueryのプログラミングにおいてデータをPOSTする処理を作成した

```javascript:post.js
$.post('test.php', params,'json').done(
	function(data, textStatus){
		$('.result').text(data.text);
	}
)
```

```php:test.php
<?php
＄data = $_POST();

$res[] = array('type' =>'status', 'text' => $sw);
$result = json_encode($res);

echo $result;
?>
```

コールバック関数において、dataに結果は入ったが、期待したオブジェクトではなく、単なるテキストになっていた
このため、data.textがundifinedになってしまっていた。

dataの中身を確認してみると、テキストとして以下の内容が入っていた
data = [{type => status}, {text => success}]

どうやら、これをオブジェクトに変換する必要があるみたいだ。

そこで、コールバック関数の先頭に変換処理を追加修正した。

```javascript:post.js
res = JSON.parse(data);
$('.result').text(res.text);
```
パラダイム別 じゃんけんの書き方


# データ手続き型

```coffeescript:procedural.coffee
beats = (you, opponent)->
    if you is 'rock'
        if opponent is 'scissors'
            return true
        else
            return false 
    else if you is 'paper'
        if opponent is 'rock'
            return true
        else
            return false
    else if you is 'scissors'
        if opponent is 'paper'
            return true
        else
            return false
    else
        throw new Error("your hand is unexpected: #{you}")
    
you = 'rock'
opponent = 'paper'

console.log beats(you, opponent)
console.log beats(opponent, you)
```

# オブジェクト指向

```coffeescript:oo.coffee
class Rock
    beats: (hand)->
        return hand instanceof Scissors

class Paper
    beats: (hand)->
        return hand instanceof Rock

class Scissors
    beats: (hand)->
        return hand instanceof Paper


you = new Rock
opponent = new Paper

console.log you.beats(opponent)
console.log opponent.beats(you)
```

# 論理型

```prolog:janken.pro
beats(rock, scissors).
beats(paper, rock).
beats(scissors, paper).
```

# 関数型

だれか...
cursesライブラリを使う

端末上でのカーソル位置制御やテキストの表示などの制御をするためのライブラリにcursesライブラリというものがあります。今回は、それを使ってみたので、その時のメモです。
initscr()で初期化して、endwin()で終了です。standout()は、強調表示開始 standend()は、強調表示終了です。

```c:sample.c
#include <stdio.h>
#include <curses.h>
int main( int argc, char *argv[] )
{
    int i;
    initscr();
    clear();
    for( i = 0; i < LINES; i++ ) {
        move(i,i+1);
        if( i%2 == 1 )
            standout();
        addstr("Hello, world");
        if( i%2 == 1 )
            standend();
    }
    refresh();
    getch();
    endwin();
    return 0;
}
```

ビルド時には、ライブラリを指定してあげる必要があります。

```
gcc sample.c -lcurses -o sample
```
Firefoxのタブをマウス操作だけで別ウィンドウに開く


あるページを見ながら別ページを編集する時などに二画面にしたくなることがあります。このやり方だとマウス操作だけで出来るので便利です。

[ウインドウ 間でタブを移動する | Firefox ヘルプ](http://support.mozilla.org/ja/kb/tabs-organize-websites-single-window#w_alciaciiaiaoaoiihi)

> タブを別のウインドウ に分離するには、タブをタブ領域より下へドラッグします。

![タブを別ウィンドウで開く](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20130326/20130326203500_original.jpg?1364297710)
rails console の tips 

元ネタ：

* [Three quick Rails console tips by Nick of 37signals](http://37signals.com/svn/posts/3176-three-quick-rails-console-tips)
* [10 Rails console tricks](http://rors.org/2009/12/20/10-rails-console-tricks.html)

## urlヘルパーが生成するpath/urlを確認してみる。

`app`オブジェクトからURLヘルパーを呼び出すことができる。

```irb
[1] pry(main)> app.api_hoge_path
=> "/api/hoge"
[2] pry(main)> app.api_hoge_url
=> "http://www.example.com/api/hoge"
```

その他参考: [Rails でリンクパスを生成する方法色々・・とRails console で 生成される path を確認したい時](http://qiita.com/mm36/items/f266977e12df9d1dc548)


## リクエストを投げてコントローラを呼び出してみる。

`app`オブジェクトを使うと簡単にリクエストを投げてコントローラを呼び出すこともできる。

```irb
[3] pry(main)> app.get "http://localhost:3000/api/hoge"
=> 200
[4] pry(main)> app.response.body
=> "{\"response\":\"hoge\"}"
```


## view ヘルパーを呼び出す

`helper`オブジェクトから View ヘルパーを呼び出すことができる。

```irb
[8] pry(main)> helper.truncate("Testing", length: 6)
=> "Tes..."
[9] pry(main)> helper.link_to "home", app.root_path
=> "<a href=\"/\">home</a>"
```

## インスタンス変数に値を設定する

以下のように ヘルパーメソッドの中でインスタンス変数を参照している場合、`Object#instance_variable_set` を使ってインスタンス変数に値を設定することができる。

以下のようなヘルパーがあったとして

```rb
def say_hello
   "hello, #{@name}"
end
```

`@name` に値を設定するには以下のとおり

```irb
[99] pry(main)> helper.instance_variable_set :@name, "hoge"
```

これで 上記ヘルパーメソッドを呼び出すと

```irb
[99] pry(main)> helper.say_hello
 => "hello, hoge"
```

という結果が得られる。


## params 変数に値をセットする

以下のようにヘルパーメソッドの中で params 変数を参照している場合、普通に`helper.say_goodbye`とメソッドを呼び出すと、params 変数の中身が空のため正しく動作しない。

```rb
def say_goodbye
  "goobye, #{params[:name]}"
end
```

そのような場合、OpenStruct クラスを使ってコントローラを偽装することで params 変数に値を設定することができる。

```irb
[2] pry(main)> helper.controller = OpenStruct.new(:params => { :name => "hoge" })
=> #<OpenStruct params={:name=>"hoge"}>
[3] pry(main)> helper.say_goodbye
=> "goodbye, hoge"
```

## sandboxモード

exit すると DBへの変更がロールバックされる

```console
$ rails c --sandbox
```
DetachedCriteriaを使って副問い合わせをする場合は、Projections必須

Projectionを介さないと NullPointerExceptionになる。

```java
Criteria criteria = createCriteria(Hoge.class);
criteria.add(Restrictions.eq("id", 1));

DetachedCriteria fooCriteria = DetachedCriteria.forClass(Foo.class, "foo");
fooCriteria.add(Restrictions.eq("id", 1));

criteria.add(Subqueries.exists(fooCriteria.setProjection(Projections.property("id"))));
return criteria.list();
```
hg serveでpushを受け付ける

開発用や検証用のリモートマシンで```hg serve```して, トンネル経由で直接チェンジセットをpushする場合, Mercurialはディフォルトではpushを受け付けないので以下のように```.hgrc```に書く必要がある. 

```.hgrc
[web]
push_ssl = false
allow_push = *
```

当たり前ですが, ```hg serve -a localhost -p 8000```とかループバックアドレスにbindしないと危険なので注意してください.
EC2起動時に自動的にIPアドレス(Elastic IPs)を付与する


Amazon Linuxの例です。

/root/.awsrc に下記を記載

```
export EC2_PRIVATE_KEY=/root/.aws/pk-XXXXX.pem # ファイルは、AWS Management Consoleからダウンロードしたファイル名
export EC2_CERT=/root/.aws/cert-XXXXX.pem # 同上
export EC2_URL=https://ec2.ap-northeast-1.amazonaws.com

export JAVA_HOME=/usr/lib/jvm/jre
export EC2_HOME=/opt/aws/apitools/ec2
export PATH=$PATH:$EC2_HOME/bin:$JAVA_HOME/bin

export EC2_INSTANCE_ID=i-xxxxxxxx     # インスタンスID
export ELASTIC_IP_ADDRESS=xx.xx.xx.xx # 設定したいElastic IPアドレス(取得済)
```

/root/.aws/ に PRIVATE_KEY と CERT を配置

```
/root/.aws/cert-xxxxx.pem  
/root/.aws/pk-xxxx.pem
```

/etc/init.d/aws_elastic_ip というファイルを作成

```
#!/bin/bash
#
# chkconfig: 345 99 1
# description: set aws elastic ip address
# processname: aws_elastic_ip
#

. /root/.awsrc

start() {
	echo "Assigning Elastic IP Address ${ELASTIC_IP_ADDRESS} ."
	ec2-associate-address $ELASTIC_IP_ADDRESS -i $EC2_INSTANCE_ID >/dev/null 2>&1
}

stop() {
	echo "Deassigning Elastic IP Address ${ELASTIC_IP_ADDRESS} ."
	ec2-disassociate-address $ELASTIC_IP_ADDRESS >/dev/null 2>&1
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  *)
        echo $"Usage: $0 {start|stop}"
        exit 2
esac

exit 0

```

root にて下記を実行し、起動スクリプトを登録

```
chkconfig --add aws_elastic_ip
chkconfig aws_elastic_ip on
```

インスタンスを一旦stopし、再度start して、IPアドレスが紐付いていればOK
ESL Podcast 878 – Recovering from an Illness or Injury

* get plenty of ~: 充分~をとる、充分~する
* take it easy: さようならの意味も
* greasy: 油っぽい、(グリースぽい)
* become dehydrated: 脱水状態になる(de-hydrate-d)
* you don't want to know: （知らないほうがいい）
* get in the habit of: 習慣がつく
* sit around: 座って過ごす
* adage:ことわざ、traditional proverb
* feed a cold and starve a fever: かぜには大食·熱には小食(ことわざ)
* sore back:背中の痛み、凝り？
* alternate between 交互に繰り返す
chkconfigを利用した起動スクリプトひな形


下記のようなファイルを /etc/init.d/sample　として置く。

```/etc/init.d/sample
#!/bin/sh
# chkconfig: 345 99 1
# description: sample
# processname: sample

start() {
    echo -n "starting sample:"
    /usr/local/sbin/sample
    return 0
}

stop() {
    killall sample
    return 0
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    *)
        echo $"Usage: $0 {start|stop}"
        exit 2
esac

exit 0
```

\# chkconfig [起動レベル] [起動時の優先度] [停止時の優先度]


追加方法

```
# chkconfig --add <起動スクリプト名>

# chkconfig <起動スクリプト名>  on
```
スゲい簡単なPerl入門 -3rdDay

##Play with Object

````date.pm
package main;
my $date = main->new;
# Using Object(= Reference related with Package name) call subroutine in package
$date->set_date(9);
print "\n";
sub new {
        my $pkg = shift;
        bless {
                year    => undef,
                month   => undef,
                day     => undef,
                second  => undef
        },$pkg;
}
sub set_date {
        # this $self is for receiving 1st argument(in this case, $date)
        my $self = shift;
        my $time_dereference = shift;
        ($self->{year},$self->{month},$self->{day},$self->{hour},$self->{minute},$self->{second}) = ( gmtime time + $time_dereference * 3600 )[5,4,3,2,1];
        $self->{year} += 1900;
        $self->{month}++;
}
sub get_year {
        my $self = shift;
        return $self->{year};
}
sub get_month {
        my $self = shift;
        return $self->{month};
}
sub get_day {
        my $self = shift;
        return $self->{day};
}
sub get_hour {
        return $date->{hour};
}
sub get_minute {
        return $date->{minute};
}
sub get_second {
        return $date->{second};
}
````

````
$date->set_date(9);
````
Using Object(= Reference related with Package name) call subroutine in package
**1st argument is self($date), 2nd argument is 9. (main::set_date($date,9);)**
e.g) $obj = Hoge->new;
     $obj = Hoge::new('Hoge');


In this source, $self is same to $date.
So you can delete "my $self = shift;" and use "$date->{year};" inseted of $self.
ruby aws sdk を使った Elasticache のリブート


```ruby:ec_reboot.rb
#!/usr/bin/ruby
require 'rubygems'
require 'aws-sdk'
 
# require './config.rb'
# -----------------------------------
# config.rb の中身
config = {
  "access_key_id"        => "xxxxxxx",
  "secret_access_key"    => "xxxxxxx",
  "sqs_endpoint"         =>  "sqs.ap-northeast-1.amazonaws.com",
  "elasticache_endpoint" => "elasticache.ap-northeast-1.amazonaws.com",
}
 
AWS.config(config)
#-----------------------------------------------
 
begin
  ec = AWS::ElastiCache.new
 
  params = {
    :cache_cluster_id => 'xxxx', 
    :cache_node_ids_to_reboot => ['0001']
  }
  r = ec.client.reboot_cache_cluster(params)
 
  puts "OK!"
rescue => exc
  p exc.message
end
```
Eclipse Juno用の emacsplusプラグインのアルファバージョン(2013/3/26現在)

導入後は、
一度キー設定を Defaultに戻し、かつリストアしてから、
Emacs+ Schemeに変更しないといけないとのこと。

あと、Windowの分割にはまだ対応していない模様。


http://www.mulgasoft.com/emacsplus/juno/
Ruby2.0.0のキーワード引数でハマる


## やりたかったこと
```user.rb
class User < ActiveRecord::Base
	attr_accessible :name

	def self.search(opts)
		find_by_name(opts && opts[:name])
	end
end
```

``` users_controller.rb
class UsersController < ApplicationController
	def search
		@users = User.search(params[:user])
	end
end
```

のような、Ruby1.9で実装したモデルとコントローラがあった


Ruby2.0に移行する際、`User.search`メソッドをキーワード引数を使って

``` user.rb#search
def search(name: nil)
	find_by_name(name)
end
```

のように書きなおせたら可読性高くて && nil考慮しなくてよくてステキだなと

## やってみたこと
`User.search`の引数に取りうる値はハッシュとnilのはずなので、実装して実験してみた

``` Ruby
User.search name: nil #=> OK
User.search any_key: nil #=> ArgumentError: unknown keyword: namae
User.search nil #=> ArgumentError: wrong number of arguments (1 for 0)
```

1番目は推測通りだが、2番目と3番目はまずい
動作が変わる

[るびま](http://jp.rubyist.net/magazine/?0041-200Special-kwarg)読んだ感じだと、可変長引数を受け取るようにしてると最後のハッシュがキーワード引数になり、unknown keywordエラーは`**any_key`で抑制できるようなので、

``` user.rb#search
def search(*, name: nil, **kwargs)
	find_by_name(name)
end
```

としてやればOKだった

## できないこと

``` Ruby
user = User.search "name" => "JOJO"
```
テストとして記述したこのコードが期待通り動かず、小一時間悩んだ

Ruby力が足りず混同してしまっていたのだが、`{ "hoge" => nil }`と`{ hoge: nil }`は別物
文字列を渡しても、キーワード引数として解釈してくれないようだ
Ruby的にはオブジェクトをキーにできるし、シンボルと文字列は別物なのだから当たり前っちゃ当たり前の話

ただ、Railsの`Params`では文字列とシンボル両方でアクセスできるようになっているので、`params`を直接渡してもちゃんと動く

ちなみに、文字列とシンボルどちらでもアクセスできるハッシュ(のようなもの)は、Rails環境下では`Hash#with_indifferent_access`で生成できるようだ
http://rubyist.g.hatena.ne.jp/muscovyduck/20061224

## 思ったこと
メソッドを、何が入ってるかよくわからないハッシュが渡されることを前提に実装しようとすると、考慮すべき点が多い
また、一応実装はできるが、意味のない変数も定義しなければならなくなる

キーワード引数を使う場合は、

``` Ruby
User.search name: "なまえ"
```

のように、呼び出し側で明示すること前提に設計すべきなのかな
と思った
Rails 3.2.13 にあわせて mail をアップデートしたらメールが送信できなくなった問題


Rails 3.2.13 にあわせて mail を 2.5.3 にアップデートしたら、メールが送信できなくなってしまった (OpenSSL のエラーが出てサーバへの接続に失敗する)。

詳しく調べると、

- SMTPS に対応してないが TLS 必須の SMTP サーバを使用している
- openssl_verify_mode を指定している
- mail 2.5.0..2.5.3 を使用している

場合にメールが送信できなくなるようです。

# 原因

下記のコミットで、それまで enable_starttls_auto だったところが enable_tls になっています (ちょうどノートついてますね)。

https://github.com/mikel/mail/commit/9890b197c51f1d340fa7275aa4bc17103746657b

これにより openssl_verify_mode を指定していると、enable_starttls_auto が true でも STARTTLS を使わず SMTPS で接続しようとします。

ここで SMTP サーバが SMTPS に対応してないが TLS 必須だと、どう設定しても接続できず、詰みます。

# 現状

現時点 (2013-03-26) で mail のリポジトリをみると、下記のコミットで、リファクタリングと同時にこの箇所は修正されています。

https://github.com/mikel/mail/commit/d6e25e5e37e6d591f94cc04a2a52c1128fde81db

ただこの修正を含む gem はまだリリースされていないようです。

# actionmailer

問題が mail だけなら、関係しそうなプロジェクトでは mail 2.4.4 を使いつつ、新しいバージョンを待つ、でいいんだけど、actionmailer 3.2.13 は mail ~> 2.5.3 を要求するので Rails 3.2.13 も使えなくなってしまう。

ちなみに actionmailer 3.2.12 までは mail ~> 2.4.4 だったんだけどね。

# 解決方法

いくつか考えられる。

A. SMTP サーバで SMTPS 対応する、TLS 必須じゃなくする
B. openssl_verify_mode を指定しない
C. 新しい mail gem が出るまで待つ
D. mail の未リリースのコード使う
E. mail 2.5.3 にパッチあてる

E は fork するか、クラス再オープンしてメソッド上書き。
下記の様に書き換えれば良いと思う。

```diff
diff --git a/lib/mail/network/delivery_methods/smtp.rb b/lib/mail/network/delive
index 53c1330..79ceab0 100644
--- a/lib/mail/network/delivery_methods/smtp.rb
+++ b/lib/mail/network/delivery_methods/smtp.rb
@@ -124,9 +124,9 @@ module Mail
             if RUBY_VERSION >= '1.9.0'
               context = Net::SMTP.default_ssl_context
               context.verify_mode = openssl_verify_mode
-              smtp.enable_tls(context)
+              smtp.enable_starttls_auto(context)
             else
-              smtp.enable_tls(openssl_verify_mode)
+              smtp.enable_starttls_auto(openssl_verify_mode)
             end
           end
         end
```
レインボーをn分割した16進数rgb色コードを出力

データの可視化をするのにレインボーカラーチャートで色づけしてプロットできると見やすいので、レインボーカラーチャートをn分割して16進数rgb色コードを出力するコードを備忘録がてらシェア。こんなかんじ。

![Terminal 出力](http://f.cl.ly/items/141r0B1d1P2T0R0R172E/Screen%20Shot%202013-03-26%20at%2012.35.20%20AM.png "カラーシーケンス出力例")

引数はデータ総数n(=分割数)。コードは以下の通り。まんまなので、エレガントなやり方あれば教えてください。

```ruby:color.rb
#!/usr/bin/env ruby
require "rubygems"
require 'paint'

class Integer
   def color(max)
      h = Array.new
      sg = 256*6/(max)*(self)
      if sg >= 0 && sg <=(256*1-1) then
         h[0] = "ff"
         h[1] =  ("%02x" % sg)
         h[2] = "00"
      elsif sg > (256*1-1) && sg <= (256*2-1) then
         h[0] = ("%02x" %(256*2-1-sg))
         h[1] = "ff"
         h[2] = "00"
      elsif sg > (256*2-1) && sg <= (256*3-1) then
         h[0] = "00"
         h[1] = "ff"
         h[2] = ("%02x" % (sg-256*2))
      elsif sg > (256*3-1) && sg <= (256*4-1) then
         h[0] = "00"
         h[1] = ("%02x" %(256*4-1-sg))
         h[2] = "ff"
      elsif sg > (256*4-1) && sg <= (256*5-1) then
         h[0] = ("%02x" % (sg-256*4))
         h[1] = "00"
         h[2] = "ff"
      elsif sg > (256*5-1) && sg <= (256*6-1) then
         h[0] = "ff"
         h[1] = "00"
         h[2] = ("%02x" %(256*6-1-sg))
      end
      return h[2]+h[1]+h[0]
   end
end

imax = ARGV[0].to_i
imax.times do |i|
   print Paint["##{i.color(imax)}", "##{i.color(imax)}"]
end
print "\n"
```

たとえば、gnuplotなんかでプロットする場合は、次のようになる。
![Gnuplot 出力](http://f.cl.ly/items/2A0P0K1L3p3F0l0i2827/fig.png "gnuplot出力例")

rubyから直接gnuplotを描く場合、open3などでgnuplotに命令を流し込んで、plot命令に`lc rgb "#{i.color(imax)}"`として色を指定すればOK。たとえば


```ruby:color_gnuplot(partial).rb
plot_str =""
plot_str << "plot"
imax = 30
imax.times do |i|
   plot_str << " 100*exp(-(x/4)**2)+#{i}+20*exp(-((x-10)/2)**2)+#{i} "
   plot_str << "w l lt 10 lc rgb \"##{i.color(imax)}\" t \"\","
end
plot_str = plot_str[0, plot_str.length-1]

Open3.popen3("gnuplot"){|stdin, stdout, stderr|
   stdin.puts <<-"EOS"
   set output
   set clip one
   set ytics nomirror
   set ylabel "Amplitude [a.u.]" 2,0
   set xlabel "Frequency [Hz]"
   set yrange[*:*]
   set xrange[*:20]
   set size 0.5, 0.5
   set pointsize 1.2
   unset key
   set output "./fig.eps"
   set terminal postscript eps enhanced color
   #{plot_str}
   set output
   EOS
   stdin.close
   end
   printf("%s",stdout.read)
}
```
スコープを抜けるタイミングで Core Foundation オブジェクトを解放するマクロ

を、さっき思いついた。 Create と Release を並べて書けるようになるので解放し忘れがなくなる。

```objc
#define CFReleaseOnLeavingScope(cfRefVarName) \
id __attribute__((unused)) CFReleaseOnLeavingScope_var_ ## cfRefVarName = \
CFBridgingRelease(cfRefVarName);

- (void)manualRelease {
    CGContextRef context = CGBitmapContextCreate(...);
    ...
    CGContextDrawSomething(context, ...);
    ....
    CGContextRelease(context); // 書き忘れたりうっかり消したりしそう
}

- (void)releaseOnLeavingScope {
    CGContextRef context = CGBitmapContextCreate(...);
    CFReleaseOnLeavingScope(context); // Create 直後に書けばいいので忘れない
    ...
    CGContextDrawSomething(context, ...);
    ...
}
```

`CFBridgingRelease()` で参照カウント管理を ARC に任せている。
端末とシグナルについて

今日は、端末の設定を変更するtcsetattr関数について学んだ。
この関数でstruct termiosの情報のうち、ISIGというシグナルに関する設定がありますが、このビットを落としたときの挙動について調べてみました。

仕様したサンプルソースは、下記になります。

```c:sample.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <termios.h>

void tty_mode( int how );
void set_signal_mode( void );
void f( int signum);

int main(int argc, char *argv[])
{
    int i;
    tty_mode(0);
    set_signal_mode();

    signal( SIGINT, f );
    while(1) {
        printf("hello\n");
        sleep(1);
    }

    tty_mode(1);
    return 0;
}

void tty_mode( int how )
{
    static struct termios original_mode;
    if( how == 0 ) {
        tcgetattr(0, &original_mode); 
    } else {
        tcsetattr(0, TCSANOW, &original_mode); 
    }
}

void set_signal_mode( void )
{
    struct termios info;
    tcgetattr(0, &info); 
    info.c_lflag &= ~ISIG;
    tcsetattr(0, TCSANOW, &info); 
}

void f( int signum )
{
    tty_mode(1);
    exit(1);
}
```

このソースをコンパイルして、動かして同一ターミナルからCtrl + c しても動作は
継続しました。


別端末からSIGINTを送信してみた。(※実行バイナリはa.outとして作成してあります。)

```sh
kill -2 `pidof a.out`
```

この結果は、signalハンドラが呼ばれて処理が終了していました。
以上を踏まえて、ISIGは同一端末上からのシグナルに対する設定のようです。
ちなみに下記のようにSIG_IGNした場合は、他の端末から送信してもシグナルは無視されます。

```c:
signal( SIGINT, SIG_IGN );
```
行数あたりの価値が高いコード

教えてください。
そのコードを書いた状況、コードの内容、行数を教えてください。
どういう問題や領域に対してプログラムを書くと費用対効果が高いのかということに興味があります。
オープンにできないものもあると思うので、実際のコードはあってもなくてもおっけーです。
ffmpeg でUstream.tv 配信

ビデオソースをX のデスクトップにしてみている例.音声もあり. 

>$ ffmpeg -r 15 -s 800x600 -f x11grab -i :0.0 -f alsa -i default -acodec libmp3lame -vcodec libx264 -b 300k -ar 22050 -ab 48k -threads 4 -vsync 1 -y -f flv "rtmp://x.xxxxx.fme.ustream.tv/ustreamVideo/xxxx/xxxxxxxxxxxxx flashver=FME/3.020(compatible;20FMSc/1.0)"

RTMP のURL はダッシュボードから配信したい番組のリモート からRTMP URL とストリームキーを結合してつくる.
※Ustream.tv はffmpeg でデータを流し始めた後web管理画面で配信を行わな いといけない.
ffmpeg でJustin.tv 配信

以下は入力ソースに /dev/video0 を指定してVGA で配信する例です．
> $ padsp ffmpeg -f video4linux2 -s 640x480 -r 15 -i /dev/video0 -vcodec libx264 -f flv "rtmp://live.justin.tv/app/live_xxxxxx_xxxxxxxx"

live_xxxxxx_xxxxxxxx 部分は,Justin.tv にlogin した状態で http://ja.justin.tv/broadcast/adv_other#fmle にアクセスして設定ファ イルをダウンロード.
そのファイルの中の &lt;stream&gt; タグの中身を書きます. 
※Justin.tv はRTMP を投げるだけで配信開始されます．
SlideShareのURLを埋め込みコード用に変換する


SlideShareの各スライドページのURLはこんな感じ。

```
http://www.slideshare.net/kadoppe/d3js-svg
```

一方、上のスライドの埋め込みコードはこんな感じ。

```html
<iframe src="http://www.slideshare.net/slideshow/embed_code/17523095" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen> </iframe> 
```

埋め込みコードからスライドのURLを抽出してみると、スライドページのURLと形式が違うことがわかる。

```
http://www.slideshare.net/slideshow/embed_code/17523095
```

なので、例えば、スライドページのURLを入力すると、そのスライドの埋め込みコードを出力してくれるようなプログラムを書きたい場合、何らかの方法でURLを変更する機能が必要になる。

いろいろ調べていたら、スライドページのHTMLコードに以下のような`meta`要素を発見。

```html
<meta name="twitter:player" class="twitter_player" value="https://www.slideshare.net/slideshow/embed_code/17523095" />
```

どうやらTwitterにSlideShareのURLを投稿した時に使われるメタ情報らしい。

今回はこの情報を使って、RubyでURLの変換メソッドを書いて見ることに。

```ruby
require 'nokogiri'
require 'open-uri'

# SlideShareのページURLを埋め込みコード用に変換する
def convert_slideshare_url(slideshare_url)

  # スライドページのURLを開き、Nokogiriで読み込み
  doc = Nokogiri::HTML(open(slideshare_url))

  # CSSセレクタを使って目当ての情報を持っているmeta要素を探索
  meta = doc.css('meta[name="twitter:player"]').first

  if meta
    # 見つけたmeta要素のvalue属性の値を取得して返す
    return meta.attr(:value).sub('https', 'http')
  end
end
```

こんな感じ。Nokogiriとopen-uriを使用。

YouTubeだとURLから埋め込みコードを直接変換できるのに、SlideShareは一手間必要だった。そんなお話でした。
iPhone 5用の画像を自動で読み込む



1. some_image.png
2. some_image@2x.png
3. some_image-568h@2x.png

を用意しておけば、

```
UIImage *someImage = [UIImage imageNamed:@"some_image"];
```

で、デバイスに応じた1〜3のどれかが読み込まれる！
わけではない。その魔法は、起動画面(Default.png)でのみ適用される。

しかし、それを method swizzling で実現した人がいた：
https://gist.github.com/angelolloqui/3799648
MochaでブラウザテストをするためのWebサーバ

`buster static`のようにコマンドで、テストやデバッグ用のWebサーバが立てられるといいなと思って書きました。このスクリプトをPYTHONPATHが通っているディレクトリに放り込んでおき、
`python -m mocha_server lib/*.js test/*.js`
でカレントディレクトリでWebサーバを起動させます。
実行するには、python2(3は不可)とFlaskというフレームワークが必要です。

```python:mocha_server.py
#!/usr/bin/env python
# coding: utf-8
"""
Mocha server

usage:
    $ python mocha_server.py lib/*.js test/*.js
    or
    $ python -m mocha_server lib/*.js test/*.js
"""
PORT = 8008

import sys
import os
import urllib
import threading
import mimetypes
import flask
from flask import Flask, g, request, render_template_string, abort


sources = []

libs = {
    "/lib/jquery.js": "http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js",
    "/lib/mocha.js": "https://raw.github.com/visionmedia/mocha/master/mocha.js",
    "/lib/chai.js": "https://raw.github.com/chaijs/chai/master/chai.js",
    "/lib/mocha.css": "https://raw.github.com/visionmedia/mocha/master/mocha.css",
}

app = flask.Flask(__name__)


def main():
    try:
        sources[:] = [s.decode("utf-8") for s in sys.argv[1:]]
    except ValueError:
        sources[:] = [s.decode("shift_jis") for s in sys.argv[1:]]
    sources.sort(key=is_test)

    threads = []
    for lib in libs:
        t = threading.Thread(target=load_worker, args=[lib])
        t.daemon = True
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

    app.run(port=PORT, debug=True)


def load_worker(libname):
    source = urllib.urlopen(libs[libname]).read()
    libs[libname] = source


def is_test(source):
    return os.path.basename(source).startswith("test") or \
           "test" in source.split(os.sep)


@app.route("/")
def index():
    return template.render(sources=sources, libs=libs.keys())


@app.route("/lib/<path:p>")
def lib(p):
    if request.path not in libs:
        abort(404)
    mime, _ = mimetypes.guess_type(request.path)
    return flask.Response(libs[request.path], mimetype=mime)


@app.route("/source")
def source_file():
    source = request.args["source"]
    if source not in sources or not os.path.exists(source):
        abort(404)
    mime, _ = mimetypes.guess_type(source)
    return flask.Response(open(source).read(), mimetype=mime)


template = app.jinja_env.from_string("""\
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>mocha sample</title>
        {%- for lib in libs %}
        {%- if lib.endswith("css") %}
        <link href="{{ lib }}" rel="stylesheet">
        {%- else %}
        <script src="{{ lib }}"></script>
        {%- endif %}
        {%- endfor %}
        <script>
            mocha.setup("bdd");
            $(window).load(function() {
                mocha.run()
            });
        </script>
    </head>
    <body>
        <div id="mocha"></div>
        {%- for source in sources %}
        {%- if source.endswith("css") %}
        <link href="{{ url_for("source_file", source=source) }}" rel="stylesheet">
        {%- else %}
        <script src="{{ url_for("source_file", source=source) }}"></script>
        {%- endif %}
        {%- endfor %}
    </body>
</html>""")


if __name__ == '__main__':
    main()

```
スゲい簡単なPerl入門 -2ndDay

You can see source code like below in the file as module.

````test.pl
#!/usr/bin/perl -w

package Stone;

sub new{
     my $pkg = shift;
     my $hash = {
          name     =>     shift,
          weight     =>     shift
     };
     bless $hash, $pkg;
}
````

This is "Constructor" which is exists to generate Object.
Of course, you can name this one which is not "new".
But in many other languages, constructor is named new.


Then watch this code carefully.

````
     my $pkg = shift;
````

shift is inserted into $pkg. This means argument of Constructor "new" is provided to $pkg.

Then watch the call of new.

````
package main;

use Stonge;
my $obj = Stone->new('brick','100');
````

This code means...
by **PACKAGE NAME->SUBROUTINE NAME**, searching subroutine in the package, and provide argument.

####and ATTENTION!! fundamentally first argument is apapted to the package name.

so code above can be rewritten like below.

````
$obj = Stone::new('Stone','brick','100');
````

and watch receive-side code again.

````
# 1st argument of Stone module is inserted here.
my $pkg = shift;

# 2nd and 3rd arguments are inserted here.
my $hash = {
     # 2nd argument
     name => shift;
     # 3rd argument
     weight => shift;
};
bless $hash, $pkg;
````
スゲい簡単なPerl入門 - 1stDay

######this is working log for me in the future.

now I use Perl(Sledge, tt2, ORM) in business.
I've nevert know this language, so willing to start how to create service by modern perl

####[ref] http://www.rwds.net/kuroita/program/Perl_oo.html


#Package
You always see package hogehoge; at the top of perl file.
what is this? what does this mean?

##If !package
If you don't write this, Interpreter recognize that  in this code package is "package main;"

````test.pl
#!/usr/bin/perl -w

$hoge = "hello, world";
````

the result is below.

````shell
$ perl test
Name "main::hoge" used only once: possible typo at test line 3.
````

####look at "main::hoge".

Ordinary, grammar is **PACKAGE::SUBROUTINE**  . I have to remember this(^^)
Next is the test.

````test.pl
#!/usr/bin/perl

package main;

$bar = '$bar is in main package';

{
  package hoge;

  $bar = '$bar is in hoge package';
  print $bar,"\n";
}
{
  package hoo;

  $bar = '$bar is in hoo package';
  print $bar,"\n";
}

print $bar;
````

What do you think this code show result? and why?

````shell
$ perl test.pl
$bar is in hoge package
$bar is in hoo package
$bar is in main package
````

Once you declare package, variables in it is separated to ones in others.

Then, even if same name variables was used or edited in other package, unless the variables in the package are changed, no problem!!

So, $bar at bottom of the code is never changed.


Now, rewrite this code precisely below.

````test.pl
#!/usr/bin/perl

package main;

$main::bar = '$bar is in main package';

{
  package hoge;

  $hoge::bar = '$bar is in hoge package';
  print $hoge::bar,"\n";
}
{
  package hoo;

  $hoo::bar = '$bar is in hoo package';
  print $hoo::bar,"\n";
}

print $main::bar;
````

and the result.

```` shell
$ perl test.pl
$bar is in hoge package
$bar is in hoo package
$bar is in main package
````


Same thing can be said to subroutine as variables.
Package declaration sets absolute territory which other cannot get friction with.
Each package has each absolute territory.