OmniAICreator/Qiita-1.07M huggingface dataset:
Go言語 xml.Unmarshal で string→time.Timeに変換する方法

# 必要な場面

xmlのデータ上は`string`な公開日時のようなパラメータを、Unmarshalしたら`time.Time`としてあつかいたいとき。

```go:unmarshal_test.go
import(
    "testing"
    "encoding/xml"
    "time"
)

// Item の定義
type Item struct {
    Title string            `xml:"title"`
    Link string             `xml:"link"`
    PublishedAt time.Time
}

// xml.Unmarshal 時にcallされるメソッドを独自実装
func (item *Item) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    // 生XMLを扱うための定義. PublishedAt は string であること
    raw := struct {
        Title string        `xml:"title"`
        Link string         `xml:"link"`
        PublishedAt string  `xml:"publishedAt"`
    }{}
    
    // デコード
    if err := d.DecodeElement(&raw, &start); err != nil {
        return err
    }
    
    // string to time.Time の変換処理
    timePub, err := time.Parse(time.RFC1123Z, raw.PublishedAt)
    if  err != nil {
        return err
    }
    
    // Itemを構築して返す
    *item = Item {
        raw.Title,
        raw.Link,
        timePub,
   }
    return nil
}

// テスト
func TestUnmarshalSelf(t *testing.T) {
    xmlData := `
    <item>
        <title>そうだ京都に行こう</title>
        <link>http://go-kyoto.com/</link>
        <publishedAt>Tue, 15 Mar 2016 11:08:00 +0900</publishedAt>
    </item>
    `
    
    item := Item{}
    err := xml.Unmarshal([]byte(xmlData), &item)
    if err != nil{
        t.Error("パースに失敗してるよ！")
    }
    
    if item.PublishedAt.IsZero() {
        t.Error("パースエラーだ！")
    }
    
    if item.PublishedAt.Year() != 2016 {
        t.Error("パースエラーだ！")
    }
}
```

日付処理については、<a href="http://mattn.kaoriya.net/software/lang/go/20130620173712.htm" target="_blank">Big Sky :: Go言語で日付処理</a>が参考になりました。
Azure CLI (xplat-cli)でログイン後に何かすると、security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.と怒られる場合の対処方法

# これはなに？
Azure CLI (xplat-cli)でログイン後に何かすると、security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.と怒られる場合の対処方法。

メモレベルです。


# 環境

```bash
$ azure -v
0.9.18

## 2016/03/15時点の最新版
```

```
OSX EI Capitan
10.11.3
```

# 現象

Azure CLIでログイン後、なにか操作しようとすると掲題のエラーが出て何も出来ない。

```bash

$ azure login -u [メアド]

$ azure group list
info:    Executing command group list
+ Listing resource groups
error:   Command failed: /usr/bin/security find-generic-password -a _authority:https\://login.windows.net/common::_clientId:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx::expiresIn:3599::expiresOn:2016-03-15T07\:46\:41.218Z::familyName:xxxxxxxxx::givenName:xxxxxxxxx::isMRRT:true::isUserIdDisplayable:true::resource:https\://management.core.windows.net/::tenantId:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx::tokenType:Bearer::userId:xxxx@xxxxx.com -s https://management.core.windows.net/ -g
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.

$ 

```


# 解決方法

1or2のどちらかで解決できるはず

## 1. Multi-Factor Authenticationが有効になっているケース

```
$ azure login -u [メアド]
```

ではなく

```
$ azure login
```

とすると

```
info:    Executing command login
|info:    To sign in, use a web browser to open the page https://aka.ms/devicelogin. Enter the code [コードコードコード] to authenticate.
```

となるのでブラウザでhttps://aka.ms/deviceloginを開いて認証すればOK



## 2. Azure CLIのversionが古く、Azure ADのアカウント情報にマルチバイトが含まれている場合

### 2-1. Keychainのazure access tokenをクリアする

Key chainを開き、右上の検索窓に"azure access token"と入力して検索、出てきたものを削除する

### 2-2. Azure CLIを新しいバージョンにアップデートする

きっちり確認していないけど2015年のどこかの時点のバージョンでは、ADのアカウント情報にマルチバイトのものが含まれていると挙動がおかしくなるバグが有ったみたい。

https://github.com/Azure/azure-xplat-cli/issues/2269
Reactのstateはどのように推移するのか

## InitialState

`React.createClass`内で`getInitialState`を定義していればそれが初期値。
定義しない場合はnull。

## setState(partialState, callback)

```js:抜粋
 this.updater.enqueueSetState(this, partialState);
  if (callback) {
    this.updater.enqueueCallback(this, callback);
  }
```

`this`はReact.createClassの引数のobjectであることに注意する。
ここではこのobjectを`publicInstance`と呼ぶことにする。
また初回に呼び出される場合は、`this.state=initialState`である。
この時点でupdaterは`ReactUpdateQueue`になっているので見ていく。

```js:ReactUpdateQueue
var ReactUpdateQueue = {
  ...,

  enqueueSetState: function(publicInstance, partialState) {
    var internalInstance = getInternalInstanceReadyForUpdate(
      publicInstance,
      'setState'
    );

    if (!internalInstance) {
      return;
    }

    var queue =
      internalInstance._pendingStateQueue ||
      (internalInstance._pendingStateQueue = []);
    queue.push(partialState);

    enqueueUpdate(internalInstance);
  },

  ...,

};
```

一つずつ処理を追っていく。

```js:
function getInternalInstanceReadyForUpdate(publicInstance, callerName) {
  var internalInstance = ReactInstanceMap.get(publicInstance);

  ...,

  return internalInstance;
}
```

internalInstanceは`_currentElement.type`にpublicInstanceを持つ。

queueは初回はnullなので[]で初期化。
queueに新しいstateを詰める。
そしてinternalInstanceに対してupdateをかける。

```js:
function enqueueUpdate(internalInstance) {
  ReactUpdates.enqueueUpdate(internalInstance);
}
```

ReactUpdatesを見に行く。

```js:ReactUpdates.js
function enqueueUpdate(component) {
  ensureInjected();

  // Various parts of our code (such as ReactCompositeComponent's
  // _renderValidatedComponent) assume that calls to render aren't nested;
  // verify that that's the case. (This is called by each top-level update
  // function, like setProps, setState, forceUpdate, etc.; creation and
  // destruction of top-level components is guarded in ReactMount.)

  if (!batchingStrategy.isBatchingUpdates) {
    batchingStrategy.batchedUpdates(enqueueUpdate, component);
    return;
  }

  dirtyComponents.push(component);
}
```

!batchingStrategy.isBatchingUpdatesはmountが完了していればtrueなのでdirtyComponents=[]にinternalInstanceを詰める。

さて、詰めたのはいいが、いつ実行されるんだ・・？
Queueがどのように処理されているかを調べてみる。
狙いはこの関数が呼ばれているところ。

```js:ReactUpdates.js
function runBatchedUpdates(transaction) {
  ...,
}
```

まずはここで呼ばれている。

```js:ReactUpdates.js
var flushBatchedUpdates = function() {
  while (dirtyComponents.length || asapEnqueued) {
    if (dirtyComponents.length) {
      var transaction = ReactUpdatesFlushTransaction.getPooled();
      // perform=runBatchedUpdates(transactoin)
      transaction.perform(runBatchedUpdates, null, transaction);
      ReactUpdatesFlushTransaction.release(transaction);
    }

    ...,

  }
};

var ReactUpdates = {
  ...,

  flushBatchedUpdates: flushBatchedUpdates,
  
  ...,

};
```

しかしながら`ReactUpdates.flushBatchedUpdates`が呼ばれている気配がmount時にはないので、injectまで遡る必要がありそう。

つづく・・・
EC-CUBEのUnitTestをPhpStormで実行する

## 環境
Windows7
PhpStorm 10.0.3

## この記事のゴール
PhpStromからボタンひとつでPHPUnitテストが実行できるようになること。
![2016-03-15_16h46_06.png](https://qiita-image-store.s3.amazonaws.com/0/113212/14f0c4ae-ce78-e264-0ed8-0f0ef055112d.png)

## PhpStrom 事前準備
### EC-CUBEをPhpStromで読み込んでおく
![2016-03-15_16h48_11.png](https://qiita-image-store.s3.amazonaws.com/0/113212/cd7abc46-159d-1854-fbe7-6057fdebaa87.png)

### PHPインタプリタを設定しておく
![2016-03-15_16h49_35.png](https://qiita-image-store.s3.amazonaws.com/0/113212/8df58ca4-54b2-13b4-77c4-bfd70a937f0e.png)

### PHPUnitをautoload.phpから取得するように設定
ec-cubeのvenderフォルダに含んでいる`autoload.php`を指定。
![2016-03-15_16h51_22.png](https://qiita-image-store.s3.amazonaws.com/0/113212/7a421c7c-bccd-530f-392b-822aec590e8c.png)

##ユニットテスト設定の作成
ウィンドウ上部のツールボックス または、Run>EditConfigurations... から設定画面を開く。
![image](https://qiita-image-store.s3.amazonaws.com/0/113212/7671c441-eea2-8dc2-9d7f-6d5def530321.png)

[+]ボタンから`PHPUnit`を選択して追加。
![image](https://qiita-image-store.s3.amazonaws.com/0/113212/2a53424b-ebdd-426e-2c87-1c26263d6719.png)

テストスコープに「Directiry」を選択し、テスト対象のディレクトリパスを指定する。
(EC-CUBEのユニットテストクラスは`Tests`ディレクトリにあるので、今回はTests直下から指定)
~~※特定のクラスやメソッドのみテスト実行したい場合は、ここのパラメータを適宜変更して下さい。~~ →追記参照
![2016-03-15_17h01_42.png](https://qiita-image-store.s3.amazonaws.com/0/113212/64d453de-a0b4-f994-3d40-9465b37e7af6.png)

## テストの実行
ウィンドウ上部のツールボックスから、
追加したテスト設定を選択して実行ボタンを押せばテストが実行されます。
(Debug実行も もちろん可能です)
![2016-03-15_17h05_29.png](https://qiita-image-store.s3.amazonaws.com/0/113212/1775764d-8667-8cae-5e0e-39d0889b77f3.png)

## 2017/3/9追記
テストコードの関数を右クリックすると、個別に実行可能です。
![image](https://qiita-image-store.s3.amazonaws.com/0/113212/27a9c6ed-9a84-afde-1441-246c8d546470.png)
【concrete5】jQueryのページ内スムーズスクロールを実装すると、編集画面で出てくるオーバーレイ表示が『隠す』を押しても隠れなくなる件

タイトルが長い……。

##発端
concrete5の編集画面で、下書きの画面を表示した時や、承認待ちの画面を表示した時に
![close-error.png](https://qiita-image-store.s3.amazonaws.com/0/20716/37b1a49d-6ce5-84c1-bb22-90d8976a5bf8.png)
↑右上あたりにこんな表示が出ます。
現在作成中のテーマで、『隠す』を押してもこの表示が隠れなくなったので、原因を調べました。
## 原因
「ページトップへ戻る」を押した時に画面をスムーズにスクロールさせるために入れていたjQueryのコードに原因がありました。

```js:scroll.js
  $('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;
  });
```
hrefに"#"が入っているaタグ全てにclickを設定していたので、本来設定されている『隠すをクリックするとオーバーレイ表示を閉じる』というJavaScriptも上書きしてしまってた訳です。
（concrete5側では、'data-dismiss-alert'に対してclickを設定している様子）
## 対処
とりあえずは、『ページトップに戻る』以外にスムーズスクロールは今回必要なかったので、ID決め打ちで対処しました……。

```js:scroll-fix.js
  $('#pagetop').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;
  });
```
ただ、ページ内リンクがある場合はこれでは対応出来ないので、どちらも両立出来る方法を探さないといけないですね……。
## 改良
対処法を検索してみた所、 :not(selector) で指定した要素を除外出来る事に気付きました。
[jquery スムーズスクロールでタブ切り替えが効かなくなった | デザイナーのタネあかし](http://taneakashi.ad-mk.com/jquery-scroll-tab-kaiketsu.html)
上記を参考に書き直してみた所、

```js:scroll-fix2.js
  $('a[href^=#]' + 'a:not([data-dismiss-alert="page-alert"])').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;
  });
```
ページ内のスムーズスクロールと、『隠す』ボタンの動作が両立出来るようになりました。
css-modulesify + watchify + PostCSS

以下のコミットで、CSSのストリームを`bundle.on()`ではなく、browserifyのイベントと同じ`b.on`で監視するようになってました。
https://github.com/css-modules/css-modulesify/commit/0759bb0ade779b81d9384007ca2abbeccd61f137

これで[前回の記事（PostCSSプラグインを使うやつ）](http://qiita.com/kiyopikko/items/e11f501964930856b916)を、watchifyでも使えるようになったので以下に使用例を書きます。

```js
var fs         = require('fs');
var through2   = require('through2');
var browserify = require('browserify');
var watchify   = require('watchify');
var postcss    = require('postcss');
var gutil      = require('gulp-util');

var cssProcessors = [
    require('postcss-nested'),
    require('cssnano')
];

var b = browserify('src/index.js');

b.transform("babelify", {presets: ["es2015", "react"]});
b.plugin(watchify);
b.plugin(require('css-modulesify'), {
  rootDir: __dirname
});

b.on('update', bundleFunc);
b.on('log', gutil.log);
b.on('css stream', function (css) {
  var postcssStream = through2(
    function transform(chunk, enc, next){
      postcss(cssProcessors)
        .process(chunk)
        .then(function (result) {
            next(null, result.css);
        });
    }
  );

  css
    .pipe(postcssStream)
    .pipe(fs.createWriteStream('dist/modules.css'));
});

bundleFunc();

function bundleFunc () {
  return b.bundle()
          .pipe(fs.createWriteStream('dist/index.js'));
}
```
td-agentのgemのバージョンはtd-agentに管理させつつ、--gemfileオプションを使う

以前以下のような記事を書きました。
それを少し改良した記事です。

[td-agent2のfluent-pluginをbundlerで管理 - Qiita](http://qiita.com/toyama0919/items/c7b85b7e78bbdc43d58f)

上記のやり方の場合、td-agentをアップグレードした後自分でtd-agentに同梱されたpluginのGemfileを自分で書き換える必要があります。

またFluentdのバージョンが上がっても、td-agentに反映されるまでラグがあります。


td_agent_gemというmethodを定義してしまって、動的にgemのversionを取得しています。
TD_AGENT_GEM_HOMEは環境に合わせて定義する必要があります。

```ruby:/etc/td-agent/Gemfile
source 'https://rubygems.org'

TD_AGENT_GEM_HOME = "/opt/td-agent/embedded/lib/ruby/gems"
def td_agent_gem(gem_name)
  gems = Dir.glob("#{TD_AGENT_GEM_HOME}/*/gems/#{gem_name}-[0-9]*").reverse
  return if gems.empty?
  gem gem_name, gems.first.split('-').last
end

gem "fluent-plugin-exec_cron", "0.0.3"
gem "fluent-plugin-forest", "0.3.0"
gem "fluent-plugin-record-reformer", "0.8.0"
gem "fluent-plugin-rewrite", "0.0.12"
gem "hipchat-api"

# td-agent preinstall
td_agent_gem "fluent-plugin-rewrite-tag-filter"
td_agent_gem "fluent-plugin-s3"
td_agent_gem "fluent-plugin-scribe"
td_agent_gem "fluentd"
```


以下のケースに有効です。

* td-agentのアップグレードには勝手に追随して欲しい。
* プラグイン管理は差分だけにしたいけど、いざというときは最新のFluentdをためしたい
* td-agentでも必要なプラグインは選別したい
CakePHP3.2.4 -> 3.2.5 で変更された$this->request->clientIp()について

CakePHP3.2.5で、`Cake\Network\Request::clientIp()`が変更され、`HTTP_CLIENT_IP`を見るのは`Request::trustProxy`が`true`の時のみになりました。(`HTTP_CLIENT_IP`は偽装されるおそれがあるため。)

なので、ロードバランサーやプロキシを介している場合は、

```php
$this->request->trustProxy = true;
$clientIp = $this->request->clientIp();
```

とすれば、今までのように`HTTP_X_FORWARDED_FOR`や`HTTP_CLIENT_IP`を見ますが、`trustProxy`が`false`の場合(デフォルト)なら、`REMOTE_ADDR`だけを見ます。(以前は`HTTP_CLIENT_IP`や`HTTP_CLIENTADDRESS`も見ていた。)

というわけで、今まで`$this->request->clientIp()`を使っていたものが、CakePHP3.2.5へのバージョンアップでそのまま動くかどうかは、少し確認が必要だと思います。(元々`REMOTE_ADDR`の値が使われていた場合は問題ないはず。)

# ユニットテストについて

`clientIp()`を使用してアクセス制御をしているような部分をテストする場合、私は、

```php:tests/TestCase/Controller/ArticlesControllerTest.php
public function testIpOk()
{
    $allowedIp = '192.168.1.1';
    $this->configRequest([
        'headers' => ['CLIENT_IP' => $allowedIp]
    ]);
    $this->get('/articles');
    $this->assertResponseOk();
}
```

という感じで、`configRequest()`で`headers`に`CLIENT_IP`を指定(`HTTP_CLIENT_IP`がセットされることになる)していたのですが、これだと今回の更新で`clientIp()`から値が返ってこなくなります。
`headers`に指定すると勝手に`HTTP_`が頭に付くし、`REMOTE_ADDR`を指定するにはどうしたら、、、と思ってたら、`environment`でセットできました。 :clap: 

```php:tests/TestCase/Controller/ArticlesControllerTest.php
public function testIpOk()
{
    $allowedIp = '192.168.1.1';
    $this->configRequest([
        'environment' => ['REMOTE_ADDR' => $allowedIp]
    ]);
    $this->get('/articles');
    $this->assertResponseOk();
}
```
いまさらガラケーのユーザーエジェントに偽装してサイトのリンク切れをチェックするツール

一応、Android,iPhoneもできるよ！

ということで、そもそもユーザーエージェントを偽装してリンク切れチェックを行うツールが見当たらないので作ってみました。
本当はWEBサービスとして公開したかったけど、それはcomming soonで。


https://github.com/furu8ma/link_check/blob/master/link_check.php


## 使い方

```
使い方 : ./link_check.php [URL] [User agent]
[user agent] s: Android / a: iPhone / i: Docomo FP / e: AU FP / y: SoftBank FP";

指定されたURLの外部ドメインは再帰的には辿らない
一度チェックしたURLはチェックしない
指定された深さ以下はチェックしない
チェックした結果を各ページ毎に存在するリンク切れURLのリストという形でメールする
チェックした結果は、スクリプトの実行ディレクトリに以下のファイル名で保存される

link_check_[user agent].txt

例

./link_check.php http://www.yahoo.co.jp a
```

お役にたてば。
arduinoでlinpack

#概要
arduinoでlinpackやってみた。
#unoの場合
![uno.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/008c51f6-a7dc-0770-94be-c79527d44891.jpeg)

#パチモノnanoの場合
![nano.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/94d9fc58-bb81-2a0b-c339-9c292ad92977.jpeg)

#パチモノmegaの場合
![mega.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/5351f785-9182-810a-44e7-f47108ee34bc.jpeg)
Elasticsearchで条件指定削除

# Elasticsearchで条件指定して削除する方法

## Delete By Query Pluginをインストール
```
sudo bin/plugin install delete-by-query
```

参考: https://www.elastic.co/guide/en/elasticsearch/plugins/current/plugins-delete-by-query.html

## 削除を実行
```
curl -XDELETE 'http://localhost:9200/インデックス名/_query?q=検索条件'
```

参考: https://www.elastic.co/guide/en/elasticsearch/plugins/current/delete-by-query-usage.html

## Delete By Query Pluginをアンインストール
```
sudo bin/plugin remove delete-by-query
```
用が終わったら消しておいた方が良いかもしれません
c++ builder | debug | testing > Formのポインタが0xFFFFFFFFになる症状 > メモリ破壊 > try, catchで場所の特定

```txt:動作確認
C++ Builder XE4
```

## 症状

自分が数年前に作成したXE4のプログラムをベースに新プログラムを作成中。
設計がとにかくまずい。数年越しのブーメラン。

以下の症状が出ている。

- フォームのポインタアドレス(通常は0x17504B0など）が0xFFFFFFFFになる。

メモリ破壊を起こしているようだというのはわかる。

## 場所の特定

場所の特定を行うため、以下のようなコードを怪しい場所に入れていくことにした。

```cpp
   try {
       int tag = FormXXXX->Tag;
   } catch (...) {
   }
```

メモリ破壊が起きた後で上記コードが実行されたときにエラーをキャッチでき、メモリ破壊の場所を特定できる。

単純にあやしい関数をtry, catchで囲んでも特定できなかったので、上記のようにしてみた。

## 問題の場所

以下の場所が問題であった。(xxxは別の名前だが公開できないのでxxxとする)

```
xxx[0].clear();
xxx[1].clear();
xxx[2].clear();
```

xxxの定義は

```
static std::vector<float> xxx[NUM_XXX];
```

問題の発生理由

- 過去のソフトでは NUM_XXX を4にしていた。
- 今回のソフトで NUM_XXX を 1に減らした。
- clear()処理でマジックナンバーを使っていた。結果、定義されていない[1],[2]に対してclear()処理をしてメモリ破壊が起きたようだ。

色々改善しないといけない。

[1],[2]のclear()処理を削除したらメモリ破壊は起きなくなった。
PayPalの本番環境には古いSSL(TLS)では接続できなくなる

去年からPayPalのマーチャント（支払い受け取りをしているビジネスアカウント）宛の通知メールが出ていますが、**今年６月**にPayPalの本番環境に以下のセキュリティ対策が行われます。

#2016年のセキュリティ計画について
https://www.paypal-knowledge.com/infocenter/index?page=content&widgetview=true&id=FAQ1913&viewlocale=ja_JP

![security.png](https://qiita-image-store.s3.amazonaws.com/0/61900/35f33291-6785-4eaa-603c-11095af295c8.png)

下記は~~まだ日本語化されていませんが、~~TLS対応方法の詳細。(日本語化されました！）
https://www.paypal-knowledge.com/infocenter/index?page=content&widgetview=true&id=FAQ1914&viewlocale=ja_JP

これは、去年から相次いで報告されているOSSの脆弱性にグローバル決済ベンダーとしていち早く対応する取り組みですが、**６月に上記対応された後は、未対応のサーバーからはAPI接続できなかったり通知を受け取れない、つまり決済が行えなくなります。**

TLSについては、以下のGitHubのページがさらにリンクされていて、各プログラミング環境ごとのチェック方法が書かれているので、PayPalのインテグレーションをされている方は一度チェックすることをお勧めします。
https://github.com/paypal/TLS-update

なお、この対応は、グローバルベンダーの中でもPayPalは先駆けて対応していますが、**いずれ他のクラウドベンダーも対応していく流れになると思います。**

基本的に、IaasやPaasなどでホスティングしていたり、OSを常に最新化して運用しているサーバーでは問題が起きる可能性は低いですが（それでも、使っているディストリビューションやプログラムのHTTPSの通信実装については確認が必要です）、何年も前からオンプレミスで運用しているサーバーなどは注意が必要です。

PayPal側からは、現在も幾つかのチャネルを使ってフォローアップの活動をしています。

なお、上記にも書いてありますが、**Sandboxは全て移行している**ので、まずはSandboxに繋いで一通り動作するかチェックすることでほとんどの問題をチェックできるかと思います。
StrongParameter で、全カラムを許可するとき

Scaffold などでも、こんな感じで生成される。

```rb
private

def article_params
  params.require(:article).permit(:title, :content)
end
```

全カラム許可するとき。

```rb
def article_params
  params.require(:article).permit(Article.column_names.map{|c| c.to_sym})
end
```

カラムに関係しないものも許可したり、一部だけ除外したくなったら Array操作で。

```rb
# 許可
def article_params
  params.require(:article).permit(Article.column_names.map{|c| c.to_sym} + %i(hoge fuga))
end

# 除外
def article_params
  params.require(:article).permit(Article.column_names.map{|c| c.to_sym} - %i(title))
end
```

配列も許可したくなったら。

```rb
def article_params
  params.require(:article).permit(Article.column_names.map{|c| c.to_sym}, :cateogory_ids => [])
end
```

:warning: 許可するかは、よーく考えてくだしあ。
Atom Editor を EDITOR 環境変数に設定する

# どういう問題?

`.bashrc` や `.zshrc` などで EDITOR 環境変数に Atom Editor を設定するときのお話。

そのまま `export EDITOR=atom` とすると Atom が起動してすぐに shell に戻ってしまう。(正確には Atom を起動する shell script がすぐに正常終了してしまう)

# そこで export EDITOR='atom -nw' ですよ

`export EDITOR='atom -nw'` とすると Atom が新規ウィンドウで開かれて、その新規ウィンドウが閉じられるまで待機するようになる。

これで shell で `git commit` したときに Atom が起動し、コミットコメント記載して Cmd+S Cmd+w Cmd+w できてハッピー。

具体的には

```zsh:.zshrc
if [[ -x `whence -p atom` ]]; then
    export EDITOR='atom -nw'
elif [[ -x `whence -p emacs` ]]; then
    export EDITOR=emacs
else
    export EDITOR=vi
fi
```

こんな感じで設定しています。

# -nw の意味

```
$ atom -h
```

の結果から一部抜粋

|option|説明|
|:--|:--|
|-n, --new-window|Open a new window.|
|-w, --wait|Wait for window to be closed before returning.|

Emacs -nw とは全く意味が違う罠。
基礎MySQL ~その 5~ InnoDB②

# InnoDBの内部構成
![InnoDBの内部構成.png](https://qiita-image-store.s3.amazonaws.com/0/17852/30270220-fd4a-b404-80f3-f149990c63a4.png)

row:
各行データ

page:
各行は16KBのPageに書き込まれる（デフォルト16KB。変更可能）

extent:
Pageは1MBづつextentとして扱われる（デフォルト64 page）

segment:
table spaceにはsegmentがあり、対応するextentが保存される

# Index
テーブルへの処理を高速化するためのデータ構造

## InnoDBのIndex
インデックスレコードがツリーのリーフページ内に格納される B ツリー構造

```
     __○__        <- ルートノード
    /     \
   ○       ○      <- ブランチノード
  /\      / \
 ○  ○    ○   ○    <- リーフノード
```

二分探索できるようにソートしたデータが配置される。

```
     __9__        <- ルートノード
    /     \
   4       15     <- ブランチノード
  /\      / \
 2  6    12  17   <- リーフノード
```

### クラスタインデックス
データが主キーのリーフノードに格納される
テーブルに対し1つ存在する

```
     __○__        <- ルートノード
    /     \
   ○       ○      <- ブランチノード
  /\      / \
 ○  ○    ○   ○    <- リーフノード ここに行データが入っている
```

### セカンダリインデックス
クラスタインデックス以外のインデックス全て
リーフノードには主キーの値が格納されている

```
     __○__        <- ルートノード
    /     \
   ○       ○      <- ブランチノード
  /\      / \
 ○  ○    ○   ○    <- リーフノード　ここに主キーの値が入っている。
```
セカンダリインデックスを使う場合、ここで一旦主キーの値を取得し、
主キーのクラスタインデックスを走査する

 * Covering Index  
 クエリが要求するデータが全てセカンダリIndex内ある場合、  
 クラスタIndexを走査せず値を返却する

### Adaptive Hash Index（AHI）（適応型ハッシュインデックス）
頻繁にアクセスされるインデックスのページに応じて
メモリ内に構築されるハッシュインデックス
キー値に対する値を取得する際に使用される。
（= または <=> 演算子を使用する等価比較にのみ使用される）
Indexの走査を行わないため高速にアクセスできるが、
範囲検索などの場合には使用されない。

```
     __○__        
    /     \
   ○       ○      
  /\      / \
 ○  ○    ○   ○    
↑   ↑    ↑   ↑
□□□□□□□□□□□□□□□□□ <- adaptive hash index
```

[適応型ハッシュインデックス](https://dev.mysql.com/doc/refman/5.6/ja/innodb-adaptive-hash.html)
[B ツリーインデックスとハッシュインデックスの比較](https://dev.mysql.com/doc/refman/5.6/ja/index-btree-hash.html)

## Change Buffer(変更バッファ)
buffer pool上に変更対象のセカンダリインデックスのページが存在しない場合、
変更は変更バッファーという特別な構造のみ記録される。
変更バッファーは定期的にマージされる

[変更バッファー](https://dev.mysql.com/doc/refman/5.6/ja/glossary.html#glos_change_buffer)

# 圧縮テーブル
page単位で圧縮でき、データ、インデックス両方に適用される。
innodb_file_per_tableが有効
innodb_file_formatがBarracuda 
の状態で、
ROW_FORMAT=COMPRESSEDを指定しテーブル作成。デフォルトで8KBに圧縮される。
KEY_BLOCK_SIZEでサイズ調整も可能。
zlibライブラリにより圧縮されているとのこと。

```mysql:sql
CREATE TABLE `test` (
  id int ,
  name varchar(128),
  PRIMARY KEY (id)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8
```


[InnoDB 圧縮テーブル](https://dev.mysql.com/doc/refman/5.6/ja/innodb-compression.html)
# InnoDBの制限
InnoDBの最大Index長、数などの制限。
公式へのリンクだけ。
[InnoDB テーブル上の制限](https://dev.mysql.com/doc/refman/5.6/ja/innodb-restrictions.html)

# 参考
[漢のコンピュータ道](http://nippondanji.blogspot.jp/2010/10/innodb.html)
[B-treeインデックス入門](http://qiita.com/kiyodori/items/f66a545a47dc59dd8839)
AWS LambdaからLambda呼んでハマった話。

# Lambda(Python)からLambdaの呼び方


```py
import boto3

def lambda_handler(event, context):
    clientLambda = boto3.client("lambda")
    clientLambda.invoke(
        FunctionName="recieveMail",
        InvocationType="Event",
        Payload=json.dumps(event)
    )
```

boto3のlambda clientから `invoke()` メソッドで呼び出すんですが、
`InvocationType` がよくわかってなくつかっててハマってました。

こいつ、`Event|RequestResponse` のどちらかを受け取るんですが、
`Event` は非同期で、
`RequestResponse` は同期で、
それぞれ動きます。

SESのEventで大量のメール処理をしようと思って適当に `RequestResponse` 選んで全然さばけない問題にぶちあたって調査したら、ちゃんと (?) マークのとこに説明がありました。


悪いのは私でした。ってお話。
覚えた使えるRubyトリック _ %w記法

2016年 初春。
アルコール漬けのチンピラからプログラマに転身した私が覚えたトリックを備忘録兼ねてまとめるTips_Ruby編

---

ソース読んでて 「%wって何だよ?」ってなっていたし、コードレビューで教えてもらったので忘れないうちに書いとく。
Rubyは見慣れない色んな書き方があるけど、覚えると超ラクかつ見やすいってことが多い。
##%w　文字列の配列を作ってくれる

```rb
#普通の配列宣言
array = ["red","green","blue"]

#%wを使う場合
array = %w(red green blue)
=> ["red","green","blue"]

```
こっちの方が書くのも早い。
せっかくなので、調べると大文字もあるみたい

##%W 文字列の配列を作ってくれる。（配列の中で式展開してくれる）
こっちは式展開が使えるので、

```rb

color = "青"

#小文字の%w記法だと、、
%w(red green color)
=> ["red","green","color"]

%w(red green #{color})
=> ["red","green","#{color}"]

#そこで、大文字verを使うと
%W(red green #{color})
=> ["red","green","青"]
```
大文字のはともかく、小文字のはよく使いそう。
もっかい言うけど書くのが楽。
ggplot2をforで繰り返し作成して一つにまとめる

[こちらの記事](http://qiita.com/sazya/items/ab641eb589a1d4d375db)を読んで、気になったので自分なりにやってみました。

```{r}
library(ggplot2)
library(gridExtra)
plots <- list()
for (i in 1:6) {
  plots[[i]] <- ggplot() +
    geom_point(aes(1:10, rnorm(10)))
}
marrangeGrob(plots, nrow=2, ncol=3, top="")
```

![unnamed-chunk-1-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/2eaedbbf-e18d-708d-a46f-83589bb70f4f.png)

ポイントは、`ggplot2()`で`aes`は指定せず、こんな感じにすることと、gridExtraパッケージを利用すれば複数plotについても柔軟にできることです。

ただ、gridExtraパッケージは私がまだそこまで使いこなせてないので細かいところはよくわかりません。

以上です。
git rm したファイルを元に戻す方法


## はじめに

以下の状態になった ``` git rm ``` したファイル。

```
% git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	deleted:    削除したファイルパス
```

``` git reset --hard HEAD 削除したファイルパス``` で元に戻せると思ったが、2ステップ必要だった。

##  方法

以下のステップで解消する。

* ステップ1：削除したファイルのステージングを取消し
* ステップ2：削除したファイルをチェックアウトにより復元

### ステップ1：削除したファイルのステージングを取消し

```
% git reset HEAD 削除したファイルパス
Unstaged changes after reset:
D	削除したファイルパス

or

% git reset 削除したファイルが配置されたディレクトリパス
Unstaged changes after reset:
D	削除したファイルパス
```

なぜかファイルパスの場合はリビジョン指定は必須だった。
省略したらHEADを指している認識だったけどなぜだろう。。。

ステージングが取り消されている事を確認

```
% git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    削除したファイルパス
```

### ステップ2：削除したファイルをチェックアウトにより復元

```
% git checkout HEAD 削除したファイルパス
※今回の場合はHEADは省略可能
```

## さいごに
``` git reset --hard ``` はHEAD、ステージング、ワーキングディレクトリの変更を指定のリビジョンまで巻き戻すものだと思っていたが、削除したファイルにはその概念だけでは通用しなかった。まだ理解できていない概念があるのだろうけど、とりあえず問題は解決したので今回はこの辺で。
Fess10の導入 Fess9との違いなど

#はじめに

Fess10.0が2016/2/5にリリースされ、現在の最新バージョンは10.0.2です。
Fess9との違いと共に導入方法を見ていきます。

#Fessとは

FessはApacheライセンスで提供されている簡単に構築可能な全文検索サーバーです。Javaで作られているのでクロスプラットフォームです。

#導入

公式のページに従って5分で導入できます。
http://fess.codelibs.org/ja/10.0/install/install.html

###ダウンロード

zipファイルをダウンロードする方法をとります。
https://github.com/codelibs/fess/releases からfess-10.0.2.zipをダウンロードします。

###起動

zipファイルを任意の場所に展開したあと、fessを起動させます。

```
$ cd fess-10.0.2
$ ./bin/fess
```

停止させるにはCtrl+Cでkillします。

#Fessにアクセス

トップ: http://localhost:8080/ 
管理UI: http://localhost:8080/admin

管理UIにアクセスします。デフォルトのID/passwordはadmin/adminです。

#Fess10とFess9の違い

##管理UI
管理UIのデザインが一新されました！

Fess9
![fess9-admin.png](https://qiita-image-store.s3.amazonaws.com/0/69140/f7a3654c-2a2c-090b-e4e7-064687ee5b84.png)

Fess10
![fess10-top.png](https://qiita-image-store.s3.amazonaws.com/0/69140/ef4470f3-ead2-1d79-a805-1c25f505869b.png)

これはすごい！一気にかっこよくなってますね。左のメニューがドロップダウンになっていて一層見やすくなってます。全体的には今流行りのフラットデザインというやつですね(たぶん)。

さらに、ダッシュボードというメニューが追加されました。
![fess10-dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/69140/374912f2-1c77-f1a6-f2df-c1f282afb240.png)

リアルタイムに情報が更新されます。かっこいい。

##内部的な違い

Fess9までは検索システムにSolrを使っていましたがFess10からはElasticsearchを使っています。他にも様々な変更を施したようです。
[LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境](http://www.slideshare.net/shinsuke/lastaflutefesselasticsearchesflutedbflute)

#使ってみる

試しにWebクロールをしてみたいと思います。

クローラ > ウェブ > 新規作成でウェブクロールの設定を作成します。

今回は下記の設定にしました。他はデフォルト値です。

| 項目                 | 値                                   |
|:---------------------|:-------------------------------------|
| 名前                 | bo3                                  |
| URL                  | http://www41.atwiki.jp/cod_bo3/      |
| クロール対象とするURL| 	http://www41.atwiki.jp/cod_bo3/.* |
| 最大アクセス数       | 30                                   |
| 間隔                 | 1000                                 |

次にクローラーを走らせます。
システム > スケジューラ > 	Default Crawler > 今すぐ開始 を押下します。

少し経つとクローラーが停止します。

http://localhost:8080/ にアクセスし、適当な単語を入力します。
例｢芋｣
![fess10-searchresult.png](https://qiita-image-store.s3.amazonaws.com/0/69140/987db9e6-99da-e121-c3df-f1523f627ceb.png)

リンクをクリックするとそのページに飛ぶことができます。

#まとめ

管理UIカッコイイ。
[Mac]Finderで表示している画面に、terminal上でコマンドで移動する #自分メモ

#はじめに
自分の環境がMacになったので、備忘録的に色々とメモとして残しておくことに
**.bashrc**に書き足して、terminaLife（なにそれ）を充実していく過程でやったことを


#.bashrcに以下を書き加える

```.bashrc
cdf () {
        target=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'`
        if [ "$target" != "" ]
        then
                cd "$target"
                pwd
        else
                echo 'No Finder window found' >&2
        fi
}
```

#Finderで作業したあと…
terminal上で[**cdf**]とコマンドを打てばそのディレクトリに移動可能。
これで素敵なterminaLifeがおくれますね！！

#おまけ
**open**コマンドもaliasに登録しておくと、terminal↔︎Finderの関係がとても楽になる

```.bashrc
alias f='open .'
```

**source ~/.bash_profile**も忘れずに！

これがQiita初投稿ですね。markdown便利ですね


#参考にさせていただいたところ
・[jumping to the finder location in terminal](http://blog.glidenote.com/blog/2013/02/26/jumping-to-the-finder-location-in-terminal/)
CakePHP入門メモ1

自分用のCakePHPメモです。

#おぼえがき

DB処理はエンティティに対して実行する。
find()メソッドの返り値をQueryと言う。検索時はQueryをパースしていく。
コントローラーはビューの起動時に実行される。
フォームのcreateの引数にエンティティを渡すことでそのエンティティに応じたフォームが生成される。

#エンティティの作り方(CREATE文)

空のエンティティを作って
`$person = $this->Persons->newEntity();`
↓
フォームからrequestで値を取り出してマージする。
` $person = $this->Persons->patchEntity($person, $this->request->data);`
↓
セーブする
`$this->Persons->save($person)`


#エンティティの修正(UPDATE文)
GETの値のエンティティを取得
`$person = $this->Persons->get($id);`
↓
確かにコントローラーから投げられているかをチェックする
` if ($this->request->is(['post', 'put'])) `
↓
SUBMITされたdataをマージする
`$person = $this->Persons->patchEntity($person, $this->request->data);`
↓
セーブする
`$this->Persons->save($person)`

#エンティティの削除(DELETE文)
GETの値のエンティティを取得
`$person = $this->Persons->get($id);`
↓
確かにコントローラーから投げられているかをチェックする
` if ($this->request->is(['post', 'put'])) `
↓
エンティティの配列から削除する
`$this->Persons->delete($person)`

#エンティティの検索(SELECT文)
フォームから検索基準を受け取る
`$find = $this->request->data['フォーム名'];`
↓
where句に検索基準を渡す(find以降がだいたいSQL)
` $persons = $this->Persons->find()
            ->select(['id', 'name'])
            ->order(['name' =>'Asc'])
            ->where(["name like " => '%' . $find . '%']);`
↓
ビューはこんな感じで受け取る
` <?php foreach ($persons as $person): ?>
        <tr>
            <td><?= h($person->id) ?></td>
            <td><?= h($person->name) ?></td>
            <td><?= h($person->age) ?></td>
            <td><?= h($person->mail) ?></td>
        </tr>
            <?php endforeach; ?>`


#参考資料
[初心者のためのCakePHP3 プログラミング入門](http://libro.tuyano.com/index2?id=4536003)
MacのFinder.appはどこにあるのか


## AmethystのFloatingに追加したいのに見つからない

大抵のアプリケーションは`/Applications/`に入っているので、覗いてみたけれど`Finder.app`は見つからない。
じゃあ、一体どこにあるのか。

`/System/Library/CoreServices/`の中にあった。

![スクリーンショット 2016-03-15 14.55.59.png](https://qiita-image-store.s3.amazonaws.com/0/6606/aeb7f000-3a46-7692-abb7-8b92550e4f7c.png "スクリーンショット 2016-03-15 14.55.59.png")

それだけ。
覚えた使えるRubyトリック _ CSVファイルのRead &Write

2016年 初春。
アルコール漬けのチンピラからプログラマに転身した私が覚えたトリックを備忘録兼ねてまとめるTips_Ruby編

---

RubyでCSVファイルの読み書きをする機会があって、なかなか忘れそうなので書いとく。


``` ruby:csvファイルから１行ずつ書いてあるKEY文字列を読み込んで適当な配列に格納。
CSV.foreach("Read_hoge.csv") do |line|
  key = line.chomp # chompで末尾の改行文字を除去
  keys = []
  keys << key
end

```

``` ruby:csvファイルに書き込む
write = [id,name]
CSV.open("Write_hoge.csv","w") do |csv|
  csv << write
end

```

書き込みのときの、"w"を忘れててハマった。ライトちゃん。
First remote version of Git source repository on Xcode

### Leading
> Sometimes we need to manage the code by using Git. In our company we store the Git source repository on the server.

It's my business to manage that source. But when I try to create a **new** one by Xcode, I get problems.

## Xcode can only create loal copy
Xcode can just create a local repository, and download the existing source from server.
![Screen Shot 2016-03-09 at 16.43.49.png](https://qiita-image-store.s3.amazonaws.com/0/114282/75cf00f5-1478-b78d-2464-d776141c3cd7.png)

After creating...
![Screen Shot 2016-03-09 at 16.44.20.png](https://qiita-image-store.s3.amazonaws.com/0/114282/106d7c6c-24ec-82c5-73e7-3b1a10c111fe.png)

So we must find another way to create the one on server.

## Create *.git on server
First of all, upload the original source to server.
![Screen Shot 2016-03-09 at 17.05.46.png](https://qiita-image-store.s3.amazonaws.com/0/114282/50bdb34a-b732-067f-904a-d2104889f536.png)

Go into the project folder and create the hidden folder .git.
![Screen Shot 2016-03-09 at 17.07.03.png](https://qiita-image-store.s3.amazonaws.com/0/114282/fab14d4b-95a4-f834-9c61-5ba78a42ace2.png)

Then type below commands in project folder for preparing the first version.
`git add .
git commit -m "initial version"`

At last go to the father folder of project folder and create the *.git folder.
![Screen Shot 2016-03-09 at 17.15.50.png](https://qiita-image-store.s3.amazonaws.com/0/114282/483f93f4-d519-915c-da7f-d9a34e264ad7.png)

You will find the *.git folder. And that is what we need!
![Screen Shot 2016-03-09 at 17.16.10.png](https://qiita-image-store.s3.amazonaws.com/0/114282/72e168a7-c483-15fe-9327-f8a0c9f4c8c0.png)

## Check out the Git source repository from server
This time go to **Source Control** -> **Check Out...**, and input the link where the Git source repository is.
![Screen Shot 2016-03-09 at 17.57.08.png](https://qiita-image-store.s3.amazonaws.com/0/114282/d74b4823-37e2-2c7e-889a-a349bbe149d3.png)

The link format is
`ssh://username@servername/absolute_directory_of_git_source_repository`

## Further more
You can go to [setting up a repository](https://www.atlassian.com/git/tutorials/setting-up-a-repository) to know more about set up a repository.
Unity でエディタの実行結果を gif アニメにする (OSX)

## 1. エディタの実行結果を PNG の連番画像に出力

Keijiro Takahashi さんの [Klak](https://github.com/keijiro/Klak) から `Assets/Klak/Editor/ImageSequenceWindow.cs` を使う

## 2. PNG を gif に変換

`Capture` ディレクトリに png 画像が格納されてるので以下のコマンドで gif に変換

```bash
for i in Capture/*.png; do sips -s format gif $i --out $i.gif; done
```

## 3. gif から gif アニメ生成

[gifsicle](https://www.lcdf.org/gifsicle/) (`brew install gifsicle` でインストール可能) で gif アニメを生成

```
gifsicle --delay=3 --loop Capture/*.gif > anim.gif
```

解像度がデカすぎる場合は以下のような感じでリサイズ

```
--resize=320x180
```

## 参考

 * https://github.com/keijiro/Klak
 * https://gist.github.com/dergachev/4627207
 * http://osxdaily.com/2013/01/11/converting-image-file-formats-with-the-command-line-sips/
 * https://www.lcdf.org/gifsicle/
[AWS][EC2]特定のタグがついたEC2インスタンスのみに対して操作を許可する設定

ひとまずメモとして置いておきます。

特定のタグがついたEC2インスタンスにのみ以下の操作を許可するポリシーです。

- インスタンスの再起動
- インスタンスの開始
- インスタンスの終了

```policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "xxxxxxxxxxxxxxxxx",
            "Effect": "Allow",
            "Action": [
                "ec2:RebootInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/[:tagName]": "[:value]"
                }
            },
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

**[:tagName]**を指定するタグ名に、**[:value]**を指定する値に置き換えればOK。
【Swift】メソッドの引数が「参照渡し」ではなく「値渡し（コピー）」だった件

引き続きSwiftを勉強中のLeeです。

[追記：2016/03/18]
```class```以外は全て「値渡し」で
```class```は「参照渡し」だそうです。
ご指摘ありがとうございます。
[追記：END]

今回はSwiftでメソッドが本当に「値渡し」になっているかを検証して
「参照渡し」はどうするのかを記したいと思います。

下記の様に書くと最後の「a」の部分で「5」のままです。

``` method1.swift
func f(var a: Int) ->Int {
    a = 20
    return a
}
var a = 5
f(a)
a  // a = 5のまま
```

これをちゃんと「参照渡し」にしたい場合は「inout」に変更して「&」を変数の前につけてあげましょう！

``` method2.swift
func f(inout a: Int) ->Int {
    a = 20
    return a
}
var a = 5
f(&a)
a // a = 20になる
```

以上になります。
Swiftでそろそろアプリを作ってみたいですね！

余談ですが、今回XcodeのPlaygroundと言う機能で試しました！
Xcodeメニューバー->Window->Welcome to Xcodeをタップ->Get started with a playground
<img width="495" alt="スクリーンショット 2016-03-15 14.37.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/112916/36d5be4b-214a-7dd6-129c-3730210d0424.png">
ビルドする必要がなくてSwiftを試すには持って来いのツールです！

whileやforでの変数の変化がグラフで表示されるのには驚きました！！;)
<img width="964" alt="スクリーンショット 2016-03-15 14.36.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/112916/e98e4ad6-97da-2ab5-9011-594b4a6531b0.png">
developerWorks Premiumの歩き方（第二回）

こちらにdeveloperWorks Premiumに関する解説（第二回）「dW Premium 時々 Watson」について公開しました。

[第一回](http://qiita.com/mxm/items/917da6dc211bf685490e)からdW Premiumのコンテンツの中身に関して解説しております。
↓
http://zvm1.yskmrzm.net/?p=78
覚えた使えるRailsトリック_ rails console


- rails console

RailsTutorialやドットインストールでも書いてたけど、いまいち使い勝手がわからなかった。```rails console```
実際に仕事を始めてようやく大切さがわかりました。仲良くしてください。
✳︎　エイリアスを作って、```rails c```とかってすると便利。

```zsh
rails c
```

```ruby
Loading development environment (Rails 4.2.5)
Frame number: 0/5
[1]pry(main) > 
```
こんな感じでコンソール上でrubyのコードが簡単に打てる。
ちょっとしたコードや簡単なスクリプトの確認、DBオブジェクトの中身とかの確認など、ターミナルのタブは必ず１つコンソールにすると便利。

``` ruby
// goodsの中身を文字列で出力したい。
[18] pry(main)> goods.each do |g|
[18] pry(main)*   p g.to_s
[18] pry(main)* end
"4"
"4"
"3"
"8"
"7"
"8"
"2"
"9"
"9"
"6"
"7"
=> [4, 4, 3, 8, 7, 8, 2, 9, 9, 6, 7]
[19] pry(main)>
```
こんな感じ。
覚えた使えるRailsトリック _binding.pry

2016年 初春。
アルコール漬けのチンピラからプログラマに転身した私が覚えたトリックを備忘録兼ねてまとめるTips_ Rails編

---

- binding.pry

Railsの開発を始めて一番戸惑ったのはデバッグのやり方。
Java @Eclipse やVB@VisualStudioでは当然のように、
IDE上でブレークポイントをつけるとデバック実行できたのに。。。

Railsではpryを使ってステップ実行していく模様。

``` ruby:lunch.rb
def lunch
  arr =[]
  arr.push("rice")
  arr.push("chiken")
  arr.push("beans")
  binding.pry   ---ここで止めて配列の中身をチェックしたい。
  arr.reverse! if arr.include?("rice")

  p arr.first
end
```
上記のコードのようなlunch メソッドを実行すると、binding.pryと書かれたところで止まってくれる。
ターミナル上で上記のコードが表示されるので、以下のコマンドを使って、中身を見るなり、先に進むなり、あとは他の言語と同じ。IDE上じゃなくてターミナル上でステップ実行していく感じ。

| pryコマンド | 内容|
| --- | --- |
| next | 次の行に進む |
| step | メソッドの中身に入る |
| finish |現在のメソッドから抜ける |
| exit |デバッグを終了|

pryが無いと生活ができない。
変数を使わずズンドコキヨシ with PHP

http://qiita.com/shinderuman@github/items/7c432e8cb7719d35342a

```php
<?php
ob_start();
while (true) {
    echo ['ズン', 'ドコ'][mt_rand(0, 1)];
    if (mb_substr(ob_get_contents(), -10) === 'ズンズンズンズンドコ') {
        break;
    }
}
ob_end_clean();
echo 'キ・ヨ・シ！';
```
MilkcocoaをPubnub的な感じにする

[Pubnub](https://www.pubnub.com/)は"Publish Key"と"Subscribe Key"があり、Publish Keyがないとデータを送信できませんし、Subscribe Keyがないとデータを受け取れません。データを送信するだけのプログラムと、データを受け取るだけのプログラムを分けることができます。


今回は[Milkcocoa](https://mlkcca.com/)で、これと同じことを実現してみます。Milkcocoaはアプリを作成した時は、基本的にセキュリティ的にオープンなので、以下のセットをテンプレート的に覚えておくと良いかもしれません。

##管理画面での設定

1.認証タブの「認証済みクライアント以外を接続不可にする」をONにします。

<img width="409" alt="スクリーンショット 2016-03-15 13.33.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/f4ee001f-da21-9351-31af-df0caf19bb22.png">


2.API Keyを2つ作ってください。

<img width="809" alt="スクリーンショット 2016-03-15 13.35.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/710ceb84-05a0-2475-b137-c05092fb04fc.png">


3.セキュリティルールを設定します。

下記のように、sendができるのはAPI Keyの"ECENHDDHEILKACML"で接続しているのクライアントだけ、onでsendを監視できるのは、API Keyの"NIIBEALHBFFPGNAH"で接続しているクライアントだけ、というように設定します。

```
* {
    permit : send;
    rule : account.key == "ECENHDDHEILKACML";
}

* {
    permit : on(send);
    rule : account.key == "NIIBEALHBFFPGNAH";
}
```


設定はこれで終わりです。

##プログラムを作る

次にpublisherとsubscriber用のプログラムを作成します。以下の二つは使用しているAPI Keyが違うだけです。

test_pub.js

```js
var MilkCocoa = require('milkcocoa');
//先ほど作成したpublisher用のAPI Key
var milkcocoa = MilkCocoa.connectWithApiKey('{app_id}.mlkcca.com', 'ECENHDDHEILKACML', 'secret');
var ds = milkcocoa.dataStore('unity');

ds.on('send', function(e) {
  console.log(e);
});

setInterval(function() {
  ds.send({ message:"I'm publisher" });
}, 3000);
```

test_sub.js

```js
var MilkCocoa = require('milkcocoa');
//先ほど作成したsubscriber用のAPI Key
var milkcocoa = MilkCocoa.connectWithApiKey('{app_id}.mlkcca.com', 'NIIBEALHBFFPGNAH', 'secret');
var ds = milkcocoa.dataStore('unity');

ds.on('send', function(e) {
  console.log(e);
});

setInterval(function() {
  ds.send({ message:"I'm subscriber" });
}, 3000);
```


この二つのプログラミを同時にを動かすと・・・

```
$ node test_sub.js 
{ path: 'unity', value: { message: 'I\'m publisher' } }
{ path: 'unity', value: { message: 'I\'m publisher' } }
{ path: 'unity', value: { message: 'I\'m publisher' } }
{ path: 'unity', value: { message: 'I\'m publisher' } }
{ path: 'unity', value: { message: 'I\'m publisher' } }
{ path: 'unity', value: { message: 'I\'m publisher' } }

```

```
$node test_pub.js 
```

以上のようにtest_sub.jsがtest_pub.jsのメッセージを受け取る形になります。test_sub.jsではメッセージのsendはできませんし、test_pub.jsではメッセージの受け取りはできません。

## ちなみにAPI Keyを知らない人が繋ごうとしても…

test.js

```
var MilkCocoa = require('milkcocoa');
var milkcocoa = new MilkCocoa('uniib1d489g.mlkcca.com');
```
以下のようにコネクション数は全く増えません。

<img width="644" alt="スクリーンショット 2016-03-15 13.48.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/ecaf305f-a9a7-f5ee-6c88-41a20ca6172e.png">
覚えた使えるGitトリック _alias

2016年 初春。
アルコール漬けのチンピラからプログラマに転身した私が覚えたトリックを備忘録兼ねてまとめるTips_ Git編

---

- git config alias

 gitのコマンドにエイリアスを設定。
これでgitコマンドが一文字とかで済むので、例えば```git status```が```git st```とかに短縮できる。
```
git config alias.st status
```
alias.使いたい短縮系 コマンド

で、aliasが設定できる。
さらに、zshとかにもエイリアスを作ってあげると、git自体も短縮できる。
```vim ~/.zshrc```で、設定ファイルに以下のように書いてあげる。

``` vim

alias g="git"

```
とすると、git は gで済むので、例えばこんな感じに楽になります。

```
git grep hogehoge  => g g hogehoe
git status => g s
git checkout master => g co master
git branch => g b
```

最初はそんなに変わんねえだろ、手間。とか思っててごめんなさい。
慣れるとすげー便利。
覚えた使えるGitトリック _ResetとReflog

2016年 初春。
アルコール漬けのチンピラからプログラマに転身した私が覚えたトリックを備忘録兼ねてまとめるTips_ Git編

---
- git reset
- git reflog
 
間違えてコミットしちゃった。やり直したい。って時。
Subversionだとローカルの変更を取り消すupdateかければよかったんだけど、gitだと以下のようにresetコマンドで戻る。
```
git reset --hard HEAD~
```
で、コミットが無かったことになる。
んだけど、今度は、やべえ間違えてリセットしちまったって事がある。
そんな時は```git reflog```って呪文がある。

```
git reflog
 9999999 HEAD@{0}: reset: moving to HEAD~
 9999999 HEAD@{1}: commit: ３回目のコミット     
 9999999 HEAD@{2}: commit: 不具合修正
 9999999 HEAD@{3}: commit: 最初のコミット（機能改善）
 9999999 HEAD@{4}: checkout: moving from master to test-branch
```
こんな感じで、過去のコミット履歴を遡ることができる。

そこで、戻るべきコミット（例えば不具合修正に戻りたい）を指定して、
再び ```git reset````を唱える。

```
git reset --hard "HEAD@{2}"
```
rebase失敗したり、間違ってコミットが全部台無しになったときでも焦らない。
さすがgit
PHPの【クロージャー、クラスのnew、クローン】の比較

【訂正】

速度の比較で、関数だけは実行時間が入っていたので、比較対象から外しました。それにともなって、タイトルを変更しました。

【/訂正】

PHPのクロージャーのおかげで、コードをデータのように使えるようになりました。ちょっとした設定とか、コードで記述できて便利です。

ところで、パフォーマンスはどうなのでしょう？
PHPの内部では、クロージャーは`__invoke`のあるオブジェクトとして実装されている、と聞いているので、おそらくクラスをnewするのと似たような速度かなと思います。今さらながら、遅かったらどうしよう、という疑問が…

ということで計測してみました。

比較対象は、クロージャー、クラスをnew、ついでにクローン~~と関数~~も比較してみました。

結果
----


```
     closure:   491.33  msec
   new class:   437.70  msec
   clone obj:   353.54  msec
```

実行環境：mac mini, Core i7, 16GB, PHP5.6.16


感想
----

予想通り、クロージャーもnewも似たような数字になりました。少しnewの方が速いのですね。クロージャーのほうが、少し複雑なオブジェクトなのかもしれません。

~~意外だったのが、関数呼び出しが一番遅かったこと。~~

~~関数にするより、クロージャー使ったりオブジェクトを作るほうが速いとは。と言っても、3〜4倍程度なので、そもそもが速いので、気にすることはないですが。~~

クローンは速いと聞いてたのですが、やはり一番早かったです。でも、似たような数字ですね。


### PHP7

PHP7でも試してみたいですね。
同じく導入される無名クラスも、一応測ってみたい。


結論
---

**コードによる速度差なんか気にしなくてOK！**


コード
----

測定に使った[コード](https://gist.github.com/asaokamei/6cef9202b63bca4bf192)です。


```php
<?php

function runIt($closure, $title)
{
    $n = 1000000;
    $time1 = microtime(true);
    $closure($n);
    $time2 =  microtime(true);

    echo sprintf("%12s: %8.2f  msec\n", $title, ($time2 - $time1) * 1000);
};

$do_closure = function ($n = 100)
{
    for($i = 0; $i < $n; $i++) {
        $s = function() use($i) {return 'hi';};
    }
};

class sample {
    function __invoke() {
        return 'hi';
    }
}

$do_class = function ($n = 100)
{
    for($i = 0; $i < $n; $i++) {
        $s = new sample($i);
    }
};

$do_clone = function ($n = 100)
{
    $s0 = new sample();
    for($i = 0; $i < $n; $i++) {
        $s = clone $s0;
    }
};

function test_func($i) {
    return 'hi';
}
$do_function = function ($n = 100)
{
    for($i = 0; $i < $n; $i++) {
        $s = test_func($i);
    }
};

//runIt($do_function, 'function');
runIt($do_closure, 'closure');
runIt($do_class, 'new class');
runIt($do_clone, 'clone obj');

```
覚えた使えるGitトリック _Git Grep


2016年 初春。
アルコール漬けのチンピラからプログラマに転身した私が覚えたトリックを備忘録兼ねてまとめるTips_ Git編

---

- git grep
 
 超使う。プロジェクト内に探したい文字列や、このメソッドどこで使われてんのよって時に大活躍。しかも早い。
```
git grep hogehoge
```
で、git管理下からhogehogeと書かれているところを探してくれる。
```
app/models/hoge.rb
app/controllers/hogehogehoge.rb
```
こんな感じ。
Golangでベンチマークを取ってみた


Golangでどんな書き方をするのがいいのかパフォーマンスを指標にしてみよう！ということでベンチマークを取ってみました。

## やり方

*_test.goでファイルを作成します。
今回は文字列連結のパフォーマンス計測がしたいので以下の感じのコードを書きます。

```
package main

import "testing"

func BenchmarkMemAllocBeforeCustom(b *testing.B) {
  n := 10
  b.ResetTimer()
  for i := 0; i < b.N; i++ {
    s := ""
    for j := 0; j < n; j++ {
      s = s + "alice"
    }
  }
}

func BenchmarkMemAllocCustom(b *testing.B) {
  n := 10
  b.ResetTimer()
  for i := 0; i < b.N; i++ {
    s := make([]byte, 0)
    for j := 0; j < n; j++ {
      s = append(s, "alice"...)
    }
  }
}
```

## ベンチマークの実行

ベンチマークの実行は以下のコマンドで行います。

```
$ go test -bench .
PASS
BenchmarkMemAllocBeforeCustom-4	 2000000	815 ns/op	
BenchmarkMemAllocCustom-4      	 5000000	373 ns/op
ok  	bench-test	4.669s
```

他にもオプションつけたりできます。

```
$ go test -bench . -benchmem
PASS
BenchmarkMemAllocBeforeCustom-4	 2000000	815 ns/op	336 B/op	9 allocs/op
BenchmarkMemAllocCustom-4      	 5000000	373 ns/op	120 B/op	4 allocs/op
ok  	bench-test	4.669s
```

なんか謎の数値が並んでますが、`-benchmem`の結果を簡単に説明すると以下な感じです。

```
// 関数の実行回数、有用な結果が得られるまで実行される
// 多ければ多いほど良い
2000000

// １回の実行にかかった時間
// 少ないほど良い
815 ns/op

// 実行ごとに割り当てられたメモリのサイズ
// 少ないほど良い
336 B/op

// １回の実行でメモリアロケーションが行われた回数
// 少ないほど良い
9 allocs/op
```

ベンチマークの結果の見方が分からなくなったらこの辺のBenchmarkStructに意味が書いてあるっぽいので読みましょう。

https://github.com/golang/tools/blob/master/benchmark/parse/parse.go#L28-L37

[追記：2019/02/27]

Go1.12になったことでちょこっと変更が加わりました。
https://syossan.hateblo.jp/entry/2019/02/27/171156

## 参考
[Go でベンチマーク](http://jxck.hatenablog.com/entry/20131123/1385189088)
[go test で出来ること](http://qiita.com/taizo/items/82930518430f940721a0)
[Goでは文字列連結はコストの高い操作](http://qiita.com/ruiu/items/2bb83b29baeae2433a79)
CloudFront+ELB+EC2(nginx)で接続元による拒否設定

よくあるCloudFront+ELB+EC2の環境で海外のIPから攻撃をうけてしまった。
SecurityGroupで拒否設定をしようと思ったら
接続元が全部CloudFrontなので上手く拒否設定が出来ず
やむなくEC2のnginxで設定することに。


↓こういうところを参考にさせて頂いたけど、x_forwarded_forに入るClientIPの順番が違って、少し困ったのでメモ。
http://takeyuweb.hatenablog.com/entry/elb_ec2_nginx_ip
http://blog.suz-lab.com/2011/06/x-forwarded-forhttpelb.html

##方法1  

海外からのアクセスなんていらないや、とか
南アフリカからのアクセスとかないよね！？いらないよね！？
というサービスであれば、CloudFrontのgeo-restrictionを使えばよい。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/georestrictions.html


##方法2
AWS WAFを使う
https://aws.amazon.com/jp/waf/
セキュリティちゃんとしようと思ったら、予算とって
こういうのちゃんと使うほうがいいと思う。


##方法3
国内からの攻撃だったり国別で拒否は出来ないよ、、お金も無いよ、という時。
EC2(nginx)側で制限を実施。

### 前提
- nginx では Realip Module が使えるようになっていること  
 http://nginx.org/en/docs/http/ngx_http_realip_module.html
- nginx では HttpMapModule が使えるようになっていること  
 http://nginx.org/en/docs/http/ngx_http_map_module.html

### 1 拒否したい接続元を指定

```
# vi /etc/nginx/deny_ip
# cat /etc/nginx/deny_ip
map $http_x_forwarded_for $deny {
    default 0;
    ~^111\.222\.111\.222,\s 1;
}
```

**map XXX $YYY** : XXXに対して{}の条件で$YYYに変数をセット
**default 0** : 何もなければ変数は0
**~** : 正規表現で指定するよって宣言
**^111\.222\.111\.222,\s** : マッチさせる正規表現部分
**1** : 正規表現にマッチしたものは変数1にセット

なので、この場合はhttp_x_forwarded_forの行頭に
`111.222.111.222,スペース` があったときに$denyに1をセットすることになる


### 2 拒否

- 全体で拒否したい時

```
+include /etc/nginx/deny_ip;
server {
    listen      80 default;
    server_name www.example.com;
    index       index.html index.htm
    
+   if ( $deny = "1" ) {
+       return 403;
+   }

    location = / {
        root        /var/www/html;
    }
```

- 特定ディレクトリのみ拒否したい時

```
+include /etc/nginx/deny_ip;
server {
    listen      80 default;
    server_name www.example.com;
    index       index.html index.htm

    location = /admin {
+       if ( $deny = "1" ) {
+           return 403;
+       }
        root        /var/www/html;
    }
```

無事403へ落とすことが出来ました。
How to fix "SSL certificate problem" with "git clone"




## how to fix

```
$ env GIT_SSL_NO_VERIFY=true git clone https://example.com/foo/bar.git
```

or

```
git -c http.sslVerify=false clone https://domain.com/path/to/git
```

## didn't work

```
git config --global http.sslVerify false
```



## Ref

* [version control - How can I make git accept a self signed certificate? - Stack Overflow](http://stackoverflow.com/questions/11621768/how-can-i-make-git-accept-a-self-signed-certificate)
対象のURLから特定の画像URLを取得するコード

#特定のページから特定のIDを付与した画像URLを取得したかったので作ってみた。

githubとか参考にしました。
https://github.com/pellcorp/opendb/blob/master/lib/site/amazon.class.php

##これをどこかに書いたら使えるようになります。

``` func_get_image.php
<?php
/**
 * 特定URLの特定IDをつけた画像を取得
 */
function get_image_by_id( $url, $id ) {
        $img_url = "";
        if ( isset( $url ) && $url != "" && isset( $id ) && $id != "" ) {
                $pageBuffer = file_get_contents( $url );
                ob_start();
                ob_end_clean();
                if (preg_match_all("!<img [^>]*?id=\"$id\" [^>]*?src=\"([^\"]+)\"!s", $pageBuffer, $regs) ||
                           preg_match_all("!<img [^>]*?src=\"([^\"]+)\" [^>]*?id=\"$id\"!s", $pageBuffer, $regs)) {
                        $image = $regs[1];
                }
                $img_url = $image[0];
        }
        return $img_url;
}
```

##使い方
```
<?php

include_once('func_get_image.php');
$url = "http://joy.ful.jp/"; // サンプル

$image_url = get_image_by_id( $url, "logo_img" );
?>
<img src="<?php echo $image_url; ?>" />
```

これで特定のURLから特定のIDが付与されたイメージが取得できる・・・はず。
改造すれば特定のaltとかtitleとかでもいけるとおもいます。

参考のURLをご覧いただけばいろいろできるかもしれません。

特定ページのHTMLがリニューアルされたらおしまいですけど・・・