OmniAICreator/Qiita-1.07M huggingface dataset:
そのまま使えるJestのフォーマット判定

# 概要
そのまま使えるJestのフォーマット判定のテストコードです。

```javascript
describe('Common', () => {
  describe('フォーマット判定', () => {
    test('電話番号', () => {
      expect("012-3456-7890").toMatch(/^[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}$/);
    });
    test('郵便番号', () => {
      expect("012-3456").toMatch(/^[0-9]{3}-[0-9]{4}$/);
    });
    test('メールアドレス', () => {
      expect("example@example.com").toMatch(/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/);
    });
    test('日付フォーマット', () => {
      expect("2017-01-01").toMatch(/^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/);
    });
    test('時刻フォーマット', () => {
      expect("23:59:59").toMatch(/^(?:(2[0-3])|([0-1][0-9])):([0-5][0-9]):([0-5][0-9])/);
    });
    test('桁数カンマ区切り', () => {
      expect("1,000,000").toMatch(/\b\d{1,3}(,\d{3})*\b/);
    });
    test('URL', () => {
      expect("http://exapmle.com").toMatch(/^https?(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/);
    });
  });
});
```
XHProf による PHP パフォーマンスプロファイリング

# XHProf による PHP パフォーマンスプロファイリング

特定のページで Update を行ったときだけ、なかなかレスポンスが帰ってこない。
ということでプロファイルをとってみます。  

##PHP
Version: 5.6.25

## XHProf
PHP 専用のプロファイラです。
導入手順は Google さんにおまかせします。
ただ、XHProf は活発にメンテナンスされていない？ようなので、いま使うなら [backfire](https://blackfire.io/) とかいいかも。

## XHGui, Callgraph
プロファイリング結果を視覚化するために使います。

## 結果の見方をざっくりと
トップ画面。

<img width="1276" alt="0001.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/95255/3225d1ec-97b7-9d42-80b1-e59d7d4cd3d0.jpeg">

ページ上部「Hardest Hit」の「Today」をクリック。

<img width="1273" alt="0002.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/95255/da16b6cf-c7ba-4420-ac45-24bfe0630b2f.jpeg">

とりあえず「Avg Wall Time」降順に並べて目的のパスを見つける。
URL をクリックすると実行時間などがグラフで描画されます。

<img width="1273" alt="0003.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/95255/670cc9aa-2791-1f9f-f590-f963bb044120.jpeg">

グラフの頂点をクリックすると詳細が表示される。

<img width="1280" alt="0004.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/95255/62aa3742-89a8-f538-e646-72699b2fca57.jpeg">


今回特に注目したのは「Exclusive Wall Time」です。Wall Time という項目もありますが、これは Child Function を含めた関数の実行時間になります。対して Exclusive Wall Time は 関数単体（Current Function）の実行時間です。
Exclusive Wall Time 降順に並び替えると「fread」関数がトップにきます。
関数名をクリックすると詳細なデータを見れます。

<img width="572" alt="Screen Shot 2017-06-26 at 09.25.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/95255/f626637b-8daa-48a9-33e3-332cf0cd1401.png">

呼び出し元（Parent Function）は「Cake\Network\Socket::read」だということがわかりました。  
さらに遡っていくと「Cake\Mailer\Transport\SmtpTransport::_sendData」に行き着きます。  
ここでふと思い立ってエラーログをみてみると、、、

<img width="833" alt="0005.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/95255/5335c437-2f12-9146-0741-4efe9dc25539.jpeg">

なんてこったい＼(^o^)／  
タイムアウトまでがんばっていたので、なかなかレスポンスが帰ってこなかったようです。  
プロファイリングの前に、まずはログを確認しないとですね。

ちなみに「View Callgraph」をクリックするとコールグラフが描画されます。
こんな感じ。

<img width="583" alt="Screen Shot 2017-06-26 at 09.26.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/95255/e12aaf6b-687c-5485-5a32-f38e40e823db.png">
コピペでできるSwiftでスクリーンショットを撮る


画面のスクリーンショットを撮る。


```Swift
//コンテキスト開始
UIGraphicsBeginImageContextWithOptions(UIScreen.main.bounds.size, false, 0.0)
//viewを書き出す
self.view.drawHierarchy(in: self.view.bounds, afterScreenUpdates: true)
// imageにコンテキストの内容を書き出す
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
//コンテキストを閉じる
UIGraphicsEndImageContext()
// imageをカメラロールに保存
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
```
これでスクショが取れます
Bluemix CLI 「Loggregator エンドポイントが構成ファイルにありません」の対処法

Bluemix CLI で、cf コマンドから移行したり、bx コマンドをバージョンアップした時に遭遇する、警告メッセージへの対処法です。

![スクリーンショット 2017-06-26 8.05.49.png](https://qiita-image-store.s3.amazonaws.com/0/42829/34e20844-e6e2-43bb-fcc7-4c72957d4d55.png)
<-- 中略 -->
![スクリーンショット 2017-06-26 8.12.48.png](https://qiita-image-store.s3.amazonaws.com/0/42829/42b379a0-4ae4-94c1-e7b5-4f65396a6134.png)

## 問題の設定ファイル
問題の設定ファイルは、~/.bluemix/.cf/config.json です。 参考までに、ホームディレクトリで ls -alR の実行した結果にコメントしておきます。　"コレ" としている部分が修正対象のファイルです。

~~~
$ ls -alR .bluemix/
total 8
drwx------   7 takara  staff   238  6 19 09:12 .
drwxr-xr-x@ 44 takara  staff  1496  6 19 09:36 ..
drwx------   3 takara  staff   102  6 19 09:11 .cf
drwx------   3 takara  staff   102  6 19 09:12 analytics
-rw-------   1 takara  staff  2091  6 26 07:59 config.json
drwx------   3 takara  staff   102  3 28  2016 plugins
drwxr-xr-x   2 takara  staff    68  6 19 09:11 tmp

.bluemix//.cf:
total 8
drwx------  3 takara  staff   102  6 19 09:11 .
drwx------  7 takara  staff   238  6 19 09:12 ..
-rw-------  1 takara  staff  2825  6 26 07:59 config.json  <<--- コレ

.bluemix//analytics:
total 128
drwx------  3 takara  staff    102  6 19 09:12 .
drwx------  7 takara  staff    238  6 19 09:12 ..
-rw-------  1 takara  staff  65536  6 26 08:00 bluemix-analytics.db

.bluemix//plugins:
total 8
drwx------  3 takara  staff  102  3 28  2016 .
drwx------  7 takara  staff  238  6 19 09:12 ..
-rw-------  1 takara  staff   19  3 28  2016 config.json

.bluemix//tmp:
total 0
drwxr-xr-x  2 takara  staff   68  6 19 09:11 .
drwx------  7 takara  staff  238  6 19 09:12 ..
~~~

## 設定ファイルの修正

次のファイルは、正常に動作している 環境の config.json ファイルです。 前述のエラーが出る場合、このconfig.json ファイルの "LoggregatorEndPoint" の値が "" になっていると思います。そこで、以下の様にに、"wss://loggregator.ng.bluemix.net:443" をセットします。

~~~file:config.json
.cf takara$ cat config.json
{
  "ConfigVersion": 3,
  "Target": "https://api.ng.bluemix.net",
  "APIVersion": "2.75.0",
  "AuthorizationEndpoint": "https://login.ng.bluemix.net/UAALoginServerWAR",
  "LoggregatorEndPoint": "wss://loggregator.ng.bluemix.net:443",           <--- この値部分を設定
  "DopplerEndPoint": "wss://doppler.ng.bluemix.net:443",
  "UaaEndpoint": "https://uaa.ng.bluemix.net",
  "RoutingAPIEndpoint": "",
~~~

以上、これで問題が解消され、正常にログが表示されます。
初回SSH接続時の対話的Fingerprint確認フローをssh-keyscanでスキップする

# この記事で分かること

* 初めてSSH接続するホストでも、fingerprint確認フローをスキップする方法

↓ こんな奴

```
$ ssh -T git@github.com
The authenticity of host 'github.com (192.30.255.112)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)?
```


# やり方

```
$ ssh-keyscan github.com >> ~/.ssh/known_hosts
```

以上。

上記コマンドを実行すると、
初回SSH接続時にでる `Are you sure you want to continue connecting (yes/no)?` という問いに対して `yes` と答えたのと同じように、指定したホストの公開鍵を取得して `~/.ssh/known_hosts` ファイルへ追記してくれる。

```
$ ssh -T git@github.com
Hi pinkumohikan! You've successfully authenticated, but GitHub does not provide shell access.
```

便利ですね :beers:
SQLite.Net のテーブルのフィールドに DEFAULT を付ける

## 発端

- あるアプリで、クラスのプロパティに思い通りの初期値が入らないことがあった
    - 例えば '1' を指定したつもりが '0' になってしまう
- 発生するのはアプリをバージョンアップしたときだけ
    - プロパティが増えたときだけ
    - SQLite.Net に保存しているデータ
    - SQLite.Net のテーブルのフィールドに *DEFAULT* が付いていないのでは

---

## 課題

- SQLite.Net のテーブルのフィールドに *DEFAULT* を付ける方法を確認しよう
- プロパティを増やしたときに思い通りの初期値が入ることを確認しよう

---

### 手順

1. プロパティを追加する前にプログラムを1回実行しておく
2. プロパティを追加する
3. プロパティ追加後の初回起動時に、読み込んだデータの内容を確認

---

### コード

```C#
[Table(name: "Hoge")]
public class Hoge
{
    public Hoge()
    {
        //ByConstructor = 3;
        //ByConstructorDefault = 13;
    }

    public int Name { get; set; }

    //public int ByAuto { get; set; } = 1;

    //private int _byBacking = 2;
    //public int ByBacking
    //{
    //    get { return _byBacking; }
    //    set { _byBacking = value; }
    //}

    //public int ByConstructor { get; set; }

    //[Default]
    //public int ByAutoDefault { get; set; } = 11;

    //private int _byBackingDefault = 12;
    //[Default]
    //public int ByBackingDefault
    //{
    //    get { return _byBackingDefault; }
    //    set { _byBackingDefault = value; }
    //}

    //[Default]
    //public int ByConstructorDefault { get; set; }
}
```
---
### 結果

![ウォッチ ウィンドウのキャプチャ](https://qiita-image-store.s3.amazonaws.com/0/25692/bc8c2155-e120-f2cd-d8af-2ec2c501dc1e.png)


---
## まとめ

- 必要に応じて `[Default]` を付ける
- クラスのプロパティの初期値の書き方は不問

---
## 参照

- [SQLite.Net-PCL](https://github.com/oysteinkrog/SQLite.Net-PCL)
    - [DefaultAttribute.cs](https://github.com/oysteinkrog/SQLite.Net-PCL/blob/master/src/SQLite.Net/Attributes/DefaultAttribute.cs)
    - [DefaultColumnInformationProvider.cs](https://github.com/oysteinkrog/SQLite.Net-PCL/blob/master/src/SQLite.Net/Attributes/DefaultColumnInformationProvider.cs)
プロジェクト管理ツールで課題を依頼形式で書くのはやめたほうがいい

RedmineやBacklogなどのプロジェクト管理ツールを使い慣れていない組織だと、課題・チケットを担当者に対しての依頼形式で書く人が多いのですが、色々と問題があるのでやめたほうがいいです。

# 対象

ここでは開発チーム内で自分達がやるべきタスクを管理するようなプロジェクトを対象とした話をします。

部署間での作業依頼を管理することを目的にしたプロジェクトは対象外です。

尚、ツールによって「課題」「チケット」など呼び方は違いますが、ここでは「課題」と表現しています。

# 依頼形式で書かれた課題とは

依頼形式で書かれた課題とは、課題登録者が担当者に対しての作業依頼という形になっているものです。

```:依頼形式で書かれた課題の例
件名:
xxx機能追加のお願い

内容:
Aさん
xxx機能の開発をお願いします。
仕様は以下の通りです。
- xxxの時にはxxxになるようにしてください。
- xxxはxxx機能を参考にしてください。
```

ここまで極端な例は稀ですが、「xxxをお願いします」と書かれた課題は結構見かけます。

# 依頼形式で書くことの問題点

課題を依頼形式で書くことが多いプロジェクトでは、以下のような問題が発生することがあります。

- 担当が決まるまでタスクが管理されない
- 人に依頼するタスク以外が管理されない
- 着手中のタスクしか管理されない
- 残タスクがわからない
- 依頼者以外が課題を編集しづらい

## 担当が決まるまでタスクが管理されない

依頼形式の課題は担当者に依頼する形で書かれるので、担当者が決まってから登録されます。
逆に言うと、担当者が決まるまでは課題が登録されないことになります。

つまり、プロジェクトでやるべきタスクが発生してから担当が決まるまでの期間は、タスクが管理されてない状態になってしまいます。

## 人に依頼するタスク以外が管理されない

依頼形式の課題は人に依頼する形式で書くので、作業を依頼する立場のリーダーや上流工程の担当者が自分でやるタスクは登録されない傾向があります。

こういった立場の人のタスクは仕様検討や調査、他部署との調整といったクリティカルなタスクになるのですが、これらの重要なタスクが管理されていないことが多いです。

## 着手中のタスクしか管理されない

依頼形式で課題を書いていると、担当が決まっていてもすぐに着手するタスク以外は登録しない傾向があるようです。

恐らく担当者が混乱しないように直近のタスクのみ登録しているのかもしれませんが、これだとプロジェクト全体のタスクが把握できない状態になってしまいます。

## 残タスクがわからない

前述したように依頼形式で課題を書いていると一部のタスクしか管理されないので、残タスクがわからない状態になってしまいます。

依頼形式の課題しか書かないようなプロジェクトでは、以下のような状況に陥りがちです。

- プロジェクトスタート直後の上流工程の段階ではタスク管理が全く行われず、スケジュールがわからずに無駄に日数が経過する
- 実装がスタートする頃になってタスクが登録され始めるが、直近のタスクしか登録されていないので残タスクがわからないまま炎上状態となる

## 依頼者以外が課題を編集しづらい

依頼形式で課題を書かれると、担当者が課題を編集するのが難しくなります。

例で示したような書き方をされた課題に仕様の記述漏れがあったとして、担当者が課題を編集するとしたらどのように記述すれば良いでしょうか？

- 他の部分と同じように「して下さい」という文言で追記する
    - 自分自身への依頼として書くので、なんかむず痒い
- 追記する部分だけ「xxxとする」という形式で追記する
    - 文体が違うので読み返すとそこだけ違和感がある

# どうすればいいか

## 依頼ではなくタスクを書くようにする

担当者への依頼として書くのではなく、プロジェクトでやるべきタスクとして記載します。

```:依頼形式で書かれた課題の例(再掲)
件名:
xxx機能追加のお願い

内容:
Aさん
xxx機能の開発をお願いします。
仕様は以下の通りです。
- xxxの時にはxxxになるようにしてください。
- xxxはxxx機能を参考にしてください。
```

↓

```:タスクとして書かれた課題の例
件名:
xxx機能追加

内容:
xxx機能を開発する。
仕様は以下の通り。
- xxxの時にはxxxになるようにする。
- xxxはxxx機能を参考。
```

## 担当者宛のメッセージはコメントに書く

担当者へ伝えたいことがあれば、課題の本文ではなくコメントで記載します。

```
コメント:
Aさん
今のタスクが完了したらこちらをお願いします。
```

## プロジェクトでやるべきタスクを網羅する

プロジェクト管理ツールの課題は、プジェクトでやるべきタスクを管理する為のものです。

タスク管理は、一部のタスクだけ登録していてはできません。
プロジェクトでやるべきタスクを網羅的に管理してこそ意味があります。
icheckをどうしてもangularで使いたかった

とある案件で、angularJS(1.x)でicheckを使おうと思ったところ、そのへんに落ちているサンプルをコピペしてもモバイルでうまく動かなくてハマった。

```javascript
tripDirectives.directive('icheck', function($timeout, $parse) {
    return {
        require: 'ngModel',
        link: function($scope, element, $attrs, ngModel) {
            return $timeout(function() {
                var value;
                value = $attrs['value'];

                $scope.$watch($attrs['ngModel'], function(newValue){
                    $(element).iCheck('update');
                    event.preventDefault(); //この行がないとモバイルでうまく動かない
                    event.stopPropagation(); //この行がないとモバイルでうまく動かない
                })
                $(element).on('')
                return $(element).iCheck({
                    checkboxClass: 'icheckbox_flat',
                    radioClass: 'iradio_flat'
                }).on('ifChanged', function(event) {
                    if ($(element).attr('type') === 'checkbox' && $attrs['ngModel']) {
                        $scope.$apply(function() {
                            return ngModel.$setViewValue(event.target.checked);
                        });
                    }
                    if ($(element).attr('type') === 'radio' && $attrs['ngModel']) {
                        return $scope.$apply(function() {
                            return ngModel.$setViewValue(value);
                        });
                    }
                });
            });
        }
    };
});
```

どうやら２回発火してしまっていることが原因だったので、propergationを切ってあげたところ、うまくいった。
Angular2でselect2を使う方法

#インストール方法
https://github.com/NejcZdovc/ng2-select2

html 

```html
<head>
  <meta charset="utf-8">
  <title>Ng2Select2Demo</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <script src="./assets/jquery.min.js"></script>		
  <script src="./assets/select2.min.js"></script>
</head>
```

npm

```
$ npm i -S ng2-select2
```

app.module.ts

```ts
 import { Select2Module } from 'ng2-select2';

@NgModule({
  imports: [
    ....,
    Select2Module
  ],
  ...
})
```
#実装方法
## ベーシック
basic.component.html

```html
<h2>1. Basic demo</h2>

<select2 [data]="exampleData"></select2>
```

basic.component.ts

```ts
import { Component, OnInit } from '@angular/core';
import { Select2OptionData } from 'ng2-select2';

@Component({
  selector: 'app-basic',
  templateUrl: './basic.component.html',
  styleUrls: ['./basic.component.css']
})
export class BasicComponent implements OnInit {
  public exampleData: Array<Select2OptionData>;

  ngOnInit() {
    this.exampleData = [
      {
        id: 'basic1',
        text: 'Basic 1'
      },
      {
        id: 'basic2',
        disabled: true,
        text: 'Basic 2'
      },
      {
        id: 'basic3',
        text: 'Basic 3'
      },
      {
        id: 'basic4',
        text: 'Basic 4'
      }
    ];
  }
}
```



# 参考
https://github.com/NejcZdovc/ng2-select2-demo
PHPの始め方

#はじめまして。

「おっさん」と言われたら、元気よく手を上げて「ハイ！」と答えるのに抵抗を覚えないくらいの年になりましたが、PHPの勉強をしています。
勉強した内容を投稿することで、自身の復習とともに、皆様に見ていただくことでより方法について皆様のご意見をいただければと思っております。
稚拙な内容で恐縮ですが、お付き合いのほどよろしくお願いいたします。

#PHPの始め方
PHPの学習の仕方についてまとめてみました。

##とりあえずドットインストール
PHP入門 (全30回) - プログラミングならドットインストール
http://dotinstall.com/lessons/basic_php_v2

有名なサイトなんだそうですが、今回勉強を始める際に詳しい方に教えていただき、初めて知りました。
ただ、ドットインストールで実演されている環境がMacです。
私のPC（Windows10 home)ではできないので、他の方法を試みます。

##PHPの実行環境を作る前に
PCの中にVagrantで仮想のLinux環境(centOS)を作ります。
作り方は下記のリンクを参考にしました。

Windows上にVirtualBox+VagrantでCentOS環境構築
http://qiita.com/TakashiOshikawa/items/d2fb48d59e9e316af9a2

##Linux環境に必要なものをインストール
下記のコマンドを使用してWebサーバソフトウェアに当たるhttpdとphpをインストールします。

vagrantを用いたPHPの環境構築
http://qiita.com/tiwu_official/items/f135e6b6fbbe3ec6aa54
Go + echoでwebサービス作る時のhtmlエラーページ設定

※編集2017/7/20 handler内で、Responseがcommit済みなら処理しないようにif文追加

各種バージョン
Go 1.8.4
echo 3.2.1

# echoのデフォルト
echoは、エラー発生時にデフォルトではシンプルなjsonが返ってくる。
webサービスを実装していてエラーページを返したい場合は、独自に実装が必要。

## 独自ErrorHandlerを準備する
```go
import (
	"fmt"
	"github.com/labstack/echo"
	"net/http"
	"runtime"
	"strconv"
)

func CustomHTTPErrorHandler(err error, c echo.Context) {
	if !c.Response().Committed {
		code := http.StatusInternalServerError
		if he, ok := err.(*echo.HTTPError); ok {
			code = he.Code
		}
	
		stackTrace := ""
		for depth := 0; ; depth++ {
			pc, src, line, ok := runtime.Caller(depth)
			if !ok || depth > 30 { //３０行までしかStacktrace表示しない
				break
			}
			stackTrace += fmt.Sprintf(" -> %d: %s: %s(%d)\n", depth, runtime.FuncForPC(pc).Name(), src, line)
		}
	
		errorData := struct {
			Message    string
			StackTrace string
		}{
			Message:    err.Error(),
			StackTrace: stackTrace,
		}
	
	    //StackTrace情報と、errorメッセージをテンプレートに送る。
	    //なお、テンプレートのhtmlファイル名は、<httpステータスコード>.htmlとする。例：500.html
		if err = c.Render(http.StatusOK, strconv.Itoa(code), errorData); err != nil {
			c.Logger().Error(err)
		}
	}
}

```

# エラーに関するHTTPステータスコードのhtmlファイルをテンプレートとして用意する
- 500.html

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Error</title>
</head>
<body>
<pre>message:{{.Message}}</pre>
<pre>stacktrace:{{.StackTrace}}</pre>
</body>
</html>
```

## server.goでhandlerをセット。
※テンプレート読み込み部分は省略

```go
e.HTTPErrorHandler = CustomHTTPErrorHandler
```

これで、エラー発生時にhtmlエラーページが返せました。
Docker for Mac でTrelloクローンのWekanを動かしてお手軽マイタスク管理

## はじめに
以前、CentOSでWekanを動かしたときのお話はこちら
http://qiita.com/ex_SOUL/items/b0519a6ad890280c8c94

## 背景
最近、お仕事でMacを使い始めました。
業務では某プロジェクト管理システムを使用して、チケット駆動開発をしています。
大体はそれで事足りるのですが、チケットとは関係ない庶務だったり、
ちょっと大きいチケットだった場合、別途タスク管理がしたくなったりします。
私はいわゆるTrelloみたいなカンバンなタスク管理システムが好きなのでTrelloが
使いたかったりするのですが、TrelloはWebサービスで使うのがちょっと面倒だったりするかもしれません。
じゃあとりあえず自分のマシン上に作ってみるか!Docker for Mac使ってみたいし!
その結果が表題です。

## Wekanとは
一言で言うとTrelloクローンです。
Trelloをご存知の方ならそれで十分伝わると思います。
Trelloを知らない、カンバンなタスクシステムを知らない、という場合は、
付箋にやることを書いて管理する方法がWebでできるやーつ、とイメージしていただければ。

## やること

### Docker for Mac のインストール
以下のページからインストールできます。
https://docs.docker.com/docker-for-mac/install/#download-docker-for-mac
Stable(安定版)かEdge(最新版)どちらを選ぶかはお好みで。

### Wekanのインストール
WekanはDockerイメージが配布されているので、それを使用します。
docker-composeを使用して永続化も合わせて行います。
(Docker on Mac の場合はdocker-composeも一緒にインストールされます)

```docker-compose.yml
wekan:
  image: wekanteam/wekan
  restart: always
  links:
    - wekandb
  environment:
    - MONGO_URL=mongodb://wekandb/wekan
    - ROOT_URL=http://localhost

  ports:
    - 8081:80

wekandb:
   image: mongo
   restart: always
   volumes:
     - /your/pc/path:/data/db
```

### 起動!
まず、Docker for Macを立ち上げて、
`docker-compose.yml` があるディレクトリで
`docker-compose up`を実行。以上! かんたーん! たーのしー!
(初回起動時はDBとWekanのイメージをダウンロードするのでちょっと時間がかかります。

### 確認
http://localhost:8081 にアクセスすると、Wekanの起動画面がでています。
(永続化するためのパスが間違っていなければちゃんと起動するはずです)

### 感想
#### Docker便利
ちょっと環境が欲しい、ってときにすごく手軽に試せるのがとれもいいですね。
動きの早いところではすでにProduction環境としても使用しているとの噂。

#### カンバンいいよね
私が初めてカンバン管理に出会ったのは、Redmineのredmine_backlogsというプラグインでした。
それ以降、お仕事でも個人にもカンバンは使用しています。
承認フローが必要なタスクだとカンバンではちょっと難しいですが、基本的なタスク管理であれば
(個人的には)これが一番いいと思います。
オイラープロジェクトの問題を解きながらSwiftらしいコーディングを探る #1(問題2)

## この記事について

* オイラープロジェクトの問題を解きながらSwiftらしいコーディングを探ります。
* Swiftのversionは3.1を想定しています。
* この記事では問題2を解いていきます。

## #1なのに問題2なのはなぜ？

オイラープロジェクトの問題のうち記事にしやすそうな問題だけを取り上げているからです。

## 問題

### 原文
https://projecteuler.net/problem=2 より引用
> Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
> 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
>
> By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

### 翻訳
http://odz.sakura.ne.jp/projecteuler/index.php?Problem%202 より引用
> フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.

> 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

> 数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

## 解答の指針

1. まずフィボナッチ数列のSequenceをつくる
1. `prefix`で400万までの項を取り出す
1. `filter`で奇数の項を除く
1. `reduce`で足し合わせる

`Sequence`プロトコルに準拠した型をつくれば、`map`, `reduce`, `filter`など、Swiftの便利メソッドを使うことができます。
したがって、
`(フィボナッチ数列のSequence).prefix { $0 < 4_000_000 }.filter { $0 % 2 == 0 }.reduce(0, +)`
という計算をすれば解が得られます。

さらに、数列という数学上の概念がSwiftのSequenceプロトコルに準拠することは非常に直感的です。

## 解答

### 1. フィボナッチ数列を生成するSequenceを実装する

フィボナッチ数列を生成するSequenceを実装すれば答えはすぐそこです。

```swift:FibonacciSequence
struct FibonacciSequence: Sequence {
    // Sequenceに準拠するためにはmakeIterator()でIteratorProtocolに準拠した型を返す
    func makeIterator() -> FibonacciIterator {
        return FibonacciIterator()
    }
}

struct FibonacciIterator: IteratorProtocol {
    private var state = (0, 1)
    // IteratorProtocolに準拠するためにはnext()で列挙したい型のオプショナルを返す
    mutating func next() -> Int? {
        let nextValue = state.0 + state.1
        state = (state.1, nextValue)
        return nextValue
    }
}
```

### 2. 華麗にprefix, filter, reduce

```swift:answer
let answer = FibonacciSequence().prefix { 
    // 400万までの項を取り出す
    $0 < 4_000_000
}.filter { 
    // 奇数を除く
    $0 % 2 == 0 
}.reduce(0, +) // 合計を足し算

print("answer is \(answer)")
```

## まとめ

Sequenceに準拠するだけで、`map`, `filter`, `reduce`といった便利メソッドを使うことができます。
MacでDockerを使用してRedmineを構築

## Redmineのイメージを取得
イメージを取得

```
docker pull redmine
```
ダウンロード完了後に確認

```
docker images
```
<img width="612" alt="スクリーンショット 2017-06-17 21.49.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/188887/9817247e-b7f6-36da-4ff5-a3c239b4bd98.png">
Redmineが存在すればOK

## コンテナ作成
コンテナ作成

```
docker run -p 3000:3000 --name redmine redmine
```
実行後以下が出れば起動OK
<img width="347" alt="スクリーンショット 2017-06-17 22.09.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/188887/a39bf72d-26b6-4197-8b9d-6c7577768291.png">

以下のURLを叩いてRedmineが表示されればOK
<http://localhost:3000/>

<img width="371" alt="スクリーンショット 2017-06-17 22.13.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/188887/ead41d6a-4999-64cf-2d88-d060fa0dbf9f.png">

アカウントが一つも作成されていないので以下を参照して初期設定を行う
<http://redmine.jp/tech_note/first-step/admin/>
FireMonkey と macOS

# FireMonkey と macOS

[前回](http://qiita.com/items/b184f5ffb34576ed15dc/)は、Windows について Window Handle を使う方法を紹介しました。
Windows では、Window Handle が重要ということでした。

## macOS に依存した処理をする

Windows と違って macOS は構造化された API のため基本的にはハンドルではなくクラスのメソッドを使って OS の機能を呼び出します。

### TMacWindowHandle

前回同様、WindowHandleToPlatform 関数を使います（定義されている unit は  FMX.Platform.Mac になります）。
TMacWindowHandle クラスのインスタンスが返ってくるので、そのプロパティ Wnd で [NSWindow](https://developer.apple.com/documentation/appkit/nswindow) のインスタンスが返ってきます。

ここまでをコードにすると…

```delphi
function GetWnd(const iForm: TCommonCustomForm): NSWindow;
begin
  Result := WindowHandleToPlatform(AHandle).Wnd;
  Result.Foo() // NSWindow に定義されているメソッドを呼べます
end;
```

と、こんな感じで呼び出せます。

Windows と違って NSWindow が取れるので、もうこれだけで直接色々できます。

# まとめ
WindowHandleToPlatform を使うと NSWindow が取れます。

# おまけ
NSApplication のインスタンスも取得できます。

```delphi
NSApp := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication);
```
FireMonkey と Windows

# FireMonkey と Windows

## OSへの依存が排除されている

FireMonkey はマルチプラットフォームのライブラリなので、プラットフォームに依存した処理は（気軽には）使えないようになっています。
でも、例えば Windows でしか使わないアプリケーションの作成では Windows に依存した処理を使いたいこともあります。

## Windows に依存した処理をする

Windows に依存した処理の多くは Win32 API を使うことになるでしょう。
（その他にはファイルパスだったり、改行コードなどがあります）

### TWindowHandle

Win32 API を使うということは基本的には Window Handle が必要です。
FireMonkey は Window Handle を隠蔽していますが、簡単に取得できます。

ただし、ここで注意したいのは [TCommonCustomForm](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Forms.TCommonCustomForm) が持っている [Handle](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Forms.TCommonCustomForm.Handle) は、FireMonkey が管理するための独自のハンドルで Window Handle とは別物ということです。
FireMonkey は、この独自のハンドルと Window Handle を結びつけて管理しています。
その管理をするクラスが [TWindowHandle](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Types.TWindowHandle) です。

このクラスを取得するためには、[WindowHandleToPlatform](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Platform.Win.WindowHandleToPlatform)という関数を使います。

この関数は [FMX.Platform.Win](http://docwiki.embarcadero.com/Libraries/Berlin/ja/FMX.Platform.Win)に定義されていおり、また TWindowHandle を継承して Windows に特化させた [TWinWindowHandle](http://docwiki.embarcadero.com/Libraries/Berlin/ja/FMX.Platform.Win.TWinWindowHandle)も定義されています。

WindowHandleToPlatform は、この TWinWindowHandle を返します。

TWinWindowHandle.Wnd で Window Handle が取得できます。

ここまでをコードにすると…

```delphi
function GetWnd(const iForm: TCommonCustomForm): HWND;
begin
  Result := WindowHandleToPlatform(iForm.Handle).Wnd;
end;
```

と、こんな風になります。
ですが！
Window Handle を取るだけなら更に簡単な方法があります。
それは、[FormToHWND](http://docwiki.embarcadero.com/Libraries/Berlin/ja/FMX.Platform.Win.FormToHWND)です。

これを使うと

```delphi
function GetWnd(const iForm: TCommonCustoForm): HWND;
begin
  Result := FormToHWND(Form);
end;
```

と、こんな感じになります。

### Windows Message に反応する

WindowHandle が取得できたので、Window Procedure を置き換えてみます。
Win32 API の [SetWindowLong 関数](https://msdn.microsoft.com/ja-jp/library/cc411203.aspx)を使うと Window Procedure を置き換えられます。
具体的なコードは次の通りです。

```delphi
var
  WndProc: Pointer;

function ChangeWndProc(const iForm: TCommonCustomForm): Boolean;
var
  Wnd: HWND;
begin
  Wnd := FormToHWND(iForm);
  WndProc := Pointer(SetWindowLong(Wnd, GWL_WNDPROC, Integer(@WndProc)));
  Exit(WndProc <> nil);
end;
```

ここで、SetWindowLong に渡している Wndproc は下のような関数です。

```delphi
function WndProc(
  hWnd: HWND;
  uMsg: DWORD;
  wParam: WPARAM;
  lParam: LPARAM): LRESULT; stdcall;
begin
  case uMsg of
    WM_MOUSEMOVE: // などなど
    begin
    end;
  end;

  Result := CallWindowProc(WndProc, hWnd, uMsg, wParam, lParam);
end;
```

これで、置き換え完了です。
あとは uMsg に対して、いくらでも自由に反応できます。

# まとめ
Window Handle は FormToHWND や WindowHandleToPlatform を使って取得できます。

#次回
[macOS 編](http://qiita.com/items/8d03b04f90959bffa0a2/)に続きます。
Macで共有ライブラリの依存関係を表示する

otool -L [対象プログラムのパス]
でライブラリを表示する

Linuxのlddと同じ
その他オプションは以下の通り

```
-f print the fat headers
-a print the archive header
-h print the mach header
-l print the load commands
-L print shared libraries used
-D print shared library id name
-t print the text section (disassemble with -v)
-p <routine name>  start dissassemble from routine name
-s <segname> <sectname> print contents of section
-d print the data section
-o print the Objective-C segment
-r print the relocation entries
-S print the table of contents of a library
-T print the table of contents of a dynamic shared library
-M print the module table of a dynamic shared library
-R print the reference table of a dynamic shared library
-I print the indirect symbol table
-H print the two-level hints table
-G print the data in code table
-v print verbosely (symbolically) when possible
-V print disassembled operands symbolically
-c print argument strings of a core file
-X print no leading addresses or headers
-m don't use archive(member) syntax
-B force Thumb disassembly (ARM objects only)
-q use llvm's disassembler (the default)
-Q use otool(1)'s disassembler
-mcpu=arg use `arg' as the cpu for disassembly
-j print opcode bytes
-P print the info plist section as strings
-C print linker optimization hints
--version print the version of
```
主成分分析

主成分分析
===

例によって、機械学習やその他色々について得た知識を
復習and記事作成の練習and個人の備忘録としてまとめていきます！

今回は、多変量解析の一手法でデータの次元を削減するために用いられる、
"主成分分析"について書いていきます！

⚠︎※※注意※※⚠︎  

・出来るだけ専門知識のあまりない人に対して、分かりやすく書くことを目標にしています。
　そのため、厳密に言うと間違っている部分があると思いますがご容赦ください。

・また、ネットで調べたレベルの知識がほとんどなので、
　"厳密に言うと"レベルではなく間違っている箇所があるかもしれません。。
　その場合は非常に申し訳ないです。指摘していただけると幸いです！

##### 前回までの記事

・[機械学習について](http://qiita.com/AwaJ/items/950953a9c20f391e72cf)
・[教師あり学習　〜回帰〜](http://qiita.com/AwaJ/items/78de8b4738e87a57addd)
・[教師あり学習　〜分類〜](http://qiita.com/AwaJ/items/b769a5461e33ea8437a5)
・[Random Forest](http://qiita.com/AwaJ/items/3c02ff64b6a89e1a96f1)
・[階層型クラスタリング](http://qiita.com/AwaJ/items/ab43ce47817b3b864b9e)
・[非階層型クラスタリング k-means](http://qiita.com/AwaJ/items/1cd3eeef497c93a6a053)

主成分分析とは
---
分析を行うとき、データを可視化して眺めることは非常に大事なことです。
数字ばっかり眺めて見てもあまりよくわからないです。

ですが、多変量データと呼ばれる、多くの変数があるデータを分析するとき、
可視化するのは非常に困難になってしまいます。

困難というか、4変数以上のデータをそのまま可視化することは不可能ですね。笑
かといって２変数や3変数だけ抽出しても、なんか違います。

そういう時に使われるのがこの"主成分分析"です。

主成分分析では、なるべく情報を落とさずに、多次元のデータを低次元に要約します。

そうしていくことで、
「全部の軸を見なくていいから、なにかデータをうまく表現できるような軸でデータを見たい！」
そんな思いに応えてくれます。

情報を落とさない"軸"
---
なるべく情報を落とさない、とはどういうことでしょうか。

例えば、以下のようなデータがあったとします。

<img width="280" alt="スクリーンショット 2017-06-25 16.35.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/185346/ffdd49a7-9ca2-d763-98e8-0743b1b4ca6f.png">

そこで新しく次のA,Bの軸を設定します。

<img width="280" alt="スクリーンショット 2017-06-25 16.40.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/185346/ae67dc48-a501-704a-69dd-8e54d96bf079.png">

この時、A,Bそれぞれ一軸の視点で見てみると、
<img width="300" alt="スクリーンショット 2017-06-25 16.56.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/185346/6d92ac58-3e3c-7d0e-74d4-16398b7f2244.png">
<img width="290" alt="スクリーンショット 2017-06-25 16.57.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/185346/7fc08ac0-96c4-00f1-6b9a-2d23b4982f00.png">

というような形になります。

つまりこのデータに対して、
「一番情報を落とさない軸」がAで、
逆に「一番情報を落としてしまう（情報の少ない）軸」がBだと言えます。

これをもう少し具体的な言い方をすると、
「一番情報を落とさない軸」とは、「一番データのばらつきが残る軸」です。

手順
---
上記を踏まえて、主成分分析の手順を説明します。

Step1. 全てのデータの重心を求めます。

Step2. 重心を通り、データのばらつき(分散)が最大となる方向を見つけます。(第一主成分)

Step3. Step2で見つけた主成分を新しい軸とします。

Step4. Step3の軸に対して直交する方向に対して、ばらつきが最大となる方向を見つけます。(第二主成分)

Step5. Step3~4を、データの次元の数だけ繰り返します。(第三主成分、第四主成分、・・)

N次元のデータに対して、一番情報量の多い第一主成分から順に第N主成分まで出すことができます。

情報量の多い軸＝大事であり、後の軸になればなるほど、情報量は少なくなる＝大事ではなくなる
ので、第一・二(・三)主成分で可視化して、データの関係性をおおまかに判定できます！

可視化することできる具体的な例としては、

たとえば、[前回の記事]()で説明したk-meansにおいては、初めに分割するクラスター数を決めなければなりませんが、
多変量データを見てもいくつのクラスターに分ければいいのか判断できません。

そこでとりあえず主成分分析を行い可視化してデータのおおまかな偏りをみることで、いくつのクラスターに分ければいいかを決める手助けができたりします。

まとめ
---
・"主成分分析"は多変量解析の一手法で、次元の削減に用いられる。

・"一番情報量の多い軸"は"一番データのばらつきが大きい軸"である。

・主成分分析は単純な次元削減の他、k-meansにおけるクラスター数の決定などで用いられる。

あとがき
---
最後何かサンプルデータで主成分分析を行なってみようと思いましたが、この記事を書いている時のタイミングが悪く、断念しました。。(スミマセン。。)

そしてまだまだ駆け出しのデータサイエンティスト(とはまだ呼べないレベル)として、書けることが少なくなってきました。。

次は何の脈絡もなく、自然言語処理系のことでも書こうかな、と思っています。

ここまで読んでいただき、ありがとうございました！
yhpg01

Pythonの勉強を始めてみたので
昔出題されたやつを解きなおしてみている

2017/6/26 追記
指摘をいただいたので微変更

```python:yhpg01.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

# https://yhpg.doorkeeper.jp/
# http://nabetani.sakura.ne.jp/hena/1/
import numpy as np
import math
def solve(data):
    field = np.array([["0","0","0"],["0","0","0"],["0","0","0"]])
    player = ["o", "x"]
    for i in range(len(data)):
        x = math.floor((int(data[i])-1)/3)
        y = (int(data[i])-1)%3
        if isNotFoul(x,y,field) == True:
            field[x][y] = player[i%2]
            if isWin(field,player[i%2]):
                return player[i%2] + " won."
        else:
            return "Foul : " + player[(i+1)%2] + " won."
    return "Draw game."

def isNotFoul(x,y,field):
    return field[x][y] == "0"

def isWin(field, player):
    transposedField = field.transpose()
    expect = np.array([player,player,player])
    for i in range(3):
        if checkRow(field[i],player):
            return True
        elif checkRow(transposedField[i], player):
            return True

    if checkSkew(field,player):
        return True
    return False

def checkRow(fieldRow, expect):
    return (fieldRow[0] == expect and fieldRow[1] == expect and fieldRow[2] == expect )


def checkSkew(field, expect):
    return (field[0][0] == expect and field[1][1] == expect and field[2][2] == expect
         or field[0][2] == expect and field[1][1] == expect and field[2][0] == expect)


def test(data, expect):
    result = solve(data)
    if result == expect:
        print("成功: " + result + "/" + expect )
    else:
        print("失敗: " + result + "/" + expect )

#test("123456789","x won.")
test("79538246","x won.")
test("35497162193",	"x won.")
test("4319581",	"Foul : x won.")
test("371929",	"o won.")
test("36535224","Foul : o won.")
test("142583697","Draw game.")

```
[Swift 3] 画面サイズ statusBar navigationBar tabBar の高さ・幅を取得する

#目的
以前調べた取得方法だと構文エラーが出たのでSwift3用に書いた

#コード
```DeviceSize.swift
import UIKit


struct DeviceSize {
    static let bounds = UIScreen.main.bounds
    static let screenWidth = UIScreen.main.bounds.size.width
    static let screenHeight = UIScreen.main.bounds.size.height
    static let statusBarHeight = UIApplication.shared.statusBarFrame.height
    static let navigationBarHeight = { (navigationController: UINavigationController) -> CGFloat in
        return navigationController.navigationBar.frame.size.height
    }
    static let tabBarHeight = { (tabBarController: UITabBarController) -> CGFloat in
        return tabBarController.tabBar.frame.size.height
    }
}

```
[BUKURO.swift]Machスレッドスタック

<p>Swift勉強会 関東で、Darwinのスタックについて話題となったので調べてみた。</p>

<p>UNIXプログラムのメモリモデル</p>
![unix.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/1d748ca4-56af-7a22-2258-0408dc8d89f8.jpeg)

<p>Machプログラムのメモリモデル</p>
![mach.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/abdac996-a1e0-6e7f-f021-2d6813a39520.jpeg)

<p>UNIXプログラムのメモリモデルだと、メモリが確保できる限り、スタックは確保できるが、Machプログラムのメモリモデルだと、決められたサイズのスレッドスタックが確保されるので、メモリに余裕があっても、スタックが枯渇するという現象が発生する。なので、再帰呼び出しは避けた方がいい。</p>

関連情報
<a href="https://amazon.jp/dp/4810180778">Machオペレーティングシステム―プログラミングと概念</a><br />
<a href="https://cocoa-study.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://connpass.com/series/499/">Swift勉強会 関東 (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="https://mosa.connpass.com">MOSA BUKURO.swift (connpass)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
CNNモデル作成時にやっておくと良い精度チェックポイントの設定

この記事は、自身のブログ、[Data Science Struggle](http://marubon-ds.blogspot.jp)を翻訳したものになる。  


#概略
自分で画像分類のためのモデルをCNNで作っていくとき、accuracyやlossを見ながら精度を判断していくことになる。とはいえ、実際にはこの精度というのがなかなか難しい。そもそも、データの量と質という要素がある以上、一概にaccuracyの低さがネットワークの良し悪しによるものだとは言い切れない。 
モデル作成とテストの試行錯誤が十分になされ、精度の感覚を十分に理解できているのならば問題もないだろうが、実際のところ、CNNなどのモデルには一度の訓練でもかなりの時間がかかり、十分な試行錯誤もいつでもできるというわけでもない。 
実践的な近道はあるのか？ 

#基礎知識
CNNモデルを作成する時、その精度はbase scoreとの比較で判断することができる。ここでいうbase scoreとはモデル精度の一つのチェックポイントであり、そのスコアと比較をすることで、少なくとも自分の作成しているモデルが、データに対して好ましいものか否かを判断する。 
教師クラスの数と、そこに属するデータ数の組み合わせから一つのbase scoreを求めることができる。 
例えば、cifar-10（非常に良く使われるカラー画像のデータセット）は10のカテゴリがあり、それぞれのカテゴリが等量の画像を有している。つまり、ランダムにラベルを予測したとして、正答率はおよそ0.1になる。 故に、最初にcifar-10についてモデルを作成した時、この0.1を十分に超えているかどうかがモデルの正答率のスケールを理解する指標の一つとなる。 

#実践的な手法
上で書いたように、ランダムにラベルを伏したときの正答率というのは一つのbase scoreになりうる。とはいえ、実際のところCNNが組まれる時に望まれるaccuracyのスケールはランダムにラベルを付した物と比べられるものではない。  
CNNを用いて問題の解決をはかるときは、もちろん、問題解決に必要なだけの精度があれば良いわけではあるが、それでも、0.8や0.9などといった正答率の精度をモデルに期待する。（実際はデータの量、質との兼ね合いを見ながらゴールを設定するべきだが、ここでの主張は***CNNが組まれる時にはランダムにラベルを付して得られるような精度とは比べるべくもない程度には高い精度を求められることが多い***ということ）  
ランダムにラベルを付して得られるbase scoreはそれはそれで、本当にスタートポイントにおいて、最低限、モデルがデータを追うことが少しでもできているのかを確認するのには良いが、それ以上を望むことができない。  

ここで便利なのが [inception-v3 fine tune model](http://qiita.com/shu_marubo/items/f57f069b8aef99cab288)の利用だ。 
詳しくはリンク先の記事で書いてるが、要するに、***既存の優れたネットワークの一部を自分のデータを用いてモデルを書き換える***ことにより作られるモデルになる。 
このモデルを用いて分類を行い、そのaccuracyがbase scoreとして機能する。 
手順をまとめると以下のようになる。 

1. データを用いてfine tuneによりモデルを作成する
2. 作成したモデルで予測を行い、そのaccuracyをbase scoreとみなす
3. 自身のオリジナルモデルを作成する
4. オリジナルモデルによるスコアとベーススコアを比較する

ランダムなラベル付けによって得られるスコアが第一チェックポイント、fine tuneで作成されたモデルによる予測のスコアが第二チェックポイントとなる。 
実際のところ、我々がニューラルネットで分類モデルを作成する時、そこに求めるのは精度だ。もしも、幾分の試行錯誤ののちに結局第二チェックポイントを十分い超えることができたならそのまま突っ走れば良いし、超えることができない、もしくは、超えるモデルを作成できるにしても時間や金銭の面でコスパが悪いようであればこのfine tuneモデルを採択すれば良い。 

#まとめ
自身でCNNモデルを作成する時は、正確ではなくとも、幾分の、簡単に設置できるチェックポイントを設けると精神衛生的にもよろしい。ランダムに選んだ時に出されるおおよその正答率すら調べないまま進めてしまうと、自分のモデルが出している正答率がどのようなものなのかをまったくわからないままモデリングを進めることになってしまう。コスパ良く設置できるチェックポイントを設けておけば、試行錯誤が思うようにいかなかった時の代替選択肢にもなるので、モデル作成の初期段階で設けておきたい。
Goutte を使ってスクレイピングをしてみた

Goutte を使って、Yahooニュースの情報を取得してみました。
とても、簡単で便利ですね。

### 動作環境

- Laravel5.4
- PHP5.6
- Sqlite
- MacOS10.12

### インストール

composer require weidner/goutte

### 初期設定

config/app.php

providers 配列に以下を追加

```
Weidner\Goutte\GoutteServiceProvider::class,
```

aliases 配列に以下を追加

```
'Goutte' => Weidner\Goutte\GoutteFacade::class,
```

### スクレイピング設定

Yahoo ニュースからタイトル、URL、サムネイル画像を取得する
※サムネイル画像は、存在しない場合があるので、存在チェックをしている


```
Route::get('/goutte', function() {
    $crawler = Goutte::request('GET', 'https://news.yahoo.co.jp/list/?c=economy');
    $crawler->filter('.listArea .list li')->each(function ($node) {
      $val['url'] = $node->filter('a')->attr("href");
      $val['title'] = $node->filter('.ttl')->text();
      if ($node->filter('.imgWrap .image img')->count() > 0) {
        $val['thumbnail'] = $node->filter('.imgWrap .image img')->attr('data-src');
      }
      dump($val);
    });
    return;
});
```

こんな感じで取得できました。

![スクリーンショット 2017-06-25 22.33.23.png](https://qiita-image-store.s3.amazonaws.com/0/151710/6fd907ae-10cd-32b0-3c9c-0b07293441d2.png)
AWSでtensorflowがGPUを認識しないと思ったら

AWSでディープラーニング用のEC2インスタンスを用意して、テストコードを動かしたら、GPUを認識してくれなかった。

いろいろ調べた結果、CPU用のtensorflowを使っていたことに気づいた・・・。

```bash
$ conda install tensorflow-gpu
```
で解決（anacondaの場合）。`pip`からインストールするには[こちら](https://www.tensorflow.org/install/install_linux#InstallingAnaconda)を参照。
Git GUIクライアントについて

# Gitをコマンドラインから直接いじるよりは、GUIクライアント使うほうが安心する派なので。

Git GUIクライアント(Mac用)まとめます。

## とりあえず気になっている奴らだけ

 * モダン系
    * [Git Fork](https://git-fork.com/)
        * diffの表示するとき変更ファイルをディレクトリも一緒に表示してくれるから嬉しい。
        * 見やすくはないかも(画像とかそういう点で)
        * コミットをブランチ毎にまとめようという思想は見やすくて好き
        * コミットメッセージ検索あり
        * コミット者名検索あり(メッセージ検索と一緒にやってくれる)
    * [Git Kraken](https://www.gitkraken.com/)
        * (基本)無料
        * 有料版あり(違いは不明、年間50ドル![スクリーンショット 2017-06-25 22.27.53.png](https://qiita-image-store.s3.amazonaws.com/0/171564/4f630717-d2a5-62c2-4919-b271699ef6a2.png) あんまうれしくないかも)
        * コミットメッセージ検索可
        * history内にcurrentのunstageのものとかも表示してくれるのは見やすい。
 * 前からあったらしい系
    * [Tower](https://www.git-tower.com/buy)
        * 7000円くらい。(いまだと6000くらいになってる)
        * コミットメッセージ検索化
        * コミット者名検索不可
        * コミットはできるだけ時系列に沿って表示したいという思想っぽい

## こんなのないかな
 * git管理下のファイル名検索(過去履歴含め)
 * git管理下の全ファイル内検索(過去履歴含め)
 * 複数リポジトリの管理

## あれのこれなんでこっちにないの一覧
 * unstageな変更をブランチのの先につけるようにしてくれる仕様なんでkrakenにしかないの。
    * forkとtowerはなんでworking copyとかchangesとかでそういうのを別戸表示したがるのかマジで謎 tig見習って。
 * なんでcommitを時系列に並べたがるの
    * 違うブランチ同士を横並べにしてて、なんでcommitを無理やり時系列にするのか謎。
    * fork見習って。こっちのほうが見やすい。
 * Githubのdiffsplit表示みたいなの欲しい
    * 単純にsplit表示のほうが好きってだけなんですけどね。
    * towerのdiff設定いじればいけっかも。
 * forkはなんでdiffの-とか+とかをcopy able な範囲に入れてんの
    * コピペ用に使うならそれいちいち消すのめんどいんだけど。

## 結論。個人的に使いたい順

 * tower
 * fork
 * kraken

# ちなみに
GUIクライアントに寄ってできるものが違うので、複数使うのが吉。


# まだ
こまいところ見ていないから、(mergeとかrebaseとか)またちょい使って比較する。

今のところtowerに課金して(今だと25%オフ)fork使うかもなぁと。おもってる
[rails]一次元配列を分割する

# in_groups_of

一次元配列を引数の数ずつ分割できます。
デフォルトでは要素に不足がある場合はnilが入ります。

```ruby
[1,2,3,4,5].in_groups_of(2) # => [[1, 2], [3, 4], [5, nil]]
```

第二引数に指定することで不足分にnil以外を入れるようにできますし、
falseを指定すれば何も入れないという指定もできます。

```ruby
[1,2,3,4,5].in_groups_of(2, 0) # => [[1, 2], [3, 4], [5, 0]]
[1,2,3,4,5].in_groups_of(2, false) # => [[1, 2], [3, 4], [5]]
```

# in_groups

一次元配列を引数の数で分割できます。
デフォルトでは要素に不足がある場合はnilが入ります。

```ruby
[1,2,3,4,5].in_groups(2) # => [[1, 2, 3], [4, 5, nil]]
```

`in_groups_of`と同じく、
第二引数に指定することで不足分にnil以外を入れるようにできますし、
falseを指定すれば何も入れないという指定もできます。

```ruby
[1,2,3,4,5].in_groups(2, 0) # => [[1, 2, 3], [4, 5, 0]]
[1,2,3,4,5].in_groups(2, false) # => [[1, 2, 3], [4, 5]]
```
remixをlocal（Docker）で起動

[合同会社kumanote](http://kumano-te.com/)のTanakaです。

今回は、ethereum上のtokenを開発するにあたってのtipsを紹介したいと思います。

remix（browser-solidity）をdocker上で動かし、host上のブラウザで閲覧できるようにしたので、その紹介になります。

※ [remix](https://ethereum.github.io/browser-solidity/) のローカルでの起動になります。

![スクリーンショット 2017-06-25 22.05.47.png](https://qiita-image-store.s3.amazonaws.com/0/188896/6f3cbda0-8ce8-ce5e-ac92-c43aa439b053.png)

## Dockerfile

```
FROM ubuntu:16.04        # <- 容量重いので適時かえてください
MAINTAINER kumanote,LLC. # <- 適時かえてください

# install utilities
RUN \
  apt-get update && \
  apt-get install -y git curl wget screen && \
  apt-get install -y build-essential libssl-dev python && \
  apt-get install -y language-pack-ja

# set locale & timezone
RUN locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV TZ Asia/Tokyo

# install remix
RUN \
  curl -sL https://deb.nodesource.com/setup_8.x | bash && \
  apt-get install -y nodejs && \
  git clone https://github.com/ethereum/browser-solidity.git

WORKDIR /browser-solidity

RUN \
  npm install && \
  npm run prepublish && \
  npm install

EXPOSE 8080

CMD ["npm", "start"]
```

## ビルド

```
docker build -t kumanote/remix:v1.0.0 .
```

## 実行

```
docker run -p 8080:8080 kumanote/remix:v1.0.0
```

http://localhost:8080/ で利用できるようになります。
Ansynchronus Function with Iteration

```js
(function test() {
  for (var i = 0; i < 10; i++) {
    setTimeout(function() {
      console.log(i)
    , 100});
  }
})();
```
Expected return would be 

```
0
1
2
3
4
5
6
7
8
9
```
Actual return is

```
10
10
10
10
10
10
10
10
10
10
```
That happened because of setTimeout function, which receives the value after updating variable "i" 10 times.

It is to nest setTimeout function with self-invoking function, so you can pass the "i" value of each cycle moment to it!!

```js
(function test() {
  for (var i = 0; i < 10; i++) {
    (function(i) {
      setTimeout(function() {
        console.log(i);
      }, 1000);    
    })(i);
  }
})();
```
The result would be

```
 0
1
2
3
4
5
6
7
8
9
```
In ES6,
You can only change "var" to "let" in for loop parenthesis, because "let" is scoped to the nearest enclosing block.

```js
(function test() {
  for (let i = 0; i < 10; i++) {
    setTimeout(function() {
      console.log(i)
    , 100});
  }
})();
```

Cool!!
Oracle 正規表現で検索

あるワードが先頭と末尾以外に含まれている文字列を
抽出したいということがあったのでメモ。

以下のような文字列でワードは「焼肉」の場合に

1. 焼肉を食べたい
2. 今日は焼肉を食べたい
3. 毎日食べるのは焼肉

2.だけを取得したい場合に正規表現で

```
.焼肉.
```
で検索すると抽出できる。

Oracleで正規表現で検索する場合のSQLは以下のように記述。

```sql
SELECT * FROM [対象のテーブル名] WHERE REGEXP_LIKE([対象のカラム名],'.焼肉.')
```
AviUtlのexoファイル出力時のテキストの変換

#はじめに
AviUtlのexoファイルのテキストはUnicodeをバイト文字列にしたもののようで、かつ4096文字分の固定長形式のようです。
まぁ大した内容ではないのですが、動画作成で同じような内容はexoファイルを作って自動化するに辺り、テキスト変換用のメソッドを次のように作ってみたというものです。

#exoファイル用のテキスト変換

```C#
private string ConvertExoText(string text)
{
    string result = BitConverter.ToString(UnicodeEncoding.Unicode.GetBytes(text)).Replace("-", "");
    result = result + new string('0', 4096 - result.Length);
    return result;
}
```
文字列をUnicodeでエンコードして、それをBitConverterで16 進数文字列形式に変換し、かつ"-"を取り除き、4096バイトとなるように後ろに"0"を付加するだけです。

以上
IntelliJ IDEA の Terminal で Cmder を使う

Windowsで IntelliJ IDEA を使用するときに、Terminal を [Cmder](http://cmder.net/) に変更する手順です。

環境はこちらです。

* Windows 10
* IntelliJ IDEA 2017.1.4
* Cmder v1.3.2

IntellJ と Cmder のセットアップが完了している前提になります。

IntelliJ の メニュー > File > Settings > Terminal で、Shell Path を下記のように設定します。 ※環境変数 CMDER_ROOT は事前に設定しておきます。

```
"cmd.exe" /k ""%CMDER_ROOT%\vendor\init.bat""
```
![setting-shell-path.png](https://qiita-image-store.s3.amazonaws.com/0/2163/e090333b-a92a-c115-2a38-bcda3c048dde.png)

Apply、OK をクリックし、Terminal を開くと下記のようにTerminalがCmderに切り替わります。

![cmder.PNG](https://qiita-image-store.s3.amazonaws.com/0/2163/1753e8e4-44c9-8448-b55b-bc9fd193c779.png)

Linuxライクなコマンドが利用できるようになり、Gitのコマンドも使えるようになります。

ただし、デフォルトでは日本語がうまく表示されません。。
GoogleAppEngineで日本時間(JST)を使う

GoogleAppEngine上で Python + Flask + SQLAlchemy で開発しているが
タイムゾーンがUTCなので、datetime.nowが JSTとずれてしまう。
対応してみたのメモ

pytzを入れる

```python:requirements.txt
Flask==0.12.1
Flask-SQLAlchemy==2.2
pytz
```

```Bash
$ pip install -t lib -r requirements.txt
```


datetime.nowでタイムゾーンを指定する

```python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pytz
import datetime

app = Flask(__name__)
db = SQLAlchemy(app)

class Hoge(db.Model):
     __tablename__ = 'hoge'
     id = db.Column(db.Integer, primary_key=True)
     created_at = db.Column(db.DateTime, default=datetime.datetime.now(pytz.timezone('Asia/Tokyo'))

```
[WIP] htaccess 早見表

htaccessって本当に便利ですよね。

# 前提
htaccess　を有効にする

```httpd.conf
AllowOverride All
```

## Error page
404は404ページしか見せません

```..htaccess
ErrorDocument 404 /404.html
ErrorDocument 503 /503.html
```

## Basic Auth
Basic認証。htpasswd を置かないと入れません。

```..htaccess
AuthUserFile {path}.htpasswd
AuthGroupFile /dev/null
AuthName "Protected Area"
AuthType Basic
require valid-user
```

## Mod Rewrite
これを知っているとかなり便利

```..htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^hogehoge.com
RewriteCond %{HTTP} on
RewriteRule ^(.*)$  https://gehogeho.com/$1 [L,R=301]
</IfModule>
```

## Redirect
単純リダイレクト。301

```
Redirect permanent /~hoge/ http://hogehoge.com
```

## RedirectMatch
単純リダイレクト。301。正規表現OK

```..htaccess
RedirectMatch permanent (.*) https://hogehoge.com
```

## cache setting
キャッシュの設定。しないパターン（前者）とするパターン（後者）

```..htaccess
<Files ~ ".(gif|jpe?g|png|ico|otf|ttf|eot|woff)$">
Header set Pragma no-cache
Header set Cache-Control no-cache
```

```..htaccess
<Files ~ ".(gif|jpe?g|png|ico|otf|ttf|eot|woff)$">
Header set Cache-Control 'max-age=2592000, public'
</Files>

<Files ~ ".(css|js|html)$">
Header set Cache-Control "max-age=86400, public"
</Files>
```

## IP Block
```..htaccess(2.2.x)
order allow,deny
allow from all

deny from 192.168.           # 192.168.*.* を拒否
```

```..htaccess(2.4.x)
<RequireAll>
Require all granted
Require not ip 192.168.    
</RequireAll>
```

## WAF IP許可設定
WAF。wpは特に特定のIP許可したいです。

```..htaccess
<IfModule mod_siteguard.c>
SiteGuard_User_ExcludeSig ip
(許可したいIP)
</IfModule>
```


## Charcter Code
最近は、あんまり使わない気がする

```..htaccess
php_value default_charset "UTF-8"
php_value mbstring.language "neutral"
php_value mbstring.internal_encoding "UTF-8"
```

# 応用
## xmlrpc.php無効(wordpress向け)
```..htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^xmlrpc\.php$ https://%{HTTP_HOST} [R=301,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
```

## 許可IP以外のIPはbasic認証行き
```..htaccess(2.4.x)
<IfModule mod_authz_core.c>
    <RequireAny>
        AuthName "Input ID & Password"
        AuthType Basic
        AuthUserFile {path}.htpasswd
        Require valid-user
        Require ip {IP}
    </RequireAny>
</IfModule>
```
Pythonで機械学習環境を作りたかったので macに環境を用意した

加筆修正の予定あり。

# 動機

- 機械学習をすることになった。とにかく手っ取り早く始めたい。
- 道具としてはPythonが適してるかな？
- まとめて環境つくっちゃえ！

# 環境

マシン（実機）
mac osx sierra

入れたもの

- Python 3.x系（実際にインストールされたのは Python3.6.1）
- anaconda(2017/06/25での最新：3-4.4.0)
- tensorFlow(1.2)
- jupyter notebook
- xlrd,xlwt


macに対し　Python3 pyenv tensorFlow xlrd+xlwt　などを入れた

# バージョン管理に、homebrewを使ってpyenvをインストール

pythonのバージョンを切り替えることができる。rbenvに近いイメージ。
homebrew入れていないorバージョンが古い(0.9.5未満？）の人は更新して！

```bash:pyenvのインストール
$ brew install pyenv
```
## シェルの設定記述を追記する

ターミナルでbashを使う（デフォルト）と仮定する。
`~/.bash_profile`に、以下のような追記(設定を呼び出すための記述？）を行う。　

```bash:.bash_profileに設定を追記する
PYENV_ROOT=~/.pyenv
export PATH=$PATH:$PYENV_ROOT/bin
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

# anacondaをインストールする

数値計算処理などのプラグインも用意されているanacondaを使うことにした。
バージョンが多岐にわたるので、パッケージなどで絞り込むのもいいかも。

```bash:pyenvでインストールできるanacondaを調べる
$ pyenv install --list | grep anaconda
```

```bash:上記命令の実行結果
  anaconda-1.4.0
  anaconda-1.5.0
  anaconda-1.5.1
（中略）
  anaconda3-4.2.0
  anaconda3-4.3.0
  anaconda3-4.3.1
  anaconda3-4.4.0
```

```bash:pyenvでanacondaをインストールする
$ pyenv install anaconda3-4.4.0
```

こんな風にインストールされればOK

```bash:インストールを確認する
$ pyenv versions
* system (set by /Users/rojiuratech/.pyenv/version)
  anaconda3-4.4.0

```

# tensorFlowをインストールする環境を用意する

virtualenvを作って、そっちにインストール

```bash:virtualenvを生成する
$ pyenv virtualenv anaconda3-4.4.0 tensor-ana3440
```

```bash:実行結果
Fetching package metadata .........
Solving package specifications: .

Package plan for installation in environment /Users/ろrojiuratech/.pyenv/versions/anaconda3-4.4.0/envs/tensor-ana3440:

The following NEW packages will be INSTALLED:

    openssl:    1.0.2l-0     
    pip:        9.0.1-py36_1 
    python:     3.6.1-2      
    readline:   6.2-2        
    setuptools: 27.2.0-py36_0
    sqlite:     3.13.0-0     
    tk:         8.5.18-0     
    wheel:      0.29.0-py36_0
    xz:         5.2.2-1      
    zlib:       1.2.8-3    
```

pipはあるけど pip3ではないところに注意（python2環境はないので、これで問題ないようだ）

# tensorFlow をインストールする


```bash:tesorFlowをインストール
$ sudo pip install tensorflow
```

# jupyter notebook ,xlrd,wlwt をインストールする

## jupyter notebook

Pythonなどの対話的な実行環境として使われるjupyterをインストールする。

```bash: jupyterを入れる
$ pip install jupyter
```

## スプレッドシートの読み込みに xlrdをインストール

```bash: xlrdを入れる
$ pip install xlrd
```


## 同書き込みのために xlrtをインストール

```bash: xlwtを入れる
$ pip install xlwt
```

# 参考



https://www.tensorflow.org/install/install_mac#prerequisite_python
AWS + Node.js + Express + SSL

#やりたいこと
EC2にデプロイしたNode.js + ExpressアプリケーションをSSL対応させたい。

参考サイト
http://qiita.com/masch/items/a5ef84998fb7784f9115

#ざっくりした手順
- Route53でドメイン取得（有料）
- AWS Certificate Manager(ACM)でSSL証明書作成
- EC2 Elastic Load Balancing(ELB)でSSL証明書を使用する設定
- Route53でDNS設定


#はまったところ
Node.js + Expressアプリケーション（つまりEC2）で443ポートを待ち受ける設定をしておかないといけないと思っていたが、
実際はそうではなくなんでもいいっぽい。今回は8080にしてみた。
なぜなら、一旦ロードバランサを挟むから。
当初のイメージ
**クライアント　→　EC2**
実際
**クライアント　→　ロードバランサ　→　EC2**

なので、443ポートを開く必要があるのはロードバランサ。
RockyLinux 8.x/9.x 及びUbuntu Server 22.04でGUI画面時のログインユーザー一覧を非表示にする方法

RockyLinux/AlmaLinux 8.xや9.xやRHEL7.xでGUIを利用する場合、最初のログイン画面にてログイン時にログインしたことのあるユーザーやそのOS内のローカルユーザーがあらかじめ表示される設定がデフォルトになっています。これはセキュリティ的にもあまりよろしく無いので、従来のようなユーザー名とパスワードをて入力する形に変更する方法をメモしておきます。なお、Ubuntu Linux 22.04.2でも同様に対応可能です。

## 手順

gdmプロファイルを作成する

```bash:
cat > /etc/dconf/profile/gdm << EOF
user-db:user
system-db:gdm
file-db:/usr/share/gdm/greeter-dconf-defaults
EOF
```

gdm-dbを作成する

```bash:
mkdir -p /etc/dconf/db/gdm.d
cat > /etc/dconf/db/gdm.d/00-login-screen << EOF
[org/gnome/login-screen]
# Do not show the user list
disable-user-list=true
EOF
```
設定を反映

```bash:
dconf update
```

既存ユーザーをログアウトする。


ログインユーザー名を聞くようになったことを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85495/fdda2335-1c8f-6e50-b7e1-26f23f919f7c.png)



## RockyLinux8 であれば以下の方法でも可能

```bash:
sudo -u gdm dbus-launch gsettings set org.gnome.login-screen disable-user-list true
````



## 追記
同じ手順でRedhat Enterprise Linux 7.x/8.x/9.xでも動作すると思います。


## 参考
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Desktop_Migration_and_Administration_Guide/customizing-login-screen.html
https://help.gnome.org/admin/system-admin-guide/stable/login-userlist-disable.html.en