OmniAICreator/Qiita-1.07M huggingface dataset:
sharedのcastについて

# sharedをつけてもいい場合

- キャスト以降は共有資源として扱う
- キャスト以降も単一のスレッドからしか触らないデータである

sharedをつけるということは、共有資源にする場合です。
共有資源であることが明らかである場合、cast(shared)とすることでsharedをつけることができます。
共有資源であるということは、時系列的に見てcast(shared)した瞬間からその変数のアクセスはすべて共有資源に対する取り扱いをしなければなりません。
また、例外的に単一のスレッドからしか触らないことが明らかな場合でも、sharedをつけることによる弊害はありません。しかしながら、これをやる利点は後述するsharedメンバ関数が呼べる、という程度ですので、必要かどうか十分考えてから行いましょう。

```d
auto sobj = cast(shared)obj;
```

# sharedを外してもいい場合

- キャスト以降は単一のスレッドからしか触らないデータである
- キャストするのがクリティカルセクション内である

sharedを外すということは、付ける場合とは逆に、スレッドローカルなデータになるということです。
スレッドローカルなデータは、単一のスレッドからしかアクセスすることが許されないデータです。
cast()を行うことでsharedを取り外すことができますが、それ以降は単一のスレッドでしか触らないようにしましょう。
そのデータに対するクリティカルセクション内では、限定的にこれが許されますが、クリティカルセクションを抜けた瞬間に「sharedをつけてもいい場合」の条件を満たすようにする必要があります。

```d
auto obj = cast()sobj;
```

# スレッドローカルなオブジェクトのsharedメンバ関数を呼びたい場合
これは、「sharedをつけてもいい場合」と条件は同じで、cast(shared)すればいいです。

```d
(cast(shared)obj).foo();
```

# 共有資源のオブジェクトのsharedじゃないメンバ関数を呼びたい場合
これは、「sharedを外してもいい場合」と条件は同じでで、cast()すればいいです。

```d
auto str = (cast()sobj).toString();
```
TItaniumで、TextFiledに文字を入力し、背景色を変える。

```javascript
var win1 = Ti.UI.createWindow({
	backgroundColor:'#ff8080'
});

var textFiled = Ti.UI.createTextField({
	keyboardType: Titanium.UI.KEYBOARD_DEFAULT,
	borderStyle:Titanium.UI.INPUT_BORDERSTYLE_ROUNDED,
	autocapitalization:false,
	width:'200dp',
	top:'25%'
});
win1.add(textFiled);

textFiled.addEventListener('blur',function(e){
	if(textFiled.value === '赤色') win1.setBackgroundColor('#ff0000');
	else if(textFiled.value === '黄色') win1.setBackgroundColor('#ffff00');
	else if(textFiled.value === '青色') win1.setBackgroundColor('#0000ff');
	else win1.setBackgroundColor('#fff');
});

win1.open();
```
メッセージパッシングスタイルでselfを使う

SICP第2版の186ページ(原著)から出てくる**Message passing**について。

例、動物が鳴きます。名前はシンボルもしくは文字列で、表示時に必要に応じてcoerceします。

```animal.scm
(define (animal name voice)
  (lambda (m)
    (cond
      [(eq? m 'name) (if (symbol? name) (symbol->string name) name)]
      [(eq? m 'talkTo) 
       (lambda (x) 
         (print (string-append (if (symbol? name) (symbol->string name) name) " said " voice " to " x)))])))

(define felix (animal "Felix the Cat" "meooow"))
(felix 'name) ;; "Felix the Cat"
((felix 'talkTo) "me") ;; "Felix the Cat said meooow to me" #<undef>
```

メッセージパッシングスタイル、なにかに似ています。そう、オブジェクト指向です。animalを呼び出した際に返されるクロージャはanimalクラスのインスタンスと見ることができます。
上の例では`name`と`talkTo`で同じ事(coerce)をしています。オブジェクト指向では普通こういうときselfを使います。

```animal.st
Object subclass: #Animal
	instanceVariableNames: 'name voice'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'Example'!

!Animal methodsFor: 'as yet unclassified' stamp: 'ympbyc 12/29/2012 02:32'!
initWithName: n voice: v
  name := n.
  voice := v! !

!Animal methodsFor: 'as yet unclassified' stamp: 'ympbyc 12/29/2012 02:25'!
name
  ^ name asString! !

!Animal methodsFor: 'as yet unclassified' stamp: 'ympbyc 12/29/2012 02:29'!
talkTo: whom
  ^ self name ,' said ' , voice ,' to ' , whom! !
```

self参照を利用して、自分自身のメソッドを呼ぶ事で、同じコードを2カ所に書かずに済んでいます。

前振りが長かったですがここからが本題。Schemeのメッセージパッシングスタイルでselfを使ってみましょう。
selfというシンボルに、あるオブジェクトを勝手に結びつけるので、アナフォリックマクロというものを書きます。ついでにインスタンスとなるlambdaも作ってやります。メソッド名はシンボル`=>`に束縛する事にします。

```define-class.scm
;;Unhygenic anaphoric macro
(define-macro (define-class class args body)
  `(define ,class (lambda ,args 
      (Z (lambda (self) (lambda (=>) ,body))))))
```

インスタンスは`(lambda (=>) ,body)`の部分です。こいつをselfに入れたいので、無名関数だけで再帰を実現するZコンビネータという関数を使います。

```z.scm
(define Z (lambda (f) ((lambda (p)
 (f (lambda (a) ((p p) a))))
 (lambda (p)
   (f (lambda (a) ((p p) a)))))))
```

`(Z (lambda (f) ...))`と呼び出すと、fに`(lambda (f) ...)`自身が入るので、`...`の部分でfを参照すれば再帰ができるというものです。
これでselfが手に入りました。

実際に使ってみる前にもう一つ便利なマクロを定義しておきます。これを使うと、`(on メソッド名 => メソッド本体 ...`という風に書けます

```on.scm
(define-syntax on
  (syntax-rules ()
    ((_ x y a b) (if (equal? x y) a b))
    ((_ x y a) (if (equal? x y) a))))
```

準備ができました！使ってみましょう。

```animal2.scm
(define-class animal (name voice)
  (on 'name  => (if (symbol? name) (symbol->string name) name)
  (on 'talkTo => (lambda (x) (print (string-append (self 'name) " said " voice " to " x))))))

(define felix (animal "Felix the Cat" "meooow"))
(felix 'name) ;;"Felix the Cat"
((felix 'talkTo) "me") ;;"Felix the Cat said meooow to me" #<undef>
```

以上、小ネタでした。
アナフォリックマクロとZコンビネータの使い道を発見して嬉しくなったので書いてみました。

よいお年を！
iOSクリックイベント挙動

軽めのjQuery Advent Calendar 2012でのiPhoneのclickイベントの挙動[to-R]に追記で。
 - [軽めのjQuery Advent Calendar 2012](http://www.adventar.org/calendars/29)
 - [iPhoneのclickイベントの挙動[to-R]](http://blog.webcreativepark.net/2012/12/25-134858.html)

### トリック手法

```.target { cursor: pointer; }```

### 要素を`<a>`要素にする
ターゲット要素を`<a href="#">`にすると、イベントを拾う。

### `touchstart`をイベントに追加する
イベントに`touchstart`を追加すると、イベントを拾う。

```<script type="text/javascript">  
　    $(document).ready(function() {  
　            $("body").on('click touchstart', '.target2', function() {  
　                console.log(this);  
　                $(this).css("backgroundColor", "red");  
　            });  
　    });  
　</script>
```
サンプルページ（iOSでしか確認していない。）
でもAndroidでもイベント拾うとドキュメンに書いてあった。

[sample smartphone toush event](http://weblibrary.s224.xrea.com/sample/demo_click.html)

一応、記事書いた。
see also : [iOS click　クリック　イベントの挙動](http://weblibrary.s224.xrea.com/weblog/webdesign/jquery/ios_click.html)
Ubuntuの初期環境構築を半自動化する

いろんな人からツッコミをいただきたいので初投稿します．

## プライベートなサーバを手っ取り早く使いたい
### 想定環境 & ユーザ
* 「さくらVPSとかLinode，安いね！」
* 「OSのインストールはVPS側でしてくれるけれど，その後の設定がめんどい」
* 「サーバがあったらちょこっと開発してデプロイの実験とかしたい」
* 「開発とか興味ないけど，blogとかやってみたい」
* 「開発とか興味ないけど，iTunesはゴミ箱にダンクしたい」
* 「ChefやPuppetを覚えてまで自動化するほどの規模じゃない」

### シェルスクリプトで半自動化
> Use shell scripts to increase leverage and portability. - M. Gancarz 

UNIXの精神に則り，23個のシェルスクリプトを用意しました．
インストールしたいパッケージごとに分けてあります．
すべてを実行しても30分もかかりません．
最小限のバックアップをとりながら配備を行います．
シェルスクリプトなので実行前に，どんな挙動を行うかを簡単に確認できますし，
MIT Licenseなので改変していただいても結構です．

### 半自動化対象パッケージ
* OpenSSH

> Secure SHell

* iptables

> Linuxの標準的なFirewall

* chkrootkit

> rootkit検出キット

* rkhunter

> rootkit検出キット

* Apache2

> 最も人気のあるwebサーバ

* PHP5

> Hypertext Preprocessor

* MySQL

> 世界で最も普及しているオープンソース・データベース

* phpMyAdmin

> MySQLのwebフロントエンド

* WordPress

> オープンソースのblog/CMSプラットフォーム

* ZenPhoto

> Standalone CMS for multimedia

* pureFTPd

> オープンソースの軽量なFTPサービス

* Subsonic

> Free Media Streamer

* Git (& gitolite)

> 分散バージョン管理システム

* Python

> 軽量なオブジェクト指向プログラミング言語

* Ruby on Rails

> Ruby製Webアプリケーションフレームワーク

* Redmine

> Ruby on Rails製プロジェクト管理サービス

* Jenkins

> 継続的インテグレーション支援サービス

* DokuWiki

> シンプルなドキュメンテーションWikiエンジン

![各スクリプトの関係性依存図](https://a248.e.akamai.net/camo.github.com/1400359504fed1fd1b93d84737fef73f9e6235d8/687474703a2f2f79756d6c2e6d652f6663303337333361)

## 使用方法
```sh
$ wget -O provisioning.tar.gz https://github.com/shin-szk-engineering/Provisioning-Scripts/tarball/master
$ tar zxvf provisioning.tar.gz
$ chmod -R +x ./(解凍したファイル)
```

### 詳細
詳しくは下記をご参照ください．
[公式サイト](http://shin-szk-engineering.github.com/Provisioning-Scripts/)
[GitHub - Provisioning-Scripts](https://github.com/shin-szk-engineering/Provisioning-Scripts)
[blog](http://bellonieta.net/2012/10/provisioning-scripts-readme/)

#### ご意見お待ちしています
個人では検証もままならないので，試用していただき，ご意見賜れれば幸いです．
wp_rewriteではまったこと

マルチサイト運用しているwordpressの管理者ならば、一度や二度は全ブログに対して共通の設定をかけたり、共通の記事(ようこそ記事みたいな)を差し込みたくなったことはあるはず。

私の場合、そんなことが一度二度どころか、1年弱で二桁回数くらい生じたので、switch_to_blog関数を使って順繰りに全ブログに対して共通の処理を実行するプラグインを自作してやっている。

この時、switch_to_blogはDBの接続先テーブルは変えてくれるけど、wp_rewriteについてはinitしなおしてくれない、という事実を知らなかったのでけっこう苦労した。

これを知らないとどうなるか。

記事を挿入する(wp_insert_postを実行する)と、_save_post_hook関数がsave_postフックで呼び出され、page_type=pageの場合rewrite_rulesを更新する処理が走る。この時、基となるパーマリンク設定は、アップデート対象ブログの値ではなく、switch_to_blogする前の、全ブログアップデート用プラグインを実行したブログの設定が参照された状態になっている（だいたいの場合マスターブログでしょう）。マスターブログのパーマリンク設定からrewrite_rulesを作成するものの、保存先のテーブルはswitch_to_blogしたアップデート対象のブログになっているので、ここで不整合が起きる。

全ブログのパーマリンク設定が同じであれば気づかないのだろうけど、私の場合、諸事情によりマスターブログのパーマリンク設定が、子ブログのものとは異なっているため、全ブログアップデート後に子ブログの記事がすべてnot foundになってしまった。なので、全ブログをアップデートかけるようなときは、

```
switch_to_blog($blog_id);
global $wp_rewire;
$wp_rewrite->init();
```
としておくのが安全。（他に弊害があるかもしれないけど）
NetBeansでYiiのCWebApplicationを補完する

## Step1 : yiilite.phpを無視する
NBがyiilite.phpも読み込むと重複して補完の候補が上がってしまうので、最初にこのファイルを無視しておくといいかと思います。

設定は
**ツール > オプション > その他 > ファイル**
のIDEが無視するファイルのパターンに |yiilite\.php$を追加します。

## Step2 : 補完用のファイルを作成する
nbprojectの中に下記のファイルを追加します。
https://gist.github.com/4393875

```php
<?php
/**
 * Description of Code Completion file for Yii Framework with NetBeans.
 * 
 * This is file for code completion of yii framework.
 * Please put this to your nbproject folder. (e.g. yourproject/nbproject/code_completion.php)
 * 
 * Yii::app()->[Ctrl + Spase]
 * CWebApplication methods and fields are added on the popup list.
 *
 * @author junichi11
 */
class Yii extends YiiBase {
 
	/**
	 * @return CWebApplication
	 */
	public static function app() {}
 
}
```

フレームワーク本体ではCApplicationを返しているので、上記ファイルを追加しない場合は、Yii::app()->とした場合にCApplicationクラスの候補しかリストに表示されません。

pluginでインクルードパスの追加とこのファイルの追加のアクションをつけれたらつけようと思います。
HTML5 Web Notification を試す

Mountain Lion の Safari 6 の設定に「通知」というのがあって、気になったので調べた。

- Web Notification 自体は Apple の PUSH 通知とは独立してる W3C 仕様
- Mountain Lion で通知センターが導入されたので連動するようになった

実際に試すには、インスペクタで

~~~:javascript
window.Notification.requestPermission(function(permission){ console.debug(permission) })
new window.Notification("hello")
~~~
そうすると、通知センターに出ます。

Webサイトを開いていなくても通知される PUSH 通知的なものを期待していたのでガッカリですが、裏側にでも開いていれば通知されるので使いようなのかなと思います。 Ajax リクエストの重い処理が完了したら通知するとか。

ちなみに、 iOS 6 の Mobile Safari リモートインスペクタ経由で window.Notification にアクセスしようとすると "undefined" でした。

## 参考資料
https://developer.apple.com/library/safari/#documentation/AppleApplications/Conceptual/SafariJSProgTopics/Articles/SendingNotifications.html
http://dvcs.w3.org/hg/notifications/raw-file/tip/Overview.html
http://dangercove.github.com/html5-notifications/
auto-complete環境で補完の大文字小文字を区別する


全国100万人のEmacs・ニュービーのみなさまこんばんは。

みなみなさまも`auto-complete`を使って快適な補完ライフを享受されてることと存じます。

しかしRailsなんかでごりごりごりっとコードを書いてますと、`Book`だったり`book`だったり`books`だったりと、大文字小文字が入り乱れるコードになります。そんな環境では、小文字で出して欲しかったのに大文字が補完されたりして、たいへん不快な目に遭ひます。

 * [auto-completeに大文字小文字を区別しないオプションを追加しました - Functional Emacser](http://d.hatena.ne.jp/m2ym/20091206/1260111718)

この記事を参照、ではあるのですが、リンク先当時と違っていまのデフォルトは`'smart`です。

つまり、デフォルト値の定義はこんなふうになってます。

```cl:auto-complete.el
(defcustom ac-ignore-case 'smart
  "Non-nil means auto-complete ignores case.
If this value is `smart', auto-complete ignores case only when
a prefix doen't contain any upper case letters."
  :type '(choice (const :tag "Yes" t)
                 (const :tag "Smart" smart)
                 (const :tag "No" nil))
  :group 'auto-complete)
```

てなわけで、全体でこの挙動を`nil`にしてやりたければ、`.emacs`にこんなふうに書いてやればおｋですね。

```cl:.emacs.d/init.el
(custom-set-valiables
 '(ac-ignore-case nil))
```

「Rubyでは無効にしたい… でも全体では`'smart`のままがいい…」なんてわがままさんもいらっしゃいますよね。僕のことなんですけれども。

そんな方にはこちら！

```cl:.emacs.d/conf/init-ruby.el
(add-hook 'ruby-mode-hook
          (lambda ()
            (make-local-variable 'ac-ignore-case)
            (setq ac-ignore-case nil)))
```

いえい。これで`ruby-mode`なバッファでだけ`ac-ignore-case`が`nil`になってくれます。めでたいですね。
RVM で複数の Ruby, Ruby on Rails をインストール

>yum install git make gcc gcc-c++ zlib-devel openssl-devel curl-devel readline-devel tk-devel libyaml-devel
>bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
>source /home/xxxxx/.rvm/scripts/rvm
>rvm list known
>rvm install 1.8.7
>rvm install 1.9.3
>gem install rails
>gem install rails -v 2.3.2
さくらインターネットの VPS で初期時に Connection refused

借りたばかりのさくらインターネット VPS で、Web 管理画面から「起動」としてにもかかわらず、

>ssh root@xxx.xxx.xxx.xxx
>ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection refused

となることがある。その場合は Web 管理画面から「再起動」をかけるとログインできるようになる。
第六回オフラインリアルタイムどう書くの参考問題をRubyで解いてみた。

[第六回オフラインリアルタイムどう書くの参考問題]
(http://qiita.com/items/4c60f10b73812e86441c)

Rubyで解いてみました。
掛かった時間は45分ぐらい。読みづらいコードになってますが勘弁を。
解説は後で書くかも……

```ruby
#!/usr/bin/ruby
#-*- Coding:UTF-8 -*-

input = gets.chomp.split(",").map{|x| x.split("-") }
square = []
2.times do |i|
	t = []
	2.times do |j|
		t[j] = input[i].map{|x| x[j].to_i}
		t[j].unshift(t[j].delete_at(1))
		t[j] = [t[j][0,2], t[j][1,2]].map(&:sort).map{|x| [*x[0]..x[1]]}
	end
	s = []
	2.times do |j|
		s[j] = t[0][j].product(t[1][j])
	end

	square[i] = s[0] | s[1]
end

puts (square[0] & square[1]).size
```
SEQUENCE上限無くすSQL文

```sql
ALTER SEQUENCE SCHEMA_NAME.SEQ_NAME NO MAXVALUE;

--SCHEMA_NAME： シーケンスのスキーマ名称
--SEQ_NAME：   変更対象シーケンス名称

#SQLの命令をDB2で実行する（命令間は；で区切りました）
db2 -tvf SQLファイル -z db2log.log

```
連想配列をキーと値のペアの配列にするちょっと気のきいた方法（かも）

array (KEY => VALUE)をarray (array(KEY, VALUE))にする方法を思いついたので、さらしあげておきます。
効率はそれほどよくはないと思いますので、話半分で聞いてやっててください。

脊髄反射で思いつくのは、foreachでループをまわすことですが、何か負けた気がします。

phpの配列（連想配列）は順序保障されているため、以下のようにarray_mapを使用し

```php
<?php

$a1 = array(
  'a' => 1,
  'b' => 2,
  'c' => 3,
);

$a2 = array_map(
    function ($k, $v) { return array($k, $v); }, 
    array_keys($a1), 
    array_values($a1)
);
```

のようにすることで、変換することができます。

7-Jan-2013 追記
上の例のような、単純な配列であれば、コールバック不要とコメント頂きました。ありがとうございます。
ディレクトリを覚えられない人のto() function


 これは私が新卒のときにNYのチームでOJTしたときに、Unix SAのKさんが使用していたものです。ちなみに当時、そのチームでよく使われているWindowManagerはratpoison…  It’s really cool to work without mouse　という感じでした^^;;

歴史のある会社で働いているとディレクトリがたくさんあり、階層も深くなっていると思います。たまに覚えている人もいますが、やはりどこかに書いておくのが現実的ですよね。to()を定義して使うと覚える必要がありません:)

まずは使い方から

	$ to abc
	$ pwd 
	/nfs/here/is/also/too/long/path/I/cant/remember

こんな感じで移動できます。また引数なしで使うと一覧を表示するので

	$ to
	Please choose from the following ‘to’ destinations:
	
	hoge:/nfs/this/is/too/long/path/I/cant/remember
	abc:/nfs/here/is/also/too/long/path/I/cant/remember	
	
で関数は下記のようになります。.bashrcのようなrcファイルで定義すればよいです。zshでも動くはずです。

	#-----------------------------------------------
	# for those who can't remember the file place
	#-----------------------------------------------
	dest_type()
	{
		 key=$1
         check_host=`ypmatch $key hosts 2> /dev/null`
         check_passwd=`ypmatch $key passwd 2> /dev/null`
         if [ "${check_host}X" != "X" ]; then
                echo host
         elif [ "${check_passwd}X" != "X" ]; then
                echo user
         else
                echo dir
         fi
	}
	to()
	{
        mapfile=“$HOME/.custom/dir_maps.txt"

        if [ ! -f $mapfile ]; then
                echo "directory map file doesn't exist"
        else

                if [ "${1}X" = "X" ]; then
                        echo "Please choose from the following 'to' destinations:"
                        echo ""
                        cat $mapfile | tr ':' '\t\t'
                else
                        key=$1
                        # the directory key takes precedence
                        line=`grep "^${key}:" $mapfile`
                        if [ "${line}X" = "X" ]; then
                                type=`dest_type $key`
                        else
                                type="dir"
                        fi

                        case $type in
                        'host')
                                echo "ssh $key"
                                ssh $key
                                ;;
                        'user')
                                echo "~$key"
                                $_user_dir=`/bin/echo ~$key`
                                cd $_user_dir
                                ;;
                        'dir')
                                dest=`echo $line | awk -F':' '{print $2}'`
                                echo "$dest"
                                cd $dest
                                ;;
                        *)
                                echo "Unknown key: \"$key\""
                                ;;
                        esac
                fi
        fi
	}

でdir_maps.txtは下記のように定義します。

	# $HOME/.custom/dir_maps.txt
	hoge:/nfs/this/is/too/long/path/I/cant/remember
	abc:/nfs/here/is/also/too/long/path/I/cant/remember

ちなみに to HOST でssh.  to USERNAMEでユーザのホームに行けますが、私はあんまり使用していません。

以上です^^   Have fun :)
gnuplotで最大値、最小値を求める


```plot.dat
0 1
2 3
5 2
2 5
```

このようなファイルがあったときに、それぞれの列の最大or最小値が知りたい。
直接的には求められませんが、調べたら次のような方法があることがわかりました。

```gnuplot
x0 = 1e38
x1 = -1e38
y0 = 1e38
y1 = -1e38

grabx(x) = (x<x0) ? x0=x : (x>x1) ? x1=x : 0
graby(y) = (y<y0) ? y0=y : (y>y1) ? y1=y : 0

plot "plot.dat" using (grabx($1)):(graby($2))
```

解説します。

まず、`plot "plot.dat"`でplot.datの中身をプロットしますが、そのときにusing修飾子を指定できます。例えば

```plot3.dat
0 1 2
2 3 2
4 6 7
1 2 2
```

というデータファイルから1列目をx座標、3列目をy座標としてグラフを描画したいときは`plot "plot3.dat" using 1:3`のように指定します。この1は単に1列目を示していますが、これを括弧で囲むとその括弧内でcolumn(n)という関数が使用できます。column(n)はn列目の値を表します。$nはcolumn(n)の略記です。

なので、`plot "plot.dat" using 1:2`と`plot "plot.dat" using ($1):($2)`は同じ意味になります。

gnuplotでは変数や関数が定義できます。grabxとgrabyはそれぞれxとyの最大最小値を更新する関数です。よって、`plot "plot.dat" using (grabx($1)):(graby($2))`で1列目と2列目の値を全てgrabxとgrabyに適用するので、x0、x1、y0、y1にそれぞれ求める値が入っています。

このとき描画されるグラフが不要ならば

```gnuplot
set table "/dev/null"
plot "plot.dat" using (grabx($1)):(graby($2))
unset table
```

などとすれば値だけ手に入りますが、このやり方は少なくともlinux限定です。
RubyでTwitterにつぶやいてみるまでのメモ


## 概要
Ruby のGem Twitter を利用して、簡単な設定ファイルを用意し、自分専用アプリとしてRuby インタプリタ上で自分のタイムラインにつぶやきを投稿してみる。

おおまかな手順としては、

1. Twitter Developers にアクセスし、アプリケーションを登録する。
2. Atoken4Me にアクセスし、アクセストークンを取得。
3. Ruby gem Twitter をインストール。
4. アクセストークンなどをRubyスクリプトとして保存し、それを利用してRuby インタプリタ上でつぶやく。

## Twitter Developers でアプリケーション登録
![ホーム画面](http://gyazo.com/9a99e2af92cbb13c30de2effd28c40a2.png)
まずは[Twitter Developers](https://dev.twitter.com/ "Twitter Developers")にアクセスし、Twitter アカウントでサインインします。(アカウントがなければ先に登録から。)

ここでは、アプリケーションの登録とアプリケーションのアクセス権限の設定を行います。

#### アプリケーションの登録
サインインしたら、自身のアカウント名が表示されているとこから、[My Application]をクリック。アプリケーションの新規作成(Create a new application)を行う。

ここはページの手順に従って淡々と進めていきます。

登録したら、Consumer Key とConsumer secret の値をメモしておいてください。

#### アプリケーションの設定
![アクセス権](http://gyazo.com/96a458f9e3cad2fd9ba32ea2344c942e.png)

アプリケーション一覧(My applications)から先ほど作成したアプリケーションを選択し、設定タブをクリックします。

アプリケーションのアクセスタイプを"Read and Write"に設定しておきます。

## Atoken4Me を利用してアクセストークンを取得
![Atoken4Me](http://gyazo.com/6021d3957f1cddb80366f5c61098f060.png)
[Atoken4Me](http://atoken4me.heroku.com/ "Atoken4Me")にアクセスし、手順通りに進めていきます。

進めたら、アクセストークンが表示されるので、メモしておいてください。

(※あとからTwitter Developers でアプリケーションのアクセスタイプを変更した場合、再びトークンの取得が必要になります。)

## Gemのインストール

コマンド叩くー。

```sh:
gem install twitter
```

## つぶやく前の準備
下記のように、つぶやくのに必要なキーやトークンを書き込み、保存しておく。(*1)

```ruby:~/tw.rb
require 'twitter'

@tw = Twitter::Client.new(
  consumer_key: 'hogehogehogheogheohogehgoe',
  consumer_secret: 'toomuchlongkeyfoobarhogahogehugafoo',
  oauth_token: 'toomuchlongkeyfoobarhogahogehugafoo',
  oauth_token_secret: 'toomuchlongkeyfoobarhogahogehug'
)
```

## つぶやく
実際につぶやくには .update()メソッドを使う。
さあ pry 起動！

```ruby:
require '~/tw.rb'
@tw.update 'hoge'

```

これで すごく手動なTwitter Clientの完成です！やったね！
## リンク
* [Route 477 - Ruby Twitter Gem簡易リファレンス](http://route477.net/w/?RubyTwitterJa)
* [Atoken4Me](http://atoken4me.heroku.com/)
* [ruby1.9.3: rubyでTwitter API - pandazx's blog](http://pandazx.hatenablog.com/entry/2012/10/07/191128)
* [File: README — Documentation for twitter](http://rdoc.info/gems/twitter)

(*1)… [qiita - Twitter Ruby Gem の非スレッドセーフ API は使うべきではない](http://qiita.com/items/1b61e1fe4841f81baaf9)
gitのhooksを管理する(自分用テンプレートを使う)

[git hookでできること](http://qiita.com/items/d8a8d498c9f853a445f5) の続き

## init.templatedir

gitのhooksは各プロジェクトの`.git/hooks/`にあります

その元となるファイルはgitのインストール環境により違いますが
`$PREFIX/share/git-core/templates/hooks/`
などにあります

```bash:
$ which git
/usr/local/bin/git
$ ls /usr/local/share/git-core/templates/hooks/
applypatch-msg.sample		post-receive.sample		pre-commit.sample		update.sample
...
```

`share/git-core/templates/hooks/`内に自分用のhookを作成しても問題ないですが、ユーザーとしてhooksのテンプレートを管理したい場合は以下のようにします。
`~/.git_template/hooks`に配置します

```bash:
$ mkdir -p ~/.git_template/hooks
($ cp /usr/local/share/git-core/templates/hooks/* ~/.git_template/hooks)

# 自作hookを配置
$ cp pre-commit ~/.git_template/hooks/
# 権限
$ chmod 755 ~/.git_template/hooks/pre-commit
# git configの設定
$ git config --global init.templatedir '~/.git_template'
```

最後の`init.templatedir`が最も重要です。(`.gitconfig`に追加されます)

---

新規のプロジェクトで`git init`や`git clone`した場合は、そのタイミングで`.git_template/hooks`をもとに`.git/hooks/`が作成されるので問題ありません。

既存のプロジェクトの場合は`.git_template/hooks`の内容をそれぞれ反映させる必要があります。
再度`git init`を実行するとhooksが再インストールされます。ただし、すでに同ファイル名のものが存在する場合は上書きはされないようなので、

```bash:
$ rm .git/hooks/pre-commit
$ git init
Reinitialized existing Git repository in /path/to/rails_project/.git/

# または上書きcp
```

のようにして、自分の追加したいものを反映します。

## 一括でたくさんの既存プロジェクトにhooksを反映

既存のプロジェクトがたくさんある場合は、追加したいhookをすべてに反映するのがかなり面倒です。
スクリプトやxargsなどを使って各プロジェクトへcopyします。

```ruby:
# 反映したいプロジェクトがある場所に移動
$ cd my_projects

# .gitを一覧確認
$ ruby -e 'Dir::glob("./**/.git").each{|f| puts f }'
./project1/.git
./project2/.git
...

# フックを各.git/hooksへコピー
$ ruby -e 'Dir::glob("./**/.git").each{|f| `cp ~/.git_template/hooks/pre-commit "#{f}/hooks/"` }'

# 再度確認
$ ruby -e 'Dir::glob("./**/.git").each{|f| puts `ls "#{f}/hooks/pre-commit"` }'
```

---

参考：

[git pullのhookをglobalに設定する](http://tajimajunpei-blog.blogspot.jp/2012/05/git-pullhookglobal.html)

[StackOverflow(Git commit hooks - global settings)](http://stackoverflow.com/questions/2293498/git-commit-hooks-global-settings)

[Global git hook](http://superuser.com/questions/164213/global-git-hook) -> Globalなhookは定義できず、プロジェクトごとhooksを持つ必要があるらしい
よく使うフォーマット指定子


いつも忘れてしまうので。
サンプルコードがObj-Cという理由でタグはObjCにしています。

## よくわかるまとめ
[フォーマット指定子一覧](http://www.k-cube.co.jp/wakaba/server/format.html)


## 先頭に0を足して桁数を揃える(0詰め)

```objc:
NSLog(@"%03d, %04d, %05d", 5, 10, 100);
/*
005, 0010, 00100
*/

```

## 任意の小数点以下を切り捨てて揃える

```objc:
NSLog(@"%.1f, %.2f, %.3f", 0.123, 0.123, 0.123);
/*
0.1, 0.12, 0.123
*/
```
git hookでできること

git hookで何ができるかを簡単にまとめた

基本的には以下のページに書いてある事

[Gitフック](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)
[Customizing Git - Git Hooks](http://git-scm.com/book/en/Customizing-Git-Git-Hooks)


抜粋

* `.git/hooks`に配置
* 適切に命名すれば動く
* 要実行可能権限(chmod)
* RubyやPython等で自作可能


## クライアントサイドフックの例

#### pre-commit (コミットメッセージが入力される前)
* 事前にテストを実行
* 行末の空白文字の検査
* ドキュメントの検査
* コーディングスタイルの検査

#### prepare-commit-msg (コミットメッセージエディターが起動する直前)
* テンプレートのコミットメッセージを使う
* 自動でIssue番号などをメッセージに追加

#### commit-msg (コミット時)

* コミットメッセージが要求された様式に沿っているか検査(チケット番号が入っているかなど)

#### post-commit (コミットプロセスが全て完了した後)

* 一般的に何かしらの通知といった目的に使用される

## サーバーサイドフックの例

#### pre-receive (プッシュを処理するとき)

* 更新内容がすべてfast-forwardであることをチェック
* プッシュしたユーザーが適切なアクセス権を持っているかを調べる

#### post-receive (プッシュの処理が終了した後)

他のサービスの更新やユーザーへの通知

* メーリングリストへの投稿
* 継続的インテグレーションサーバーへの通知
* チケット追跡システムの更新
* コミットメッセージを解析して、チケットのオープン・修正・クローズなどの必要性を調べる (Pivotal Trackerとか)

#### update (pre-receive スクリプトと類似)

ブランチごとに実行されるという点が異なる
など

※Githubの場合はサーバーサイドをスクリプトを使ってカスタマイズすることはできないらしい（？）
　(各Repositoryで Settings ＞ Service Hooks とか GitHub Servicesとやらがある)

---

git hookはクライアントサイドに関しては、大人数だったり、メンバーの入れ替えが激しい場合はルールを徹底するのが難しいと思う。
サーバーサイドは反対に大人数でも問題ない。

---

たいぶ前からフックのカスタマイズをやろうやろうと思ったりしてきたが、結局シェルスクリプトのシンタックスなどでつまずいて断念してきた。

最近ようやくRubyで書けばもっと簡単にできると分かりまた気になり出している。

課題はクライアントサイドの一元管理が（調べた限りでは）出来なそうなで変更したら全既存プロジェクトに反映させるのに一手間かかる点。
(.gitignore_globalとかはできるのに)
zsh で Git の man を素早く見る

例えば Git の status コマンドを man で調べようと思ったら、普通は `man git-status` って打たないといけない。でもそんなに長いのは打ってられない。それに alias を設定して `g s` で git status になるようにしてたりするので、man g s みたいな感じで man を見れるようにしたい。

そんなときはこれを zshrc に書いておけば OK。

```sh:.zshrc
alias run-help >/dev/null 2>&1 && unalias run-help
autoload -Uz run-help
autoload -Uz run-help-git
autoload -Uz run-help-svn
```

これで `ESC h` を押すと今入力中のコマンドの man が見れるようになる。コマンドの alias もちゃんと解釈してくれるし、git と svn の場合はサブコマンドまで入力してたらサブコマンドの man が見れる。

使い方の例はこんな感じ。

`alias g=git`, `git config --global alias.s 'status'` と設定していたとして、

```
% g
# ここで ESC h
# man git が見れる

% g s
# ここで ESC h
# man git-status が見れる
```

普段打ってるコマンドからすぐに man が見れて便利。

「run-help-なんとか」っていうのは今見てみたらこれだけあった(zsh 5.0.0)。

- run-help-git
- run-help-openssl
- run-help-p4
- run-help-sudo
- run-help-svk
- run-help-svn

好きなのを設定しておこう。
Microsoft Windows Azureを使ってはいけない7つの理由


Azureを使ってみて感じた感想。

## インスタンスが起動できないことがある

新規で作成したインスタンスが高確率で起動できない。
（作ってあるインスタンスの再起動は怖くて試していない)

実運用でインスタンスを再起動できないという怖さ。障害でインスタンスを再起動したら起動できないという罠にハマる危険性大。


## インスタンスのコピーが作れない

なぜ？ インスタンスをコピーしようとするとコピー元が破棄されるという謎仕様


## UIが分かりにくい

アイコンが多様されていてパッと見はよくみえるが、実際は押してみないと何が起きるかわからなーい。


## エンドポイントってなに？！

オープンするポートの名称がエンドポイントとなっていて一般の用語ではないので見つけにくい


## Sインスタンスが20個までしか作れない

XLなどはSインスタンス換算されてしまうので、8Sインスタンス扱い


## デフォルトでは料金を支払わないと全体が停止する

怖い。怖すぎる。真剣に実運用で使う場合はオプションを変更すること。


## ローカライズされたメッセージが分かりにくい

チェックボックスに「しました」などが使われていて意味不明。
エラーメッセージの文字化けも気になる。
タッチパネルでタップ検知　マルチタッチ対応


```CS:TouchPad.cs


public class TouchPad: MonoBehaviour {
	
	public float touchRectX;
	public float touchRectY;
	public float touchRectW;
	public float touchRectH;
	

	private Rect touchArea;
	private bool touching;
	private int touchId = -1;
	
	void Update() {
		
		int count = Input.touchCount;
	
		if ( count == 0 ) {
			touching = false;
			touchId = -1;
		} else {
			for(int i = 0;i < count; i++) {
				Touch touch = Input.GetTouch(i);
				
				if (touchArea.Contains(touch.position)
					&& (touchId == -1 || touchId != touch.fingerId)) {
	
					touchId = touch.fingerId;
					
				}
		
				if ( touchId == touch.fingerId ) {
					
					if ( touch.phase == TouchPhase.Ended 
						|| touch.phase == TouchPhase.Canceled ) {
						
						touching = false;				
						touchId = -1;		
					} else {
						touching = true;
					}
				}			
			}
		}
	}
	
	public bool GetTouch() {
		return touching;
	}

}


```

touchRectX,touchRectY,touchRectW,touchRectHは0から1までのfloat型で指定する。
画面左下が(0,0)となる。
SnakeYAMLをテストフィクスチャとして使う場合のpom.xmlの設定

```XML:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>org.ryu22e</groupId>
	<artifactId>ryu22e</artifactId>
	<version>1</version>
	<packaging>jar</packaging>

	<name>ryu22e</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<repositories>
		<repository>
			<id>Sonatype-public</id>
			<name>SnakeYAML repository</name>
			<url>http://oss.sonatype.org/content/groups/public/</url>
		</repository>
	</repositories>
	<build>
		<testResources>
			<testResource>
				<filtering>false</filtering>
				<directory>src/test/java</directory>
				<includes>
					<!-- これがないとmvn testでyamlファイルを読み込むテストを実行できない。 -->
					<include>**/*.java</include>
					<include>**/*.yaml</include>
				</includes>
			</testResource>
		</testResources>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>3.0</version>
					<configuration>
						<encoding>UTF-8</encoding>
						<source>1.6</source>
						<target>1.6</target>
					</configuration>
				</plugin>
				<plugin>
					<artifactId>maven-eclipse-plugin</artifactId>
					<version>2.9</version>
				</plugin>
			</plugins>
		</pluginManagement>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-eclipse-plugin</artifactId>
				<configuration>
					<downloadSources>true</downloadSources>
					<sourceIncludes>
						<!-- これがないとEclipse上でyamlファイルを読み込むテストを実行できない。 -->
						<sourceInclude>**/*.yaml</sourceInclude>
					</sourceIncludes>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.yaml</groupId>
			<artifactId>snakeyaml</artifactId>
			<version>1.12-SNAPSHOT</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>
```
display: inline-block指定時にできる隙間を消す方法


## 意地でもCSSのみで何とかする場合
```html
<ul>
	<li>hoge</li>
	<li>hoge</li>
</ul>
```
```css
ul {
	letter-spacing: -0.4em;
}
li {
	letter-spacing: normal;
	display: inline-block;
    /* For IE 6/7 */
    *display: inline;
    *zoom: 1;
}
```
上記のように、inline-block指定する要素と、その親要素にletter-spacingをかけてやればOK。

でも[効かないブラウザもある](http://www.understandard.net/css/css011.html "display: inline-block を使う（修正版） | understandard")から、どうしてもズレるのが嫌な場合は諦めてfloatで。

## 追記 - HTMLにちょっと手を加える場合
コメントでフォロー頂いた別の手法×2を追記。どれを使うかはお好みで。

### 1.改行削除 or コメントアウトする
> htmlから改行を抜くか、コメントアウトすると隙間は無くなります。
> （by [kaminaly]）

```html
<ul>
    <li>hoge</li><li>hoge</li>
</ul>
```

```html
<ul>
    <li>hoge</li><!--
    --><li>hoge</li>
</ul>
```

### 2.liの閉じタグを消す
> XHTMLじゃないなら、li要素の閉じタグを書かないという手もありますね。
> （by [guimihanui]）

```html
<ul>
    <li>hoge
    <li>hoge
</ul>
```

[kaminaly]:http://qiita.com/users/kaminaly
[guimihanui]:http://qiita.com/users/guimihanui
jenkinsで自動デプロイ神


[継続的インテグレーション](http://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)的話題です.
最近流行のjenkins導入しました.
CIですCI.時代はCI.

jenkinsさんにデプロイを自動化してもらいました.
ローカルでgit pushするだけでテストが実行され、テストに成功するとデプロイ的な感じです.
今まで手動でやってたので神みたいな感じになりました.

今回の構成は、
Aサーバー: gitリポジト + jenkins
Bサーバー: デプロイ先テスト環境
的な構成です.

jenkinsの設定も簡単で、テスト用実行jobとデプロイ用実行jobの2つを用意して、テスト用実行jobが成功したらデプロイ用実行jobを走らせる設定にする.
デプロイ用実行jobでは、AサーバーからBサーバーにsshでログイン(sshプラグイン使用)してgit pullする感じです.

便利すぎて神になれます.
(一人勝手に) Emacs Advent Calendar 2012 - 俺にも言わせろ Emacsを使いこなすために

syohexさんのEmacs Advent Calendar 2012 "Emacsを使いこなすために" を読
んで自分も書きたい、という思いがふつふつとわいてきたので ひとり勝手に
Emacs Advent Calendarを続けてみます。

## elispをevalしまくろう

evalしたいelispをregion選択して M-x eval-region しまくりましょう。
よく設定fileにはremap設定やmode設定を書くと思います。
これらはEmacsをrestartするのではなくevalを使ってinteractiveに設定を反
映させましょう。
たとえば

    (global-set-key (kbd "C-h") 'delete-backward-char)
    (scroll-bar-mode 0)

といったものをregion選択しM-x eval-regionしてみましょう。即座に設定が反映
されます。

設定の反映だけでなくvariableの内容把握にも役立ちます。例えばscratch
bufferで

    ac-dictionary-directories
	
と入力した後で M-x eval-print-last-sexp と入力してみましょう。

    ("/Users/kozo2/.emacs.d/elpa/auto-complete-20121203.832/dict")

このようにauto-complete.elが用いている辞書があるdirectoryのpathがわか
ります。

## helm-M-xしまくろう

実現したいことに関するkeywordをhelm-M-xの後にspace区切りで入力してみま
しょう。それらしきcommandがみつかるはずです。

## helm-lisp-completion-at-pointしまくろう

このcommandを使うとelispの補完ができます。auto-complete.elも便利ですが
このhelm commandをおすすめするのは前述のようにspace区切りでの候補のしぼりこみが可
能なためです。elispのcommand名などは長いことが多いのに加え、keywordがelispの
variableなりcommandなりの中で離れて存在していてもよいので便利かと思います。
しぼりこみ結果がvariableかcommandかfunctionかも表示してくれます。

## package-list-packagesしまくろう

installやuninstallが簡単にできるだけでなくupdateも可能なので使いまくりましょ
う。

## command (or function) をedebugしまくろう

よりくわしくEmacsの機能(==Emacsのcommand or function)を知りたい場合
edebugでcommandなりfunctionのdebugをすることがおすすめです。

1. 知りたいcommandをM-x describe-functionで調べる
2. Help buffer にどのelisp中のfunctionか(そのelispへのlinkにもなっている)が表示されるので、ここからそのelispのcommand箇所へjump
3. M-x edebug-defun で知りたいcommandにbreak pointをしかける。
4. M-x "知りたいcommand" でcommandを実行
5. "知りたいcommand" のdebugができる
	
## おわりに

上記のことを行うとEmacsはとてもinteractiveなものであることがわかると思
います。
ballは友達的な感じでどんどんEmacsに質問を投げてEmacsのことを知り、使い
こなしてください。
MacでCLIから新しくuserとgroupを作成

初めてMac触ったときにadduser のコマンドがなくて焦ったので備忘録的に書きます。

例はnginxユーザーを追加

```
$ sudo dscl . -create /Users/nginx RealName"nginx" // sudo dscl . -create /Users/nginx だけでもたぶん可
$ sudo dscl . -create /Users/nginx UniqueID 1000   
$ sudo dscl . -create /Users/nginx PrimaryGroupID 1000
$ sudo dscl . -create /Users/nginx NFSHomeDirectory /User/nginx
```

※もしshellが必要なら以下も

```
$ dscl . -create /Users/nginx UserShell /bin/bash
```

/user ディレクトリ以下にのホームディレクトリを作成 （一応作成）

```
$ sudo createhomedir -b -u nginx
```

確認

```
$dscl . -read /Users/nginx

もしくは

$ su - nginx
```

group追加は以下

```
$ sudo dscl . -create /Groups/nginx PrimaryGroupID 1000
```

userをグループに追加

```
$ sudo dscl . -append /Groups/nginx GroupMembership nginx
```

確認

```
$ dscl . -read /Groups/nginx
```
case ~ whenで多重代入

```ruby
# 1. これを
case 1
when 1 then a, b = false, false
when 2 then a, b = false, true
when 3 then a, b = true, true
end

# 2. こう書きたいがsyntax error
a, b =
  case 1
  when 1 then false, false
  when 2 then false, true
  when 3 then true, true
  end

# 3. そのためこう書いてる
a, b =
  case 1
    when 1 then [false, false]
    when 2 then [false, true]
    when 3 then [true, true]
    end
```

2はなぜ駄目なんだろう．
連想配列を作るちょっと気のきいた方法（かも）

例えば、以下のようなデータ構造の配列があったとして、

```php
<?php

class KeyValue {
    public function __construct($k, $v) { 
        $this->key = $k;
        $this->value = $v;
    }

    public $key;
    public $value;
}

$a1 = array(
   new KeyValue('a', 1),
   new KeyValue('b', 2),
   new KeyValue('c', 3),
);
```

以下のような連想配列

```php
$a2 = array ('a' => 1, 'b' => 2, 'c' => 3);
```
を作るには、どうしたものでしょうか？

脊髄反射で思いつくのは、foreachで回すというところでしょうか？

```php
$a2 = array();
foreach ($a as $pair) {
    $a2[$pair->key] = $pair->value;
}
```

ループをまわすのは、なんか負けた気になります。
関数型プログラミングの世界では、こうゆう場合fold系関数を使います。
phpでは、昔からarray_reduceが用意されています。
また、ver 5.3から、初期値として任意のデータを渡せるようになってます。

そこで、以下のようにしても、同じ結果を得ることができます。

```php
$a2 = array_reduce(
    $a1, 
    function (&$results, $pair) { $results[$pair->key] = $pair->value; return $results; }, 
    array()
);
```

使いどころとしては、

* 配列の配列を一気に初期化（配列の要素に連想配列を入れるとか）
* クロージャを再利用したい

とかでしょうか。

かなり俺得な投稿でしたね。失礼。
レキシカル変数の扱い

phpのクロージャのレキシカル変数の扱いで、はまったので記録を残しておきます。

先頭から現在までの合計を計算する場合、
以下のようにすると、

```php:sum1.php
<?php

$sum = 0;
var_dump(
    array_map(
        function($v) use ($sum) { $sum =+ $v; return $sum; },
        range(1, 10)
    )
);
```

```
array(10) {
    [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5)
    [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10)
}
```

となってしまいます。
正しく合計を求めたい場合は、以下のように参照渡しする必要があります(thanks! @neuecc)。

```php:sum2.php
<?php
$sum = 0;
var_dump(
    array_map(
        function ($v) use (&$sum) { return $sum += $v;},
        range(1, 10)
    )
);
```

```
array(10) {
   [0]=> int(1) [1]=> int(3) [2]=> int(6) [3]=> int(10) [4]=> int(15) [5]=> int(21)
   [6]=> int(28) [7]=> int(36) [8]=> int(45) [9]=> int(55)
}
```

[公式マニュアル](http://php.net/manual/ja/functions.anonymous.php)のサンプルでもそうなってますね。
backbonejs-jpメーリングリストを作った

[BackboneJS - Japanese Google Groups](https://groups.google.com/forum/?fromgroups#!forum/backbonejs-ja)

去年は僕とyaottiでなんとか完走した [Backbone.js Advent Calendar 2011](http://qiita.com/advent-calendar/2011/backbone) でしたが、[今年のAdvent Calendar](http://www.adventar.org/calendars/15)は20名近い方が参加したようです。
日本でBackbone利用者の裾野が着実に広がってきているのを感じますね！

そうなってくるとだんだんと日本語コミュニティが欲しくなってきませんか？
はい！というわけで作りました [BackboneJS - Japanese Google Groups](https://groups.google.com/forum/?fromgroups#!forum/backbonejs-ja)
すでにBackboneをばりばり使っている人も、これから使ってみようかなと思っている人も、気軽に参加して下さい。
ブロックを与えない場合にEnumeratorを返すメソッドを作る

Rubyのイテレータなメソッドの中には「ブロックを指定しないとEnumeratorを返す」メソッドがいっぱいありますが、そういうメソッドの作り方がRuby歴数ヶ月の自分にはわからなかったので調べました。

1. ブロックが指定されたかどうかはblock_given?でわかる
2. Enumeratorを返すんだからEnumerator.newとかするのかな？
3. Enumeratorの説明を見てみる
4. Enumeratorを生成するにはEnumerator.new、Object#to\_enum、Object#enum\_forの3つの方法があるらしい
5. おもむろに～/lib/ruby/の下でgrepしてみたらそれっぽいコードが引っかかる

というわけで、本体同梱クラスをお手本にして、こうすればよいということがわかりました。

```ruby
class Foo
  def initialize(str)
    @str = str
  end

  def each_word(minlength = 1)
    # ↓これ
    return enum_for(__method__, minlength) unless block_given?

    @str.split(/\W+/).each do |word|
      yield(word) if word.length >= minlength
    end
  end
end
```

ブロックが指定されなかったときは、自身のメソッド名を引数にしてenum\_forでEnumeratorを返してやればよいわけですね。
※Kernel#\_\_method\_\_は現在のメソッド名を返します。

こんな感じに使えるようになりました。

```ruby
foo = Foo.new('Lorem ipsum dolor sit amet, consectetur adipisicing elit')
foo.each_word(5) do |v|
  puts v
end
puts

words = foo.each_word(7)
p words
words.with_index do |v, i|
  puts "#{i}: #{v}"
end
```

```
Lorem
ipsum
dolor
consectetur
adipisicing

#<Enumerator: #<Foo:0xc42618 @str="Lorem ipsum dolor sit amet, consectetur adipisicing elit">:each_word(7)>
0: consectetur
1: adipisicing
```
AndroidでUserAgentを指定する

`DefaultHttpClient`を使うとUserAgentが`Apache-HttpClient/...`みたいな感じになる。サーバー側でUserAgentを使って制限したりする場合には、以下のようにすれば自由にUserAgentを指定できる。

```java
DefaultHttpClient client = new DefaultHttpClient();
HttpParams params = client.getParams();
params.setParameter(CoreProtocolPNames.USER_AGENT, "ユーザーエージェント");
```
Sassのmax()の話

配列の数値の最大値を取得するmax()というメソッドがあるが、いくつかトラブルがあったので備忘録的にメモ。

##NG
$num: 10px, 20px, 30px;
$max: max($num);
$max: max(#{$num});

##OK
$num: 10px, 20px, 30px;
$max: max(10px, 20px, 30px);
$max: nth($num, 1), nth($num, 2), nth($num, 3);

つまり変数をそのまま利用するのは何故かエラーがでる。
linuxサーバー Rails3環境構築メモ


## セキュリティ設定

### selinux無効化
```
vim /etc/sysconfig/selinux
SELINUX=disabledにする
```

### IPv4 IPv6 パケットフィルタ解除
```
/etc/init.d/iptables stop
/etc/init.d/ip6tables stop
chkconfig iptables off
chkconfig ip6tables off
```


## user作成
```
useradd dev
su dev
```

## ssh設定(password認証無効化)
```
vim /etc/ssh/sshd_config

```


## ネットワーク設定
``` command(root)
vim /etc/sysconfig/network-scripts/ifcfg-eth0 
vim /etc/resolv.conf 
```


## yumリポジトリ追加
``` command(root)
yum -y install yum-plugin-priorities
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
rpm -ivh rpmforge-release-0.5.2-2.el6.rf.i686.rpm
rm -f rpmforge-release-*

wget http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm 
 wget http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6-1.el6.remi.noarch.rpm
rpm -ivh remi-release-6-1.el6.remi.noarch.rpm

 vim /etc/yum.repos.d/remi.repo
[remi]
name=Les RPM de remi pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
enabled=1 <- 1に書き換える
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
failovermethod=priority
```

## gcc追加
```
yum update -y
yum install -y gcc*
```




## paco
```
cd /usr/local/src
wget http://downloads.sourceforge.net/paco/paco-2.0.9.tar.gz
tar xvf paco-2.0.9.tar.gz 
cd paco-2.0.9
./configure --disable-gpaco
make
make install
paco -a
```

```
yum install git*
```

## rubyコンパイル
```
yum install zlib*
yum install openssl*
yum install readline*
yum -y install nkf*
yum install libyaml*
yum install libxml*
yum install libxslt*


wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p327.tar.bz2
tar xvf ruby-1.9.3-p327.tar.bz2 
cd ruby-1.9.3-p327
./configure 
make 
paco -lD make install

ruby -v
gem -v
gem install bundler

```



## nginx
```
yum install nginx
/etc/init.d/nginx start

vim /etc/nginx/conf.d/virtual.conf 
```

## sqlite3
```
yum install sqlite sqlite-devel
```

## mysql
```
yum install mysql-server
yum install mysql-devel
/etc/init.d/mysqld start
```
my.cnfの設定

```
#vim /etc/my.cnf
[client]
default-character-set = utf8

[mysqld]
character-set-server = utf8
```

```
GRANT ALL ON DatabaseName.* TO UserName IDENTIFIED BY 'UserPass' WITH GRANT OPTION;
```
nodeからphantomjs呼び出して、スクリーンショット取得したファイルが存在しなかったらrender.js呼び出して実行して、ファイルがあったら何もしない君

OSXでsourceからbuildして動かしたヤツ

文字化けしないですんなり動いたけど
CentOS5系で日本語フォント入れたり */etc/fonts/local.conf* とか
 *~/.fonts.conf* とかつくっても文字化け治らなくてないた。

取り敢えず日本語フォントはまだイケてないけど動作自体は期待した通りに動いた。

````fs.js
// gazo_fileがあるかないかの確認
var fs = require('fs');
var path = require('path');
var childProcess = require('child_process');
var phantomjs = require('phantomjs');
var binPath = phantomjs.path;
var render = "render.js";

// この辺が引数みたいな感じで渡したい
var gazo_name = "www.google.co.jp";
var gazo_file = gazo_name + ".png";
var width   = "120";
var height  = "80";

// あるかないかの確認
fs.exists(gazo_file, function (exists) {
    if (exists) {
        console.log(gazo_file , "is exists!");

    // gazo_fileがなかったらつくる
    } else {
        var url = "http://" + gazo_name;
        var options = [
            render,
            url,
            gazo_file,
            width,
            height
        ];

        // ここでrender.jsをphantomjsで呼び出して実行する
        childProcess.execFile(binPath, options, function(error, stdout, stderr) {
            console.log(stdout);
            console.error(stderr);
            if (error != null) {
                console.error('error: ' + error);
            }
        });
        console.log(gazo_file , "nothing. create this file!");
    }
});
````

````render.js
var page = require('webpage').create();

// argsは、phantom.argsでアクセスできる。
var address = phantom.args[0];
var output  = phantom.args[1];
var width   = phantom.args[2];
var height  = phantom.args[3];

console.log(address);
console.log(output);
console.log(width);
console.log(height);

page.viewportSize = {width: width, height: height, margin:'0px'};

page.open( address, 
                      function(status){
                           console.log(status);
                           if( status !== 'success'){
                               console.log('error');
                           }
                           else{
                               // 出力
                               page.render(output);
                               // 終了
                               phantom.exit();
                           }
                       }
           );
````
Dictionaryをシリアル化する（XMLファイルに保存）

Dictionaryをシリアル化するには、IXmlSerializable インターフェースを実装したクラスを作成します。

```csharp:SerializableDictionary.cs.cs
// シリアル化可能な Dictionary クラス
public class SerializableDictionary<Tkey, TValue> : Dictionary<Tkey, TValue>, IXmlSerializable
{
    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(KeyValue));

        reader.Read();
        if (reader.IsEmptyElement)
            return;

        while (reader.NodeType != XmlNodeType.EndElement)
        {
            KeyValue kv = serializer.Deserialize(reader) as KeyValue;
            if (kv != null) 
                Add(kv.Key, kv.Value);
        }
        reader.Read();
    }

    public void WriteXml(XmlWriter writer)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(KeyValue));
        foreach (var key in Keys)
        {
            serializer.Serialize(writer, new KeyValue(key, this[key]));
        }
    }

    public class KeyValue
    {
        public KeyValue(Tkey key, TValue value)
        {
            Key = key;
            Value = value;
        }

        public Tkey Key { get; set; }
        public TValue Value { get; set; }
    }
}
```

シリアル化（オブジェクト→XMLファイル）

```csharp:Serialize.cs
var selializer = new XmlSerializer(typeof(RecordInfo));
using (FileStream fs = new FileStream(GetXMLFilePath(), FileMode.Create))
{
    selializer.Serialize(fs, record);
}
```

逆シリアル化（XMLファイル→オブジェクト）

```csharp:DeSerialize.cs
XmlSerializer serializer = new XmlSerializer(typeof(RecordInfo));
RecordInfo record2 = new RecordInfo();
using (FileStream fs = new FileStream(GetXMLFilePath(), FileMode.Open))
{
    record2 = serializer.Deserialize(fs) as RecordInfo;
    // XML からオブジェクトが復元されている
}
```

シリアライズ対象のクラスはこちら。

```csharp:RecordInfo.cs
// これは私が必要だったので作ったクラス。作成する必要はない
public class RecordInfo: SerializableDictionary<string, FieldInfo>
{
}
```

```csharp:FieldInfo.cs
public class FieldInfo
{
    public FieldInfo(string FieldName, string JapaneseFieldName)
    {
        this.FieldName = FieldName;
        this.JapaneseFieldName = JapaneseFieldName;
    }

    public string FieldName;
    public string JapaneseFieldName;
}
```

その他

```csharp:Main.cs

private void Form1_Load(object sender, EventArgs e)
{
    record = new RecordInfo();

    record.Add("key1", new FieldInfo("key1", "キー１"));
    record.Add("key2", new FieldInfo("key2", "キー２"));
}

private string GetXMLFilePath()
{
    return @"d:\test.xml";
}
```

# 参考

* [これで勝つる！ - 虚飾の王](http://d.hatena.ne.jp/lord_hollow/20090206)
* [IXmlSerializable メンバ (System.Xml.Serialization)](http://msdn.microsoft.com/ja-jp/library/vstudio/system.xml.serialization.ixmlserializable_members(v=vs.90).aspx)
起動したシェルスクリプト内で呼び出すスクリプト内の絶対パスを取る


http://qiita.com/items/4eff8a7cbe87fb5a9864 の関連で↓のような階層のスクリプトを作ったらトラブったのでメモ

``` sh:/pato/to/cron/script.sh
#!/bin/bash

mydir=$(cd $(dirname $0) && pwd)
. ${mydir}/../common_config
```

``` sh:/pato/to/common_config
mydir=$(cd $(dirname $0) && pwd)
. ${mydir}/../functions

```

``` sh:/pato/to/functions
(略)
```

こんなケースの時、common_config内の`$0`が`/pato/to/cron/script.sh`になってしまい、`/pato/to/functions`を読み取りたいのに、`/path/to/cron/functions`を読みに行こうとして失敗する。

ので、こうする

``` sh:/pato/to/common_config
mydir=$(cd $(dirname $BASH_SOURCE) && pwd)
. ${mydir}/../functions

```
多分、変数名からしてBash限定
praatを用いた個人的な音声分析手順


1. 音声データを読み込んだらannotation
2. 保存したTextGridデータを使って音声データを分割
[praat: TextGridデータを利用した音声データの分割方法 #praat - Qiita]( http://goo.gl/eji7F "praat: TextGridデータを利用した音声データの分割方法 #praat - Qiita") 

3. スクリプトを走らせて，一区切りしたらExcel等でsoundinfoファイルを読み込む。
[praat: Write out soundinfo selectively (f0, intensity, duration) into a file]( http://goo.gl/zS6mZ "praat: Write out soundinfo selectively (f0, intensity, duration) into a file")
praat: Soundオブジェクトに対する音響分析


Pitch: Objectsウィンドウに開かれたSoundオブジェクトを選択して
Analyse periodicity - > To pitch...
\#オプション指定可

```praat:
select SoundName$To Pitch... 0 75 600#Time step: auto Pitch floor: 75 (Hz) Pitch ceiling: 600 (Hz) の設定
```
でき上がったPitchオブジェクトを選択して
Query - > 必要な情報を選択
\#最大値・最小値やそれぞれの時間情報などが選べる
以下では最大値をInfoウィンドウに表示させる

```praat:Get maximum... 0 0 Hertz Parabolic
```

Intensity: Objecsウィンドウに開かれたSoundオブジェクトを選択して
To Intensity…
\#オプション指定可

```praat:select SoundName$To Intensity... 100 0 yes#Minimum pitch: 100 (Hz) Time step: auto の設定
```
でき上がったIntensityオブジェクトを選択して
Query - > 必要な情報を選択
\#最大値・最小値やそれぞれの時間情報などが選べる
以下では最大値をInfoウィンドウに表示させる

```praat:Get maximum... 0 0 Parabolic
```

Duration: Objectsウィンドウに開かれたSoundオブジェクトを選択して
Query - > Query time domain… > 必要な情報を選択
以下ではオブジェクトの長さをInfoウィンドウに表示させる

```praat:select SoundName$Get total duration
```
JUnitで認証付SMTPサーバ（Gmail）での送信テストを書く

Wiserを使うとメール送信のテストコードを書けるんだけど、Gmail等の認証が必要なSMTPを使うコードをテストする場合に、ちょっと工夫が必要だったのでメモ。

```ruby:MailSender.java
Properties PROP = new Properties();
PROP.put("mail.smtp.auth", "true");
PROP.put("mail.smtp.starttls.enable", "true");

Session sess = Session.getInstance(PROP);
MimeMessage mm = new MimeMessage(sess);
Transport transport = sess.getTransport("smtp");
transport.connect("aaa", "bbb");
transport.sendMessage(mm, mm.getAllRecipients());
transport.sendMessage(mm, new Address[]{new InternetAddress("aaa@aaa.com")});
```

色々はしょってるけど、こんな感じのメール送信のコードをテストをしようと、wiserをそのまま使ってテストすると、認証処理`transport.connect("aaa", "bbb");`の所でコケてしまいます。
なので、下のような感じで

```ruby:MailSenderTest.java
Wiser wiser;
SMTPServer smtpServer;

@Before
public void setup() {
	wiser = new Wiser(587);
        
	smtpServer = wiser.getServer();
	UsernamePasswordValidator myUsernamePasswordValidator = new UsernamePasswordValidator() {
		@Override
		public void login(String id, String pass) throws LoginFailedException {
			if(id.equals("aaa") && pass.equals("bbb")){
				return;
			}
			throw new LoginFailedException();
		}
	};
	smtpServer.setAuthenticationHandlerFactory(new EasyAuthenticationHandlerFactory(myUsernamePasswordValidator));
	wiser.start();
}
```

wiserが使ってるSMTPServerのインスタンスに対して、認証用のハンドラーをセットしてあげるといけました。
ハンドラーにはUsernamePasswordValidatorのloginメソッドをオーバーライドした無名クラスをセットすると、ターゲットコードの`transport.connect("aaa", "bbb");`が実行されるときにloginメソッドが呼ばれるので、例外が発生しないようにloginメソッドを実装しておけばOK（認証エラーのロジックをテストしたければ、LoginFailedExceptionをスローするようにすればOK）。