OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS 6.3で、シェルスクリプト一発でchefまでインストールする

そもそも、そういうVM作っておくのが一番早いんですが、直でやる場合のシェルスクリプトを作ってみた。
でも、エラー処理も無く、逐次実行してるだけの超簡易なので、ネットワーク環境やその時のRubyの配布状況などを確認して利用してください。

```sh
# root executes this script

# Install Libraries for build
yum -y install gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison wget unzip git 

# Download Ruby
wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p327.tar.gz
tar xvzf ruby-1.9.3-p327.tar.gz

# Create Install Directory
mkdir /opt/ruby

# Configure and Compile
cd ruby-1.9.3-p327
./configure --prefix /opt/ruby
make
make install

cd

# Chef Install
/opt/ruby/bin/gem install chef

# Clone Cookbooks
git clone git://github.com/opscode/cookbooks.git chef-cookbooks

# Create Chef Directories
mkdir /etc/chef
mkdir /var/chef-solo

# Initial Setting
echo -e "file_cache_path \"/var/chef-solo\"\njson_attribs \"/etc/chef/node.json\"\ncookbook_path \"/root/chef-cookbooks\"" > /etc/chef/solo.rb

echo '{ "run_list": [] }' > /etc/chef/node.json

# Write run_list
# /opt/bin/chef-solo
```

/opt/rubyに入れているのは、後から削除したりちゃんと入れ直す時のためで、一時的な利用なのでPATHも通してません。

実際には上のスクリプトの中に、privateなリポジトリからのcookbooksのclone等も含んでいますが、公開のため削除してあります。
UITableViewの、どのセルをロングタップしたかを知りたいとき


``` objective-c:仕込み

// 適当なタイミングでUITableViewにUILongPressGestureRecognizerをaddする
- (void)hoge {

    UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(fuga:)];
    [_tableView addGestureRecognizer:longPressGestureRecognizer];

}


```

``` objective-c:本題

- (void)fuga:(UILongPressGestureRecognizer*)gestureRecognizer {
    // ロングタップの開始時だけこのメソッドを実行する
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan) {
        return;
    }
    
	// UILongPressGestureRecognizerからlocationInView:を使ってタップした場所のCGPointを取得する
    CGPoint p = [gestureRecognizer locationInView:_tableView];
	// 取得したCGPointを利用して、indexPathForRowAtPoint:でタップした場所のNSIndexPathを取得する
    NSIndexPath *indexPath = [_tableView indexPathForRowAtPoint:p];
	// NSIndexPathを利用して、cellForRowAtIndexPath:で該当でUITableViewCellを取得する
    UITableViewCell *cell = [_tableView cellForRowAtIndexPath:indexPath];
}


```

という感じで、ロングタップした場所の座標から取得したNSIndexPathを利用してUITableViewCellを取得することが出来ます。
GitでMerge CommitをRevertする方法


何個もCommitがあるような一つのPull Requestを全てRevertしたいようなときに使えます。

## そもそもRevertとは

あるコミットを打ち消すような、全く逆のコミットを作ることです。
追加した部分を削除して、削除した部分を追加して、変更した部分を変更前の状態にするコミットを作成します。

取り消したいコミットがあるのだけれど、既にリモートにコミットしてしまって、`git reset`, `git rebase -i`, `git reflog`などを使っての取り消しが不可能なときに使います。

## 通常のRevert

普通のcommitなら、revertは

```
$ git revert f60f24d
```

てな感じで、revertしたいcommit(今回は`f60f24d`)を指定すれば、実現出来ます。


## Merge Commitの場合

ただ、もし`f60f24d`がMerge Commitだった場合

```
$ git revert f60f24d
fatal: Commit f60f24d34845fba4e038b3e165f74973b3a19580 is a merge but no -m option was given.
```

というエラーメッセージが出ます。


これを解決するには

```
$ git revert -m 1 f60f24d
```

という風に`-m 1`と付けるだけです。

## 念のため確認

念のため、ちゃんと目的のものがrevertされているか確認しましょう。

```
$ git show
```

あれ、思っている方と違う方がRevertコミットされている！だめじゃん！！と思ったら、

```
$ git reset --hard HEAD~
```

で元の状態に戻して、

```
$ git revert -m 2 f60f24d
```

という風に`-m 2`に変えて試してみましょう。

## ちょっと解説

ちなみにこの`-m`は`--mainline`の略で`parent-number`を指定します。

この`parent-number`には基本的に1か2を指定すれば良く、`git show`をした時に

```
$ git show f60f24d                              
commit f60f24d34845fba4e038b3e165f74973b3a19580
Merge: 049d32b ebbcb6a
...
```

と出たとしたら、1は`049d32b`, 2は`ebbcb6a`を指します。

## 参考
- http://git-scm.com/docs/git-revert
- http://schacon.github.com/git/howto/revert-a-faulty-merge.txt
IntelliJ IDEA系のIdeaVIMプラグインと日本語キーボード

IdeaVIMで「Cntl-[」を押しても挿入モードから抜けられない。
どうやら、日本語キーボード使っているのだけど、
受けるほうは英語キーボードの「[」の位置のキーの入力を待っている様子。

英語キーボードで「[」位置には、日本語キーボードでは「@」があるので、
「Cntl-@」を押すと抜けられた。

また、英語キーボードに乗り換える理由が増えた。
エクスポートモジュールの楽な追加

<https://github.com/ekmett/lens/commit/63d43eaec84e06a8b74e6781fbcc60d93fb745a7> より。

<http://hackage.haskell.org/packages/archive/lens/3.6/doc/html/src/Control-Lens.html> こういうモジュールを作るとき、

~~~ {haskell}
module Foo (
  module Bar,
  module Baz,
  ...
  ) where

import Bar
import Baz
...
~~~

と書くところを、

~~~ {haskell}
module Foo (module Exports) where

import Bar as Exports
import Baz as Exports
...
~~~

にすれば、二重に名前を書く事を回避できる（ようだ）。
一度に実行する非同期処理の数を制限して、何回かに分けて処理する

```javascript
var Pile = function() {
   this.pile = [];
   this.concurrency = 0;
   this.done = null;
   this.max_concurrency = 10;
}
Pile.prototype = {
  add: function(callback) {
   this.pile.push(callback);
  },
  run: function(done, max_concurrency) {
      this.done = done || this.done;
      this.max_concurrency = max_concurrency || this.max_concurrency;
      var target = this.pile.length;
      var that = this;
      var next = function() {
         that.concurrency--;
         (--target == 0 ? that.done() : that.run());
      };
      while(this.concurrency < this.max_concurrency && this.pile.length > 0) {
         this.concurrency++;
         var callback = this.pile.shift();
         callback(next);
      }
   }
};


pilex = new Pile();
 
var counter = 0;
 
for(var i = 0; i < 50; i++) {
   pilex.add( function test(next) { //実行する非同期処理を登録
      setTimeout( function() {
         counter++;
        echo(counter +" Hello world");
         next();
      }, 1500);
     }
   );
}

pilex.run(function() {  //登録した処理を実行
    echo("Done "+counter);
},5);  //一度に実行する非同期処理の制限数
```

http://shimz.me/blog/?p=1850
ADTをUnboxed Vectorにして、Lens経由でアクセスする

~~~ {.haskell}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE QuasiQuotes           #-}
{-# LANGUAGE TemplateHaskell       #-}
{-# LANGUAGE TypeFamilies          #-}

import           Control.Lens
import           Data.Vector.Generic.Lens
import qualified Data.Vector.Unboxed          as VU
import           Data.Vector.Unboxed.Deriving

data FluidCell a
  = FluidCell
    { _mass   :: !a
    , _energy :: !a
    , _volume :: !a
    }
    deriving (Eq, Show)

makeLenses ''FluidCell

derivingUnbox "FluidCell"
  [t| VU.Unbox a => FluidCell a -> (a, a, a) |]
  [e| \(FluidCell x y z) -> (x, y, z) |]
  [e| \(x, y, z) -> FluidCell x y z |]

main :: IO ()
main = do
  let v = VU.fromList [FluidCell (1 :: Int) 2 3, FluidCell 4 5 6] :: VU.Vector (FluidCell Int)
  print v
  -- > fromList [FluidCell {_mass = 1, _energy = 2, _volume = 3},FluidCell {_mass = 4, _energy = 5, _volume = 6}]
  print $ v ^._head . mass
  -- > 1
  print $ _head . mass .~ 9 $ v
  -- > fromList [FluidCell {_mass = 9, _energy = 2, _volume = 3},FluidCell {_mass = 4, _energy = 5, _volume = 6}]
~~~
zshでファイル名を一括置換する方法


bash を使っている場合などは、`zsh` を叩いて zsh にログインする。

zmvコマンドをロード？する:

```
% autoload zmv
```

どのファイルが置換されるかを確認する:

```
% noglob zmv -n -W **/*foo* **/*bar*
```

ファイル名置換処理を実行する:

```
% noglob zmv -W **/*foo* **/*bar*
```
TeX on Qiita: はてなtex記法の \[, \] に対応

拙作[TeX on Qiita](http://qiita.com/items/3d4cf1028b5c438642bc)では、はてなtex記法の \[, \] に対応していなかったのでこれらをサポート。（[バージョン0.2](https://github.com/naoyat/qiita-toolkit/tree/master/TeX-on-Qiita/chrome)）

[数式を表示する（tex記法）- はてなダイアリー ヘルプ](http://hatenadiary.g.hatena.ne.jp/keyword/%E6%95%B0%E5%BC%8F%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%EF%BC%88tex%E8%A8%98%E6%B3%95%EF%BC%89)

> また、はてなダイアリー内では < （より小さい）や > （より大きい）を使用することができないため、tex記法内ではmimeTeXの記法（\lt \gt）または実体参照（&lt; &gt;）で記述してください。
> 
> また数式の中に [ ] が含まれると記法が終了してしまいますので、 \ でエスケープして記述する必要があります。（例：[tex:\sqrt\[3\]{4}]）

実体参照（&amp;lt; とか &amp;gt;）にも対応しました（バージョン0.3）が、&raquo;tex での不等号の逆コンバートは行いません。

### 使用例

以下、[yuiseki](http://qiita.com/users/yuiseki)さんの「[Google chart apiのテスト](http://qiita.com/items/be7f7c8ab92713456090)」から。

> E ステップ: 現在推定されているパラメータの分布θ(t)のもとで、尤度関数の、条件付き確率 P(z|x) に関する期待値を計算する。
> ![equation](http://chart.apis.google.com/chart?cht=tx&chl=Q(%5Ctheta%7C%5Ctheta%5E%7B(t%29%7D%29%3DE_%7BZ%7Cx%2C%5Ctheta%5E%7B(t%29%7D%7D%5Blog%20L(%5Ctheta%3Bx%2CZ%29%5D)

```
[tex:Q(\theta|\theta^{(t)})=E_{Z|x,\theta^{(t)}}\[log L(\theta;x,Z)\]]
```

> M ステップ: 下記の量Qを最大化するパラメータを求める。
> ![equation](http://chart.apis.google.com/chart?cht=tx&chl=Q%5E%7B(t%2B1%29%7D%3Darg_%7B%5Ctheta%7Dmax%20Q(%5Ctheta%7C%5Ctheta%5E%7Bt%7D%29)

```
[tex:Q^{(t+1)}=arg_{\theta}max Q(\theta|\theta^{t})]
```
OrmでLIKE検索する

※自分用のメモ代わり
Orm使っていてLIKE検索しようとした時にどうすりゃいいか
少し悩んだので共有。
####状況
5万行ほどのレコードが格納されているMySQLのテーブルの
あるカラムへLIKE検索をかけたい。
かけた結果20件を取得してなんかする

####間違ったコード

```php:ormtest.php
$result = \Model_Table::find('all')
          ->where('fieldname LIKE', "%searchtext%")
          ->limit('20');
```

#####どこが間違ったか
まず「Allowed memory」って怒られました。
調べた結果、メソッドチェーンはfind('all')した結果のオブジェクトにたいして
条件を絞って検索を行うみたい。
そら5万件を一気に検索したら上記の様なエラーは出ますね…

####通ったコード

```php:ormtest.php
$conditions['where'] = array(array('fieldname','LIKE',"%searchtext%"));
$conditions['limit'] = '20';
$result = \Model_Table::find('all',$conditions);
```

#####どうやって上手くやったか
http://search.net-newbie.com/fuel/packages/orm/crud.html
こちらのドキュメントを見ながらCRUDで検索SQLに追加をしました。
CakeでFindする時みたいに$conditionsに色々詰め込む方式と僕は認識しました。

####反省点
ちょうど隣の席で1時間前位にその問題でこうしたほうがいいとか
色々話してたという…悩む前に相談しろよという…何してんだ僕は。
kobito(markdown) -> pdf変換

kobitoでmarkdownを書いてそれをpdfに変換出来たので、メモしときます。

[kobito](http://kobitoapp.com/)使い始めました。
便利ですね。
即時プレビユーが気持ちいいです。

kobitoで書いたmarkdown記法のドキュメントをpdf化したかったので調べました。
pdf化は結構環境依存なので、同じ通りには行かないと思いますので、参考程度に。

##pandocのインストール
[pandoc](http://johnmacfarlane.net/pandoc/)インストールします。
homebrewに入ってるかと思ったのですが、入ってなかったので、[ここを参考に](http://d.hatena.ne.jp/sandai/20120604/p1)インストールしました。

##markdown -> tex
次に、markdown記法のドキュメントをtexに変換します。
これは簡単で、

```
$ pandoc -s hoge.md -o hoge.tex
```

でいいです。

##texファイル調整
自動で生成されるtexが気に入らないので、毎回以下のものを挿入してます。

```
\setlength{\topmargin}{-0.3in}
\setlength{\oddsidemargin}{0pt}
\setlength{\evensidemargin}{0pt}
\setlength{\textheight}{46\baselineskip}
\setlength{\textwidth}{47zw}
```

##tex -> pdf
これには、[TexShop](http://pages.uoregon.edu/koch/texshop/)を使いました。
普通に生成されたtexを開いて、いつも通りタイプセットするとpdfが生成されたので簡単です。

ちなみにこの記事もkobitoで書いてみました。
kobitoいいですね。
phpmdでエラーになったTraitの使用例


以下のような実装をした時に

- php的にはエラーにはならず、期待する動作をした
- でも、phpmd(1.4.0)でエラーになった

という事が起きて、Jenkinsさんに怒られた…。

```php:
<?php

trait TraitA
{
    function executeTraitA()
    {
        echo __METHOD__, PHP_EOL;
        $this->show();
    }

    abstract function show();
}

trait TraitB
{
    function executeTraitB()
    {
        echo __METHOD__, PHP_EOL;
        $this->show();
    }

    abstract function show();
}

class Test
{
    use TraitA;
    use TraitB;

    function show()
    {
        echo __METHOD__, PHP_EOL;
    }
}

$obj = new Test;
$obj->executeTraitA();
$obj->executeTraitB();
```

```
there are collisions with other trait methods on ... 
```

という感じでエラーを吐く。

`abstract`で手を抜くのではなく`interface`使ったりしなさいという事か…？
(command bound to event) の対応方法

tcl/tkでこのようなエラーが表示されて、途方に暮れたときのチェックポイント

![err](https://dl.dropbox.com/u/12131668/tkerr.png)

bindで呼ばれている手続きの中で、returnを使っている可能性がある。処理を抜けるにはreturn -code break、もしくは単にbreakを使う。
pythonの文法チェック


pythonより先にperlに触れておりまして
perl -cw hoge.pl
のようにオプションを付けてチェックするようなものを望んだがデフォルト環境ではない様子。

sudo pip install pyflakes
sudo pip install pep8

上記をインストールして
pyflakes hoge.py
pep8 hoge.py

でチェックできます。
pyflakesの方は動作がエラーになるような部分の文法チェックや使ってないモジュールを教えてくれる。
pep8の方はpep8のコーディングルール通りかのチェックを行う。

何行目何文字目かまで指摘してくれるのでソコをこつこつと修正を。

参考先サイト様
http://d.hatena.ne.jp/tell-k/20110425/1303745312
Emacsを軽くした

# 結論
linum-mode重いからoffにする。使いたいなら以下をinit.elに追加して使うと良い。

```lisp:
(setq linum-delay t)
(defadvice linum-schedule (around my-linum-schedule () activate)
  (run-with-idle-timer 0.2 nil #'linum-update-current))
```

その他の対策としてフォントをいじらない、再起動する、マシンスペック上げる等考えられる。

# 詳細というかブログエントリ的な何か
サーバのEmacsが重たくて仕方なかった。サーバにコードが置いてあるので、sshfsでサーバをマウントしてローカルのEmacs使ったり、ローカルのEmacsからTRAMPでサーバに繋いでみたり、とかやってたけど、これだとサーバのtmuxで作業状態が完結しないから切り替えが面倒だったり、サーバにあるコマンドを利用するEmacsの機能が使えなかったりして困ってた。
でサーバのemacsをinit.elを読まずに起動したらそれなりに軽いので、どの機能が思い原因かをinit.elをちょっとずつコメントアウトしてついに原因を突き止めた。
linum-mode (行番号表示)が原因だった。これをoffにすると軽い。しかし行番号の表示は欲しい。でぐぐると、init.elに以下を追加すると軽くなる、という記事を見つけて試してみた。

```lisp:
(setq linum-delay t)
(defadvice linum-schedule (around my-linum-schedule () activate)
  (run-with-idle-timer 0.2 nil #'linum-update-current))
```

http://d.hatena.ne.jp/daimatz/20120215/1329248780
これがビンゴで、凄く軽くなった。こんな神エントリがはてブ３しかないのが信じられなかった。

で、僕の話は終わりなんだけれども、他に重い原因調べて出てきたのには、フォントをいじると重い、という話や、段々重くなる、という症状なら再起動しろ、というかそもそもマシンスペック上げろ、という感じ。ちなみに僕の場合CPUがボトルネックだった。
XOOPS Themes and Templates Advent Calendar 2012 に投稿したらココにコメント！

[XOOPS Themes and Templates Advent Calendar 2012](http://qiita.com/advent-calendar/2012/xoops-themes-templates)の記事を書いたらここにコメントを残して下さい。

コメントに残す内容:

* 日付
* タイトル
* URL
mainとodr-usedとpotentially evaluatedの関係

GCC Bugzillaで見つけたC++言語仕様のスミをつつく指摘と、そこから調べてみて分かったC++03とC++11との微妙な差分に関する話題です。
（そもそもmain関数をアクロバティックに使うべきではありませんし、そんな必要もないと思います…）

### お話の前提
C++言語仕様では、`main`をプログラム内から使用する("_odr-used_")ことは禁止されています。
もちろん、普通に「プログラム開始時に呼び出されるmain関数を記述する」ことは可能です。ここで言う「使用できない」とは、他関数からmain関数を呼び出し／main関数自身で再帰呼び出しを行ったり、main関数のアドレスを取ったり（`&main`）が許可されないことを意味します。この仕様に関してはC++03／C++11で変更はありません。

### GCC Bugzillaでの指摘
Bug 41431 - [&main should be allowed within unevaluated operands.](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41431) の要旨：
sizeof演算子のオペランドは"_potentially evaluated_"では無いから、One Definition Ruleが定めるところの"_(odr-)used_"ではない。つまり`sizeof(&main)`はOKであり、これに対して警告を出すGCCは間違っている。

補足：「sizeof演算子オペランドは"_potentially evaluated_" expressionではない」「（大まかに）"_potentially evaluated_" expression内で用いることを"_(odr-)used_"と定める」は、C++03／C++11で共通の仕様です。

### C++03とC++11との差異
確かにISO C++03からWorking Draft N3126までは "The function main shall not be used (3.2) within a program."(§3.6.1 [basic.start.main]) と記述されており、言語仕様上は「"_(odr-)used_"で無い箇所ならば`main`を使っても良い」、つまり「sizeofでは"_(odr-)used_"とならないから`sizeof(&main)`はOK」と解釈可能です。
一方、C++11(N3337)では "The function main shall not be used within a program" となっています。ここでは定義された用語"_odr-used_"で明に記述していないため、プログラム内のどこであっても`main`の使用("use")は許可されず、結局は「`sizeof(&main)`もNG」と仕様変更されたように読みとれます。

このOne Definition Rule(§3.2 [basic.def.odr])については、仕様上の用語(term)としての"_used_"と、一般動詞としての"used"が区別できず曖昧であるとの指摘をうけ、[N3154 US 19: Ambiguous use of "use"](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3154.html)および[N3214 US 19: Ambiguous use of "use" (version 2)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3214.htm)で用語"_odr-used_"が導入された経緯があります。
初版N3154では一旦[basic.start.main]も"_odr-used_"へと変更する候補にあがっていましたが、続くRev2 N3214では明示的に一般語"used"に変更されています。残念ながら、この変更の根拠までは見つけられませんでした。

おしまい。（どなたか理由までご存知でしたら教えてください）
dotcloud で cd current した後 rake する

dotcloud では run コマンドによるリモートコマンド実行が扱えますが

```
dotcloud run www 'cd current; rake foo'
```

のように実行しても、current ディレクトリで rake が存在しないと言われてしまいます。

そこで次のように実行しましょう。

```
echo 'cd current; rake foo' | dotcloud run www
```

うまく行ったと思います。
クロージャをデータコンテナとして使うと便利な場合

先日、クロージャをコンテナとして使うアイデアが投稿されました。
http://qiita.com/items/192837fab8885ee5fa10
単純な場合はレコードなりベクタなりを使った方が効率的なのですが、クロージャを使うと便利な場合もあります。
それは内部構造を隠蔽したい場合です。
具体例としてスタックを挙げましょう。

```scheme:stack.scm
;; definition
(define stack-pop! #f)
(define stack-push! #f)

(call-with-values
    (lambda()
      (let((stack '()))
        (values
         (lambda()
           (if (null? stack)
               'empty
               (let ((top (car stack)))
                 (set! stack (cdr stack))
                 top)))
         (lambda(x)
           (set! stack (cons x stack))))))
  (lambda(pop push)
    (set! stack-pop! pop)
    (set! stack-push! push)))

;; example
(stack-push! 1)
(stack-push! 2)
(stack-push! 3)
(display (stack-pop!))
(display (stack-pop!))
(display (stack-pop!))
(display (stack-pop!))
(display (stack-pop!))
```

この実装ではスタックの実態はリストであり stack という名の内部変数に格納されています。
stack-pop! と stack-push! のふたつの手続を通じてスタックを操作しますが、内部変数 stack に直接アクセスすることは出来ません。
他のコンテナではアクセス制御できませんので、このような隠蔽はクロージャをコンテナとして利用する場合に特有の利点だと言えるでしょう。
（但し、処理系によってはオブジェクト指向的な機能やモジュール化といった拡張機能を持っていて効率的に代替できる場合もあります。）
botの一部の機能のためにntpで時刻合わせ


よるほーなどのためにサーバの時刻がずれていると困ることがあるので時刻合わせをですね。

UbuntuしかわからないのでUbuntuの場合ですけど。

インストールは
sudo apt-get install ntp

そして設定ファイルを編集
sudo vi /etc/ntp.conf

```ntp.conf

# You do need to talk to an NTP server or two (or three).
server #IP直でもNTPサーバのドメイン記述でも
server #2件か3件の記述がルールのようです。
server 
```
それぞれの環境で適切なサーバをご利用下さいませ。

http://wiki.nothing.sh/page/NTP/%A5%D7%A5%ED%A5%D0%A5%A4%A5%C0%A1%A6%B5%A1%B4%D8%CA%CC#content_1_0


おそらく導入直後は既に起動＆海外のサーバに問い合わせしているので
sudo /etc/init.d/ntp stop
停止させて上記の編集終わったら手動で起動を
sudo /etc/init.d/ntp start


ntpq -p
で状況確認できます。基本的には起動しっぱなしのプロセスになるようです。


```ntp.sh
#!/bin/bash
ps -C ntpd -o comm= > /dev/null || /usr/sbin/ntpd
```


これを毎日定時にcronで起動してるか確認し、動いてなければ起動を。
基本的には一度起動すればずっと動いているはずのもののようです。。。コレを疑うなら他にもやらないとなことが沢山出てくるんですけどね。
はい。時間を安定して調整できるようになれば次はbotの一部の機能を時間で制御。
botは一つのファイルで作ってるけどリプ返しやフォロー返し、単なる自動投稿などを特定の時間だけの動作にしたりする場合に。

```py:bot.py
import datetime

#ここでbotがcronにより動作させられたなうな時間を取得
time = datetime.datetime.now()

#7の倍数時で45分の時だけ動作させる
if time.hour % 7 == 0 and time.minute % 45 ==0:

#何か動作内容〜
```

cronで動作させてる時間に合わせて適切な値を設定して下さい。

参考先サイト様より
http://docs.python.jp/2.5/lib/datetime-datetime.html
~~~
クラス datetime(	year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]])
年、月、および日の引数は必須です。tzinfo は None または tzinfo クラスのサブクラスのインスタンス にすることができます。残りの引数は整数または長整数で、 以下のような範囲に入ります

MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= day <= 与えられた年と月における日数
0 <= hour < 24
0 <= minute < 60
0 <= second < 60
0 <= microsecond < 1000000
~~~

hourは24にならないのでhour % 8 == 0にすると一日に2回の動作になります。
minuteの値を30以下にすると一時間に2回割り切れる数字が出てくるのでアレです。
7:25 7:50 14:25 14:50 21:25 21:50
七時間おきに一時間で2回動くという現象を起こす可能性があります。
cronの設定にも依りますが。。
time.の後ろにhourなどつければ値を抜き出してこれます。monthやdayを使って元日やクリスマスなどにピンポイントで特定の発言や動作も仕込んだり出来ます。
今回は曜日を取得して何かさせるのは省略してます。私の休日がサービス業仕様で世間様と休日がずれてる故に。
sort() 関数の注意点

Vim script には標準でリストをソートする `sort()` 関数があります．

```vim
echo sort([3, 1, 4, 2]) " => [1,2,3,4]
```

しかしこれは注意が必要で，`sort()` はデフォルトでは文字列的に要素を比較してソートを行うため，数値的な比較でのソートを期待している場合，正しくソートされません．

```vim
echo sort([10, 1, 2, 100]) " => [1, 10, 100, 2]
```

数値的にソートするには，比較用の関数を作って渡す必要があります．

```vim
" 比較用の関数 lhs のほうが大きければ正数，小さければ負数，lhs と rhs が等しければ 0 を返す
function! s:compare(lhs, rhs)
    return a:lhs - a:rhs
endfunction

echo sort([10, 1, 2, 100], 's:compare') " => [1, 2, 10, 100]
```

詳しくは `:help sort()` に書かれています．
debugger (ruby-debug) から Sublime Text 2 を開く


debugger / ruby-debug では、下記のコマンドで、実行中のコードをエディタで開くことができる。

- `tmate` - TextMateで開く
- `edit` - 環境変数 `EDITOR` に設定されたエディタで開く

`tmate` は TextMate 専用な感じだし、`EDITOR` に `subl` を指定してもうまくいかない。

調べてみると、`edit` コマンドを実行したときは、下記のようにエディタが起動される。

```bash
$EDITOR +行番号 ファイル名
```

vi や emacs はこのような行番号指定に対応しているが、Sublime Text 2 の場合、下記の様に指定する必要がある。

```bash
subl ファイル名:行番号
```

そこで、下記の様なスクリプトを作成し、パスの通ったところに `sublvi` という名前で保存、実行権限をつけておく。

```ruby
#!/usr/bin/env ruby
# Usage: sublvi +lineno filename
require "shellwords"
lineno, file, = ARGV
exec Shellwords.shelljoin(["subl", "#{file}:#{lineno.to_i}"])
```

あとは `.zshrc` などに下記の記述を追加しておけば OK。

```bash
export EDITOR=sublvi
```
「/etc/init.d/xxx start」と「service xxx start」の違い

今まで特に気にしていませんでしたが（寧ろ /etc/init.d/xxx の方が補完が聞いて楽なので多用していましたが）、/sbin/service を覗いてみたところ次のような違いがありました。

**/etc/init.d/xxx start**

コマンドを実行したときの環境変数がそのまま引き継がれる。

**service xxx start**

環境変数は PATH と TERM のみが引き継がれる（CentOS6 の場合、CentOS5 だと LANG も引き継がれる）。

コマンドを実行するユーザが変な環境変数を持っていると意図しないことになるかもしれないので（http_proxy とか）、service を使うように統一した方が良いようです。
Aptana Studio 3 でデバッグするためのパッチ


## 環境

```
$ ruby -v
ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.4.0]
```

## 問題

`ruby-debug-ide` gem の中で以下のような 

```
Exception in DebugThread loop: undefined method `is_binary_data?' for "#<Hoge:0x00000000>":String
```

のような例外が発生してサーバプロセスが終了してしまう。

原因は`ruby-debug-ide`の`xml_printer.rb`のコード中にでdeprecated なメソッドである `String#is_binary_data?`を使用しているため。

## 回避策

`config/environments/development.rb` に以下のようなコードを追加

```ruby:
  # patch for Debugger
  class String
    def is_binary_data?
        ( self.count( "^ -~", "^\r\n" ).fdiv(self.size) > 0.3 || self.index( "\x00" ) ) unless empty?
    end
  end
```

## 参考

[Aptana 3 ruby debugger - Exception in DebugThread loop: undefined method `is_binary_data?'](http://stackoverflow.com/questions/8961367/aptana-3-ruby-debugger-exception-in-debugthread-loop-undefined-method-is-bin)
iOS6から追加されたCollectionViewのサンプル


##開発環境

* XCode Ver. 4.5.2

##ざくっとすること

* ViewControllerでは
Cellの登録
必要なデリゲートメソッドの追加。
メソッド毎にロジックを追加 

* storyboardで
CollectionViewを配置
その中にCellも配置
必要であれば他のオブジェクトも配置(サンプルはLabelを配置している)
上で配置したCellの設定をIB上で行う

* Cell用のクラスを新規作成し、ロジックを追加

##サンプルコード

###Cellの登録

``` objectivec
[self.collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:@"cell"];
```

forCellWithReuseIdentifier : Cellの識別子を指定。識別子は、"Collection Reusable View"のIdentifierで指定したのを使用。


###必要なデリゲートメソッドとメソッド毎にロジックを追加 

``` objectivec
//セクション数を設定
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}

// セクションに応じたセルの数を返す
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return datas.count;
}

// セルオブジェクトを返す
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    
    CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    cell.label.text = datas[indexPath.row];
    return cell;
}
```

###storyboardでの作業

CollectionViewに"Collection View Cell"オブジェクトを置く。
Cellの中にサンプルで表示する為のLabelオブジェクトもあわせて置く。
**Identifier**は**forCellWithReuseIdentifier**で指定した識別子を指定。

###Cell用のクラスを新規作成し、ロジックを追加

#####Labelオブジェクトの設定

``` Objectivec
@property (weak, nonatomic) IBOutlet UILabel *label;
```

``` Objectivec
@synthesize label = _label;
```

Cellの初期設定を行う。サンプルではラベルを追加している。

``` Objectivec
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, frame.size.width - 6, frame.size.height - 6)];
        label.backgroundColor = [UIColor redColor];
        [self.contentView addSubview:label];
        self.label = label;
    }
    return self;
}
```

### Headerの追加方法 (2013.03.24追記)
#### すること
* Headerの登録

``` Objectivec
[self.collectionView registerClass:[HeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"];
// withReuseIdentifierはIBで登録した名称を使用
```

* 対象のデリゲートメソッドを追加

``` objectivec
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
           viewForSupplementaryElementOfKind:(NSString *)kind
                                 atIndexPath:(NSIndexPath *)indexPath {
    HeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
                                                                withReuseIdentifier:@"header"
                                                                       forIndexPath:indexPath];
    return headerView;
}
```

"#参考情報
[[iOS6] Collection View 基本的な使い方](http://blog.natsuapps.com/2012/09/ios6-collection-view-basic.html "[iOS6] Collection View 基本的な使い方")
※github上のコードが参考になりました。

#"サンプルコード
[github](https://github.com/hondasports/calendarSample.git "github")

※このコードを足掛かりにするので、随時変更される可能性があります。
.ssh/configの記述方法

```
# ------------------------------
# 個人
# ------------------------------

Host huge
  HostName 192.168.19.100

Host foge
  HostName 192.168.19.120

# ------------------------------
# 開発
# ------------------------------

Host unnyara
  User nanasi
  port 11122
  HostName 123.456.789.0
  IdentityFile ~/.ssh/unnyara_rsa

# ------------------------------
# 踏み台
# ------------------------------

Host unnyara-stg
  HostName 123.456.789.1
  User nanasi
  IdentityFile ~/.ssh/unnyara_ladder_rsa
  Port 22111
  IdentitiesOnly yes
  ProxyCommand ssh -i ~/.ssh/unnyara_stg_rsa -p 222111 nanasi@123.456.789.2 nc %h %p

# ------------------------------
# 共通
# ------------------------------

Host *
  User soramugi
  IdentityFile               ~/.ssh/id_rsa
  ForwardAgent               yes
  TCPKeepAlive               yes
  ServerAliveInterval        15
  ServerAliveCountMax        3
```

こんな感じで雰囲気で
細かいところは要検索、あとは `man ssh_config` とかで。
絶対パスに変換する関数


realpath に似てるけど、ファイルが無くても絶対パスにする。

```php
/** realpath の非実在系関数
 *
 * ex:
 *    >>> print abs_path("/path/to/dir/../arr/to/best");
 *    "/path/to/arr/to/best"
 *
 * @param $str string 整合性合わせたいパス
 * @result string 整合性合わせたパス 
 */
function abs_path (string $str) {
    $fn = preg_split("|/|", $str);
    $stack = array();
    foreach ($fn as $path) {
        if ($path === "..") {
            if (count($stack))
                array_pop($stack);
        }
        else if ($path === ".") {
            // 無視
        }
        else if ($path === "") {
            // 無視
        }
        else {
            array_push($stack, $path);
        }
    }
    return implode("/", $stack);
}
```
モジュール外のページをXOOPSのテーマで表示する


参考 http://www.xugj.org/modules/QandA/index.php?topic_id=228

XOOPS2のときは下記でOKでした。

```php
<?php
include_once "../mainfile.php";
include_once XOOPS_ROOT_PATH."/header.php";
?>
<div>
  ここでHTML
</div>
<?php
include_once XOOPS_ROOT_PATH."/footer.php";
?>
```

XOOPS Cube Legacy2.1以降は下記のようにする必要があります。

```php
<?php

function begin_special_page()
{
	require_once XOOPS_MODULE_PATH . "/legacy/kernel/Legacy_Module.class.php";
	
	$handler =& xoops_gethandler('module');
	$module =& $handler->getByDirname('legacy');
	
	$root =& XCube_Root::getSingleton();
	$root->mContext->mModule =& new Legacy_ModuleAdapter($module);
	$root->mContext->mModule->mXoopsModule =& $module;
	$root->mContext->mXoopsModule =& $module;
}

include_once "../mainfile.php";
include_once XOOPS_ROOT_PATH."/header.php";

begin_special_page();

?>
<div>
  ここでHTML
</div>
<?php

include_once XOOPS_ROOT_PATH."/footer.php";
?>
```
Macでログイン時にスクリプトを実行する(Automator不使用)


たとえばこんなスクリプトをログイン時に毎回実行したい。(もっとファンの回転数コントロールとかVPNとかふつうはそういうのに使うのだろうが。
あと一行目はなくても動く)

```~/hoge.command
#! /bin/sh
echo "hoge" >> ~/hoge.log
```

　これを`~/hoge.command`という名前で保存し、実行権限をつけておく。
　(あと、__ファイルを新規作成するときに、GUIアプリだと駄目っぽい。__じっさいmiでやったら駄目だったので、miから全選択＆コピーしといて、ターミナルで`~$ vim ~/hoge.command`を開いて、`i`押してから全部ペーストし、`[ESC]→[:]→[x]→[Enter]`してごまかした(よいこの情弱のみんなになら，ゆるしていただけると信じている)。今回はvimで回避したが、Xcodeとかなら大丈夫なのかもしれない。

```
~$ chmod +x hoge.command
```

　場所はどこでもいいが、隠し属性のついたフォルダの中んどは厄介なのでやめた方がいいと思う。
　あと名前はどうでもいいが、拡張子が`hoge.sh`とかだと`chmod +x hoge.sh`をいくらやっても、Finderからダブルクリックで起動できる必要があり，`*.sh`ではそうならないので注意。
　ここで`~/hoge.command`がダブルクリックで起動することを確認しておく。

##方法:その1

4. [リンゴ]-[システム環境設定]の、[ユーザとグループ]で設定したいユーザを選んで表示し、そこの[ログイン項目]タブを表示。
5. [+]をクリックするとファイルを選べと言われるので、`~/hoge.command`ファイルを開く

以上。

##方法:その2

3. 上記スクリプトファイル`~/hoge.command`を、DockにD&Dして登録
4. そのDockアイコンを右クリック。
5. コンテキストメニューの[オプション]-[ログイン時に開く]にチェック
6. Dockアイコンをデスクトップの空いているところにD&Dして消す

以上。

書いておいてなんだけど、なんとなく間が抜けている気がして、好きになれないのだよなあ……。あとユーザが管理者権限もってれば(sudoできる人なら)、__sudoをパスワードなしに実行できる__。ログイン時に入れたばかりだからかな？

っていうかQiitaになにも書いたことなかったからって、初記事、こんなんでよかったのだろうか……。
Plackを学びたくなった時

Plack作者のmiyagawaさんからの1次情報がこちらで手に入るのでgit cloneして、emacsで読むなり、epubにして新しかったiPadにぶち込むなりして読むと良いです。
https://github.com/miyagawa/plack-handbook

これ使ってmarkdownからepubに変換できました。
https://github.com/shunito/md2epub
virtualenv配下にpyqt4をインストールする(Windows)

pyqt4、distutilsでパッケージングしたやつじゃなくて独自のインストーラで配布されているだけなので、virtualenv配下にインストールできない。

自分でビルドすればいいかもしれないけどそこまで頑張りたくはないし、PyQt4のためだけに `--system-site-package` 指定するのもなんだかなあという感じ。

そこで、とりあえずインストーラでインストールしておいて、必要なファイルを手でvirtualenv配下にコピーする。

コピーしないといけないファイル、フォルダは、以下のとおり。

+ .\Lib\site-packages\PyQt4
+ .\Lib\site-packages\sip.pyd
+ .\Lib\site-packages\sipconfig.py
+ .\Lib\site-packages\sipdistutils.py
+ .\qt.conf

qt.confは、python.exeと同じフォルダにないとダメなので、Scripts配下にコピーして、中に書いてあるパスもvirtualenv配下のパスに書き換える。

qt.confをコピーしなくてもだいたいは動くんだけど、これを忘れているとsvgのアイコンが表示できなかったりしてハマる、というかハマった。
変更したファイルは全部テストorチェックにかける（git add、commit、push前に）


## 変更or追加したけど、git addしていないファイルたち

	prove `git ls-files --modified --others --exclude-standard`

## addしたファイルたち
	prove `git diff --cached --name-only`

## push準備完了の差分たち
	prove `git diff --name-only origin/master...HEAD`

※ origin/masterはpush先のリモートブランチにあわせて変更してください。
※ proveはご利用の言語やツールに合わせてお好きなコマンドに変更してください。
実践的Perlデバッグ三種の神器

perlでprintfデバッグするにはData::Dumperがおなじみかと思いますが、printfデバッグでは「○○が××なのではないか」という仮説を１つずつ検証していくことになり大変なときもあります。Perlはスタックトレースとかをあまり吐いてくれないし大変だと思いきや、エラーの可視化などに便利なモジュールがあったのでメモりました。


## 変な場所でdieまたはwarnが出て困っている場合 => Carp::Always

warnまたはdieが出た時に、スタックトレースを引数付きで表示してくれます。warnやdieが出るが、どこから呼び出された時に、どんな引数のときにで出ているのかわからない場合に便利です。
※ Carp::Always::Colorというモジュールもあるようですが、まだ試していません。

エラーメッセージが少なすぎたので
![エラーメッセージが少なすぎ](https://qiita-image-store.s3.amazonaws.com/0/4153/2726549f-0908-cc40-d253-111992bb6a0f.png)

use Carp::Always;を適当な場所に追加（読み込まれればどこでもOK）
![use Carp::Always;追加](https://qiita-image-store.s3.amazonaws.com/0/4153/1a8a6df9-c67b-9c10-cb2c-46a92e427a34.png)

何が、どこから、どう呼び出されたのかが表示される
![スタックトレースをゲット](https://qiita-image-store.s3.amazonaws.com/0/4153/9ce8f2a4-bf39-1c36-992e-ec647d37debe.png)


## SQLが怪しい場合 => Devel::KYTProf

プロファイリング用のモジュールですが、SQLクエリの文とプレースホルダの中身が表示されるため、デバッグに重宝します。

use Devel::KYTProf;を適当な場所に追加（読み込まれればどこでもOK）
![use Devel::KYTProf;追加](https://qiita-image-store.s3.amazonaws.com/0/4153/afb193c4-d877-36fd-d9da-b70f3e28cb91.png)


SQLと実行時間が表示される
![SQLの実行情報をゲット](https://qiita-image-store.s3.amazonaws.com/0/4153/d7e75445-fad5-029e-8432-365ab91a0515.png)


## 怪しい構文、変数、関数をいろいろチェックしたい時 => (Devel::REPL, Carp::REPL)

[REPL](http://d.hatena.ne.jp/keyword/REPL)は乱暴に言えばプロンプトのことです。Devel::REPLは、シェルから使える"re.pl"コマンドで、単独のperlプロンプトを起動することができます。これは構文の動作（複雑な式の挙動など）を確認したい時に大いに役立ちます。

Carp::REPLはdieした場所や、プログラム中の任意の場所でプロンプトを起動します。変数の中身の確認と編集、関数の返り値のチェックなど、なんでもできるようになります。rubyのbinding.pryをご存知の方は、それのperl版がだいたいこれです。

※ 起動時に「モジュールくれ」と言われるので、Term::ReadLine::GnuまたはTerm::ReadLine::Perlも一緒にインストールしておきましょう。また、自分でインストールしたときにはFile::Nextへの依存関係が欠落していたので、別途インストールする必要がありました。今は修正されているかもしれません。

### dieした時にプロンプトを起動する

perl -MCarp::REPL script.plと指定して起動するか、use Carp::REPL;を適当な場所に追加
![use Carp::REPLの追加](https://qiita-image-store.s3.amazonaws.com/0/4153/b882176f-e6df-6b69-2df4-8d3f565479a2.png)

dieしたときにプロンプトが起動する
![dieするとREPLが起動](https://qiita-image-store.s3.amazonaws.com/0/4153/b1353f19-b280-9f2f-3326-06a1acfdcd72.png)

プロンプト内では、変数名を叩くだけで変数の中身がdumpされます。

### プログラム中の任意の場所でプロンプトを起動する

use Carp::REPLとrepl関数の呼び出しを追加
![repl呼び出しを追加](https://qiita-image-store.s3.amazonaws.com/0/4153/6b9910cd-5636-1cfc-a200-fa3139c056e6.png)

replが呼び出された時にプロンプトが起動する
![プロンプトを操作して、変数を書き換えて続行したりもできる](https://qiita-image-store.s3.amazonaws.com/0/4153/cfc47b24-f141-e9f6-7a16-923e76459e81.png)

変数を書き換えるなどしたあと、CTRL+Dで続行することができます。

## まとめ

- Carp::Always
	- エラーやスタックトレースの可視化
	- useするだけ
- Devel::KYTProf
	- SQLの可視化
	- useするだけ
- Devel::REPL
	- プロンプトで構文や式の動作を確認
	- re.plコマンド
- Carp::REPL
	- プログラムの途中でプロンプトを起動
	- dieしたところで使うなら、perl -MCarp::REPL script.plまたはuseするだけ
	- repl関数を使って任意の場所で起動

他にもこんなのがあるよ、こっちのほうが便利だよ！というものがあればぜひコメントで教えて下さいｍｍ
happy perl hacking :-)

追記：あとで見たら微妙に４種になってました・・すみませんでしたｍｍ
Unix コマンドラインでディスク消費量の適切なサマリーを得る

`du -s *` としないのがポイントです。

```shell:hoge.sh
du /usr/lib | sort -n | tail
31424   /usr/lib/ghc-6.12.1/base-4.2.0.0
36348   /usr/lib/dri
38296   /usr/lib/python2.6
42356   /usr/lib/openoffice/basis3.2/share
106436  /usr/lib/ghc-6.12.1/ghc-6.12.1
204240  /usr/lib/openoffice/basis3.2/program
247276  /usr/lib/openoffice/basis3.2
248132  /usr/lib/openoffice
255332  /usr/lib/ghc-6.12.1
1265352 /usr/lib
$
```
スクリプト言語で Unix かどうかをチェックする

uname 等が不便なことがあります。
そこで /dev/null の存在をチェックします。
念のためデバイスであることも確認します。
原理的に Python 以外のスクリプト言語に応用可能です。

```python:unixcheck.py
from stat import S_ISCHR
from os import stat

def unixcheck():
    try:
        return S_ISCHR(stat('/dev/null').st_mode)
    except:
        return False
```
Vimで作業再開

NERDTreeを画面の左につねに表示させて使っています。
一旦作業が終わり、Vimを閉じて、また同じ作業を続けたいとき、これまでは、NERDTreeを表示させて、作業フォルダまで行って、開いていたファイルを開いて、とやってました。が、

わたしはアホでした。

    :Unite file_mru

で、Recentファイルの一覧を開いて作業していたファイルを選択します。
んで、

    :NERDTreeFind

で、そのファイルのあるところでNERDTreeが開きます。（もちろんどっちにもショートカットキーつけてます）

なんて便利、(*´-｀*)
OS XにHaskell Chartsのインストール


http://dockerz.net/twd/HaskellCharts

もろもろハマった。historyから抜粋するとこんな感じだけど、他にも何か要因があるかも。

```
% cabal update;
% cabal install --user gtk2hs-buildtools
% brew install cairo
% brew install fontconfig
% export PKG_CONFIG_PATH=/opt/X11/lib/pkgconfig:/usr/X11/lib/pkgconfig
% cabal install --user cairo-0.12.4
% cabal install --user chart
```
NLTKを使って文書分類用データをサクッと作る


教科書や論文を呼んで分類器を作成してみたので実際にうまく分類できるのかを確かめたいことがあると思います。
そんな時にはNLTKが提供しているコーパスを使って評価用のデータを作ると簡単だと思います。
文書分類用のデータには映画のレビューコーパス（英語）が提供されています。
'pos'もしくは'neg'のラベルが付いた映画のレビューがある単語を含むかどうかの{0, 1}のシンプルな素性に変換されます。

``` python
import nltk
from nltk.corpus import movie_reviews

def document_features(document, word_features):
    document_words = set(document)
    features = {}
    for word in word_features:
        if word in document_words:
            features[word] = 1 
        else: features[word] = 0 
    return features

def dataset():
    d = []

    freqdist = nltk.FreqDist()
    for category in movie_reviews.categories():
        for fileid in movie_reviews.fileids(category):
            for word in movie_reviews.words(fileid): freqdist.inc(word.lower())

    word_features = freqdist.keys()
    for category in movie_reviews.categories():
        for fileid in movie_reviews.fileids(category):
            fv = document_features(movie_reviews.words(fileid), word_features)
            x_i = [v for k, v in sorted(fv.items(), key=lambda f: f[0])]
            if category == 'pos':
                y_i = 1 
            elif category == 'neg':
                y_i = -1
            d.append((y_i, x_i))
    return d
```
Visualforceでドーナツグラフ表示

<apex:chart>でドーナツグラフを表示する方法です。

```Apex:Apex
public with sharing class Chart_PieSeries2 {
    
    public List<Data> getData() {
        return Chart_PieSeries2.getChartData();
    }
    
    @RemoteAction
    public static List<Data> getRemoteData() {
        return Chart_PieSeries2.getChartData();
    }
    
    public static List<Data> getChartData() {
        List<Data> data = new List<Data>();
        data.add(new Data('Jan', 30));
        data.add(new Data('Feb', 44));
        data.add(new Data('Mar', 25));
        data.add(new Data('Apr', 74));
        data.add(new Data('May', 65));
        data.add(new Data('Jun', 33));
        data.add(new Data('Jul', 92));
        data.add(new Data('Aug', 87));
        data.add(new Data('Sep', 34));
        data.add(new Data('Oct', 78));
        data.add(new Data('Nov', 80));
        data.add(new Data('Dec', 17));
        return data;
    }
    
    public class Data {
        public String name { get; set; }
        public Integer data1 { get; set; }
        public Data(String name, Integer data1) {
            this.name = name;
            this.data1 = data1;
        }
    }

}
```

```Visualforce:Visualforce
<apex:page controller="Chart_PieSeries2" title="Pie Chart">
    <apex:chart data="{!data}" height="400" width="500">
        <apex:legend position="left"/>
        <apex:pieSeries labelField="name" dataField="data1" donut="50">
            <apex:chartLabel display="middle" orientation="vertical"  font="bold 18px Helvetica"/>
        </apex:pieSeries>
    </apex:chart>
</apex:page>
```

次の処理でドーナツグラフが表示できます。
`<apex:pieSeries labelField="name" dataField="data1" donut="50">`

円グラフを表示するための`<apex:pieSeries>`ですが、
`donut="50"`のように指定することで中心に穴を開けることができます。

次の処理ではグラフ内のラベル表示を設定しています。
`<apex:chartLabel display="middle" orientation="vertical"  font="bold 18px Helvetica"/>`

`display="middle"`でラベルの表示位置を指定できるようです。
Visualforceで円グラフ表示

Winter'13でグラフを表示するための<apex:chart>が正式にリリースされました。

これを使用して円グラフを表示することができます。

```Apex:Apex
public with sharing class Chart_PieSeries {
    
    public List<Data> getData() {
        return Chart_PieSeries.getChartData();
    }
    
    @RemoteAction
    public static List<Data> getRemoteData() {
        return Chart_PieSeries.getChartData();
    }
    
    public static List<Data> getChartData() {
        List<Data> data = new List<Data>();
        data.add(new Data('Jan', 30));
        data.add(new Data('Feb', 44));
        data.add(new Data('Mar', 25));
        data.add(new Data('Apr', 74));
        data.add(new Data('May', 65));
        data.add(new Data('Jun', 33));
        data.add(new Data('Jul', 92));
        data.add(new Data('Aug', 87));
        data.add(new Data('Sep', 34));
        data.add(new Data('Oct', 78));
        data.add(new Data('Nov', 80));
        data.add(new Data('Dec', 17));
        return data;
    }
    
    public class Data {
        public String name { get; set; }
        public Integer data1 { get; set; }
        public Data(String name, Integer data1) {
            this.name = name;
            this.data1 = data1;
        }
    }
}
```

```Visualforce:Visualforce
<apex:page controller="Chart_PieSeries" title="Pie Chart">
    <apex:chart height="350" width="450" data="{!data}">
        <apex:pieSeries dataField="data1" labelField="name"/>
        <apex:legend position="left"/>
    </apex:chart>
</apex:page>
```

次の処理でグラフの種別を円グラフに指定しています。
`<apex:pieSeries dataField="data" labelField="name"/>`

次の処理で凡例の表示位置を指定しています。
`<apex:legend position="right"/>`

凡例の表示位置は"top","buttom","left","right"から選択できます。
MySQL CSV形式でデータ吐き出し

```
mysql -u user_name -p db_name -e "SELECT * FROM table_name" | tr "\t" "," > "table_name.csv"
```

* 列名不要時は `-N` 付加
* `-s` オプションは合ってもなくても一緒？

参考
http://mysql.javarou.com/dat/000396.html
http://ameblo.jp/inclouds/entry-10575902477.html
http://iandeth.dyndns.org/mt/ian/archives/000119.html
COBOLでHello worldを表示する

```HELLO_WORLD.cob
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO_WORLD.
       ENVIRONMENT DIVISION.
       DATA DIVISION.
       PROCEDURE DIVISION.
       MAIN.
           DISPLAY 'Hello World'.
           STOP RUN.
```
オンラインコンパイラ
http://www.compileonline.com/compile_cobol_online.php
Stage3D のバグ スケールがちぐはぐだよ！


これはほんの一例
http://forums.adobe.com/message/4519542#4519542

CPUレイヤーとGPUレイヤーのスケールがバラバラ。

問題はそれだけではない。
どうやっても、フルスクリーンですべてをうまくやる方法が今ところないという。

Stage3DなフルスクリーンAdobeAIRアプリを、Windows/MacOSX
両方対応させると、いかに問題があるかがよく分かる。

と愚痴っていてもなんなので解決一歩手前のアプローチを２つ

> 前置き
Stage3DはCPUレイヤーとは異なる最大化（View3D/Cameraの処理は変えずにスケールだけをかえるためには、fullscreen_rectを画面サイズにとる）の手法をとる必要があるが、それが既存のCPUのスケールとバッティングして、華麗にハマる。

アプローチ１：Widnowsの多くの機種でGPUモードが使えないことを諦める
--------------------------

これは簡単。
no_scale で rect をディスプレイのサイズにおきつつ、CPUレイヤーを透過すればいい。

これをやると、何故か、DirectXをドライバーとして動くWindows環境が悉くCPUモードに落ちる。

Windowsなんてシラネな人はこれが現状ベストと思われ。

アプローチ2：CPUレイヤーの透過を諦める
-------------------------

no_scale で rect をディスプレイのサイズにおきつつ、CPUレイヤーを透過しない。

こうすると、CPU描画に落ちる問題を回避出来る。

ただし、CPUレイヤーがスケールされずに、かつ透過されないので、
フルスクリーン時に、右+下に非透過なCPUレイヤー被さり、Stage3Dが隠れる致命的な問題がある。

この問題が解決出来れば、アプローチ２はそこそこまともな妥協案になるとは思うのだが...



>なお、アプローチ1/2 いづれも、CPUレイヤーでタッチイベントを広いつつ、座標を自力で補正して、イベントをはきなおさないと、ダメな事に注意。

Adobeはゲームゲームと言葉だけで、PC向けゲーム作らせる気はないんだなとつくづく思う。

こんなんで、ゲーム制作者が使う気になるわけないだろう。
NULL終端されていない文字列を readUTFBytes() できるか？


結論：length指定を適切にやればできる。

勝手にNULLまでAS側が見に行ったような気がしたけど、気のせいだった。
ネットワークのパケット設計してて、微妙に悩んだ（昔うっすらハマった記憶があった）ので、メモ。
display: inline-block; をIE6,7でも有効に


```css
.hoge {
	display: inline-block;
	/* For IE 6/7 */
	*display: inline;
	*zoom: 1;
}
```

スターハックが若干気に入りませんが、割り切りも大切ですよね。何となく使用避けてましたが、使うことにしたので記念に。

とりあえずIEは爆発しろ。
今使っているclearfix


進化し続ける clearfix。
IE6なんぞ無視！と言いつつも、うっかり気になるのがIT土方ですよね。clearfix くらいはIE6対応してあげる記念に一度整理。

```css

.cf:before, .cf:after {
	content:"";
	display:table;
}
.cf:after { clear:both; }

/* For IE 6/7 */
.cf { zoom:1; }

```

*（2012-11-16版）*


> 【ネタ元】
[CSS]スタイルシートの量を少し減らした、新しいclearfix -micro clearfix | コリス
http://coliss.com/articles/build-websites/operation/css/css-micro-clearfix.html


---


整理したら Mac IE 対応版も発見。もう二度と見ることないかもしれないので記念に。

```css
.clearfix:after{
	content: " ";
	display: block;
	height: 0;
	clear: both;
	visibility: hidden;
}
.clearfix{display: inline-block;}

/* Hide MacIE \*/
* html .clearfix{height: 1%}
.clearfix{display: block;}
/* End hide MacIE */
```

IEは爆発しろ。
矩形選択時の始点と終点の収得方法

絶対忘れるのでメモ。

    function! g:hoge() range
      " 始点
      let start_pos = getpos("'<")
      " 終点
      let end_pos = getpos("'>")
      echo start_pos
      " [1,3,0,0]
      echo end_pos
      " [4,7,0,0]
     endfunction
     vnoremap @ :call g:hoge()<CR>
ウィンドウリサイズ時のちらつきを抑える

#問題

```
case WM_CREATE:
　pImage = new Image(TEXT("大きめの画像ファイル.jpg"));
　break;

case WM_PAINT:
　PAINTSTRUCT ps;
　HDC hdc = BeginPaint(hwnd, &ps)

　Gdiplus::Graphics g(hdc);
　g->DrawImage(pImage, 0, 0);

　EndPaint(hdc);
　break;
```

として満足していたけれど、この処理だとウィンドウをリサイズして大きくしたときに
ものすごい勢いでちらついた。

これを直したい。

#対応

## WM_ERASEBKGND の抑制

```
case WM_ERASEBKGND:
　　return 1;
```

BeginPaint から WM_ERASEBKGND がSendMessage されて背景を消去しているらしいのでこれを抑制する。
非ゼロを返すと、抑制される。

```
case WM_PAINT:
　PAINTSTRUCT ps;
　HDC hdc = BeginPaint(hwnd, &ps)

　//------------------------------------------------------- ここから追加
　RECT rect;
　GetClientRect(hwnd, &rect);
  HBRUSH hbr = (HBRUSH)GetStockObject(GRAY_BRUSH);
　FillRect(hdc, hbr, 0, 0, width, height);
　//------------------------------------------------------- ここまで

　Gdiplus::Graphics g(hdc);
　g->DrawImage(pImage, 0, 0);

　EndPaint(hdc);
　break;

```

WM_ERASEBKGND で背景描かないようにしてしまったので、自分で実装する必要がある。

これは画像を扱うプログラムではもうおまじないレベルの必須だそうで、実装しておく。
が、これだけでは全然意味なかった。


##描画に、GDI+を使わないように変更

ためしに、同じ画像を GDI+ を使わないで表示するようにしてみたところ、全くちらつかない。
・・・わるいのは GDI+ だ

というわけで、GDI+は画像の読み込みだけにとどめ、画像の描画は GDI の BitBlt を利用するように変更する。

まず、読み込んだ画像を保存するHBITMAPを宣言。

```
　HDC hBackDC;
　HBITMAP hBackBmp;
```

つぎに、画像読み込み部分を修正。

```
case WM_CREATE:
　pImage = new Image(TEXT("大きめの画像ファイル.jpg"));
　{
　//------------------------------------------------------- ここから追加
　　HDC hDC = GetDC(hwnd); // hWndはウインドウプロシージャのもの
　　hBackDC = CreateCompatibleDC(hDC);
　　hBackBmp = CreateCompatibleBitmap(hDC, pImage->GetWidth(), pImage->GetHeight());
　　SelectObject(hBackDC, hBackBmp);
　　Graphics g(hBackDC);
　　g.DrawImage(pImage, 0, 0);
　　ReleaseDC(hwnd, hDC);
　//------------------------------------------------------- ここまで
　}
　break;
```

最後に画像を描画する。

```
case WM_PAINT:
　PAINTSTRUCT ps;
　HDC hdc = BeginPaint(hwnd, &ps)

　RECT rect;
　GetClientRect(hwnd, &rect);
  HBRUSH hbr = (HBRUSH)GetStockObject(GRAY_BRUSH);
　FillRect(hdc, hbr, 0, 0, width, height);

　//------------------------------------------------------- ここを修正
　BitBlt(hDC, 0, 0, width, height, hBackDC, 0, 0, SRCCOPY);
　//------------------------------------------------------- ここまで

　EndPaint(hdc);
　break;

```

## 以上
Statistics.Distribution


http://hackage.haskell.org/package/statistics を試してみる。正規分布から1,000個サンプルをとって、母集団平均の95%信頼区間をt値を使って計算してみる。

```haskell:
% cabal install --user statistics
% runghc
module Main where
import Data.Vector.Unboxed as V
import Statistics.Distribution
import Statistics.Distribution.Normal
import Statistics.Distribution.StudentT
import Statistics.Sample as S;
import System.Random.MWC
import Text.Printf

pickSample :: IO Sample
pickSample = withSystemRandom $
              \gen -> replicateM 1000 (randomDouble gen) :: IO Sample
    where randomDouble = genContVar standard

meanRange95 :: Sample -> (Double, Double)
meanRange95 sample = (S.mean sample - base, S.mean sample + base)
    where n = fromIntegral (V.length sample) - 1 :: Double
          tQuantile95 = quantile (studentT n) 0.975
          base = tQuantile95 * S.stdDev sample / sqrt n

main :: IO ()
main = do
  sample <- pickSample
  printf "mean of sample: %.4f\n" (S.mean sample)
  printf "stddev of sample: %.4f\n" (S.stdDev sample)

  let (min, max) = meanRange95 sample
  printf "%.4f <= mean of population <= %.4f\n" min max

【実行結果】
mean of sample: 0.0050
stddev of sample: 1.0415
-0.0597 <= mean of population <= 0.0697
```

Statistics.Test にも色々入ってるけど、そっちは試してない。
Lensを用いたBrainf*ckインタプリタ

lens(http://hackage.haskell.org/package/lens-3.5.1 )を使ってみた。Lensの実用性は高そうだ。

```haskell:brainfuck.hs
{-# LANGUAGE TemplateHaskell #-}
import qualified Data.IntMap.Strict as M
import Control.Lens
import Control.Applicative
import Control.Monad.State
import Data.Word
import System.Environment

data Op = Inc | Dec | Prev | Next | Get | Put | Loop [Op]
data Machine = Machine {_cursor :: Int, _tape :: M.IntMap Word8}
$(makeLenses ''Machine)

runOp :: Op -> StateT Machine IO ()
runOp op = do
    (i, v) <- current
    case op of
        Inc -> tape %= (at i ?~ succ v)
        Dec -> tape %= (at i ?~ pred v)
        Prev -> cursor .= pred i
        Next -> cursor .= succ i
        Get -> do
            ch <- lift getChar
            tape %= (at i ?~ toEnum (fromEnum ch))
        Put -> lift $ putChar $ toEnum $ fromEnum v
        Loop code -> fix $ \self -> do
            (_, v) <- current
            when (v /= 0) $ mapM_ runOp code >> self
    where 
        current = use cursor >>= \i -> (,) i <$> maybe 0 id <$> uses tape (view $ at i)

parse :: String -> (String, [Op])
parse "" = ("", [])
parse ('+':xs) = (Inc:) <$> parse xs
parse ('-':xs) = (Dec:) <$> parse xs
parse ('<':xs) = (Prev:) <$> parse xs
parse ('>':xs) = (Next:) <$> parse xs
parse (',':xs) = (Get:) <$> parse xs
parse ('.':xs) = (Put:) <$> parse xs
parse ('[':xs) = let (xs', op) = Loop <$> parse xs in (op:) <$> parse xs'
parse (']':xs) = (xs, [])
parse (_:xs) = parse xs

main = getArgs >>= \(path:_) -> do
    code <- readFile path 
    flip runStateT (Machine 0 M.empty) $ mapM_ runOp $ snd $ parse code
```
ViChromeでURLのインクリメント/デクリメント

ChromeをVimっぽく操作するためのエクステンションは色々あるけど、個人的にはViChromeが一番使いやすいと思う。

で、vimperatorにある`<C-a>`、`<C-x>`の機能(URL内の数字をインクリメント/デクリメントする)が見当たらなかったので、KeyMappingに追加してみた。

example.com?page=2 みたいなURLからpage=3やpage=1に移動するためのアレです。

```
nmap <C-a> :Open javascript:(function(){inc=function(val){n=String(Number(val)+1);while(n.length<val.length)n="0"+n;return%20n;};location.href=decodeURI(location.href).replace(/([0-9]+)([^0-9]*)$/,function(w,a,b){return%20inc(a)+b;});})()

nmap <C-x> :Open javascript:(function(){dec=function(val){n=String(Number(val)-1);while(n.length<val.length)n="0"+n;return%20n;};location.href=location.href.replace(/([0-9]+)([^0-9]*)$/,function(w,a,b){return%20dec(a)+b;});})()
```

ちゃんと整形するとこんな感じ。

```javascript
(function() {
    inc = function(val) {
        n = String(Number(val)+1);
        while (n.length < val.length)  n = "0"+n;
        return n;
    };
    location.href = decodeURI(location.href).replace(
                              /([0-9]+)([^0-9]*)$/,
                              function(w, a, b) { return inc(a)+b; }
                    );
})()
```
Android v2.1以上でGridLayoutを使う

- [Android Developers Blog: New Layout Widgets: Space and GridLayout](http://android-developers.blogspot.jp/2011/11/new-layout-widgets-space-and-gridlayout.html)

## SDKからインポート
- $ANDROID_SDK/extras/android/support/v7/gridlayout

Eclipseならライブラリプロジェクトとして連れてくる。
プロジェクト単位で持たせたいなら中にコピーしてくるなりする。

## レイアウトで使う
- android.support.v7.widget.GridLayoutとして呼ぶ
- ネームスペースを切る
 - 以下はgridというネームスペースを切った場合
 - GridLayoutに対するパラメータはandroid:xxx -> grid:xxxとして扱う -> なんか設定が効いてないと思ったらここをまず疑う

```xml
<android.support.v7.widget.GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:grid="http://schemas.android.com/apk/res-auto"
    android:id="@+id/gridLayout1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    grid:columnCount="4">
…
</android.support.v7.widget.GridLayout>
```

## GridLayout固有のパラメータ
上でネームスペースを書き換える必要があるパラメータ
- columnCount
- layout_column
- layout_row
- layout_columnSpan
- layout_rowSpan
- layout_gravity


## Space
GridLayoutと共にSpaceがandroid.support.v7.widget.Spaceとして使えるようになる。隙間などのために入れ込む空の軽量なView。

- [EGG 開発ブログ: アプリ紹介＆軽量なViewのSpace](http://www.eggdev.blogspot.jp/2012/08/viewspace.html)
nokogiriのインストールでこける場合の対処

色々なgemが依存している[nokogiri](http://nokogiri.org/)ですが、[homebrewからlibiconvが削除された](https://github.com/mxcl/homebrew/issues/11130)ためビルドに失敗することがあります。
チュートリアルでは[libiconvを別途インストールする](http://nokogiri.org/tutorials/installing_nokogiri.html)のが推奨されており、こちらでも解決可能ですが、個人的にあまりsudoしたくないのでhomebrewで解決してみます。
以下の手順でビルド可能です。

```sh:nokogiri_install
brew tap homebrew/dupes
brew install libxml2 libxslt libiconv
brew link libxml2 libxslt libiconv
gem install nokogiri
```

最近のhomebrewは`brew tap`でリポジトリが追加できるようになっています。もし` brew tap`でエラーが出る場合はbrew updateを試してみて下さい。