OmniAICreator/Qiita-1.07M huggingface dataset:
server-mode の Emacs を複数立ち上げる

screen とかで、それぞれのセッションで emacs 使ってると掲題のような需要がでてくる。

`~/.bashrc`, `~/.zshrc` などでこんな感じのをかく。

```sh
if [ $STY ] # screen 内での実行の時
then
  export EMACS_SERVER_NAME="server-$STY"
  alias emacsclient="emacsclient -s \"$EMACS_SERVER_NAME\""
  if ! emacsclient -s "$EMACS_SERVER_NAME" -e "server-name" > /dev/null 2>&1
  then
    screen emacs --eval "(let () (setq server-name \"$EMACS_SERVER_NAME\")(server-start))" 
  fi
fi
```

screen 立ちあげと同時に emacs 起動するの嫌なら `screen emacs --eval ...` を `alias emacs-server="emacs --eval ...` するのかな。
ActionScriptで生年月日から年齢を計算する簡単ロジック

年齢 = floor((今日-誕生日)/10000) で計算できる

```
var today:Date = new Date();
var y1:String = paddingZero(today.getFullYear(), 4);
var m1:String = paddingZero(today.getMonth() + 1 , 2);
var d1:String = paddingZero(today.getDate(), 2);

var birth:Date = new Date(1983, 2, 16)
var y2:String = paddingZero(birth.getFullYear(), 4);
var m2:String = paddingZero(birth.getMonth() + 1 , 2);
var d2:String = paddingZero(birth.getDate(), 2);

var age:int = Math.ceil((int(y1 + m1 + d1) - int(y2 + m2 + d2)) / 10000);

trace(age);


function paddingZero(num, digit):String{
  return ('0000' + num).slice(-1 * digit);
}
```

## 変更履歴

- 平成29年3月9日 サンプルコードにProgressionフレームワークを利用していましたが、非依存にしました。
文字と濁点・半濁点が分かれていて，それらを結合したい時

例えば「レポート」という文字列をユニコードで扱うときに，
文字「ポ」が「ホ + ゜」 というように，文字と濁点・半濁点に分かれてしまう場合

```python:join_dakuten.py
import unicodedata
unicodedata.normalize('NKFC', unistr)
```

この関数をかませれば
「ホ + ゜」を「ポ」として扱うことができる
Rails 3.1: id="user_new" -> Rails 3.2: id="new_user" 

たいていの Rails アプリケーションには User モデルがあると思います。ある Rails アプリケーションの Rails を 3.1 から 3.2 に上げたところ、以下のような現象に遭遇しました。
Rails 3.1 まで id="user_new" となっていた User モデルの form の自動生成タグが、Rails 3.2 で id="new_user" となり、JavaScript が動かなくなっていました。密かにはまりそうな気がするので共有します。
PythonでRandom Forestを使う

pipやeasy_installを使ってscikit-learnを予めインストールしておく必要があります．

```python:rf.py
from sklearn.ensemble import RandomForestClassifier

trainingdata = [[1, 1], [2, 2], [-1, -1], [-2, -2]]
traininglabel = [1, 1, -1, -1]
testdata = [[3, 3], [-3, -3]]

model = RandomForestClassifier()
model.fit(trainingdata, traininglabel)
output = model.predict(testdata)

for label in output: print label
```
EC2でのIPアドレス

インスタンスに割り振ったElasticIPへEC2内の別のインスタンスからアクセスするとその別のインスタンスはグローバルIPっぽいIPとして観測される。外からは接続できない。（多分これはインスタンス画面から右クリックしてconnectって選んだ時のホスト名に含まれるIPである。）
EC2内部のIPは10から始まり、そのプライベートIPを取得しようと思ったら最初のノードのElasticIPじゃなくてプライベートIPへアクセスする。そうすればアクセスした側のIPアドレスとしてプライベートIPが観測される。
phpとSmartyの環境でモバイルサイトから余計な余白/インデントを自動的に削除

モバイルサイトで容量の制限や表示への影響を考慮してインデントしない方が無難です。

しかし、インデントのないソースコードは見る気さえなくなってしまいますよね。

Smartyを使っているのなら、この問題を簡単に解決できる！

ソースコード全体を [strip](http://www.smarty.net/docsv2/ja/language.function.strip.tpl) タグで囲めばコンパイル時に自動的に余計な余白とインデントが削除されます。

### この**醜い**ソースコードが
<pre><code>&lt;div&gt;{% if $type == 'show' %}公開中{% else %}&lt;a href='./visibility/show'&gt;公開中&lt;/a&gt;{% /if %}/{% if $type == 'hide' %}非公開中{% else %}&lt;a href='./visibility/hide'&gt;非公開中&lt;/a&gt;{% /if %}&lt;/div&gt;
&lt;div style="text-align:center"&gt;
&lt;table border="0" cellpadding="4" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
xxxxxxxxxxxxxx
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;</code></pre>

### 美しいソースコードに変身します
<pre><code>{% strip %}
&lt;div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;{% if $type == 'show' %}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;公開中
&nbsp;&nbsp;&nbsp;&nbsp;{% else %}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href='./visibility/show'&gt;公開中&lt;/a&gt;
&nbsp;&nbsp;&nbsp;&nbsp;{% /if %}
&nbsp;&nbsp;&nbsp;&nbsp;/
&nbsp;&nbsp;&nbsp;&nbsp;{% if $type == 'hide' %}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;非公開中
&nbsp;&nbsp;&nbsp;&nbsp;{% else %}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href='./visibility/hide'&gt;非公開中&lt;/a&gt;
&nbsp;&nbsp;&nbsp;&nbsp;{% /if %}
&lt;/div&gt;
&lt;div style="text-align:center"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;table border="0" cellpadding="4" cellspacing="0"&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xxxxxxxxxxxxxx
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/table&gt;
&lt;/div&gt;
{% /strip %}</code></pre>
homebrewでsubversion 1.7が入れられるようになってた！

ので、ソッコー入れた。

```sh
$ brew update
remote: Counting objects: 1886, done.
remote: Compressing objects: 100% (790/790), done.
remote: Total 1645 (delta 1216), reused 1223 (delta 844)
Receiving objects: 100% (1645/1645), 279.88 KiB | 171 KiB/s, done.
Resolving deltas: 100% (1216/1216), completed with 204 local objects.
From https://github.com/mxcl/homebrew
   84a2e44..1c1f1ad  master     -> origin/master
Automatic merge went well; stopped before committing as requested
Already up-to-date.

$ brew info svn
subversion 1.7.2
http://subversion.apache.org/
Depends on: pkg-config, neon, sqlite
/usr/local/Cellar/subversion/1.6.17 (90 files, 6.0M)
http://github.com/mxcl/homebrew/commits/master/Library/Formula/subversion.rb

$ brew install svn
Error: subversion already installed
Try: brew upgrade subversion

$ brew  upgrade subversion
```
# から始まるファイルを gitignore

* Q: Emacsのバックアップファイル #*# を gitignore に追加したいけど # で始まる行は無視されるよーうわーん
* A1: バックスラッシュを使え

```.gitignore
\#*#
```

* A2: ```[abc]``` 記法を応用するんだ

```.gitignore
[#]*#
```

参考：[git - add #*# glob to .gitignore? - Stack Overflow](http://stackoverflow.com/questions/2209810/add-glob-to-gitignore)
Terminal からMacVimとかGUI Applicationの起動

TerminalからGUI Applicationの起動するには.bashrcに以下の用に alias を追加する。
"open -a APPLICATION"な形式で何でも指定できる。

    alias firefox='open -a Firefox'
    alias chrome='open -a Google\ Chrome'
    alias safari='open -a Safari'
    alias mvim='open -a MacVim'

Applicationディレクトリのパスをイチイチ指定しなくてもいい

    $ mvim . 

とかでMacVimのファイルブラウザが開くのですごく便利。
TextMateでやる$ mate . 見たいな感じ。

    $ firefox http://google.com

とかでFirefoxで指定URLを開ける。
負にならないように整数のノイズをかける方法

ある値に整数のノイズをかけたいがマイナスにはしたくないという場合。
色々方法があるとは思いますがこれを使いました。

```js:gap_noise.js
// もとの値がsrc、ノイズの間隔は±gap
function gapNoise(src, gap) {

    // これだとノイズは最小でも-nにしかならない
    var noise = Math.round(Math.random() * (gap + src) - src);

    return src + noise;
}
```

特に調べず作った方法なので気づいたことがあればご指摘くださいm(__)m
Blocksのラッパークラス

引数0で戻り値voidのBlocksのラッパークラス. コンストラクタにBlocksを渡して生成します.
Blocksをより手軽に扱えます.
呼び出しはinvokeメソッドです.
addTarget:action:forControlEvents:などでも呼び出せます.

```objc:BlocksWrapper.h
#import <Foundation/Foundation.h>

typedef void (^CallableBlock)();

@interface BlocksWrapper : NSObject

@property (strong, nonatomic) CallableBlock blocks;
- (BlocksWrapper *)initWithBlocks:(CallableBlock)blocks;
- (void)invoke;

@end
```

```objc:BlocksWrapper.m
#import "BlocksWrapper.h"

@implementation BlocksWrapper
@synthesize blocks = _blocks;

- (BlocksWrapper *)initWithBlocks:(CallableBlock)blocks
{
    self = [super init];
    self.blocks = [blocks copy];
    return self;
}

- (void)invoke
{
    self.blocks();
}
@end
```
LaTeX用のOMakefile

```omakefile:OMakefile
###############################################################################
# w32texによるLaTeXファイルのビルドルール
# 次のようなディレクトリ構成を仮定している
# root
# ├ OMakeroot
# ├ OMakefile       このファイル
# ├ document.tex    TeXファイル (文字コードはUTF-8)
# ├ refs.bib        bibファイル (文字コードはUTF-8)
# ├ hogehoge/       サブディレクトリ (名前は任意)
# │ ├ sub1.tex     サブディレクトリにあるTeXファイルもコンパイルされる
# │ ├ sub2.tex     上に同じ
# └ images/         画像はimagesディレクトリの下に置く
#    ├ fig01.png    png対応
#    ├ fig02.jpg    jpg対応 (拡張子は必ずjpgにすること)
#    └ fig03.eps    eps対応
###############################################################################

# 生成するPDFの名前 (拡張子は不要)
TARGET = document
# 画像ファイルを置くディレクトリ
IMAGE_DIR = images

# LaTeXコマンド
LATEX = platex
# TeTeX v.2にある発展的なLaTeXオプションを有向にするかどうか
TETEX2_ENABLED = false
# LaTeXに渡す引数
LATEXFLAGS = -interaction=nonstopmode --kanji=utf8
# BibTeXコマンド
BIBTEX = pbibtex --kanji=utf8
# .dviから.pdfへのコンバータ
DVIPDFM = dvipdfmx
# dvipdfmに渡す引数
DVIPDFMFLAGS = -p a4
# Bounding Box生成コマンド
EBB = ebb

# グロブ展開に失敗したときに空の文字列を返すようにする
GLOB_OPTIONS = i

# Bounding Boxの生成ルール
.SUBDIRS: $(IMAGE_DIR)
	%.bb: %.png
		$(EBB) $<
	%.bb: %.jpg
		$(EBB) $<

TEX_FILES = $(glob *.tex */*.tex)
BIB_FILES = $(glob *.bib)
EPS_IMAGE_FILES = $(glob $(IMAGE_DIR)/*.eps)
OTHER_IMAGE_FILES = $(glob $(IMAGE_DIR)/*.png $(IMAGE_DIR)/*.jpg)
IMAGE_FILES = $(EPS_IMAGE_FILES) $(OTHER_IMAGE_FILES)
BB_FILES = $(addsuffix .bb, $(removesuffix $(OTHER_IMAGE_FILES)))

# コンパイルに必要なファイル
TEXDEPS[] = $(TEX_FILES) $(BIB_FILES) $(IMAGE_FILES) $(BB_FILES)

LaTeXDocument($(TARGET), $(TARGET))

.DEFAULT: $(TARGET).pdf $(TARGET).dvi

.PHONY: clean
clean:
	rm $(glob *.toc *.log *.pdf *.dvi *.fls *.aux *.maf *.mtc *.bbl *.blg) $(BB_FILES)
```

Windowsでない環境で使う場合は pbibtex じゃなくて jbibtex を使う必要があるかも．
macにおけるphpmyadminの設定について

教えてください
phpmyadminは下記に配置しています。
/Library/WebServer/Documents/phpmyadmin

![index](https://p.twimg.com/AlDUi1LCQAASVh-.png)

phpmyadminを一通り設定したのですが、http://localhost:8080/phpmyadmin/ が上記のように表示されます。また、http://localhost:8080/phpmyadmin/index.php はindex.phpが実行されず、index.phpのファイル内の記述が表示されます。

どうもphpが動いていないような気配がするのですが、ターミナル上でphp -vと打つと下記のように返ってきます。

```
% php -v     
PHP 5.3.4 (cli) (built: Dec 15 2010 12:15:07) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
ディレクトリ中のディレクトリ

```php:dirs.php
<?php
function scan_dir_in_dir($dir){ 
  $cwd = getcwd(); 
  chdir($dir); 
  $list = scandir("$dir/vendor") ; 
  foreach( $list  as $idx=> $dirname){ 
      if( $dirname == "." ){ unset($list[$idx] ); continue; } 
      if( $dirname == ".." ){ unset($list[$idx] ); continue;} 
      if( is_dir($dirname) === false ){ unset($list[$idx] ) ;continue;} 
      $list[$idx] = getcwd()."/".$dirname;
  };
  chdir($cwd);
  if(!$list){return array();}
  return $list;
}
```

ディレクトリ中のあるディレクトリ。再帰はしない。
ディレクトリ中のファイルを一覧

```scan_files_in_dir($dir)
function scan_files_in_dir($dir){ 
  $cwd = getcwd(); 
  chdir($dir); 
  $list = scandir("$dir/vendor") ; 
  foreach( $list  as $idx=> $dirname){ 
      if( $dirname == "." ){ unset($list[$idx] ); continue; } 
      if( $dirname == ".." ){ unset($list[$idx] ); continue;} 
      if( is_dir($dirname) === true ){ unset($list[$idx] ) ;continue;} 
      $list[$idx] = getcwd()."/".$dirname;
  };
  chdir($cwd);
  if(!$list){return array();}
  return $list;
}
```

ディレクトリ一覧中のファイル。再帰はしない。
Windowsの音量をEmacsから制御する

Emacsでコーディング中に音量を変更したくなったので書いてみました。

実際のボリュームコントロールには、mcvc.exeを使っています。
[http://maglog.jp/mos-privpro/index.php?module=Article&action=ReaderDetail&article_id=10569](http://maglog.jp/mos-privpro/index.php?module=Article&action=ReaderDetail&article_id=10569)


あとはmcvcを呼び出す関数を定義して、キーに割り当てるだけです。

```cl:.emacs
;; ボリューム
(defun volume-up ()
  (interactive)
  (call-process "mcvc.exe" nil nil nil "m+10")
  )

(defun volume-down ()
  (interactive)
  (call-process "mcvc.exe" nil nil nil "m-10")
  )

;; キーバインド
(global-set-key (kbd "C-;") 'volume-up)
(global-set-key (kbd "C-:") 'volume-down)
```

C-;、C-:でボリュームが変更できます。
twitterの@Anywhereによるタイムライン取得について

@Anywhereでタイムラインを取得する方法をご存知の方がいましたら教えてください。
下記で対象のユーザーのつぶやき一覧は取得できました。
取得したいのは、対象のユーザー視点のタイムラインです。

```javascript:get_timeline.js

var get_timeline = function(screenName) {
    twttr.anywhere(function(a){a.User.find(screenName, {
        success : function(user){
          user.timeline({
            page : 0,
            count : 100,
            success : function(r){console.log(r)},
            error : function(r){console.log(r)}
          });
        },
        error : function(r){console.log(r)}
      });});
};
MySQLで実行されたSQL文をログに出力する

/etc/my.cnfに下記を追加

>[mysqld]
>log=/var/log/mysqld-query.log

my.cnfで指定したファイルを作成

>\# touch /var/log/mysqld-query.log
>\# chown mysql.mysql /var/log/mysqld-query.log
>\# chmod 640 /var/log/mysqld-query.log

MySQLを再起動

>\#  /etc/init.d/mysqld restart
bundle install --path でのインストール先について教えて

```bundle install --path ```でのインストール先でRailsの場合、vendorディレクトリ以下に
ディレクトリを作成すると思いますが```--path```オプションを使った時の作成する
ディレクトリ名は何にしていますか？

1. bundle
2. bundler
3. その他

教えてください。

私はBundlerのページに合わせて```1. bundle```です。

> *参考情報* ：[Rails以外でBundlerを使うとき](http://qiita.com/items/1863)
曲線を描くやつ

ActionScript3.0アニメーション本から

```as3:DrawingCurve.as
package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    public class DrawingCurves extends Sprite {
        private var x0:Number = 100;
        private var y0:Number = 200;
        private var x1:Number;
        private var y1:Number;
        private var x2:Number = 300;
        private var y2:Number = 200;

        public function DrawingCurves() {
            init();
        }

        private function init():void {
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
        }

        private function onMouseMove(event:MouseEvent):void {
            x1 = mouseX * 2 - (x0 + x2) / 2; // ここがキモらしい
            y1 = mouseY * 2 - (y0 + y2) / 2;
            graphics.clear();
            graphics.lineStyle(1);
            graphics.moveTo(x0, y0);
            graphics.curveTo(x1, y1, x2, y2);
        }
    }
}
```
ただ線を描くだけのやつ

ActionScript3.0アニメーション本から

```as3:DrawingApp.as
package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    public class DrawingApp extends Sprite {
        public function DrawingApp() {
            init();
        }
        private function init():void {
            graphics.lineStyle(1);
            stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
        }
        private function onMouseDown(event:MouseEvent):void {
            graphics.moveTo(mouseX, mouseY)
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
        }
        private function onMouseUp(event:MouseEvent):void {
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
        }
        private function onMouseMove(event:MouseEvent):void {
            graphics.lineTo(mouseX, mouseY);
        }
    }
}
```
CATransition

NavigationControllerを使わずに（もしくはNavigationControllerごと）Pushトランジションを使いたいときはCATransitionを使う。CATransitionに用意されていないものはCAAnimationで組み立てる必要がある。

`#import <QuartzCore/QuartzCore.h>`も必要。

```objc:PushTransition.m
[CATransaction begin];         
CGFloat duration = 0.5f;
CATransition *transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;
transition.duration = duration;
transition.timingFunction = [CAMediaTimingFunction functionWithControlPoints:0.11 :0.72 :0.02 :0.96]; // easing関数次第でかなり印象の違う効果が生まれる
[[UIApplication sharedApplication].keyWindow.layer addAnimation:transition forKey:@"transition"];        
[[UIApplication sharedApplication] beginIgnoringInteractionEvents]; // ユーザーの操作を止める
[CATransaction setCompletionBlock: ^ {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ {
        [[UIApplication sharedApplication] endIgnoringInteractionEvents];        
    });
}];    
[fromViewController presentModalViewController:toViewController animated:NO];
[CATransaction commit];                  
```
javascriptで生成したファイルをローカルに保存する

a要素のdownload属性にファイル名を付けるとそのファイル名でダウンロードされます。

ブラウザ対応状況: https://caniuse.com/#feat=download

```javascript:
function download(blob, filename) {
  const objectURL = window.URL.createObjectURL(blob),
      a = document.createElement('a'),
      e = document.createEvent('MouseEvent');
  
  //a要素のdownload属性にファイル名を設定
  a.download = filename;
  a.href = objectURL;

  //clickイベントを着火
  e.initEvent("click", true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
  a.dispatchEvent(e);
}

//使用例
download(new Blob(['hello world']), 'hello.txt');
```
PHP-CSS-ParserのDeclarationBlockは__toString()が使える

    <?php
    require(dirname(__FILE__) . '/../CSSParser.php');
    $cssFile = 'epub/OEBPS/stylesheet.css';
    
    $parser = new CSSParser(file_get_contents($cssFile));
    $css = $parser->parse();
    
    foreach ($css->getAllDeclarationBlocks() as $db) {
        echo $db, PHP_EOL;
        echo '---------------------------------------------', PHP_EOL;
    }
a._validate is not a function というエラーでつんだ＼(^o^)／

Backbone.jsでサンプルアプリケーションっぽいTodoリストをRailsで作ってます。
フォームからテキストを入力してEnterを押すとlocalStorageに保存されるようにしたいのですが、Enterを押したところで「a._validate is not a function」というエラーが発生して、うまく保存されません。

わかる方がいれば助けてもらえるとありがたいっす。

```coffeescript:app/assets/javascripts/tasks.js.coffee
$ ->
  tasks   = new Todoapp.Collections.Tasks
  appView = new Todoapp.Views.AppView(el: $("#todoapp"), collection: tasks)
```

```coffeescript:app/assets/javascripts/backbone/views/app.js.coffee
Todoapp.Views.AppView = Backbone.View.extend
  events:
    "keypress #task_input" : "createTask"

  initialize: ->
    this.collection.bind("add", this.alertCreate, this)

  createTask: (e) ->
    text = $("#task_input").val()
    return if !text or e.keyCode isnt 13
    this.collection.create(content: text)
    $("#task_input").val("")

  alertCreate: ->
    alert("Created!")
```

```coffeescript:app/assets/javascripts/backbone/collections/tasks.js.coffee
Todoapp.Collections.Tasks = Backbone.Collection.extend
  model: Todoapp.Models.Task
  localStorage: new Store("tasks")
```

```coffeescript:app/assets/javascripts/backbone/models/task.js.coffee
Todoapp.Models.Task = Backbone.Model.extend
```

アプリケーション全体はGithubに上げているので、ちょっと古い部分もありますが参考までに。ブランチはprototypeです。
http://github.com/naoty/todoapp
Instagram API を操作するコード

[httparty](https://github.com/jnunemaker/httparty.git) で実装してみた。

```ruby:instagram_media_search.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'httparty'
require 'pp'

class Instagram
  include HTTParty
  base_uri 'https://api.instagram.com/v1'

  def initialize(default_params)
    self.class.default_params default_params
  end

  def media(media_id)
    media_id = media_id.to_s if media_id.class != 'String'
    self.class.get('/media/' + media_id)
  end

  def media_search(extra_params)
    self.class.get('/media/search', extra_params)
  end

  def media_popular()
    self.class.get('/media/popular')
  end
end

if __FILE__ == $0
  instagram = Instagram.new(:client_id => '<your client_id>')
  pp instagram.media(3)
end
```
いまのPROMPT

![](http://cache.gyazo.com/3f5f01f4bce742b2d90478c452c82cce.png)

僕が作業中にいつも表示させておきたい情報は

1. ユーザー名
2. ホスト名
3. カレントディレクトリ
4. Gitのブランチ
5. 時間（これは分かれるところだろうけど）

なので、これらをシェルのPROMPTに表示させるようにしている。

```zsh:.zshrc
function git_info() { 
    local info 
    if test -z $(git rev-parse --git-dir 2> /dev/null); then 
        info='' 
    else 
        info="${$(git symbolic-ref HEAD 2> /dev/null)#refs/heads/}" 
    fi  
    echo -n "$info"
}
local GREEN=$'%{^[[32m%}'
local ORANGE=$'%{^[[33m%}'
local BLUE=$'%{^[[34m%}'
local MAGENTA=$'%{^[[35m%}'
local DEFAULT=$'%{^[[m%}'
PROMPT=$ORANGE'%n@%m '$MAGENTA'%~'$BLUE' $(git_info)'$GREEN$'\n%T '
```

他の人の dotfiles は参考になることが多いのでよく見る。

僕のおすすめは [zentooさんのdotfiles](https://github.com/zentooo/rc) です。凝りすぎず、それでいて便利なものがひととおり揃っているのですごく参考になる。（dotfilesマスターな人の設定はぶっ飛び過ぎてて真似しずらいものが多いので…。）
オブジェクトが持つプロパティの型と名前のリストを取得する

Objective-C のランタイムを利用して、クラス／オブジェクトが持つプロパティ情報を取得する方法です。

ランタイムのヘッダをインポートして、

    #import "objc/runtime.h"

まず、objc_property_t 型のプロパティ情報から型名を取り出すメソッドを実装します。

	static const char * getPropertyType(objc_property_t property) {
	    const char *attributes = property_getAttributes(property);
	    char buffer[1 + strlen(attributes)];
	    strcpy(buffer, attributes);
	    char *state = buffer, *attribute;
	    while ((attribute = strsep(&state, ",")) != NULL) {
	        if (attribute[0] == 'T' && attribute[1] != '@') {
	            return (const char *)[[NSData dataWithBytes:(attribute + 1) length:strlen(attribute) - 1] bytes];
	        }        
	        else if (attribute[0] == 'T' && attribute[1] == '@' && strlen(attribute) == 2) {
	            return "id";
	        }
	        else if (attribute[0] == 'T' && attribute[1] == '@') {
	            return (const char *)[[NSData dataWithBytes:(attribute + 3) length:strlen(attribute) - 4] bytes];
	        }
	    }
	    return "";
	}

で、下記のように、キーとしてプロパティ名、値として型名を持つ NSDictionary 型でプロパティ一覧を返すメソッドを実装できます。

	- (NSDictionary *)properties {
	    unsigned int outCount, i;
	    objc_property_t *props = class_copyPropertyList([self class], &outCount);
	    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:0];
	    for(i = 0; i < outCount; i++) {
	        objc_property_t property = props[i];
	        const char *propName = property_getName(property);
	        if(propName) {
	            const char *propType = getPropertyType(property);
	            NSString *propertyName = [NSString stringWithCString:propName];
	            NSString *propertyType = [NSString stringWithCString:propType];
	            [dic setObject:propertyType forKey:propertyName];
	        }
	    }
	    free(props);
	    
	    return dic;
	}
Arduinoの基礎知識

####Arduinoとは
ハードとソフトにまたがった開発環境
とにかくEasy(になるように設計されている)
twitter@anywhereでログインボタンを設置するよりも、Arduinoつかって光センサの値を取得してLEDに反映させる方が簡単
はんだづけ不要
言語はprocessing。アホみたいに簡単。
####記述例
ここでは、光センサから読み取った値をもとにLEDの光度を調節している

```javascript:
#define LED 9//LEDを9の定数とする
int val = 0;

void setup()
{
  pinMode(LED, OUTPUT);//LEDをアウトプットに設定
}


void loop()
{
  val = analogRead(0);//アナログピン0番から電圧を読み取る 0~1023の間の値がセットされる
  analogWrite(LED,val/4);//LEDのピンに値を書きこむ(光らせる)
  delay(10);
}
FuelPHPでCSVの出力

英語圏には無縁の問題として、
日本でCSVを出力するにはSJISでやらなければならない。Excelのせいで。

で、FuelPHPでCSVの出力には、本来RestControllerを使うと楽なんだけど、
to_csv()関数をoverrideできない罠。

処理を追っかけきれてないけど、COREPATH/classes/controller/rest.php の、
response()メソッドの中で、

`$this->response->body(Format::forge($data)->{'to_'.$this->format}());`

みたいにto_csv()を読んでるんだけど、
bootstrap.phpでoverrideしたFormatはこのタイミングだと死んでるぽい？よくわかんね。。。

RestController使わずにCSVを出力する事で、とりあえず回避。

```php:format.php
<?php
// app/classes/format.php を作成
class Format extends Fuel\Core\Format {
	/**
	 * CSV出力をSJIS-WINで返す
	 * @access public
	 * @param mixed $data
	 * @return string csv(sjis-win)
	 */
	public function to_csv($data = null){
		$csv = parent::to_csv($data);
		$csv = mb_convert_encoding($csv, 'SJIS-win', 'UTF-8');
		return $csv;
	}
}
```

```php:bootstrap.php
<?php
//(ry
// app/bootstrap.php の一部を修正
Autoloader::add_classes(array(
	// Add classes you want to override here
	// Example: 'View' => APPPATH.'classes/view.php',
	'Format' => APPPATH . 'classes/format.php',
));
```

```php:hoge.php
<?php
//(ry
// TemplateController内での出力
public function action_hoge(){
	$data = array(0,1,2,3,4);
	//テンプレートを無効化してCSVとして出力
	$this->template = null;
	$this->response->set_header('Content-Type', 'application/csv');
	$this->response->set_header('Content-Disposition', 'attachment; filename="hoge.csv"');
	echo Format::forge($data)->to_csv();
	return;
}
```

デバッグやってないけどたぶん動く。
getJSONでグローバル変数に値をセット

#201402追記
これは全く良い方法ではないです(コメント参照)
なお同期通信にするのもあまり筋の良い方法ではなくて、コールバックで順序を保障するのが普通です。
本気で設定ファイルとして読み込みたいなら、renderingの段階で渡すのがよいかもしれません。

#概要
JQueryのgetJSONは非同期通信なので、JSONで書いた設定ファイルから値を取ろうとしても、取れないまま処理が進んでしまう。
コールバック関数の中で処理を完結させれば問題ないが、グローバル変数に値をセットしたい場合は、同期通信にしてからgetJSONする必要がある。
具体的には、$.ajaxSetup({async: false});を使う。
気付かないまま詰まったので参考にどうぞorz
#コード

```js:sample.js
	var hoge
	function setPreference(){
		$.ajaxSetup({async: false});//同期通信(json取ってくるまで待つ)
		$.getJSON("preference.json", function(data){
			hoge = data.param;
		});
		$.ajaxSetup({async: true});
	}
```
PHPのクロージャで $this を使う方法

```$this``` はそのまま ```use``` で渡せないので、 ```$that = $this;``` みたいなことをする。どっかのスクリプト言語で見たような・・・。

```php
<?php

class Foo
{
	public function getClosure()
	{
		$that = $this;
	
		$closure = function() use ($that) {
			$that->bar();
		};
		
		return $closure;
	}
	
	public function bar()
	{
		echo 'Called bar method.', PHP_EOL;
	}
}

$foo = new Foo();
$closure = $foo->getClosure();
$closure(); // Called bar method.
```
Play Scalaの導入

下までサクサク進んだけど、起動してアクセスすると、下記のエラーを吐く
Application.index action not found scala play
コメントに原因と解決方法を書いた

```sh
%cd /usr/local
%brew versions scala
2.9.1    git checkout b78cfbd /usr/local/Library/Formula/scala.rb
2.9.0.1  git checkout cb1ab23 /usr/local/Library/Formula/scala.rb
2.9.0    git checkout 4002978 /usr/local/Library/Formula/scala.rb
2.8.1    git checkout 0e16b9d /usr/local/Library/Formula/scala.rb
2.8.0    git checkout fdb41a3 /usr/local/Library/Formula/scala.rb
2.7.7    git checkout 6a18e38 /usr/local/Library/Formula/scala.rb
2.7.6    git checkout a82e823 /usr/local/Library/Formula/scala.rb
2.7.5    git checkout e9dd256 /usr/local/Library/Formula/scala.rb
%git checkout 0e16b9d /usr/local/Library/Formula/scala.rb
%brew install scala
%scala -version
Scala code runner version 2.8.1.final -- Copyright 2002-2010, LAMP/EPFL
%brew install play
%play install scala
%cd ~
%play new test --with scala
%play run test
Scala で ReadWriteLock にローンパターンを使う

入出力リソースの処理なんかで使われるローンパターンを、平行ロックにも。
ロック解除忘れ、finally句で捕捉がめんどう、などなどを補います。

```scala:LoanPatternLock.scala
object LoanPatternLock {
  import java.util.concurrent.locks.{Lock, ReadWriteLock}
  
  def lockWith[A <% Lock, B](l: A)(e: => B) = {
    l.lock()
    try e finally l.unlock()
  }
  
  def readLockWith[A <% ReadWriteLock, B](l: A)(e: => B) =
    lockWith(l.readLock)(e)
  
  def writeLockWith[A <% ReadWriteLock, B](l: A)(e: => B) =
    lockWith(l.writeLock)(e)
}
```
git のログを見やすく表示

```~/.gitconfig
[alias]
        tree = log --full-history --graph --date=short --pretty=format:\"%Cgreen%h %cd %Cblue%an %Cred%d %Creset%s\"
```

`git tree` では現在のブランチにマージされているものだけ表示
`git tree --all` とするとそれ以外のブランチなども表示

![git tree](http://gyazo.com/4621edba19b942975c55bcac4d30cf5e.png)

EDIT: cherry-pick したときに困るので名前表示を "committer name" から "author name" に変更
ニコ動のタイトルやサムネ画像URLを取得したりとか

```ruby
#!/usr/bin/env ruby
# vim: fileencoding=utf-8
require 'open-uri'

module NicoVideo
  GETTHUMBINFO_URL = "http://ext.nicovideo.jp/api/getthumbinfo"
  OK_STRING = %q|<nicovideo_thumb_response status="ok">|
  FAIL_STRING = %q|<nicovideo_thumb_response status="fail">|
  ELEMENTS = [:title,
              :description,
              :thumbnail_url,
              :watch_url]
  THUMBINFO = Struct.new(*ELEMENTS)

  def getthumbinfo(video_id)
    doc = open("#{GETTHUMBINFO_URL}/#{video_id}"){|f|f.read}
    if /#{OK_STRING}/ =~ doc
      ELEMENTS.inject(THUMBINFO.new) do |result, element|
        result[element] = doc.slice(%r|<#{element}>(.+?)</#{element}>|, 1)
        result
      end
# Ruby1.9系なら下記のコード
#      ELEMENTS.each_with_object(THUMBINFO.new) do |element, obj|
#        obj[element] = doc.slice(%r|<#{element}>(.+?)</#{element}>|, 1)
#      end
    else
      false
    end
  end
  module_function :getthumbinfo
end

if $0 == __FILE__
  sm9 = NicoVideo.getthumbinfo(:sm9)
  puts sm9.title                 #=> 新・豪血寺一族 -煩悩解放 - レッツゴー！陰陽師
  puts sm9.description           #=> レッツゴー！陰陽師（フルコーラスバージョン）
  puts sm9.thumbnail_url         #=> http://tn-skr2.smilevideo.jp/smile?i=9
  puts sm9.watch_url             #=> http://www.nicovideo.jp/watch/sm9

  p NicoVideo.getthumbinfo(:smX) #=> false

  class TEST_NicoVideo
    include NicoVideo

    def test
      puts getthumbinfo(:sm9).title
    end
  end

  TEST_NicoVideo.new.test
end
```

XMLなんかマトモにパースしない。
Struct の使い方がイケテナイ気がするけど…
Ruby1.9系ならinjectの代わりにeach_with_objectの方が便利と、
というか、injectは本来の趣旨と、この使い方とは違っているような気もする
Yahooの日本語形態素解析API

```php:yahoo_ma_test.php 
<?php
require_once 'HTTP/Request2.php';
$appid = '<your appid>';

$sentence = $argv[1];

$request = new HTTP_Request2('http://jlp.yahooapis.jp/MAService/V1/parse', HTTP_Request2::METHOD_GET);
$url = $request->getUrl();
$url->setQueryVariables(array(
  'appid' => $appid,
  'sentence' => $sentence,
  'results' => 'uniq',
  'filter' => '9'
));

try {
  $response = $request->send();
  if (200 == $response->getStatus()) {
    $xml = new SimpleXMLElement($response->getBody());
    foreach ($xml->uniq_result->word_list->word as $word) {
      printf("%s\t%d\n", $word->surface, $word->count);
    }
  } else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
      $response->getReasonPhrase();
  }
} catch (HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
?>
```
PHP から Mecab を使うコード

```php:mecab_test.php 
<?php
$text = $argv[1];
$mecab = new Mecab();

$keywords = array();
$nodes = $mecab->parseToNode($text);
foreach ($nodes as $node) {
  if ($node->posid >= 37 && $node->posid <= 66) {
    if (isset($keywords[$node->surface])) {
      $keywords[$node->surface]++;
    } else{
      $keywords[$node->surface] = 1;
    }
  }
}
arsort($keywords);
print_r($keywords);
?>
```

    $ php mecab_test.php <sentence>
DefaultSignaturesを用いたMonadの理想的な定義

こういう認識で合ってます？

~~~ {haskell}
{-# LANGUAGE DefaultSignatures #-}                         
                                                           
import Prelude hiding (Functor(..), Monad(..))
                                                           
class Functor m where                                      
  fmap :: (a -> b) -> m a -> m b                           
  default fmap :: Applicative m => (a -> b) -> m a -> m b  
  fmap f v = pure f <$> v
                                                           
class Functor m => Applicative m where                     
  pure :: a -> m a                                         
  default pure :: Monad m => a -> m a                      
  pure = return                                            
                                                           
  (<$>) :: m (a -> b) -> m a -> m b
  default (<$>) :: Monad m => m (a -> b) -> m a -> m b
  a <$> b = a >>= \f -> b >>= \v -> return (f v)

class Applicative m => Monad m where
  return :: a -> m a
  (>>=) :: m a -> (a -> m b) -> m b

instance Monad [] where
  return a = [a]
  m >>= f = concatMap f m
instance Applicative []
instance Functor []

main :: IO ()
main = do
  print $ [(+1), (*2)] <$> [1, 2, 3]
~~~
GroovyでのDB処理でわからなかった奴ら。

[GroovyでのDB処理](http://qiita.com/items/2798 "GroovyでのDB処理")をまとめてて、わからなかった奴ら。
上はともかく、下のdatasetについては[fumokmmさんの所](http://d.hatena.ne.jp/fumokmm/20090505/1241504105 "Groovyでデータベース操作（GroovySQL）")で紹介されているやりかたそのままだから間違ってないと思うんですが。。。

```groovy
import groovy.sql.Sql

def sql = Sql.newInstance("jdbc:mysql://localhost:3309/test", "yamap", "yamap", "com.mysql.jdbc.Driver")

// Listを返すexecuteInsert というのもあったけど何が返ってくるのかわからない。
//（色々試したけど空のリストしか返ってこない。。。）
def keys =  sql.executeInsert("insert into data (id, name) values (?,?)",['77', 'yamap'])
assert keys == []
println sql.rows("select * from data where id = ?", ["77"])

// dataSetを使用するとsql作ってくれるとかあるらしいけど、例外発生。何が違う？？
def dataSet1 = sql.dataSet('data')
def dataSet2 = dataSet1.findAll{it.name == 'yamada'}

// groovy.lang.GroovyRuntimeException: Could not find the ClassNode for MetaClass: org.codehaus.groovy.runtime.metaclass.ClosureMetaClass@1998b7d[class ConsoleScript9$_run_closure1]
println dataSet2.rows()
```
GroovyでのDB処理

DB処理のまとめ。

``` groovy
@GrabConfig(systemClassLoader=true)
@Grapes(
//    @Grab("postgresql:postgresql:9.1-901.jdbc4")
    @Grab("mysql:mysql-connector-java:6.0.5")
)
import groovy.sql.Sql

def dbServer = "localhost"
def dbName = "test"
def dbPort = "3309"
//def url = "jdbc:postgresql://${dbServer}:${dbPort}/${dbName}"
def url = "jdbc:mysql://${dbServer}:${dbPort}/${dbName}"
def user = "yamap"
def password = "yamap"
//def driver = "org.postgresql.Driver"
//def driver = "com.mysql.jdbc.Driver"
def driver = "com.mysql.cj.jdbc.Driver"
def sql = Sql.newInstance(url, user, password, driver)

println "テーブル作成"
sql.execute "create table data (id varchar(50),name varchar(50))"

println "一括で取得".center(30,"-")
// ArrayList<GroovyRowResult>で返ってきます。
def rows = sql.rows("select * from data")
println rows
// 中身取得する時はこんな感じ
println rows[0].name

println "条件指定".center(30,"-")
println sql.rows("select * from data where name = ?", ["yamada"])

println "条件複数指定".center(30,"-")
println sql.rows("select * from data where name = ? and id = ?", ["yamada",1])

println "複数のMapで条件設定".center(30,"-")
println sql.rows("select * from data where name = ?1.piyo and id = ?2.huga", [piyo:"yamada"],[huga:1])

println "こんな置き換えもできる_1".center(30,"-")
println sql.rows("select * from data where name=:piyo", [piyo:"yamada"])

println "こんな置き換えもできる_2".center(30,"-")
class MyClass {
  def hoge = 1
}
println sql.rows("select * from data where name=?2.piyo and id=?1.hoge", new MyClass(), [piyo:"yamada"])

println "一行づつ取得".center(30,"-")
// rowsではできた、Mapとかクラスで指定する事はできないようです。
sql.eachRow("select * from data where name = ?", ["yamada"]) { 
  println it
}

println "先頭行を取得".center(30,"-")
println sql.firstRow("select * from data order by id")

println "挿入1".center(30,"-")
sql.executeUpdate("insert into data (id, name) values (?, ?)", ["99","don takosu"])
println sql.rows("select * from data where id = ?", ["99"])

println "挿入2_Mapで設定".center(30,"-")
def dataSet2 = sql.dataSet('data')
dataSet2.add (
  id:'666',
  name:'takahashi'
)
println sql.rows("select * from data where id = ?", ["666"])

// 削除は挿入と同じ
println "削除1".center(30,"-")
sql.execute("delete from data where id='99' and name='don takosu'")
println sql.rows("select * from data where id = ?", ["99"])

println "削除2".center(30,"-")
sql.executeUpdate("delete from data where id=:piyo and name=:huga",[piyo:"666", huga:"takahashi"])
println sql.rows("select * from data where id = ?", ["666"])

// 参考URL
// http://groovy.codehaus.org/api/groovy/sql/Sql.html
// http://d.hatena.ne.jp/fumokmm/20090505/1241504105
```

こういうコード書く時「println」だとわかりにくいですよね？
どう書けばわかりやすいでしょう？
Rubyのcase式で気を付けること

### case式での一般的なRangeオブジェクトの使い方
Cool!に書けますよねー

```ruby:range_case.rb
def range_case(year)
  case year
  when 1912..1926
    "T"
  when 1926..1989
    "S"
  else
    "H"
  end
end

range_case(1926)  # => "T"
range_case(1973)  # => "S"
range_case(2012)  # => "H"
```
### case式でRangeオブジェクト同士の比較には気を付けて
Range（, Regexp, Module）オブジェクト同士の比較にcase式は使わない方がイイかも？Cool!な書き方によるトラップ

```ruby:strange_case.rb
def strange_case(obj)
  case obj
  when obj
    true
  else
    false
  end
end

strange_case( "1" )       # => true
strange_case( :"1" )      # => true
strange_case( 1 )         # => true
strange_case( [1, 2, 3] ) # => true
strange_case( {"1"=>1} )  # => true
strange_case( (1..3) )    # => false
strange_case( /.*/ )      # => false
strange_case( Fixnum )    # => false
```
### なので、ArrayオブジェクトはRangeオブジェクトのようにはならないよね
Arrayオブジェクトでも「*」で展開すればOKですけど、そのままでは上の例の通りNGです。

```ruby:array_case.rb
def array_case(year)
  case year
  when [*1925, 1926]
    "T"
  when [*1926..1989]
    "S"
  else
    "H"
  end
end

array_case(1926)          # => "H"
array_case(1973)          # => "H"
array_case(2012)          # => "H"
```
### ArrayオブジェクトもRangeオブジェクトと同じ仕組みを持たせれば同様な動きになるよ
ArrayをオープンしてRange#include?と同様にArray#include?のエイリアスにArray#===を追加する
「*」で展開しなくてもOKになる

```ruby:ex_array_case.rb
class Array
  alias :=== :include?
end

def ex_array_case(year)
  case year
  when [*1925, 1926]
    "T"
  when [*1926..1989]
    "S"
  else
    "H"
  end
end

ex_array_case(1926)       # => "T"
ex_array_case(1973)       # => "S"
ex_array_case(2012)       # => "H"
```

### でも、当然弊害でるよ
Arrayオブジェクト同士の比較もNGに。
Range#include?のエイリアスにRange#===があるのに、Array#include?のエイリアスにArray#===がないのは何故？って思ってたけど、これが理由なのかな？

```ruby:arara_case.rb
require './strange_case.rb'

strange_case( "1" )       # => true
strange_case( :"1" )      # => true
strange_case( 1 )         # => true
strange_case( [1, 2, 3] ) # => false
strange_case( {"1"=>1} )  # => true
strange_case( (1..3) )    # => false
strange_case( /.*/ )      # => false
strange_case( Fixnum )    # => false
```
IRCで一行メッセージ

    #!/usr/local/bin/ruby
    require 'net/irc'
    
    class SimpleClient < Net::IRC::Client
      def on_rpl_welcome(m)
        super
        post JOIN, '#onelirc'
        post NOTICE, '#onelirc', 'Hi'
        sleep 5
        finish
      end
    
      def on_error(m)
        finish
      end
    
      def on_err_nicknameinuse(m)
        super
        $stderr.puts 'NICKNAME ALREADY INS USE ERRORRRRRRRRRRRRRRRRRRRRRRRRR'
        post NICK, 'another'# some server rejects multi-client connection
        sleep 3
      end
    end
    
    SimpleClient.new('irc.trpg.net', '6667',
      nick: 'onelirc',
      user: 'onelirc',
      real: 'onelirc'
    ).start
Predicate Matchersを使ってステータスコードをテストする時はFailure Messageも渡すと親切

Rackアプリケーションをテストするときの話です。


## Predicate Matchersってなんじゃらホイ

```ruby
[].empty? # -> true
it { [].should be_empty }
```

`be_{predicate}` で `obj.{predicate}?` を呼ぶRSpecの便利マッチャ。
これのお陰で `[].count.should eq 0` みたいなのを書かずに済む。
Predicate Matchersに足を向けて寝れない!!!!!


## ステータス・コードをテストするときにもPredicate Matchers

```ruby
describe "GET", "/" do
  subject { last_response }
  before { get '/' }
  it { should be_ok }
end
```

だいたいこんなかんじでステータスコードをテストする。

しかし、テストが失敗すると非常に悲しい。

```
Failures:

  1) RootController GET /
     Failure/Error: it { should be_ok }       expected ok? to return true, got false     # ./spec/app/controllers/root_controller_spec.rb:38:in `block (4 levels) in <top (required)>'
Finished in 0.5261 seconds
3 examples, 1 failure
```

こんなかんじのFailure Messageがっっっ。

意図せずテストが失敗したとき、Failure Messageなどを頼りにテストやプロダクトコードを直すわけですが、これでは200が返らなかったことしかわからないので不便。

## `should` にCustom Failure Messageを渡す

```ruby
describe "GET", "/" do
  # ...
  it { should be_ok, "Actual status: #{last_response.status}" }
end
```

第二引数に失敗したときに出力されるメッセージを渡すことができるのでこれを使ってみる。

```
Failures:

  1) RootController GET /
     Failure/Error: it { should be_ok, last_response.status }
       Actual status: 1
     # ./spec/app/controllers/root_controller_spec.rb:38:in `block (4 levels) in <top (required)>'

Finished in 0.58836 seconds3 examples, 1 failure
```

ずっと親切!!!!!

ちなみにこれは本当に出くわした失敗で、Sinatra/Padrinoではアクションの返り値がIntegerだとHTTP ステータスコードと解釈してRack::Responseに設定するのでした、こわいですね。
Scala で PropertyChangeEvent の発行とかを実装するミックスイン用トレイト

Scala は実装をミックスインで拡張できます。Java Bean 値変化イベントを発行するための、トレイトのひな形です。

```scala:PropertyChangePublisher.scala
import java.beans.{PropertyChangeListener, PropertyChangeSupport, PropertyChangeEvent}

trait PropertyChangePublisher {
  private lazy val propertyChangeSupport = new PropertyChangeSupport(this)
  
  def addPropertyChangeListener(listener: PropertyChangeListener) =
    propertyChangeSupport.addPropertyChangeListener(listener)
    
  def removePropertyChangeListener(listener: PropertyChangeListener) =
    propertyChangeSupport.removePropertyChangeListener(listener)
  
  protected def firePropertyChange(propertyName: String, oldValue: Any, newValue: Any) =
    propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue)
  
  protected def firePropertyChange(event: PropertyChangeEvent) =
    propertyChangeSupport.firePropertyChange(event)
  
  protected def fireIndexedPropertyChange(
      propertyName: String, index: Int, oldValue: Any, newValue: Any) =
    propertyChangeSupport.fireIndexedPropertyChange(propertyName, index, oldValue, newValue)
}
```

AbstractBean を継承したり、コードジェネレータを利用しなくても実装されるというのが気持ちいい感じがします。
使い方。

```scala:PropertyChangePublisherUsage.scala
class BeanClass extends PropertyChangePublisher {
  private var _name = ""

  def name = _name
  def name_=(newName: String) {
    val oldValue = _name
    _name = newName
    firePropertyChange("name", oldValue, newName)
  }
}
```

イベント通知部分は書かなきゃいけないところが、悲しいところです。
最小限のAtomフォーマット

最近、AtomをベースにしたXMLを書くことが多いので、必要最小限の要素をまとめてみる。意外と裏ルール(公式のスキーマファイルに記載されていない)が多くて正しいAtomを書くのは難しいです。

## type=feed

atom:feedをルート要素にする場合。

* entryはなくてもいい
* id,title,updatedが必須。authorもentryが空っぽなら必須。
* idはTag URIスキームを使うと短く書けるだろう。
* authorはnameだけが必須。
* link@selfはあった方がいいがMUSTではない。

```xml:feed.atom
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>tag:example.com,2012:1234</id>
  <title>sample feed</title>
  <updated>2012-01-01T00:00:00+09:00</updated>
  <link rel="self" href="http://example.com/self.atom"/>
  <author><name>author name</name></author>
</feed>
```

## type=entry content埋め込み

atom:entryをルート要素にする場合、二通りある。ひとつはcontentを直接埋め込んでしまう方法。

* id,title,updatedは必須。
* authorもルートがentryになってしまうと必須。
* contentはtypeを省略するとtextを内包しているとみなされる。
typeにXML系を指定する場合はcontentの子要素がそれ自身で完結したXMLでなくてはならない。即ちcontentの直下に含められる要素は一つだけである。

```xml:entry1.atom
<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <id>tag:example.com,2012:1234</id>
  <title>sample entry</title>
  <updated>2012-01-01T00:00:00+09:00</updated>
  <author><name>author name</name></author>
  <content>コンテンツの中身そのもの</content>
</entry>
```

## type=entry linkする

contentが文字で表しづらかったり、Web上に存在しないデータの場合はcontentに直接埋め込むのは不可能なので、linkを使って代替する情報を指定する。

* contentを使わない場合はlink@rel=alternateが必須。
* link@rel=alternateはrelを省略できる。

```xml:entry2.atom
<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <id>tag:example.com,2012:1234</id>
  <title>sample entry</title>
  <updated>2012-01-01T00:00:00+09:00</updated>
  <author><name>author name</name></author>
  <link href="http://example.com/foo.html"/>
</entry>
```
memcachedのengine-puブランチをビルドする

今出てるmemcachedから400コミットぐらい先に進んでる公式リポジトリengine-puがあります。
多分ストレージエンジンを差し替えれるようにしている最中の物だと思いますが、触ってみたいですよね。

```shell-session
$ git clone git://github.com/memcached/memcached.git
$ cd memcached
$ git branch -r  origin/14perf
  origin/HEAD -> origin/master
  origin/engine-pu
  origin/gh-pages
  origin/master
  origin/stable
  origin/stable-1.3
$ git checkout origin/engine-pu
```

獲得は簡単ですが、configureが無くてMakefile.amから格闘しろということかと途方に暮れます。
でもconfig/以下に素敵スクリプトがちゃんと用意されてるのでそれ使いましょう。それがないとversion.m4ファイルの生成すらままならず心臓に至って死にます。（無駄に格闘してた人）

```shell-session
$ ./config/autorun.sh
$ ./configure
$ make -j4
```

簡単ですね。
名前付き引数を持つメソッドと引数が無いメソッドが同時に存在するとき

名前付き引数を持つメソッドと引数が無いメソッドが同時に存在し、引数を指定せずにそのメソッドを呼び出した場合の動作は、[名前付き引数と省略可能な引数 (C# プログラミング ガイド)](http://msdn.microsoft.com/ja-jp/library/dd264739.aspx)によると、以下の通りとなります。

> 2 つの候補が同等である場合は、呼び出しで引数が省略された省略可能なパラメーターを持たない候補が優先されます。

例えば、以下のコードですと、`Main`メソッド内で呼び出した`func()`は`static void func()`が呼び出されることになります。

```
class cls { };

class Program
{
	static void Main(string[] args)
	{
		func( );
	}

	static void func()
	{
	}

	static void func(cls c = null)
	{
	}
}
```
ゆうちょ銀行のログインとか取得か

```ruby:yucho_bank.rb
require 'rubygems'
require 'kconv'
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
require 'mechanize'

class YuchoBank
  attr_accessor :password, :passphrase_list, :id, :password,:m
  START_URL ="https://direct.jp-bank.japanpost.jp/direct_login.html?link_id=ycDctLgn"
  def initialize()
    self.password = ""
    self.passphrase_list = {} #合言葉の質問と回答ペア
    self.id         = ""
    self.password   = ""
    @is_login
  end
  def login()
    self.start
    self.send_id
    self.send_aikotoba1 # first_time
    self.send_aikotoba2 # second_time
    self.send_password # パスワードを送る。
    @is_login = true
  end
  def start()  @m = Mechanize.new end
  def send_id 
    id= self.id.split('-')
    @m.get START_URL
    #お客様番号を入れる。
    @m.page.forms[0].fields_with({:name=>"okyakusamaBangou1"}).first.value = id[0]
    @m.page.forms[0].fields_with({:name=>"okyakusamaBangou2"}).first.value = id[1]
    @m.page.forms[0].fields_with({:name=>"okyakusamaBangou3"}).first.value = id[2]
    self.send_request("次")
  end
  alias send_aikotoba1 send_aikotoba
  alias send_aikotoba2 send_aikotoba
  def send_aikotoba()
    return :skip unless @m.page.title =~ /合言葉/
    q_text = @m.page.search('div.loginbox table td span.bold').first.text #合言葉の質問を探す。
    #合言葉の回答入力エリア
    e = @m.page.forms[0].field_with(:name=>"aikotoba")
    #合言葉の入力
    e.value = passphrase_list[q_text] 
    #合言葉の送信
    self.send_request("次")
  end
  def send_password()
    #パスワードを入力
    e = @m.page.forms[0].field_with(:type=>"password")
    e.value = password
    self.send_request("ログイン")
  end
  def send_request(button_name)
    #JavaScriptのsend_requestをFakeする。
    button = @m.page.search('//input[contains(@value,"'+button_name+'")]').first
    #ボタンを押した時に遷移する。URLを指定する。
    action = button.attr('onclick').split(',')[1].gsub(%r"'", "")  #=>  ex "https://direct3.jp-bank.japanpost.jp/tp1web/U010701BLC.do"
    @m.page.forms[0].action = action
    # event のフィールドに値を入れる。
    event_value = button.attr('onclick').match(/new Array\('([^']+)'\),false/)[1] 
    @m.page.forms[0].fields.select{|e| e.name == "event"}.first.value = event_value
    @m.page.forms[0].submit
  end
  ####ログイン後に使う。
  #ホーム
  def go_home()
    self.send_request("ホームヘ") if @is_login
  end  
  #残高照会
  def zandaka_shokai()
    self.send_request("現在高照会") if @is_login
  end
  def go_page(button_name)
    self.send_request(button_name) if @is_login
  end  
  def current_page
    @m.page
  end
  def current_page_body
    @m.page.body.toutf8
  end
end

```
バッファでコピペ

バッファは好きなキーにマップできるみたいです。

入力の手順は、
1. ダブルクォート
2. 好きなキー
3. アクション

２つの例で例示します。
bというキーに一行ヤンクし、それをペーストします。

```
"byy
"bp
```

nというキーに一行ヤンクし、それをペーストします。

```
"nyy
"np
```

さらに発展的には、次のようです。
nというキーに三行ヤンクし、それをペーストします。

```
"n3yy
"np
```
メモ：PHPで処理後にリダイレクト

[このサイト](http://php.birdlab.com/tips/21)を参照しました。

```php:
<?php
//ここから処理
//...
//処理完了
//処理後にリダイレクトしたいサイトの設定
$site = "http://www.homuhomu.hom";
//リダイレクト開始
header("Location: $site",true,303);
?>
```
DartのコードはJavaScriptのコードハイライトでもいけるんじゃないか説

```javascript:point.dart
class Point {
  Point(this.x, this.y);
  distanceTo(Point other) {
    var dx = x - other.x;
    var dy = y - other.y;
    return Math.sqrt(dx * dx + dy * dy);
  }
  var x, y;
}

main() {
  Point p = new Point(2, 3);
  Point q = new Point(3, 4);
  print('distance from p to q = ${p.distanceTo(q)}');
}
```
うん、ぜんぜんいけるね。
シンプルなPSR-0準拠クラスオートローダー

require_onceの嵐から解放されましょう。
オートローダーの実装はZend_Loader_AutoloaderやSplClassLoaderなどたくさんあるけど、ゴテゴテしてよくわからない機能がついているコードが多い印象。
include_pathをきちんと調整してあれば、PSR-0準拠のクラスは以下のコードでローディングできます。

```php
<?php
//以下、コードの先頭に書いておけば以降require_onceを書かなくてよくなる

function simpleClassLoader($c) {
    $lastSlash = strrpos($c, '\\');
    if (false !== $lastSlash) {
        $lastSlash++;
        $ns = substr($c, 0, $lastSlash);
        $class = substr($c, $lastSlash);
        $path = strtr($ns, '\\', '/') . strtr($class, '_', '/');
    } else {
        $path = strtr($c, '_', '/');
    }
    @include_once $path . '.php';
}

spl_autoload_register('simpleClassLoader');
```

## 追記
すみません、PSR-0ってクラス名と名前空間で扱いが異なることを知りませんでした…　正しくは上記になります。
リダイレクトを伴うRackアプリケーションの受け入れテストと単体テストの書き方

ちょっとややこしいタイトルだけど、つまり

* 単体テスト (機能テスト): 正しくリダイレクトされるか
  * 正しいステータスコードか (Temporary? Permanent? See Other?)
  * 正しいリダイレクト先か
* 受け入れテスト: リダイレクトを透過して正しい動作をしているか
  * GET /posts/1/edit -> PUT /posts/1 -> GET /posts/1 みたいなリダイレクトが透過的に行われることがある
  * GET editで入力された値がPUTで更新されたか?

RSpecの `Kernel.#describe` でテスト対象、つまり単体機能か操作フローか、を切り分ける。

`follow_redirect!` を明示的に呼ぶことでリダイレクトを追うことができるので、それの有無によってテスト対象を切り替えることができる。

```
describe "PostController" do
  subject { last_response }

  before do
    __send__(http_method, request_url)
  end

  let(:http_method) { :get }

  describe 'PUT', '/posts/:id' do
    let(:mock_post) { Fabricate(:post) }
    let(:http_method) { :put }
    let(:request_url) { app.url(:posts, :show, :id => mock_post.id) } # -> /posts/1

    describe "redirection" do
      it { should be_redirect }
      its(['Location']) { should eq request_url } # -> should eq "/posts/1"
    end

    describe "callback" do
      before do
        follow_redirect!
      end

      it { should be_ok }
    end
  end
end
PDOでMySQL文字コード設定

PHP / PDO で MySQL接続時に文字コードを設定する

```php:pdo_utf8.php
try {
    $pdo = new PDO($db_dsn,$db_user, $db_password,
        array(
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`"
        )
    );
} catch (PDOException $e) {
    die($e->getMessage());
}