OmniAICreator/Qiita-1.07M huggingface dataset:
Symfony Console で -v を別のオプションと繋げて指定すると Verbosity にならない

`-va` のように `-v` を別のオプションと繋げて指定すると `$output->getVerbosity()` が 1(NORMAL) になります（未指定と同じ値）。

```php
<?php
require __DIR__ . '/vendor/autoload.php';

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputOption;

$app = new Application();
$app->add(new Command('ore'))
    ->addOption('are', 'a', InputOption::VALUE_NONE)
    ->setCode(function (InputInterface $input, OutputInterface $output) {
        $output->writeln(sprintf('<info>getVerbosity() :</info> %d', var_export($output->getVerbosity(), true)));
        $output->writeln(sprintf('<info>getOption()    :</info> %s', var_export($input->getOption('verbose'), true)));
    });
$app->run();
```

```console
$ php test.php ore
getVerbosity() : 1
getOption()    : false

$ php test.php ore -v
getVerbosity() : 2
getOption()    : true

$ php test.php ore -va
getVerbosity() : 1
getOption()    : true
```

`$input->getOption('verbose')` で `-v` が指定されているかどうかは判断できますが `-vvv` のような複数指定が解釈できません。

```console
$ php test.php ore -vv
getVerbosity() : 3
getOption()    : true

$ php test.php ore -vva
getVerbosity() : 1
getOption()    : true

$ php test.php ore -vvv
getVerbosity() : 4
getOption()    : true

$ php test.php ore -vvva
getVerbosity() : 1
getOption()    : true
```

Composer も Symfony Console Component なので `-v` とその他のオプションはバラバラに指定しないと verbose になりません。

```console
$ composer install -vvv -o
Reading ./composer.json
  :
たくさん
  :
symfony/console suggests installing psr/log (For using the console logger)
symfony/console suggests installing symfony/event-dispatcher ()
Generating optimized autoload files
```

```console
$ composer install -vvvo
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
  - Installing symfony/console (v2.5.2)
    Loading from cache

symfony/console suggests installing psr/log (For using the console logger)
symfony/console suggests installing symfony/event-dispatcher ()
Generating optimized autoload files
```

---

次のように `Symfony\Component\Console\Command\Command` を継承して・・・

```php
class MyCommand extends \Symfony\Component\Console\Command\Command
{
    protected function initialize(InputInterface $input, OutputInterface $output)
    {
        parent::initialize($input, $output);

        if ($output->getVerbosity() == $output::VERBOSITY_NORMAL && $input->getOption('verbose')) {
            $output->setVerbosity($output::VERBOSITY_VERBOSE);
        }
    }
}
```

次のように `MyCommand` を使えば意図せず `VERBOSITY_NORMAL` になってしまうことだけは避けられるかなぁ。

```php
$app = new Application();
$app->add(new MyCommand('ore'))
    ->addOption('are', 'a', InputOption::VALUE_NONE)
    ->setCode(function (InputInterface $input, OutputInterface $output) {
        $output->writeln(sprintf('<info>getVerbosity() :</info> %d', var_export($output->getVerbosity(), true)));
        $output->writeln(sprintf('<info>getOption()    :</info> %s', var_export($input->getOption('verbose'), true)));
    });
$app->run();
```
【AngularJS】日付範囲の選択を実現するカスタムフィルタ


ググっても上手く見つからず、自分で作ってみました。


```Javascript
// 日付範囲選択用のフィルタ
app.filter('dateSelectFrom', function() {
	return function(input, from) {
		var arr = [];
		input.some(function(v, i) {
			if (v.date >= Date.parse(from)) {
				arr.push(input[i]);
			}
		});
		return arr;
	};
});
app.filter('dateSelectTo', function() {
	return function(input, to) {
		var arr = [];
		input.some(function(v, i) {
			if (v.date <= Date.parse(to)) {
				arr.push(input[i]);
			}
		});
		return arr;
	};
});
```

こんな感じでフィルタを適用できます。

```HTML
<tr ng-repeat="item in items|dateSelectFrom:dateFrom|dateSelectTo:dateTo>
```

ユーザに日付を選択させる場合は、HTML5の

```HTML
<input type="date" ng-model="dateFrom">
```

を使うと楽。


動くサンプルはこちらから。

[【AngularJS】日付範囲の選択を実現するカスタムフィルタ - jsdo.it](http://jsdo.it/migi/fM62)
Pythonの開発環境整えてみたメモ on Mac OS X

# Pythonの開発環境整えてみたメモ on Mac OS X

環境：Mac OS X 10.9.4(Mavericks)
前提：homebrewインストール済み


## pyenvをインストール



```
$ brew install pyenv-virtualenv pyenv
```

`~/.bashrc` や `~/.zshrc`に以下を追加

```
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi
```

追加後、以下を実行

```
$ source ~/.zshrc
```
以下のコマンドを実行してpyenvのバージョンが表示されれば成功

```
$ pyenv -v
pyenv 20140705
```

### おまけ

（必須ではないけど）`pyenv rehash`を自動化してくれるやつを追加。rehash忘れがちなので入れておく

```
git clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash
```


## pyenvからPythonをインストール

### インストール可能なバージョン一覧

```
$ pyenv install -l
```

### Pythonのインストール

```
$ pyenv install 3.4.1
```

### インストールされたバージョンの確認

```
$ pyenv versions
```

### バージョンの切り替え（グローバル）

全体で指定バージョンが使用される。

```
$ pyenv global 3.4.1
```

### バージョンの切り替え（ローカル）

そのディレクトリ直下で指定バージョンが使用される。

```
$ pyenv local 3.4.1
```

### アンインストールする

```
$ pyenv uninstall 3.4.1
```


## Hello World

以下を`hello.py`として保存

```
print("Hello World")
```


実行してみる

```
$ python hello.py
Hello World
```


## メモ

pyenvでPython3系を使ってるとHomebrewからRicty(fontforge)がインストール出来ないという噂を聞いた。
検証はしてないけど、とりあえずメモ。
http://d.hatena.ne.jp/riocampos+tech/20140406/pyenv_must_be_set_python2_as_python
エクセルで特定の文字の前までを取り出す、特定の文字以降を取り出す

いつも忘れるのでメモします。
エクセルで特定の文字の前までを取り出す、特定の文字以降を取り出す方法です。

# 特定の文字の前までを取り出す

## やりたいこと

下記のような文字列がたくさんあって、カッコの前まで取り出したい場合

お知らせ(23)
日記(384)
お詫び(2564)
猫(15048)

↓　こうしたい

お知らせ
日記
お詫び
猫

## 書き方（A1に文字列がある例）

`=LEFT(A1,FIND("(",A1)-1)`

## 説明

LEFTは先頭から指定されたところまで取り出せる関数。
LEFT(文字列, 文字数)

=LEFT("お知らせ(23)", 4)
とすると、先頭から4文字目までの「お知らせ」が取り出せる。

FINDは検索した文字が文字列の何番目に最初に出てくるかを取り出せる関数。
FIND(検索文字列, 対象, [開始位置])

=FIND("(", "お知らせ(23)")
とすると　(　がある位置は先頭から5文字目なので「5」が取り出せる。

=LEFT(A1,FIND("(",A1)-1)
よって、FINDで　(　が最初に出てくる場所を取り出して
そこからマイナス1して　(　の1つ前の場所の文字数を指定してあげて
LEFTでその文字数までを取り出す
という仕組みになっていることがわかる。

### 余談
=FIND("(", "お知らせ(23)お知らせ(23)", 9)
とすると、検索開始位置が9文字目（ここでは2番目の お ）からになり
最初の　(　は、検索範囲に入らなくなる。
つまり、9文字目以降で (　がある位置は先頭から13文字目なので
「13」が取り出せる。

### 余談2
お知らせ(1)(23)
お知らせ(2)(23)
日記(3)(384)
とかあって、(1)(2)(3)は残したいときはちょっと困ることになる。
<del>どうしたらいいかはまた機会があった時にでも調べる。</del>
コメントで教えていただいたので追記します。
`=LEFT(A1,FIND("(",A1,FIND("(",A1)+1)-1)`
とすると、検索開始位置を　( が最初に出てきた場所の次の場所に指定することができる。

### 余談3
お知らせ＼(^o^)／(1)(23)
お知らせ((((；ﾟДﾟ))))(2)(168)
とかあって、最後の ( より前を取り出したい場合は・・・
複雑なので次の投稿で書きます。→[エクセルで特定の文字の前までを取り出す　応用編](http://qiita.com/yuwaita/items/2aaa4d54f6ec09230e48)


# 特定の文字以降を取り出す

## やりたいこと

下記のような文字列がたくさんあって、カッコ以降のみ取り出したい場合

お知らせ(23)
日記(384)
お詫び(2564)
猫(15048)

↓　こうしたい

(23)
(384)
(2564)
(15048)

## 書き方（A1に文字列がある例）

`=RIGHT(A1,LEN(A1)-(FIND("(",A1)-1))`

## 説明

RIGHTは末尾から指定されたところまで取り出せる関数。
RIGHT(文字列, 文字数)

=RIGHT("お知らせ(23)", 4)
とすると、末尾から4文字目までの「(23)」が取り出せる。

LENは文字列の長さを取り出せる関数。
LEN(文字列)

=LEN("お知らせ(23)")
とすると文字数「8」が取り出せる。半角とか全角とか関係ナシ。

=RIGHT(A1,LEN(A1)-(FIND("(",A1)-1))
よって、
FINDで ( が最初に出てくる場所からマイナス1して ( の1つ前の
場所（ここでは　せ）を指定してあげて、
それをLENで取り出した全体の文字数から引くと
残りの ( 以降の文字数が取り出せるので
RIGHTでその文字数までを取り出す
という仕組みになっていることがわかる。
Google Playの2014/08/31の仕様変更

2014/08/31に実施されるGoogle Playの仕様変更に関してメモ。 

公式情報はこちら。
https://support.google.com/googleplay/android-developer/answer/6066610

## 内容

下記の様な形式にレイアウトが変更されます。

 ![SNP_0EB3F1E9CE8FBE0055660FF66D7438F25CB7_6071209_en_v0.png](https://qiita-image-store.s3.amazonaws.com/0/240/f21bfb52-608d-78a4-3f9f-843f26fff95a.png)

## 変更点
- 宣伝用画像
 - これまで、宣伝用画像(横 1,024 x 縦 500 JPG または 24 ビット PNG)は任意の表示項目でしたが、2014/08/31以降は必須項目となる。
 - 宣伝用画像は、上記①領域に表示される(プロモーション動画が存在する場合はオーバーレイされる)。

- 簡単な説明(80文字以内)
 - 上記②領域に表示されるようになる。
 - 2014/08/31以降は必須項目となる。
 - テキストをタップすると詳細な説明が表示されるようになる。
 - ユーザーがアプリをインストールした後はアプリの更新履歴が表示されるようになる。
 - 設定しなかった場合は詳細な説明の冒頭80文字が表示される。

## まとめ
- 2014/08/31からGoogle Playのレイアウトが変更される。
- ストア掲載情報の「宣伝用画像」と「簡単な説明」が必須項目となる。
- 2014/08/31以降のアップデート時に必須となる。
WindowsでスクリーンショットをアニメーションGIFにする

Gyazo GIF を使うと簡単に作れそうな気もしますが、なんとなく嫌だなと思って他の方法を探してみました。

* [Nautilus ](http://blog.x-row.net/?p=4997) で MPNG の homu.avi 作成。
* ffmpeg で png の連番画像に変換

    ```
ffmpeg -i homu.avi -f image2 homu%03d.png
    ```

* ImageMagick の convert で GIF に変換

    ```
convert *.png homu.gif
    ```

色々と調整は必要かも。
IntelliJ IDEAのTerminalをCygwinにする

#発端
IntelliJ IDEAでvagrantをTerminalWindowで操作したいなとか思ってしまったが故に泥沼にハマった。
いろいろ試したのをメモとしておいておきます。
もっといい方法とかスマートな方法あればご指摘いただけると嬉しいです

#環境
Windows8.1pro
IntelliJ IDEA 14.0.1 Ultimate
IntelliJ IDEA 13.1.4 Ultimate

#設定箇所(IDEA14)
File->Settings->Tools->TerminalのShell Pathを変更する
![IU14-setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/44786/8d27f742-0248-c92b-744d-503f43d1203f.png)

#設定箇所(IDEA13)
File->Settings->Terminal->Shell pathを変更する
![setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/44786/f5b493e5-4361-5c73-4b18-ab3215090f0e.png)

##設定値
### とりあえずbashを指定してみる
`C:\Cygwin\bin\bash.exe`

* 初期ディレクトリは良いがログインシェルじゃないのでいろいろ残念

### ログインシェルとして実行してみる
`C:\Cygwin\bin\bash.exe --login -i`

* 機能的には問題ないが初期ディレクトリがホームディレクトリになる※IntelliJで開いているプロジェクトディレクトリにしたい

### バッチでなんとかする
`C:\Cygwin\Cygwin_test.bat`

C:\Cygwin\Cygwin.batを改造してカレントディレクトリをログインシェルに反映させるようにした

``` Cygwin_test.bat
@echo off

for /f "usebackq tokens=*" %%i in (`cygpath %CD%`) do @set RESULT=%%i

C:
chdir C:\Cygwin\bin

bash -l -c "cd %RESULT%;bash -"
```

#実施結果
まぁなんとか。。。大丈夫なのかなこれ
![目標.PNG](https://qiita-image-store.s3.amazonaws.com/0/44786/eeb1f568-a669-4cc7-c752-5496831996f2.png)
vagrantのsaharaでpath関連のエラーが出た時の対処法

諸事情でvagrantを入れなおしたところ、saharaをインストールしても動かなかった。

```

C:\Users\tarr>vagrant sandbox status
C:/Users/tarr/.vagrant.d/gems/gems/sahara-0.0.17/lib/sahara/session
/virtualbox.rb:36:in ``': Invalid argument - "D:\Tools\VirtualBox;D:\Tools\Virtu
albox\VBoxManage.exe" showvminfo --machinereadable "0569db6f-0e32-44b1-b8ff-1b5c
e657157e" (Errno::EINVAL)
        from C:/Users/tarr/.vagrant.d/gems/gems/sahara-0.0.17/lib/s
ahara/session/virtualbox.rb:36:in `list_snapshots'
        from C:/Users/tarr/.vagrant.d/gems/gems/sahara-0.0.17/lib/s
ahara/session/virtualbox.rb:46:in `is_snapshot_mode_on?'
        from C:/Users/tarr/.vagrant.d/gems/gems/sahara-0.0.17/lib/s
ahara/command/status.rb:27:in `block in execute'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.3.5/lib/vagrant/p
lugin/v2/command.rb:185:in `block in with_target_vms'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.3.5/lib/vagrant/p
lugin/v2/command.rb:183:in `each'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.3.5/lib/vagrant/p
lugin/v2/command.rb:183:in `with_target_vms'
        from C:/Users/tarr/.vagrant.d/gems/gems/sahara-0.0.17/lib/s
ahara/command/status.rb:20:in `execute'
        from C:/Users/tarr/.vagrant.d/gems/gems/sahara-0.0.17/lib/s
ahara/command/root.rb:52:in `execute'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.3.5/lib/vagrant/c
li.rb:38:in `execute'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.3.5/lib/vagrant/e
nvironment.rb:478:in `cli'
        from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.3.5/bin/vagrant:9
6:in `<top (required)>'
        from C:/HashiCorp/Vagrant/bin//../embedded/../embedded/gems/bin/vagrant:
23:in `load'
        from C:/HashiCorp/Vagrant/bin//../embedded/../embedded/gems/bin/vagrant:
23:in `<main>'
```

どうやら、環境変数をいじって、virtualboxのhomeを変更していることが原因っぽい。

| 変数名 | 値 | 
|:-----------|:------------|
| VBOX_INSTALL_PATH | %VBOX_MSI_INSTALL_PATH% |
| VBOX_MSI_INSTALL_PATH | D:\Tools\VirtualBox;D:\Tools\Virtualbox\ |

上記のようになっていた。virtual boxをCドライブからDドライブにうつした時に設定した気がする。エラーに出ている
`C:/Users/tarr/.vagrant.d/gems/gems/sahara-0.0.17/lib/s
ahara/session/virtualbox.rb`
このファイルを見てみると、VBOX_INSTALL_PATHやVBOX_MSI_INSTALL_PATHいうのが大量にある。これは怪しいで…

とりあえず、VBOX_MSI_INSTALL_PATHの値がなんか気持ち悪い感じになっているので、`D:\Tools\VirtualBox;D:\Tools\Virtualbox\`から `D:\Tools\Virtualbox\`こう修正して、windowsを再起動した。

治った
Rで扱える画像ライブラリの簡単な調査

画像処理のアイデアはRでさくっと試したいマンなので一応有名な（というか俺でも知ってる）ライブラリ3つに絞って簡単にデータ構造とかについてまとめて何かしようとしたときの初動に役立てたいというメモ。

#調べるライブラリ
* jpeg 0.1-8
* biOps 0.2.2
* EBImage 4.6.0

#調べること
* 配列データ
* データサイズ
* 値域と型

#結果

##使用画像
* 640 x 480
* 約156KB
* カラー
* JPEG

![DSC01580.JPG](https://qiita-image-store.s3.amazonaws.com/0/34880/26165b72-79c7-9ced-edb7-81d0443c3b8b.jpeg)

##ライブラリ読み込み&画像準備

```r:Console
> library("jpeg")
> library("biOps")
> library("EBImage")
> 
> smoke <- "smoke.jpg"
> 
> smoke.jp <- readJPEG(smoke)  #jpeg
> smoke.bi <- readJpeg(smoke)  #biOps
> smoke.eb <- readImage(smoke) #EBImage
```

##配列データ

やはり画像関数としてピクセルにランダムアクセスしたいのでどんな配列表現をとってるかみてみる。

```r:Console
> dim(smoke.jp)
[1] 480 640   3
> dim(smoke.bi)
[1] 480 640   3
> dim(smoke.eb)
[1] 640 480   3
```

カラー画像ということで3次元分のデータとして扱われており、RGB3チャネル分の画像が格納されてる。
配列データは `EBImage` のみ画像における横方向が1次元目に格納されてるため、参照方向が他の2つと逆になってるので注意が必要。

##データサイズ

続けてメモリ上のサイズ。

```r:Console
> object.size(smoke.jp)
7373008 bytes
> object.size(smoke.bi)
3687088 bytes
> object.size(smoke.eb)
7373584 bytes
```

`EBImage` > `jpeg` >> `biOps` という形になった。

##値域と型

なんで↑で `biOps` だけ他2つと2倍程度違ってるのかとおもいきや、

```r:Console
> summary(smoke.jp)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0000  0.3176  0.4980  0.4571  0.5922  0.9294 
> typeof(smoke.jp)
[1] "double"
> 
> summary(smoke.bi)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    0.0    81.0   127.0   116.6   151.0   237.0 
> typeof(smoke.bi)
[1] "integer"
>
> summary(smoke.eb)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0000  0.3176  0.4980  0.4571  0.5922  0.9294 
> typeof(smoke.eb)
[1] "double"
```

`biOps` のみ256階調の `integer` で値が表現されてた。他は0〜1の `double`。

#まとめ
各ライブラリ間での変換メソッド書かないとシームレスな連携できなそう。
調べてないけどグレスケの場合は多分3チャネル分あった3次元目が次元縮小されて2次元配列になるだけだよね。
次は各ライブラリのインストール方法とか含めた簡単なexampleもまとめたい。
リリース前のapkファイルで実機テストをする手順

アプリリリース前の最後の確認作業にapkファイルを用いた実機テストをしたのですが、普段terminalを使わない僕はbashファイルとかさっぱり分からずスタックしたので僕みたいなterminalのコマンドがよくわからない人にも理解できる様にメモ



まずterminalで.bash_profileファイルを開きます。.bash_profileの様にファイルの一番最初が"."から始まるものは隠しファイルと呼ばれるもので、"ls"という現在いるディレクトリーに存在するファイルを表示させるコマンドでも隠れてしまいます。しかし

```
ls -a
```

と打ち込むと隠しファイルも含めすべて表示されます。


.bash_profileファイルが見つかったら次にそれを開きます。僕の場合はsublimeを使って

```
subl .bash_profile
```
として開きました。エディターを使って開けばなんでもいいと思います。

ファイルを開いたらいくつかあるexportというコードの近くにsdkのplatform-toolsの場所を打ち込みます。僕の場合は以下のようになりました。

```
export PATH=$PATH:/Applications/adt-bundle-mac-x86_64/sdk/platform-tools
```

command+Sでセーブした後に一度terminalに戻り、

```
source .bash_profile
```
と打ち込みます。こうすることで今まで行ってきた変更が有効となりadbコマンドが使える様になります。確認のためにadbと押すと、コマンドの使い方が出てくると思います。


ここまで来たらデバイスをパソコンに繋ぎ、作成したapkファイルを含むディレクトリーまで移動し以下のコードを打ち込みます。
```
adb install 名前.apk
```
これでsuccessと表示されたらアンドロイドのディバイス上にアプリがインストールされているはずです。


参考URL:http://ladywendy.com/lab/terminal/97.html
apkファイル作成(zipalignのエラー)

Eclipseで署名付きのapkファイルを作成して最後にfinishボタンを押すと

```
cannot.find.zip.align=The zipalign tool was not found in the SDK.

Please update to the latest SDK and re-export your application
or run zipalign manually.

Aligning applications allows Android to use application resources
more efficiently.

```

というメッセージが表示されます。一応ファイルはできているので実際にgoogle play Developer Consoleにアップロードすると

```
zipalignが実行されていないAPKをアップロードしました。
```
と表示され上手くアップロードされません。


手動でzipalignを実行させることも出来るのですがよく分からなかったので、Android SDK Managerを開き、Android SDK Build-toolsをインストールし、もう一度作り直したところ、このエラーは解決されました。
Unityでスマホのタッチエフェクト実装


###概要
スマホゲームでよくあるタッチした部分に波紋のような
エフェクトを実装する方法

###スクリプト
```Test.cs

// 再生したいEffectのプレハブを指定する
public GameObject Effect01 = null;

// タッチエフェクトを仮実装
if(Input.GetMouseButtonDown(0))
{
	// タッチした画面座標からワールド座標へ変換
	Vector3 pos = Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, 5.0f));
	// 指定したエフェクトを作成
	GameObject go = (GameObject)Instantiate (Effect01, pos, Quaternion.identity);

	// エフェクトを消す
	Destroy(go, 0.4f);
}
```
###雑感
GetMouseButtonDown()じゃないほうが綺麗な気もしますが
とりあえずということで。
Rubyのクラス変数を継承関係にあるクラスに伝搬しないようにする方法

あまりクラス変数使わないし、たまに直感に反する挙動してハマることあるのでメモ。

---

継承を利用している場合、クラス変数を普通に使うと親クラスやサブクラスに伝搬してしまいます。

```rb
class Base
  def self.foo=(value)
    @@foo = value
  end

  def self.foo
    @@foo
  end
end

class Sub1 < Base
  self.foo = 'sub1'
end

class Sub2 < Base
  self.foo = 'sub2'
end

puts Base.foo #=> "sub2"
puts Sub1.foo #=> "sub2"
puts Sub2.foo #=> "sub2"
```

全部"sub2"になっちゃったYO！

意図通りな挙動を実現するためにはこんな感じ。

```rb
class Base
  class << self
    def foo=(value)
      @foo = value
    end

    def foo
      @foo
    end
  end
end

class Sub1 < Base
  self.foo = 'sub1'
end

class Sub2 < Base
  self.foo = 'sub2'
end

puts Base.foo #=> nil
puts Sub1.foo #=> "sub1"
puts Sub2.foo #=> "sub2"
```

これで期待通りの挙動になりました。
1年間Ruby on Railsのプロジェクトをやってきた僕がためになった書籍やwebサイト


## 概要
1年間Ruby on Railsのプロジェクトをやってきて、ためになった書籍やサイトをまとめてみた。
他に何かオススメがあったら教えてください。

## 書籍

### [初めてのruby](http://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AERuby-Yugui/dp/4873113679)
配属されて初の業務前に先輩に進められた本がこれ。
初めてと名が付いているが、難しかった記憶がある。

### [パーフェクト Ruby on Rails](http://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88-Ruby-Rails-%E3%81%99%E3%81%8C%E3%82%8F%E3%82%89-%E3%81%BE%E3%81%95%E3%81%AE%E3%82%8A/dp/4774165166/ref=pd_sim_b_3?ie=UTF8&refRID=1DRDMWQQE60A945703Z2)
part1,2はある程度わかっていたが、part3,４辺り…特に9章はまとまった資料がなかったので、すごく参考になった。
少しだけ書けるようになった自分にとっては、次の段階にあがるための良いきっかけとなった。

### [Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)
ある程度プロジェクトに慣れてきたあたりの時に、日本語訳が発売されたので購入した。
今までは、プロジェクト内の既存のテストを模倣するように書いていたが、読んでからは意図をもって書けるようになったと思う。

## web 

### [Rails Tutorial](http://railstutorial.jp/)
http://www.railstutorial.org/ の日本語版
チュートリアルとは思えない充実度で、初めて1からアプリケーションを作るときに使った。

### [RailsGuides](http://guides.rubyonrails.org/)
[RailsGuidesの日本語版](http://railsguides.jp/)
アソシエーション周りを考えるときによく参照してる。

### [rubyリファレンスマニュアル](http://miyamae.github.io/rubydoc-ja/)
リファレンスはよく見る

### [Railsドキュメント](http://railsdoc.com/)
(同上)

### [Rails Best Practices](http://rails-bestpractices.com/)
コードとリファクタリングの例を紹介しているサイト
有名な[gem](https://github.com/railsbp/rails_best_practices)もあります。
よくなさそうコードはmergeする前に早めに潰したいので、すごく助かってます。

### [Better Specs](http://betterspecs.org/jp/)
http://betterspecs.org/ の日本語版
GoodとBadどちらも書かれているので、すごくわかりやすい。

### [TechRacho](http://techracho.bpsinc.jp/)
Rubyだけじゃなくwebにまつわるものを色々取り扱っているが

- [肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳)](http://techracho.bpsinc.jp/hachi8833/2013_11_19/14738)
- [Railsらしく書こう](http://techracho.bpsinc.jp/hachi8833/2013_12_18/14940)

等、もっとうまく書けないかな？って時に参考になった。

### [酒と泪とRubyとRailsと](http://morizyun.github.io/)
ググっていると何度もこのサイトに行き着いた。
[RSpec初心者向けの資料まとめ[Ruby][Everyday Rails書評]](http://morizyun.github.io/blog/rspec-beginner-bdd-tdd-test-first/)
これとか何回参考にしたかわからないくらい見ています。

### [GitHub](https://github.com/)
先輩におすすめされたOSSで、時間あるときにpull requestを見たりしています。

- [rubygems/rubygems.org](https://github.com/rubygems/rubygems.org)
- [discourse/discourse](https://github.com/discourse/discourse)
- [TracksApp/tracks](https://github.com/TracksApp/tracks)

## 今後ちゃんと読みたいなと思っている本
- [Rubyベストプラクティス](http://www.amazon.co.jp/Ruby%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Gregory-Brown/dp/4873114454)
- [リファクタリング:Rubyエディション](http://www.amazon.co.jp/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-Ruby%E3%82%A8%E3%83%87%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3-Jay-Fields/dp/4048678841)
- [RailsAntiPattern](http://www.amazon.co.jp/%E6%9C%AC/dp/0321604814)
- [Eloquent Ruby](http://www.amazon.co.jp/Eloquent-Ruby-Addison-Wesley-Professional-Series/dp/0321584104)
ScrollViewとカスタムビューのタッチイベント

ScrollViewにカスタムビューを配置したところ、カスタムビューのタッチイベントをScrollViewに奪われてしまいました。
こんなときはViewParent#requestDisallowInterceptTouchEvent(boolean)を呼び出せば、ScrollViewにタッチイベントを奪われません。

```java
public class HogeView extends View {

	//...
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		int action = event.getActionMasked();
		if (action == MotionEvent.ACTION_DOWN) {
			getParent().requestDisallowInterceptTouchEvent(true);

			//...

			return true;
		}
		
		//...
		
		return false;
	}
}
```

※ViewクラスはViewParentインターフェースを実装していませんが、View#getParentでViewParentを取得できます。
※ViewGroupクラスはViewParentインターフェースを実装しているので、例えばFrameLayoutなどのViewGroupを継承しているクラスはgetParentしなくて良いです。
スマホ向けサイト作りをしている時。ズームを使うとSNSボタンが荒ぶる


とりあえず画像を見て下さい。

# 求めてない現象

![求めてない現象.png](https://qiita-image-store.s3.amazonaws.com/0/42310/691b1869-dc51-14d4-6dce-227fc90f7678.png "求めてない現象.png")

# 求めている現象

![求めている状態.png](https://qiita-image-store.s3.amazonaws.com/0/42310/0456adaf-a307-47ce-ae8e-6ec8f415b4a6.png "求めている状態.png")

## なぜこの現象が起きたのか？

スマホ向けサイトのコーディングする際にデバイスごとの画面幅に対応させる一つの手段として

```js
$(window).bind('resize load', function(){
	$("html").css("zoom" , $(window).width()/480 );
});

```

このような記述をすることがあります。
480pxを基準に現在の画面幅の比率を求めて、htmlに記述されている部分を拡大縮小させているjsになります。

これがSNSボタンの上位のiframeに作用してしまい、求めていない現象が起きてしまいました。

## 今回これを回避するために

```js
$(window).bind('resize load', function(){
	$("header,article,footer").css("zoom" , $(window).width()/480 );
});

```

```html
<html>
	<head>
		<!-- その他は割愛 -->
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	</head>
	<body>
		<header></header>
		<!-- ここにSNSボタンを集約 -->
		<div class="snsbuttoms"></div>
		<article></article>
		<footer></footer>
	</body>
</html>
```

のような記述でSNSの記述部分のズームだけ回避するという方法を用いました。

なぜズーム自体をやめなかったのかという話になりますが、新規で作るわけではなく、とあるサイトの増築という形だったというのが一番大きな要因ですね・・・。

賢い方法をご存じの方は是非ご教授お願いしますm(_ _)m
sshした時に''WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! ''エラーが出た際の対処法

# 今回のエラー

ホストにアクセスしようとしたとき、次のようなメッセージが出ることがあります。    
  
  


```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
...以下略
```

↑このエラーが、sshした際に出た時の、対処法。


# 解決法


このエラーは、要約すると、ホスト側のサーバ'(PC)が入れ替わった時を検出して警告を出しているエラーです。
僕の場合は、既存のサーバを他のサーバに置き替えた際に出現しました。

※  原因不明の際は、別途対応。ホスト側の管理者に問い合わせる必要があります。
　心当たりが無いのにこのエラーが出た場合は、盗聴された可能性があります。

原因が特定出来た後、
**~/.ssh/ ディレクトリにある known_hosts ファイルを開いて、迷わず中身を削除してください。**


その後、再びssh。         

  

正しければ

  
```
$ Are you sure you want to continue connecting (yes/no)?

```  



    
と表示されるはずです。
これにに対して yes と入力すれば known_hosts ファイルに新しいホストが追加されます。

もう一度抜けて再度試しても、問題なくssh出来ると思います。
iPhone純正ケーブルやイヤホンの無償交換をオンラインで行う方法

知らない人が多いのですが、保証期限内（１年）であれば無償で断線しかけのケーブルや充電器、イヤホンの交換をすることができます。ジーニアスバーに行くとすぐ交換してもらえますし電話でもできますが、オペレーターと話すのにドキドキしてしまう人はオンラインで申込み郵送交換も可能です。ただ、申込方法が非常ににわかりにくいためメモしておきます。

２営業日で届きますし本体が保証内であれば回数制限も無いようなのであわてて買うよりお得です。

+ 以下のURLより「修理サービスを申し込む」を選択
https://www.apple.com/jp/support/iphone/repair/other/

+ サービスリクエストとトラブルシューティングで
「イヤフォン、ケーブルまたはアダプターの交換」

+ クリックするとメールアドレスを入れる欄が出てくるのでApple Storeで使っているアドレスを入れてクリック。

+ 携帯側にメールが来るので診断実行をクリック

*診断はスキップできますが、その場合はシリアル番号を要求されます*

+ サポートオプションで「配送修理」を選択

+ 交換を希望する部品の選択で「Lightningケーブル１m」を選択（別途購入とあるが気にしない）

+ この後、住所等必要情報を入れます(AppleIDだと入力済みです）

*クレジットカード番号が要求されますが、実際にはヤマトで
故障品と交換なりますのでので請求されることはありません*

+ 翌日くらいにメールで配送番号が来て、日程や時間帯変更が可能です。

+ 当日はクロネコが交換対応に来ます。そう、いつもの人が来ますので心配無用です。
Mac OS XにRubyをインストールしたら失敗した話し

[Rubyプログラミングを始めるための基礎知識とインストール](http://www.atmarkit.co.jp/ait/articles/1402/27/news042_2.html)

↑辺りを参照しながらインストールしたところ、RVMを使ってRubyをインストールするところでエラーが発生・・・。

```lang:error
sudo rvm install ruby-2.1.1 --default
Password:
Unknown ruby string (do not know how to handle): ruby-2.1.1.
Unknown ruby string (do not know how to handle): ruby-2.1.1.
Searching for binary rubies, this might take some time.
Found remote file https://rvm.io/binaries/osx/10.9/x86_64/ruby-2.1.1.tar.bz2
Checking requirements for osx.
Installing requirements for osx.
Updating system....
Installing required packages: automake, libtool, pkg-config, libyaml, readline, libksba, openssl....
Error running 'requirements_osx_brew_libs_install automake libtool pkg-config libyaml readline libksba openssl',
showing last 15 lines of /Users/ha_ru_ma_ki/.rvm/log/1406698855_ruby-2.1.1/package_install_automake_libtool_pkg-config_libyaml_readline_libksba_openssl.log
以下、略
```

どうやらパッケージが自動でインストールされなかったっぽいので、、、

```
Installing required packages: automake, libtool, pkg-config, libyaml, readline, libksba, openssl....
Error running 'requirements_osx_brew_libs_install automake libtool pkg-config libyaml readline libksba openssl',
```

手動でインストールしたところ、

```
brew install automake
brew install libtool
brew install pkg-config
brew install libyaml
brew install readline
brew install libksba
brew install openssl
```

Ruby のインストールも成功 :laughing: 

```
Checking requirements for osx.
Certificates in '/usr/local/etc/openssl/cert.pem' are already up to date.
Requirements installation successful.
ruby-2.1.1 - #configure
ruby-2.1.1 - #download
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 6671k  100 6671k    0     0   685k      0  0:00:09  0:00:09 --:--:--  972k
ruby-2.1.1 - #validate archive
ruby-2.1.1 - #extract
ruby-2.1.1 - #validate binary
ruby-2.1.1 - #setup
ruby-2.1.1 - #gemset created /Users/ha_ru_ma_ki/.rvm/gems/ruby-2.1.1@global
ruby-2.1.1 - #importing gemset /Users/ha_ru_ma_ki/.rvm/gemsets/global.gems....................................
ruby-2.1.1 - #generating global wrappers........
ruby-2.1.1 - #gemset created /Users/ha_ru_ma_ki/.rvm/gems/ruby-2.1.1
ruby-2.1.1 - #importing gemsetfile /Users/ha_ru_ma_ki/.rvm/gemsets/default.gems evaluated to empty gem list
ruby-2.1.1 - #generating default wrappers........
Updating certificates in '/etc/openssl/cert.pem'.
```
プログラム内で起動した外部プロセスをチョメチョメする

[mattnさん](http://qiita.com/mattn)にシンプルなコードを教えて頂いたので、コメント欄をご欄ください


先日、とあるイベントに参加したときにGo言語から外部プロセスを起動し、起動したプロセスを操作する方法が分からず無駄な時間を過ごしてしまいました。
次回も同じ轍を踏まないようにコマンドを起動してチョメチョメするライブラリを作成しました。

### 参考サイト
ライブラリの作成にあたり、[PythonMatrixJp](http://python.matrix.jp/2013/05/12/go_start2.html)さんのプログラムを参考に作成しました。

# どんなライブラリなのか？
外部プロセスを操作するライブラリ exec.Cmd を拡張したライブラリです。名前をpfprocといいます。

 1. exec.Commandと同じ引数でインスタを作成します。
 2. Startメソッドで外部プロセスを起動します。
 3. 外部プロセスから標準（エラー）出力をターミナルに表示します。
 4. Inputメソッドを使って外部プロセスにデータを送ります。（標準入力）
 5. 処理が完了するまで待つには WaitProcメソッドを使います。



## pfprocの利用サンプル
```go
package main

import (
	"fmt"
	"os"
	"pfproc"
	"strings"
)

func exitOnErr(msg string, err error) {
	if err != nil {
		fmt.Println(msg, err)
		os.Exit(1)
	}
}

func main() {
	proc, err := pfproc.NewPfProc("bash")
	exitOnErr("create process", err)
	proc.StdoutFunc = func(text string) {
		// ファイル名がmain.goのときは hehehe に置き換える
		if strings.Index(text, "main.go") != -1 {
			text = "hehehe"
		}
		fmt.Println(text)
	}
	proc.Start()
	proc.Input("pwd")
	proc.Input("ls")
	proc.Input("exit")
	proc.WaitProc()
}
```


## pfprocのソースコード
``` go
package pfproc

import (
	"bufio"
	"fmt"
	"io"
	"os/exec"
)

type PfProc struct {
	*exec.Cmd
	stdin      chan string
	stdout     chan string
	stderr     chan string
	quit       chan error
	StdoutFunc func(text string)
	StderrFunc func(text string)
}

func NewPfProc(name string, args ...string) (*PfProc, error) {
	self := &PfProc{
		exec.Command(name, args...),
		make(chan string),
		make(chan string),
		make(chan string),
		make(chan error),
		func(text string) { fmt.Println(text) },
		func(text string) { fmt.Println(text) },
	}

	in, err := self.StdinPipe()
	if err != nil {
		return nil, err
	}
	go inprocess(in, self.stdin)

	out, _ := self.StdoutPipe()
	if err != nil {
		return nil, err
	}
	go outprocess(out, self.stdout)

	ste, _ := self.StderrPipe()
	if err != nil {
		return nil, err
	}
	go outprocess(ste, self.stderr)

	return self, nil
}

func (self *PfProc) Input(text string) {
	self.stdin <- text
}

func (self *PfProc) WaitProc() {

	go func() {
		self.quit <- self.Wait()
		close(self.stdin)
		close(self.stdout)
		close(self.stderr)
	}()

	for {
		select {
		case line, ok := <-self.stdout:
			if ok {
				self.StdoutFunc(line)
			}
		case line, ok := <-self.stderr:
			if ok {
				self.StderrFunc(line)
			}
		case err := <-self.quit:
			if err != nil {
				fmt.Println(err)
			}
			return
		}
	}
}

func inprocess(in io.WriteCloser, std chan string) {
	for {
		line, ok := <-std
		if ok {
			in.Write([]byte(line + "\n"))
		}
	}
}

func outprocess(out io.ReadCloser, std chan string) {
	reader := bufio.NewReader(out)
	for {
		line, _, err := reader.ReadLine()
		if err != nil {
			return
		}
		std <- string(line)
	}
}
```
gulp.jsでjekyll serve -wとcompass watchさせたいメモ


そもそもGrunt.jsも使ったことなかった状態でgulp.js使うことになったので、gulp.jsの理解からはじまる……けど、そのへんは割愛。

**導入についてはこの辺を参考。**
http://qiita.com/svartalfheim/items/b586b6772ffa93934a88
http://qiita.com/macococo/items/9f8b9329263783e4673a

`$compass watch`はすでにプラグインがあったので、gulp-compassを利用。
問題はjekyllの仮想サーバー起動とファイル監視。
既存のプラグインがbuildはやってくれるけど、serveとwatchまでやってくれないので、他にプラグインないかなぁと探し回ったけどやっぱりなくて……ggってもgruntのプラグインとか自力でプラグイン的なものを作って実行してるっていう記事ばっかりで、本職の方に比べたらフロント初心者みたいな自分にはなかなかハードル高め。

とにかく`$jekyll serve -w`を実行してくれれば何でもよかったので、結局gulp.jsでコマンドラインを叩くっていう方法でやることにした。

```gilpfile.js
var gulp    = require('gulp');
var compass = require('gulp-compass');
var gutil   = require('gulp-util');
var exec    = require('child_process').exec;　//gulpでコマンドラインを叩くようするるおまじない

//compass compile
gulp.task('compass', function() {
  gulp.src('./_source/sass/*.scss')
  .pipe(compass({
    config_file: './config.rb',
    css:         './_source/stylesheets',
    sass:        './_source/sass'
  }))
  .pipe(gulp.dest('./_source/stylesheets'));
});

// jekyll build
gulp.task('jekyll',function(){
  exec('jekyll serve -w');
});

// ファイル監視
gulp.task('watch', function(){
    gulp.watch('./_source/sass/*.scss',['compass']);//scssに変更あったらtaskのcompassが走る
});

gulp.task('default', ['compass','jekyll','watch']);

```

正直、このやり方がスマートな方法なのかはちょっとわからないけど、ひとまず備忘録として。
もっとスマートな方法があったら教えてほしい所存。
gulp-shellとかあるけどどうなんだろう……。

## 参考
[gulp.jsの公式ドキュメント](https://github.com/gulpjs/gulp/blob/master/docs/API.md#accept-a-callback)
プレフィックスルーティング

CakePHPでは基本のURLは `/:controller/:action` となりますが、
`/XXX/:controller/:action` や `/YYY/:controller/:action` の様な構造にしたい場合、
CakePHPがプレフィックスルーティングを用意してくれているようです。

# パッと思いついた方法
```php:routes.php
Router::connect('/XXX/', array('controller' => 'pages', 'action' => 'index'));
Router::connect('/XXX/:controller', array('action' => 'index'));
Router::connect('/XXX/:controller/:action/*', array());

Router::connect('/YYY/', array('controller' => 'pages', 'action' => 'index'));
Router::connect('/YYY/:controller', array('action' => 'index'));
Router::connect('/YYY/:controller/:action/*', array());
```

これでなんとなく実現できている気になっていました。
ですが、デフォルトのルーティングを活かしたままにすると

`/XXX/users/detail` で `Users` コントローラの `detail` アクションにルーティングされますが、
`/users/detail` でも同じアクションが実行されてしまいます。

これを抑止するにはCakePHPのデフォルトルーティングを止めなければいけません。

# プレフィックスルーティング

config内の `core.php` に以下を追記します。
（コメントアウトされているので修正でも大丈夫です。）

```php:core.php
Configure::write('Routing.prefixes', array('XXX', 'YYY'));
```

`routes.php` を触る必要なく、上記設定を行うと以下の様にルーティングされます。

|URL|コントローラ|アクション|
|:--|:--|:--|
|/XXX/users/detail|Users|XXX_detail|
|/users/detail|Users|detail|
|/YYY/items/list|Items|YYY_list|
|/items/list|Items|list|

アクションを実装するメソッドのネーミングルールが変更されますが、
先ほどの様に意図しないルーティングが発生することはありません。

知らなかったのでメモ！
Single Pomdoro For Win を公開しました

最近　Visual Studioで作業する機会があったのですが、知識が.Net Framework 3.5ベースで止まった浦島太郎だったのので、WPFとC#の勉強をかねて、簡単なPomodoro Timerを作ってみました。

![pict1.JPG](https://qiita-image-store.s3.amazonaws.com/0/48340/8e7e08b7-a032-25fd-55cd-74a65d2069d2.jpeg)


ソースはMITライセンスでGit Hubにて公開しています。

Single Pomodoro for Win

- [https://github.com/propos-jp/singlepomodoroforwin](https://github.com/propos-jp/singlepomodoroforwin)

実行ファイルは[こちら](https://www.dropbox.com/s/l9romp66h19ss5x/pomodorowin.zip)からダウンロード出来ます。
フォームで配列パラメータを扱いつつもモデル名を付加する

## やりたいこと

CakePHP ではフォームを作成するための ```FormHelper``` があって、```$this->Form->create()``` で作成されたフォーム内で ```$this->Form->input( 'name' )``` のように ```input``` 要素を作成する事ができるが、```name="param[]"``` のような配列パラメータを作成したい場合に以下のようにやってもうまくいかない。

**ctpファイルの記載**

```php
<?php $this->Form->create( 'User' ); ?>
    <?php $this->Form->input( 'param.1', array( 'type' => 'text' ) ); ?>
<?php $this->Form->end(); ?>
```

**出力**

```php
// ※ 実際に出力される attribute 等は省略しています
<form action="/user/new">
    <input type="text" name="data[param][1]" />  // name="data[User][param][1]" と出力されてほしい
</form>
```

## 解決策
```Form->create()``` で作成されているフォーム内ではモデル名が ```FormHelper::$defaultModel``` に格納されているので、これを利用する。

**ctpファイルの記載**

```php
<?php $this->Form->create( 'User' ); ?>
    <?php $this->Form->input( $this->Form->defaultModel . '.param.1', array( 'type' => 'text' ) ); ?>
<?php $this->Form->end(); ?>
```

**出力**

```php
// ※ 実際に出力される attribute 等は省略しています
<form action="/user/new">
    <input type="text" name="data[User][param][1]" />  // ちゃんと出ている
</form>
```

## 終わりに

FormHelper を使うと ```$this->request->data``` の内容が自動でロードされたりと便利な面もあるので積極的に使って行きたいが、ドキュメントが乏しいので都度ソースを読みに行って仕様を理解しなければならないのがつらい。CookBook の FormHelper のドキュメントを誰か更新してくれないだろうか、、、
ホームスクリーンの名前の変更

アプリの開発中にアプリの名前を変更しようと思うことがあるかもしれません。特に名前の長さによってアンドロイド上に表示される一部が切れてしまったり、改行されたりされてしまうので、スムーズに変更できると助かります。


これは単純にAndroidManifestファイル内で、launcherとなっているactivityのandroid:labelを変えることで、変更することが出来ます。


```
<activity
  android:name="MainActivity"
  android:configChanges="orientation"
  android:label="This is the title on Home screen"
  android:screenOrientation="portrait" >
        <intent-filter>
  <action android:name="android.intent.action.MAIN" />

  <category android:name="android.intent.category.LAUNCHER" />

```

注意点としては、実機テストをしている場合、この変更を行った後にアップデートではなく、インストールし直す必要があるということです。つまり変更時に元あったアプリをデイバイスからアンインストールた後、インストールしなければなりません。

そこに気が付かずさまよい続けたので、どなたかの参考までに。
onBackPressed()で戻るボタンの指定をしても機能しない時の対処法

WebViewのアプリを作っていて実機の戻るボタンを押した時にurlを１つ戻る様にコードを書いていたのですが、goback()が呼び出されたにも関わらずにアプリが終了してホーム画面に戻ってしまいました。
以下がそのときのコードです。


```
@override
public void onBackPressed(){
　　super.onBackPressed();
　　if(webview.canGoBack()){
			Log.d("goback", "webview will goback");
			webview.goBack();
	}else{
			Log.d("finish", "will finish the Activity");
			moveTaskToBack(true);
	}
}
```

ログを取ってみるとgoback()をしっかり通過しているのですが、最後にshowStatusIcon on inactive InputConnectionと表示されて終了してしまっています。

ここで

```
super.onBackPressed();

```
の部分を取り除いた所、今度はアプリが終了することなくgoback()が機能しました。


分からないことは多いですが、ひとまず躓いたら一度この部分を疑ってみるのもいいのかもしれません。
onBackPressedで呼び出したWebViewがnullの場合


onBackPressed内でwebviewがnullで返ってきてしまうエラーに直面しました。
class直下のfieldで定義していたのにも関わらず起こったので解決に時間がかかりました。
以下のコードがエラーを引き起こしていた時のものです。

```
public class OpenApp extends Activity {

WebView webview;

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.openapp);
  WebView webview = (WebView) findViewById(R.id.wvOpenApp1);
  webview.loadUrl("適当なURL");
}

@Override
public void onBackPressed(){
     if(webview.canGoBack()){
          webview.goBack();
      }else{
          moveTaskToBack(true);
      }
    return;
  }
}

```

fieldでwebviewを定義し、onCreate内で指定しているので、どのmethodでも機能するだろうと思っていましたが、onBackPressed内ではnullで返ってきます。

原因はonCreate内の”WebView”の部分。フィールドで定義しているのでonCreate内でもう一度WebViewと定義する必要はありません。トリッキーだったのはこの様にしてもonCreate内のwebviewは機能するということです。

こちらを消してもう一度テストしてみると今度はうまくgoback()が機能しました。

超初歩的なミスですが、盲点でしたのでどなたかの参考までに。
OnKeyListenerがキーボードを感知するエラーの対処法

先日webviewのアプリでログインのためにキーボードで文字を打ち込んだ所、全く文字入力が受け付けつけてもらえず、１つ前のurlに戻ってしまうというエラーが起こりました。

わけも分からずwebview.goback()が呼ばれている所を詳しく見てみると、

```
webview.setOnKeyListener(new OnKeyListener() {
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event) {
  }
});

```
内でgoBack()が呼ばれていることがわかりました。Android Developersに書かれているように、通常ならonKeyListenerはハードウェアのボタンに反応し、ソフトウェア内のボタンには反応しないはずです。事実エミュレーターや他のandroidデバイスでの実機テストではこういったことは起こりませんでした。

原因はわかりませんが、onKeyListenerで実装するのをやめ、onBackPressedをかわりに採用した所、エラーが解決しました。

もし文字の入力などで、エラーが発生した場合はonKeyListenerを疑ってみるもいいかと思います。
Xcodeビルドで発生するCocoaPods関連のエラー覚書


"Diff: ...Pods/Manifest.lock: No such file or directory" 
とか 
".../Pods/Pods-resources.sh: line 5: /resources-to-copy-Ubiregi2.txt: Permission denied" 
みたいなの。

なんか最近よく遭遇した。`Pods/`以下をexcludeしてGitブランチを切り替えて開発しているとよく起る気がする。

`pod install`しろとメッセージが出て従うと`Manifest.lock`ファイルの問題は解決されるけど、他のリソースファイルやヘッダーを参照できてない項のエラーが出る。

リソース見付からないのは`Build Settings`から`PODS_ROOT`の設定がなぜかなくなっていることが直接の原因。Xcodeプロジェクトファイルをreopenすると再設定されビルドできるようになる。

ヘッダー見付からないのは Pods/ 以下にそもそもそのファイルがチェックアウトできてない、というのもあった。

リポジトリ内に`*.podspec`を保持しててバージョニングできずに直接中身書きかえて`pod update`したらなんかビルドエラー出たというケースもあった。

## まとめ

1. `gem install cocoapods`
2. Xcodeプロジェクト閉じる
3. `rm -rf Pods/` 
4. `pod install`
5. Xcodeで Clean

すればたいてい直った(Specリポジトリのキャシュが壊れてると直らないけど)。
Redshiftにpsqlのワンライナーで接続したい

Amazon Redshiftにpsqlで接続するときに、psqlのオプションにパスワードの指定オプションがないため、毎回パスワード入力のプロンプトが出てきて面倒な人向け

```
$ PGPASSWORD=[password] psql -h [Endpoint] -U [username] -d [dbname] -p [port]
```
[Ruby] Route53 で ELBにサブドメインを振る

前提: Route53 にベースとなるドメインが設定されていること

```rb
require "aws-sdk"
AWS.config access_key_id: ENV["AWS_ACCESS_KEY_ID"],
  secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"]

def modify_route53 subdomain, operation, opt = {ttl: 300}
  resp = AWS::Route53.new.client.list_hosted_zones
  resp[:hosted_zones].each do |zone|
    if zone[:name] == "#{ENV['BASE_DOMAIN']}."
      elb_name = ENV["AWS_ELB_DNS_NAME"]
      dns_name = "#{subdomain}.#{zone[:name]}"
      record_type = "CNAME"
      options = {
        ttl: opt[:ttl],
        resource_records: [{value: elb_name}]
      }
      request_params = [dns_name, record_type, options]
      rrsets = AWS::Route53::HostedZone.new(zone[:id]).rrsets
      batch = AWS::Route53::ChangeBatch.new zone[:id]

      case operation
      when :create
        next if rrsets[dns_name, record_type].exists?
        batch << AWS::Route53::CreateRequest.new(*request_params)
      when :delete
        next unless rrsets[dns_name, record_type].exists?
        batch << AWS::Route53::DeleteRequest.new(*request_params)
      else
        raise "Error: Unknown operation."
      end

      batch.call
      break
    end
  end
end

def register_to_route53 subdomain
  modify_route53 subdomain, :create
end

def unregister_from_route53 subdomain
  modify_route53 subdomain, :delete
end

#### test.sh ##########################
# #!/bin/sh
# AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID \
# AWS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY \
# BASE_DOMAIN=YOUR_BASE_DOMAIN \
# AWS_ELB_DNS_NAME=YOUR_ELB_DNS_NAME \
# ruby -e "require '/path/to/route53.rb'; register_to_route53 'foo'"
```
GitLabをEC2上で動かすまでの7コマンド

# やったこと

1. AWSマネジメントコンソールからEC2を起動（t2.microでやってみました→困った事に追記アリ）
2. Route53でお好きなドメインといい感じに紐づける
3. EC2にsshで入って後述の7コマンド叩いていく
4. ドメインにアクセス！動きました〜 :clap: 
5. まずは【Username: root Password: 5iveL!fe】でログインして、必要に応じてさっそく上のメニューバーのところの「Admin area」からユーザーを追加したりして使っていきます:smiley_cat: 

ひとまず今のところ問題なく使えています。大きいプロジェクトとか置き始めてなにか変化あったらまた書きます。

# 叩いたコマンド

```
$ sudo yum update
$ wget https://downloads-packages.s3.amazonaws.com/centos-6.5/gitlab-7.1.0_omnibus-1.el6.x86_64.rpm
$ sudo yum install openssh-server
$ sudo yum install postfix
$ sudo rpm -i gitlab-7.1.0_omnibus-1.el6.x86_64.rpm
$ sudo -e /etc/gitlab/gitlab.rb #自分のホストネームに直してください
$ sudo gitlab-ctl reconfigure
```

# 困った（？）こと

+ 初回ログインのときにパスワードを新しくしましょう画面→新しいものをいれる→ログイン画面で新しいパスワード→パスワードを新しくしましょう画面のループに。。
 + よくわからない挙動でしたが、他の画面（gitlab.example.com/profile）開いたらもうでてこなくなりました :frowning: 
+ 【20141030追記】EC2のインスタンスタイプについてですが、microだとちょっと厳しいようです…。あやしい動きをしており、少なくともsmallにした方が安定しているようです。

# 参考

+ https://about.gitlab.com/downloads/
jQueryプラグインを作成してみる

jQueryのプラグインの作成手順を共有します。

### なぜjQueryのプラグイン
* コードを明るく書ける
* 1回だけ書いて、どこでも使える（DRY）

### 新規のプラグインの定義
```js:myPlugin.jp
(function(){
// 内容
})(jQuery);
```

### functionの定義
```js:myPlugin.jp
$.fn.<function名> = function(userOptions){
...
};
```

### defaultオプションの定義
```js:myPlugin.jp
$.fn.<function名> = function(userOptions){
var options = {
// defaultオプション
}
$.extend(options, userOptions); // オプションがuserOptionsで更新される
...
};

```

### functionのマイン内容
```js:myPlugin.jp
return $(this).each(function(){ // 注：eachを必ず付けてください
...
});
```

###　例：
```js:myPlugin.jp
$.fn.fade_anime = function(userOptions){
var options = {
  interval: 500,
  opacity: 0.5
}
$.extend(options, userOptions);
return $(this).each(function(){
  var container = $(this);
  var fadeIn = true;
  var timerId = setInterval(function(){
  if (fadeIn){
    container.fadeTo("fast", options.opacity);
    fadeIn = false;
  } else {
    container.fadeTo("fast", 1);
    fadeIn = true;
  }
}, options.interval);
});
}(jQuery);
```
### 呼び出すの例
```js:main.js
$("#div1").fade_anime();
$("#div2").fade_anime({interval: 1000, opacity: 0.3});
```

### 是非試してください
DokkuのNginxをlua module付きに更新

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

Dokkuをインストールした環境ではNginxチームが保守するNginx1.6.x(stable)のリポジトリが導入される。
このリポジトリを含め、debian系が提供する`nginx-extras`はちょっといいモジュールが追加してビルドしたNginxのパッケージだ。

特に注目は`Embedded Lua`。Spdyも目立つがこちらは標準でも含まれているので。

```
# apt-cache show nginx-extras
Package: nginx-extras
Source: nginx
Priority: extra
Section: httpd
Installed-Size: 1465
Maintainer: Kartik Mistry <kartik@debian.org>
Architecture: amd64
Version: 1.6.0-1+trusty0

-- snip --

Description: nginx web/proxy server (extended version)
 Nginx ("engine X") is a high-performance web and reverse proxy server
 created by Igor Sysoev. It can be used both as a standalone web server
 and as a proxy to reduce the load on back-end HTTP or mail servers.
 .
 This package provides a version of nginx with the standard modules, plus
 extra features and modules such as the Perl module, which allows the
 addition of Perl in configuration files.
 .
 STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Browser,
 Charset, Empty GIF, FastCGI, Geo, Gzip, Headers, Index, Limit Requests,
 Limit Zone, Log, Map, Memcached, Proxy, Referer, Rewrite, SCGI,
 Split Clients, SSI, Upstream, User ID, UWSGI.
 .
 OPTIONAL HTTP MODULES: Addition, Auth Request, Debug, Embedded Perl, FLV,
 GeoIP, Gzip Precompression, Image Filter, IPv6, MP4, Random Index, Real IP,
 Secure Link, Spdy, SSL, Stub Status, Substitution, WebDAV, XSLT.
 .
 MAIL MODULES: Mail Core, IMAP, POP3, SMTP, SSL.
 .
 THIRD PARTY MODULES: Auth PAM, Chunkin, DAV Ext, Echo, Embedded Lua,
 Fancy Index, HttpHeadersMore, HTTP Substitution Filter, http push,
 Nginx Development Kit, Upload Progress, Upstream Fair Queue.
Description-md5: a1852af8d0ef61a51df8e6cb9581d6a6
```


ちなみにアプリケーションファイアーウォールが使いたい場合、nginx-naxsi(WAF for NGINX)というのもある。

## nginx-extras 1.6.xの導入

`apt-get`で入れよう。

```
# apt-get install nginx-extras
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  liblua5.1-0 libperl5.18
Suggested packages:
  nginx-doc
The following packages will be REMOVED:
  nginx-full
The following NEW packages will be installed:
  liblua5.1-0 libperl5.18 nginx-extras
0 upgraded, 3 newly installed, 1 to remove and 0 not upgraded.
Need to get 699 kB of archives.
After this operation, 922 kB of additional disk space will be used.
```

これだけでOK。

## サンプル

で、前回の[Dokkuでアプリ別のカスタムNginx設定 - Qiita](http://qiita.com/sawanoboly/items/614f81c13ceadb9a3cff "Dokkuでアプリ別のカスタムNginx設定 - Qiita") と組み合わせて。

`nginx.inc.conf`を次のようにluaでコンテンツを返すように書いてみます。


```nginx.inc.conf
location = /lua {
    default_type 'text/plain';
    
    content_by_lua "ngx.say('Hello,lua module!')";
}
```

Dokkuにアプリをデプロイして、`/lua`にアクセス。

```
$ curl -k https://sinatra-test.example.com/lua
Hello,lua module!
```

できた。


`$APP/ENV`から値を取るようにnginx内で仕込めればフロントエンドとして使いやすくなりそう。

追記：
とりあえずのお勧めは、`nginx.conf`に`env DOKKU_ROOT=/home/dokku;`あたりを書いておくとよさそう。
SublimeText3 VIM化の初期設定メモ

# VIM化設定

`"ignored_packages": []`
デフォルトで無効にされているVintageを有効にする設定

`"vintage_ctrl_keys": true`
ctrl キーを使用する vim のショートカットが使えるようにする設定

`"vintage_start_in_command_mode": true`
ファイルを開いた時にコマンドモードで始まるようにする設定

```json:Settings-User
{
    "ignored_packages": [],
    "vintage_ctrl_keys": true,
    "vintage_start_in_command_mode": true
}
```

# Vintage Escape

[Package Control](https://packagecontrol.io/packages/Vintage%20Escape) / [GitHub](https://github.com/tonymagro/VintageEscape)

PackageControlからインストールできます。
補完の候補表示中にESCキー押下でインサートモードを終了できます。
個人的には必須です。

# ブロックカーソル
**[jlangston/BlockCursorEverywhere · GitHub](https://github.com/jlangston/BlockCursorEverywhere)**

[SimpleClone](https://github.com/mikefowler/simple-clone) とは相性が悪いみたいです。
書いてあるけど、テーマファイルに下記を追加すると色も変えれるよ！よ！

**テーマファイルの格納先：**
/Users/ユーザ名/Library/Application Support/Sublime Text 3/Packages/User

```xml:yourtheme.tmTheme
<dict>
    <key>name</key>
    <string>Block Cursor</string>
    <key>scope</key>
    <string>block_cursor</string>
    <key>settings</key>
    <dict>
        <key>foreground</key>
        <string>#222</string>
        <key>background</key>
        <string>#86C797</string>
    </dict>
</dict>
```

※テーマは [Centurion](https://github.com/allanhortle/Centurion) を使っているので、その色に合わせた色になってます。

# gt gT でタブ移動のキーバインド
```json:KeyBindings-User
[
    {
        "keys": ["g", "t"],
        "command": "next_view",
        "context":
        [
            { "key": "setting.is_widget", "operand": false },
            { "key": "setting.command_mode" }
        ]
    },
    {
        "keys": ["g", "T"],
        "command": "prev_view",
        "context":
        [
            { "key": "setting.is_widget", "operand": false },
            { "key": "setting.command_mode" }
        ]
    }
]
```

# Vimとは関係ないけどVintageにしてからよく使うキーボードショートカット

|キー|内容|
|:--|:--|
|Option + Command + `n`|画面を `n` 個のグループに横分割する|
|Option + Command + Shift + 2|縦に分割する|
|Cntrol + `n`|`n` 番目のグループに移動する|
|Cntrol + Shift + `n`|現在のファイルを `n` 番目のグループに移動する|
|Option + Command + 1|画面を１つに戻す！|
|F5|ソートする。<br>ふぇぇ `:sort` がないよぅってなったので|

個人的に縦分割は2個以上使わないのでこんな感じに。
横分割も2個以上はあんまり使いませんけれども！
ネットワーク関連メソッドの返り値は void じゃなくて RAC を使って返す

ネットワーク関連のメソッド、どうしても返り値を `void` にしてしまいますね。

私はそれなりにメソッドを細かく切る派なので、AF で GET するだけのメソッド等をよく作ります。
このようなメソッドは、引数にブロックをとり、返り値を `void` にするかと思います。

しかし、そのようにすると `getHogeHuga` などの名前のメソッドで `void` を返すことになり気持ち悪いですね。
こういうときは ReactiveCocoa を使うと良いです。

```objc:HogeClient.m
- (RACSignal *)getHogeHuga {
    return [[AFHTTPRequestOperationManager manager] rac_GET:@"HOGE_URL" parameters:nil];
};
```

呼び出し側は、

```objc
[[hogeClient getHogeHuga] subscribeNext:^(id JSON) {
  // DO SOMETHING
} error:^(NSError *error) {
  // DO ERROR HANDLING
}];
```

やってることはそんなに変わらないけどそこそこ心洗われる文法になりましたね。

ちなみに Pod は

```rb:Podfile
pod "AFNetworking"
pod "ReactiveCocoa"
pod "AFNetworking-RACExtensions"
```

同じことは PromiseKit でも出来ますがエラーが別ブロックに分かれてくれない（多分）ので RAC で良いと思います（小並感）
HHKBからRealforceに乗り換えた

友人とラグナロクオンラインを再開することになり、Insertキーや独立したFunctionキーが必要になった。
MacbookやHappy Hacking Keyboard（HHKB）ではこの要件を満たせない。
そこでHHKBを2個とも売っぱらい、要件をみたすRealforceに乗り換える事にした。

購入したモデルはRealforce 87UB SE170S。
初期設定でやったことを備忘録代わりに載せておく。
これやっとかんと正直死ねる。

## ControlとCapsLockキーの入れ替え

購入したモデルには入れ替えようのキーが付属している。
取り外し器具も付いているので、それを使って入れ替える。
その後、キーボード裏のスイッチ1をONにして完了。
Macのキーボード設定を使わなかった理由は、CapsLockキーがONになっている時のブルーライトを表示させたいからです。

## CommandとAltキーの入れ替え

デフォルトではMacbookのキーボードと逆になっているので、OSの環境設定>キーボードから入れ替える。
キーボード上の見た目は修正出来ないが、WindowsキーにCommandが割り当てられてると糞使いにくいのでこの設定は必須。
SwiftのGenericsの挙動メモ


自分メモです。
Xcode6 Beta4で、Generics周りでコンパイラの挙動が怪しい。
コンパイラのバグなのか仕様なのかよくわからないので、正式版が出たらもう一度コンパイルしてみようかなと思います。

Segmentation Faultになる
-------

このコードは、

```
class SomeClass<T1> {
    struct ValueInfo {
        let value: T1
    }
    
    private(set) var array = [ValueInfo]()
    
    func add(value: ValueInfo) {
        array.append(value)
    }  
}
```

こんな感じでSegmentation Faultになる。

```
1.	While emitting IR SIL function @_TFC6petamp9SomeClass3addU__fGS0_Q__FVS0_9ValueInfoT_ for 'add' at /Users/k_morishita/Documents/xcode/hogehoge/hogehoge/Spike.swift:18:5
<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>:0: error: swift frontend command failed due to signal (use -v to see invocation)
Command /Applications/Xcode6-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 254
```

無限ループ？
-----

swiftのコンパイラがCPU100%で止まらなくなる。

```
class SomeClass<T1> {
    struct ValueInfo<T2> {
        let value: T2
    }
    
    private(set) var array = [ValueInfo<T1>]()
    
    func add(value: ValueInfo<T1>) {
        array.append(value)
    }   
}
```

これならOKだった
-------

Nested Type な struct を外に出したらOKでした。

```
struct ValueInfo<T2> {
    let value: T2
}

class SomeClass<T1> {
    private(set) var array = [ValueInfo<T1>]()
    
    func add(value: ValueInfo<T1>) {
        array.append(value)
    }
}
```
nslookupの返却値

nslookupの返却値を一覧にするツールを作ってる時に学んだこと。

やりたいこと。
正常動作の場合は例えば

```
C:\Users\aaaa>nslookup 74.125.235.111
サーバー:  XXXXXXXXXXXXX
Address:  192.168.1.1

名前:    nrt19s02-in-f15.1e100.net
Address:  74.125.235.111
```

というときの「nrt19s02-in-f15.1e100.net」を取得。

エラーの場合は例えば

```
C:\Users\aaaa>nslookup 1.2.3.4
サーバー:  XXXXXXXXXXXXX
Address:  192.168.1.1

*** XXXXXXXXXXXXX が 1.2.3.4 を見つけられません: Non-existent domain
```

というときの「*** XXXXXXXXXXXXX が 1.2.3.4 を見つけられません: Non-existent domain」を拾う。

以上です。細かいところは省きます。

ひっかかったところはエラーの時の文言です。
正常系は全部の文言が返ってきたのでそれをうまくやれたんですが、エラーのときはどうも文言が返却されない模様。

試しにファイルに出力してみると

```
C:\Users\aaaa>nslookup 1.2.3.4 > test.txt
*** XXXXXXXXXXXXX が 1.2.3.4 を見つけられません: Non-existent domain
```

欲しい文言がなんでか外に出てしまってファイルには

```
サーバー:  XXXXXXXXXXXXX
Address:  192.168.1.1
```

としか書かれていない。

調べたら標準出力と標準エラーっていうのがあるんですね。
エラーの文言は標準エラーってやつらしいです。
2を書けば

```
C:\Users\aaaa>nslookup 1.2.3.4 2> test2.txt
サーバー:  XXXXXXXXXXXXX
Address:  192.168.1.1
```

となってファイルには

```
*** XXXXXXXXXXXXX が 1.2.3.4 を見つけられません: Non-existent domain
```

と出力されました。