OmniAICreator/Qiita-1.07M huggingface dataset:
Pinaxの概要について簡単なまとめ #djangoja

[Pinax](http://pinaxproject.com/)の概要について調べたので、ここにまとめておきます（2013/01/27現在の情報をまとめています）。
英語がよく分からないので、未確定情報が多いです。

# Pinaxとは？
Djangoをさらに使いやすくするために、有志が作ったコードがまとまっているサイト。
ある目的に特化したウェブサイトを作るためのテンプレートがあったり、
プラグイン的に必要な物だけ自分のプロジェクトに取り込むことができたりする。

# Projects
* [symposion](https://github.com/pinax/symposion) カンファレンスのウェブサイトを作るための雛形。
* [pinax-project-account](https://github.com/pinax/pinax-project-account) アカウント周りの機能（ログイン・ログアウト・アカウント作成・ユーザー情報変更・退会等）が一式揃ったウェブサイトの雛形。
* [pinax-project-zero](https://github.com/pinax/pinax-project-zero) Pinaxを使ったウェブサイトの雛形。これをベースに、以下のAppsをインストールして機能を拡張していく感じ。

# Themes
* [pinax-theme-bootstrap](https://github.com/pinax/pinax-theme-bootstrap) Templateに簡単にTwitter Bootstrapを導入できる。
* [pinax-theme-bootstrap-account](https://github.com/pinax/pinax-theme-bootstrap-account) pinax-theme-bootstrapのアカウント周りのフォームが付いている版

# Apps
* [django-announcements](https://github.com/pinax/django-announcements) 「ユーザーへのお知らせ」を表示させるサービスを作れる。
* [django-user-accounts](https://github.com/pinax/django-user-accounts) アカウント周りの機能（ログイン・ログアウト・アカウント作成・ユーザー情報変更・退会等）を提供するサービスを作れる。
* [django-notification](https://github.com/pinax/django-notification) 特定のイベントをユーザーに通知するサービスを作れる。通知手段はメールかRSS Feed。
* [django-waitinglist](https://github.com/pinax/django-waitinglist) アカウント作成申請者の一覧を表示させるサービスを作れる。
* [django-forms-bootstrap](https://github.com/pinax/django-forms-bootstrap) Twitter Bootstrapを使ったFormを作れる。
* [django-stripe-payments](https://github.com/eldarion/django-stripe-payments) 課金サービス[Stripe](https://stripe.com/)と連携する機能を作れる。
* [anafero](https://github.com/eldarion/anafero) 外部のウェブサイトに自サービスの「紹介リンク」を貼って、「紹介リンク」を踏むと何らかのアクションを起こす、というサービスを作れる。（恐らく、アフィリエイトサービスのようなものを作れるのでは？）
* [agon-ratings](https://github.com/eldarion/agon-ratings) 「ユーザーのレーティング」機能を提供するサービスを作れる。
* [bootstrap-ajax](https://github.com/eldarion/bootstrap-ajax) Twitter Bootstrap + Ajax なサービスを作れる。
* [agora](https://github.com/eldarion/agora) フォーラムを作るためのモジュール？ 説明を読んでもよく分からなかった。
* [kaleo](https://github.com/eldarion/kaleo) 招待機能があるサービスを作れる。
* [phileo](https://github.com/eldarion/phileo) "a liking app"というのが何のことやらさっぱりわからんちん
* [metron](https://github.com/eldarion/metron) Google Analytics等のアクセス解析を使ったサービスを作れる。
* [eventlog](https://github.com/eldarion/eventlog) Django標準のロギングよりもっと便利な機能を提供する。
* [brabeion](https://github.com/eldarion/brabeion) ユーザーにバッジを付ける機能（coderwallのバッジのようなもの？）を提供するサービスを作れる。
* [mailout](https://github.com/eldarion/mailout) 「キャンペーンのお知らせ」みたいなメールを送るサービスを作れる。元々DjangoCon 2010とPyCon 2011のために作られたものを汎用的に使えるようにリファクタリングして今の形になった。
* [agon](https://github.com/eldarion/agon) 意味が分からなかった。
* [dialogos](https://github.com/eldarion/dialogos) "flaggable comments"ができるサービスを作れるらしいけど、"flaggable comments"の意味が分からなかった。
* [django-boxes](https://github.com/eldarion/django-boxes) "boxes of admin-controllable"が作れる。多分、管理者がTemplateの一部の表示・非表示を制御できるようにする機能のことだと思う。
* [marturion](https://github.com/eldarion/marturion) 「お客様の声」を表示させるサービスを作れる。
OSX10.8にrbenvをインストールする

複数バージョンのrubyを管理するために、rbenvをインストールする。

rbenvをインストールするには、下記のものが必要です。

* gcc
* ruby-build
* rbenv

## gccのインストール

gccのインストールはXcodeから行います。
Xcodeを起動後、「Preferences」→「Downloads」と進み、Command Line Toolsをインストールします。

![](http://gyazo.com/adbf8ba40b7840680307be0bbeeb6266.png?1360982253)

![](http://gyazo.com/87e8494f624989343c48f24e97321dbe.png?1360982226)

これでgccのインストールは完了。

## ruby-buildとrbenvをインストール

こちらはhomebrewからさくっと入れます。

```
$ brew install ruby-build
$ brew install rbenv
```

## rbenvの初期設定

.zshenvに初期化の処理を設定

```
$ echo 'eval "$(rbenv init -)"' >> .zshenv
```

## rbenvからrubyをインストール

rbenvでインストール可能なバージョンをリストアップ

```
$ rbenv install list
```

ruby1.9.3-p374のインストール

```
$ rbenv install 1.9.3-p374
```

システム全体で使用するrubyのバージョンを設定

```
$ rbenv global 1.9.3-p374
$ ruby -v
ruby 1.9.3p374 (2013-01-15 revision 38858)
```

## project毎にversionを切り替える

特定のディレクトリ下で、rbenv localを実行
rbenv localを実行すると、.ruby-versionファイルが作成され、バージョンが書き込まれる

```
$ ruby -v
ruby 1.9.3p374 (2013-01-15 revision 38858)
$ cd rbenv_test
$ rbenv local 2.0.0-dev
$ ruby -v
ruby 2.0.0dev (2013-01-27 trunk 38957)
$ cat .ruby-version 
2.0.0-dev
```

## gem使った後は

gemを使った後は、rbenv rehashというおまじないを実行しないといけないらしい

```
$ rbenv rehash
```
Network.Wai.Test


Haskell版 WSGI である WAI のテストを書くためのモジュール。任意のアプリについて、テストのリクエストを作って走らせて結果を見れる。

```haskell:
% runghc
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import qualified Blaze.ByteString.Builder.Word as W
import Codec.Binary.UTF8.String as U
import Data.ByteString.Lazy as L
import qualified Network.HTTP.Types.Status as ST
import Network.Wai
import Network.Wai.Test

app :: Application
app _ = return $ ResponseBuilder status headers body
  where
    status = ST.status200
    headers = [("Content-Type", "text/plain")]
    body = W.fromWord8s . U.encode $ "わい。\n"

main :: IO ()
main = do
  res <- runSession (request req) app
  mapM_ (($ res) . (Prelude.putStrLn .)) [
    show . simpleStatus, show . simpleHeaders,
    U.decode . L.unpack . simpleBody
    ]
  return ()
  where
    req = (flip setRawPathInfo "/") defaultRequest
```

```
Status {statusCode = 200, statusMessage = "OK"}
[("Content-Type","text/plain")]
わい。
```

WAIってWSGIのポジションを狙ってる割には仕様に`Blaze`やら`ResourceT`やら`Conduit`やら巻き込んでてごついのがちょっと。パフォーマンスの都合ってのはわかるけどもう少し標準APIでなんとかならないのかな。
.tmux.confで環境ごとに動作を変える

macでコピペのためにreattach-to-user-namespaceがlinux環境で実行したらエラーになってしまうので対策してみた。
調べるとif-shellというコマンドがあるらしい。

以下でうまく動作してくれた。

```sh
if-shell "test expr '$OSTYPE' : 'darwin.*' > /dev/null" "set-option -g default-command 'reattach-to-user-namespace -l zsh'"
```
Coqで鳩の巣原理の証明

「[Software Foundations](http://proofcafe.org/sf/)」の[Logic_J](http://proofcafe.org/sf/Logic_J.html)で定式化された鳩の巣原理の証明。

```coq:pigeonhole_principle.v
(*  (* Logic_J.v の独自(<=)を使う場合はこの中身が必要 *)
Lemma lt_irrefl : forall n, ~ n < n.
Proof.
 induction n.
  intro. inversion H.

  intro. destruct IHn.
  apply Sn_le_Sm__n_le_m. apply H.
Qed.

Lemma lt_not_le: forall n m : nat, n < m -> ~ m <= n.
Proof.
 intros.
 induction H.
  apply lt_irrefl.

  intro. destruct IHle. inversion H0.
   apply le_S. apply le_n.

   rewrite <- H2 in H0. apply le_S. apply Sn_le_Sm__n_le_m. apply H0.
Qed. 
*)

Lemma aux1 : forall {X:Type} (x:X) xs l1 l2, (forall a, appears_in a (x :: xs ) -> appears_in a (l1++(x::l2))) -> ~repeats (x::xs) -> forall a, appears_in a xs -> appears_in a (l1++l2).
Proof.
 intros.
 destruct (appears_in_app l1 (x::l2) a (H a (ai_later a x xs H1))).
  apply app_appears_in. left. apply H2.

  apply app_appears_in. right.
  inversion H2.
   destruct H0. rewrite <- H4. apply RP_hd. apply H1.

   apply H4.
Qed.

Lemma aux2 : forall {X:Type} xs ys,
  (forall a:X, appears_in a xs -> appears_in a ys) ->
  ~ repeats xs -> length xs <= length ys.
Proof.
 intros X xs. induction xs; intros.
  apply O_le_n.  

  destruct (appears_in_app_split _ _ (H x (ai_here _ _))) as [l1].
  destruct H1 as [l2].
  rewrite H1. rewrite app_length. simpl. 
  rewrite <- plus_n_Sm. apply n_le_m__Sn_le_Sm. rewrite <- app_length.
  apply IHxs. (*ここで(l1++l2)についてIHを使う*)
   intros. rewrite H1 in H. apply (aux1 _ _ _ _ H H0). apply H2.
   
   intro. destruct H0. apply RP_tl. apply H2.
Qed.

Theorem pigeonhole_principle: forall {X:Type} (l1 l2:list X),
  excluded_middle ->
  (forall x, appears_in x l1 -> appears_in x l2) ->
  length l2 < length l1 ->
  repeats l1.
Proof.
 intros.
 Check(H (repeats l1)).
 destruct (H (repeats l1)); [assumption |]. (* 背理法 *)
 destruct (lt_not_le _ _ H1).
 apply aux2; [apply H0 | apply H2].
Qed.
```
PDF改変に特化したライブラリOrigamiを使ってみる


## インストール

```bash:term
$ gem install origami
```


## Hello world.

以下のコードを hello.rb などとして保存する。

```ruby:hello.rb
require "origami"

include Origami

contents = ContentStream.new
contents.write "Hello, Origami world.", :x => 0, :y => 0, :rendering => Text::Rendering::STROKE, :size => 50 

page = Page.new
page.setContents(contents)

pdf = PDF.new
pdf.append_page(page)
pdf.save("hello.pdf")
```

上記のコードを実行すると、hello.pdf がカレントディレクトリに出力されるので開くと、以下のようなPDFとなっている。

![結果](http://gyazo.com/802b9d20adb2459b9a9aade71be80be3.png)


## リンク

- <a href="http://esec-lab.sogeti.com/pages/Origami" class="exlink">Origami - Sogeti ESEC Lab</a>
- <a href="http://code.google.com/p/origami-pdf/" class="exlink">origami-pdf (Google Code)</a>
Rで行列の各数値要素の大小を濃淡で表したい場合


```r
library(lattice)

# 10 x 10 の行列を作る

my.nrow = 10
my.ncol = 10
set.seed(123)  # sample() で取得する乱数の種を与える
my.mat <- matrix(data = sample(1:100, my.nrow*my.ncol, replace = TRUE),
                 nrow = my.nrow, 
                 ncol = my.ncol)
xmin <- min(my.mat)
xmax <- max(my.mat)

#Build the plot
pal <- colorRampPalette(c("lightblue", "blue"), space = "rgb")

levelplot(my.mat, main = "10 X 10 Levelplot", xlab = "", ylab = "",
          col.regions = pal(20), cuts = 20, 
          at = seq(from = xmin, to = xmax, by = (xmax-xmin)/20) )

```

![image](https://dl.dropbox.com/u/80771782/Qiita/Rplot20130127.png)
Rで最小二乗法による線形識別

PRML図4.4のように、二乗和誤差の最小化では、適切に線形識別できないことを示します。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/czX3WeDahq/5.LeastSquaredLinearDiscriminant.png)

```r
library(MASS)
frame()
par(mfrow=c(1,2))
set.seed(0)
x<-mvrnorm(40, c(0,1), matrix(c(2, 1.9, 1.9, 2), 2))
d1<-as.data.frame(cbind(x, 1, 1, 0))
x<-mvrnorm(40, c(2,0), matrix(c(2, 1.9, 1.9, 2), 2))
d1<-rbind(d1, as.data.frame(cbind(x, 2, 0, 1)))
x<-mvrnorm(10, c(7,-7), matrix(c(.2, 0, 0, .2), 2))
d2<-rbind(d1, as.data.frame(cbind(x, 2, 0, 1)))
names(d1)<-c("x1","x2","class","t1","t2")
names(d2)<-c("x1","x2","class","t1","t2")
 
doplot<-function(d) {
    xrange<-c(-4, 8)
        yrange<-c(-8, 4)
        base<-function(x1, x2) {
                (cbind(1, x1, x2))   # w0をバイアス項とするためφ0=1
        }
        phi<-base(d$x1, d$x2)
        t<-cbind(d$t1, d$t2)
        w<-solve(t(phi) %*% phi) %*% t(phi) %*% t
        print(w)
        estimate<-function(x1, x2, index){
                (t(w) %*% t(base(x1, x2)))[index,]
        }
        x1<-seq(-4,8,.1)
        x2<-seq(-8,4,.1)
        t1<-outer(x1, x2, estimate, 1)
        t2<-outer(x1, x2, estimate, 2)
        plot(d$x1, d$x2, col=d$class,xlim=xrange,ylim=yrange)
        contour(x1,x2,t2-t1,xlim=xrange,ylim=yrange,add=T)
}
 
doplot(d1)
doplot(d2)
```
vim-seek, 新たなカーソル移動系vimプラグイン

##ノーマルモードのfに変わる現在行での検索移動プラグイン。

例えば以下のような1行があってカーソルが行の先頭のhにあるとします。
hage hige huge hege hoge

最後の単語、hogeのhに移動したい場合fだと4fhという風に入力すると思いますが
**vim-seekを使えばshoで移動できます**。

つまりvim-seekはsに続いて検索クエリとして2文字を必要とします。
これによりfの1文字と違い目的の場所にマッチしやすくなるんですね。
大文字のSはfの場合と同じく前方への検索。

ちなみにsの前に数字を入力した場合は従来のsの機能である置換入力が行われます。
よって作者いわく、プラグインを有効にした上で元々のsの機能を使いたい場合、1sあるいはclで、Sはccで代替できるだろうとの事です。

個人的にかなりヒットなプラグインです。お試しあれ。

他にもアドバンスドな使い方があるようですが、詳しくは以下のページをどうぞ。
[https://github.com/goldfeld/vim-seek](https://github.com/goldfeld/vim-seek)

[2013-01-28 18:32追記]
初めてこんなにストックされたのでテンション上がってます。
(fでの検索で、;を使うと次のマッチに飛べるのを知らなかったとか言えない…)
f検索のカスタマイズで、clever-f.vimってのもあるみたい。これも良いですね。
http://tekkoc.tumblr.com/post/39831021177/clever-f-vim-f
第7回オフラインリアルタイムどう書くの参考問題の回答例。groovy で。

オフラインリアルタイムどう書くというイベント
　http://atnd.org/events/36098
を 2/2(土) にやるんですが、それに向けて出した参考問題
　http://nabetani.sakura.ne.jp/hena/ord7xysort/
の解答例。

```groovy
class Cells
{
  static final int[][] DATA = [
    [ 4, 1, 4, 2, 1, 3 ],
    [ 7, 3, 2, 0, 5, 0 ],
    [ 2, 3, 6, 0, 6, 7 ],
    [ 6, 4, 5, 7, 5, 1 ],
    [ 3, 1, 6, 6, 2, 4 ],
    [ 6, 0, 5, 5, 5, 1 ],
  ]
  ArrayList r = 0..5;
  ArrayList c = 0..5;
  def rowSort( int key ){
    c.sort{ DATA[r[key]][it] }
  }
  def colSort( int key ){
    r.sort{ DATA[it][c[key]] }    
  }
  def firstLine(){
    c.collect{ DATA[r[0]][it] }.join('')
  }
}

def solve( input )
{
  cells = new Cells();
  input.each{ 
    if ( it < 'Z' ){
      cells.rowSort( (it as char)-( 'A' as char));
    } else {
      cells.colSort( (it as char)-( 'u' as char));
    }
  }
  cells.firstLine()
}

def test( input, expected )
{
  actual = solve( input );
  printf(
    "%s %s->%s / expected : %s\n", 
    ( actual == expected ? "OK" : "**NG**" ), 
    input, actual, expected );
}

def testAll()
{
/*0*/ test( "AvEx", "305027");
/*1*/ test( "A", "112344");
/*2*/ test( "C", "241413");
/*3*/ test( "F", "134214");
}

testAll();
```

テストデータの大半は省略。

ruby で書いたもの
　http://qiita.com/items/cd6fa6903a944a25fee6
は、データそのものを整列していたので、話としてはわかりやすい反面、計算量が多くなりやすいという問題があった。
で。
今回の実装はデータそのものは固定で持っておいて、それをどう参照するのかを整列する。
計算量は少なく、ソースコードの分量も多くはならない。

とはいえ、間接参照の感じがわかりにくく、私も悩みながら書いた。制限時間一時間ならこの方針は選ばない。

それと。
groovy の Collection.sort。groovy-jdk を見てもよくわからなかったが、 http://rosettacode.org/wiki/Sort_stability によると安定らしい。素晴らしい。
SublimeText2とSublimeLinter - Python3の構文チェック -


## 1. 新しくLinterを定義

SublimeLinter/sublimelinter/modules/python3.py

```python:python3.py
import re
from base_linter import BaseLinter, INPUT_METHOD_FILE


CONFIG = {
    'language': 'Python3',
    'executable': 'flake8',
    'test_existence_args': ['--version'],
    'lint_args': '{filename}',
    'input_method': INPUT_METHOD_FILE # 保存時のみ。リアルタイムチェックしたい場合はINPUT_METHOD_TEMP_FILEにする
}


class Linter(BaseLinter):
    def parse_errors(self, view, errors, lines, errorUnderlines, violationUnderlines, warningUnderlines, errorMessages, violationMessages, warningMessages):
        for line in errors.splitlines():
            match = re.match(r'^.+:(?P<line>\d+):(?P<offset>\d*):?\s+(?P<error>.+)', line)
            if match:
                error, line, offset = match.group('error'), match.group('line'), match.group('offset')
                if not error.startswith('E501'):
                    self.add_message(int(line), lines, '[{0}: {1}]'.format(offset, error), errorMessages)
```

好みでE501は除いています。

## 2. Python3というsyntaxを作る

```sh
cd ~/Library/Application Support/Sublime Text 2/Packages/Python
cp Python.tmLanguage Python3.tmLanguage
```

よくわからないのでnameとscopeNameだけPython3とsource.python3に変更した
Set SyntaxでPython3が現れればOK

## 3. SublimeLinterの設定ファイル

```javascript
{
    "sublimelinter_executable_map": {
        "python3": "python3版flake8へのパス"
    }
}
```

## 4. fleke8

### utf-8なファイルで非ASCIIだと死ぬ
回避法は環境変数PYTHONIOENCODINGをutf-8にし、かつLC_CTYPEをen_US.utf-8にする事。Macな人は/etc/launchd.confに書く。
影響デカくていやだという人は、スタートアップスクリプト(flake8コマンドに相当するもの)を自分で書いて、中にエンコードの設定を書けばいいでしょう。
sys.getdefaultencoding() == 'utf-8'、locale.getpreferredencoding(False) == 'utf-8'になるように内部の環境を設定すること。

### bytesがあると死ぬ

これはflake8のバグっぽいです。flake8/pyflakes.py:319あたりの

```
NUM = STR =	ELLIPSIS = ignore
```
にBYTESを追加してやったらうまくいきました。
第7回オフラインリアルタイムどう書くの参考問題の回答例。ruby で。

オフラインリアルタイムどう書くというイベント
　http://atnd.org/events/36098
を 2/2(土) にやるんですが、それに向けて出した参考問題
　http://nabetani.sakura.ne.jp/hena/ord7xysort/
の解答例。

```ruby
#!ruby

INITIAL = [
  %w( 4 1 4 2 1 3 ),
  %w( 7 3 2 0 5 0 ),
  %w( 2 3 6 0 6 7 ),
  %w( 6 4 5 7 5 1 ),
  %w( 3 1 6 6 2 4 ),
  %w( 6 0 5 5 5 1 ),
]

module Enumerable
  def stable_sort_by
    self.sort_by.with_index{ |e, ix | [ (yield e), ix] }
  end
end

def sort_cells( c, k )
  case k
  when /[u-z]/
    c.stable_sort_by{ |e| e[k.ord-'u'.ord] }
  when /[A-G]/
    c.transpose.stable_sort_by{ |e| e[k.ord-'A'.ord] }.transpose
  end
end

def solve( seq )
  c=INITIAL.map{ |i| i.dup }
  seq.chars.each{ |k|
    c=sort_cells(c,k)
  }
  c[0].join
end

DATA.each{ |line|
  ix, input, expected = line.split( /\s+/ )
  next unless expected
  actual = solve( input )
  args = [actual==expected ? "OK" : "**NG**", ix, input, actual, expected ]
  puts "%s %d : %s->%s : expected is %s" % args
}

__END__
0   AvEx    305027
1   A   112344
2   C   241413
3   F   134214
```

テストデータは大半を省略。

で。

ruby には transpose が元々あるので、転置→整列→転置 で実装するのが実装コストとしては安い。
データ量が増えてくると転置のコストが大きくなるのであまり得策ではないということはわかっておく必要がある。

ruby には安定ソートがないのが残念。
PowerShellでVim

# WindowsPwoerShellからVimを起動するスクリプト
MyDocumentsに`WindowsPowerShell`フォルダを作成
作成したフォルダ内に以下のファイルを作成

```Microsoft.PowerShell_profile.ps1
Set-Alias vim '{YOUR_PATH}\gvim.exe'
```
(YOUR_PATH)は環境に合わせて記述する
※vimのデフォルトをUTF-8にしていてpowershell上で文字化けするので、一旦gvimを起動するようにした

この状態でPowerShellを起動し、vimと入力するとgvimエディタが起動するはず

# エラーが出る場合

## ファイル {YOUR_PATH}\MyDocuments\Microsoft.PowerShell_profile.ps1 を読み込めません
```
ファイル {YOUR_PATH}\MyDocuments\Microsoft.PowerShell_profile.ps1 を読み込めません。ファイル {YOUR_PATH}\MyDocuments\Microsoft.PowerShell_profile.ps1 はデジタル署名されていません。
```

要は権限が無いと怒られている

その場合は、WindowsPowerShellを、管理者権限で起動しなおして、以下のコマンドを入力する

```
Set-ExecutionPolicy RemoteSigned
```

これで、PowerShellからvimを呼び出せるようになるはず

## スクリプトの実行がシステムで無効になっているため、ファイル {YOUR_PATH}\MyDocuments\Microsoft.PowerShell_profile.ps1 を読み込めません

このエラーはPowerShellが無効になっている場合に発生する。

コマンドプロンプトを立ち上げて、次のように入力すればOK

```
> PowerShell
> Set-ExecutionPolicy RemoteSigned
```
Control.Monad.Free


http://www.haskellforall.com/2012/06/you-could-have-invented-free-monads.dddd の内容を試しに再実装してみただけ。このエントリはわかりやすいエントリなので読んだ方がよい。

自由モナドは(値ではなく)関手をリスト的に構成したものなのだけど、これがインタプリタのモデルに奇麗にハマる。

```haskell:
% runghc
{-# LANGUAGE DeriveFunctor #-}
module Main (main) where
import Control.Monad.Free

data OreLangF a =
    Print String a
  | GetLength String (Int -> a)
  | Done                        deriving Functor
type OreLang = Free OreLangF

orePrint :: String -> OreLang ()
orePrint str = liftF $ Print str ()

oreLength :: String -> OreLang Int
oreLength str = liftF $ GetLength str id

done :: OreLang ()
done = liftF $ Done

run :: OreLang r -> IO ()
run (Free f) = case f of
  Print s next -> do
    print s
    run next
  GetLength s g -> do
    let next = g (length s)
    run next
  Done -> return ()
run (Pure _) = return ()

main :: IO ()
main = run $ do
  orePrint "ABCDE"
  i <- oreLength "123456789"
  orePrint . show $ i
  done
```

全てが美しくハマり過ぎててむしろ気持ち悪いくらい。

```
"ABCDE"
"9"
```
JRubyでMinecraftを遊ぶ

# macにCraftBukkitを入れる

1. http://wiki.bukkit.org/Main_Page の下の方からRecommentded Build (1.4.5対応)か、snapshot (1.4.7対応)をダウンロードする
2. 適当なところにcraftbukkitディレクトリを作り、ダウンロードしたjarを置く
3. `java -Xms1024M -Xmx1024M -jar craftbukkit-1.4.7-R0.1.jar -o true` みたいにして起動
4. クライアントを起動し、サーバlocalhostにJoinする

起動中のサーバはreplみたいになって、helpでコマンド一覧が見れる。say xxxでチャットに投稿するとか、time set 0で強制的に朝にするとか。

# [Purugin](https://github.com/enebo/Purugin) を入れる

プルギンはJRubyからBukkitを叩くためのライブラリ。

1. [ブログ](http://blog.enebo.com/2011/05/purugin.html)に書いてあるアドレスからダウンロードできないので、自前でコンパイルすることを考える
2. `$ git clone https://github.com/enebo/Purugin.git`
3. maven3を入れる(僕の環境には入っていたので作業なし。brew install maven)
4. `$ mvn clean package`
5. target/ 以下にjarができたっぽい

あとはブログにしたがってPuruginをセットアップする。

1. target/purugin-0.1-*.jar をBukkitのplugins/以下にコピー
2. examples/player_joined.rbをBukkitのplugins/以下にコピー
3. http://www.jruby.org/download からjruby-complete-*.jarをとってきてBukkitのルートにコピー
4. `$ java  -Xms1024M -Xmx1024M -cp jruby-complete-バージョン.jar:craftbukkit-バージョン.jar org.bukkit.craftbukkit.Main` で起動
typo でNoMethodError が発生した時に正しい名前の候補を提示する

[kaminari でありがちな間違い](http://qiita.com/items/50f97213196cd031358e)という投稿があるように、名前を typo していたり、単語を間違えて覚えてしまっているためにハマってしまうのは時間がもったいないですよね。そこで、こんな感じのを作ってます。

```
[2] pry(main)> [].unique
NoMethodError: undefined method `unique' for []:Array
from (pry):2:in `__pry__'

  Did you mean this?
	  Array#uniq
	  Array#uniq!

[3] pry(main)>
```

## 雑感

* NameError ではまだ候補を教えてくれない。
  * NameError の対応をすると binding_of_caller に依存するが、あまり気にしてない。
* 今のところ Pry でしか使えない。
  * これは Pry の中の Exception Handler を書き換えて実現しているため。
  * irb でも使いたいけど、irb に Exception Handler にあたるものがあるのか分からん。
  * Rails でも同じようことはできるはず。
* NameError 対応が終わったら Gem にする予定。
* Rails 対応は better_errors 前提で作る予定。
* 名前募集！
AngularJSでは、見た目を変更するのはCSSクラスで操作するのデフォ


# ng-class をマスターせよ
htmlタグにng-classプロパティーをつけると、AngularでBind可能なCSSクラスタグになる。

静的な書き方だと、以下のようになりますがAngularを使用する意味が無いです。

```
<div ng-class='header'>たいとる</div>
```

UIの状態を動的に変えるには、Dom要素を取ってきて、ステータスに応じて適切なクラスを判断し（余計なのがついてたらremoveしたりして）、ClassをDom要素に反映させるという手順が一般的なやり方だと思います。

しかし、Angularではモデルのステータスに応じて自動でクラスを当ててくれます。

```
<div ng-class={"item_on":item.flg, "item_off":item.flg}>アイテム名</div>
```
上記サンプルでは、item.flagがtrueかfalseで、item_onかitem_offのクラスが自動でつきます。どこにDom要素があるのか？とか、モデルがいつアップデートされたとか全く考えないでいいです。ただ、黙々とモデルがアップデートさたら適宜DomにClassが付け外しされます。

逆にUIの操作をモデル側に反映させて、Classを変えるために、今回は、mouse_enterとmouse_leaveを使いました。特定のDiv要素にmouse_enterしたら、その要素が保持しているFlagをTrueにして、mouse_leaveされるとFlagがFalseされます。FlagがTrue,Falseに変わるので、勝手にクラスが割り当てられます。

```
ng-class="gc_color='gc_normal'"
ng-mouseenter="gc_color=change_color(gg)"
ng-mouseleave="gc_color=change_color(gg)"
```

ng-classには、クラスのエイリアス(gc_color)みたいなのが割り当てられるのでそれを割り当てといて、その後のイベントでエイリアスに文字列突っ込むことで、ng-classに突っ込んだことにしてくれます。




##全部盛り

```html:
 <!DOCTYPE HTML>
 <html lang="en-US" ng-app>
 <head>
	<meta charset="UTF-8">
	<title></title>
	<script type="text/javascript" src="http://code.angularjs.org/1.0.2/angular.min.js"></script>
	<style type="text/css">

	div,body {
		padding: 0px;
		margin: 0px;
	}

	.dan{
		display: inline-block;
		width: 50px;
		height: 50px;
		margin: 0px;
		padding: 0px;
	}

	.gc_red{
		background-color: red;
		-webkit-transition-duration: 0.1s;
	}

	.gc_normal{
		background-color: white;
		-webkit-transition-duration: 3s;
	}

	</style>
<script>
	var mainCtrl = function($scope){

     var data_grid = []
     for (var dan=0; dan<20; dan++){
     	var temp_arr = [];
     	for (var retu=0; retu < 20; retu++){
     		temp_arr[retu] = [retu, false]
     	}
     	data_grid.push(temp_arr)
     }
		$scope.grid_arr = data_grid;
		console.info(data_grid)
		$scope.change_color = function(elem){
			var ret;
			if (elem.flg==true){
			  ret =  'gc_normal'
			}else{
  			ret = 'gc_red';
			}

			elem.flg = !elem.flg
			return ret

		}
	}
</script>

</head>
<body ng-controller=mainCtrl>

	<h1>team cana2c</h1>
	<h2>マウスの動きでクラス変えまくり</h2>

<div id="all">
	<div ng-repeat="tate in grid_arr" class='retu'>
		<div ng-repeat="yoko in tate" class="dan"
			ng-class="gc_color='gc_normal"
			ng-class={"white":yoko.flg, "red":!yoko.flag}
			ng-mouseenter="gc_color=change_color(yoko)"
			ng-mouseleave="gc_color=change_color(yoko)"
			> {{ yoko.flg }}</div>
	</div>
</div>

</body>
</html>
```
defvarとdefconstの違い。

はじめまして。
メモ帳の代わりとして使い始めたEmacsがそろそろ馴染んできたので、プログラミング初心者の視点で見つけた小ネタをたまに投稿していきます。
環境はWindows+gnupack Emacs 24.2です。それ以外はしらない。

-

今回のネタはタイトルのとおりです。defvarとdefconstの何が違うのか。再評価時に初期値が代入されるかどうかの違いとかはあるけど、だいたいdefvarもdefconstも好きに使えば？って感じだったので、何か明確な違いはないのかなって思ったらありました。

```cl:test-defvar.el
(defvar test-abc "abc")
(defun test-defvar (test-abc)
  (message "%s" test-abc))
```
```cl:test-defconst.el
(defconst test-xyz "xyz")
(defun test-defconst (test-xyz)
  (message "%s" test-xyz))
```
この子たちを、
`(byte-compile-file "test-defvar.el")`
    -> t

`(byte-compile-file "test-defconst.el")`
    -> nil Compile Error: Invalid lambda variable test-xyz

うわあ。コンパイル出来ない。

関数の[引数]にdefconstで定義した変数と同名のシンボルを置くとこうなります。
defconstはあくまで定数を宣言するフォームということですね。当然関数の引数に定数な名前を置くのはコードとして間違ってます。
でもelispだと定数相手にsetとかもいくらでも出来るので、定数宣言っていうのも注意書き程度のものだと思ってたけれど違った。
まさかコンパイラがエラー吐くとは思わなかった。出してもワーニングくらいだと思ってた。
それぞれ定義した関数はどっちも普通に動いてくれるので、関数はちゃんと動くのに何故かコンパイル出来ないってパターンにはまりそう。

ちなみにletで同名の局所変数をつくってもコンパイラさんに文句言われません。それもう定数じゃないじゃん。なっとくいかない。
第28回R勉強会＠東京（#TokyoR）スライド一覧


発表があったスライドをまとめました。
公開されていないもの/確認できていないものはリンクがありません。


1.  [@horihorio:Rによるやさしい統計学 第６章 2つの平均値を比較する](http://www.slideshare.net/horihorio/tokyor28textsession6)

2. [@aad34210:初心者セッション1 データフレームセットを使ってみる](http://www.slideshare.net/aad34210/tokyo-r28-1-16186883)

3. [@yokkuns:初心者セッション2 Rでピボットテーブル](http://www.slideshare.net/yokkuns/r-16187142)

4. @dichika: シリーズ前処理2013：欠測データの補完

5. @sanoche16: Rで行うブランド資産測定〜自由記述文章分析編〜

6. [@wdkz: shinyはじめました](http://www.slideshare.net/wdkz/shiny-16178934)

7. [@yokkuns: Rで階層ベイズモデル（仮）](http://www.slideshare.net/yokkuns/r-16189019)
pryでまあまあ簡単に複数行の履歴のコピー、編集を行う


## 不便
pry上で、ちょっと前に定義したメソッドを書き変えたいみたいなことがあった時、履歴を辿っていっても一行ずつしか遡れなくて不便だと思います。

例えば

```
[1] pry(main)> def foo
[1] pry(main)*   puts "hoge"
[1] pry(main)* end
```

とやってた時に履歴は ['def foo', 'puts "hoge"', 'end' ] と入ってるだけでまとめて扱えない、というか扱う方法知らない。コピーするにしてもプロンプトが邪魔だったりする。

## 便利
https://github.com/ToQoz/ruby-anything を入れて、~/.pryrcにこんな感じで書いておく。

```ruby
begin
  require 'ruby-anything'
rescue LoadError => err
  puts "Failed to load ruby-anything."
end

def pbcopy(str)
  IO.popen('pbcopy', 'r+') { |io| io.print str }
  output.puts ">>> Copy to clipboard >>>\n#{str}"
end

Pry::Commands.create_command "copy_from_history" do
  group "Clipboard"
  description "Copy to clipboard from pry's history"

  banner <<-'BANNER'
    Usage:   copy_from_history [--head|--tail]
             copy_from_history --head N
             copy_from_history --tail N

    Copy to clipboard form history with anything interface.
  BANNER

  def options(opt)
    opt.on :H, :head,   "Select from the first N hisotry", :optional_argument => true, :as => Integer
    opt.on :T, :tail,   "Select from the last N hisotry",  :optional_argument => true, :as => Integer
  end

  def process
    history = Pry.history.to_a[0..-2]
    range = case
      when opts.present?(:head)
        0..opts[:head]
      when opts.present?(:tail)
        (-opts[:tail])..-1
      else
        -100..-1
      end
    range = (-history.size)..range.max if range.min < 0 && -range.min > history.size
      
    history = history[range].map.with_index { |v, i| "#{i}: #{v}" }

    min = _anything_(history).to_i
    max = _anything_(history[min..range.max]).to_i

    pbcopy history[min..max].map { |h| h.sub(/^\d*:\s/, '') }.join("\n")
  end
end
Pry::Commands.alias_command 'cp_hist', 'copy_from_history'
```
Pryのコマンド追加、Pry::Commands.create_commandでコマンド定義してるけど、オプション取ったりしないときは、Pry::Commands.block_commandで定義するのがシンプルで良いと思う。

https://github.com/pry/pry/wiki/Custom-commands が詳しい。


で、Pry立ち上げて、

```
pry(main)[1]> copy_hist --tail 50
# --- anythingっぽい感じでcopyを開始する行を選択 ---
>
0: puts "hoge"
1: def foo           # これを選択
2:   puts "hoge"
3: end
4: exit
5: copy_from_history
# --- 1を選択 ---

# 再度anythingっぽいのが立ち上がってきて、copyする最後の行を選択
>
0: def foo
1:   puts "hoge"
2: end                # これを選択
3: exit
4: copy_from_history
# --- 2を選択 ---

>>> Copy to clipboard >>>
def foo
  puts "hoge"
end
```

```ruby
def foo
  puts "hoge"
end
```
がclipboardに入ったので、普通にpasteして、

```
[2] pry(main)> def foo
[2] pry(main)*   puts "hoge"
[2] pry(main)*   end

# エディタを開いて編集したり
[2] pry(main)> def foo
[2] pry(main)*   puts "hoge"
[2] pry(main)*   edit

# 何行目を消すとかもっと簡単な編集ならこんな感じで
# 詳しい https://github.com/pry/pry/wiki/User-Input
[2] pry(main)> def foo
[2] pry(main)*   puts "hoge"
[2] pry(main)*   amend-line 2 !
1: def foo
[2] pry(main)* end
=> nil
```

Macじゃないければ、pbcopyのところ適当にいじれば使えると思います。
【cocos2d-x】CCDictionaryの中身をすべて取り出す



cocos2d-xでモデルまわりをどうしようかなぁと。

```cpp:
	CCDictionary *dictionary = CCDictionary::create();
    dictionary->setObject(CCString::create("testObject1"),"testKey1");
    dictionary->setObject(CCString::create("testObject2"),"testKey2");
    
    CCArray *keys = dictionary->allKeys();
    CCObject *key;
    CCARRAY_FOREACH(keys, key){
        CCString *keyString = (CCString *)key;
        CCLOG("key -> %s" , keyString -> getCString() );
        CCString *objectString = (CCString *)dictionary -> objectForKey(keyString->getCString());
        CCLOG("object -> %s", objectString -> getCString() );
    }
```
んーん、`CCARRAY_FOREACH`便利だけど、変数がなぁ。。。
Rails4から--binstubsが使えなくなる件

Rails4を試そうと思って、いつもどおり`bundle install --binstubs`したら`rails s`が`rails new`扱いされてうまくいかなかった。

## 原因

[ここ](https://github.com/rails/rails/commit/009873aec89a4b843b41accf616b42b7a9917ba8)によると、以前の`scripts/rails`が`bin/rails`に移動したみたいです。

新`bin/rails`で`rails s`とか`rails c`とかのコマンドができるようになったため、いつものノリで`--binstubs`すると新`bin/rails`が上書きされてしまい、`rails s`などがうまくいかなくなるようです。

## 対策

とはいえ、`bundle exec rails s`と打つのがめんどくさいので、RVMの`after_cd_bundler`フックを活用できるように`.bundle/config`に以下の設定を追加します。

```sh:.bundle/config
BUNDLE_BIN: bin
```

これ`bin/`以下に自動でパスが通るようになりますので、`rails s`でちゃんとうごくようになります。

RVMの`after_cd_bundler`については[昔の投稿](http://qiita.com/items/a1fbac19686a8fcd2e34)を参照してください。

Rails以外のgemについては最新のBundlerを使うことで`bin/`以下に実行スクリプトを生成できるようになります。

```
$ gem install bundler --pre
$ bundle --version
Bundler version 1.3.0.pre.7
$ bundle binstubs puma
```

`bundle binstubs puma`で`bin/puma`が生成されます。
rmagick を最近の環境でもインストール出来るようにする方法

homebrew の ImageMagick 6.8.0 Q16 とかで、変な symlink で無理矢理回避するのはやめましょうという話です。

## 2013-02-04 追記

rmagick 2.13.2 がリリースされて、別の方法で対処されたので、普通にインストール出来るようになりました。

## 使い方

```ruby:Gemfile
gem 'rmagick', github: 'znz/rmagick', branch: 'pkg_config'
```

## 説明

https://github.com/znz/rmagick/commit/27ceb27990ef5d55a3768274a774bba2512bd66b
のように pkg_config を使うようにすれば解決します。
変更内容は以下のように ` && !pkg_config("MagickWand")` を追加しているだけです。 

```diff
diff --git a/ext/RMagick/extconf.rb b/ext/RMagick/extconf.rb
index 425b560..41ccdaf 100644
--- a/ext/RMagick/extconf.rb
+++ b/ext/RMagick/extconf.rb
@@ -202,7 +202,7 @@ def check_partial_imagemagick_versions()
 
 
 
-if RUBY_PLATFORM !~ /mswin|mingw/
+if RUBY_PLATFORM !~ /mswin|mingw/ && !pkg_config("MagickWand")
 
   unless have_library("MagickCore", "InitializeMagick", headers) || have_library("Magick", "InitializeMagick", headers) || have_library("Magick++","InitializeMagick",headers)
     exit_failure "Can't install RMagick #{RMAGICK_VERS}. " +
```

## まとめとか

* imagemagick 側は悪くないので、変なシンボリックリンクを作ったりしていると、将来バージョンアップした時とかに変なことになるかもしれないので、やめた方が良いですよ、という話。
* ちゃんとライブラリのファイル名が変わっても対応出来るように pkg-config という仕組みがあって、 ruby 側でも対応しているのだから使いましょう、という話。
* rmagick は開発が止まっていて新しい imagemagick の機能が使えないし、拡張ライブラリだからメモリリークとかに弱いので、 mini_magick の方がおすすめらしいという話をどこかでみました。
* rmagick を使い続けたい人は rmagick プロジェクトに参加して pull request を処理したり改善したりしていくと良いかもしれません。
* 私は徐々に mini_magick に移行する予定なのでやる気なしです。
Heroku SchedulerでAmazon S3に定期的にDBバックアップ

HerokuのアドオンであるHeroku Schedulerを使用して、
自身のAmazon S3領域に定期的にDBバックアップを取る方法についてブログ書きました。

[Peaks and Valleys | Heroku SchedulerでAmazon S3に定期的にDBバックアップ](http://psandvs.com/posts/7)
Go で iota の最初を捨てるとき

# iota を使った定義

Go の iota は連番な定義をする時に便利です。
ただ、 0 から始まるので、 _ などで 0 を捨てる時はちょっと注意。


## iota + 1 と _

例えば Status Code を const 定義するとき
SPDY は 1 から順番に始まるので以下のように定義したとします。

```go:status.go
// RstStreamStatus represents the status that led to a RST_STREAM.
type RstStreamStatus uint32

const (
	ProtocolError      RstStreamStatus = 1
	InvalidStream                      = 2
	RefusedStream                      = 3
	UnsupportedVersion                 = 4
	// cont
)
```

これは iota を用いると以下のように書けます。

```go:iota1.go
const (
	ProtocolError RstStreamStatus = iota + 1
	InvalidStream
	RefusedStream
	// cont
)
```

iota は 0 から始まるので、 +1 しているわけです。

「+1 とかなぁ。。」と思ったあなた。
_(アンダースコア) を使うと、最初の評価を捨てることができるので、
以下のようにも書けます。

```go:iota2.go
const (
	_ RstStreamStatus = iota
	ProtocolError
	InvalidStream
	RefusedStream
	// cont
)
```

ああ、なんかそれっぽい。
と思ってた時期が僕にもありました。

## godoc と _

しかし、これには重要な欠点があって。
_ だと go doc に表示されないんですよね。

### 最初を _ で捨てた場合。

![_の場合](http://pbs.twimg.com/media/BBgYizjCUAE3La4.png)


### iota + 1 の場合。

![iota+1の場合](http://pbs.twimg.com/media/BBgXS7oCQAEsPDd.png)


ということで、 ドキュメントに残したい場合は iota+1 の方を使いましょう。
neoagent1人読書会 その2


前回はmainを読んだ。今回はevent.cのna_event_loopのから。

neoagentのロジックのほとんどはevent.cにあるといっても過言ではない。

```c
void *na_event_loop (void *args)
{
    struct ev_loop *loop;
    na_env_t  *env;
    pthread_t  th_support;
    pthread_t *th_workers;

    env = (na_env_t *)args;
```

前回出てきたenvの配列の一つがargsとして渡される。それをここではenvとしている。

開発者の方曰く、envにアクセスしているというのはグローバル変数にアクセスしていると思って構わないらしい。実際にはJSONでenvを複数個渡せるみたいだが、非推奨とのこと。

```c
    if (strlen(env->fssockpath) > 0) {
        env->fsfd = na_front_server_unixsock_init(env->fssockpath, env->access_mask, env->conn_max);
    } else {
        env->fsfd = na_front_server_tcpsock_init(env->fsport, env->conn_max);
    }

    if (env->fsfd < 0) {
        NA_DIE_WITH_ERROR(NA_ERROR_INVALID_FD);
    }
```

指定されたunix domain socketのパスまたはtcpのポートでソケットを開く。

front_serverまはたfsというのはneoagentの用語で「接続してきたウェブアプリケーションのプロセス」のことを指すらしい。つまりfsfdはPHP等からのアクセスをlistenしているソケット(ファイルディスクリプタ)のこと。

```c
    na_connpool_init(env);

    ClientPool = calloc(sizeof(na_client_t), env->client_pool_max);
    memset(ClientPool, 0, sizeof(na_client_t) * env->client_pool_max);
    for (int i=0;i<env->client_pool_max;++i) {
        ClientPool[i].crbuf   = (char *)malloc(env->request_bufsize + 1);
        ClientPool[i].srbuf   = (char *)malloc(env->response_bufsize + 1);
        ClientPool[i].is_used = false;
        pthread_mutex_init(&ClientPool[i].lock_use, NULL);
    }

    if (EventQueue == NULL) {
        EventQueue = na_event_queue_create(env->conn_max);
    }
```

コネクションプール、クライアントプール、イベントキューを初期化している。これについてはとりあえずそういうもんだと思って読み飛ばすことにする。

```c
    th_workers = calloc(sizeof(pthread_t), env->worker_max);
    for (int i=0;i<env->worker_max;++i) {
        pthread_create(&th_workers[i], NULL, na_event_observer, env);
    }
```

worker_maxの数だけスレッドを起動している。workerスレッドで実行するのはna_event_observer。

```c
    if (strlen(env->stsockpath) > 0) {
        env->stfd = na_stat_server_unixsock_init(env->stsockpath, env->access_mask);
    } else {
        env->stfd = na_stat_server_tcpsock_init(env->stport);
    }
    pthread_create(&th_support, NULL, na_support_loop, env);
```

同じくサポート用のスレッドを起動。これはneoagentの状態をモニタリングするために外部と通信するためのスレッドなので深くは触れない。

```c
    // for assign connection from connpool directional-ramdomly
    srand(time(NULL));

    pthread_mutex_lock(&env->lock_loop);
    loop = na_event_loop_create(env->event_model);
    pthread_mutex_unlock(&env->lock_loop);
    env->fs_watcher.data = env;
    ev_io_init(&env->fs_watcher, na_front_server_callback, env->fsfd, EV_READ);
    ev_io_start(EV_A_ &env->fs_watcher);
    ev_loop(EV_A_ 0);
```

ここでイベントループを作っている。libevのことを知らないと何やっているのが分からないが、fsfdのREADが走るとna_front_server_callbackという関数が実行されるという意味。

ev_loopは無限ループなので基本的にその下の処理に入ることはないと考えていい。

その下の処理。

```c
    for (int i=0;i<env->client_pool_max;++i) {
        NA_FREE(ClientPool[i].crbuf);
        NA_FREE(ClientPool[i].srbuf);
        pthread_mutex_destroy(&ClientPool[i].lock_use);
    }
    NA_FREE(ClientPool);
    na_event_queue_destroy(EventQueue);

    return NULL;
}
```

解放処理だけ。

今回はここまで。

この処理がやっていた主なことは、na_observerを実行するスレッドを作ったことと、ウェブアプリケーションから入力があった時にna_front_server_callbackが呼ばれるようなイベントループを作ったこと。

次はna_front_server_callbackを見ていくつもり。
cocos2dで、iPhone5と非レチナで同一の解像度にする

cocos2dで解像度で注意したいこと。iPhone5レチナか、レチナ以外iPhoneで、画面に表示される領域が異なる。 レチナ：640x960、非レチナ：320x480 レチナ以外iPhoneに合わせるのであれば、以下のL3にNOを代入するコードをいれれば良い。

```objc:CCDirectorIOS.m
-(BOOL) enableRetinaDisplay:(BOOL)enabled
{
    enabled = NO;
    
    // Already enabled ?
    if( enabled && __ccContentScaleFactor == 2 )
		return YES;
 
	// Already disabled
	if( ! enabled && __ccContentScaleFactor == 1 )
		return YES;
 
	// setContentScaleFactor is not supported
	if (! [view_ respondsToSelector:@selector(setContentScaleFactor:)])
		return NO;
 
	// SD device
	if ([[UIScreen mainScreen] scale] == 1.0)
		return NO;
 
	float newScale = enabled ? 2 : 1;
	[self setContentScaleFactor:newScale];
 
	// Load Hi-Res FPS label
	[self createStatsLabel];
 
	return YES;
}
```

まぁこの方法だと、レチナ解像度でゲーム作れないけど、手っ取り早い。
もっとうまく切り替える方法あれば、知りたい。
nginxの挙動を確認するためのプログラムを書く

```perl:t/Util.pm
package t:Util
use strict;
use warnings;
use Test::More;
use Test::TCP;
use Proc::Guard qw(proc_guard);
use LWP::UserAgent;

sub nginx_start {
    my ($class, $conf_name) = @_;
    $conf_name ||= "basic.nginx.conf";


    my $pwd = `pwd`;
    chomp $pwd;
    my $nginx_bin = $ENV{'NGINX_BIN'}
        or die "please specify ENV NGINX_BIN";

    my $proc = proc_guard($nginx_bin, 
        '-g', 'daemon off;', 
        '-p', $pwd . '/t/ngx_base/',
        '-c', $pwd . "/t/ngx_base/etc/$conf_name"
    );
    Test::TCP::wait_port(8000);
    return $proc;
}
```

nginxを起動するときに、-g "daemon off;"するのと、-pと-cを指定するのがポイント。

port番号をランダムにするのはけっこう難しくて、さらに頑張るなら、Test::TCP::empty_port()で空いているポート番号を調べたのちに、設定ファイルを一時ファイルに置換し、それをもとに起動してやればよいが、ふつうにnginxを起動させられる設定ファイルにならないのがいけてない。
デフォルトオプションの書き方

```php:default_option.php
<?php

function hoge(array $option = array())
{
  $default = array('foo' => 'aaa');
  $options += $default;
   var_dump($options);
}

hoge();
hoge(array('foo' => 'bar', 'baz' => 'boo'));
```

```
$php default_option.php
 array(1) {
  ["foo"]=>
  string(3) "aaa"
}
array(2) {
  ["foo"]=>
  string(3) "bar"
  ["baz"]=>
  string(3) "boo"
}
```

+演算子で配列を結合すると、先頭のものが優先されるので、デフォルトオプションのときによく使われるようだ。

[配列演算子](http://php.net/manual/ja/language.operators.array.php)というようだ

>   +演算子は、右側の配列を左側の配列に追加したものを返します。 両方の配列に存在するキーについては左側の配列の要素が優先され、 右側の配列にあった同じキーの要素は無視されます。
count()の挙動

```php:count.php
<?php
 
function echoCount($val)
{
    var_dump($val);
    echo "=> ";
    echo count($val);
    echo "\n";
}
 
echoCount("a");
echoCount("1");
echoCount("0");
echoCount(1);
echoCount(0);
echoCount(true);
echoCount(false);
```

として実行すると、

```shell

$ php count.php
string(1) "a"
=> 1
string(1) "1"
=> 1
string(1) "0"
=> 1
int(1)
=> 1
int(0)
=> 1
bool(true)
=> 1
bool(false)
=> 1
```

こんな感じになる。

[phpのマニュアル|count関数](http://php.net/manual/ja/function.count.php)によると、

> varに含まれる要素の数を返します。 もし var が配列もしくは Countable インターフェイスを実装したオブジェクトではない場合、 1 が返されます。 ひとつ例外があり、var が NULL の場合、 0 が返されます。

とのこと。intやboolや文字列は、配列ではないので、1が返されるようだ。

なので、

```php
 if ( is_array($var) && count($var) > 0 ) {
    // ....
 }
```

みたいにするのがよさげ。


PHPおそろしい子っ!!
既にorigin/masterにmergeの済んだリモートブランチを一気に削除する


```shell
$ git fetch --prune
$ git branch -r --merged origin/master  | grep -v origin/master | sed -e 's/origin\//:/' | xargs echo git push origin
```

すると削除用のコマンドが出力されるので、本当に削除しても大丈夫そうか、いちどコマンドを見て、コピペしつつ、実行してやる。

`git fetch --prune`は、`git branch -r`の結果が、remoteにあるoriginと同期されておらず、正しい結果にならないことがあるため。

`git branch --remote`も1.8.0だとあるようだが、少しバージョンが低いと、--remoteがないようで、-rを使う方がポータビリティが高いようだ。
マルチバイト文字列を適当なバイト数でカットしても最後の文字を化けさせない

``` ruby
"あいうえお"[0,10].slice(/\A.{0,}/m) # => あいう
```

[0,10]がバイトで処理される1.8.7において、です。
1.9以降は（基本）文字数で処理されます。
VSSの作業ディレクトリを一括設定するにはss.iniを編集

Visual Source Safe 2005で
サブプロジェクトに対して作業ディレクトリを設定してしまうと、
親プロジェクトの作業ディレクトリを設定しても下層には反映されず、
思わぬトラブルを巻き起こします。

これをリセットなり一括設定なりしたいところですが、
調べてみたところ GUI上からは設定できず ss.ini ファイルを直接編集するしかないようです。

# 手順

これでうまくいきました。

1. VSSを終了する。
2. ss.iniファイルのバックアップをとる(念のため)
3. ss.iniから、下記の作業ディレクトリの設定をごっそり削除する
4. VSSを起動し、作業ディレクトリを設定し直す

# ss.ini ファイルの場所

```txt:
[VSSデータベースフォルダ]\users\[自分のユーザーID]\ss.ini
```

# 変更すべき箇所

VSS上のパスと、作業ディレクトリの関連は、こういう書式で書かれているので、ごっそり削除します。

```ini:ss.ini
[$/Spelling/American]
Dir (PC) = C:\DEV\SPELL\ENGLISH
```

# 参考

* [Visual Source Safe 2005(VSS2005)でプロジェクトに設定した作業フォルダをクリアする方法](http://social.msdn.microsoft.com/Forums/ja/vsgeneralja/thread/e60051f0-6459-4689-8819-d29da8459b4b)
GroupedのUITableViewCellの幅を変える

UITableViewCellのサブクラスを作って、↓のような感じでオーバライド
 
```Objective-C
- (void)setFrame:(CGRect)frame
{
    frame.origin.x += 10.0f;
    frame.size.width -= 2 * 10.0f;
    [super setFrame:frame];
}
```
Rails TextHelperまとめ

Rails APIにのっているのを日本語でまとめただけ

## concat

```ruby:
<% concat "foo" %>
# == <%= "foo" %>
```

View側でロジック書きながら、画面にも反映させたい場合に使えるかも。

```ruby
<%
  if @current_user
    concat current_user.name
  else
    concat "Guest"
  end
%>
```

使ったことはない。

## cycle & current_cycle

非常によく使う。

コピペ

```ruby
<% @items.each do |item| %>
  <div style="background-color:<%= cycle("red","white","blue") %>">
    <span style="background-color:<%= current_cycle %>"><%= item %></span>
  </div>
<% end %>
```

これ使わないとこうなるはず(動くかは知らない)

```ruby
<% colors = %w(red white blue) %>
<% @items.each_with_index do |item, i| %>
  <% color = colors[i % 3] %>
  <div style="background-color:<%= color %>">
    <span style="background-color:<%= color %>"><%= item %></span>
  </div>
<% end %>
```

`reset_cycle`もあるようだ。

## excerpt

使う頻度は低い。

でも、知らないと困るケース結構ある

2つ目の引数の文字が最初に見つかったところから、`radius`文字分だけ取り出し、
それ以外の部分は `omission`(デフォルトは`...`)にする

```ruby
<%= excerpt("あいうえおかきくけこさしすせそ", "く", radius: 3) %>
# => "...おかきくけこさ..."
```

この場合は、最初に`く`が見つかった箇所の前後3文字を取り出してそれ以外は`...`にしている。

`highlight`と組み合わせて次のように使えるかもしれない。

検索された文字を中心として30文字取り出し、検索文字をハイライト表示させる例

```ruby
<% str =<<-EOS
吾輩は猫である。名前はまだ無い。
どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。
しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。
EOS
%>
<%= highlight(excerpt(str, "薄暗い", radius: 30, omission: ''), "薄暗い") %>
```
> *吾輩は猫である* より

## highlight

文字列中の指定された文字を強調表示させる。

デフォルトの強調表示させるタグは`<strong class="highlight">...</strong>`

またもやコピペ(非常にわかりやすい)

```ruby
highlight('You searched for: rails', 'rails', :highlighter => '<a href="search?q=\1">\1</a>')
# => You searched for: <a href="search?q=rails">rails</a>
```

なお、2つ目の引数は配列が指定可能。

```ruby
highlight('You searched for: rails', ['for', 'rails'], :highlighter => '<em>\1</em>')
# => You searched <em>for</em>: <em>rails</em>
```

## truncate

有名人なはず。

文字列の先頭から`length`分だけ切り出してくれる。

`omission` + 切り出した文字列 = lengthとなるように調整するため、
若干の注意が必要。

```ruby
<%= truncate("あいうえおかきくけこ", length: 5) %>
# あい...
<%= truncate("あいうえおかきくけこ", length: 9) %>
# あいうえおか...
<%= truncate("あいうえおかきくけこ", length: 10) %>
# あいうえおかきくけこ
```

デフォルトの`omission`は`...`(3文字)であるので、
length: 5とした場合は、元の文字列は2文字しか表示されないことになる。

## word_wrap

文字列中の指定された位置(`line_width`)以降に出現する空白文字の箇所に`\n`をいれてくれる

日本語圏だと使えない子のようにも見える

```ruby
<%= word_wrap("あいうえお かきくけこ　さしすせそ", line_width: 5 %>
# =>
あいうえお\n
かきくけこ　さしすせそ
```
※line_widthを指定しない場合は 80文字
※line_width文字目以降に出現する`\s`なので、上記例の場合は line_width: 4にしても同じ結果になる
※かくくけこ[全角空白]さしすせそ

*、。全角空白* でも`\n`が入るようになれば、あるいは使えるかもしれない。
Viewに複合で拡縮アフィン変換をかけてるときの拡縮率を知るには

行列の a, d 要素を取得すればよさそう。

![CGAffineTransform matrix](https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGAffineTransform/Art/equation01_2x.png)

具体的にはCGAffineTransform構造体の a, d メンバ。
a は x方向(幅)の拡縮率、d は y方向(高さ)の拡縮率。

```objc
struct CGAffineTransform {
   CGFloat a;
   CGFloat b;
   CGFloat c;
   CGFloat d;
   CGFloat tx;
   CGFloat ty;
};
typedef struct CGAffineTransform CGAffineTransform;
```

```objc
self.myView.transform = CGAffineTransformConcat(self.myView.transform, CGAffineTransformMakeScale(scaleX, scaleY));
NSLog(@"sx=%f, sy=%f", self.myView.transform.a, self.myView.transform.d);
```

なお、 a, d メンバが負の値のときは上下または左右が反転している状態。
そして世界はOptionにWrapされた

ScalaとPlay frameworkの話。

Scalaに用意されたOptionクラスと、その実装のSomeがどれほど便利なのか、
体感するには、引数のバリデーションが適しているのではないでしょうか。

Play frameworkでは、POSTとしてJSONを受け取ることが簡単にでき、その
パーサーもキーを指定するだけでOptionでラップされた値を取得出来ます。

Optionでラップされている点が味噌で、Javaなら面倒だった引数のチェックを
簡単にすることができます。

例えば、引数からオブジェクトを作りたい場合はこんな感じ。

```scala:Application.scala
 def notification = Action(parse.json){ request =>
 	val optText = request.body.\("text").asOpt[String]
 	val optId = request.body.\("id").asOpt[String]
 	val optUser = request.body.\("user").asOpt[String]

 	val tweet = for(text <- optText; id <- optId; user <- optUser) yield new Tweet(text,id,user)
  }
```
スゴイ！Optionスゴイよ！！（あと、forとかyieldも）

ちなみに、yieldでオブジェクトを作るとOptionでラップされた物が
帰ってきます。

という訳で、Optionの動きをおさらいしときます。

恒例のサンプルのクラスは、引数に名前と年齢を受け取って
出力するもの。

ちなみに、出力部分はScala2.10の式展開を使ってます。
それ以前の人は、適宜読み替えて欲しいです。

```scala:Output.scala
scala> class Output(name:String,age:Int){
     | def o = println(s"hey i am ${name}, and i'm ${age} old")
     | }
defined class Output
```

Someを使ってオブジェクトの作成を行う。

```scala:create.scala
scala> val name = Some("numa08")
name: Some[String] = Some(numa08)

scala> val age = Some(24)
age: Some[Int] = Some(24)
```

forとyieldを使ってOutputオブジェクトの作成。
帰ってきた値はOptionにラップされた物なので、例えばforeachで処理をする。

```scala:exam1.scala
cala> val out = for(n <- name; a <- age) yield new Output(n,a)
out: Option[Output] = Some(Output@33264613)

scala> out.foreach(o => o.o)
hey i am numa08, and i'm 24 ol
```

引数のいずれかがNoneの場合、for文はNoneを帰します。

なので、foreachしても何も起こらない。

```scala:exam2.scala
scala> val out =for(n <- noname; a <- age) yield new Output(n,a)
out: Option[Output] = None

scala> out.foreach(o => o.o)

```

値がNullの場合の考慮を省くことができているので、コードが
結構スッキリしてくると思います。

そんなわけで、Scalaは便利です。正直、Javaに帰りたくなくなります。

それはそれで辛い。
Windowsを経由してssh接続する

例えばなんですが。

顧客のサーバがありまして、そこに繋ぐにはVPNを張らなくちゃいけなくて、そのVPNを張るにはWindowsからじゃないとダメ（VPNのセッションを確立するプログラムが.exeとか）で、でも普段はWindows使わずにUbuntuとかで開発してて。

こんな場合、いちいちUbuntuとWindowsを行ったり来たりするの面倒ですよね。例えばとか言いながら今そんな状態で、今まではSynergyで行ったり来たりしてたのですが、それだと僕しか使えませんでした。

なので、「VPNを張った状態のWindowsを経由して、Ubuntuからssh接続する」をやってみた。

まず下記の要件とします。

|各マシン                              |IPアドレス     |
|:---------------------------------------|:--------------|
|Ubuntuマシン（自分の開発に使ってるやつ）|192.168.10.1/24|
|Windowsマシン（こいつを経由する）       |192.168.10.2/24|
|サーバ（最終的にこいつに繋ぐ）          |192.168.20.1/24|

VPNを張るのはそれぞれのソフトのやり方があると思うので、それは省略し、まずはWindowsを経由できるように、Windowsマシンにプロキシをインストールします。使用するのはSquidで、http://uguisu.skr.jp/Windows/squid_win_tips.html みたいな感じでインストール。

なお、aclをsquid.confに記述する箇所がありますが、上記の例では192.168.10.0/24とします。VPNが張られ、Squidが起動していればWindowsの方は準備OKです。

次にUbuntuからsshコマンドで接続するのですが、プロキシを経由するためにconnectコマンドをインストールします。

```
$ sudo apt-get install connect-proxy
```

これでconnectコマンドがインストールされました。次に~/.ssh/configに下記を追記します。

```
Host server-with-proxy
    User takkkun
    ProxyCommand connect -H 192.168.10.2:3128 192.168.20.1 22
```

ProxyCommandでどこを経由し、どこに繋ぐかを指定する感じですね。Hオプションでプロキシを。今回はWindowsマシンなので、そのIPアドレスである192.168.10.2と、Squidがデフォルトで使用するポート番号である3128を指定（squid.confで変更してたらもちろんここは変更）。そして最終的に接続したいサーバのIPアドレスとポート番号を指定って具合です。

これで後は:

```
$ ssh server-with-proxy
```

とするだけで、Windowsにインストールしたプロキシを経由し、VPNのトンネルを抜けてサーバに接続することが出来ます。めでたし。
テンプレートなファクトリ関数

ファクトリクラスのファクトリ関数をテンプレートにしたら見た目がイケてる感じになるのでは、と目論んだ結果。

```cpp
#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
#include <type_traits>

struct Magica {
    virtual std::string call() const = 0;
};

struct Homura : Magica {
    std::string call() const { return "ﾏﾄﾞｶｧ!"; }
};

struct Madoka : Magica {
    std::string call() const { return "ﾎﾑﾗﾁｬﾝ!"; }
};

struct Incubator {
    template <
        typename T,
        typename C = typename std::enable_if<std::is_base_of<Magica, T>::value>::type>
    static std::unique_ptr<Magica> create() {
        return std::unique_ptr<Magica>{new T{}};
    }
};

int main() {
    const auto girls = {Incubator::create<Homura>(), Incubator::create<Madoka>()};
    
    std::for_each(girls.begin(), girls.end(), [](const std::unique_ptr<Magica>& girl) {
        std::cout << (*girl).call() << std::endl;
    });
}
```

テンプレートのデフォルト引数はすごい、という結論に至りました。
null と undefined の違い


`null` は何かを返すべきですが、返すものがない場合。意図的に使われるものです。

`undefined` はただ何もない状態。定義されていない変数、オブジェクトの定義されていないプロパティ、何も `return` しない関数の返り値などは全て `undefined` です。

## typeof の結果

```js
console.log(typeof null);
// object

console.log(typeof undefined);
// undefined
```

## undefined という変数を定義する

グローバルより内側のスコープでは `undefined` という変数を定義できてしまいます。`null` ではそういうことはありません。

```js
var foo;
console.log(foo === undefined);
// true
console.log(foo == null);
// true

(function () {
  var undefined = 12;
  console.log(undefined);
  // 12
  console.log(foo === undefined);
  // false
  console.log(foo == null);
  // true
  console.log(typeof foo === 'undefined');
  // true
})();
```

## それぞれの判別方法

`undefined` そのものかどうかを知りたい場合は `typeof foo === 'undefined'`。

`null` そのものかどうかを知りたい場合は `foo === null`。

どちらかかどうかを知りたい場合は `foo == null` ですかね。以下に示すように `null` と `undefined` 以外では `false` になります。

```js
console.log(undefined == null);
// true
console.log(false == null);
// false
console.log(0 == null);
// false
console.log(NaN == null);
// false
```
Scoreの小数点以下を切り捨てる


[[Solr-user] Re: How to round solr score ?](http://grokbase.com/t/lucene/solr-user/131jzcg3q2/how-to-round-solr-score)

に、方法が記載してあったのでメモ。

```
http://localhost:8983/solr/select/?defType=func&q=rint(query({!v="text:term"}))&fl=score,*&sort=score
```

[FunctionQuery](http://wiki.apache.org/solr/FunctionQuery)

> ceil - ceiling, rounds up to an integer
> floor - rounds down to an integer
> rint - rounds to the nearest integer


使い方は、

> Using FunctionQuery
> 
> There are a few ways to use FunctionQuery from Solr's HTTP interface:
> 
>    Embed a FunctionQuery in a regular query expressed in SolrQuerySyntax via the _val_ hook
>
>    Invoke the FunctionQParserPlugin via LocalParams syntax, e.g. q={!func}log(foo)
>
>    Set func as the default query type, e.g. defType=func&q=log(foo)
>
>    Use a parameter that has an explicit type of FunctionQuery, such as DisMaxQParserPlugin's bf (boost function) parameter, or extended dismax boost parameter (multiplicative boost).
>
>        NOTE: the bf parameter actually takes a list of function queries separated by whitespace and each with an optional boost. Make sure to eliminate any internal whitespace in single function queries when using bf.
>
>        Example: q=foo&bf="ord(popularity)^0.5 recip(rord(price),1,1000,1000)^0.3" 
>
> 　

となっており、自分がやりたいこともできそうな、できないような…。
IE9以降でwebfontが文字化けする原因と解決策


クロスドメインのセキュリティ・ポリシーが変更されたみたいなそんなことが原因らしい。

fontフォルダの直下に以下の`.htaccess`をぶっこめばおｋ

    <FilesMatch "\.(ttf|otf|eot|woff)$">
      <IfModule mod_headers.c>
        Header set Access-Control-Allow-Origin "*"
      </IfModule>
    </FilesMatch>

参考:[CSS3117 in IE9 and IE10: @font-face failed cross-origin request errors](http://www.stormconsultancy.co.uk/blog/development/tips-tricks/css3117-in-ie9-and-ie10-font-face-failed-cross-origin-request-errors/)
VirtualBoxでWindows failed to start.  Status: 0xc0000225がでたときの対処

Mac OS 10.8.2にVitrualBoxを使ってWindowsをインストールしようとしたけどエラー

```
Windows failed to start.

Status: 0xc0000225
```

いったんVMの電源を落として設定から
チップセットをPIIX3からICH9
IO APICを有効化にチェック