OmniAICreator/Qiita-1.07M huggingface dataset:
PhotoLibraryから選択した写真のメタデータを取得する


やりたいことは自分のアプリ内で、
UIImagePickerControllerを呼び出してPhotoLibraryから写真を選択、
選択した写真の（画像もだけど）ExifやTiffなどのメタデータも取ってくる、ということ。

iOS9からALAssetsLibraryが非推奨になったので、メタデータ取得にもPhotos frameworkを使った。

UIImagePickerControllerDelegate に適合したPhotoViewControllerを用意し、以下な感じで実装。

```swift:PhotoViewController.swift
class PhotoViewController: UIViewController {

	// PhotoLibraryを出すところ
    func showPicker() {
        let sourceType = UIImagePickerControllerSourceType.PhotoLibrary;
        if (UIImagePickerController.isSourceTypeAvailable(sourceType)) {
            let picker = UIImagePickerController()
            picker.sourceType = sourceType
            picker.delegate = self
            self.presentViewController(picker, animated:true, completion:nil)
        }
    }
}

extension PhotoViewController: UIImagePickerControllerDelegate {
	// 写真選択された際に呼ばれる
	func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
	// 画像の取得云々は割愛
	
    // meta data取得
    if
        let assetURL:AnyObject = info[UIImagePickerControllerReferenceURL],
        let url = NSURL(string: assetURL.description)
    {
        let result = PHAsset.fetchAssetsWithALAssetURLs([url], options: nil)
        if let asset = result.firstObject as? PHAsset {
            let options = PHContentEditingInputRequestOptions()
            options.networkAccessAllowed = true
            asset.requestContentEditingInputWithOptions(options, completionHandler: {
                (input, info) in
                printd("\(input), \(info)")
                if
                    let input = input,
                    let url  = input.fullSizeImageURL
                {
                    let ciImg = CIImage(contentsOfURL: url)
                    // ciImg?.propertiesに、EXIF, TIFFなどのメタデータが入ってる
                    printd("\(ciImg?.properties)")
                }
            })
        }
	}
}
```

# 参考
http://stackoverflow.com/questions/24462112/ios-8-photos-framework-access-photo-metadata
https://github.com/zakkhoyt/PHAsset-Utility
整数を00:00:00にさせる方法を考えてる時のメモ


```プログラムコード
mport UIKit

var count = 4762
let day = count / (24 * 3600)
let hour = count / 3600
let minute = (count - hour * 3600) / 60
let second = count - (hour * 3600 + minute * 60)

print("まだ\(count)秒です。")

func dayTime() {
    print("\(day)日です。")
}

dayTime()

func hourTime() {
//    let hour = count / 3600
    print("\(hour)時間です。")
}

hourTime()

func minuteTime() {
//    let minute = (count - hour * 3600) / 60
    print("\(minute)分です。")
}

minuteTime()

func secondTime() {
    print("\(second)秒です。")
}

secondTime()
print(String(format: "%02d:%02d:%02d", hour, minute, second))

func countDown() {
    count -= 1
    timeFormat(count: count)
//    print("残り\(count)秒です。")
//    print(String(format: "%02d:%02d:%02d", hour, minute, second))

}

func timeFormat(count:Int) {
    let h = count / 3600
    let m = (count - h * 3600) / 60
    let s = count - (h * 3600 + m * 60)
    print(String(format: "%02d:%02d:%02d", h, m, s))
}

countDown()


```

結果こうなりました↓↓↓

```出力
まだ4762秒です。
0日です。
1時間です。
19分です。
22秒です。
01:19:22
01:19:21
```

`var`の値を変えるとそれを直してくれます。
最近で一番頭使ってたかも・・・
how to override rails-ujs

https://github.com/rails/rails/blob/a5b83123177b41a1b9cc7fabe89e408228efcd19/actionview/test/ujs/views/layouts/application.html.erb

https://github.com/parti-xyz/govcraft/blob/6cbda54cf4b17aa97a58b2b8a9be6926b99b0eda/app/assets/javascripts/govcraft_ujs.js

https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts/rails-ujs/start.coffee#L69
【PHP】XSSとは-----対策

##XSSとは

####[XSS定義(WiKi)](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)

クロスサイトスクリプティング（cross site scripting）とは、Webアプリケーションの脆弱性もしくはそれを利用した攻撃。脆弱性をツリー型に分類するCWEではXSSを不適切な入力確認(CWE-20)によるインジェクション(CWE-74)のひとつとして分類している(CWE-79)。略称はXSS。かつてはCSSという略称も使われていたが、Cascading Style Sheetsと紛らわしいのでこの略称はあまり使われなくなった。「クロスサイト（サイト横断）」という歴史的な名称である。

>おすすめ：[XSS脆弱性とXSS攻撃の詳細](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0#mw-headline)

####インジェクション箇所(WiKi)

HTML内には攻撃者が悪意のあるスクリプトをインジェクションし得る箇所として以下のものがある：
１．フォームなど変数の値を入力可能な場所

２．スクリプト文
　①`<script></script>`の内部、および<script></script>のURLのリモート参照
　②タグのstyle属性およびイベントハンドラ属性中のスクリプト記述。
　　具体的には`<div style="...;z:expression(...);...">`や、`<span onmouseover="...">`等。
　③URLとして「javascript:(Javascript文)」の形式(javascryptスキーム)を利用してjavascryptを注入することができる。

３．URLを属性値として取れる要素、およびそこでのスクリプト直接記述。
　　具体的にはa要素のhrefとimg、frameとiframeのsrc属性。

##XSSへの対策

####エスケープ処理([htmlspecialchars](http://www.php.net/manual/en/function.htmlspecialchars.php ))


ユーザからフォームの値を取得した際、htmlで特別な意味を持つ記号を以下のように別の記号に置き換えるのはXSSへの対策方法である。

`< → &lt;`
`> → &gt;`
`& → &amp;`
`" → &quot;`
`' → &apos;`

```Ruby:XSS対策（ENT_QUOTES）
function XSS_escapeForHTML($value) {
	if (is_array ( $value )) {
		$Result = array ();
		foreach ( array_keys ( $value ) as $key ) {
			$Result [$key] = $this->XSS_escapeForHTML ( $value [$key] );
		}
		return $Result;
	} else {
		$value = htmlspecialchars ( $value, ENT_QUOTES, 'EUC-JP', false ); 
		// $value = nl2br($value);
		return $value;
	}
}
```



*参考：*
・[XSS(WiKi)](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)
・[クロスサイトスクリプティング（XSS）](http://www.trendmicro.co.jp/jp/security-intelligence/threat-solution/xss/index.html)



`---I Love PHP (｡･ω･｡)ﾉ♡`
C++ Builder / memory leak > GetModuleHandle()によるリーク

```txt:動作環境
C++ Builder XE4
FastMM
```

メモリーリーク対策中。

2分間動作させた状況と、5分間動作させた状況で比較をして、メモリリークを続ける部分を絞り込んでみた。

以下の部分があやしい。

```
77168C07 [LdrGetDllHandleEx]
7716898C [LdrGetDllHandle]
750486FC [Unknown function at GetModuleHandleW]
7504870F [Unknown function at GetModuleHandleW]
```

GetModuleHandle()を使っているのはどこかを調べたところ、FastMMが使っているようだ。

FastMMのバグだろうか。
PySide2をUbuntuにインストールする

PySide2のインストール手順を忘れないようにメモ
Pyenv + Virtualenv環境を想定

# 新しい環境をつくる
PySide2のバージョンの関係により、Python3.5.2を使用する
ただし、そのPythonは-fPICオプション付きでビルドされている必要がある
さもなくば同時にビルドされるshibokenのビルドでコケる

```bash
$ env PYTHON_CFLAGS=-fPIC pyenv install 3.5.2
$ pyenv virtualenv 3.5.2 hoge
$ pyenv local hoge

```
# 依存パッケージをインストールする
https://github.com/PySide/pyside2/wiki/Dependencies よりそのまま引用

```bash
$ sudo apt-get install build-essential git cmake qt5-default libxml2 libxslt1.1 python-dev qtbase5-dev
$ sudo apt-get install qttools5-dev-tools libqt5clucene5 libqt5concurrent5 libqt5core5a libqt5dbus5 libqt5designer5 libqt5designercomponents5 libqt5feedback5 libqt5gui5 libqt5help5 libqt5multimedia5 libqt5network5 libqt5opengl5 libqt5opengl5-dev libqt5organizer5 libqt5positioning5 libqt5printsupport5 libqt5qml5 libqt5quick5 libqt5quickwidgets5 libqt5script5 libqt5scripttools5 libqt5sql5 libqt5sql5-sqlite libqt5svg5 libqt5test5 libqt5webkit5 libqt5widgets5 libqt5xml5 libqt5xmlpatterns5 libqt5xmlpatterns5-dev
#(4/10  追記) Sphinxを入れないとdocのビルドでこけます
$ pip install sphinx
```

# GitリポジトリをCloneしてビルド実行
```bash
$ git clone --recursive https://github.com/pyside/pyside2-setup
$ python ./pyside2-setup/setup.py
```

# 参考サイト
* https://wiki.qt.io/PySide2_GettingStarted
* https://github.com/PySide/pyside2/wiki/Dependencies
* https://github.com/pyenv/pyenv/issues/469
grpc-goのInterceptorを使ってみる

# 始めに
　[前回](http://qiita.com/Mamoru-Izuka/items/d34ab163f9066b8d3cb7)の延長でちょっと分かりにくいgrpc-goのInterceptorを使ってみようと思います。

　参考：[go-grpc-middleware](https://github.com/mwitkow/go-grpc-middleware)
# Interceptorとは
　WebFramework系で言うとこのMiddlewareという認識で良いのではないかと思います。RPCメソッドの呼出に割り込んで事前・事後処理を実行することができます。
　サーバーサイド・クライアントサイドどちらでも使えるようですが、今回はサーバーサイドのみに使っています。

**※grpc-goのソースにまだ実験的なものとあったので今後に注意必要かも**
# 実装
　InterceptorにはUnaryInterceptorとStreamInterceptorの2種類が用意されており、単純なリクエストとリプライを返すRPCメソッドにはUnaryInterceptorを、Streamを使うRPCメソッドにはStreamInterceptorを使います。
　前回のサーバーサイドにInterceptorを用いて処理後のロギングを実装してみようと思います（[Logrus](https://github.com/sirupsen/logrus)を使います）。

server/main.goより抜粋

```go
// 単項用Interceptor
func unaryServerInterceptor(logger *logrus.Logger) grpc.UnaryServerInterceptor {
	return func(ctx netCtx.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
		// deferを使って処理後にログを出力
		var err error
		defer func(begin time.Time) {
			// infoからメソッド名を取得
			method := path.Base(info.FullMethod)
			took := time.Since(begin)
			fields := logrus.Fields{
				"method": method,
				"took":   took,
			}
			if err != nil {
				fields["error"] = err
				logger.WithFields(fields).Error("Failed")
			} else {
				logger.WithFields(fields).Info("Successed")
			}
		}(time.Now())

		// handler = RPCメソッド
		reply, hErr := handler(ctx, req)
		if hErr != nil {
			err = hErr
		}

		return reply, err
	}
}
```

```go
// Stream用Iterceptor
func streamServerInterceptor(logger *logrus.Logger) grpc.StreamServerInterceptor {
	return func(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
		// deferを使って処理後にログを出力
		var err error
		defer func(begin time.Time) {
			// infoからメソッド名を取得
			method := path.Base(info.FullMethod)
			took := time.Since(begin)
			fields := logrus.Fields{
				"method": method,
				"took":   took,
			}
			if err != nil {
				fields["error"] = err
				logger.WithFields(fields).Error("Failed")
			} else {
				logger.WithFields(fields).Info("Successed")
			}
		}(time.Now())

		// handler = RPCメソッド
		if hErr := handler(srv, stream); err != nil {
			err = hErr
		}

		return err
	}
}
```
　
　UnaryServerInterceptorでは引数にあるコンテキストをいじってhandlerに渡すことも可能です。StreamServerInterceptorではコンテキストは引数stream内に内包されており、取得は可能ですが、戻すことはできない（=編集できない）模様です。
　今回、参考にした[go-grpc-middleware](https://github.com/mwitkow/go-grpc-middleware)ではstreamをラッパーしてコンテキストを編集していたりします。

　これらをサーバーのオプションとして渡します。

server/main.goより抜粋

```go
logger := logrus.New()

ops := make([]grpc.ServerOption, 0)
ops = append(ops, grpc.UnaryInterceptor(unaryServerInterceptor(logger)))
ops = append(ops, grpc.StreamInterceptor(streamServerInterceptor(logger)))

g := grpc.NewServer(ops...)
```

　これでInterceptorの実装は完了です。
# 最後に
　Streamの方で素直にコンテキストをいじれたらなぁって思いましたとさ。今のところ、ロギングか認証周りくらいしか使い道を思いつかなかったりします。

　前回作ったものをInterceptorを追加して更新しています。
　https://github.com/lightstaff/grpc_test
書評の評価基準を考える


概要
----

ソフトウェア開発、コミュニケーション、マネジメントの書籍を中心に Amazon に投稿してきた書評を振り返り、評価基準のリストをまとめました。評価基準が明確になれば、わかりやすいように文章を推敲したり、意味のない文章を減らすことができます。評価基準を質問形式であらわせば、ほかの人と議論しやすくなります。

これまで投稿してきた書評のリストは[こちら](https://www.amazon.co.jp/gp/cdp/member-reviews/A3DN6HQUDRQFSB)をご参照ください。


書評はセールスとカスタマーサポート
----------------------------

書評はセールスとカスタマーサポートを兼ねています。



Amazon に投稿する理由
-------------------

Amazon の場合、簡易投票システムを通して、直接の利害関係のないさまざまな人達から簡易チェックしてもらえます。スピーチを想定した言葉や文字数の制限を加えれば、自分のスピーチのチェックにもなります。

文字数の目安は？
--------------

Amazon のガイドによれば、文章の場合、理想の文字数は75文字から300文字とのことです。ビデオレビューは2分から5分程度に収めることをおすすめしています。NHK のアナウンサーのように1分間に300文字話すとすれば、スピーチの原稿は600文字から1500文字になります。

書評の最小要件
------------

### 反感を買わないように心がけているか？

Amazon に投稿する書評の最小要件はなるべく反感を買わないようにすることです。参考にならないという投票数が多いと、書評の削除やアカウントが停止される可能性があるからです。この記事を書いているときに翻訳家で評論家の山形浩生先生の Amazon アカウントが停止されたという[報告](http://cruel.hatenablog.com/entry/2017/03/21/102104)がありました。

### 役に立たないと判断された例は？

 * 自分語りだけで書籍の内容を紹介していないだろうか？
 * ほめるもしくはけなす根拠が示されていないだろうか？
 * 強引な結論になっていないか？
 * 長すぎないか？

初心者の頃の失敗は？
-----------------

 * 初心者は書いてはいけないと思い込んでいないか？
 * 自分のために役だったことが書かれていないか？
 * すべての内容に言及しようとしていないか？

評価基準
-------

 * 前提知識のない人にわかるか？
 * ツールとしての使い勝手はどうか？
 * 思いがけず得られたお得な情報は？
 * 書籍が出版された後の追加情報は？
Pull Requestで不要なdiffが出てしまう

branch-baseとbranch-compareという二つのブランチでPRを作る時、
開発から時間が経っていたので、最新のmasterを二つのブランチへマージしてからPRを作ろうとしました。

すると、マージした分までPRのdiffにでてきてしまうという現象が起きてしまいます。

その場合、branch-compareブランチで、branch-baseブランチをマージすると、

>Already up-to-date!
>Merge made by the 'recursive' strategy.

とでてマージコミットが作成され、表示したいdiffのみ表示されます。

参考
https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC
Azure Custom Script のダウンロード先について

# 概要

Azure Custom Script を実行したマシンを雛形にして、もう１度実行しようとしたら、実行されていないようだった。
ダウンロードされる場所などについて知りたかった。

# 結論

偶然見つけた

```
/var/lib/waagent/custom-script/download/0
```
この下に、スクリプトと ```stderr``` , ```stdout``` も、あった。

番号がふられているので、このあたりを変えれば良いか、

２度めに実行するスクリプトも同じスクリプト名にしているのも原因かもしれない

もう少し詳細がわかったら、追記予定

# 参考情報

最新はこのレポジトリかな？

* [Azure/custom-script-extension-linux: Azure Custom Script Virtual Machine Extension](https://github.com/Azure/custom-script-extension-linux)

日本語での資料

* [Azure で Linux VM のカスタム スクリプトを実行する | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/virtual-machines/virtual-machines-linux-extensions-customscript)
* [Linux 用の仮想マシンの拡張機能とその機能 | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/virtual-machines/virtual-machines-linux-extensions-features?toc=%2fazure%2fvirtual-machines%2flinux%2ftoc.json)
MongoDBログローテーション

# 環境・条件

CentOS7で実施した。

    $ cat /etc/redhat-release
    CentOS Linux release 7.3.1611 (Core)

MongoDBのバージョンは3.4.2。

    $ mongod --version
    db version v3.4.2
    git version: 3f76e40c105fc223b3e5aac3e20dcd026b83b38b
    OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
    allocator: tcmalloc
    modules: none
    build environment:
        distmod: rhel70
        distarch: x86_64
        target_arch: x86_64

# 手順

mongod.confを編集する。
ログ関連の設定については以下が参考になる。

[systemlog-options](https://docs.mongodb.com/manual/reference/configuration-options/#systemlog-options)

    $ sudo /etc/mongod.conf

以下のように記述を編集する。

    # logAppend: true #コメントアウトする
    logRotate: rename

logAppendはデフォルトではfalseのはずだが、MongoDBを2.6から使っていたためか、trueになっていたのでコメントアウトした。

logAppendをfalseにしてもログがローテートされない？ため、注意。

[systemLog.logAppend](https://docs.mongodb.com/manual/reference/configuration-options/#systemLog.logAppend)には、以下のような記載があり、

    When true, mongos or mongod appends new entries to the end of the existing log file when the mongos or mongod instance restarts. Without this option, mongod will back up the existing log and create a new file.

`When true`に対して、When falseではなく、`Without this option`とあるため、falseに設定するのではなく設定自体をコメントアウトした方がよさそうである。

logRotateはデフォルトでrenameだが、明示的に指定する。

mongodを再起動する。

    $ sudo systemctl restart mongod

mongoシェルを起動し、以下のようにコマンドを発行する。

    $ mongo

    > use admin;

    > db.runCommand('logRotate', 1);

    > exit

ログファイルの出力先(mongod.confのsystemLog:pathで設定がある）を確認する。
以下のようにログファイルが分割されていればOK。

    $ ls /var/log/mongodb -l
    -rw-r--r-- 1 mongod mongod    7445330  4月 7 13:36 mongod.log
    -rw-r--r-- 1 mongod mongod 2143691041  4月 7 12:05 mongod.log.2017-04-07T03-05-51
Cognos TM1のTurbo Integrator のデバッガー

##概要
Cognos TM1 10.2.2のFP7が2017年3月末にリリースされましたが、FP7からTurbo Integratorのデバッガーが使用できるようになりました。

**IBM TM1 TurboIntegrator Debugger**
https://community.ibm.com/community/user/businessanalytics/blogs/stuart-king1/2020/03/19/turbo-intergrator

上記ページにダウンロードURLの記載があります。
https://community.ibm.com/community/user/businessanalytics/viewdocument/turbo-integrator-debugging-tool?CommunityKey=8fde0600-e22b-4178-acf5-bf4eda43146b&tab=librarydocuments

こんな感じの画面です。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/536d944d-1dbc-fbf2-b679-2e3f9ab12344.png)


##セットアップ手順
当然ですが、TM1 ServerにFP7が適用されている事が前提です。

先のTIデバッガー紹介リンクにある、TI Debugger here.の文字から、TI Debuggerをダウンロードします。

デバッグ対象のTM1サーバーのTm1s.cfgに以下を追加します。
HTTPPortNumber=8000
EnableTIDebugging=True
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2197d77b-29e6-2de8-04a8-808a5b028e58.png)

UseSSL=T になっている事も確認して下さい。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1469fb3e-7a05-0852-5cf2-d5b08da41bfd.png)

TM1サーバーを再起動します。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e639fba6-329a-2e59-e7c2-a8c968b0f388.png)

先ほどダウンロードしたデバッグツールを任意のフォルダに解凍し、TurboDebugger.batを実行します。
※TM1 Serverノードではなく、開発用端末で解凍です。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7a7933ab-95fd-9b6d-0b60-34445e1daa20.png)

URLの指定を、http → https に変更し、ホスト名をTM1 Serverノードのホスト名に変更します。
UsernameとPasswordを入力し、Loginします。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/fd3f4190-d1c5-8a9b-c776-303ef69cee6e.png)

任意の行を右クリック表示されるメニューで、ブレークポイントの指定が可能です。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/661625f0-49ed-3b4c-7060-c468b24b5e0e.png)

この画面上でTIプロセスを選択し、Executeします。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2a454b78-2f21-1815-63a9-90a488e9bf5c.png)

StepOver、StepIn、StepOutなど可能です。
StepOutしてPrologタブのブレークポイントで止まっている状態です。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/caac1419-43e6-56ed-472d-050988b78f44.png)

Variablesの状態や、ロックの状態が表示されています。
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f8589915-495a-258f-976c-580f49d0aee7.png)
C++ Builder / memory leak > TEncoding型変数

2013年5月のメモより

```delphi
TEncoding.GetEncoding

ENC: TEncoding;

ENC := TEncoding.GetEncoding(20932);  // EUC_JP

SL.SaveToFile('test.txt', ENC);

ENC.Free;
```

明示的に破棄しないとメモリリークが発生する。

watercolor-cityさんのページで見たと思うが、今は残念ながらリンク切れ。
~~http://www.watercolor-city.net/ct_delphi/delphi_tiburon/doc_unicode/tencoding_textio.htm~~
firebase serve でローカルテストする時に同一ネットワーク内のデバイスからアクセスする方法（Webアプリ）

デプロイ前にスマホでもローカルでテストしたいということはよくありますよね。
でも、デフォルトだと`localhost`から以外はアクセス出来ないようです。
同一ネットワーク内からIPでアクセスする方法ないかなと思って調べたら`-o`オプションで`host`を変えられるようだったので、

```bash
firebase serve -o 0.0.0.0
```

としたら、スマホからもアクセス出来るようになりました。
config gem勉強

セッティングを便利で管理、使えるgem

**github**:  https://github.com/railsconfig/config

- railsでymlファイルを更新した後、直ちに確認したい時

```rb
Settings.reload!
```
- ymlにembedded Rubyも使えること

メリット: 綺麗, railsが起動する時、embedded Rubyが正しいのかをチェックしてくれる
例えば、#{Rails.root}/config/environments/development.ymlに下記の内容を記載できる

```rb
max: <%= 1.megabytes %>
```
2017年のハッカソン開催情報まとめ！ - 3月/4月分

2017年3月と4月！

[2017年のハッカソン開催情報まとめ！](http://qiita.com/satoshi0212/items/178c56c3ae28dd4c3252)


# 3月

### [try!Swift](https://www.tryswift.co/tokyo/jp)
- 3月4日

### [中京テレビハッカソン HACK-CHU](http://www.ctv.co.jp/hackathon2017/)
- 3月4日 予選【アイデアソン】
- 3月11日-12日 本選【ハッカソン】

### [パッカソン2017](http://packathon.jp/)
- 3月4日-5日

### [COMMUNITY TECH HACKATHON　ワーキングコミュニティ「co-ba」をAkerun APIでハックしよう！](http://cobahack.peatix.com/)
- 3月4日

### [【E2D3】第１回スポーツデータビジュアライゼーション ハッカソン](https://e2d3.connpass.com/event/51242/)
- 3月4日

### [クソサイト開発バトル #2 #kusoDevBattle](https://kusodevbattle.connpass.com/event/47887/)
- 3月4日

### [SeeD x Digital Grid BOPハッカソン](http://seed-hackathon.weebly.com/)
- 3月4日 アイディアソン
- 3月18日-19日 ハッカソン

### [ゲノムアプリに特化したハッカソン&アイデアソン「G-CONTAMINATION」 #0](http://peatix.com/event/236603)
- 3月7日

### [はじめてのハッカソンVol.22](https://hackathon.connpass.com/event/49447/)
- 3月11日

### [スポーツをもっと楽しむためのアイデアソン](http://peatix.com/event/242075?lang=ja)
- 3月11日

### [トーハク×アイデアソン　訪日外国人の記憶に残る日本文化体験－ICTは博物館で何ができるか？－](http://www.tnm.jp/modules/r_event/index.php?controller=dtl&cid=5&id=8897)
- 3月11日-12日

### [女の子のためのヘルスケア講座_Healthcare Hackathon for Women#1](http://peatix.com/event/239910)
- 3月12日

### [PyCon JP hack-a-thon #9 2017.03](https://pyconjp-staff.connpass.com/event/51515/)
- 3月18日

### [AIRVOLUTION 2017](http://airvolution.airasia.com/)
- 3月18日-19日

### [クーリエ・ジャポン・ハッカソン Powered by 転職ドラフト](http://courrierjapon024.peatix.com/)
- 3月18日-19日

### [Web × IoT メイカーズハッカソン 【チームでの申込】](https://connpass.com/event/48422/)
- 3月18日-19日

### [豊橋でVRハッカソン](https://connpass.com/event/52118/)
- 3月19日

### [3/19（日）10:00～　名古屋でVRハッカソン](https://nagogebu.connpass.com/event/51978/)
- 3月19日

### [人工知能ハッカソン in ジャストシステム「今回のテーマ：kerasかxgboost」](https://aichatbot.connpass.com/event/52783/)
- 3月25日

### [第1回 UnlimitedHandハッカソン@秋葉原](https://unlimitedhand.connpass.com/event/53273/)
- 3月25日

### [コネクテッド・カーの未来を考えるアイデアソン](https://eventdots.jp/event/616338)
- 3月27日

# 4月

### [【千葉開発合宿】デザイナーも参加できる開発合宿〜はじめてのハッカソンVol.23](https://hackathon.connpass.com/event/51764/)
- 4月8日

### [Tokyo HoloLens ハッカソン Vol.1](https://hololens.connpass.com/event/52566/)
- 4月8日-9日

### [Cogbot Hackathon #1](https://cogbot.connpass.com/event/53016/)
- 4月8日-9日

### [テーマ「機械学習xサウンド」「第16回エフェクターミニハッカソン」](https://effectorhack.connpass.com/event/53425/)
- 4月15日

### [【クラッピーチャレンジ】クラッパソン2017](https://100kuma.connpass.com/event/52977/)
- 4月15日

### [SPAJAM 2017: 大阪予選](https://spajam.jp/entry/osaka/)
- 4月22日-23日

### [Akatsuki VR Sound Jam](https://akatsuki.doorkeeper.jp/events/58630)
- 4月22日-23日

### [SAMURAI ISLAND EXPO'17 地震対策Hackathon TECHNOLOGY → PEACE](http://samurai-island-expo-hack.strikingly.com/)
- 4月22日-23日

### [Junction Tokyo](http://tokyo.hackjunction.com/)
- 4月28日-30日

### [NASA Space Apps Challenge 2017 in Ube](https://connpass.com/event/53082/)
- 4月29日-30日

### [PyCon JP hack-a-thon #10 2017.04](https://pyconjp-staff.connpass.com/event/55094/)
- 4月30日
PowerShell でインストール済みの ODBC / OLE DB Deiversを取得

# OLE DB
```
(New-Object System.Data.OleDb.OleDbEnumerator).GetElements()
```

# ODBC Driver
```
Get-OdbcDriver
```

# Script
```CheckDrivers.ps1
# output location
$scriptPath = Split-Path $MyInvocation.MyCommand.Path

# OLE DB
(New-Object System.Data.OleDb.OleDbEnumerator).GetElements() | Export-Csv -Path (Join-Path $scriptPath "OLE-DBs.csv")

# ODBC Driver
Get-OdbcDriver | Export-Clixml (Join-Path $scriptPath "ODBC-Drivers.xml")

# for check results
#Read-Host -Prompt "Hit enter key for 'owari'!"

```
Slimで動的なClass名やData属性、インラインCSSなどの書き方

Slimでrubyコードなどで動的なクラス名を書くときなどの書き方メモです。

## Slimでidやclassを動的に書く
.classnameなどのSlim独自の記法ではなく、 erbに近い書き方で div class="classname"と抜きだす。

```slim:slim
/ 動的なクラス名のみの場合
div class=user.name

/ 静的 + 動的なクラス名の組み合わせ
div class="user-thumb user-small user-#{user.name}"
```

```html:出力html
<!- 動的なクラス名のみの場合 ->
<div class="taro"></div>

<!- 静的 + 動的なクラス名の組み合わせ ->
<div class="user-thumb user-small user-taro"></div>
```


## Slimで ifでクラス名を条件分岐させる
上と同じく div class="classname" で記述。
下記のどの書き方でも通るので、可読性のよいものを選ぶ。
 #{} は入れ子にしてもOK。
もし中身がfalseだったら、コンパイルされる際にちゃんとclass=という表記が消えるのだ

```slim:slim
/ 動的なクラス名のみの場合
div class=user.name if user.present?
div class="team-#{user.name}" if user.present?

/ 静的なクラス名 + 動的なクラス名
div class="team-wrap #{user.name if user.present?}"
div class="team-wrap #{'team-#{user.name}' if user.present?}"

```

```html:出力html
<!- 動的なクラス名のみの場合 ->
<div class="yoshio"></div>
<div class="team-yoshio"></div>

<!- 静的なクラス名 + 動的なクラス名 ->
<div class="team-wrap yoshio"></div>
<div class="team-wrap team-yoshio"></div>

<!- もし user.name がfalseだったら ->
<div></div>
```

## クラス名を複数条件で分岐させたい場合
三項演算子で、複数の条件分岐を記述する。
属性内が複雑だと可読性が微妙になるので、下記Slimの一番下の行(書き方その2)のように、静的なものは .classname で、動的なものは class="classname" と抜き出して書く、というルール付けをしてしまってもいいかもしれない。

```slim:slim
/静的なクラス名
div class=(user.present? ? "team-wrap" : "no-user")

/静的なクラス名 + 動的なクラス名
div class="team-wrap #{user.present? ? 'team-#{user.name}' : 'no-user'}"

/静的なクラス名 + 動的なクラス名 書き方その2
div.team-wrap class=(user.present? ? 'team-#{user.name}' : 'no-user')
```

```html:出力html
<!- 静的なクラス名 ->
<div class="team-wrap"></div>

<!- 静的なクラス名 + 動的なクラス名 ->
<div class="team-wrap team-yoshinoya"></div>
```

## 値がない属性を書きたい場合
リッチスニペット用のitemscopeやjs用のdata属性など、
属性名のみ書きたい場合は、属性に空の値を渡してやればOK

```slim:slim
.user-wrap itemscope=""
```

```html:出力html
<div class="user-wrap" itemscope></div>
```

## 属性がたくさんある場合に見やすくする
大かっこをつければ改行してもOKなので、属性がたくさんある場合は
可読性を高めるためにツラを揃えてもよいかも。

```slim:slim
/揃える前
.user-bases data-type='author' data-id="#{user.id}" data-js-action="user.bases.show" itemscope="" itemtype="http://schema.org/Author"
  | YOSHIO
  ...

↓↓

/後
.user-bases[data-type='author'
    data-id="#{user.id}"
    data-tabelog-js-action="user.bases.show"
    itemscope=""
    itemtype="http://schema.org/Author"]
  | YOSHIO
  ...

```

## Styleをインラインで記述したい場合

```slim:slim
.user-wrap(style="float: right; padding-right: 20px; font-size: 70%;")
```

## コロンで区切ってhtmlの入れ子をワンライナーで表現

できるけど、可読性が悪いしそんなに使わないほうがよいと思う。

```slim:slim
.user-wrap: .user-inner: p.user-param xxxxx
```

```html:出力html
<div class="user-wrap">
  <div class="user-inner">
    <p class="user-param">
      xxxxx
    </p>
  </div>
</div>
```
ターミナルからxcode-selectで設定したデベロッパディレクトリのXcodeでプロジェクトファイルを開く

端末に1台だけXcodeがインストールされてる場合は`open foo.xcodeproj`または`open foo.xcworkspace`でXcodeをターミナルから開くことが出来ます。

複数のXcodeをインストールしている場合、通常は`/Applications/Xcode.app`が使われるかと思います。
しかし何かの事情で別のXcodeで開きたい場合`open -a Xcode8.2.1.app foo.xcodeproj`のような形でアプリ名を指定する必要があります。
このパラメタを与えるのもめんどくさいので`xcode-select -s /path/to/Xcode.app`のように`xcode-select`で設定したXcodeでプロジェクトを開くためaliasを作ってみました。

```
alias xcode='xcode-select -p | cut -d '/' -f3 | xargs -I{} open -a {} $1'
※ Xcodeは/Applications/直下にあるという前提の手抜きをしています。
```
例

```
xcode foo.xcodeproj
```

どうですかね？
C++ Builder / memory leak > TStringListの扱いを変更して対処 > リーク無しになった

```txt:動作環境
C++ Builder XE4
FastMM
```

メモリーリーク対策中。

### 症状

以下のような外部ファイルを実装していた。

- コンストラクタ
  - TStringList変数を確保
- SetDataStr()
  - 未初期化時にはTStringList変数 = new()
  - 引数の文字列をDelimitedTextでTStringListに格納
- GetDataStr()
  - TStringListに格納した項目をインデックス指定で取得
- デストラクタ
  - TStringList変数を解放

上記の処理を実行していて、確認したところ、一度だけnew()をしていた。
ところが、FastMM自体では30回近くDelimitedTextでメモリリークが発生しているとなった。

### 対策

以下とした。

- TStringList型でなく、String型のprivate変数を用意
- コンストラクタ
   - 何もしない
- SetDataStr()
   - private変数に格納
- GetDataStr()
   - std::unique_ptr<>にてTStringList変数を宣言、初期化
   - private変数のString文字列をTStringList変数にDelimitedText指定で渡す
   - 指定のインデックスの項目をreturn
- デストラクタ
   - private変数にL""を格納 (不要かもしれない)

上記のファイルに関するメモリリークはなくなった。

FastMMが誤って報告している可能性はある。
GetDataStr()のたびにTStringListを作るのは効率は悪いかもしれない。

### 結果

こちらの修正をして、かつ[FastMMによるメモリリーク](http://qiita.com/7of9/items/73fe5f834d1063d8e53e)を避けるためFastMMをはずしてビルドしなおした。

修正前は30分で2MBのリークがあったが、修正後は30分で0MBのリークになった。
テストダブルの種類

[スタブとモックの違い](http://qiita.com/k5trismegistus/items/10ce381d29ab62ca0ea6)というのを書いたのですが、書いているとき「テストダブル」という用語についてよく知らないまま書いていました。それをコメントで指摘され、改めて調べてみました。

## 5種類のテストダブル

### テストスタブ

実際の依存コンポーネントにかわりテスト対象に間接入力を行うもの。そのテスト内では間接入力の値を確定できる。

RSpecでいう
`allow(hoge).to revceive(:fuga).and_return('foo')`

### テストスパイ

テスト対象が他のコンポーネントに間接出力を行う場合、実際のコンポーネントの代わりにメッセージを受け取り記録するもの。モックとの違いは事前に期待する値を知っていて、一致しているかどうか検証を行うかどうか。

RSpecでいうと
`expect(hoge).to have_received(:fuga)`

### モックオブジェクト

テスト対象が他のコンポーネントに間接出力を行う場合、実際のコンポーネントの代わりにメッセージを受け取り事前に教えられている期待したメッセージと一致しているかどうか検証するもの。

RSpecでいう
`expect(hoge).to receive(:fuga)`

### フェイクオブジェクト

実際の依存コンポーネントと同じAPIを持っており、似たような挙動をするもの。ローカルでAmazon S3やSQSと同じAPIを提供しテストを行いやすくするライブラリなどがあたるかと。

### ダミーオブジェクト

厳密にはテストダブルには含まれないそうですが。
メソッド呼び出しを検証する際、検証しなくても良い引数に入れる適当なオブジェクト。RSpecで `anything` に対応するものであるかと。


## 用語

一般的に使われる訳語があるかもしれませんが、ここでは個人的にわかりやすいと思うように訳しました。

- テスト対象([system under test](http://xunitpatterns.com/SUT.html)):
テストの対象になる物。単体テストであればクラス・オブジェクトであり、結合テストであればアプリケーションそれ自体になる。

- 依存コンポーネント([depend on component](http://xunitpatterns.com/DOC.html))
テスト対象が依存しているコンポーネント。

- 間接入力([indirect input](http://xunitpatterns.com/indirect%20input.html)): 
テスト対象の振る舞いが依存する他のコンポーネントからの返り値に依存する場合、その返り値を間接入力という。

- 間接出力
パブリックなAPIからは見えないテスト対象の振る舞いによって、他のコンポーネントに送られるメッセージ。入力を受取り出力を返すメソッドが、内部でログを書き出している場合など。
phoenixのアプリケーションでSO_REUSEPORTを使えるか調べた

docker containerを使ったAPI系のサーバのdeployをする際にSO_REUSEPORTが使えるか調べた。

### 結論

しんどそう。（できないとは言ってない)

+ http(s)に限って言えばできないことはなさそう
+ そもそもcontainerの話なんだけど、epmdとかそういうのケアしなくっていいんだっけ問題もありそう。
  + https://github.com/Random-Liu/Erlang-In-Docker

### メモ

+ phoenixが使っているHTTP serverはcowboy
+ sslはrevese proxyに任せるとして80番のsocket listenerはranch
+ `:ranch.connect`は`:gen_tcp.connect`なのでgen_tcpのoptionsみる
  + http://erlang.org/doc/man/gen_tcp.html#type-option
+ reuseportはなさそうだけどrawってのがある
  + https://github.com/erlang/otp/blob/master/lib/kernel/src/gen_tcp.erl#L85-L89
  + `{:raw, 1, 15, <<1, 0, 0, 0>>}`とかつけたらいい？
+ どこに渡せばいいか
  + https://github.com/phoenixframework/phoenix/blob/v1.2/lib/phoenix/endpoint/server.ex#L17
  + https://github.com/phoenixframework/phoenix/blob/master/lib/phoenix/endpoint/cowboy_handler.ex#L81
  + https://github.com/elixir-lang/plug/blob/master/lib/plug/adapters/cowboy.ex#L136-L143
  + https://github.com/ninenines/ranch/blob/master/src/ranch.erl#L104-L109
  + https://github.com/ninenines/ranch/blob/master/src/ranch_listener_sup.erl#L30-L42
    + ranch_conns_sup　と ranch_acceptors_supをsupervise
    + この時点でTransOptsがranch_acceptors_supに渡るのみ
  + https://github.com/ninenines/ranch/blob/master/src/ranch_acceptors_sup.erl#L35
    + ついにlisten!!!
  + https://github.com/ninenines/ranch/blob/master/src/ranch_tcp.erl#L86-L87
  + というわけで、configのMyApp.Endpointに書いておけばうけとってもらえそう?

```
config :my_app, MyApp.Endpoint, [
  http: [
    {:port, 4000},
    {:raw, 1, 15, <<1, 0, 0, 0>>}
  ]
]
```

+ Keyword.deleteが呼ばれたタイミングで無事死亡
+ とりあえず動作確認だけしたかったので、ranch_tcpにダイレクトに渡してみる
  + https://github.com/ninenines/ranch/blob/master/src/ranch_tcp.erl#L87
  + 実はmacで実験してるので`{:raw, 16#ffff, 16#0200, <<1, 0, 0, 0>>`で試してる...

```
--- [binary, {active, false}, {packet, raw}, {reuseaddr, true}])).
+++ [binary, {active, false}, {packet, raw}, {reuseaddr, true}, {:raw, 1, 15, <<1, 0, 0, 0>>}])).
```

+ これで同じportを使ってphoenixを多重起動しても`eaddrinuse`で怒られることはなかった。
DataDog Anomaly Detection が素晴らしい

## はじめに
DataDogが2016年10月に[Anomaly Detection](https://www.datadoghq.com/blog/introducing-anomaly-detection-datadog/ "Anomaly Detection")をリリースしたようなので基本的な動作を確認してみました。[日本語による解説](http://docs.datadoghq.com/ja/guides/anomalies/)がありますので詳しい内容はこちらをご覧ください

##事前準備
DataDogの初期セットアップは既に開通済みで、Monitorがいつでも新規追加の状態とします

##シナリオ
監視対象ノードに対し(DataDog Agent　からデータが取り込まれている)正常状態とは明らかに異なる「なんらか状態」を起こします。今回はAzure VMを使い、通常の数倍のトラフィックを発生させ、system.net.bytes_rcvd　※1を監視対象データとします

 ``` 
 ___________________                   ___________________________
|                   |                 |                           |
| Traffic Generator | === 打ち込み == > | Target with DataDog Agent |
|___________________|                 |___________________________|
                                                    |
                                                 [push]
                                                    |
                                     // DataDog (Anomaly Detection) //
                                                    |
                                                 [notify]
                                                    |
                                    // PagerDuty (Integration slack) //
                                                    |
                                               [escalation]
                                                    |
                                               // Slack //

```
##設定
- 設定例
 1.　Define the metric : GET system.net.bytes_rcvdを選択
 2.　Set alert condtions : algorithm Basicを選択
 3.　Say what's happening : Subject, Message 等を埋めます
 4.　Notify your team : @pagerduty を使い、slackへnotifyを送ります
　　　　![DataDog_Anomaly_Set.png](https://qiita-image-store.s3.amazonaws.com/0/149993/6b4065d8-2452-402f-35ce-548b3596866e.png)

- 設定完了
![DataDog_Anomaly_Setup.png](https://qiita-image-store.s3.amazonaws.com/0/149993/2caa66d5-4e10-82ad-90a7-83f52da20db9.png)

##試射
### [諸注意]
 1.　トラフィック発生の際は周りに迷惑を掛けない様、自己責任でお願いします！
 3.　トラフィック発生は　20% -- 45% -- 65% のように慎重に増やすことがオススメ
 4.　Set alert condtionsでThreasholdを決めれるので、通常の30%増し程度で十分
　
###確認する
 - datadog
   - 平坦なところに突如山が
![DataDog_AnomaryDetection.png](https://qiita-image-store.s3.amazonaws.com/0/149993/d8704c97-95a1-31e4-4c03-3dd80de66b90.png)

 - Slackにも通知を確認
![PagerDuty_DDoS_Slack 2.png](https://qiita-image-store.s3.amazonaws.com/0/149993/f90032f5-edf7-f2da-d7fc-338f0f77fbb7.png)

## まとめ
- 検証期間が短く、短期的に動作確認を行いたい事もあったので、Algorithmは「Basic」を使いました
- 「Basic」は過去のデータを基に、「単純な時間差の移動分位数計算」を元に振る舞いを検知するようで、想定通りに動作を確認できました
- 意図的に発生させた「異常状態」に対して、検知、収束共に素晴らしい反応速度※2でした
- 季節性の変動、長期的な影響を考慮したい場合は「Agile」を使うようです。今回は試していません
- 「Robust」はさらにきめ細かいデータへの適応も可能な様なので、こちらも検証したらどなたか共有をお待ちしてます

※1 ... TCP/80 へのトラフィック流入検知とした為
※2 ... 比較対象はArbor　/ DD -> PG -> Slack連携のレスポンスという点でも(個人的な体感速度です)
[MySQL] spl_mode について調べた結果

# sql_mode

MySQLの挙動を制御する設定。

5.7にバージョンアップして色々ハマったので、
一度整理するために記事を書く。

調べたのは、デフォルトの設定たち。

## ONLY_FULL_GROUP_BY
GROUP BYした場合の挙動を制御

- 設定が有効
    - GROUP BYした場合SELECTする項目は全てGROUP BY句で指定しないとエラーになる（SQL標準）
- 設定が無効
    - GROUP BY句で指定していない項目もSELECT可能（MySQL独自拡張）

## NO_ZERO_DATE
`0000-00-00` の挙動の制御

- 設定が有効
    - `0000-00-00` の挿入でエラーになる
- 設定が無効
    - 挿入可能

## STRICT_TRANS_TABLES
通称：厳密モード
テーブル定義に反するINSERTやUPDATEを禁止し、エラーを発生させる

- 設定が有効
    - varchar(5) のカラムに `123456` をINSERTしようとするとエラーになる
- 設定が無効
    - varchar(5) のカラムに `123456` をINSERTしようとすると `12345` と切り詰めてINSERTされる

## NO_ZERO_IN_DATE
`2010-00-01` `2010-01-00` のように月や日に0が入っている値を挿入する場合

- 設定が有効 かつ 「STRICT_TRANS_TABLES」が有効
    - エラーになる
- 設定が有効 かつ 「STRICT_TRANS_TABLES」が無効
    - `0000-00-00` が挿入され警告が出力される
- 設定が無効
    - 挿入可能

## ERROR_FOR_DIVISION_BY_ZERO
0除算を含むINSERTやUPDATEが会った場合の挙動を制御

- 設定が有効 かつ 「STRICT_TRANS_TABLES」が有効
    - エラーになる
- 設定が有効 かつ 「STRICT_TRANS_TABLES」が無効
    - NULL が挿入され警告が出力される
- 設定が無効
    - NULL が挿入され警告無し

## NO_AUTO_CREATE_USER
存在しないユーザーにGRANT文を発行した場合の挙動を制御

- 設定が有効
    - エラーが発生する
- 設定が無効
    - 自動的に新規ユーザーを作成しGRANT文が発行される

## NO_ENGINE_SUBSTITUTION
ストレージエンジンの選択に影響

- 設定が有効
    - 使用できないストレージエンジンを選択してCREATE TABLE等でを行うとエラー
- 設定が無効
    - デフォルトのストレージエンジンで実行される
Windows 10 / .NET Framework / Visual Studio

|Windows 10||.NET Framework||Visual Studio||
|:--|:--|:--|:--|:--|:--|
|||4.6|2015/07/20|2015 RTM|2015/07/20|
|RTM|2015/07/29|||||
|November update(1511)|2015/11/12|||||
|||4.6.1|2015/11/30|2015 Update 1|2015/11/30|
|||||2015 Update 2|2016/03/30|
|||||2015 Update 3|2016/06/27|
|Anniversary Update(1607)|2016/08/02|4.6.2|2016/08/02|||
|||||2017 RTM|2017/03/07|
|Creators Update(1703)|2017/04/05|4.7|2017/04/05|2017 15.1|2017/04/05|
Zenbook3 で Ubuntu の音量調整ができない問題を解決する方法

# 結論
```
sudo nano /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common
```
でファイル内容を以下のように変更する。

before

```
[Element PCM]
switch = mute
volume = merge
override-map.1 = all
override-map.2 = all-left,all-right
```

after

```
[Element Master]
switch = mute
volume = ignore


[Element PCM]
switch = mute
volume = merge
override-map.1 = all
override-map.2 = all-left,all-right


[Element LFE]
switch = mute
volume = ignore
```



# 参考URL
https://ubuntuforums.org/showthread.php?t=2340639&page=2&p=13581528#post13581528
ちょっと開発中のWebアプリを見てもらおう、って時にやること

トライアルアップする前に、ちょっと同僚にWebアプリを見てもらいたい・・・
タブレット端末(実機)で動作確認したい・・・

昔ながらの、リバースプロキシ。

# バージョン
```
$ docker -v
Docker version 1.8.3, ・・・
```
```
$ apachectl -v
Server version: Apache/2.4.18 (Unix)
```

# 1. Dockerでnginxを起動する
参考：https://hub.docker.com/_/nginx/

```
$ mkdir -p　~/some/content
$ vi ~/some/content/test.html
test!!!
```

```
$ docker run --name some-nginx -v ~/some/content:/usr/share/nginx/html:ro -d -p 8080:80 nginx
```

# 2. ブラウザから確認
```
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp://192.168.99.100:2376 
```
→`http://192.168.99.100:8080/test.html`

# 3. LAN側のIPアドレスを確認

```
$ ifconfig en0
en0: flags=XXXX<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether ・・・・
	inet6 ・・・・
	inet 192.168.1.10 netmask ・・・・
	nd6 ・・・・
```
→`192.168.1.10`

# 4. apache2の設定
参考：http://qiita.com/gingi99/items/83c1fb07644cd232d91e

httpd.confに、リバースプロキシの設定を追加

```
$ sudo vi /etc/apache2/httpd.conf
LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so

ProxyRequests Off
ServerName 192.168.1.10
ProxyPass / http://192.168.99.100:8080/
ProxyPassReverse / http://192.168.99.100:8080/
```

```
$ sudo apachectl restart
```

# 5. タブレット端末から確認
タブレット端末を同一LANに接続

```
http://192.168.1.10/test.html
```
git コマンド覚書

Gitを効率的に活用するためのよく使うコマンドを網羅しています。基本的な使い方から、プロジェクトを管理するために役立つコマンドまで、具体的な例を交えて紹介します。

## 1. Gitの基礎操作
### 1.1 リポジトリの複製

`git clone`
- リモートリポジトリをローカルに複製するコマンドです。

```bash
git clone https://github.com/username/repo.git
```
使用例: 初めてチームのプロジェクトに参加する際に使用します。

## 2. コミットの管理
### 2.1 コミットの修正
`git commit --amend`
- 直前のコミットメッセージを修正するか、ステージングされた変更を追加できます。

```bash
git commit --amend -m "新しいコミットメッセージ"
```
使用例: コミット後にミスに気づいたときに、メッセージを修正する場合に使います。

### 2.2 コミット履歴の確認
`git log`
- コミット履歴を確認します。オプションで出力をカスタマイズできます。

```bash
git log --oneline --graph
```
使用例: 作業の進捗を確認したり、特定のコミットに戻りたいときに履歴を把握します。

## 3. ファイルの管理

### 3.1 ファイルの削除

`git rm <file>`
- Gitの管理下からファイルを削除し、ステージングに追加します。

```bash
git rm filename.txt
```
使用例: 不要になったファイルをリポジトリから削除したい場合に使用します。

## 4. マージとリベース
### 4.1 ブランチのマージ
`git merge <branch>`
- 現在のブランチに、他のブランチの変更をマージします。

```bash
git merge feature-branch
```
使用例: 開発が終わったブランチをメインブランチに統合する際に使います。

### 4.2 リベース
`git rebase <branch>`
- 他のブランチの履歴を取り込みながら、自分のブランチのコミット履歴を再構築します。

```bash
git rebase main
```
使用例: チームの最新の変更に自分のブランチを適応させるために使用します。

## 5. スタッシュの管理

### 5.1 現在の変更をスタッシュに保存する

```bash
git stash
```
- 変更内容を一時的に保存し、ワークツリーをクリーンな状態にします。作業を中断したいときに便利です

### 5.2 スタッシュリストを確認する

```bash
git stash list
```
- 保存されたスタッシュの一覧を確認します。stash@{n} の形式で表示され、番号を参照できます

### 5.3 最新のスタッシュを適用する

```bash
git stash apply
```
- 最新のスタッシュを現在のワークツリーに適用します（スタッシュ自体は削除されません）

### 5.4 特定のスタッシュを適用する

```bash
git stash apply stash@{n}
```
- stash@{n} の番号を指定して、特定のスタッシュを適用します

### 5.5 最新のスタッシュを適用して削除する

```bash
git stash pop
```
- 最新のスタッシュを適用し、スタッシュから削除します。

## 6. リモート操作
### 6.1 リモートの一覧表示
`git remote -v`
- リモートリポジトリの一覧を表示します。

```bash
git remote -v
```
使用例: リモートリポジトリがどのURLに接続されているか確認するために使用します。

## 7. リセットとリバート
### 7.1 コミットを取り消す（リバート）
`git revert <commit>`
- 特定のコミットを取り消す新しいコミットを作成します。

```bash
git revert HEAD
```
使用例: チームメンバーが既にプッシュしたコミットを取り消したい場合に使います。

### 7.2 コミットのリセット
`git reset --hard <commit>`
- 指定したコミットまで戻し、履歴も変更します。

```bash
git reset --hard HEAD~1
```
使用例: ローカルでの変更をすべて破棄し、直前のコミットまで戻したいときに使用します。

## 8. タグ付け
### 8.1 タグの作成
`git tag <tag-name>`
- 特定のバージョンにタグを付けます。

```bash
git tag v1.0.0
```
使用例: 重要なリリースやバージョンアップのタイミングでタグを付けて記録しておきます。

### 8.2 リモートへのタグのプッシュ
`git push origin <tag-name>`
- リモートリポジトリにタグをプッシュします。

```bash
git push origin v1.0.0
```
使用例: リリースタグをチームメンバーと共有したい場合に使用します。

## 9. その他の便利コマンド
### 9.1 短縮ステータス表示
`git status -s`
- ステータスを短縮表示します。

```bash
git status -s
```
使用例: ファイルの変更状況を簡潔に確認したいときに使います。

### 9.2 グローバル設定の変更
`git config --global user.name "Your Name"`
- Git全体のユーザー名やメールアドレスを設定します。

```bash
git config --global user.email "your.email@example.com"
```
使用例: 初回セットアップ時や、ユーザー情報を変更する必要があるときに使用します。

## 10. よくあるエラーと対策
### 10.1 detached HEAD状態の解決
- エラー内容: ブランチに属さないコミット状態です。 
  - 解決策: `git checkout -b new-branch` でブランチに戻すと修正できます。

### 10.2 プッシュの失敗
- エラー内容: リモートリポジトリに更新できない場合。 
  - 解決策: `git pull --rebase`でリモートの変更を取り込み、再度プッシュします。

---

## まとめ

ここで紹介したコマンドを使いこなすことで、効率的なGit操作ができるようになります。さらに理解を深めたい場合、[Gitの公式ドキュメント](https://git-scm.com/doc)や、[Qiitaの他のGit投稿](https://qiita.com/tags/git)も参考にしてください。
Python3とSQLAlchemyでVPSのMySQLからデータを取得する

ための方法です．結論だけ書くと，

```Python
from sshtunnel import SSHTunnelForwarder
```

でなんとでもなります．が，毎回忘れるので．

## 設定例

```Python
import os
from sshtunnel import SSHTunnelForwarder
from sqlalchemy import create_engine
import pandas as pd

URL = "{connector}://{user}:{password}@{host}:{port}/{db}?charset=utf8".format(
    connector='mysql+mysqlconnector',
    user='VPSのMysqlのユーザー名',
    password='VPSのMySQLのパスワード',
    host='localhost',
    port='3307',
    db='使いたいDB名')

SSH_INFO = {
    'ssh_host': 'hoge.sakura.ne.jp',  # IP直打ちでもOK
    'ssh_port': 22,  # 普段SSH接続時に使うポート
    'ssh_username': 'SSHのユーザー名',
    'ssh_pkey': os.path.expanduser('~/.ssh/id_rsa'),  # 秘密鍵へのパス
    'remote_bind_port': 3306,  # remoteの3306を
    'local_bind_port': 3307,  # localの3307番ポートへ
}

engine = create_engine(URL)


def with_ssh(func):
    def ssh_func(*args, **kwargs):
        with SSHTunnelForwarder(
            (SSH_INFO['ssh_host'], SSH_INFO['ssh_port']),
            ssh_username=SSH_INFO['ssh_username'],
            ssh_pkey=SSH_INFO['ssh_pkey'],
            remote_bind_address=('localhost', SSH_INFO['remote_bind_port']),
            local_bind_address=('localhost', SSH_INFO['local_bind_port']),
        ):
            return func(*args, **kwargs)
    return ssh_func


@with_ssh
def read_remote_sql(query):
    df = pd.read_sql(query, engine)
    return df


read_remote_sql('select * from {}'.format('t_piyo'))
```

* URLは，リモートのMySQLがローカルの3307番ポートに接続された前提で書いていきます．なのでhostは'localhost'だし，portは3307です．
* SSH_INFOはssh接続するときの情報です．初期設定のMySQLは3306番で起動しているはずなので，これをローカルの3307番に持ってきています．
xdebugが動かない。MAMPにphp.iniが２箇所？

少しハマったので、同じ問題に会った人に参考になれば。

MACのPHP開発を作って、Xdebugを有効化にするが、

/Applications/MAMP/conf/phpx.x.x/php.ini に設定したが、phpinfoにxdebugが出てこない！？

[xdebug]
zend_extension="/Applications/MAMP/bin/php/phpx.x.x/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so"
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.idekey=netbeans-xdebug
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/Applications/MAMP/tmp"

解決はこれ。
なんと、php.ini２箇所あった。

/Applications/MAMP/bin/php/phpx.x.x/conf/php.ini

ここも同じようにxdebugの設定を追加すると、うまく行った。
レイヤ2 データリンク層 アーキテクチャ

# レイヤ2：データリンク層の技術規格（アーキテクチャ）のメモ
各アーキテクチャで作成するフレームは違う
例：Ethernetの場合はEthernet規格のヘッダとトレーラをパケットに付与してフレームにする。

## Ethernet
トポロジ：　スター型
アクセス制御: CSMA/CD
##### ポイント
- 衝突が発生する
- 安価で早い
- 主流
- リスト

## IEEE802.5
トポロジ：　リング型
アクセス制御：　トークンパッシング
##### ポイント
- 衝突が発生しない
- 確実に届ける
- 相手が受信したかどうか確実にわかる
- 監視役がいないと危険
- 低速

## FDDI
トポロジ：　デュアルリング型
アクセス制御：　トークンパッシング
##### ポイント
- 衝突が発生しない
- 確実に届く
- 相手が受信したかどうか確実にわかる
- 銀行などでも使われるほどの高い信頼性
- 高速
- とても高価
Docker/Docker Compose自身のバージョン更新

# 前提
yumでdockerをinstall済み

# Docker
1. yum更新対象が存在することを確認
`yum info docker-engine`

2. 更新
`yum upgrade docker-engine`

3. 更新されたバージョンを確認
`docker -v`

# Docker Compose
1. 更新
` curl -L "https://github.com/docker/compose/releases/download/1.11.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose`

2. 更新されたバージョンを確認
`docker-compose -v`

# 参考
docker : https://docs.docker.com/cs-engine/1.13/upgrade/
docker-compose : https://docs.docker.com/compose/install/
Docker for Mac のファイル共有でconsistencyを指定してアクセスを速くする(CE-17.04.0)

Docker for MacのEdgeチャンネルにCE-17.04.0が来たので、新機能のconsistencyを指定することでファイル共有が速くなるか確認してみました。

以前に書いた[Docker for Macのファイル共有が遅いので計測してみる](http://qiita.com/kai-zoa/items/d2d2f0cb5ff1b51e65c7)のベンチマークのコードを引っ張り出して、新しいマウントフラグ `consistent`, `cached`, `delegated` をそれぞれ試してみます。
https://github.com/WHITEPLUS/advent-calendar2016-docker-volume-bench

```bash
#! /bin/bash -Ceu

[ ! -f ./gophercolor.png ] && \
curl -O https://golang.org/doc/gopher/gophercolor.png

echo \#consistent
docker run -v `pwd`:/go/src/bench-fio:consistent `docker build --no-cache -q .`
echo \#cached
docker run -v `pwd`:/go/src/bench-fio:cached `docker build --no-cache -q .`
echo \#delegated
docker run -v `pwd`:/go/src/bench-fio:delegated `docker build --no-cache -q .`

#----------- 出力 ----------
#consistent
testing: warning: no tests to run
BenchmarkReadVolumeFile_Buf128-2          500    2765689 ns/op
BenchmarkReadVolumeFile_Buf1024-2         500    2173428 ns/op
PASS
ok   bench-fio 3.013s
#cached
testing: warning: no tests to run
BenchmarkReadVolumeFile_Buf128-2         1000    1254827 ns/op
BenchmarkReadVolumeFile_Buf1024-2        2000     755789 ns/op
PASS
ok   bench-fio 3.032s
#delegated
testing: warning: no tests to run
BenchmarkReadVolumeFile_Buf128-2         1000    1244565 ns/op
BenchmarkReadVolumeFile_Buf1024-2        2000     654835 ns/op
PASS
ok   bench-fio 2.799s
```

`cached`, `delegated` は、少なくとも（バッファ少なめな非効率な読み出しでも）__2倍以上速い！__これで体感は結構速くなるんじゃないでしょうか。

実際にどのフラグを使うかは[こちら](https://gist.github.com/yallop/d4af9dd1bb33ae61d48adf86692cdf9e)などを参考にして、リネットの開発環境でも試していこうと思います。
さくらのレンタルサーバで、他社取得の独自ドメインの任意ホスト名を設定する

# はじめに

別会社で取得したドメインの独自ホスト（例：original.example.com）を、さくらのレンタルサーバの設定です。コントロールパネルの説明をサブドメイン＝ホスト名と解釈すればよかったのですが、迷ってしまったので備忘録としてメモします。

* さくらのレンタルサーバの環境
FreeBSD 9.1-RELEASE-p24 / Apache/2.2.31 / PHP-7.1.1 / MySQL-5.5
（関係ないけど）

# コントロールパネルでの設定

## ホストの設定

* [さくらコントロールパネル](https://secure.sakura.ad.jp/rscontrol/)にログイン
* 左タブのドメイン設定にある「ドメイン設定」をクリック
* 「新しいドメインの追加」をクリック
* 5. 他社で取得したドメインを移管せずに使うの「>> ドメインの追加へ進む」をクリック
* 他社で取得された独自ドメインのサブドメインを追加で下のように入力し「送信する」をクリック

```
ドメイン名：     originarl    .     example.com
```

以上で、originarl.example.com が登録されますが、反映されるまでにはしばらく時間がかかります。見たところ、TTLは１時間なのでまともなDNSなら１時間以内に反映されるでしょう。

## ウェブページの設定

* [さくらコントロールパネル](https://secure.sakura.ad.jp/rscontrol/)の「ドメイン設定」をクリック
* 登録したホストが、ドメイン名欄に表示されるんもで、変更をクリック。
* 利用方法に応じて設定。今回は以下のように選択し送信をクリック
  *  1. 設定をお選びください  ⇒　wwwを付与せずマルチドメインとして使用する（上級者向け）
  *  2. マルチドメインの対象のフォルダをご指定ください　⇒　/original
  *  ほかはデフォルトのまま  

## ウェブコンテンツの配置

* さくらのレンタルサーバの ~/www/original/ 以下に SCP などでコピー

# 動作確認

しばらく待った後、ブラウザなどで http://original.example.com/ にアクセス。
場合によっては、キャッシュの影響を抑えるため、強制リロード（Shift-F5等）する。

## 留意事項

http://[yourUserName].sakura.ne.jp/original などでもアクセス可能です。
~~問題ならば、.htaccess などで制限、、、できるはず（未確認）~~ 

（頂いたコメントを参考に追記）
必要ならば、.htaccess で以下のようにすると、original.example.com 以外のアクセスを制限できます。

```
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} !original\.example\.com$  [NC]
  RewriteRule .* - [F]
</IfModule>
```
シェルスクリプトを用いたファイル出力

よくある運用を想定した題材を通して、自動実行やシェルスクリプトを活用した運用の雰囲気やコマンドを駆使することで、出来ることの可能性について掴む。
コマンドを色々と覚えることで開発や運用の幅は格段に広がりそう。

### RFP
毎月1日に日本郵便株式会社から自動で最新の郵便番号情報ファイル(沖縄県のみ)を取得して、
以下のフォーマットに加工してUTF-8でファイル出力せよ。
※課題なので月次ではなく、3分おきとか5分おきとかでやってみる

- データ取得先URL : 
http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/47okinaw.zip
- データ仕様 : 
http://www.post.japanpost.jp/zipcode/dl/readme.html

### 実装方法
シェルスクリプト(bash)を使用してデータを取得

<ファイルフォーマット>

- 郵便番号
- 都道府県名(漢字)
- 市区町村名(漢字)
- 町域名(漢字)

<使用コマンドヒント>

- crontab - 自動実行
- wget - ファイル取得
- cut - データ分割
- nkf - 文字コード変換
- unzip - ファイル解凍

※vagrant環境で実行し、足りないコマンドはyum instal (コマンド名)でインストール

余裕があれば、DLデータの1列目の各市区町村コードに属する町域名の数をコマンドのみでファイル出力してみる。

(例)
件数<タブ>市区町村コード

```
79 47201
21 47205
23 47207
21 47208
55 47209
```

### コマンド
▼シェルスクリプトでファイル取得からの保存(hoge.sh)

```hoge.sh
#!/bin/sh
date=`date "+%Y%m%d"`
wget http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/47okinaw.zip
unzip 47okinaw.zip
cut -d , -f 3,7,8,9 47OKINAW.CSV | nkf -w >> ${date}_before47OKINAW.txt
cat ${date}_before47OKINAW.txt | tr -d '"' >> ${date}_47OKINAW.txt
rm ${date}_before* 47*
```

---- バーミッション変更する

```
chmod +x hoge.sh
```
---- 毎月1日の自動実行処理をcrontabに記載

```
crontab -e
0 0 1 * * /var/www/html/elites-test/bashtest/hoge.sh
```

▼特定フィールドの重複削除・件数確認

```
cut -d , -f 1 47OKINAW.CSV |nkf -w|uniq -c
```
API初心者が初めてAPIをいじった(簡易住所検索)

APIを初めて使用した時にやったことをまとめる。
### 作ったもの
Googleから提供されている後述のAPIを利用したアプリケーションの作成
<img width="508" alt="スクリーンショット 2016-12-16 16.34.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/fbc7829f-9c04-915f-fdee-6d9c721073a8.png">

APIについては、この辺りのページを参照するとイメージはだいたい掴めるかと
http://e-words.jp/w/API.html
http://www.atmarkit.co.jp/ait/articles/0703/13/news095_2.html

### 構成
- 住所検索できるフィールドを設置
- 任意の住所テキスト入力後「検索」ボタン押下で検索結果を検索フィールド下部に一覧表示させる(「Google Maps Geocoding API」を使用)
・検索結果一覧の出力項目は以下
 - 都道府県(第1階層目)
 - 市(第2階層目)
 - 区(第3階層目)
 - 町村字(第4階層目)
 - 周辺施設表示(リンク) → クリックで別ウィンドウにGoogleMapAPIを使用して地図を表示させ、その地図上に任意の周辺施設をピンで表示させる

### 利用API
- 住所検索
https://developers.google.com/maps/documentation/geocoding/intro?hl=ja

- 地図表示、ピン表示
https://developers.google.com/maps/documentation/javascript/?hl=ja

- 周辺施設情報取得
https://developers.google.com/places/web-service/?hl=ja

### その他
- 今回はAPIとの連携方法やAPIを使用することで実現可能なことを掴むことが目的
- WebAPIは基本的に、実装側がhttpまたはhttpsでAPIに対してリクエストを投げて、レスポンスをJSONまたXML形式で受信し、受信したデータから必要なデータを取捨選択し、加工して自サイト上で活用するという使い方が主

- 今回は地図APIの活用だが、他の業務的な用途のAPIも扱うデータが異なるだけで基本的に同様の方法で連携可能。ある程度実装方法を習得しておくと、他のAPIでも柔軟に対応出来ると思う。
- 今回は使用しなかったがAPIとの連携はデータの取得のみではなく、CRUD的な要素があるそう。
- 更新や削除用API使用時の場合は実装処理が大きく変わるというわけではなく、同じようにAPIにパラメータを渡して、実行結果を返してもらうという実装で対応可能。

- Ajaxの学習を行う場合、APIとの連携はフレームワーク側(CakePHPなど)にAPIとの連携処理は置かずに、以下のページを参考に実装する方法に挑戦する。
― フレームワークとは切り離して理解する方が、AjaxやAPIの利用方法についてより理解が深まる(Ajaxの実装方法は色々あるが、現状は以下の参考ページの実装方法を押さえておけばよい)

 - Ajaxとは:
 http://e-words.jp/w/Ajax.html

 - Ajax実装参考ページ:
 http://wp.tech-style.info/archives/619