OmniAICreator/Qiita-1.07M huggingface dataset:
can't quote MatchDataって怒られたときは（Rails ActiveRecord）

エラー文でググっても出てこなかったけどよく見たら一瞬で解決した話

```
matchText = text.match(/hoge/)
Text.find_by(value: matchText)
```

こんな感じで怒られたけどmatchで帰ってくるのはMatchDataっていうオブジェクトなので

```
matchText = text.match(/hoge/).to_s
Text.find_by(value: matchText)
```

こうしてto_sでstring化したら解決
(未解決) pySerial 2.7 + CentOS 6.8 (+Python 2.6.6) > 送信できなくなる | OS再起動での対処 | Link: pySerial v2.5での対処

```txt:動作環境
CentOS 6.8 (64bit)
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
pySerial pyserial-2.7-py2.6.egg-info
```

### 関連

- [pySerial 2.7 + CentOS 6.8 (+Python 2.6.6) > ループバックテストは成功 | readline()が遅い問題はある | ドライバのバージョンアップで動作しなくなるコード](https://qiita.com/7of9/items/74f8c6b3d77696cdee23)

### 送信できなくなる

pySerialを使ったエミュレータを実装しているが、送信ができなくなる症状が発生する。

```test_send_180125.py
import serial
import time

# on Python 2.6.6

atxt="hello"

def main():
    print("Hello")
    con1=serial.Serial('/dev/ttyUSB0', 9600, timeout=300)
    while True:
        #wrk = "from\r\n"
        print(atxt)
        con1.write(atxt);
        time.sleep(1)
    con1.close()

if __name__ == '__main__':
    main()

```

### 対処

対処方法は今のところ不明である。

OSを再起動することで対処をするが、他の作業に影響してしまう。

### 関連

- [Raspberry Pi pyserial need constant reboot](https://github.com/pyserial/pyserial/issues/30)
    - 問題を避けるためpySerial v2.5を使用している例がある
MySQLのQueryについて

# MySQLのQueryについて

## slowqueryはmsecまでいける

- default

```
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
```

- 0.01秒まで下げてみる
```
set global long_query_time=0.01;
```

```
mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 0.001000 |
+-----------------+----------+
1 row in set (0.01 sec)
```

* 最低値は確かめていないがここまではいけた・・・けど、こんなにいらない

`long_query_time=0.0000000001`

## indexを使っていないqueryを調べる

- ONにするだけの簡単設定

```
mysql> show variables like 'log_queries_not_using_indexes';
+----------------------------------------+------------------------------------------+
| Variable_name                          | Value                                    |
+----------------------------------------+------------------------------------------+
| log_queries_not_using_indexes          | OFF                                      |
+----------------------------------------+------------------------------------------+
9 rows in set (0.00 sec)
```

```
mysql> set global log_queries_not_using_indexes=on;
Query OK, 0 rows affected (0.00 sec)
```

```
mysql> show variables like 'log_queries_not_using_indexes';
+----------------------------------------+------------------------------------------+
| Variable_name                          | Value                                    |
+----------------------------------------+------------------------------------------+
| log_queries_not_using_indexes          | ON                                       |
+----------------------------------------+------------------------------------------+
9 rows in set (0.00 sec)
```

出力される条件 (MySQL Referenceより)

1. クエリーは管理ステートメントでないか、log_slow_admin_statements が有効になっている必要がある。
1. クエリーに少なくとも long_query_time 秒かかっているか、log_queries_not_using_indexes が有効であって、クエリーは行参照にインデックスを使用していない。
1. クエリーは少なくとも min_examined_row_limit 行を検査している必要がある。
1. クエリーは、log_throttle_queries_not_using_indexes 設定によって抑制されていてはならない。

## このクエリって、どのindex使ってるの？
複合インデックスが複数ある場合、`EXPLAIN`を実行しないとわかりません。

`EXPLAIN SELECT * FROM hoge WHERE foo=1 AND bar=2`

## indexを張る際の勘所
indexを絞り込むのに重要なのは、`cardinary`が多いか少ないか
`cardinary`は `show index from db;`を打つと見れるが
index効率は、このcardinaryが高い順に並べる程にクエリが早くなる。

## PRIMARY Indexは複数張ってもあまり使われない
個別で使われるのはwhereとorderbyで分かれた時のみ
WHERE句に複数のカラムがある場合は、複合インデックスを張らないと使ってくれない。

## OR句はインデックスを使わない
レコード数がそれほど多くない（数十、数百くらい）なら、個別に打ったほうが実は速い。
[JavaScript][Node.js] requireされた側でrequireした側の変数を参照する

require した側で require された側の変数を参照するのは、module.exports で指定してあげた変数を素直に参照する方法で可能です。

``` required.js
module.exports.foo = 'fooの値';
```

``` require.js
let required = require('./required.js');
console.log(required.foo); // fooの値
```

この逆を行いたい場合。つまり、require された側で require した側の変数を参照するには module.parent.exports を使います。

``` required.js
console.log(module.parent.exports.bar); // barの値
```

``` require.js
module.exports.bar = 'barの値';
let required = require('./required.js');
```

複数回 require された側で参照するには、 require された回数分 parent をつなげて参照します。

``` required_2nd.js
console.log(module.parent.parent.exports.val); // valの値
```

``` required.js
let required_2nd = require('./required_2nd.js');
console.log(module.parent.exports.val); // valの値
```

``` requre.js
module.exports.val = 'valの値';
let required = require('./required.js');
```

ファイルの require する/されるの関係や構造が変わるとあれやこれや修正しないといけなくなるので、そこはうまくないのですがグローバルを汚染することは手軽に避けることができます。
[クロージャを使う方法](http://memo.sugyan.com/entry/20120110/1326197416)もあるようなのですが、複数回 require された場合のケースではとても複雑なことになりそうなので見送っています。

### 参考

- [expressでapp全体の設定値をroutesで使う(module間で変数を受け渡す)方法いろいろ - すぎゃーんメモ](http://memo.sugyan.com/entry/20120110/1326197416)
Laravel で DynamoDB の migration をやる方法の案

## 前提

* DynamoDB のテーブル管理のために特別なオペレーションを増やしたくない
* [baopham/dynamodb](https://packagist.org/packages/baopham/dynamodb) を利用している
* テスト実行時は DynamoDB を使わない

## やったこと

いつもの migration の中で DynamoDB のテーブル作成・削除も行うようにする。

```php
<?php

use Illuminate\Database\Migrations\Migration;
use BaoPham\DynamoDb\DynamoDbClientService;

class CrateDynamoDbMoviesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        // テスト時には DynamoDB を利用しない
        if (app()->environment('testing')) {
            return;
        }

        $dynamoDbClientService = resolve(DynamoDbClientService::class);
        $client = $dynamoDbClientService->getClient();

        $params = [
            'TableName' => 'Movies',
            'KeySchema' => [
                [
                    'AttributeName' => 'year',
                    'KeyType' => 'HASH',
                ],
                [
                    'AttributeName' => 'title',
                    'KeyType' => 'RANGE',
                ],
            ],
            'AttributeDefinitions' => [
                [
                    'AttributeName' => 'year',
                    'AttributeType' => 'N'
                ],
                [
                    'AttributeName' => 'title',
                    'AttributeType' => 'S'
                ],
            ],
            'ProvisionedThroughput' => [
                'ReadCapacityUnits' => 10,
                'WriteCapacityUnits' => 10,
            ],
        ];

        $client->createTable($params);
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        // テスト時には DynamoDB を利用しない
        if (app()->environment('testing')) {
            return;
        }

        $dynamoDbClientService = resolve(DynamoDbClientService::class);
        $client = $dynamoDbClientService->getClient();

        $params = [
            'TableName' => 'Movies',
        ];

        $client->deleteTable($params);
    }
}
```

## その他検討したこと

* [nordsoftware/lumen-dynamodb](https://packagist.org/packages/nordsoftware/lumen-dynamodb) はテーブル作成のための仕組みを提供しているが、migration の機能は提供してなさそう
* [quankim/laravel-dynamodb-migrations](https://packagist.org/packages/quankim/laravel-dynamodb-migrations) というものも存在しているが、ドキュメントが少ないのと、利用実績があまりなさそう（Github の
 Star, packagist の Installs）なので今回は見送り
Ramboxでチャットツールを一元管理

# はじめに

プロジェクトによっては異なるチャットツールを使うことがあると思う。
こうなると、ブラウザでチャットごとにタブを開いておく必要がある。
もし、今後使うチャットツールが増えていくとなると、ブラウザでタブを全て開かないといけないので管理が面倒になる。

# Rambox

そこで、便利なのが[Rambox](http://rambox.pro/)というこれまたOSS。

> Free, Open Source and Cross Platform messaging and emailing app that combines common web applications into one
> 無料のオープンソース、クロスプラットフォームで、一般的なウェブアプリケーションを一元管理するメッセージング＆メールアプリ。

Ramboxでは、タブでチャットアプリを簡単に切り替えられる。
ブラウザでタブをチャットごとに開くのと何が違うんだって思うかもしれない。
メリットを3つ挙げると、

1. メッセージ＆メールアプリに特化しているので、ブラウザのようにメッセージ＆メールアプリに関係のないタブと混在しない。
2. 通知が来ていることがRamboxのアイコンに表示されるので、他のアプリを使っていてもメッセージに気付く。
3. Chromeはhttpsでないと通知が来ない仕様になっているが、httpsでなくてもRamboxはちゃんと通知が来る。

# まとめ

Rambox is the best.
Swift備忘録~tableView編~

#はじめに
Story Boardを使わずにtableViewのセクションの実装を記録しました。
今回もあくまで自分が理解するために書いたものです。


#環境
Xcode9.2

#今回の備忘録

##セクションの数の実装
```
extension exampleViewController: UITableViewDataSource {

    func　numberOfSections(in tableView: UITableView) -> Int {
　　　　　　　　    return 2  //返したいセクションの数　2 を返す
    }

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
　　　　　　　　    switch section {
        case 0:
　　　　　　　　 　　　　　　    return 2 　//セクションの中のセルの数　2　を返す
        case 1:
　　　　　　　　 　　　　　　    return 1 　//セクションの中のセルの数　1　を返す
        default:
　　　　　　　　 　　　　　　    return 0 //どれも該当しない場合なのでセルの数　0　を返す
        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
　　　　　　　　    switch indexPath {
        case [0, 0]:
　　　　　　　　 　　　　　　    return ● // ● は返したいセルの内容
        case [0, 1]:
　　　　　　　　 　　　　　　    return ○ // ○ は返したいセルの内容
        case [1, 0]:
　　　　　　　　 　　　　　　    return ■ // ■ は返したいセルの内容
        default:
　　　　　　　　 　　　　　　    return UITableViewCell()
　　　　　　　　    }
    }
}

extension exampleViewController: UITableViewDelegate {

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        if section == 0 {
            return ○　　// ヘッダーの高さ ○ を返す
        } else {
            return ●　　// ヘッダーの高さ ● を返す
        }
    }

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
　　　　　　　　　　　　　　　　if section == 0 {
            return ○　　// フッターの高さ ○ を返す
        } else {
            return ●　　// フッターの高さ ● を返す
        }
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.section == 1 {
            return 100
        }
　　　　　　　　    switch indexPath {
        case [0, 0]:
　　　　　　　　 　　　　　　    return 20 //セルの高さ 20 を返す
        case [0, 1]
　　　　　　　　 　　　　　　    return 40 //セルの高さ 40 を返す
        default:
　　　　　　　　 　　　　　　    return 0  //どれも該当しない場合なのでセルの高さは　0　を返す
　　　　　　　　    } 
    }
}
```
できるだけコピペでWindows + WebDriverIO + Edge でテスト

## 概要

Widows環境でWebDriverIOを使ってEdgeでE2Eテストする。

## 環境

- Windows10 , 1709, 16299.192

## javaインストール

これだけは [java.com](https://java.com/ja/) からダウンロードしてインストール

## ディレクトリ作成

```
> mkdir wdio-test
> cd wdio-test
```

## npm init

- コマンド入れて、全部デフォルトで。

```bash
> npm init
```

## webdriverIO 追加

```bash
> npm install webdriverio --save-dev
```

## パスを通す

あとで、コマンドを使うとき楽するためにパスを通す

```bash
> path=.\node_modules\.bin;%PATH%
```

## コンフィグ作成

- とりあえず全部デフォルトで

```bash
> wdio
```


## wdio-selenium-standalone-service 追加

```bash
> npm install wdio-selenium-standalone-service --save-dev
```

## WebDriverインストール

```bash
> selenium-standalone install
```

## wdio.conf.js 編集

- wdioの capabilities の browserName の部分を "edge"に。
- servicesに selenium-standaloneを追加

```json

    capabilities: [{
        ...
        browserName: 'edge'
    }],
    ...
    services: ['selenium-standalone'],
    ...
```

## テストファイル作成

- test\specs\test.jsを作成

```js
describe("Open browser", () => {
  it("open", () => {
    browser.url("https://google.jp");
  })
});
```

## テスト

```bash
> wdio wdio.conf.js
```

Edgeが起動して、google.jpにアクセスできたらOK

package.jsonを編集して npm run test とするのが吉

```json
"scripts": {
  "test": "wdio wdio.conf.js"
}
```

```bash
> npm run test
```


## その他のブラウザ

### chrome

1. chromeのインストール
2. browserNameのところを"chrome"に変更する

### IE11

1. browserNameのところを"internet explorer"に変更する
2. インターネットオプション → セキュリティ
  -  インターネット、ローカルイントラネット、信頼済みサイト、制限付きサイトで「保護モードを有効にする」をONにする

- IEはテストが終わってもクローズしない


## 参考

- [WebdriverIO](http://webdriver.io/)
- [wdio-selenium-standalone-service](https://github.com/webdriverio/wdio-selenium-standalone-service)
- [Selenium2をIEで起動させてみる](https://qiita.com/tsuttie/items/372f5d4cad37650711f1)
Pythonによるデザインパターン【Observer】-本日のニュースをお届けします-

#参考

@kidachi1さんの記事のRubyの記事のソースコードをpythonに書き換えてます。
https://qiita.com/kidach1/items/ce18d2a926c558159689
@kidachi1さん、いつもありがとうございます。

#概要

Rubyによるデザインパターン第5章。
Observer Pattern。

Rubyによるデザインパターン5原則に則って理解する。
***この記事はPython***

#どんなパターンか

あるオブジェクトの状態に関心のあるオブジェクトに、都度通知を送る。

ニュースの発信源（Subject）とニュースの消費者（Observer）間に綺麗なインターフェイスを用意する。

###Subject

あるニュースを配信するクラス

###Observer

あるニュースを得ることに関心があるクラス

#メリット

ニュースの発信者と受信者の間の依存関係を排除する。

#問題のあるコード

従業員の給与の変化を経理部門に伝えるシステム

#従業員クラス

```python
class Employee:
  def __init__(self, name, title, salary, payroll):
    self.name = name
    self.title = title
    self.salary = salary
    self.payroll = payroll

  def update_salary(self, new_salary):
    self.salary = new_salary
    self.payroll.update(self)
```

#経理部門クラス

```python
class Payroll:
  def __init__(self):
    pass
  def update(self, changed_employee):  # Subjectオブジェクトを受け取る
    print ( changed_employee.name + "の給料が" + str(changed_employee.salary) + "ドルに上がりました!" )    
```
#クラスの利用

```python
payroll = Payroll()
employee = Employee( "tsuji","leader", 1000, payroll  )
employee.update_salary(2000)

#tsujiの給料が2000ドルに上がりました!
```
#問題

もし経理部門以外にも通知したくなったら？

→今はEmployeeクラスに手を入れる必要がある。
本質的にはEmployeeに対する変更など何もないにも関わらず・・。

そこで、

変化する事項（「従業員の給与の変更」というニュースを誰が受け取るか）を、Employeeオブジェクトから分離する。
→必要なのは、Employeeオブジェクトの変化に関心のあるオブジェクトの一覧。

#従業員クラス

```python
class Employee2:
  def __init__(self, name, title, salary ):
    self.name = name
    self.title = title
    self.salary = salary
    self.observers = []

  def add_observer(self, observer):
    self.observers.append(observer) 

  def update_salary(self, new_salary):
    self.salary = new_salary
    self.notify_observers()

  def notify_observers(self):
    for  observer  in  self.observers :
      observer.update(self)
```

#経理部クラス

```python
class Payroll:
  def __init__(self):
    pass
  def update(self, changed_employee):  # Subjectオブジェクトを受け取る
    print ( changed_employee.name + "の給料が" + str(changed_employee.salary) + "ドルに上がりました!" )    
    print ( "経理部門は" + changed_employee.name + "に小切手を切ります！")    
```

#税務署員クラス

```python
class Taxman:
  def __init__(self):
    pass
  def update(self, changed_employee):  # Subjectオブジェクトを受け取る
    print ( changed_employee.name + "の給料が" + str(changed_employee.salary) + "ドルに上がりました!" )    
    print ( "税務署員は" + changed_employee.name + "に新しい税金請求書を送ります！") 
```

#クラスの利用

```python

taxman = Taxman()
payroll = Payroll()
employee2 = Employee2("daisuke","member", 3000)

employee2.add_observer(payroll)
employee2.add_observer(taxman)

employee2.update_salary(4000)

```

#まとめ
変わるもの（オブザーバー）と変わらないもの（サブジェクト）を分離して、変化に強い構造へ

#Strategyパターンとの比較

###形は似ている
Observerパターン：サブジェクトがオブザーバーを呼び出す
Strategyパターン：コンテキストがストラテジを呼び出す

###違いは目的
Observerパターン：サブジェクトで発生したイベントをオブザーバーへ通知する
Strategyパターン：コンテキストが、何か特定の処理を行うためにストラテジを呼び出す
SQLiteで日付を扱う方法

### 概要
ミリ秒を取得
 ↓
INTEGER型でデータベースに格納
 ↓
`cursor.getLong(position)`でミリ秒取得
 ↓
ミリ秒→Stringに変換(SimpleDateFormat, Dateクラスを使用)

### サンプルコード
DatePickerDialogで日付を選択 → データベースに格納 → データベースの内容を表示するアプリです
（コードは抜粋）

```java
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    // CalendarにDatePickerDialogの内容を入れる
    Calendar ms_cal = Calendar.getInstance();
    ms_cal.set(Calendar.YEAR, year);
    ms_cal.set(Calendar.MONTH, month);
    ms_cal.set(Calendar.DAY_OF_MONTH, dayOfMonth);
    // Calendarからミリ秒を取得
    long ms = ms_cal.getTimeInMillis();
    // ミリ秒をデータベースに格納
    insertLong(ms, TB_DATES);
}
```

```java
private String msToString(long ms){
    String str;
    Date date = new Date(ms);
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
    str = formatter.format(date);
    return str;
}
```

```java
    private long stringToMs(String str){
        DateFormat df= new SimpleDateFormat("yyyy/MM/dd");
        long ms = 0;
        try {
            ms = df.parse(str).getTime();
        } catch (ParseException e) {
            Log.d("exception", "sdf parse exception", e);
        }
        return ms;
    }
```

日付の加減算はミリ秒でした方がCalendar使うより楽かも…？

```java
long dayMs = (long)(1000 * 60 * 60 * 24);
```


### 参考文献
http://oki2a24.com/2015/04/19/use-date-with-java-with-sqlite-in-android/
https://www.sejuku.net/blog/20994#yyyyMMdd
Windows 10 でAtom エディタが表示されなくなった

プログラムとして起動しているのに、全く画面上に現れなくなった。。

Githubに書かれた下記の方法で解決できた、助かった。。m(__)m

[Atom is not shown anywhere on screen · Issue #8737 · atom/atom](https://github.com/atom/atom/issues/8737)

 * Alt + Tab でAtomエディタを選択
 * Alt + Space でコンテキストメニューを開く
 * 移動のために 'm' を押下
 * 矢印キーを１つ押す
 * マウスを動かす
 * 見えた！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18351/6177970b-0d37-cfdb-30fb-9f7763ccd165.png)
Ruby で (a ==1 && a== 2 && a==3) の結果を真にする

※[ブログ記事](http://secret-garden.hatenablog.com/entry/2018/01/23/142936)からの転載です。

と、いうのが [JavaScript 界隈で流行っている](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)ので Ruby でもやってみた


## `==` メソッドを定義する

多分一番簡単なやり方。
比較演算子そのものの結果を変えます。

```ruby
a = Object.new
def a.== other
	true
end

p a == 1 && a == 2 && a == 3
# => true
```


## `a` メソッドを定義する

Ruby ではメソッド呼び出しの際に `()` を省略する事が出来るので `a()` というメソッド呼び出しを `a` とだけで呼び出すことが出来ます。

```ruby
def a
	@a = (@a || 0) + 1
end

p a == 1 && a == 2 && a == 3
# => true
```

こっちは Ruby らしいですね。


## おまけ：`==` ではなくて `===` を使う

主題からは外れますが Ruby では `===` 演算子は特別な呼び出しなので `==` の変わりに `===` を使うといろいろな手段が使えます。


### `Proc#===` を使う

`Proc#===` は `Proc#call` と同じなのでブロックの中身をそのまま返します。

```ruby
a = proc { true }

# a.call 1 と同じ
p a === 1 && a === 2 && a === 3
# => true
```


### `Method#===` を使う

`Method#===` も `Proc#===` と同様に `#call` を呼び出します。

```ruby
a = [1, 2, 3].method(:include?)

# [1, 2, 3].include? 1 を呼び出しているのと同じ
p a === 1 && a === 2 && a === 3
# => true
```


### `Range#===` を使う

`Range#===` は `Range#include?` を呼び出します。

```ruby
a = (1..3)

# (1..3).include? 1 を呼び出しているのと同じ
p a === 1 && a === 2 && a === 3
# => true
```

### `Set#===` を使う

`Range` と同様に `Set#===` も `Set#include?` を呼び出します。

```ruby
require "set"

a = Set[1, 2, 3]

# Set[1, 2, 3].include? 1 を呼び出しているのと同じ
p a === 1 && a === 2 && a === 3
# => true
```

Ruby たのしい
ECサイトにおけるPayPalの３つのコンバージョンアップ機能

PayPalの決済機能のうち、コンバージョンに貢献する機能について説明します。

# 1. ワンタッチ
ペイパルへの継続ログインを有効にした買い手が、２回目以降ログイン操作をスキップできる機能です。別のサイトでログインした買い手にも有効です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210396/030be59c-c496-6559-9f92-3b12db0e0b60.png)

## コンバージョンアップのポイント
ログインやカード情報入力が不要で確認画面だけを挟んだワンクリック決済を実現することでコンバージョンに寄与します。

## 実装方法
実装は必要ありません。全てのPayPal決済に導入されています。

# 2. In-Context
画面離脱せず決済を完了させる機能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210396/76b19305-46db-6246-eee0-0176a2a9ba1a.png)

## コンバージョンアップのポイント
ECサイトから離脱せず決済を行うことで心理的なハードルを下げてコンバージョンに寄与します。

## 実装方法
[API決済](https://qiita.com/PPJP/items/db5c57991c2c3fe80ac7)を実装することで自動的にIn-Contextになります。

# 3. ショートカット決済
PayPalアカウントに登録されている個人情報や配送先住所をECサイトの会員情報や配送先住所に反映させて決済させる機能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210396/2f31856c-f4e4-9b42-c5f1-0f46a3735b9b.png)

## コンバージョンアップのポイント
煩わしい個人情報や住所入力をスキップし画面遷移数を減らすことでコンバージョンに寄与します。

## 実装方法
[API決済のベストプラクティス](https://qiita.com/PPJP/items/db5c57991c2c3fe80ac7#%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9)の「PayPalアカウントの個人情報や配送先住所を取得する方法」に従ってPayPalの登録情報を取得し、ECサイトに反映させます。

## 住所連携についての補足
PayPalの登録住所を利用しない場合は、ECサイトで入力された配送先住所をPayPalに反映させ、両者を一致させることを推奨します。**売り手保護**の条件となります。
[API決済のベストプラクティス](https://qiita.com/PPJP/items/db5c57991c2c3fe80ac7#%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9)の「住所連携方法」を参照してください。

**PayPalが利用可能な主要なECプラットフォームには、上記のショートカット決済と住所連携機能が両方実装されており、柔軟な決済フローによるコンバージョンアップの施策がなされています。**

一般的に、

ショートカット決済：PayPalアカウント保有者向け
ECサイトの住所連携：PayPalアカウントをこれから作成する人向け

という使い分けになります。

# 関連ページ
- [PayPal API決済の実装方法](https://qiita.com/PPJP/items/db5c57991c2c3fe80ac7)
- [PayPal 銀行口座決済のベストプラクティス](https://qiita.com/PPJP/items/f43c1aa5d2e7223cd154)
【hadoop】chmod: 〜〜〜 Cannot set permission for /var/log/hadoop-yarn. Name node is in safe mode.とでた

## 事象
YARNで使うディレクトリだとかを作成するために、
sudo /usr/lib/hadoop/libexec/init-hdfs.sh
を実行したところ、
chmod: 〜〜〜 Cannot set permission for /var/log/hadoop-yarn. Name node is in safe mode.
というメッセージがでた。
どうやらnamenodeが何かの拍子にsafeモードになってしまっていることが原因。


## 解決策
sudo -u hdfs hdfs dfsadmin -safemode leave
と言うかたちでsafeをleaveさせてあげることで解決
Safe mode is OFF
こんなメッセージがでればOK
NativeBaseでのRoboto_mediumフォントの読み込みに関するErrorについて

# 問題
https://facebook.github.io/react-native/docs/getting-started.html
https://docs.nativebase.io/docs/GetStarted.html
の手順でReact NativeとNative BaseをインストールしてExpoで動作確認しようとすると、
`fontFamily 'Roboto_medium' is not a system font and has not been loaded through Exponent.Font.loadAsync.`
というErrorが出たため、

https://docs.nativebase.io/docs/GetStarted.html
を参考に以下のコードをApp.jsに追加したものの解決せず、
`You started loading 'Roboto_medium', but used it before it finished loading`
という別のErrorが出てしまいました. 

``` App.js
async componentWillMount() {
  await Expo.Font.loadAsync({
    'Roboto': require('native-base/Fonts/Roboto.ttf'),
    'Roboto_medium': require('native-base/Fonts/Roboto_medium.ttf'),
  });
}
```

# 解決策
最終的には、
https://github.com/GeekyAnts/NativeBase/issues/1041
https://github.com/GeekyAnts/NativeBase-KitchenSink/blob/master/src/boot/setup.js
https://docs.expo.io/versions/latest/guides/using-custom-fonts.html
の3つを参考に、`App.js`を以下のように変更すると上手くいきました. 

``` App.js
import React, { Component } from 'react';
import { View } from 'react-native';
import { Container } from 'native-base';

export default class App extends Component {
  constructor() {
    super();
    this.state = {
      isReady: false
    };
  }
  componentWillMount() {
    this.loadFonts();
  }
  async loadFonts() {
    await Expo.Font.loadAsync({
      Roboto: require("./node_modules/native-base/Fonts/Roboto.ttf"),
      Roboto_medium: require("./node_modules/native-base/Fonts/Roboto_medium.ttf"),
    });
    this.setState({ isReady: true });
  }

  render() {
    if (!this.state.isReady) {
      return <Expo.AppLoading />;
    }

    return (
      <Container>
        {/* fontのloadが終了した際にレンダリングしたいものをここに書く */}
      </Container>
    );
  }
}

```
structのclone

# structのclone

logging library zapで利用されているのを見つけました
https://github.com/uber-go/zap/blob/master/logger.go#L251-L253

## sample

```go:main.go
   import "github.com/davecgh/go-spew/spew"
   
   type A struct {
   	a string
   }
   
   func (a *A) clone() *A {
   	copy := *a
   	return &copy
   }
   
   func main() {
   	org := &A{"hoge"}
   	clone := org.clone()
   
   	spew.Dump(org)
   	spew.Dump(clone)
   }
```

## output

```
(*main.A)(0xc42000e280)({
a: (string) (len=4) "hoge"
})
(*main.A)(0xc42000e290)({
a: (string) (len=4) "hoge"
})

```
【Swift】UIActivityIndicatorViewを使う【ぐるぐる】

# １．はじめに
　非同期の処理を行っていることをユーザーにお知らせするために使うぐるぐる。
　使い方とカスタマイズを簡単にまとめます。

# ２．環境
Xcode Version 9.2
Swift Version 4.0.3

# ３．プロパティ説明
　`UIActivityIndicatorView` のプロパティとその初期値をまとめます。

| プロパティ   | 説明        | 初期値 |
|:------------|:---------------------------|:-------------|
| isAnimating | アニメーションしているかどうか  | false         |
| hidesWhenStopped | アニメーションしていない時に非表示にするかどうか | true |
| activityIndicatorViewStyle | アクティビティインディケータのスタイルを指定する。`.whiteLarge`, `.white`, `.gray` から選択| .white |
| color         | アクティビティインディケータの色を指定する。`activityIndicatorViewStyle` よりも後に設定しないと効果がない | UIColor.white           |

# ４．使い方

- グローバル変数に`UIActivityIndicatorView` のインスタンスを定義

```swift
var activityIndicatorView = UIActivityIndicatorView()
```

- `viewDidLoad` などで初期設定
  
```swift
override func viewDidLoad() {
    super.viewDidLoad()

    activityIndicatorView.center = view.center
    activityIndicatorView.activityIndicatorViewStyle = .whiteLarge
    activityIndicatorView.color = .purple

    view.addSubview(activityIndicatorView)
}
```

- `activityIndicatorView.startAnimating()` でアニメーション開始

- `activityIndicatorView.stopAnimating()` でアニメーション終了

# ５．アニメーションの開始／終了はメインスレッドで

タイトルの通り。アニメーションの開始／終了はメインスレッドで行います。

```swift

// アニメーション開始
activityIndicatorView.startAnimating()

DispatchQueue.global(qos: .default).async {
    // 非同期処理などを実行（今回は５秒間待つだけ）
    Thread.sleep(forTimeInterval: 5)

    // 非同期処理などが終了したらメインスレッドでアニメーション終了
    DispatchQueue.main.async {
        // アニメーション終了
        self.activityIndicatorView.stopAnimating()
    }
}

```

# ６．コード全体
　例として、ボタンでアニメーションの開始／終了を制御するコードを載せます。
　紫色のアクティビティインディケータを表示しています。
　「スタート」ボタンをタップするとアニメーションが開始し、５秒後にストップします。
　アニメーション中に「ストップ」ボタンをタップすると、５秒待たずにストップします。

```swift
class ViewController: UIViewController {
    var activityIndicatorView = UIActivityIndicatorView()

    @IBAction func startActivityIndicator(_ sender: UIButton) {
        activityIndicatorView.startAnimating()
        
        DispatchQueue.global(qos: .default).async {
            // 非同期処理などを実行
            Thread.sleep(forTimeInterval: 5)
            
            // 非同期処理などが終了したらメインスレッドでアニメーション終了
            DispatchQueue.main.async {
                // アニメーション終了
                self.activityIndicatorView.stopAnimating()
            }
        }
    }
    @IBAction func stopActivityIndicator(_ sender: UIButton) {
        activityIndicatorView.stopAnimating()
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .lightGray
        activityIndicatorView.center = view.center
        activityIndicatorView.activityIndicatorViewStyle = .whiteLarge
        activityIndicatorView.color = .purple
        
        view.addSubview(activityIndicatorView)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}


```

シミュレータで実行。
![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/124577/df912ac3-068b-856c-4e29-8edbfb953406.png)


間違っている点や改善点などありましたら、ぜひフィードバックをお願いします。
Rails5 でfriendly_idを入れてからマイグレーションに失敗する時 when we failed to migrate because of friendly_id, how to solve the problem on Rails5

## エラー Error
```
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:

  class CreateFriendlyIdSlugs < ActiveRecord::Migration[4.2]
/home/ekrem/Projects/ekomerz/db/migrate/20170308164827_create_friendly_id_slugs.rb:1:in `<top (required)>'
/home/ekrem/Projects/ekomerz/bin/rails:9:in `require'
/home/ekrem/Projects/ekomerz/bin/rails:9:in `<top (required)>'
/home/ekrem/Projects/ekomerz/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
StandardError: Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Rails release the migration was written for:

  class CreateFriendlyIdSlugs < ActiveRecord::Migration[4.2]
/home/ekrem/Projects/ekomerz/db/migrate/20170308164827_create_friendly_id_slugs.rb:1:in `<top (required)>'
/home/ekrem/Projects/ekomerz/bin/rails:9:in `require'
/home/ekrem/Projects/ekomerz/bin/rails:9:in `<top (required)>'
/home/ekrem/Projects/ekomerz/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
```
## 解決策 Soloution
ただ`[5.1] `をマイグレーションファイルに追加するだけ

Just add `[5.1] ` to the code below in the migration file.

前　before
`class CreateFriendlyIdSlugs < ActiveRecord::Migration`
後　after 
`class CreateFriendlyIdSlugs < ActiveRecord::Migration[5.1]`

[参考 reference](https://github.com/norman/friendly_id/issues/797)
VBA の関数

何度も同じ処理を実行する場合はそれを一塊にまとめ呼び出す事で簡潔に記述が可能である。

処理を纏めた物はプロシージャと呼ばれる使い方は次の通り。

```vbnet
    Sub 呼び出し()
        プロシージャ
    End Sub

    Sub プロシージャ()
        '処理
    End Sub
```

プロシージャが受け持つ処理に戻り値がほしい場合は広域変数等を通じて示す事になる。

```vbnet
    Dim 返り値
    Sub 呼び出し()
        プロシージャ 123
        MsgBox 返り値
    End Sub

    Sub プロシージャ(引数)
        '処理
        返り値 = 引数 + 1
    End Sub
```

非常に煩雑で理解が難しくなるため通常は関数プロシージャを利用する。

```vbnet
    Sub 呼び出し()
        結果 = プロシージャ(123)
        MsgBox 結果
    End Sub

    Function プロシージャ(引数)
        '処理
        プロシージャ = 引数 + 1
    End Function
```

* VBA ではプロシージャ名に値を代入する事で返り値となる。 (他の言語では return か最終式結果を利用するものが多い)
* Function の返り値は呼び出し元で値を代入するかIf文などで評価する必要がある。 (他の言語では無視可能が多い)
* プロシージャ(...) -- 関数形式で呼び出す、戻り値を使う。
* プロシージャ ... -- 戻り値は使わない
* Call プロシージャ(...) -- 関数形式で呼び出す、戻り値は使わない。
[2018年1月時点] Rails5 Herokuでrake:db migrateが出来ない場合(pg関係でエラー)

<h2>問題発生までの流れ</h2>
昨日時点(2018/1/24)でRailsアプリをHerokuにデプロイ後にrake:db migrateでエラーが出たときの解決方法のメモ。

エラーログを見ると「pgがインストールできない」というメッセージが出たが、つい先日まで他のアプリでは問題なかった。

今回問題となったアプリは最近作ったもので、そこが原因だった。

<h2>問題の原因</h2>
結論から言うと、pgのバージョンが 1.0.0でこれを 0.20.0（たぶん1.0.0以下ならok）に指定したらすんなりHerokuで通りました。

pgのアナウンス（2018/1/10にアップデートしている模様）
https://rubygems.org/gems/pg/versions/0.18.4

短期間でしょうが、同じトラブルに遭う方がいると思いますので、備忘録として投稿します。
文字列が中国語（簡体字）かどうか雑に判定する

## 動機
ここしばらくアルバイトでWebクローリングのようなことをやっているんだけど，回しているとクローラが結構な確率で中国語のウェブページを取ってくる．
そうして取ってきたページは時折悪質なリンクを含んでいるために，クローラがそのようなリンクを踏んでしまって，同様に悪質な（中国語の）ウェブページばかりを取ってくる事態に陥ってしまう．
クローリングの目的を達成するために中国語のウェブページを巡回する必要はなさそうなので，中国語のウェブページを検出して弾きたいと思った．

## （ちなみに）今まで取っていた手法
今まではHTTP/HTMLのヘッダや `chardet` などのライブラリを用いて文字コードの判別をすることで中国語のウェブページかどうかを判別していた．

しかし世の中は少しずつ良くなっており，その一環として世界中のウェブページの文字コードがUTF-8に統一されつつある．
大変に結構なことではあるのだが，そのせいで文字コードによる言語判定ではうまく回らなくなってきた．
そこでもう少し直接的なアプローチを取りたい．

## 今回の解決策
とりあえずコードはこんな感じ．

```python
def is_zh(in_str):
    """
    SJISに変換して文字数が減れば簡体字があるので中国語
    """
    return (set(in_str) - set(in_str.encode('sjis','ignore').decode('sjis'))) != set([])
```

コメントに書いた通りだが，考え方としては入力で渡されるstr型の変数をSJISに変換する段階でSJISに含まれない簡体字が削除されることを利用する．

当初はfilterを使ってASCII文字を抜いたりとか，扱いに慣れてるlist型での処理からset型への変換とか，色々してたんだけどそういう不要なものを削っていったら随分とシンプルなものにまで収束してしまった．

何か問題があったら（やさしく……）教えていただけると非常に嬉しいです．

## 参考
- [中国語判定(というか除外)したいという話](http://d.hatena.ne.jp/showyou/20110131/1296490644)
直接SQLでconfig指定以外のDBアクセスをする

config/*.exsに指定する接続先DB以外のDBも、普通にselectできる

```elixir
	def a(), do: "select * from a.users" |> query
	def b(), do: "select * from b.users" |> query
	def query( sql ) when sql != "" do
		{ :ok, result } = Ecto.Adapters.SQL.query( Livery.Repo, sql, [] )
		result
	end
```

なので、こんな感じでDB指定する関数化もできる

```elixir
	def users( db ), do: "select * from #{ db }.users" |> query
	def query( sql ) when sql != "" do
		{ :ok, result } = Ecto.Adapters.SQL.query( Livery.Repo, sql, [] )
		result
	end
```

これとマルチプロセスやFlowをうまく組み合わせると、簡単な並行DBアクセスくらいは作れそう
Chrome 読書メモ

Chrome 関連技術の読書メモです。

## 構造

* [Getting Around the Chromium Source Code Directory Structure](http://www.chromium.org/developers/how-tos/getting-around-the-chrome-source-code)
    * ソースコードの構成
* [Multi-process Architecture](http://www.chromium.org/developers/design-documents/multi-process-architecture)
    * プロセス分割の仕組み
    * ![Architectural overview](http://www.chromium.org/_/rsrc/1220197832277/developers/design-documents/multi-process-architecture/arch.png)
    * Browser プロセス: 描画以外のブラウザ UI。ネットワーク等の IO も Browser プロセスで行う。
    * Render プロセス: 各タブの描画を行う。
* [How Chromium Displays Web Pages](http://www.chromium.org/developers/design-documents/displaying-a-web-page-in-chrome)
    * もうちょっと詳しいプロセス分割の仕組み。各モジュールがどのようにしてページを表示するか。
        * ![Conceptual application layers](https://docs.google.com/drawings/pub?id=1gdSTfvLxbJDbX8oiWo5LTwAmXmdMQvjoUhYEhfhj0-k&w=473&h=211)
    * IPC は named pipe で実装されている。
    * Browser プロセス
        * ![Browser Process](http://www.chromium.org/_/rsrc/1220197831473/developers/design-documents/displaying-a-web-page-in-chrome/rendering%20browser.png)
        * RenderProcessHost が Render プロセスを管理
        * Render プロセスのネットワーク要求は ResourceMessageFilter が振り分けて Browser プロセスで実行
    * Render プロセス
        * ![Render Process](http://www.chromium.org/_/rsrc/1342584100941/developers/design-documents/displaying-a-web-page-in-chrome/Renderingintherenderer-v2.png)
        * RenderProcess が Browser プロセスを管理
* [Content module](http://www.chromium.org/developers/content-module)
    * ![Architectual Diagram](http://www.chromium.org/_/rsrc/1308680052371/developers/content-module/Content.png)
    * Chrome の大まかな構造。ウェブサイトを表示する必要最低限の
        * chrome: chrome アプリ全体。拡張機能やスペルチェックを含む。
        * content: ブラウザ基本機能。Electron などはこれを使って描画している。
* [Content API](http://www.chromium.org/developers/content-module/content-api)
    * ざっくりした紹介のみ。実際は [content/public](https://cs.chromium.org/chromium/src/content/public/) にある。
* [How to Add New Features](http://www.chromium.org/developers/design-documents/multi-process-architecture/how-to-add-new-features)
    * 新しい機能の追加方法。難しい。
* [blink](https://www.chromium.org/blink)
    * 描画部分本体。
* [Inter-process Communication](http://www.chromium.org/developers/design-documents/inter-process-communication)
* [Multi-process Resource Loading](http://dev.chromium.org/developers/design-documents/multi-process-resource-loading)
    * ![Resource-loading](http://dev.chromium.org/_/rsrc/1220197833456/developers/design-documents/multi-process-resource-loading/Resource-loading.png)
* [Threading and Tasks in Chrome](https://chromium.googlesource.com/chromium/src/+/master/docs/threading_and_tasks.md)
    * Chromium  で使われているスレッド用のユーティリティ
* [Mojo](https://chromium.googlesource.com/chromium/src/+/master/mojo/README.md)
    * Chromium で使われる IP プロトコル

## ビルドツール

* [Using depot_tools](https://www.chromium.org/developers/how-tos/depottools)
    * gclient や repo 等ツールの紹介
* [gn](https://chromium.googlesource.com/chromium/src/tools/gn/)
    * ninja を駆動するツール
* [ninja](https://ninja-build.org/manual.html)
    * Make よりも速いビルドツール
Perl で (a == 1 && a == 2 && a == 3) を true にしてみる

Perl だと [Morichan](https://qiita.com/Morichan/items/4894d7d92ecab7a3afd8) さんが諸々書いていますね!

自分が書いたのは tie を使ったパターン

```perl
package Incr;
require Tie::Scalar;
@ISA = qw(Tie::StdScalar);

sub FETCH { ++$$_[0] }

package main;
use Test::More tests => 1;

tie my $a, Incr, 1;
ok $a == 1 && $a == 2 && $a == 3;
```

Stackoverflow にあった回答に近い雰囲気かな
VBA の条件分岐

# 条件分岐

ある条件によって処理を変える場合は条件分岐を使う。

```vbnet
	If 式 Then
		'式が真の時の処理
	End If
```

偽の処理が必要なら Else を次のように記述する。

```vbnet
	If 式 Then
		'式が真の時の処理
	Else
		'式が偽の時の処理
	End If
```

もしくは以下のように記述する、否定式が理解しやすい場合のみ使うべきである。

```vbnet
	If 否定式 Then
		'否定式が真の時の処理
	Else
		'否定式が偽の時の処理
	End If
```

連続して式を評価する場合は次のように記述する。

```vbnet
	If 式 Then
		'式が真の時の処理
	ElseIf 式2 Then
		'式2が真の時の処理
	Else
		'式,式2が偽の時の処理
	End If
```

多重に書く事も可能である、あまりにも多重な表記は避けるべきである。 (4階層以上はソースから悪い匂いが出るので止めた方が良い、時として焦げたものも喰うのが仕事でもある。)

```vbnet
	If 式 Then
		'式が真の時の処理
		If 式2 Then
			'式2が真の時の処理
		End If
	End If
```

式は論理式でなくてもよい、式の結果が数値型であるなら得られた値は論理値へ暗黙的に変換されて評価される。 VBA では計算や比較もしない値(例えば 1)だけであっても式である為、次のように書ける。　別段処理上のメリットはないが処理がそこで分かれている事を強調する事が出来る。

```vbnet
	if 1 Then
		'式が真の時の処理
	End if
```

実行したくない処理はコメントにする事があるが次のようにも書ける。

```vbnet
	if 0 Then
		'実行されない処理
	End if
```

このように書くメリットは処理が VBA の文法としてチェックされる事にある。

他の言語では空の文字列を False 空でない文字列を True と扱えたりするが VBA は明示的に式で比較する必要がある。

```vbnet
	' 文字列が空の場合
	If s = "" Then
	End If
	' 文字列が空でない場合
	If s <> "" Then
	End If
```

VBA には文字列や数値型等から論理型へ暗黙的変換する規則があり次のようにも書ける。

```vbnet
	If "1" Then
	End If
	If "True" Then
	End If
```

詳しくは変換規則情報を参照してほしい。

# 条件分岐が多い場合

条件分岐が多重な場合は記述が楽なる Select [^1] 記法がある。

```vbnet
	Select Case 式
	Case 1
		' 式が1の処理
	Case 2, 3
		' 式が2か3の処理
	Case Is < 5
		' 式が5未満の処理
	Case 10 To 20 
		' 式が 10 から 20 の処理
	Case Else
		' 条件不成立の処理
	End Select
```

[^1]:
 他の言語では switch case break が使われる。
dotinstall で勉強している初心者がVue.jsの公式ガイドを勉強するメモ Vue インスタンス編

# Vue インスタンス
## 今回のお題は、こちらです
* https://jp.vuejs.org/v2/guide/instance.html


* インスタンスの説明は、ガイド本文を読むのが適切なので、scriptの検証と結果だけつらつらと書いていきます。
* そして、いままで両方の環境を掲載していましたが、比較する意味がない場合、検証しやすいまたは、楽が出来る方のみを掲載したいと思います。


## データとメソッド
* データとメソッド


* index.html

``` html
<!DOCTYPE html>
<html>
<head>
  <title>Welcome to Vue</title>
  <script src="https://unpkg.com/vue"></script>
  <style>
    [v-cloak] { display:none; }
  </style>
</head>
<body>
  <div id="app">
  </div>

  <script>
    let data = { a: 1}

    var app = new Vue({
      el: '#app',
      data: data
    })

    console.log(app.a === data.a)
    app.a = 2
    console.log('data.a', data.a)
    data.a = 3
    console.log('app.a', app.a)
    console.log(app.a === data.a)
    
  </script>
</body>
</html>
```
* 検証結果はでていますが、実際試してみます.
* jsの基礎のところで習う、オブジェクトは参照値ですから、Vueで扱うときも参照値ですとの説明でしょうか。
* そして、dataに登録されていない、値は変化してもリアクティブにならないので、空でも登録しなさいとの説明,inputタグの値などの事を指しているんでしょうね。

### Object.freeze（）

* App.vue

``` html
<template lang="pug">
  #App
    p {{ foo }}
    button(@click="foo = 'bug'") click!
</template>

<script>

const obj = { foo: 'bar' }
// Object.freeze(obj)
Object.freeze(obj)

export default {
  name: 'app',
  data () {
    return obj
  },
}

</script>

<style>
省略

```
* Object.freeze()自体は、JSの基本機能で、値の書き換えを許可しないものですね。
* ですから、設定してあると、ボタンをクリックしてもリアクティブしないということですね。
* ＠clickは、　v-on:clickを書くのが面倒になってきたので、うれしいです。
* `v-vind: -> :  ` 同じく面倒になったら、使うみたいです, 次回から使います。

### $
* Vueインスタンスが予め定義しているのがわかるように記号を割り当てています、これが頭についているものはVueインスタンスのプロパティかメソッドですとのこと。

* index.html

``` html
<!DOCTYPE html>
<html>
<head>
  <title>Welcome to Vue</title>
  <script src="https://unpkg.com/vue"></script>
</head>
<body>
  <div id="app">
    <div>{{ a }}</div>
    <button @click="a += 1">click!</button>
  </div>

  <script>
    var obj = { a: 1 }
    var app = new Vue({
      el: '#app',
      data: obj,
      methods: {
        humanizeURL: function (url) {
          return url
            .replace(/^https?:\/\//, '')
            .replace(/\/$/, '')
        }
      }
    })

    console.log(app.$data.a === obj.a)
    console.log(app.$el === document.getElementById('app'))
    console.log(app.$data === obj)
    app.$watch('a', function(newValue, oldValue) {
      console.log('NewValue', newValue, 'OldValue', oldValue)
    })

    
  </script>
</body>
</html>


```

* 検証結果はでていますが、自分で確認しておきます。
* $watchは、値が変わったのを検知したときに、発火するみたいですね、たしかにclickしたときに、ログが流れています。
* 後、頻繁にアロー関数はつかうなと警告が出ています。 アロー関数は便利ですが、thisの挙動がよくわかっていない初心者は素直に従ったほうがいいみたいです。　次回からはアロー関数はたまに使うぐらいにします。
* 入門系は、functionから始まる事が多い関数の書き方は、実際複数あります、できるだけすっきり書きたいので、省略系になります。　最初違和感がでますが、慣れてきます。
* 今回は短いですが、区切りなので、Git commitして、終わりにしたいと思います。
VBA のループ

VBAには処理を繰り返し処理に使える記法が３つある。

# for ループ

標準的なループには For を使う変数 i が 1 から 10 変化しつつ繰り返す処理は次のように記述する。 [^1]

```vbnet
    For i = 1 To 10
        '処理
    Next i
```

数値を飛ばしながら繰り返し処理をするなら Step を記述する。

```vbnet
    For i = 1 To 10 Step 2
        '処理
    Next i
```

逆の場合は次の様になる。

```vbnet
    For i = 10 To 1 Step -1
        '処理
    Next i
```

もちろん始まりの数、終わりの数は整数リテラルでなくてもよい。

```vbnet
    For i = 式1 To 式2
        '処理
    Next i
       
    For i = 式1 To 式2 Step 式3
        '処理
    Next i
```

歴史的な慣例により変数名に i j k などが利用される、もちろん処理の理解を助ける任意の名前でもよい。 If と同じように For もネストして書いてよいが変数を分ける必要がある、対になる Next に変数名を記述する。 ちぐはぐにしてはいけない。

```vbnet
    '処理
    For i = 1 To 10
        '処理
        For j = 1 To 10
            '処理
        Next j
        '処理
    Next i
```

# do ループ

do ループには do while と do until がある。 do until は do while と条件が逆になってだけである、成立したら処理を行うという一貫性を維持するなら do until は利用しない方が良いだろう。

式が真の場合に繰り返し処理がしたい場合は次のように記述する。

```vbnet
    Do While 式
        '処理
    Loop
```

上記では先に式が評価される為、時によっては一度処理される方が都合がよい場合があるがその時は次のように記述する。

```vbnet
    Do
        '処理
    Loop While 式
```

# For Each ループ

VBA には連続した値を返す機構がありその機能によるループが行える。

```vbnet
   Dim sheet As Worksheet
   For Each sheet In Worksheets
      '処理
   Next sheet
```

# ループの脱出

何かしらの条件が成立したらループを終えたい場合には脱出用の記述を行う。 VBA ではループの種類で記述方法が変わる。

For から抜ける場合は Exit For を使う。

```vbnet
    For i = 1 To 10
        If 式 Then
            Exit For
        End If
    Next i
```

Do から抜ける場合は Exit Do を使う。

```vbnet
    Do While 式
        If 式 Then
            Exit Do
        End If
    Loop
```

ネストしたループから一気に脱出場合は GoTo を使う。

```vbnet
        '処理
        For i = 1 To 10
            '処理
            For j = 1 To 10
                If 式 Then
                    Goto ラベル
                End If
            Next j
            '処理
        Next i
    ラベル:
```

GoTo はあらゆる所へ処理の移動をすることが出来る為、このようなループ脱出やエラー処理時のみ利用すべきである。
Echo で HTTP リクエストヘッダをミドルウェアでダンプする

Echo で実装した Web アプリケーションにおいて、リバースプロキシ経由のアクセスで `X-Forwarded-For` ヘッダが付いているか確認するために HTTP リクエストヘッダを標準出力にダンプする処理をミドルウェアで書いた。

ミドルウェアは、無名関数でサクッと書けるので便利。

```go
package main

import (
	"github.com/labstack/echo"
	"fmt"
	"log"
	"os"
)

func main() {
	e := echo.New()
	e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
		return func(c echo.Context) error {
			if err := next(c); err != nil {
				c.Error(err)
			}

			output := fmt.Sprintf("%#v", c.Request().Header)

			os.Stdout.Write([]byte(output + "\n"))
			return next(c)
		}
	})

	log.Fatal(e.Start(":9001"))
}
```

ローカルで実行して、ブラウザでアクセスすると下記のように出力される。

```
http.Header{"Cache-Control":[]string{"max-age=0"}, "User-Agent":[]string{"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}, "Accept":[]string{"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"}, "Accept-Encoding":[]string{"gzip, deflate, br"}, "Accept-Language":[]string{"ja,en-US;q=0.9,en;q=0.8"}, "Connection":[]string{"keep-alive"}, "Upgrade-Insecure-Requests":[]string{"1"}}
```
Sparkチートシート

###カラムが存在するかどうか知りたいとき
```python3
def has_column(df, col):
    df.createOrReplaceTempView('df')
    try:
        spark.sql("""select {0} from df""".format(col))
        return True
    except :
        return False

if has_column(dataframe, "hogehoge"):
    print("yes")
else:
    print("no")
```

###pythonライブラリを全ノードに配布したいとき
必要なpyをdependencies.zipに圧縮する。このとき、ライブラリがdependencies.zipのトップに来るようにすること

```shell
spark-submit --py-files dependencies.zip main.py
```
次のようにすると全ノードにpip install したものを配布できる
https://stackoverflow.com/questions/36461054/i-cant-seem-to-get-py-files-on-spark-to-work
http://blog.danielcorin.com/code/2015/11/10/pyspark.html

```shell
pip install -t dependencies -r requirements.txt
cd dependencies
zip -r ../dependencies.zip .
```
【PostgreSQL】(pg_dump)リモートサーバーへ接続してバックアップ

#### バックアップ

PostgreSQLでは、DBの構成やデータをバックアップする時に、デフォルトでDBデータがcopyコマンドでバックアップします。
だが、バックアップしたSQLスクリプトを用いて、その他のソフトウェア（例え、A5M2で実行う）で流して実行したいですが、DBデータ挿入のcopyコマンドが認識できなくて、コピーペースト職人として、DBデータが一個一個でテーブルに反映することになっちゃって、結構面倒くさいことになります。

というところで、今回copyコマンドではなく、insertコマンドでDB構成（DBデータを含む）をバックアップする方法を紹介させていただきます。

```postgresql-console
/* Windows CMDを起動して、Postgresqlのインストール先へ移動(psql.exeである場所) 
*     console result：C:\PostgreSQL\9.4\bin>
*/
cd C:\PostgreSQL\9.4\bin

/* Postgresqlの環境設定を確認(念のため) 
*     console result：psql (PostgreSQL) 9.4.1
*/
C:\PostgreSQL\9.4\bin>psql -V

/* リモートサーバーを接続してバックアップ 
*     param：
*     -h：HOSTNAME
*     -p：port
*     -U：username
*     -d：database name
*     --inserts：dump the data by [insert] command, not by the default option [copy]
*     -f：file name or the directory
*     
*     console result：C:\PostgreSQL\9.4\bin>
*/
C:\PostgreSQL\9.4\bin>pg_dump -h localhost -p 112 -U myuser -d myDB --inserts -f D:\myDB_20180125.dump

/* pg_dump　ヘルプ 
*     tips：バージョンによりオプションが違いので、是非ヘルプにチェックしましょう
*/
C:\PostgreSQL\9.4\bin>pg_dump --help

```

#### 注意点

postgreSQLバージョンによりコマンドのオプションが違いので、是非ヘルプにチェックしましょう。


以下のサイトから参考になりました。ありがとう！

*参考*
[PostgreSQL 8.2.6文書 pg_dump](https://www.postgresql.jp/document/8.2/html/app-pgdump.html)
[DBデータのバックアップとリストア](https://www.two-ways.com/mt/usakorog/2011/10/db-2.html)
Spark に break point を貼って Debug する方法

# はじめに
Sparkを使っていて以下のような辛さがありました。

* Hyper Parameter を少しずつ変えてチューニングしたいだけなのに、そこに至るデータ処理に時間がかかりすぎて何度もトライするのが辛い。
* spark-shell でもまぁデバッグできなくは無いんだけど、デバッグしたい箇所に至るまでのステップをshellに打ち込むのが面倒。
* あぁ Spark でも break point 貼れたらなぁ…

この記事はそんな辛さを解消する記事です。

# まとめ
簡単な話なので先にまとめると、

* `spark-submit` 時に `SPARK_SUBMIT_OPTS` に `jdwp` の設定を入れて起動
* Intellij の Remote Debugger 機能で break point を貼る

と言うものです。

# おことわり
* この記事は Intellij で Debug する方法を書いていますが、eclipse でも使えます。
* 個々の技術の説明はしません。

# Step1: Intellij で Remote Debugger の設定をする

1.「Run」->「Edit Configuration」で設定画面を開く ![image.png](https://qiita-image-store.s3.amazonaws.com/0/24710/cfdec58a-6c34-0e97-0c44-08420339da04.png)
2. 「+」->「Remote」で Remote Debugger の設定を開く ![image.png](https://qiita-image-store.s3.amazonaws.com/0/24710/febcad26-d3de-7f78-718b-67a1971a861f.png)
3. Name には好きな名前、Host には `spark-submit` する Host の IP を書きましょう。 `Command line arguments for running remote JVM` という項目に書かれている設定は後ほど使用するのでコピーしておいてください。 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/24710/41c8ade7-24b8-6e80-c5e4-3cf7efcbe3b5.png)
4. 「OK」を押して設定を Save する。

以上で Remote Debugger を起動する準備ができました。

# Step2: Remote Debug 可能な設定をして`spark-submit`する

1. `SPARK_SUBMIT_OPTS` という環境変数に Step1 でコピーした `jdwp` の設定を入れる。
   * `export SPARK_SUBMIT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005`
2. `spark-submit` を実行する

# Step3: Remote Debugger を実行した Spark に接続する

1. 「Run」-> 「Debug 'さっき付けた名前'」で Remote Debugger を実行する ![image.png](https://qiita-image-store.s3.amazonaws.com/0/24710/0de481ea-cfb2-7ef1-56df-7e6313214b27.png)
    * この時、`spark-submit` されていなければ `ConnectException` が発生します ![image.png](https://qiita-image-store.s3.amazonaws.com/0/24710/229ff889-d00f-d139-e023-7f641632f941.png)
2. 正しく接続されたら `Connected to target VM, address: 'さっき指定したホスト:5005', transport: 'socket'` と出ます。（Sparkを別サーバーで動かしたのでIPが変わっていますが無視してください…）![image.png](https://qiita-image-store.s3.amazonaws.com/0/24710/ec2551c9-7d41-f379-411f-bb47b74b4fa3.png)
3. break point を貼ります
    * Spark の処理が進んでしまうと再実行が必要になるので事前に貼っておいたほうが無難です。
4. break point を貼った箇所で止まるので debug します。 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/24710/91e4dd90-3d4b-ff60-fa78-7ee4b35824a4.png)
5. 「Evaluate Expression」から `DataFrame` (この画像では `testTrainee` が `DataFrame` )の操作もできます ![image.png](https://qiita-image-store.s3.amazonaws.com/0/24710/5e0f959b-2398-d195-ef21-0cbc7ad98de9.png)

# 以上
Spark で扱うデータはLocalで扱える量ではないケースがほとんどなので、こういった Remote Debug ができるのは非常に便利ですね。
[ActionMailer]添付ファイルの有無にかかわらずメールの本文を取得する

## 概要
ActionMailerで送信したメールの本文を添付ファイルの有無にかかわらず取得します[^1]。

メール本文の内容をテストするときなどにお使いください。

[^1]: テキストとHTMLのマルチパートであることを想定しています。マルチパートでないメールが飛ぶ可能性があるともう少し考えることが増えます

## コード
```ruby
def get_mail_body(mail)
  parts = mail.body.parts

  # partsにさらにマルチパートメールが含まれる（＝添付ファイルがある）場合はメール部分のみを取得
  if parts.map(&:multipart?).inject(:|)
    multipart_mails = parts.find(&:multipart?).parts 
  else
    multipart_mails = parts
  end
  
  # テキストメールの本文を取得して返す
  multipart_mails.find{|part| part.content_type.match 'text/plain'}.body.raw_source
end

mail = HogeMailer.send_mail.deliver
body = get_mail_body(mail)
```

### 解説
``Mail::Message``のインスタンスは``parts``という配列を持っています。ここに格納されるのは、

* **添付ファイルがない**場合
    * テキストとHTMLのメール
* **添付ファイルがある**場合
    * メールの配列[^2]
    * 添付ファイル

になります。

[^2]: 添付ファイルがない場合の``parts``とほぼ同様のもの

ですから、メール本文を取得しようと思うと、**添付ファイルの有無で調べなくてはならない配列の深さが変わり**ます。

ところで、``parts``の成分はすべて``Mail::Part``というラッパーのインスタンスになっており、``Mail::Part#multipart?``を叩くとメールの配列であるかどうかを真偽値で返してくれます。

これを利用して**``parts``の各要素に対して``multipart?``を実行して論理和を取れ**ば、``parts``にメールの配列があるかどうかわかるという寸法です。

### ちなみに
if文の部分はワンライナーでも書けます。見づらいですけど。

```ruby
multipart_mails = (parts.map(&:multipart?).inject(:|) ? parts.find(&:multipart?).parts : parts)
```

## バージョン
* Ruby 2.2.6
* Rails, ActionMailer 3.2.22.5

古い環境で調べたので最新の環境で動くかはわかりません（変わったことはしてないので動くと思いますが……）。
angular4 + onsen ui + @angular/material 

# 目的
 - angular5が出ているのに今更、 `angular4 + onsen ui` のアプリケーションに `@angular/material `を入れたい

# ちょっとハマったこと
 - angular5が出ている状態だと `@angular/material` の最新版がインストールされて、 `requires a peer of @angular/core@~5.1.0 but none is installed. You must install peer dependencies yourself.` って言われる
 - angular5にあげると、 `ngx-onsenui` がアップデートするなと吠えてくる

# 解決
 - `ngx-onsenui` が吠えてこないangular4に対応している `@angular/material` を インストールする

# 結果
```
  "devDependencies": {
    "@angular/cdk": "^2.0.0-beta.12",
    "@angular/cli": "^1.5.3",
    "@angular/common": "^4.2.0",
    "@angular/compiler": "^4.2.0",
    "@angular/compiler-cli": "^4.2.0",
    "@angular/core": "^4.2.0",
    "@angular/flex-layout": "^2.0.0-beta.9",
    "@angular/forms": "^4.2.0",
    "@angular/http": "^4.2.0",
    "@angular/material": "^2.0.0-beta.12",
    "@angular/platform-browser": "^4.2.0",
    "@angular/platform-browser-dynamic": "^4.2.0",
    "@ngx-translate/core": "^8.0.0",
    "@ngx-translate/http-loader": "^2.0.0",
    "@types/core-js": "0.9.35",
    "angular2-highcharts": "0.5.5",
    "core-js": "^2.5.1",
    "lite-server": "^2.3.0",
    "ngx-onsenui": "^4.1.0",
    "node-sass": "^4.7.2",
    "onsenui": "~2.5.3",
    "rxjs": "5.0.3",
    "sass-loader": "^6.0.6",
    "tslint": "^5.7.0",
    "typescript": "2.3.4",
    "webpack": "^3.8.1",
    "zone.js": "^0.8.18"
  }
```

# 参考
 - [Angular Materialでマテリアルでレスポンシブなリストを実装する](https://qiita.com/ne-peer/items/c1074bdbf752b831f749)
 - https://libraries.io/npm/@angular%2Fcdk/versions
 - https://libraries.io/npm/@angular%2Fmaterial/versions
 - https://libraries.io/npm/@angular%2Fflex-layout/versions
[JavaScript][Node.js] 配列を正規表現でフィルタする

JavaScript の配列の中身を正規表現にマッチした要素のみにフィルタする方法です。

``` filter-sample.js
let original_array = new Array('A', 'B', 'C');
let filtered_array = original_array.filter(function(value) { return value.match(/pattern/); });
```

例えば、XLSXファイルにて、testcaseで始まるシート名の配列を得るには次のようにします。
（XLSXファイルの解析には [xlsx モジュール](https://www.npmjs.com/package/xlsx)を利用しています）

``` xlsxsheet-filter-sample.js
const xlsx  = require('xlsx');
let workbook = xlsx.readFile('sample.xlsx');
let testcase_sheetnames = workbook.SheetNames.filter(function(value) { return value.match(/^testcase.*$/); });
```