OmniAICreator/Qiita-1.07M huggingface dataset:
[cocos2d-x][Xcode] cocos2d-xによるビルド時の警告を消す

# 問題
cocos2d-xをXcodeでビルドすると警告が出る

![スクリーンショット_2013-10-22_23.00.50.png](https://qiita-image-store.s3.amazonaws.com/0/31118/42dbc5c0-1f0a-9197-5e9c-6f713ddec83a.png)


# 対処
Xcodeのコンパイルにて、cocos2d-xに対する警告を無効にする。
（警告の内容自体は、アプリを作る上では無視して問題ない）

具体的な操作は以下：
* 操作1
![rpg108.xcodeproj_—_cocos2dx.xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/31118/0417d140-0025-46b1-25f0-01c5cf5d90f5.png)

* 操作2
![rpg108.xcodeproj_—_cocos2dx.xcodeproj2.png](https://qiita-image-store.s3.amazonaws.com/0/31118/3699a2d0-9d93-3089-5007-d10ea414b6e6.png)
tmuxのsessionについて

セッション名を指定していくスタイルで

セッション作成

```
tmux new -s [session-name]
```
アタッチ

```
tmux a -t [session-name]
```
デタッチ

```
C-b d
```
リネーム

```
tmux rename -t [before-session-name] [after-session-name]
```
状態確認

```
tmux list-session
```
削除

```
tmux kill-session -t [session-name]
```
フラットな感じのボタンを作ってみた


Foursquare の Android 版をマネて、XML だけで作ってみた。
仕組みをすぐ忘れるので、ここにメモしておく。

```xml:flat_panel.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/padding">
        <shape>
            <solid android:color="#00FFFFFF" />
            <padding android:bottom="8dp" android:left="8dp"
                android:right="8dp" android:top="8dp" />
        </shape>
    </item>
    <item android:id="@+id/shadow">
        <shape>
            <solid android:color="#D3CEC7" />
            <padding android:bottom="2px" />
        </shape>
    </item>
    <item android:id="@+id/face">
        <shape>
            <stroke android:width="1px" android:color="#AEA8A3" />
            <solid android:color="#FFFFFF" />
        </shape>
    </item>
    <item android:id="@+id/state">
        <selector>
            <item android:state_pressed="true">
                <shape android:shape="rectangle">
                    <solid android:color="#FF82DEFF" />
                </shape>
            </item>
            <item android:state_focused="true">
                <shape android:shape="rectangle" >
                    <solid android:color="#4082DEFF" />
                </shape>
            </item>
          </selector>
    </item>
    <item android:id="@+id/child">
        <shape>
            <solid android:color="#00FFFFFF" />
            <padding android:bottom="8dp" android:left="8dp"
                android:right="8dp" android:top="8dp" />
        </shape>
    </item>
</layer-list>
```

## 使い方

上のファイル ``flat_panel.xml`` を、``res/drawable`` ディレクトリに入れて、適用したい Button などに↓のように設定。

```xml:part_of_activity_main.xml
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/flat_panel"
        android:text="フラットなボタン" />
```

Theme とかにまとめたいけど、今日は割愛。

## ボタンに適用した結果

### 通常

![img1](http://blog.amay077.net/assets/images/posts/android_flat_button_sample_01.png)

### 押した時

![img1](http://blog.amay077.net/assets/images/posts/android_flat_button_sample_02.png)

## 仕組み

``<layer-list>`` タグの中の要素は、上から順に描画される。また、下位(手前)の要素は、上位(奥)の要素の入れ子になるみたい。

![img1](http://blog.amay077.net/assets/images/posts/android_flat_button_sample_03.png)

（図の id は flat_panel.xml と対応してます。）

1. padding - ボタンの周りに少し余白を付ける役割（要らないなら消してもOK）
2. shadow - ボタンの下部にちょっとだけ見えてる影の部分。大部分が face によって隠れてるけど、実際はほとんど同じ領域を持つ。ここで padding bottom を 2px としているので、face の高さが 2px 縮んで、影っぽく見える仕組み。つまり影の強さはここで調整。
3. face - ボタンの「面」に該当。stroke でフチを、solid で面を塗りつぶしている。
4. state - ボタンの状態によって色などを変える役割。ここでは state_pressed=true（押された状態）と、state_focused=true（フォーカスを持ってる状態）だけ対応してる。face を描画した「後」で評価されるので、face の色を置き換えるものではない事に注意（透過時）。あと、状態は上から評価される。
5. child - LinearLayout など Group な View にこのスタイルを適用した時、子View への余白となる。

みんなの大好きな方眼紙EXCEL とオートシェイプで再現してみた → [DL](http://blog.amay077.net/assets/images/posts/flat_panel.xlsx)

Activity の背景が白だと、あんまり映えない。。。

色の定義を、別の xml に分けて、アプリ毎に変えれば、それっぽくなるのかなーと。
Herokuのサーバーにインストールされているパッケージを調べる

herokuでimagemagickを使えるらしいのですが、どのバージョンのimagemagickかわからなかったので調べてみました。

以下の環境で実行しました。
`heroku-toolbelt/3.0.1 (universal-darwin11.0) ruby/1.8.7`

1. OS名とバージョンの確認

```shell-session
heroku run 'ls /etc/ | egrep "(version|release)$"'
heroku run "cat /etc/lsb-release"
```
Ubuntu 10.04 LTSなのがわかります。
2. インストール済みのパッケージを確認

```shell-session
heroku run "dpkg -l"
```
インストール済みのパッケージ一覧が表示されます。
パッケージ名がわかっている場合は、`apt-cache`でバージョンなどを確認します。

```shell-session
heroku run "apt-cache show imagemagick"
```

よって、`7:6.5.7.8-1ubuntu1`のimagemagickがインストールされていることがわかります。
SpriteKit入門 -6-


前回までで真っ黒い画面に遷移しましたが、
今回は、spaceshipスプライトを追加します。

```objectivec:SpaceshipScene.m
- (void)createSceneContents
{
    self.backgroundColor = [SKColor blackColor];
    self.scaleMode = SKSceneScaleModeAspectFit;
    SKSpriteNode *spaceship = [self newSpaceship];
    spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)-150);
    [self addChild:spaceship];
}
```

newSpaceshipメソッドを実装します。
アニメーションする灰色の四角を作成しています。

```objectivec:SpaceshipScene.m
- (SKSpriteNode *)newSpaceship
{
    SKSpriteNode *hull = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(64,32)];
    SKAction *hover = [SKAction sequence:@[
                                           [SKAction waitForDuration:1.0],
                                           [SKAction moveByX:100 y:50.0 duration:1.0],
                                           [SKAction waitForDuration:1.0],
                                           [SKAction moveByX:-100.0 y:-50 duration:1.0]]];
    [hull runAction:[SKAction repeatActionForever:hover]];
    return hull;
}
```

実行すると、このように灰色の四角が移動します。

![実行結果](https://lh5.googleusercontent.com/-4SJaaEFZ5fw/UmZ0e3WlwMI/AAAAAAAAAdQ/iva8p_0Uwf8/w498-h648-no/spritekit_014.jpg "実行結果")

newSpaceshipメソッドに下記コードを追加します。
ライトを2つくっつけます。

```objectivec:SpaceshipScene.m
    SKSpriteNode *light1 = [self newLight];
    light1.position = CGPointMake(-28.0, 6.0);
    [hull addChild:light1];
    SKSpriteNode *light2 = [self newLight];
    light2.position = CGPointMake(28.0, 6.0);
    [hull addChild:light2];
```

newLightメソッドを実装します。
ライトは黄色く点滅する四角で表現しています。

```objectivec:SpaceshipScene.m
- (SKSpriteNode *)newLight
{
    SKSpriteNode *light = [[SKSpriteNode alloc] initWithColor:[SKColor yellowColor] size:CGSizeMake(8,8)];
    SKAction *blink = [SKAction sequence:@[
                                           [SKAction fadeOutWithDuration:0.25],
                                           [SKAction fadeInWithDuration:0.25]]];
    SKAction *blinkForever = [SKAction repeatActionForever:blink];
    [light runAction:blinkForever];
    return light;
}
```

実行すると、灰色の四角に点滅する黄色い四角がくっついています。
黄色い四角は灰色の四角の子要素として追加しているので、
黄色の四角の座標は、灰色の四角からの相対座標になっています。

![実行結果](https://lh4.googleusercontent.com/-Ti9ocKBpjV8/UmZ33YWMx_I/AAAAAAAAAdg/pyGCPwsJhQE/w498-h648-no/spritekit_015.jpg "実行結果")

今回はここまで。
URLのパスから拡張子を取得する

知らなかったのでメモ．System.IO.Pathクラスは，ファイルパスだけでなくURLも扱えるので，URLからファイル名や拡張子を取得したすることができる．例えば，拡張子とファイル名を取得するには，

string url = "http://foobar.co.jp/xxxx.jpg"

string ext     = System.IO.Path.GetExtension(url);
string name = System.IO.Path.GetFileName(url);

とすれば良い．
プロキシ認証が必要な環境でのmaven設定について

$MAVEN_HOMEcon/setting.xmlに設定を行う

 <proxies>内に記述する

-<id>:optionalのままでOK
-<active>:trueのままでOK
-<protcol>:対象のプロトコル（※httpの場合はhttp）
-<username>:ユーザ名
-<password>:パスワード
-<host>:proxyのhost名
-<port>:proxyのポート番号
-<nonProxyHosts>:プロキシ対象外のhost（※必要ない場合は削除）
Objective-Cの基本


##用語整理

- ビルド
コンパイルとリンクを経て実行可能ファイルを生成。

- コンパイル
ソースコードを中間オブジェクトに変換。

- リンク
 諸々のライブラリやファイルを結合させて一つにまとめる。

- コンパイラディレクティブ
Objective-Cにおいて、@で始まるものはプログラムでは無くコンパイラへの指示。
これをコンパイラディレクティブと言う。


##変数の利用

- 変数を利用するには
最初に宣言文を記述しておく必要がある。

 ```objective-c
int a;
```
- 型における演算子の注意点

 ```objective-c
int a = 3;
int b = 2;
float c = a / b;
```

 この際、float c は1.5でなく1となる（int同士のa/bが先に計算されるため）。

 ```objective-c
int a = 3;
int b = 2;
float c = a / (float)b;
```
このように、aもしくはbもしくはab双方をfloat型にキャストしておけば、
intよりもfloatが優先され、計算結果もfloatとなり、cに正しい値が入る。


##構造体

複数のメンバを持つデータ

```objective-c
typedef struct Person {
	float height;
	float weight;
	int birthYear;
} Person //struct PersionにPersionというaliasを切る。

Persion a; //変数宣言
a.height = 170.5;

```
##クラス

クラスの定義sample

ヘッダファイル（Sample.h）

```obj-c
@interface Persion : Mammal

@protected
	//メンバ定義
	int life;
	float height;
	float weight;
}
//アクセサ
@property int life;
@property float height, weight;

@end

```

実装ファイル（Sample.m）

```obj-c

#import "Sample.h"
@implementation Person

//インスタンスメソッド定義
- (int) getLife
{
	hoge;
	return;
}
-(void) healLife : (int) volume
{
	life += volume
	return;
}

//クラスメソッド定義
+ (int) exterminate
{
	//gameover
	return;
}

@synthesize life, height, weight;

@end

```

####インスタンスの生成方法

```objective-c
Person *tarou = [[ Persion alloc ] init];
//メンバセット
tarou->life = 10;
//メソッド呼び出し
[tarou getLife]
[tarou healLife :5]
//クラスメソッド呼び出し
[Person exterminate]

```

##ヘッダファイルと実装ファイル

プログラムを分割して記述するための仕組み

- ヘッダファイル（.h）はクラスの「目次」
→このファイルのみでクラスの全体を俯瞰できる。
→@interface〜@end
　→クラスの目次（宣言）（〜終わり）

- 実装ファイル（.m）はクラスの「本体」
→@implementation〜@end
→クラス実装（〜終わり）

 ※分割のメリット・・クラスを外部に公開する際、ヘッダファイルだけでもユーザはそのクラスを利用できる。
一方実装の内部は隠蔽することができる。


## import文
別ファイルのプログラム、ライブラリを読み込む。
文末にセミコロンが不要。

- ヘッダファイル（.h）に書く場合

 importに続くクラス宣言（@interface）で指定されている親クラスがある場所を示す。

 ```obj-c
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
```

 →Apple提供のUIKitフレームワーク内のUIKit.hを読み込む。
　ViewControllerの親クラスであるUIViewControllerはその中に存在する。


- 実装ファイル（.m）に書く場合

 ヘッダファイルの場所を示す




##allocとinitとnew

```objective-c
Person *tarou = [[Persion alloc] init];
```

- alloc
インスタンスの生成に必要なメモリ容量を確保する。

- init
メモリ上にロードされたインスタンスに対して実行する。
→インスタンスがデータを保存出来る状態にする。コンストラクタを呼ぶ。

- new
alloc + init

```objective-c
Person *tarou = [Persion new];
```

##id型
汎用オブジェクト型。
どのような参照型にも変化することが出来る。
最初に型を決めずに変数を用意し、実際に使うタイミングで型を決定する。
→動的な型付け

```objective-c
id オブジェクト型
```

```objective-c
id obj; //具体的な型は決まっていない。
obj = [[Person alloc] init]; //この時点でPersonクラスになる。
```

##@propertyと@synthesize
- @property
プロパティを宣言すると、同名のインスタンス変数に対するアクセサ（setter/getter）が自動生成される。

- @synthesize
@propertyで指定した属性に対してアクセサメソッドを定義する。

##コンストラクタ
init（NSObject）を上書きする。

```objective-c
@implementation Person
-(id) init
{
	if(self = [super init]){
		life = 1;
		height = 1;
		weight = 1;
	}
	return self;
}

```


##メモリ

使わなくなったインスタンスを解放する。

- 保持カウンタ
インスタンス生成時に値1で初期化される。
NSObjectクラスのretainCountというプロパティが保持している。
保持カウンタの値が0になった時点で、メモリ上から解放される。

 - retain：保持カウンタの値を1増やす
 - release：保持カウンタの値を1減らす


10/17
とりあえずここまで
ゲストOS(CentOS)に keychain 導入したら 同期フォルダのNFSマウントに失敗した


どうやら `vagrant up` したとき vagrant が内部でゲストOSに ssh 接続しているようだが、`.bash_profile` に `keychain` コマンドを記述しているため、パスフレーズの入力待ちになってしまうのが原因っぽい。

以下のように、`.bash_profile`がターミナルで実行されている場合のみ`keychain`を実行するようにしたら解決した。

```bash:.bash_profile
# start keychain
if [ -t 1 ]; then
  /usr/bin/keychain ~/.ssh/id_rsa
  source ~/.keychain/$HOSTNAME-sh
fi
```

# 参考

*  [bash - How to detect if my shell script is running through a pipe? - Stack Overflow](http://stackoverflow.com/questions/911168/how-to-detect-if-my-shell-script-is-running-through-a-pipe/911224#911224)

* [Gentoo Linux ドキュメント -- Gentoo Linux keychainガイド](http://www.gentoo.org/doc/ja/keychain-guide.xml)
jQuery等CDNのダウンに備えたリスクヘッジ

##概要

読み込みが極端に遅い。
でもwebサーバやdbのloadなどチェックしても怪しいところがない。
なんだろうと思っていたらGoogleCDN設置のjQueryにアクセスできなくなっていた。

CDNもあくまで外部管理なので、リスクヘッジはしておくべき、と。

という訳でその方法が以下。

```html
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.10.2.min.js"><\/script>')</script>
```
もしCDNにアクセスできなければ、ローカルのリソースを読む。

※ window.jQueryは、
・jQueryがロードされていれば「function()」を返す
・ロードされていなかったら「undefined」を返す


##参考1
jQueryをロードする際のナイス！と思った書き方 
http://dtp.jdash.info/archives/51941752.html

##参考2
他にrequire.jsを使う方法などもありそうだが、今回の目的に対しては導入コストが高そうだったので見送り。

JavaScriptをモジュール分割して開発できるRequireJSに入門
http://www.yoheim.net/blog.php?q=20130103
require.jsの使い方のメモ
http://ezerezetik.com/blog/posts/use-of-requirejs.html
Bitbucketに`git push` した時に自動的にVPSで｀git pull` する方法

非公開のリポジトリが持てるBitbucketに非公開のプロジェクトを公開しておいて、｀git push` したら自動的にサービスを動かしてるVPS上で`git pull` を動かす方法

## コツ

*外部からアクセスできる`git pull`を行うスクリプトを作成して、BitbucketからのIPで制限をかける。

## やり方

Bitbucketでプロジェクトを選んで右上辺りの歯車アイコンを選択して管理画面に入って、
`Hooks` -> `Post` を選択して必要なスクリプトをURLで指定する。

スクリプトはこんなの。

```
<?php
    $output = shell_exec('git pull');
    echo "<pre>$output</pre>";
?>
```

## 参考

git pull - Git pulling depends on the current dir - Stack Overflow
http://stackoverflow.com/questions/9851644/git-pulling-depends-on-the-current-dir

## でも結局やってません

`git pull`をゲスト権限で実行させるか、スクリプト内で`sudo`してユーザーを変更する必要があったので普通にGitのDeamon入れたほうが楽そうなので

ローカル -> Bitbucket -> VPS

の流れじゃなくて

ローカル -> VPS -> Bitbucket

でVPS側に push した時の post hook で Bitbucketに VPSから push することにしました。

詳しいやり方はまた別の投稿で。

## 別の方法

`git push`した時に2箇所同時に上げればいいということに気づいたので


```:.git/config
[remote "all"]
    url=ssh://user@server/repos/g0.git
    url=ssh://user@server/repos/g1.git
```

と書くのが一番でした。秘密鍵をサーバーに置かなくても良いので更にGood!
## 参考
http://stackoverflow.com/questions/4255865/git-push-to-multiple-repositories-simultaneously
Mavenのexcludesの設定で正規表現を使う方法

## はじめに

[maven-pmd-plugin](http://maven.apache.org/plugins/maven-pmd-plugin/)で`excludes`の設定をしていたら、

> .*Dao.java : 含めたくない
> .*APIDao.java : 含めたい

みたいな状況になって、[FileSet](http://ant.apache.org/manual/Types/fileset.html)でしか指定できないかと思ったら、正規表現でも設定できたって話。

## こうやる

```xml

...
<excludes>
    <!-- %regex[PATTERN]で指定してあげる -->
    <exclude>%regex[^(?!.*API).*Dao\.java$]</exclude>
    <!-- もちろん、FileSetでも指定可能 -->
    <exclude>**/*Test.java</exclude>
 </excludes>
...

```

## 注意

公式的には、

> Can contain Ant-style wildcards and double wildcards.

と記載されているので、自己責任で。
ローカル環境用に本番dbのスキーマとデータをdumpする。


##概要
ローカルには本番のデータ全てが必要な訳ではないため、
・全テーブルのschema
・一部テーブルのデータ
が必要になる。

##全テーブルのschemaをdump

-dでschemaをdumpできる。

```sh
mysqldump -u user_name -pxxxx -h host_num -d db_name > schema_dump.sql
```

##一部テーブルのデータをdump

db_nameのあとにtable_nameを続けるだけ。

```sh
mysqldump -u user_name -pxxxx -h host_num db_name \
tableA  \
tableB  \
tableC  \
> data_dump.sql

```

あとはローカルdbにschema.dumpとdata.dumpを流せばok。
Symfonyでログインフォームへ入力させずにユーザをログインさせる

ワンタイムトークンを踏んで自動的にログイン、サインアップ直後に自動ログインしてプロフィール編集まで行かせたい、など、ログインフォームへ入力させずに、特別にユーザ にログインセッションを与えたい。

security.yml がこんな感じで、エンティティのプロバイダを使った(`Symfony\Component\Security\Core\User\UserInterface` を実装したUserクラスを使う) フォームログインだったとしたら...

```yaml
security:
    providers:
        users:
            entity:
                class: HogeFugaBundle:User
                property: name
    firewalls:
        secured_area:  # ここの名前あとで使う
            pattern: ^/...
            form_login: ~
            logout: ~
```

こんなふうにするとオッケー。

```php
use Hoge\Bundle\FugaBundle\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\SecurityContext;

        /** @var $user User */
        $user = $this->get('doctrine')->getRepository(
            'HogeFugaBundle:User'
        )->findOneBy(array(
            'name' => 'tanakahisateru',  // ユーザ名
        ));

        $providerKey = 'secured_area';  // 上の security.firewall のやつ

        // エンティティとキーから認証トークンを作る
        $token = new UsernamePasswordToken(
            $user, null, $providerKey, $user->getRoles()
        );

        /** @var $securityContext SecurityContext */
        $securityContext = $this->get('security.context');
        // 認証トークンをセット。あとはHTTPレスポンスを返せればOK。
        $securityContext->setToken($token);
```

これでできたログインセッションの強制ログアウトはこれでいけました。

```php
        /** @var $securityContext SecurityContext */
        $securityContext = $this->get('security.context');
        $securityContext->setToken(null);
```
MacでZooKeeperを試す


# インストール
```
brew install zookeeper
```

# zoo.cfgを作ってroot権限で起動

```
cd /usr/local/etc/zookeeper/
cp zoo_sample.cfg zoo.cfg

sudo /usr/local/bin/zkServer start
```

ログにエラーが出てるが原因はわからない。

```
$ cat /usr/local/var/log/zookeeper/zookeeper.log
2013-10-22 01:54:31 QuorumPeerMain [ERROR] Invalid config, exiting abnormally
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing /usr/local/etc/zookeeper/zoo.cfg
	at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:121)
	at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:101)
	at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)
Caused by: java.lang.IllegalArgumentException: /usr/local/etc/zookeeper/zoo.cfg file is missing
	at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:105)
```

# とりあえずクライアントで接続してみる

```
$ /usr/local/bin/zkCli -server 127.0.0.1:2181
Connecting to 127.0.0.1:2181
Welcome to ZooKeeper!
JLine support is enabled

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2181(CONNECTED) 0] 
```

ひととおりチュートリアル通りに操作する
[ZooKeeper スタートガイド](http://oss.infoscience.co.jp/hadoop/zookeeper/docs/r3.3.1/zookeeperStarted.html)

# 蛇足

lsで取れるznodeは直下までのようす。

```
[zk: 127.0.0.1:2181(CONNECTED) 4] create /zk_test mydata
Created /zk_test
[zk: 127.0.0.1:2181(CONNECTED) 15] create /zk_test/znode1 1
Created /zk_test/znode1
[zk: 127.0.0.1:2181(CONNECTED) 16] create /zk_test/znode2 2
Created /zk_test/znode2
[zk: 127.0.0.1:2181(CONNECTED) 17] ls /zk_test             
[znode2, znode1]
[zk: 127.0.0.1:2181(CONNECTED) 18] ls /       
[zookeeper, zk_test]
```

## /zk_test/z の変更をウォッチ
```
[zk: 127.0.0.1:2181(CONNECTED) 4] ls /zk_test/z true
```

## /zk_test/z の子供の変更をwatch
```
[zk: 127.0.0.1:2181(CONNECTED) 4] ls /zk_test/z true
```
孫以降の変更はウォッチできない。

# 蛇足2

なぜかtmux上だとZookeeperが起動しなくなり

[osx - Zookeeper server starts, but does not stay started - Stack Overflow](http://stackoverflow.com/questions/12504271/zookeeper-server-starts-but-does-not-stay-started)

と同様の状態になる。なぜかはわからない。
ファイルの削除にrmコマンドは使わないようにした

# rm -rf *

というのやっちゃった後に失敗してたら胃が痛くなる...ということで、
[trash-cli](https://github.com/andreafrancia/trash-cli)を使うことにした。

# インストール

easy_installを利用...しようと思ったけどPyPIに上がってるのは
だいぶ古い。masterのものを利用するようにする。

```
> git clone https://github.com/andreafrancia/trash-cli.git
> sudo python setup.py install
```

# 動作チェック

動作確認をしてみる。削除のためにテストファイルを作成する。

```
> mkdir -p ~/Hoge
> touch ~/Hoge/uge
> ls ~/Hoge
uge
```

ugeファイルを削除する。
ここで、trash-put コマンドを実行する。

```
> trash-put ~/Hoge/uge
```

ugeが消えたことを確認する

```
> ls ~/Hoge
```

trash-list コマンドで、削除ファイルリストに出てくるか確認。

```
> trash-list
2013-10-22 18:09:11 /Users/futoase/Hoge/uge
```

出てきた。リストアしてみる。

```
> trash-restore                                                 
   0 2013-10-22 18:09:11 /Users/futoase/Hoge/uge
What file to restore [0..0]: 0
> ls ~/Hoge
uge
```

# ファイルを完全削除する

```trash-empty``` コマンドで```trash-pop``` したファイルを完全削除する。

# 他

rmは使えないようにするためtrash-cliにある[README.mdの通りに潰す](https://github.com/andreafrancia/trash-cli#but-sometimes-i-forgot-to-use-trash-put-really-cant-i)。

平和に生きていきたい...
CummeRbundで遺伝子発現のプロットを遺伝子ごとに並べる

## はじめに
CummeRbundは，Cufflinksによって発現量を推定した結果を可視化するためのRパッケージです．
詳しくは[マニュアル](http://compbio.mit.edu/cummeRbund/manual_2_0.html)をご覧ください．図が多いので分かりやすいと思います．

CummeRbundには，複数条件下での遺伝子発現の結果を綺麗に可視化する関数が予め用意されています（`expressionPlot`や`expressionBarplot`）．

複数の遺伝子に対してこれらの関数を単純に適用させると，一つの図に複数の遺伝子発現のプロットが描画されます．
同時に見たい遺伝子が少数で，かつ，発現量（FPKM）のスケールが同じくらいであればこれでよいのですが，通常は比較したい遺伝子（機能グループ，パラログなど）の発現量のスケールは様々である場合が多いため，不便です．

そこで，CummeRbundで遺伝子発現のプロットを遺伝子ごとに並べる方法を考えました．
ここでは，CummeRbundがggplot2を内部で使用していることを利用しています．

## やってみた
### 準備

```r
# インストール
source("http://bioconductor.org/biocLite.R")
biocLite("cummeRbund")
# パッケージのロード
library("cummeRbund")
# （hoge にCufflinks/Cuffdiffの結果の入ったディレクトリ名を指定）
cuff<-readCufflinks("hoge")
# geneids にベクトルとして格納されている遺伝子IDと一致する結果を取り出す
myGenes <- getGenes(cuff, geneids)
```

### expressionPlot
折れ線グラフです．

```r:通常のexpressionPlot
p <- expressionPlot(myGenes)
print(p)
```

```r:遺伝子ごとにexpressionPlotを並べる
p <- expressionPlot(myGenes) + facet_wrap(~tracking_id, scales = "free_y") + 
theme(legend.position="none", axis.text.x  = element_text(size=6, angle=90), strip.text = element_text(size=4))
print(p)
```

### expressionBarplot
棒グラフです．

```r:通常のexpressionBarplot
p <- expressionBarplot(myGenes)
print(p)
```

```r:遺伝子ごとにexpressionBarplotを並べる
p <- expressionBarplot(myGenes, logMode=F) + facet_wrap(~tracking_id, scales = "free")  + theme(axis.text.x = element_text(angle = 0, hjust = 1))
print(p)
```


## 参考
#### [Bioconductor Code Search](http://search.bioconductor.jp/codes/3248)
 `expressionPlot`がどのように`ggplot2`を使っているかがわかります．
#### [Summer 2010 — R: ggplot2 Intro](http://www.ling.upenn.edu/~joseff/rstudy/summer2010_ggplot2_intro.html)
Treasure Dataでの大容量データベンチマーク

## あふれるデータ

会社で、[Treasure Data](http://www.treasure-data.com/)を使った分析システムを作っている。ゲーム情報を収集して、ユーザーの体験向上に役立てるためだ。そのため、ユーザーの行動を細かく把握する必要がある。勢いデータ容量は増えてしまう。加えて、オンラインのゲームは、パッケージゲームと違い売って終わりではなく、その後何年にも渡って、サービスを提供する。そのため、ユーザーの行動ログは数億件に達することも珍しくない。

## Treasure Dataでのログ分析

先に書いたが、大量のログに対応するため、hadoopを利用した問題解決が様々な企業から提供され始めている。タイトルに有る[Treasure Data](http://www.treasure-data.com/)もその企業の一つだ。こちらからは、ログを送るだけでhadoopやhiveを用いた分析環境を提供してくれる。一方で、こちらが分析機材を用意するわけではないため、どのくらいの速度で分析できるかわからない。特に複雑なHiveクエリーの場合どの程度時間がかかるか？データ量が増えた時にどのような振る舞いを示すのかは、自分自身で試さなければ、本当のところはわからない。

## Treasure Dataを使ったhiveベンチマーク

そのため、Treasure Dataを使ったhiveのベンチマークを行った。使用したデータは、実際のゲームを模倣したダミーのデータだ。

このダミーデータを10 億件入れたテーブル(データサイズは305GB)を作成し、それに対して、そこそこ複雑なHiveクエリーを投げた。

```json
{"response":
  {"presents":
    [
      {
        "id":335,
        "type":1,
        "name":"連続ガチャ",
        "quantity":1,
        "unit": {
          "mode":0,
          "is_new":false,
          "master_id":3027,
          "unit": {
            "id":5495,
            "master_id":3027,
            "level":1,
            "exp":0,
            "skill_learning": [ 
              {
                "master_id":30012,"exp":0 
              }
            ],
           "learned_action_ids":[9930032,9930033,9930036,9930054,9930057,9930058],
           "union_count":0,
           "state":null,
           "role":1
}}}]}}
```

このクエリーも仮想のものであるが、Hiveクエリーの内容は、loginというAPIからuser_idを集計し、総ログイン者数を抜き出すものだ。distinctをしなかったのは、ダミーデータとして重複するuser_idを使いまわして使っており、 集計値が増えないので、distinctは外した。

```sql
SELECT COUNT(a.user_id) 
  FROM (SELECT get_json_object(v['response'],'$.user.id') AS user_id 
  FROM complex_10m_test_json 
  WHERE (v['api_name']='login') 
    AND (get_json_object(v['response'],'$.user.id') IS NOT NULL) ) a;
```

## ベンチマーク結果

10億件のデータに対するベンチマークは、データを、一千万件ずつ増やしながら100回行った(表では億の値のみ抜粋)。
下に回帰式を書いたが、基本的に、処理時間は線形に増加した。最初の1億から2億件くらいでは8cpuコア以上は使っていなかったが、その後、件数が増えると32コアcpu使い出した。

![query_time_10m_1000m.png](https://qiita-image-store.s3.amazonaws.com/0/26986/2e7fb547-495f-9213-f145-c2a88fc61391.png)

**ベンチマーク結果表**

|件数|クエリー秒数|
|:-----|-----------------:|
|1000万件|133|
|1億|227|
|2億|500|
|3億|615|
|4億|756|
|5億|1035|
|6億|1924|
|7億|724|
|8億|943|
|9億|1119|
|10億|1220|

ベンチマークの結果から、回帰式を作ってみた。

**f(x)=361.2182401 exp(0.01666789 * x)**
**R2 = 0.5828**

大体5−6億件で1000秒を超えるくらいだと考えれば良いと思う。

## tdのcpu利用数

Treasure Dataでは、契約マシンのCPU使用量などを公開している。上記ベンチマークを取った際の、CPU使用量についてグラフを調べた。ところどころCP使用コア数が下がっている場所は、ベンチマークプログラムにバグが有り、計測を中断した場所だ。

![td_status.png](https://qiita-image-store.s3.amazonaws.com/0/26986/e24330fa-8278-e00c-7dc1-55d5359e03b3.png)

**データサイズ358GB**
**データ容量22億件**

## まとめ
Treasure Dataについてベンチマークを行った。MySQLの様にデータが増えると急激に処理時間が増えるようなことも無かった。手軽に色々分析するには良い環境ではないかと思う。
ブラウザ側で日時指定で、リダイレクト先を切り替えるスクリプト


また、某所より要望があったので作りました。
SEO的にどうなのかは知りません。

## ソースと使い方

ソースです。jQueryは別途用意してください。

```js
$(document).ready(function() {
  $('a.location_timer').each(function(index, target) {
    var startDate = $(this).attr('data-start-date');
    var endDate = $(this).attr('data-end-date');
    var nowDate = new Date();

    startDate = startDate ? new Date(startDate) : nowDate;
    endDate = endDate ? new Date(endDate) : null;

    if (startDate <= nowDate && (!endDate || nowDate <= endDate)) {
      location.href = $(this).attr('href');
    }
  });
});
```

htmlでは下記のようにaタグに対して、`location_timer`クラスを指定して、[このエントリ](http://qiita.com/dribble13/items/3eb39726aba33add6c0a)で紹介しているものと同じようにdata-start-date属性とdata-end-date属性を追加すると

```html
<a class="location_timer" href="http://qiita.com" data-start-date="2013/10/22 16:00" data-end-date="2013/10/30 23:59"></a>
```
href属性で指定されたURLにリダイレクトされます。

## 長所と短所

* [これ](http://qiita.com/dribble13/items/3eb39726aba33add6c0a)と一緒
`git rm`で消してしまったファイルを元に戻す。

Gitで管理してて　`.sass-cache/*` が追加されてしまうので削除しようとして `git rm -r ./sass` とsassファイル群をすべてまとめて消してしまい、焦った時の対処法。

## 戻し方

```
$ git reset HEAD sass/*
$ git checkout sass/*
```

git が全然わからないので今度まとめて勉強しようと思って歳月だけが過ぎていく…。

## 参考

$ git reset HEAD hoge/hoge.c # キャッシュ上で復活 $ git checkout hoge/hoge.c # ファイルの取り出し
http://d.hatena.ne.jp/kori_hatonosuke/20110419/1303204292
jqコマンドでjsonデータを整形・絞り込み

# jq コマンドでjsonデータを整形・絞り込みする方法

jqはJSON用のsedのようなコマンドでデータのフィルタや置き換え、整形ができます。

2014/04/10追記
コメントでpipeする際jqコマンドは不要と教えて頂きました。


## インストール

homebrew でインストールできます。

```zsh
brew install jq
```

他の方法はこちらを参照
http://stedolan.github.io/jq/download/


## インデント

jqコマンドに渡すだけでインデントできる。

このようなデータがあったとして、

```json
[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]
```

jq コマンドに与えるとインデントして表示される。 . は すべてのデータを指す

```bash
echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq .  
``` 

```json
[
  {
    "age": 20,
    "name": "Ann"
  },
  {
    "age": 50,
    "name": "Bob"
  },
  {
    "age": 45,
    "name": "Unknown"
  }
]
```

## 絞り込み

1つ目のデータを取得したい場合は .  では無く .[0]を指定する

```bash
echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq '.[0]'       
```

```json                                      
{
    "age": 20,
    "name": "Ann"
}
```


age > 30 （31歳以上）を取得したいならmap , selectを使う

```bash
echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq 'map(select( .["age"] > 30))'    
```

```json
[
  {
    "age": 50,
    "name": "Bob"
  },
  {
    "age": 45,
    "name": "Unknown"
  }
]
```

age > 30 のnameだけを取得したいときはさらに jqで絞り込み

```bash
echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq 'map(select( .["age"] > 30))' | jq '.[].name'
```

```text
"Bob"
"Unknown"
```

jqの中でpipeさせることもできる。その場合はjqコマンドは１つでよい。

```bash
echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq 'map(select( .["age"] > 30)) | .[].name'
```

配列の長さを取りたいときは length を使う

```bash
echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq length  
```

```text
3
```

# 参考

* [コマンドラインJSONプロセッサー jqの演算子と関数](https://tech.mktime.com/entry/127)
* [jq Manual (development version)](https://stedolan.github.io/jq/manual/)
[自分用メモ] VirtualBoxを使用したUbuntuサーバへのSSH接続失敗の原因とその解決について

・環境
ホスト側OS: MacOS X 10.8.5
ゲスト側OS: Ubuntu Server 12.04 LTS

・解決までの経緯
1、VirtualBoxを使って仮想環境に新たにインストールしたUbuntuサーバへMac側からSSH接続をしたところ次のような通知が返ってきて失敗した。

![Screen Shot 2013-10-22 at 2.51.51 PM.png](https://qiita-image-store.s3.amazonaws.com/0/29152/1c1c3d84-4667-1f46-2756-a94fe9c7fec4.png)

2、いくつかのサイトの記事を調べた結果、どうもMacの場合mDNSResponderなるところにキャッシュが残っていることが原因ではないかと推測したため、次のコマンドを実行した。

sudo killall mDNSResponder

3、再度、Ubuntuサーバに対してSSH接続を試みるがやはり同様の理由で失敗した。この時点で、最初にSSH接続を試みる前にMac側の「/etc/hosts」の記述「192.168.56.101 mophp.local」の「mophp.local」部分を「MyECsite.local」に変更した事が原因と気づき始める。

4、「mophp.local」のキャッシュが残っているのが原因なのはわかるが、それがどこかはさっぱり・・・。仕方がないので一旦問題を無視して、「.ssh/config」の中身を変更しようと開くと・・・、

![Screen Shot 2013-10-22 at 3.09.56 PM.png](https://qiita-image-store.s3.amazonaws.com/0/29152/c43c421e-fcf5-63b3-756c-3a361e2dfd07.png)

あった・・・。というわけで、「.ssh/config」の「Hostname」の部分が問題でした。こいつも同様に「MyECsite.local」に変更して無事SSH接続できました。ここまで約30分・・・。

・問題の原因
新たにVirtualBoxを使ってUbuntuサーバの環境を構築する以前に運用していたUbuntuサーバの設定が残っていたこと。
ローカル環境（Apache）のサイトをスマホに表示する方法がやっっっとわかったのでメモ


Adobe Edge Inspectを、ローカル環境xバーチャルホストxWordPressで使う方法をメモ。

##Adobe Edge Inspectとは？

[Adobe Edge Inspect](http://html.adobe.com/jp/edge/inspect/)

PCで表示しているWebサイトを、同時にスマホでも表示させることが出来るアプリです。クロスデバイスで表示確認することができ、レスポンシブの時には重宝します。

## 準備
面倒だけど、まずいろいろとインストール。

* [Creative Cloud（無料）](http://www.adobe.com/jp/products/creativecloud.html)にサインインし、PCに「Adobe Edge Inspect」をDL＆インストール
* Google Chromeに「Adobe Edge Inspect」というエクステンションをインストール
* スマホに「Adobe Edge Inspect」アプリをインストール

## 前提
* PCとスマホが同じwifiネットワークに接続している。
* ローカル環境にApacheがインストールされている。

##基本的な使い方
インストール後、Chromeの「Adobe Edge Inspect」のポップアップで右上のスイッチをONにし、iPhoneのアプリも起動する。そうするとiPhoneに「○○のMacBook Pro」といったデバイス名が出るので、それぞれの画面でクリック。

![edge3.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/501094d4-21bc-6d45-0ecc-04ed5cff4ca9.jpeg "edge3.jpg")

iPhoneの方に表示されたパスコードをChromeのポップアップ内に入力すると接続完了。とっても簡単です。

![edge2.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/2ff84976-66c5-a748-a1d6-3950bb662bb7.jpeg "edge2.jpg")

PCの方でページを切り替えると、iPhoneの画面も自動で切り替わります。レスポンシブデザインの確認が捗るぞ・・・

## ローカル環境xバーチャルホストで使う
とても便利なのですがローカル環境のWebサイトを確認する際、そのままではスマホで見られません。<br>下記の対策が必要になります。

#####Apacheのバーチャルホスト設定ファイルを変更する
```
# Apacheのバーチャルホスト設定ファイル
# ホスト名が http://hogehoge/ の場合
<VirtualHost *:80>
	DocumentRoot "/document/hogehoge"
	ServerName hogehoge
	ServerAlias hogehoge.*.xip.io	# ServerAliasを追記
</VirtualHost>
```

修正後Apacheをリスタートしておく必要があります。
その後、ChromeのAdobeEdgeのポップアップに表示されているIPアドレスをメモ。

![edge4.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/f239982e-ba08-61f0-04d7-decdf05234c4.jpeg "edge4.jpg")

（IPアドレスが10.0.0.1の場合）「http://hogehoge.10.0.0.1.xip.io/」にアクセスすると、スマホ側でローカルのサイトが表示されます。

## ローカルのWordpressでこれをやろうとすると？
同じようにローカル環境のWordpressで試すと、CSS、JS、Imageを全く読み込まないプレーンなHTMLが表示されてしまいます。（これがずっと解決できてなくて、Edgeを使っていませんでした）

それの解決策が[ここ](http://blogs.adobe.com/edgeinspect/2012/06/19/shadow-xip-io-virtual-hosts-workflow-simplified/)にかかれてました。

![edge5.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/7a358832-6941-8c83-e7a0-6c00197742fc.jpeg "edge5.jpg")



→要するに[「Root Relative URLs」](http://wordpress.org/plugins/root-relative-urls/)というプラグインを使え とのこと。（いいのかそれで。。。）

これでWPも、iPhoneからローカル環境で確認できるようになりました。

## 元記事

本エントリーは下記の転載になります。
[Adobe Edge Inspectを、ローカル環境xバーチャルホストxWordPressで使う - rokuro Fire](http://www.rokurofire.info/2013/10/22/edge_localdev/)


## 参考サイト

* [Shadow + xip.io: Virtual Hosts Workflow Simplified](http://blogs.adobe.com/edgeinspect/2012/06/19/shadow-xip-io-virtual-hosts-workflow-simplified/)
* [http://blogs.adobe.com/edgeinspect/2012/06/19/shadow-xip-io-virtual-hosts-workflow-simplified/](http://blogs.adobe.com/edgeinspect/2012/06/19/shadow-xip-io-virtual-hosts-workflow-simplified/)
Githubの特定ブランチにpushした時だけhookでjenkinsビルドする


hookを使ってるとリポジトリへpushしてすぐにjenkinsをビルドできて便利だけど、どのブランチにpushしてもhook URLが呼ばれてちょっと不便。
例えばdevelopブランチにpushされた時だけ、hookでdevelopのビルドジョブを実行する、みたいな事がやりたくて調べてみた。

# やり方
自前のgitリポジトリだと.git/hooksで特定ブランチへのpush時だけhookする設定が書けるけど、Githubでは同じような事ができないので
Jenkins側で受け取ったhookがどのブランチへのpushによるものかを判定してみる。手順は以下のとおり。

## hook受取り用ジョブの作成
ビルドジョブとは別でGithubからhookを受け取る専用のジョブを用意しておく。

ジョブはパラメータ付きビルドにしておき、下のように `payload` という名前でパラメータを受け取れるようにする。デフォルト値は適当に。
![スクリーンショット 2013-10-21 10.09.03.png](https://qiita-image-store.s3.amazonaws.com/0/7325/da706d19-0eeb-7541-ec92-a36f2da33cd2.png "スクリーンショット 2013-10-21 10.09.03.png")

この`payload`を設定しておくと、Githubからジョブのhook URLが叩かれた際に送られてくるJSONが受け取れる。中身はこんな感じで、pushされたブランチ名やcommit IDなどが含まれている。

```json:Githubから受け取るJSON
[
  {
    "ref":"refs/heads/develop",
    "after":"44c877612fe7187f6167ef01f465b96a5868e82b",
    "before":"4acbee81fc4f2b0e2dc8cdf962294d8619ca18eb",
    "created":false,
    "deleted":false,
    "forced":false,
    "compare":"https://github.com/organization-name/project-name/compare/4acbee81fc4f...44c877612fe7",
    "commits":[
      {
        "id":"5dea536624b8b74599d2ef6efc612e37998bb3e0",
...
```
詳細はこちらで。[Post-Receive Hooks · GitHub Help](https://help.github.com/articles/post-receive-hooks)

これでhook受取りジョブ側でブランチの情報を得られるようになったので、次はこのJSONでビルドジョブを回すかどうかを判定する。

## [Run Condition Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Run+Condition+Plugin)の導入
payloadで渡されたJSONの内容をチェックするためにこのプラグインを入れておく。

例えば受け取ったhookが`develop`ブランチへのpushによるものかどうか判定したければ、`ビルド手順の追加`→`Conditional step (single)`で以下のような設定を入れる。

![スクリーンショット 2013-10-21 10.09.36.png](https://qiita-image-store.s3.amazonaws.com/0/7325/f03f09a3-a4fa-c66d-e5cd-ed0d207b7794.png "スクリーンショット 2013-10-21 10.09.36.png")

この設定では`payload`の中身に"refs/heads/develop"の文字列が含まれるか正規表現で判定する。

次に`Builder`の`Trigger/call builds…`でビルドジョブ名を指定しておくと、正規表現でdevelopへのpushと判定した時のみビルドを走らせることができる。またdevelop以外へのpushによるhookを無視したければ、`高度な設定`から判定失敗時は何もしないように設定する。最終形は下のような感じ。

![スクリーンショット 2013-10-21 10.10.14.png](https://qiita-image-store.s3.amazonaws.com/0/7325/44567af4-7b29-de7e-e882-e70f06b9e524.png "スクリーンショット 2013-10-21 10.10.14.png")

これでdevelopへpushした際のhookを受け取った時のみビルドジョブが呼び出され、それ以外は何も起こらないようになる。
JenkinsでJobが失敗した時に、Jobを無効にする

#1度失敗したJobについては定期実行を止めたい
業務でJenkinsを使っていて、Jobが失敗した時にJobの定期実行を止めたいケースがあったので、
Jenkinsプラグインを開発してみました。
[Disable Failed Job Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Disable+Failed+Job+Plugin)

Jobが失敗した時に、Jobのステータスを無効にするプラグインです。

###以下のケースで利用すると便利です
1. 定期的に実行されているJobが失敗し続けて、失敗の通知が来続けるのを防ぎたい
2. はじめて失敗した時のワークスペースの状態を残しておきたい
int i = i ^ i;はゼロ？

Stack Overflowの[Value of int i = i ^ i ; Is it always zero or undefined behavior?](http://stackoverflow.com/questions/17485814/value-of-int-i-i-i-is-it-always-zero-or-undefined-behavior)より。こんなコードを書くのはやめましょう。

C言語で記述された下記ソースコードにある3か所の変数宣言(`i,j,k`)のうち、言語仕様上正しく動作する（値0となる）のはどれでしょうか？

```c:question.c
int i = i ^ i;  // (1)

int main() {
  static int j = j ^ j;  // (2)
  int k = k ^ k;  // (3)
}
```


こたえあわせ：(1), (2)のみ値0となる。

* (1) `i == 0`となります。ファイルスコープに置かれた算術型(arithmetic type)の変数`i`は静的記憶域期間(static storage duration)をもつため、プログラム開始前から値`0`で初期化(initialized)されていることが保証されます。変数`i`は`0 ^ 0`の計算結果`0`で初期化されます。
* (2) `j == 0`となります。static指定された変数`j`は静的記憶域期間をもつため、変数`i`と同様にゼロ初期化されます。
* (3) 未定義動作(undefined behavior)です。 変数`k`は自動記憶域期間(automatic storage duration)をもつ変数となるため、その値は不定値(indeterminate value)となります。式`k ^ k`は不定値同士の演算となるため、未定義動作を引き起こします。

おまけ：アセンブリ言語のイディオム「XOR命令によるレジスタゼロクリア」を、高級言語にそのまま持ってくるのはダメというお話でした。（下記はx86の例）

```
xor %eax, %eax  ; eax ^= eax
; eaxレジスタ == 0
```
FLTKをMauntain Lionで使う

# 経緯

[FLTK](http://www.fltk.org/index.php)を使わなければならない課題が出題されたので、なんとかMacで使う方法を検討した。

# Homebrewを使う

[Homebrew](http://brew.sh/)にはFLTKのバージョン1.3.2が収録されているので、最初はこれを導入していた。ところがこのFLTK1.3.2を用いて次のようなプログラムをコンパイルするとセグメンテーションフォルトで死ぬ。

```cpp
#include <FL/Fl.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Window.H>

int main(int argc, char **argv) {
	Fl_Window *window = new Fl_Window(300,180);
	Fl_Box *box = new Fl_Box(20,40,260,100,"Hello World!");

	box->box(FL_UP_BOX);
	box->labelsize(36);
	box->labelfont(FL_BOLD+FL_ITALIC);
	box->labeltype(FL_SHADOW_LABEL);

	window->end();
	window->show(argc, argv);

	return Fl::run();
}
```

これはFLTKの`Hello World`的なプログラムなので、これがコンパイル出来ないようでは話にならない。

# 解決方法

FLTKの`snapshot r9998`を導入したら解決したように思われる。1.3.2とはコンパイルの方法が違うので、注意しなければならない。展開したフォルダにある`README.OSX.txt`を読めば分かるが、`automake`を用いなければならない。
angular.js使ってみた

angular.js使ってみた

前回のknockout.jsと同じようにシンプルなtodoを作成。

![s_2013-10-22_11.12.33.png](https://qiita-image-store.s3.amazonaws.com/0/14914/685232df-8f13-7230-8944-68b8bb66ed15.png)

[サンプル](http://jsfiddle.net/astrsk_hori/q35nn/40/)

日本語ドキュメントが少ないのがちと辛いなぁ。

もうちょっと調べないとよくわからない。
ルビーワンライナーシェル便利最高

```bash
$ ruby -e "exit true"; echo $?
0

$ ruby -e "exit false"; echo $?
1
```

こうなので、 @udzura さんの呼び名を日によって変えたいときなどに便利です。

```bash
ruby -rdate -e "exit Date.today.day.even?" && echo "うづら" || echo "うっちー"
```
Vim の操作を幼女に音声支援させる方法

ほら、Editor 使っているとさ幼女の声ききたいじゃん。そのほうが作業も捗るからね。
動画: http://www.youtube.com/watch?v=DFuEJpNTcA8


## 以下設定方法
 ```vim:.vimrc
" function
function! PlaySE(name)
    silent! exec '!afplay ~/Dropbox/vim/sound/' . a:name . '.wav &'
endfunction

" 補完を閉じる
autocmd CompleteDone * call PlaySE("shift")

" バッファ移動
autocmd BufEnter * call PlaySE("switch")

" 入力
autocmd InsertCharPre * call PlaySE("input")

" 保存
autocmd BufWrite * call PlaySE("save")

" インサートモード IN / OUT
autocmd InsertEnter * call PlaySE("in")
autocmd InsertLeave * call PlaySE("out")
```

## ランダムでの設定
 ```vim:.vimrc
function! s:Rand(max)
redir @n
ruby << EOF
    rmax = VIM::evaluate("a:max")
    rmax = nil if rmax == ""
    printf rand(rmax).to_s
EOF
redir END

let @n = strpart(@n, 1, strlen(@n) - 1)
return @b
endfunction


" Random Play
function! RandPlaySE(name)
    silent! exec '!afplay ~/Dropbox/vim/sound/d/' . a:name . '-' . s:Rand(2) . '.wav &'
endfunction
```
追加した ppa のリポジトリをリストから削除する方法

Clipitをインストールするときに追加したppaが404 Not foundのエラーを吐くようになってたのもう使ってないし削除することにした。

## エラーメッセージ

```
W: http://ppa.launchpad.net/shantzu/clipit/ubuntu/dists/precise/main/source/Sources の取得に失敗しました  404  Not Found

W: http://ppa.launchpad.net/shantzu/clipit/ubuntu/dists/precise/main/binary-i386/Packages の取得に失敗しました  404  Not Found

E: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

```

## 解決策

```
sudo add-apt-repository --remove ppa:shantzu/clipit
```

でOK.

## 失敗したの

```
sudo apt-get install ppa-purge
sudo ppa-purge ppa:shantzu/clipit
```

これでできるはずだけどできなかった。なんでやろ。

apt - How can PPAs be removed? - Ask Ubuntu
http://askubuntu.com/questions/307/how-can-ppas-be-removed
LinuxでソフトウェアRAID 0を構築したい

LinuxでソフトウェアRAID 0を構築したい。

最近SSDの値段も下がって、複数台でRAID 0を使ってIO高速化とか、Intel SSD 910シリーズのようにそもそも4つのデバイスに見えるとか、ソフトウェアRAIDを使いたいことがよくある。また、RAID0、RAID1は、ほとんどのハードウェアRAIDよりソフトウェアRAIDの方がはやい。
Linux上でこれを可能にするのがmdドライバで、mdadmというツールを使って操作することができる。

## mdadmをインストールする

Debianではaptでインストールできる。

```
$ sudo aptitude install mdadm
```

## RAID0構成を作る

`mdadm`でRAIDを組む前に`fdisk`か`parted`でパーティションを作っておく。
/dev/sdb、/dev/sdc、/dev/sddでRAID0を組むときは次のような感じ。

```
$ sudo mdadm -C /dev/md0 -l0 -n3 -f /dev/sd[bcd]1
```

オプションは次のような感じ

|    | |
|:---|:-----------------------------------|
| -C | 新しいデバイスを作成する |
| -l | RAIDレベル。RAID0のときは`-l0`、RAID1のときは`-l1` |
| -n | デバイスの数 |
| -f | force option |

確認するときは`mdadm -D`を使う。

```
$ sudo mdadm -D /dev/md0
```

```
/dev/md0:
        Version : 1.2
  Creation Time : Thu Oct  17 00:00:00 2013
     Raid Level : raid0
     Array Size : 750151680 (715.40 GiB 768.16 GB)
   Raid Devices : 3
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Thu Oct  17 00:00:00 2013
          State : clean
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

     Chunk Size : 512K

           Name : hostname:0  (local to host hostname)
           UUID : XXXXXXXX:XXXXXXXX:XXXXXXXX:XXXXXXXX
         Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1
```

できた。

あとは適当にファイルシステム作れば使うことができる。

```
$ sudo mkfs.ext4 -j /dev/md0
```

## RAID0解除

アンマウントしてmdadmでstopすればよい。

```
sudo umount /mnt/ssd
sudo mdadm --misc --stop /dev/md0
```
`apt-get install`するまえに`apt-cache` でバージョンを調べる方法

UbuntuにGimpを入れようと思ったけど、入れる前に2.6が入るのか2.8が入るのか知りたかったので
`apt-cache search gimp` してみたけどバージョン名が出てこない。

## 解決策

`apt-cache policy gimp`

すると見れる。こんな感じの出力

```
$ apt-cache policy gimp
gimp:
  インストールされているバージョン: (なし)
  候補:               2.6.12-1ubuntu1.2
  バージョンテーブル:
     2.6.12-1ubuntu1.2 0
        500 http://jp.archive.ubuntu.com/ubuntu/ precise-updates/main i386 Packages
        500 http://security.ubuntu.com/ubuntu/ precise-security/main i386 Packages
     2.6.12-1ubuntu1 0
        500 http://jp.archive.ubuntu.com/ubuntu/ precise/main i386 Packages
```

ついでにGimp 2.8 をインストール方法も調べときました。

apt-get で Gimp2.8をUbuntuにインストールする方法 - Qiita [キータ]
http://qiita.com/ironsand/items/c330276242347784dc70

## 参考

debian - How to check the version before install packages using apt-get - Stack Overflow
http://stackoverflow.com/questions/18885820/how-to-check-the-version-before-install-packages-using-apt-get
apt-get で Gimp2.8をUbuntuにインストールする方法

Ubuntuの標準のパッケージリポジトリだと2.6がインストールされるので2.8のインストール方法がないから探してみた。

## 解決策

PPAを作って公開してくれてる人がいるのでそれを使いましょう。

```
sudo add-apt-repository ppa:otto-kesselgulasch/gimp
sudo apt-get update
sudo apt-get install gimp
```

でOK.

## 参考

Install GIMP 2.8.6 In Ubuntu [PPA] ~ Web Upd8: Ubuntu / Linux blog
http://www.webupd8.org/2013/06/install-gimp-286-in-ubuntu-ppa.html
Ubuntu12.04で`sudo hostname "好きな名前"` でホスト名を変更した後の対処法

`hostname`コマンドで "vubuntu"を”Ubuntu"に変えたんだけど、再起動してから

```
sudo: unable to resolve host vubuntu
sudo: ホスト vubuntu の名前解決ができません
```

と出るようになってしまった。プロンプト文字列を見ても`ironsand@vubuntu ~`のようにもとに戻ってしまってる。

`man hostname` してみると

```
The  host  name  is   usually   set   once   at   system   startup   in
       /etc/init.d/hostname.sh  (normally  by  reading  the contents of a file
       which contains the host name, e.g.  /etc/hostname).
```

ということで `sudo hostname Ubuntu` したら `/etc/hostname`も書き換えないとダメだったらしい。
ちなみに`hostname`コマンドは別ターミナルを開いたらプロンプトストリングにも反映されるっぽい。

## 参考

Ubuntuで「sudo: unable to resolve host」 | サイバーまめカン 出水市でWebを活用して行きたい人のブログ
http://blog.tstylestudio.com/2012/08/08/ubuntu%E3%81%A7%E3%80%8Csudo-unable-to-resolve-host%E3%80%8D/

permissions - sudo: unable to resolve host (none) - Ask Ubuntu
http://askubuntu.com/questions/59458/sudo-unable-to-resolve-host-none
WebAudioAPIで遊べるようになった


音楽の覚えがあるエンジニアとしては、触らなきゃダメだろーと思いつつ、なかなか手を付けられていなかったWebAudioAPI、
[先日のハッカソン](http://qiita.com/fnobi/items/0b94534183b48fb30d55)でようやく着手できました。

その過程でわかったこと・つくったものなどまとめました。

## 登場人物

HTML5のAudio要素を使う時と違って、
WebAudioAPIの場合は、使っているオブジェクトがけっこう多い。
そのあたりを把握するのが、WebAudioAPIのマスターの第一歩っぽい。

### context (AudioContext)
音をとりまとめるcontext。
音の再生先(destination)なんかも、このcontextが握っているみたい。

WebAudioAPIに対応しているブラウザは、
window.AudioContext (window.WebkitAudioContext)というのが生えてるので、
これをインスタンス化すると作れる。

```javascript
var context = new window.AudioContext();
```

### buffer
再生する音のデータ。
.wavなど外部のファイルを使う場合は、

 - XMLHttpRequest(responseType: arraybuffer で!)で読み込む
 - 読み込んだものを、contextにdecodeしてもらう (```context.decodeAudioData```)

という流れでできる。

```javascript
// ここにbufferを格納したい
var buffer;

// ファイルを取得 (arraybufferとして)
var request = new XMLHttpRequest();
request.open('GET', '/sounds/sample.wav', true);
request.responseType = 'arraybuffer';

request.send();
request.onload = function () {
    // 読み込みが終わったら、decodeしてbufferにいれておく
    var res = request.response;
    context.decodeAudioData(res, function (buf) {
        buffer = buf;
    });
};
```

### source
こうして作ったbufferを再生するためには、sourceというものを作る。
これもcontextに生えているメソッドを使う。(```context.createBufferSource```)

```javascript
// source作成
var source = context.createBufferSource();

// さきほど作ったbufferを、ここにセット
source.buffer = buffer;

// 再生準備。contextの持っている再生先に接続
source.connect(context.destination);

// 再生 (引数はtimeout)
source.noteOn(0);
```

## たとえば、できること

### 音の高さを変える
厳密にはピッチ変更ではないけれど、
単発の音を鳴らすのであれば、sourceのplaybackRate.valueをいじればおk。

## 気をつけること
### sourceは使い捨て
sourceは、 **再生するたびに生成して、使い捨てるというかたち** になっている。
最初は、つくったsourceに対して何度も ```.noteOn``` したりできるのかと思ってた。

### 一度は、ユーザーアクションをトリガーにして、音再生させないとだめ。

逆に言えば、1度タップのタイミングなどで再生をさせてしまえば、 **その後は好きなタイミングで鳴らし放題** なもよう。

その辺の挙動から、「ユーザーアクションで再生許可」は、おそらくcontextに紐付いてるんじゃないかなぁという印象。
(source単位での許可だとすると、sourceは再生のたびに使い捨ててるので、再生のたびに許可が必要なはず)
ちゃんとしらべてないけど。

ちなみに、ユーザアクションから間接的に音再生呼んだ場合、
(clickのlistenerでsetTimeout通して音再生、とか)
なんかときどき再生できちゃってたけれど、

確実に鳴らしたいなら、やっぱり1度は直接再生呼び出しした方がいいみたい。


## つくったもの

### DripMetro
 - http://dripmetro.fnobi.com/
 - http://github.com/fnobi/dripmetro

[先日のハッカソン](http://qiita.com/fnobi/items/0b94534183b48fb30d55)で作ったもの。
ぴちょんぴちょん言うメトロノーム。
いちおうBPMを上げるほど、音も高くなるようにしてます。

### ToneMap
 - http://github.com/fnobi/ToneMap
 - http://tonemap.fnobi.com/

↑のDripMetroを作る過程でできた、WebAudioAPIのwrapper。
(wrapperとはいえ、もうすこし機能追加するつもり)
複数の音源を使う場合でも、やりやすくなる…はず。

デモでは、
画面タッチで音再生→スワイプのスピードに応じて音を高く
っていうのやってます。

## まとめ
 - たのしい
 - ↓のデモなど見ても思うけれど、iOSは十分にWebAudioAPIつかえるっぽい
 - 音をばしばしつかったスマホサイトなんかも、挑戦したいなぁ

## 参考とかっこいいデモ

 - http://jlongster.com/2012/09/12/web-apps.html
   - iOSでもぬるぬる動くデモあり すごい!

 - http://mohayonao.github.io/timbre/
   - WebAudioAPIをつかって、sin波を鳴らすライブラリ。べんりそう。

 - http://mohayonao.hatenablog.com/entry/2012/09/21/203833
   - ↑のtimbre.jsのひとの、iOS WebAudioAPIのはなし。

 - http://www.html5rocks.com/en/tutorials/webaudio/intro/
   - おなじみhtml5rocks。WebAudioAPIの基礎。

 - http://www.html5rocks.com/ja/tutorials/webaudio/games/
  - こちらもhtml5rocks。ゲームで音を使う場合のあれこれを解説。
cocos2d-x 3.0 alphaのドキュメントをDashで読む

## はじめに

先日、cocos2d-x 3.0のalpha版がリリースされました。
2.xまでとAPIが大きく変更されており、今までと同じことをするのにもドキュメントが必須。
しかし、ドキュメントはオンライン上でHTMLでしか提供されておらず、非常に読みにくいです。

というわけで、cocos2d-x 3.0のドキュメントをDashで読む方法をまとめました

## Dashの導入

DashはMac向けのドキュメントビュワー。高い検索性と動作の軽快さが素晴らしい。まだ導入していない方はこの機会に是非

[Dash - Documentation Browser, Snippet Manager - Kapeli](http://kapeli.com/dash "Dash - Documentation Browser, Snippet Manager - Kapeli")

## cocos2d-x 3.0 alphaのダウンロード

こちらからダウンロード

[Download Cocos2d-x Cocos2d-html5 CocoStudio | Cocos2d-x](http://cocos2d-x.org/download "Download Cocos2d-x Cocos2d-html5 CocoStudio | Cocos2d-x")

## Doxygenの導入

cocos2d-xのドキュメントはDoxygenで生成されており、既に設定ファイルが用意されています。今回はHomebrewで導入

```
brew install doxygen
```

## 設定ファイルの変更

先ほどダウンロードしたcocos2d-x 3.0を解凍し、`doc`ディレクトリ下にある設定ファイルを編集します

```
cd path/to/cocos2d-3.0/doc/
vim doxygen.config
```

実はDoxygenではDocsetsを自動生成してくれる機能があるのですが、デフォルトでは無効になっているので、下記のページを参考に設定ファイルを書き換える。

[Generating Dash Docsets - Kapeli](http://kapeli.com/docsets "Generating Dash Docsets - Kapeli")

```
GENERATE_DOCSET   = YES # must
DISABLE_INDEX     = YES  # (Optional)
SEARCHENGINE      = NO  # (Optional)
GENERATE_TREEVIEW = NO  # (Optional)
```

また、生成されるドキュメントのメタデータが古いバージョンのままなので、下記を変更してあげる

```
PROJECT_NUMBER = 3.0
```

## ドキュメントの生成

```
doxygen doxygen.config
```

これを行うと、doc下に`html`というディレクトリが生成されますが、まだ肝心なDocsetは生成されていません。

そこで、`html`化でmakeをしてやる

```
cd html
make
```
これでドキュメントの生成が開始されます。かなり時間がかかるので注意。(20分程度)

## Dashに読み込む

生成されたドキュメントは`doc/html/org.doxygen.Project.docset`なので、適当な場所に移動してあげる

```
mv org.doxygen.Project.docset ~/Library/Developer/Shared/Documentation/DocSets/org.cocos2d-3.0.docset
```

その後、Dashのメニューバー、`Dash > Preferences > Docsets`左下の追加ボタンから、今保存したDocsetを指定してあげると良いでしょう

![Screen Shot 2013-10-22 at 01.45.51 .jpg](https://qiita-image-store.s3.amazonaws.com/0/10009/b8ed64c6-1874-e284-112c-0112317563e2.jpeg)

見れた！！！
SourceTreeでちょっとハマったところ

SourceTreeで，リポジトリにlibファイルとdllファイルをaddしようとするとリストに含まれてなくて，addできなくてハマった．原因は，sourcetreeがgitignore_globalとhgignore_globalという，グローバルignoreリストがない場合に自動生成するためらしい．
[ここを参考](http://tech.nitoyon.com/ja/blog/2013/04/05/sourcetree/ "SourceTree が Git のグローバルな無視リストを書き換えて困った話")

Windowsであれば，C:\Users\user-name\Documents以下にgitignore_global.txt，hgignore_global.txtがあるのでこれらのテキストファイルから*.lib*.dllを除くと無事addできるようになった．

--
インストール時の注意メッセージはきちんと読みましょう．
RubyKokubanで画像を表示する


mrubyを使ってインタラクティブアプリケーションを作ることが出来ます。
インストール方法は[こちら](https://github.com/ongaeshi/rubykokuban-gem)をどうぞ。 → [[最新記事]](http://ongaeshi.hatenablog.com/entry/rubykokuban-image)

画像の表示に必要なのはたったの4行です。スクリプトと同じ場所に`sample.png`を置いて下さい。

```ruby
def draw
  @image ||= Image.load("sample.png")
  set_color(255, 255, 255)
  @image.draw(0, 0)
end
```

実行します。

```
$ kokuban exec image001.rb
```

表示されました。

![image001.png](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20131020/20131020173940.png)

## 目次
- [ (1) 画像をリアルタイムにグレースケールに](http://qiita.com/ongaeshi/items/5eeeb0888b1ca853dec0)
コマンドラインでMacのアプリをインストール


[Homebrew](https://github.com/mxcl/homebrew)は定評のあるOSXのパッケージ管理ツール。膨大な数のアプリがFormulaとして用意されているが、MacPort同様にソースからのコンパイルが基本。逆にバイナリでdmgやzip形式で配布されているアプリは対象外になっている。

それらをHomebrewで無理やり(？)扱ってしまおうというのが [Homebrew-cask](https://github.com/phinze/homebrew-cask)。Google ChromeやAdiumの様なアプリがサクっとインストールできる。

導入にはhomebrew-caskのリポジトリをtapしてbrew-caskコマンドをインストール。

```
$ brew tap phinze/homebrew-cask
$ brew install brew-cask
```

これで外部コマンド"cask"が使えるようになる。Google Chromeをインストールするには

```
$ brew cask install google-chrome
```

でOK。気を付けないといけないのはインストール先は`/Applications`ではなく`~/Applications`になる事くらい。

サポートされているCask(たる)は600以上。[ここ](https://github.com/phinze/homebrew-cask/tree/master/Casks)にリストされているがない場合も追加は比較的容易。
Mac、CygwinターミナルへのSolarized導入記


デフォルトではコントラストのキツいMacとCygwinのターミナルに[Solarized](http://ethanschoonover.com/solarized)を適用してみました。
目に優しい開発環境へ。

##参考にさせていただいたサイト

・ [Mac Terminal のカラー設定をSolarized にする](http://qiita.com/Humangas/items/848f0318dfc3c6f5b8e2)
・ [minttyにカラースキームを適用する](http://smartgadgetlaboratory.blogspot.jp/2012/03/mintty.html)

## Mac Terminal (Mountain Lion) の場合
Mountain Lionのターミナル.app向けのSolarizedテーマをgitレポジトリからクローンします。

```
$ git clone https://github.com/tomislav/osx-terminal.app-colors-solarized
```

あとはターミナルに適用するだけ。

1. `⌘,`で環境設定を開く
2. `設定`タブを開く
3. `プロファイル`欄下の`⚙`ボタンを選択し、`読み込む`
4. `Solarized Dark.terminal`もしくは`Solarized Light.terminal`のどちらかを選択。必要ならば`デフォルト`にしておく。

これだけでVimは綺麗になると思います多分。
以前インストールしたNeoBundleで本家のものをインストールしても思ったカラーリングにならずに遠回りしましたが、Mountain Lionのターミナルではターミナル設定を変更するのが一番なのでしょうか。

しかし、lsのカラープロファイルが少し寂しいのでこちらも参考サイト様を参考にして変更します。

まずはSolarized用lsカラープロファイルをgitレポジトリからクローンします。

```
$ git clone https://github.com/seebi/dircolors-solarized.git
```

カラープロファイル変更可能なglsを使えるようにするため、`coreutils`を入れます。今回はMacPortsで入れました。

```
$ sudo port install coreutils
```

`~/.bash_profile`を編集します。
やることは、lsのエイリアス指定(glsを使うように)と、gdircolorsコマンドのSolarized用カラープロファイルの設定。

```~/.bash_profile
alias ls='/opt/local/bin/gls --color=auto'
eval $(gdircolors <置き場所>/dircolors.ansi-dark)
```
`$source ~/.bash_profile`で反映したら完了です。

## Cygwinの場合
会社ではCygwinごしにVimを利用しています。
Cygwin環境の場合、Cygwinのターミナルエミュレータであるところのmintty向けに提供されているSolarizedを適用してターミナル環境ごとSoralize化します。

```
$ git clone https://github.com/mavnn/mintty-colors-solarized
```

以下を`.bash_profile`に追記します。

```~/.bash_profile
source ~/path.to.repository/sol.dark
```

`$ source ~/.bash_profile`で反映したら完了です。