OmniAICreator/Qiita-1.07M huggingface dataset:
SCLをログイン時に有効にする方法(和訳)

**※ 2017/04/13 追記**
本記事で和訳した手法より、scl-utilsパッケージに含まれるscl_sourceコマンドを利用した方がよさそうです。

```bash:
$ cat /etc/profile.d/enablepython33.sh
#!/bin/bash
source scl_source enable python33
```
注意: この方法で設定した場合、コレクションを後から無効化できません。

参考URL:

- http://qiita.com/yunano/items/eb1a052d1663a0078e57
- https://access.redhat.com/ja/solutions/2112231

**※ 2017/04/13 追記終了**

SCLはRHEL/CentOSで最新のプログラミング言語やデータベースを利用するための仕組みです。
SCLでインストールされたパッケージを利用するには以下のようにコマンドを実行する必要がありますが面倒くさいですよね？
`scl enable php54 'php --version' `

[Red Hat developer blogの記事](http://developerblog.redhat.com/2014/03/19/permanently-enable-a-software-collection/) によい解決方が書かれていましたので紹介します。
以下はブログの意訳です。

# Permanently Enable a Software Collection(意訳)

投稿に時間が掛かったこと謝罪したい。我々は既にこの主題の投稿を既に書いたと思っていた。何についてだろうか？一つあるいは複数のsoftware collections をログイン時に自動的に有効にする方法である。

これを実現するためには幾つかの方法がある。
まずは以下の例のように.bashrcに"source"行を追加するものだ。

`source /opt/rh/python33/enable`

しかしながら, この[Red Hat kbase discusses](https://access.redhat.com/site/solutions/527703)によると、この問題の最善の解決策は、新規ファイルを作成し"source"行を追加するの加え、適切な環境変数を修正することである。

```bash:
$ cat /etc/profile.d/enablepython33.sh
#!/bin/bash
source /opt/rh/python33/enable
export X_SCLS="`scl enable python33 'echo $X_SCLS'`"
```

同kbaseの記事や伝聞によると、本題を実現するためのよりよい方法を提供するコードがいくつかコミットされている。これらはまだサポートされていないが、すぐにscl-utilsのリリースバージョンに含まれるだろう。
Googleスプレッドシートで形態素解析

Google Apps Script と Yahoo! の日本語形態素解析API を使って、Googleスプレッドシート上で形態素解析を行います。下記の記事の内容をまとめ直したものです。

- http://shirayuca.github.io/blog/2014/08/04/yahoo.html


## 日本語形態素解析APIの設定
まず、Yahoo!デベロッパーネットワークにて、アプリケーションIDを取得します。やり方は、下記のブログが参考になります。

- http://ysklog.net/php/1581.html


## スクリプト

```js:yahooTextSegmentation.gs
/**
 * Yahoo! 日本語形態素解析APIの利用
 */
 
var ss = SpreadsheetApp.getActiveSpreadsheet();
var mySheet = ss.getActiveSheet();
 
function yahooTextSegmentation(cell)
{  
  var myAppid = "ここにアプリケーションIDを入力";
  var text = cell;
  var myUrl = "http://jlp.yahooapis.jp/MAService/V1/parse?appid="+myAppid+"&results=ma&sentence="+text;
  
  Utilities.sleep(1000);
  var myXml = UrlFetchApp.fetch(myUrl);
  var myDoc = XmlService.parse(myXml.getContentText());
  var namespace = XmlService.getNamespace("urn:yahoo:jp:jlp");
  var root = myDoc.getRootElement();
  var ma_result = root.getChild("ma_result", namespace);
  var word_list = ma_result.getChild("word_list", namespace);
  var word_array = word_list.getChildren("word", namespace);
  var surface = word_array[0].getChild("surface", namespace);
  
  var array = [];
  for (var i=0; i < word_array.length; i++) {
    array[i] = [
      word_array[i].getAllContent()[0].asElement().getText(),
      word_array[i].getAllContent()[1].asElement().getText(),
      word_array[i].getAllContent()[2].asElement().getText()
    ];
  }
  return array;
}
```


## 使い方
Googleスプレッドシート上で、任意のセルにテキストを入力（例として、A2セル）し、`=yahooTextSegmentation(A2)`とすると、下記のようにテキストが形態素解析されます。

![alt](http://shirayuca.github.io/blog/2014/08/04/yahoo/yahoo.png)
【備忘録】Vimの操作

先輩のVimを使っている姿を見て、めちゃくちゃ早い、カッコいいと思ったのがきっかけです…笑
忘れないように、メモ。
更新していきます。（使っているマシンはWindowsです）

# 基本カーソル移動

| コマンド    | 動作        |
|:-----------|:----------- |
| k          | 上移動       |
| l          | 右移動       |
| h          | 左移動       |
| j          | 下移動       |

# モード変更

| コマンド    | 動作            |
|:-----------|:--------------- |
| i          | 挿入モード       |
| Esc        | ノーマルモード    |
| :          | コマンドモード    |
| v          | ビジュアルモード  |
| Ctrl + v   | ビジュアルモード（矩形）  |

# 操作系

| コマンド    | 動作          |
|:-----------|:------------- |
| u          | 戻る           |
| Ctrl + r   | 進む           |
| x          | カーソル上の1文字削除 |
| dd         | 行の削除       |
| d0         | カーソルの前から行頭まで削除 |
| d^         | カーソルの前から行頭（空白の除く）まで削除 |
| D          | カーソル上から行末まで削除   |
| yy         | 1行コピー      |
| [数字] , yy | [数字]行コピー |
| p          | ペースト       |

コピペでクリップボードを使いたい場合

| コマンド        | 動作                    |
|:---------------|:----------------------- |
| Ctrl + Insert  | クリップボードにコピー     |
| Shift + Insert | クリップボードからペースト |


# 移動系

## カーソル

| コマンド    | 動作          |
|:-----------|:------------- |
| w          | 単語移動       |
| b          | 単語移動（逆順）|
| $          | 行末へ移動     |
| 0          | 行頭へ移動     |
| -          | 文字の先頭へ移動|
| Shift + [  | 空行移動（上）  |
| Shift + ]  | 空行移動（下）  |
| gg         | ファイルの先頭へ移動  |
| G          | ファイルの末尾へ移動  |

## ウィンドウ、タブ

| コマンド    | 動作          |
|:-----------|:------------- |
| Ctrl + w + k | 上のウィンドウへ移動 |
| Ctrl + w + l | 右のウィンドウへ移動 |
| Ctrl + w + h | 下のウィンドウへ移動 |
| Ctrl + w + j | 左のウィンドウへ移動 |
| gt           | 隣のタブへ移動 |




# 挿入モード
○○して、挿入モードに変える

| コマンド    | 動作                    |
|:-----------|:----------------------- |
| i          | カーソルの前で挿入モード   |
| a          | カーソルの後ろで挿入モード |
| I          | 先頭に移動して挿入モード   |
| A          | 末尾に移動して挿入モード   |
| O          | 前に改行して挿入モード     |
| o          | 後ろに改行して挿入モード   |

# 検索

| コマンド    | 動作        |
|:-----------|:---------- |
| /word      | wordを検索  |
| :noh       | 検索のハイライトを消す |

# 保存、終了

| コマンド    | 動作        |
|:-----------|:---------- |
| :w         | 保存        |
| :q         | 終了        |
| :wq        | 保存、終了   |
| :q!        | 強制終了     |
[openFrameworks] ofVideograberをリサイズして高速にピクセルデータを取得する方法

久しぶりのoFで、ビデオをリサイズしてピクセルデータを取得するのに、ofImageでリサイズしたらとても遅く、使い物になりませんでした。

Higa(http://qiita.com/satoruhiga) さんから教えてもらった方法を忘れないようにメモします。

ざっくりとコードは以下の様な感じです。

###ダメな例（ぼくがやっていた。）

```cpp:ofApp.cpp
ofVideoGrabber video;
ofImage img;
    
void setup()
{
    ofSetFrameRate(60);
    ofSetVerticalSync(true);
    ofBackground(0);
        
    video.initGrabber(640, 480);
}
    
void update()
 {
    video.update();
        
    if (video.isFrameNew())
    {
     img.setFromPixels(video.getPixels(), video.getWidth(), video.getHeight(), OF_IMAGE_COLOR);
     img.resize(320, 240);
            
     unsinged char * pix;
     pix = img.getPixels();
            
    // do something
  }
}
```

###高速な例（Higaさんに教えてもらった。）

```cpp:ofApp.cpp
ofVideoGrabber video;
ofFbo fbo;
    
void setup()
{
    ofSetFrameRate(60);
    ofSetVerticalSync(true);
    ofBackground(0);
        
    video.initGrabber(640, 480);
    fbo.allocate(320, 240, GL_RGB);
}
    
void update()
 {
    video.update();
        
    if (video.isFrameNew())
    {
     fbo.begin();
     video.draw(0, 0, fbo.getWidth(), fbo.getHeight());
     fbo.end();
            
     ofPixels pix;
     fbo.readToPixels(pix);
            
    // do something
  }
}
```

おかげでfpsが20から60に変化しましたー
Higaさんにマジ感謝ですー
通貨の表記で複数の条件を設定したいときの書き方

javaで通貨の表記を変更するには、DecimalFormatを使うことが多い。
例えばUSドルの表記にしたい場合($1,000など)、以下のように書く。

```
private static NumberFormat COMMA_FORMAT = new DecimalFormat("$ #,###");
String formatDollar = COMMA_FORMAT.format(1000);  // -> $1,000
```

USでは、マイナスの場合は( \$ 1,000 )のように書くのが一般的だが、上記のままだと - \$  1,000のようになってしまう。  
これを( \$1,000 )と書くには以下のようにセミコロンで表示したい表記で書けばOK。

```
    private static NumberFormat COMMA_FORMAT = new DecimalFormat("$ #,###;($ #,###)");
String formatDollar = COMMA_FORMAT.format(-1000);  // -> ($1,000)
```

### 参考
http://stackoverflow.com/questions/2056400/format-negative-amount-of-usd-with-a-minus-sign-not-brackets-java
[Rails] 任意のファイルにアプリケーションログを吐く


基本は`log/production.log`や`log/development.log`に吐かれるログだが、特定機能のログは別ファイルに残したい場合など。

### configへ設定

今回は`log/foo.log`に吐かれるようにしてみます。

```environments/production.rb
config.another_logger = Logger.new(Rails.root.join('log/foo.log'))
```

### 使う

```fuga_controller.rb
Rails.application.config.another_logger.info('bar')
```

これだけです。

並行して、通常通りproduction.logに吐かせたいものは

```fuga_controller.rb
Rails.logger.info('buzz')
```

にて。
WebAudioで適当に何か鳴らす

WebAudioそこそこ良い感じになってきたのでメモ。あと入用で。
リアルタイムで自前で波形生成して突っ込むのを実験。なるべく小さく書いてみた。
当初もっと小さく書けたけど分かりやすさ重視。
buffer_sizeを大きくするとレイテンシがしょぼくなる。

```js:xe.jp
<script>

var buffer_size  = 16384; //power 2
var divide       = 10;
var finetune     = 512.0;
var gain         = 0.01;
var cutoff       = 1000; //hz

//https://www.youtube.com/watch?v=oFXMxIvZeMk
var score =
[
	0, 12, 11 - 0, 12, 16, 12, 11 - 0, 12,
	0, 12, 11 - 1, 12, 16, 12, 11 - 1, 12,
	0, 12, 11 - 2, 12, 16, 12, 11 - 2, 12,
	0, 12, 11 - 3, 12, 16, 12, 11 - 3, 12,
];

//webaudio.
var audio        = new (window.webkitAudioContext || window.AudioContext);
var scriptproc   = audio.createScriptProcessor(buffer_size);
var filter       = audio.createBiquadFilter();
var sample_pnote = audio.sampleRate / divide;
var basepitch    = finetune / audio.sampleRate;

scriptproc.onaudioprocess = audiohandler;
scriptproc.connect(filter);

filter.type      = 0;
filter.frequency.value = cutoff;
filter.connect(audio.destination);

console.log(audio.sampleRate, sample_pnote, finetune);

var voice = function() {
	this.ph = 0;
	this.acc = 0;
	this.on = function(note) {
		//http://ja.wikipedia.org/wiki/%E5%B9%B3%E5%9D%87%E5%BE%8B
		this.acc = Math.pow(2.0, note / 12.0) * basepitch;
	}

	this.get = function() {
		this.ph += this.acc;
		var g0 = Math.sin(this.ph * 3.141592 * 2);
		return g0 > 0.0 ? -1 : 1;
	}
};
vo = new voice();

var remain = 0;
var index  = 0;
function audiohandler(event) {
	var outL = event.outputBuffer.getChannelData(0);
	var outR = event.outputBuffer.getChannelData(1);
	for(var i = 0 ; i < outL.length; i++) {
		remain--;
		if(remain <= 0) {
			var note = (score[index % score.length]);
			vo.on(note);
			remain = sample_pnote;
			index++;
			console.log(note);
		}
		var out  = vo.get()
		outL[i]  = out * gain;
		outR[i]  = outL[i];
	}
}

</script>
```

↑のサンプル。

https://dl.dropboxusercontent.com/u/27656232/scsnd.html
※こいつHTL21でも音鳴った！やるな！


もうちょっと凝ったの。
https://dl.dropboxusercontent.com/u/27656232/scsndseq.html



フィルタとかは適当(耳触りだったので)

voiceを適当に増やせばポリな感じにできる。
createOscillator使う手もあるけど適当にグライド発生するし、FireFoxだとグライド無いしまだダメ(デフォの場合)
※調べたけどcreateOscillator今時点で全く役に立たないわ。さすがドラフト。
ghqを使っているとリモートリポジトリもコンソールから簡単に作りたくなった(bitBucketとgithub用)


##はじめに 
ghqでローカルリポジトリを管理していまして、
結構快適なんですが、新規プロジェクトを作る際に、
リモートリポジトリの作成をWEB側でいちいち作るのが面倒くさくなってきました。

ということでコマンド一発でリモートリポジトリの新規作成とremote add、pushまでを行います。

尚、githubではオープンリポジトリ、bitbucketではプライベートリポジトリとして登録を行います、


##インストールとか
bitbucketとgithubのcliツール&必要コマンドを導入します。

```zsh:bb
$ pip install bitbucket-cli
$ touch ~/.bitbucket
$ chmod 600 ~/.bitbucket
$ vim ~/.bitbucket 
```

```zsh:~/.bitbucket

[auth]
username = <username>
password = <password>

[options]
scm = git
protocol = ssh
```

```zsh:hub
$ brew install hub
```

```zsh:wget
$ brew install wget

```



以下を```~/.zshrc```に追記


```zsh:~/.zshrc
function crrr() {
    if [ ! -e .git ]; then
      echo "please git init."
	  return
    fi

	local arr
	arr=( `pwd | tr -s '/' ' '`)
	local REPO=$arr[-1]
	local OWNER=$arr[-2]
	local SERVICE=$arr[-3]
	case $SERVICE in
		"bitbucket.org")
			bb list | grep  $OWNER/$REPO
			if [[ $? == 0 ]]; then
				echo "this repo is exist."
				return
			fi
			echo "create repo in $SERVICE"
			#crete_from_local代替
			bb create -w $OWNER -c $REPO
			git remote add origin git@bitbucket.org:${OWNER:l}/${REPO:l}.git
			git push -u origin master
			;;
		"github.com")
			wget -q --spider "https://github.com/$OWNER/$REPO"
			if [[ $? == 0 ]]; then
				echo "this repo is exist."
				return
			fi
			echo "create repo in $SERVICE"
			gh create $OWNER/$REPO
			git push -u origin master
			;;
		*)
			echo "no hit.";;
	esac
}
```

```source ~/.zshrc```で再設定しておきます。

###実際の手順

```zsh:手順
$ cd ~/repo/github.com/m0a
$ #新規プロジェクトを作成します
$ mkdir sample00
$ cd sample00
$ git init
$ echo "test create" > README.md
$ git add -A
$ git commit -m "init."
$ crrr

```
という感じで使います。
[angular-ui/ui-router]$state.get の第2引数

[本家の API reference](http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$state) では、$state.get は第1引数に `stateOrName` を受け取り、それに対応する `state` を返すようになっている。

ところが、こいつに相対パス、例えば `$state.get("^.hoge")` なんかを渡すと以下の様なエラーを吐く。
`"No reference point given for path '^.hoge'`

このエラーの出所を見てみると以下の行
https://github.com/angular-ui/ui-router/blob/0.2.10/src/state.js#L142
で投げられており、こいつは `path` だけど `base` が無い時にたどり着く。

`path` は
https://github.com/angular-ui/ui-router/blob/0.2.10/src/state.js#L139
https://github.com/angular-ui/ui-router/blob/0.2.10/src/state.js#L132
`isRelative(name)` つまり「相対パスだったら」

`base` は以下の行
https://github.com/angular-ui/ui-router/blob/0.2.10/src/state.js#L1142

で `context` という名前で渡ってきており、`context` は以下の行
https://github.com/angular-ui/ui-router/blob/0.2.10/src/state.js#L1136

で、`$state.get` の第2引数として与えられる。

お前第 2 引数取るんか！！

試しに `$state.get "^.hoge", $state.$current` とやったらうまくいった。API reference にないけどいいんかなー。
poderosaのマクロでログ監視

複数サーバのログ監視をするのにマクロを組んでみた。
Poderosaのツール＞マクロからファイルを実行

1.serverListに接続するサーバ一覧を定義
2.waitで$を待ってから
3.sendlnでtailコマンドを実行


```js:log.js
import Poderosa;
import Poderosa.Macro;
import Poderosa.ConnectionParam;
import Poderosa.Terminal;
import Poderosa.View;
import System.Drawing;
import System.Threading;

// 接続先サーバ
var serverList = [
	{ hostname : "タブに表示する名前", host : "接続先IP", port : 接続先ポート, account : "接続ユーザ", password : "パスワード" }
]

for(var i = 0; i < serverList.length; i++){
	var server = serverList[i];
	connect(server.hostname, server.host, server.port, server.account, server.password);
}

/**
 * サーバへ接続
 * @param hostname タブに表示する名前
 * @param host 接続先IP
 * @param port ポート
 * @param account アカウント
 * @param password パスワード
 */
function connect(hostname, host, port, account, password){
	var param = new SSHTerminalParam(ConnectionMethod.SSH2, host, account, password);
	param.Caption = hostname;
	param.Port = port;
	param.Encoding = EncodingType.UTF8;

	var env = new Environment();
	var connection = env.Connections.Open(param);
	wait(connection, "$");
	sendln(connection, "tail -f /usr/local/tomcat/logs/catalina.out");
}

/**
 * 指定の文字列を待つ
 * @param connection 接続先
 * @param command 待機する文字列
 */
function wait(connection, command) {
	Thread.Sleep(10);
	var res = connection.ReceiveData();
	while(res.indexOf(command) == -1) {
		Thread.Sleep(10);
		res += connection.ReceiveData();
	}
}

/**
 * コマンドを送信する
 * @param connection 接続先
 * @param command 送信するコマンド
 */
function sendln(connection, command) {
	connection.TransmitLn(command);
}
```
swiftで文字列を比較する

##文字列を比較する
if文などで文字列を比較したいとき、いままでは以下のように　isEqualToString:　を
使っていました。

```objc
NSString *aStr = @"hoge";
if([aStr isEqualToString:@"hoge"){
     NSLog(@"同じ文字！")
}
```

Swiftでは数値などと同じく == でOKです。

```swift
var aStr:String = "hoge"
if aStr == "hoge" {
     println("同じ文字！")
}
```
Yconnect sample.php "UserInfo Request"で停止

Yconnect sample.php　において

Access Token Request
Verification ID Token
までは動作しますが、

```php
$client->requestUserInfo( $client->getAccessToken() );
```

でストップしてしまいます。
例外`OAuth2ApiException`でも拾えない状況です。

何か考えられる事がありましたらご教示下さい。
Gitの簡単な使い方


なんか今更感があるが、gitの使い方を自分の備忘のため記載しておく。

## 背景
今までsubversionを自分で構築とかはしていたが、使うときは常にTortiseSVN経由で使っていたのでcliが前提であるgitに慣れず毛嫌いしていたが、今回を機に使いこなしたい。

gitは既にインストール済みであることを前提とする。

環境は以下。

* git: version 1.7.9.5

## リポジトリが既にある場合
gitの共有リポジトリが既にある場合の、ローカルへのリポジトリのclone、branch作成、commit、merge、pushのやり方を記載しておく。

### Step1: Git Clone
以下のコマンドで共有リポジトリのcloneを作成して、ローカルにgitのリポジトリを作成する。

```cmd:git_clone
$ git clone https://${git_server}/${my_repo}
$ ls
${my_repo}
```

### Step2: Branch作成
以下のコマンドでローカル/共有リポジトリの`branch`一覧を確認できる。

```cmd:git_branch
$ git branch # ローカルのbranch一覧を表示
* master
$ git branch -r # リモートのbranch一覧を表示
  origin/HEAD -> origin/master
  origin/maintenance
  origin/master
```

ローカルの`branch`は`master`しかないことがわかる。
このまま`master`に変更を追加していってもいいのだけれど、常にリリースとか人に渡せる状態のソースの版があった方がいいと思い、それを`master`にしよう！って思った。

というわけで、新しい機能を開発するときは`master`に影響しないように開発し、試験が終了したら`master`に反映するという形にする。

以下のコマンドで`dev_funcA `という`branch`を作成する。

```cmd:git_create_branch
$ git checkout -b dev_funcA master
$ git branch
* dev_funcA
  master
```

今いる`dev_funcA`という`branch`が作成され、今いる`branch`が`dev_funcA`であることを確認する。

### Step3: 開発
機能Aを黙々と開発！
開発が終了したら`dev_funcA`にコミットする。

```cmd:git_commit
$ git add . #.gitignoreに設定されているもの以外の全ての変更をindexに登録。
$ git commit
```

### Step4: Merge
機能Aの開発が終了したら、共有リポジトリにマージしたい。
まずは共有リポジトリにされている変更をローカルの`master`リポジトリに反映させる。

```cmd:git_pull
$ git checkout master # master branchに移動
$ git branch
  dev_funcA
* master
$ git pull # 共有リポジトリの変更反映
```

ローカルの`master branch`を最新化したあとに、`dev_funcA  branch`の内容をマージする。

```cmd:git_merge
$ git merge dev_funcA
```

### Step5: Push
ローカルの`branch master`の内容を共有リポジトリに反映させる。

```cmd:git_push
$ git push
```

以上で、ローカルで開発した内容を共有リポジトリに反映させることができた・・・はず。

## リポジトリがまだない場合
工事中。。。
Scalaで型消去を回避する


詳しいことはこちらを参照 => [型タグとマニフェスト](http://docs.scala-lang.org/ja/overviews/reflection/typetags-manifests.html)

クラスや関数で実行時に指定される抽象型の情報は、Javaの型消去により判定できなくなってしまう。

例えば以下のScalaコードでは、型`T`の情報はコンパイル時に消えている。

```scala
class A
class B extends A
class C extends A

def isType[T <: A](a: A) = a.isInstanceOf[T]
// <console>:9: warning: abstract type T is unchecked since it is eliminated by erasure
//        def isType[T <: A](a: A) = a.isInstanceOf[T]
//                                                 ^
// isType: [T <: A](a: A)Boolean
```

型消去により意図しない挙動になる可能性があることは、コンパイル時の警告でチェックできる。

実際に動作させてみても、型の検出はできない。

```
scala> isType[A](new A)
res11: Boolean = true

scala> isType[C](new B)
res12: Boolean = true  // 本当は (new B).isInstanceOf[C] => false
```

## ClassTagで型情報を保持する

Scalaの場合、暗黙のパラメータで型の情報を保持することができる。

```scala
def isType[T <: A](a: A)(implicit e: scala.reflect.ClassTag[T]) = e.runtimeClass.isInstance(a)
//=> isType: [T <: A](a: A)(implicit e: scala.reflect.ClassTag[T])Boolean
```

処理中に`e.runtimeClass`を使って具体的な `Class[T]` を取得し、リフレクションで型チェックを行っている。

```scala
scala> isType[C](new B)
res13: Boolean = false
```

## context boundを使う

型パラメータ自体に context bound というシンタックスシュガーが用意されている。

```scala
import scala.reflect.ClassTag

def isType[T <: A : ClassTag](a: A) = implicitly[ClassTag[T]].runtimeClass.isInstance(a)
```

定義している内容としては暗黙のパラメータと同じだが、引数の名前が無く、代わりに暗黙の値を `implicitly` で取得する事ができる。

## パターンマッチに使う

`implicitly` を使って型情報を取得しなくても、パターンマッチで型チェックをすると自動的に処理してくれるようだ。

```scala
import scala.reflect.ClassTag

def isType[T <: A : ClassTag](a: A) = a match {
  case t: T => true
  case _ => false
}
```

個人的にはこれがシンプルで好み。
IpMessenger死活監視とメッセージ送信クライアント作った(php)


Socketプログラミングは初めて。添削希望。

# socket形式

参考 [IP Messenger プロトコルメモ.](http://smart-pda.net/isourou/ipmsg/doc/ipmsg_protocol.html)

* (そのPCが知っている)IPMessengerを利用しているクライアント一覧を問い合わせ
  * `1:100:username:pcname:18:0`

* メッセージ文`hello_world`を送信
  * `1:100:username:pcname:32:hello_world`

# 処理の流れ

1. udp://target_ip, port 2425のsocketを生成
1. target_ipのIpMessengerに、username,pcnameを名乗り、target_ipさんが知っているクライアント一覧が欲しいと言う。
1. target_ipさんからクライアント一覧をもらうが、死活監視がしたいだけなのでとりあえず1バイトだけもらっとく。
1. 取得結果のok,ngを送信


# IpMessengerクラス

```php:ipmessenger.php
<?php
class IpMessenger {
  const IPMSG_GETLIST = '18';
  const IPMSG_SENDMESSAGE = '32';
  const STREAM_TIMEOUT = 3; //second

  private $target_ip;

  public function set_target_ip($ip) {
      $this->target_ip = $ip;
  }

  private function connect() {
      $fp = fsockopen('udp://'.$this->target_ip, 2425);
      stream_set_timeout($fp, self::STREAM_TIMEOUT);
      return $fp;
  }

  public function connect_check() {
      $fp = self::connect();
      fwrite($fp, "1:100:username:pcname:".self::IPMSG_GETLIST.":0");
      $data_length = 1;
      if(!fread($fp, $data_length)) {
          return false;
      }
      return true;
  }

  public function send_message($message_utf8) {
      $fp = self::connect();
      $message_sjis = mb_convert_encoding($message_utf8,"sjis","utf-8");
      fwrite($fp, "1:100:username:groupname:".self::IPMSG_SENDMESSAGE.":".$message_sjis);
  }
}
```

# 使い方

* 192.168.100.45 : phpを実行する端末
* 192.168.100.68 : チェックしたいIPMessengerの端末
* 192.168.100.67 : 結果をIPMessengerで受け取る端末

```php:main.php
<?php
require_once('ipmessenger.php');

$ipmsg = new IpMessenger();
$ipmsg->set_target_ip('192.168.100.68');
if($ipmsg->connect_check()) {
    $ipmsg->set_target_ip('192.168.100.67');
    $ipmsg->send_message("日本語でもOK");
} else {
    $ipmsg->set_target_ip('192.168.100.67');
    $ipmsg->send_message("ng");
}
```


# 実行

```bash:実行
php main.php
```

* 192.168.100.68 の IPMessengerの応答があるとき、192.168.100.67 へokを送る

![スクリーンショット 2014-08-13 16.02.34.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ceb60cec-4e05-6988-3dfe-788bd588f4c2.png "スクリーンショット 2014-08-13 16.02.34.png")
 
* 192.168.100.68 の IPMessengerの応答がないとき、192.168.100.67 へokを送る

![スクリーンショット 2014-08-13 16.02.18.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2f6db783-7d1b-4333-2251-a40f2c6b99b4.png "スクリーンショット 2014-08-13 16.02.18.png")
【Cocos2dx、c++】enumのインクリメント

以下の様なenumの時

`enum kStatus{
　　kStatusNone = 0,
　　kStatus0,
　　kStatus1,
　　kStatus2,
　　kStatusCount
};
kStatus currentStatus = kStatusNone;`

このcurrentStatusをインクリメントする場合

`this->currentStatus++;`

だと怒られるので以下で。

`this->currentStatus = static_cast<kStatus>(this->currentStatus + 1);`

もっといい方法あるかな。
Windows7→[VMware]→Ubuntu1204 共有フォルダが見えなくなった時の対処方法

Ubuntu側から /mnt/hgfs/　以下に設定した共有フォルダが見えなくなったら、
vmware-tools-distribを再インストールすればいいらしいが、
うまくいかないのでアンインストール→インストールしたことを忘れないようにメモ。

##0 好きなところに解凍
tar xvzf /media/VMware Tools/VMwareTools-x.x.x-xxxxxxx.tar.gz -C /usr/src

##1 再インストールのパターン
sudo ~/vmware-tools-distrib/bin/vmware-config-tools.pl

##2-1 アンインストール
sudo ~/vmware-tools-distrib/bin/vmware-uninstall-tools.pl

##2-2 インストール
sudo ~/vmware-tools-distrib/vmware-install.pl
ObjectiveCで記述されたweak変数にswiftからObjectを渡すときはNSObjectを継承しておかないといけない？


はじめに
====

Xcode6-beta5 で、
**従来のObjectiveCで書かれたコードにSwift側からDelegate Objectを渡したのに何故かnilになる** という現象に遭遇しました。
ObjectiveC側で weak ref でObjectを保持している場合、 **明らかに set しているのに直後にはnil** になっています。
悩んだ結果、よくわからないけど **Swift側のObjectがNSObjectを継承しておけば良さそう** です。


下記のStackOverflowも参考になると思います。
http://stackoverflow.com/questions/24824753/delegate-not-getting-set

以降、検証結果です。

検証
=====

ObjectiveC 側
--------------

`delegate` という Propertyを weak で保持するだけのObjectとします。

```objectivec:SpikeWeakref.h
@interface SpikeWeakref : NSObject
@property (weak) id delegate;
@end
```

```objectivec:SpikeWeakref.m
#import "SpikeWeakref.h"

@implementation SpikeWeakref
@end
```

Swift側の検証コード
---------
先ほどの ObjectiveC側のdelegate プロパティに、

* **普通の** Swift Class Object
* **@objc** を付けた Swift Class Object
* **NSObject** を継承した Swift Class Object

の３つをsetして、その直後getしてログに出力します。
普通であれば、如何に weakとはいえ nil にはなっていないはずです。

```
class SwiftObject {}

@objc class SwiftObjectAtObjcAnnotation {}

class SwiftObjectExtendsNSObject : NSObject {}

class SpikeMain {
    let normal = SwiftObject()
    let annotation = SwiftObjectAtObjcAnnotation()
    let nsobject = SwiftObjectExtendsNSObject()
    
    func main() {
        let child = SpikeWeakref()
        
        child.delegate = normal
        logger.debug("child.delegate (SwiftObject): \(child.delegate)")

        child.delegate = annotation
        logger.debug("child.delegate (SwiftObjectAtObjcAnnotation): \(child.delegate)")

        child.delegate = nsobject
        logger.debug("child.delegate (SwiftObjectExtendsNSObject): \(child.delegate)")

        child.delegate = SwiftObjectExtendsNSObject()
        logger.debug("child.delegate (instant SwiftObjectExtendsNSObject): \(child.delegate)")
        
        var z = SwiftObjectExtendsNSObject()
        child.delegate = z
        logger.debug("child.delegate (temp var of SwiftObjectExtendsNSObject): \(child.delegate)")
        
        
        let childSwift = SpikeWeakrefSwift()
        childSwift.delegate = normal
        logger.debug("childSwift.delegate (SwiftObject): \(child.delegate)")
    }
}


class SpikeWeakrefSwift {
    weak var delegate: AnyObject?
}
```


実行結果
------

以下のようになります。

```
child.delegate (SwiftObject): nil
child.delegate (SwiftObjectAtObjcAnnotation): nil
child.delegate (SwiftObjectExtendsNSObject): <XXXX.SwiftObjectExtendsNSObject: 0x7fdc4ca24c30>
child.delegate (instant SwiftObjectExtendsNSObject): nil
child.delegate (temp var of SwiftObjectExtendsNSObject): <XXXX.SwiftObjectExtendsNSObject:0x7fdc4a70b000>
childSwift.delegate (SwiftObject): <XXXX.SwiftObjectExtendsNSObject: 0x7fdc4a70b000>
```

まとめると以下のようになります

#### **普通の** Swift Class Object  
直後に **nil** になる

#### **@objc** を付けた Swift Class Object
直後に **nil** になる

#### **NSObject** を継承した Swift Class Object
Objectがあることが確認できる

#### **NSObject** を継承した Swift Class Object を 直接delegateにsetした場合
直後に **nil** になる

#### **NSObject** を継承した Swift Class Object を Local変数に代入した後 delegateにsetした場合
Objectがあることが確認できる

#### Swift Class が weak ref で delegate を持っている場合に普通のSwift Class Objectをsetした場合
Objectがあることが確認できる

さいごに
=====

これが本来の仕様だとすると、結構気をつけないと危ないかもしれません。
OS X で PhpStorm で Composer 使って CakePHP 2.5 入れてあとテスト


# 内容

- PhpStorm で Composer を使ったプロジェクトを作りたい
- CakePHP のテストを PhpStorm の標準機能で実行したい(こっちは普通に unok さんの[IntelliJ IDEA から cakephp の test を実行する方法(PhpStorm でも多分大丈夫)](http://unok.hatenablog.jp/entry/2013/03/06/105109)を読んだ方がいいかも)

# 書いてる人

- 昔 PHP やってて久しぶりに触ったけど(当時使ってたのは Zend) CakePHP はドキュメント読んでチュートリアルやったくらいの初心者
- 普段は強いていえば python の人なので Composer とか使ったことない

# 環境的なもの

- Mac OS X 10.9.4
- PhpStorm 7.1.3
- PHP 5.4.24
- Composer (PhpStormの設定画面でダウンロードしたのでバージョン分からん)
- PHPUnit 3.7.37
- CakePHP 2.5.3

# PhpStorm で Composer を使ったプロジェクトを作りたい

Composer 自体は PhpStorm の環境設定の PHP -> Composer でダウンロードしておく。

あとは新規プロジェクト作るときのプロジェクトタイプで **Composer project** を選んで cakephp/cakephp を入れておけばおk。(OSX 10.8/10.9 で mcrypt.so 入れてなくてエラーになる場合は http://topicdesk.com/downloads/mcrypt のパッケージでインストールが楽でした)

あとは yukisov さんの [Composerを利用したCakePHP2.4.xの導入手順](http://www.pupha.net/archives/1751/) を参考にすればきっとなんとかなります。

以下のような composer.json を作って環境設定のとこでこのファイルを指定。以下は yukisov さんのをコピペしてバージョンあげただけですけど repositories とかいるのかよく分かってません。ポイントは **PHPUnit を 3.7台にすること**。PhpStorm だと PHPUnit4 に対応してないっぽいので。

```json:composer.json
{
    "name": "namwa",
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear.cakephp.org"
        }
    ],
    "require": {
        "cakephp/cakephp": "2.5.3",
    },
    "require-dev": {
        "phpunit/phpunit": "3.7.37",
        "cakephp/debug_kit" : "2.2.*"
    },
    "config": {
        "vendor-dir": "Vendor/"
    }
}
```

ただこの composer.json の通りにライブラリをインストールする PhpStorm 的な方法がいまいち分からないのでとりあえず Tools -> Composer -> Add dependency... で PHPUnit インストールしたりすれば反映されます(ただ PHPUnit は当然 require-dev から require にうつっちゃう)。もっとまともなやり方多分ありますよねこれ。。素直にコマンドラインでインストールすべきなのかな。

# CakePHP のテストを PhpStorm の標準機能で実行したい

ブートストラップというか1つスクリプトをはさまないと自分の使ってるバージョンでは PhpStorm からテストが実行できませんでした。具体的には以下を使いました。

https://github.com/shineli/CakePHPStorm/blob/master/cakeunit4phpstorm.php

これをプロジェクトの一番上に置きます。上の yukisov さんのやり方に合わせたディレクトリ構造にしてるのでこうなります。

* プロジェクトのディレクトリ
	* App
		* Test
	* Plugin
	* Vendor
	* cakeunit4phpstorm.php

ただこれだとなんかうまく動かなかったので、定数をセットしている部分についてブラウザから実行した時にデバッグツールバーに表示されるものと合わてみました。cakeunit4phpstorm.php を4行修正します：

```php
# あとは34行目をこうして
    define('APP_DIR', 'App');
# 37行目をこうして
    define('WEBROOT_DIR', 'webroot');
# 40行目をこうして
    define('WWW_ROOT', ROOT . DS . APP_DIR . DS . WEBROOT_DIR . DS);
# 44行目をこう!
        ini_set('include_path', ROOT . DS . 'Vendor' . DS . 'cakephp' . DS . 'cakephp' . DS . 'lib' . PATH_SEPARATOR . ini_get('include_path'));
```

あとは Run/Debug Configurations で PHPUnit を選び、

|設定項目              |値                                 |
|---------------------|-----------------------------------|
| Directory           | `Appディレクトリへのパス`             |
| Test Runner options | `Test/Case/AllTestsTest.php`      |
| Interpreter options | `-f cakeunit4phpstorm.phpへのパス` |


を設定すれば PhpStorm でテストが実行できると思います。

# 終わりに

このポストを書きながら unok さんの一年以上前に書かれた [IntelliJ IDEA から cakephp の test を実行する方法(PhpStorm でも多分大丈夫)](http://unok.hatenablog.jp/entry/2013/03/06/105109) という記事を見つけました。試してないけど最初からこの記事読めば良かった説…まあ自分のはこういうやり方もありましたということで。。

そして書きながら PhpStorm 8 だと Behat という BDD フレームワークのサポートが入るらしいことを知りました。いい加減 PHPUnit 以外も使ってみないとなあ…
AWSのCloud Watchでディスク使用量を監視


## Amazon CloudWatch Monitoring Scriptsのインストール

* /opt/aws配下にインスールを想定

	cd /opt/aws
	wget http://ec2-downloads.s3.amazonaws.com/cloudwatch-samples/CloudWatchMonitoringScripts-v1.1.0.zip
	unzip CloudWatchMonitoringScripts-v1.1.0.zip
	rm CloudWatchMonitoringScripts-v1.1.0.zip
	cd aws-scripts-mon/

## awscreds編集

	cp awscreds.template awscreds
	vim awscreds
	
	AWSAccessKeyId=xxxxxxxxxxxxx
	AWSSecretKey=xxxxxxxxxxxxx

* AWSAccessKeyIdとAWSSecretKeyを設定する

## テスト用のコマンド実行

/dev/hoge のディスク容量を監視することを想定しています。
	
下記のコマンドを実行


	./mon-put-instance-data.pl --disk-space-util --disk-path=/dev/hoge --verify --verbose --aws-credential-file=/opt/aws/aws-scripts-mon/awscreds



### --verif

	メトリックスを収集するスクリプトのテストを実行し、完全な HTTP リクエストを準備します。ただし、実際に CloudWatch コールを実行して、データをレポートしません。また、このオプションは、認証情報が提供されているかどうかもチェックします。このオプションを冗長モードで実行すると、CloudWatch に送信されるメトリックスを出力します。
	
### --verbose

	スクリプトが実行する内容についての詳細情報を表示します。

### --aws-credential-file=PATH

	AWS 認証情報が格納されているファイルの場所を指定します。

## cronに設定
上記コマンドが問題がなければ、cronに設定する。

	crontab -e

	*/5 * * * * /opt/aws/aws-scripts-mon/mon-put-instance-data.pl --disk-space-util --disk-path=/dev/hoge --aws-credential-file=/opt/aws/aws-scripts-mon/awscreds


これで、5分間隔で、cloudwatchにデータが収集されます。
MetricsはLinux System > Filesystem,InstanceId,MountPathとして登録されます。

あとは、適宜アラートを設定するなどして利用する。
INSTALL_REFERRERのインテントをアプリに送信


テストで送信する場合によく使うのでメモ. `hogehoge`部分がreferrerデータです. 
`--include-stopped-packages`はAndroid 3.1以降に追加されたオプションなので3.1以前の端末では不要です

```shell
adb shell am broadcast -a com.android.vending.INSTALL_REFERRER --include-stopped-packages --es referrer hogehoge
```
PHPのコーディングスタイルをPHP_CodeSnifferで修正する

PHP_CodeSnifferはPHPのコーディングスタイルをチェックするツールとして有名ですが、現在開発中の2.0系ではチェックだけでなく修正もできるようです。

[Fixing Errors Automatically · squizlabs/PHP_CodeSniffer Wiki](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Fixing-Errors-Automatically)

# インストール

2.0系ではpharも提供されているので、 https://github.com/squizlabs/PHP_CodeSniffer/releases からphpcs.pharとphpcbf.pharをダウンロードしましょう。

```
$ curl -LO https://github.com/squizlabs/PHP_CodeSniffer/releases/download/2.0.0RC1/phpcs.phar

$ curl -LO https://github.com/squizlabs/PHP_CodeSniffer/releases/download/2.0.0RC1/phpcbf.phar
```

# 使い方

チェックはphpcs.pharで行います。

```
$ cat test.php
<?php
if($a==2)
    echo $a;
else
    echo '3';


$ php phpcs.phar --standard=PSR2 test.php

FILE: C:\Users\ishida\src\test.php
--------------------------------------------------------------------------------

FOUND 7 ERRORS AFFECTING 4 LINES
--------------------------------------------------------------------------------

 1 | ERROR | [x] Expected 1 space after closing brace; 0 found
 2 | ERROR | [x] Expected 1 space after IF keyword; 0 found
 2 | ERROR | [x] Inline control structures are not allowed
 2 | ERROR | [x] Whitespace found at end of line
 4 | ERROR | [x] Expected 1 space after ELSE keyword; newline found
 4 | ERROR | [x] Inline control structures are not allowed
 5 | ERROR | [x] Expected 1 blank line at end of file; 2 found
--------------------------------------------------------------------------------

PHPCBF CAN FIX THE 7 MARKED SNIFF VIOLATIONS AUTOMATICALLY
--------------------------------------------------------------------------------


Time: 90ms; Memory: 2.5Mb

$ php phpcs.phar --standard=PSR2 --report=diff test.php
--- test.php
+++ PHP_CodeSniffer
@@ -1,6 +1,6 @@
 <?php
-if($a==2)
+if ($a==2) {
     echo $a;
-else
+} else {
     echo '3';
-
+}
```

修正はphpcbf.pharで行います。

```
$ php phpcbf.phar --standard=PSR2 test.php
Patched 1 file
Time: 182ms; Memory: 2.5Mb

$ cat test.php
<?php
if ($a==2) {
    echo $a;
} else {
    echo '3';
}
```

面白い機能としては、誰が問題を混入したかを調べるgitblameという（またはsvnblame、hgblame）レポート形式があります。

```
$ php phpcs.phar --report=gitblame src

PHP CODE SNIFFER GIT BLAME SUMMARY
--------------------------------------------------------------------------------

AUTHOR                                              (Author %) (Overall %) COUNT

--------------------------------------------------------------------------------

ISHIDA Akio                                            (16.18)       (100)    11

--------------------------------------------------------------------------------

A TOTAL OF 11 SNIFF VIOLATIONS WERE COMMITTED BY 1 AUTHOR
--------------------------------------------------------------------------------


Time: 164ms; Memory: 2.75Mb
```

はい。本当に申し訳ありませんでした！

なお似たようなことを行うツールとして、[PHP Coding Standards Fixer](http://cs.sensiolabs.org/)もあります。
VBAでDOSコマンド

# 概要
VBAでDOSコマンドを使う方法

# 内容
- `run()` は非同期実行の為、`exec()`で同期実行します。
- 取得情報が長い場合は、一度`wExec.StdOut.ReadAll`を実行しないとフリーズしました。

## ソース
### DOSコマンド実行関数

```vbnet
Function getCmd(sCmd As String) As String()
    Dim WSH, wExec, Result As String
    Set WSH = CreateObject("WScript.Shell")
    Set wExec = WSH.Exec("%ComSpec% /c " & sCmd)
    
    tmp_str = ""
     Do
        tmp_str = tmp_str & wExec.StdOut.ReadAll
        DoEvents
     Loop While wExec.Status = 0
    
    getCmd = Split(tmp_str, vbCrLf)
    
    Set wExec = Nothing
    Set WSH = Nothing
End Function

Sub main()
    dirs = getCmd("echo hello")
End Sub
```

## DOSコマンド
これを実行する為に作成しました。
### 
|コマンド|内容|
|:-:|:-:|
|dir /b/s/a-d| 再帰的にファイル取得※|

※dirコマンドの引数

|引数|内容|
|:-:|:-:|
|/b|ファイル名のみ表示|
|/a-d|フィルタ ( -d でフォルダ除外 ) |
|/s|再帰的|


# 参考
http://officetanaka.net/excel/vba/tips/tips27.htm
Thunderbirdに定型句を挿入する。


Quicktext を導入しました。

<https://addons.mozilla.org/ja/thunderbird/addon/quicktext/>


下記のような、定型を用意しておけば、ワンクリックで定型句が挿入されます。
社内用、社外用などグループかもできてい便利です。

	様

	お疲れ様です。〇〇です

	以上、宜しくお願い致します。
MongoDBのセキュリティ「べからず」集の要約

MongoDBのセキュリティ「べからず」集的なものがあったため、要約してみました。

原文：http://blog.mongodb.org/post/87691901392/mongodb-security-part-ii-10-mistakes-that-can

## MongoDBのセキュリティ「べからず」集の要約

### 1. MongoDBのサーバを直接インターネットにさらす
ちゃんとFWの中に入れるなり、前にサーバを置くなりしよう。

### 2. アクセスコントロールをしない
MongoDBにはロールベースアクセスコントロールがあります。これを使って、ユーザ毎にアクセスできるDBや操作を制御すべきでしょう。

### 3. SSLを使わない
MongoDBドライバ - mongod(s)間をSSLしましょう。

### 4. 不必要なインターフェースを公開する 
HTTP,REST,JSONPインターフェースは使わないなら止めましょう。

### 5. ユーザのアカウント管理がずさん
2でアクセスコントロールを有効にしても、何でもできるユーザを作って使わせてはダメ。ちゃんと、最少な権限だけ与えましょう。

### 6. OSのパワーユーザで動かす
Linuxならrootでmongodやmongosを動かすなってことです。

### 7. レプリカセットキーファイルを使わない
プリカ同士で相手を認証するキーファイルをちゃんと使いましょう。

### 8. SSLの設定がしょぼい
3.でSSLを使ったとしても、オレオレ証明書などしょぼいSSLはダメ。

### 9. バックアップが無防備
バックアップもファイル自体は簡単に復元できるので、バックアップも本体同様のセキュリティレベルにすべし。

### 10. セキュリティの知識が乏しい
機密情報を格納するならば、リリース前にセキュリティのホワイトペーパとかが出てるから読みましょう。

## 所感

特に目新しいことは無く、「当たり前のことをちゃんやるように」と書いてあるように思えました。

また、当然全部やればよいというわけではなく、要件に照らし合わせることが必要でしょう。たとえば、VPNがあるのにSSLを使う必要はないです。他にも、MongoDBをキャッシュ層としてつかうのであれば、インターネットにさらすことが必須になる場合もあるでしょう。

あと、javascriptを無効にするオプションがあるので、それがインジェクション対策として入ってもよいかなと思いました。
EclipseでのAndroid開発で、ライブラリの管理をGradleに任せる

Android アプリを Eclipse で開発する場合、使用するサードパーティーのライブラリ（jar）は、 `libs` フォルダの下に配置しなければならない。

しかし、 Gradle の dependencies に依存関係を追加しただけでは、 jar は `libs` の下には配置されない。
つまり、 Eclipse からはライブラリが参照できず、実装ができない。

そこで、依存ライブラリの jar を `libs` の下にコピーするタスクを追加することで対応する。

#build.gradle を修正する
プロジェクトを右クリックして、「エクスポート」→「Android」→「Generate Gradle build files」を選択し、画面の指示に従って build.gradle を出力。

以下の要領で build.gradleを修正する。

```groovy:修正前
dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}
```

```groovy:修正後
repositories {
    mavenCentral()
}

dependencies {
    compile files('libs/android-support-v4.jar')
    compile 'org.roboguice:roboguice:2.0'
}

task copyLibs(type : Copy) {
    configurations.compile.each {
        from it.toString()
        into 'libs'
        exclude {
            new File('libs', it.name).exists()
        }
    }
}
```

`copyLibs` タスクは、 `compile` で指定している依存ライブラリを `libs` の下にコピーする。
ただし、既に `libs` の下に配置されているライブラリについてはコピー対象外にしている。

また、自動生成された build.gradle では、 `libs` フォルダ直下の全ての jar を参照するように dependencies が設定されている。
これをそのままにしていると、追加した依存関係と `copyLibs` タスクで配置した jar が重複してしまい気持ち悪い。
なので、デフォルトの記述は削除し、最初から配置されている `android-support-v4.jar` だけを参照するように変更している。

あとは、依存関係を追加したら、都度 `copyLibs` タスクを実行すればいい。

#参考
- [Nodeclipse - Node.js Tooling with Eclipse](http://www.nodeclipse.org/projects/gradle/android)
- [how to include gradle dependencies in eclipse - Stack Overflow](http://stackoverflow.com/questions/19194362/how-to-include-gradle-dependencies-in-eclipse)
- [第16章 ファイルを取り扱う | Gradle User Guide](http://gradle.monochromeroad.com/docs/userguide/working_with_files.html)
正規表現にマッチした文字だけ設定を変える

　今回はテキストフレームの文字列を正規表現で検索してマッチした文字だけ設定を変更するTipsです。まあ、すでにInDesignの検索置換メニューで正規表現による検索や文字の設定の変更なんかもできるのであまり用はないかもしれませんが、自動処理の中で何か「ちょっと処理したいなあ」なんて時には使えるやもしれません。

　サンプルのスクリプトでは半角数字を検索して長体（80%）を当てています。設定するcharactorsを取得するにはitemByRangeを利用。いやー、itemByRangeって便利ですよねー。

　とりあえず開いてるドキュメントにあるテキストフレームの配列０番目のものを処理しておりまする。エラー処理なんかもはしょってますのでそこらへんは、参考にしないようにね。
 実行するとこれ↓が
![100en100.png](https://qiita-image-store.s3.amazonaws.com/0/4000/92817e30-d7ac-2a0e-c082-c24b1ec2e442.png)
↓こうなるよ
![100en80.png](https://qiita-image-store.s3.amazonaws.com/0/4000/74220731-cb00-0ead-f268-dea1bfd5c92a.png)
※実行するとフレーム内の数字が全部変わるので「カムバッーク、100円」の100も80%になっております

```javascript:
//テキストフレームにある数字に長体80％をかける
function NumChg(myBox) {
	var myParagraphs = myBox.paragraphs;

	for(var i = 0; i < myParagraphs.length; i++) {
		var txtObj = myParagraphs.item(i).contents;
		var regexp = new RegExp("[0-9]+");
		var startPos = txtObj.search(regexp);

		while (startPos != -1) {
			var matchStringLen = RegExp.lastMatch.length;

			myParagraphs.item(i).characters.itemByRange(
				startPos,
				startPos + matchStringLen - 1
			).horizontalScale = 80;
			startPos = txtObj.search(regexp);
		}
	}
}

NumChg(app.activeDocument.textFrames[0]);
```
VBAで結合セルを検索

# 概要
VBAで結合セルを検索した場合に見つからなかった場合

# 内容
SearchOrderが、xlByRowsとxlByColumnsを変えたら検索できるようなりました。
詳しい事は不明です。

### ソース
```vbnet
sub main()
    call.Cells.Find(What:="記号", SearchOrder:=xlByRows)
end sub
```
zshでfpathからwhichのように検索する

`${^fpath}/cdr(N)` のように書けばいいです。

詳細や `${^path}/ruby(N)` や `(( ${+commands[peco]} ))` なども含めた話は [zshでfpathからwhichのように検索する話など](http://blog.n-z.jp/blog/2014-08-12-zsh-which-fpath.html) に書きました。
Poltergeist で keyup イベントを発火させたい

これでは keyup イベントが発火しない。

```rb
fill_in 'my_id', :with => "Hello"
```

とりあえず以下の方法で keyup イベントが発火した。
もっといい方法があるかもしれないけれども。

```rb
page.find("#my_id").native.send_keys('Hello')
```
view コマンドを Emacs の read-only mode にする

#動機
ファイルを眺めたいだけって時多いと思う。
less とか more とか cat で見ればいいじゃんって思うかもしれないけど、普段使い慣れているEmacsでみたいじゃん。
普通にEmacs で開けばいいじゃんって思うかもしれないけど、間違えて編集しちゃうことあるじゃん。
M-x toggle-read-only すればいいじゃんって思うかもしれないけど、コマンドラインからぴゃっと開きたいじゃん。

#置き換える

```zsh
function read_only_emacsclient() {
    emacsclient -t -e "(find-file-read-only \"$1\")"
}
alias view='read_only_emacsclient'
```
普段 emacsclient を使っているので、このように view コマンドを置き換えました。

#参考URL
http://qiita.com/k_ui/items/609681b9635e5563d4a9
【Cocos2dx 3.0】ゴゴゴゴゴゴゴゴッ

NodeやSpriteをゴゴゴゴゴゴ！って上下にぶれながら横に動かす

**上下の動き**

`{
　　MoveBy *move0 = MoveBy::create(0.05f, Vec2(0, 5));
　　MoveBy *move1 = MoveBy::create(0.05f, Vec2(0, -5));
　　RepeatForever *repeat = RepeatForever::create(Sequence::create(move0, move1, NULL));
　　obj->runAction(repeat);
}`

**横へ移動** 

`{
　　MoveBy *move = MoveBy::create(2.0f, Vec2(100, 0));
　　obj->runAction(move);
}`
[Github]pull requestを自動mergeできない時にrebaseで解消したい


pull requestで自動mergeが出来ないときにgithubの指示だとmasterにmergeして、最終的に```git push origin master```やってて気持ち悪い。git rebaseで解消してちゃんとpull requestからmergeされるようにしたい。

```
git checkout master
git pull origin master
git checkout branch_name
git rebase master

# conflictが起きてるところを修正

git add .
# ここでcommitはしない事！

git rebase --continue
git push -f origin branch_name
```

```git push -f```やってるのも気持ち悪いですが、pull requestの中のレビュー等のやり取りも全部残ってるしいいかなと。
【Cocos2dx、c++】指定範囲のfloat乱数取得

■float値をランダムで指定範囲内の数値を返すマクロ

‪`#‎define‬ RAND_FLOAT(LO, HI) LO + static_cast <float> (rand()) /( static_cast <float> (RAND_MAX/(HI - LO)))`

■使い方

`float hoge = RAND_FLOAT(1.0, 3.0);`

※1.0〜3.0の値が返ってくる
ubuntu serverにawesomeとslimを入れた

* [awesome (日本語) - ArchWiki](https://wiki.archlinux.org/index.php/Awesome_(日本語))

`man awesome`でショートカットキー一覧が見れます。

# インストール

```bash:
sudo apt-get install -y slim awesome xinit virtualbox-guest-utils
sudo apt-get install -y suckless-tools
sudo apt-get install -y firefox firefox-locale-ja fcitx-mozc
reboot
```

* `im-config`を使うと かな|英数 日本語入力できるようになりました。
* dmenuはsuckless-toolsに含まれています。

awesomeではchromiumよりfirefoxの方が良い。

* `command + f`でフルスクリーンにした後、`ctrl + l`でアドレスバーが表示される。

# slimの設定

```diff:/etc/slim.conf
+ default_user        vagrant
+ auto_login          yes
```

# awesomeの設定

```bash:雛形のコピー
cp -p /etc/xdg/awesome/rc.lua .config/awesome/rc.lua
```

```diff:rc.lua
    awful.key({ modkey,           }, "Return", function () awful.util.spawn(terminal) end),
+   awful.key({ modkey,           }, "d", function () awful.util.spawn("dmenu_run") end),
    awful.key({ modkey, "Control" }, "r", awesome.restart),
```

* `awesome -k`でsyntax check
* `Control + Command + r`で awesome のrestart
Railsインストール


@aki1986です。
何回かに分けて「nginx + unicorn + rails」の連携方法を記載していこうと思います。
今回はRailsのインストールまで。

## 背景
監視サイトのダッシュボードを構築することとなり、どうせならrailsでどうせならnginx上で動かすかと思い立ち構築してみた。
ここで記載するのはRailsのインストールだけ。

環境は以下。

* ruby: 2.1.2p95
* Rails: 4.1.4


## Rails編
### Rails Install

RubyGemsが入っている環境で以下のコマンドで、railsをインストールする。

```
$ gem install rails
```

### Railsプロジェクト作成
```
$ mkdir -p ${my_app_parent}
$ cd ${my_app_parent}
$ rails new ${my_app}
```
上記コマンドで`${my_app}`が作成され、Gemfileやらappディレクトリなどが作成される、

### とりあえず動かす。
以下のコマンドでrailsパッケージに含まれているWebrickというWebサーバを起動することができる。

```
$ rails server
```

・・・のはずだが以下のエラーメッセージが表示された。

```
/home/rails/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/execjs-2.2.1/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
```

javascriptの実行環境がないらしい。
Gemfileに以下を追記して`$ bundle install`してやる。

```conf:${my_app}/Gemfile
gem 'therubyracer', '0.12.1'
```

再度`$ rails server`を実行。今度はいったっぽい。

デフォルトでは3000ポートで起動するので、ローカルのブラウザで`http://localhost:3000`にアクセスしてみると以下のような画面が表示されるはず。

![img_first_login.png](https://qiita-image-store.s3.amazonaws.com/0/46472/09ab0ed9-972f-238b-e3ff-bdc2fbbedf84.png "img_first_login.png")

なんか長くなったので、今回はここまで。
次回はnginx連携！
覚えておきたいカーネルパラメータの変更方法


# 概要
カーネルパラメータを変更する機会があったわけですが、全くといっていいほど今まで気にしたことがなかったのでこれを機にカーネルパラメータ周りや ```sysctl``` の使い方を整理してみます。

# sysctl
## 説明
### ```man sysctl``` より抜粋
>sysctl   は カーネルのパラメータを実行時に修正するのに用いる。変更できるパラメータは
       /proc/sys/ 以下にリストされているものである。 Linux における sysctl の機能には  procfs
       が必要である。 sysctl は sysctl データの読み書き両方に使える。

### option について
| option | 意味 |
| :-: | :-:| 
| -n |　キーの名前は表示せず、値だけ表示する |
| -e | 不明なキーについてエラーを無視する |
| -N | 名前のみ表示する |
| -q | 値のセットを標準出力に表示しない |
| -w | sysctl の設定を変更する場合には、このオプションを指定する | 
| -p | 指定されたファイルから読み込んだ内容を sysctl 設定へロード。指定がなければ /etc/sysctl.confから |
| -a | 現在利用できる全ての値を表示 |
| -A | -a に同じ |
 
### コマンド例一覧
* 値のみ表示

```
# sysctl -n net.ipv4.tcp_keepalive_time
7200
```

* 名前のみ表示

```
# sysctl -N net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_time
```

* 設定の変更

```
# sysctl -w net.ipv4.tcp_keepalive_time=100
net.ipv4.tcp_keepalive_time = 100

# sysctl -a | grep keepalive_time
net.ipv4.tcp_keepalive_time = 100
```

* 設定のロード

```
* vim で設定変更してから -p でロード
# vim /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 100
を追記

# sysctl -a | grep keepalive_time
net.ipv4.tcp_keepalive_time = 7200
* まだ反映されていない

# sysctl -p
* 反映

net.ipv4.tcp_keepalive_time = 100
* 一部抜粋、反映された

# sysctl -a | grep keepalive_time
net.ipv4.tcp_keepalive_time = 100
* 反映されていることを確認
```

### /etc/sysctl.conf と /proc/sys 配下の関係
設定変更は ```sysctl``` コマンドを使用して行えますが /proc/sys 配下の管理ファイル群に ```echo 値 > ``` で書き込む形で反映させる方法もあります。

* 例

```
# echo 100 > /proc/sys/net/ipv4/tcp_keepalive_time
# sysctl -a | grep keepalive_time
net.ipv4.tcp_keepalive_time = 100
```

ただし ```/etc/sysctl.conf``` へ書き込んでおらず ```/proc/sys``` 以下のみ変更した場合だと暫定での変更となり再起動後はデフォルトの設定へ戻ってしまいます。恒久的に反映したい際は```/etc/sysctl.conf``` へ設定を記載し ```sysctl -p``` で反映させるのが良いと思います。

sysctl の覚書でした。
カーネルパラメータ1つ1つの覚書もしようと思いましたが数が多いのでまたそのような場面に遭遇したらということで:p
CSS3の参考サイト

【参考用】
CSS3について

・セレクタ参考用(使い方まとめ)
　→　[link]
(http://wp-e.org/2014/05/20/2420/)

・出来ることのサンプル(コード付)が紹介されているサイト
　→　[link]
(http://jsdo.it/event/topics/2011/07/css3showcase)
IEにおけるHTMLのボタンについて

個人的にハマったところのまとめです。



#inputのボタンとbuttonのボタン
機能的な差はあんまりない。装飾できるかできないかの違いくらい。
あとは後述のcss擬似クラス:activeの差くらい。

##inputのボタン
`<input type="button" value="ボタン1">`
type属性に button, submit, reset, image を指定できる。
ボタン内文字列の部分的な装飾はできない。

##buttonのボタン
`<button type="button">ボタン2</button>`
type属性に button, submit, reset を指定できる。
※type属性を省略した場合は**type="submit"**とみなされる。
ボタン内文字列の部分的な装飾ができたり、画像を入れられたりできる。


#buttonとcssの擬似クラス:active

```html:html
<input  class="btn" type="button" value="test1" />
<button class="btn">test2</button>
```
```css:css
.btn{
	background-color: lightgreen;
	border: 1px solid rgb(95, 158, 255);
	width: 100px;
	height: 50px;
}
.btn:active {
	background-color:red;
	border: 1px solid rgb(95, 158, 255);
}
```

擬似クラス:activeは、クリック中などのスタイルを定義することができますが、inputボタンでは文字列上のクリックでは反応しないようです。（もちろん、onclickイベントはどっちのボタンのどこを押下しても反応します。）


![button5.png](https://qiita-image-store.s3.amazonaws.com/0/50098/0964cb42-f0e2-d286-4cc6-a3393d19f25a.png)




#IEブラウザ(互換モード) と buttonデザイン
Windows7のIE8、IE9、IE10　＋ ドキュメントモードで表示の違いを比較してみました。
(ボタンのcssは手を入れていません。デフォルト表示です。)
ブラウザ＋ドキュメントモードによってpadding、borderの数値が異なります。なのでボタンサイズも変わります。
![button.png](https://qiita-image-store.s3.amazonaws.com/0/50098/06440fec-4881-348e-6366-b932e6ae04ac.png)
左側二つはボタンの周り1px分が白くなっていますが、この白い部分までがwidth、heightとして数えられます。
ボタン周りの1pxについての余談：
デフォルトボタンのまま全IEのバージョンでデザインを完璧に統一することは難しいと思われます。
この問題は見た目の差異であり、userAgentによる切り分けも難しいです。ボタン周りが1px白く表示されるのはIE9以下のWindowsベーシックモードとエアロモードのみで、クラシックモードにするとボタンデザインはまた変わります。
統一することに重きを置くなら、デフォルトボタンをやめる、または画像のボタンにする等の対策が有効ではないでしょうか。どっちもできない場合は、この1pxの差異を許容するしかないのでは・・・(ごにょごにょ)。
paddingの差異に関する問題は対策しやすいかもしれません。(私が検証した限りでは)padding;0;にしてもデザインは変わらず、中の文字もちゃんとセンタリングされます。
また、IE8以降からbox-sizingのデフォルト値がborder-box(border,paddingを含んだ幅をwidth,heightとする)からcontent-box(border,paddingを含めない幅をwidth,heightとする)に変わっているようです。
box-sizing: border-box;を指定してwidth,heightをちゃんと指定することで統一することもできると思います。
もしこのほかに何か良い対策案あれば教えてください。

#IEブラウザ(互換モード) と type="submit"
IEのブラウザによって　type=”submit”　の表示と動作が異なります。
**気をつけるべきはIE8.**
**IE8ではhtml上で一番最初にでてくるtype="submit"がセレクトされた状態になる。**
※ボタンが青く強調されているだけの状態をフォーカス、Enterキー押下でonclickイベントが走る状態のことをセレクトと言っています。言葉の意味が違う場合はご指摘ください。
**画面表示後に***(マウスクリックやTabキー押下によるフォーカス・セレクト移動をしない状態で)***Enterキー押下で期待しないonclickイベント***(また、それに伴うonsubmitイベント)***が走ってしまうことがあるので注意が必要。**

![button2.png](https://qiita-image-store.s3.amazonaws.com/0/50098/2b857b38-df53-4e4e-0acb-105d10f29e07.png)

●　図の一番左（IE5、IE7）と一番右（IE10のIE9互換、IE10)はtype=”button”の時と表示は変わらない。画面表示直後にEnterキーを押下しても反応しない。
●　左から2番目（IE8）は画面表示時に一番最初に出てくるtype=”submit”が自動的にフォーカス・セレクトされた状態になる。この状態のままEnterキーを押下するとonclickイベントが走る。IE10のIE8互換モードは、表示はtype=”button”と変わらないがセレクトはされている模様。Enterキー押下でonclickイベントが走る。
●　右から２番目（IE9のIE9）は、IE8同様見た目はフォーカスされた状態であるが、こちらは画面表示直後にEnterキーを押下してもonclickイベントは走らない。
Command-QでVirtualBoxの終了メニューを出させない

参考: [virtualbox.org • View topic - Ignore Command-H and Command-Q?](https://forums.virtualbox.org/viewtopic.php?f=6&t=29695)

![スクリーンショット 2014-08-13 10.06.45.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a6f74078-5e12-b48a-8d1f-b63b9d1c96cb.png)

* `Command+Control+Q`で終了メニュー
* `Command+Control+H`でウィンドウを隠す

という設定にする場合、Macの端末にて以下実施

```bash:
defaults write org.virtualbox.app.VirtualBoxVM NSUserKeyEquivalents \
 '{"Quit VirtualBox VM"="@^q"; "Hide VirtualBox VM" = "@^h";}'
```

VirtualBoxを立ち上げ直し、設定が反映されていることを確認。
ぶつからないびゅー

## ぶつからない？
もちろん、指が自動停止するわけではありません(^^)

画面全体を覆う透明なビューを作成し、そこにボタン等を配置したい場合があります。このような場合、透明ビューのタッチ判定をなくす必要があります。

userInteractionEnabledをNOにすればタッチを無効にできますが、サブビューでタッチを処理できなくなります。そこで、userInteractionEnabledはYESのままにして、hitTestを上書きすることで、親ビューへのタッチを無視しつつ、サブビューへのタッチを処理する事ができます。

```objc
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *hitView = [super hitTest:point withEvent:event];
    if (self == hitView) {
        return nil;
    }
    return hitView;
}
```

## どんな時に使うのか？

何かをフロート表示したい時に直接keyWindowにアクセスせずに、このようなフルスクリーンViewを挟んでおくと非常に楽になります。iOS7,ioS8の回転処理に対する対応も、フルスクリーンViewの中で一元処理できます。

さらに言うと、Status barを含むバージョン、含まないバージョンの両方を用意しておくと、非常に捗ります。これはPoin 1.9系に導入するテクニックです。

おっと、現実逃避はやめてコードを書く時間だ。。。
R で 9 を "09" みたいにパディングする #rstatsj

stringr パッケージを使うと簡単に書ける。

```r
library(stringr)

hour <- as.POSIXlt(Sys.time())$hour # 9
hourStr <- str_sub(paste0("0", hour), start = -2)
print(hourStr)
```

```:結果
[1] "09"
```

dplyr 使って書くと見やすい。

```r
library(dplyr)
library(stringr)

hour <- as.POSIXlt(Sys.time())$hour
hourStr <- paste0("0", hour) %>% str_sub(start = -2)
print(hourStr)
```

参考：
[stringr — Rの文字列をまともな方法で処理する](http://meme.biology.tohoku.ac.jp/students/iwasaki/rstats/stringr.html)

### 追記

よく考えたら `sprintf()` の方が簡単だった。

```r
sprintf("%02d", 9)
sprintf("%02d", 10)
```

```:結果
[1] "09"
[1] "10"
```

### 追記2

stringr パッケージに `str_pad()` というものがありました。

```r
str_pad(9, 2, pad=0)
str_pad(10, 2, pad=0)
```

```:結果
[1] "09"
[1] "10"
```