OmniAICreator/Qiita-1.07M huggingface dataset:
Rで正則化最小二乗法

PRML 3.1.4に記載されているように、重みベクトルの二乗和を正則化項とした誤差関数を最小化するような、線形基底関数モデル（多項式基底）の係数を求め、正則化パラメータの値によってモデルの過学習が抑制される様子を図にします。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/QXJ8EQzduS/3.WeightDecay.png)

```r
set.seed(0)
x<-seq(0.05,1,0.1)
t<-sin(2*pi*x)+rnorm(10,0,0.5)
t<-matrix(t,nrow=length(t))
M<-10
base<-function(m,x) {
        r<-x^m                          #多項式基底の場合
#        r<-exp(-(x-(m-1)/(M-2))^2/(2*0.2^2))    #ガウス基底の場合
        r[m == 0]<-1                    # w0をバイアス項とするためφ0=1
        r
}
makePhi<-function(M) {
        A <- matrix(nrow=length(x),ncol=M)
        for (i in 1:length(x)) {
                for (j in 0:(M-1)) {
                        A[i,1+j] <- base(j,x[i])
                }
        }
        A
}
xrange<-c(-0.5,1.5)
yrange<-c(-2,2)
plot(x,t,xlim=xrange,ylim=yrange)
phi<-makePhi(M)
lambdabase<-10:0
for (ll in lambdabase) {
        lambda<-10^(-ll*2)
        w<-solve(lambda * diag(M) + t(phi) %*% phi) %*% t(phi) %*% t
        print(w)
        estimate<-function(x){
                i <- 0:(M-1)
                (sapply(x,function(xn){ (sum(w * base(i, xn))) } )) # (w[1]+w[2]*base(1,x)+w[3]*base(2,x)...)
        }
        par(new=T)
        curve(estimate,type="l",xlim=xrange,ylim=yrange,col=ll+1)
}
legend("topleft",legend=10^(-lambdabase*2),col=lambdabase+1,lty=1,cex=0.6)
```
UITextFieldでclearButtonをカスタマイズする

## 入力中に表示されるclearButton（×マーク）をカスタマイズ

UITextFieldのrightViewにUIButtonを設定し、
rightViewModeにUITextFieldViewModeWhileEditingをすれば、
デフォルトの動作を再現できるハズだが、挙動が怪しい。

どうやら、iOSのバグみたい。
以下、デフォルトの動作に近づける方法。

```objective-c
- (void)setup
{
  UIButton *clearButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
  self.rightView = clearButton;
  [clearButton addTarget:self action:@selector(clearButtonPushed:) forControlEvents:UIControlEventTouchUpInside];
  [self addTarget:self action:@selector(onEditing:) forControlEvents:UIControlEventEditingChanged];
}

- (void)clearButtonPushed:(id)sender
{
  self.text = @"";
  self.rightViewMode = UITextFieldViewModeNever;
}

- (void)onEditing:(id)sender
{
  if(![self.text isEqualToString:@""]){
    self.rightViewMode = UITextFieldViewModeAlways;
  }else{
    self.rightViewMode = UITextFieldViewModeNever;
  }
}
```

## 参考リンク
[UITextField rightView “WhileEditing” problem](http://stackoverflow.com/questions/7165642/uitextfield-rightview-whileediting-problem)
IE6,7,8でも画像のlabelを有効にする

```html
<label for="rb"><img src="img.gif" alt=""></label>
<input type="radio" id="rb">
```
というHTMLがあったとき、
通常であればlabelをクリックしてもラジオボタンを有効になりますが、
IE6、IE7、IE8では画像のラベルは有効になりません。

そこで、JavaScriptを使ってlabelをクリックしたときにfor属性を取得して、
それに対応するid属性をもつinput要素のフォーカスをあてて、
クリックイベントを発火させます。

```javascript
$('label').on('click',function () {
  $('#' + $(this).attr('for')).focus().click();
 });
```

実際に利用する際には画像のラベルが有効なブラウザだけにあててあげる必要があります。
でないとcheckboxなどで二回クリックが起こってチェック出来なくなってしまいますので注意してください。
SilexでPage Forwarding

Silexでのforwardの方法は [ドキュメント](http://silex.sensiolabs.org/doc/usage.html#forwards)にも書かれており、

```php:forward.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;

$app->get('/', function () use($app) {
    // redirect to /hello
    $subRequest = Request::create('/hello', 'GET');

    return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
});
```

のように、Silex\Application::handle()を使用するのですが、
これ毎回書くの面倒ですよね。

ということで、こんなtraitを用意し、

```php:RequestSupports.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;

trait RequestSupports {
    public function forward($uri, $method = null) {
        if (!isset($method)) {
            $method = $this['request']->getMethod();
        }
        
        return $this->handle(
            Request::create($uri, $method), 
            HttpKernelInterface::SUB_REQUEST
        );
    }
}
```

Applicationにmix-inしてあげれば、

```php:MyApplication.php
class MyApplication extends \Silex\Application {
    use RequestSupports;
}
```

```php:usage.php
$app->forward('/');
```

と、簡潔に書くことができるようになります。

traitを使用するため、残念ながら、5.4以降限定となってはしまいますが....。
オフラインリアルタイムどう書く第7回の参考問題をRubyで解く

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord7xysort/

```ruby
BASE = [
  [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,],
]
ROWS='ABCDEF'
COLS='uvwxyz'

def transpose(ls)
  ld = []
  ls.each_with_index do |row, y|
    row.each_with_index do |val, x|
      ld[x] = [] unless ld[x]
      ld[x][y] = val
    end
  end
  ld
end

def solve(q)
  list = BASE
  q.split('').each do |c|
    list = transpose(list) if ROWS.index(c)
    pos = (ROWS.index(c) or COLS.index(c))
    i = 0
    list = list.sort_by{|e| [e[pos], i+=1]}
    list = transpose(list) if ROWS.index(c)
  end
  list.first.join
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print "#{no}\t#{ans}\t"
  puts ans == a ? 'o' : 'x'
end
__END__
0	AvEx	305027
1	A	112344
2	C	241413
```
homebrew の imagemagick 6.8.0-10 と rmagick 2.13.1 の組み合わせでエラー

homebrew の imagemagick 6.8.0-10 と rmagick 2.13.1 の組み合わせでエラーが発生する。

```bash
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

        /Users/kohgami/.rvm/rubies/ruby-1.9.3-p362/bin/ruby extconf.rb 
checking for Ruby version >= 1.8.5... yes
extconf.rb:128: Use RbConfig instead of obsolete and deprecated Config.
checking for /usr/local/bin/gcc-4.2... yes
checking for Magick-config... yes

Warning: Found more than one ImageMagick installation. This could cause problems at runtime.
         /usr/local/bin/Magick-config reports version 6.8.0 Q16 is installed in /usr/local/Cellar/imagemagick/6.8.0-10
         /usr/local/Cellar/imagemagick/6.8.0-10/bin/Magick-config reports version 6.8.0 Q16 is installed in /usr/local/Cellar/imagemagick/6.8.0-10
Using 6.8.0 Q16 from /usr/local/Cellar/imagemagick/6.8.0-10.

checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... yes
checking for InitializeMagick() in -lMagickCore... no
checking for InitializeMagick() in -lMagick... no
checking for InitializeMagick() in -lMagick++... no
Can't install RMagick 2.13.1. Can't find the ImageMagick library or one of the dependent libraries. Check the mkmf.log file for more detailed information.

```

ライブラリが見えないらしいので、シンボリックリンクを貼る。

```bash
$ cd /usr/local/lib
$ ln -s libMagick++-Q16.7.dylib libMagick++.dylib
$ ln -s libMagickCore-Q16.7.dylib libMagickCore.dylib
$ ln -s libMagickWand-Q16.7.dylib libMagickWand.dylib
```

リトライ

```bash
$ bundle install
```

無事成功。
他に対応方法あったら教えてください。。。
RequireJSで循環参照


[ここ](http://requirejs.org/docs/api.html#circular)を参考に、循環参照を解決する方法を記述する。

A.jsとB.jsがそれぞれのモジュールを相互に使いたい場合、以下のように、requireを使って、必要な時にモジュールを取得すれば良い。
そうしなければ、どちらかのモジュールは *undefined* になる。

```Javascript:A.js
define('A',['require', 'B'], function(require, B) {
	function A() {
		var B = require("B");
		this.name = "A";
		this.b = new B();
	}
	return A;
});
```

```Javascript:B.js
define('B',['require', 'A'], function(require, A) {
	function B() {
		var A = require("A");
		this.name = "B";
		this.a = new A();
	}
	return B;
});
```
tarで一時ファイルを作成しないで展開。

毎回、忘れるのでメモ

ディレクトリのバックアップ

```sh:qiita.sh
$ tar czvf - ~/hoge|tar xzvf - 
``` 

sshでリモートのディレクトリ以下をローカル（カレントディレクトリ）に持ってくる。

```sh:qiita.sh
$ ssh hoge@exsample.com "tar czvf - -C /hoge/piyo/ ."|tar xzvf -
``` 
-Cでディレクトリ移動。
`I18n.locale=` はカレントスレッドのみの変更

```ruby
pry(main)> show-method I18n.locale=

    def #{method}=(value)
      config.#{method} = (value)
    end

pry(main)> show-method I18n.config

    def config
      Thread.current[:i18n_config] ||= I18n::Config.new
    end
```

## see also

* http://stackoverflow.com/questions/9263036/why-locale-setting-in-rails-acts-as-global-when-using-thin
フォトライブラリにUImageをグループ名を指定して保存

UIImageWriteToSavedPhotosAlbumではフォルダ（グループ？）の中に画像を入れることができません。
しかしアプリによっては任意のフォルダに画像を保存しているものがあります。
あれば便利程度の機能ではありますが、アプリとしての品質があがるので、必要であれば実装したいですね。
今回はそれをやります。


今回はgithubにコードを用意しました
https://github.com/Ushio/PhotoLibraryUtility

カテゴリとして用意しましたので
ALAssetsLibrary+PhotoLibraryUtility.h
ALAssetsLibrary+PhotoLibraryUtility.m
をプロジェクトに追加すればすぐ使えるはずです。

挙動は、
・指定した名前のフォルダが存在していなかったら新しく作り、そこに保存
・存在していたらそこに追加
という単純なものです。

注意点
・当然のように非同期であること
・ユーザーがアプリに写真へのアクセスを拒否されていたりなど、メソッドが失敗することがある
といったところでしょうか。

ライセンスは緩いものを選びましたが、こんな小さなプログラムでライセンスを主張するつもりは毛頭ありません。
また必要に応じてそのプロジェクト似合わせたカスタマイズをお勧めします。（JPGの圧縮パラメータとか）
Railsのscaffoldでherokuにとりあえずデプロイまで12ステップ

##Railsのscaffoldでherokuにとりあえずデプロイまで12ステップ
いろいろと時間がかかってしまったので、
忘れないようにメモとして手順を残しておく。

###1.Railsのプロジェクトを新しく作る
```
$ rails new kusubook
```
###2.scaffoldでテーブルを操作する関連ファイルをまとめて作成
```
$ rails generate scaffold book isbn:string title:string price:integer 
publish:string published:date cd:boolean
```
###3.マイグレーションファイル実行
```
$ rake db:migrate
```
###4.ローカルサーバーを立ち上げWEBRickで確認
URLはhttp://localhost:3000/

```
$ rails server
```

###5.Rakefile に require 'rake/dsl_definition' と require 'rake'を追記する。
※なぜこれが必要なのかは今のところよくわからない。

```
require File.expand_path('../config/application', __FILE__)
require 'rake'
require 'rake/dsl_definition'
```
（参考）[Mac で heroku を触ってみる](http://d.hatena.ne.jp/nshibazaki/20110724/1311490566)  | プログラマー探求日記


###6.Gemfileを編集
1.`# gem 'therubyracer', :platforms => :ruby `のコメントアウトをはずす。

```
gem 'therubyracer', :platforms => :ruby
```
2.テスト環境では`sqlite3`、本番環境のherokuはpgになるのでGemfileの該当部分を修正。

```
#gem 'sqlite3'
group :production do
gem 'pg'
end
group :development, :test do
gem 'sqlite3'
end
```
（参考）[Ruby on Rails + Heroku でWebサイト構築](http://d.hatena.ne.jp/ke-16/20121130/1354225230)  | DRY（日本やアメリカで働くエンジニア日記）

###7.ローカル環境の構築
```
$ bundle install
```

###8.gitのローカルリポジトリを作成
gitでメッセージ付きで最初のコミット

```
$ git init
$ git add .
$ git commit -m 'first commit kusubook'
```

###9.Herokuにリモートリポジトリを生成（herokuのアカウントは既に取得済み）
```
$ heroku create 
```
もしアプリ名を指定する場合は


```
$ heroku create myapp
```

###10.アプリをherokuにデプロイ
```
$ git push heroku master
```
**こんなエラーがでちゃう場合**
>*! Heroku push rejected, failed to install gems via Bundler*
こちらを参考にしました
=>[ナレッジ - Heroku で Rails3.2.x を動かす。](http://d.hatena.ne.jp/hineltjar/20120506/1336314295)

###11.Heroku上でDBマイグレーション！
```
$ heroku run rake db:migrate
```

###12.herokuでアプリOPEN！！
```
$ heroku open
```
herokuの管理画面に直接ログインして自分のappのところに表示されているはずです。
時空射(chronomorphism)を実装してみた

http://comonad.com/reader/2008/time-for-chronomorphisms/ を参考にした。使い方は不明。

```haskell
import Control.Monad
import Control.Monad.Free
import Control.Comonad
import Control.Comonad.Cofree

nruter :: Comonad w => w a -> a
nruter = extract

nioj :: Comonad w => w a -> w (w a)
nioj = duplicate

dist :: Functor f => Free f (f a) -> f (Free f a)
dist (Pure fa) = fmap Pure fa
dist (Free fmfa) = fmap (Free . dist) fmfa

tsip :: Functor f => f (Cofree f a) -> Cofree f (f a)
tsip fwa = fmap extract fwa :< fmap (tsip . \(_:<x) -> x) fwa

chrono :: Functor f =>
    (f (Cofree f b) -> b) ->
    (a -> f (Free f a)) ->
    a -> b
chrono n u = nruter . (n `chrono_onorhc` u) . return

chrono_onorhc :: Functor f =>
          (f (Cofree f b) -> b) ->
          (a -> f (Free f a)) ->
          Free f a -> Cofree f b
chrono_onorhc n u = liftW n . tsip . fmap (nioj . (n `chrono_onorhc` u) . join) . dist . liftM u

```
Ubuntu + Apache2環境にSPDYを導入

# Ubuntu + Apache2環境にSPDYを導入

2013/1/23時点で、このドキュメントの通り動きます。  
[Using mod_spdy With Apache2 On Ubuntu 12.04](http://www.howtoforge.com/using-mod_spdy-with-apache2-on-ubuntu-12.04)  

## SSLの利用

必要なら`sudo`で。

    $ a2enmod ssl

デフォルトのまま有効化しましょう。

    $ a2ensite default-ssl

再起動して、アクセスできるかどうか確認しましょう。

    $ service apache2 restart

ダミーのSSL証明書で見えるようになるはず。

## mod-spdy-betaの導入

mod-spdy-betaをwgetしましょう。

    $ cd /tmp
    # 64ビットの場合
    $ wget https://dl-ssl.google.com/dl/linux/direct/mod-spdy-beta_current_amd64.deb
    # 32ビットの場合
    $ wget https://dl-ssl.google.com/dl/linux/direct/mod-spdy-beta_current_i386.deb


インストールまで。

    $ dpkg -i mod-spdy-*.deb
    $ apt-get -f install
    $ service apache2 restart

これで、実はデフォルトONになります。

## chromeで確認

対象サイトにアクセスした後、下記にアクセスすると確認できます。

SPDY status : chrome://net-internals/#spdy  

いわゆるVersion3で動くようになります。
Vimのノーマルモード中は自動的にIMEをOFFにする。（Windowsのみ）

VimでIMEをオフにしようとするコマンドは`set imdisable`や`set iminsert`など
ありますが、結構使いどころが難しいです。
なので、[rbtnn/winime.vim](https://github.com/rbtnn/winime.vim)というVimプラグイン
を作りました。 これをインストールするとWindowsのIMEをVim scriptから制御できます。
で、これをインストールした後以下のコードをvimrcなどに記述すれば、
ノーマルモード中、誤って「半角/全角キー」を押したとしても自動的にIMEをOFFにしてくれます。

```vim:
set updatetime=1000
function! s:winime_off()
  if exists("g:loaded_winime") && (has('win32') || has('win64'))
    if mode() !=# 'i'
      call winime#off()
      call feedkeys(mode() ==# 'i' ? "\<C-g>\<ESC>" : "g\<ESC>", 'n')
    endif
  endif
endfunction
augroup winime_off
  autocmd!
  autocmd CursorHold,CursorHoldI * call s:winime_off()
augroup END   
```
カレンダーテーブルの代替

[ＭｙＳＱＬで自然数の連番を持つ集合を作成](http://ne.tc/2007/11/01/mysqlのユーザー変数でsetを使わずsql中でユーザー変数の/)

↑こちらの記事を読んで、日時で同じことができそうと思って書いたのがこれ↓

```sql
-- 2010/02/01～2010/02/28を取得
 SELECT
   @f:='2010-02-01'
 UNION ALL
 SELECT
   @f:=DATE_ADD(@f, INTERVAL 1 DAY)
 FROM
   SomeTable    -- 取得したい行数以上のレコードがあるテーブル
 WHERE
   @f < '2010-02-28'
```
これをFROM句に入れると、日別集計などをするときに便利。

あまり長期間だと`SomeTable`を用意するほうが大変かもだけど…

## 追記（2017/03/29）

なんだかんだで何年も便利に使っているので、DB2版の例も。

```sql
with CAL(TS) as ( 
  select timestamp(date('2015-09-01'), time('00:00:00')) TS from SYSIBM.SYSDUMMY1
  union all 
  select TS + 1 day from CAL where TS + 1 day < timestamp(date('2015-10-01'), time('00:00:00'))
) 
select year(CAL.TS)*10000 + month(CAL.TS)*100 + day(CAL.TS) YMD from CAL
```
FormItemの*マークを消す

`FormItem` の `require` プロパティが `true` のときに表示される*マークを消すには、以下のスタイルを適用します。
（※spacer.gifは1*1の透明ピクセル画像）

```css
FormItem {
     indicator-gap: 6;    /* 適宜調整 */
     indicator-skin: Embed("spacer.gif");
 }
```
スタイルシートが適用されないときのチェック項目

Flex のスタイルシートで定義する styleName には、ハイフンが使えません。
スタイル定義に誤りがないのに正しく適用されない場合は、スタイル名を確認してみてください。

```css
/* NG: 適用されないスタイル名 */
 .hoge-style1 {
     text-align: center;
 }
  
 /* OK: 正しく適用されるスタイル名 */
 .hogeStyle1 {
     text-align: center;
 }
```

ちなみに、スタイルプロパティ名は、HTMLスタイル・ActionScript 識別子いずれも使えます。

```css
.hogeStyle {
     text-align: center; /* これも */
  
     textAlign: center;  /* これもOKです */
 }
```

個人的にはHTMLスタイルのほうがすき。
引数の数は分からんが、最後にコールバックがあったらコールしたい

そんな時はargumentsを使います。

**要注意!**argumentsは[特別なオブジェクト](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments)であり、arrayでは無い。

```coffee-script:foo.coffee
foo = () ->
  # do something
  [args..., callback] = arguments
  callback() if typeof callback is 'function'

foo 'hi', () -> console.log 'done'
```

実行すると、

```
$ coffee foo.coffee 
done
```

出来た。

---------
又、rangeを使って配列の最後の要素を得る時にも使えます。

```coffee-script
array = [1..10]

[first, second,  middle..., last] = array
# first  = 1
# second = 2
# middle = [3, 4, 5, 6, 7, 8, 9]
# last   = 10

[foo..., bar, hoge] = array
# foo  = [1, 2, 3, 4, 5, 6, 7, 8]
# bar  = 9
# hoge = 10
```

[@satyr](https://github.com/satyr)さんによるrangeの[ハマりポイント](https://github.com/jashkenas/coffee-script/issues/746)もどうぞ。
magit でコミットログを書くときに helm で過去のコミットログを参照する

Emacs の helm と magit を使っている人に便利だと思います。
過去のコミットログからログを挿入できます。

コミットログは過去に使った言い回しをそのまま使ったり、他の人が書いたのを参考にして書いたりすることが多いと思うので [コミットメッセージをanythingで挿入できるようにする](https://github.com/clear-code/emacs.d/blob/master/config/packages/magit.el "コミットメッセージをanythingで挿入できるようにする") を参考にして helm 用に書き直しました。

元にしたものにあった複数のプロジェクトを切り替えながら使うと最初に読み込んだものしか参照できないことがあるというバグを修正してあります。

anything に移植してもうまく動かないかもしれません。。。

``` cl
(defvar helm-c-source-git-commit-messages
  '((name . "Git Commit Messages")
    (init . helm-c-git-commit-messages-init)
    (action . (("Insert" . (lambda (candidate)
                             (insert
                              (replace-regexp-in-string "\0" "\n" candidate))))))
    (real-to-display . helm-c-git-commit-messages-real-to-display)
    (migemo)
    (multiline)
    (candidates-in-buffer)))

(defun helm-c-git-commit-messages-init ()
  (with-current-buffer (helm-candidate-buffer 'global)
    (call-process-shell-command
     "git log --format=\"%x00%B\" | tr '\\n\\000\' '\\000\\n' | sed -e '/^$/d' -e 's/\\x0\\+$//'"
     nil (current-buffer))))

(defun helm-git-commit-messages ()
  "`helm' for git commit messages."
  (interactive)
  (helm-other-buffer 'helm-c-source-git-commit-messages
                         "*helm commit messages*"))

(defun helm-c-git-commit-messages-real-to-display (candidate)
    (replace-regexp-in-string "\0" "\n" candidate))

(defun magit-enable-helm ()
  ;; 過去のコミットメッセージを挿入
  (define-key magit-log-edit-mode-map
    (kbd "C-c i") 'helm-git-commit-messages))
(add-hook 'magit-mode-hook
          'magit-enable-helm)
```

自分の設定は [dotfiles](https://github.com/okkez/dotfiles "dotfiles") で公開しています。
マルチサイトのアップロードディレクトリを変更する

WordPress3.5の場合、アップロードディレクトリの初期値は「wp-content/uploads/sites/xx/」となる。
これを任意に変更するにはサイト編集の設定を下記に書き換える。

変更後の画像パス：/uploads/sites/xx/

Upload Path
uploads

Upload Url Path
/uploads

Uploads Use Yearmonth Folders
0
※年月管理する場合は「1」を指定。
M-x grep の時も popwin.el がいい感じで動くようにする


普通に設定すると上手くいかない。

```elisp
(push '("*grep*") popwin:special-display-config)
```

`noselect`属性を設定するといい感じで動く！

```elisp
(push '("*grep*" :noselect t) popwin:special-display-config)
```

詳しくは本家のマニュアルを見ましょう。[ブログ](http://d.hatena.ne.jp/m2ym/20110709/1310223860)より[GithubのREADME](https://github.com/m2ym/popwin-el/blob/master/README.md)の方が情報が新しい印象。


[m2ym/popwin-el · GitHub](https://github.com/m2ym/popwin-el)


古い**popwin.el**を使っている人は一度バージョンアップしておくといいかもしれません。(2013/01/23の時点で`0.6.1`が[最新のようです](https://github.com/m2ym/popwin-el/blob/master/NEWS.md))
Rで線形基底関数モデル（ガウス基底）の係数を最尤推定

PRML 3.1.1に記載の正規方程式を使って、ガウス基底を用いた線形基底関数モデルの係数wを推定し、モデルの図を書きます。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/yNaYbqZdmx/2.NormalEquation.png)

```r
set.seed(0)
x<-seq(0.05,1,0.1)
t<-sin(2*pi*x)+rnorm(10,0,0.5)
t<-matrix(t,nrow=length(t))
M=4
base<-function(m,x) {
#       r<-x^m                          #多項式基底の場合
        r<-exp(-(x-(m-1)/(M-2))^2/(2*0.2^2))    #ガウス基底の場合
        r[m == 0]<-1                    # w0をバイアス項とするためφ0=1
        r
}
makePhi<-function(M) {
        A <- matrix(nrow=length(x),ncol=M)
        for (i in 1:length(x)) {
                for (j in 0:(M-1)) {
                        A[i,1+j] <- base(j,x[i])
                }
        }
        A
}
xrange=c(-0.5,1.5)
yrange=c(-2,2)
phi<-makePhi(M)
w<-solve(t(phi) %*% phi) %*% t(phi) %*% t
w
estimate<-function(x){
        i <- 0:(M-1)
        (sapply(x,function(xn){ (sum(w * base(i, xn))) } )) # (w[1]+w[2]*base(1,x)+w[3]*base(2,x)...)
}
plot(x,t,xlim=xrange,ylim=yrange)
par(new=T)
curve(estimate,type="l",xlim=xrange,ylim=yrange)
```
オフラインリアルタイムどう書く第7回の参考問題


オフラインでリアルタイムに「どう書く」をやるゆるいイベント。
http://atnd.org/events/36098
をまたやります。次で七回目です。
これまで同様参考問題を出します。
難易度と分量はこれを目安に。
参加予定の方は、何分で解けたとかいう情報を付けてくださると、本番用の問題の参考になりますので出来ればお願いします。

問題は「XY-Sort」です。
http://nabetani.sakura.ne.jp/hena/ord7xysort/
におきました。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
PHPのモジュールとCGIはどう違うか？


* Module: ApacheなどのWebサーバの一部として実行する形式
* CGI: Common Gateway Inteface


> ![module]
> モジュールはApacheの一部
> http://labs.yumemi.co.jp/labs/mod/apache_module.html

# プロセス

* モジュール: ApacheのプロセスとPHPのプロセスが同じ
* CGI: ApacheのプロセスとPHPのプロセスが別

# 効率

* モジュール: Apacheが起動時にPHPをロードしているので高速
* CGI: Apacheにリクエストが来た時にPHPをロードするのでオーバヘッドがある。(FastCGIはこのオーバヘッドを克服するための改良版)

> ![CGI_vs_FastCGI_001]
> http://www.movabletype.jp/documentation/developer/server/fastcgi.html


# 実行権限

* モジュール: ApacheにPHPスクリプトを実行する権限がなくてもOK
* CGI: ApacheにPHPスクリプトを実行する権限が必要

# 設定

* モジュール: Apache側（.htaccessなど）でPHPの設定を変更することができる。
* CGI: Apache側からはPHPの設定を変更できない

.htaccessでファイルアップロードサイズ上限を10MBにする例↓

```txt:.htaccess
php_value upload_max_filesize 10M
```



[module]: http://labs.yumemi.co.jp/labs/img/mod/module.gif
[CGI_vs_FastCGI_001]: http://www.movabletype.jp/documentation/developer/server/images/CGI_vs_FastCGI_001.png
Wordpress + PHP + php-fpm + Nginx


ちょっと必要になったので。

PHP 5.3
Wordpress 3.5
Nginx 1.0.15

すでにyumでnginxがインストール済。

```zsh
yum install php-cli php-mysql php-mbstring php-gd php-fpm
chkconfig php-fpm on
```

```/etc/php-fpm.d/www.conf
; user = apache
user = nginx

; group = apache
group = nginx
```

```/etc/nginx/conf.d/hoge.com.conf
server {
        listen 80;
        server_name hoge.com;

        root /var/www/hoge.com;

        access_log /var/log/nginx/hoge.com/access.log;
        error_log /var/log/nginx/hoge.com/error.log;

        index  index.php index.html;
        try_files $uri $uri/ /index.php?q=$1;

        location ~ /*.php$ {
                include fastcgi_params;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;

                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }
}
```

```
/etc/init.d/nginx reload
/etc/init.d/php-fpm start
```

php-fpmのプロセスも監視せねば。

Wordpressは公開ディレクトリ内に落としてきて、展開して、
wp-content 777
wp-config 600
くらいやっておけばいいの？

外に閉じてるサーバーなので今回ここらへんは適当にやってしまった。
ちゃんとやる場合ちゃんとやって。

とりあえず動いている。
pluginの自動インストールはやりたくないしそもそも閉じているので、そこはシェルでwgetしている。

--

PHPのこの適当に出来ちゃう感はやっぱりすごいけど怖いな。
HTC J で NETWORK_PROVIDER で位置測位した時の機種依存バグ？


[Androidの機種依存問題を吸収するプロジェクトAndroid-Device-Compatibilityを公開したお話](mixi Engineers' Blog http://alpha.mixi.co.jp/2013/11572/) を見て、あーそう言えばこんなんあったなーと思い出したのでメモ。

## 症状
下記条件を満たす時に、LocationManager.requestLocationUpdates すると、最新の位置が取得されず、**前回測位した位置** が返される。

時刻は更新されてたか、、、あーどうだったかな。

## 条件

* NETWORK_PROVIDER で位置を取得した場合（GPS じゃない）
* WiFi が無効の場合（つまり携帯電話の基地局のみを使った測位の場合）
* スリープ中な場合
* HTC J である(IS03, Nexus S では発生してない。 HTC J Butterfly はわからない)

## こんな事してたら見つけた
早い話が HexRinger なんですが、このアプリは、AlarmManager で一定時間毎に WiFi/基地局から位置を取得しています。デバッグで移動中のログを取ってたら、「この時間帯、電車で寝てたのになんか位置変わってないんだけどｗ」となりました。

## 対策
WakeLock する。ただし PARTIAL_WAKE_LOCK だとダメで、画面も起こしてやらないとダメだった。
SCREEN あるいは FULL_WAKELOCK が必要な常駐アプリって、最悪やん。

## いろいろ試した事とか推測
* 測位前に通信させればいけるか？と思ったけどダメだった。
* そもそも「最寄りの基地局情報」がスリープ状態だと更新されないんじゃないか説。


設置場所が山奥過ぎてこの地雷を踏む人はそうはいないと思いますが、「HTC J だけど問題ないよ？」「Butterfly でもダメだったわー」とかの情報あったらコメントください。 m(_ _)m
JavaScriptでiframeを生成＆枠線を消すには


JavaScriptでiframeを生成、さらに`setAttribute`で枠線消す属性を設定する時の罠。

```javascript
iframe.setAttribute('frameBorder', 0);
```

「frame**B**order」と書かないと、**IE7以前**は言うことを聞いてくれません。古いIEは爆発すればいい。


## 追記（2013-01-23）

なお、frameBorder Property経由だとこんな感じ。

```javascript
var i = document.createElement('iframe');
i.frameBorder = '0';
// i => <iframe frameborder=​"0">​</iframe>​
```

[noromanba@github](http://qiita.com/users/noromanba@github)さんにご指摘いただきました。感謝！


しかし、なんかこっちの方が大文字／小文字を慎重に書く気がする…
AS3のデータ型


最も基本的であろういくつかを。あんま覚える気がn… よく忘れるので。

| データ型 | 説明 | デフォルト値 |
|:--------|:------------|:------------|
| Object  | undefined以外の全ての値 | null |
| Boolean | 真 or 偽 | false |
| String  | 文字列 | null |
| Number  | 整数、符号なし整数、および浮動小数点数（※1） | NaN |
| int     | 符号つき整数（※2） | 0 |
| uint    | 符号なし整数（※3） | 0 |
| *       | 型なし（省略と同じ（※4） | undefined |
| その他   | ユーザー定義クラスを含むその他すべてのクラス | null |

---

※1：-9,007,199,254,740,992（-2の53乗）〜9,007,199,254,740,992（2の53乗）
※2：-2,147,483,648（-2の31乗）〜2,147,483,647（2の31乗-1）
※3：0〜4,294,967,295（2の32乗-1）
※4：これならStrictモードでも実行するまで型チェックを遅らせることが可能
debug用keystoreについて調べてみた


デフォルトの設定だと別のマシンでビルドしたapkはインストールできない。

なので、複数人とかで開発していると既存アプリをアンインストールしてからインストールする場面が結構起こる。

いい加減面倒になったのでちょっと調べてみた。

# apkを端末にインストールするには署名が必要

debugビルドだろうがreleaseビルドだろうがkeystoreによる署名は必要らしい。

debugビルドの場合、自動的にkeystoreが作られている。

なので、

- 複数台のマシンで開発している
- Jenkinsで自動ビルドもさせている

とかいう状況だとそれぞれで別のkeystoreを使っているから別のマシンからインストールできない。

# debug用keystoreの保存場所

## MacやLinux

`~/.android/debug.keystore`

## Windows XP

`C:\Documents and Settings\<user>\.android\`

## Windows Vista and Windows 7

`C:\Users\<user>\.android\`


## このdebug.keystoreを…

共有のdebug用keystoreを作って上記の場所におけばいい。

debug用keystoreの条件は

http://developer.android.com/intl/ja/tools/publishing/app-signing.html#debugmode


に書いてある。

| key | value |
|:--------:|:-------:|
| Keystore name  | debug.keystore   |
| Keystore password  | android   |
| Key alias      | androiddebugkey  |
| Key password | android |
| CN | CN=Android Debug,O=Android,C=US |

ターミナルで

```console:
keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 -dname "CN=Android Debug,O=Android,C=US"
```

とやれば生成できる。
Rails3でメールにインラインで画像を埋め込む方法

HTMLメールで最初から画像が入った状態で表示させたかったので試しに作ってみました。

mailer側のメソッドでメール本文中に表示させたい画像ファイルを設定。
```content_id=>"rails.png"```部分をメールのview側で使うので好きな名前で設定。

```ruby:test_mailer.rb
class TestMailer < ActionMailer::Base
  default from: "mail@testmailer.com"
  def test_mailer
    attachments.inline["rails.png"] = {:content=> File.read("#{Rails.root.to_s}/app/assets/images/rails.png") ,:content_id=>"rails.png"}
    mail(:to=>"mail@testmailer.com",:subject=> 'New account information')
  end
end
```

cidに、test_mailerで設定したcontent_idを指定。これでOK。

```html+erb:views/test_mailer/test_mailer.html.erb
image test<br />
<img src="cid:rails.png" /><br />
```
RedmineとGithubの連携


## Github連携プラグインのインストール

redmineのGithub連携プラグインを下記の様にインストール。

```sh
# gem install json
# cd /opt/alminium/plugins
# git clone git://github.com/koppen/redmine_github_hook.git
```

## Redmineの再起動

以下のコマンドで、再起動。

```sh
# touch /opt/alminium/tmp/restart.txt
```


## Githubのリポジトリから、リポジトリを取得
Githubの該当プロジェクトから、Apacheユーザ（Redmineを動かしているユーザ）で、cloneできるように、鍵などを設定して、cloneする。

```sh
# mkdir /opt/repos
# chown apache.apache /opt/repos
# su - apache
$ cd /opt/repos
$ git clone --bare git@github.com:XXXXXXXXXXX/hoge.git
```

## Githubの設定
クライアント側から、pushされた際に自動的に、Redmine側のリポジトリに反映される様にhookを設定する。

![Githubの設定](http://img.00west.com/130122-0001.png)
URLは、**http(s)://[redmineのURL]/github_hook**を入力

## redmineの設定
プロジェクトのリポジトリの設定で、先ほどcloneしたリポジトリのパスを入力する。

![Redmineの設定](http://img.00west.com/130122-0002.png)

これで、Githubのリポジトリが、Redmineのリポジトリブラウザからも見えるようになる。
メインタイムラインの変数を外部から参照


メインタイムラインで作った変数を、外部のクラスやらムービークリップから参照する方法。

```ActionScript3.0
MovieClip(parent).hoge
```

または、

```ActionScript3.0
MovieClip(root).hoge
```

基本でしょうが、知らなかったあの頃を思い出して。
イベントリスナーで引数を渡す


Flashで`addEventListener`する時、関数に引数を渡したくなりませんか？私はなります。のでメモ。

```ActionScript3.0
stage.addEventListener(MouseEvent.CLICK, hoge("ほげほげ"));

function hoge(hogehoge:String):Function {
  return function(e:MouseEvent):void {
    trace(hogehoge);
    // ステージをマウスクリックで hogehoge（ほげほげ）を出力
  }
}
```

何かこう、めんどいな…

なお、ここで追加した無名関数を削除するには、`arguments.callee`を使います。

```ActionScript3.0
stage.removeEventListener(MouseEvent.CLICK, arguments.callee);
```

うっかり消し忘れにご注意。
PHP で setuidgid

[PHP setuidgid.php](https://gist.github.com/4593155 "PHP setuidgid.php")

```php
<?php
/*
 * example)
 *   sudo php setuidgid.php apache test.php
 *
 */

try
{
    if ($argc <= 2)
    {
        $name = basename(__FILE__);
        throw new RuntimeException("Usage: php $name <user> <script.php>");
    }
    
    list (, $user, $script) =  $argv;
    
    call_user_func(function() {
        
        global $user;
        
        $uid = posix_getuid();
        
        if ($uid !== 0)
        {
            throw new RuntimeException("setuidgid is only root");
        }
        
        $nam = posix_getpwnam($user);
        
        if (!$nam)
        {
            throw new RuntimeException("unkonwn user \"$user\"");
        }
        
        $uid = $nam['uid'];
        $gid = $nam['gid'];
        
        if (!posix_setgid($gid))
        {
            throw new RuntimeException("unable setgid($gid)");
        }
        
        if (!posix_setegid($gid))
        {
            throw new RuntimeException("unable setegid($gid)");
        }
        
        if (!posix_setuid($uid))
        {
            throw new RuntimeException("unable setuid($uid)");
        }
        
        if (!posix_seteuid($uid))
        {
            throw new RuntimeException("unable seteuid($uid)");
        }
    });
    
    require_once $script;
}
catch (Exception $ex)
{
    fputs(STDERR, $ex->getMessage() . PHP_EOL);
    exit(-1);
}
```
Python2の文字列型

Python2には`str`と`unicode`の2つの文字列型がある。
普通は`unicode`型を使うべき。

## str型

`str`は文字列と言うよりバイト列という方が正しい(と思う)。

```python
aiueo = 'あいうえお'
# この時 aiueo は str 型になる

len(aiueo)
# いくつになるかは、ファイルのエンコーディングによって変わる
# 例えば、utf-8だと15になり、shift_jisだと10になる。
```


## unicode型

`unicode`型は文字をUCS-2(またはUCS-4)として記録している。
UCS-4の範囲の文字をつかうにはPythonのコンパイル時に指定する必要がある。

```python
aiueo = u'あいうえお'
# この時 aiueo はunicode型になる

len(aiueo)
# どの環境でも5になる
```


## encode と decode

`str`型の`decode`メソッドを呼び出すと`unicode`型に変換できる。
逆に`unicode`型の`encode`メソッドを呼び出すと`str`型に変換できる。

```python
aiueo = u'あいうえお'

aiueo_utf8 = aiueo.encode('utf-8')
aiueo_shiftjis = aiueo.encode('shift_jis')

print isinstance(aiueo_utf8, str) # True
print isinstance(aiueo_shiftjis, str) # True
print len(aiueo_utf8) # 15
print len(aiueo_shiftjis) # 10

print len(aiueo_utf8.decode('utf-8')) # 5
print len(aiueo_shiftjis.decode('shift_jis')) # 5
```

`decode`メソッドに正しくないエンコーディングを渡すと`UnicodeDecodeError`エラー。

```python
aiueo_shiftjis.decode('utf-8') # UnicodeDecodeErrorエラー
```


## Python3

紛らわしいので、Python3では`str`は`bytes`に、`unicode`は`str`に変わっているらしい。


## 参考

- [5. Built-in Types — Python v2.7.3 documentation](http://docs.python.org/2/library/stdtypes.html)
- [Pythonでサロゲートペアの範囲の数値実体参照を文字に戻す - 西尾泰和のはてなダイアリー](http://d.hatena.ne.jp/nishiohirokazu/20120127/1327646600)
compass で sprite を利用して画像置換をするときの mixin

# mixin

```
%base-properties-img-replacement-sprite{
	overflow: hidden;
	padding: 0;
	border: none;
	font: 0/0 a;
	text-shadow: none;
	text-decoration: none;
	color: transparent;
}
@mixin img-replacement-sprite($map: false, $bg-url: false, $name: false, $display: inline-block, $margin: false, $valign: false) {
	@extend %base-properties-img-replacement-sprite;
	@if $display == inline-block {
		@include inline-block;
	} @else if $display == block {
		display: block;
	} @else {
		@include inline-block;
	}
	@if $margin {
		margin: unquote($margin);
	}
	@if $bg-url {
		background-image: $bg-url;
		background-repeat: no-repeat;
	} @else {
		background-repeat: no-repeat;
	}
	@if $map and $name {
		background-position: sprite-position($map, $name);
		width: image-width( sprite-file($map, $name) );
		height: image-height( sprite-file($map, $name) );
	}
	@if $valign {
		vertical-align: $valign;
	}
	@if $legacy-support-for-ie6 or $legacy-support-for-ie7 {
		*text-indent: 0;
		*line-height: 9999px;
		*text-align: left;
		*word-wrap: normal;
	}
}
```

# 使うとき
```
@import "spr/icons/*.png";
$spr-icons: sprite-map("spr/icons/*.png");
$spr-url-icons: sprite-url($spr-icons);

i.new{
	@include img-replacement-sprite( $spr-icons, $spr-url-icons, new, false, false, middle );
}
```

とりあえずこれで困ってないけど、もっといい書き方あったら知りたい＞＜
Build numberの値を自動で更新する

iOSアプリのBuild numberをビルドするたびに自動で更新スクリプトについてです。
以下のスクリプトをXcodeのBuild PhasesのRun Scriptに登録します。Xcode 4.5.2で動作を確認しています。

```
#!/bin/bash
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
```

登録の際に注意しないといけないのは、**XcodeのSummaryにあるBuildの値を整数にしておくことです。**少数を含む値を入力しているとビルドできません。

こちらのサイトを参考にしました。
http://www.awaresoft.jp/ios-dev/item/113-xcode-increment-build-num.html
LokkaをHerokuにデプロイした時のメモ

# http://lokka.org/getting-started に書いてある通りやってみたら`$ heroku run rake db:setup`でコケる

理由はDBがないから。Addonを追加するして、DATABASE_URLの定数を設定してやる必要がある。
https://devcenter.heroku.com/articles/heroku-postgresql

```
$ heroku addons:add heroku-postgresql:dev
Adding heroku-postgresql:dev to sushi... done, v69 (free)
  Attached as HEROKU_POSTGRESQL_RED
Database has been created and is available
```

これでこのアプリのDBが`HEROKU_POSTGRESQL_RED`にセットアップされた。

```
$ heroku pg:promote HEROKU_POSTGRESQL_RED_URL
Promoting HEROKU_POSTGRESQL_RED_URL to DATABASE_URL... done
```

としてやって、DATABASE_URLの定数を定義してやる。

#tapsを入れてもdb:pushができない

tapsが入っていることと、sqlite3のgemが入っていることを確認する

# ローカルのデータベースをpushしたらTaps Server Error: PGError: ERROR: time zone displacement out of range: "2011-11-15 12:00:00.000000+5894114400"みたいにいわれる

Ruby1.9.3を使ってるなら原因は現在（2013/1/21）のHerokuの問題。ローカルのrubyを1.9.2にしてpushしなおせばよい
UIViewの位置をオフセット指定で動かす

CGRectOffset関数を使うとラク。

```objc
CGRect CGRectOffset (
   CGRect rect,
   CGFloat dx,
   CGFloat dy
);
```

dx, dy に rect からの移動量を指定する。
view.frame.origin.x += 100 みたいなことがしたい場合に以下のように書ける。

```objc
view.frame = CGRectOffset(view.frame, 100.0, 0.0);
```
[AIR] Desktop用 AIR Native Extensionアプリを書き出すANT

```xml

<!--   mac からはdmg winからはexeが書き出せる。-->

<?xml version="1.0" encoding="UTF-8"?>

<project name="build desktop ane app" default="build">
 
        <property name="adt" value="adt.jarのぱす" />
        <property name="cirtificate" value="しょうめいしょのぱす" />
        <property name="cirtificate.pass" value=”ぱすわーど" />
 
        <target name="build">
        <fdt.loadProjectProperties />
        
            <java jar="${adt}" fork="true">
 
                <arg value="-package" />
                
                <arg value="-storetype" />
                <arg value="pkcs12" />
 
                <arg value="-keystore" />
                <arg value="${cirtificate}" />
 
                <arg value="-storepass" />
                <arg value="${cirtificate.pass}" />
 
                <arg value="-target" />
                <arg value="native" />
                
                <arg value="../deploy/書き出しアプリ名" />
                <arg value="../bin/●●●●●-app.xml" />
                
                <arg value="-C" />
                <arg value="../bin" />
                <arg value="●●●●●●●.swf" />
                
                <arg value="-extdir" />
                <arg value="../ane" />
            </java>
        </target>
    </project>
    
    
 



```
CoffeeScript で null かどうかを判断するイディオム

### 訂正その二
```javascript:JavaScript
if (json['hoge'] == null) {
  console.log('hoge は null です');
}
```

を CoffeeScript で書くと

```coffee-script:CoffeeScript
unless json['hoge']?
  console.log 'hoge は null です'

or

# JavaScript として評価する
if `json['hoge'] == null`
  console.log 'hoge は null です'
```

と書けます。

記事の内容が不適切でしたので、訂正してお詫びします！

---
### 訂正
コメントで頂きました。

```coffee-script:CoffeeScript
unless hoge?
  console.log 'hoge は null です'
```

が一番スマート。

---
### オリジナル
CoffeeScript で

```coffee-script:CoffeeScript
if hoge is null
  console.log 'hoge は null です'
```

とすると、コンパイル後のコードは

```javascript:JavaScript
if (hoge === null) {
  console.log('hoge は null です');
}
```

になってしまい、null の比較が失敗してしまう。

そんなときは、

```coffee-script:CoffeeScript
if `hoge == null`
  console.log 'hoge は null です'
```

のように、JavaScript として評価されるようにすると

```javascript:JavaScript
if (hoge == null) {
  console.log('hoge は null です');
}
```

になって、幸せになる。

※ Underscore の `_.isNull` をつかうでもいい
compassのバッチファイルに compile も足しておくと便利

「scssは変更してないけどコンパイルし直したい」という時があると思うんですけど、compassのバッチファイルの watch の前に compile を足しておくと便利かも。

```
cd `dirname $0`

compass compile -c config.rb
compass watch -c config.rb
```
Padrino の Plugin を使う


## Plugin Generator
[Padrino](http://www.padrinorb.com/) にはテンプレートと同じような仕組みとして Plugin Generator がある。
利用できるプラグインは[ここ](https://github.com/padrino/padrino-recipes/tree/master/plugins/)で公開されている。

また、以下のコマンドで Plugin の一覧を参照できる。

``` bash
$ padrino g plugin -l
Available plugins:
  - ["960"]
  - ["access"]
  - ["ar_permalink_i18n"]
  - ["ar_permalink"]
  - ["ar_textile"]
  - ["ar_translate"]
  - ["auto_locale"]
  - ["barista"]
  - ["better_errors"]
  - ["blueprint"]
  - ["bootstrap"]
  - ["bug"]
  - ["carrierwave"]
  - ["codehighlighter"]
  - ["coderay"]
  - ["coffee"]
  - ["deflect"]
  - ["disqus"]
  - ["dreamhost"]
  - ["exception_notifier"]
  - ["flash_session"]
  - ["fluxflex"]
  - ["googleanalytics"]
  - ["heroku"]
  - ["hoptoad"]
  - ["jammit"]
  - ["maintenance"]
  - ["omniauth"]
  - ["openid"]
  - ["payment"]
  - ["recaptcha"]
  - ["resque"]
  - ["rewrite"]
  - ["secure_only"]
  - ["tripoli"]
  - ["vcr"]
  - ["watchr"]
  - ["will_paginate"]
```

## Plugin の適用
Plugin は作成したプロジェクトに適用することができる。

``` bash
$ padrino g plugin [template_path]
```

今回は新規プロジェクトに better_errors を追加した。

``` bash
$ padrino g plugin better_errors
       apply  https://github.com/padrino/padrino-recipes/raw/master/plugins/better_errors_plugin.rb
      append    Gemfile
      insert    config/boot.rb
```

それぞれのファイルの変更点を確認してみる。

``` Gemfile
# Better Errors
group :development do
  gem "better_errors"
  gem "binding_of_caller"
end
```

``` config/boot.rb
# Setup better_errors
if Padrino.env == :development
  require 'better_errors'
  Padrino::Application.use BetterErrors::Middleware
  BetterErrors.application_root = PADRINO_ROOT
  BetterErrors.logger = Padrino.logger
end
```

この状態で

``` bash
$ bundle install
```

すると利用できるようになる。

## おわりに
便利。
JavaScript 正規表現 おぼえがき

```text:数字
/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/
```

```text:数値
/^\d+$/
```

```text:アルファベットと数値
/^\w+$/
```

```text:メールアドレス
/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i
```

```text:URL
/^(https?|s?ftp|git):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i
```

```text:日付（ISO形式）
/^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])$/
```
Titanium で pointer-events: none 的なものを実装する。

JavaScriptをつかったスマフォ用Webアプリではイベントを受けとってほしくないDOMに対して、

```css
#hoge {
    pointer-events: none;
}
```

と記載することが多かったのですが、
TitaniumではUIパーツに対して、

```js
var label  = Ti.UI.createLabel({
    touchEnabled: false
});
```

とするとほぼほぼ同じような効果が得られるようです。
秘密鍵から公開鍵を生成する

OpenSSH形式(~/.ssh/authorized_keysに使う形式)の公開鍵を生成

```
ssh-keygen -yf ${private_key_file} > ${public_key_file}
```

(参考) PEM形式の公開鍵を生成

```
openssl rsa -in ${private_key_file} -pubout -out ${public_key_file}
```
translation missingなとき例外を投げる

```ruby:config/initializers/i18n-translation-missing-error.rb
module I18n
  def self.just_raise_that_exception(*args)
    Rails.logger.error args.first
    raise "i18n: #{args.first}" unless Rails.env.production?
  end
end
I18n.exception_handler = :just_raise_that_exception
```

production環境では例外を投げないように&ログ出力するように
[Ruby on Rails Guides: Rails Internationalization (I18n) API](http://guides.rubyonrails.org/i18n.html#using-different-exception-handlers)のコードを少し変更．
*scratch* で Markdown 書く

```scm
(when (require 'markdown-mode nil t)
  (setq
   ;; *scratch* の major-mode
   initial-major-mode 'markdown-mode

   ;; *scratch* の初期文字列
   initial-scratch-message "Scratch\n========\n\n"))
```

にわか emacs 使いなので、`*scratch*` バッファの lisp-interaction-mode は、`init.el` を編集したい時くらいしか必要ない。寧ろメモ用途のバッファに使いたいので markdown-mode がいい。

markdown-mode のインストールが必要です。

保存とか何とか、内容の復帰なんかをしたい時にはもうそれ用の el を入れましょう。
nodebrew をインストールする方法



## nodebrew のインストール

node.js をインストールするのに、[nodebrew](https://github.com/hokaccha/nodebrew)というバージョンマネージャーを利用する。


```
% curl -L git.io/nodebrew | perl - setup
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
100 20027  100 20027    0     0   7778      0  0:00:02  0:00:02 --:--:--  7778
fetching nodebrew...
install nodebrew in $HOME/.nodebrew

========================================
Add path:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

### PATH を追加
.bashrc や .zshrc に PATH を追加する。

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```
PATH を追加したら source のを忘れないように。

### インストールされたことを確認。

```
$ nodebrew help
nodebrew 0.7.4

Usage:
    nodebrew help                         Show this message
    nodebrew install <version>            Download and install a <version> (compile from source)
    nodebrew install-binary <version>     Download and install a <version> (binary file)
    nodebrew uninstall <version>          Uninstall a version
    nodebrew use <version>                Use <version>
    nodebrew list                         List installed versions
    nodebrew ls                           Alias for `list`
    nodebrew ls-remote                    List remote versions
    nodebrew ls-all                       List remote and installed versions
    nodebrew alias <key> <version>        Set alias to version
    nodebrew unalias <key>                Remove alias
    nodebrew clean <version> | all        Remove source file
    nodebrew selfupdate                   Update nodebrew
    nodebrew migrate-package <version>    Install global NPM packages contained in <version> to current version
    nodebrew exec <version> -- <command>  Execute <command> specified <version>

Example:
    nodebrew install v0.10.22     Install a specific version number
    nodebrew use v0.10.22         Use a specific version number
```

### node.js のインストール

node.js をバイナリからインストールする。

```
$ nodebrew install-binary stable
```

ソースからインストールする場合は以下

```
$ nodebrew install stable
```

#### バージョンの切り替え

```
$ nodebrew use stable
```

### アンインストール

アンインストールするのもバージョンを指定するだけで簡単にできる。

```
$ nodebrew uninstall v0.8.18
```
awk, gawkで捕捉グループ(capturing group)、

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

単純なxmlのパースをshellからもやりたい場合、gawk(awk)でやってみる。

タグの中だけ取りたい例。

```bash::ShellOut
$ echo "<url>http://www.example.com</url>" | gawk 'match($0, /<url>(.*)<\/url>/, a) {print a[1]}'
http://www.example.com
```


gawkのマッチ部分について

1. $0は貰った文字列
2. // で正規表現
3. 元の文字列とマッチグループを 配列`a`に格納

で、`a[0]`が元の文字、`a[1]`にマッチグループの一番目。


solaris系ならawkでも可。
スクリプト内なら`BASH_REMACH`を使っても出来るけど、ちょっと長くなる。
str(utf-8)かunicodeかが大事なんですね

文字化けの件はどうも重大な勘違いだったみたいでreは無実でした。

BeautifulSoupでrenderContents()して取得した文字列がstr
→decodeしてやらないとデータストアに値が入らない

BeautifulSoupで属性値などを拾ってきて取得した文字列=unicode
→unicodeしなくてもデータストアに値が入る

慣れるまでは、その文字列が、strなのかunicodeなのか、
キチンと整理しながらプログラミングしないとまたハマりそうですな。

以下、確認用のソースを参考までに。

```python:test.py
# -*- coding: utf-8 -*-
import urllib2
import re
from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup(urllib2.urlopen("http://www.hkt48.jp/schedule/").read())
aaa=soup.find("h3").renderContents()
#これはUTF-8
print aaa+":len="+str(len(aaa))
print type(aaa)
#俺に濡衣を着せられたreをしてみる
split=re.split("48 ", aaa)
#これもUTF-8
print split[0]+":len="+str(len(split[0]))
print type(split[0])
print split[1]+":len="+str(len(split[1]))
print type(split[1])

#これがunicode
bbb=soup.find('div',{"class":"categories"}).find("ul",{"class":"cf"}).find("li").find("a")["title"]
print bbb+":len="+str(len(bbb))+"type"
print type(bbb)
```

/
【実行結果】
HKT48 スケジュール:len=24
type 'str'
HKT:len=3
type 'str'
スケジュール:len=18
type 'str'
誕生日:len=3type
type 'unicode'
簡易メソッドチェーン

各メソッドの最後に@(=this)を返すだけです

```coffee-script:worker.coffee
class Worker
  doThis: () ->
    console.log 'this'
    return @
  doThat: () ->
    console.log 'that'
    return @
  doSomethingElse: () ->
    console.log 'somethingelse'
    return @

worker = new Worker()
worker.doThis()
      .doThat()
      .doSomethingElse()
```

実行してみると

```
$ coffee worker.coffee 
this
that
somethingelse
```
釈然といかないけど…

GAE/Pの文字化けの件。

BeautifulSoupで取得した文字列をそのままデータストアに登録
⇒文字化けしない

BeautifulSoupで取得した文字列をre（正規表現）を通して
編集したものをデータストアに登録
⇒文字化け！！

という法則性が見えてきて…
でも、どういう理屈なんだかさっぱりわかりません（笑）

わからないけど、後者についてはデータストア登録時に
`.decode('utf-8')`してあげたらキレイに登録できるようになった…

要するに、データストアに登録したければ、ユニコードにしろ！
なんだけど、reしてるかしてないかで、違いが出てきてるのがスッキリしない！！
なんかreを槍玉にあげてもし違ってたらreさんに申し訳ないけど…

アンタが一番あやしいなう
terminus と phantomjs を使って capybara を完全 headless で動かす

**想定バージョン**

* ruby 1.9.3p327
* rails 3.2.11
* capybara 2.0.2
* phantomjs 1.7.0, 1.8.1
* terminus 0.5.0

## 前置き

capybara 1.x では  poltergeist (1.0.2) と phantomjs (1.7 以降) の組み合わせで完全 headless (画面なし、Xなし、Xvfb もなし) で動かせましたが、まだ capybara 2.0.2 に対応した poltergeist はリリースされていないようです。

そのため、他の方法を探していたところ、 terminus という gem を見つけましたが、ほとんど情報が無かったのでメモしておきます。

## 準備

1. まず capybara と一緒に使うために `gem 'terminus'` を test グループに追加して `bundle` でインストールしておきます。
2. 次に `phantomjs` をダウンロードしてパスの通ったところに置いておきます。
3. 以下の内容の `spec/support/terminus.rb` を作成します。
4. 今まで通り `rake` などでテストを実行すると capybara を使っているテストは terminus 経由で phantomjs が使われるようになります。

```ruby:spec/support/terminus.rb
begin
  Process.spawn("phantomjs", "-v", out: IO::NULL)
  Terminus.start_phantomjs
  Capybara.current_driver = :terminus
  Capybara.javascript_driver = :terminus
rescue Errno::ENOENT
  warn "phantomjs not installed."
  Rails.logger.warn "phantomjs not installed."
end
```

`Process.spawn` での実行ファイルの存在確認は不要なら削ってください。

## 使用する

今まで通り `visit` などを使ってスペックを書くだけです。

## 特定の部分だけ使う

`describe` や `it` に `js: true` を付けたところだけ使う場合は `Capybara.current_driver = :terminus` をコメントアウトするなり削除するなりして無効にしてください。
`Capybara.javascript_driver = :terminus` は `js: true` のスペックで使われるドライバです。(設定していないと selenium が使われて、 headless の環境だと firefox に繋がらないエラーになります。)

## phantomjs にパスを通せない場合

http://terminus.jcoglan.com/ に説明がある通り以下のように `Terminus.start_phantomjs` で `phantomjs` の場所を指定してください。

```ruby
Terminus.start_phantomjs(
  :port    => 4567,
  :command => ['path/to/phantomjs']
)
```
Windowsでは syslog 関連の LOG_*** の値が異なる

自前でこしらえた Logger で次のように LOG_*** でエラーレベルを表現していたのですが・・・

```php
<?php
class Logger
{
    public function emerg($message)
    {
        $this->log($message, LOG_EMERG);
    }
    
    public function alert($message)
    {
        $this->log($message, LOG_ALERT);
    }
    
    public function crit($message)
    {
        $this->log($message, LOG_CRIT);
    }
    
    public function err($message)
    {
        $this->log($message, LOG_ERR);
    }
    
    // 以下略
}
```

Windows ではまともに動きませんでした。

```php
<?php
$logger = new Logger();

$logger->emerg("x");   // CRIT: x
$logger->alert("x");   // CRIT: x
$logger->crit("x");    // CRIT: x
$logger->err("x");     // ERR: x
$logger->warning("x"); // WARNING: x
$logger->notice("x");  // DEBUG: x
$logger->info("x");    // DEBUG: x
$logger->debug("x");   // DEBUG: x
```

Windows だと Linux とかとは異なる値に定義されているためです。

```php
<?php
var_dump(LOG_EMERG);   // int(1)
var_dump(LOG_ALERT);   // int(1)
var_dump(LOG_CRIT);    // int(1)
var_dump(LOG_ERR);     // int(4)
var_dump(LOG_WARNING); // int(5)
var_dump(LOG_NOTICE);  // int(6)
var_dump(LOG_INFO);    // int(6)
var_dump(LOG_DEBUG);   // int(6)
```

`Zend_Log` のようにしっかり定義しないとダメですね。

```php
<?php
class Zend_Log
{
    const EMERG   = 0;  // Emergency: system is unusable
    const ALERT   = 1;  // Alert: action must be taken immediately
    const CRIT    = 2;  // Critical: critical conditions
    const ERR     = 3;  // Error: error conditions
    const WARN    = 4;  // Warning: warning conditions
    const NOTICE  = 5;  // Notice: normal but significant condition
    const INFO    = 6;  // Informational: informational messages
    const DEBUG   = 7;  // Debug: debug messages
    
     :
```