OmniAICreator/Qiita-1.07M huggingface dataset:
android studio unit tests

## android studio unit tests

パソコン整理してたら、こんなこと書いてたので公開

android studioでunit testsできる環境を構築する

### 公式ページ通りにやります

https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support

### app/build.gradle

```
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.+'
```

### ディレクトリ

AndroidStudioProjects/au_wallet/app/src/test

mkdir test　する

例えばこうなる

```
~/AndroidStudioProjects/au_wallet/app/src/test
└── java
    └── jp
        └── auone
            └── wallet
                └── util
                    └── NetworkUtilTest.java
```

### ローカルでテストを動かす

#### Build Variants

![bv](http://i.imgur.com/7V4geeK.png?1)

クリックして表示します

#### Test Artifact

![Imgur](http://i.imgur.com/EBTHPYL.png?1)

Unit Testsを選択します

#### テスト実行用の設定を追加します

![Imgur](http://i.imgur.com/SZHCwUP.png?1)

Edit configurations > +ボタンで設定を増やす

JUnitを選ぶ

名前はSmallTestにしてます。

##### Configuration

* Test Kind : all in package
* Package : jp.auone.wallet
* Search for tests : In whole project

これで、設定を作成して、SmallTestを選択してる状態で再生ボタン押せば、テストがローカルで実行できます。

### 参考

http://blog.recruit-tech.co.jp/2015/08/10/android-allstars-201508/
https://github.com/hotchemi/awesome-android-testing
https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support
http://mockito.org/
http://qiita.com/asuuma/items/80169afefbe9718a9205

### なぜSmallTestって名前か

http://blog.recruit-tech.co.jp/2015/08/10/android-allstars-201508/

```
@SmallTest
純粋なビジネスロジックをテストする。対象はUtilやHelper、Model及びデータ取得の為のリポジトリ層
ライブラリ: Robolectric3, JUnit4, Mockito, AssertJ
```

```
@MediumTest
UIロジックやユーザーのアクション及びそれに伴って変化するViewの状態をテストする。対象はCustom ViewやActivity/FragmentもしくはPresenter
ライブラリ: Espresso2, AndroidTestCase, Mockito, Spoon, assertj-android
```

```
@LargeTest
「あるシナリオが実行できるか」という観点でテストする。何をアサートするかは一律に定義できないので画面のスクリーンショットを撮って人間が確認する方が無難。リグレッションテストも兼ねる。
ライブラリ: Appium, calabash-android, UI automator
```
CentOS5からCentOS6へ移行

楽しいRancherやDockerばかりではなく、こういうやりたくない地味な仕事もやりますよ。
旬な話題でしょうから人柱になります。

# 要件

現在会社で使用しているメールサーバがCentOS5なので、移行する必要がある。
移行後もユーザ（社員が）現行と変わりなく使えるように移行する必要がある。

移行先はCentOS7がいいんだろうけど、５⇒7はググってもあんまり出てこないから怖い。
６⇒７はupgradeツールがあるのでそれ使うとして、順番に５⇒６と移行して、移行先で６⇒７にupgradeしよう。

メールサーバなのでDNSの設定とかもあるけど、まずはOSのデータをちゃんと移そう。
今回はデータ移行まで。

# 環境

今回はどちらもさくらのVPSです。移行先は新規に構築した、まっさらなCentOS6です。
格安PLANで頑張ってます

|移行元/先  |OS  |kernel |CPU  |MEMORY  |Storage  |
|:-----------|:----|:-----|:-----|:--------|:---------|
|移行元     |CentOS 5.6   |2.6.18-238.12.1.el5        |1core |1GB|15GB |
|移行先     |CentOS 6.8   |2.6.32-642.13.1.el6.x86_64 |1core |1GB|20GB |

# 移行対象
この辺はサーバの使い方によるので要確認。

|カテゴリ  |対象ファイル  |対象ディレクトリ |
|:--------|:------------|:---------------|
|OS関連   |/etc/passwd, /etc/group, /etc/shadow,/etc/gshadow|/home |
|postfix関連   | |/etc/postfix  |

# データ移行
いよいよデータ移行。移行先はまっさら状態なので、いざとなれば再作成すれば大丈夫。

## テストユーザを作る

確認用にテストユーザを移行元で作成

```bash:
useradd mig_test
passwd  mig_test
```
## 移行作業

### OS関連の移行

まず、CentOS（RedHat）ではUIDとGIDは0から65534まであって、
500未満の数はrootやシステムユーザで予約されていています。[参考](http://www.linfo.org/uid.html)

この辺を気にしないで迷わずファイルを移すと、rootやシステムユーザまで上書されてしまって良くないです。
実際やってみたらOSが起動しなくなりました。orz

UID(GID)が500以上のユーザやグループを移行したい。というわけでawk駆使します。

まず環境変数にユーザが使えるUID（GID）の下限値入れます。

```bash:
export UGIDLIMIT=500
```
それぞれのファイルからUID（GID）が、さっき設定したUGIDLIMIT（500）以上65534以下のユーザ（グループ）の情報を.migファイルに出力します。

```bash:
awk -v LIMIT=$UGIDLIMIT -F: '($3>=LIMIT) >> ($3!=65534)' /etc/passwd > /tmp/migrate/passwd.mig
awk -v LIMIT=$UGIDLIMIT -F: '($3>=LIMIT) >> ($3!=65534)' /etc/group  > /tmp/migrate/group.mig 
awk -v LIMIT=$UGIDLIMIT -F: '($3>=LIMIT) >> ($3!=65534) {print $1}' /etc/passwd | tee - |egrep -f - /etc/shadow > /tmp/migrate/shadow.mig
awk -v LIMIT=$UGIDLIMIT -F: '($3>=LIMIT) >> ($3!=65534) {print $1}' /etc/group  | tee -  |egrep -f - /etc/shadow > /tmp/migrate/gshadow.mig
```

次に転送先サーバで、各ファイルのバックアップを取得

```bash:
mkdir /root/bk
cat /etc/passwd  > /root/bk/passwd.bk 
cat /etc/group   > /root/bk/group.bk  
cat /etc/shadow  > /root/bk/shadow.bk 
cat /etc/gshadow > /root/bk/gshadow.bk	
```

rsyncで移します。他の方法でもよかですよ。
/homeもついでに同期

```bash:
rsync -avz  -e "ssh -i /root/.ssh/id_rsa " /tmp/  root@<移行先のIP or ホスト名>:/tmp/
rsync -avz  -e "ssh -i /root/.ssh/id_rsa " /home/ root@<移行先のIP or ホスト名>:/home/
```


移行先サーバでファイルを展開

```bash:
cat /tmp/migrate/passwd.mig  >> /etc/passwd
cat /tmp/migrate/group.mig   >> /etc/group
cat /tmp/migrate/shadow.mig  >> /etc/shadow
cat /tmp/migrate/gshadow.mig >> /etc/gshadow
```


### postfix関連の移行

これもrsyncでやりました。

```bash:
rsync -avz --delete -e "ssh -i /root/.ssh/id_rsa " /home/ root@<移行先のIP or ホスト名>:/home/
```


# 確認

ここまでやったら再起動して、

* 移行用に作ったテストユーザでログイン
* postfixの起動

上記2つができればとりあえずデータ移行は終わり。

あとは実際に送受信したり、DNS切り替えたり。。。面倒くさいなー

やれやれだぜ

# 追記

実際にやりながら書いたのですが、このあとsaslauthの設定を移し忘れてたり、

dovecotのバージョンが１⇒２と上がったことで、configファイルの体系がガラッと変わったりして

だいぶ泥沼化してきました。

生還したらまとめます。本当の戦いはこれからだ！
Railsのrenderの使い方

##基本形

```app/views/messages/index.html.haml
.menu
  = render "layouts/menu"
// これはlayoutsフォルダにある_menu.html.hamlにいく

.view
  = render "view"
///これは同じmessagesフォルダにある_view.html.hamlにいく
```


##オプションをつける場合

例）

```app/views/messages/index.html.haml
  = render partial: "view", layout: "exemption"
//部分テンプレート_view.html.hamlにいくが、レイアウトはexemptionが適用される。
```

```app/views/messages/index.html.haml
  = render partial: "view", locals: { message: @message }
//部分テンプレート_view.html.hamlにいき、partial側ではローカル変数messageで@messageを参照できる。
```
locals:だけであれば下記のように記載することもできる

```app/views/messages/index.html.haml
  = render "view", message: @message
```

*省略形で書く場合、partialとlocalsの両方とも省略形で書く必要がある。（片方だけ省略形はダメ）
*:layoutや:templateなどのオプションをつける場合は、partial:は省略できない。

##アクションに飛ばす場合

``````app/messages_controller.rb
def create
  @message = Message.new(message_params)
  if @message.save
    redirect_to messages_path(@message)
  else
    render :new
  end
end
//上記では@messageが保存できなかった場合、
app/views/messages/new.html.hamlへ飛ぶ
//その場合、入力していた値は保持されている！（newアクションに飛ぶわけではない）
```

##まとめ

"renderを初めて見たときの形が、render partial: "xxx"の形式だったので、
「部分テンプレート = render partial」という固定観念ができていた。
しかし実際にはオプションが不要であればrender "xxx"だけで飛ばすことができるので、
省略できるものは省略し、無駄な作業やタイプミスを減らしたい。
Azure の Resource Group を docker の 上のazure-cli を使って削除する

# 概要

テストで作ったリソースグループをコマンドラインから消したい

# 結果

`y` を１度おすだけであっさり消せる。
この点は注意しておきたい。

# やりかた

## 現在の状況を確認

```
azure login
```

して

```
azure group list
```

### 実行結果


```
root@3690fc5bf5db:/work# azure group list
info:    Executing command group list
+ Listing resource groups                                                      
data:    Name                Location   Provisioning State  Tags:
data:    ------------------  ---------  ------------------  -----
data:    ARM_Deploy_Staging  japaneast  Succeeded           null 
data:    NEWGROUP      japaneast  Succeeded           null 
info:    group list command OK
root@3690fc5bf5db:/work#
```

## 削除

以下のコマンドを実行して、確認に `y` を、押す

```
azure group delete NEWGROUP
```

### 実行結果

```
root@3690fc5bf5db:/work# azure group delete NEWGROUP
info:    Executing command group delete
Delete resource group NEWGROUP? [y/n]  y
+ Deleting resource group NEWGROUP                                       
info:    group delete command OK
root@3690fc5bf5db:/work# 
```

## 削除できたかの確認

再び

```
azure group list
```

### 実行結果

```
root@3690fc5bf5db:/work# azure group list
info:    Executing command group list
+ Listing resource groups                                                      
data:    Name                Location   Provisioning State  Tags:
data:    ------------------  ---------  ------------------  -----
data:    ARM_Deploy_Staging  japaneast  Succeeded           null 
info:    group list command OK
```
RspecでRedmineのテストデータを作成する

# 環境
- OS(Windows7)
- ruby (2.0.0p648)
- rails (4.2.7.1)
- rspec-rails (3.5.2)
- poltergeist (1.12.0)
- database_cleaner (1.5.3)
- capybara (2.11.0)
- launchy (2.4.3)

# 作成したいデータ
Project
Tracker
Issue
上二つ(Project, Tracker)は特に問題なかったけど下(Issue)を作成するのに不覚を取りました...


## 手順1 各Factoryを作っていく

``` project.rb
FactoryGirl.define do
    factory :project do
        name 'Project'
        description 'Test Project'
        homepage  ''
        is_public true
        sequence(:identifier) { |n| "identifier#{n}" }
        parent_id nil
        status 1
    end
end

```

``` tracker.rb
FactoryGirl.define do
    factory :bug_tracker, class: Tracker do
        name 'バグ'
        is_in_chlog true
        sequence(:position, &:to_s)
        is_in_roadmap true
        fields_bits 0
    end
end
```

``` issue.rb
FactoryGirl.define do
    factory :open_issue, class: Issue do
        sequence(:id, &:to_s)
        subject "未完了チケット"
        description ""
        due_date nil
        category_id nil
        status_id 1
        assigned_to_id nil
        priority_id 1
        fixed_version_id nil
        author_id 5
        lock_version 0
        done_ratio 0
        estimated_hours nil
        parent_id nil
        root_id 9
        lft 1
        rgt 2
        is_private false
        closed_on nil
    end
end
```

## 手順2 必要な関連データのFactoryを作成

### 作成するデータ

- IssueStatus
- IssuePriority
- User

``` issue_status.rb
FactoryGirl.define do
    factory :open_issue_status, class: IssueStatus do
        sequence(:id, &:to_s)
        name '新規'
        is_closed false
        position 1
        default_done_ratio nil
    end
end
```

``` issue_priority.rb
FactoryGirl.define do
    factory :priority, class: IssuePriority do
        sequence(:id, &:to_s)
        name 'priority'
        position 0
        is_default true
        type 'IssuePriority'
        active true
        project_id nil
        parent_id nil
        position_name 'default'
    end
end
```

``` user.rb
FactoryGirl.define do
    factory :user do
        firstname 'John'
        lastname 'Doe'
        mail 'john@example.net'
        status 1
        login 'john'
        hashed_password '(略)'
        admin false
    end
end
```

## 手順3 いざ作成

``` ruby:test.rb
let!(:user) { FactoryGirl.create(:user) }
let!(:open_issue_status) { FactoryGirl.create(:open_issue_status) }
let!(:tracker) { FactoryGirl.create(:task_tracker, default_status_id: open_issue_status.id, position: 1) }

let!(:fst_project) { FactoryGirl.create(:project, trackers: [tracker]) }
let!(:sec_project) { FactoryGirl.create(:project, parent_id: fst_project.id, trackers: [tracker]) }
let!(:priority1) { FactoryGirl.create(:priority, project_id: fst_project.id) }
let!(:priority2) { FactoryGirl.create(:priority, project_id: sec_project.id) }
let!(:open_issue) { FactoryGirl.create(:open_issue, project_id: thd_project.id, tracker_id: tracker.id, priority_id: priority.id, author_id: user.id) }
```

## その他
手順3でProjectにIssueを紐付ける際に、登録できるTrackerを指定しておかないと下記エラーが出ます

```
ActiveRecord::RecordInvalid:
Validation failed: Tracker is not included in the list
```

これがわからなくて小一時間悩んだ...
Qiitaで使いそうなMarkdown記法まとめ

##はじめに
これからQiitaに投稿する上で、よく使いそうなMarkdown記法をまとめる。
細かい部分は [リファレンス](http://daringfireball.net/projects/markdown/syntax)へ。

##テキスト・リスト系

| 項目 | 書き方 | 例 |
|--------|---------------|-----|
| 見出し | 文頭に「#」 | ##見出し |
| 強調 | 「**」で囲う | **強調** |
| イタリック | 「*」で囲う | *イタリック* |
| 打ち消し | 「~~」で囲う | ~~打ち消し~~ |
| 順序なしリスト | 文頭に「\*」 | * リスト |
| 順序ありリスト | 文頭に数字 +「.」 | 1. リスト |
| リンク | \[リンクテキスト](URL) | [Qiita](http://qiita.com) |
| 画像 | \!\[代替テキスト](画像のURL) | ![Qiita](https://qiita-image-store.s3.amazonaws.com/0/88/profile-images/1473684075 "Qiita") |
| エスケープ | 「\\」 | \*\*エスケープ** |

##文全体

| 項目 | 書き方 | 例 |
|--------|---------------|-----|
| 引用 | 文頭に「>」 | > 引用 |
| 水平線 | 「---」 | --- |
| コードブロック | スペース4つ or タブ1つ | 	 |
| コード挿入 | 「```」でくくる。言語の指定も可能。<br>ファイル指定したいとき「:」をつける。 | ```php``` |

##テーブル
基本的には「|」で区切る。
2行目の「:」の位置で配置を変える。

###記入例
\| 左寄せ  | 中央寄せ  | 右寄せ  |
|:---|:--:|--:|
| 左 | 中央 | 右 |
| align-left | align-center | align-right |

| 左寄せ  | 中央寄せ  | 右寄せ  |
|:--|:-:|--:|
| 左 | 中央 | 右 |
| align-left | align-center | align-right |

##参考
* [Markdown記法 チートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)
* [Markdown文法まとめ](http://qiita.com/higuma/items/3344387e0f2cce7f2cfe)
ConoHaにWEBサーバーを立ち上げる（２）

サーバーを構築して起動すると、いきなりRedmineが立ち上がるのは便利なんだけど、やりたいのはそーゆー事ではない。
今http://<サーバーアドレス>でアクセスするとRedmineが立ち上がるけど、http://<サーバーアドレス>/redmineで立ち上がるようにする

参考：[Redmine 3.2をCentOS 7.1にインストールする手順](http://blog.redmine.jp/articles/3_2/install/centos/)

### /var/www/html/にredmineのシンボリックリンクを置く
> \# ln -s /var/lib/redmine/public /var/www/html/redmine

### httpd.confを編集する
> \# vi /etc/httpd/conf/httpd.conf

```text:httpd.conf
DocumentRoot "/var/lib/redmine/public"
```

この行を

```text:httpd.conf
#DocumentRoot "/var/lib/redmine/public"
DocumentRoot "/var/www/html/"
RackBaseURI /redmine
```
のように変更

ついでに、これも

```text:httpd.conf
#ServerName www.example.com:80
ServerName 127.0.0.1:80
```

### httpd再起動
> \# service httpd configtest
> \# service httpd restart


--------------
# Redmineにアクセス

左上のログインボタンを押してidとパスワードをセット
初期状態では、どちらも"admin"
![15.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/1a193e17-9038-7444-fbac-e4252ad27181.jpeg)

# Redmineとgitの連携

左上の管理ボタンを押すと、こんな画面が出たけど、面倒なので「デフォルトの設定をロード」
![16.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/27754cd4-f22d-b92e-ba7d-0f711b9b3b89.jpeg)

左の「設定」ボタンを押して「レポジトリ」を選択

![17.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/26e26db7-d8e7-251b-68c6-8158b6516e72.jpeg)
- subversionとgit以外のチェックを外す
- 「レポジトリ管理用のWebサービスを有効にする」
- キーの生成ボタンを押す
- 「保存」
Embulkにdotenvで設定した環境変数を使う



### 環境変数記述 (.env)

.env

```
EMBULK_PATH_PREFIX=xxx.csv
```

### Embulk 設定ファイル (yml.liquid)

test.yml.liquid

```
in:
  type: file
  path_prefix: {{ env.EMBULK_PATH_PREFIX }}  # ← ここで参照
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    columns:
    - {name: id, type: long}
    - {name: name, type: string}
out:
  type: stdout
```

### 実行ファイル

embulk_run.sh

```
export $(cat .env | xargs)
embulk run test.yml.liquid
```

### 実行

```
$ ./embulk_run.sh
```
左右のスワイプで下から上へのスワイプになってしまう。また、戻る方法を教えてください。

View Controller を３つ作り左右のスワイプで画面遷移しようとしましたが、左右にスワイプすると下から上へスワイプします。左右のスワイプにするには、どうしたらいいでしょうか？また、元の画面に戻るにはどうしたらいいでしょうか？
、、、、、、、
import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        
        super.viewDidLoad()
        
        
        //左スワイプ検知
        
        let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swipeGesture(_:)))
        
        leftSwipe.direction = .left
 
        self.view.addGestureRecognizer(leftSwipe)
        
        
        //右スワイプ検知
        
        let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swipeGesture(_:)))
        
        rightSwipe.direction = .right
        
        self.view.addGestureRecognizer(rightSwipe)

    }
    
    
    //スワイプ検知時の動作
    
    func swipeGesture(_ sender: UISwipeGestureRecognizer){
        
        
        //左スワイプの動作
        
        if sender.direction == .left {
            
            //遷移先画面の紐付け（※"NextView"はStoryboardにて設定した画面IDを記述）
            
            let Swipe = self.storyboard!.instantiateViewController(withIdentifier: "NextView")
            
            
            //画面遷移処理
            
            self.present( Swipe, animated: true, completion: nil)
//            show( Swipe, sender:self)
            print("left")
        }
        
        
        if sender.direction == .right{
            
            //遷移先画面の紐付け（※"PreviousView"はStoryboardにて設定した画面IDを記述）
            
            let Swipe = self.storyboard!.instantiateViewController(withIdentifier: "PreviousView")
            
            //画面遷移処理
//            show(Swipe!, sender: self)
            self.present( Swipe, animated: true, completion: nil)
            print("right")
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.

    }
}
お名前.comのドメイン + お名前メール + AWSを併用するライフハック


メール => name@hoge.hoge
AWSのELB => www.hoge.hoge

を併用する。

- お名前メールを使用すると、ドメインNavi側のDNS設定は使えなくなる
- ドメインNavi側で「共用サーバー(SD・お名前メール)」を設定しておく
- レンタルサーバ側の独自ドメイン設定で、設定を利用する
-- 独自ドメイン設定でwww.hoge.hogeにELBのcnameを設定する
PAYJPの通信時にメンテナンスエラーをPHPで発生させるメモ


メンテナンスがあるんですが、どうやったらPAYJPがメンテナンスの状態を再現できるかしらと思って試したメモ書き。

PHP ライブラリのバージョンは最新版を使っています。


## HTTPClient が 503 を返すようにする

payjp.js の方はやり方が僕にはわからなかったのと、通信エラーの例外が出る事を確認したいので、`PAYJP`のHTTPクライアントをすり替える方法でやった。

```Infrastructure/Payments/PayJP/Test/MaintenanceErrorClient.php
<?php
/**
 * Created by IntelliJ IDEA.
 * User: yasui
 * Date: 2017/01/23
 * Time: 19:39
 */

namespace Infrastructure\Payments\PayJP\Test;


use Payjp\HttpClient\ClientInterface;

/**
 * Class APIFailerResponse
 * @package App\Lib\Data\Payment\PayJP\Test
 *
 * メンテナンスエラーを常に出すHTTPクライアント
 */
class MaintenanceErrorClient implements ClientInterface
{
    public function request($method, $absUrl, $headers, $params, $hasFile)
    {
        $rdata =<<<__EOL__
{
    "error": {
        "code": "under_maintenance",
        "message": "PAY.JP is currently undergoing maintenance. Please try again later.",
        "status": 503,
        "type": "server_error"
    }
}
__EOL__;

        return [$rdata, 503];
    }

}
```


後はAPIKey を設定した直後あたりに、上記のクライアントを使うようにしてやれば良いです。

```
// API リクエスト
\Payjp\Payjp::setApiKey( \Config::get( 'payjp.key' ) );

// メンテナンスエラーを強制発生させる
\Payjp\ApiRequestor::setHttpClient( new \ Infrastructure\Payments\PayJP\Test\MaintenanceErrorClient() );

```


## 参考


PAYJP のライブラリが読みやすくてよかった :-)

see: http://payjp-announce.hatenablog.com/entry/2017/01/20/123520
tensorflowの回帰学習をしてみる

これ（http://www.slideshare.net/ToruUenoyama/tensorflow-gdg）の１３Pの回帰の例が大変わかりやすいため、ぜひ皆様に共有。
※開発環境はwindows 10にdockerをインストールして、tensorflowをインストールして
実施。
※違うところは確か、tensorboardの表示もできるように修正しました。

まずは開発環境はかきURLのnobuさんを参照。※以外に何度も設定を繰り返すと、同じものが複製されたりなどで、躓くので、簡単にやり直したい場合は、
dockerの再インストールがおすすめ。
http://qiita.com/Algebra_nobu/items/6c2b05e2a9a4a5ee456d

そのあとは、下記を参照しました。
http://www.slideshare.net/ToruUenoyama/tensorflow-gdg


確か違うところがtensorboardの表示ができるようにコードを変えました。
※case1_graph.pyを実行し、tmp5にtensorflow_logが保存されるようにしてあります。
【実行結果】
<img width="401" alt="実行結果.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/160387/ad0ad53d-1aa2-8fdc-9dbf-bfe4d96e686b.png">


後は、
tensorboard --logdir=/tmp5/tensorflow_logを実行し、
<img width="714" alt="tensorboard.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/160387/739ab49d-3871-0d1e-8f88-1839478c20d1.png">
ブラウザにて、
http://192.168.99.100:6006/#eventsを実行すれば、
先の実行結果と比較すると、700-1000回目のlossが０になっていることがグラフで分かりやすく表示されます。
<img width="895" alt="tensorboardgraph.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/160387/efcd1afe-2d17-c105-4800-c28b137598f6.png">

====================================
↓をコピーペースト(case1_graph.py)下の'の場所は#に直してください。

```py
#coding: utf-8 
#必要なモジュールを読み込む 
import numpy as np 
import matplotlib.pyplot as plt 
import tensorflow as tf 
#TensorFlow でロジスティック回帰する 
#1. 学習したいモデルを記述する 
#入力変数と出力変数のプレースホルダを生成 
x = tf.placeholder(tf.float32, shape=(None, 2), name="x") 
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y") 
#モデルパラメータ 
a = tf.Variable(-10 * tf.ones((2, 1)), name="a") 
b = tf.Variable(200., name="b") 
#モデル式 
u = tf.matmul(x, a) + b 
y = tf.sigmoid(u) 
#2. 学習やテストに必要な関数を定義する 
#誤差関数(loss) 
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(u, y_)) 
loss_summary = tf.scalar_summary("loss", loss)
#最適化手段(最急降下法) 
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) 
#3. 実際に学習処理を実行する # (1) 訓練データを生成する 
train_x = np.array([[2., 3.], [0., 16.], [3., 1.], [2., 8.]]) 
train_y = np.array([1., 1., 0., 0.]).reshape(4, 1) 
print "x=", train_x 
print "y=", train_y 
#(2) セッションを準備し，変数を初期化 
sess = tf.Session() 
init = tf.initialize_all_variables() 
merged = tf.merge_all_summaries()
writer = tf.train.SummaryWriter("/tmp5/tensorflow_log", sess.graph_def)
sess.run(init) 
#(3) 最急勾配法でパラメータ更新 (1000回更新する) 
for i in range(1000):
 _, l, a_, b_ = sess.run([train_step, loss, a, b], feed_dict={x: train_x, y_: train_y}) 
 if (i + 1) % 100 == 0:
    print "step=%3d, a1=%6.2f, a2=%6.2f, b=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], b_, l) 
    summary_str = sess.run(merged,feed_dict={x: train_x, y_: train_y})
    writer.add_summary(summary_str, i)
#(4) 学習結果を出力 
est_a, est_b = sess.run([a, b], feed_dict={x: train_x, y_: train_y}) 
print "Estimated: a1=%6.2f, a2=%6.2f, b=%6.2f" % (est_a[0], est_a[1], est_b) 
#4. 新しいデータに対して予測する # (1) 新しいデータを用意 
new_x = np.array([1., 11.]).reshape(1, 2)
#(2) 学習結果をつかって，予測実施 
new_y = sess.run(y, feed_dict={x: new_x}) 
print new_y 
#5. 後片付け # セッションを閉じる 
sess.close()
仕様やライブラリの変遷について

# 前書き
仕事でJavaScriptを書くようになって2年以上経過した。
それまでに新しい仕様やら便利ツールやらが出てきたり、紹介されているのを見て、
そういう流れについて何となく思ったことを書く。

# とりあえず何らかの機能が存在する
## 例：HTML要素の取得

- 「そういう機能は用意しておいたからうまく使ってね＾＾」という状態。
- 実際の使用感が全く考慮されていない。
- 複数形になってたりなってなかったり、無駄に命名規則がしっかりしているせいで使いにくい。

```js
document.getElementById('test');
document.getElementsByClassName('test');
document.getElementsByTagName('div');
```

## それを補う関数（ライブラリ）の出現
- CSSセレクタと同じ文法（既存の知識）を利用して簡単に使える。
- 「要素を取得する」という同じ役割でメソッド名が変わらない。

```js
$('#test');
$('.test');
$('div');
```

## 仕様への反映
- 評判が良い方法は仕様に取り込まれる場合がある。

```js
document.querySelector('#test');
document.querySelector('.test');
document.querySelector('div');
```

# 基本的に上記の繰り返し
1. そのまま使うにはいまいち使いにくいメソッドや仕様があり、
2. もっと使いやすい書き方を提供するライブラリが登場し、
3. 仕様に反映される。

## 改善された後でも
1. 定型的なパターンが発見され、
2. さらに使いやすい書き方を提供するライブラリが登場し、
3. 仕様に反映される場合がある。

Promise → async awaitなんかはその好例。

# ずっとその流れを繰り返し続けている
その流れの過程で産まれたのが、

- jQueryだったり、
- Ajaxという考え方だったり、
- Angular.jsだったり、
- React.jsだったり

する。

面白いのは、

- JavaScriptやってられっか！ → jQuery
- jQueryでちまちまやってられっか！ → React

のような経緯になっていること。
そしてReactが出てきてから、ピュアJS最高のような流れも主流になっていること。
jQueryがJavaScriptをより簡単に書くために作られたにも関わらずである。

## 揺り戻し
ところで、歴史の勉強で習ったことだが、急激な変革があると「揺り戻し」という現象が発生する。
「変わる前の方が良かった」というヤツである。

ReactによってピュアJSで書く事が主流になった一方で、「こういうケースだとやっぱりjQueryでよくね？」というjQueryの再評価も発生した。
このjQueryの再評価が「揺り戻し」だと捉えている。

# 必要から生まれている
- こうやりたいけど、今のやり方だと今ひとつ上手く書けない。
- こういう機能が欲しいけど、setTimeoutで騙し騙しやっている[^1]。

そういう辛い所を、誰かが何とかしようと考えて、誰かが作っている。

[^1]: CSS Transition, CSS Animationを使用する際の遅延処理、コンテンツロードを待機するための遅延処理、スクロールイベントの間引きなど。

# 誰かとは
- 自分以外の誰か、ではない。
- 自分が考えて、行動に移すことも出来る。

# なので
- 今出来ない所を考えて、自分で何とかすることは悪いことではない。
- その経験をもっと広く伝えて、発展に寄与出来たら素敵だよね。

みたいなことを思ったのだった。

# ちなみに
これから必要とされるが、仕様がヤバイ状態として目につくのは下記。

- [SVG](https://developer.mozilla.org/ja/docs/DOM/DOM_Reference#SVG_interfaces)
- [Canvas](https://developer.mozilla.org/ja/docs/Web/HTML/Canvas)
[Unity] UniRxとEventSystemを用いたDragAndDrop


```
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UniRx;

[RequireComponent(typeof(Image))]
public class DragAndDrop : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
	// ストリーム
	private Subject<PointerEventData> beginDragSubject = new Subject<PointerEventData> ();
	public IObservable<PointerEventData> OnBeginDragAsObservable{
		get{ return beginDragSubject; }
	}

	private Subject<PointerEventData> dragSubject = new Subject<PointerEventData> ();
	public IObservable<PointerEventData> OnDragAsObservable{
		get{ return dragSubject; }
	}

	private Subject<PointerEventData> endDragSubject = new Subject<PointerEventData> ();
	public IObservable<PointerEventData> OnEndDragAsObservable{
		get{ return endDragSubject; }
	}   


	// 検知
	public void OnBeginDrag(PointerEventData pointerEventData)
	{
		this.transform.position = pointerEventData.position;
		beginDragSubject.OnNext (pointerEventData);
	}

	public void OnDrag(PointerEventData pointerEventData)
	{
		this.transform.position = pointerEventData.position;
		dragSubject.OnNext (pointerEventData);
	}

	public void OnEndDrag(PointerEventData pointerEventData)
	{
		endDragSubject.OnNext (pointerEventData);
	}
}
```
+ショートカットを活用しよう - 11 - Win + +

# <kbd><kbd>Win</kbd> + <kbd>+</kbd></kbd> の効果
* <kbd><kbd>Win</kbd></kbd>はWindowsのロゴマークのキーのことです。（大抵のキーボード配列で左下の<kbd><kbd>Ctrl</kbd></kbd>のとなりにありますよね。）

画面全体を拡大します。
Windowsに備わっている拡大鏡の機能です。

<kbd><kbd>Win</kbd> + <kbd>+</kbd></kbd> を押すたびに拡大し、<kbd><kbd>Win</kbd> + <kbd>-</kbd></kbd> で縮小します。
また、<kbd><kbd>Win</kbd> + <kbd>ESC</kbd></kbd> で元に戻ります。（拡大鏡を終了させます）

|拡大率|イメージ|
|:-:|:-:|
|100%|![image](https://qiita-image-store.s3.amazonaws.com/0/156225/2e969871-5b80-4c13-56da-6595ba50bf77.png)|
|300%|![image](https://qiita-image-store.s3.amazonaws.com/0/156225/bcf49931-f4f0-ebac-4c5e-ee932b9e6fc9.png)|

ちょっと、ここ見づらいなっといった時などに便利です。
なお、動作はWindows7で確認しています。Windows7の場合、拡大中は次のような虫眼鏡かウィンドウがどこかに表示されています。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/37622e32-68bb-a9ce-657c-ad744865ddd9.png)![image](https://qiita-image-store.s3.amazonaws.com/0/156225/da628b8b-5ea9-3fe9-75cc-d084b1674bfd.png)

Windows XPなどの場合、もしかすると、画面上部に拡大鏡のエリアが表示されてそこにフォーカスのある部分のみ拡大されるかもしれません。
また、Windows10はまたちょっと違うかもしれません。

以上

|前回|方針|次回|
|:--|:--:|--:|
|[<kbd><kbd>Win</kbd> + <kbd>↑←↓→</kbd></kbd>](http://qiita.com/rrryutaro/items/c1a7e240ae710bcc28bc)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Ctrl</kbd> + <kbd>+</kbd></kbd>](http://qiita.com/rrryutaro/items/42b17cb62424d31edf6e)|
Rustのチュートリアルを少しだけやってみる

# Rustのチュートリアル

## Rustとは、、、
Rust（ラスト）は並列かつマルチパラダイムのプログラミング言語である。Mozillaによって開発されている。関数型プログラミング、並列アクターモデル、手続き型プログラミング、オブジェクト指向プログラミングをサポートする実用的な言語を目指している。　(wikiより引用)

##インストール
インストールする環境は、Macのbrewがインストールされていることを前提としてます。

```
$ brew install rust
```

###確認
正常にインストールされたか確認します。
rustcはコンパイル時に利用するものです。
cargoはRustのビルドシステムです。コードのビルド、コードが依存するライブラリのダウンロード、ライブラリのビルドを管理してくれます。

```
$ rustc -V
rustc 1.14.0
$ cargo -V
cargo 0.15.0-dev (298a012 2016-12-20)
```
##Hello,worldの表示
チュートリアルの基本であるHello,Worldを出力させます。

```
$cargo new guessing_game --bin
```

cargoを利用することによって、Cargo.tomlとsrcが作成されます。ソースコードは、srcの中のmain.rsは以下のようになっています。
cargoを利用することによって、自動的に作れられています。

```  rust:main.rs
fn main() {
    println!("Hello, world!");
}
```
それでは実行をしてみます。

```
$cd guessing_game
$cargo build
$cargo run
Hello, world!
```
ちゃんとHello,world!が表示されました。


##参考
1.https://ja.wikipedia.org/wiki/Rust_(プログラミング言語)
2.https://doc.rust-lang.org/book/README.html
Windows時間(NT タイムエポック)を相互変換する方法

#TL;DR
Unix タイムスタンプでは、1970年1月1日0時0分0秒からの秒数で表されているタイムスタンプですが、Windows では、1601年1月1日0時0分からの100ナノ秒単位で表されています。

Windows の世界では、NT タイムエポックが使われていることがよくあります。その変換方法をまとめてみました。

他の言語等随時Updateしていきます。

# 1. NT タイムエポック→日付
## w32tm を使う
`w32tm /ntte <NT タイムエポック>`

例

```
> w32tm /ntte 131297012170000000
151964 03:13:37.0000000 - 2017/01/24 12:13:37
```

## PowerShell を使う
` [datetime]::FromFileTime(<NT タイムエポック>)`

例

```
> [datetime]::FromFileTime("131297012170000000")
2017年1月24日 12:13:37
```

## Excel を使う
計算式を使って自力で行う方法です。

```
<NT タイムエポック>/(8.64*10^11) - 109205 + (1/24)*9
```
これは、↓をしています。
1. NT タイムエポックを日数に変換
2. 1900年からの経過時間になる様に調整※
3. JST(UTC+9)を足す
※つまり、1601年から1899年の差分の日数を引いている。Excelは1900年を起点としたシリアル値で時間を保持している為。

また、↓のコメントを読むとExcelにはうるう年のバグがあるらしく、109206のところを109205としている様です。
https://social.technet.microsoft.com/wiki/contents/articles/12814.active-directory-lastlogontimestamp-conversion.aspx

# 2. 日付→NT タイムエポック
## PowerShellを使う
`(Get-Date "<日付時刻>").ToFileTime()`

例

```
>  (Get-Date "2016/11/07 8:23:32").ToFileTime()
131229482120000000
```

# 参考
Active Directory: LastLogonTimeStamp Conversion
https://social.technet.microsoft.com/wiki/contents/articles/12814.active-directory-lastlogontimestamp-conversion.aspx
Swiftで（guard節の中でも）配列の存在しないindexを参照するとクラッシュする

# コメントより (2017/01/25追記)

そもそも、arrayの範囲外インデックスへのアクセスはコードで回避する以前に設計の問題とのことです。
記事としての妥当性に欠けておりました、申し訳ありません。

> Swift では、 Array のインデックスが範囲外の場合のエラーは、ハンドリングして処理すべきエラーではなくコーディングの誤りである（ Logic failure ）とみなされているので、そのようなケースを guard let や if let でハンドリングすることはできません。実行時にハンドリングするのではなくて、誤ったコードを修正すべきという考えです。 Array のインデックスが範囲外の場合にそれをハンドリングしたい具体的なユースケースを考えてみると、そんなケースはほとんど思いつかないので妥当な設計だと思います。

> by @koher (Yuta Koshizawa) さん

# 以下元記事

「Xcodeに怒られなければいいよね :smile:」 :gun: :cop: 

```swift:Playground
var array: [String]?

array = ["first", "second", "third"]

func getStr(index: Int) -> String? {
	guard let str = array?[index] else { // 👈 ここでクラッシュ
		return nil
	}

	return str
}

print(getStr(index: 3)) // 👈 配列外を参照
```

> fatal error: Index out of range

:fire:

# :hospital: :mask:

Safe (bounds-checked) array lookup in Swift, through optional bindings?
http://stackoverflow.com/questions/25329186/safe-bounds-checked-array-lookup-in-swift-through-optional-bindings

```swift:Swift
extension Collection where Indices.Iterator.Element == Index {

    /// Returns the element at the specified index iff it is within bounds, otherwise nil.
    subscript (safe index: Index) -> Generator.Element? {
        return indices.contains(index) ? self[index] : nil
    }
}
```

👇

```swift:Swift
let array = [1, 2, 3]

for index in -20...20 {
    if let item = array[safe: index] {
        print(item)
    }
}
```
Tensorflowのmnistのチュートリアルで学習させたモデルにcanvasに書いた手書き数字を判別させるデモ作った

タイトルで言い切った感あるのですが、
たまたまDeepLearningネタで人前で発表をしなくてはいけなくなり、
なにか簡単なデモを交えつつ説明できればいいなーと
手軽に手元で動かせて実際に予測までできるようなサンプルないかと
あれこれ探したのですが意外と見つからなかったので作ってみました。

<img width="685" alt="スクリーンショット 2017-01-24 12.40.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/6269/17f80aad-8c16-ceb0-c545-2cf0c4676978.png">

やっていることは、[TensorFlowのMNISTのチュートリアル](https://www.tensorflow.org/tutorials/mnist/pros/)をそのまま使い、学習させたモデルを保存しておいて、
canvasで描画した数字の画像をFlaskアプリに飛ばして判別させてるだけです。
何かの参考になれば。

demo: [munky69rock/mnist-demo](https://github.com/munky69rock/mnist-demo)

(注1: 時間制約的に動くことファーストで作ったため、中身のコードの正しさ等はちゃんと検証してません、すみません...)
(注2: ブラウザはChromeでのみ動作確認しています、スマホだと動きません)

### 参考

- [Deep MNIST for Experts  |  TensorFlow](https://www.tensorflow.org/tutorials/mnist/pros/)
- [TensorFlowで学習済みモデルを使用する(Deep MNIST for Expertsの応用) - walkingmask’s development log](http://walkingmask.hatenablog.com/entry/2016/08/27/032400)
- [Create a Drawing App with HTML5 Canvas and JavaScript { William Malone }](http://www.williammalone.com/articles/create-html5-canvas-javascript-drawing-app/)
小学4年生で学ぶ連除法について

数学タグ付いてるけど算数。

# 連除法
小学4年生で最大公約数・最小公倍数を習うのだが、その際の「やりかた」に連除法（すだれ算とも）というものがあると知った。

## やりかた
![20170124_001.png](https://qiita-image-store.s3.amazonaws.com/0/43992/17cc0f5a-c03a-2d1f-a5bf-5564905eefb7.png)

### 最大公約数（GCD）
整数の組に共通する約数がある場合に約していき、除数をすべて乗算して求める
### 最小公倍数（LCM）
整数の組に2つ以上共通する約数がある場合に約していき、除数とあまりをすべて乗算して求める

## よくあるGCD、LCM
もちろん、ユークリッドの互除法で簡単にできる。整数の組が2個より多い場合でも $gcd(a,b,c) = gcd(gcd(a,b),c)$ で解ける。

```java
public int gcd(int a, int b) {
   if (b == 0) return a;
   return gcd(b, a % b);
}

public int lcm(int a, int b) {
    return a * b / gcd(a, b);
}
```

## 再実装してみる
しかしながら、娘が Scratch で再現可能なことが目的なので、ひとまず Java で素組みしてみる。
[ソース](https://github.com/ueno-t/factorization-for-elementary)

 - 整数の組を素数で約してみる

GCDとLCMのときでは約するやり方が異なるので、Predicate を入れ替えている。Java でも関数を渡せるね！

```java
Integer primeFactory(List<Integer> intList) {
	Predicate<Integer> op = mode.equals(Mode.GCD) ? factoryAll(intList) : factoryMulti(intList);
	return primeList.stream().filter(op).findFirst().orElse(1);
}

static Predicate<Integer> factoryAll(List<Integer> intList) {
	return i -> intList.stream().allMatch(isDivisable(i));
}

static Predicate<Integer> factoryMulti(List<Integer> intList) {
	return i -> intList.stream().filter(isDivisable(i)).count() > 1;
}
```

 - 約せたら次の段に移る

元の整数の組を約数で割った、新しい整数の組を生成する。UnaryOperator で単項演算を渡している。LCMのため割り切れない場合は元の整数を返す。

```java
static List<Integer> divideList(Integer divisor, List<Integer> intList) {
	return intList.stream().map(divide(divisor)).collect(Collectors.toList());
}

static UnaryOperator<Integer> divide(Integer divisor) {
	return i -> (i % divisor) == 0 ? i / divisor : i;
}
```

 - 最終的に対象をすべて乗算する

```java
Integer getGCD() {
	return reduceDivisor();
}
Integer getLCM() {
	return getLastValue().stream().reduce(1, (x, y) -> x * y) * reduceDivisor();
}
Integer reduceDivisor() {
	return stack.stream().map(p -> p.getKey()).reduce(1, (x, y) -> x * y);
}
```

## あとがき
ステップ三つだけど Scratch で組むのはしんどそうなので保留中。素数導出はいずれ。
Androidのエミュレーターにproxyを設定する

Androidのエミュレータの通信をmitmproxy通そうしたときに困ったのでメモ。

実機だとWifiにプロキシ設定を書いてやるのですが、そもそもエミュレータにはWifiがサポートされていない。
https://developer.android.com/studio/run/emulator.html#starting

仕方ないのでエミュレータ立ち上げ時にproxyオプションを設定して立ち上げます

```
emulator -avd [エミュレータ名] -http-proxy http://192.168.xxx.xxx:8080
```

エミュレータ名は `emulator -list-avds` で確認できます。

```
# emulator -list-avds
Nexus_4_API_25
Nexus_5X_API_22
...
```
辞書を作る




http://www.mwsoft.jp/programming/munou/mecab_command.html#userdir

の辞書を作る部分、自分の環境では下記だった。

```
/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -d /usr/local/Cellar/mecab-ipadic/2.7.0-20070801/lib/mecab/dic/ipadic/  -t utf-8 -f utf-8 -u myDic.dic myDic.txt 
```

myDic.dicが出来るはず。
よく使いたくなるけどよく忘れる Emacs の便利コマンド備忘録

# このメモは
よく使いたくなるけどよく忘れる Emacs の便利コマンドを羅列します。

# フォントサイズを一時的に変える

Function : text-scale-adjust
Shortcut : C-x C-0

[14.11 Text Scale]
(https://www.gnu.org/software/emacs/manual/html_node/emacs/Text-Scale.html)

# 長い行の折り返し
## 編集なし、折り返して見えるだけ
Function : toggle-truncate-lines

[14.21 Line Truncation]
(https://www.gnu.org/software/emacs/manual/html_node/emacs/Line-Truncation.html)

## 編集あり、エンター押す度に編集される
Function : auto-fill-mode

[25.6.1 Auto Fill Mode]
(https://www.gnu.org/software/emacs/manual/html_node/emacs/Auto-Fill.html)

# 矩形選択
Function : rectangle-mark-mode
Shortcut : C-x SPC
矩形選択モードに切り替える。普通に選択した状態でこれを呼ぶと、選択したエリアが矩形選択に切り替わる。
カット・コピー・ヤンクのショートカットキーは普通のモードと同じ。

[12.5 Rectangles]
(https://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html)

# (番外編) .emacs.d 等の移行の際の方法
.emacs.d や、 org-directory の中身をイチから再構築したりしたい場合、
色々試してみたものの結局 HOME を適当なディレクトリに設定してその中で作業するのが一番ラクだという結論になりました。
AWS DMSを設定したときのメモ

# 概要

AWS DMSを使うと、データベースをスキーマやテーブル単位でウォッチして対象のデータベースに同期させることができる。リードレプリカとは違う点は、同期対象のデータベースがリードオンリーではなく書き込み可能だという点だと思う。

* [AWS Database Migration Service (DMS)が一般公開に！利用可能リージョンも拡大](http://aws.typepad.com/aws_japan/2016/03/aws-database-migration-service.html)
* [Amazon RDSの新機能：Read Replica(リードレプリカ)の発表](http://aws.typepad.com/aws_japan/2010/10/amazon-rds%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BDread-replica%E3%81%AE%E7%99%BA%E8%A1%A8.html)

DMSという名前から、データベースのマイグレーションのためのツールのように思われるかもしれないがレプリケーションツールとしても使えるようだ。

# 設定

1. RDSの画面で同期の元DB（ソース）と同期の対象のDB（ターゲット）を作成する
2. DMSの画面でタスクを作成し、元DBと同期の対象のDBを設定する、このとき同期を実行する主体としてレプリケーションインスタンスを作ることを求められるので、作る
3. このとき、移行タイプを設定する必要がある、「Migrate Existing Data」か「Replicate data changes only」。前者は単純なデータ移行目的で、一発タスクを実行して移行が終わると終了、後者はレプリケーションが目的で、対象のDBを逐次同期させることができる

## 設定のはまりどころ

* バイナリログの有効化
    * このDMSを使うためには、データ同期元のデータベースはバイナリログが有効化されていないと駄目
    * 設定は右のページを参考にする： [MySQL または別の Aurora DB クラスターとのレプリケーションの設定](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Aurora.Overview.Replication.MySQLReplication.html)
    * 要は、Auroraの場合はパラメーターグループを画面から変更すればOKで、MySQL on RDSの場合は事前にバックアップの設定をしてからパラメーターグループを画面から変更すればOK

* バイナリログの設定確認

```:sql
SELECT @@binlog_format;
-- or
SHOW variables LIKE "binlog_format";
```

## 所感

* 同期のスピードが速い、SQLツールで一方を更新すると、ほぼほぼ10秒以内で同期されている
* リードレプリカと違ってなんちゃってマスター：マスター構成でDBが組めそうだ
C++ Builder XE4, 10.2 Tokyo > notepad > 他のソフトの座標を取得する > GetWindowRect()使用

```txt:動作環境
C++ Builder XE4
   Windnows 7 pro (32bit)

RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

他のソフトの座標を取得する。

メモ帳を対象ソフトとして実装した。

参考 [C#での実装例 @ stackoverflow](http://stackoverflow.com/questions/9668872/how-to-get-windows-position)
参考 [GetWindowRect @ MSDN](https://msdn.microsoft.com/ja-jp/library/cc364769.aspx)
参考 [Delphiでの実装例 @ stackoverflow](http://stackoverflow.com/questions/5778703/finding-external-windows-position)

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String fullCaption = L"無題 - メモ帳";

	HWND appHwnd;

	appHwnd = FindWindowEx(NULL, NULL, NULL, fullCaption.c_str());
	if (appHwnd == NULL) {
        return;
	}

	SetForegroundWindow(appHwnd); // 前面に映す


	TRect lpRect;
	GetWindowRect(appHwnd, &lpRect);

	int nop=1;

}
//---------------------------------------------------------------------------
```

1. メモ帳を起動する
   - キャプションは「無題 - メモ帳」であること
2. 上記のソフトをデバッグモードで実行し
   - int nop=1;にてブレークポイントで止める

以下のように、lpRectにleft, top, right, bottomが得られた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d33e9741-c5e9-6872-b188-1db06cbe70fb.png)
SQL*Loaderでboolean型を数値型へ変換する制御ファイルの書き方

#制御ファイルサンプル

```sql:制御ファイル
OPTIONS (
   SKIP=1,
   ERRORS=-1,
   ROWS=10000)
LOAD DATA
   CHARACTERSET JA16SJIS
   INFILE 'data.CSV'
   TRUNCATE 
   INTO TABLE TABLE_NAME 
   FIELDS TERMINATED BY","OPTIONALLY ENCLOSED BY'"'TRAILING NULLCOLS 
(
   id,
   name,
   flg "decode(:flg,'True',1,'False',0,NULL)",
)
```

#ポイント
下記行がポイント。decodeで変換する
`"decode(:flg,'True',1,'False',0,NULL)",`
AWSのIAMで支払い情報以外の権限をユーザーに付与する

AWSを運用する上で欠かせないのがユーザー管理ですよね。
特に自社案件以外の作業の場合は、新規にユーザーを作成し、必要な権限を付与する必要がありますが

「とりあえず、ユーザーに支払い情報以外を全て任せたい」

そんな時の手順をまとめておきます。
※対象ユーザーは既に作成済みとします

【IAMを選択する】
![AWS１.png](https://qiita-image-store.s3.amazonaws.com/0/23377/77bf7492-1ce6-9105-c133-4e626b9ffca7.png)

【サイドメニューからポリシーを選び、ポリシーの作成へ】
![AWS２.png](https://qiita-image-store.s3.amazonaws.com/0/23377/5bfd0bc3-f7d0-179b-66c9-45a40902fe6a.png)

【独自ポリシーを作成】
![AWS3.png](https://qiita-image-store.s3.amazonaws.com/0/23377/bb0a772e-6ce3-2f73-7fa1-8564ad9b9834.png)

【ポリシー設定】
![AWS4_ポリシー作成.png](https://qiita-image-store.s3.amazonaws.com/0/23377/7d7e21a5-a198-d333-5e98-865b6f6aefba.png)
・ポリシー名＆説明：わかりやすい名称・説明を入れましょう
上記のSSでは「AllPermissionWithoutBilling」としています。
・ポリシードキュメント：ここでポリシーの内容を定義します。
下記で設定すれば、支払い情報以外の権限を付与します。
※IAMも利用可能の為、権限変更を許可しない場合は「NotAction」に「iam:"*"」を追記しましょう
{
&nbsp;&nbsp;&nbsp;&nbsp;"Version": "2012-10-17",
&nbsp;&nbsp;&nbsp;&nbsp;"Statement": [
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Effect": "Allow",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"NotAction": [
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"billing:ModifyBilling"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;],
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Resource": "*"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]
}
・設定内容が有効化どうかを確認する場合は「ポリシー検証」を押してみましょう。

【ユーザーを選択して、権限追加ボタンを押下する】
![AWS5_ユーザーに権限付与.png](https://qiita-image-store.s3.amazonaws.com/0/23377/d9177222-9f80-5d26-65a2-7f543bb833e1.png)

【既存のポリシーを直接アタッチ】
上記で作成したポリシーを選択する
![AWS6_ポリシー選択.png](https://qiita-image-store.s3.amazonaws.com/0/23377/d6f0e3ea-69cc-67e2-46d5-162def7a1700.png)

【付与する権限を確認する】
![AWS7_ポリシー確認.png](https://qiita-image-store.s3.amazonaws.com/0/23377/eb2c805e-2cf5-56f6-5c56-dbeeba7c6b75.png)

【ユーザーに権限ポリシーが追加された事を確認する】
![AWS8_ポリシーのアタッチ確認.png](https://qiita-image-store.s3.amazonaws.com/0/23377/cf3b17fc-b36e-8bc7-b7f0-075ad3a4d0a1.png)

・実際に権限が意図した動きをしているか確認する為、対象のユーザーでログインして色々操作してみましょう。


お疲れ様でした。
SwiftLintのバージョンを固定する方法

チーム開発を行っていると、チーム内でのSwiftLintのバージョン合わせであったり、
各人の開発マシンとCI上のSwiftLintのバージョン合わせをしなければならず、面倒なことが多いかと思います。

現在のチームでは、SwiftLintの[0.14.0](https://github.com/realm/SwiftLint/releases/tag/0.14.0)から追加されたportable_swiftlint.zipの中身(`SwiftLintFramework.framework`と`SwiftLint`)をリポジトリに追加し、その問題に対応していたのですが、今日ふとTwitterを眺めていると、こんなやり取りが。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/toshi0383">@toshi0383</a> ちょっと前から、SwiftGenみたいにCocoaPodsで入れられるようになったので、Podfileでバージョン固定して使うのがよさそうですね</p>&mdash; Syo Ikeda / いけしょー (@ikesyo) <a href="https://twitter.com/ikesyo/status/823334758172065793">January 23, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

確認してみると、確かにCocoaPodsでインストールできるようになっていました。
追加・削除・更新のしやすさから考えると、SwiftLintのバージョン固定については、CocoaPodsを使うのが良さそうです。
TeraTermログインマクロ パスワード暗号化

#TeraTermログインマクロ パスワード暗号化

シンプルなTeraTerm SSHログインマクロのメモ。パスワードは暗号化して保存されるので、平文で記載することに抵抗がある場合にどうぞ。

```bat:hoge.ttl
username = '<user name>'
hostname = '<host name/ip>'
passwdfile = 'password.ini'
keyfile = '<SSH key filepath>'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;パスワード取得
getpassword passwdfile username passwd

msg = hostname
strconcat msg ':22 /ssh /auth=publickey /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg passwd
strconcat msg ' /keyfile='
strconcat msg keyfile

connect msg
```

パスワード取得にgetpasswordコマンドを利用します。
passwdfileがなければ自動生成し、usernameに対応するパスワードがなければ入力ダイアログボックスが表示されます。
初回起動時のみパスワードを入力し、2回目以降はpasswdfileに保存されたパスワードが自動で読み込まれます。
passwdfileに保存されるパスワードは勝手に暗号化されます。

###### 参考

* TTL コマンドリファレンス
https://ttssh2.osdn.jp/manual/ja/macro/command/index.html

* Tera Termマクロ コマンド一覧
http://www.macrosh.com/tera-termmakuronitsuite/komando-yi-lan
アプリ開発でdebug/staging/release環境があるならbundleは３種類あったほうが捗る

swift3で新規アプリを作ることになったので備忘録です。

他の備忘録
- [StoryBoardを使わないでプロジェクト作成（Xcode8,Swift3）](http://qiita.com/rika-sakuma/items/d975c2d9f85e8bb4aef5)
- [アプリ開発でdebug/staging/release環境があるならbundleは３種類あったほうが捗る](http://qiita.com/rika-sakuma/items/37e77c3a83e3a9855825)
- [Staging用の環境設定をXcodeに追加する](http://qiita.com/rika-sakuma/items/cc8f86ed6f4ad3f2514c)
- [設定画面をコードだけで書く時いつも悩む](http://qiita.com/rika-tawashi/items/6461180c518afeeb20fb)

## たぶん捗る
アプリ開発でdebug/staging/release環境があるならbundleは３種類あったほうが捗ります。プッシュ配信や、iPhone内で本番と開発をわけられるからです。

## やりたいこと
- iPhone内で各環境、別々のアプリとして扱いたい
- 各環境で別々にプッシュ通知を送りたい

## 準備
- [Staging用の環境設定をXcodeに追加する](http://qiita.com/rika-sakuma/items/cc8f86ed6f4ad3f2514c)
- iOS DeveloperでAppIdとプロビジョニングファイル、プッシュ証明書を作成する。

以下は作成サンプル。適宜つくるといい。
debug環境は実機で動かせるだけでよいので、developmentのプロビジョニングファイルしか作成しない。staging環境のプッシュはadhocで配布したものを対象にしているのでproductionのみ作成する。debug環境のプッシュはdebug実行しながら受け取りたい場合は作るといい。

|            |    Debug    |    Staging   |    release   |
|:-----------|:-----------:|:------------:|:------------:|
| AppId      | hoge_debug  |   hoge_stg   |    hoge      |
| プロビジョニング（dev)|    ○   |       ☓      |       ☓      |
| プロビジョニング（dist)|    ☓  |       ○      |       ○      |
| プッシュ（dev)　|    ○   |       ☓      |       ☓      |
| プッシュ（pro) |         ☓   |       ○      |       ○      |

## Xcodeの設定
- Target>General>SigningのAutomatically manage signingのチェックを外す

![[76a0c37f979a72bf250d0971f6fcdb4a]_%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202017-01-24%2011.17.39.png](https://qiita-image-store.s3.amazonaws.com/0/50839/fffce4b2-0dd2-998f-c1ae-6e7d0b86cec8.png)

- Signingを各環境にセットする
bundleと一致しないSiginigはエラー表示されるが、正しい挙動。
![[feeee7b8d2969bcac015aeaa96fb0031]_%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202017-01-24%2011.21.23.png](https://qiita-image-store.s3.amazonaws.com/0/50839/9bf128e3-3722-040b-11fc-a570bd70153d.png)

- BuildSettingsをセットする。TargetとProjectどっちも行うこと。

## 運用
- 開発中はbundleをdebugにして開発する
- adhocしたくなったら、bundleをstagingにする。Archiveする際、普通にやったらreleaseのreleaseのプロビジョニングが使用されてしまうので、Edit Scheme>Archive>Build Configurationで、Stagingを選択する
CentOS7にMySQL5.7を構築する方法


## インストール

* MariaDBライブラリを削除。

	```bash:terminal
	yum remove mariadb-libs
	```

* yumレポジトリ追加
	
	```bash:terminal
	rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
	sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/mysql-community.repo
	sed -i -e "s/enabled *= *1/enabled=0/g" /etc/yum.repos.d/mysql-community-source.repo
	```
	
* MySQLインストール
	
	```bash:terminal
	yum -y install mysql-community-server --enablerepo=mysql57-community
	```
	
	

## 設定&起動

* 一度サービスを起動し、rootパスワードを取得する
	
	```bash:terminal
	service mysqld start
	```

* /var/log/mysqld.logに書かれた初期パスワードを取得

	```bash:terminal
	cat /var/log/mysqld.log | grep 'temporary password' | awk -F ': ' '{print $NF}'
	```

* フォルダ作成
	
	```bash:terminal
	mkdir -p /var/log/mysqld && chown -R mysql. /var/log/mysqld
	mkdir -p /etc/mysql      && chown -R mysql. /etc/mysql
	```

* cnfファイルを配置
	
	```bash:terminal
	cat << \EOS > /etc/mysql/my.cnf
	[mysqld]
	
	# 文字コード設定
	character-set-server=utf8mb4
	skip-character-set-client-handshake
	
	# リンクテーブル作成を許容する
	symbolic-links=0
	
	# ログ出力設定
	slow_query_log=0
	slow_query_log_file=/var/log/mysql/slow.log
	long_query_time=1

	# パスワードポリシー設定
	validate_password_policy=LOW
	
	# メモリサイズ拡張
	max_allowed_packet=128MB
	
	# テーブル、カラム名を小文字に統一
	lower_case_table_names=1
	
	# リンクテーブル有効化
	federated = 1
	
	# InnoDB設定
	innodb_buffer_pool_size = 512M
	#innodb_log_file_size = 256M

	# TIMESTAMPデフォルト値
	explicit_defaults_for_timestamp = true
	
	# indexサイズ拡張対応
	innodb_large_prefix=1
	innodb_file_format=Barracuda
	innodb_file_format_max=Barracuda
	EOS
	```

* サービス再起動
	
	```bash:terminal
	service mysqld restart
	```
	
* 接続確認
	
	```bash:terminal
	mysql -u root -p
	
	Enter password: [初期パスワード]
	Welcome to the MySQL monitor.  Commands end with ; or \g.
	Your MySQL connection id is 8
	Server version: 5.7.17 MySQL Community Server (GPL)
	
	Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
	
	Oracle is a registered trademark of Oracle Corporation and/or its
	affiliates. Other names may be trademarks of their respective
	owners.
	
	Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
	
	mysql>
	```
	
	```bash:terminal
	# MariaDBコンソールを抜ける
	mysql> exit
	```

### セキュリティ設定

* mysql_secure_installationを使う場合。

	```bash:terminal
	mysql_secure_installation
	```

* 同等のことを、Chef/Ansibleなどでやる場合は以下を参考に。。。
		
	> この方法、5.7ではデフォルトパスワードではインタラクティブに
	> パスワードを受け付けてもらえず、使えないみたいだ。

	```bash:terminal
	mysql -u root -p << \EOS
	/* rootユーザー作成 & パスワード設定 */
	GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'	IDENTIFIED BY '[password]' WITH GRANT OPTION;
	GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'			IDENTIFIED BY '[password]' WITH GRANT OPTION;
	/* anonymasユーザー削除 */
	DELETE FROM mysql.user WHERE User = '';
	/* testデータベース削除 */
	DROP DATABASE IF EXISTS test;
	/* 権限反映 */
	FLUSH PRIVILEGES;
	EOS
	```
	
## 完了

* 以上
How to fix composer NoSSL exception

###
When you encounter this error,

```
[RuntimeException]
The openssl extension is required for SSL/TLS protection but is not available.
If you can not enable the openssl extension, you can disable this error,
at your own risk, by setting the 'disable-tls' option to true.
```

do this

```
composer config -g -- disable-tls true
```

then

```
>composer install
You are running Composer with SSL/TLS protection disabled.
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update
Generating autoload files
```

:thumbsup:
windowsのxamppで、oracleを利用する方法

# 手順
1. **instantclient-basic-nt-12.1.0.2.0**をダウンロードする
2. `C:\oracle\instantclient-basic-nt-12.1.0.2.0\instantclient_12_1`(環境依存)をパスに追加
3. php.iniの`extension=php_pdo_oci.dll`のコメントを解除
4. 再起動

ODBCをインストールする場合は、管理者で実行しないとエラーが発生するので注意。


# 参考
## ODBCの設定
http://blog.hrendoh.com/how-to-register-oracle-instant-client-as-odbc-datasource/

## php.iniの設定
http://kinopyo.com/ja/blog/how-to-install-oracle-instant-client-on-xampp-for-windows
[CentOS 6] postfix で pgsql 対応メモ

# 概要
CentOS 6 で postfixadmin の DB に postgresql を使用した際の対応メモ。

# 手順

デフォルトの状態は pgsql に対応していないらしい

```
# postconf -c /etc/postfix -m | grep sql
mysql
```

**pgsql 対応手順**

yum-priorities インストール

```
# yum install -y yum-priorities
```

レポジトリ設定

```
# vi /etc/yum.repos.d/CentOS-Base.repo

[base]

exclude=postfix-*
priority=1

[updates]

exclude=postfix-*
priority=1

[centosplus]

priority=2
enabled=1
```

centosplus から postfix インストール

```
# yum install sendmail
# yum erase postfix
# yum install postfix
```

確認

```
# postconf -c /etc/postfix -m | grep sql
mysql
pgsql
```

掃除

```
# yum erase sendmail
```