OmniAICreator/Qiita-1.07M huggingface dataset:
VisualStudio使用時の不要ファイルを消すバッチファイル

他人にソースコード全部渡すときによく使う
基本はSVNの無視設定から
結構中間生成物とか気になる。容量的に。

```bat:
@echo off
rem 色々消す
title ProjectShaper
rem 条件分岐
set /p pushKey="VS2010Projectをシェイプアップします。よろしいですか？(y/n)"
if "%pushkey%" == "y" goto KILL
if "%pushkey%" == "Y" goto KILL
if "%pushkey%" == "yes" goto KILL
if "%pushkey%" == "YES" goto KILL

rem NO -> EXT

goto EXT

rem Delete for Folder and object
:KILL
rem Debug or debug
for /r %%A in ( debug ) do ( if exist "%%A" ( rmdir /s /q "%%A"))
for /r %%B in ( release ) do ( if exist "%%B" ( rmdir /s /q "%%B"))
for /r %%C in ( ipch ) do ( if exist "%%C" ( rmdir /s /q "%%C"))
for /r %%D in ( obj ) do ( if exist "%%D" ( rmdir /s /q "%%D"))
for /r %%E in ( *.suo ) do ( if exist "%%E" ( del /s /q "%%E"))
for /r %%F in ( *.user ) do ( if exist "%%F" ( del /s /q "%%F"))
for /r %%G in ( *.sdf ) do ( if exist "%%G" ( del /s /q "%%G"))
for /r %%H in ( *.bak ) do ( if exist "%%H" ( del /s /q "%%H"))
for /r %%I in ( *.vcproj ) do ( if exist "%%I" ( del /s /q "%%I"))
for /r %%J in ( _UpgradeReport_File ) do ( if exist "%%J" ( rmdir /s /q "%%J"))
for /r %%L in ( *.ncb ) do ( if exist "%%L" ( del /s /q "%%L"))
for /r %%M in ( *.opensdf ) do ( if exist "%%M" ( del /s /q "%%M"))
for /r %%N in ( Thumbs.db ) do ( if exist "%%N" ( del /s /q "%%N"))
for /r %%O in ( *~ ) do ( if exist "%%O" ( del /s /q "%%O"))

goto EXT


:EXT
```
UIActionSheetのボタンを動的に変化させるならaddButtonWithTitle:とbuttonTitleAtIndex:を使う


UIActionSheetでボタンの表示を切り替えたい場合、ボタンはaddButtonWithTitle:メソッドにより表示順に追加し、クリック処理時はbuttonTitleAtIndex:メソッドでボタンタイトルにより分岐させればindexを気にしなくて良くなります。

![actionsheet.001.jpg](https://qiita-image-store.s3.amazonaws.com/0/16400/02e07bcc-c8ec-43de-fae7-d43ede84b880.jpeg "actionsheet.001.jpg")


大抵の場合、UIActionSheetのボタンが押された時の処理は、UIActionSheetDelegateのactionSheet: clickedButtonAtIndex:メソッドを実装し、引数で渡されるクリックされたボタンのindexによって処理を実行すると思います（iPhoneアプリ開発の虎の巻:http://iphone-tora.sakura.ne.jp/uiactionSheet.html ）。

ただ、UIActionSheetのボタンの表示を動的に変化させる場合は、ボタンの表示順が変わるため当然indexが変わり、それを考慮する必要が出てきます。つまりUIActionSheetの生成時とそのクリック処理の条件分岐にindexを共通で変化させる必要が出てきてしまいます。

しかし、UIActionSheetの生成時は条件によって追加するボタンを変更し、クリック処理時はボタンが押されたタイトルによって条件を分岐することによって、indexの整合性を取る必要がなくなります。

## 例とサンプルコード
例をあげます。UIActionSheetによりお気に入りに追加する画面があるとします。お気に入りに追加済みかどうかを示すフラグself.favがYES、そうでなければNOを返し、そのフラグによってお気に入りに既に追加済みであれば「お気に入りに追加」ボタンを表示しないというケースが有るとします。

まずUIActionSheetの生成は、addButtonWithTitleメソッドで条件によって表示する/しないを決定します。

```objective-c:
- (IBAction)showActionSheet:(id)sender
{   
    // アクションシートの作成。タイトルを設定しない
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
                                                             delegate:self
                                                    cancelButtonTitle:nil
                                               destructiveButtonTitle:nil
                                                    otherButtonTitles:nil];
    if (self.fav) {
        //すでにお気に入りに追加済みなのでお気に入りに追加という選択はない
        //ツイートするボタンのみ
        [actionSheet addButtonWithTitle:@"ツイートする"];
    } else {
        //お気に入りに登録していないのでお気に入りに追加という選択がある
        [actionSheet addButtonWithTitle:@"お気に入りに追加する"];
        [actionSheet addButtonWithTitle:@"ツイートする"];
    }

    //最後にcancelボタンを追加しボタン総数から1減らした数をindexにする
    [actionSheet addButtonWithTitle:@"キャンセル"];
    actionSheet.cancelButtonIndex = actionSheet.numberOfButtons - 1;

    // アクションシートの表示
    [actionSheet showInView:self.view];
}
```

次に処理を行うメソッドでは、buttonTitleAtIndex:メソッドを使いUIActionSheetからクリックされたボタンのタイトルを取得、そのタイトルによって処理を分岐します。

```objective-c:
//UIActionSheetDelegateによるクリック時処理
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *clieckedButtonTitle = [actionSheet buttonTitleAtIndex:buttonIndex];
   
    if ([clieckedButtonTitle isEqualToString:@"お気に入りに追加する"]) {
        //お気に入りに登録する処理実行
        /*…*/
    } else if ([clieckedButtonTitle isEqualToString:@"ツイートする"]) {
        //ツイートする処理実行
        /*…*/
    }
}
```

（上記の例ではタイトルの文字列をハードコーディングしていますが、状況によって定数やプロパティを使えばよいでしょう）

これによって、順番を気にするのは生成時のみで、処理を行うメソッドでは動的に変化するindexやお気に入りに追加済みフラグを加味しなくてもよくなっているのがわかると思います。

## メリットデメリット

メリット
・クリック時にボタン表示順による分岐処理が不要になる
・クリック時にボタン表示/非表示フラグによる分岐処理が不要になる

デメリット
・Viewであるボタンのタイトルの文字列で処理を分けるのが若干気持ち悪い


何か他にも良い方法があればコメントにお願いします。
パターンマッチ実装奮闘記(2)

前回は、簡単なパターンマッチを実装するのにLLVMを使う事にする事を考え、具体的なコードも書いてみました。

今回はどうやってLLVMにコンパイル出来るようになるかを考えます。
開発方針を決める事で、見通しが良くなるはずです。

## コンパイラの作成段階

何も無い所からいきなりパターンマッチの機能を作る事は出来ません。
段階を踏んで、パターンマッチを作る前のコンパイラを作って行きましょう。
コンパイラの開発段階は、以下の段階が考えられます。

1. 四則演算をLLVMで出来るようになる。
2. 構造体を使えるようになる。
3. switch構文を使えるようになる。

## 四則演算

四則演算が出来るコンパイラは作れないと話にならなりません。
まずは、四則演算が出来るLLVMのコンパイラをつくります。

## 構造体を使えるようになる。

パターンマッチを行うには、構造体を扱える必要がありました。
従って、四則演算が出来たら、構造体を使えるようにします。

## switch文を使えるようになる。

LLVMのswitch構文が使えればマッチング構文を作るのが簡単になります。
switchが出来るようになっておくと良いです。

## まとめ

パターンマッチングを作る為には、基盤となる技術を確立する事が大切です。
基盤が出来てから、パターンマッチを具体的に作って行くことにします。

次回からは、LLVMで必要な機能を作成して行きます。
vagrantの標準設定はどこに由来するのか？

ちょっとさがすのに手間取ったので記録しておきます。

vagrantの標準のネットワーク設定(ssh 22 -> 2222に転送とか)は、どこで設定されているのか
不明だったので調査してみました。

どうやら(vagrant@1.0.7)では、

`/var/lib/gems/1.9.1/gems/vagrant-1.0.7/config/defaulst.rb`

にいろいろ標準の設定が書かれている模様です。
中身としては以下のような物となっています。

```ruby:config.rb
Vagrant::Config.run do |config|
  # default config goes here
  config.vagrant.dotfile_name = ".vagrant"
  config.vagrant.host = :detect

  config.ssh.username = "vagrant"
  config.ssh.host = "127.0.0.1"
  config.ssh.guest_port = 22
  config.ssh.max_tries = 100
  config.ssh.timeout = 10
  config.ssh.forward_agent = false
  config.ssh.forward_x11 = false
  config.ssh.shell = "bash"

  config.vm.auto_port_range = (2200..2250)
  config.vm.box_url = nil
  config.vm.base_mac = nil
  config.vm.forward_port 22, 2222, :name => "ssh", :auto => true
  config.vm.boot_mode = "headless"
  config.vm.guest = :linux

  # Share the root folder. This can then be overridden by
  # other Vagrantfiles, if they wish.
  config.vm.share_folder("v-root", "/vagrant", ".")

  config.nfs.map_uid = :auto
  config.nfs.map_gid = :auto

  config.package.name = 'package.box'
end
```

いろいろ他にもデフォルトで設定されているようですね。
ちょっとまだ意味がわかってないですが...。

以上です。
開発環境用 Bind-Chroot 構築

##### インストール

```shell-session:
yum install bind-chroot bind-utils
```
>
```
=====================================================================================================
 Package               Arch             Version                              Repository         Size
=====================================================================================================
Installing:
 bind-chroot           x86_64           32:9.8.2-0.17.rc1.el6_4.4            updates            71 k
 bind-utils            x86_64           32:9.8.2-0.17.rc1.el6_4.4            updates           182 k
Installing for dependencies:
 bind                  x86_64           32:9.8.2-0.17.rc1.el6_4.4            updates           4.0 M
 bind-libs             x86_64           32:9.8.2-0.17.rc1.el6_4.4            updates           878 k
>
Transaction Summary
=====================================================================================================
Install       4 Package(s)
```

##### rndc.keyの生成

```shell-session:
rndc-confgen -a -r /dev/urandom -t /var/named/chroot
```
>
```
	wrote key file "/etc/rndc.key"
	wrote key file "/var/named/chroot/etc/rndc.key"
```

##### rndc.keyの所有権変更
```shell-session:
chown named:named /var/named/chroot/etc/rndc.key
```

##### named.confの修正

```shell-session:
vi /var/named/chroot/etc/named.conf
```
>
```
適当にぐぐって書く
```

##### ルートゾーン生成
```shell-session:
dig @a.root-servers.net . ns > /var/named/chroot/var/named/named.ca
```

##### ゾーン生成

```shell-session:
vi /var/named/chroot/var/named/example.com
```
>
```
$TTL    86400
@       IN      SOA     example.com. root.example.com.(
                        2013061500      ; serial
                        3600            ; refresh (1 hour)
                        900             ; retry (15 minutes)
                        604800          ; expire (1 week)
                        86400           ; negative (1 day)
)
        IN      NS              example.com.
        IN      MX      10      example.com.
        IN      A               192.168.1.11
```
【LDAP環境構築:8】 SSL対応

参考:http://gihyo.jp/admin/serial/01/ldap/0011?page=1

##### サーバの秘密鍵を作成

```shell-session:
openssl genrsa -rand /dev/urandom -des3 -out /etc/openldap/tmp/server.pem 2048
```

##### サーバの秘密鍵からパスフレーズを解除

```shell-session:
openssl rsa -in /etc/openldap/tmp/server.pem -out /etc/openldap/tmp/server.key
chmod 400 /etc/openldap/tmp/server.key
chown ldap:ldap /etc/openldap/tmp/server.key
rm /etc/openldap/tmp/server.pem
```

##### サーバ証明書の作成


```shell-session:
openssl req -new -days 3650 -key /etc/openldap/tmp/server.key -out /etc/openldap/tmp/server.csr
chmod 444 /etc/openldap/tmp/server.csr
chown ldap:ldap /etc/openldap/tmp/server.csr
```

##### 鍵と証明書の設置
設置パスの確認

```shell-session:
grep TLS /etc/openldap/slapd.conf
```
>
```
#TLSCACertificatePath   /etc/openldap/cacerts/cacert.pem
TLSCertificateFile     /etc/openldap/certs/server.csr
TLSCertificateKeyFile  /etc/openldap/certs/server.key
```

鍵と証明書を設置パスへコピー

```shell-session:
cp -av /etc/openldap/tmp/server.csr /etc/openldap/certs/server.csr
cp -av /etc/openldap/tmp/server.key /etc/openldap/certs/server.key
```

/etc/init.d/slapd restart

##### クライアント側の設定

```shell-session:
vi /etc/openldap/ldap.conf
```
> オレオレ証明の妥当性を確認しないように下記一文追記
>
```
TLS_REQCERT     never 
```

##### 確認

```shell-session:
ldapsearch -x -H 'ldaps://192.168.1.11' -b 'dc=example,dc=com'
```
STL for_each省略形

コンテナとラムダ式ぶち込むだけでいいのさ。

```cpp:
#include	<algorithm>

	template<typename CONTAINER,typename FUNCTION>
	static FUNCTION ForEach(const CONTAINER& container,FUNCTION function){
		return std::for_each(container.begin(),container.end(),function);
	}

```

使用例

```cpp:

#include <iostream>
#include <vector>
#include <random>

#include    <algorithm>

	template<typename CONTAINER,typename FUNCTION>
	static FUNCTION ForEach(const CONTAINER& container,FUNCTION function){
		return std::for_each(container.begin(),container.end(),function);
	}

int main(int argc,char* argv[]){
	
	std::vector<int> cont;
	std::mt19937 engine;
	std::uniform_int_distribution<int> distribution(1,100);
	for(int i = 0;i < 10;i++)
		cont.push_back(distribution(engine));

	ForEach(cont,[&](int i){std::cout << i<<"\t";});

    return 0;
	
}

```
2013/06/17追記
もし、boost::for_eachと同じ処理をしたいのであれば

```cpp:
	FUNCTION ForEach(const CONTAINER& container,FUNCTION function)
````
を

```cpp:
	FUNCTION ForEach( CONTAINER& container,FUNCTION function)
````

というようにconstはずせば通ります。
全体はこんな感じ

```cpp:
#include	<algorithm>

	template<typename CONTAINER,typename FUNCTION>
	static FUNCTION ForEach(CONTAINER& container,FUNCTION function){
		return std::for_each(container.begin(),container.end(),function);
	}

```
初心者のための Vagrant, Chef, VirtualBox の関係

誰のための文書？
-------------------------------

リーダーや同僚から「Vagrant, Chef を使うと環境構築楽ちんだから、これこれのファイル用意して vagrant up してみなー」と言われるがままに環境構築してみたはいいが、何なのかよくわかっていない人。

Vagrant, Chef と組み合わせて VirtualBox を使っているのに VirtualBox のGUI から起動や終了をしている人。

コマンドラインで構築するやり方はたくさん見たが、それぞれのツールの役割がわかっていない人。

2週間前の自分。

概要
------------------

図にまとめてみました

<a href='https://qiita-image-store.s3.amazonaws.com/0/3284/23af7731-1be7-e68d-7ae7-c59ab59cf739.png' target='_blank'>拡大して表示</a>
![Vagrant,Chef,VirtualBox.png](https://qiita-image-store.s3.amazonaws.com/0/3284/23af7731-1be7-e68d-7ae7-c59ab59cf739.png)
<a href='https://qiita-image-store.s3.amazonaws.com/0/3284/23af7731-1be7-e68d-7ae7-c59ab59cf739.png' target='_blank'>拡大して表示</a>

ちょっと解説
---------------------

1, 2ヶ月前に同僚から Vagrant と Chef を使うと便利なことを教わったのですが、中身についてはよくわかっていませんでした。この1週間、Vagrant と Chef と格闘してみて、理解したことをまとめたのが上図です。

Vagrant は Provisioner と Provider を組み合わせて、Provider 上で動作する環境を簡単に構築することができるツールで、Provisioner には Chef や Puppet、Provider には VirtualBox や Amazon EC2 などを選択することができます。

両者を「コントロールする」のが Vagrant なので、基本的には vagrant コマンドで VM の構築や起動をするのが自然だと思います。VirtualBox の GUI から VM を起動することもできますが、そうすると Chef が実行されないので注意しましょう。

Vagrant は VM の追加等を外から管理できるので、sahara 等のプラグインを使うことで、VM の Snapshot を取って、昔の状態に簡単に戻したりすることができます。

詳しい解説
---------------------------

<a href="http://www.amazon.co.jp/gp/product/B00BSPH158/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00BSPH158&linkCode=as2&tag=f83wffq-22">入門Chef Solo - Infrastructure as Code</a><img src="http://www.assoc-amazon.jp/e/ir?t=f83wffq-22&l=as2&o=9&a=B00BSPH158" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
Rails でオブジェクトの配列を簡単にハッシュ化したい

例えば、User モデルの一覧を取得して、
User の name を key、オブジェクトを value とした hash を作りたいとします。

その場合、例えば以下のように実装しますよね。

```rb:
User.all.inject({}) { |hash, user| hash[user.name] = user; hash }
# => {"美樹さやか"=>#<User id: 1,...>, "佐倉杏子"=> #<User id: 2,...">, "巴マミ"=>#<User id: 3,...>}
```

これをもっとエレガントに書けるんです。 …そう、`Enumerable#index_by` ならね。

```rb:
User.all.index_by { |user| user.name }
# => {"美樹さやか"=>#<User id: 1,...>, "佐倉杏子"=> #<User id: 2,...">, "巴マミ"=>#<User id: 3,...>}

User.all.index_by(&:name)  
# => {"美樹さやか"=>#<User id: 1,...>, "佐倉杏子"=> #<User id: 2,...">, "巴マミ"=>#<User id: 3,...>}
```

ただし、`Enumerable#index_by` は Rails (ActiveSupport) が追加しているメソッドなので、
デフォルトの Ruby では使えません…

(参考) https://api.rubyonrails.org/classes/Enumerable.html#method-i-index_by
Berkshelfを試してみる

社内でBerkshelfがウワサになっていたので試してみた。

# Berkshelfとは？
Berkshelfとは、「Chefのcookbookとその依存関係を管理するツール」らしい。

http://berkshelf.com/

要するに、定義ファイルに使うcookbookを定義しておけば、リポジトリから勝手に依存関係を解消した上で
落としてきてくれるらしい。RubyのBundlerみたいな感じ。
同じようなので、Librarian-Chefというのもあるが、Berkshelfの方が現時点で主流っぽい。

# Berkshelfの使い方
Berkshelfはgemで配布されているので、gem installでインストールできる。

````
$ gem install berkshelf

````

使用したいcookbookを定義するBerksfileを作成する。
Berkshelfの公式サイトにも書いてあるが、opscodeからmysqlとnginxのcookbookを使う場合はこんな感じ。
cookbookのmetadata.rbに定義された依存パッケージもあわせて落としてくれる。

````
$ cat Berksfile
site :opscode

cookbook 'mysql'
cookbook 'nginx', '~> 0.101.5'

````

こんな感じでgithubから持ってくる事も出来る。

````
cookbook "zabbix2.0", git: "https://github.com/uchiunyo/chef-zabbix2.0.git"
````

cookbookはberksコマンドで落としてくる。Berksfileにzabbixのcookbookを定義して実行した。

````
$ berks --path=vendor/cookbooks
Installing zabbix2.0 (0.1.0) from git: 'https://github.com/uchiunyo/chef-zabbix2.0.git' with branch: 'master' at ref: 'c201bba54ef606b040dcdb057397faafca870913'
Using yum (2.2.2)
````

ちゃんと依存パッケージであるyumもopscodeから落としてきてくれていた。

````
$ ls vendor/cookbooks
yum  zabbix2.0
````

後はいつもどおり.jsonにcookbookを定義してchefを実行すればOK！！

# Berkshelf + knife-soloを使ったchef-repoを考えてみる
じゃあBerkshelfを使ってどんな感じにchef-repo構成すればやりやすいかなーと考えてみた。
ちなみにchefの実行はknife-soloを使っているので、その辺りも考慮したい。

とりあえずこんな感じかな？というのをgithubに置いてみた。

https://github.com/uchiunyo/chef-repo

使い方はこんな感じを想定している。

まずは事前準備。構築する環境はvagrantのCentOS6.4(vmcent1)にZabbix2.0 Serverを構築する。
githubからchef-repo持ってきて、bundle installでchef-soloとかknife-solo,Berkshelfを用意する。

````
$ git clone https://github.com/uchiunyo/chef-repo.git
$ cd chef-repo
$ bundle install --path=vendor/bundle
````

そしてberksを実行してgithubよりcookbookと、依存cookbookを落としてくる。

````
$ bundle exec berks --path=vendor/cookbooks
````

ではvmcent1にZabbix2.0 Serverを構築する。
まずはknife-solo prepareでchefをインストールする。

````
$ bundle exec knife solo prepare vmcent1
````

.chefから、構築したい構成の.jsonを選択し、nodesの中にコピーする。
今回はZabbix-ServerのDBにローカルのMySQLを使うので、zabbix_db_local.jsonを使う。

````
$ cp .chef/zabbix_db_local.json nodes/vmcent1.json
````

vmcent1でchefを実行する。

````
$ bundle exec knife solo cook vmcent1
````

Zabbix Serverの出来上がり！！って感じです。
こんな感じで使いたいcookbookはガシガシBerksfileに書いて、.jsonファイルに雛形を用意して使い分ける事によって
うまいこと管理できないかなーと思ってみた。

助言異論反論コメントなどあれば、頂けると嬉しいです。
rails generate を dry run (お試し実行) したい

Rails の `rails generate` (あるいは `rails g`) コマンドって、
自動的に必要なファイルを作ってくれるから便利ですよね。
ただ、このコマンドを実行することでどんなファイルが作成されるのか、
実行前に知りたいときもありますよね。

たまにゴミファイル群を作っちゃって、あたしって、ほんとバカ…

そんなときは `-p` (あるいは `--pretend`) オプションを使うことで、
実際にファイルを生成することなく、実行結果の確認ができます。

```
$ git status # 作業ツリーが空っぽであることを確認
# On branch develop
nothing to commit (working directory clean)

$ bundle exec rails g scaffold Magica -p
      invoke  active_record
      create    db/migrate/20130614153139_create_magicas.rb
      create    app/models/magica.rb
      invoke    rspec
      create      spec/models/magica_spec.rb
      invoke      factory_girl
      create        spec/factories/magicas.rb
      invoke  resource_route
       route    resources :magicas
      invoke  scaffold_controller
      create    app/controllers/magicas_controller.rb
      invoke    haml
      create      app/views/magicas
      create      app/views/magicas/index.html.haml
      create      app/views/magicas/edit.html.haml
      create      app/views/magicas/show.html.haml
      create      app/views/magicas/new.html.haml
      create      app/views/magicas/_form.html.haml
      invoke    rspec
      create      spec/controllers/magicas_controller_spec.rb
      create      spec/views/magicas/edit.html.haml_spec.rb
      create      spec/views/magicas/index.html.haml_spec.rb
      create      spec/views/magicas/new.html.haml_spec.rb
      create      spec/views/magicas/show.html.haml_spec.rb
      create      spec/routing/magicas_routing_spec.rb
      invoke      rspec
      create        spec/requests/magicas_spec.rb
      invoke    helper
      create      app/helpers/magicas_helper.rb
      invoke      rspec
      create        spec/helpers/magicas_helper_spec.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/magicas.js.coffee
      invoke    scss
      create      app/assets/stylesheets/magicas.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss

$ git status # generate 後も作業ツリーは空っぽのままだ
# On branch develop
nothing to commit (working directory clean)
```

自分は最近まで知りませんでした…
やっぱり定期的に使うコマンドは、一度 help に目を通しておかないと行けませんね。
MacにDjangoをインストール

##前提
* homebrewインストール済み
* `/usr/local/bin`にパスが通っている事

##pythonを入れる(homebrewで)
`brew install python`
これで`pip`も入ってくれる
※homebrewで入れたpythonが動くようにパスの設定をしておく事

##Djangoを入れる(pipで)
`sudo pip install django==1.5.1`

django-admin.pyにパスが通ってないので、適当にパスを通す
`sudo ln -s /usr/local/share/python/django-admin.py /usr/local/bin/`

##Djangoを動かす
###プロジェクトを作る
`django-admin.py startproject django_test`
カレントディレクトリに`django_test`ディレクトリが出来る。(名前は何でもいいが、文字と数字とアンダーバーしか使えない)
###動かす！

```
cd django_test
python manage.py runserver
```

表示されたアドレスにブラウザでアクセスして**It workd!**って表示されればOK
Engine Yard Cloudですべてのインスタンスで走ってるプロセスを一括で確認する

## 準備

- ey login
- 該当リポジトリに移動 or -e, --environment=ENVIRONMENTで環境を指定


## 全サーバのプロセスを確認

```
$ ey ssh 'pstree -acp' --all
```

![](http://gyazo.com/e6cf92220838e8b0917ced27d38a6e61.png)

## monitの監視対象の状態を表示

```
$ey ssh 'sudo monit summary' --all
```
![](http://gyazo.com/538018d1b96dadc0612d79f2a4a11457.png)

or 

```
$ey ssh 'sudo monit status' --all 
```
![](http://gyazo.com/7cb62222fe4fa110348e93d4f4eb9920.png)



## 感想

- **$ey ssh 'シェルコマンド'**使って色々できる！ 
- **ey help コマンド** でhelp見ればなにができるのかわかる。
My CodeIgniter Set

CodeIgniterとPHPUnitとBehatをまとめたものを作ってみました。

https://github.com/mistymagich/ci-phpunit-behat

Content
-------

* CodeIgniter 2.1.3 <http://ellislab.com/codeigniter>
* CodeIgniter Sparks <http://getsparks.org>
* CodeIgniter Rest Server <https://github.com/philsturgeon/codeigniter-restserver>
* CodeIgniter SPL Autoloader <https://github.com/bubbafoley/codeigniter-spl-autoloader>
* PHPUnit <http://phpunit.de/manual/current/en/index.html>
* Behat <http://behat.org>
* Phing <http://www.phing.info>

Initial Setting
---------------

    composer/composer.phar self-update
    composer/composer.phar install -d composer

PHPUnit
-------

* Use phing

    ./composer/bin/phing phpunit

* Use phpunit

    cd tests
    ../composer/bin/phpunit
    ../composer/bin/phpunit models/UserTest


Behat
-----

* Use phing

    ./composer/bin/phing behat
    

* Use behat

    ./composer/bin/behat
    ./composer/bin/behat --tags users
    

CodeIgniter Sparks
------------------

### Install Package ###

    ./tools/spark install -v1.0.0 example-spark
JavaScriptでPrototype Pattern

メモ代わり

GoF曰く→既存のオブジェクトのコピーであるテンプレートを元にオブジェクト生成を行うこと

- jsで実装が簡単(もともとprototypeベースだし)
- jsで継承を簡単に実装出来る。
- 継承の実行時には関数のコピーを生成するのではなく、参照が作成される
- わかりやすい(個人的に)

以下が例

```js:prototype.js

var myCar = {
	name: "Ford Escort",
	drive: function(){
		console.log("I'm driving!");
	},
	
	panic: function(){
		console.log("Wait, How do you stop this thing?");
	}

};

// 車のインスタンスを作成するためにObject.createを利用
var yourCar = Object.create(myCar);

console.log(yourCar.name); // Ford Escort

// Object.createは第二引数でオブジェクトのプロパティを初期化出来る

var vehicle = {
	getModel: function(){
		console.log( "The model of this vehicle is…" + this.model );
	}
}

var car = Object.create(vehicle, {
	id: {
		value: MY_GLOBAL.nextId(),
		// default:  writable: false, configurable: false
		enumerable: true
	},
	
	model: {
		value: "Ford",
		enumerable: true
	}

});


// Object.createを使わずに実装する場合
// しかしこのやり方だと読み取り専用プロパティを生成出来ない
// vehiclePrototypeは書き換えられる可能性がある(defineProperties使えばいい？)

var vehiclePrototype = {
	init: function(carModel){
		this.model = carModel;
	},

	getModel: function(){
		console.log("The model of this vehicle is " + this.model);
	}
};

function vehicle(model){
	function F(){};
	F.prototype = vehivlePrototype;

	var f = new F();

	f.init(model);
	return f;
}

var car = vehicle("Ford Escort");
car.getModel();

// こういう感じにも実装できる
var beget = (function(){
	function F(){};

	return function(proto){
		F.prototype = proto;
		return new F();
	}
})();

var car = beget(vehiclePrototype);
car.init("hoge");
car.getModel();  // The model of this vehicle is hoge




```
git 理解度チェックリスト

# 以下は個人的な見解です。

社内でのgit利用者のステップアップのためのいい目安はないかなー　と思って作ってみました。
かなり独断と偏見が入ってますので、間違っている箇所やほかにも入れたほうがよさそうな、ものなんかがあったらぜひ教えて下さい。
2まで理解していれば、後は社内の詳しい人にきけばなんとかなるんじゃないかな～と思ってます。


### 下記のチェックリストについて

+ 基本操作 で全て○がつく
   + 個人でのgit利用の基礎ができている
+ ブランチ、merge、rebase、(cherry-pick)について で8割以上○がつく
    + 小規模なチームでのgit利用の基礎ができている
+ コミットグラフの概念 がわかる
    + 運用ルールに合わせてチームでのgit利用ができる
+ reflogが何かしっている
    + 何かが起きてもなんとかできる！

##　1  基本操作
+ コミットができる
+ コミット間のdiffがみれる
+ リモートのリポジトリにプッシュができる
+ リモートのリポジトリからpullができる
+ リモートのリポジトリのクローンができる
+ git commit --amend ときいて使い方がわかる
+ .gitignore が何のためにあるファイルか知っている
+ [Learn Git Branching](http://k.swd.cc/learnGitBranching-ja/) をクリアできる

## 2 ブランチ、merge、rebase、(cherry-pick)について
+ ブランチの作成ができる
+ ブランチの削除ができる
+ ブランチを利用して開発が行える
+ あるブランチとあるブランチ2の差分がすぐに出せることを知っている
+ あるブランチAとあるブランチBを比較して、Aのみに加えられた差分をすぐに出せることを知っている
+ merge ができる
+ merge に失敗したらmerge前に戻れることを知っている
	+ そのやりかたも知っている
+ rebase ができる
+ rebase に失敗したらmerge前に戻れることを知っている
	+ そのやりかたも知っている
+ (cherry-pick についても上記merge,rebaseと同じ程度理解している)
+ (別の人が入れた修正等の入っている、pull完了している)master ブランチ を作業中のブランチに取り込むことができる
+ merge中のコンフリクトを解消できる
+ rebase中のコンフリクトを解消できる
+ rebase -i で自分のコミットを綺麗にまとめることができる
+ 共有リポジトリにpushしたものは rebaseしてはいけないことをしっている

## 3 コミットグラフの概念
+ 全てのコミットにはハッシュと呼ばれる一意な値が付けられることを知っている
+ あるコミットはひとつ前のコミットを知っているので、どれかひとつのコミットハッシュがわかると最初のコミットまでさかのぼれるのは当然！
+ ブランチやタグはコミットハッシュに対するエイリアスである、といわれてピンとくる
+ ブランチとタグの違いを説明できる
+ reset と checkout の違いを説明できる
+ reset と revert の違いを説明できる

## 4 その他
+ git reflog が何なのか知っている
+ git reset --soft とgit reset --hard の違いが分かる
+ git stash save "<任意の文字列>" と git stash apply が使える
ScalaでAndroidアプリ開発環境を構築するときの注意点

# 概要

ScalaでAndroidアプリを開発する場合、
sbt用プラグイン [android-plugin](https://github.com/jberkel/android-plugin)を使う。

ただ、一度うまくコンパイルできたとしても、
その後に、Android SDK ManagerなどでAndroid SDKのバージョンを
アップデートしたりするとコンパイルが出来なくなることがある。

そんなときの対処方法。

# 力技で対処

実際に遭遇したコンパイルエラーは、aaptやdxという実行ファイルが
見つからないというものだった。

これらのファイルは実は、（android-pluginをインストールしたディレクトリ）以下の

build-tools/17.0.0（←バージョン）/

というディレクトリにある。

![スクリーンショット 0025-06-14 21.44.19.png](https://qiita-image-store.s3.amazonaws.com/0/20722/bce7d030-e70f-986f-61bb-bbd86c1d3e1f.png "スクリーンショット 0025-06-14 21.44.19.png")


これを

（android-pluginをインストールしたディレクトリ）/platform-tools

にコピーしてやると良い。

ただし、ここで注意したいのは、

（android-pluginをインストールしたディレクトリ）/bin

ディレクトリにも同じ名前の実行ファイルがあるが、
こちらを使うとうまくいかないということだ。
くれぐれも、"build-tools/(VERSION)/"にあるものを使うこと。

# さらにlibディレクトリも忘れずにコピー

これだけだと、

```bash
（略）android:dx) Nonzero exit value
```

のようなエラーを喰らう。

これの対処方法が以下。

先ほどの、

build-tools/17.0.0（←バージョン）/

ディレクトリに、libというディレクトリがあるので、
このディレクトリを丸ごと、


（android-pluginをインストールしたディレクトリ）/platform-tools

にコピーしてやる。
これで上記のエラーは消える。
たった200行でProxyが動作するPythonProxyを拡張してアクセス拒否機能を追加しました。

https://code.google.com/p/python-proxy/
に感動したので少しいじってみた。

![blockdeny.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0344619a-e224-54f2-2338-054beaa06137.png)
アクセス拒否設定が出来ます。
アクセス許可一覧も作れます。

![edit.JPG](https://qiita-image-store.s3.amazonaws.com/0/25728/50adf96b-2f34-b3ab-0dc9-51368664ca68.jpeg)
一覧はこちらを編集してください。

![imgblock.png](https://qiita-image-store.s3.amazonaws.com/0/25728/dea7a162-050d-f1c3-7e09-cc1a64b44652.png)
画像もブロックできるはずですが、ところどころ表示されたりします・・・。

## download
[download](https://github.com/tukiyo/PythonProxy)
IntelliJ IDEA で簡単に全ファイルの改行コードを揃える

普段Gitを使っていたりすると、テキストファイルの改行コードがLFで揃っていて欲しいですよね。でもファイルをひとつひとつエディタで開いて変換するのはすごく面倒。というとき、IntelliJ IDEA系のIDEで簡単に改行コードを変換する方法を見つけました。

Project View などファイル一覧が出るビューで変換したいファイルを選択、`Cmd + Shift + A` でアクションリストを開き、そこで `LF` とタイプすると、いつもステータスバーからのポップアップで見ていたあの `LF - Unix and Mac OS (\n)` が出てきます。実行えいやー。ほら簡単。

Project View のフォルダを選択して同じ事をすると、フォルダ内の全ファイルが変換対象になります。

残念ながら今のところ、`To Spaces` と `To Tabs` は Project View からは実行できませんでした。
C++でPythonのforに対するelse節じみたことをする

```cpp

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> my_vec;
    my_vec.resize(10, 0);
    [&]()->void{
        for(const auto a: my_vec){
            if(a != 0){
                cout << "Non-Zero exists" << endl;
                return;// break代わり
            }
        }//else{
            cout << "All is Zero" << endl;
        //}
    }();
    return 0;
}

```

(^^;
無料！クリックだけ！自分専用のJenkinsを立てる

![](http://gyazo.com/ee1e59f4e9f826c2a2ef3ac3bc8e0712.png)

**redhat**が始めた**PaaS『openshift』**にて、無料で３つまでSmallアプリが作れます。そのなかに**Jenkins**が**Instant App**としてあります。

クリックしただけで立ち上がります！urlも発行してくれる！


https://www.openshift.com/
vimでカーソルを使う癖を矯正する！！

echoをマップして、
動かないようにしてしまいます。

```vim:vimrc
nnoremap <Left> :echoe "Use h"<CR>
nnoremap <Right> :echoe "Use l"<CR>
nnoremap <Up> :echoe "Use k"<CR>
nnoremap <Down> :echoe "Use j"<CR>
```
vimのwindow切り替えをしまくる設定

![](http://gyazo.com/a4ad8094844f51735f80ad5798511485.png)

```vim:vimrc
" window manage                                                                                                                                                                        
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-h> <c-w>h
nnoremap <c-l> <c-w>l   
```

これで、**control + hjkl**でウィンドウ左上下右の移動ができる。
Service が Foreground で動いているか確認する


Android で「死ににくいサービス」を作るには [Service.startForegound](http://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.Notification) を呼び出す必要がありますが、動いてるサービスがちゃんと「Foregound になってるか？」は以下のようにして確認できます。(Notification 表示が強制されるから通知バー見ればいいじゃん、と言われればそうなんですけど、ちゃんとしたエビデンスっぽいのが欲しくて)

## 手順

```sh:
adb shell dumpsys activity s <サービス名>
```

<サービス名> はサービスの完全名称を入れます。AndroidManifest.xml の ``<service android:name=`` で定義したやつ。

実行すると以下のように出力されます。

> ACTIVITY MANAGER SERVICES (dumpsys activity services)
>   User 0 active services:
>   * ServiceRecord{41b2dd18 u0 com.amay077.android.gpsfaker/.service.GpsSignalService}
>     intent={cmp=com.amay077.android.gpsfaker/.service.GpsSignalService}
>     packageName=com.amay077.android.gpsfaker
>     processName=com.amay077.android.gpsfaker
>     baseDir=/data/app/com.amay077.android.gpsfaker-1.apk
>     dataDir=/data/data/com.amay077.android.gpsfaker
>     app=ProcessRecord{416e19e8 3209:com.amay077.android.gpsfaker/u0a10072}
>     isForeground=true foregroundId=2130968576 foregroundNoti=Notification(pri=0 contentView=com.amay077.android.
> (以下省略)

``isForegound=true`` と表示されているので、確かに「このサービスはフォアグラウンドだ」と分かります。サービス側で ``startForeground`` を呼び出さなかった場合は、この項目は表れません。

``dumpsys`` 今までコマンドめんどいと思ってあまり使ってませんでしたすいませんでした(汗

## 参考

大変参考になりました。

* [Yukiの枝折: Android:Service.dumpでサービスの状態をダンプする](http://yuki312.blogspot.com/2013/02/androidservicedump.html)
Vimでカーソルが指している単語をコマンドでAckする

![](http://gyazo.com/004094666dd1ef49b0370a6de115e66b.png)

## 1. ack.vimのインストール

https://github.com/mileszs/ack.vim
http://www.glidenote.com/archives/1437

## 2. vimrcに追加

*\<leader>sにアサインする例* 

```vim:vimrc
" ack
cnoremap %%% <C-R>=expand("<cword>")<cr>
map <leader>s :Ack %%%<cr>
```
EngineYard Cloud でNewrelicを使う

## 1. EngineYardCloud DashBoardからNewrelicをAdd on
*対象のEnvironmentsのNew Add-onをクリック*
*Newrelicを選ぶ*
*Activate する*

![drawing](http://gyazo.com/604962bf245b1cd983d561135d9d9537.png)

## 2. Railsにgem追加する (ひとまずFree)

*Gemへの追加内容*

```rb:Gemfile 
gem 'newrelic_rpm'
gem 'ey_config'   
```

```
$ bundle install
```

## 3. newrelic.ymlで設定を追加

*newrelic.ymlをAdd-onページからダウンロード*

```
#  newrelic.ymlを#{Rails.root}/config/以下に配置
$ cp ~/Downloads/newrelic.yml  config/

# commit, push, deploy
$ git add .
$ git commit -m 'add-on newrelic'
$ git push
$ ey deploy
```

## 4. ここまでで、newrelicのDashBoardにアクセスしてみる

- EngineYard CloudのDashboard、NewrelicAdd-onのページにリンクあり
- Applicationの数値は出ているはず（少し時間がかかる。一定時間ごとにserverからnewrelicに送信している？）
- **Serversが出ていないはず**

*Serversの数値が出てない状態*
![](http://gyazo.com/ac69ec6c834af9025c1487baecf1acc1.png)


## 5. サーバリソースの監視を追加する => Applyを押す

*Environmentの横のApplyを押す*
![](http://gyazo.com/8983fbe068dac2eb60f2d56e45c2fc95.png)

## 6. 再度NewrelicのDashboardを確認
![](http://gyazo.com/0b1a69f50fc1f6bd074eab956ec14709.png)

## PS
　
*serversの数値を送ってるプロセスの確認*

```
$ey ssh 　　　　　　　　　　# サーバにログイン 
$ps aux | grep nrsysmond　    # new relicのプロセスがいることを確認
```

*monitによるnrsysmond監視の確認*

```
$ey ssh
$sudo monit summary | grep nrsysmond
```
NERDTreeのツリー部分の横幅を設定

.vimrcに下記を記述。
数字は好きな幅（文字数）を指定。

```vim:
let NERDTreeWinSize=26
```

> [http://stackoverflow.com/questions/8557025/how-to-make-window-size-fixed](http://stackoverflow.com/questions/8557025/how-to-make-window-size-fixed)
tmux上のコピペをうまく設定する方法

`.tmux.conf` に

```.tmux.conf
set-window-option -g mode-mouse on
```

と足すとマウスのスクロールが効くようになります

しかしこの設定をするとマウスで単純にクリップボードにコピペすることができなくなります

それに tmux 上でのコピーをクリップボードにできたらとても便利そうです

ということでこの辺を Mac と Ubuntu でできるだけ共通の設定でできないのか考えてみます

[端末からクリップボードへのコピペする](http://qiita.com/items/0fd67f706366b2355e8f)

この記事の設定が行われていることを前提とします

tmux 上でコピーを行ったものを標準出力へ出力するコマンドは

    tmux save-buffer -

なのでこれを利用します

# Ubuntu の場合

普通に

    tmux save-buffer - | pbcopy

とすればできますが，少し長いので alias を用意します

```.zshrc
alias tmux-copy='tmux save-buffer - | pbcopy'
```

とかしましょう


# Mac の場合

Ubuntu と同じようにすればできそうですが，なぜか pbcopy がうまく動きません

それを回避する方法を紹介します

まず

    brew install reattach-to-user-namespace

とします

それから

    tmux save-buffer - | reattach-to-user-namespace pbcopy

とすればコピーできます

これも長いので alias を用意しましょう

```.zshrc
alias tmux-copy='tmux save-buffer - | reattach-to-user-namespace pbcopy'
```

実際は .zshrc 内で if 文を書くなりして分けるべきです

私は `.zshrc` に

    [ -f $ZDOTDIR/.zshrc.`uname` ] && source $ZDOTDIR/.zshrc.`uname`

と書いてそれぞれ `.zshrc.Linux`, `.zshrc.Darwin` に上記の設定を書いています

便利！！

追記 (2013-07-08)

[ tmux で作業している時だけ zsh の設定を変えたいあなたに](http://qiita.com/catatsuy/items/dcd06d81fef7f7236ff5)

に書いてあるようにすれば共通の設定で

```.zshrc
alias tmux-copy='tmux save-buffer - | pbcopy'
```

```.zshrc.Darwin
if [ -n "$TMUX" ]; then
  alias pbcopy="reattach-to-user-namespace pbcopy"
fi
```

とやった方がいいと思います
端末からクリップボードへのコピペする

Mac の場合はデフォルトで `pbcopy/pbpaste` というコマンドが用意されています

    echo "abcde" | pbcopy

とすれば確認出来ると思います

便利すぎるので Ubuntu からでも使えるようにします

まず

    sudo apt-get install xsel

してから `.zshrc` などに

```.zshrc
alias pbcopy='xsel --clipboard --input'
alias pbpaste='xsel --clipboard --output'
```

と書くと Mac と同じように使えるようになります

便利！！！
update_allはlock_versionもupdated_atも更新しない

ActiveRecord の一括更新メソッドである update_all ですが、これを使うと lock_version や updated_at カラムを更新してくれません。

[ActiveRecord::Relation#update_all does not update updated_at | github](https://github.com/rails/rails/issues/6861)

これはこういう仕様のようです。やるなら自分でやれと。
仕方がないのでこんな風にやりました。

```rb:
Task.where(:id.in => assign_tasks.map(&:id)).update_all(:status => 'entered')
        ↓
Task.where(:id.in => assign_tasks.map(&:id))
.update_all(["status = 'entered', lock_version = lock_version + 1, updated_at = ? ", Time.now.utc])
```

実際に運用していると、こういう日付部分って障害や不具合が起きた時の調査の糸口になるので、できるだけちゃんと記録したくなるんですよね。
ActiveRecordでSQLServerへ接続する

## 前提
SQLServer2008のインストールされたWindowsマシン上での操作を想定しています。

## gem を準備します。

```rb:
source "https://rubygems.org"

gem 'tiny_tds'
gem 'activerecord-sqlserver-adapter'
gem 'arel', '~> 3.0.2'
gem "tap"
gem "ruby-odbc"
gem "dbi"
gem "dbd-odbc"
gem "logger"
```

## bundle installを実行

```shell-session:
bundle install --path .bundle
```

## SQLServerへの接続情報をYAMLに書きます。

```yaml:
development:
  adapter: "sqlserver"
  mode: "odbc"
  host: "localhost"
  username: "mssql_user"
  password: "mssql_password"
  database: "database name"
  dataserver: "Server name"
  dsn: "mssql dsn"  # 「コントロールパネル」 => 「ODBCデータソースアドミニストレータ」 で接続先のDBへのDSNを作成します。
```

## ActiveRecordを使って接続します

```rb:
# coding:utf-8
require "rubygems"
require "activerecord-sqlserver-adapter"
require "odbc"
require "yaml"
require "logger"
 
@setting = YAML::load(File.open("database.yml"))["development"]
ActiveRecord::Base.logger = Logger.new("debug.txt")
 
ActiveRecord::Base.establish_connection(
  adapter: @setting["adapter"],
  mode: @setting["mode"],
  host: @setting["host"],
  username: @setting["username"],
  password: @setting["password"],
  database: @setting["database"],
  dataserver: @setting["dataserver"],
  dsn: @setting["dsn"]
  )
 
class User < ActiveRecord::Base
  self.table_name = "user_table" 　#接続したDBのテーブル名は「user_table」となっており、ActiveRecordの命名規則に反していたためtable_name にて設定
end
```
環境変数PATHをわかりやすく表示する


```sh
$ echo $PATH
```
は1行で表示されるから把握しづらい。
`sed` だと、改行への置換が気持ち悪い…

```sh
$ echo $PATH | sed 's/:/\
/g'
```

こういう時は、`tr` を使うと良いみたい。

```sh
$ echo $PATH | tr ':' '\n'
```

参考: [sedコマンドで改行(LF)に変換したいと思ったら、trコマンド - rksz's lifehack blog](http://rksz.hateblo.jp/entry/2013/03/11/085556 "sedコマンドで改行(LF)に変換したいと思ったら、trコマンド - rksz's lifehack blog")
Apache Sling、JCRとは（CQ5の概要）

CQ5のWEBフレームワークとして使用されているので、まとめ。
*****
CQ5コンテンツを構築したday創立者のコンテンツモデル：[DavidsModel](http://wiki.apache.org/jackrabbit/DavidsModel)

そこでは、

* データが第一。構造に関しては、その後（Maybe って書いてあるけど。。）
* コンテンツ階層は非常に貴重。だからこそ、設計はしてはならない。
* データに意味のある名前をもたせる。
* 参照するために構造化を考慮しなくてはならない場合は、参照が障害となる可能性がある。
（google翻訳つかったので、日本語はおかしいかも）

目から鱗な発想でした。
それを踏まえてのJCR（Java content repository）を利用してファイルシステムのようなデータ管理を実現。

* 全文検索
* インデックスの作成

このあたりの理解のために、以下スライドを参考に。

[Build Your Own CMS with Apache Sling](http://www.slideshare.net/rpaulin1/build-your-own-cms-with-apache-sling)
[JCR and Sling Quick Dive](http://www.slideshare.net/paolomoz/jcr-and-sling-quick-dive)

*****

スライドの中でもありますが、no tableです。キーバリューともなんか違う概念。。
今までDBのテーブル設計に頼ってきた自分の考えを変えなければならない瞬間でした。
全てをコンテンツとしてみなしてます。htmlもJSONもJavascriptも画像も。。
CentOS6でyum updateするとgitでコケる時の対処法

さくらのVPSで使ってるCentOS6.3で`yum update`するとコケるのでその対策

##エラーメッセージ
以下がエラーメッセージの抜粋
```
Error: Package: git-1.7.6.1-1.el5.rf.i386 (rpmforge)
       Requires: libcurl.so.3
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
```

##知っておくこと

git-1.7.6.1-1.el5.rf.i386 の *el5*は
RedHat Enterprise LinuxのEnterprise Linuxの略で、
CentOSのバージョンとRedhat Enterpriseのバージョンは一致する。

## 問題だったこと

・/etc/yum.repos.d/rpmforge.repo がCentOS5用だった。

おそらくさくらのVPSを一度移行させるときにCentOSのバージョンが変わってたのにそれにさえ気づかずそのまま全部移行しちゃってたっぽい。

##解決策

・rpmforgeのrepoをel6に変える。

まず /etc/yum.repos.d/rpmforge.repo の中のel5になってる部分をel6に書き換える。

`yum clean all`してyumのキャッシュを消す。(これがわからなくてかなり時間を費やした…。)

あとは sudo yum update すれば全部綺麗にアップデート出来ました！

##参考サイトとか

http://qa.atmarkit.co.jp/q/2989
で質問しました。

参考にさせてもらったサイト。
https://www.centos.org/modules/newbb/viewtopic.php?viewmode=flat&topic_id=33231&forum=56
AsyncTaskのonPostExecuteまでのUnitTest

AndroidのJUnitTestではAsyncTaskのexecuteメソッドの呼び出し時点で終了してしまうので、ちょっとした技が必要。

手段(1)
・内部ロジックを全てメソッドに書き出し、privateメソッドのテスト方法を用いてテスト
　　→処理の単体テストには有効だが、onPreExecute～onPostExecuteの流れを含めてテストしたい場合にはできない

>単体テストという意味では、(1)でも十分だが、Activityのテストを行っているとonPostExecuteからのキックを確認したい場合などが多くあるので、不十分。

手段(2)
・Taskが終わるのを待たせるようにする

ということで、(2)の実装例。

テストしたいAsyncのクラス

```java:SampleTask.java
public class SampleTask extends AsyncTask<String, Integer, Integer> {
	EventListener listener = null;
	Context context =null;

	public interface EventListener{
		public void onFinish(int result);
	}

	public SampleTask(Context context, EventListener listener) {
		this.listener  =listener;
		this.context = context;
	}

	@Override
	protected Integer doInBackground(String... uID) {

		// なんか処理

		return 0;
	}
	@Override
	protected void onPostExecute(Integer result) {

		if(listener!=null){
			listener.onFinish(result);
		}
	}
}
```

テスト呼び出しコード

```java:TestTask.java
public class TestTask extends ActivityInstrumentationTestCase2<MainActivity>{

	Activity mActivity = null;
	EventListener mListener = null;

	public TestTask(){
		super(MainActivity.class);
	}

	protected void setUp() throws Exception {
		super.setUp();

		// アクティビティを取得
		mActivity = getActivity();
	}

	protected void tearDown() throws Exception {
		super.tearDown();
	}

	/**
	   タスクを起動する
	*/
	private void taskExecute(EventListener l) throws Throwable {
		// create CountDownLatch.
		final CountDownLatch signal = new CountDownLatch(1);

		mListener = l;

		runTestOnUiThread(new Runnable() {
			public void run() {
				try {
					SampleTask task = new SampleTask (mActivity, new EventListener() {

						public void onFinish(int result) {

							if(mListener!=null){
								mListener.onFinish(result);
							}
							signal.countDown(); // release
						}
					});
					task.execute("nickname");
				} catch (Exception e) {
					Log.e(TAG, "ERROR", e);
					fail();
				}
			}
		});

		try {
			signal.await();// wait for callback
		} catch (InterruptedException e1) {
			fail();
			e1.printStackTrace();
		}
	}

	/** テストコード */
	public void test000() throws Throwable{
		// 前提処理かなにか

		// タスク呼び出し
		taskExecute(new EventListener() {
			public void onFinish(int result) {
				// ここに検証コードを書く
				assertTrue(0==result);
			}
		});
	}
}
```

参考：http://stackoverflow.com/questions/9774792/asynctask-onpostexecute-not-called-in-unit-test-case

上記参考頁との違いは、タスク呼び出し部分をメソッド化```TestTask#taskExecute```してあるところだけです。
SampleTask部分をテンプレートクラス化すれば、「AsyncTaskのJUnitTestを行うテストクラスの基本となる抽象クラス」が出来るかな。
気が向いたら追記します(笑)
EngineYard Cloudで カスタマイズしたメンテナンス画面を表示する

![](http://gyazo.com/7130724c39b62e5c1522bcfb274f859e.png)

*503 でカスタムページ表示*

## 1. カスタムメンテナンスのhtmlファイルを作って置く

```:置き場所
{Rails.root}/public/maintenance.html
```

## 2. git commit & deploy

```:コマンド
# git コミット
$git commit -am 'added custom maintenance'
# デプロイ
$ey deploy
```

## 3. メンテナンスに入れてみる

```:コマンド
# メンテナンスに
$ey web disable

# ブラウザでページを開いて確認
$ey launch 

# メンテナンスを開ける
$ey web enable
```

* Nginxのログにはアクセスが来るが、Railsのログにはアクセスはちゃんと来ない

## 複数のメンテナンスページに対応

以下のように表示の優先順位がある。
Defaultのメンテナンスを用意しておいて、緊急メンテンナンスはそれをCopyして作り変えるなど便利。

1. public/maintenance.html.custom
2. public/maintenance.html.tmp
3. public/maintenance.html
4. public/system/maintenance.html.default

# 参考

https://support.cloud.engineyard.com/entries/21016428-Using-Application-Maintenance-Pages
gitのよく使うコマンド集

自分が独断と偏見で選んだ、よく使うgitコマンド集。
gitコマンドよく忘れちゃう人に捧ぐ。

こんなのもよく使うぜ！っての大募集☆

## INDEX

[コミット系](#commit)
[戻す系](#back)
[その他](#other)

---
---

# <a name="commit"></a>コミット系

**コミットの流れ**

```
# ブランチ切り替え(修正用ブランチ)
git checkout yuta
# 修正したファイルを確認
git diff
# 修正したファイルをインデックスに追加
git add .
# インデックスに追加されたファイルを確認
git status
# コミット
git commit -m "write commit message."
# マージ先ブランチに切り替え
git checkout dev
# マージ
git merge yuta
```

-
**一部add**

```
git add -p

```
同じファイルだけど一部の変更だけコミットしたいというときはgit add -pを使います。

-
**ファイルの削除**

```
git rm FILE
git commit -m "delete."
```

-
**コミット漏れが有った時**

```
git add hogehoge
git commit -m "commit hogehoge and uaua."
// uauaのコミット漏れ
git add uaua
git commit --amend
```

-
**gitignoreが効かない時**

一度コミットしてしまったものは追跡対象となってしまう。
ので、きちんとgitから削除する。

```
git rm hogehoge　(<-対応->git commit hogehoge)
git rm --cached hogehoge (<-対応-> git add hogehoge)
```


# <a name="back"></a>戻す系

**直前のコミット削除(修正したソースはそのまま)**

```
git reset --soft HEAD^1
```

-
**2個のコミット削除(ソースも戻す)**

```
git reset --hard HEAD^2
```

-
**戻すコミット、2個じゃなくて一つだけだった！**

```
git reflog 　(resetする前のコミット情報もまとめて確認)
git reset --hard HEAD@{1}　　(以前の状態に戻す)
git reset --hard HEAD^1　　　
```

-
**PUSHしたコミットを取り消す**

```
git push origin +{$commit_id}:{$branch_name}
```

-
**ファイルを特定のバージョンに戻す**

```
# ファイルの中身確認(戻したいファイルを確認)
git show HEAD^:path/to/file
# 戻す
git checkout HEAD^ path/to/file
```



# <a name="other"></a>その他

-
**フォーク最新化**

```
# first method
git pull git@github.com:urataka/ACM.git master
# second method
git remote add jugyo git://github.com/jugyo/termtter.git
git fetch jugyo
git merge jugyo/master

# common
git push origin master
```

-
**gitブランチ作成・切り替え**

```
git branch <branchname> // 作成

git checkout <branch>　// 切り替え
```
-b オプションを付けると、ブランチの作成と作成したブランチへの切り替えを1コマンドで実行できます。

-
**diffでファイル名のみ表示**

```
git diff --name-only
```

-
**コミットログからキーワード検索**

```
git log --grep="hogehoge"
```

-
**patchファイル作成**

```
git diff HEAD^ HEAD > tite.patch
# 特定ファイルのみ出力したい場合
git diff HEAD^ HEAD path/to/file > tite.patch
```
SVG に JavaScript を埋め込む方法

SVG は内部に JavaScript を埋め込むことができる。

### SVG ファイル内への JavaScript の記述例

以下の SVG をブラウザで開くと埋め込んだ JavaScript が実行される(Safari, Chrome で確認)。
表示されている図形をクリックするとランダムに色が変わる。

```xml:with_js.svg
<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" width="400pt" height="400pt">
  <script><![CDATA[
    function fillRandomColor(e) {
        var r = Math.floor(Math.random() * 255.0);
        var g = Math.floor(Math.random() * 255.0);
        var b = Math.floor(Math.random() * 255.0);
        e.setAttribute('fill', 'rgb(' + r + ', ' + g + ', ' + b + ')');
    }
  ]]></script>
  <rect id="r1" x="10" y="10" width="200" height="100" stroke="blue" fill="yellow" onclick="fillRandomColor(this);" />
</svg>
```

HTML における JavaScript とはいくつか違いがある模様。

* SVG の読み込み完了は window.onload の代わりに document.documentElement.onload を使う。
* jQuery は基本的に使えない(HTML DOM を前提としたライブラリは使用不可)。

### HTML で SVG ファイルを参照するとき

HTML 中から SVG ファイルを参照する方法は 2 つある。

* img タグを使う
* object タグを使う

img タグを使って参照した場合は JavaScript が動作しないため、object タグで参照する。

```html:import_svg.html
<!DOCTYPE html>
<html>
  <header>
    <title>SVG Test</title>
  </header>
  <body>
    <img src="with_js.svg">
    <object type="image/svg+xml" data="with_js.svg"></object>
  </body>
</html>
```
日本語環境のMacにEmacsをインストールする方法

日本語環境の Mac に最新の Emacs をインストールする場合は [パッチを当てる必要](http://macemacsjp.sourceforge.jp/index.php?InlinePatchForCarbonEmacs) があります

やり方を軽くまとめておきます

私がやったことのないやり方も含まれます

# 方法1：dmg ファイルから入れる

http://sourceforge.jp/projects/macemacsjp/

ここから inline-patch が当てられている Emacs のバイナリがダウンロードできます

これでいいかもしれません（やったことない）


# 方法2：自力でコンパイル

Homebrew を使いたくない場合はこれがお勧めです

[Emacs 24をOS Xにインストールする | PiyoPiyoDucky](http://piyopiyoducky.net/install-emacs-24-to-os-x/)

これ通りやれば入ります（brew install autoconf automake は必要のはずです）


# 方法3：Homebrew を使う

Homebrew 管理したい場合はこれがおすすめです

さっき紹介したコンパイル方法を Homebrew で適用します

[Homebrewのemacsをeditしてインラインパッチなどを当てる（Emacs-24.3](http://qiita.com/items/0824b0a4fd1eaae67019)

これ通りやれば入ります（`--env=std` はなしでも多分大丈夫です）


# 使い方

`.emacs.d/init.el` とかに最低限以下の設定をします

```cl:cocoa-emacs-ime.el
(setq default-input-method "MacOSX")
```

Google 日本語入力を使っているなら以下の設定もしておくといい感じです

```cl:cocoa-emacs-ime.el
;; Google日本語入力を使う場合はおすすめ
(mac-set-input-method-parameter "com.google.inputmethod.Japanese.base" `title "あ")
```

ちなみに私の設定です

[dot.emacs.d/inits/cocoa-emacs-ime.el](https://github.com/catatsuy/dot.emacs.d/blob/master/inits/cocoa-emacs-ime.el)

細かい設定方法は [init-loader.el と package.el を導入して快適 Emacs ライフ](http://qiita.com/items/5f1cd86e2522fd3384a0) が参考になると思います
bindが使えない端末対策メモ

引数をそのままに、指定した関数のthisを任意のオブジェクトに関連付ける便利メソッド「bind」。
Android2系だとbind未実装だったりするので、その対応策。

 [MDNのFunction.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fbind)ページからコード持ってきてひとまず対応

```js:Function.prototype.bind
if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                                 ? this
                                 : oThis,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}
```
FuelPHPでswfuploadをセッション認証付きで使用する

例えば管理画面など、セッション認証下で使用したい場合、
デフォルトの設定のままだと、Firefoxなどのブラウザによって、
 HTTP302エラーでswfuploadのPOSTリクエストが弾かれます。
（Chromeだとデフォルトでも通ることを確認しています）

swfuploadを使いたい、でもセッション認証をしたい、という場合は、
以下の設定を app/config/session.php で指定します。

```php
return array(
	'match_ua' => false,
	'post_cookie_name'	=> 'cookie_nameとして指定している値', // 例えば fuelfid
);
```

app/config/session.php が無い場合は、作成してください。自動で読まれます。
間違っても、core/config/session.phpへ記述を行わないようにして下さい。
OpenCL(GPU)で波の表現

1000×1000(100万)のセル計算ををGPUにやらせて、60fpsをキープすることにチャレンジします。

ブログの方に書きました。
http://wowdev.jp/?p=469

動画です
http://vimeo.com/68020043

ソースコードはこちら
https://github.com/wowdevjp/GPUWave

環境は
mac os x mountain lion
xcode 4.6.2
で、
cinder
opencl
等を使っています。
Rで日本語ファイルを読み込む時

csvファイルなどでencodingがShift_JISなどはRで読み込むとき化けます。
`f<-read.csv(file('/path/to/file.csv',encoding='Shift_JIS'))`
とエンコードのオプションを設定して読み込ませるとうまくいく。
adb 経由の screenshot の取り方

# はじめに
Android でスクリーンショットが欲しいので取り方調べたよ。

# スクリーンショット取り方
元ネタは http://blog.shvetsov.com/2013/02/grab-android-screenshot-to-computer-via.html 
トップに表示されている画面をキャプチャしてくれるよ。

    adb shell screencap -p /sdcard/screen.png
    adb pull /sdcard/screen.png
    adb shell rm /sdcard/screen.png

# おわりに
adb って色々出来るね。
Eclipse が Android SDK Content Loader 0% で止まった際の対策


http://xmodulo.com/2013/04/how-to-fix-android-sdk-content-loader-stuck-at-0-in-eclipse.html

何度起動しても0%で止まったままだったので、まともな対策を探していたら、上記リンク先のSolution2で解決。

が、**注意点**。

workspace/.metadata/.plugins/org.eclipse.core.resources/.projects
以下のファイルを全て削除すると、
**workspace以外に存在するプロジェクトへの参照が消し飛びます**。

workspace内のプロジェクトは勝手に走査して復旧してくれますが、
workspace以外からもプロジェクトの参照引っ張ってる方は注意してください。

私は.projects以下をバックアップを取っておいて、一度Eclipseの起動を確認してから
後でバックアップをリプレイスすることで、事無きを得ました。
node.jsでシンプルなwebサーバー

カレントディレクトリ以下にあるファイルにアクセスできるだけのシンプルなwebサーバー
(子ディレクト下のファイルも可)
pythonの「SimpleHTTPServer」的なもの

```js:server.js
var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    port = process.argv[2] || 8888;
 
     
http.createServer(function(request, response) {

	var Response = {
		"200":function(file, filename){
			var extname = path.extname(filename);
			var header = {
				"Access-Control-Allow-Origin":"*",
				"Pragma": "no-cache",
				"Cache-Control" : "no-cache"	   
			}

			response.writeHead(200, header);
			response.write(file, "binary");
			response.end();
		},
		"404":function(){
			response.writeHead(404, {"Content-Type": "text/plain"});
			response.write("404 Not Found\n");
			response.end();
		
		},
		"500":function(err){
			response.writeHead(500, {"Content-Type": "text/plain"});
			response.write(err + "\n");
			response.end();
		
		}
	}

  
	var uri = url.parse(request.url).pathname
	, filename = path.join(process.cwd(), uri);

	fs.exists(filename, function(exists){
		console.log(filename+" "+exists);
		if (!exists) { Response["404"](); return ; }
		if (fs.statSync(filename).isDirectory()) { filename += '/index.html'; }

		fs.readFile(filename, "binary", function(err, file){
		if (err) { Response["500"](err); return ; }
			Response["200"](file, filename);   
		}); 

	});
 
   
}).listen(parseInt(port, 10));
  
console.log("Server running at http://localhost:" + port );
```

使い方

```bash:
$ node server.js 
```