OmniAICreator/Qiita-1.07M huggingface dataset:
画面全体を操作不可にする

サーバとの通信中など、ユーザに画面操作されたくない場合、`Application` オブジェクトを不活性にするのがいちばん簡単です。 

ただし、この方法ではポップアップまで不活性にできません。
ポップアップも含め、画面全体を操作不可とするには、透明なポップアップをモーダル表示します。

```as 
// 透明ポップアップ用オブジェクト。スタイルは適宜変更する。
var _dummyPopup:Canvas = new Canvas();
_dummyPopup.alpha = 0;
_dummyPopup.setStyle("modalTransparencyColor", 0xFFFFFF);
_dummyPopup.setStyle("modalTransparency", 0.4);
_dummyPopup.setStyle("modalTransparencyDuration", 0);
_dummyPopup.setStyle("modalTransparencyBlur", 0);
 
// 透明ポップアップをモーダル表示 (Flex3)
PopUpManager.addPopUp(_dummyPopup,
        DisplayObject(Application.application), true);

// 透明ポップアップをモーダル表示 (Flex4)
PopUpManager.addPopUp(_dummyPopup,
        DisplayObject(FlexGlobals.topLevelApplication), true);

// 操作不可を解除するとき
PopUpManager.removePopUp(_dummyPopup);
```
Fragment上のonClickとかをFragment内で受け取る

## 自分用メモ
Fragment使ってタブUIを実装するのはわかったけどそれだと一つのActivityにいくつもFragmentが貼られるとかで。
[Android Tips #38 FragmentTabHost を使って Fragment をタブで切り替える](http://dev.classmethod.jp/smartphone/android/android-tips-38-fragment-tab-host/)
で、tabcontentのfragment上にあるButtonとかをxmlで

```xml:sample_fragment.xml
 <Button
        android:id="@+id/loadButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="loadData"
        android:text="@string/Load" >
</Button>
```

とか置いてあった場合、loadDataはActivityから呼ばれるらしい。

###でもそれって気持ち悪い
だって、画面をうまいこと切り替えて使えるFragmentなのにイベント周り？はすべてActivityって。
なによりタブUIなんか作った日には4画面分のイベント処理をすべてActivityにモリモリ書くとか信じられない。
Fragmentでの処理はすべてそっちに書きたい。


調べたら見つけて色々試した。
[How to handle button clicks using the xml onClick within Fragments](http://stackoverflow.com/questions/6091194/how-to-handle-button-clicks-using-the-xml-onclick-within-fragments)

結果的にはXML上ではonClickは定義しない。
そしてFragment上でUI要素を取得してそれぞれListenerをセットすればよい感じ（タイミングはonStart()でいいのかな？



```java:SampleFragment.java
public class SampleFragment extends Fragment {

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {      

        return inflater.inflate(R.layout.sample_fragment, container, false);
    }

@Override
    public void onStart() {
       super.onStart();
        
       Button button = (Button)getActivity().findViewById(R.id.loadButton);
       button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(), "hoge!", Toast.LENGTH_SHORT).show();
               
                
            }
        });
        
    }
}
```

多分当たり前の事なんだけど雑魚なので結構ハマってしまった。
Android辛い。
std::remove_ifは実際には要素の削除を行わない。

std::remove_ifは条件を満たす（述語が真を返す）要素を実際削除するわけではなく、「削除する要素を詰めて、サイズが縮んだコンテナの新しい終端イテレータを返す」だけなので、その後の要素の削除は自分でやらないといけません。

```cpp
#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
std::vector<int> v = {1,2,3,4,5,6,7};

// "1 2 3 4 5 6 7"
for(auto i=v.begin();i!=v.end();++i)
  {std::cout << *i << " ";}
std::cout << std::endl;

auto itrNewEnd = std::remove_if(v.begin(),v.end()
                                ,[](int i)->bool
                                 { return 3<=i&&i<=5; });

v.erase(itrNewEnd,v.end());

// "1 2 6 7"
// 上記のv.erase()をコメントアウトすると "1 2 6 7 5 6 7"
for(auto i=v.begin();i!=v.end();++i)
  {std::cout << *i << " ";}
std::cout << std::endl;

return 0;
}
```
Flex Builder でプロファイル機能が使えないときのチェック項目

いまどき Flex Builder かよというツッコミはさておき、
「以前はプロファイルできたのに今回なぜかできないよ！」と泣くことがままあるので
そういうときのチェック項目を並べてみます。

 * コンソールにエラーが出ている場合は、その文言でぐぐる
 * プロファイラが使用するポートをFWがブロックしていないか確認する（使用ポートは設定画面で確認）
 * 開発者向けFlash Playerを使っているか確認する
 * mm.cfgを削除してみる
 * mm.cfgに以下記述してみる

```
PreloadSwf={ワークスペースのパス}\.metadata\.plugins\com.adobe.flash.profiler\ProfilerAgent.swf?host=localhost&port=9999
```

そのほか、私は遭遇したことないですが、こういうこともあるらしい。

 * ブレークポイントがひとつでも有効だとプロファイラが開かない
shとbashを区別してbashのときだけ~/.bash_profileを読ませる~/.profileの書き方

OS Xの/etc/profileに答えがありました。

```bash:/etc/profile 
# System-wide .profile for sh(1)

if [ -x /usr/libexec/path_helper ]; then
	eval `/usr/libexec/path_helper -s`
fi

if [ "${BASH-no}" != "no" ]; then
	[ -r /etc/bashrc ] && . /etc/bashrc
fi
```

というわけで~/.profileでも真似をします。

```bash:~/.profile
### -*- mode: sh; coding: utf-8; -*-

if [ "${BASH-no}" != "no" ]; then
    if [ -f "${HOME}/.bash_profile" ]; then
        . "${HOME}/.bash_profile"
    fi
fi
```
Cygwin上のEmacsが起動しないのを解決したのでメモ

# 環境
Windows7 Pro 64bit
cygwin
mintty　1.1.2

emacsを起動させようとしたら
/usr/bin/emacs-nox.exe: error while loading shared libraries: cyggnutls-26.dll:
cannot open shared object file: No such file or directory
ってエラー
特にcygwinのインストール時にはdefaultのままだった気がする。
[Source Forge](http://sourceforge.net/mailarchive/forum.php?set=custom&viewmonth=&viewday=&forum_name=cygwin-ports-general&style=nested&submit=Change+View)
↑見たらそれっぽいのがのってました。
まぁエラー文通りcyggnutls-26.dllがないってことなので
setup.exeを叩いてlibgnutls26を探すか
apt-cyg install libgnutls26
でも叩けばインストール出来ます。
そしたらemacsが普通に動きました。日本語入力とか不安なのかな？
vimでファイルをひらいたとき最後にカーソルがあった場所に移動する

.vimrcに

```
augroup vimrcEx
  au BufRead * if line("'\"") > 0 && line("'\"") <= line("$") |
  \ exe "normal g`\"" | endif
augroup END
```

ネタもと
http://advweb.seesaa.net/article/13443981.html

香り屋バージョンはもともと設定してあるそうです
Railsで日本語化対応にする方法

Railsの国際化対応（日本語化対応）は「i18n」という言語プラグインを利用。
日本語化対応にしたので、忘れないように以下順序をメモ。

「i18n」の理由 => internationalizationが「i」から「n」まで18文字あるから

##[1]まずi18nのプラグイン入っているかどうか確認

```
$ bundle list
```
ずらずらと一覧が出てくるので、
「i18n (0.6.1)」とかあればOK。

##[2]./config/application.rb を修正
30〜35行目にもともと

```
# config.i18n.default_locale = :de
```
とコメントアウトされている文がある。
これを

```
config.i18n.default_locale = :ja
```

とする。

##[3]gitHubからja.ymlをダウンロードする
gitHubダウンロード[rails-i18n / rails / locale / ja.yml](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml)

##[4]ja.ymlを「./config/locale/」以下に入れる
ダウンロードしたjs.ymlを「./config/locale/」の以下に入れる。
既にja.ymlがある場合はダウンロードしたjs.ymlの内容コピーして反映させる。


##[5]クラスの各属性の日本語訳をja.yml最後に追加する

```
（ここまでずらずらと記述があります）
attributes:
  user:
    name: 名前
    age: 年齢

site_title: サイトのタイトル
```

##[6]英語になっていた箇所が日本語になっている確認する
アプリケーションを起動させて確認する。
rails serverでローカルサーバーで確認。

```
$ rails s
```

これまで英語表記だったところが日本語表記に変わっていればOK！


###追伸
ユーザー認証で「devise」を使っているなら、
yharaさんという方がgitHubで公開している [devise.ja.yml](https://gist.github.com/606476)をダウンロードする。

devise.ja.ymlも./config/locale/ に入れます。
rack-mini-profilerの計測結果がWebページに表示しないようにする


Railsアプリケーションに導入することで、Viewのレンダリングやデータベースへのクエリにかかった時間を計測し、その結果をすべてのページ上に表示してくれる`rack-mini-profiler`というgemがある。

[MiniProfiler/Ruby at master · SamSaffron/MiniProfiler · GitHub](https://github.com/SamSaffron/MiniProfiler/tree/master/Ruby "MiniProfiler/Ruby at master · SamSaffron/MiniProfiler · GitHub")

計測結果は画面左上に小さく表示され、邪魔になりにくいようになっているんだけど、それでも邪魔なときがある。

計測結果をページに表示しないようにするには方法が２つある。

### 1つ目
URLの末尾に`?pp=disable`というクエリを付け加えることで、計測結果が表示されなくなる。

例：

```
http://example.com/users/1?pp=disable
```

一度この設定を行うと、そのセッションが有効な間はずっと計測結果が表示されない状態になる。

再度表示させたい場合は、URLの末尾に`?pp=enable`と付け加えれば良い

### 2つ目
1つ目の方法も面倒な時がある。URLクエリパラメータを簡単に変更できない場合など。

その場合、Rails起動時に以下の設定が読み込まれるようにすることで、デフォルトで計測結果が表示されないようになる。

```config/initializers/mini_profiler.rb
if defined?(Rack::MiniProfiler)
  Rack::MiniProfiler.config.auto_inject = false
end
```

以下の設定を追加後、Railsアプリケーションを再起動すればOK。

計測結果が必要なときはURLの末尾に`?pp=enable`を付け加えればいい。
Django 1.4にアップグレードする


Python 自体もバージョンアップするため、これまで使用していた Django 1.1.2 はそのままにしておく。

# 1. Python2.7のインストール
2.7.3 をダウンロードしてきました。

```
$ ./configure --prefix=/usr/local/python2.7
Makefile を編集します
$ vim Makefile
変更前）OPT= -DNDEBUG -g -fwrapv -03 -Wall -Wstrict-prototypesa
変更後）OPT= -DNDEBUG -g -fwrapv -03 -Wall -Wstrict-prototypesa -fPIC
$ make
$ sudo make install
```

# 2. Django のインストール
1.4.3 をダウンロードしてきました。

```
$ sudo /usr/local/python2.7/bin/python setup.py install
バージョンの確認をします。
$ /usr/local/python2.7/bin/python
>>> import django
>>> print django.get_version()
1.4.3
>>>
```

Djangoを 1.1 から、1.4 に変更した場合、settings.py の設定を書き換える必要がある箇所がある。

- DATABASE

- SITE_ID

- TEMPLATE_LOADERS

- MIDDLEWARE_CLASSES

- TEMPLATE_CONTENT_PROCESSORS

私が修正したのは、この5つ。


# 3. mod_wsgi のインストール
3.4 をダウンロードしてきました。

```
$ ./configure --with-apxs=/usr/local/apache2/bin/apxs --with-python=/usr/local/python2.7/bin/python
$ make
make install する前に、現在、Python2.5で使用しているmod_wsgiをリネーム
$ sudo mv /usr/local/apache2/modules/mod_wisgi.so /usr/local/apache2/modules/mod_wisgi_2.5.so
$ sudo make install
mod_wsgi をリネーム
$ sudo mv /usr/local/apache2/modules/mod_wisgi.so /usr/local/apache2/modules/mod_wisgi_2.7.so
```

# 4. Apache の設定変更

```
$ sudo vim /usr/local/apache2/conf/httpd.conf
変更前）Loadmodule wsgi_module modules/mod_wsgi.so
変更後）Loadmodule wsgi_module modules/mod_wsgi_2.7.so
$ sudo /usr/local/apache2/bin/apachectl -k graceful
```

# 5. アップグレードした際の影響
調査中
「Google Maps」がインストールされているか確認する


#インストール確認

iOS6の標準マップアプリではなく、「Google Maps」アプリで連携したい場合、
Google Mapsで定義されているURL Schemeによりインストールされているか確認する


```objectivec
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"comgooglemaps://"]]) {
     /* インストールされている */

}else{
     /* インストールされていない */

}
```

インストール済みの場合は、パラメータ指定してMapオープン。

>Google Maps URL Scheme - Google Maps SDK for iOS — Google Developers 
>https://developers.google.com/maps/documentation/ios/urlscheme


iOS6の標準マップアプリは話題になったので、だいたいの人はインストール済みなのかな。。。
インストールされていない場合は、AppStoreリンクを表示する、ってのは、、、余計なお世話か。。。


#アプリ内でGoogle Mapsを使用したい場合 
アプリケーション内で、Google Mapsを使用したい場合は、SDKを使う　(API Keyが必要)

>Google Maps SDK for iOS — Google Developers 
>https://developers.google.com/maps/documentation/ios/
定数


現状
----------
大文字で書かれている物は弄らない。

```coffee-script
ALLCAPS = 'this is a constant, please don't mess with it'
```

const宣告
----------
Firefox、Chrome/node.js(V8)に実装され、[ECMAScript Harmony](http://wiki.ecmascript.org/doku.php?id=harmony%3aconst)にも提案されてる仕様です。

>const は Mozilla 特有の拡張であり、IE ではサポートされていませんが、Opera ではバージョン 9.0 からサポートされました。-[MDN](https://developer.mozilla.org/ja/docs/JavaScript/Reference/Statements/const)

注：coffee-scriptでconstは[リザーブ](http://coffeescript.org/documentation/docs/lexer.html#section-41)されでます。

```JavaScript
const foo = 'bar';
```

accessor methodによる偽装
----------
人によれば邪道、又はアンチパターンですが、面白半分で書いてみた。

```coffee-script
k = {}

Object.defineProperty k, 'foo', { value: 'bar', writable: false}

console.log k.foo
# bar

k.foo = '' # 上書き出来ません
console.log k.foo
# bar

Object.defineProperty k, 'foo', { value: 'fuga', writable: false}
# Error: Attempting to change value of a readonly property.
```
ブラウザとの相性
![browser support](http://ci.testling.com/haokang-den/constant.png)
Go言語でstructからmapへ変換

構造体のフィールド一覧を取得したくなったので、reflectを使って実装。

```go:struct2map.go
package main

import (
  "fmt"
  "reflect"
)

func StructToMap(data interface{}) map[string]interface{} {
  result := make(map[string]interface{})
  elem := reflect.ValueOf(data).Elem()
  size := elem.NumField()

  for i := 0; i < size; i++ {
    field := elem.Type().Field(i).Name
    value := elem.Field(i).Interface()
    result[field] = value
  }

  return result
}

type Hoge struct {
  Fuga int
  Moge string
}

func main() {
  hoge := Hoge{100, "hello"}
  m := StructToMap(&hoge)

  fmt.Println(m)
}
```
Go言語でURLエンコード

こちらを参考に作成しました。[JavaScriptにおけるURLエンコードの処理](http://www.cresc.co.jp/tech/java/URLencoding/JavaScript_URLEncoding.htm)

```go:urlencode.go
package main

import (
  "fmt"
)

func urlencode(s string) (result string){
  for _, c := range(s) {
    if c <= 0x7f { // single byte 
      result += fmt.Sprintf("%%%X", c)
    } else if c > 0x1fffff {// quaternary byte
      result += fmt.Sprintf("%%%X%%%X%%%X%%%X",
        0xf0 + ((c & 0x1c0000) >> 18),
        0x80 + ((c & 0x3f000) >> 12),
        0x80 + ((c & 0xfc0) >> 6),
        0x80 + (c & 0x3f),
      )
    } else if c > 0x7ff { // triple byte
      result += fmt.Sprintf("%%%X%%%X%%%X",
        0xe0 + ((c & 0xf000) >> 12),
        0x80 + ((c & 0xfc0) >> 6),
        0x80 + (c & 0x3f),
      )
    } else { // double byte
      result += fmt.Sprintf("%%%X%%%X",
        0xc0 + ((c & 0x7c0) >> 6),
        0x80 + (c & 0x3f),
      )
    }
  }

  return result
}

func main() {
  fmt.Println(urlencode("新宿しんじゅくｼﾝｼﾞｭｸsinjuku"))
}
```
Rで線形基底関数モデルのバイアスバリアンスを実測

PRML図3.5と同様に、25個のガウス基底で構成される線形基底関数モデルにおいて、正則化パラメータごとに、25点のサンプルデータ集合の生成とパラメータの学習を200回繰り返し、各モデル(20回分のみ描画)とその平均値を描きます。またその結果から、モデルの正則化パラメータごとに、モデルの期待損失を構成するバイアスとバリアンスを求めて、図3.6と同様の図を描きます。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/EjMLqa9_li/4.BiasVarianceDecomposition.png)

```r
frame()
set.seed(0)
N<-25
M<-25
ATTEMPT=200
xrange<-c(-0.0,1.0)
yrange<-c(-1.5,1.5)
x<-seq(1/(N*2), 1, 1/N)
base<-function(m,x) {
#        r<-x^m                          #多項式基底の場合
        r<-exp(-(x-(m-1)/(M-2))^2/(2*0.05^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
}
biassquared<-numeric(5)
variance<-numeric(5)
is<-1:7
lambdabase<-is-5
lambda<-exp(lambdabase)
par(mfrow=c(2,4))
for (i in is) {
	h<-function(x){sin(2*pi*x)}
	curve(h,type="l",xlim=xrange,ylim=yrange,col=2,ylab="t")
	title(paste0("ln(lambda)=", lambdabase[i]), cex.main=1)
	y=matrix(nrow=length(x),ncol=ATTEMPT)
	for (attempt in 1:ATTEMPT) {
		t<-sin(2*pi*x)+rnorm(N, 0, 0.5^2)
		t<-matrix(t,nrow=length(t))
		phi<-makePhi(M)
		w<-solve(lambda[i] * diag(M) + t(phi) %*% phi) %*% t(phi) %*% t
		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)...)
		}
		y[,attempt]<-estimate(x)
		if (attempt <= 20) {
			par(new=T)
			curve(estimate,type="l",xlim=xrange,ylim=yrange,col=1,ylab="")
		}
	}
	meany<-apply(y, 1, mean)
	par(new=T)
	curve(h,type="l",xlim=xrange,ylim=yrange,col=2,ylab="t")
	par(new=T)
	plot(x, meany, xlim=xrange,ylim=yrange,col=3,ylab="")
	biassquared[i]<-mean((meany - h(x))^2)
	variance[i]<-mean((y - meany)^2)

}
d<-data.frame(biassquared,variance,biassquared+variance)
rownames(d)<-lambdabase
matplot(d,type="l",axes=F,lty=1)
axis(1,1:length(lambdabase),lambdabase)
axis(2)
legend("topleft",legend=colnames(d),col=1:ncol(d),lty=1,cex=0.6)
```
capybara-webkitでWebページのスクリーンショットを撮る2013

> capybara-webkitでwebページのスクリーンショットを撮る - 橋本詳解 - http://d.hatena.ne.jp/shokai/20120302/1330670227

最新の capybara-webkit だとこちらのコードは動かない模様

#### Macの場合
```
brew install qt
gem install capybara-webkit
```

```ruby
require 'capybara-webkit'

browser = Capybara::Webkit::Driver.new('web_capture').browser
browser.visit 'http://qiita.com/'
browser.render('qiita.png', 1280, 650)
```

![](https://dl.dropbox.com/u/12623748/Screenshots/qiita.png)

参考 / capybara-webkit/lib/capybara/webkit/driver.rb at master · thoughtbot/capybara-webkit · GitHub - https://github.com/thoughtbot/capybara-webkit/blob/master/lib/capybara/webkit/driver.rb
今日もImageMagickインストール済みCentOS 5.6でRMagickをインストールするのに手間取った

```
$ gem install rmagick
…
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.
```
MagickCoreライブラリが認識されてなさそうなのでライブラリをgrepしてみる

```
# ldconfig -p | grep -i magick
	libMagickWand-Q16.so.7 (libc6,x86-64) => /usr/lib64/libMagickWand-Q16.so.7
	libMagickWand-Q16.so (libc6,x86-64) => /usr/lib64/libMagickWand-Q16.so
	libMagickCore-Q16.so.7 (libc6,x86-64) => /usr/lib64/libMagickCore-Q16.so.7
	libMagickCore-Q16.so (libc6,x86-64) => /usr/lib64/libMagickCore-Q16.so
	libMagick++-Q16.so.7 (libc6,x86-64) => /usr/lib64/libMagick++-Q16.so.7
	libMagick++-Q16.so (libc6,x86-64) => /usr/lib64/libMagick++-Q16.so
```

libMagickCore-Q16.so はあるけど -Q16 が邪魔で認識できなかったっぽい

```
# cd /usr/lib64/
# ln -s libMagickCore-Q16.so libMagickCore.so
```
シムリンク貼ったらインストールできた
端末エミュレータ間でファイル転送

複数の端末エミュレータを開いてそれぞれ別々のホストで作業しているとき、
ログイン先のホスト間でファイル転送をしたくなることがあります。
scpが使えればいいのですがホスト間が何ホップも離れていると手間。

そんなときは Base64 エンコードしてコピペしてみてはいかがでしょう。
転送元でエンコードしたデータをマウスでコピーし、転送先へペーストします。

転送元でファイルをエンコード:

```sh
$ tar czf - FILE... | openssl base64 -e
XXXX... <= エンコードされたデータをマウスで選択してコピーする
```

転送先でファイルをデコード:

```sh
openssl base64 -d | tar xzf -
XXXX... <= コピーしたデータをペーストする
^D      <= Ctrl-D でペーストを終了する
```

マウスでコピーする代わりに screen のロギング機能も使えます。
転送するデータが小さいときにしか使えませんが時々役に立ちます。
LVM で HDD を追加する

（メモするの忘れたので、記憶で書いています。）

SSD を買ったので、こちらに Ubuntu 12.04 LTS を新規にインストールして、それまで使っていた HDD はフォーマットして /home, /var に割り当てようとおもった。

まずは Ubuntu 12.04 LTS のインストール。LVM を利用してインストールするには alternate の iso でないとならなかった。 http://www.ubuntu.com/download/desktop/alternative-downloads から ubuntu-12.04.1-alternate-amd64.iso.torrent をダウンロードし、bit torrent で iso をダウンロード。インストール時気をつけるのは LVM を利用するオプションを選択すること。インストール時にパーティションの設定をしてしまいたかったのだけど、やり方がわからなかったので、自動にまかせて SSD にインストールした。

インストール後、fdisk を使って HDD の既存のパーティションを削除し、[『LVMでディスク拡張(CentOS6 + lvm2 + ext4)』](http://www.cyberciti.biz/faq/linux-disk-format/) と man を参考にボリュームグループの拡張まで行った。

```
$ sudo fdisk -l    #HDD を確認。/dev/sdb として認識していた。
$ sudo pvcreate /dev/sdb
$ sudo vgdisplay -C    #volume group の名前を確認。desktop だった。
  VG      #PV #LV #SN Attr   VSize VFree
  desktop   2   4   0 wz--n- 1.03t    0
$ sudo vgextend desktop /dev/sdb    #/dev/sdb を desktop に参加させる
```

[『新しい論理ボリュームを作成するには』](http://www.ibm.com/developerworks/jp/linux/library/l-partplan/index.html#b) を参考に新しい論理ボリュームを作り、 ext4 でフォーマットした。

```
$ sudo lvcreate -L 800g -n home desktop    #論理ボリューム作成
$ sudo lvcreate -l 100%FREE -n var desktop
$ sudo mkfs.ext4 /dev/desktop/home    #ext4 でフォーマット
$ sudo mkfs.ext4 /dev/desktop/var
```

ここで一旦 Ubuntu を終了し、Shift を押しながら起動し、リカバリーモードで起動する。リカバリーモードでは Read Only でマウントされているので、マウントしなおす必要がある。あとは、/home と /var を作った論理ボリュームにコピーして、/home と /var をリネームする。

```
# mount -w -o remount /

# mkdir /mnt/new_home
# mount /dev/desktop/home /mnt/new_home
# cd /home
# cp -ax * /mnt/new_home
# mv /home /home.old
# mkdir /home

# mkdir /mnt/new_var
# mount /dev/desktop/var /mnt/new_var
# cd /var
# cp -ax * /mnt/new_var
# mv /var /var.old
# mkdir /var
```

/etc/fstab に下を追記。

``` 
/dev/mapper/desktop-home /home              ext4    discard,noatime,errors=remount-ro 0       2
/dev/mapper/desktop-var  /var               ext4    discard,noatime,errors=remount-ro 0       2
```

再起動して、 df -h などで確認すると /home, /var が新しく作った論理ボリュームになっているはず。

```
$ df -h
Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/desktop-root  102G  4.6G   92G   5% /
udev                      7.9G  4.0K  7.9G   1% /dev
tmpfs                     2.0G   60K  2.0G   1% /tmp
tmpfs                     3.2G  892K  3.2G   1% /run
none                      5.0M     0  5.0M   0% /run/lock
none                      7.9G  3.3M  7.9G   1% /run/shm
/dev/sda1                 228M   48M  169M  22% /boot
/dev/mapper/desktop-var   130G  1.1G  122G   1% /var
/dev/mapper/desktop-home  788G  142G  607G  19% /home
```

その他参考にしたページ
[パーティションの活用: /home の移動編](http://www.ibm.com/developerworks/jp/linux/library/l-partplan/index.html)
UILabel・UIImageViewでタッチイベントを拾う方法の例外

UILabelやUIImageViewはUIButtonのようにはタップイベントが取れない。

そのため、これらのタップイベントを取りたい場合は、
下記のURLに書かれているように、touchesBeganメソッドやtouchesEndedメソッドを
オーバーライドしてイベントを取得するのが王道（と思われる）
http://www.moonmile.net/blog/archives/2969

しかし 「UIScrollViewの上に乗っているUILabeやUIImageView」 の場合は、
タップしてもtouchesBeganメソッドやtouchesEndedメソッドが反応しない。
（UIScrollViewのtouchesBegan/touchesEndedメソッドの実装によるものと推測）

その場合は、下のURLのようにUITapGestureRecognizerを使うやり方にすると、
タップイベントを取ることができる。
http://php6.jp/iphone/2011/11/11/uilabel%E3%82%84uiimageview%E3%81%8C%E5%BF%9C%E7%AD%94%E3%81%97%E3%81%AA%E3%81%84/
Amazon SESを使ってEC2からメールを送る方法

# Amazon SESとは？
Amazon Simple Email Service(SES)はAPIを使って、大規模にEmailの配信が行えるシステム。
従量課金で使えて、PostfixやDNSの設定をしなくても良いので、cron等のメール送信をEC2から行う際にも利用しやすい。
ただし、送料として1日100通以上メールを送る場合は、Production Requestという申請が必要なため、 場合に応じて申請する。

# ssmtpとSESを使う場合の設定方法
ssmtpは、外部のSMTPサーバを利用してメールを送るもの。SESでなく、Gmailを使う方法なんかもある。
今回は、Ubuntu 12.04で設定をした。

## 1.SESの設定
### 1.1 送信元(及び送信先)に利用するメールアドレスのVerify
認証したメールアドレスを送信元をにする必要があるため、設定を行う必要がある。 なお、Production Requestをしていない場合は、送信先もVerifyしたメールアドレスに限定されるため、この方法で登録する。
[こちら](https://console.aws.amazon.com/ses/home?#verified-senders:email)にアクセスして、利用したい送信元のメールアドレスをVerifyする
(例: example@gmail.com)
登録したメールアドレスにverify用メールが届くので、ブラウザでリンクをクリックする。

### 1.2 SMTP用のIAMユーザを作成する
[こちら](http://dev.classmethod.jp/cloud/amazon-ses-smtp/)のサイトが参考になる。
"Create My SMTP Credentials"をする
作成後得られる、Security Credentialsの"SMTP Username"と"SMTP Password"を保存する

### 2. ssmtpの設定
設定は[こちら](http://www.bbck.net/blog/2011/12/18/ssmtp-and-amazon-ses)が参考になります。

### 2.1 ssmtpのインストール
今回はUbuntu 12.04で設定したのでapt-getでインストールした。
`$ sudo apt-get install ssmtp`

### 2.2 ssmtp.confのグループとパスワードを変更する
ssmtp.confには平文で(！)UsernameとPasswordが保存されるため、一応アクセス権限を変更しておく。 ただし、chgrpで設定するグループは、メールを送信したいユーザを全て登録すること。
`$ sudo groupadd ssmtp`
`$ sudo adduser username ssmtp`

一度ここでログインしなおしたほうが無難。

`$ sudo chgrp ssmtp /etc/ssmtp/ssmtp.conf`
`$ sudo chmod 660 /etc/ssmtp/ssmtp.conf`

### 2.3 /etc/ssmtp/ssmtp.confの設定を変更する
下記項目を修正/追記する。

```sh:/etc/ssmtp/ssmtp.conf
mailhub=email-smtp.us-east-1.amazonaws.com:465
AuthUser=SMTPUSER
AuthPass=SMTPPASS
 
rewriteDomain=gmail.com
hostname=gmail.com
 
UseTLS=YES
```

リージョンが異なる場合は、mailhubを変える
SMTPUSERとSMTPPASSは1.2を参照

### 2.4 revaliasesの設定
SESはfromにverify済みのメールアドレスしか利用できないため、/etc/ssmtp/revaliasesの設定をする。 これをしないと、cron等でメールが送れずエラーになる。 送信元のアドレス(example@gmail.com)とmailhubは必要に応じて変更すること。

```sh:/etc/ssmtp/revaliases
# sSMTP aliases
#
# Format:       local_account:outgoing_address:mailhub
#
# Example: root:your_login@your.domain:mailhub.your.domain[:port]
# where [:port] is an optional port number that defaults to 25.
root:example@gmail.com:email-smtp.us-east-1.amazonaws.com:465
user:example@gmail.com:email-smtp.us-east-1.amazonaws.com:465
```

### 2.5 メールの送信テスト
テストファイルをmail.txtとして作成。(下記の様なフォーマット)

```text:mail.txt
From: example@gmail.com
To: youraddress@gmail.com
Title: Test
 
Test
テストメールを送信する。成功すれば何もエラーはでないはず。
```

`$ ssmtp -t < mail.txt`

### 番外編: crontabでの送信先の設定
MAILTOを書けばOK。ただし、Production Requestしていない場合送信先のverifyをすること。
MAILTO="youraddress@gmail.com"

参考URL:
http://www.bbck.net/blog/2011/12/18/ssmtp-and-amazon-ses
http://dev.classmethod.jp/cloud/amazon-ses-smtp/
http://www.usupi.org/sysad/172.html
THREE.js で継承しる

なんか既に常識かとおもいきやぐぐってもあまり情報が出て来なかったので。

three.js で mesh とかを継承したクラスを作る時
いつもの CoffeeScript なノリで

```faild.coffee
class HogeMesh extends THREE.Mesh
	constructor:(geo, mat)->
		super(geo, mat)
```

とかくとうまいこと継承されません。
three.js な何かを Coffee で継承させたい場合

```super.coffee
class HogeMesh extends THREE.Mesh
	constructor:(geo, mat)->
		THREE.Mesh.call(@, geo, material)
```

とする必要があるようです。
というかこの場合多分 `extends THREE.Mesh` が要らないような気もしますが気持ちの問題で残してます。
quicklispでslimeを入れる

slimeインストール

sbclから

```cl
CL-USER> (ql:quickload :quicklisp-slime-helper)
To load "quicklisp-slime-helper":
  Load 1 ASDF system:
    quicklisp-slime-helper
; Loading "quicklisp-slime-helper"
.
slime-helper.el installed in "/Users/garaemon/quicklisp/slime-helper.el"

To use, add this to your ~/.emacs:

  (load (expand-file-name "~/quicklisp/slime-helper.el"))
  ;; Replace "sbcl" with the path to your implementation
  (setq inferior-lisp-program "sbcl")


(:QUICKLISP-SLIME-HELPER)
```

なので、.emacsに以下を追加

```cl:.emacs
  (load (expand-file-name "~/quicklisp/slime-helper.el"))
  ;; Replace "sbcl" with the path to your implementation
  (setq inferior-lisp-program "sbcl")
```

emacsからM-x slimeで実行
Object#try

有名だけど。。。

### relation

```
Book belongs to Author
Author has_many Books
```

### model

```
author = Author.create!(name: 'foo')
book1 = Book.create!(title: 'bar')
book2 = Book.create!(title: 'baz', author_id: author.id)
```

## 課題: よくあるエラー

```ruby
book1.author.name
# => NoMethodError: undefined method `name' for nil:NilClass
```

### 解決策 3項演算子

```ruby
book1.author.present? ? book1.author.name : 'unknown'
# => "unknown"
book2.author.present? ? book2.author.name : 'unknown'
# => "foo"
```

### 解決策 Object#try

```ruby
book1.author.try(:name) || 'unknown'
# => "unknown"
book2.author.try(:name) || 'unknown'
# => "foo"
```

## Object#tryの使い方

### メソッドの引数を渡す

```ruby
x = [1, 2, 3]
x.try(:delete, 1)
# => 1
pp x
# => [2, 3]
```

### メソッドのブロックを渡す

```ruby
x = nil
x.try(:map){|o| o.to_i }
# => nil
y = %w(1 2 3 4 5)
# => ["1", "2", "3", "4", "5"]
y.try(:map){|o| o.to_i }
# => [1, 2, 3, 4, 5]
```

※別解

```ruby
y.try(:map, &:to_i)
```

### tryにブロックを渡す

```ruby
x = nil
x.try {|o| o.sum / o.size } || 0
# => 0
y = [1, 2, 3, 4, 5]
y.try {|o| o.sum / o.size } || 0
# => 3
```

see:
https://github.com/rails/rails/blob/6ef9fda1a39f45e2d18aba4881f60a19589a2c77/activesupport/lib/active_support/core_ext/object/try.rb#L32
https://github.com/rails/rails/blob/6ef9fda1a39f45e2d18aba4881f60a19589a2c77/activesupport/lib/active_support/core_ext/object/try.rb#L54
native extension 入りの gem をリビルドする

OSを再インストールしたおかげで、 rbenv でインストールした、ホームディレクトリ以下に入ってる gem のネイティブ拡張の動作が怪しい。リビルドしたい。

そんなときは

```shellscript
% gem prestine --all --extensions
```
で（初期状態に巻き戻す副作用として）まるっとリビルド出来る

マニュアル:  http://guides.rubygems.org/command-reference/#gem_pristine

しかしこれ、途中で転けると全部やり直しだなぁ...つらい...
sbclにquicklispを導入する

sbclはbrewやらaptで入ってるとする

```sh
curl -O http://beta.quicklisp.org/quicklisp.lisp 
sbcl --load quicklisp.lisp
...中略...
(quicklisp-quickstart:install)
...中略...
(ql:add-to-init-file)
```

ライブラリのインストール

```cl
(ql:quickload :vecto)
```
オフラインリアルタイムどう書く第7回の参考問題をjavascriptで解く

```javascript
var table = function(){
    var a = [[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]];
    var update = function(key, keyElems){
        for (var i = 0; i < a.length; ++i) {
            var s = '';
            for (var j = 0; j < a.length; ++j) {
                s += key.match(/[A-F]{1}/) ? a[i][keyElems[j][1]] : a[keyElems[j][1]][i];
            }
            for (var j = 0; j < a.length; ++j) {
                a[key.match(/[A-F]{1}/) ? i : j][key.match(/[A-F]{1}/) ? j : i] = parseInt(s.substr(j, 1), 10);
            }
        }
    };
    return {
        sort: function(key){
            var n = key.charCodeAt(0) - (key.match(/[A-F]{1}/) ? 'A'.charCodeAt(0) : 'u'.charCodeAt(0));
            var keyElems = new Array();
            for (var i = 0; i < a.length; ++i) {
                keyElems[i] = new Array();
                keyElems[i][0] = key.match(/[A-F]{1}/) ? a[n][i] : a[i][n];
                keyElems[i][1] = i;
            }
            update(key, keyElems.sort());
        },
        ans: function(){
            var ret = '';
            for (var i = 0; i < a.length; ++i) {
                ret += a[0][i].toString();
            }
            return ret;
        }
    };
};

test('ord7_prac0', function(){
    var t = table();
    var input = 'AvEx';
    for (var i = 0; i < input.length; ++i) {
        t.sort(input.substr(i, 1));
    }
    deepEqual(t.ans(), '305027');
});
```
CocoaPodsでのBuild Settingsの扱い

FrogApps 技術ブログ始めました！
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps

---
CocoaPods便利ですね。ライブラリを組み込む際に、いろんな依存関係をうまくプロジェクトの外に追いやってくれます。

試しにQRコード用のライブラリ[Zxing](http://code.google.com/p/zxing/)を組み込んで、どんな風になるかみてみましょう。このZxing、CocoaPodsを使わない場合は、沢山の.frameworkを組み込んだり、ヘッダファイルの参照パスを指定しなきゃいけなかったりとプロジェクトのBuild settingsへ手を加える必要があります。

CocoaPodsのインストールは以下の通り。頻繁に更新されているようなので、時々インストールし直すとよさそうです。現在(2013/1月)のバージョンは0.16.1。

```
$ sudo gem install cocoapods
$ pod setup
```

あとは、プロジェクトフォルダの直下にPodfileというファイルを作成して、組み込むプロジェクトを記載します。　

```text:Podfile
platform :ios

pod "ZXing", '2.1'
```

ライブラリを読み込みます。

```
$ pod install
```

プロジェクト名.xcworkspaceというファイルができるので、Xcodeで開きます。元のプロジェクトと、Podsというプロジェクトを含んだ形のワークスペースが開きます。あとはTargetをプロジェクトにあわせてビルドすれば、Podsのほうもビルドしてくれます。これだけです。

つまり、Cocoa PodsでZxingを組み込んだ場合、プロジェクトファイルに.frameworkを追加したりヘッダの読み込みパスを追加したりが必要ないんですよ(ライブラリにもよるかも)。手で組み込むよりずいぶんと楽です。

では、本来必要だったその辺の設定はどこに行ったかというと、Pods/Pods.xcconfigに記載されます。CocoaPodsが外部ライブラリのための設定をここに記載してくれます。

よって、プロジェクトのBuild Settingsには、そのプロジェクト本体に必要なもののみを記載すれば良いことになります。「外部ライブラリのためにBuild settingいじったけど、後で見たら何のために変更したか分からない」なんてことも防げますね。

```text:生成されたPods.xcconfig
ALWAYS_SEARCH_USER_PATHS = YES
HEADER_SEARCH_PATHS = ${PODS_HEADERS_SEARCH_PATHS} ${PODS_ROOT}/ZXing/cpp/core/src/ ${PODS_ROOT}/ZXing/iphone/ZXingWidget/Classes/**
OTHER_LDFLAGS = -ObjC -liconv -lstdc++ -framework AVFoundation -framework AddressBook -framework AddressBookUI -framework AudioToolbox -framework CoreGraphics -framework CoreMedia -framework CoreVideo -framework ImageIO -framework QuartzCore
PODS_BUILD_HEADERS_SEARCH_PATHS = "${PODS_ROOT}/BuildHeaders" "${PODS_ROOT}/BuildHeaders/ZXing"
PODS_HEADERS_SEARCH_PATHS = ${PODS_PUBLIC_HEADERS_SEARCH_PATHS}
PODS_PUBLIC_HEADERS_SEARCH_PATHS = "${PODS_ROOT}/Headers" "${PODS_ROOT}/Headers/ZXing"
PODS_ROOT = ${SRCROOT}/Pods
```

ちなみに、CocoaPodsが取得してくるものには、そのライブラリのドキュメントやらサンプルコードやらは含まれないことが多いです。その辺は、ライブラリ本来のサイトを見に行きましょう。ライブラリを作られた方に感謝しつつ。
Mountain Lion+Homebrew な環境で rmagick がインストールできない問題を解決する

**追記：**ビルドスクリプトにパッチを当てたバージョンの rmagick を使う方法もある→[rmagick を最近の環境でもインストール出来るようにする方法](http://qiita.com/items/6ea0a284a2fb91ac740f)

この記事で想定するバージョン：

- imagemagick: 6.8.0-10
- rmagick: 2.13.1

参考にしたページ： http://stackoverflow.com/a/14097234/454997

Homebrew で imagemagick をインストールし、 `gem install rmagick` すると以下のエラーが出る。

```

Building native extensions.  This could take a while...
ERROR:  Error installing rmagick:
        ERROR: Failed to build gem native extension.

        /Users/uasi/.rbenv/versions/1.9.3-p194-perf/bin/ruby extconf.rb
checking for Ruby version >= 1.8.5... 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.

```

この問題を解決するには、 rmagick が期待するファイル名になるように imagemagick ライブラリのシンボリックリンクを作ってやればよい：

```sh

# imagemagick のライブラリディレクトリに移動
cd /usr/local/Cellar/imagemagick/6.8.0-10/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

# ライブラリを配置し直す
brew unlink imagemagick
brew link imagemagick

```
colClasses を推測して read.table()/read.csv() を高速化する．

Rで100万行もあるような巨大なファイルを `read.table()`/`read.csv()` するのは時間がかかります．そんなときには `colClasses` を設定してあげることで読み込みが速くなることがあります．たとえば，全てのカラムが numeric なら，

    df <- read.csv("foo.csv", colClasses = "numeric")

と指定するだけで ok です．これで倍近く速くなれば占めたものです．しかし，カラム毎に class が異なり，さらに，たくさんのカラムがあるというときに手で `colClasses` を書くのは心が折れます．そんなときには，ファイルの先頭を少しだけ読み込んで `colClasses` を推測しましょう．．

    df.head <- read.csv("foo.csv", nrow = 10)
    classes <- sapply(initial, class)
    df <- read.csv("foo.csv", colClasses = classes)


## 参考 URL

https://www.coursera.org/course/compdata
nil? empty? blank? present? の使い分け


http://railsdoc.com/active_support

まず、nil?とempty?はrubyのメソッドで、blank?とpresent?はrailsで拡張されたメソッド（つまりrubyでは使えない）ってことを覚えておく。

-
#nilは存在しないという意味。
対して　""は「何も無い」が存在している。空白の存在。

```
book.nil?
```
もしbook自体が存在しないなら、上記はtrueを返す。

#empty?は「入れ物」は存在するのが前提。

```
book.empty?
description.empty?
```
は、bookやdescriptionそのものは存在していることが前提で、その配列の中身が空か、文字列の中身が空の場合にtrueを返す。
配列や文字列そのもの（入れ物）が無い場合にはNoMethodErrorが発生する。空ですか？と聞いてるわけだから、少なくとも「入れ物」が存在しないとダメってことか。

#blank?は、nil?とempty?の合わせ技
では、中身が空か、または入れものそのものが存在しないときの判定はどうなるか。blank?が使える。empty?とnil?を足したようなものだ。
nilと空のオブジェクトを判定できる。

```
unless description.blank?
end
```

と書けば、descriptionの文字列が空か、そもそもdescription自体が存在しない場合に処理をスキップできる。

#present?は、!blank?と同じ意味
ちなみに上の処理は present?を使って

```
if description.present?
end
```
と書ける。

-

nil? すべてのオブジェクトに定義されている。nilのときのみtrueを返す。
empty? 文字列の長さが0のとき、または配列が空のときにTrueを返す。もちろん数値には定義されていない。
blank? railsの拡張。nil, "", " ", [], {} のいずれかでTrueを返す。
ActiveRecordのコールバック関数の呼び出し順

いつも忘れちゃう、ActiveRecordのコールバック関数の呼び出し順番

# create
```ruby
before_validation
before_validation_on_create
 # => ここでバリデーション
after_validation
after_validate_on_create
before_save
before_create
 # => ここで登録
after_save
after_create
```

# update
```ruby
before_validation
before_validation_on_update  
 # => ここでバリデーション
after_validation
after_validate_on_update
before_save
before_update                
 # => ここで更新
after_save
after_update
```

# destroy
```ruby
before_destroy
 # => ここで削除
after_destroy
```
iPhoneで開いているWebページの「要素の詳細を表示」したい

#手順
1. 【ケーブル】iPhoneをケーブルでMacにつなぐ
2. 【iPhone】設定→Safari→詳細→WebインスペクタをOnにする
3. 【iPhone】Safariを開いた状態に、詳細を表示したいページを開けておく。
4. 【Mac】Safariを開く
5. 【Mac】Safariのメニュー → 開発 →（iPhoneの名前）
クラスにバインディングしてYAMLの読み書き

ツリー構造かつオブジェクト参照のあるデータ構造をYAML形式でファイルに入出力する[サンプル](https://github.com/Tsutomu-KKE/YamlTest)です。
同じ[YAMLファイル](https://github.com/Tsutomu-KKE/YamlTest/blob/master/test.yml)をC#およびPythonから読んでいます。

* Company クラスが Employee のリストと Group のリストを持っている
* Group クラスが Employee を持っている
* test.yml の Company オブジェクトは、Employees[0] と Groups[0].Employees[0] が同じデータとなっている。
型判別


```Player.cpp

#include "Collision.h"

#include "Character.h"
	#include "Player.h"
	#include "Enemy0.h"
	#include "Enemy1.h"


void	Player::CharacterHitcheck( Character* character )
{

	if( typeid( *character ) == typeid( Enemy0 ) ){		//	Enemy0だったら
		if( this->collision.Box( character ) ){			//	四角の当たり判定
			this->hp -= 5;
		}
	}else if( typeid( *character ) == typeid( Enemy1 ) ){	//	Enemy1だったら
		if( this->collision.Circle( character ) ){			//	円形の当たり判定
			this->hp -= 10;
		}
	}

}
```

・「Enemy0」と「Enemy1」は「Character」の派生クラスであることが前提です。
・Playerには当たり判定用クラスを持たせています。Collisionクラス内で具体的な処理を記述しています。

「このオブジェクトは他と違う処理をさせたい」時に使うと便利かもしれないです。
ファイル名でソートしたときに一番最後にくるファイルを開く PowerShell スクリプト

```powershell
Get-ChildItem C:\hoge\fuga | Sort-Object -Descending | Select-Object -First 1 | Invoke-Item
```

エイリアスを使えば、もう少し短く書ける。

```powershell
ls C:\hoge\fuga | sort -des | select -f 1 | ii
```

PowerShell は、この手のことがパイプを使ってサクサク書けるのが良いな、と思う。
入出力が（文字列ではなくて）オブジェクトそのものなので、細かいことを気にしなくてもだいたい思ったように動く。
powermated 起動スクリプト

かなりニッチなアルミ削りだしボリューム風デバイス「powermate」
をLinuxにつなぎこんで利用するにあたっての起動スクリプト。
（そもそもドライバうんぬんが・・ある）

```sh
#!/bin/sh

# source function library
. /etc/rc.d/init.d/functions

SERVICE="powermated"
RETVAL=0

PIDFILE=/var/run/powermated.pid
POWERMATED=/usr/local/bin/powermated

start() {
        echo -n "Starting ${SERVICE}:"
        $POWERMATED -d /dev/powermate -s -m PCM &
        RETVAL=$?
        if [ $RETVAL = 0 ]; then
                success
                touch /var/lock/subsys/powermated
                echo '/sbin/pidof $SERVICE' > $PIDFILE
        else
                failure
        fi
        echo
}

stop() {
        echo -n "Stopping ${SERVICE}:"
        killproc $POWERMATED -TERM
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
                rm -f /var/lock/subsys/powermated
                rm -f $PIDFILE
        fi
        echo
}

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        status)
                status $SERVICE
                ;;
        restart)
                stop
                start
                ;;
       *)
                echo "Usage : $0 (start|stop|status|restart)"
                RETVAL=1
esac

exit $RETVAL
```
Xvfb 起動スクリプト

[変えた方がよい]
・ディスプレイ番号やサイズを変数化したほうがよいでしょう

```sh
#!/bin/bash
#
# chkconfig: - 91 35
# description: Starts and stops XVfb. \
#              used to provide virtual frame buffer.

# Source function library.
. /etc/init.d/functions

SERVICE="Xvfb"
RETVAL=0

XVFB=/usr/bin/Xvfb

start() {
    echo -n "Starting ${SERVICE}: "
    daemon ${XVFB} :5 -screen 0 800x600x24 &
    echo
}

stop() {
    echo -n "Stopping ${SERVICE}: "
    killproc Xvfb
    echo
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        stop
        start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart}"
        RETVAL=1
esac

exit ${RETVAL}
```
画像ファイルをまとめてリサイズする

[前提]
・画像は上書きしてよい
・スクリプトおよび対象ファイルは同じディレクトリ下
・アスペクト比は変えないので、縦横片方のみ指定

```sh
#!/bin/sh
w=$1
EXT=$2
mogrify -resize ${w} -unsharp 2x1.4+0.5+0 -quality 100 *.${EXT}
```

[実行]
$ imgresize.sh 1024 JPG
SSH公開鍵をさくっとサーバへコピー


```sh:
cat ~/.ssh/id_rsa.pub | ssh myname@remotehost "cat >> ~/.ssh/authorized_keys"
```

ローカルからコマンド一発

※追記：ssh-copy-idというコマンドで同じ事が出来るようです。Macだとbrew install ssh-copy-idとかで導入可。
okkezさんコメントありがとうございます。
[rails]重いSQLクエリが走った際の自動explain表示の閾値変更

今更ながら重いSQLクエリが走った際にログにSQLのexplainが走るのを知ったのでメモ。
開発環境などでより小さな閾値でexplain表示させたい場合は下記設定を変えればいいみたい。

```ruby:config/environments/development.rb
config.active_record.auto_explain_threshold_in_seconds = 0.5
```

デフォルトで0.5とかなっているので0.1とかにすると100msを超えるクエリが走った際にexplainで教えてくれる。
Bashのプロンプトを変える(OSX)

Mac OS XはマルチユーザOSですが開発用に使う場合、自分専用であることがほとんどなのでTerminalのプロンプトに自分のアカウントが表示されてても特に嬉しくないですね。短いプロンプトの方がいい。

## デフォルト

```
hostname:Desktop iwazer$ 
```

## いらないものをトル

大昔の共有ホストじゃないんだしホスト名、ユーザ名要らない〜

```
PS1='\W $ '
Desktop $
```

これでカレントワーキングディレクトリの末端のみの表示になります。

## パス出てないとイヤ

ホスト名、ユーザ名の代わりにディレクトリはパス（Home以下は相対だが）がいいという場合、小文字の\wにすればOK

```
PS1='\w $ '
~/Desktop/work $ 
```

## いつもここから

~/.bash_profileに仕込んでおけば新しくTerminalを開くと同時に適用されます。

```
 :
export PS1='\W $ '
```

## 時間を出す

コマンドのおおまかな実行時間を知りたいとかよくありますね。プロンプトに時間が出てると便利かも！

```
export PS1='\W \t $ '
```

まぁ、これプロンプトが表示された時の時刻なので、コマンドをコピーしておいて、一度空打ちしてからペースト＆実行しないと、開始時間として使えないわけですがあくまでも目安として。

_ちゃんと実行時間を知るのが目的ならtime使えや_(｀・д・´)

## 色をつける

エスケープシーケンス使うと色が付きますが詳しいことはググれ…

```
export PS1='\[\033[40;1;32m\]\W \[\033[40;2;37m\]\t\[\033[0m\] $ '
```

## Gitのブランチを出す ｷﾀ━(ﾟ∀ﾟ)━!

ちょっとまてよコレ、ナイスすぎるだろ。
https://cybozu.atlassian.net/wiki/pages/viewpage.action?pageId=3145730#Git&GitHub-現在のブランチをプロンプトで表示したい

しかし、そのままではMacのBashでは使えなかったので修正。

_このコードは少々ダメなとこがあります。下に加筆あり_

```shellscript
git_branch() {
  echo $(git branch 2>/dev/null | sed -ne "s/^\* \(.*\)$/\1/p")
}
```

そんなわけで、いまの私の設定はコレ

```
export PS1='\[\033[40;0;33m\]\W/ \[\033[40;2;37m\]\t\[\033[0m\] \[\033[40;1;32m\]$(git_branch)\[\033[0m\] $ '
```

gitプロジェクトフォルダであろうとなかろうと毎回、新しい行になるたびにgit branchが実行されるが、まぁ今のマシンは速いから (ﾟεﾟ)ｷﾆｼﾅｲ!!

## おまけ

ちなみにデフォルトの設定をわざわざ書くと

```
export PS1='\h:\W \u$'
```

こういうことです。

## 2013/04/13 追記

`git-branch`はたいてい色が付く設定で利用していると思われます。こんな感じ。

```text:.gitconfig
[color]
	branch = always
	diff = always
	status = always
	interactive = always
```

ということは、上記の`git_branch`関数はエスケープシーケンスが付いてる上にさらに付けようとしていた（-ω-）

なぜ気づいたかというと、会社のOSX Lionでは何の問題もなかったのに、自分のOSX Mountain LionだとBashで履歴マッチとかさせるとカーソルポジションがおかしくなってたから。

git-branchコマンドに--no-colorオプションを渡したら解決しました。

```shellscript:.bash_profile
git_branch() {
  echo $(git branch --no-color 2>/dev/null | sed -ne "s/^\* \(.*\)$/\1/p")
}
```

また、自分の設定はって紹介していたプロンプトも後ですぐに色を変えるのに無駄にリセットしてたり（背景色によっては必要かもですが）してるのが気になったので、現在の設定を書いておきます。

```shellscript:.bash_profile
export PS1='\[\033[0;33m\]\W/ \[\033[1;30m\]\t \[\033[1;32m\]$(git_branch)\[\033[0m\] $ '
```
typeof/instanceofをより使いやすく

[色んな所](http://bonsaiden.github.com/JavaScript-Garden/ja/#types.typeof)で[罵倒](http://coffeescriptcookbook.com/chapters/classes_and_objects/type-function)[されてる](http://javascript.crockford.com/remedial.html)javascript/coffeescriptの型判定関数ですが。
パパッと使い勝手のいい関数で補完しましょう。
方法一、[JavaScript Garden](http://bonsaiden.github.com/JavaScript-Garden/ja/#types.typeof)参照
---------------------------------------


```coffee-script
typeOf = (obj) ->
  Object.prototype.toString.call(obj)[8...-1]
```

方法二、[CoffeeScript Cookbook](http://coffeescriptcookbook.com/chapters/classes_and_objects/type-function)参照
---------------------------------------

**要注意!**
ここでのエラーはオブジェクトと判定されます（ある意味正しい）

>typeOf(new Error()) === 'object'

```coffee-script
typeOf = (obj) ->
  if obj == undefined or obj == null
    return String obj
  classToType = new Object
  for name in "Boolean Number String Function Array Date RegExp".split(" ")
    classToType["[object " + name + "]"] = name.toLowerCase()
  myClass = Object.prototype.toString.call obj
  if myClass of classToType
    return classToType[myClass]
  return "object"
```
RubyのMechanizeではてなブログへ投稿

はてなブログのエンドポイントがわからなかったので、Mechanizeで作ってみました。

- - -

Mechanizeをインストールしておいて下さい。

`gem install mechanize`

はてなのIDとパスワードを各自設定してください。

```ruby:hatena.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
              
require 'mechanize'
require 'pp'  
              
username = '****'
password = '****'
              
agent = Mechanize.new
              
agent.get('https://www.hatena.ne.jp/login') do |page|
  response = page.form_with(:action => '/login') do |form|
    form.field_with(:name => 'name').value = username
    form.field_with(:name => 'password').value = password
  end.click_button
              
  if response.body.include?('The Hatena ID or password you entered does not match our records.')
    puts 'error: failed to login'
    exit      
  end         
end           
              
agent.get("http://blog.hatena.ne.jp/#{username}/#{username}.hatenablog.com/edit") do |page|
  response = page.form_with(:id => 'edit-form') do |form|
    form.field_with(:name => 'title').value = 'Mechanizeから投稿'
    form.field_with(:name => 'body').value = 'Mechanizeから投稿しました。'
  end.click_button
end
```

下から3行目と4行目を変更すれば、記事のタイトルと内容を変更できます。

カテゴリ指定もできるといいなぁ
前から気になっていたLiftを使って見る話


思い立ってやってみました。
まずはインストールですが、コレがわかりにくい。

色々調べて[この記事](http://jeppenejsum.wordpress.com/2010/04/16/lift-quick-start-look-ma-no-maven/)を見つけました。どうやらGradleを使って最小構成でインストール出来るようです。

```
 git clone git@github.com:jeppenejsum/liftstart.git
```

で、このままだと構成が少し古いので、build.gradleのバージョン指定をいじります。

```groovy:build.gradle
// Minimal build.gradle for Lift project
apply {
    plugin 'scala'
    plugin 'war'
    plugin 'jetty'
    plugin 'eclipse'
}

scalaVersion = '2.9.2'
liftVersion = '2.5-M4'
specs2Version = "1.8.2"

jettyRun.contextPath = "/"

repositories {
    mavenCentral()
    mavenRepo name:'scala-releases', urls:'http://scala-tools.org/repo-releases/'
    mavenRepo name:'scala-snapshots', urls:'http://scala-tools.org/repo-snapshots/'
}
configurations {
    scalaCompiler
    scalaLibrary
}

eclipse {
  classpath.containers += ["org.scala-ide.sdt.launching.SCALA_CONTAINER"]
  classpath.minusConfigurations = [configurations.scalaLibrary]
  classpath.plusConfigurations =  ([configurations.scalaCompiler]  + classpath.plusConfigurations)
}

dependencies {
    scalaTools "org.scala-lang:scala-compiler:$scalaVersion", 
        "org.scala-lang:scala-library:$scalaVersion"    

    scalaCompiler "org.scala-lang:scala-compiler:$scalaVersion"
    scalaLibrary "org.scala-lang:scala-library:$scalaVersion"

    compile "org.scala-lang:scala-library:$scalaVersion", 
    	"net.liftweb:lift-mapper_$scalaVersion:$liftVersion", 
    	"net.liftweb:lift-webkit_$scalaVersion:$liftVersion",
    	"net.liftweb:lift-util_$scalaVersion:$liftVersion",
    	"net.liftweb:lift-actor_$scalaVersion:$liftVersion",
    	"net.liftweb:lift-common_$scalaVersion:$liftVersion",
    	"net.liftweb:lift-json_$scalaVersion:$liftVersion", 
        "ch.qos.logback:logback-classic:0.9.29",
        "ch.qos.logback:logback-core:0.9.29",
        "com.h2database:h2:1.+"

    testCompile "junit:junit:4.5", 
        "org.specs2:specs2_$scalaVersion:$specs2Version",
        "org.scala-lang:scala-compiler:$scalaVersion",
	'org.mortbay.jetty:jetty:9.+',
	'org.mortbay.jetty:jetty-util:9.+',
	'org.mortbay.jetty:jetty-management:9.+'
	"org.scala-lang:scala-compiler:$scalaVersion"  // Needed for LiftConsole	

    providedCompile 'javax.servlet:servlet-api:3.+' 
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.3'
}
```

なるべく最新の状態になるようにしています。
この構成で問題が出来るかどうかはまだわかりませんが、なんとなく新しいほうが素敵です。

でこの設定ができたら、インストールディレクトリで

```
./gradlew jettyRun
```

を実行します。

すると、localhost:8080にアクセスすると、以下の画面が表示されます。
![Lift](https://www.dropbox.com/s/wnyaptcpovkwhz2/Screen%20Shot%202013-01-24%20at%203.16.42.png?dl=1)

いやぁ、なんか色々苦労した。
Apache + mod_wsgi で複数の WSGIPythonPath を設定する

# 流れ
    Django に触れる
      ↓
    Apache + mod_wsgi でデプロイする方法を調べる
      ↓
    Virtual Host に WSGIScriptAlias と WSGIPythonPath を書く
      ↓
    「Error!! WSGIPythonPath を <Virtual Host> に書いてはいけません！
    httpd.conf に書きなさい！」
      ↓
    複数プロジェクト扱いたい場合はどうすれば...
    (一応複数並べてみるものの案の定上書きされて('A`)ｳﾞｧｰ)

# 答え
    Unix 系なら ":"、Windows なら ";" で複数設定できます
    例) WSGIPythonPath /path/to/foo;/path/to/bar (Windows の場合)


って [Wiki に書いてありました](http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIPythonPath)。
Virtual Host に書ければ済む話だと思うんだけどなぁ。
そもそも「複数設定したい」という話をほとんど見かけないので、
本来必要ないんじゃないかと思わないでもない。
影付きビューの表示を高速化する


シャドウの効いたビューをiPhone上でスクロールしたりすると、
アニメーションが非常にもっさりしてしまうことがあります。

ただ影を付けたければこんな感じで説定できますが

```Objective-C:
self.layer.shadowOffset = CGSizeMake(0,1);
self.layer.shadowColor = [UIColor grayColor].CGColor;
self.layer.shadowRadius = 1.0;
self.layer.shadowOpacity = 1.0;
```

高速化するためには以下の記述が必要になります。

```Objective-C:
self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = [UIScreen mainScreen].scale;
```

加えて、ビューのサイズが確定した後に次の行を実行するようにすることで、さらに滑らかになります。

```Objective-C:
self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
```

一昔前のデバイスで試すと、効果が一目瞭然です。
gitのsubmoduleを簡単に削除するコマンド

以下の投稿を見てコマンドだけでsubmoduleを削除できることを知ったので、スクリプト化しました。

 * [Gitでどうしても覚えられない操作 #git - Qiita](http://qiita.com/items/911a78df3309d4ac4477)

```bash:git-submodule-remove.sh
#!/bin/bash

if [ -z "$1" ]; then
    echo "Error: Specify a path to the submodule directory" 1>&2
    exit 1
fi

if [ ! "$(pwd)" = "$(git rev-parse --show-toplevel)" ]; then
    echo 'Error: Run again after: cd "$(git rev-parse --show-toplevel)"' 1>&2
    exit 1
fi

git config --remove-section submodule."$1" || exit 1
git config --file .gitmodules --remove-section submodule."$1" || exit 1
git rm --cached "$1" || exit 1
rm -rf "$1" || exit 1
```

これで1コマンドでsubmoduleが削除できるようになります。

```console
$ git-submodule-remove path/to/sumodule-directory
```

このコマンドはgitディレクトリのトップレベルで実行します。
また、指定するsubmoduleはトップレベルからの相対パスです。
RailsアプリでURLにidじゃなく、任意文字列でアクセス出来るようにしておく

ルーティングルールのresourcesやmemberなどでURLに:idを伴うときに、多くの場合PrimaryKeyを使ってしまいがちですが、将来、要望として任意の文字列で代用したい。なんてことが考えられるので、簡単に修正ができるように備えておきます。

URLに:idを含むとき。

```
Request: http://APP_URL/users/:id
```


単純なコントローラ処理の例。

 ```ruby:users_controller.rb
class UsersController < ApplicationController
  def show
    user = User.find_by_id(params[:id])
    ...
  end
end
```


将来に備えた例。

```ruby:users_controller.rb
class UsersController < ApplicationController
  def show
    user = User.key(params[:id]).first
    ...
  end
  ...
end
```
```ruby:user.rb
class User < ActiveRecord::Base
  ...
  scope :key, lambda { |key| where(id: key) }
  ...
end
```

scopeなどで抽象化しておけば、usernameでアクセスしたくなったときなどにscopeを変更するだけで対応できます。

```ruby:user.rb
  scope :key, lambda { |key| where(username: key) }
```

応用が効くので、将来変更するかな？ってときには使っておくといいかもしれません。
Redcarpet + pygments.rb + rubypythonでHeroku上でMarkdown

はじめましてyasです。
Redcarpet + pygments.rb + rubypythonでHeroku上でMarkdownをするための手順をブログにまとめました。

[Peaks and Valleys | Redcarpetを使ってマークダウンを扱う](http://psandvs.com/posts/3)

[Peaks and Valleys | Herokuでマークダウン＋シンタックスハイライト](http://psandvs.com/posts/6)

ご参考まで。
optparseモジュールの使い方


pythonスクリプトを書いていてオプションの渡し方をきれいにしてくれるモジュールを見つけた。それがoptparse

使い方は以下の通り。

```
# まずモジュールのインポート
import optparse

# parserのメインオブジェクトの作成
parser = optparse.OptionParser()

# 各オプションの設定追加
# この場合だと--debug引数を与えると後で取得する
# optionsオブジェクトのdebugプロパティがTrueになる
# helpは--helpを与えたときに各オプションで表示される
# usageメッセージのこと。
parser.add_option("--debug",
	action="store_true",
	dest="debug",
	help="Debug option")

# optionsが各オプションの値を連想配列としてもっている。
# あとはこれを煮るなり焼くなりする
(options, args) = parser.parse_args()
```

基本的に順番とか気にしなくてすむのでとても便利。
Clojure のマクロに別名をつける．

`(def foo ->)` は失敗します．

---- 

Clojure で内部 DSL を作っているときなど `clojure.core` のマクロに別名をつけたい場合があります．そんなときに `def` を使って，`(def foo ->)` とすると，

```clojure
user=> (def foo ->)
CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/->, compiling:(NO_SOURCE_PATH:1) 
```

失敗します．`->` ではなく var の `#'->` であればバインドはできます．

```clojure
user=> (def foo #'->)
#'user/foo
```

しかし，この `foo` はマクロとしては機能しません．

```clojure
user=> (foo {:a 10} (assoc :b 20))
ArityException Wrong number of args (2) passed to: core$assoc  clojure.lang.AFn.throwArity (AFn.java:437)
```

ではどのようにすればよいのかというと:

```clojure
user=> (def ^:macro foo #'->)
#'user/foo

user=> (foo {:a 10} (assoc :b 20))
{:b 20, :a 10}
```

のように，メタデータで `:macro` を `true` にしてあげればよいのでした．

## このノウハウの出典

http://tnoda-clojure.tumblr.com/post/41273935933/decorator-pattern-in-clojure-from-dsl-in-action
configファイルの作り方


Dictionary型をそのまま設定ファイルとして出力したい場合がある。
そんなときは下記のようなスクリプトを使うと楽。

```
config = {
	"A":"a",
	"B":"b",
	"C":"c"
}
config = '¥n'.join(map('='.join, config.iteritems())

# config= "A=a¥nB=b¥nC=c"

```
このconfigが望んでいた文字列になっているのでこれを書き出す。