OmniAICreator/Qiita-1.07M huggingface dataset:
カラーサンプルを用意する備忘録

##概要
WPFで見栄えを良くする為に、とにかくカラーサンプルを用意したくなる時があります。
カラフルな箱を沢山並べたり・・・
ランダムに色コードを生成しても良いのですが、乱数で生成された色コードでは、綺麗でない色が生成される確率が高いためイマイチ見栄えがよく有りません。

##System.Windows.Media.Colorsを利用する
皆さんご存の通り、Colorsクラスに、well-known Colors（有名な色、代表的な色）が用意されています。
ですが、実装を調べてみると列挙型では無くて、プロパティとして実装されています。
[MSDN Colors](http://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/Windows/Media/KnownColors.cs,0584e1e7d7fb612c)
内部でKnownColor列挙型を利用しているので、そちらを公開してくれていれば、話は速いのですが、残念ながらinternalクラスです。
列挙型ならEnum.GetNames()メソッドを使えたんですけどね。
そんな時には、リフレクションです。

```
var methods = typeof(Colors).GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.GetProperty);

for(int i = 0; i < methods.Count(); i++)
{
    var color = (Color)methods[i].Invoke(methods[i], null);
}
```

リフレクションは、速度が遅いので使い方を誤ると痛いしっぺ返しを受けますが、起動時に一回だけカラーコードを引っこ抜くので有れば、問題はありません。
Visual Studio 2015 で共有プロジェクトを追加できないときに

ソリューションに共有プロジェクトを追加しようとしたら、こんなエラーが。

	---------------------------
	Microsoft Visual Studio
	---------------------------
	インポートされたプロジェクト "C:\Program Files (x86)\MSBuild\Microsoft\WindowsXaml\v14.0\8.1\Microsoft.Windows.UI.Xaml.CSharp.targets" が見つかりませんでした。<Import> 宣言のパスが正しいかどうか、およびファイルがディスクに存在しているかどうかを確認してください。  C:\Program Files (x86)\MSBuild\Microsoft\WindowsXaml\v14.0\Microsoft.Windows.UI.Xaml.CSharp.targets
	---------------------------
	OK   
	---------------------------

みんな大好きStack Overflowに解決策があったので、メモ。
[Why can't I create Shared Project in Visual Studio 2015?](http://stackoverflow.com/questions/31565489/why-cant-i-create-shared-project-in-visual-studio-2015)

以下のファイルを修正すればいいようだ。
  C#:`%ProgramFiles(x86)%\MSBuild\Microsoft\VisualStudio\v14.0\CodeSharing\Microsoft.CodeSharing.CSharp.targets`
VB:`%ProgramFiles(x86)%\MSBuild\Microsoft\VisualStudio\v14.0\CodeSharing\Microsoft.CodeSharing.VisualBasic.targets`

8行目辺りの記述を、

```xml:修正前
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets')"/>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" Condition="!Exists('$(MSBuildExtensionsPath32)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets')" />
```
↓

```xml:修正後
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\WindowsXaml\v$(VisualStudioVersion)\Microsoft.Windows.UI.Xaml.CSharp.targets" Condition="false"/>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" Condition="true" />
```
（1個目のConditionをfalse、2個目のConditionをtrue、に変更）
のように修正すると、めでたく共有プロジェクトを追加できるようになった。
[BASH] PROMPT_COMMANDで複数の処理を行う


#**PROMPT_COMMAND**の復習

BASHでは、PROMPT_COMMANDに関数やコマンドを設定することで、新しいプロンプトが表示される前にそれが実行される。

##**PROMPT_COMMAND**の使用例【.bashrcに入れる】
### 複数のターミナルセッションのヒストリを実行順に保存する

```bash
shopt -u histappend # セッションクローズ時のヒストリファイルへの自動追記をOFF
export PROMPT_COMMAND="history -a" # コマンド実行ごとにヒストリーをファイルに書き出す
```

### iTermのタイトルにいろいろ表示させる
```bash
export PROMPT_COMMAND='echo -ne "\e]0;${USER}@${HOSTNAME%%.*} [${LINES}x${COLUMNS}]\a"'
```
> luser@MacBook-Air [40x120]

###Qiitaに掲載されているPROMPT_COMMANDの応用例
- [ディレクトリ移動したらls pushd popd cd autocd対応版](http://qiita.com/uplus_e10/items/c58ab78e062218dc4eda)
- [実行したコマンドの終了コードを表示する](http://qiita.com/takayuki206/items/f4d0dbb45e5ee2ee698e)

#PROMPT_COMMANDの問題
これらの複数のことをPROMPT_COMMANDで行おうとすると、

```bash
export PROMPT_COMMAND="hogehoge; ${PROMPT_COMMAND}"
```
とPROMPT_COMMANDに追記していくようになるのですが、注意しないと、*.bashrc*の再読読み込み`. .bashrc`としたときなど、以前のPROMPT_COMMANDが残ってしまうことがあります。
また、複雑なプロンプトの設定を支援してくれる[bashish](http://bashish.sourceforge.net/)は、勝手にPROMPT_COMMANDをunsetしたり、書き換えたりします。

#解決法：ディスパッチ処理の導入
そこで、*PROMPT_COMMAND*にはディスパッチ処理のみを登録し、個別の処理は、*PROMPT_COMMAND_hogehoge*に設定します。

```bash:.bashrc
# ディスパッチ処理
dispatch () {
        export EXIT_STATUS="$?" # 直前のコマンド実行結果のエラーコードを保存

        local f
        for f in ${!PROMPT_COMMAND_*}; do #${!HOGE*}は、HOGEで始まる変数の一覧を得る
            eval "${!f}" # "${!f}"は、$fに格納された文字列を名前とする変数を参照する（間接参照）
        done
        unset f
}
export PROMPT_COMMAND="dispatch"

# iTermのタイトルにいろいろ表示させる
export PROMPT_COMMAND_STATUS='echo -ne "\e]0;${USER}@${HOSTNAME%%.*} [${LINES}x${COLUMNS}]\a"'
# 複数のターミナルセッションのヒストリを実行順に保存する
shopt -u histappend
export PROMPT_COMMAND_HISTSAVE="history -a"
```
#参考にしたもの
[Bash変態文法最速マスター? (2.4 変数の間接参照)(2.5 特定の名前で始まる変数のリスト)](https://sites.google.com/a/tatsuo.jp/programming/Home/bash/hentai-bunpou-saisoku-masuta#TOC--3)

これで、*PROMPT_COMMAND*で複数の処理をさせるときの混乱が減れば幸いです。
指定したパス配下にある全てのファイル一覧のファイル名称とサイズを取得するコマンド


```shell
ll -RF [パス] | grep -v / | awk '{printf("%s %s\n", $9, $5); }'
```

>-R: 再帰的に調査
>-F: ファイル名にファイル・タイプを表す記号を付けて表示する（詳細は下記の表）。
>
| ファイルの種類 | 表記 |
|-----:|-----:|
| ディレクトリ | / |
| 実行可能ファイル | * |
| シンボリックリンク | @ |
| FIFO	\| |
| ソケット|	= |

>（`-h` オプションを `ll` につけると適切なバイト単位で表示してくれます。）

### サンプル出力

```
01.txt 1254
02.txt 22537
03.txt 501037
04.txt 562537
```
Macの「関連文字に変換」等のショートカットを消す

SublimeTextとJapaneseIMでショートカットが被っててうざかったので、
まったく使わんJapaneseIMのほうを消すことにした。

* SublimeText
  * Focus Group → Ctrl+数字
* JapaneseIM
  * 関連文字に変換 → Ctrl+1
  * 部品の共通な感じを検索 → Ctrl+2

調べたらショートカットの設定ファイルがあるとのこと。
`/System/Library/Input Methods/JapaneseIM.app/Contents/Resources/KeySetting_Default.plist`

こいつの該当部分をコメントアウトしてMacを再起動する

```xml:
<!--
  <key>control+&apos;1&apos;</key>
  <dict>
    <key>command</key>
    <string>show_related_characters</string>
    <key>menu_item</key>
    <true/>
  </dict>
  <key>control+&apos;2&apos;</key>
  <dict>
    <key>command</key>
    <string>show_similar_characters</string>
    <key>menu_item</key>
    <true/>
  </dict>
-->
```

無事、ショートカットの消失を確認をし、事なきを得た。
めでたしめでたし。
JavaScript  es5のプロトタイプを書いて復習したメモ

es6をもっとを体得する前に
まずes5のプロトタイプを書いて復習しよう思ったのでメモです。

## 基本を復習

↓すごくわかりやすい説明でした
JavaScriptの「プロトタイプ入門」
http://qiita.com/takeharu/items/809114f943208aaf55b3


```js:sample

    // Personクラス
    var Person = function(aName){
        this.name = aName;
        this.hello = function(){
            console.log('こんにちは、私は' + this.name + 'です');
        }
    };
    var John = new Person('ジョン');
    var Paul = new Person('ポール');
    console.log(John === Paul); // false
    console.log(John.hello === Paul.hello); // false




    // プロトタイプで書いてみる
    var Person = function(aName){
        this.name = aName;
    }
    Person.prototype.hello = function(){
        console.log('こんにちは、私の名前は' + this.name + 'です');
    };
    var John = new Person('ジョン');
    var Paul = new Person('ポール');
    console.log(John === Paul); // false
    console.log(John.hello === Paul.hello); // true


```
console.log(John.hello === Paul.hello) がtrue になる！　
hello()の挙動は一緒なので、個別で持つ必要なし。親にひとつあればよし。
メモリの節約。


## 継承してみる


```js:sample

    // プロトタイプ継承してみる
    // アニマル ← 犬

    // Animalクラス
    var Animal = function(aName){
        this.name = aName;
    };
    Animal.prototype = {
        voice: 'ギャオー',
        bark: function(){
            console.log(this.voice + 'と鳴いた');
        }
    };

    // Dogクラス
    var Dog = function(aVoice){
        this.voice = aVoice;
    }

    // Animalクラスを継承
    Dog.prototype = new Animal();
    var dog = new Dog('わんわん!');
    dog.bark(); // わんわん！と鳴いた


```




## オーバーライド
子クラス内で親クラスのメソッドを上書きする
(親クラスのメソッドは影響を受けない)

```js:sample

    // オーバーライドしてみる

    var Human = function(aName){
    	this.name = aName;
    };
    Human.prototype.greeting = function(){
        console.log('はじめまして、私は' + this.name + 'です');
    };
   
    var John = function(){
        this.name = 'ジョン';
        this.super = Human.prototype; 
    }
    John.prototype = new Human();

    // オーバーライド
    John.prototype.greeting = function(){
        console.log('今後ともよろしくおねがいします' + this.name + 'です');
        // this.super.greeting.call(this); (子クラスから親クラスのgreetingメソッドを呼ぶ)
    };
    var jhon = new John();
    jhon.greeting(); // 今後ともよろしくおねがいしますジョンです


    // こっちは影響うけない
    var paul = new Human('ポール');
    paul.greeting(); // はじめまして、私はポールです。

```


完
ActiveRecordのwith_lockは自動でreloadされる

表題の通り

```rb
u = User.last
u.updated_at = nil #=> (1)
u.with_lock do
  u.updated_at #=> (1) では無くDBの値になる
end
```

該当するRailsのソースはここ

```rb:pessimistic.rb
module ActiveRecord
  module Locking
    module Pessimistic
      def lock!(lock = true)
        reload(:lock => lock) if persisted?
        self
      end

      def with_lock(lock = true)
        transaction do
          lock!(lock)
          yield
        end
      end
    end
  end
end
```
PhpStormのxdebugを有効にする（vagrantの場合）

タイトルの件。私の環境の場合です。

PhpStorm 9.0.2
vagrant 1.7.4
（http://192.168.33.10/ で動いてる）

vagrantが起動しているディレクトリで、sshに入る

```
$ vagrant ssh
```

xdebug.iniを見つけて編集し、Apatchを再起動

```
[vagrant@localhost ~]$ cd /etc/php.d/x
xdebug.ini     xml_wddx.ini   xmlwriter.ini  
xml.ini        xmlreader.ini  xsl.ini   
[vagrant@localhost ~]$ sudo vi /etc/php.d/xdebug.ini
ーーーここでの追記内容は下記ーーー
[vagrant@localhost ~]$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
```

追記内容

```
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.remote_enable=1
xdebug.remote_port="9000"
xdebug.default_enable=1
xdebug.remote_autostart=1
xdebug.remote_connect_back=1
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/tmp"
xdebug.max_nesting_level=1000
xdebug.idekey = "PHPSTORM"
```

次に、PhpStorm側に接続環境を保存する。

```
PhpStormのメニュー
Preferences > Languages & Frameworks > PHP > Servers で、

Host:192.168.33.10
Port:80
Debugger:Xdebug

として、

User path mappings にチェックし、/vagrant フォルダを指定する
```

あと、Run/Debug Configurationsを追加します。（15/10/19追記）
（右上のデバッグぽいアイコンの列にプルダウンがあって、
　Edit Configurations... が選べるはず。）

```
+ボタンを押して、
PHP Remote Debug
を選択。
Servers : 192.168.33.10
Ide key : PHPSTORM
としてOKする。
```

念のため、もうひとつやってることがあります。
PhpStormでデバッガを起動したら、
同時にブラウザ側にブックマークで保存してるjsも動かしています。

```
start debugger
javascript:(/** %40version 0.5.2 */function() %7Bdocument.cookie%3D%27XDEBUG_SESSION%3D%27%2B%27PHPSTORM%27%2B%27%3Bpath%3D/%3B%27%3B%7D)()

stop debugger
javascript:(/** %40version 0.5.2 */function() %7Bdocument.cookie%3D%27XDEBUG_SESSION%3D%27%2B%27%27%2B%27%3Bexpires%3DMon, 05 Jul 2000 00:00:00 GMT%3Bpath%3D/%3B%27%3B%7D)()
```

他の方の参考になるかどうかw
完全に自分用のメモです。
【Laravel5】 StorageファサードでS3上のディレクトリを消そうとして詰んだ時の解消方法

# 前提
AWSアカウントでは最大で100個のバケットを作成できます。(デフォルト)  
裏を返すと100個までしかバケットを作成することができません。
そのため、各環境ごとにバケットを作成してその下にプロジェクト毎にディレクトリを作って運用しています。
以下の例のようなイメージです。
なお、dev環境で実装中にpro環境のファイルを誤って消去しないようにACCESS KEYは別なものを使用しています。

## 例
```
S3/
 ├dev/
 │   ├-ApplicationA/
 │   │             └-year
 │   │                 └-month
 │   │                    └-1.jpg
 │   └-ApplicationB/
 │
 │-stg/
 │   ├-ApplicationA/
 │   │             └-year
 │   │                 └-month
 │   │                    └-1.jpg
 │   └-ApplicationB/
 │
 └-pro/
     ├-ApplicationA/
     │             └-year
     │                 └-month
     │                    └-1.jpg
     └-ApplicationB/
```

# StorageファサードでS3へ接続
以下を参考にして実装しています。
[【Laravel5】Storageファサードでお手軽S3アップロード](http://qiita.com/yamato/items/7b8aab6e1f3556e9aadb)

# ディレクトリを消す実装
※year/monthは画像がアップロードされた年月ですが、今回は簡易化のためにyear/monthとしています。

```
$DIR = 'ApplicationA/year/month/';
$disk = Storage::disk('s3');
$result = $s3->deleteDirectory($dir);

```

これで消えるはずでした。

## エラーメッセージ
```
 local.ERROR: Aws\S3\Exception\NoSuchKeyException: AWS Error Code: NoSuchKey, Status Code: 404, AWS Request ID: XXXXXXXXXX, AWS Error Type: client, AWS Error Message: The specified key does not exist., User-Agent: aws-sdk-php2/2.8.21 Guzzle/3.9.3 curl/7.19.7 PHP/5.5.xx ITR
```

上記のエラーメッセージが出てしまいました。
## 原因
単純ミス。
StrorageファサードでS3へ接続する場合

```config/filesystems.php
|  'bucket' => env('S3_BUCKET'),
```

でenvにS3_BUCKETを指定する必要が有ります。

```
S3_BUCKET = dev/ApplicationA
```

しかし、上記filesystemsで指定するbucketはkey通りbucketなので
各環境のディレクトリパスを含んではいけません。
つまり

```
S3_BUCKET = dev
```

のみの指定となります。
こうすることで実行が可能となりました。

# その他の実装方法
## aws-sdk-php-laravelを使う。
初期設定をした後

```
$s3 = \App::make('aws')->get('s3');
$bucket = env('S3_BUCKET');
$folder = 'ApplicationA/year/month/';
$s3->deleteMatchingObjects($bucket, $folder, '/.*/');
```

deleteMatchingObjectsを使用すればOKです。
参考:[AWS SDK for PHP v2 で S3 上の指定文字列にマッチするオブジェクトの削除](http://tetsuwo.tumblr.com/post/102677709667/aws-sdk-php-s3-remove-objects)
メソッドごとにパフォーマンスを計測したい


思ったよりも簡単です。やり方はFunction.prototype.applyを使ってあるメソッドの実行をhookするだけです。

```js:js

function calcPerf (tag, tgt, func, args) {
	tgt = tgt || this;
	args = args || [];
	var n = performance.now();
	func.apply(tgt, args);
	var t = performance.now() - n;
	if ( t > 16 ) {
		// over 60fps
		console.warn(tag+": takes "+t+" ms!";
	}
}

```

```js:js

calcPerf("drawSome", that, that.prototype.drawSome, [flag]);

```

こうすることで16ms以上かかったメソッドの実行を検出することができます。問題は実行するfuncの中のどの部分がheavyなのかは分かないという点ですが。
Xcode 7 で Validate 実行時に「The resulting API analysis file is too large.  〜」が表示される

## 事象
表題の状況にて以下のメッセージが表示される。
*The resulting API analysis file is too large. We were unable to validate your API usage prior to delivery. This is just an informational message.*

## 対応
特に無し。
*This is just an informational message.* とあるように、これはただのメッセージ。
このメッセージが表示された場合に本来 Xcode で Validate 時に行われていた API のチェックは Apple のサーバー上で行われ、問題があった場合はメッセージが届く。
[Android] AndroidStadioのインストール方法

Androidアプリの開発をすることになったので、
AndroidStadioをインストールすることにしました。

## インストール

![スクリーンショット 2015-05-29 13.59.20 1.png](https://qiita-image-store.s3.amazonaws.com/0/74021/e3fd28c2-27c1-82ed-0033-51c40e0878c0.png "スクリーンショット 2015-05-29 13.59.20 1.png")

まずは[公式サイト](https://developer.android.com/sdk/index.html)から、ファイルをダウンロードしましょう。

![スクリーンショット 2015-05-29 14.09.08.png](https://qiita-image-store.s3.amazonaws.com/1286/74021/80853cad-b865-85ce-0cc3-eefd4f04b1b0.png)

ファイルのダウンロードが終わったら、インストーラーをダブルクリックしてインストール開始を開始します。

![スクリーンショット 2015-05-29 14.09.20.png](https://qiita-image-store.s3.amazonaws.com/1286/74021/c60e9d78-c864-058c-6b92-7a11502d8892.png)

いつも通りアプリケーションフォルダに、ドラッグ&ドロップします。

![スクリーンショット 2015-05-29 14.13.24.png](https://qiita-image-store.s3.amazonaws.com/1286/74021/331f8db9-123d-fddd-064d-73419d5d58c4.png)

開いちゃいます。

![スクリーンショット 2015-05-29 14.13.35.png](https://qiita-image-store.s3.amazonaws.com/1286/74021/9d3ed2e6-93c3-38ae-d53d-e6ba77ebf515.png)

「インポートするファイルありますか？」と聞かれています。
特にインポートするファイルがなかったので、下を選択して「OK」をクリックします。

![スクリーンショット 2015-05-29 14.14.16.png](https://qiita-image-store.s3.amazonaws.com/1286/74021/57811f4d-18ac-60f7-d318-d77af7e24a7d.png)

ようこそ的なあれなので、「Next」でいいです。

![スクリーンショット 2015-05-29 14.14.25.png](https://qiita-image-store.s3.amazonaws.com/1286/74021/7dd6ab5d-a5d8-5dc2-f8ea-516df74bf048.png)

セットアップするけど、標準かカスタムのどっちがいいか聞かれてるのけど、
特に設定せいたこともなかったので、「Standard」にします。

![スクリーンショット 2015-05-29 14.21.46.png](https://qiita-image-store.s3.amazonaws.com/1286/74021/db5111e7-373a-76dd-27bd-4eeb678ba147.png)

AndroidのSDKをインストールする感じなのですが、
インストールしたいSDKを選択して「Accept」を選択します。

初めてインストールする場合は、全ての「▶」を選択して、
Acceptを選択すると「Finish」が選択可能になります。

![スクリーンショット 2015-05-29 14.38.37.png](https://qiita-image-store.s3.amazonaws.com/1286/74021/dda37397-2298-b920-a7d9-ebb34d21b278.png)

SDKのインストールが完了したら、「Finish」を押すとインストール完了です。

## 起動してみる
![スクリーンショット 2015-05-29 14.38.47.png](https://qiita-image-store.s3.amazonaws.com/1286/74021/8f026c35-9a19-4d0b-1e6a-bdbe887dadce.png)

インストール終了後、Android Studioを起動するとこのようになります。

## 余談
EclipseでAndroidの環境を構築するより簡単で、
短時間でインストール作業も終わったのでオススメです。
Windows+otto で「A required privilege is not held by the client.」と叱られたら

HashiCorp 社の otto のお話。

ローカルファイルを依存に指定するとエラーが発生する場合がある。

# 発生例

## 環境
* Windows 10
* Cygwin
* otto 0.1.1

## ディレクトリ構成

```
project
├── Appfile [*1]
└── mongodb
    ├── .ottoid
    └── Appfile [*2]
```

## ファイル内容

*1 /project/Appfile

```
application {
  name = "example"
  type = "ruby"

  dependency { source = "./mongodb" }
}

customization "ruby" {
  ruby_version = "2.0"
}
```

*2 /project/mongodb/Appfile

```
application {
    name = "mongodb"
    type = "docker-external"
}

customization "docker" {
    image = "mongo:3.0"
    run_args = "-p 27017:27017"
}
```

## コンパイル結果

```bash
$ otto compile
==> Loading Appfile...
==> Fetching all Appfile dependencies...
    Fetching dependency: file://C:/Users/hoge/project/mongodb
    Error compiling Appfile: error downloading module 'file://C:/Users/hoge/project/mongodb': symlink C:\Users\hoge\project\mongodb C:\Users\hoge\project\.otto\appfile\deps\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: A required privilege is not held by the client.
```

# 解決方法

Shift+Ctrl など使って、**管理者権限で実行する**

または、以下の方法で設定を変更する

[![How to fix "A required privilege is not held by the client" error](http://img.youtube.com/vi/L58OVl6GLUM/0.jpg)](http://www.youtube.com/watch?v=L58OVl6GLUM)

1. Win+R を押して `secpol.msc` を実行
![1.png](https://qiita-image-store.s3.amazonaws.com/0/2987/80597505-782e-b495-651d-1f94c3d6ec89.png)

2. 「ローカルセキュリティポリシー」から、「ローカルポリシー」を開く
![2.png](https://qiita-image-store.s3.amazonaws.com/0/2987/cad0d27b-fa43-3192-6e31-542385084025.png)

3. 「セキュリティオプション」を開く
![3.png](https://qiita-image-store.s3.amazonaws.com/0/2987/25eba562-7323-48a5-eeff-367eccd40a66.png)

4. 「ユーザーアカウント制御: 管理者承認モードですべての管理者を実行する」を開く
![4.png](https://qiita-image-store.s3.amazonaws.com/0/2987/4a397e22-7a30-a3ee-ac2d-8e0945290599.png)

5. 「無効」に設定
![5.png](https://qiita-image-store.s3.amazonaws.com/0/2987/131faba1-e40b-0bf7-2074-25648a376757.png)

6. 再起動

これにより、エラーを回避出来た。

※設定変更に関しては自己責任でお願いします。
EclipseとRedmineの接続方法(No.4)

#EclipseとRedmineの接続方法(No.4)
本書では、Eclipseのインストール方法、EclipseとRedmineの接続方法、EclipseとSubversionの接続方法に関して説明します。
通常、RedmineはWebブラウザから接続し、SubversionはSubversionクライアントから接続するので、開発者は用途に応じてEclipse、Webブラウザ、Subversionクライアントを閲覧、操作する必要があります。
しかし、本書で説明する方法でEclipseからRedmineとSubversionに接続できるようになり、開発者はWebブラウザやSubversionクライアントを開くことなく、Eclipse上だけで必要な操作ができるようになります。
これにより、開発者はEclipseだけで開発をすることができ、業務の効率性が向上します。
本書が開発をされる皆様のお役にたてれば幸いです。

* * *
* 
目次
- [A. Eclipseのインストール方法](http://qiita.com/ankosoft/items/205631b450cb170fee0c)
- [B. EclipseにRedmineと連動させるプラグインのインストール](http://qiita.com/ankosoft/items/c556258ce6f8684e4427)
- [C. EclipseとSubversionの連携プラグインのインストール方法](http://qiita.com/ankosoft/items/2208a6f8341b5c8a4566)
- **D. EclipseからSubversionにコミットする方法**

* * *

##D. EclipseからSubversionにコミットする方法

１．コミットするソースを選択したり、ルートフォルダーを選択して、マウス右ボタンをクリックし、「Team」－＞「コミット」をクリックします。

![d1.png](https://qiita-image-store.s3.amazonaws.com/0/94912/51e1b137-9fd3-b11d-1c76-64a0d1341a9a.png)

２．コミットする際に、コメントを入力することができます。
「完了チケット #2166」のように「完了チケット」+スペース+「＃＋コミット番号」で、コミットする成果物（ソース）とチケットが自動的に関連づけられ、チケットのステータスが自動で「終了」ステータスになり、進捗が「100%」に設定されます。

![d2.png](https://qiita-image-store.s3.amazonaws.com/0/94912/cb68924e-901d-66d0-43f5-c9835b7a68d1.png)

３．SubversionのIDとパスワードを入力して、「OK」をクリックします。

![d3.png](https://qiita-image-store.s3.amazonaws.com/0/94912/70b19638-4d1b-9e5f-da58-64f3244ae427.png)

４．項目「2.」でコミット時のコメントに、「完了チケット」というキーワードを入れたので、チケットのステータスが「終了」になり、進捗が「100%」になり、チケットとリポジトリのリビジョンが関連づけられています。

![d4.png](https://qiita-image-store.s3.amazonaws.com/0/94912/5f565d1b-5b66-e013-96e5-d6b76c8ea947.png)




（この資料は「[Ankosoft社](http://www.ankosoft.co.jp/)」の 「[EclipseとRedmineの接続方法](http://www.ankosoft.co.jp/wp-content/uploads/2015/04/Redmine%E3%81%A8Eclipse%E3%81%AE%E6%8E%A5%E7%B6%9A%E6%96%B9%E6%B3%95%E8%A7%A3%E8%AA%AC-Ankosoft.pdf)」より引用して作成しました。）
EclipseとRedmineの接続方法(No.3)

#EclipseとRedmineの接続方法(No.3)
本書では、Eclipseのインストール方法、EclipseとRedmineの接続方法、EclipseとSubversionの接続方法に関して説明します。
通常、RedmineはWebブラウザから接続し、SubversionはSubversionクライアントから接続するので、開発者は用途に応じてEclipse、Webブラウザ、Subversionクライアントを閲覧、操作する必要があります。
しかし、本書で説明する方法でEclipseからRedmineとSubversionに接続できるようになり、開発者はWebブラウザやSubversionクライアントを開くことなく、Eclipse上だけで必要な操作ができるようになります。
これにより、開発者はEclipseだけで開発をすることができ、業務の効率性が向上します。
本書が開発をされる皆様のお役にたてれば幸いです。

* * *
* 
目次
- [A. Eclipseのインストール方法](http://qiita.com/ankosoft/items/205631b450cb170fee0c)
- [B. EclipseにRedmineと連動させるプラグインのインストール](http://qiita.com/ankosoft/items/c556258ce6f8684e4427)
- **C. EclipseとSubversionの連携プラグインのインストール方法**
- [D. EclipseからSubversionにコミットする方法](http://qiita.com/ankosoft/items/65d5bb2a8bb5076fdd77)

* * *

##A. EclipseとSubversionの連携プラグインのインストール方法

１．「Help」->「Eclipse Marketplace」をクリックします。

![c1.png](https://qiita-image-store.s3.amazonaws.com/0/94912/dfe141a5-0b0e-0489-2ba1-ccea333acdf0.png)

２．Find欄で「subclipse」を入力して検索し、「Subclipse1.10.9」をインストールします。

![c2.png](https://qiita-image-store.s3.amazonaws.com/0/94912/0660dcc6-c655-e262-a482-1be128c68fb5.png)

３．下図で「Confirm」をクリックします。

![c3.png](https://qiita-image-store.s3.amazonaws.com/0/94912/793799ff-6e76-fa21-04e8-bdd4a4f3b332.png)

４．「同意する」にチェックを入れて、「Finish」ボタンをクリックします。

![c4.png](https://qiita-image-store.s3.amazonaws.com/0/94912/d9af8598-b075-059c-cd18-e29207b69308.png)

５．下図で「OK」をクリックします。

![c5.png](https://qiita-image-store.s3.amazonaws.com/0/94912/990210c9-a57c-957d-d860-1cb1181fb463.png)

６．下図で「Yes」をクリックすると、Eclipseが再起動します。

![c6.png](https://qiita-image-store.s3.amazonaws.com/0/94912/3efc8c2c-9812-f621-4e09-51729a09c49a.png)

７．Eclipseの左の領域で、マウス右ボタンをクリックし、ポップアップウィンドウで、「New」->「Other」をクリックします。

![c7.png](https://qiita-image-store.s3.amazonaws.com/0/94912/8b27e849-5ecd-7f33-6f67-c4821a625e91.png)

８．「SVN」->「SVNからプロジェクトをチェックアウト」を選択して、「Next」をクリックします。

![c8.png](https://qiita-image-store.s3.amazonaws.com/0/94912/e2164b55-412e-66ee-5f92-df4daa45f917.png)

９．「新規リポジトリ・ロケーションを生成」を選択し、「Next」をクリックします。

![c9.png](https://qiita-image-store.s3.amazonaws.com/0/94912/06ddb05a-309c-0810-717a-758f84fdf320.png)

10.Subversionのレポジトリのパスを入力して、「Next」をクリックします。

![c10.png](https://qiita-image-store.s3.amazonaws.com/0/94912/332caaad-da52-10df-8e58-a5ea065623ac.png)

11.ルートパスを選択して、

![c11.png](https://qiita-image-store.s3.amazonaws.com/0/94912/40d60b31-b04c-e541-0dca-48a4e19e909f.png)

12.「Finish」ボタンをクリックします。

![c12.png](https://qiita-image-store.s3.amazonaws.com/0/94912/8d344838-9403-4ad7-de75-ac32bff42af8.png)






（この資料は「[Ankosoft社](http://www.ankosoft.co.jp/)」の 「[EclipseとRedmineの接続方法](http://www.ankosoft.co.jp/wp-content/uploads/2015/04/Redmine%E3%81%A8Eclipse%E3%81%AE%E6%8E%A5%E7%B6%9A%E6%96%B9%E6%B3%95%E8%A7%A3%E8%AA%AC-Ankosoft.pdf)」より引用して作成しました。）
LaravelのbeforeFilterを利用して特定のControllerやActionにAjax通信の判定をかける

Laravelのfilterはルートだけではなく、Controller内に記載して特定のControllerやActionにだけ処理を適用することができます。
例えば、Route::resourceやRoute::controllerを利用している場合などに、ルーティングファイルでFilterをかけることはできないため、Controller側に記載し、ActionごとにFilterをかける必要があります。そんな場合の対応策を。

# Filterを作成
```php:app/filter.php
public function _filterAjax($route, $request)
{
    if (!Request::ajax())
        return Response::json('Ajax通信ではありません。');
    }
}
```

# Controllerに適用
```php
	public function __construct()
	{
		parent::__construct();
		$this->beforeFilter('_filterAjax');
	}
```
__constructのbeforeFilterでメソッドを呼ぶだけで、このControllerを実行する際に必ず実行されるようになります。
また、無名関数を作成しそこに直接記述することもできます。

```php
	public function __construct()
	{
		parent::__construct();
		$this->beforeFilter(function()
		{
			if (!Request::ajax())
				return Response::json('Ajax通信ではありません。');
			}
		});
	}
```

## 特定のActionにだけ適用する
```php
	public function __construct()
	{
		parent::__construct();
		$this->beforeFilter('_filterAjax', [
			'only' => [
				'update',
			],
		]);
	}
```
beforeFilterのonlyに指定すれば、指定したActionにのみにFilterがかかります。
なお、Filterをfilter.phpではなく、同一のControllerやBaseControllerに記述する場合は、メソッド名の前に@をつけて呼びだす必要があります。

```php
	public function __construct()
	{
		parent::__construct();
		$this->beforeFilter('@_filterAjax', [
			'only' => [
				'update',
			],
		]);
	}
```

# beforeFilterの指定方法あれこれ
filterのActionの指定方法は下記の指定ができます。

| 指定方法 | 内容                              |
|:--------|:----------------------------------|
|    only |指定したActionのみ                  |
|  except |指定したAction以外                  |
|      on |指定したメソッドのみ[post,get,etc...]|

onlyやonを組み合わせもできるので様々な状況で対応ができます。

```php
	public function __construct()
	{
		parent::__construct();
		$this->beforeFilter('_filterAjax', [
			'on' => [
				'post',
			],
			'only' => [
				'update',
			],
		]);
	}
```

記事はbeforeFilterのみでしたが、処理の後に行うafterFilterも同様に利用することができます。
Atomをvimっぽくするプラグイン5選

# はじめに
Atomなかなかつかいやすいエディタですが、
vimを今まで使っていた身なのでvimキーバインドになればさらに使いやすいです。
ってことでvimっぽくするためにいれている便利なプラグイン5選です。

## vim-mode
これはvimの各種キーバインドをせっていしてくれるもの。
これがないとはじまらない。

## ex-mode
exモードを追加するプラグイン。
ようするに「:」をおして入るアレです。

## vim-mode-visual-block
vim-modeでもヴィジュアルモードはつかえますが、
ブロックビジュアルモードには対応していません。
それを可能にするプラグイン。

## vim-mode-clipboard-plus
OSのクリップボードと連携してくれるようになります。

## vim-surround
テキストオブジェクトを使えるようになるプラグイン。


# おわりに
vimっぽく使えるエディタはいいエディタ。
Windows7でnginx+jenkins

## ダウンロード
[ダウンロードページ](http://nginx.org/en/download.html)から、Stable versionをダウンロード。
展開したら、nginx-1.8.0を以下に移動。
```c:/nginx-1.8.0```

## 起動
### nginx起動
```
cd c:/nginx-1.8.0
start nginx
```
これで[http://localhost](http://localhost)にアクセスすると、
defaultのnginxのページが立ち上がる。

### デフォルトのルート
デフォルトの設定では、```conf/nginx.conf```で、ルートが以下のように設定されている。
```root   html;```
localhostにアクセスすると、C:\nginx-1.8.0\html以下が表示される。

### nginxの基本コマンド

- 終了
```nginx -s stop```

- configファイルなどを書き換えた時
```nginx -s reload```

### jenkinsの設定
Jenkinsは普通にinstallすると、[http://localhost:8080](http://localhost:8080)に立ち上がると思うので、8080番portにとばす。
http{}以下を書き換える。

```
upstream jenkins {
    server 127.0.0.1:8080;
}

server {
    listen       80;
    server_name  hogehoge; 

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://jenkins;
    }
}
```


リロード(```nginx -s reload```)すれば、
[http://hogehoge](http://hogehoge) (自分がserver_nameにいれたやつ)で、jenkinsにアクセスできる。
EclipseとRedmineの接続方法(No.1)

#EclipseとRedmineの接続方法(No.1)
本書では、Eclipseのインストール方法、EclipseとRedmineの接続方法、EclipseとSubversionの接続方法に関して説明します。
通常、RedmineはWebブラウザから接続し、SubversionはSubversionクライアントから接続するので、開発者は用途に応じてEclipse、Webブラウザ、Subversionクライアントを閲覧、操作する必要があります。
しかし、本書で説明する方法でEclipseからRedmineとSubversionに接続できるようになり、開発者はWebブラウザやSubversionクライアントを開くことなく、Eclipse上だけで必要な操作ができるようになります。
これにより、開発者はEclipseだけで開発をすることができ、業務の効率性が向上します。
本書が開発をされる皆様のお役にたてれば幸いです。

* * *
* 
目次
- **A. Eclipseのインストール方法**
- [B. EclipseにRedmineと連動させるプラグインのインストール](http://qiita.com/ankosoft/items/c556258ce6f8684e4427)
- [C. EclipseとSubversionの連携プラグインのインストール方法](http://qiita.com/ankosoft/items/2208a6f8341b5c8a4566)
- [D. EclipseからSubversionにコミットする方法](http://qiita.com/ankosoft/items/65d5bb2a8bb5076fdd77)

* * *

##A. Eclipseのインストール方法

１．ブラウザで「http://eclipse.org/ 」を開き、「DOWNLOAD」ボタンをクリックして、Eclipseをダウンロードします。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/94912/6183feee-e5ba-3f3e-da5b-5b4145a952b8.png)

２．OS環境に合わせてダウンロードするプログラムの種別を選択します。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/94912/d04518a8-1842-2213-93b6-85076e6bbbef.png)

３．ダウンロードしたファイルは「Zip」ファイル形式で圧縮されています。任意のフォルダーに解凍します。

４．解凍したフォルダー内にある「eclipse.exe」を実行します。

５．起動すると「ワークスペース」を指定する画面が表示されます。設定して「OK」をクリックします。
ワークスペースは、Eclipse を使って作成するプログラムの保管場所（フォルダ）のことです。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/94912/ebac3914-a775-6de6-7295-9bb548b18fab.png)

６．「Eclipse」が起動します。

（この資料は「[Ankosoft社](http://www.ankosoft.co.jp/)」の 「[EclipseとRedmineの接続方法](http://www.ankosoft.co.jp/wp-content/uploads/2015/04/Redmine%E3%81%A8Eclipse%E3%81%AE%E6%8E%A5%E7%B6%9A%E6%96%B9%E6%B3%95%E8%A7%A3%E8%AA%AC-Ankosoft.pdf)」より引用して作成しました。）
DataPipelineの前提条件機能使ってみた

DataPipelineには、定義したActivity実行するかどうかを判断する前提条件機能（Precinditons）があるのですが、あまりそこに関するドキュメントが多くない気がしたので、ちょっと書いてみます。
前提条件機能については<a href="https://docs.aws.amazon.com/ja_jp/datapipeline/latest/DeveloperGuide/dp-concepts-preconditions.html">こちら</a>。

今回利用したのが、S3KeyExistsとShellCommandPreconditionの2つになるので、そちらのご紹介です。

# S3KeyExists
該当のファイルがs3に存在するかチェックします。

動作としては、指定のs3キーが作成されるまでチェックを行い続け、作成が確認できたらActivityを実行するという挙動になります。

設定の画面はこんな感じです。

![datapipeline_s3.png](https://qiita-image-store.s3.amazonaws.com/0/84564/bb365df1-e1d6-1ca2-c0e8-1483e61aa28b.png)
S3KeyにチェックしたいS3のキー名を記述します。
毎日実行したいバッチだったりすると、S3のファイル名にも日時が入ってきそうです。
例えば、前日の日付がついたファイルの存在確認は下記のように記述します。
```
s3://bucket-name/dir-name/file_#{format(yesterday(inTimeZone(@scheduledStartTime,'Asia/Tokyo')),'YYYYMMdd')}.txt
```

他に指定しているRetry Delayは再実行の間隔、Maximum Retriesは再実行回数ということですが、正直Retry Delayの動作はよくわからんです。この値の間隔でチェックしてるというわけでもなさそう。

# ShellCommandPrecondition
指定のシェルスクリプトを実行し、そのスクリプトの終了コードによって、前提条件を満たしたかどうかを判定します。

S3KeyExistsと違い、<b>前提条件を実行する段階でResource(EC2)が作成される</b>ので、その点はご注意ください。

設定の画面は下記。

![datapipeline_shell.png](https://qiita-image-store.s3.amazonaws.com/0/84564/546f4cf2-3998-a9ad-ed2e-4730872fd2be.png)
Commandに実行したいスクリプトを記載します。
StdoutやStderrには、ログファイルの指定を行います。下記のように書くと、/パイプラインID/前提条件ID/ という形でディレクトリ切ってくれるのでいいと思います。
```
s3://bucket-name/#{@pipelineId}/#{@id}/stdout.log
```
ShellCommandPreconditionの注意点としては、Resourceに指定しているEC2の終了時間設定（Terminate After）の時間を、前提条件判定で待機してる間に過ぎてしまうと、EC2が落ちて処理が失敗してしまうので、Terminate Afterの時間は長めにしておいた方がよいです。
【質問】perlのGetopt::Longで、先頭が-(ハイフン)で始まる文字列を受け取る方法

質問エントリです。誰か教えて...

perlのGetopt::Longで、先頭が-(ハイフン)で始まる文字列をオプション値として受け取る方法が知りたいです。

```pl
use Getopt::Long qw(:config posix_default no_ignore_case gnu_compat);

my $options = {};
my $result = GetOptions($options, "opt:s", "opt2:i");
```
みたいなコマンドで、

```shell-session
$ ./command --opt -0100
```
とかやっても、

```shell-session
Unknown option: 0100
```
とか言われる。orz

```shell-session
$ ./command --opt "-0100" 
```
でも一緒。

一応、

```shell-session
$ ./command --opt=-0100
```
で解決するけど、このオプションだけイコール必須、とか気持ち悪い...
ActiveAdminでPaperclipの画像を表示する

# 概要

Paperclipを使って保存した画像を、ActiveAdminのIndexページとShowページで表示する


# 前提条件

* ActiveAdminとPaperclipを使用していること

# 実装

```rb
# app/model/capture_image.rb

class CaptureImage < ActiveRecord::Base
  has_attached_file :image,
    :path   => "/:class/:id/:attachment/:style/:filename",
    :styles => {
      :thumb    => '200x200>',
      :original => '900x900>'
    }

  validates_attachment :image, :presence => true,
    :content_type => { :content_type => /\Aimage\/.*\Z/ },
    :size => { :in => 0..1.megabytes }
end
```

```rb
# app/admin/capture_image.rb:

ActiveAdmin.register CaptureImage do
  index do
    column :thumb do |obj|
      image_tag(obj.image.expiring_url(10, :thumb))
    end
    actions
  end

  show do
    attributes_table do
      row :image do |obj|
        image_tag(obj.image.expiring_url(10))
      end
    end
    active_admin_comments
  end
end
```
[Rails]ActiveJobからurl_helperを呼ぶ

RailsのActiveJob内から*_urlヘルパーを呼ぶ方法です。

## どんなときに使う？
Jobから何かしらのAPIにアクセスして、そのパラメータにcallbackアドレスを設定する場合など

## やり方
1. url_helpersをinclude
2. default_url_optionsをoverride(これをしないとhost名がわからないよって怒られる)
3. お好みでBaseJobを作ってそれを継承する形でHogeJobを作成する

``` ruby:app/jobs/base_job.rb
class BaseJob < ActiveJob::Base
  include Rails.application.routes.url_helpers

  protected

  def default_url_options
    { host: ENV['HOST_NAME'] }
  end
end
```

``` ruby:app/jobs/hoge_job.rb
class HogeJob < BaseJob
  queue_as :default

  def perform(*args)
    # something
    # foobar_urlが呼べる
  end
end
```
Riot.jsチュートリアルを実際に触ってみた


## はじめに

Reactを学習する流れの中で[Riot.js](http://riotjs.com/)が候補として出てきました。
今回はほぼ静的なサイトをコンポーネントを意識して書きたいとおもったのでRiotを使ってみたいと考えました。
そのため[こちらのチュートリアル](https://github.com/cognitom/riot-tutorial)をやってみたのでその感想を書きます。

## Riotの特徴

[これ](http://qiita.com/cognitom/items/fb1295f3f93911e9e92d)とか[これ](http://qiita.com/cognitom/items/8010e0779950df574cc9)を読めばほとんど書いてあるのですが、

**1コンポーネント1ファイル**つまり1つのファイルにHTML/CSS?JSを書いていきます。

## やってみて思ったこと

[これ](http://qiita.com/cognitom/items/8010e0779950df574cc9)を参考にコンポーネントを一つ追加してみました。

チュートリアルをそのままやっただけですが、
以下のようなメリットがあると思いました。

- scoped便利
- コンポーネント必然的に意識。ローカルに書ける(BEMとかSMACSSとはなんだったのか・・)
- ループがすぐできる
- 学習コストがめっちゃ低い(Reactは色々学ばないといけなかったが、Riotはチュートリアル一通りやっただけで大体わかった気分に)

他にもHTMLっぽく書くだけじゃなくて、CoffeeやJadeも使えるみたいで書きやすそうな印象を受けました。

また[この記事](http://qiita.com/narikei/items/1a7fbd7895cfb4220172)にもあるように、
HTML/CSS部分がView、JavaScriptがController、Ajax通信部分がModelとはっきりと役割と分けられるというところが便利だと思いました。

## まとめ

これだけミニマムなライブラリなのに自分がほしいなと思う機能はだいぶ揃っているなとおもいました。
コンポーネントを意識してCSSを組んでいましたが気軽にRiot.jsを導入するくらいのほうが長持ちするコンポーネントを作成できるかもしれないなと思いました。

### NextStep


まだチュートリアルにちょっと毛を生やした程度しかやっていないですが、なかなか便利そうなので

- 静的なサイトをもう少しつくりこんでみる(Webサイトをコンポーネントを意識した状態で作ってみる)
- サーバーサイド(Rails)と連携してみる
- superagent使ってみる
- Fluxしてみる [このあたり](https://uzimith.github.io/2015/02/11/riotjs-de-flux/)読んでみる

といったこともやってみようとおもいます。
アクションフィルタとコントローラの OnActionExecuting の呼び出し順序

# アクションフィルタとコントローラの OnActionExecuting の呼び出し順序


アクションメソッドの前後に、横断的な処理を挟むにはアクションフィルタを書く。

```csharp
public virtual void OnActionExecuted(ActionExecutedContext filterContext);
public virtual void OnActionExecuting(ActionExecutingContext filterContext);
public virtual void OnResultExecuted(ResultExecutedContext filterContext);
public virtual void OnResultExecuting(ResultExecutingContext filterContext);
```

他方、コントローラは `System.Web.Mvc.Controller` を継承するので、次のメソッドをオーバーライドすることができる。

```csharp
protected virtual void OnActionExecuted(ActionExecutedContext filterContext);
protected virtual void OnActionExecuting(ActionExecutingContext filterContext);
protected virtual void OnResultExecuted(ResultExecutedContext filterContext);
protected virtual void OnResultExecuting(ResultExecutingContext filterContext);
```

今、やりたいのはセッション情報をアクションメソッドに渡すコトなので、これはアクションフィルタを書くしかなさそうに思える。

ただ、使い途はわからないなりに、せめてどちらが先に呼び出されるかを確認しておく。

アクションフィルタとコントローラの派生クラスの各メソッドを override してログを仕掛ける。

        実験中…

無用な行を削除するとログは次のようになった。`SessionAttribute` の行が、アクションフィルタの出力と読めばよい。

予想と違い、ベースクラスの OnActionExecuting の方がアクションフィルタより先に呼ばれていた。ふむ。

```
DEBUG|2014-11-30 13:55:59,420|Controller`1       |OnActionExecuting   |IN
DEBUG|2014-11-30 13:55:59,421|SessionAttribute   |OnActionExecuting   |IN
DEBUG|2014-11-30 13:55:59,433|SessionAttribute   |OnActionExecuted    |IN
DEBUG|2014-11-30 13:55:59,433|Controller`1       |OnActionExecuted    |IN
DEBUG|2014-11-30 13:55:59,434|Controller`1       |OnResultExecuting   |IN
DEBUG|2014-11-30 13:55:59,434|SessionAttribute   |OnResultExecuting   |IN
DEBUG|2014-11-30 13:55:59,439|SessionAttribute   |OnResultExecuted    |IN
DEBUG|2014-11-30 13:55:59,439|Controller`1       |OnResultExecuted    |IN
```

#### 確認した環境
- Visual Studio Community 2015
- ASP.NET MVC 5.2.3
- Entity Framework 6.1.3
- SQL Server Express LoalDb 12.0.2000.8
PHP アプリケーションから Sentry に任意のレベルのアプリケーションログを送信する


# 前提

PHP アプリケーションから Sentry に WARN などの任意レベルのログを送信したい.

簡単な方法として、 [getsentry/raven-php](https://github.com/getsentry/raven-php) が使えるが、ドキュメントには `$client->captureException($exception)` を使う方法や、 `$error_handler->registerErrorHandler()` を使う方法などは紹介されているものの、任意レベルのログを送信する方法は示されていない.

# 解決策

[Raven_Client#captureMessage()](https://github.com/getsentry/raven-php/blob/master/lib/Raven/Client.php#L196) なる function があるので、これを使えば良い.

たとえば、WARN レベルのログを送るのであれば、以下のようになる.

```
$raven_client = new Raven_Client($dsn);
$raven_client->captureMessage("Warning!", null, Raven_Client::WARNING);
```

# 参考

* [getsentry/raven-php](https://github.com/getsentry/raven-php)
* [Raven-PHP - Sentry On-Premise](https://docs.getsentry.com/on-premise/clients/php/)
.git/hooks/pre-push 覚書（railsアプリ編）

`force push` マジクソバージョンはこちら→ http://qiita.com/amoO_O/items/141f6fd7ca499575bfd2

git push する前に [rubocop](https://github.com/bbatsov/rubocop) と [rspec](https://github.com/rspec/rspec) を自動で行う。

```bash:.git/hooks/pre-push
#!/bin/bash

bundle exec rubocop
cop=$?

bundle exec rspec spec
pec=$?

exit $(($cop || $pec))
```
CNContactからABRecordIDを取り出す

iOS9から`Address Book`と`Address Book UI`がduplicatedになり、
代わりにCNcontactを使わないといけないみたいなんですが、`CNcontact`から`ABPerson`を取得する必要があったので書き留めます。

```
let iOSLegacyIdentifierKey = "iOSLegacyIdentifier"
guard let recordId = contact?.valueForKey(iOSLegacyIdentifierKey) as? Int32 else {
    return;
}
print(recordId)
```

これで`ABRecordID`が取れるので、
```
ABAddressBookGetPersonWithRecordID(addressBook, recordId)?.takeUnretainedValue()
```
とかで`ABPerson`を取得できます。

ただし審査通るかはわかりません！
Android端末内のトラフィックをリアルタイムでジロジロする@Wireshark & OWASP ZAP  ＜○＞＜○＞



# やりたかったこと
* Androidアプリでどんな通信が流れているか監視したいという思いがありました。
* ただアプリでtcpdumpとってファイルをadb pullすれば簡単なのですが、面倒くさい。リアルタイムで流れを見たいと感じました。その方法を記載します。
	* roppongi_aarで話した内容をもうちょっと詳細に解説した感じです。
	* 資料: http://www.slideshare.net/KengoSuzuki1/android-pen-test-recon

# TCP編 via tcpdump
## 準備するもの
* Android端末 or エミュレータ
	* Android端末を使う場合はRoot化が必要です
	* エミュレータを使う場合は別途netcatのインストールが必要です
		* 参照: [Genymotion用にソースファイルをコンパイル&インストールしてこの先生きのこるには](http://qiita.com/kengoscal/items/10bd6c3adcbb0ce2b498)
* MacOSX with WireShark

## こんな感じでトラフィックの受け渡しをしたい
![Kobito.zxxitT.png](https://qiita-image-store.s3.amazonaws.com/0/59166/6cd5180d-3472-6b6c-3e82-8701e91095c5.png "Kobito.zxxitT.png")


## やることの概要
1. Android側でtcpdumpの標準出力を聞くポートを割り当てる
	* tcpdumpとnetcat(リッスンモード) on Android
2. Mac側でMac上のポートとAndroidの上記ポートを紐付ける
	* Macでadb forward
3. ひも付けたポートに送られる情報を引き出して、Wiresharkに送る
	* Macでnetcat & wireshark

## コマンド

```Android側でtcpdumpの標準出力を聞くポートを割り当て
% adb shell "./data/local/tcpdump -w - | /data/local/./netcat -l -p 12345”
```

```Android側のポートとMac側のポートを紐付けてwiresharkに流す
% adb forward tcp:12345 tcp:54321 && nc 127.0.0.1 54321 | wireshark -k -S -i lo0
```

## 結果
* 操作毎のtcpログがとれるようになりました
![Kobito.IN6Uhy.png](https://qiita-image-store.s3.amazonaws.com/0/59166/d793c4be-1110-5477-c39b-be6dddd491cb.png "Kobito.IN6Uhy.png")

## limitation
* tcp/udpレベルでしかわからない
* パット見、どういうhttp(s)通信が流れているかわからない

### Solution
* ローカルproxyをたてる
* 今回はOWASP ZAPを使いますが、お好みでCharlesでもいいと思います
	* 自分はそのまま攻撃に繋げたいのでOWASP ZAPを使ってます

# HTTP(S)編 via OWASP ZAP
## 準備するもの
* OWASP ZAP on Mac

## OWASP ZAPの設定
### Local Proxyの設定
* [ChromeとOWASP ZAPでWeb通信を改竄](http://qiita.com/kengoscal/items/13c384e27066dcc6cd06)の「OWASP ZAPの設定その1: Proxyの設定」
* Address : vboxnet1のIP
* Port: お好み

### Dynamic SSL Certificateの設定
* 端末がOWASP ZAPを不正でないプロキシと認識するために、証明書を入手する
* OWASP ZAP > Tools > Options > Dynamic SSL Ceritficate > save
![Kobito.VZwUhS.png](https://qiita-image-store.s3.amazonaws.com/0/59166/482433f7-9fbf-4b74-0529-c41099149931.png "Kobito.VZwUhS.png")


### Dynamic SSL Certificateのインポート to Android
* sdcard配下にpushすること

```
% adb push ~/Desktop/owasp_zap_root_ca.cer /sdcard/
```

## Android側のプロキシ設定
* setting > Wi-Fi > 「WiredSSID」の長押し > Modify network 
* > Advanced Options > Proxy > Manual
* ProxyHostName: OWASP ZAPに設定したIP
* Port: OWASP ZAPに設定したポート

![Kobito.oWgbHc.png](https://qiita-image-store.s3.amazonaws.com/0/59166/08b443a2-9aa1-209a-787d-c72f1660f0ef.png "Kobito.oWgbHc.png")


## 結果
* http(s)通信がリアルタイムに見れるようになりました
![Kobito.CBR8rL.png](https://qiita-image-store.s3.amazonaws.com/0/59166/1636e359-85a7-77b2-1c1f-3aeda8e64d56.png "Kobito.CBR8rL.png")
Laravelのdeploy先のawsインスタンスを動的に取得する

Laravelのdeploy先を動的に取得するお話。

awsを利用している時にdeploy先を静的に指定していると、AutoScalingで構成が変わった時に手動で変える必要があったり、気づいたら失敗しているなどという状況があるため、deploy先を動的に取得するようにしておく。

# awsのインスタンスを動的に取得してdeploy先の一覧を取得
```php:/app/lib/aws/Ec2.php
<?php namespace Lib\Aws;

use Aws\Common\Aws;
use Aws\Common\Enum\Region;
use Aws\Ec2\Ec2Client;
use Aws\Ec2\Exception\Ec2Exception;

class Ec2
{

	private $obj = null;

	/**
	 * AWS SDK for PHP
	 * ec2 instance
	 */
	private function getInstance()
	{
		if (is_null($this->obj))
		{
			$this->obj = Aws::factory([
				'key'    => XXXXXXXXXXXXXX,
				'secret' => XXXXXXXXXXXXXXXXXXXX,
				'region' => Region::XXXXXXX
			])->get('ec2');
		}
		return $this->obj;
	}


	/**
	 * Deploy対象のリスト取得
	 */
	public function getDeployList()
	{
		// subnet設定
		$subnets = ['subnet-XXXXXXXX', 'subnet-YYYYYYYY'];

		$res = $this->getInstance()->describeInstances([
			'Filters' => [
				['Name' => 'subnet-id' , 'Values' => $subnets],
				['Name' => 'instance-state-code', 'Values' => [16]]
			]
		]);
		$list = [];
		foreach ($res['Reservations'] as $reservations)
		{
			foreach ($reservations['Instances'] as $info)
			{
				$ip = $info['PrivateIpAddress'];
				$list[] = [
					'host' => $ip,
				];
			}
		}

		return $list;
	}
}
```
getInstaceで取得したEC2の情報から、describeInstancesで必要なインスタンスのローカルIPのリストを取得する。
* 今回は、指定したサブネットワークの、instance-state-codeが16(running)のものを取得している。

これでawsのインスタンス一覧を取得できたので、deployツールなどで利用できる。
Nginx1.8のCentOS6へのインストール方法(2015/10月現在)


普通にyumインストールすると、古いバージョンの`Nginx`がインストールされてしまう。

###リポジトリ設定

```
$ rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
```

###インストール

```
$ yum install nginx
```

###自動起動設定
```
$ chkconfig nginx on
$ chkconfig nginx --list
  nginx          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

###サーバの起動

```
$ nginx
```

###ブラウザで確認

![スクリーンショット 2015-09-30 13.29.17.png](https://qiita-image-store.s3.amazonaws.com/0/3184/3ef25a5a-dfea-56d8-e1cd-7856ac51c360.png "スクリーンショット 2015-09-30 13.29.17.png")

###サーバの停止

```
$ nginx -s stop
```



簡単です。
RenderArgNames は誰がつくってくれるのか

c.Render の中で使う RenderArgsNames は c.Render(hoge) ってよぶと hoge がはいっていて、変数名が string になってて、template 内で参照できるという、マジックなんだが、どこでこれをやってるのかよくわからなかった。

結論だけいうと、tmp/main.go が生成されるときに作られていた。どうりで revel/revel で ag してもなにも出てこないわけだ。

便利だけど、マジック感すごい。
Embulk 巷で知ったプロクシーサーバ経由でGoogle BigQueryへアクセスする方法

Embulk 巷で知ったプロクシーサーバ経由でGoogle BigQueryへアクセスする方法

当人BigQueryのことはよくわかりません。

**※注意: このドキュメントに書かれているのは、バージョン2.Xの内容です。バージョン3.Xは設定方法が違います。**

## まとめ

* -JオプションでJavaのシステム設定を行うことができます。
* -Jオプションはrunやguessコマンドよりも前に指定します。

```
embulk -J-Dhttps.proxyHost="xxxx" -J-Dhttps.proxyPort="xxxx" run config.yml
```

Windowsの場合、-Jオプション全体を""で囲います。(2015/10/1追記)

```
embulk.bat "-J-Dhttps.proxyHost=xxxx" "-J-Dhttps.proxyPort=xxxx" run config.yml
```

もしうまくいかない場合は次の形式を試してください。

```
"java"  -Dhttps.proxyHost="host" -Dhttps.proxyPort="port" -jar embulk.bat run config.yml
```

* https.proxyHost: プロクシーサーバのアドレス
* https.proxyPort: プロクシーサーバのポート番号

※ httpではなく、https


## 参考

Windowsの場合

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hiroysato">@hiroysato</a> <a href="https://twitter.com/oreradio">@oreradio</a> 接続できました！ &quot;java&quot; -Dhttps.proxyHost=&quot;host&quot; -Dhttps.proxyPort=&quot;port&quot; -jar embulk.bat run config.yml</p>&mdash; みぶ (@mibros4) <a href="https://twitter.com/mibros4/status/649039419060580352">2015, 9月 30</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 環境

* Windows7
* Java 1.8.0_40
* Embulk: 0.7.4
* embulk-output-bigquery: 0.1.9
  * compile "com.google.http-client:google-http-client-jackson2:1.20.0"
  * compile "com.google.apis:google-api-services-bigquery:v2-rev205-1.20.0"

## 備考

LinuxやOSXの場合embulkの-Dオプション、runなどの前に指定する必要があるを指定すれば、``java -D``と同じオプションを指定できるがWindowsではうまく動かない模様

```
embulk -J-Dhttps.proxyHost="test" -J-Dhttps.proxyPort="port" run config.yml
```

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hiroysato">@hiroysato</a> <a href="https://twitter.com/oreradio">@oreradio</a> 情報ありがとうございます！早速試してみたのですが、error: Unknown subcommand ”プロキシのIPアドレス” というエラーが出てオプションが認識されませんでした。もうちょっと試行錯誤してみます。</p>&mdash; みぶ (@mibros4) <a href="https://twitter.com/mibros4/status/649036464378896384">2015, 9月 30</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hiroysato">@hiroysato</a> <a href="https://twitter.com/hito4_t">@hito4_t</a> こうしたら通りました！&#10;embulk.bat &quot;-J-Dhttps.proxyHost=xxxx” &quot;-J-Dhttps.proxyPort=xxxx&quot; run config.yml</p>&mdash; みぶ (@mibros4) <a href="https://twitter.com/mibros4/status/649421999077363712">2015, 10月 1</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
さくらVPS + nginx に無料で独自ドメインとSSLを設定する


https接続が必要になったので、手っ取り早く試せる方法でやってみました。あとついでに独自ドメインも取得してみました。

さくらVPSの登録&設定、Nginxの設定はすでに済ませている状態で話を進めます。

## 利用するサービス

無料独自ドメイン
http://www.freenom.com/ja/index.html

無料SSL証明書
https://www.wosign.com/English/freeSSL.htm

## 独自ドメインの取得

freenom.com は無料で `.tk` `.ml` `.ga` `.cf` `.gq` のドメインを取得できるサービスです。

欲しいドメイン名を入力して、住所などの登録をするだけで取得できます。

## さくらVPSにドメインを登録

さくらVPSのネームサーバ登録 (https://secure.sakura.ad.jp/menu/domain/zoneadd.php) に取得したドメインを入力します。

## DNS レコードの追加

freenom.com にさくらVPSのDNSのAレコードを追加します。

ドメイン一覧 (https://my.freenom.com/clientarea.php?action=domains) で、追加したドメインのところにある `Manage Domain` をクリックします。

`Manage Freenom DNS`をクリックします。

Add RecordのところにDNSの設定を記述します。Typeは`A`を選択し、TargetにさくらVPSのIPアドレスを入力します。

`Save Changes`をクリックして変更を保存します。

## 独自ドメインの確認

ここまでで、独自ドメインの設定が完了しました。

すぐに独自ドメインでアクセスできるか確認したくなりますが、DNSレコードの変更の反映に数分かかるので、しばらく待ってから行ったほうがいいです。

確認できたら、SSLの設定に進みます。

## SSL証明書の取得

WoSign は無料でSSL証明書を取得できるサービスです。

登録は https://buy.wosign.com/free/ でできます。

ページにアクセスしたら、`Domain name`に先ほど取得したドメインを入力します。
Algorithmは`SHA2`を選択します。
後は、メールなどのバリデーションを行います。

My Order の画面で要求したSSL証明書のOperationの項目をクリックします。

サイト所有者の確認を求められるので、Htmlファイルをダウンロードしてサイトのルートディレクトリに配置してバリデーションを行います。
さくらVPSにHtmlファイルを配置した後、Nginxの設定ファイルに以下の様な記述を追加すると簡単です。

```vi:/etc/nginx/conf.d/default.conf
location = /ファイル名.html {
    root ファイルのディレクトリ
}
```

設定後はnginxを再起動して設定を反映させます。

```bash:zsh
sudo service nginx restart
```

バリデーション後はファイルと設定を削除します。

## 鍵の作成

Certificate Requestファイルの生成方法の選択画面になるので、`Option2`の自分で生成する方法を選択します。

コマンドラインで、鍵を作成します。

```bash:zsh
openssl genrsa -des3 -out server.key 2048
openssl req -new -sha256 -key server.key -out server.csr
```

`server.csr`の中身をコピーして、テキストボックスに貼り付け、`Check CSR`で確認後、`Submit`します。

成功すると、Certificateファイルが入ったzipファイルがダウンロードできるようになります。
ダウンロードして解凍すると、Nginx用のCertificateファイルのzipファイルがあるのでそれを解凍します。
さくらVPSの任意の場所に解凍した`.crt`ファイルを配置します。分かりやすく`server.crt`にリネームしておきます。

## Nginxの設定

SSLの設定をNginxの設定ファイルに追加します。

```vi:/etc/nginx/conf.d/default.conf
server {
    listen 443;
    ssl on;
    ssl_certificate      /path/to/server.crt;
    ssl_certificate_key  /path/to/server.key;
    server_name  取得したドメイン名;

    location / {
        proxy_redirect                       off;
        proxy_set_header Host                $host;
        proxy_set_header X-Real-IP           $remote_addr;
        proxy_set_header X-Forwarded-Host    $host;
        proxy_set_header X-Forwarded-Server  $host;
        proxy_set_header X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto   $scheme;

        proxy_pass	http://127.0.0.1:12345/hogehoge;
    }
}
```

※ 設定は一例です。

設定後はnginxを再起動して設定を反映させます。

```bash:zsh
sudo service nginx restart
```

## SSLの確認

以上で設定は完了したので、`https://ドメイン名`でアクセスできるかを確認します。


これで、独自ドメインとSSLの設定は全て終わりました。無料で出来ましたが、ただより高いものはないというので、お金を払える人は有償で実績のあるサービスを利用したほうがいいかもしれませんね。
VPCサブネットのRouteTableを切り替える


#マネジメントコンソールでのRouteTable切り替え

VPCサブネットに紐付いているRouteTableを切り替える必要がある場合、
マネジメントコンソールからだとVPC=>Subnets=>サブネットを選択=>RouteTableタブのEditボタンを押すことでサブネットに紐付けるRouteTableを選択できます。

![routetableの切り替え.png](https://qiita-image-store.s3.amazonaws.com/0/52904/4477afaa-8928-32c4-2327-c02379d954e5.png)

簡単です。

#AWSCLIでのRouteTable切り替え

しかし、特定のトリガーをきっかけにRouteTableを自動的に切り替えたい場合にはAWSCLIを使ったスクリプトを書く必要があるのですが、ひとクセありました。

まず、一番最初にサブネットとルートテーブルの紐付けを行う場合は「associate-route-table」コマンドで【route-table-id】と【subnet-id】を紐付けます。（デフォルトで作成されるVPCでは紐付け済み）

この【route-table-id】と【subnet-id】の紐付けに対して、【association-id】が割り振られます。【association-id】は「describe-subnets」コマンドで確認できます。
（現状ではマネジメントコンソールからは【association-id】を確認できませんでした。）

```
aws ec2 describe-route-tables
-----------
{
    "RouteTables": [
        {
            "Associations": [
                {
                    "SubnetId": "subnet-xxxxxxxx",
                    "RouteTableAssociationId": "rtbassoc-xxxxxxxx",
                    "Main": false,
                    "RouteTableId": "rtb-xxxxxxx"
                }
            ],
:
:
}
--------		
```

上記のように、サブネット:subnet-xxxxxxxxとルートテーブル:rtb-xxxxxxxの紐付けが、rtbassoc-xxxxxxxxというAssociationIdで管理されています。

そして本題のすでにルートテーブルが紐付けられたサブネットのCLIでのRouteTable切り替えには「replace-route-table-association」コマンドを使うのですが、前述の「associate-route-table」のように【route-table-id】と【subnet-id】を紐付けるのではなく、【route-table-id】と【association-id】を紐付ける必要があります。さらに【association-id】は紐付けのたびに毎回値が変化するので、注意が必要です。

```
aws ec2 replace-route-table-association --association-id rtbassoc-xxxxxxxx  --route-table-id rtb-xxxxxxxx
-----------
{
    "NewAssociationId": "rtbassoc-xxxxxxxxx"
}
-----------
```

このような形で新しいAssociationIdが結果として戻って来れば、切り替えが成功です。


ちなみに、紐付け済みの【subnet-id】と【route-table-id】を「associate-route-table」コマンドを使用するとこんな感じで怒られます。

```
aws ec2 associate-route-table --subnet-id subnet-xxxxxxxxx  --route-table-id rtb-xxxxxxxx
-----------
A client error (Resource.AlreadyAssociated) occurred when calling the AssociateRouteTable operation: the specified association for route table rtb-xxxxxxx conflicts with an existing association
-----------
```