OmniAICreator/Qiita-1.07M huggingface dataset:
GitLab - GitLab7.4.3から7.14.3へのアップグレード


GitLab7.4.3のslack連携がうまくできなかったので
GitLab7の最新版である7.14.3へアップグレードした時のメモ

#### 環境

* OS:Ubuntu 14.04.1 LTS

#### 手順

##### 1.アップグレードするパッケージの確認
この確認方法ですがを探すの結構苦労しました
ここでは「7.14.3-ce1 ubuntu/trusty」を探す方法となります

* https://about.gitlab.com/downloads/
* 「Download the package」をクリック
* 「7.14.3」を入力して検索すると対象パッケージが表示される
* https://packages.gitlab.com/gitlab/gitlab-ce/packages/ubuntu/trusty/gitlab-ce_7.14.3-ce.1_amd64.deb

##### 2.各プロセス停止
アップグレード前にプロセスを停止

```
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
sudo gitlab-ctl stop nginx
```

##### 3.バックアップ取得
構成変更の場合は必ずバックアップ
今回はAWSを使用しているのでAMIを作成

##### 4.アップグレード
curlでリポジトリのキャッシュを最新にするところまでやってくれる
アップグレードコマンドは「0% [Working]」のステータスで結構止まっていたが
しばらくそのままにすると更新が始まって無事終了

```
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt-get install gitlab-ce=7.14.3-ce.1
```

##### 5.Config再設定
設定がデフォルトになっていたりDB定義更新をする必要がある場合もあるので再設定

```
sudo gitlab-ctl reconfigure
```

##### 6.サーバ再起動
プロセス再起動でも問題ないのですが、自動起動されるか確認したかったのでサーバ再起動

```
sudo init 6
```

自動起動してこれで完了
新しいパラメータも幾つか追加されているようなので適宜変更

```
sudo vi /etc/gitlab/gitlab.rb
sudo gitlab-ctl reconfigure
```

#### 参考
* http://makaaso.hatenablog.com/entry/2016/01/19/153708
JAVA インナークラス・匿名クラス

**<FONT color="#ff0000">匿名クラス</font>**とは
あるメソッドの中で一回しか使わない、つまり
「その場で使い捨てる」クラスを作りたい場合のためにある。

- [ ] 匿名クラスの特異性_________________________________                            
- 普通のクラスやメンバクラスは、classキーワードでまず「宣言」し、
その後newで「利用」しますが、
匿名クラスは<font color="#ff0000">「宣言と利用」を同時に</font>行います。         
_________________________________________________________

__________________________________________________
<FONT color="#ff0000">■匿名クラスの宣言兼利用</font>
**new  匿名クラスの親クラス指定(){**
     **匿名クラスの内容(メンバ)定義**
**}**

無名クラスは「new インターフェイス名() { …実装… }」の形式で表します。

▪️Test105.java

```java

public class Test105 {
	public static void main(String[] args) {
		Printable p = new Printable() {
			public void print() {
				System.out.println("TEST");
				System.out.println("TEST2");
			}
		};
		p.print();

		Printable2 p2 = new Printable2() {
			public void print2() {
				System.out.println("TEST3");
			}
		};
		p2.print2();
	}
}
```

▪️Printable.java

```java
public interface Printable {
	void print();
}
```

▪️Printable2.java

```java
public interface Printable2 {
	void print2();
}
```

▪️Test105.java 実行結果
TEST
TEST2
TEST3
WordPress: REST API メモ v2

WordPressのREST APIを使用するときのメモです。
個人の環境によって変わってくる所もあると思うので、参考までにご覧ください。

下記のプラグインを使用する想定で書いています。

・プラグイン
カスタムフィールドの登録：**Advanced Custom Field**
カスタムポストの登録：**Custom Post Type UI**

### 投稿のエンドポイント
http://example.com/wp-json/wp/v2/posts/&lt;ID&gt;

### 個別ページのエンドポイント
http://example.com/wp-json/wp/v2/pages/&lt;ID&gt;

### Advanced Custom Fieldsの内容をAPIに追加する時

```php:functions.php
function wp_rest_api_alter() {
    $params = array(
        'get_callback'    => function($data, $field, $request, $type){
            if (function_exists('get_fields')) {
                return get_fields($data['id']);
            }
            return [];
            },
        'update_callback' => null,
        'schema'          => null,
    );
    register_api_field( 'page', 'fields', $params );
    register_api_field( 'post', 'fields', $params );
}
add_action( 'rest_api_init', 'wp_rest_api_alter');
```


### カスタムポストタイプのエンドポイントを作る

http://example.com/wp-json/wp/v2/&lt;custom-post-type&gt;

```php:functions.php
function sb_add_cpts_to_api() {
    global $wp_post_types;

    // Add CPT slugs here
    $arr = ['<post-typeA>','<post-typeB>','<post-typeC>'];

    foreach( $arr as $key ) {

    // If the post type doesn't exist, skip it
    if( !$wp_post_types[$key] )
        continue;

        $wp_post_types[$key]->show_in_rest = true;
        $wp_post_types[$key]->rest_base = $key;
    }
}
add_action( 'init', 'sb_add_cpts_to_api', 30 );
```
Smarty 日付データを整形して出力

基本ですがすぐ忘れてしまうのでメモ。
Smartyで日付を整形して出力する方法。

```
{$data|escape}
/* 表示結果 */
2016-01-01 00:00:00
```

これを「2016年01月01日」と表示したい場合、「date_format」を使います。

```
{$data|date_format:"%Y年%m月%d日"}
/* 表示結果 */
2016年01月01日
```

## 追記
Smartyのdate_formatってphpのdate関数のフォーマットに則ってると思ってたんですが、どうやら違うみたいで、ちょびっとハマった...。

```php
$date = date('Y-m-d H:i:s');
/* 表示結果 */
2016-01-01 00:00:00
```

時間を上記通りに出力する場合、`H:i:s`では上手く表示されない。

```smarty
{$data|date_format:'%Y-%m-%d %H:%M:%S'}
/* 表示結果 */
2016-01-01 00:00:00
```

上記の通り、`%H:%M:%S`でした...。
勝手な思い込み、危険。
新人研修課題

1.
Assign the variable x to the value 5.


2.
What is the datatype of "Matt"?

3.
x = 5
Is x a string?

4.
What does this expression evaluate to?
"Cool".+("io")

5.
What does this expression evaluate to?
"bob" + 42

6.
a = "Bat"
b = "woman"
What does this expression evaluate to?
a + b

7.
What does this expression print?
my_name = "50 Cent"
my_name = "Miley"
p my_name

8.
rapper = "Jaydakiss"
Get the first letter from the string "Jaydakiss".

9.
Get the first through 3rd elements from the "Jaydakiss" string.

10.
Replace the "l" in the following string with "m":
word = "lace"

11.
Assign the variable my_dawg to the value "DMX"

12.
What does the following expression evaluate to?
"Dead Poet" = fav_bar

13.
What does the following expression print?
```
something = "cats"
crazy = something
puts crazy
```

14.
What does the following expression evaluate to?
3 + 4

15.
What does the following expression evaluate to?
4 * 7

16.
What does the following expression evaluate to?
2 ** 3

17.
What does the following expression evaluate to?
8 / 2

18.
What does the following expression evaluate to?
3 / 2

19.
What does the following expression evaluate to?
3.0 / 2.0

20.
What does the following expression evaluate to?
"i am not shouting".upcase()

21.
Convert every letter of "YoLo BrAh" to lowercase.
nice = "YoLo BrAh"

22.
Concatenate the following strings:
first = "Beautiful "
second = "face tattoo"

23.
Integers have useful built-in methods too. Convert the number 5 to the string "5".

24.
5.to_s
to_s stands for "to string"
What is the problem with the following code?
my variable = "Mr. White"

25.
Update the code, so it can run successfully:
band = "Blink" + 182
重複行のまとめ方はGROUP BY？DISTINCT？

### 使うべきはどちらなのか？

重複レコードをまとめる時に、ふとGROUP BY と DISTINCT のどちらを使えば効率が良いのか迷うということがおきた。

結論から言ってしまうとどちらの関数も重複行をまとめるという目的で使われるため、どちらが良いと言うことはないらしい。が、気になったので調べてみる。

DISTINCTは実行した結果のテーブルから、重複している行を削除した結果を出す。
GROUP BY は実行した結果をグループ化して更に集計する際に用いる。

つまり

* 単に重複を除いた結果をそのまま出すだけの場合はDISTINCT句
* まとめた結果に対して何らかの処理を加える必要がある場合はGROUP BY句ということになる。

なので以下のようなクエリは

```sql
SELECT COUNT(column_xxx) FROM table_xxx GROUP BY column_xxx;
```
↓↓↓

```sql
SELECT COUNT(DISTINCT column_xxx) FROM table_xxx;
```
と記載すべきなんだろうけど、実際に測ってみるとGROUP BYの方が実行速度が早かったり。この辺りは内部でどういう処理をしているのか気になるところ。
だってGROUP BYで重複レコードがまとまるのはグループ化したから結果的にまとまったという、ある意味副作用なわけですし…DISTINCTの立場は一体…。

何万行もあるレコードをまとめる場合はEXISTS句を使う方が効率がいいです。先ほどの2つは内部で暗黙のソートがなされますが、EXISTS句はそうではないのでこちらのほうが高速といえますね。

---

### 追記 (2018/04/17)

結局どっちを使えばいいの？とフレンドからツッコミ今更になって少し更新してみた。

試しにこんなテーブルを作ってみる。

```sql
CREATE TABLE `company_users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` varchar(255) DEFAULT NULL,
  `position` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

```sql
INSERT INTO `company_users` (`id`, `name`, `age`, `sex`, `position`)
VALUES
	(1, '鈴木一郎', 20, '男', '一般社員'),
	(2, '田中二郎', 33, '男', '係長'),
	(3, '高橋三葉', 27, '女', '一般社員'),
	(4, '伊東四郎', 40, '男', '部長'),
	(5, '佐藤五郎', 58, '男', '会長'),
	(6, '渡辺六実', 44, '女', '社長'),
	(7, '山本七海', 22, '女', '一般社員'),
	(8, '山田八一', 36, '男', '係長'),
	(9, '中村九', 52, '男', '一般社員'),
	(10, '小林十成', 20, '男', '一般社員');
```

どういうタイミングでDISTINCTが使えるかと言うと特定のカラムのユニークの値だけ使う時です。
上記例のテーブルで会社にどんな役職があるのかをユニークで抜き出したい場合は以下のように記述します。

```sql
SELECT
    DISTINCT `position` AS '役職'
FROM
    `company_users`
;
```

|役職|
|---|
|一般社員|
|係長|
|部長|
|会長|
|社長|

ただし、同様の取得内容はGROUP BYでも記述できます。

```sql
SELECT
    `position` AS '役職'
FROM
    `company_users`
GROUP BY
    `position`
;
```

|役職|
|---|
|一般社員|
|係長|
|部長|
|会長|
|社長|

別の例として、男女のそれぞれの人数を調べたいという場合のクエリをGROUP BYで書くと以下の様に書くことが出来ます。

```sql
SELECT
    `sex` AS '性別',
    COUNT(`sex`) AS '人数'    
FROM
    `company_users`
GROUP BY
    `sex`
;
```

|性別|人数|
|---|---|
|女|3|
|男|7|

同様の内容をDISTINCTを用いて書くことは出来ません。
DISTINCTは **重複した内容を除外する** という挙動となるため、こういった場合に利用することが出来ないです。

また、例外はありますがDISTINCTは2つ以上記載することが出来ません。

```sql
-- この書き方はエラーになる。
SELECT
    DISTINCT `sex`,
    DISTINCT `position`
FROM
    `company_users`
;
```

```sql
-- 関数内であれば一応記述可能。あまり意味は無いが…。
SELECT
    COUNT(DISTINCT `sex`),
    COUNT(DISTINCT `position`)
FROM
    `company_users`
;
```

#### まとめ

実際の所、DISTINCTの活躍の場は多くないと思うのですが、用途が限定的ではっきりしている。
DISTINCTで書ける場所はGROUP BYで書いた場合と実行計画や実速度と比較してどっちを使うか決めればいいんじゃないかな…？
Ruby | 正規表現の条件式に変数を使うと、名前付きキャプチャによる変数代入が出来ない

## 基本動作

正規表現 ( *左辺に条件式があるやつ* ) で、名前付きキャプチャを使うと。
ローカル変数に値が代入される。

```rb
/a (?<month>July)/ =~ 'Ruby is a July birth stone'

month # => "July"
```

## 問題

ところが。
マッチの条件の中に変数を使うと、ローカル変数が作られない。 

```rb
a = 'a'

/#{a} (?<month>July)/ =~ 'Ruby is a July birth stone' # => 8

month #=> #<NameError: undefined local variable or method `month' for main:Object>
```

マッチ自体は成功しているのに。変数 `month` は存在しない。

## 解決

同じような書き方でも。
`#match` メソッドを使えば正常にキャプチャできる。

```rb
a = 'a'

'Ruby is a July birth stone'.match(/#{a} (?<month>July)/) { |matched| matched[:month] } # => July
```

いいね！

ただし `#match` の場合。ローカル変数 `month` は作られない。
どうしても作りたい場合は、返り値に代入すれば良いだろう。 

```rb
a = 'a'

month = 'Ruby is a July birth stone'.match(/#{a} (?<month>July)/) { |matched| matched[:month] } 

month # => "July"
```

## 注意

`#match` メソッドにも問題がある。
上記の書き方であれば大丈夫だが。他の書き方でキャプチャ結果を使う場合は注意だ。

 [Ruby | 正規表現のキャプチャでマッチしなかった時の NoMethodError に対策する](http://qiita.com/Yinaura/items/61f636c9902b8b9cb196)

# 環境

- Ruby 2.2.4



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
[tips] TE0720, TE0703利用時の諸注意

TE0720と、それを載せたTE0703を使うにあたり、気づいたことを書いていきます

# デフォルトではBank34以外は電源が供給されない

Bank34以外の電源に3.3Vが供給されていません。
TE0703の回路図( http://www.trenz-electronic.de/fileadmin/docs/Trenz_Electronic/carrier_boards/TE0703/documents/SCH-TE0703-04.PDF )の2ページを見ると、M3.3VOUTからVCCIO35, VCCIO33, VCCIO13へのラインが切れています。というか0R抵抗としてあって、ボードに未実装です。
https://wiki.trenz-electronic.de/display/4X5B/TE0703+Carrier+Board+User+Manual#TE0703CarrierBoardUserManual-LEDS にも

>
The bank where LED's are is not powered when TE0703 is used in standalone mode. VCCIO for this bank must be supplied back to the TE0703 connectors. TE0703 header Pin J2.B1 must have some valid I/O voltage or the LED's will not be lit. To connect 3.3V to this bank install 0R or solder bridge to empty place of R26 on the bottom of the PCB.

と書いてあります。

使うときはTE0703の裏側のR23, R25, R26に0R抵抗を載せるなどして繋がなくてはなりません．

または，プロトタイピングの段階では表のコネクタのVCCIOピンどうしをジャンパーピンで繋いで動かしてもいいと思います．

# I/Oに保護回路がない
私はTE0720を買う前はZedBoardを使っていました．ZedBoardは周辺回路をPmod端子を介して繋ぎますが，その端子とZynqチップのI/Oの間には200Rの抵抗とサージから回路を保護するTVSダイオードが付いていて安心感がありました．

一方，TE0720と，それを載せたTE0703のコネクタにはそのような保護回路はありません．
TE0703のコネクタからZynqのI/Oまで素直に直結です．
気をつけたほうがいいかもしれません．
Bluemix で、写真などのデータの保管場所は、どこが良いでしょうか?

BluemixのPHPで、写真データを保存しようとしています。

保存先は、どこがよいでしょうか？

Amazon的には、S3だと思いますが、ObjectStorageかな？と思っていますが、
資料、サンプルが少なく、ちょっとちゅうちょしています。

いかがでしょうか?
Lua & C++ : Lua に関数が定義されているか確認してから pcall を実行する方法

# 目的

C++ コードからロードした Lua コードに関数が定義されているか確認してから pcall を実行したい。

## 背景

仕様として後から追加した機能を提供する関数についてそれ以前に書かれた Lua スクリプトについても書き換える必要なしに、未定義ならばデフォールトの挙動を C++ コード側で対応したり、あるいはもっと単純に本来スクリプトの仕様として定義されているはずの関数が何らかの手違いにより未定義な状態を検出してユーザーへ警告を発するのに使える。

## 注意

- この記事は Lua-5.3 の仕様に基づく。

# 方法

```cpp
namespace usagi
{
  namespace lua
  {
    /// @brief lua_state に name が関数として定義されているか確認する
    /// @param name 確認したい関数のシンボル名
    auto is_function( c::lua_State* lua_state, const std::string& name )
    {
      lua_getglobal( lua_state, name.c_str() );
      const auto r = static_cast< bool >( lua_isfunction( lua_state, -1 ) );
      lua_pop( lua_state, -1 );
      return r;
    }
  }
}
```

## 使い方

```cpp
auto some_function() -> boost::optional<int>
{
  if ( usagi::lua::is_function( lua_state, "abc" ) )
    // 定義されている場合の処理（の例）
    return std::get<0>( usagi::lua::pcall< int, int >( lua_state, "abc" ) );
  else
    // 未定義の場合の処理（の例）
    return boost::none;
}
```

# References

- http://www.lua.org/manual/5.3/manual.html
- [C++ & Lua : 任意の引数群と return 群の Lua の関数を C++ から簡単に扱えるヘルパーライブラリーの作り方](http://qiita.com/usagi/items/82b3d4777b6894b7e978)
    - 使い方の例の `usagi::lua::pcall` の実装例です。
Gsonを使ってJSONのpretty print

Gsonを使ってJSONのpretty print。ワンライナー風。

```java:GsonJsonPP.java
package org.example.javalabo;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonParser;

public class GsonJsonPP {
    public static void main(String[] args) {
        System.out.println(new GsonBuilder().setPrettyPrinting().create()
                .toJson(new JsonParser()
                        .parse("{\"aaa\":0, \"bbb\": [\"ddd\", \"eee\"], \"fff\":{\"ggg\":\"hhh\"}}")));
    }
}
```

こうなる。

```js:出力
{
  "aaa": 0,
  "bbb": [
    "ddd",
    "eee"
  ],
  "fff": {
    "ggg": "hhh"
  }
}
```
YouTube API APIキーの取得方法

1. Google Deveroper Consoleに登録します。
  ![1.png](https://qiita-image-store.s3.amazonaws.com/0/61548/b6ec501f-2ff0-a3f9-da7c-f25d1b196f4f.png "1.png")

2. Google Deveroper Consoleにログイン後に表示される、プロジェクト一覧から「プロジェクトを作成」をクリックして、新しいプロジェクトを作成します。
  ![2-1.png](https://qiita-image-store.s3.amazonaws.com/0/61548/66f89251-a404-e986-8c62-0dad52360f62.png "2-1.png")
![2-2.png](https://qiita-image-store.s3.amazonaws.com/0/61548/1b28338c-742b-6556-b19e-b96b413d5915.png "2-2.png")

3. 作成されたプロジェクトのプロジェクト名をクリックして、「ダッシュボード」を開きます。
  ![3.png](https://qiita-image-store.s3.amazonaws.com/0/61548/fc44a933-f9ad-8e46-e49f-dcd42c80c31b.png "3.png")

4. 「Google APIを利用する」をクリックして、API一覧の中から「YouTube Data API」をクリックします。
![4−1.png](https://qiita-image-store.s3.amazonaws.com/0/61548/942866cf-0792-a11b-46a7-e92b1bc6471c.png "4−1.png")
![4−2.png](https://qiita-image-store.s3.amazonaws.com/0/61548/177b7611-2045-e657-b10b-aa4393fbb351.png "4−2.png")

5. 「APIを有効にする」をクリックすると、「YouTube Data API」が有効になりますが、認証情報を作成するまではAPIを使用することはできません。次に認証情報を作成します。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/61548/6ce94f61-c70b-6573-8aa8-a2b68f862f46.png "5.png")

6. 左メニューの認証情報をクリックして「認証情報」ページに遷移し、「新しい認証情報」をクリックします。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/61548/3eb8924d-0cc7-f052-256e-8120d9b0180f.png "6.png")

7. プルダウンから「APIキー」を選択します。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/61548/eae02019-4e71-dc91-368e-7fa434fb7ffa.png "7.png")

8. ポップアップで表示されたボタンの「ブラウザーキー」を選択します。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/61548/39e2411a-d40f-3bb4-a12f-e3c8abeb7f60.png "8.png")

9. APIキーの名前を入力します。（任意の名前）
10. 特定のドメインからのアクセスのみAPIリクエストを受け付ける場合は、「この HTTP リファラー（ウェブサイト）からのリクエストを受け入れる」にドメインを入力し、アクセス制限を設定します。
![9-10.png](https://qiita-image-store.s3.amazonaws.com/0/61548/bd9b47d5-6fec-e245-7501-fe87dd7702c3.png "9-10.png")

11. APIキーが発行され、認証情報一覧に情報が追加されます。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/61548/e8a1b9c8-077f-4230-725a-337a8a9f1c57.png "11.png")
PHP でカバレッジを出すなら phpdbg

2021年2月26日追記

最近は [PCOV](https://github.com/krakjoe/pcov) が良いらしいです。
PCOV は PHPUnit8 以降の対応なので、この記事は PHPUnit8 未満の方向けです。


2021年8月2日追記
が、[phpdbg と比べてカバレッジが下がってしまう場合もあるようです](https://codecov.io/gh/nanasess/ec-cube/compare/c8072b1b4c81e153bf6c78edde02900cf3ed74df...fc93be5e69b851a1b81810c01426bf52f8695dd8)

----

ユニットテストの評価に、コードカバレッジを使用することは、よくあると思います。
従来より、 PHPUnit にはコードカバレッジ解析機能が実装されており、 HTML をはじめとするいくつかの形式で、レポートを出力可能です。

PHP5 では、 xdebug が提供するステートメントカバレッジ機能が利用されてきましたが、これが大変遅く、1100 Assertions ほどの EC-CUBE3 のカバレッジを出力するまで、2時間以上かかります。
しかも、速い CPU にしても大して速くならないのです。
Windows 環境では特に遅くなるらしく、6時間くらいかかります。

PHP7 + [PHP_CodeCoverage 2.2](https://github.com/sebastianbergmann/php-code-coverage) からは、 [phpdbug](http://phpdbg.com/) が利用できるようになりました。

HTML のレポートを出力する場合は、以下のように実行します。

```
phpdbg -qrr path/to/phpunit --coverage-html <output dir>
```

xdebug では 2時間以上かかっていたのが、 phpdbg では、**なんと 6分程度で終わりました！**

```
Time: 6.01 minutes, Memory: 218.00Mb
```

レポートも、 xdebug と同じように出力できます。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/40662/621cbd3a-3643-6428-e512-38c0eef0993a.png)

[Coveralls.io で、こんなレポートも作成できます。](https://coveralls.io/builds/7320654)

ただ、 xdebug では正常だったテストがいくつかエラーになってしまう場合があるようですが、 PHP7 のバージョンアップに伴い改善されています。
完璧とは言えませんが、カバレッジレポートを出すくらいでしたら大きな支障は無いと思います。

----

2021年8月2日追記

### phpdbg と xdebug3 の比較

2020年11月に xdebug3 がリリースされました。 xdebug2 に比べ、パフォーマンスが向上しているようです。
[2000 Assertion 弱の EC-CUBE4 では30分弱で出力できるようになりました。](https://github.com/nanasess/ec-cube/runs/3198654077?check_suite_focus=true)
[phpdbg の場合は20分弱かかっています](https://github.com/nanasess/ec-cube/runs/3198349529?check_suite_focus=true)ので、大幅な差は無くなっています。
また、 xdebug3 の方が正確なカバレッジ計測ができるとのことですが、[0.1%程度の差](https://codecov.io/gh/nanasess/ec-cube/compare/ad5ae26ec3da58acc2d032cb52e4a29071be9682...c8072b1b4c81e153bf6c78edde02900cf3ed74df)のようです。

----

### Too many open files と言われる時は

大きめのプロジェクトで phpdbg を実行すると、 Too many open files のエラーとなってしまう。これを回避するには phpdbg を Docker Container 経由で実行すると良い。

*Travis-CI では ulimit -n 30000 の制限がかかっているが、 Docker Container では ulimit -n 524288 まで使用可能*

```shell
docker run -v "$PWD":/usr/src/myapp:cached -w /usr/src/myapp --rm nanasess/phpdbg phpdbg -qrr -dmemory_limit=-1 ./path/to/bin/phpunit --coverage-clover=coverage.clover
```

Dockerfile はこちら
https://github.com/nanasess/phpdbg

### See Also

- https://thephp.cc/news/2015/08/phpunit-4-8-code-coverage-support
- [Travis CI での実行例](https://github.com/EC-CUBE/ec-cube/pull/3157)
OS Xのコマンドラインで文字列を画像化するメモ


#参考URL
（というかほぼここの通り)
http://www.cnx-software.com/2011/09/22/how-to-convert-a-command-line-result-into-an-image-in-linux/


#必要ツールをインストールする
(brewは省略)

`brew install imagemagick`
`brew install ghostscript`

#スクリプトを作成する

```lang:cmd2png.sh
#!/bin/sh

# 色設定
bg="black"
fg="white"

# フォント設定
# font="/System/Library/Fonts/Menlo.ttc"
font="/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc"
fontsize="10"

# 出力ファイル名
outfile="$1"

if [ "$1." == "." ]; then
outfile="text.png"
fi

# 変換
convert -background $bg -bordercolor $bg -fill $fg -font "$font" -pointsize $fontsize -border 25 label:@- $outfile

```

実行権限を忘れずに。
`chmod +x cmd2png.sh`

# コマンドラインで試す
`echo "Hello" | ./cmd2png.sh`

もしくは任意の出力ファイル名で。
`echo "Hello" | ./cmd2png.sh image.jpg`
MongoDBのレプリカセットをDBインストールから構築

## 構成

要はレプリケーション構成。
但し、mongoの場合はプライマリ（マスタ）ノードがダウンした場合に
セカンダリノードをプライマリノードに昇格できるレプリカセットという構成を取る。
要はフェールオーバ時にスレーブのいずれかがプライマリに昇格するのだが
その決定権を持つのがアービターというノードになる。


| サーバ | データ | 読み書き | 
|:-----------|:------------:|:------------:|
| プライマリ（マスタ）| 保持する | 読み書き可能 |
| スレーブ           | 保持する | 読み取りのみ |
| アービター         | 保持しない | -         |

**プライマリ（マスタ）**
データの更新を唯一受けられるノード。更新されたデータはスレーブへ伝播する。

**スレーブ**
プライマリからデータを受けるノード。読み取り専用として利用できる。
プライマリがダウンした場合は、アービターによって選ばれたノードがプライマリに昇格する。

**アービター**
プライマリダウン時にスレーブからプライマリに昇格するノードを選択する。
データは保持しない。必ずしもプライマリ・スレーブ並みの性能を必要としない。

今回はCentOSのサーバを３台用意。
（試したのは実はRedHatだが、CentOSでも同じ）

## MongoDBのインストール

#### リポジトリの追加
```shell-session
# vi /etc/yum.repos.d/10gen.repo

[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1
```

#### インストール
```shell-session
yum install mongo-10gen mongo-10gen-server
```

#### 起動確認
```shell-session
# service mongod start
```

Mongoは初回起動時にjournalを作るが、これが3 - 4GBの容量を必要とする。
環境によっては以下のようなログが出て起動に失敗する場合もある。

```shell-session
# cat /var/log/mongodb/mongod.log
(中略)
2016-01-19T11:31:18.522+0900 [initandlisten] ERROR: Insufficient free space for journal files
(中略)
```

このような場合は空いているデバイスに適当にディレクトリを切って再度起動する。

```shell-session
# mkdir /newMountFreeAvailable/mongo/data
# chown -R mongod:mongod /newMountFreeAvailable/mongo/
# chmod -R 770 /newMountFreeAvailable/mongo/
```

```text:/etc/mongod.conf
dbpath=/newMountFreeAvailable/mongo/data  <- 変更
```

### 起動設定

サーバ起動時にMongoDBが起動するようにしておく。

```shell-session
# chkconfig mongod on
```

これを３台全てに同じように設定する。
また、レプリカセット用の設定を追加するため、起動が確認できたら全て一度

```shell-session
# service mongod stop
```

で MongoDB を落としておくこと。
なお、停止に失敗する場合は大抵ロックファイルが原因。

```shell-session
# kill -9 (mongodプロセス番号)
# rm -f /newMountFreeAvailable/mongo/data/mongod.lock
```

起動できて停止できない場合はdbpathの権限を確認すること。

## レプリカセットの作成

インストール同様これも非常に簡単。

#### 各ノードのconfigを変更

```diff:/etc/mongod.conf
- bind_ip=127.0.0.1
+ # bind_ip=127.0.0.1 <- コメントアウトする
+ replSet=myRS <- 好きなレプリカセットの名前を定義したものを追加、３台とも同じ名前にすること
```

#### 各ノードを起動

```shell-session
# service mongod start
```

#### レプリカセットの役割の定義と設定反映

任意のノードでいいはず。
今回はプライマリノードで実施した。

**暫定IP表**

| サーバ | IP | 
|:-----------|:------------:|
| プライマリ| 192.168.100.1 |
| スレーブ| 192.168.100.2 |
| アービター| 192.168.100.3 | 

```shell-session:プライマリノード（本当はどこでも良い）
# mongo
> config = { _id:"myRS", 
    members:[
      { _id:0, host:"192.168.100.3:27017", arbiterOnly:true  },
      { _id:1, host:"192.168.100.1:27017" }, 
      { _id:2, host:"192.168.100.2:27017" }
    ]
  }

> rs.initiate( config )
(しばらく掛かるが、ここまでで設定が反映される)

> rs.status()
(このコマンドでレプリカセットの状態を確認できる)
```

#### スレーブの読み取り専用動作設定

そのままだと、スレーブが読み取り専用として
アクセスできないので以下の設定を行っておく。

```shell-session:スレーブノード
# mondodb

> db.getMongo().setSlaveOk()
```
【備忘録】WindowsUpdateで起動しなくなったゲームの対応

8/5追記：
　↓　にWindows10への対応手順書いたよ。　↓
http://masatosi.hatenablog.jp/entry/2016/08/05/092140

---------------------------------------------------------
WindowsUpdateを行ったらゲームが起動しなくなった！どうにかして！と子供に頼まれたので対応した件についてメモを残す。

症状から検索かけると幾つか情報をみた結果、↓これが怪しそう。
http://matome.naver.jp/odai/2144289888537026101

今回（2015年9月だけど・・・）のアップデートで、SafeDisc等を使ったゲームが動かなくなるらしい。

管理者権限のdos窓から以下のコマンドで動くらしいと書いてあるのだが～～
全然動かん・・・<table><tr><td>sc config secdrv start= demand
sc start secdrv
</td>
</tr>
</table>
※サービスを手動で開始するコマンド

色々試した結果、状態を無効化してから手順踏まないと駄目でした。
以下が実際に成功した手順をbat化したもの
<table><tr><td>sc config secdrv start= disabled
sc config secdrv start= auto
sc start secdrv
call "C:\Program Files (x86)\○○game\●○●○.exe"
sc stop secdrv
sc config secdrv start= disabled
</td>
</tr>
</table>

上記のバッチファイルを管理者権限で実行すればOK
と子供に伝え、終了。

コマンド解らん親が対応するの大変だろうなと感じた。
MSマジ困るわ・・・

8/5追記：
　↓　にWindows10への対応手順書いたよ。　↓
http://masatosi.hatenablog.jp/entry/2016/08/05/092140

追記：
KOEI配布の天翔記のバッチで行けるかも？　近いうちに試そう。

マイクロソフトにも似たような情報が載ってた↓
https://support.microsoft.com/ja-jp/kb/3086255
WEBプッシュサービス「プッシュさん」アカウント登録の流れメモ

# WEBプッシュサービス「プッシュさん」アカウント登録の流れメモ

## 「プッシュさん」とは？

https://pushsan.com/

自分が運営するWEBサイトにPush通知機能を導入してくれるサービス「プッシュさん」（現状無料）。

THE BRIDGEでのニュース記事はこちら。
http://thebridge.jp/2016/01/pushsan

以下、アカウント登録からサイト登録までの流れをメモ。

## アカウント登録の流れ

① PCまたはMacで[https://pushsan.com/](https://pushsan.com/)にアクセスしてヘッダーにある「無料で新規登録」をクリック。

![スクリーンショット 2016-01-19 13.27.02.png](https://qiita-image-store.s3.amazonaws.com/0/16779/348251c5-a068-c711-2aa9-aa8907ba1189.png)

② 新規登録画面に自分のメールアドレスとパスワード（任意）を入力して、利用規約同意にチェック入れて、「登録する」をクリック。

![スクリーンショット 2016-01-19 13.41.41.png](https://qiita-image-store.s3.amazonaws.com/0/16779/3e215aea-e3f8-24b6-eb7d-818fc1894f29.png)

③ アカウント設定画面にPush通知機能を導入したいサイトのサイト名とURLを入力して「作成」をクリック。

![スクリーンショット 2016-01-19 13.29.35.png](https://qiita-image-store.s3.amazonaws.com/0/16779/72dc4bce-8ca6-4b4f-a2b4-8e2f2ab619cc.png)

④ 作成後に表示されるサイト名のリンクをクリックするとプッシュ通知作成画面へ遷移

![スクリーンショット 2016-01-19 13.51.47.png](https://qiita-image-store.s3.amazonaws.com/0/16779/eb3ffa1f-87e2-d506-69e2-84ac7d3f393e.png)

## 以上！

アカウント登録については以上！
プッシュ通知の設定についてはまた別途書くかも。
java play Framework pagination/pagerをつける方法

play2.4.6にて
index(Item一覧)ページにpaginationをつけてみます :blue_book: 


##conf/routes

```
GET     /item/index               	controllers.ItemController.index(page: Integer = 1)
GET     /item/index/:page         	controllers.ItemController.index(page: Integer)

```
pageを指定していなかった場合は1ページ目に
pageを指定していた場合はそのページへいくようにする。




##app/controllers/ItemController.java

```
public Result index(int page) throws Exception{
        PagedList<Item> pagedList= ItemService.getPagedList(page);
        List<Item> items = pagedList.getList();
        int maxPage = pagedList.getTotalPageCount();
        
        return ok(views.html.item.index.render(items, page, maxPage));
    }
```

int pageは表示するページ。
PagedList<Item> pagedList= ItemService.getPagedList(page);
List<Item> items = pagedList.getList();にて
そのページに表示するItemのリストを取得。
getTotalPageCount()は最後のページが何ページかをだしてくれるので
それをint maxPageに入れる。


##app/models/service/ItemService.java

```
public static final PagedList<Item> getPagedList(int page){
        Item item= new item();
        return item.getPagedList(page);
    }
```
item.getPagedListへ。

##app/models/entity/Item.java

```
public PagedList<Item> getPagedList(int page) {
     
       int pageSize = 10;
        int pageIndex = page - 1;
        PagedList<Item> pegedList = Item.find.findPagedList(pageIndex, pageSize)
        return pegedList;
    }
```
int pageSizeは1ページに表示するItemの数。
int pageIndexは表示するページ。
findPagedList(pageIndex, pageSize)のpageIndexは0が1ページ目なので
-1したものを入れる。

これでpegedListにそのページに表示されるItemのリストが入る。


##app/views/item/index.scala.html

```
@(items: List[models.entity.Item], currentPage: Int, maxPage: Int)
@main() {
    <div id="main">
	<ol class="breadcrumb">
  		<li class="active">アイテム一覧</li>
	</ol>
    	<div class="list-group">
            <p class="list-group-item list-group-item-info">
             　アイテム
            </p>
            @for((item) <- items){
            <a href="/item/edit/@item.id" class="list-group-item">
			@item.name</br>
			 </a>
			}
			@pagination(currentPage, maxPage)
    	</div>
    </div>
}
```
viewの引数には
items(そのページに表示するitemのリスト)
currentPage(表示するページ)
maxPage(最後のページ)。

itemを表示したあと
@pagination(currentPage, maxPage)で
app/views/item/pagination.scala.htmlを呼び出す。

呼び出し方について詳しくは[こちら](http://qiita.com/konomint/items/71fe30825de6780c7fda) :loudspeaker: 


##app/views/item/pagination.scala.html

```
@(currentPage: Integer, maxPage: Integer)

<div>
  <ul class="pagination">
		@if(currentPage == 1) {
			<li class="disabled"><span>&laquo;</span></li>
		} else {
			<li><a href="@controllers.routes.ItemController.index(currentPage - 1)">&laquo;</a></li>
		}
		
		@for(index <- 1 to maxPage) {
			@if(currentPage == index) {
			  	<li class="disabled"><span>@index</span></li>
			} else {
				<li><a href="@controllers.routes.ItemController.index(index)">@index</a></li>
			}
		}
		
		@if(currentPage == maxPage) {
			<li class="disabled"><span>&raquo;</span></li>
		} else {
			<li><a href="@controllers.routes.ItemController.index(currentPage + 1)">&raquo;</a></li>
		}
    </ul>
</div>
```
paginationの部分。
maxで1ページしかなければ<<は押せないようにする。
ページのぶんだけループして、現在のページ数のみ数字を押せないようにする。
現在のページがmax(最後のページ)であれば>>は押せないようにする。


以上 :yum:
Javaでwindowsのechoを実行

[commons-exec](https://commons.apache.org/proper/commons-exec/) をつかってテストを書くとき、自分のローカルはwindowsなので、そこでのechoコマンドの実行にちょっとつまったのでメモ。


```
  CommandLine command = new CommandLine("cmd")
                            .addArgument("/c")
                            .addArgument("echo")
                            .addArgument("test");

  DefaultExecutor executor = new DefaultExecutor();
  executor.execute(commandLine);
```

ちなみにlinuxなら

```
CommandLine command = new CommandLine("/bin/echo")
                          .addArgument("test");
```

# 参考サイト

http://www.ne.jp/asahi/hishidama/home/tech/java/process.html

http://qiita.com/nogitsune413/items/48d69054b75ea9afbe5b

http://web.plus-idea.net/2012/11/apache-commons-exec/
Play Framework 2.4 java ebean関連モデルのJson化

Play Framework 2.4で関連したモデルをJsonにするとこでハマったのでメモ

### 発生した問題
`OneToMany`のモデルを`toJson()`したら`through reference chain`というエラー。
参照のループになってしまうみたい。

### 対応方法

`Json.toJson()`を使う場合は以下のアノテーションが必要。

- @JsonManagedReference
- @JsonBackReference

#### 項目等を無視させたい場合
- @JsonIgnore

### サンプル（Userが複数のMemoを持ってるとする）

```HogeController.java

    public Result test() {
        return ok(Json.toJson(User.find.byId(1L)));
    }
```


```User.java
@Entity @Table(name = "users")
public class User extends Model {

	@Id
	public Long id;

	public String name;
	
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
	@JsonManagedReference
	public List<Memo> memos;

	public static final Find<Long, User> find = new Find<Long, User>(){};
}
```

```Memo.java
@Entity @Table(name = "memos")
public class Memo extends Model {

	@Id
	public Long id;

	public String name;

	public String memo;

	@ManyToOne
	@JoinColumn(name = "user_id")
	@JsonBackReference
	public User user;
}
```
OpenSSHの脆弱性（CVE-2016-0777、CVE-2016-0778）対応方法まとめ

OpenSSHの脆弱性が新たに発見されたというニュースがあったので、対象範囲とか対応方法とかまとめておきます。

## 概要

CVE-2016-0777
クライアントの秘密鍵を含むメモリ情報がサーバーに送信される可能性がある。

CVE-2016-0778
特定の状況でバッファオーバーフローが発生する。

要は変なサーバーにssh接続すると情報漏洩するかもねって話ですかね。

## 対象バージョン

OpenSSHの以下のバージョンが対象になるようです。

```
OpenSSH5.4〜7.1p1
```

## バージョン確認方法

OpenSSHのバージョンを確認するには以下コマンドを実行すればOKです。

```bash
$ ssh -V
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
```

こんな感じ。

## 対応方法

/etc/ssh/ssh_config、もしくは~/.ssh/configに以下を追記する。

```vim
Host *
UseRoaming no
```
※ssh_configの内容によっては、UseRoming noを足すだけでは不十分との指摘をいただいたので、修正しました。

以上でOKなようです！
memcached入門 その1


# memcachedとは何か
オープンソースのメモリオブジェクトキャッシュシステム。

デフォルトだとキャッシュの保存先はDBやファイルになっていることが多いが、memcachedを使うとサーバーとしてキャッシュを管理することが出来、かつ複数台運用も出来るため、スケールするサービスの場合は便利。

例えば、Facebookの場合は高速化のため数千台のmemcachedサーバーを運用しているらしい。

memcacheとmemcachedがあるが、違いについては以下の記事が詳しい。簡単に言うとmemcachedの方が新しくPHPに対応しておりパフォーマンスが高い。

ケーワン・エンタープライズのエンジニアメモ(｀･ω･´)ゞﾋﾞｼｯ!!: memcacheとmemcachedの違い http://k-1-ne-jp.blogspot.jp/2013/01/memcachememcachedlibmemcached.html

memcached自体をWebサービスとして提供している事業者もあり、AWSのElasticacheやHerokuのアドオン等。

# サービスとしてmemcachedを使うメリット
アプリケーションのホスト先として、自社サーバーではなくHerokuなどのSaaSを利用した場合、

AWS EC2などに用意したMemcachedサーバーを使用する事もできるが、管理コスト(死活監視、バックアップなど)を考えると、Herokuに用意されているアドオンを利用する方がメリットが大きい。

# メリット
* キャッシュ専用サーバーとしてmemcachedを複数台運用することでスケールが出来る
* オープンソースで簡単に始められる
* ネット上にドキュメントが多い

# デメリット
* キャッシュのアクセスにネットワークで接続するため遅延が発生する(1台運用でローカルにインストールしてる場合は除く)
* 分散運用するためキャッシュの削除や更新などの管理が難しい

# 参考記事
WordPressの最速キャッシュを探せ！APC、memcached、Transients APIを比較 | OXY NOTES http://oxynotes.com/?p=9278
ケーワン・エンタープライズのエンジニアメモ(｀･ω･´)ゞﾋﾞｼｯ!!: memcacheとmemcachedの違い http://k-1-ne-jp.blogspot.jp/2013/01/memcachememcachedlibmemcached.html
Heroku上に構築するWebアプリケーションは「Memcached」でサーバサイドセッションを管理する (1/2)：CodeZine（コードジン） http://codezine.jp/article/detail/8345
Railsのマスタ的なModelのキャッシュについて[Redis] - 酒と泪とRubyとRailsと http://morizyun.github.io/blog/model-master-cache-rails-redis/
sshuttleでsshサーバをプロキシのように使うのが超便利

企業のセキュリティ対応でご健在なのが「IP制限」。

クラウドサービスは、ID/PASSで認証していることが多いのだけれど、企業のセキュリティ基準の場合には「物理的・地理的な制約」があることが求められるケースもある。IP制限はそのうち、地理的な制約の一つと言ってもいい。これはこれでセキュリティが増すので結構な話。

ただ、全ての環境で、固定IPが持てているわけではないので、何らかの形で固定IPのサーバを通じての通信が必要。いろいろ方法はあるのだけれど、案４がすごく良くてできてるのでおすすめ。

## 案１：Webプロキシサーバをたてる
固定IPをもつサーバにsquidをたてて、Webのプロキシサーバをたてる
＜メリット＞
ブラウザからのプロキシ設定ならやったことがあるユーザーが多い。
＜デメリット＞
ID/PASSの認証。新たにユーザ管理しなくちゃいけない。
ブラウザからの通信のみが対象。

## 案２：sshトンネル
＜メリット＞
枯れた技術。
＜デメリット＞
ユーザの手間が多い。
接続先をローカルホストとかに切り替えるという手間が発生する。

## 案３：VPNサーバを構築
＜メリット＞
枯れた技術。
＜デメリット＞
これだけのためにVPNサーバが必要。VPNのID/PASSの管理が大変。ワンタイムパスワードも導入するソリューションもあるけど、大げさ。

## 案４：sshサーバをプロキシのように使う
これが今回のおすすめ。sshuttleというツールを使う。
＜メリット＞
sshトンネルと似ているのだけれど、PCのクライアントはそこを一切意識しないでいい。公開鍵認証なので、ID/PASSに比べて圧倒的に強い。普段から使い慣れてる。何よりものログインが超ラクチン。
＜デメリット＞
LinuxとMacのみ。Windowsで似たツールがないか探したけどなさそう。

## sshuttleの使い方

インストール(Macの場合）

```
brew install sshuttle
```

実行（全ての通信をsshサーバ経由にしたいとき）

```
sshuttle -r ユーザー名@ホスト名 0/0
```

最後の0/0の部分を、192.168.230.0/24とかにすると、IPレンジ指定でsshサーバ経由の通信になる。

通信速度は確かに落ちるのだけれど、それはどのソリューションを使っても同じ。もはや、多くの人が「私の公開鍵と秘密鍵」を持ち始めている。
Entity Framework Code First で最低限知っておかないといけない規則

* DBの名前は、「名前空間.コンテキスト名」
* DBの接続名は、「コンテキスト名」
* クラス（単数形）は、同名のテーブル（複数形）にマッピング
* プロパティは、同名のテーブル列にマッピング
* 主キーはId、または クラス名 + Id という名前
* ナビゲーションプロパティは、同名（単数形）のエンティティにマッピング
JUnitでLoggerの出力内容をテスト

# きっかけ

外部コマンドを実行するなど、副作用の結果を取得しづらいときは、ログの挙動で期待する結果かどうかを判定したくなります。あるいは、ログ出力されるかどうかをテストしたいというときもあり、調べたり試行錯誤してみました。

# コンストラクタインジェクションを使うやり方

mockのLoggerインスタンスを差し込めるようにするという、一番シンプルなやり方です。今のところはこのやり方に落ち着いています。

## サンプルコード

```lang:Sample.java

public class Sample {

  private Logger logger;

  public Sample() {
     this.logger = LoggerFactory.getLogger(this.getClass());
  }

  public Sample(Logger logger) {
     this.logger = logger;
  }

  public void apply() {
    
     try {
       /* 中略 */
       logger.info("success") 
     } catch (Exeception e) {
       logger.error("failed!", e); 
     }

  } 


}
```

```lang:SampleTest.java

public class SampleTest {

   @Captor
   ArgumentCaptor<String> messageCaptor;

   @Captor
   ArgumentCaptor<Exception> exceptionCaptor;

   @Mock
   Logger logger;

   Sample sample;

   @Before
   public void init() {
      MockitoAnnotations.initMocks(this);

      sample = new Sample(logger); 
   } 

   @Test
   public void test() {
       /* 例外が出るように準備 */
       sample.apply(); 

       verify(logger, times(1)).error(messageCaptor.capture(), execptionCaptor.capture());

       assertThat(messageCaptor.getValue()).isEqualTo("failed!");
       assertThat(execptionCaptor.getValue()).isNotNull();
   }
 

  

}

```

# appenderをモックにするやり方

slf4jやlogbackであれば、appenderをモックにするやり方があるようです。

https://gist.github.com/bloodredsun/a041de13e57bf3c6c040

# 参考サイト

http://shioriwest.hatenablog.com/entry/2014/07/13/015124

https://dzone.com/articles/unit-testing-asserting-line

http://stackoverflow.com/questions/1827677/how-to-do-a-junit-assert-on-a-message-in-a-logger
Play Framework 2.4.x 覚書 junitでsessionのmock

忘れないようにメモ。

## sessionのmock

```
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import org.junit.Test;
import com.avaje.ebean.Ebean;
import apps.FakeApp;
import play.api.mvc.RequestHeader;
import play.mvc.Http;
import play.mvc.Http.Context;
import play.mvc.Http.Request;

public class AuthTest extends FakeApp {
    
    private Request requestMock; 
    private RequestHeader requestHeaderMock;
    private Http.Cookies cookiesMock;

    private void fakeSession() {
        requestMock = mock(Request.class); 
        cookiesMock = mock(Http.Cookies.class);
        requestHeaderMock = mock(RequestHeader.class);
        when(requestMock.cookies()).thenReturn(cookiesMock);
        Context.current.set(new Context(1L, requestHeaderMock, requestMock, new HashMap <String, String>(), 
                new HashMap <String, String>(), new HashMap<String,Object>()));
    }

    @Test
    public void testSession() {
        fakeSession();

        Context.current().session().clear();
        Context.current().session().put("id", "2");
        
        // mockの検証
        assertEquals(Context.current().session().get("id"), "2");
        

    }
}
```
solver > テスト用の式 / 2パラメータでの解

```txt:動作確認
Excel2013 on Windows 8.1 pro
```

## try1
### テスト用の式

http://qiita.com/7of9/items/cab3ff2cadcf2c6e365b
でやろうとしていたことを少しだけ進めることにする。

とりあえずEXCELで計算できるような式をたてる。

上に凸の２次関数を使おうとしてみた。２変数で以下の式を適当に立てた。

```
f = -0.1 * (C3 - 3.14) * (C3 - 3.14) - (C4 - 2.718) * (C4 - 2.718) + 9
```

C3 : distance[m]
C4 : elapsed[sec]

### 2変数でのソルバー

２変数をパラメータにして上記の関数の最大値を求めると以下が得られた。

```
distance[m] = 3.13999978290202
elapsed[sec] = 2.71799734050838
f = 9
```

自分が確認しようとしていることとどうも違う。

## try2

式を変更した。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3dcd20dc-bda9-4d01-171a-e7d69623a66f.png)

### 式

パラメータ

- distanceX [m] > 初期値 3.0
- coeff > 初期値 2.0

加えて elapsed(sec)という変数を追加して、1から10のデータを作成。

それぞれのelapsed(sec)に対応する値の計算は以下とした。

`= -($C$3 - 3.1415)^2 *B11 + -($C$4 - 2.7182)^2 / B11`

こうして得られた10セットの値に対して、R2の値を計算し、R2が最大になるようにソルバーを設定した。

`= RSQ(B11:B20, C11:C20) // R2の式`

これを使うことにしよう。

### 結果例

1. 2変数に対するソルバーの解
  - distanceX[m] = 3.14149999662093
  - coeff = 1.98250447101389
  - 0.653884
2. 1変数に対するソルバーの解
  - distanceX[m] = 3.15に設定
  - coeffをソルバーで解く > 0になってしまった。

1変数のソルバーで解が0になってしまうのが良くない。失敗。


## 方針変更

ウィル・ロジャーズ @ Grenning 
> 穴にはまっていることに気づいたら、掘るのをやめよう

穴にはまっている。やめた。

現在の問題は「２変数のソルバーでは精度が出ていて、１変数のソルバー時に精度が出ていない」。２変数のソルバーでなく、１変数のソルバーに集中する。
Play 2.4.6(Activator 1.3.7)

EBeanが使えない。

libraryDependenciesにjavaEbeanを追加してもだめ。![ebean.jpg](https://qiita-image-store.s3.amazonaws.com/0/107052/36197fee-38dd-3e38-4f8c-910fe2d12db1.jpeg)

https://www.playframework.com/documentation/2.4.x/Migration24
を確認中（英語）

下記でコメントいただいた通り、
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0")
のコメントを外す。

今度はjavax.persistenceが見つからないそうなので、build.sbtにjavaJpaを追加。

お次はcom.avaje.ebean.Modelが見つからないそうなので、build.sbtに
lazy val myProject = (project in file(".")).enablePlugins(PlayJava, PlayEbean)
を追加

そしたら、
https://www.playframework.com/documentation/2.4.x/Migration24

に載ってるサンプルコードがコンパイルできました。
OSXで実行権限を付与したシェルスクリプトは.commandの拡張子をつけるとFinderから実行できる


要は、command拡張子がターミナル.appに関連付けられているのですが、シェルスクリプトをダブルクリックで実行できるので、楽になりました。

```shell
#!/bin/sh

open ~/Documents/test.png
```


こんなの以外にも

```ruby
#!/usr/bin/env ruby

require "open-uri"

open("http://localhost:3000/test").read =~ /<title>(.*)<\/title>/
open("title.txt", "w").write $1
```

みたいなrubyスクリプトも実行できます
startForActivityResult/onActivityResultを使えない条件

# 期待した動作

(1) ActivityAから、startActivityForResult()でActivityBを起動
↓
(2) ActivityBでsetResult(),finish()するよね
↓
(3) ActivityAのonActivityResult()が呼ばれて結果を受け取ってゴニョゴニョ

# 現象

(1) startActivityForResult()
↓
(2) ActivityAのonActivityResult()がすぐに呼ばれる
↓
(3) ActivityBでfinish()した後は、うんともすんとも言わない

# 結論

ActivityA または ActivityBのどちらかに、
android:launchMode="singleInstance"
android:launchMode="singleTask"
が指定されているとstartActivityForResult()/onActivityResult()は使えない

ActivityAをsingleInstanceにしてました。
一応事情があって付けてたんで、代替案を考えないとな・・・

## 参考
http://labs.karappo.net/mobiledev/index.php?itemid=247
名前付きstring型をScanしたい時（database.sql.Scanner）

```go
package main

import "fmt"

type Animal string

const (
	Cat Animal = "cat"
	Dog Animal = "dog"
)

func (a *Animal) Scan(src interface{}) error {
	str := fmt.Sprintf("%s", src)
	*a = Animal(str)
	return nil
}

func main() {
	var animal Animal
	animal.Scan("cat")
	fmt.Println(animal)

	fmt.Println(animal.Scan("monkey"))
}

```
run:

```
cat
<nil>
```

[Playground](http://play.golang.org/p/GWojBvliGZ)

よく忘れるので・・・

# 参考
- http://stackoverflow.com/questions/24264485/saving-enumerated-values-to-a-database
MKPolylineViewのdeprecatedで警告が出た時の対処法

Objective-Cを使用しているプロジェクトでXcodeのバージョンを上げたら下記のような警告がでませんでしたか？

```
'initWithOverlay:' is deprecated: first deprecated in iOS 7.0
```
このdeprecatedは`MKOverlayView`を継承いている`MKPolygonView`や`MKCircleView`のイニシャライザが対象になっていると思います。

おそらく`MKMapViewDelegate`プロトコルの`mapView:viewForOverlay:`または`mapView:didAddOverlayViews:`メソッドで出ていると思います。では前者を例にしてみましょう。

```objc
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKPolyline class]]) {
        MKPolylineView *view = [[MKPolylineView alloc] initWithOverlay:overlay]; // Warning!
        view.strokeColor = [UIColor redColor];
        return view;
    } else if ([overlay isKindOfClass:[MKPolygon class]]) {
        MKPolygonView *view = [[MKPolygonView alloc] initWithOverlay:overlay]; // Warning!
        view.fillColor = [UIColor blueColor];
        return view;
    }

    return nil;
}
```

[MKMapViewDelegate Protocol Reference](https://developer.apple.com/library/ios/documentation/MapKit/Reference/MKMapViewDelegate_Protocol/#//apple_ref/occ/intfm/MKMapViewDelegate/mapView:viewForOverlay:)

> **Deprecation Statement**
> Implement the mapView:rendererForOverlay: method instead.

上記のApple公式リファレンスの通り`mapView:rendererForOverlay:`または`mapView:didAddOverlayRenderers:`メソッドに置き換えましょう。こっちはSwiftで書きましょう。

```swift
func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
    if overlay is MKPolyline {
        let render = MKPolylineRenderer(overlay: overlay)
        render.strokeColor = UIColor.redColor()
        return render
    } else if overlay is MKPolygon {
        let render = MKPolygonRenderer(overlay: overlay)
        render.fillColor = UIColor.blueColor()
        return render
    }

    return nil
}
```

`mapView:viewForOverlay:`ではView(`UIView`)そのものを返しているのに対し、`mapView:rendererForOverlay:`は描画するためのレンダラー(`NSObject`)を返しています。

パッと見何が変わったのかもわからないくらいの変化ですね。なぜこのような変更があったのか、おそらく`MKOverlay`を継承させた*CustomOverlay*を使えるようにするためだと思います。
munin-nodeをインストール

## インストール

### CentOS5,6,7

```bash:
yum install -y epel-release.noarch
yum --enablerepo=epel -y install munin-node
chkconfig munin-node on
```

### archLinux

```bash:
pacman -Sy munin-node
munin-node-configure --suggest --shell sh 2>/dev/null
# 必要なものをlink貼る
systemctl reload munin-node
systemctl enable munin-node
```

### Debian7

> W: There is no public key available for the following key IDs:
> 7638D0442B90D010
> W: There is no public key available for the following key IDs:
> 9D6D8F6BC857C906

とでた場合は以下

```bash:キーリング追加
sudo apt-get install \
  debian-keyring debian-archive-keyring
```

```bash:
apt-get install munin-node
sudo ln -s /etc/init.d/munin-node /etc/rc2.d/S76munin-node
```

### windows

* windowsはsnmpで取得するのが手っ取り早いと思う
    * 32bit: [Releases · munin-monitoring/munin-node-win32 · GitHub](https://github.com/munin-monitoring/munin-node-win32/releases)
    * 64bit: [Munin Node for Windows x64](http://www.aska-inet.co.jp/business/download/munin.html)

## munin.conf

* [munin.conf – Munin](http://munin-monitoring.org/wiki/munin.conf)

port番号を4949から変更する場合は`port`値で指定。

```diff:/etc/munin/munin.conf
 [srv1]
     address 11.22.11.22
+    port 4444
     use_node_name yes
```
Finagleのバージョンを上げる


com.twitter.finagle.httpがだいぶ活躍する印象。

# 前提

- 6.28から6.31へ上げる
- Scalaは2.11.7


## build.sbt
- build.sbtのfinagle-coreとfinagle-httpのバージョンを6.31.+に変更
- finagle-httpxはエラーが出たため、試しに削除。問題なく動作
- twitter-serverは1.13のままだとエラーが出たので、1.16.+に変更

## ソースコード

- 今までHttpRequest, HttpResponseだったところはhttp.Request, http.Responseに変更（com.twitter.finagle.httpのimportが必要）。
	- メソッドもかなり変わっている
	- 記述が簡単になっているところが多いが、逆に面倒になっている場合もある
		
		```
		response.getContent.toString(Charsets.Utf8)
		```
		
		↓
		
		```
		response.getContentString()
		```
		
		```
		new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, urlParam)
		```
		
		↓
		
		```
		val req:http.Request = http.RequestBuilder.safeBuilder(http.RequestBuilder.create().url(urlParam))
		req.version = http.Version.Http11
		```
	
- HTTPステータスコードが「HttpResponseStatus.NOT_FOUND」のように書いていた部分が「http.Status.NotFound」のようになる。
aapt.exe' finished with non-zero exit value 1

AndroidStudioで開発中に、以下のようなエラーが表示された場合の対処方法。
```
Error:Execution failed for task ':app:processDebugResources'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Users\sudou\AppData\Local\Android\Sdk\build-tools\23.0.2\aapt.exe'' finished with non-zero exit value 1

./gradlew assembleDebug --info を実行して、asseetなどに不要なファイルが存在しないか確認する。
muninのtemplate変更(munin_dynamic_template, munstrap)

* debian7.2, munin2で実施

## 参考

* [サーバ監視システム Munin を構築してみた（CentOS6.5 + Vagrant） - Qiita](http://qiita.com/murachi1208/items/2d27d386a2891ccf4ed1#1-12)
* [jonnymccullagh/munstrap: Alternative Munin 2.x templates based on Twitter Bootstrap](https://github.com/jonnymccullagh/munstrap)
* [kyohsuke/docker-munstrap](https://hub.docker.com/r/kyohsuke/docker-munstrap/)

## munin_dynamic_template

![例.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e7462b97-f5ce-a3e2-8fda-5434dc975ced.png)

* 全体が見渡せるので好み
* [GitHub - DaveMDS/munin_dynamic_template: JQuery/Bootstrap based template for munin and munin2](https://github.com/DaveMDS/munin_dynamic_template)

```bash:
git clone https://github.com/DaveMDS/munin_dynamic_template.git
mv munin_dynamic_template /etc/munin/
```

```diff:/etc/munin/munin.conf
- #tmpldir	/etc/munin/templates
+ tmpldir /etc/munin/munin_dynamic_template/munin2
- #staticdir /etc/munin/static
+ staticdir /etc/munin/munin_dynamic_template/munin2/static
```

## munstrapの場合

```bash:
git clone https://github.com/munin-monitoring/contrib.git
mv contrib /etc/munin/munstrap
```

```diff:/etc/munin/munin.conf
- #tmpldir	/etc/munin/templates
+ tmpldir /etc/munin/munstrap/templates
- #staticdir /etc/munin/static
+ staticdir /etc/munin/munstrap/static
```

# 反映

```bash:反映
mv /var/cache/munin /var/cache/munin.bak
mkdir /var/cache/munin
chown munin:munin /var/cache/munin

sudo /etc/init.d/munin-node restart
sudo -u munin /usr/bin/munin-cron
```
バージョンを比較する方法


http://d.hatena.ne.jp/nakamura001/20100905/1283654296
を参考に勉強中のSwiftで作成してみました。（備忘録）

```Swift:Swift
        let verA: String! = "1.0.0"
        let verB: String! = "1.41.0"
        
        if verA.compare(verB, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedAscending {
			// 昇順
        }
        else {
			// 昇順では無い
        }
```

```ObjC:ObjC
	NSString *versionA = @"1.0.0";
	NSString *versionB = @"1.41.0";
	if ([versionA compare:versionB options:NSNumericSearch] == NSOrderedAscending) {
		// 昇順
	} else {
		// 昇順では無い
	}

```
PHPでハマりそうなとこTips その1


# requireの`/`はどれだけあってもいい。

PHPの仕様というより、OSの仕様らしい。

__test.php__

```test.php
<?php

require_once './/////////////////include.php';
```

__include.php__

```include.php
<?php

echo 'hoge';
```

__実行結果__

```
$ php test.php
hoge
```


# メソッドの引数が少ないのはダメだが、多い分には問題無い

__引数が少ない場合__


```
<?php

function say($hoge) {
    echo $hoge . PHP_EOL;
}

say();
```

```
$ php test.php

Warning: Missing argument 1 for say(), ...
```

__引数が多い場合__

```
<?php

function say($hoge) {
    echo $hoge . PHP_EOL;
}

say('fizz', 'buzz');
```

```
$ php test.php
fizz
```

# 配列のインデックスと配列の順番は関係無い

配列には順番があるが、それは配列のインデックス（キー）とは別の概念である。他の言語をやっているとハマる。

__勘違いしそうな例1__

```
<?php

$array = [];
$array[0] = 0;
$array[4] = 4;
$array[2] = 2;
$array[3] = 3;
$array[1] = 1;
var_dump($array);

// 配列の3番目以降を切り出す
$sliced_array = array_slice($array, 3);
var_dump($sliced_array);
```

```
$ php test.php
array(5) {
  [0]=>
  int(0)
  [4]=>
  int(4)
  [2]=>
  int(2)
  [3]=>
  int(3)
  [1]=>
  int(1)
}
array(2) {
  [0]=>
  int(3)
  [1]=>
  int(1)
}
// [3, 4] が取り出されるわけではない
// インデックスも張り替えられる
```

インデックスではなく、配列に入れた順番で後ろの二つが切り出される。

__勘違いしそうな例2__

```
<?php

$array1 = [];
$array1[0] = 0;
$array1[4] = 4;
$array1[2] = 2;
$array1[3] = 3;
$array1[1] = 1;

$array2 = [];
$array2[0] = 0;
$array2[1] = 1;
$array2[2] = 2;
$array2[3] = 3;
$array2[4] = 4;

var_dump($array1 === $array1);
var_dump($array1 === $array2);
```

```
$ php test.php
bool(true)  // 同じ配列を比較しているので当然true
bool(false) // キー => 値 の組み合わせが同じでも順番が違うのでfalse
```

# str_replace の第一引数の配列を渡した時の処理順について

```
var_dump(str_replace(["\t", "\n", "\r\n", "\r"], " ", "\r\n"));
var_dump(str_replace(["\t", "\r\n", "\n", "\r"], " ", "\r\n"));
```

```
string(2) "  "
string(1) " "
```


どういうことかというと、

```
str_replace($array, $after, $str) {
	foreach($array as $before) {
		str_replace($before, $after,$str);
	}
}
```

みたいな感じになっていると思われる。
IntelliJ や PhpStorm などの IDE付属ターミナルから iTerm を開く

IDE付属のターミナルなどから iTerm を直接開きたいことがあります。

```sh
# カレントディレクトリ
iterm
iterm .

# 指定されたディレクトリ
iterm /path/to/openDirectory
```
引数を付けることで指定のパスに移動した状態でiTermを開くことが出来ます。
（省略時カレントディレクトリ）

```sh
## #editor ~/.zshrc
function iterm(){
 local openPath="./"
 local appPath="/path/to/iTerm.app"
 if [ $# != 0 ]; then
  openPath="$1"
 fi
 open -a $appPath $openPath
}
```