OmniAICreator/Qiita-1.07M huggingface dataset:
Objective-Cのキホン


##オブジェクトの宣言

[クラス名]　[オブジェクト名]

```objc:Example
	UIView* uiView;
  UIView *uiView;
*の位置はどちらでもOK.
```

##オブジェクトのインスタンス化
allocメソッドでメモリ領域を確保、initで始まるメソッドで初期化する。

```objc:Example
NSCalendar *calendar= nil;
calendar = [[NSCalendar alloc] initWithCalendarIdentifer];
```

##オブジェクトの解放
allocメソッドでメモリを確保したものは、明示的にreleaseする必要がある。
解放しないと、処理が実行される度にメモリを確保するのでメモリリークの原因になる。

```objc:Example
[calendar release]
```

##オブジェクトのメモリ管理
オブジェクトのメモリ管理のために、「リファレンスカウンタ」がある。

###リファレンスカウンタとは
生成したオブジェクトが何カ所から参照されているかを管理している。

allocとinitで始まるメソッドで生成されたオブジェクトは、生成したメソッドを持つオブジェクトから参照されているので、リファレンスカウンタは１となる。
このオブジェクトを他のオブジェクトが利用する場合は、勝手に解放されてしまわないように、リファレンスカウンタを１加算する。(retain)
必要がなくなったら、カウンタを１減算する。(release)
リファレンスカウンタが0になったら、オブジェクトが解放される。
リファレンスカウンタを操作するメソッドは、NSObjectに定義されている。

retain リファレンスカウンタを++
release リファレンスカウンタを--
autorelease 現在の処理を抜けた時に自動的にrelease
retainCount リファレンスカウンタの値を取得

autoreleaseは、現在のメソッドを抜けた時に自動的にreleaseされる。
ただ、メソッドを抜けてからすぐにreleaseされる保証はない。
処理能力を重視する場合は、手動でreleaseすること。

不慣れなうちは、retainCountメソッドでリファレンスカウンタを確認すること。

```objc:Example
unsigned int cnt = [OBJECTNAME retainCount];
```

メモリの管理基準

アプリの終了時には、deallocは呼ばれず、メモリリーク分も含めて一括でメモリが解放される。

ホームボタンを押してもすぐにアプリ終了とはならず、バックグラウンドに遷移するだけになる。
他のアプリの実行などでメモリが必要になった場合に、OSがバックグラウンドアプリを終了させることになる。

```objc:Example

//allocを使う場合は、 autorelease
hoge = [[[Hoge alloc] init] autorelease];

//alloc以外の場合は、なにも指定しない
hoge =[Hoge hoge];

//インスタンス変数に残す場合は、retain
_hoge = [hoge retain];

//インスタンス変数を解放する場合はrelease
- (void)setHoge:hoge {

	//カウンタが増えないように一回releaseしてからretain.
	[_hoge release];
	[_hoge retain];
}

-(void)dealloc {

	[_hoge release];
	[super dealloc];
}

//@"文字列"のオブジェクトは何もする必要はない。
hoge=@"hogehoge";
```

##オブジェクトのプロパティへのアクセス


```objc:Example
//頭に-があれば、オブジェクトメソッドの定義
-(id)initWithCalendarIdentifier:(NSString*)calendarID

//頭が+の場合は、クラスメソッドの定義
+(id)stringWithFormat:(NSString*)format, ...

//プロパティへのアクセス
data = OBJECTNAME.PROPERTY;

##オブジェクトメソッドの呼び出し
[OBJECT_NAME METHOD];

//引数がある場合
[OBJECT_NAME METHOD:PARAM1]

//引数が二つある場合
[OBJECT_NAME METHOD:PARAM1 LABEL:PARAM2];

//NSStringの例
UIFont* font = [UIFont systemFOntOfSize:24];
[NSString drawAtPoint:CGPointMake(0, 0) withFont:font];
```

##デバッグについて
NSLog関数を利用する。

```objc:Example
NSLog(書式文字列, 可変個引数);
//複数の引数を指定する場合

NSLog(@"%@は%d台", @"iPhone5", 100);
```
iOS、Androidアプリなどでたくさんのサイズ違いのアイコン画像を作るzsh


## 今北産業

- ios, androidともにアイコンをたくさん作らないといけない
- 適当にリサイズすると、ボヤケる
- なので、ImageMagickのシャープ使いつつ、サクっとリサイズしよう


## 13種類くらいの大きさのアイコンをガッと作れます

iOS, Androidのアイコン画像は以下のようにたくさん作らないといけない

| Icon size |   Platform   |
|-----------|--------------|
| 29x29     | iOS          |
| 36x36     | Android      |
| 48x48     | Android, iOS |
| 50x50     | iOS          |
| 57x57     | iOS          |
| 58x58     | iOS          |
| 72x72     | Android, iOS |
| 96x96     | Android      |
| 100x100   | iOS          |
| 114x114   | iOS          |
| 144x144   | iOS          |
| 512x512   | iOS          |
| 1024x1024 | iOS          |

[Adobe AIR * Application icons](http://help.adobe.com/en_US/air/build/WS901d38e593cd1bac1e63e3d129907d2886-8000.html)より




## zshでImageMagickのresizeをする

```zsh
$ zsh icon_gen.sh original.png
```

unsharpを使う。
	
```icon_gen.sh
#!/bin/zsh

original=original.png

if test "$1" != ""; then original=$1; fi

list=(29 36 48 50 57 58 72 96 100 114 144 512 1024)

for size in $list; do
    convert $original -resize $size -unsharp 2x1.4+0.5+0 $size.png
done

echo 'complete'

```

unsharpの使い方はここに書いてある → [mieki256's diary - ImageMagickとシャープ化](http://blawat2015.no-ip.com/~mieki256/diary/2004112610.html)

	-unsharp <radius>{x<sigma>}{+<amount>}{+<threshold>} 

|      パラメータ      |                                      概要                                      |
|-----------------|------------------------------------------------------------------------------|
| 半径（Radius）      | ボケの範囲をピクセル単位で表す。実質的には標準偏差σを用いる。ボケの度合いを決めるパラメータの一つで、大きいと、鮮鋭化の効果（特にハロ現象）が強く出る。 |
| 適用量（Amount）     | 原画像とボケ画像の演算の割合を決める。大きいと、効果が強く出る。                                             |
| 上限（Upper Limit） | コントラストの強いものを、それ以上強くしないようにする。                                                 |
| 下限（Lower Limit） | 細かいコントラストまでも強めて、ノイズなどを目立たたせないようにする。しきい値（Threshold）とも呼ばれる。                    |



## ガーっと作れた

こんな感じ

![つくったやつ](https://qiita-image-store.s3.amazonaws.com/0/2631/b530eb8f-ddf1-9aa6-46ec-16c0034f9cb2.png)  
めでたしめでたし。


## FacebookアプリとかOGPアイコンとかにも使えるかと

おもいます！
coreserver の ssh 登録をpythonによって手動でやる

自宅や出先からftpやmysqlに接続するのに必要です。

こちらの記事を参考にさせていただきました。

[[Python]CORESERVERのSSH登録を自動化する](http://aoshiman.net/weblog/2009/09/16/coreserver_ssh/)


ぼくの場合は自動化までやるのが難しそうだったので、実行の際には手動でターミナルから、

```bash:
python login.py
```

のように打ち込んでおります。


```py:
# coding: utf-8
# userid, passwd, コアサーバードメインの3つは自分の環境に合わせて設定してください

import urllib

def get_ip():
    f = urllib.urlopen('http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip')
    ip = f.read()
    return ip

def regist_host(ip, url):
    userid = '********' # ユーザーIDを入力してください
    passwd = '********' #パスワードを入力してください
    keyword = u'SSH登録'
    encoding = 'shift-jis'
    p = [
        ('id', userid),
        ('pass', passwd),
        ('remote_host', ip),
        ('ssh2', keyword.encode(encoding)),
    ]

    params = urllib.urlencode(p)
    #print params
    up = urllib.urlopen(url, params)
    #print up.read()

if __name__ == '__main__':
   url = 'https://ss1.coressl.jp/www.****.coreserver.jp/jp/admin.cgi' #コアサーバーのドメインを入力してください
   ip = get_ip()
   regist_host(ip, url)
IE8のmax-heightとoverflowのバグ

地味にハマったのでメモ。

max-heightを設定してoverflowをscrollやautoにすると、IE８ではmax-heightが普通のheightのように設定されてしまう。
回避策としてdivを入れ子にしてoverflowを設定後、その中に再度divを設定してmax-heightの設定をするときちんと表示される。

全くもって意味の分からない話だが、どうやらIE８のバグらしい。
このためにわざわざCSSを別々に分けて入れ子にするという手間のかかりよう…。


####ダメな例

```css+erb:CSS
.AAA { max-height:300px; overflow:scroll;}
```

```html+erb:HTML
<div class="AAA">
     <table>
          <tr>
             <td>contents2</td>
             <td>contents2</td>
          </tr>
            ～
          <tr>
             <td>contents3</td>
             <td>contents4</td>
          </tr>
     </table>
</div>
```


<br>




####いい例

```css+erb:CSS
.AAA { overflow:scroll;}
.BBB { max-height:300px;}
```

```html+erb:HTML
<div class="AAA">
  <div class="BBB">
     <table>
          <tr>
             <td>contents1</td>
             <td>contents2</td>
          </tr>
            ～
          <tr>
             <td>contents3</td>
             <td>contents4</td>
          </tr>
     </table>
  </div>
</div>
```
tmlibでゲージを実装する

# tmlibでゲージを実装する

## イントロ

最近趣味でゲーム制作を始めました。

簡単にゲームを作る（javascriptでゲームを作る）フレームワークはいくつかありますが、現在僕が使わせて頂いてるのは [tmlib](https://github.com/phi-jp/tmlib.js/ "tmlib")です。

（enchant.jsはドキュメントが充実していて良いのですが、iPhone4系とかでUIWebView実装だと実行速度が遅くて厳しいです）

今回はtmlibでタイムリミットを示すゲージを表示する必要があったのでその備忘録です。
＊下図の様な物

![gauge.jpg](https://qiita-image-store.s3.amazonaws.com/0/26531/a184902a-4844-e777-a4b9-f07117ee07db.jpeg)

## ゲージの実装

tmlib 1.6以降には Gauge と言うとても便利なクラスが実装されてるので、ゲージを出すだけなら以下のようにすれば簡単に出来ます。
参考リンク　http://jsdo.it/phi/2gUr

```js:qiita.js
var gauge = tm.app.Gauge(300, 25, "red", "left");
gauge.position.set(0, 0);
scene.addChild(gauge);
```

ちなみに Gaugeクラスに渡してる

* 第１引数(300)が横幅
* 第２引数(35)が高さ
* 第３引数には色
* 第４引数には基準となる位置を right or left で渡します

第４引数について補足ですが、ここで指定した right or left によって、オブジェクトの位置の基準点が変わります。
right だと右端がオブジェクトの位置決定の基準になる訳です。
それと同時に、ゲージクラスは値をセットすると、ゲージの長さを変えてくれる訳ですが、これの基準点も第４引数によって決まる事になります。


ゲージクラスの使い方ですが、上述のようにインスタンスを作成した後、

```js:qiita.js
gauge.value -= 10;
```

とかってやるとゲージが伸び縮みします。便利ですね！
しかもこれ、ちゃんと-10までの間を補完して **アニメーション** して縮んでくれます。すばらしい。

![gauge2.jpg](https://qiita-image-store.s3.amazonaws.com/0/26531/731699f9-0326-1e86-e94c-3166ca04bf00.jpeg)

ただ、今回すこし詰まったのが、このアニメーション部分です。

ゲージの長さを一瞬にして指定の長さにしたいときがあると思います。

![gauge3.jpg](https://qiita-image-store.s3.amazonaws.com/0/26531/96726af5-a317-858e-5cfc-edf23bc6777c.jpeg)

これを以下のように記述しても上手く行きませんでした。目標の長さまで**アニメーションしちゃう**んですね。

```js:qiita.js
gauge.value = 100;
```

で、解決方法がこれです。

```js:qiita.js
gauge.width = 100;
```

身も蓋もないですが、**直接幅を指定する事でアニメーションなしで目的の長さを表示出来ます。**
以上、備忘録でした。


tmlibももっとドキュメント増えてくと嬉しいなー…。
Factory not registered: entry (ArgumentError)

だいたいいつもハマるので。

- 原因１  - Factory が無い

- 解決１  - Factory を作る

```bash:
$ rails g factory_girl:model Entry name:string value:integer
```

- 原因２ - cucumber から見えない(特に spring とか)

- 解決２ - config/application.rb に fixture を factory_girl として宣言する -> [今日も街の巨匠に感謝](http://railsapps.github.io/tutorial-rails-devise-rspec-cucumber.html)

```rb:
module MyApp
  class Application < Rails::Application
    config.generators.fixture_replacement :factory_girl, dir: 'spec/factories'
  end
end
```

これをやっておくと、```rails g factory_girl``` も spec/factories に作ってくれるので便利。(デフォルトは test/factories)
【超便利！】Mac Eclipseの矩形選択モード

多分殆どの人が知らないと思うので共有です。
Eclipseの矩形選択モードのショートカットはMacだと　ALT+Command+Aです。

で、ここからが本題で、矩形選択状態で入力（削除）もそのまま出来るんですよ。
これは、プレフィックスをつけたりするのに便利です。

もちろん、外部テキストエディタで選択したテキストを矩形にコピペすることもできます。
ということは、Excel等もコピーできるんですね。

例えば、

   var aryData[] = "";
   var aryData[] = "";
   var aryData[] = "";
   var aryData[] = "";
   var aryData[] = "";
   var aryData[] = "";
   var aryData[] = "";

とあったとして、[] の中間にカーソルを合わせ、Shiftを押しながら範囲選択をします。
ほんで、Excelで1~7までの連番を作成します。

そのセルを範囲選択して、Eclipseに矩形選択モードのままコピペすれば、

   var aryData[1] = "";
   var aryData[2] = "";
   var aryData[3] = "";
   var aryData[4] = "";
   var aryData[5] = "";
   var aryData[6] = "";
   var aryData[7] = "";

となるわけです。

この程度なら、別に手作業でもいいんですが、桁が増えたり文字列の長さが違うと、コードを綺麗に揃えたりするのが面倒臭いですよね。

一発目の投稿は、こんなもんでいいんでしょうか？
「バス代」をErlangで(横へな9)

http://nabetani.sakura.ne.jp/hena/ord9busfare/
「バス代」をErlangでやってみました。

- 大人、子供、幼児の料金を別々に計算して合計しています。
- 幼児は1人ずつ料金を求め、金額が高い方から大人×2人分を削除しています。
- 年齢区分、料金区分はそれぞれ大人料金からの割合として格納し、料金計算の時に掛け合わせています。例: Cw→子供(0.5)×福祉割引(0.5)→大人料金の0.25倍

1関数1行で書いたらどうなるだろうと思ってやってみました。(一応、すべての行が80桁以内になっています。)

いままで再帰を使うときは頭の中で手続き的なループを考えていました。今回は1行で書くため再帰すら使わず、ループが必要なときはmap, filter, foldlなどに関数を渡し、ひたすら大きな関数を小さな関数に分割することでプログラムを作成しました。手続き型だった脳が、少しずつ関数型に慣れてきたように思います。

なお、1関数1行はトップダウンで書くと書きやすかったですが、はたして読みやすいのかどうか？

```erlang:bus.erl
-module(bus).
-compile(export_all).

solve(Data) -> adult_fee(Data) + child_fee(Data) + infant_fee(Data).

adult_fee(Data) -> lists:sum(fees($A, Data)).

child_fee(Data) -> lists:sum(fees($C, Data)).

infant_fee(Data) -> lists:sum(dropn(num_adult(Data) * 2, rev_sort(fees($I, Data)))).

num_adult(Data) -> length(fees($A, Data)).

fees(Mark, Data) -> [mark_to_fee(X, base_fee(Data)) || X <- only(Mark, Data)].

mark_to_fee(Mark, BaseFee) -> roundup10(marks_to_ratio(Mark) * BaseFee).

roundup10(X) -> trunc(X / 10 + 0.99) * 10.

marks_to_ratio(Marks) -> lists:foldl(fun(X, S) -> mark_to_ratio(X) * S end, 1, Marks).

mark_to_ratio(Mark) -> element(2, find_mark(Mark)).

find_mark(Mark) -> hd(lists:dropwhile(fun({M, _}) -> M =/= Mark end, ratio_data())).

ratio_data() -> [{$A, 1}, {$C, 0.5}, {$I, 0.5}, {$n, 1}, {$p, 0}, {$w, 0.5}].

base_fee(Data) -> list_to_integer(hd(string:tokens(Data, ":"))).

only(Mark, Data) -> lists:filter(fun(X) -> hd(X) =:= Mark end, marks(Data)).

marks(Data) -> string:tokens(lists:nth(2, string:tokens(Data, ":")), ",").

dropn(N, L) -> case length(L) >= N of true -> lists:nthtail(N, L); false -> [] end.

rev_sort(L) -> lists:reverse(lists:sort(L)).

tests() ->
  test("210:Cn,In,Iw,Ap,Iw", 170), %0
  test("220:Cp,In", 110), %1
  test("440:In,Ip,Cp,Aw,Iw,In,An", 660), %39
  test("1270:Ap,In,An,Ip,In,Ip,Ip", 1270). %40

test(Data, Expected) ->
  Result = solve(Data),
  OkNg = case Result =:= Expected of true -> ok; false -> ng end,
  io:fwrite("~s: ~s -> ~w~n", [OkNg, Data, Result]).
```
boost.GILを使ってWindowsで画面イメージを取り込み

画面画像をキャプチャしてPNG形式で保存．そのときに，boost::gilを使用した例．

```cpp:
/// 画面をキャプチャする
void CPY_CaptureScreen(const std::wstring &szFilePath) {

    auto pDlg = GetMainDlg(); // 窓(CWnd*)を得る

    CRect rectClient;
    pDlg->GetClientRect( &rectClient );

    CClientDC dc(pDlg);

    CDC dc2;
    dc2.CreateCompatibleDC( &dc );

    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(&dc, rectClient.Width(), rectClient.Height() );
    
    auto pOldBitmap = dc2.SelectObject( &bitmap );

    dc2.BitBlt(0,0, rectClient.Width(), rectClient.Height(), &dc, 0, 0, SRCCOPY );

    int nWidthAdjust = rectClient.Width();
    if ( nWidthAdjust % 4 ) { nWidthAdjust += 4 - nWidthAdjust % 4;}

    std::vector<BYTE> bitdata( nWidthAdjust * rectClient.Height() * 3 );
    
    dc2.SelectObject( pOldBitmap );

    BITMAPINFO bitmapinfo;
    ZeroMemory(&bitmapinfo, sizeof(BITMAPINFO) );
    bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bitmapinfo.bmiHeader.biWidth = nWidthAdjust;
    bitmapinfo.bmiHeader.biHeight = rectClient.Height();
    bitmapinfo.bmiHeader.biPlanes = 1;
    bitmapinfo.bmiHeader.biBitCount = 24;
    bitmapinfo.bmiHeader.biCompression = BI_RGB;
    GetDIBits( dc2, bitmap, 0, rectClient.Height(), bitdata.data(), &bitmapinfo, DIB_RGB_COLORS );


    boost::gil::rgb8_image_t img( nWidthAdjust, rectClient.Height() );
    copy_pixels(boost::gil::interleaved_view(nWidthAdjust, rectClient.Height(), (const boost::gil::rgb8_pixel_t*)bitdata.data(), nWidthAdjust*3), view(img));
    png_write_view(CStringA(szFilePath.c_str()), boost::gil::flipped_up_down_view( const_view(img) ) );
```
MacにRedisをインストールする


Homebrewを利用してインストール


```
brew install redis
```

```
==> Downloading http://redis.googlecode.com/files/redis-2.6.10.tar.gz
######################################################################## 100.0%
==> make -C /private/tmp/redis-e09G/redis-2.6.10/src CC=cc
==> Caveats
To have launchd start redis at login:
    ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
Then to load redis now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Or, if you don't want/need launchctl, you can just run:
    redis-server /usr/local/etc/redis.conf
==> Summary
/usr/local/Cellar/redis/2.6.10: 9 files, 748K, built in 9 seconds

```

起動

```
 redis-server /usr/local/etc/redis.conf
```

接続

```
redis-cli
```

確認

```
redis 127.0.0.1:6379> set key val
OK
redis 127.0.0.1:6379> get key
"val"

```

GUIクライアント
 * http://redisdesktop.com/
 * https://github.com/joeferner/redis-commander
APK拡張ファイルについて

これはAndroid開発をする人なら常識なのかもしれませんが……。
APK拡張ファイル(expansion file)は、Google Playにアップしてダウンロードしないと、動きません(たぶん)
で、リリース前はβテストで試すしかない。

adbとかで入れたら動かない(たぶん)。

いや、当たり前なんでしょうけどね....なまじっか途中まで動く(画像ファイルなどにアクセスできないだけで、プログラムはなんか動く)ので....。
yumで入れたPHPにoci8とpdo_ociを入れる

## 環境
- CentOS6.3 64bit
- PHP5.3.3

## 前提
- ApacheとPHP（PDOとかも）がインストールされている
- yum -y install php-develでphpizeを使えるようにしておく

## いれるもの
- Instant Client11.2
- oci8
- pdo_oci

# 準備
## Instant Clientの設置
### ファイルの取得
[Oracleのサイト](http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html)から下記zipを落としてくる。

- instantclient-basic-linux.x64-11.2.0.3.0.zip
- instantclient-sdk-linux.x64-11.2.0.3.0.zip

CentOS内の適当なディレクトリに配置する（/tmpとか）。

### 解凍、設置
上記zipを設置したディレクトリに移動して解凍。

```.bash
unzip instantclient-basic-linux.x64-11.2.0.3.0.zip
unzip instantclient-sdk-linux.x64-11.2.0.3.0.zip
```
解凍したら移動する。

```.bash
mv instantclient_11_2 /usr/local/lib/
```
シンボリックリンクをはる。

```.bash
cd /usr/local/lib/instantclient_11_2/
ln -s libclntsh.so.11.1 libclntsh.so
```

/etc/profileに追記し、必要なPATHを通す。

```/etc/profile
export ORACLE_HOME=/usr/local/lib/instantclient_11_2
export NLS_LANG=Japanese_Japan.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME:$PATH
```
反映。

```.bash
source /etc/profile
```

ApacheにもPATHを通すために、/etc/sysconfig/httpdを編集する（これでかなりハマった）。

```/etc/sysconfig/httpd
# 最後に追加
export ORACLE_HOME=/usr/local/lib/instantclient_11_2
export LD_LIBRARY_PATH=$ORACLE_HOME
```

```.bash
service httpd restart
```

ここまでで設定したPATHが通っているかを確認する。
httpdに追加したPATHは、phpinfo内のEnvironment（Apache Environmentではない）で確認できる。

##PHPソースの用意
今インストールされているPHPと同じバージョンのソースを取ってくる＆解凍する。
今回は5.3.3。

```.bash
cd ~/
wget http://museum.php.net/php5/php-5.3.3.tar.gz
tar xzvf php-5.3.3.tar.gz
```

#oci8のインストール

移動して、configureとmakeとmake install。

```.bash
cd php-5.3.3/ext/oci8/
phpize
./configure --with-oci8=shared,instantclient,/usr/local/lib/instantclient_11_2,11.2
make
make install
```
php.iniに追加するのではなく、iniファイルを下記場所に追加する。

```/etc/php.d/oci8.ini
extension=oci8.so
```

Apache再起動。

```.bash
service httpd restart
```
phpinfoでoci8が有効になっていることを確認する。

# pdo_ociのインストール

```.bash
cd php-5.3.3/ext/pdo_oci/
phpize
./configure --with-pdo_oci=shared,instantclient,/usr/local/lib/instantclient_11_2,11.2
make
make install
```

oci8と同様に、iniファイルを追加する。

``` /etc/php.d/pdo_oci.ini
extension=pdo_oci.so
```
Apache再起動。

```.bash
service httpd restart
```

phpinfoでpdo_ociが有効になっていることを確認する。

##確認
```/var/www/html/pdo_oci.php
<?php

define("DB_HOST", "##host name##");
define("DB_PORT", "##port##"); // デフォルト1521
define("DB_USERNAME", "##schema name##");
define("DB_PASSWORD", "##password##");
define("DB_SID", "##sid##");

try {
    $dbh = new PDO("oci:dbname=//".DB_HOST.":".DB_PORT."/".DB_SID, DB_USERNAME, DB_PASSWORD);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    die($e->getMessage());
}
echo 'OK';
exit(0); 
```
Ivy + Archivaを試してみたよ


Apache IvyとApache Archivaを使ってみたのでメモメモ

## まず、Apache Ivyを使ってみます。

Ivyとはなんぞやというのは置いておいて、こちらにお任せ
http://d.hatena.ne.jp/ryoasai/20110101/1293904479

Ivyのインストールはとても簡単！Antのlibディレクトリの中にjarファイルを置くだけです。
これも上のページに書いてあるので割愛します。
ついでにexampleのhello-ivyもビルドしてみたけど、これも割愛しますね

というわけで、すべてコチラに集約されているのですべて割愛というひどい感じですが、
本番はここから先ですよ！

## Apache Archivaを使ってみるよ

例によって参考URLを
http://labs.n2sm.co.jp/?p=128

これに従ってインストール起動。やっぱり割愛

起動できたら、Archivaのマニュアルにしたがって、使ってみます。
http://archiva.apache.org/docs/1.3.6/quick-start.html

http://localhost:8080/archiva/browse/junit/junit/3.8.1/
にアクセスすると、artifactがないよって起こられます。

http://localhost:8080/archiva/repository/internal/junit/junit/3.8.1/junit-3.8.1.jar
にアクセスするとお見事！junit-3.8.1.jarがダウンロードできました。
そして、再び
http://localhost:8080/archiva/browse/junit/junit/3.8.1/
にアクセスすると、はい。ちゃんとjunitがinternal Repositoryに置かれています。

ちょいと解説すると、Archivaはリモートリポジトリ（ここではセントラルリポジトリですね）にあるファイルをインハウスにダウンロードしてくれます。
Proxyとして動作してくれるということですね。これでリモートリポジトリがダウンしていて使えない！みたいなときでも安心ですし、ローカルネットワークからダウンロードできるので速度面でもうれしいです。
さらに社内でつくったモジュールも同じリポジトリからダウンロードできるので、設定がらくちんというメリットもあります。

## そういうわけで、IvyからArchivaをつかってみる

またまた
http://d.hatena.ne.jp/ryoasai/20110101/1293904479
ここを参考に、今度はレゾルバを使ったサンプル（chainedresolvers-project）を試してみます。
まず、最初にそのままビルドすると、上のサイトの通りに

    [ivy:retrieve]  found commons-lang#commons-lang;2.0 in ibiblio
    [ivy:retrieve]  found org.apache#test;1.0 in libraries

って返って来ますね。
それでは、Archivaからjarファイルを取ってくるようにしてみましょう。

settings/ivysettings.xmlの<ibiblio>要素を以下のように置き換えます。

```xml
<url name="inhouse" m2compatible="true">
  <artifact pattern="http://localhost:8080/archiva/repository/internal/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"/>
</url>
```

そして、再びantを実行すると…

    [ivy:retrieve]  found commons-lang#commons-lang;2.0 in inhouse
    [ivy:retrieve]  found org.apache#test;1.0 in libraries

ってでましたね！

そして
http://localhost:8080/archiva/browse/commons-lang/commons-lang/2.0
にちゃんとcommons-langがありますね。
VolleyさんでRequestをPOSTで送信して、ResponseをJSONで受け取る

少しVolleyさんに手を出してみました。
ResponseのJSONをGsonで解析してくれるカスタムRequestを作成している人がいましたが、RequestのメソッドがGETだけだったので、ソースを拝借して、POSTで送信できるようにしてみました。パラメータはHashMap<String, String>で設定します。

[参考]
[GsonRequest.java](https://gist.github.com/ficusk/5474673)
[VolleyのRequestを拡張してPOST/GETのリクエストしてみる](http://dev.ninja.co.jp/android/volley-request)
[Google I/O 2013 - Android : Volley: Easy, Fast Networking for Android](http://y-anz-m.blogspot.jp/2013/05/google-io-2013-android-volley-easy-fast.html)

[ソース]
[GsonRequest.java改](https://gist.github.com/myaaaaa-chan/5925106)

```java:
public class Sample {

	public void request() {}
		HashMap<String, String> params = new HashMap<String, String>();
		params.put("param1", value1);
		params.put("param2", value2);

		GsonRequest<Result> request = new GsonRequest<Result>(Method.POST, "http://www.com", Result.class,
		params, successListener, errorListener);
		RequestQueue queue = Volley.newRequestQueue(context);
		queue.add(request);
	}

	private Listener<Result> successListener = new Listener<Result>() {

		@Override
		public void onResponse(Result response) {
		}
	}

	private Response.ErrorListener errorListener = new Response.ErrorListener() {

		@Override
		public void onErrorResponse(VolleyError error) {
		}

	}
}
```

###もう他にこーゆークラスがあるかもしれませんが、お勉強ということで。。。
csprojにJenkinsのビルド番号を埋め込む

C#のプロジェクトにJenkinsのビルド番号を埋め込む

## 準備

* プロジェクトに空のAssemblyFileInfo.csを追加しておく。
* AssemblyInfo.csからは、 AssemblyFileVersion と AssemblyConfiguration の記述を削除しておく。

## csproj に追加

```xml:
 <PropertyGroup>
    <Major>1</Major>
    <Minor>0</Minor>
    <Build>$(BUILD_NUMBER)</Build>
    <Revision>$(SVN_REVISION)</Revision>
  </PropertyGroup>
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')" />
  <Target Name="BeforeBuild" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')">
    <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)" />
    <AssemblyInfo CodeLanguage="CS" OutputFile="AssemblyFileInfo.cs" AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyConfiguration="$(Configuration)" Condition="$(Revision) != '' " />
  </Target>
```
日本語の疾患名をICD10順に取り出そう。

とある事情から日本語の疾患名を抜き出してクエリーに投げる必要が出てきた。先日は医薬品名を取り出したので，今日は疾患名を取り出そう。

##日本語の疾患名をICD10順に取り出そう。

### ICD10とは？
要は疾患につけられたIDである。このIDが同一のものは，基本的には同一の疾患と考えられる。（厳密に考えるとそうとも言えない時もあるのだが，便宜上はそう捉えていただいて差し支えない。）もっと正確には，

>「疾病及び関連保健問題の国際統計分類：International Statistical Classification of Diseases and Related Health Problems（以下「ＩＣＤ」と略）」とは、異なる国や地域から、異なる時点で集計された死亡や疾病のデータの体系的な記録、分析、解釈及び比較を行うため、世界保健機関憲章に基づき、世界保健機関（ＷＨＯ）が作成した分類である。
　最新の分類は、ＩＣＤの第１０回目の修正版として、1990年の第４３回世界保健総会において採択されたものであり、ＩＣＤ－１０（１９９０）と呼ばれている。

とのことである。参照 [「疾病、傷害及び死因の統計分類ー厚生労働省」](http://www.mhlw.go.jp/toukei/sippei/)

###どこかに良さそうなデータが無いかしら。
これに関しては良いデータがある。→ [ICD10対応標準病名マスター](http://www2.medis.or.jp/stdcd/byomei/)　である。
*Thanks to @keyboardrobot!*
前時代的なUIとは裏腹に（失礼）結構な頻度（おおよそ3ヶ月に一度）で更新されている。今年度は（6/1，10/1，1/1，3/1）で更新する予定らしい。
さて，ここからファイルをダウンロードして，必要な情報を取り出していこう。

###ダウンロード＆解凍
クリックしてダウンロードしても良いし，
wgetかcurlで

```
$ wget http://www2.medis.or.jp/stdcd/byomei/download/file/byomei309.zip .
$ unzip byomei309.zip
```
のようにダウンロードしても良い。ただ，このbyomei309の309は，バージョンを示しているので，結局ブラウザ上でバージョンを確かめなければならないのが微妙に面倒だが，まあ良いのである。

###エンコードをShift JISからUTF-8に変更

そのままプログラムを走らせると，盛大に文字化けするので，エンコードをみると(nkfはmacに標準装備されていませんが，簡単にエンコードのチェックと変換が出来るので，導入をおすすめします。[nkfインストール](http://ameblo.jp/a21b14/entry-10772763588.html) [nkf使い方まとめ](http://blog.layer8.sh/ja/2011/12/23/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E5%A4%89%E6%8F%9B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89nkf%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%BE%E3%81%A8%E3%82%81-linux/)　（　再掲m(__)m　）

```command
nkf -w -w80 --overwrite byomei309/main/nmain309.txt 
```
###必要な列を選択して，ソート。Markdown仕様に整形，Sagace用にクエリーを投げる。

ruby側もエンコード指定をしておく。
[参考:コマンドラインオプションで文字コードの指定](http://www.rubylife.jp/ini/japan/index3.html)

```ruby
#! ruby -Ku
#↑なにを隠そう上記の薄い文字がポイントだ。
#!/usr/local/bin/ruby
ICD10Ary = Array.new
ICD10qAry = Array.new
File.open("byomei309/main/nmain309.txt"){|file| #ICD10とその時の疾患名を取得
        while line = file.gets
        lineAry = line.split(",")
        ICD10Ary << [lineAry[6].gsub("\"",""),lineAry[2].gsub("\"","")]#欲しいデータだけを配列入れこむ。lineAry[6]はICD10のIDで，lineAry[2]は疾患名である。
        end
}
ICD10Ary.sort.each{|elem|
        if elem[0] != "" then #ICD10が無いものは抜かす。ソートしてクエリ用の配列に入れる。
                ICD10qAry <<  elem
        end
}

i = 0
print "| ICD-10 | Disease Name | Sagace URL |\n|:----------:|:------------:|:------------:|\n"
while i < ICD10Ary.length do
print "|" + ICD10qAry[i][0] + "|" + ICD10qAry[i][1] + "|http://sagace.nibio.go.jp/cgi-bin/sagace/search.cgi?action=search&keyword="+ ICD10qAry[i][1] + "|\n"
i += 1
end #while
```

最後の方がずさんな説明になっていて申し訳ないのですが，これで比較的簡単に必要なデータを取り出すことができます。
うむ，ほとんど自分用メモになってしまった(^_^;)。疾患をIDで示すと何が嬉しいの？って話はまた後ですることにして，とりあえず，これで目的は達成出来ます。
実行結果は長くなりすぎて載せられなかったので，[別ページ(GithubのWiki)](https://github.com/maoringo/SampleRepository/wiki/%E6%97%A5%E6%9C%AC%EF%BC%88%E8%AA%9E%EF%BC%89%E3%81%AE%E7%96%BE%E6%82%A3%E3%81%A8Sagace)に載せました。
cygwin上でlinux.gitをcloneするとハマる件について

大人の事情でcygwin上でlinux.gitをモニョる必要があった...

```shell-session:shot-yourself-in-t3h-f00t
$ cd ${GIT_REPOS}
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux
$ git status -s
 M include/uapi/linux/netfilter/xt_CONNMARK.h
[SNIP]
```

...は？

```shell-session:shot-yourself-in-t3h-f00t-again
$ git reset --hard
$ git status -s
 M include/uapi/linux/netfilter/xt_CONNMARK.h
[SNIP]

$ for f in $(git status -s | awk '{$2}') ; do git checkout HEAD $f ; done
$ git status -s
 M include/uapi/linux/netfilter/xt_CONNMARK.h
[SNIP]

$ cd ${TMP}
$ wget ftp://ftp.ring.gr.jp/pub/linux/kernel.org/kernel/v3.x/linux-3.10.tar.xz
$ tar -xvJf linux-3.10.tar.xz
[SNIP]
$ cd ${GIT_REPOS}
$ for f in $(git status -s | awk '{$2}') ; do cp ${TMP}/linux-3.10/$f $f ; done
$ git status -s
 M include/uapi/linux/netfilter/xt_CONNMARK.h
[SNIP]
```

おぅ，しっと...

ヤクの毛刈りの結果，case-insensitiveが原因と判明．
[Git-windows case sensitive file names not handled properly](http://stackoverflow.com/questions/2528589/git-windows-case-sensitive-file-names-not-handled-properly)
[Case sensitive filenames](http://www.cygwin.com/cygwin-ug-net/using-specialnames.html#pathnames-casesensitive)
[The Cygwin Mount Table](http://cygwin.com/cygwin-ug-net/using.html#mount-table)

なので，regedit.exeで，

```registry:use-this-fsckin-bullet-for-t3h-next
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\obcaseinsensitive
```

を0にして，再起動．
/etc/fstabがデフォルトのままなら，/cygdrive/[a-z]以下以外はcase-sensitiveになるので，
改めて，git reset --hardすれば解決する．
「TwitterAPI v1.1(GET限定)に簡単アクセス」を改造してみた

@rev84さんが1週間ほど前に投稿していた[TwitterAPI v1.1(GET限定)に簡単アクセス](http://qiita.com/rev84/items/eaef78275ba295c9858b)を自分好みに改造してみました。

@rev84さんバージョンは、こんな形で関数呼び出しをしていますが、

```js:@rev84さんバージョン
// あらかじめアプリ登録して取得
var CONSUMER = {
    "key" : XXXXXXXXXXXXXXX,
    "secret" : XXXXXXXXXXXXXXXX 
};

// ユーザの自前アカウントで取ってきてもらってもいいし、アプリ固有のを埋め込んでもいい
var ACCESS = {
    "screen_name" : false,
    "key" : false,
    "secret" : false
};
    .
    .
    .

getTwitterAPI('https://api.twitter.com/1.1/application/rate_limit_status.json?resources=users', 'callback_limit');
function callback_limit(json){
    var limitHash = json;
    console.log(limitHash);
}
```

こんな感じで呼び出せるようにしました。

```js:@ktty1220バージョン
// オブジェクト作成
var twapi = new TwitterAPIonBrowser({                                  
  consumerKey: 'CONSUMER_KEY',
  consumerSecret: 'CONSUMER_KEY_SECURET',
  accessToken: 'ACCESS_TOKEN',
  accessTokenSecret: 'ACCESS_TOKEN_SECRET'
});

// API呼び出し
twapi.get('application/rate_limit_status', {
  resources: 'users'
}, function (data) {
  // エラーの場合はdataがundefinedになる
  console.log(data);
});
```

検索の場合はこんな感じですね。

```js:検索の場合
twapi.get('search/tweets', {
  q: 'うんこなう',
  lang: 'ja',
  count: 10,
  include_entities: true
}, function (data) {
```

また、関数呼び出し時に`<head>`タグに追加された`<script>`タグをコールバック実行後に掃除したりするクリーンなエコ機能も追加しています。

その他の条件は@rev84さんバージョンと同様です。

* oauth.js、sha1.jsが必要
* GET限定
* APIキーはスクリプトに直書き

なので公のサービスには使えないと思いますが、個人用とか限定されたメンバー用なんかでは使えるかな、と。サーバーいらずでお手軽です。

ソースはこちらです。CoffeeScriptなのでJavaScriptにコンパイルして利用ください。

```coffeescript:TwitterAPIonBrowser
class TwitterAPIonBrowser
  constructor: (oauthKeys) ->
    @parameters =
      oauth_signature_method: 'HMAC-SHA1'
      oauth_consumer_key: oauthKeys.consumerKey
      oauth_token: oauthKeys.accessToken
    @secret =
      consumerSecret: oauthKeys.consumerSecret
      tokenSecret: oauthKeys.accessTokenSecret

  get: (api, apiParams, callback) =>
    # 使い捨てのJSONPコールバック関数名
    tmpCallback = "__twitter_api_on_browser_#{Number new Date()}"

    # OAuthリクエスト用のパラメータ作成
    reqParams = {}
    reqParams[k] = v for k, v of @parameters
    reqParams[k] = v for k, v of apiParams
    reqParams.callback = tmpCallback

    api = "https://api.twitter.com/1.1/#{api}.json"
    message =
      method: 'GET'
      action: api
      parameters: reqParams

    OAuth.setTimestampAndNonce message
    OAuth.SignatureMethod.sign message, @secret

    # scriptタグ作成
    scriptTag = document.createElement 'script'
    scriptTag.type = 'text/javascript'

    # reqParamsからOAuthリクエスト用のURLを作成
    scriptTag.src = OAuth.addToURL api, reqParams

    # 使い捨てのJSONPコールバック本体
    window[tmpCallback] = (data) ->
      callback data
      # 使い捨てなので1秒後にscriptタグと関数自体を削除
      setTimeout () ->
        scriptTag.parentNode.removeChild scriptTag
        try
          delete window[tmpCallback]
        catch e
          # 古いIE用
          window[tmpCallback] = undefined
      , 1000

    # scriptロードエラー時には引数なしで返す
    scriptTag.onerror = () -> callback()

    # headタグ内にscriptタグ設置
    headTag = document.getElementsByTagName('head').item(0)
    headTag.appendChild scriptTag

@TwitterAPIonBrowser = TwitterAPIonBrowser
```
Android StudioでAndroid SDKのソースコードを参照する

 
SDK Managerから該当するSDKのソースコードをインストールする。

![2013-07-04_1154.png](https://qiita-image-store.s3.amazonaws.com/0/2435/de4cae63-dc84-fc02-5b9f-ec9887c8de4b.png "2013-07-04_1154.png")



Android StudioのFile > Project Strucureを開き、Platform Settings のSDKの sourcepath にSDK Managerからダウンロードしたソースコードのパスを設定する。
 この設定はなくなりソースをダウンロードすれば自動で検索してくれるようになった。

![2013-07-04_1157.png](https://qiita-image-store.s3.amazonaws.com/0/2435/06e19189-c294-2b23-920f-3546ba1b580b.png "2013-07-04_1157.png")

あとはソースコードから **Go To > Declaration** を実行すれば飛べる。

![2013-07-04_1203.png](https://qiita-image-store.s3.amazonaws.com/0/2435/248a77d3-248d-91fb-796a-603a025d5807.png "2013-07-04_1203.png")

自分でソースコードからjarを作っていたころと比べると便利になったものだ。そしてどうやらHomebrewで入れたSDKと別々に入ってるようなのであとで運用を考えよう。
Engine Yard DashBoardでAWSのAvailability Zoneを確認する

**i-**で始まるインスタンスの識別子（したのスクリーンショットでは、i-b8e7a2ba）の上にマウスをホバーすると表示されます。

![](http://gyazo.com/730ae67efb91aef3744a6763f3d14096.png)
Rroongaを最速でインストールするには

いよいよ、[gihyo.jp](http://gihyo.jp/)さんでGroongaの隔週更新連載が始まりました!! 
第6回の記事も公開されたので、一読をおすすめします。

* [「第1回 全文検索エンジンGroongaを紹介します！」](http://gihyo.jp/dev/clip/01/groonga/0001)
* [「第2回 GroongaをRuby On Railsでも使ってみた ～chikamap.comの事例から」](http://gihyo.jp/dev/clip/01/groonga/0002)
* [「第3回 すべてのMySQLユーザに高速な全文検索機能を！ - Mroongaの紹介」](http://gihyo.jp/dev/clip/01/groonga/0003)
* [「第4回 Rroongaを使ったソースコード検索エンジンMilkode」](http://gihyo.jp/dev/clip/01/groonga/0004)
* [「第5回 Rubyでサーバ要らずの高速全文検索！ - Rroongaの紹介」](http://gihyo.jp/dev/clip/01/groonga/0005)
* [「第6回 [実録] MySQL向け全文検索エンジン「Tritonn」から「Mroonga」への移行ガイド（1）」](http://gihyo.jp/dev/clip/01/groonga/0006)


# はじめに

Rubyでサーバ要らずの高速全文検索を実現するためのオープンソースソフトウェアとして[Rroonga](http://groonga.org/ja/)(るるんが)を公開しています。

この記事を書いた時の最新のバージョンは2013年5月29日にリリースした[3.0.2](http://ranguba.org/rroonga/ja/file.news.html#3-0-2)です。

今回は、そのRroongaを最速でインストールする方法について紹介します。

# Rroongaのインストールについて

Rubyで全文検索をするのにRroongaを使いたい、となったときにまずすることはインストールです。

Rroongaは隔週連載Groongaの第5回の記事にもあるように[インストールしやすいこと](http://gihyo.jp/dev/clip/01/groonga/0005?page=3#sec4_h6)をとても大事にしています。

というのも、Rroongaはオープンソースのカラムストア機能付き全文検索エンジンである[Groonga](http://groonga.org/ja)をライブラリとして使っています。
RroongaはRubyで書かれた部分だけでなく、Cで書かれた部分もあります。Groongaがインストールされた状態でコンパイルが必要です。

Rroongaを使いたいだけなのに、事前にあれこれインストールすることを気にしないといけない、というのでは大変です。

そこで、Groongaがインストールされていることを意識しなくても済むようになっています。
インストールするときの手順はこれだけです。

```zsh
% gem install rroonga
```

単にRroongaのgemをインストールするだけです。
これは、もしGroongaがインストールされていない場合でもソースコードをダウンロード、ビルドしてからRroongaのインストールを再開する仕組みになっているからです。

# Rroongaのインストールにかかる時間について

Rroongaを手順通りにインストールすると、時間がかかることに気づきます。

実際に時間を測ってみましょう。

```zsh
% time gem install rroonga
Building native extensions.  This could take a while...
Successfully installed rroonga-3.0.2
1 gem installed
  464.65s user 21.78s system 89% cpu 9:04.08 total
```

9分程度かかっていることがわかります。
Groongaをまったくインストールしていない、 Core(TM) i7-2640M (2.80GHz)のCPUと8GBのメモリを積んだノートPCでこの状態です。

もうすこし速くならないものでしょうか。

# Rroongaのインストールを短縮するには

Groongaをビルドするのに時間がかかる理由については[Groongaの最適化によるビルド時間への影響](http://qiita.com/groonga/items/24ea9b51537217b9f526)という記事を書きました。

時間がかかるのはビルドするせいなので、事前にバイナリパッケージをインストールしておけば時間を節約できます。

もし、Ubuntu 14.04をお使いなら、以下のようにして``libgroonga-dev``をインストールしてからRroongaをインストールします。

```zsh
% sudo add-apt-repository -y ppa:groonga/ppa
% sudo apt-get update
% sudo apt-get install libgroonga-dev
% gem install rroonga
```

では、実際に``libgroonga-dev``をあらかじめインストールした状態でRroongaをインストールするのにどれくらいかかるか確認してみましょう。


```zsh
% time gem install rroonga
Fetching: rroonga-3.0.2.gem (100%)
Building native extensions.  This could take a while...
Successfully installed rroonga-3.0.2
1 gem installed
  6.98s user 0.94s system 22% cpu 34.482 total
```

34秒、と大幅にインストール時間を短縮できていることがわかります。

| Groongaのインストールの有無       | 時間                |
|:----------|-----------------------------------------:|
| 未インストール       | 9分4秒 |
| インストール済み       | 34秒 |

# まとめ

今回は、Rroongaを最速でインストールする方法を紹介しました。

Rroongaに興味を持ったなら、まずは[インストール](http://ranguba.org/ja/#install-rroonga)して試してみてください。

Rroongaの基本的な動作を知るための[チュートリアル](http://ranguba.org/rroonga/ja/file.tutorial.html)もあります。インストールしたら試してみてください。
[oh-my-zsh] 便利コマンド

最近使ったコマンドの統計が見れる。

```zsh:
zsh_stats
```

mkdir + cdしてくれるtakeコマンド。

```zsh:
take foo
take foo/hoge
```

oh-my-zshのアンインストール。

```zsh:
uninstall_oh_my_zsh
```

oh-my-zshのアップデート。

```zsh:
upgrade_oh_my_zsh
```

どれも
~/.oh-my-zsh/lib/functions.zsh
にありました。
oh-my-zshでzsh_statsを使うと

どんなコマンドをよく叩いてるか分かるので晒。

```zsh:
➜  lib git:(master) ✗ zsh_stats
     1	4347  43.4743%   g
     2	654   6.54065%   vi
     3	606   6.06061%   sbt
     4	484   4.84048%   cd
     5	404   4.0404%    ll
     6	307   3.07031%   less
     7	299   2.9903%    git
     8	280   2.80028%   curl
     9	252   2.52025%   grunt
    10	168   1.68017%   ff
    11	150   1.50015%   cp
    12	114   1.14011%   ssh
    13	112   1.12011%   mv
    14	88    0.880088%  rm
    15	85    0.850085%  mysql
    16	82    0.820082%  mkdir
    17	77    0.770077%  pwd
    18	74    0.740074%  play
    19	68    0.680068%  grep
    20	67    0.670067%  ps
```

gはgitのalias。
(.NET) リストビューのカラムヘッダに設定したアイコンを消す方法

# 概要
ColumnHeader.ImageIndex を設定することでリストビューのカラムにアイコンを表示することができますが、
これを消すのはちょっとコツがいりますよ、というお話。

# ダメな例

ColumnHeader.ImageIndex を -1 に戻すだけじゃダメなんです。

```csharp:
ListView view;
int col;
view.Columns[col].ImageIndex = -1;
```


# 解決方法

ColumnHeader.ImageIndex を -1 に戻すのに加えて
ColumnHeader.TextAlign を設定しなおすと、ちゃんとアイコンが消えます。

```csharp:
ListView view;
int col;
view.Columns[col].ImageIndex = -1;
view.Columns[col].TextAlign = view.Columns[col].TextAlign;
```

とってもバッドなノウハウですね。Microsoft の実装が悪いと思う。

# 関連フォーラム記事
[How to remove picture(icon) from listview column header [VB 2008]](http://social.msdn.microsoft.com/Forums/vstudio/en-US/3489bdea-5f9c-4fed-bd51-9f9055a84aee/how-to-remove-pictureicon-from-listview-column-header-vb-2008)
現在地の取得とinstagramapiに関して

以下のコードでお聞きしたいことがあります。
以下のものは文字入力(ex.東京タワー)することで、その近辺の地図とinstagramの写真があがるはずのものなのですが、入力した文字が上手くgooglemapに渡せていません;;
どなたか解説とともにアドバイスよろしくお願いします(切実)
また、加えてこれらは文字入力形式ですが、自動で現在地からinstagramの写真を得るようなものを作る場合、どのように書いていけばよろしいでしょうか？近くに聞ける人もいなく困っています;;
よろしくお願いします。
----HTML----
![スクリーンショット 2013-07-04 3.49.26.png](https://qiita-image-store.s3.amazonaws.com/0/26562/ac94032a-b544-7d65-25c9-a395bda34dfa.png)


----JS----
![スクリーンショット 2013-07-04 3.52.40.png](https://qiita-image-store.s3.amazonaws.com/0/26562/5bf6fe29-586b-c220-c031-d3e181971f62.png)
![スクリーンショット 2013-07-04 3.52.58.png](https://qiita-image-store.s3.amazonaws.com/0/26562/b579135f-7db3-d75b-34bb-869eacc19532.png)
errormaker.vim使用時にQuickFixウインドウを自動開閉する設定


vimのプラグインであるerrormaker.vimを使うと,保存のタイミングで指定したチェックコマンドを走らせて,その結果をQuickFixで管理することができる.

![Screen Shot 2013-07-04 at 2.12.51.png](https://qiita-image-store.s3.amazonaws.com/0/1835/b8065ba8-c4ca-8ad4-0e5a-0807c2dbe133.png "Screen Shot 2013-07-04 at 2.12.51.png")


errormaker.vimについては以下のサイトが導入に際しての参考になる.

* http://subtech.g.hatena.ne.jp/secondlife/20080729/1217315593
* http://www.hexacosa.net/blog/detail/54/

QuickFixに関しては,vimの`:help Quickfix`を見た方がはやい.(きっちり説明する自信なし..)

## このままだと面倒なこと

ただこのままだと,エラーの箇所は分かるもののエラー詳細が分からずに,QuickFixウインドウを開く(`:copen`コマンド)という事態が(注:私のなかではしょっちゅう)生じる.

さらに一度開いたQuickFixウインドウは明示的に閉じなくてはならない(`:cclose`コマンド). 
画面が大きい場合は開きっぱなしにして放っておいても良いかも知れないが,screen/tmux,もしくはvimの画面分割を活用している場合は,えてして一つの領域が狭くなりがちである.

QuickFixウインドウが表示されて欲しい=『エラーが一件以上ある』場合であり,それ以外の場合は表示されないことが望ましい.

## ということで

以下の設定をファイルタイププラグインに追加して,QuickFixウインドウを自動で開閉するようにした.

ファイル保存時にエラーがあれば,自動的にQuickFixウインドウが開く→修正後は自動で閉じるという挙動が実現できるため,快適なエラーチェックが可能に.

```vim:~/.vim/after/ftplugin/python.vim
setlocal makeprg=/Users/tatsuro/python/pythonbrew/bin/flake8\ %
setlocal errorformat=%f:%l:%m

""" getqflist()でQuickFixのエラー件数が取得できる.
function! s:open_quickfix_window()
    silent make | redraw!
    if (len(getqflist()) == 0)
        cclose
    else
        copen
    endif
endfunction

if !exists("g:python_flyquickfixmake")
    let g:python_flyquickfixmake = 1
    au BufWritePost *.py call s:open_quickfix_window()
endif
```
malloc()でLinuxの仮想メモリ空間のメモリ確保をし続けるだけのプログラム

malloc()で単純にLinuxの仮想メモリ空間のメモリ確保をし続けるプログラムのサンプルです。
出力値は、繰り返し処理が行われるたびにmallocで確保するメモリと同値(1GB)を加算していくという簡易な計算処理の結果です。

## 実行環境
##### OS
CentOS 6.4 x86_64(64bit版)

```
% cat /etc/redhat-release
CentOS release 6.4 (Final)
```
##### カーネルバージョン
```
% uname -r
2.6.32-358.11.1.el6.x86_64
```
##### メモリ
物理メモリ2G、スワップサイズ2Gです。

```
% free
             total       used       free     shared    buffers     cached
Mem:       1922564      92680    1829884          0       7156      26016
-/+ buffers/cache:      59508    1863056
Swap:      2097144      11176    2085968
```

##### カーネルパラーメータ(※2013/7/4 追記)
コメントをいただきましたので追記します。
CentOS6のデフォルトでメモリオーバーコミットがされる設定となっています。
メモリオーバーコミットについての詳細説明は省略しますが、メモリが要求された際に、搭載されている物理メモリ以上のメモリ(仮想メモリ空間)を割り当てるというOSの機能です。

```
# sysctl -a | grep vm.over
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
```

## サンプルコード
```get_vmem_test.c
#include <stdio.h>
#include <stdlib.h>

int main() {
  char *p;
  unsigned long i = 0;

  // 文字列変数に1GB(1073741824 B)のメモリを確保し続ける
  // メモリを確保できなくなるとmallocはnullを返すため、nullが返されるまで繰り返す
  do {
    p = (char *)malloc(1073741824);
    i=i+1073741824;
  } while (p != NULL);

  // iの値が確保できたメモリの総量となる(GB単位で出力)
  printf("%lu GB \n", i/1024/1024/1024);

  exit(0);
}
```

## コンパイル
```
% gcc -o get_vmem_test get_vmem_test.c
```
## 実行

```
% ./get_vmem_test
122216 GB
```

## 補足(※2013/7/4追記)
参考にオーバーコミットを無効(vm.overcommit_memory=2)、割り当て可能なメモリを物理メモリ+スワップの合計値の99%(vm.overcommit_ratio=99)に指定した場合の実行結果を記載しておきます。この環境では最大4GB割り当て可能となります。

各パラメータの詳細については下記を参照してください。
* [proc(5) - Linux manual page](http://man7.org/linux/man-pages/man5/proc.5.html "proc(5) - Linux manual page")

##### カーネルパラメータ設定変更
```
# sysctl -w vm.overcommit_ratio=99 && sysctl -w vm.overcommit_memory=2
```
##### パラメータ確認
```
# sysctl -a | grep vm.over
vm.overcommit_ratio = 99
vm.overcommit_memory = 2
```
##### プログラム実行
```
% ./get_vmem_test
4 GB
```
AntisamyでYoutubeの埋め込みに対応する

## はじめに
AntiSamy(v1.4.5)使用時にYoutubeの埋め込みタグに対応してみました。

iOS向けにも表示するので、旧埋め込みタグは無視しています。
旧タグも許可したい場合は、[AntiSamy Policy to allow YouTubeVideos](https://www.codemagi.com/blog/post/127)を参照してください。

## Policyファイルを編集する
最初に、YoutubeのURLを許可するregexpを定義します。

```xml:policy.xml
<regexp name = "YouTubeURL"
    value = "\s*(?:http\:|https\:)?//www.youtube(?:-nocookie)?.com/embed/([a-zA-Z0-9-]+).*" />
```

  
次に、iframeタグの部分を編集します。

```xml:policy.xml
<tag name = "iframe" action = "validate">
    <attribute name = "height"/>
    <attribute name = "width" />
    <attribute name = "frameborder">
        <regexp-list>
            <regexp value = "[0]" />
        </regexp-list>
    </attribute>
    <attribute name = "src">
        <regexp-list>
            <regexp name = "YouTubeURL" />
        </regexp-list>
    </attribute>
    <attribute name = "allowfullscreen">
        <regexp-list>
            <regexp value = "?" />
        </regexp-list>
    </attribute>
</tag>
```

  
これで貼り付けられるようになります。

### 追記
attributenameで設定している、"height", "width"などは事前に定義されているxmlを参照して下さい。
(mod|ngx)_small_lightのビルドエラー対処法 in Mountain Lion

Mountain Lion(Mac OS X 10.8)だと(mod|ngx)_small_lightでImlib2を有効にした状態でビルドしようとしたらこけたのでその対処メモ。

## 依存ライブラリのインストール

mod_small_lightはImageMagickとImlib2に、ngx_small_lightはその二つに加えてGDにも依存しているが、ビルドオプション次第で一部取り外し可能。

```zsh:
$ brew install imagemagick imlib2 gd
```

## [mod_small_light](https://github.com/yamac/smalllight)のビルド

```zsh:
$ cd smalllight
$ ./configure --with-imlib2 --with-Wand --with-apxs=/usr/sbin/apxs
$ make
     ・
     ・
     ・
ld: library not found for -lX11
clang: error: linker command failed with exit code 1 (use -v to see invocation)
apxs:Error: Command failed with rc=65536
$
```

## [ngx_small_light](https://github.com/cubicdaiya/ngx_small_light)のビルド

```zsh:
$ cd ${ngx_small_light_src_dir}
$ ./setup --with-imlib2
$ cd {$nginx_src_dir}
$ ./configure --with-pcre --add-module=${ngx_small_light_src_dir}
     ・
     ・
     ・
checking for ngx_small_light dependencies ... not found
$
```

ngx_small_lightはこの出力だと何でこけたのかわからないな。まぁ、それは追々直すとして原因はmod_small_lightと同じでMountain LionにX11が含まれていないせい。

そもそもsmall_light的にはX11にリンクする必要などないのだがImlib2がX11に依存している関係でどうしてもこのエラーが出てしまう。なので以下のようにImlib2をX11から切り離してビルドする。

```zsh:
$ brew install imlib2 --without-x
```

これで上記のエラーは出なくなる。

ところで[XQuartz](http://xquartz.macosforge.org/landing/)をインストールすることでMountain LionでX11にリンクすることも可能だが、small_lightの場合、homebrewでインストールしたImageMagickを有効にしているとWand-configがエラーを吐く。

```zsh:
$ export DYLD_LIBRARY_PATH=/opt/X11/lib:$LD_LIBRARY_PATH
$ Wand-config --libs
dyld: Symbol not found: __cg_png_create_info_struct
  Referenced from: /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
  Expected in: /opt/X11/lib/libPng.dylib
 in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
$
```

多分XQuartzに含まれているlibpngとImageMagickが使用しているlibpngにABI互換性がないのが原因。
Goサーバーへアクセスしたパスでの処理分岐

アクセスしたパスでの処理振り分け方法に少し悩んだのでメモしておきます。
（package http の func pathMatch の定義を見て解決しました）

例ではhttp.Handleにはパターンとして"/app/"を登録し、ハンドラに渡されたパス（"/app/post/(form|confirm|do)"）をパターンマッチして処理を振り分けます。

```go:server.go
package main

import (
	"fmt"
	"html"
	"net/http"
	"regexp"
)

type Router struct {
	config map[string]interface{}
}

func (router *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if m, _ := regexp.MatchString(`^/app/post/form$`, r.URL.Path); m {
		fmt.Fprintf(w, "Regist Form, %q", html.EscapeString(r.URL.Path))
	} else if m, _ := regexp.MatchString(`^/app/post/confirm$`, r.URL.Path); m {
		fmt.Fprintf(w, "Regist Confirm, %q", html.EscapeString(r.URL.Path))
	} else if m, _ := regexp.MatchString(`^/app/post/do$`, r.URL.Path); m {
		fmt.Fprintf(w, "Regist Do, %q", html.EscapeString(r.URL.Path))
	} else {
		fmt.Fprintf(w, "Other, %q", html.EscapeString(r.URL.Path))
	}
}

func main() {
	http.Handle("/app/", &Router{config: make(map[string]interface{})})
	http.Handle("/", http.FileServer(http.Dir("./static")))
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		panic(err)
	}
}
```
次のもっともっと交流ステーションの日付を表示するスニペット

わたしがなるべく毎月参加している[もっともっと交流ステーション](http://www.e-town.ne.jp/kounandai/topics/947.html)という地域イベントがあります。
せっかくなので自分のサイトに日付を表示してみました。
もっともっと交流ステーションは、基本的に毎月第一金曜日に開催されるイベントです。ただし、1月と第一金曜日が祝日の時は、開催されません。
今回のコードでは「第一金曜日が祝日」というのは5月しかないはずなので、ひとまず5月に決め打ちして処理を書いています。

内容的にはすごく単純ですが、MODxならこんな感じで簡単にPHPコード入りのページを作れますよ ということで。
なお、`DateTime->modify()`を指定しているので、サーバのPHPバージョンが5.3.0以降である必要があります。

```php:NextMottoMotto
<?php
/*
* NextMottoMotto
* Author:高見知英( http://onpu-tamago.net/ )
* 次のもっともっと交流ステーションの日付を取得するスニペット
*/
  if(!isset($format)) {
    $format="Y/m/d";
  }

  $first = new DateTime();
  $date = clone $first;
  $first->modify( 'first day of this month' );
  if($date > nextFirstFriday($first)){
    $date->modify( 'first day of next month' );
    $m = $date->format('m');
    $w = $date->format('w');
    if($m == '01' || ($m == '05' && $w < 4)){
      $date->modify( 'first day of next month' );
    }
  }
  $date = nextFirstFriday($date);
  return $date->format($format);

  function nextFirstFriday($date)
  {
    $calc = clone $date;
    return $calc->modify('1 Fri');
  }
?>
```

で、使うときは次のように

```text:Template,Chunk
[[NextMottoMotto]]
もしくは、
[[NextMottoMotto?format=`Y年m月d日`]] など
```

表示は次のようになります。

> 2013/07/05
> formatつき
> 2013年07月05日
Typescriptでコンパイルすればいい！！誰が書いてもある程度Javascriptの質が担保できる！？


TypeScript は新しい言語ではなく、JavaScript のスーパーセットで、強力でかつ型指定が可能です。そのため、すべての JavaScript は TypeScript として有効であり、コンパイラが生成するのは JavaScript です。

### 【公式】Typescriptを参考
http://www.typescriptlang.org/

##導入
###事前準備
node.jsは導入済み
npmは導入済みである事
###インストール

```bash
$ npm install -g typescript
```

### サンプル作成
まず最初にサンプルのtypescriptを作成します。

```bash
$ vim sample.ts
 
class shop {
  price: number;
  num: number;
  constructor() {
    this.num = 10;
  }
  setPrice(price: number) {
    this.price = price;
  }
  calculatePrice() {
    var total: number = this.num * this.price;
    return this.price + '円のりんごを' + this.num + '個購入した場合' + total + '円です。';
  }
}
var sp = new shop();
sp.setPrice(1000);
document.body.innerHTML = sp.calculatePrice();
```

### コンパイルの実行

```bash
$ tsc sample.ts
```

### lsでコンパイル結果を見る

```bash
$ ls sample.*
sample.js    sample.ts
```

### コンパイルで生成したjavascriptを見る

```bash
$ vim sample.js 
 
var shop = (function () {
    function shop() {
        this.num = 10;
    }
    shop.prototype.setPrice = function (price) {
        this.price = price;
    };
    shop.prototype.calculatePrice = function () {
        var total = this.num * this.price;
        return this.price + '円のりんごを' + this.num + '個購入した場合' + total + '円です。';
    };
    return shop;
})();
var sp = new shop();
sp.setPrice(1000);
document.body.innerHTML = sp.calculatePrice();
```

このコードをブラウザで表示すると
「1000円のりんごを、10個購入した場合、10000円です。」と表示されます。
ちゃんと計算されてます。 
では、次に型宣言を無視して、計算出来ないようにしてみたらどうなるのか、確認します。

```bash
$ vim sample.ts
  
class shop {
  price: number;
  num: number;
  constructor() {
    this.num = 10;
  }
  setPrice(price: number) {
    this.price = price;
  }
  calculatePrice() {
    var total: number = this.num * this.price;
    return this.price + '円のりんごを' + this.num + '個購入した場合' + total + '円です。';
  }
}
var sp = new shop();
sp.setPrice('1000');
document.body.innerHTML = sp.calculatePrice();


$ tsc sample.ts 
sample.ts(20,4): error TS2081: Supplied parameters do not match any signature of call target.
sample.ts(20,4): error TS2087: Could not select overload for 'call' expression.
```

もし、このコードが正常にコンパイルされていたとしたら、
this.num(number) * this.price(string)の計算処理が行われるjavascriptが作成されていましたが、ちゃんとエラーが出ました。
この様に、型を宣言する事で、想定外の値が導入された場合、エラーが発生してしまう場所を
未然に防ぐ事ができます。 
 
ま、この例ではjavascriptは作成されちゃうのですが、、、、
今回は、型エラーがちゃんと出るという事を確認出来たので、OKです。 

※前はデザイナにも知ってほしいと書いていたのですが
内容的に、エンジニアよりに書きすぎていたため、タイトルを変更しました。
時間を見つけて、デザイナに何故知ってほしいのかを、別に書いてみたいと思います。
ブロック構文を実装！NSNotificationCenterの使い方その3

最近つかっている _NSNotificationCenter_ がかなり便利だったのでまとめてみた。
ブロック構文を実装しよう。

今回はobj-c開発鬼門のひとつ、ブロック構文を使おうと思う。
循環参照がおこるとメモリリークを起こしてしまうので注意して使いたい。

NSNotificationCenterは前回もだいぶすごい使い方だが、
今回は同じことをブロック構文で実装することで、メソッドを減らします。

今回使うメソッドは以下の3つ

```objectivec:NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserverForName: object: queue: usingBlock:]
 [[NSNotificationCenter defaultCenter] removeObserver: name: object:]
[[NSNotificationCenter defaultCenter] postNotificationName:object:userInfo:]

```
delegateを使わずに、クラス間でメソッドを実行できる。
実装は以下のとおり。

```objectivec:ViewController.h

#import "TouchImageView.h"

@interface ViewController : UIViewController
@property (strong, nonatomic) TouchImageView *imageView;
@end
```

```objectivec:ViewController.m

static NSString * const kDetail = @"detail";

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //タッチできる画像を配置する
    imageView = [[TouchImageView alloc] initWithImage:[UIImage imageNamed:@"sasamisan"]];
    imageView.userInteractionEnabled = YES;
    imageView.backgroundColor = [UIColor greenColor];
    imageView.frame = CGRectMake(100, 100, 200, 300);
    [self.view addSubview:imageView];

    __block id observer = [[NSNotificationCenter defaultCenter] addObserverForName: kDetail object: nil queue: nil usingBlock:^(NSNotification *notification){
    //渡されたオブジェクトから取り出す
    UIImageView *iv = (UIImageView *)[notification object];
    NSDictionary *userInfo = [notification userInfo];

    //詳細画面に遷移する
    DetailViewController *dvc = [[DetailViewController alloc] init];
    dvc.image = iv.image;
    dvc.userName = userInfo[@"name"];
    dvc.sex = userInfo[@"sex"];
    [self.navigationController pushViewController:dvc animated:YES];

    // 使い終わったらきちんとremoveする
    [[NSNotificationCenter defaultCenter] removeObserver:observer];
    observer = nil;
    }];
}
@end
```
```objectivec:TouchImageView.h
@interface TouchImageView : UIImageView
@end
```

```objectivec:TouchImageView.m

static NSString * const kDetail = @"detail";

@implementation TouchImageView

//タッチされたら、その画像の詳細に遷移する
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

    //メソッドに渡す値を設定する
    NSDictionary *dic = @{@"name": @"sasami", @"sex":@"female"};

    //kDetailという文字列を通知する。一緒にオブジェクトをいろいろ渡す
    [[NSNotificationCenter defaultCenter] postNotificationName:kDetail object:self userInfo:dic];
}
@end
```
DetailViewController は割愛。

前回は通知を受け取った後にメソッドに処理を渡していたが、ブロック構文にすると1箇所にまとめることができる。

注意したい点は、今回ブロック構文の中で_removeobserver_しているところである。
わざわざブロック構文の中でremoveしなくてもよいが、どこかでremoveしない限り、
ずっと残るので注意したい。
逆に、アプリが終了するまで残るので、一度設定するだけでどこからでも呼べるのは使いやすい


このように、NSNotificationCenterには多様な使い道がある。
obj-cに慣れてきたら使ってみたらどうだろうか？

前 : [delegateいらず！NSNotificationCenterの使い方その2](http://qiita.com/liver_sea/items/cf21ca5015cff7293038)