OmniAICreator/Qiita-1.07M huggingface dataset:
Macでmysqld_multiを使ってみた


# はじめに
MacOS上でレプリケーションを試してみるために、mysqld_multiを使ってMySQLを複数立ち上げようと思いました。
mysqld_multiに関する記事はいくつかありましたが、ハマった点が多くあったので、自分が最終的に出来たやり方をご紹介します。

# やり方
## /etc/my.cnfという設定ファイルを作成する
```
>shell sudo vim /etc/my.cnf
```

```/etc/my.cnf
[mysqld_multi]
mysqld     = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user       = multi_admin
password   = password
[mysqld]
[mysqld1]
server-id = 1
socket     = /tmp/mysql.sock
port       = 3306
pid-file   = /usr/local/var/mysql/my.local.pid
datadir    = /usr/local/var/mysql
user       = root
[mysqld2]
server-id = 2
socket     = /tmp/mysql.sock2
port       = 3307
pid-file   = /usr/local/var/mysql2/my.local.pid2
datadir    = /usr/local/var/mysql2
user       = root
```

## mysql用のディレクトリを作成する
```
>shell cd /usr/local/var
>shell sudo mkdir mysql
>shell sudo mkdir mysql2
```

## 各ディレクトリにおいてmysqlを初期化する
#### 1つ目初期化
```
>shell mysql_install_db --defaults-file=/etc/my.cnf --datadir=/usr/local/var/mysql --basedir=/usr/local/Cellar/mysql/5.7.18
```
#### 1つ目パスワード確認(メモっておこう)
```
>shell cat ~/.mysql_secret
# Password set for user 'root@localhost' at 2017-06-27 13:15:32
k>,gLo3sw;>p
```
#### 2つ目も同様に
```
>shell mysql_install_db --defaults-file=/etc/my.cnf --datadir=/usr/local/var/mysql2 --basedir=/usr/local/Cellar/mysql/5.7.18

>shell cat ~/.mysql_secret
```

## mysqld_multiでmysqlを立ち上げる
### 現状を確認
```
>shell mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is not running
MySQL server from group: mysqld2 is not running
```

### mysqlを立ち上げる
```
>shell mysqld_multi start
>shell mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running
```

## mysqlにログインしてみる
以下の操作を両方のmysqlで行いましょう。
### まずはログイン
```
>shell mysql -h 127.0.0.1 -P 3306 -u root -p
Enter password:
```
パスワードが聞かれるので、先ほど確認したものを入力しましょう。
### パスワード変更
初期パスワードのままだと、他の操作をしようとするたびにエラーになるので、先ずは変更しましょう。

```
alter user root@localhost IDENTIFIED BY 'password';
```

### mysqlをstopする用のユーザーを作成する
```
>mysql grant shutdown on *.* to multi_admin@localhost identified by 'password';
```

## mysqlをstopする
```
>shell mysqld_multi --user=multi_admin --password='password' stop
```
GreasemonkeyのunsafeWindowの移行タイミングのひとつはgrant

題意そのまま。


通常、Greasemonkeyが実行元ページのオブジェクト、`window.Hoge`にアクセスしたい場合、`Hoge`でアクセスできる。
これは一般的な**window**オブジェクトの省略である。
しかし、GM関数を使う場合(`@grant GM_～`)は、**window**オブジェクトが**unsafeWindow**オブジェクトへと移動する。
したがって、省略も不可になり、`unsafeWindow.Hoge`と参照しなければならなくなる。

新機能を追加しようと`@grant`を書き換えたとき、既存機能が壊れる可能性があるので留意する。
swagger yaml → html変換手順

## 前提条件
 visual studio codeのインストールが完了していること

## 拡張機能をインストールする

 visual studio codeに、以下の拡張機能をインストールする

- Swagger Viewer
- swagger-doc-viewer
- swaggitor

## Swagger Viewer で viewer を確認する

yamlファイルをvisual studio codeで開き、以下の方法でSwagger Viewerを使用し、viewerを確認する
1. [F1]押下後、検索ボックスで「Preview Swagger」を検索し、選択
2. Shift + Alt + P

##  Markdownファイルをプレビューで確認する
1. ファイルの上で右クリック
2. プレビューを開く

## yamlファイルからhtmlファイルへ変換する

```bash

$ npm install -g bootprint
$ npm install -g bootprint-openapi
$ bootprint openapi <出力したYAMLかJSONファイル> <出力先ディレクトリ>
```
【自然言語処理】日本語のあるある前処理

自然言語処理あるあるな日本語の前処理をまとめようと思います。（随時更新予定）

## 全角 -> 半角

```
>>> import unicodedata
>>> 
>>> text = u’１９９４年’
>>> print unicodedata.normalize(‘NFKC’, text)
1994年
```
## 雲 = 固有名詞？？

日本語はmecabでパースする人が大多数だと思います。

かつneologdを辞書として使う人も多くいると思いますが、この辞書を使っていて見つけたあるあるです

```
$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
雲
雲	名詞,固有名詞,一般,*,*,*,雲~,クモノムコウヤクソクノバショ,クモノムコウヤクソクノバショ
EOS
```

クモノムコウヤクソクノバショ・・？
調べたら新海誠監督のアニメ映画でしたw
画面設計で使用したツール比較メモ

## 画面仕様書作成に使用したツール
* markdown
* gitbook-cli (※1)
* Inkscape (※2)

## gitbook-cli, markdownとExcelの比較（所感）
###  gitbook-cli, markdown
#### メリット
* gitで管理することができる。
*  仕上がりがまとまっていて見やすい。

####  デメリット
*  表の一部を結合することができない。
*  表で番号を振っている場合、1つずらすと全て手動で直さなければならない。
*  表が表示できる横幅が狭く、見にくくなってしまう。

###  Excel
#### メリット
・複雑な表を作成することができる。
・関数を使ってスピード感な作成ができる。
・学習コストがかからない。
####  デメリット
・gitで管理することができない。
・gitbookに比べると見づらい。

## 各ツールのインストールと、簡単な操作手順メモ
(※1) gitbook-cli : ドキュメントを冊子形式にまとめることができるツール
$ npm install -g gitbook-cli
$ gitbook init
生成されたSUMMARY.mdに、画面仕様書のmd名を記載すると、html化、ブック化が行われる。

$ gitbook build→ローカル上で、index.htmlからドキュメントを確認することができる
$ gitbook serve →localhost:4000サーバーでドキュメントを確認することができる

ちなみに、、、
$ gitbook ls #gitbookのバージョンを確認
　→ バージョンが3以上だとページ遷移がうまくいかないバグがあるようなので、
gitbook buildから確認をするときは以下のコマンドで、バージョンを下げてからbuildすること。
$ gitbook fetch 2.6.7
$ gitbook build --gitbook=2.6.7


(※2)Inkscape : svgファイルの編集ができるツール
インストール先：https://inkscape.org/ja/
　　1. ctrl + shift + L でレイヤーの操作画面を出し、[+]マークでレイヤーを追加する。
　　2. 作成したレイヤーが選択されていることを確認し、画面を加工する。
　　3. 名前を付けて保存で、ファイルの形式がsvgとなっていることを確認する。
Cognos で新規に作成したグループにフォルダ参照権限付与してもフォルダが表示されない

##概要
Cognos BIで、あるユーザー(例ではcoguser2)を、新規に作成した役割(例ではRole01)にのみ所属し、共有フォルダー上の特定のフォルダ(例ではTestFolder)に以下のようにアクセス権限付与して、これで見えるだろうと思いきや、
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/524909c8-0852-3059-def5-f9edb60ec79a.png)

実際にcoguser2でアクセスすると、こんな風に全く共有フォルダ配下が見えない、という状況で困ってしまう事があります。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ba0abccf-c9e5-1104-8fbf-129d1eaef835.png)

##対応
これは「共有フォルダ」自体にも、Role01の権限を付与する必要があるためで、「共有フォルダ」の権限付与は、このアイコンからできます。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5a4187b0-0daf-c5bc-7396-789c57ea80e5.png)

権限タブでRole01に権限を付与します。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2daf9629-c506-d27b-f4eb-6d5a81aa1219.png)

するとこのように、全部のフォルダが見えるようになります。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/0c60248d-5271-0093-0cdd-939f2a83a020.png)

他のフォルダを見せたく無いのであれば、各フォルダでRole01に「拒否」の権限付与します。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/63b5939b-8d18-c0e3-97d3-297bcd5098bc.png)

TestFolder以外は見えなくなりました。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2b140635-f8d7-e7fa-d5e0-32f6704db222.png)

Cognos Analyticsの場合は、こんな感じの画面ですね。
Cognos BIと違って、「アクセスが拒否されました」みたいな文言は出ないので、悩みこんでしまう方も多いかも知れません。
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d58f69f3-50e2-64d0-7c7a-e0dd138e47ae.png)

共有フォルダ=チーム・コンテンツのプロパティはここにあります。
Cognos BI同様に設定すれば、各フォルダーが見えるようになります。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d09f396d-1c86-f071-575a-39f372862288.png)
EloquentのRelationshipメソッドには追加条件が設定できます

小ネタです。
つうか、タイトルそのまんま。

Laravel(Lumen)のRelationship(`hasOne()`, `hasMany()`など)メソッドは、所詮は`QueryBuilder`なので更に条件が追加できます。

`Group`クラスと`Member`クラスが1:nの関係にあるとき、`Group`インスタンスから`Member`インスタンス（郡）を取ってくるときは、`hasMany()`メソッドを使いますよね。

```php
class Group extends Model
{
    public function members()
    {
        return $this->hasMany(Member::class);
    }
}
```

```php
$members = $group->members;
```

ここで、さらに`Member`の`status`が`active`なものだけに絞り込みたいとします。
`hasMany()`に`where()`を追加したメソッドを追加しましょう。

```php
class Group extends Model
{
    public function members()
    {
        return $this->hasMany(Member::class);
    }

    // status が 'active' な Member だけを取得する。
    public function active_members()
    {
        return $this->hasMany(Member::class)->where('status', 'active');
    }
}
```

あとはこのメソッドをプロパティとして呼び出すだけです。

```php
$members = $group->active_members;
```

これ、常識だったかな？
Laravel初心者がLaravelのデータベース操作をやってみてすごく面倒だと気付いた


#主キーに関して
>Eloquentは更にテーブルの主キーがidというカラム名であると想定しています。この規約をオーバーライドする場合はprimaryKeyプロパティを定義してください。

>さらに、Eloquentは主キーを自動増分される整数値であるとも想定しています。つまり、デフォルト状態で主キーは自動的にintへキャストされます。自動増分ではない、もしくは整数値ではない主キーを使う場合、モデルにpublicの$incrementingプロパティーを用意し、falseをセットしてください。
[Laravel 5.4 ドキュメント](https://readouble.com/laravel/5.4/ja/eloquent.html)


#Model生成時の指定
なので、Modelファイルを

```
# php artisan make:model Book
```

のように作成し、controller等で

```

use App\Book;

$books = new Book;

$books->book_id   = '0001';
$books->book_name = 'カエルは何処からやってくる'
$books->save();

```

とか書いてしまうと、View上で
`「id」カラムに挿入しようとしたけどテーブルにidが存在しないよ`
とエラーになる。

初心者のこっちからしたら `そもそも「id」に値を挿入しようなんかしてないんだが` という感じでしかない。

##主キーを指定してあげる
エラーになる理由としては、「主キーに関して」に書かれている通りなので、主キーを指定してあげる必要がある。

Modelファイルにて

```
class Book extends Model
{
    protected $primaryKey = 'book_id';
}
```

また、「主キーに関して」に書かれている通り

>自動増分ではない、もしくは整数値ではない主キーを使う場合
以下を追加します。

```
public $incrementing = false;
```

これでエラーがなくなります。

#Maigrationでテーブルを作成時の指定

```
$table->primary('book_id');

```
で`book_id`を`主キー`に指定できるのは分かったけども、
```「あれ、型の指定は何処からするの？」```
と思い調べるけども中々記述の仕方が見つからない(;´Д`)

##テーブル名を指定してあげる
まあ、結論として

```
$table->string('book_id',2)->primary();
```

ごく単純にこれで通りました、はい。
(試しに`$table->primary('book_id');`を`php artisan migrate`実行したら`キーとして指名された列"book_id"は存在しません`と吐かれたので試し上記の書き方をしてみたら上手くいきました)

Migrationの記述の仕方で詳しく書かれていた記事がありましたので載せておきます。
[Laravel5 マイグレーションの操作](http://yokotakenji.me/log/programming/php/laravel5/5293/)


##(おまけ) Migration操作を取り消したい
実行したマイグレーションを取り消したい場合

```
php artisan migrate:rollback
```

で取り消せますが、これは`最後に実行されたマイグレーション操作のみを取り消す`ので、２つ前に実行したマイグレーション操作のみを取り消したりすることはできません。

参考URL:[Laravel 5.4 データベース：マイグレーション](https://readouble.com/laravel/5.4/ja/migrations.html)

なので、この場合1度マイグレーションファイルを新規で作って`up()`内でしたい操作を記述して実行するのがbestかと思います。


#勝手にテーブル名を複数形にされる
>Flightモデルにどのテーブルを使用するか、Eloquentに指定していない点に注目してください。他の名前を明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。今回の例で、EloquentはFlightモデルをflightsテーブルに保存します。モデルのtableプロパティを定義し、カスタムテーブル名を指定することもできます。
[Laravel 5.4 Eloquent：利用の開始](https://readouble.com/laravel/5.4/ja/eloquent.html)



例えば`person`というテーブルがあったとします。
personテーブルにデータを挿入しようとすると

```

use App\Person;

$table = new Person;

$table->test_id   = '0001';
$table->save();

```

LaravelはModelのClass名に対して`複数系の名前`でDBにTableを探しに行くので、上記の場合`people`でTableを探しに行って`「そんなTableないよ」`とエラーになります。

##(おまけ)複数形且つ、スネークケース
テーブル名を明示的に指定する方法は後述しますが、
明示的に指定しない場合、複数形スネークケースで探しにいくことになります。

例)
テーブル名 -> test_records (複数形、スネークケース)
モデル名  ->  TestRecord   (単数形、アッパーキャメルケース)

参考URL
[Eloquent: Getting Started ＃Defining Models](https://laravel.com/docs/5.5/eloquent#defining-models)


##テーブル名を指定してあげる
解決策としてModelファイルであるPerson.phpにテーブル名を指定してあげます。

```
class Person extends Model
{
    protected $table       = 'person';
}

```

現在Laravel作業中なので、追記するかもしれません。

何か間違いや、他に良い方法がありましたら教えて下さると助かります。
EC2スポットインスタンスでとても遅いマシンがあった時の話

がっつりハマったので備忘録として残します。

# 状況
* AWS Lambdaからboto3を利用してスポットインスタンスを起動する仕組みを作成
* ユーザーデータにシェルスクリプトを渡してサービスを起動
* 時々ユーザーデータの処理がとても遅いマシンがいる

# 原因（と思われるもの）
EBSボリュームタイプが旧世代の`standard`だった。

# 解決策
ボリュームタイプをgp2に変更

# 結果
今のところ問題は起きていない。

# ハマりどころ
* boto3でスポットリクエストを作成する際、ボリュームタイプを指定しないとデフォルトで`standard`になる。

気付かなかったー
お手軽簡単PHPでロガーを作ってみた

# はじめに

[前回](http://qiita.com/neriai/items/1614e3c41def7bfa72cf)に続いて、勢いでロガーを作ってみました。といってもMonologをカスタマイズしただけです。

# 準備

Composerを使ってMonologを入れます。

## Composerのインストール

```zsh
curl -s https://getcomposer.org/installer | php -- --install-dir={インストール先}
```

## composer.jsonの作成

```json:composer.json
{
  "require": {
    "monolog/monolog": "1.2.*"
  }
}
```

## Monologのインストール

```zsh
composer install
```

# ソースコード

```php:Log.php
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\NativeMailerHandler;
use Monolog\Formatter\LineFormatter;
  
/**
 * ログの基底クラスです
 */
class Log
{
 
    /**
     * @var object container for the Monolog instance
     */
    private static $logger;
 
    /**
     * @var array $levels ログレベル情報
     */
    private static $levels = array(
        'DEBUG' => Logger::DEBUG,
        'INFO' => Logger::INFO,
        'NOTICE' => Logger::NOTICE,
        'WARNING' => Logger::WARNING,
        'ERROR' => Logger::ERROR,
        'CRITICAL' => Logger::CRITICAL,
        'ALERT' => Logger::ALERT,
        'EMERGENCY' => Logger::EMERGENCY,
    );
 
    /**
     * セットアップをします
     *
     * @return void
     */
    public static function setup($config)
    {
        self::$logger = new Logger('gnlp');
  
        $format = "%datetime% [%level_name%] %message%\n";
        $formatter = new LineFormatter($format);
  
        $file = $config['path'] . date('Ymd', strtotime('now')) . '.log';
  
        $stream = new StreamHandler($file, $config['level']);
        $stream->setFormatter($formatter);
  
        self::$logger->pushHandler($stream);
    }
 
    /**
     * ログ情報を出力します
     *
     * @param mixed $content 出力内容
     * @param string $level ログレベル
     */
    public static function output($content, $level = 'INFO')
    {
        if (is_null(self::$logger)) {
            return;
        }
         
        self::$logger->log(self::$levels[$level], $content);
    }
}
```

# 使い方

## セットアップ

```php
$config = array();
$config['path'] = {ログ出力先}
$config['level'] = {デフォルトのログレベル}
Log::setup($config);
```

## 出力

```php
try {
    return true;
} catch (Exception $e) {
    Log::output($e, {ログレベル});
    return false;
}
```

## 補足

- {日付} [{エラーレベル}] {エラーメッセージ}　のように出力されます。


# 全ページリンク
- [お手軽簡単PHPでクラスオートローダを作ってみた](http://qiita.com/neriai/items/ba6e3126c33132907080)
- [お手軽簡単PHPで設定ファイルローダを作ってみた](http://qiita.com/neriai/items/1614e3c41def7bfa72cf)
- [お手軽簡単PHPでロガーを作ってみた](http://qiita.com/neriai/items/24a63bd66fd3563cacf7)
- [お手軽簡単PHPでバッチ用フレームワークを作ってみた](http://qiita.com/neriai/items/3fdc070f3b429e792a23)
GUIでもEmacsでも使えるMacのショートカットキー

# 今日から使えるMacのショートカット
Emacsユーザーは日々使うのでよく知られた機能ですが実は結構いろいろなGUIアプリケーションでそのショートカットが利用できるんです。
結構いろいろなところで動きます。
きっと役に立つので幾つか紹介します(ﾟдﾟ)！
`Ctrl - a`こんな感じで書きますがこれはCtrlキーとaを同時押しということです(ﾟдﾟ)！

- 行頭へ
- 行末へ
- 一行削除
- 単語区切りでの移動

### 行頭へ
いっきに行頭へ移動します
vimmerならきっと^を押しちゃうことでしょうがemacsなら`Ctrl - a`。
このキーを押すとChromeでもメモでもSlackでもとりあえず行頭へ移動することができます。

### 行末へ
今度は逆に行末へ
Vimなら$
Emacsなら`Ctrl - e`
これで一気に行末へ移動できます

### １行削除
行単位で削除する場合
vimなら`dd`
Emacsなら`Ctrl - k`
これで１行削除できます。ただしこれ、カーソルが存在するところより後ろ１行を削除するという意味になっているのでそこだけは留意してください

### 単語単位での移動
これはvimなら`w`で移動すると思います。
emacsは`Opt - ← →`で移動します。
Chromeとかなら漢字もしっかり認識して移動してくれます。
結構便利！

だいたいこんな感じです
よかったら使ってみてくださいね(*´ω｀*)
面接で絶対に押さえておきたいアルゴリズム問題(3)

## 問題：Palindrome Number


渡された入力値が、後ろから読んでも前から読んでも同じ整数だった場合、trueを返せよ。
同じでなかった場合はfalseを返す。


## 例：

```
input： 1234321 
return: true

input: 6776
return: true

input 14356
return: false
```

## ヒント：

入力値を全部逆さまに並べて、最初の入力値と比較するとよし。

## 解答：

```

    func isPalindrome(_ x: Int) -> Bool {

    let originalX = x
    var xNew = abs(x)
    
    var reversed = 0
    
        while xNew > 0 {
            reversed = reversed * 10 + xNew % 10
            xNew = xNew / 10
        }

        if reversed > Int(Int32.max) || reversed < Int(Int32.min) {
            reversed = 0
        }

    return reversed == originalX
}
```
laravel5.4＆MySQLでテーブルを作成するときに767 bytesエラー


こんなエラー

``` 
 [Illuminate\Database\QueryException]                                                                                                                
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add uniq  
  ue `users_email_unique`(`email`))  



  [Doctrine\DBAL\Driver\PDOException]                                                                              
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes  
                                                                                                                   

                                                                                                                   
  [PDOException]                                                                                                   
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes 
```

ぐぐったら、charsetがutf8mb4というのになっていて1文字が最大4byteだからオーバーするらしい。
既存のテーブルに追加しようと思ってたので、
charsetをutf8にしてmigrateで解決。

```rb:database.php
//            'charset' => 'utf8mb4',
//            'collation' => 'utf8mb4_unicode_ci',
            'charset' => 'utf8',
            'collation' => 'utf8_general_ci',
```
Bluemix の flask で Cloudant からデータを取得する

次のページに、Cloudant への接続方法が書いてあります。
[How can I connect to Cloudant from a Flask App running in Bluemix?](https://stackoverflow.com/questions/30597687/how-can-i-connect-to-cloudant-from-a-flask-app-running-in-bluemix)

この例では、データベースの作成の例しかないので、データベースのリードのサンプルを作成しました。

作成したデータベースへのデータの入れ込みは手動で行いました。

改造が必要なのは、welcome.py だけです。

```py
# -*- coding: utf-8 -*-
#
#	welcome.py
# ----------------------------------------------------------------------
import os
import json
import requests
from flask import Flask
from flask import jsonify

app = Flask(__name__)

app.config.update(
    DEBUG=True,
)

# ----------------------------------------------------------------------
def define_url_auth_proc():
	vcap = json.loads(os.getenv("VCAP_SERVICES"))['cloudantNoSQLDB']

	cl_username = vcap[0]['credentials']['username']
	cl_password = vcap[0]['credentials']['password']

	url         = vcap[0]['credentials']['url']
#
	auth        = ( cl_username, cl_password )
#
	return url,auth
# ----------------------------------------------------------------------
@app.route('/')
def welcome():
    return app.send_static_file('index.html')

# ----------------------------------------------------------------------
@app.route('/getdb/<db>')
def get_db(db):
    try:
        url,auth = define_url_auth_proc()
    except:
        return 'A Cloudant service is not bound to the application.  Please bind a Cloudant service and try again.'

    rr=requests.get( url + '/' + db, auth=auth )
    dict=rr.json()
    return jsonify(results=dict)


# ----------------------------------------------------------------------
@app.route('/getdb2/<db>')
def get_db2(db):
    try:
        url,auth = define_url_auth_proc()
    except:
        return 'A Cloudant service is not bound to the application.  Please bind a Cloudant service and try again.'

    url_aa =  url + '/' + db + '/_all_docs?include_docs=true'
    rr=requests.get( url_aa, auth=auth )
    dict=rr.json()
    return jsonify(results=dict)
#
# ----------------------------------------------------------------------
@app.route('/createdb/<db>')
def create_db(db):
    try:
        url,auth = define_url_auth_proc()
    except:
        return 'A Cloudant service is not bound to the application.  Please bind a Cloudant service and try again.'

    requests.put( url + '/' + db, auth=auth )
    return 'Database %s created.' % db
# ----------------------------------------------------------------------
port = os.getenv('VCAP_APP_PORT', '5000')

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=int(port))
# ----------------------------------------------------------------------
```

手動でデータを入れた状況

![cloudant_jun2700.png](https://qiita-image-store.s3.amazonaws.com/0/179446/815fe98c-6fa8-687e-d04b-2a154e37a7f7.png)

実行結果
http://ekzemplarocc.mybluemix.net/getdb/test

![cloudant_jun2701.png](https://qiita-image-store.s3.amazonaws.com/0/179446/6bbe5b82-8076-b9e9-1ebe-2565558676b9.png)

http://ekzemplarocc.mybluemix.net/getdb2/test

![cloudant_jun2702.png](https://qiita-image-store.s3.amazonaws.com/0/179446/f8928d05-a37b-4f33-e61b-992c1baa941f.png)

実行する時には、アプリが、Cloudant NoSQL に接続している必要があります。
Cognos レポートでグラフ内数値がグラフに近すぎて見にくい場合の対応

##概要
Cognos BIで棒グラフなどのバーの実際の数値を表示した場合、デフォルトで以下のような表示になります。
バーの右端にぴったり引っ付く状態で、数値が始まるので、見にくいですよね。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f6171ed2-c873-2312-c117-c737caa45480.png)

小さな事ですが、これで文句を言われる事も多く、「値の表示位置」の変更では直らないので困っている方もいらっしゃるかもと思い、簡単ですが投稿します。

##実装方法
数値データの「データ形式」のプロパティで、例は表示形式が「数値」を選んだ場合ですが、パターンのところで「　　###,###.##」というように、#の左側に半角ブランクを数個並べて指定します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5205770b-fefc-c9cc-0344-95d4ac3a37f8.png)

するとこんな感じに、多少見やすくなります。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f913ca89-3f02-9ea2-d47c-0630866c13d0.png)

簡単ですが、困った時には思い出して頂ければ幸いです。
[モバイルアーキテクチャ ] Cognitoにどこまで任せるべきか？研究してみた


CognitoとはAWSサービスの一つであり、主にモバイルアプリの認証システムとして利用されている。
Cognitoには主に3つの機能があり、それぞれ以下のように自分は解釈している
（ツッコミをいただくために後悔してるので、間違ってたら是非教えてください）

## Cognitoのサービス達
### Cognito UserPool

#### 概要
emailの確認、SMSによる確認、パスワードの再発行などもやってくれるメールによる認証機能。

#### メリット
- ステップが複雑なメール認証機能を実装する手間がない
- ユーザーの認証ステップの保持、Email, Passwordの暗号化など、面倒なデータを保持せずに済む（AWS管理コンソールにおいて、ユーザーの権限などいじる必要はあるけど）

#### デメリット
- 既存のメール認証システムから移行する場合、name, email, phone numberなどはcsvでimportできるが、passwordだけはimportできないので、ユーザーにpasswordの再設定を依頼する必要がある。そのため、移行コストは高い
- データを自分たちで保持していないため、トラブルシューティングの工数が増す危険がある


### Cognito IdentityPool

#### 概要
メール、Google, Facebookなどで認証されたユーザーに対して、特定のAWSサービスへのアクセスを許可する（=認可）の機能。
未認証ユーザーも取り扱い可能で、未認証ユーザーは認証ユーザーと別のrole（権限）を与えることができる

#### メリット
- アクセストークンに関する実装をする必要がない
- サーバーレスアーキテクチャーに移行しやすい（もとからサーバーレスで組むつもりならほぼ必須要件）

#### デメリット
- API Gateway経由で、APIを公開する際に、Lambdaならuser情報を取得できるが、HTTPプロキシでELBやEC2を繋いだときは、ユーザー情報が取得できない（？）
- tokenの受け渡しだけで、未認証ユーザーの照会をすることができない？（idをパラメータに含めないといけない？）


### Cognito Sync
#### 概要
Cognito IdentityPoolに存在するユーザーのユーザー設定を保持・同期できるサービス。認証認可とは関係ない。

#### メリット
機種変時、マルチデバイス対応時に、設定項目を同期するのに便利。

#### デメリット
今の所見つかってはいないが、iOSでいうUserDefaultに入れるような情報の保持、復元など用途が限定的なので、使わなくていいアプリケーションもたくさんありそう


## 考察
### UserPool
#### 開発コスト
[使わない場合]

- 単純なemail認証であったとしても、rubyだとdeviseなど便利なgemがあるものの、センシティブなデータを扱うために確認工数なども膨れる可能性が高い
- SMS認証も必須だとすると、それをサポートしてるライブラリも少ないため開発工数は爆発的に膨らみそう

[使った場合]

- ライブラリの利用方法を覚える必要があるものの、Mobile Hubなどを利用することでそのコストを格段に下げることができる
- SMS周りは特にハマるらしい。http://qiita.com/aki/items/e35e1bea8c27cfab5e9e
- アクセストークンの検証も忘れがち。http://qiita.com/devalon/items/721ef4bdec80e1e6847c, http://qiita.com/ya-mada/items/154ea6e10f9f788bfdd5

#### 運用コスト
[使わない場合]

- いつでもデータにアクセス可能なので、ユーザー固有の問題に対するトラブルシューティングが比較的容易
- 認証の度にDBへのアクセスが走るためシステムリソースが喰われる
- センシティブなデータにいつでもアクセス可能なため、ルール作りや社内でのアクセス制御が面倒
- UserPoolを使いたくなった時に、ユーザーにpasswordの再設定を依頼する必要がある

[使った場合]

- データを自分たちで保持していないため、トラブルシューティングに時間がかかることもありそう
- AWSのユーザー権限で、アクセス制御が可能なので、そこは簡単
- AWS Cognitoが落ちたら、機能の大半が使えなくなるというリスクを孕んでいる
- export機能はないので、AWS Cognitoから独自の認証機能に移行する場合は、APIを叩いてデータをexportした上で、ユーザーにpasswordの再設定を依頼する必要がある

#### 所感
まだ認証システムを独自で持ってないなら、使うと大幅に開発コストが削減できそう


### Cognito IdentityPool
#### 開発コスト
[使わない場合]

- Facebook, Googleなどのuidに相当する情報を保持する必要がある
- クライアントに一時的なアクセストークンを発行する必要がある
- アクセストークンの検証機構を作る必要がある

[使った場合]

- uidの保持をしてくれる
- アクセストークンの発行、検証をawsがよしなにしてくれるが、ec2, elbでそれをやろうとすると、前段にAPI Gatewayをhttp proxyとして置く必要がある
- API Gateway + Lambda ならユーザーの照会までしてくれるが、ec2, elbだとそれができない？
- elb, ec2との相性はわるそうで、未認証ユーザーの照会ができない？
- 上記の理由で構成が複雑化する

#### 運用コスト
[使わない場合]

- uidなどの情報へのアクセス制御をする必要がある
- アクセストークン発行に際して、システムリソースを食う
- 保守しないといけないコードが増える
- サーバーレスアーキテクチャにする際にIdentityPoolに乗り換えるか、STSへのリクエストを独自で頑張るかする必要がある。1ユーザーに認証情報を複数持てるようにしておけば、IdentityPoolのidentityIdをuidとして紐付けできるので、移行コストはそこまで高くないと思う（？）

[使った場合]

- 一部システムを移譲できるものの、構成が複雑になり、全員がクラウドネイティブな考えがない限り、運用が大変になりそう
- クラウドネイティブ的な構成になると、デバッグが大変そう（慣れてないだけ？）

#### 所感
使うことによって、構成が限定されるため初期から使う必要はなさそう。
サービスが大きくなってきて、クラウドを存分に使いたくなったら検討したい


## 疑問
### 誰か、もし知ってたらおしえてください
- API Gateway経由で、APIを公開する際に、Lambdaならuser情報を取得できるが、HTTPプロキシでELBやEC2を繋いだときは、ユーザー情報が取得できないっぽいんですが、何か方法ないですかね？（API Gatewayにおいて、 `Integration Type = AWS Service` というのがあるけど、これでどうにかできないものか...）
FactoryGirlのtraitをつけたもの(複数可)を定義する

# 基本

```ruby:spec/factories/user.rb
FactoryGirl.define do
  factory :user, class: 'User' do
    sequence(:name) { |n| "user#{n}" }
    sequence(:account) { |n| "account#{n}" }
    sequence(:email) { |n| "user#{n}@email.com" }
    password 'password'
    password_confirmation 'password'

    trait :not_activated do
      activated false
    end

    trait :activated do
      activated true
    end
  end
end
```

この用にUserを定義すると`create(:user, :activated)`のようにすることで、使うことができる。

#traitを指定して新しく名前を定義する

ただ、traitが複雑になると、初期化部分が長くなるので、以下のように命名しておくと便利である。上のファイルの一番最後のTrait定義の後に書けばよい。今回は、traitが二個しかないので、あまり意味がないが、複数出てきたときに使える。

```ruby
factory :activated_user, traits: [:activated]
factory :deleted_user, traits: [:deleted]
```

これで、`create(:activated_user)`として使うことができる。
RubyでグローバルIPを取得する方法（標準ライブラリでできる！）

# やりたいこと

* Rubyで、自分のマシンのグローバルIPアドレスを取得する

# やり方

* 必要な標準ライブラリは`resolv`
* ip_addr_strにグローバルIPが手に入る（型は文字列型）

```ruby
require 'resolv'
ip_addr_str = Resolv::DNS.new(:nameserver=>'ns1.google.com').getresources("o-o.myaddr.l.google.com", Resolv::DNS::Resource::IN::TXT)[0].strings[0]
# => "62.513.271.281"
```


# 動機と経緯

グローバルIPを知りたくなることは、たまにあり、今まで`curl`でグローバルIPを教えてくれるサイトを使って、手に入れていました。
だけど、これだとサーバーが落ちていたり、サーバーがサービスを終了したりして、困っていました。`dig`コマンドでGoogleのDNS(？ちゃんと理解していません)でグローバルIPが手に入ることを知り、いままでよりGoogleなら安定的に入手できそうで、いい感じだったので、それをRubyでできないか探して、見つけた感じです。


# 参考になったところ一覧
* nslookupでグローバルIPを調べる方法 - https://code.blogs.iiidefix.net/posts/get-public-ip-using-dns/
* Rubyのresolvライブラリ - https://docs.ruby-lang.org/ja/latest/library/resolv.html
* RubyのresolvライブラリのDNSクラス - https://docs.ruby-lang.org/ja/latest/class/Resolv=3a=3aDNS.html
* 実際のグローバルIPを確認できるサイト - https://www.cman.jp/network/support/go_access.cgi
Slick Sliderの使い方

# Slick

## ダウンロード
http://kenwheeler.github.io/slick/

## 読み込み
ファイルをダウンロードして、cssを記述します。
scssなどもダウンロードできるので好きなものをコンパイルしてください。

```html
// css
<link rel="stylesheet" href="slick.css">
<link rel="stylesheet" href="slick-theme.css">

// js
<script src="https://code.jquery.com/jquery-1.12.0.min.js"></script>
<script src="drawer.min.js"></script>
```

## 設定

```html
<div class="slider">
  <div>コンテンツを書く</div>
  <div>コンテンツを書く</div>
  <div>コンテンツを書く</div>
</div>
```
```js
$(document).ready(function(){
    $('.slider').slick({
    });
});
```

## オプション

|機能  |値  |説明  |
|---|---|---|
|autoplay  |true/false  |オートプレイ  |
|autoplaySpeed  |3000  |オートプレイスピード  |
|dots  |true/false  |ドットを表示  |


## 使用例

```js
$(document).ready(function(){
    $('.slider').slick({
        autoplay: true,
        autoplaySpeed: 3000,
    });
});
```
面接で絶対に押さえておきたいアルゴリズム問題(2)

## 問題:  Reverse Integer

渡される整数を逆にして返せよ。
ルール:  入力値は 32-bit 符号あり整数(32-bit signed integer) でなければいけない。32-bitを超えた場合は、0を返せ。


例) 
Example1: x = 123, return 321
Example2: x = -123, return -321 
Example3: x = 1534236469, return 0

ヒント)
32-bit整数のサイズはどうやって割り出す？ 

32-bitのMAX値は 2,147,483,647　で
32-bitのMIN値は  -2,147,483,648　だけど、

swiftにはMAXとMIN値を取得する関数がある。
参考：http://www.codingexplorer.com/integers-and-numeric-literals-in-swift/


## 解答例
この方のJavaコードを参考にしました〜
https://discuss.leetcode.com/user/flyflybird

```
func reverse(_ x: Int) -> Int {
    
   
    let maxValue:Int = Int(Int32.max)
    let minValue:Int = Int(Int32.min)
    
    let sign = x < 0 ? -1:1
    var x = abs(x)
    var reversed = 0

    while x != 0{

        print("\(reversed * 10) + \(x % 10) = \(reversed * 10 + x % 10)")
        reversed = reversed * 10 + x % 10
        
        x = x / 10

        print(x)

        if reversed　*　sign > maxValue || reversed　*　sign < minValue {
            return 0
        }        
    }
  
    return reversed * sign
}

```
## コンソールログ

入力値が　**1534236469**　だったとして
print("\(reversed * 10) + \(x % 10) = \(reversed * 10 + x % 10)")
print(x)
が吐き出した内容は以下です！

```
0 + 9 = 9
153423646
90 + 6 = 96
15342364
960 + 4 = 964
1534236
9640 + 6 = 9646
153423
96460 + 3 = 96463
15342
964630 + 2 = 964632
1534
9646320 + 4 = 9646324
153
96463240 + 3 = 96463243
15
964632430 + 5 = 964632435
1
9646324350 + 1 = 9646324351
0
```
## さらにわかりやすくした図


![Screen Shot 2017-06-26 at 6.21.08 PM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/c07da748-4d70-add6-aaf8-f14871e1138d.png)
pyperclipで日本語が使えない

#pyperclipで日本語が使えない
『[退屈なことはpythonにやらせよう](https://www.oreilly.co.jp/books/9784873117782/)』を読んでます。
この中で、pyperclipを使用するサンプルプログラムがあるんですが、日本語を使用するとエラーで動作しませんでした。
エラーは以下みたいなやつでした。（すみません、最後らへんは覚えてないです）
「UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 0: ~~~~」

##原因
- python2.7の使用
- VS Codeでpythonを実行

以上の２点でした。
[本家サイトのissue](https://github.com/asweigart/pyperclip/issues/74)を見ると中国語はサポートしてないの？っていうのがあって、その中で中国語で動作しないっていうのを報告されてました。
ただ、「エンコードをutf-8指定すると動作するよ〜」とも報告されていて、私の環境でも同じようにすると動作しました。
しかし、別の方が「エンコード指定しなくても動くよ〜」って報告されていました。
私の環境ではエンコード指定しないと動作しない・・・
なぜ！！

##調査

```py3
import sys
print('defaultencoding:', sys.getdefaultencoding())
```
上記コードでどのエンコードが指定されているかを調査！
結果、「ascii」！
なぜ！！
python3入れて、python3で実行させとるやろ！！
VS Codeのタスクランナーで実行させてたので、どのコマンド実行させてるか見ると・・・「python」の文字！
python3じゃ無い！！
python3に変えて、もう一回デフォルトエンコードを調査！
「utf-8」の文字！
pyperclipを実行！
同じエラーで落ちる！！
VS Codeで実行させるのが悪いのかと思い、ターミナルで実行！
無事できました！！

というわけで、原因を特定しました。
VS Codeだとなぜ実行できないのかは分からないです。。。
pythonの勉強を始めたばかりなので、おかしいところがあればご指摘ください！

**2017/06/29：追記**
VS Codeだとエラーになる原因ですが、どうやらVS Codeがasciiに変換しちゃってるらしい。
[github](https://github.com/Microsoft/vscode/issues?utf8=%E2%9C%93&q=is%3Aissue%20task%20ascii)見ると、いっぱいissue立ってた。
開発者側が提示する解決策だと、「task.json」に「"runner": "terminal"」の一文を足せとのこと。
要は、ターミナルで実行させればエラーにならないんだから、ターミナルで実行させればいいじゃんってことですね。
私の環境では、これでtaskでpython実行でもエラーが起こることはなくなりました。
修正できない感じなのかな・・・？
[TensorFlow] 学習済みモデルInception-v3から特徴量を抽出する

TensorFlowで、Inception-v3モデルを使って特徴量抽出をします。

1. 以下から学習済みモデルをダウンロードする  
http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz
1. 上記ファイルを解凍して、classify_image_graph_def.pbを抽出
1. ソースコード  
[feature_extraction.py](https://github.com/piyo-papa/Feature_extraction_from_inception_v3/blob/master/feature_extraction.py)  

`IMG_PATH`と`MODEL_PATH`を環境に合わせて書き換えてください。

~~~python:feature_extraction.py
import tensorflow as tf
import numpy as np

IMG_PATH = 'path/to/input/image.jpg'
MODEL_PATH = 'path/to/classify_image_graph_def.pb'

# 学習済みモデルの読み込み
inception_v3 = tf.gfile.FastGFile(MODEL_PATH, 'rb')
graph_def =tf.GraphDef()
graph_def.ParseFromString(inception_v3.read())
tf.import_graph_def(graph_def, name='')

with tf.Session() as sess:
    # 抽出層の指定
    pool3 = sess.graph.get_tensor_by_name('pool_3:0')

    # 入力画像の読み込み
    image_data = tf.gfile.FastGFile(IMG_PATH, 'rb').read()

    # 特徴量の抽出
    features = sess.run(pool3, {'DecodeJpeg/contents:0': image_data})
    print(np.squeeze(features))

~~~


## PNGファイルを入力する場合
上記はJPEGファイルの入力のみを受け付けます。
PNGファイルを入力したい場合は、特徴量の抽出時に以下ように、'DecodeJpeg:0'ノードを指定します。

~~~
features = sess.run(pool3, {'DecodeJpeg:0':image_data})
~~~
elastic4sでカタカナ、ローマ字を使う

インデックス作成するときにカタカナとかローマ字に変換してしまえばユーザがカタカナとか入力した時でもヒットさせることができます。

使うのは[kuromoji_readingform](https://www.elastic.co/guide/en/elasticsearch/plugins/2.0/analysis-kuromoji-readingform.html)です

use_romajiでカタカナとローマ字を切り替えることができます。

elastic4sのDSLで使えるようにするためにKuromojiReadingformを作成します。

```
import org.elasticsearch.common.xcontent.XContentBuilder
import com.sksamuel.elastic4s.analyzers.TokenFilter

import com.sksamuel.elastic4s.analyzers.TokenFilterDefinition

case class KuromojiReadingform(name: String, userRomaji: Boolean) extends TokenFilterDefinition {
  val filterType = "kuromoji_readingform"

  override def build(source: XContentBuilder): Unit = {
    source.field("use_romaji", userRomaji)
  }
}

object KuromojiReadingform {
  def apply(name: String, userRomaji: Boolean) = new KuromojiReadingform(name, userRomaji)
}
```

あとはマッピングを定義して

```
createIndex("bands").mappings(
  mapping("artist") as (
    textField("name"),
    textField("description") analyzer "my_analyzer"
  )
)
  .analysis(
    CustomAnalyzerDefinition(
      "my_analyzer",
      KuromojiTokenizer,
      KuromojiReadingform("kuromoji_kana_filter", userRomaji)
    )
  )
```

analyze投げるとカタカナかローマ字に変換されているのがわかります。

```
val response: AnalyzeResponse = client.java.admin().indices().analyze(new AnalyzeRequest("bands").analyzer("my_analyzer").text("働きたくない")).actionGet()
response.forEach { token =>
  {
    println(s"""
  |token: ${token.getTerm()}
  |start_offset: ${token.getStartOffset()}
  |end_offset: ${token.getEndOffset()}
  |type: ${token.getType}
  |position: ${token.getPosition}
  """.stripMargin)
  }
}
```

出力結果
useRomajiがtrueの場合

```
token: hataraki
start_offset: 0
end_offset: 2
type: word
position: 0


token: taku
start_offset: 2
end_offset: 4
type: word
position: 1


token: nai
start_offset: 4
end_offset: 6
type: word
position: 2
```

userRomajiがfalseの場合

```
token: ハタラキ
start_offset: 0
end_offset: 2
type: word
position: 0


token: タク
start_offset: 2
end_offset: 4
type: word
position: 1


token: ナイ
start_offset: 4
end_offset: 6
type: word
position: 2
```

完全なコードは[こちら](https://github.com/tky/elasticsearch-experiments/blob/master/src/main/scala/KuromojiReadingFormSample.scala)
symfony ELB - EC2 間でhttp通信した際にhttpsに変換したい場合

# 内容
- AWSでユーザー - ELB間がhttps,ELB - EC2間がhttpで通信されている時にhttpに遷移してしまう現象が発生した。

# 解決方法
- symfonyの公式docに書いてあった。

## 2系
- app.phpに下記の処理を追記する。

```php
$request = Request::createFromGlobals();
+ Request::setTrustedProxies(array('127.0.0.1', $request->server->get('REMOTE_ADDR')));
+ Request::setTrustedHeaderName(Request::HEADER_FORWARDED, null);
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

```
- http://symfony.com/doc/2.8/request/load_balancer_reverse_proxy.html


## 3系

```php
    Request::setTrustedProxies(
    // trust *all* requests
    + array('127.0.0.1', $request->server->get('REMOTE_ADDR')),

    *// if you're using ELB, otherwise use a constant from above
    Request::HEADER_X_FORWARDED_AWS_ELB
```
- http://symfony.com/doc/current/request/load_balancer_reverse_proxy.html
IFTTTのWeather Undergroundで取得する地域を設定する方法

#Weather Undergroundで別地域の天気情報を取得
デフォルトで日本の天気情報を取得するようになっています。日本以外の天気情報を取得する設定について記述しています。

##設定方法

<img width="375" alt="IMG_4374.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/152003/12761b03-c5b8-1a91-0f8b-56ae3e840aa2.png">
〔My Applets〕の〔Services〕を選択すると、現在使用しているサービスが表示されます。〔Weather Underground〕を押下します。


<img width="375" alt="IMG_4375.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/152003/951bae1a-db84-85b4-ef09-115f0464558c.png">
Weather Undergroundの設定をしていきます。右上の歯車マークを押下します。


<img width="375" alt="IMG_4376.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/152003/930e49d2-a025-bfdb-b982-fec4b31722b3.png">
Locationを設定します。〔Edit connection〕を押下します。


<img width="375" alt="IMG_4377.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/152003/ee937276-2b1b-a448-2d39-a6565015ef34.png">
テキストボックスに設定したいLocationを入力し、〔Seach〕を押下します。


<img width="375" alt="IMG_4378.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/152003/fcd36d59-b1d3-f1dd-2a24-d3baf0ae5411.png">
設定したいLocationを選択します。


設定は以上です。
#最後に
IFTTTを使い始めたばかりなので備忘録のためにも記事を書いていこうと思います。
絶対に押さえておきたいアルゴリズム問題(1)

## 問題: TwoSums

整数の配列を渡された時、足したら答えがターゲットになる2つの数字の指数を返せ。
ルールとして、同じ数字を使ってはいけない。

例)
2つの数字, "2" と "7" を足すとターゲットになるので、
nums配列の索引 "0" と "1"を返す

```
nums = [2, 7, 11, 15]
target = 9
```
```
nums[0] + nums[1] = 2 + 7 = 9,
```
```
return [0, 1].
```



### ヒント!!　
こんな関数で始めてみよう。

```
func twoSum(_ nums: [Int], _ target: Int) -> ((Int, Int))? {

}

```


### 答え例はこちら！

```example1.swift
var arrayN = [1,4,5,6,8,9,11]
var target = 6


func twoSum(_ nums: [Int], _ target: Int) -> (Int, Int)? {

    var dict = [Int: Int]()

    for i in nums.indices {

        if let newK = dict[nums[i]] {
            return (newK, i)
        } else {
            dict[target - nums[i]] =  i

            print("Dictionary: \(dict)")
        }
    }

    return nil  // もし、2つの数字の合計がターゲットに見合わない場合はnilを返す。
}

print("Answer: \(String(describing: twoSum(arrayN, target)))")

```
メモ： dict[key,value] だとすると、key = target - num[i] で value = i
メモ： dict[nums[i]] が nilだった場合、 elseが実行される。


ループの(index,value)を使えばもっと楽かも。

```example2.swift
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
        
        var dictionary = [Int:Int]()
        
        for (i,value) in nums.enumerated() {
            
            if let first = dictionary[value] {
                return [first,i]
            } else{
                dictionary[target - value] = i
            }
        }
        return [0]
    }
```

### 答えとログ

xCodeのコンソールの値を見るとわかりやすいよ！こうすることで1巡するだけで、答えが割り出せるようになっている。

```
Dictionary: [5: 0]
Dictionary: [5: 0, 2: 1]
Answer: (0, 2)
Program ended with exit code: 0
```




コードの答えはRay Wenderlich さんから拝借しました。
https://github.com/raywenderlich/swift-algorithm-club/tree/master/Two-Sum%20Problem#two-sum-problem
windowsでTensorFlow その26

#概要
windowsでTensorFlowやってみた。
生tensorflowは、つらいので、1.2にして、Highlevel apiやってみた。
偶数分類やってみた。

#環境
windows 7 sp1 64bit
anaconda3
tensorflow1.2

#サンプルコード

```
import tensorflow as tf
import tensorflow.contrib.slim as slim
import numpy as np
from sklearn import metrics, cross_validation
from tensorflow.python.framework import constant_op
from tensorflow.python.framework import dtypes
from tensorflow.python.training import gradient_descent
from tensorflow.contrib.losses.python.losses import loss_ops
from tensorflow.contrib.layers.python.layers import layers
from tensorflow.python.ops import math_ops
from tensorflow.contrib.slim.python.slim import learning
from tensorflow.python.framework import ops

def binary_encode(i):
	return np.array([i >> d & 1 for d in range(8)])

def even_odd_encode(i):
	if i % 2 == 0:
		return np.array([1])
	else:
		return np.array([0])

trX = np.array([binary_encode(i) for i in range(1, 256)])
trY = np.array([even_odd_encode(i) for i in range(1, 256)])
x_train, x_test, y_train, y_test = cross_validation.train_test_split(trX, trY, test_size = 0.2, random_state = 42)

with ops.Graph().as_default():
	X = constant_op.constant(x_train, dtype = dtypes.float32)
	Y = constant_op.constant(y_train, dtype = dtypes.float32)
	predictions = layers.fully_connected(X, 1, activation_fn = math_ops.sigmoid)
	loss_ops.log_loss(predictions, Y)
	loss = loss_ops.get_total_loss()
	optimizer = gradient_descent.GradientDescentOptimizer(learning_rate = 1.0)
	train_op = slim.learning.create_train_op(loss, optimizer)
	tloss = learning.train(train_op, None, number_of_steps = 30)
	print ("loss: ", tloss)
```
autorunsでHKCUを止めてみた

https://www.google.com/search?sclient=tablet-gws&client=firefox-b&q=hkcu+software+licenses+%E3%82%A6%E3%82%A3%E3%83%AB%E3%82%B9&oq=hkcu+software+licenses+%E3%82%A6%E3%82%A3%E3%83%AB%E3%82%B9&gs_l=tablet-gws.12...0.0.0.47975.0.0.0.0.0.0.0.0..0.0....0...1..64.tablet-gws..0.0.0.Hv8EG9nWh58

windows7(64bit)
私のパソコンで、autorunsを使って止めてみた。

HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
zbwin.wsf
qtsys.exe

(参考)Autoruns for Windows
https://technet.microsoft.com/ja-jp/sysinternals/bb963902.aspx
[Java] doubleからBigDecimalに変換する際のTipsおよび誤差の問題

# 先に結論

- doubleからBigDecimalクラスに変換する（せざるを得ない）場合には、`valueOf`メソッドを使いましょう。
- doubleの性質上、誤差の問題は避けられないので、充分注意しましょう。

# 前提環境

jdk 1.8.0_102
macOS Sierra 10.12.4

# 実装による結果の違い

```java:Java

double d = 0.1;

// コード(1)
BigDecimal bd1 = new BigDecimal(d);
System.out.println(bd1.toPlainString());
// 0.1000000000000000055511151231257827021181583404541015625

// コード(2)
BigDecimal bd2 = new BigDecimal(Double.toString(d));
System.out.println(bd2.toPlainString());
// 0.1

// コード(3)
BigDecimal bd3 = BigDecimal.valueOf(d);
System.out.println(bd3.toPlainString());
// 0.1

// コード(4)
BigDecimal bd4 = new BigDecimal("1.0000000000000003");
System.out.println(bd4.toPlainString());
// 1.0000000000000003

// コード(5)
double d2 = 1.0000000000000003;
BigDecimal bd5 = BigDecimal.valueOf(d2);
System.out.println(bd5.toPlainString());
// 1.0000000000000002

```

- コード(1)のように、`BigDecimal(double)`コンストラクタでインスタンスを生成すると、**多くの場合で誤差が発生し期待通りの結果を得られません。**
- コード(4)のように、文字列から`BigDecimal(String)`コンストラクタを使用して生成すると、正確な値を取得できます。
- コード(2)の`BigDecimal(Double.toString(double))`、および、コード(3)の`BigDecimal.valueOf(double)`メソッドでは、「ほぼ」期待通りの結果を得ることができます。（後述）
- valueOfメソッドはキャッシュが効いてインスタンスが再利用されるケースがあります。すなわち扱う値によっては、コード(2)`BigDecimal(Double.toString(double))`よりコード(3)**`BigDecimal.valueOf(double)`の方が効率的**な場合があります。

ということで、doubleからBigDecimalクラスに変換するには、valueOfメソッドが最善です。
数値ラッパークラスも含め、「数値オブジェクトの変換といえばvalueOf」と覚えてしまえば良いと思います。

ちなみに、`BigDecimal(double)`を使用したことによるバグは、静的コード解析ツール [FindBugs](http://findbugs.sourceforge.net/) で検出することができます。

# 避けられない問題

Javaのdoubleのような[浮動小数点数の性質](http://dangerous-animal141.hatenablog.com/entry/2014/05/10/000000)として、すべての10進数（実数）を表現できません。
それに起因して、コード(5)のように、BigDecimalへの変換以前にdoubleに格納してしまった時点で誤差の発生が避けられない場合があります。

したがって、

- BigDecimalによる計算対象の値を、処理の過程でdoubleに格納しないことが原則
- doubleからBigDecimalへの変換が必要となった場合は、（しかるべき仕様を決めた上で）丸め処理を行う

というように、充分注意を払う必要があります。

# 参考

https://docs.oracle.com/javase/jp/6/api/java/math/BigDecimal.html#BigDecimal(double)

https://docs.oracle.com/javase/jp/6/api/java/math/BigDecimal.html#valueOf(double)

http://dangerous-animal141.hatenablog.com/entry/2014/05/10/000000

http://kyon-mm.hatenablog.com/entry/20101116/1289885313
モブプロ（モブプログラミング）やってみた

[DevLove](https://devlove.doorkeeper.jp/)に参加して、モブプロ（モブプログラミング）を体験しました。

# モブプロとは？
モブプロとは、ペアプログラミングのペアがモブになったものです。モブとは群衆という意味で、たくさんの人数でプログラミングを同時にやります。
1台のパソコンをプロジェクタに接続して、1人がドライバとしてプログラミングをし、他のみんなで実装を考えます。

# いざモブプロ
今回はお互い知らない人達が集まって10人ほどでやりました。私も含めほとんどがモブプロ初めてで、最初にモブプロの簡単な説明を受けて、百聞は一見にしかずということで、やり始めました。
プログラミングの課題は「ローマ数字で足し算」。テスト駆動開発でやる、ドライバは5分交代というルールで開始です。

最初に誰のパソコンでやるか、言語は何か、開発環境はどうするかという所からスタートしました。
そこから！？という感じはしましたが、簡単に開発環境を用意するため[repl.it](https://repl.it/)（Web上で開発できるフリーの環境）を使用し、言語はNode.jsになりました。
Node.js知らないよと思いながらも、みんなもそんなに知らない様子、不安を抱えながらもプログラミングを開始しました。

テスト駆動開発なのでまずはテストですが、テストの書き方もわからない。。。
そんな中ある人がassertがあるよ
ドライバがとりあえずassertと書いてみても動かず
requireと書くよとか、言われるままに書いていくと
var assert = require("assert");
あー定義式か
assert.equal(1,1)
で実行
コンソールに
undefined
？？となっていると、失敗するテストを書こうという声
assert(1,0)
エラー発生。ちゃんと失敗するテストが書けている
おー（拍手！！）

いよいよ実装
テストを書く前にクラスにする？メソッドにする？
クラスにしよう
クラス名は？
メソッド名は？
メソッド名はcalc？
addの方がよいね
assert("II", (new Rome).add("I", "I"));
テスト失敗するので、とりあえず文字列結合でテスト通るはず
で、実装するとテスト成功！（みんなで拍手！！）

その後も、
ブラケットの位置が他と違うよ
typoある
シングルクォーテーションとダブルクォーテーションが混在してるよ
テスト追加してからね
まずはテストを通そう
リファクタリングしよう
実装どうするの？

などとやんや1時間ほどやって、テストが通るたびににみんなで拍手しながら、最終的にはそれなりに実装できました。

# 振り返り

- keep
  - わからないことの解決スピードが速い
  - 知らない言語でもできた
  - 変数名に悩まなくてもいい⇒気持ちが楽
  - 後半はリズムがよくなってきた
  - 途中からでも入りやすい
  - 反応が複数返ってくる安心感があった
  - 楽しかった（拍手！！）
  - 一人では書けないコードがかけそう
  - 考えなくてもコードを書いていける
  - テストを守った（皆でルールを守った）
  - ケアレスミスがすく見つかる

- problem
  - 他人のキーボードに慣れるのが大変
  - 一人で集中してコードを書くような、入り込む気持ち良さがない
  - 判断のスピード感に取り残される
  - この方向性でいいのか考え直す時間が欲しかった
  - どう考えたかが分かるためのコメントなどが残せていなかった
  - 判断がわれた時のジャッジをどうするか
  - 意思決定のジャッジがドライバーになる場合もあった

などの意見がありました。

# おわりに
とにかくみんなで考えて、コードを書いて、テストが通った時にみんなで拍手して喜び合うのが楽しかったです。
振り返りで以下の意見が印象的でした。

- 「考えなくても書いていける」

知らないことでも教えてもらえながらコードを書けるので教育的にもよいかなと思いました。
仲間の間での知識や技術の共有に使えたり、新人教育に使えたりと、モブプロは教育的に使えると思いました。

- 「テストを守った（皆でルールを守った）」

みんなが見て、テストを書かなかったらテスト書くよとか、インデント違うよとか指摘しあって、コーディング規約を守ったり、テストをしっかり書くことにもつながると思います。ルールを守ることで品質向上にもつながりそうです。

- 「わからないことの解決スピードが速い」
- 「判断のスピード感に取り残される」
- 「この方向性でいいのか考え直す時間が欲しかった」

モブプロをやっているみんなで解決して、どんどん実装していける反面、これでいいのか？と思う場面もありました。
最後にモブプロをやっている方の話を聞きましたが、最初にモブプロをやって振り返りをすると上記のような感じになることが多いようです。まずは実装をガンガン進める形になってしまうのですが、振り返りをすることで、最初に設計の時間をとったり、モブ設計をしたりと改善していくことが大切とのことです。
今回は初対面の人だったのですが、知っている仲間でやったり、モブプロを繰り返しやるうちに解決していきそうだと感じました。

今回は初めてモブプロをやってみたのですが、かなりの可能性を感じました。今度は知っている仲間とやってみようと思います。
Swift 3.0 Firebase Databaseのコールバック関数

## Firebaseのデータベースを取得しているとき, 非同期処理が起こるのが問題


例えばこんな取得関数があったとして、

```FirebaseController.swift
let ref = Database.database().reference()

        self.ref.observeSingleEvent(of: .value, with: { (snapshot) in
            for folder in snapshot.children {
                if let snap = folder as? DataSnapshot {
                    print(folder.name) // その1
                }
            }
                }) { (error) in
            print(error.localizedDescription)
        }
            
print(folder.name) // その2

```
**その1 が走っている間に、その2を先に読んでしまう! **

## これを止めるには、コールバック関数を使おう!

この例ではNotificationCenterを使って見ました〜

```
// identifierを定義
let notificationName = Notification.Name("NotificationIdentifier")
```
```
// notificationを受け取るための登録
NotificationCenter.default.addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification), name: notificationName, object: nil)
```
```
// notificationを発信する。
NotificationCenter.default.post(name: notificationName, object: nil)
```
```
// notificationを止める。
NotificationCenter.default.removeObserver(self, name: notificationName, object: nil);
```

上記を
まずはDatabaseを読み取る先にNotificaiotonCenter.post()を乗っける

```FirebaseController.swift
...
        self.ref.child(firebasePath).observeSingleEvent(of: .value, with: { (snapshot) in
            for folder in snapshot.children {
                if let snap = folder as? DataSnapshot {
                    print(folder.name)
                }
            }
        NotificationCenter.default.post(name: Notification.Name(rawValue:"FirebaseNotification"), object: nil)
            
        }) { (error) in
            print(error.localizedDescription)
        }
...
```

CollectionView等にデータを流す・見せるとしたら、読み込んだだけでは、表示が変わらないので、最後にReloadData()が必要だったりする。


```ViewConreoller.swift

   
    @IBOutlet UICollectionView collectionView

    //ここで上記のFirebaseController.swiftを初期化している。データベースも呼んでいる
    var fbController = FirebaseController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //observerをセットする：database initが終わるのを見守る関数
        NotificationCenter.default.addObserver(self, selector: #selector(self.initCompleted(notification:)), name: Notification.Name("FirebaseNotification"), object: nil)
                
        collectionView.register(CategoryCell.self,forCellWithReuseIdentifier: self.cellid)
        view.addSubview(collectionView)
    }
    
 
    func initCompleted(notification: Notification?) {

        // 読み終わったら、removeObserverをして,Obeserverを消す。
        NotificationCenter.default.removeObserver(self)
        refreshCollectionView()
    }
    
    //データが変更したら、reloadData()を呼ばないといけない。
    func refreshCollectionView() {
        self.collectionView?.reloadData()
    }
    
```

友達のミッチーが解決してくれました！ありがとう！！！
https://github.com/Nismit
CircleCI上でwarファイルをTomcatへデプロイする

# 概要
  * CircleCIのビルドコンテナ上で、ビルドしたwarファイルをTomcatへデプロイする。

# 環境
  * Circle CI （CI）
  * Bitbaket (Git Repository)
  * Tomcat 8.0

# スクリプト

```yaml:circle.yml
machine:
  timezone: Asia/Tokyo

dependencies:
  pre:
    # tomcatをダウンロードしてセットアップする
    - sudo useradd tomcat
    - wget http://ftp.riken.jp/net/apache/tomcat/tomcat-8/v8.5.15/bin/apache-tomcat-8.5.15.tar.gz
    - tar -xzvf ./apache-tomcat-8.5.15.tar.gz
    - sudo mkdir /opt/apache-tomcat
    - sudo mv ./apache-tomcat-8.5.15 /opt/apache-tomcat
    - sudo chown -R tomcat:tomcat /opt/apache-tomcat

test:
  post:
    # 完成したwarファイルを配備
    - sudo cp target/todo.war /opt/apache-tomcat/apache-tomcat-8.5.15/webapps/

    # warファイルの所有者を変更
    - sudo chown -R tomcat:tomcat /opt/apache-tomcat/apache-tomcat-8.5.15/webapps/todo.war

    # tomcatを起動
    # - backgroundオプションを指定しないとtomcat startedとなるが起動していない状態になってしまう
    - sudo -u tomcat /opt/apache-tomcat/apache-tomcat-8.5.15/bin/startup.sh:
        background: true

    # 8080ポートでtomcatが起動しているか確認
    - sudo lsof -i:8080

    # tomcatのトップページを表示
    - curl http://localhost:8080/

    # デプロイしたアプリのトップページを表示
    - curl http://localhost:8080/todo/

general:
  artifacts:
    # warファイルを成果物として保存
    - "target/todo.war"
```

# 補足
  * warのビルドは、CircleCIのデフォルト動作を使用している。
  * 動作確認に使用したプロジェクトはMavenプロジェクトで、warファイルがtarget/todo.war として出力されるもの。

# 参考
 * [Starting Background Processes \- CircleCI](https://circleci.com/docs/1.0/background-process/)
なんだかよくわからないけど急にKotlin × DataBindingがぶっ壊れた時の対処法

掲題の通り「なんだかよくわからないけどぶっ壊れた」時の対処法です。
荒療治なので、正しい方法なのかは保証しかねます。（実施に関しては自己責任でお願いいたします。🙇

## Case
- 「さっきまでBuild通ってたのに、急にDataBindingが怒り出した...」
- 「branch切り替えてRebuildしたら、急にDataBindingが怒り出した...元のbranchに戻しても無理。」

<img width="600" alt="スクリーンショット 2017-06-27 1.56.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/5f35efc4-ba7c-cfe9-a11a-6c8e6962ad7e.png">


わからない。。👾

## Delete `./gradle/caches`
Home配下にあるgradleのcacheを削除します。

<img width="534" alt="スクリーンショット 2017-06-27 1.49.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/a1f981fa-dec0-4eb2-f037-70d3ce45db99.png">

Android Studioを再起動してRebuildすると、libraryの再ダウンロードが始まります。

<img width="967" alt="スクリーンショット 2017-06-27 2.00.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/0d7254f2-837c-75d4-792f-5fe2599693f7.png">

<img width="156" alt="スクリーンショット 2017-06-27 2.00.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/38442/e87066da-8f86-dcb3-13f7-032074ab8ba6.png">

SUCCESS🎉

## Summary
ほんとによいのかこれで？！？と不安になりますが、Clean -> Rebuildだけでどうにもならない時はご検討ください。
mysqlを使ったRailsアプリをHerokuにデプロイする流れ

# 1. Herokuが使える様にする


作ったRailsアプリケーションのディレクトリでHerokuが使える様に設定

### Herokuにターミナルでログイン

```
$ heroku login
```
### Heroku上でアプリを作成

```
$ heroku apps:create [app_name]
```

### Herokuのリモートリポジトリを確認
(git.herokuにコードが上がる様になっている状態)

```
$ git remote -v
```
これで

```
heroku https://git.heroku.com/app_name.git (fetch)
heroku  https://git.heroku.com/app_name.git (push)
origin  git@github.com:shou1012/app_name.git (fetch)
origin  git@github.com:shou1012/app_name.git (push)
```

と出れば良い

もしapp_nameが一致してなかったら

```
$ heroku git:remote -a [APP_NAME]
```
で変更可能

# 2. HerokuのDBを設定する

### DBを追加する

```
$ heroku addons:create cleardb:ignite
```

### Herokuアプリ上でDB情報の環境変数を設定する

Heroku上での変数を確認する

```
$ heroku config
```

```
# 以下の書式で出てくる
mysql://[username]:[password]@[hostname]/[db_name]?reconnect=true
```

変数を設定する

```
$ heroku config:add DB_NAME="[db_name]"
$ heroku config:add DB_USERNAME="[username]"
$ heroku config:add DB_PASSWORD="[password]"
$ heroku config:add DB_HOSTNAME="[hostname]"
$ heroku config:add DB_PORT="3306"
```

### 設定内容の確認

```
$ heroku config
```

なお、ここでCLEARDB_DATABASE_URLやDATABASE_URLがmysql://で始まっていることがあるのでmysql://に変える必要が出てくる時がある。

```
$ heroku config:set CLEARDB_DATABASE_URL='mysql2://~~~~~'
```
で変更できる


# 3. デプロイする

### ローカルリポジトリをHerokuへpushする

```
$ git push heroku master
```
### Heroku上でのDBマイグレーション

```
$ heroku run rake db:migrate
```

### アプリケーションの情報を確認

```
$ heroku apps:info
```

ここで出てくるWeb URLが完成したURL

# 参考にしたサイト
- [無料枠内でのHerokuの準備とデプロイ（Mac 10 + Rails 4.2 + MySQL 5.6）](http://ruby-rails.hatenadiary.com/entry/20150314/1426332751)
- [Rails4 + MySQL のアプリケーションを Heroku で動かすまで](http://arfyasu.hatenablog.com/entry/2016/01/11/035101)