OmniAICreator/Qiita-1.07M huggingface dataset:
Go言語のFunctional Option Pattern

###オプション
パッケージを作る際、柔軟性を持たせるためにオプションを持たせたい時がしばしばあります。
しかしオプションは知っての通り設定しないことが少なくありません。
単にコンストラクタに並べるようでは無用な複雑さをはらむことになります。

JavaなどではOptional Parameterなどのように、デフォルト値が指定できる機能があります。
機能の厳選されたgo言語ではそのような機能はありませんが、
"Self Referential Functions Design"というテクニックがあり、
それについての記事がRob Pike氏の記事を筆頭にいくつか説明されています。
オプションと相性が非常に良いため、合わせて"Functional Option Pattern"とも呼ばれています。
Dave Cheney氏の記事を参考におおまかに説明したいと思います。

###様々な解決策
あるServerクラスがあり、そこにタイムアウトと接続数の制限の機能を追加したいとします。

```go
	//最もシンプルなやり方
	server.New("localhost",30*time.Second,10)
```
ある程度作り込むパッケージであればおそらく大半のプログラマがこのやり方は避けると思います。
理由としては常に詳しく設定しなければいけないこと
拡張するたびに引数が増えること
値の意味が不明瞭なことなどとにかくデメリットまみれです。
もちろん引数の拡張の見込みがなく
オプション自体わずかで済むのであればこういった場合の方が良い時もあると思います。

```go
	//解決策？
	server.NewServerWithTimeout("localhost",30*time.Second)
	server.NewServerWithMaxCon("localhost",10)
	server.NewServerWithTimeoutAndMaxCon("localhost",30*time.Second,10)
```
引数は明示的になり必要なものだけ渡すことが可能になりましたが
拡張の度に指数的に関数が増加するというおぞましい構成になります。
こちらもまず使う人はいないと思います。

```go
	//おそらく一般的な解決策
	server.New("localhost",server.Config{
		Timeout:10*time.Second,
		MaxConnection:10,
	})
```
おそらく一般的な解決策はこれになると思います。
実際私もこういったやり方を使っていました。
省略可能で、拡張性があり、明示的ではありますが
デフォルト値の扱いが怪しいところがあります。

```go
	//ポートを新たに追加、デフォルトは8080
	server.New("localhost",server.Config{
		Port:0 //8080に設定される
	})
	//一つも指定しなくてもConfigは渡さなければいけない
	server.New("localhost",server.Config{})
```
サーバーのポートは、指定しなければ8080が割り当てられるというのが一般的なので
ゼロ値であれば8080を設定するようにしたいですが
上記の場合、0と明示的に指定しているのに8080が設定されるという妙な挙動になってしまいます。
また、一つも指定していないにもかかわらずConfig構造体を渡すというのも冗長です。
後者はポインタにすることでnilを渡すことも可能ですが
コンストラクタ使用後にコンフィグデータを弄った場合の挙動が
コンフィグの値を直接参照しているのか、コンストラクタの時点で確定するのかによって変わり、
期待通りの挙動にならない可能性がありますし、結局何かしらを渡すことになります。

###解決策"Functional Option Pattern"
ここで本題の解決策です。

```go:option.go
package server

import "time"

type Option func(*Server)error

func Timeout(t int)Option{
    return func(s *Server)error{
        return s.setTimeout(time.Duration(t) * time.Second)
    }
}
func MaxConnection(c int)Option{
    return func(s *Server)error{
        s.maxConnection = c
        return nil
    }
}
```
上記の形でオプション設定関数を作る関数をコンストラクタに可変長引数として渡すことで

```go
	server.New("localhost",server.Timeout(30),server.MaxConnection(10))
```
こんな感じになります。
これによって
>1. デフォルト値 (完全に独立したデフォルト値が指定できる)
>2. 設定自由度 (自由な組み合わせが指定できる)
>3. 拡張性 (オプションが増えても関数を増やすだけ)
>4. 自己説明能力 (パラメータの名称が明示されます)
>5. 安全性 (コンフィグをポインタで渡したような挙動の推測しづらい弄り方ができません)
>6. 不要な引数の完全な排除 (設定しない項目はもちろん、全て設定しない場合も隠蔽できます)

すべてが解決されます。すごい。

実装はややまどろっこしくはなりますがパッケージは使う側のことを考えて作るものです。
パッケージのオプションを実装する場合、Functional Option Patternを活用することで
あなたのパッケージが強烈無慈悲なオシャレパッケージになるかもしれません。
試してみてはいかがでしょうか。
あまりにオシャレすぎるため乱用したくなりますがgodocにオプション関数が並ぶので
本当に必要かどうかをよく考えて使いましょう。

ちなみにgo言語のprivateはパッケージ内でのアクセスなので
今回のようなメンバでない関数でもプライベートにアクセスできます。
go言語はこういう細かいところも上手くできていますね。すごい。


###参考記事
-Rob Pike
原典です。本記事が誤解だらけであってもとりあえずこれを読めば間違いありません。
https://commandcenter.blogspot.jp/2014/01/self-referential-functions-and-design.html
-Dave Cheney
pkg/errorsパッケージで有名な人です。具体的な例をつかって説明されています
https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis
VB6からVB2005への変換で行き詰まってる・・・

やりたい事は、VB6をC#に変換させたい。
だけど、VB6からVB2005への変換で行き詰まってる・・・


.lpfn = GetPointer(AddressOf BFFCallback)
の箇所で、
「error BC30581: 'Integer' は、デリゲート型でないため、'AddressOf' 式を 'Integer' に変換できません。」
のエラー。

関連するのは、
/***************************************************************************/
Public Function GetPointer(ByRef lngAddressOf As Integer) As Integer

        コールバック関数のアドレスを返す
        GetPointer = lngAddressOf

End Function
/***************************************************************************/

/***************************************************************************/
Public Function BFFCallback(ByVal hwnd As Integer, ByVal uMsg As Integer, ByVal lParam As Integer, ByVal lpData As Integer) As Integer

        フォルダを指定のメッセージをダイアログへ送信
        If uMsg = BFFM_INITIALIZED Then
            Call SendMessage(hwnd, BFFM_SETSELECTIONA, True, lpData)
        End If

End Function
/***************************************************************************/

ググってるけど、中々解決策が見つからず・・・
誰か、解決方法教えて・・・。
CFtpConnection errorcode 12003 対策

#はじめに
MFC使用中に名状しがたいFTPの異常動作に悩まされ苦労して真実を見つけたのでここに残す。

##CFtpConnection errorcode 12003
古いプログラムでFTPを使う際、エラーコード12003が返ってきて異常動作をしていた。
確率はとても低く最初は許容できそうだと思っていたが、イーサネットドライバ辺りがメモリを破壊するのか、PCによっては致命的不具合が起きそうなので対策を講ずることにした。
FTPでダウンロード、サーバ上でリネームを行っていただけであり、コードに問題はない。
WireSharkでパケットを解析すると、RenameしたときのFTPのレスポンスがおかしいことが分かった。

##環境
クライアント側：XP,WIN7 CFtpConnection使用
サーバ側：Windows CE 他不明
アクティブモード

##RFC959非準拠とFtpCommandの相性
RFC959によるとRNTOへのレスポンスで許容されるのは250であるが、Windows CEのFTPサーバは以下のようなものであった。（手打ちなのでレスポンスコード以外は適当）

```
RNFR hoge
350 file exists
RNTO huga
226 closing connection
250 file action is okey
226 Transfer complete
// 最初の226が226-でないかはうろ覚えなので不明
```

何故かRNTOに3個もレスポンスを投げやがるのである。というかほかのコマンドでも226を返しまくる挙動をしていた。だがその割に問題が起きる確率は低かった。
なお、先に記述した通り、期待値は250であり、WireSharkでパケットをよく見ると、2度目の226のパケットが250と連結して送られていれば問題が発生しない規則性を発見した。
これによって未処理のレスポンスコードがコントロール側のポートに残存していると推測した。
その考えでパケットを読むと、発生状況と一致しており、それが起きている確率が高いと判断した。
以上の理由によってレスポンスコードと要求の対応がずれていき、未定義値が返ってきたと判断されるタイミングで12003エラーが起きる。
そのため、原因と結果がかなり離れて発生していた。

```
再掲
RNFR hoge
350 file exists
RNTO huga
226 closing connection   <-レスポンス処理済み
250 file action is okey  <-レスポンス処理済み
226 Transfer complete    <-未処理で受信バッファに残る
RETR foo　//ここでGetFile()すると、上記の226 Transfer completeがレスポンスだと判断され、1つずつレスポンスがずれていく。
```

この問題の発端は226を返すサーバだが、CFtpConnectionの要求動作にも問題がある。
受信バッファをクリアしてから要求していれば、問題は起きなかった。そして、手動でクリアする方法も用意されていなかった。
なお、ウェイトを入れて2回目の226を待っても意味はなかった。CFtpConnection::Rename()は250が来た段階でreturnしているようである。

##解決方法
受信バッファクリアが正解だが、APIなので方法がない。
そのため、Renameコマンドを使用するたび、切断して再ログインするのが正解だった。
その後、問題は再発していない。

##ほかのコマンドは安全か？
GetFile()に関しては226が返って来ているが、連続でやり続けても何も起きていない。

#結論
エラーコード12003が来たら、FTPサーバが余計なレスポンスを返してないか調べよう。
CFtpConnectionはWininetをそのまま使っているらしいので、不具合も引き継いでいる。
MFCはいい加減捨てよう。
この問題は深刻である。受信バッファ上に何か残っているとありとあらゆる問題が起きる。

###参考
[RFC959 FTP 日本語訳](http://srgia.com/docs/rfc959j.html)
Railsでroutes定義を複数ファイルに分けて自動ロードする

Railsでルーティングを定義する場合、`config/routes.rb`に記載しますが、ルーティングが多くなってきたり、サブドメインを管理する場合には分けて管理したくなります。

そこで、`config/routes`ディレクトリに分割したルーティング定義を配置し、開発時に変更が自動で反映されるようにします。Rails5.0.2で確認しているので、自動読み込みの設定方法はRails4などと多少変わっていると思います。

## config/application.rb

設定ファイル`config/application.rb`に以下のように追記します。

```
config.paths.add 'config/routes', eager_load: true
```

## config/routes.rb

続いて、標準のルーティング定義である`config/routes.rb`で分割したルーティング定義を読み込みます（`Rails.application.routes.draw do`内に記述します）。

```
  Dir.glob(File.expand_path("#{Rails.root}/config/routes/**/*.rb", __FILE__)).each do |file|
    instance_eval(File.read(file))
  end
```

## 従来の対応方法

以前に同様のことを実現するために調べた際に以下のようなコードを`config/initializers`に配置していました。

```
if Rails.env.development?
  class RoutesReloader
    ROUTES_PATH = Dir.glob("config/routes/*.rb")

    def initialize(app)
      @app = app

      @routes_reloader = ActiveSupport::FileUpdateChecker.new(ROUTES_PATH) do
        Rails.application.reload_routes!
      end
    end

    def call(env)
      @routes_reloader.execute_if_updated

      @app.call(env)
    end
  end

  Rails.application.config.middleware.use RoutesReloader
end
```

上記では、開発中に何かしらエラーが発生した際にエラー箇所が最後まで表示されない問題がありましたので、改めて自動読み込みの設定を調べてみました。

その他、最適な設定は随時アドバイスお願いします。



-----

**[Created with NOOTO](http://www.nooto.xyz/public/notes/ixFh7Bj_McqkDao0KRNzcIOwPt2xwPSbLng7Vzbr)**
AWS EC2 Amazon LinuxでDocker, Docker Composeをインストールする

個人利用レベルで試したかったので、ECSは使わずEC2インスタンス内にAmazon Linux 上に Docker と Docker Compose をインストールしたメモ。   
この記事では原則 AWS や Docker が公式に公開している手順に基づいて行っています。

# EC2 への Docker インストール

[Docker の基本 - Amazon EC2 Container Service](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html) に基づいて、 `yum` にて行う。



```zsh
# yum の更新
$ sudo yum update -y

# yum から docker をインストール
$ sudo yum install -y docker

# docker サービスの起動
$ sudo service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:                                           [  OK  ]

# ec2-user を docker グループに追加する
$ sudo usermod -a -G docker ec2-user
```

一度ログアウトし、再度ログインすると、 `docker` コマンドが利用可能になる。

```zsh
$ docker info
```


# EC2 への Docker Compose インストール

[Install Docker Compose - Docker Documentation](https://docs.docker.com/compose/install/) に基づいて行う。

```zsh
# 一時的にスーパーユーザーになる
$ sudo -i

# ここから一時的にスーパーユーザー ----
$ curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# docker-compose コマンドに実行権限付与
$ chmod +x /usr/local/bin/docker-compose

# スーパーユーザーを抜ける
$ exit
# スーパーユーザーここまで ----

# docker-compose コマンドの実行確認
$ docker-compose --version
docker-compose version 1.11.2, build dfed245
```

# 補足

docker, docker-compose コマンドを都度打つのは手間なので、aliasを付与しとくと楽。

```zsh
alias d='docker'
alias dc='docker-compose'
```
VagrantのログインシェルをZshへ変更する

自分用にメモ
## 環境
- ゲストOS: Ubuntu

## 手順
まずはzshのインストール
`$ sudo apt-get install -y zsh`

zshのパスを確認しましょう
`$ which zsh`
たぶん`/usr/bin/zsh`じゃないかと思います

ログインシェルを変更します
`sudo chsh -s /usr/bin/zsh vagrant`

終わり

ログアウト後に`vagrant ssh`しなおすとzshでログインされるはずです

## まとめ
なにも考えずに`$ sudo chsh`で設定しても
rootユーザのシェルが変わるだけという当たり前なことになったので
戒めのためのメモでした
【Laravel】 ユニークな外部キーを定義する方法

ユニークな外部キーを作りたいとき，`unique`の第1引数と`foreign`の第2引数に同じキー名を指定すると**インデックスを無駄に2つ作らずに済みます**。標準の命名規則は`テーブル名_属性名_unique`または`テーブル名_属性名_foreign`となっているので，これにちなんで`テーブル名_属性名_unique_foreign`とか付けると良さそう。

```php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateEntitiesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('entities', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned()->unique('entities_user_id_unique_foreign');
            $table->foreign('user_id', 'entities_user_id_unique_foreign')->references('id')->on('users');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('entities');
    }
}
```
[AMIMOTO] ansible で、AMIMOTO インスタンス群を PHP 7.1 にまとめてアップデートする

弊社が AWS MarketPlace で提供している WordPress 実行用環境 [AMIMOTO](https://ja.amimoto-ami.com) で PHP 7.1 が使用できるようになりました。
[AMIMOTO AMI (HVM/PVM) で PHP7.1 を使う方法 ](https://amimoto-ami.zendesk.com/hc/ja/articles/115004329087)

こんな感じの yml とシェルスクリプト使えば、まるっと既存のインスタンス群を PHP 7.1 にアップデートできると思います。

```yaml:php-update.yml
---
- hosts: all
  become: yes
  gather_facts: no
  tasks:
    - name: test connection (before update)
      ping:

    - name: "php-update"
      script: ./php-update.sh

    - name: reboot!
      command: shutdown -r now
```

```bash:php-update.sh
#!/bin/bash
set -eux
instance_type=$(curl -s http://169.254.169.254/latest/meta-data/instance-type/ | sed -e 's/^[^\.]*\.//g')
amimoto_json='/opt/local/amimoto.json'

# monit stop
/sbin/service monit stop
if [ "${instance_type}" = "micro" ]; then
  /sbin/service nginx stop && /sbin/service php-fpm stop && /sbin/service mysql stop
fi

# middleware update
/usr/bin/jq -s '.[1] * .[0]' <(echo '{"phpfpm":{"enabled":true, "version":"71"}}') ${amimoto_json} > /tmp/amimoto.json \
  && /bin/mv -f /tmp/amimoto.json ${amimoto_json}

/usr/bin/git -C /opt/local/chef-repo/cookbooks/amimoto/ pull origin 2016.01
/opt/chef/bin/chef-solo -c /opt/local/solo.rb -j ${amimoto_json} -l error
/usr/bin/yum update -y
```

実行は、こんな感じで。

```bash
ansible-playbook php-update.yml -i ./hosts
```
Swift3 - UITableViewで削除

https://github.com/himaratsu/TableViewEditSample/blob/master/TableViewEditSample/ViewController.swift

これを参考にしてたら消せませんでした

プルリク出したい

# 参考

http://stackoverflow.com/questions/29294099/delete-a-row-in-table-view-in-swift

# 実装

``` swift
if editingStyle == .delete
        {
            myItems.remove(at: indexPath.row) //全部消える

            MainTableView.reloadData() //必須、一個だけ消す
        }
```
validatorjsのカスタムルールを書くときの注意点

前回[フロントサイドのバリデーションにはvalidatorjsが便利](http://qiita.com/hirohero/items/e51ff5a98a0eea425d44)を沢山の方に「いいね」して頂いたので、調子に乗って第二弾です。

validatorjsでは当然ながらカスタムルールを追加することができます。
[本家のドキュメント](https://github.com/skaterdav85/validatorjs#registering-custom-validation-rules)によれば

```javascript
Validator.register(name, callbackFn, errorMessage);
```
のようにルール名、バリデーションを行うコールバック、エラーメッセージを渡すことになっています。
本家ではサンプルとして、電話番号のバリデーションを行うルール`telephone`の例が載っています。

```javascript
Validator.register('telephone', function(value, requirement, attribute) { // requirement parameter defaults to null
    return value.match(/^\d{3}-\d{3}-\d{4}$/);
}, 'The :attribute phone number is not in the format XXX-XXX-XXXX.');
```

さて、問題はこのコールバックのシグネチャです。本家のサンプルコードでは`value, requirement, attribute`となっていますが、実際にコードを組んでみるとちょっと違うようなのです。

本家のコードでは、呼び出し元のコードはこんな感じになっています。

```javascript
  check: function() {
    var self = this;

    for (var attribute in this.rules) {

      (snip)

      for (var i = 0, len = attributeRules.length, rule, ruleOptions, rulePassed; i < len; i++) {
        ruleOptions = attributeRules[i];

        (snip)

        rulePassed = rule.validate(inputValue, ruleOptions.value, attribute);
        if (!rulePassed) {
          this._addFailure(rule);
        }

        (snip)
      }
    }

    return this.errorCount === 0;
  },
```

- 第1引数: (`inputValue`): データとして入力された値
- 第2引数: (`ruleOptions.value`): ルールのオプション
- 第3引数: (`attribute`): ルールのキー名

が正しい結果のようですね。


実際に簡単なテストコードを組んでみました。

```html
<html>
    <head>
        <script src="./validatorjs/dist/validator.js"></script>
    </head>

    <body>
        <script>
            Validator.register('telephone', function(value, requirement, attribute) {
                console.log(arguments);
                return value.match(/^\d{3}-\d{3}-\d{4}$/);
            }, 'The :attribute phone number is not in the format XXX-XXX-XXXX.');

            var v = new Validator({
                tel: '012-345-6789'
            }, {
                tel: 'required|telephone:ja'
            });

            console.log(v.check());
        </script>
    </body>
</html>
```
結果はこんな感じ。
![スクリーンショット 2017-03-15 13.54.53.png](https://qiita-image-store.s3.amazonaws.com/0/145575/568548f4-e193-2513-9e22-fa378ccd49c4.png)

第2引数に、`telephone`ルールに指定したオプションである`ja`が渡されていることがわかります。

これを利用すれば、`ja`オプションを指定した場合のパターンを追加することができますね。

```javascript
Validator.register('telephone', function(value, option, attribute) {
    var valid_pattern = /^\d{3}-\d{3}-\d{4}$/; 

    // 日本の電話番号のパターン
    // 参考: 総務省 電話番号に関するQ&A
    //       http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/q_and_a.html 
    if(option == 'ja'){
        valid_pattern = /^0\d{1,4}-\d{1,4}-\d{4}$/; 
    }

    return valid_pattern.test(value);
}, 'The :attribute phone number is not in the valid format.');
```

validatorjsはルールの拡張がしやすいのでどんどん活用しましょう。
Google Chromeのすべての設定をインポート・エクスポートする方法

# Google Chromeのすべての設定をインポート・エクスポートする方法
特殊な環境下（例えば、複数人で共有している仮想デスクトップとか）で、ログインのたび、または一定の間隔でドメコンなどでWindowsの設定がリセットされる場合で、一緒にGoogle Chromeで設定していたブックマークなど諸々の設定が消えてしまう場合に役立ちます。

## 試した環境
OS：Windows10 64ビット
Google Chrome：バージョン 56.0.2924.87

## エクスポート手順
### １．Google Chromeを終了する
Google Chromeを起動している場合は終了します。
### ２．エクスポートする
Google Chromeの設定情報関連ファイルを隠しファイル・フォルダも含めすべて、どこかにバックアップします。

```
xcopy /Y /E /H /I "C:\Users\[任意のユーザ名]\AppData\Local\Google\Chrome\User Data\Default" "[バックアップ先フォルダパス]"
```

## インポート手順
### １．Google Chromeを終了する
Google Chromeを起動している場合は終了します。
### ２．インポートする
下記コマンドで、GoogleChromeの設定情報関連ファイルを削除し、バックアップから復元（全設定上書き）します。

```
rmdir /Q /S "C:\Users\[任意のユーザ名]\AppData\Local\Google\Chrome\User Data\Default"
xcopy /Y /E /H /I "[バックアップ先フォルダパス]" "C:\Users\[任意のユーザ名]\AppData\Local\Google\Chrome\User Data\Default"
```

以上です。
Swift3 - UITableView並び替え

# 参考

https://github.com/himaratsu/TableViewEditSample/blob/master/TableViewEditSample/ViewController.swift

myItemsはArray

# 実装

```swift


    
    // (5) 移動を有効
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    // (6) 移動時の処理
    func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
        
        // データの順番を整える
        let targetTitle = myItems[sourceIndexPath.row]
        if let index = myItems.index(of: targetTitle) {
            myItems.remove(at: index)
            myItems.insert(targetTitle, at: destinationIndexPath.row)
            print(myItems)
        }
    }
    
    private func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath as IndexPath, animated: true)
        print(myItems,
            
            [indexPath.row])
    }
```
url モジュールでクエリ文字列を更新する

# はじめに

僕は URL 文字列を操作する時、極力文字列操作ではなく専用のライブラリを使いたいと思っています。文字列操作では不正なフォーマットの文字列を作成してしまう危険性があるからです。例えば、クエリ文字列の `?` を付け忘れたり。

Node.js には [url](https://nodejs.org/api/url.html) モジュールが存在します。このモジュールを使うことで URL 文字列のパースや生成を簡単に行えます。しかし、既存の URL 文字列のクエリ文字列を加工したいときに意外と苦労したので、今回メモを残しておきます。

# 方法

```js
import 'url';

const addQueryTo = (href, query) => {
  const urlObject = url.parse(href, true); // (1)
  
  urlObject.search = undefined; // (2)
  Object.assign(urlObject.query, query);
  
  return url.format(urlObject);
};

addQueryTo('http://example.com', { hoge: 1 });
//=> 'http://example.com/?hoge=1'

addQueryTo('http://example.com?hoge=1', { fuga: 2 });
//=> 'http://example.com/?hoge=1&fuga=2'

addQueryTo('http://example.com?hoge=1', { hoge: 10, fuga: 20 });
//=> 'http://example.com/?hoge=10&fuga=20'
```

ポイントは 2 点あります。

## (1) url.parse() の第 ２ 引数に true を指定する

> parseQueryString <boolean> If true, the query property will always be set to an object returned by the querystring module's parse() method. 

こうすることで、クエリ文字列が [querystring](https://nodejs.org/api/querystring.html) モジュールによりパースされ、オブジェクトとして扱えるようになります。オブジェクトにすることで更新やマージなどの操作が簡単になります。

## (2) urlObject.search に undefined を代入する

これが重要な点です。

> If the urlObject.search property is undefined and if the urlObject.query property is an Object, the literal string ? is appended to result followed by the output of calling the querystring module's stringify() method passing the value of urlObject.query.

`urlObject.search` が `undefined` の場合のみ、`url.format()` の結果に `urlObject.query` が反映させます。それ以外の場合は `urlObject.search` の値が使用され、`urlObject.query` をいくら更新しても、`url.format()` の結果に反映されません。

```js
const urlObject = url.parse('http://example.com?hoge=1', true);

urlObject.query  //=> { hoge: '1' }
urlObject.search //=> '?hoge=1'

Object.assign(urlObject.query, { fuga: 2 });

urlObject.query  //=> { hoge: '1', fuga: 2 }
urlObject.search //=> '?hoge=1'

url.format(urlObject) //=> 'http://example.com/?hoge=1'
```

ドキュメントをちゃんと読んでいなかったので、この仕様にハマって苦労しました :sob:

# 参考

* 公式ドキュメント
    * [Node.js v7.7.3 Documentation > URL](https://nodejs.org/api/url.html)
* Stack Overflow
    * <i class="fa fa-stack-overflow"></i> [Node.js url.parse result back to string](http://stackoverflow.com/questions/7517332/node-js-url-parse-result-back-to-string)
Google FormのGoogle Apps Scriptトリガー登録

##初めてフォームのメール自動転送とSlack通知のスクリプトを作成していてトリガーを登録する際にはまった。

トリガーの登録についてググるとほとんどが "「リソース＞現在のプロジェクトのトリガー」を選択します" と出てくるが、<del>現行のFormではこの項目が出てこない（2017-03-15現在）ので</del>、その下の時計みたいなマークをクリックすると出てくる。
![スクリーンショット_2017-03-15_14_55_50.png](https://qiita-image-store.s3.amazonaws.com/0/26386/37e88cc0-6a1d-2bc8-036b-34e57b55d9d6.png)

※2018-04-24追記　この記事をリンクしてくださったのを見て知ったが、現在ではメニューの「編集>現在のプロジェクトのトリガー」で出てくるようになっている。（[GoogleAppScript初心者がGoogleスプレッドシートで作業を自動化した時のメモ - Qiita](https://qiita.com/Mio_Tagami/items/0dc35302d84730572d9a#_reference-21322cbe24a15ba33fff)）



##アカウント毎にトリガー登録
作成が完了したフォームを他のアカウントに共有し、
* アカウントAでトリガーを登録
* アカウントBでもトリガーを登録
したところ、両方のメルアドから自動転送メールが届くようになった。
アカウントAのトリガーを削除したところ、Bのみから届くように。
アカウント毎にトリガーを登録する事ができる、という仕組みらしい。

※2018-04-24追記　例えばお問い合わせフォームからの自動返信メールをユーザー対応専用メアドから送信したければ、フォームの作成自体は他のアカウントでやっても構わないが、トリガー登録についてはユーザー対応専用のアカウントで行う必要がある。
[Resolved] Qiita? > bug > 数式の左側に数字(例: 12345...)が表示される > Chromeでの拡張機能使用時に発生する

```txt:動作環境
Windows 8.1 pro (64bit)
Google Chrome バージョン 56.0.2924.87
Q Accelerator version 1.3.1
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/12b4af91-f2fb-8c7d-1824-405fba603c35.png)

上記の式は本来左辺には1がつかないが、なぜか記事上で1がつくようになっています。

編集中のプレビュー表示ではつきません。

こちらの環境の問題なのか、Qiita側の問題かは切り分けできていません。

記事によっては数字が「123456...」のようになっている例もありました。

<hr>
(追記 2017/03/16)

@howdy39 さんによるQ Accelerator を使用させていただいています。

コードの行番号表示と関連があるかもしれません。

Q Accelerator自体をOFFにした場合、式左の数字は表示されなくなりました。

<hr>
(追記 2017/03/17)

@howdy39さんの方でQ Acceleratorの対応をしていただきました。
v1.3.2以降にて上記の問題は見られません。
GCEでprometheusを使ってみた

GCE上にインスタンスをいくつか作って、役割などに応じて、 api , web , db , staging , production などのタグを雑につけて運用しています。

その状況で、prometheus を導入していろいろメトリクスを取りたくなりました。

ということで、以下のようなことをやりました。

## credeitial の生成

https://developers.google.com/identity/protocols/application-default-credentials
この辺を参照して、credential の json を取得し、prometheus を実行するホストの `~/.config/gcloud/application_default_credentials.json` に配置します。

## gce_sd_config

`__meta_gce_tags` は、例えば foo と bar というタグが付いていたら、 `,foo,bar,` という値を返すようです。

## redis_exporter について

redis_exporter は、起動時の引数として対象となるredis server のアドレスをいくつも並べる形になっています。
が、それではちょっと管理しにくいので、redis の各インスタンスでそれぞれ localhost を向けた redis_exporter を動かすことにしました。

## 最終的な prometheus.yml

最終的にはこんな感じになりました。

```
  - job_name: 'node'
    gce_sd_configs:
    - project: XXXXXXXXX
      zone: asia-east1-c
      port: 9100
    relabel_configs:
    - source_labels: [__meta_gce_instance_name]
      target_label: instance
      regex: (.*)
      replacement: $1
    - source_labels: [__meta_gce_tags]
      target_label: stage
      regex: ".*,(staging|production),.*"
      replacement: $1
    - source_labels: [__meta_gce_tags]
      target_label: role
      regex: ".*,(api|web|db|redis),.*"
      replacement: $1

  - job_name: 'redis_exporter'
    gce_sd_configs:
    - project: XXXXXXXXX
      zone: asia-east1-c
      port: 9121
    relabel_configs:
    - source_labels: [__meta_gce_instance_name]
      target_label: instance
      regex: (.*)
      replacement: $1
    - source_labels: [__meta_gce_tags]
      target_label: stage
      regex: ".*,(staging|production),.*"
      replacement: $1
    - source_labels: [__meta_gce_tags]
      target_label: role
      regex: ".*,redis,.*"
      action: keep
```

もう少し、regexのあたりとかうまくやれそうに見えますが…
とりあえずいい感じに動いたので良しとします。
statistics > mean size and variance > 緯度経度ごとの値から緯度のmeanとvarianceを求める

**以下は間違っている可能性があります**

### 問題

- ある値の分布が緯度、経度ごとに与えられている
- そこから、以下の4つの値を求める
   - 平均緯度
   - 平均経度
   - 緯度の分散
   - 経度の分散

### 資料

思い出したのはCharlie Zender氏によるFACTという資料。
サイズ分布関連の式であるが、緯度経度の分布にも応用できるような気がする。

http://dust.ess.uci.edu/facts/psd/psd.pdf

式(14)にMean size, 式(15)にVarianceがある。

### Mean > 式(14)

```math
\bar{x} = \int_{0}^{\inf} p(x) x dx 
```

### Variance > 式(15)

```math
\sigma_x^2 = \int_{0}^{\inf}p(x)(x - \bar{x})^2 dx
```

### p(x)相当の計算

緯度経度ごとの値(val(x))より、p(x)が計算できると思う。

ここで、
p(x) : インデックスxごとの確率分布。

```math
p(x) = val(x)/T 
```

ここで

```math
T = \int{val(x)}
```

### 平均緯度

式(14)とp(x)を関連付けて

```math
\bar{lat} = \int{p(x)*lat(x)dx}
```

numpyで実装した計算では実際の分布図と合致した。

### 緯度の分散

式(15)と関連付けて

```math
\sigma^2_{lat} = \int{p(x)(lat(x) - \bar{lat})^2 }dx
```

numpyで実装した計算結果の検証はまだ。

### code

```calc_latlon_avg_std_170315.py
#!/usr/bin/env python

import numpy as np

'''
codingrule:PEP8
'''


def calc_variance(vals, loc, avg, ttl):
    acc = 0.0
    for elem in zip(vals, loc):
        tmp = (elem[1] - avg) ** 2
        acc += elem[0] * tmp
    return acc / ttl

with open('out_val_170315') as vfp:
    val = vfp.read()
with open('out_lat_170315') as afp:
    lat = afp.read()
with open('out_lon_170315') as ofp:
    lon = ofp.read()

vals = map(float, val.split())
lats = map(float, lat.split())
lons = map(float, lon.split())

# 1. total
total_val = np.sum(vals)
print('total=%.2f' % total_val)

# 2. average for latitude
acc_lat = np.dot(vals, lats)
avg_lat = acc_lat / total_val
print('avg_lat=%.3f' % avg_lat)

# 3. average for longitude
acc_lon = np.dot(vals, lons)
avg_lon = acc_lon / total_val
print('avg_lon=%.3f' % avg_lon)

# 4. stdev for latitude
vrc_lat = calc_variance(vals, lats, avg_lat, total_val)
std_lat = np.sqrt(vrc_lat)
print('std_lat=%.3f' % std_lat)

# 5. stdev for longitude
vrc_lon = calc_variance(vals, lons, avg_lon, total_val)
std_lon = np.sqrt(vrc_lon)
print('std_lon=%.3f' % std_lon)
```
Swift3 - スワイプでUITableViewCellの削除

# 参考

http://qiita.com/iritec/items/ddbcec788db3118580b6

# 注意

配列は ` NSMutableArray ` じゃないと使えないよ

# 実装

```swift


    //セルの削除許可を設定

    func tableView(_ tableView: UITableView,canEditRowAt indexPath: IndexPath) -> Bool
    {
        return true
    }
    
    //セルの削除ボタンが押された時の処理
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == UITableViewCellEditingStyle.delete {
            ArrayName.removeObject(at: indexPath.row)
            tableView.deleteRows(at: [indexPath as IndexPath], with: UITableViewRowAnimation.automatic)
        }
    }

```
AzureのManaged Diskのベンチマーク測ってみた

# Managed Diskのベンチマークを測ってみた
Managed Diskの使用感を含め検証ついでにベンチマークを測ってみました。
ついでにストレージ アカウント（管理ディスクじゃない方）と比較してみました。

## 検証環境
### **Managed Disk**
**デプロイ モデル**
Resource Manager
**VM ディスクの種類**
HDD
**サイズ**
Standard D1 v2 (1 コア、3.5 GB メモリ)
**リージョン**
米国西部 2
**OS**
Windows Server 2016

### **ストレージ アカウント**
**デプロイ モデル**
Resource Manager
**VM ディスクの種類**
HDD
**サイズ**
Standard D1 v2 (1 コア、3.5 GB メモリ)
**リージョン**
米国西部 2
**OS**
Windows Server 2016

※ Standard D1 v2 (1 コア、3.5 GB メモリ)を選んだのは、Azureさんがお勧めですというから･･･言うがままに選びました。

**使用ツール**
CrystalDiskMark 5
設定値
テスト回数：5回
テストサイズ：32GiB
テストドライブ：C:11%

## 検証結果
**Managed Disk**
![snip_20170315175311.png](https://qiita-image-store.s3.amazonaws.com/0/170487/c70a7ffe-2fb8-aab7-9555-061a8cc5d109.png)

**ストレージ アカウント**
![vm02snip_20170315175311.png](https://qiita-image-store.s3.amazonaws.com/0/170487/8c5a036b-e1dd-7c5e-4ff8-3ab5c55b30ba.png)




「パフォーマンスでは、大差がないことが分かったので機能面で選択有無を選びたいと思いました。」と書いて準備していたら
Seq Q32T1とSeqのRead各Diskに個性が出てきて困惑しています。
twitter api メモ

自分的メモです。

//        リスト内検索 hoge さんの kabutech リスト内から　うどんを検索

```

$res = $this->Twitter->search([
  'q' => 'うどん list:hoge/kabutech'
]);

```



//        ここみんが、どのリストに追加されているか取得。
//　　　lists/memberships

```

        $res = $this->Twitter->getList([
            'screen_name' => 'coco3n'
        ]);

```

アイデアとして、

・ツイートのプロフィールのピン留め
・ツイッターリストに、ツイッターログイン時、同時に登録。
そこから最新のつぶやきを取得することでサイトにユーザー毎の最新のつぶやきを持ってこれるようになるのではないか。
jQueryを使ってスムーススクロール


```javascript
$(function(){
  $('a[href^=#]').click(function(){
    var speed = 500;
    var href= $(this).attr("href");
    var target = $(href == "#" || href == "" ? 'html' : href);
    var position = target.offset().top;
    $("html, body").animate({scrollTop:position}, speed, "swing");
    return false;
  });
});
```

 (参考)
https://techacademy.jp/magazine/9532
tmuxinatorのDockerイメージを使ってスクリプト生成

tmuxの環境構築には[tmuxinator](https://github.com/tmuxinator/tmuxinator)が便利ですが、tmuxinator自体（もしくはRuby）をインストールしたくない場合があります。
その場合、tmuxinatorのdebugオプションを使うとtmuxコマンドが書かれたbashスクリプトが生成されるので、Dockerイメージを使ってそれを利用します。

- 環境
  - Windows 10
  - docker-toolkit 17.03
  - Git for Windows (コマンドは全てこれ上で実行しています）
  - tmux 2.3

### 設定ファイル

#### docker-compose設定
Dockerイメージ [benizar/tmuxinator](https://hub.docker.com/r/benizar/tmuxinator/) は公式ではありませんが使わせていただきます。
volumeは/rootにマウントする必要があります。
ホスト側は$HOMEを指定していますが別ディレクトリでもOKです。

```yaml:docker-compose.yml
version: '3'
services:
  tmuxinator:
    image: benizar/tmuxinator
    volumes:
      - $HOME:/root
```

#### サンプルtmuxinatorプロジェクトファイル
ホスト側のマウントするディレクトリに`.tmuxinator`ディレクトリを作成し、その中にYAMLファイルを作成します。
文法は[公式](https://github.com/tmuxinator/tmuxinator)を参照してください。

```yaml:~/.tmuxinator/my-project.yml
name: my-project
root: /c/Users/user
windows:
  - main:
      layout: tiled
      panes:
        - vagrant status
        - git status
  - sub:
      panes:
        - docker ps
```

設定ファイルは以上です。

余談ですが、Windows(MSYS2)の場合、docker-composeを使わず`docker run`コマンドに --volume(-v) オプションをつけるとうまくいきません。MSYS2_ARG_CONV_EXCL環境変数を使ったり、他の回避方法もありますがdocker-composeが楽だと思います。
Macなら`docker run -v ...`でいけると思います。

### スクリプト生成
tmuxinatorの`debug`オプションで生成します。引数にymlファイルの拡張子を除いた部分を指定します。

```bash
$ docker-compose run --rm tmuxinator debug my-project > my-project.sh

$ cat my-project.sh
#!/bin/bash

# Clear rbenv variables before starting tmux
unset RBENV_VERSION
unset RBENV_DIR

tmux start-server;

  cd /c/Users/user

  # Run pre command.
  

  # Create the session and the first window. Manually switch to root
  # directory if required to support tmux < 1.9
  TMUX= tmux new-session -d -s my-project -n main
  tmux send-keys -t my-project:0 cd\ /c/Users/user C-m


  # Create other windows.
  tmux new-window -c /c/Users/user -t my-project:1 -n sub


  # Window "main"
  tmux send-keys -t my-project:0.0 vagrant\ status C-m

  tmux splitw -c /c/Users/user -t my-project:0
  tmux select-layout -t my-project:0 tiled
  tmux send-keys -t my-project:0.1 git\ status C-m

  tmux select-layout -t my-project:0 tiled

  tmux select-layout -t my-project:0 tiled
  tmux select-pane -t my-project:0.0


  # Window "sub"
  tmux send-keys -t my-project:1.0 docker\ ps C-m

  tmux select-layout -t my-project:1 tiled

  tmux select-layout -t my-project:1 
  tmux select-pane -t my-project:1.0


  tmux select-window -t 0
  tmux select-pane -t 0

  if [ -z "$TMUX" ]; then
    tmux -u attach-session -t my-project
  else
    tmux -u switch-client -t my-project
  fi
```

### スクリプト実行
生成されたスクリプトを実行するとtmuxが設定された状態で立ち上がります。

```bash
$ chmod +x my-porject.sh # Windowsだと不要です
$ ./my-project.sh
```

以上です。
Unity NGUIが描画順制御するときに何をしているかメモ

# 概要
いつも忘れるのでメモったものを残します。解釈が誤っていたら指摘をよろしくお願いします。NGUIのバージョンは3.11.1です。

# NGUIの描画の仕組み
UIDrawCall.csの冒頭の#define SHOW_HIDDEN_OBJECTSのコメントアウトを外してUnityを再生すると分かりますが、NGUIはTexture,Sprite,Label(全てUIWidgetを継承)等を動的に生成したUIDrawCallオブジェクト(MeshRenderがアタッチされている)で描画しています。単純にMeshRenderに描画に必要な頂点、uv、マテリアル等を流し込んでいるだけです。このUIDrawCallオブジェクト一つが1ドローコールに相当します。またUIDrawCallオブジェクトは同一のマテリアルを持つものでまとめられます。(バッチング)

# UIDrawCallと描画順
描画順は、基本はUIDrawCallのrenderQueueが制御しています。ここで言うRenderQueueは最終的にはMaterialクラスのrenderQueueに代入されるものです。NGUIではデフォルトではrenderQueueが3000から始まり、UIDrawCallオブジェクトが追加される毎にrenderQueueがインクリメントされていくイメージです。

# UIDrawCall同士の描画順について
またUIDrawCallオブジェクトは、そのオブジェクトのTransform上の親にあるUIPanelが管理します。UIDrawCallは作成される順番でrenderQueueがインクリメントされていきますが、UIDrawCallの作成される順番はUIWidgetのdepthで制御されています。depth値の大きいUIWidgetの方が順番が後方になるのでrenderQueue値が大きくなり、描画順が後になるという感じです。

# UIPanelと描画順について
UIPanelが2つ以上ある場合、UIPanelのdepth値が大きい方が描画順が後になります。つまり、UIPanelのdepth値の小さいUIPanelが管理しているUIDrawCallが先に追加されるので、UIPanelのdepth値が大きい方が描画順が後になります。

# 同一のUIDrawCallオブジェクト内の描画順
例えば同一アトラスの2つのスプライトが同じUIDrawCallにバッチングされたとしたら、その描画順はそのスプライト(UIWidget)のdepth値で決まるようです。決まるようですといったのは、depth値で決まる理屈がよく分からず、断言するまでの自信が無いということです。UIDrawCallにMeshに頂点を設定するとき(Mesh.SetVertices)の頂点の順番がUIWidgetの順番(depth値で決まる)に依存しており、多分この頂点の順番が描画順になっているのだろうと推測しています。
Vue.jsはRiot.jsより良いんじゃないかと思ったのでメモ


* RiotとVue検討段階の人が書いたものです。実用してみての感想ではないのでご注意願います。


## Vue.jsのドキュメントに優位性の説明があった

[他のフレームワークとの比較 - Vue.js](https://jp.vuejs.org/v2/guide/comparison.html#Riot)

> Riot 2.0 はよく似たコンポーネントベースの開発モデル（”タグ”と Riot では呼ばれています）を提供しており、必要最小限の美しく設計された API を持っています。Riot と Vue はおそらくその設計哲学の多くが共通しているのでしょう。しかしながら、Riot よりも少し重いにも関わらず、Vue はいくつか著しく優れた点を持っています：
> 
> - [トランジションエフェクトシステム](https://jp.vuejs.org/v2/guide/transitions.html)。Riot にはありません。
> - ずっと強力なルータ。Riot のルーティング API は極めて最小限です。
> - より優れた性能。Riot は 仮想 DOM を使用しているというよりむしろ[DOM ツリーをトラバース](http://riotjs.com/compare/#virtual-dom-vs-expressions-binding)しているため、Angular 1 と同じ性能問題に苦しめられています。
> - より熟成したツールのサポート。Vue は [Webpack](https://github.com/vuejs/vue-loader)、[Browserify](https://github.com/vuejs/vueify) の公式サポートを提供していますが、対して Riot はビルドシステムの統合についてはコミュニティのサポートに頼っています。

## 懸念: Vue.jsだと一つのファイルにHTML,CSS,JSがまとめられないのでは？

Vue.jsだとRiot.jsのようなコンポーネント化はできないけど、Vueifyがあってできる。

- [vuejs/vueify: Browserify transform for single-file Vue components](https://github.com/vuejs/vueify)

```html:app.vue
<style>
  .red {
    color: #f00;
  }
</style>

<template>
  <h1 class="red">{{msg}}</h1>
</template>

<script>
export default {
  data () {
    return {
      msg: 'Hello world!'
    }
  }
}
</script>
```

cssコンパイラをstylusにするのも簡単だった。`yarn add -D stylus`するだけだった。

```html:app.vue(stlyus+jade+coffee)
<style lang="stylus">
.red
  color #f00
</style>

<template lang="jade">
h1(class="red") {{msg}}
</template>

<script lang="coffee">
module.exports =
  data: ->
    msg: 'Hello world!'
</script>
```

しかも、Riot.js+Webpackを組むより楽ちんだった。

- [vuejs-templates/browserify: A full-featured Browserify + vueify setup with hot-reload, linting & unit testing.](https://github.com/vuejs-templates/browserify)

```
$ yarn global add vue-cli
$ vue init browserify my-project
$ cd my-project
$ yarn install
$ yarn dev
```

![](https://c16e-esa.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/5606/2017/03/15/18740/9702c1dd-428a-4fd3-905e-759793cb8643.png)

![](https://c16e-esa.s3-ap-northeast-1.amazonaws.com/uploads/production/attachments/5606/2017/03/15/18740/5f80c531-1e73-4402-b954-174ab046fda8.png)

## Atomのハイライト

* language-vueを入れると、.vueファイルがハイライトされる。
* language-stylusを入れると、`<style lang="stylus">`の中身もハイライトされる。
WindowsでJDK8をインストーラーを使わずインストールする方法

# WindowsでJDK8をインストーラーを使わずインストールする方法
Windowsで、JDK(Java SE Development Kit)のインストーラー(exeファイル)を使用しないで、JDKをインストール（利用）する方法を紹介します。

## 試した環境
OS：Windows10 64ビット
JDK：Java SE Development Kit 8u121

## この方法で得られるメリット
・JDKを複数使用して開発する場合、切替が容易。
・Javaバージョンアップを促す通知を受け取らなくて済む。

## 手順
### １．JDKをダウンロードする
普通にOracleのサイトからWindows用のJDKをダウンロードします。
今回は環境に合わせて「jdk-8u121-windows-x64.exe」をダウンロードしました。

### ２．ダウンロードしたexeファイルをzipに変更する
ファイル名変更で、ファイル拡張子「.exe」を「.zip」に変更します。

### ３．zip解凍ソフトを用意する
Windows標準搭載の解凍機能では上手く解凍できないので、zip解凍ソフトを用意します。
今回は、「7Zip」を使用しました。　入手元はこちら→[https://sevenzip.osdn.jp/](https://sevenzip.osdn.jp/)

### ４．zipファイル解凍する
7Zipで解凍したファイルを好きな場所に保管します。
「ファイルを[zip]書庫として開くことができません」といった警告が表示されますが気にしなくてOKです。

### ５．必要に応じて(※１)解凍したファイルからCABファイルを展開する
_※１:解凍したフォルダ内に「tools.zip」が存在する場合はこの作業は必要ありません。「jdk-7u51-windows-i586.exe」で試した場合は、解凍した時点で「tools.zip」が出来上がっていました。JDKのバージョンによって違う様です。_

次のコマンドを実行します。

```
cd [解凍したフォルダパス]\.rsrc\1033\JAVA_CAB10
extrac32 111
```

### ６．「tools.zip」を解凍し、jarファイルに変換する
「[解凍したフォルダパス]\.rsrc\1033\JAVA_CAB10」フォルダにある「tools.zip」を解凍し、以下コマンドを実行して.packファイルを.jarファイルに変換します。

```
cd [解凍したフォルダパス]\.rsrc\1033\JAVA_CAB10\tools
for /r %x in (*.pack) do .\bin\unpack200 -r "%x" "%~dx%~px%~nx.jar"
```

### ７．好きな場所に「tools」フォルダを移動・リネームする
toolsフォルダ内のファイル、フォルダを好きな場所に移動します。
今回の例では「C:\Java\jdk-8u121」にしました。
↓こんな感じです。
<img width="489" alt="20170315_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/75324/7dbcf09c-0872-9934-0691-f66e7a7997a0.png">

### ８．環境変数を設定し、java -versionコマンドで確認する
↓環境変数でJAVA_HOMEを追加します。
<img width="420" alt="20170315_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/75324/c4134ae7-efce-c8cf-9309-c4178c94b57a.png">

↓PathにJAVA_HOMEを追加します。
<img width="420" alt="20170315_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/75324/6af2309e-38a7-c922-b21e-98c2f8d68e01.png">

↓「java -version」コマンドでバージョンを確認します。
<img width="420" alt="20170315_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/75324/b05ffc40-c414-f75c-e5d4-d59c0a508d8f.png">



以上です。
小規模デザインチームにおけるカジュアルデザインレビューのススメ

デザイナーチーム内で以前より課題と感じていたデザインチェック体制の構築に取り組んでみましたメモです。

#<i class="fa fa-pencil-square-o" aria-hidden="true"></i> 前提条件

- 案件は受託制作が中心
- デザイナー5名（内マネージャー1名）

#<i class="fa fa-thumbs-o-down" aria-hidden="true"></i> 組織が抱えていた課題

##1.個人で作業が完結しがち
案件規模により複数人アサインされることもあるが、1案件＝1デザイナーで完結する事が多い。
またマネージャーはいるもののアートディレクター的なポジションが存在しないため、デザインクオリティにバラつきが出やすかった。作業が属人化しており、誰が何を作っているのかお互いにわからない問題もありました。

##2.スケジュールがタイトな場合業務フローに組み込みにくい
受託案件が中心なので、スケジュールがタイトになりがち。
そのため作業工数が増えるデザインチェックを敢えて排してきた経緯もあり、また組織としてのスピード感も重視したいため、レビューできる（して欲しい）案件とできない案件を依頼する側が切り分けて依頼できる仕組みが必要。

##3.実施にあたっての心理的障壁がある
これまで個人の自発性に任されてきており、やや実施までの心理的障壁（面倒くさい）があったため、レビュー依頼～実施までのフローを仕組み化してハードルを下げる必要性があった。

##4.レビュアー、レビュイーの（物理的、精神的）負担
時間的束縛が少ない形態かつ、レビューのボリュームも少なめになるような方法がよい。また対面以外のやり方や、1対1ではなくグループで行なう方法も検討。


#<i class="fa fa-thumbs-o-up" aria-hidden="true"></i> Slackを使用したカジュアルレビューの導入

##1.実施目的
- 作業者が気軽に依頼できるデザインレビューの仕組み化
- まずはデザインレビューを通常の業務フローに導入し、チームとしてアウトプットできる成果物のクオリティを担保する

> 想定される利用シーン

> （例えば…）
> 「提出までの間にもう少しブラッシュアップしたい」
> 「明日提出のデザインなんだけどボタンのデザインで迷っている」
> 「レイアウトがしっくりいかないので誰かと相談したい」
> 「煮詰まってしまったので客観的な意見が欲しい」

> （新人の人は…）
> 「まだ途中なんですけどこれ大丈夫です……？」の方向性確認
> 「これで出していいですか？」の最終確認

> etc.

- 他のメンバーが作っているデザインに触れる機会を増やしナレッジの共有と相互理解を促進する


##2.依頼方法
Slack上に作ったチャンネル（#design_check）にて `@channel` を付けて依頼。

##3.ルール
- 依頼者は案件のアウトラインと、デザインの意図・ポイントを必ず伝えること（そのデザインがなにを目的としたものかの共有が大前提）。
- いつまでに欲しいかも伝えること（レビュアーのスケジュールも考慮して依頼）。
- 相談ベース（「ここのボタンどうでしょう？」）とかもありです。
- レビュワー指名もありです。
- 依頼のあったデザインはデザイナー全員が必ず目を通すこと（意見がない場合でもSlack上でハンコ絵文字を押すこと）。<br>
↓↓↓↓↓　こんな感じ　↓↓↓↓↓<br>
![slack_hanko.jpg](https://qiita-image-store.s3.amazonaws.com/0/170211/4dc9ad4b-80f2-46b5-a37e-e67f576c73db.jpeg)<br>
- デザインレビュー自体は何かを「決定」する場ではないため、レビュー内容に対する「修正する・しない」の判断は依頼者に委ねます（そのデザインの目的に対する合致度で判断してください）。

##4.その他
デザインレビューの前提となる知識と手法の共有のため、下記の書籍を購入・回覧しました。

- [みんなではじめるデザイン批評 ―目的達成のためのコラボレーション&コミュニケーション改善ガイド](https://www.amazon.co.jp/dp/B01J2OEYLU)

また長谷川恭久さんのブログ「could」から下記の記事なども参考にしつつ、レビューの効果が最大化されるよう意識して運用しています。

- [デザイン批評を始めたい人のためのヒント集](http://www.yasuhisa.com/could/article/starting-design-critique/)
- [デザインについて語れる批評をするコツ](http://www.yasuhisa.com/could/article/design-ciritique/)


#<i class="fa fa-smile-o" aria-hidden="true"></i> 半年ほど運用してみて

##1.デザインを言語化できる
自分のデザインであっても他者のそれであっても、デザインを客観視して言語化し、それを相手に伝える訓練になる。

##2.気づきを得られる
個人の作業では気づきにくい改善点を知ることができ、以降の制作にも活かすことができる。

##3.クオリティがあがる
単純なことですが、同じデザイナーに見られるという意識（無意識）が働くと細部の詰めなどに妥協が無くなる気がします（個人の感想です）。またディレクターやクライントへの提出前に客観的な目を通すことで、いわゆる「ブラッシュアップ」行う機会が1回増えるだけでもクオリティ向上に繋がると思います。

##4.（普通に）褒められると嬉しい
「まず2コ褒め、そののちの改善点指摘」を徹底することが大事。
> [ドヤれる機会の創出](https://developers.cyberagent.co.jp/blog/archives/2481/)

##5.今後
現在はデザイナーのみの参加ですが、ディレクターが入ってきた場合、あるいは営業さんなど違うカルチャーの人が入ってきた場合、ステークホルダーが参加した場合など、徐々に検証をしながら、「好き」「嫌い」「違和感がある」などといった感覚的なワードに頼らないフラットな目線でデザインレビューを行える文化的土壌を全社的に作れたらよいかなぁと思っております。
ScalaNativeにフィボナッチ解かせてみた

祝・ScalaNative0.1リリース、ということでフィボナッチを解かせてみた。

http://qiita.com/akira_/items/55cf1f5911b14e265c6f
これのJSコードを移植。

```scala
object Main {
  def main(args: Array[String]): Unit = {
    println("Scala Native")
    println(s"fibonacci(46) = ${fibonacci(46)}")
  }
  def fibonacci(n: Long): Long = {
    if (n <= 1) {
      1
    } else {
      fibonacci(n - 1) + fibonacci(n - 2)
    }
  }
}
```

System.currentTimeMillis()は使えなかった、のでtimeコマンドで計測してみた

環境は↓

```
CPU:       Quad core Intel Core i7-4870HQ (-HT-MCP-) cache: 6144 KB 
           clock speeds: max: 3700 MHz 1: 3247 MHz 2: 3234 MHz 3: 3268 MHz 4: 3214 MHz 5: 3224 MHz 6: 3251 MHz
           7: 3226 MHz 8: 3270 MHz
```

そして結果↓

```
 % time ./target/scala-2.11/scala-native-example-out
Scala Native
fibonacci(46) = 2971215073
./target/scala-2.11/scala-native-example-out  6.48s user 0.00s system 99% cpu 6.480 total
```

はい

-----追記
上記の結果はビルドオプション( http://www.scala-native.org/en/latest/user/sbt.html#sbt-settings )である `nativeMode` が` release` のもの。
`debug` だとかなり遅い。デフォルトだと `debug` モード。
( `sbt "set nativeMode := \"release\"" nativeLink` とかで切り替えられる。)

`debug` モードでの結果↓

```
 % time ./target/scala-2.11/scala-native-example-out
Scala Native
fibonacci(46) = 2971215073
./target/scala-2.11/scala-native-example-out  14.77s user 0.00s system 99% cpu 14.774 total
```
PHPerでも、既存のプロジェクトでも、今すぐはじめられるRidgepole

[実践 Database Schema as Code // Speaker Deck](https://speakerdeck.com/k1low/shi-jian-database-schema-as-code)

どうやら社内でもRidgepole利用が観測されはじめたのでPHPer用チュートリアル。

## 事前準備

Rubyをインストールしましょう。

PHPerならRubyのバージョンに悩むことなく、できるだけ新しいRubyにしましょう。

## 実際に簡単なRidgepoleの導入

### Gemfileの設置

コマンドでGemfileの雛形を生成しましょう。

PHPerならプロジェクトでRuby使っていないので何も考えず実施できますね。

```sh
$ bundle init
```

Gemfileを以下のように書き換えます。

```ruby
# frozen_string_literal: true
source "https://rubygems.org"

gem "ridgepole"
gem "pg" # PostgreSQLを利用する場合
gem "mysql2" # MySQLを利用する場合
```

### Ridgepoleのインストール

```sh
$ bundle install
```

この時点でGemfileもGemfile.lockもコミットしましょう。

### database.ymlを作成

Ridgepoleがデータベースに接続するための設定です。

#### PostgreSQLの場合

```yaml
adapter: postgresql
encoding: utf8
host: 127.0.0.1
database: my_database
username: postgres
password: xxxxXXXxxxxx
port: 5432
```

#### MySQLの場合

```yaml
adapter: mysql2
encoding: utf8
host: 127.0.0.1
database: my_database
username: myadmin
password: xxxxXXXxxxxx
port: 3306
```

## Schemafileをexport

Ridgepoleは、Schemafileたった1ファイルを管理するだけでOK。

しかも既存のデータベースからSchemafileをエクスポートできる。便利。

```sh
$ bundle exec ridgepole -c database.yml --export -o Schemafile
```

**これで今日からRidgepole！！！簡単！！！**

## スキーマを変更してみる

Schemafileの中を見てみましょう。

PHPerでもだいたい雰囲気でわかると思います。設定ファイルみたいなもんです。

わかりますよね？

試しにカラムを追加してみましょう。Schemafileを雰囲気で修正するだけです。

そして以下のコマンドを実行します。

```sh
$ bundle exec ridgepole -c database.yml --apply -f Schemafile --dry-run
```

`--dry-run` オプションで実行予定のSQLが分かります。修正方法が間違っていたらここでエラーがでます。

問題なければ実際に適用します。

```sh
$ bundle exec ridgepole -c database.yml --apply -f Schemafile
```

**これでスキーマ変更完了！！！簡単！！！**

そしてSchemefileをコミットして終わり。

## まとめ

PHPerならRidgepole使おうぜ！
Railsにparsleyというjavascriptのバリデータを導入

Railsにparsleyというjavascriptのバリデータを導入したので簡単にメモ。
html5が動かないIE9用に導入したけど、html5のものより柔軟で使いやすそうでした。

parsley
http://parsleyjs.org/

こちらデモ
http://parsleyjs.org/doc/examples/simple.html

parsley-railsというgemがありますが、中身を見るとjsとcssを適用してるだけみたいなので、今回は使いませんでした。

## jsのダウンロード
ここからparsley.min.jsをダウンロード
http://parsleyjs.org/doc/download.html

jaのロケールファイルも必要ならここからダウンロード。parsley-jaなど適当な名前にリネーム
https://github.com/guillaumepotier/Parsley.js/tree/master/dist/i18n

app/assets/javascriptsにファイルを置いて、application.jsに以下の記述を追加。
ちなみに前提としてjquery(>= 1.8)が必要みたいです。普通は使ってるはず

```
//= require parsley.min
//= require parsley-ja
```

## cssのダウンロード
ここからダウンロード
http://parsleyjs.org/src/parsley.css

ちなみにエラーの表示がシンプルすぎるのでデコった方がいいと思います。

app/assets/stylesheetsに置いて、application.css(scss)に以下を追加

```
*= require parsley
```

## jsの記述追加

公式にあるように以下の記述追加(もちろんform名は変えて下さい)
http://parsleyjs.org/doc/index.html#installation

```js:
<script type="text/javascript">
  $('#form').parsley();
</script>
```

これでsubmitボタンを押した時にバリデートされるはず。
基本的には必須の項目にrequiredをつけて、parselyにバリデートしてもらう感じですが、
emailとかnumberとかちょっとしたパターンマッチングなどもできます。

こちらを参照して下さい
http://parsleyjs.org/doc/index.html#validators-list

## submit以外のタイミングでバリデートしたい時

任意のイベント発火時に以下のコードを加えればバリデートされます。

```js:
$('#form').parsley().validate();
```

ただしこれだと全てバリデートされてしまいます。
一部だけバリデートしたい場合はグループを指定します。

例えば郵便番号を入力時に、都道府県や市区町村などが自動入力され
それらの入力値だけをバリデートしたい場合は
以下のようにグループを指定すれば期待した動作になると思います。

```html:
<input type="text" name="prefecture" data-parsley-group="hoge">
<input type="text" name="city" data-parsley-group="hoge">
```

```js:
$("#post_code").keyup(function() {
  $('#form').parsley().validate({group: "hoge"});
});
```

## ちょっと辛いなと思った所

概ね快適に動きますし、気に入っているのですが、辛いところもありました。

radioボタンやselectタグを変更した時に、inputを表示したり非表示にしたりすることはよくあると思うんですが、そのinputにrequiredがついている場合はちょっと面倒そうです。

というのもparselyは見えていないinputもバリデートしてしまうので、その辺りを考慮して、非表示になった場合はrequiredもfalseにするとか、ケアする必要があります。

それをミスるとsubmit出来ないという致命的かつ気づきにくいバグが出来てしまいます。。
ちょっと使って間もないので、その辺りを解決するオプションがあるのかもしれません。。

何かわかったら追記します
DoSDetectorの盲点

# 発覚した問題点（現象）
有名なDoS攻撃対策モジュール『mod_dosdetector』において、ContentTypeを見てdos判別からリクエストを除外する『DoSIgnoreContentType』が今ひとつ想定した通りの動きをしない疑惑がありました。
　そして今回自己検証をしてみた結果、現象の詳細が分かりました。
　DoSIgnoreContentTypeに設定したContentTypeでも、1回リロードすると何故かDoS判定されてしまい、結局全くと言っていいほど動作しなくなってしまうという現象であったようです。

# 原因
調査をしてもほとんどヒントはありません。皆さん疑問符はありながらも『とりあえず大体動くな＾＾』という適当な認識で使っているようです（うちも実際そうでした）。
　そしてブログ類を漁っていたところ、ようやく以下の一言に行き着きました。それはブログの記事ではなく、ブログの記事に対するコメントで、1年以上返信のなかったものです。

>DoSIgnoreContentType って、サーバーがStatus code 304 Not modified の時、Content-type が返ってこないから判定できないのね…。回避策あるのかな…。

正直目を疑いましたが、まさかと思い検証したところ、DoSIgnoreContentTypeをREADMEの通り設定すると確かに200の画像のみチェックから除外され、304のログがどんどんdos_suspect_logに蓄積されました。
　304の画像やJSやCSS＋ページであれば簡単に毎秒10リクエスト以上いきますので、あっという間にDoS攻撃認定されて503落ちしてしまいます。

# 対策案
## HTTPD側での304応答無効化
304はブラウザキャッシュ等をきかせるためにApacheが返しているもので、もちろん強引な手法にはなりますが無効化することは可能です。無効化すれば全てのコンテンツを200で返しますので、全てのリクエストについてContentTypeがApacheの動的モジュールを経由してDoSIgnoreContentTypeの判別を通すことができます。
　しかし、トラフィックやディスクIOが大幅に上昇するため、著しく負荷が上昇します。特にコンテンツ量の多いサイトでは、致命傷です。
　また将来的にキャッシュサーバを使うことになった場合コード304は重要度を帯びることもありますので、これは確実でありつつも最終手段となりそうです。
## ページ内読み込みの最適化
そもそも1ページあたりで呼び出す画像・CSS・JSなどが少なければ、DoSIgnoreContentTypeを考慮しなくて済むこともあります。実際、美容がそうです。ユーザビリティも大幅に向上しますしサーバに対するリクエストが減るので負荷軽減にもつながり、いいことづくめです。

# じゃあどうする？
* 自分で改修してコンパイルして使う
* スケールアップしてDoS攻撃耐性自体を上げる
前者にトライしたいのですが時間が・・・。

# 参考URL
http://blog.neko.me/article/46080289.html
↑これの２つ目のコメントがヒントでした。
Cocos Studio 3.10(サポート終了)をいまさら（現役）勉強

cocos2d-xを触り始めて、トータルでそろそろ２ヶ月と、ちょっと慣れてきたので、
色々忘れそうなところを備忘録としてメモします。

> 環境はmacで、cocos2dx(v3)＋cocosstudio3.10です。

# Cocos Studio 3.10 周り

## 基礎操作ショートカット

* alt(option)ボタン + マウスホイール操作で、画面の拡縮

## 各オブジェクトのくせ

###  透過が入った画像を重ねた際に、重ねても色が加算されない場合に、Blend機能を使う場合は、ImageViewではなく、Spriteを使うとブレンド用の項目がでる。


![image](https://qiita-image-store.s3.amazonaws.com/0/37406/2be78dd9-2eb2-2369-be5e-1dcfa4425d7c.png)

### Spriteはclone()が使えないが、ImageViewは使える


### ScrollView内にButtonを配置する場合は、ネストを１段階にしておかないと色々イベントがとれなかったりする。


### ListViewで、スクロールする際、半透明の画面だと、スクロール画面外にも表示されてしまう点を防ぐ。


Clippingにチェックを入れると解決

![image](https://qiita-image-store.s3.amazonaws.com/0/37406/c0b170ed-1876-a0ad-25ec-7f0e5f64e545.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/37406/2a56c56c-471a-fb2b-25e8-461c4a585b1e.png)

※わかりずらいですが、はみ出ない。


### Layout内に、TextやSpriteをいれた際に、透過具合を設定すると、テキストやspriteまで透過してしまう

![image](https://qiita-image-store.s3.amazonaws.com/0/37406/740e38ef-fd60-e26c-9881-416d27415df8.png)

**General**ではなく、**Feature**で設定可能

### Textのfontがドラッグだと読み込めないが、importだと読み込める場合がある。

![image](https://qiita-image-store.s3.amazonaws.com/0/37406/c0f8faa1-9e4b-dec5-5625-309e52eba6d4.png)
Java でコレクションをディープコピーする

Java で配列やコレクションをコピーして、コピー先に変更を加えても、コピー元が影響を受けないコピーをディープコピーといいます。

ネットで調べると、`int` や `String` を型引数にして、

```java
ArrayList myList = new ArrayList<MyObject>( srcList );
```

などとするとディープコピーが作れますと、書いてありますが、実はリストに格納しているのがオブジェクトの場合、ディープコピーになりません！！

なので、単にコレクションを引数にとって　`new` するだけではだめです。

オブジェクトのコレクションなどをディープコピーするには、

```java
ArrayList<MyObject> myList = new ArrayList<MyObject>(srcList.size());
for (MyObject o : srcList) {
 // 以下のどちらかを実装
 o.add(new MyObject(new o)); // コピーコンストラクタ
 o.add(o.clone()); // Clonable インターフェース実装
}
```

のように、コピーコンストラクタをコレクションに入れるオブジェクトに用意するか、もしくは`clone`メソッドの継承をしないといけないようです。
（どちらか一方のやり方でよい）

Cloneable インターフェースの実装について：
http://qiita.com/SUZUKI_Masaya/items/8da8c0038797f143f5d3

オブジェクトの Collection をディープコピーする質問：
http://stackoverflow.com/questions/715650/how-to-clone-arraylist-and-also-clone-its-contents
Vagrantにおける共有フォルダの使い方

これまでにVagrantで立てた仮想環境上のファイルはAtomのRemote-ftpというパッケージを使って編集していたのですが、わざわざ接続しなくてもホストOSとゲストOSでフォルダを共有できる機能があることをお恥ずかしいことについ最近知ったのでまとめておきます。

## Synced Folders
Vagrantが共有フォルダを実現する機能としてSynced Foldersというものがあります。
ホストOS(vagrantコマンドを叩く方)とゲストOS(仮想環境側)でファイルを共有するにあたって、デフォルトでは次のような環境が共有されています。

| 環境   | 共有フォルダ
|  ---  |   ---
|ホストOS| Vagrantファイルを持つフォルダ
|ゲストOS| /vagrant以下のもの

これによってホストOS側で作成したデータ、ゲストOS側で作成したデータが共に共有されることになります。

## 問題点
Vagrantでは**ゲストOS側からファイル・フォルダのパーミッションが変更できないようになっています**
勝手に変更できたらセキュリティ上問題があるためこのような仕様となっているみたいです。

これはVagrantfileにおける

```
.
.
.
# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
# config.vm.synced_folder ".", "/vagrant"
.
.
.
```

の中にある`config.vm.synced_folder`の部分で

` config.vm.synced_folder ".", "/vagrant", mount_options: ['dmode=777','fmode=755']`

のようにdmodeでディレクトリ、fmodeでファイルのパーミッションを設定することで解消されます。

また、`config.vm.synced_folder "ホストOS側のフォルダ", "ゲストOS側のフォルダ"`という仕組みになっているため、共有フォルダの指定する場所はここで変更することが可能です。

## 参考
1. [Vagrantとmacでフォルダを共有したいとき](http://mokokko.hatenablog.com/entry/2014/05/14/151802)
2. [【vagrant】共有フォルダのパーミッションで悩んだ話【chmodできない】](http://ism1000ch.hatenablog.com/entry/2014/04/05/232935)
Shift_JIS


たまにある`Shift_JIS`での納品

```html:index.htmlを変更
<meta charset="Shift_JIS">
```

```bash:Shift_JISに上書き
$ brew install nkf
$ nkf -s --overwrite index.html
```

修正後の表示の確認
Firefox > 表示 > 文字エンコーディング > Shift_JIS

※CSSのcontentとかに日本語使ってるとCSSもエンコードしなければならないので、なるべく使わない。
どうしてもの場合はUnicode変換

> 参考
[【 nkf 】 文字コードを変換する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230849/)
[beforeやafter疑似要素のcontentプロパティで日本語の文字化けを回避する方法](https://nj-clucker.com/css-content-property-mojibake/)
さくらのレンタルサーバーでPHPが表示されない時の対処方法

こんにちは。

今回は、さくらのレンタルサーバーでPHPが表示されない時の対処方法を簡単に書きたいと思います。
まず、PHPファイルを作成する時は"ファイル名.php"の様に作成すると思います。

しかし、これをさくらのレンタルサーバーにそのままデプロイするとブラウザが真っ白の状態になって表示されません。
もしくは、ブラウザにPHPのソースコードが表示されるだけになってしまいます。

そこで、さくらのレンタルサーバーで、PHPファイルを最初にデプロイする時は
まず、ファイルマネージャーにアクセスしてホームディレクトリ("/home/ドメイン名/www/ココ")にアクセスして
htaccessファイルを右クリックして編集します。htaccessファイルを開いたら

- AddType application/x-httpd-php .php

と記述します。

これで、さくらのレンタルサーバーでPHPファイルが使用出来る様になりました。


また、WordPressも同じ様に
WordPressのホームディレクトリで、htaccessファイルがありますので
開いて同じ様に記述すると、WordPress内でもPHPファイルが使用出来る様になります。





*デプロイ・・・サーバーにファイルを展開する事。

*ホームディレクトリ・・・フォルダ階層のメインとなるディレクトリ。