OmniAICreator/Qiita-1.07M huggingface dataset:
チャットアプリでよくある画面下部のテキストフィールドを実現する

# 実現するもの
LINEのチャット画面のように、画面下部に設置されたテキストフィールドをタップすると、
出てきたキーボードの上部にスライドするようにする。

# コツ
通常はUITextFieldへinputAccessoryViewを設定しますが、その場合だとViewController上のビューにもともとおいてあるUITextFieldをタップして、それとは別のUITextFieldが含まれるUIViewがキーボード上部に表示されるという感じになりそうです。
そのためここではUIResponderの`inputAccessoryView: UIView? `をオーバーライドすることにより同一インスタンスを返すようにしています。

#　注意事項
```swift
self.bottomView = ChatRoomInputView(frame:
                       CGRect(x: 0, y: self.view.frame.height-50, width: self.view.frame.width, height: 50))
self.bottomView.chatTextField.inputAccessoryView =
                       ChatRoomInputView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 50))
self.view.addSubview(bottomView)
```
としても同じような画面を表示することができますが、インスタンスが違うため２つのTextFieldで入力した内容が一致しません。

# コード
```swift:ChatRoomViewController.swift
class ChatRoomViewController: UIViewController {
	@IBOutlet weak var tableView: UITableView!
	var bottomView: ChatRoomInputView!
	
	override func viewDidLoad() {
		super.viewDidLoad()
		setupUI()
	}
	
	override func didReceiveMemoryWarning() {
		super.didReceiveMemoryWarning()
		// Dispose of any resources that can be recreated.
	}
	
	//画面下部とキーボード上部に同じビューを返す
	override var inputAccessoryView: UIView? {
		return bottomView
	}

	// trueを返すことで override var inputAccessoryView: UIView? が呼ばれるっぽい
	override var canBecomeFirstResponder: Bool {
		return true
	}
}

extension ChatRoomViewController {
	func setupUI() {
		tableView.keyboardDismissMode = .interactive //TableViewを下方向にスワイプした時のみキーボードを閉じる
		
		// frameを指定しないとだめ
		self.bottomView = ChatRoomInputView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 50))
		
		//self.view.addSubview(bottomView) //やったらだめ！！
		
	}
}

```

```swift:ChatRoomInputView.swift
import UIKit

class ChatRoomInputView: UIView {
	
	@IBOutlet weak var chatTextField: UITextField!
	@IBOutlet weak var sendButton: UIButton!
	
	override init(frame: CGRect) {
		super.init(frame: frame)
		self.setFromXib()
	}
	
	required init?(coder aDecoder: NSCoder) {
		super.init(coder: aDecoder)
		self.setFromXib()
	}
	
	func setFromXib() {
		let nib = UINib.init(nibName: "ChatRoomInputView", bundle: nil)
		let view = nib.instantiate(withOwner: self, options: nil).first as! UIView
		self.addSubview(view)
	}
}
```


# 参考にさせていただいたサイト
https://qiita.com/ykpaco_404wm/items/659b0070bb9dbfdf1373
https://stackoverflow.com/questions/19764293/inputaccessoryview-docked-at-bottom
【Android】ボタン押下時に色を変える場合のDrawableの記述方法

##記述方法
###セレクターを使って色を分ける

```xml:sample.xml
<?xml version="1.0" encoding="utf-8"?>  
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 通常時 -->
    <item android:state_pressed="false" android:state_focused="false">
        <shape android:shape="rectangle">
        <!-- ボタンの色 -->
        <solid android:color="#ff0000" />
        </shape>
    </item>
    <!-- フォーカス時 -->
    <item android:state_pressed="true" android:state_focused="false">
        <shape android:shape="rectangle">
        <!-- ボタンの色 -->
        <solid android:color="#00ff00" />
        </shape>
    </item>
    <!-- 押下時 -->
    <item android:state_pressed="true" android:state_focused="false">
        <shape android:shape="rectangle">
        <!-- ボタンの色 -->
        <solid android:color="#0000ff" />
        </shape>
    </item>
</selector>
```
【Android】ボタンの色や形を動的に変える

##ボタンの色を動的に変える方法
###Drawableを用意して、ボタンに色や形を適用する


※まず適当なDrawableを作成し、drawableディレクトリに保存する

```xml:color_sample.xml
<?xml version="1.0" encoding="utf-8"?>  
<shape android:shape="rectangle">
    <solid android:color="#000000" />
    <corners android:radius="5dp" />
</shape>
```

```java:java
//リソースからボタンのリソースを取得(ここではbtn_sampleとする)
Button btn = (Button)findViewById(R.id.btn_sample);
//リソースから作成したDrawableのリソースを取得
Drawable btn_color = ResourcesCompat.getDrawable(getResources(), R.drawable.color_sample, null);
//ボタンにDrawableを適用する
btn.setBackground(btn_color);
```
【Android】リソースからDrawableを取得する方法

##取得方法
###res/drawable/sample.xmlからdrawableを取得する
```java:java
Drawable drawableButtonNext = ResourcesCompat.getDrawable(getResources(), R.drawable.sample, null);
```


```xml:sample.xml
<?xml version="1.0" encoding="utf-8"?>  
<shape android:shape="rectangle">
    <solid android:color="#000000" />
    <corners android:radius="5dp" />
</shape>
```
【HTML】 inputタグでsubmitしたときに、ページ遷移させたくない場合

##ページ遷移させない方法
###onClickにreturn falseを書く
```html:html
<input type="button" onClick="return false;">
```

###onClickに既に関数の呼び出しなどがある場合

```html:html
<input type="button" onClick=" hoge(); return false;">
```
Cloud9で最新版のRailsを導入するミニマムな方法

2chまとめのアンテナサイトを作ろうと企みCloud9上で開発を試みる。
せっかくだから新しいRailsをインストールしたいけどやり方よく分からなかったのでmemo

以下のページを参考にさせて頂きました。
https://qiita.com/YukiNaito/items/047c58ba15080ddd3b9d

##下準備
- Cloud9を作成する
- workspceを「blank」で作成する
- ※Railsで作ると無条件で以前のバージョンで作成されるので注意

# 環境構築

```
$ rvm install 2.4.2 # Ruby2.4.2をインストール
$ gem install rails # Rails5.1をインストール
$ gem install bundler # Bundlerインストール
```

##Railsアプリケーションの作成とフォルダ移動
`rails new sample && cd sample`
今回はあまり複雑なことは（よくわからないので）出来るだけ行わないようにするためすぐに作成。
機能が欲しくなったりした場合には、その都度追加していくようにする。



##とりあえずRailsを起動することができて喜ぶ
`rails s -b $IP -p $PORT`
※rails s だけではきちんと起動しないので注意


これで最低限インストールと起動が完了したので後は煮るなり焼くなりすればok
AWS OpsWorksでデプロイがいつまでたっても完了しない

## 概要

OpsWorksで構築したアプリにAWSコンソールのOpsWorksからデプロイを行ったら、いつまでたっても完了しないということが起こり調査した。

opsworks-agentのバージョンは3437

## 調査

```:/var/log/aws/opsworks/opsworks-agent.process_command.log
[2017-11-02 20:00:00] ERROR [opsworks-agent(23123)]: process_command: Failed to report status of process_command: AWS::Errors::MissingCredentialsError -
Missing Credentials.

Unable to find AWS credentials.  You can configure your AWS credentials
a few different ways:

* Call AWS.config with :access_key_id and :secret_access_key

* Export AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to ENV

* On EC2 you can run instances with an IAM instance profile and credentials
  will be auto loaded from the instance metadata service on those
    instances.

* Call AWS.config with :credential_provider.  A credential provider should
  either include AWS::Core::CredentialProviders::Provider or respond to
    the same public methods.

= Ruby on Rails

In a Ruby on Rails application you may also specify your credentials in
the following ways:

* Via a config initializer script using any of the methods mentioned above
  (e.g. RAILS_ROOT/config/initializers/aws-sdk.rb).

* Via a yaml configuration file located at RAILS_ROOT/config/aws.yml.
  This file should be formated like the default RAILS_ROOT/config/database.yml
    file.
```

opsworks-agent.process_command.logを見たところ,
AWS::Errors::MissingCredentialsErrorになってるが、該当のEC2インスタンスにはIAM Roleを付与して適切なIAMポリシーを設定してあるのでAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYは環境変数に設定しなくても動くはずである。

## 解決方法

結局opsworks-agentの再起動で直った。

```
/ect/init.d/opsworks-agent restart
```
ActiveDirectoryに一括でユーザーを登録する

★備忘録です

ActiveDirectoryにタブ区切りテキストファイルを使用して、一括でユーザーを登録する方法。
dsaddコマンドを使用。

#テキストファイル
記述例
>"cn=user1,ou=mobile_Users,dc=test,dc=local"	user1	user1	user1@test.local	Password1!
"cn=user2,ou=mobile_Users,dc=test,dc=local"	user2	user2	user2@test.local	Password2!

ここでは、先頭より、ユーザーの識別名、SAMアカウント名、表示名、ユーザープリンシパル名、パスワード の5項目を指定。他のパラメーターも指定可能。(technet参照)
ファイルはタブ区切り。スペースが含まれる場合は、項目をダブルクォーテーションで囲む。

ファイルは適当な場所に保存する。
(ここでは、c:\adwork\adduser.txt とする）

#dsaddコマンド
コマンドプロンプトで実行する。
dsadd user コマンドは、1件のユーザーを登録するコマンドなので、
ファイルを読み込みfor文でコマンドを発行する。
>for /f "tokens=1-5" %A in (c:\adwork\adduser.txt) do dsadd user %A -samid %B -display %C -upn %D -pwd %E

tokens=1-5 で 5件のカラムを使用、 以降の%A~%Eまでが、タブで区切られた各カラムを表す。
パラメーターを増やしたいときは、tokensの後ろの数字を変え、パラメーターを追加し、テキストファイルにカラムを追加する。

#最後に
dsaddコマンドの詳細はこちら。
[https://technet.microsoft.com/ja-jp/library/cc731279(v=ws.10).aspx](https://technet.microsoft.com/ja-jp/library/cc731279(v=ws.10).aspx)
Python2,3 両対応なwheelをbuildする

# 概要

単に `python setup.py bdist_wheel` を実行すると実行した環境のPythonのバージョンに対応したwheelがbuildされるので、Python2,3に両対応なwheelをビルドしたい。

# 方法

`--universal` オプションをつけて `python setup.py bdist_wheel --universal` を実行する。
ただし、参考情報にあるように下記の条件が必要。

> Only use the --universal setting, if:
> 
> 1. Your project runs on Python 2 and 3 with no changes (i.e. it does not require 2to3).
> 2. Your project does not have any C extensions.

# 参考情報

- [Packaging and Distributing Projects#Universal Wheels](https://packaging.python.org/tutorials/distributing-packages/#universal-wheels)
AMPでCarouselを、Bindと連動させて動的に生成する方法

11/2にGoogle Japan本社で行われたPWA/AMP Hackathonで作った制作物を共有したいと思います。
githubに公開しておりますので、実際に動かして試してみてください
[amp-dynamic-carousel](https://github.com/zonomaa/amp-dynamic-carousel)

## やりたいこと
selectで選択したものを動的にデータを取得して、carouselで描画させたい

## 使用するampコンポーネント

- `amp-list`
- `amp-bind`
- `amp-mustache`
- `amp-carousel`

## ハマったところ

amp-listとamp-carouselの関係性にちょっとつまずいた
amp-listの中にamp-carouselがあり、templateでamp-carouselごと要素を生成するという少々気持ち悪い実装となっている

```html:index.html
<amp-list>

  <template type="amp-mustache">

    <amp-carousel>
      {{#values}}
        <div class="box_inner">
            # 省略
        </div>
      {{/values}}
    </amp-carousel>

  </template>

</amp-list>
```

```json
{
 "items": [{
  "values": [
    {
      "title": "全国のデータ A",
      "comment": "テストデータAテストデータAテストデータAテストデータA",
      "img": "http://via.placeholder.com/210x150",
      "url": "#"
    }...
  ]
 }]
}
```

### ロジック

amp-listでデータを取得し、amp-carouselごと回して要素を生成
jsonに`values`という階層を一つ作ってあげることで、amp-carouselは一つだけ生成され`values`の中の要素を生成

## 理想

```html:index.html
<amp-carousel>

  <amp-list>

    <template type="amp-mustache">
      <div class="box_inner">
          # 省略
      </div>
    </template>

  </amp-list>

</amp-carousel>
```

amp-carouselの中にamp-listで要素を生成するという方法が理想なのかなと思いました。
上記の方法で実装するとampバリデーションは通るが、期待通りには描画されなかったです。
もしかしたら私の実装の仕方に誤りがあるかもしれませんので、その際はご指摘ください。

## まとめ

少しトリッキーな方法ではありますが、これで動的なデータが描画できるカルーセルを作ることができます。
リアルタイムなデータが必要な場合はご参考ください。
ExcelVBA　有効数字を返す関数

メモがてら。
worksheetfunctionだけで対応可能。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
Function ConvertSFig(ByVal a As Variant, ByVal n As Integer) As Double
    Dim b As Double
    b = WorksheetFunction.Round(a, n - 1 - Int(WorksheetFunction.Log10(CDbl(a))))
    ConvertSFig = b
End Function
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
Nginx PHP7 絶対にできる設定

#簡単で絶対に設定できます。
<details>
<summary>php5や、一度設定したことがあれば、保証できません。</summary>
競合してめちゃくちゃになります。（体験談）
nginxとphpを初めてインストールする人
さらに、debian系のディストリビューションなら間違いない。
うまくいかなければ、初期化して一からやることを進めます。
この記事は、初期化して一からやれば必ずできます。
</details>
Red-Hat系やMacOSは、参考程度によろしくお願いいたします。
##それでは、始めます。
まず、installするものは、
nginx, php7.0, php7.0-fpmです。

```コマンド
$ sudo apt -y install nginx php7.0 php7.0-fpm
```

<details><summary>ちょっとした説明</summary>
　aptは、apt-getの上位互換らしいです。
-yオプションは、選択を全てyesにします。
</details>

###設定ファイルいじります。
はじめに
indexにindex.phpを追加します。

その後、location ~ /.php{}の設定の中で
include~~の行と
fastcgi_pass unix~~の行だけコメントはずします。

```nginx
$ sudo vim /etc/nginx/sites-available/default
```

```:/etc/nginx/sites-available/default
 44 index index.html index.htm index.nginx-debian.html index.php;
 
 56         location ~ \.php$ {
 57                 include snippets/fastcgi-php.conf;
 58         #
 59         #       # With php-fpm (or other unix sockets):
 60                 fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
 61         #       # With php-cgi (or other tcp sockets):
 62         #       fastcgi_pass 127.0.0.1:9000;
 63         }
```

次にfpmを編集します。
<details><summary>fpmとは</summary>
phpを動作させるAppserverで
Apacheなどでは、必要ない（Apacheが頑張る）が
Nginxは、phpの仕事をしないのでfpmが必要。
</details>
それでは、やっていきましょう。

```
$ sudo vim /etc/php/7.0/fpm/php.ini
```
760行目付近です。cgi.fixなどは、似たものがあるので気をつけてください。

`760 cgi.fix_pathinfo=0`

これだけで設定完了です。

あとは、リロードするだけ

```
$ sudo service php7.0-fpm restart
$ sudo service nginx restart
```

```
http://localhost/
```
でwebが表示されるはずです。

また、表示しているファイルは、
/var/www/htmlのディレクトリにあるファイルです。

以上です
お疲れ様。
yeomanを使ってBabel Pluginを書く環境を1コマンドで構築する

個人的には、環境構築が一瞬で出来るのでyeoman好きなのだけど界隈ではすでに廃れてものとして扱われています。
が、実際便利なので、今回はそのYeomanを使ってBabelPlugin環境構築を構築します。

## インストール

```
$ npm install --global yo @akameco/generator-babel
```

[**akameco/generator-babel**<br> Scaffold out a Babel Plugin](https://github.com/akameco/generator-babel)

## 使い方

```
$ mkdir babel-plugin-for-me
$ cd babel-plugin-for-me
$ yo
```

yoを叩くと、インタラクティブにジェネレーターを選択できるので、`@akameco/babel`を選んでください。

これだけで、BabelPluginの雛形とテスト環境の完成です。
他には、floweslint,flow,prettier,jestなどの設定やBabelのビルド設定も終わっているので、あとは、コードを書くだけです。

おっと、publishする際にはpackage.jsonから@akamecoから自分の名前に変更してくださいね。

## フォーク
もしかすると、構成が気に食わないかも知れません。
その場合は、フォークして変更してください。

[**akameco/generator-babel**<br> Scaffold out a Babel Plugin](https://github.com/akameco/generator-babel)

## おわりに
yoを使ってBabel Pluginの作成環境を構築する方法を紹介しました。
Babel Pluginがもっと増えるといいですね。

簡単なプラグインはいくつかQiitaで紹介しています。
参考にしてください。

面接でFizzBuzzを書けと言われたときにすべきこと
https://qiita.com/akameco/items/d2851fd4868f833c8040

JavaScriptのfloatで正確な比較を行う
https://qiita.com/akameco/items/019e1a0875ad236e859c
画像ファイルからの機械学習用データセット作成を、OpenCVとnumpyを用いて行う方法

#はじめに
現在多数の機械学習用のライブラリやフレームワークを用いた記事が公開されていますが、Tensorflowなどで実際に自分の画像を機械学習させるためには、pngやjpgの形式の画像ファイルをベクトル（つまりは配列）に変換して学習機に入力できる形に変換する必要があります。
本ページではその方法をOpenCVとnumpyを用いて説明します。
#OpenCVのインストール方法
結構簡単です。他にも記事はたくさんあります。
https://qiita.com/cointoss1973/items/92d82f9accb239a276a0
#環境
- Windows 10 64-bit
- Python 3.6
- OpenCV 3.3

#コード
実装してみたコードが以下になります。コードの説明として、

-  pathsの各ディレクトリに、同じラベル付けをしたい画像ファイルをまとめておく
-  すべての画像を一旦グレイスケールに変換する
-  ベクトル化した後に標準化（or 正規化）を行う
-  各ベクトルをtrainにスタックしていく
-  同時にラベルも貼る
-  各データセットをnpz形式のファイルで保存

といった感じです。

```python:make_traindata.py
# -*- coding: utf-8 -*-
import os
import sys
import numpy as np
import cv2

paths = ['./yout dir 1, ./your dir 2, ..'] #各フォルダに同じラベル付けをしたい画像を入れる
label = np.zeros(len(paths)-1)
for cnt_path, path in enumerate(paths):
    files = os.listdir(path)
    for cnt_file, f in enumerate(files):
        file_path = path + '/' + str(f)
        img = cv2.imread(file_path) #すべての画像の読み込み
        img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #グレイスケール変換
        if cnt_path==0 and cnt_file==0:
            size = img.shape
        img = np.ravel(img) #画像のベクトル化
        img = (img - np.mean(img)) / np.std(img) #ベクトルの標準化
        #img = (img - np.min(img)) / (np.max(img) - np.min(img)) #ベクトルの正規化
        if cnt_path==0 and cnt_file==0:
            train = img
            labels = np.insert(label, cnt_path, 1)
        else:
            train = np.vstack((train, img)) #trainにベクトル化した画像データをスタックしていく
            labels = np.vstack((labels, np.insert(label, cnt_path, 1))) #学習ラベル付けを各ディレクトリごとに行う
			
np.savez('./filename.npz', trainimg=train, trainlabel=labels, imgsize=size) #データセットをnpz形式ファイルで保存
print("save done")
```
# npz形式のファイルを読み込んで機械学習を行う方法
下記のGitHubで公開されているTensorflowのコードの
https://github.com/sjchoi86/Tensorflow-101

- mlp_customdata_basic
- cnn_customdata_basic

などが、先ほどのnpzファイルを流用できます。ただし、cnnの場合は画像の縦と横のサイズを同じにする必要があるので注意してください。
Selenium + WebDriver + Chrome/Firefox/IE のチートシート

# はじめに

Selenium + WebDriver + Chrome/Firefox/IE で自動化する際の自分用メモ。

## Import and 初期化

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import Select

    options = Options()
    #options.add_argument('--headless')
    #options.add_argument("browser=chrome")
    #options.add_argument("user-agent=iphone")
    driver = webdriver.Chrome(chrome_options=options)
    #driver = webdriver.Ie()
    #driver = webdriver.Firefox()
    url='http://www.google.com/'
    driver.get(url)

## Elementを取得

    element = driver.find_element_by_class_name('class_name')
    element = driver.find_element_by_css_selector('div.a-row')
    element = driver.find_element_by_id('shikibetsushi')
    element = driver.find_element_by_link_text('ここをクリック')
    element = driver.find_element_by_name('namae')
    element = driver.find_element_by_partial_link_text('ここを')
    element = driver.find_element_by_tag_name('a') #<A>
    element = driver.find_element_by_xpath('//*[@id="maintext"]/h2[1]')

## Selectタグの操作

    # 選択方法1
    from selenium.webdriver.support.ui import Select
    Select(driver.find_element_by_name('month')).select_by_visible_text('2')
    Select(driver.find_element_by_name('month')).select_by_value('2')
    Select(driver.find_element_by_name('month')).select_by_index(2)

    # 選択方法2(この方法だと前方一致で指定可能)
    element = driver.find_element_by_css_selector('select.classname')
    element.click()
    element.send_keys('selenium')
    element.send_keys('\n')

## Window間の移動

    # 2番めのウィンドウに移動する。
    driver.switch_to_window(driver.window_handles[1])
    # フレームに移動する
    driver.switch_to_default_content()
    driver.switch_to_frame("frameName")

## Wait

    # フレームが表示されるまで待つ
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions
    from selenium.webdriver.common.by import By
    wait = WebDriverWait(driver, 10)
    wait.until(expected_conditions.frame_to_be_available_and_switch_to_it((By.NAME, "MAIN")))

## その他

    # 再読込
    driver.refresh()
    # スクショ
    drvier.save_screenshot('filename.png')
    # ブラウザのタイトル
    title_name = driver.title

## 最後に

    # 閉じる
    driver.quit()

# 参考

Selenium with Python
http://selenium-python.readthedocs.io/index.html

Selenium Python Bindings
https://doc.bccnsoft.com/docs/selenium-python-2.45.0/
HMAC認証とは

##HMAC 【 Hash-based Message Authentication Code 】

HMACとは、メッセージを送受信する際に相手が成りすましでないかどうかや、途中で改竄されていないかどうかを調べることができる認証符号の一つで、ハッシュ関数を元に算出されるもの。
https://www.ipa.go.jp/security/rfc/RFC2104JA.html
共有ホスティングVS管理クラウドホスティング

[Shared Hosting VS Cloud Hosting](https://www.cloudways.com/blog/wordpress-shared-vs-dedicated-vs-cloud-hosting)ィング間で混乱しています。基本的に共有ホスティングとは、サーバ上のリソースが複数のユーザと共有され、アクセスする複数のアカウントを持つパブリックコンピュータが容易に理解できるユーザ定義の用語です。




一方、クラウドホスティングは、あなたのパーソナルコンピュータのようなあなたのビジネスのための特定のスペースのみの埋蔵量を指します。どちらもコンピュータリソースを販売することができるということは間違いない。ホスティングの価格を比較し、最終的には長期的にビジネスに害を及ぼす他のすべての側面を見落とすだけだ。
ビジネスホスティングの要件に合わせてソリューションを選択することで、いくつかの側面を検討する必要があります。

•年間オンラインビジネス予算
•毎日の訪問者数
•セキュリティ要件。
•パフォーマンス。
•	技術的な知識

クラウドホスティングについてまだ興味がありますか？あなたは次の成功したeコマースストアを立ち上げることを考えていますか？ブランドウェブサイトを改善しているかもしれませんか？あなたのビジネスを始めるための素晴らしい管理クラウドホスティング機能を見てみましょう。あなたは既存のWordPress Webサイトを持っていて、それを新しいクラウドホスティングアカウントで移行するつもりですか？あなたの努力を減らすために無料の[free WordPress Migrations](https://www.cloudways.com/en/wordpress-migrator.php)プログラムを見てください。
mining-poolネットワーク構成

#複数コイン対応プール前提でのネットワーク構成

サーバーを立てる前にネットワーク構成図について考えてみる。
プログラムに関する情報は少なめ。
##mining-poolを作るに必要な登場人物

1.マイニングプールフロントエンド（今回はNOMP）
2.stratum-mining(ハッシュ管理サーバ)
3.各種coind（mona,zeny などなど…）

単独コインのプールを作るのであれば、
これ全部１つのサーバで良いんですね、きっと。
なお、

##せっかくだから、複数コイン対応poolにしたいよね？

と思ったので、最初からリッチな構成にしてみる。
（※現時点でコストは考えないこととする）

```
　　Internet
　　　　|
（グローバルアドレス)
　　　　|
　　NATルータ
　　　　|
(プライベートアドレス)
　　|　　　　　|
　NOMP　　(stratum＋coind)× n
```

こんな感じかな？

##メリット
・NOMPとcoindのやり取りがインターネットに流れない
・コインを増やし易い（nのセットを増やすだけ）
・NOMPの場合、ユーザ登録ないのでDBを別建てしなくて良い

##デメリット
・高い
・NATルータがシングル障害ポイント
・というか、NATルータの性能に明確に引っ張られるな、これｗ

#総括

とりあえず、この構成で作ってみる。
最初に着手するのは**「NATルータ on Ubuntu 16.04」**

#追記
昔、物理サーバをレンタルしていた時に成功した構成だったので、行けると思っていたのですが、、、

現在利用しているクラウドVPSがNAT禁止だったため、構築断念。
契約先を見直して、いつか再チャレンジします。
VBAでシリアル値（日付、時間）を扱う時の注意点

VBAでシリアル値を扱う場合、格納する変数の型によって出力が異なる。

　・String型：日時がそのまま文字列として格納される
　・Double型：シリアル値が小数以下まで格納される（日付＋時間の値）
　・Long型　：シリアル値が整数として格納される（日付値）

Integer型だとオーバーフローする。

※シリアル値：1日を1とした値。小数以下は時間を表す。


![qiita1.jpg](https://qiita-image-store.s3.amazonaws.com/0/207458/245aaca7-f00c-941e-96ea-0c46c2b60a97.jpeg)

vba

    Sub test()

      Dim timeStr As String
      Dim timeDbl As Double
      Dim timeLng As Long
    
      timeStr = Range("B2").Value
      timeDbl = Range("B2").Value
      timeLng = Range("B2").Value
    
      Debug.Print "timeStr", timeStr
      Debug.Print "timeDbl", timeDbl
      Debug.Print "timeLng", timeLng

    End Sub

出力結果

    timeStr       2017/01/01 12:20:15
    timeDbl        42736.5140625 
    timeLng        42737
python3.6にsphinxをインストール （その２）Pandoc経由でWordに渡す

# PDF出力の変換方法を考える

 rest2pdf なき今、make latexpdf を使うために仕方なくLaTexとGhostScriptを入れ始めたのだがどうもうまくいかない。だいたいインストールがうまく行ったとしても、とても面倒で厄介な匂いしかしない。

次善の策として、WORDに吐き出せればそこからPDFに保存できるのだが sphinx-docxbuilder も過去のプロダクトなので、代わりにPandocを使ってHTMLからdocxに変換してみる。

# Pandoc のインストール

[GitHub](https://github.com/jgm/pandoc/releases)から、pandoc-2.0.1-windows.msi をダウンロードして導入する。C:\Program Files (x86)\Pandoc にインストールされるので念のため、PATHが通っていることを確認する

|#| モジュール名 | ver. | 記事 |
|:-:|:-:|:-:|:-:|:-:|
|61| Pandoc | 2.0.1 | ドキュメント・コンバータ | 

# singleHTML経由でdocxに変換する

```
CMD> make singlehtml
CMD> cd _build\singlehtml
CMD> pandoc index.html -o output.docx
```

作成されたdocxは以下の様になった。Office 2016を使っている。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/99561/59cd62f7-12ab-8246-3dd5-dd4b59aea5a4.png)

元のHTMLと比較すると以下のような不具合があるが完成度は高く修正もしやすいだろう。

1. 表の幅（右端）が制御されない
    - docx上で"表のプロパティ/幅を指定する"が有効になっているので無効化する。または、100％に設定する
2. コードブロックが消えてただの本文テキストになる
    - 1行x1列の表に置き換えてから変換する
3. 見出し文字（段落記号：¶）が表示される
    - HTMLソースに段落記号が本文で記入されているので削除してから変換する。または、変換後にすべてまとめて削除する
4. 文書冒頭の目次が元のHTML文書へのリンクを指している
    - 変換後に目次を作成しなおす

参考までにdocxからPDFに保存すると以下のようになる。
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/99561/eb8e05fb-64b5-87ce-7f6a-a7ffcd608b03.png)


# 参考情報


[Sphinxをはじめよう 第2版](https://www.oreilly.co.jp/books/9784873118192/)
[Sphinxをはじめよう](https://www.oreilly.co.jp/books/9784873116488/)
[Pandoc で Windows に作るmarkdown to html, docx 環境](https://qiita.com/tsujimitsu/items/907d7a2fae2057d0fb1f)
[Windows環境でメンテしやすいドキュメントをSphinxで作る(rst形式, Markdown形式)](https://qiita.com/goforbroke/items/9f78ccb302615febcf84)
[CommonMarkの仕様とか](https://qiita.com/Prof-Cheese/items/9629438b06aacc068c98)
[Sphinxを便利にして、みんなに使ってもらいたい](https://qiita.com/pashango2/items/d1b379b699af85b529ce)
[Sphinxのドキュメント作成を便利にする「sphinx-quickstart-plus」を作りました](https://qiita.com/pashango2/items/512e567b328058d4107a)
[実務に使うプレーンテキスト→Microsoft Word変換、あるいはPandocを使い始めた話](http://nenono.hatenablog.com/entry/2015/02/10/173516)
[ドキュメントの継続的な開発方法 | IIJ Engineers Blog](http://eng-blog.iij.ad.jp/archives/16)
AWS Lambda で JSONを受け取って新しいページにPDFを吐く

なんだこれ……。「限定共有投稿」に黒魔術が残っていたので晒す。

```py

# -*- coding:utf-8 -*-
import BaseHTTPServer
import json

class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
 
	def do_GET(self):
		if self.path.endswith('favicon.ico'):
			return
		
		self.send_response(200)
		self.end_headers()
		self.wfile.write(index_handler());
		return

	def do_POST(self):
		self.send_response(200)
		content_len = int(self.headers.get('content-length'))
		requestBody = json.loads(self.rfile.read(content_len))
		if self.path.endswith('my.pdf'):
			self.send_header("content-type", "application/pdf")
			self.end_headers()
			self.wfile.write(lambda_handler(requestBody, {}))
		return

def lambda_handler(data, context):
	return """%%PDF-1.4
1 0 obj
<</Pages 2 0 R/Type /Catalog>>
endobj
2 0 obj
<</Kids [3 0 R]/Count 1/Type/Pages>>
endobj
3 0 obj
<</Contents 5 0 R/Parent 2 0 R/MediaBox[0 0 612 292]/Resources<</Font<</F1 4 0 R >>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
4 0 obj
<</Type/Font/Subtype/Type1/Name/F1/BaseFont/Helvetica/Encoding/MacRomanEncoding>>
endobj
5 0 obj
<</Length 73 >> stream
BT /F1 24 Tf 30 100 Td (%s) Tj ET
endstream
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000059 00000 n
0000000114 00000 n
0000000249 00000 n
0000000349 00000 n
trailer << /Size 7 /Root 1 0 R >>
startxref
%d
%%%%EOF""" % (data['message'], 433+len(data['message']))

def index_handler():
	return """<!DOCTYPE html>
<html>
<head>
  <title>a</title>
  <style>
	div, embed { width: 100%; height: 125vw; }
  </style>
</head>
<body>
  <button id="b1">view pdf</button>
  <div id="d1"></div>
  <script>
  (function() {
	document.getElementById("b1").addEventListener("click", function() {
	  // ブロックされないようにclickハンドラ内でオープンしとく
	  var previewWindow = window.open("", "preview");
	  var xhr = new XMLHttpRequest();
	  xhr.onreadystatechange = function() {
		if(xhr.readyState === 4 && xhr.status === 200){
		  var url = URL.createObjectURL(this.response);
		  if(window.navigator.msSaveOrOpenBlob) {
		    window.navigator.msSaveOrOpenBlob(this.response, 'my.pdf');
		  } else {
		    // オープンしといた別Windowで表示
		    previewWindow.location.href = url;
		    // 埋め込んじゃうというのも
		    document.getElementById("d1").innerHTML = 
		      '<embed type="application/pdf" src="' + url + '"></embed>';
		  }
		}
	  };
	  // JSON形式でポストして結果はblobで受け取る
	  window.setTimeout(function() {
		xhr.open("POST", "my.pdf");
		xhr.responseType = "blob";
		xhr.setRequestHeader('Content-Type', 'application/json');
		xhr.send('{"message":"Hello!!"}');
	  }, 1000);
	});
  })();
  </script>
</body>
</html>"""

if __name__ == '__main__':
	server_address = ('', 8080)
	httpd = BaseHTTPServer.HTTPServer(server_address, MyHandler)
	httpd.serve_forever()

```
機械学習まわりの英単語訳一覧

英語論文読み始めの時に「これ何だっけ」と何回か調べてしまう単語があったため、定期的に見て覚えるため機械学習分野でとりわけ出てくる英単語の訳を載せておきます。思い出し程度に使ってください。

＊論文でよく使う意味を優先して書き、普通の意味は省いて書いているものもあります。
＊順次追加していきます。

#英単語一覧

##名詞##
*anomaly*　異常、例外
*array*　配列
*bracket*　括弧
*canonical* 　正準
*Cartesian product*　デカルト積
*coefficient*　係数
*compositionality*　単調性
*configuration*　形状、輪郭、外形
*coordinate*　座標
*correlation*　相関
*covariance*　共分散
*data manifold*　データ多様体
*depiction*　描写
*derivation*　導出、由来、誘導
*deviation*　偏差、逸脱
*dimensionality*　次元数、次元性
*discrimination*　判別
*distribution*　分布
*element*　要素
*equilibrium* 　均衡
*high-resolution*　高解像度
*ICA: independent component analysis*　独立成分分析
*image enhancer*　画像処理ソフト
*implementation*　実装
*imputation*　データ補完
*indices*　indexの複数形
*inference*　推測、推論による結論
*inlier*　正常値
*invariant*　不変量
*K-means*　Kー平均法
*K-nearest neighbor*　K-近傍法
*Lasso: least absolute shrinkage and selection operator*
*least squares method*　最小二乗法
*line*　直線
*linear algebra*　線形代数
*linear regression*　単回帰、直線回帰
*mass*　大部分
*mean shift*　平均値シフト法
*multiple linear regression*　重回帰分析
*NMF: non-negative matrix factorization*　非負値行列因子分解
*optimality*　最適性
*outlier*　異常値、外れ値
*PCA: principal component analysis*　主成分分析
*permutation*　順列
*product of terms*　項の積
*proposition*　定理、命題
*regression*　回帰
*regularization*　正則化
*reinforcement learning*　強化学習
*SGD: stochastic gradient decent* 　確率的勾配降下法
*slope*　傾き
*sparsity*　疎、希薄、まばら
*subscript*　下付き文字
*supervision*　＜教師あり＞、監督、管理
*target variable*　目的変数
*term*　項、条件
*theorem*　定理、原理、原則
*variable*　変数
*variance*　分散

##動詞その他##
*anneal*　鍛える
*approximate*　近づける、おおよそ〜になる
*assign*　割り当てる、配分する
*attribute*　に帰する、属性、特性
*auxiliary*　補助の、予備の
*bimodal*　二峰性の（凸が二つあるみたいな）
*comparable*　匹敵する、似通っている
*contractive*　収縮性のある
*converge*　集中する、収束する
*decipher*　解読する
*dense*　密な　⇔　sparse
*diagonal*　対角線の、斜線の
*discrete*　離散の
*disentangle*　もつれを解く、抜ける
*exclusive*　独占的な、専門的な、排他的な
*exponential*　指数の、急激な
*feed*　提供する、データを与える
*incorporate*　を含む、取り入れる
*latent*　潜在する、潜んだ
*lateral*　側面の、横からの
*linguistic*　言語の、語学上の
*lowercase*　小文字の
*manifold*　多数の、多種の
*multi-modal* 多峰性の、マルチモーダルの（別の属性の情報同士を組み合わせる方法。例：画像と音声）
*multiple*　並列の、多数の、複雑な、倍数の
*multiplicative*　増加する、乗数の
*multivariate*　多変量の
*mutual*　相互の、共通の
*omit*　除外する、しないでおく
*orthogonal*　直交する、直角の
*outperform*　上回る、凌ぐ
*over-represented*　大きな比率を占める
*overall*　全般の、総合的な
*pairwise*　対の
*polynomial*　多項式の
*posterior*　より後ろの、後の
*postulate*　仮定する
*propagate*　伝える、繁殖させる、遺伝させる
*real-valued*　実数の
*repel*　はじく
*scarce*　稀な、不足して、十分にない
*sparse*　疎な　⇔ dense
*stochastic*　確率的な、統計的な
*successive*　連続的な、継続的な
*upwards*　上流へ
社内ツールのAngularプロジェクトに導入したRedux (ngrx/store)

[【Angular、Vue.jsなど】マーケティング事業の開発現場でリアルに使われるJS事情](https://connpass.com/event/68449/)
(2017年11月2日)
発表資料

---

名前: ちきさん (野口智弘)
所属: オプト
GitHub/Twitter/Qiita: @ovrmrw

### We are hiring! :two_men_holding_hands::two_women_holding_hands:

---

### Q. 社内ツール？

### A. オプト社内で使われる依頼ツール

- 社内の誰かが、別の誰かに何らかの作業を依頼する。
- フォームの入力に応じてフォームが動的に変化する。(やばいやつ)
- 一つの依頼は即日完了するわけではないので、数日に渡り進捗状況などを管理する必要がある。
- 依頼に対してファイルを添付したり、依頼と別の依頼を関連付けたり、チェックリストが全てチェックされないと依頼を完了できないようにもできる。
- 依頼毎にSlackのようなチャット板があって関係者がコミュニケーションを取れるようになっている。

---

#### Slackでやれば良いのでは...？ :rolling_eyes:

---

そのへんのじじょうはまあいいとして、

- 機能が込み入っている関係で、一つの依頼状況を画面に表示するために10個のHTTPリクエストが走っていてコレハ。。。と思った。
- 例えば依頼No.100を表示した後、No.101を表示してからまたNo.100に戻ったとき、また10個のHTTPリクエストが走っていてヤハリ。。。と思った。
- (なにかそうさするたびにすごいりょうのリクエストがおくられているぞ！)

---

いくら社内（人口700人くらい）でしか使われないツールとはいえ、割り当てられた貧弱なAPIサーバーの処理が重くて 

**開発部しょぼいとか思われるのは癪なので** 

なんとかしないといけないと思った。

---

### そうだ、キャッシュすればいいんだ。 :star2:

---

#### HTTPリクエストの結果をキャッシュして、同じ結果になるリクエストを飛ばさないようにすれば、リクエストの数そのものを大幅に減らせるはずだ。 :zap:

---

(注: Webは基本的にステートレスな世界なのでキャッシュは安易に導入すると事故の元になります)

---

Angularでリクエストの結果をキャッシュしようと思ったら真っ先に候補に上がるのが、 **[ngrx/store](https://github.com/ngrx/platform)** というReduxをRxJSで再構築したライブラリ。(semi-official)

※ 主義主張には個人差があります ※

---

実際に出来上がったほぼキャッシュ目的のためだけのRedux

- Action ... 530行
- Reducer ... 370行
- Effects(Middleware) ... 610行

---

一つの依頼状況を表示するために叩くAPI一覧

- `/api/requests/100` ... 依頼No.100の詳細データを取得できる。この中にタイムスタンプ(最終更新日時)が含まれている。
- `/api/requests/100/attachments` ... 添付ファイル
- `/api/requests/100/checklists` ... チェックリスト
- `/api/requests/100/destinations` ... 関係者
- `/api/requests/100/inputs` ... カスタム入力フォーム **(こいつが地獄)**
- `/api/requests/100/links` ... 関連する依頼
- `/api/requests/100/media` ... メディア媒体
- `/api/requests/100/media/accounts` ... 媒体アカウント
- `/api/requests/100/results` ... 進捗(チャット)

(今後さらに増えるのでは？)

---

依頼にいくつものデータが紐付いてはいるが、どれかが追加変更されるとタイムスタンプも更新されるため、 

**タイムスタンプが変わっていなければ前回取得したデータをキャッシュして返しても差し支えない** 

ということになる。

---

なのでこうなった。

- `/api/requests/100` ... タイムスタンプを持っているので毎回リクエストして最新データを取得する。
- `/api/requests/100/attachments` ... リクエストする度に **依頼Noとタイムスタンプをキーにして** ReduxのStoreにデータを格納する。View(表示画面)はStoreから流れてくるキャッシュを受け取って表示する。
- `/api/requests/100/checklists` ... 　　〃
- `/api/requests/100/destinations` ... 　　〃
- `/api/requests/100/inputs` ... 　　〃
- `/api/requests/100/links` ... 　　〃
- `/api/requests/100/media` ... 　　〃
- `/api/requests/100/media/accounts` ... 　　〃
- `/api/requests/100/results` ... 　　〃

---

デモ
(大人の事情により外部への公開はできません)

---

ViewはStoreから流れてくるキャッシュを受けるだけ。自分から何かを取りに行くということはしない。(Observerパターン)

そして裏でこっそりキャッシュを更新している。

---

![TaskDriverのStore発表資料用の図.png](https://qiita-image-store.s3.amazonaws.com/0/74793/c86d4ab0-4677-108c-b3c9-ef7fad6f8447.png)

---

![TaskDriverのStore発表資料用の図 (1).png](https://qiita-image-store.s3.amazonaws.com/0/74793/b82fede1-ecc0-d6d3-349f-afe9ee063c4e.png)

---

![TaskDriverのStore発表資料用の図 (2).png](https://qiita-image-store.s3.amazonaws.com/0/74793/048bf9f2-9690-4e1f-e797-a6b024b3ce6a.png)

---

### リクエストの回数を大幅に減らし、事故らないキャッシュの仕組みを作ることができた。

---

### 社内でなんだか評判みたいで関わってた僕もうれしいです。 :tada:

---

#### Thanks :raised_hands_tone2:
Block chain consensus building mechanisms / ブロックチェーンのコンセンサス構築メカニズム

In my understanding, there are following block chain consensus building mechanisms.

### Proof of Work

It comes from the big amount of calculation work is needed for adding new node.
Confirming calculation is easier, but adding calculation is more difficult.

According to that reason, the participant who calculate much can get the floor, Proof of work.

Bit Coin, Mona Coin, Ethereum

### Proof of Stake

Participant who has the most coin can get the floor.
If he cheat, the amount of his coin decreases.

Peercoin, Blackcoin

### Social Network

When 80% of approvers approve the transaction, it gets confirmed.
Someone who wants to be recognized as an approver, has to be join the approver group. But the group is on approval system, and if the member is not trustworthy, then he will be expelled.

### Proof of Activity

This mechanism is composed of PoW and PoS.
The block generated by miner can't be used as it is, after getting confirmation by members who were chosen randomly among participants.

### Proof of Burn , Proof of Deposit

This mechanism is composed of PoW and PoS.

### Proof of Importance

NEM

### Proof of Stake Velocity

Makes use of social aspects, such as density of communications directed toward each of the nodes in the network.

Reddcoin

### Proof of Capacity

Burstcoin

### Proof of Reputation

## Proof of Work

I will show some explanation for proof of work.

A block contains hash value, some transaction data and nonce.

* hash value
* some transaction data
* nonce

### nonce

nonce is seed of next block hash value.
Work, calculation, is to detect the nonce.

#### Required condition

next hash value must have some zero from start, in terms of hexadecimal. normally, 16 zeros are required in BitCoin (but it varies according to the circumstance).

```
(example)
00000000000000000000fc1373684ddbba7385729485789456...
```

so miner have to discover specific nonce by mass calculation.
and if miner discovered the nonce, he can get coin. It is PoW.

This mass calculation requirement makes it difficult to falsify blocks.
If someone changes data in the block, he must change every nonce and hash of later. But it is impossible because of the difficulty of its calculation.
Firefoxのコールスタックに関する謎なふるまい

再帰がどのぐらいでコールスタックを使い果たすのか試していたら、Firefoxの謎なふるまいを発見したのでご報告。

```js
function f0(n) {
  try{
    return f0(n+1);
  }catch(e){
    return n;
  }
}
f0(0);
/*
10194
*/

function f1(n) {
  try{
    return Object.assign(f1)(n+1);
  }catch(e){
    return n;
  }
}
f1(0);
/*
25684
*/
```

`Object.assign()`でソースオブジェクトを指定していないので、元の関数をそのまま使ってるだけのはずなのに、スタックオーバーフローに強くなってる。
「もしかして余分な処理を挟むことによってウェイトが入ってその分メモリが回収されてる？」と思って、ループを挟むなどしてみたけど、あまり関係がないみたいだった。謎。
　
ちなみに、Chromeでは再現しなかった。

なお、思い出したようにFirefox121で試したところ、再現しなかった。
MacにCentos6.9環境を構築する



macにCentos環境を構築する(vagrantとvirtualBox設定)
 
- 以下からvagrantとvirtualBoxをインストール
[VirtualBox](https://www.virtualbox.org/)
[vagrant](https://www.vagrantup.com)
vagrantはvirtualbpxを簡単に扱うためのもの。
私の場合Vagrant 2.0.0とvirtualBOXは5.1を使用しています。


- ターミナルから作業する

```
- ホームディレクトリに移動
$ cd

- 今後複数の仮想マシンを作ることを想定して、それらをまとめるフォルダ（myVagrant）を作る
$mkdir myVagrant

- Vagrantに移動する
$cd myVagrant

- 仮想マシンを作るフォルダを作る（conoha）
$mkdir conoha

- 移動する
$cd conoha

- 仮想マシン設定用のVagrantfileを作る
$ vagrant init bento/centos-6.9

Vagrantfileが出来上がるので編集する(コピペで　OK)

- Vagrantfileを編集して仮想マシンのIPアドレスを192.168.33.10にする
$ sed -i '' -e 's/# config.vm.network "private_network", ip: "192.168.33.10"/config.vm.network "private_network", ip: "192.168.33.10"/' Vagrantfile

- 仮想マシンを起動する（少し時間かかかる）
$ vagrant up

- 仮想マシンの状態を確認する
$ vagrant status
=> running
となっていればOK!!

- ssh接続する
$ vagrant ssh
=> [vagrant@hogehoge~]みたくなってればOK


# OSを一気に最新状態にアップデート（時間かかります）
sudo yum -y update

# スクリプトを入手するためのgitをインストール
sudo yum -y install git

# gitを使ってアプリケーション設定用のスクリプトをダウンロード
git clone https://github.com/dotinstallres/centos6.git

# centos6フォルダができるのでそちらに移動
cd centos6

# スクリプトを実行（かなり時間かかります）
./run.sh  # 途中でいくつか赤いエラー文が出たりしますが、基本的に無視でいいようです。

# もろもろの設定を反映
exec $SHELL -l
```
OpenCV 3.2 -> 3.3.1 で追加されたモジュール

# OpenCV 3.2 -> 3.3.1で追加されたモジュール
https://qiita.com/advent-calendar/2017/opencv

「OpenCV Advent Calendarができてるけど、ネタがないなあ…」とお悩みの方向けに、追加モジュール表を作ってみましたり。

## 今年のおすすめ。
- jsモジュール ( JavaScript )
- dnn_modern ( なんだろこれ… )
- bioinspired ( OpenCL対応して早くなったらしい！ )

それ以外でも自分が触ったことのないものにこれを機会にチャレンジもありだと思います！

| OpenCV 3.3.1 ( 2017 ) | OpenCV 3.2 ( 2016 ) | 2016 Advent Calendar|
|-----+------+------|
calib3d |  |  | 
core |  |  | 
cudaarithm |  |  | 
cudabgsegm |  |  | 
cudacodec |  | cudacodecモジュールを使ってみよう | 
cudafeatures2d |  |  | 
cudafilters |  |  | 
cudaimgproc |  |  | 
cudalegacy |  |  | 
cudaobjdetect |  |  | 
cudaoptflow |  |  | 
cudastereo |  |  | 
cudawarping |  |  | 
cudev |  |  | 
dnn | ★(contribから移動) | OpenCV DNN moduleのiOSでの利用方法とその実行速度の比較 | 
features2d |  |  | 
flann |  |  | 
highgui |  |  | 
imgcodecs |  |  | 
imgproc |  |  | 
java |  |  | 
js | ★ |  | 
ml |  |  | 
objdetect |  |  | 
photo |  |  | 
python |  |  | 
shape |  |  | 
stitching |  |  | 
superres |  |  | 
ts |  |  | 
video |  |  | 
videoio |  |  | 
videostab |  |  | 
viz |  | Drawing Point Cloud retrieve from Kinect v2 using OpenCV Viz module | 
world |  |  | 

Contrib編

| OpenCV 3.3.1 ( 2017 ) | OpenCV 3.2 ( 2016 ) | 2016 Advent Calendar|
|-----+------+------|
aruco |  |  | 
bgsegm |  |  | 
bioinspired |  |  | 
ccalib |  |  | 
cnn_3dobj |  |  | 
cvv |  |  | 
datasets |  |  | 
dnn_modern | ★ |  | 
dnns_easily_fooled |  |  | 
dpm |  |  | 
face |  |  | 
freetype |  | freetype対応したまとめを(Harfbuzzも足したい！） | 
fuzzy |  |  | 
hdf |  |  | 
img_hash | ★ |  | 
line_descriptor |  |  | 
matlab |  |  | 
optflow |  |  | 
phase_unwrapping |  |  | 
plot |  |  | 
reg |  |  | 
rgbd |  |  | 
saliency |  | OpenCVで顕著性(Saliency)を求めてみる | 
sfm |  | OpenCV-3.1のsfmモジュール[前編] Visual Studioでビルドする | 
stereo |  |  | 
strucured_light |  |  | 
surface_matching |  |  | 
text |  |  | 
tracking |  |  | 
xfeatures2d |  |  | 
ximgproc |  |  | 
xobjdetect |  |  | 
xphoto |  |  |
Angularの状態管理について

# @ngrx/storeを使ってみた

---

# Angularを使ってみての感想

- 各コンポーネントで「状態」を持ててしまうので、管理が難しい。特に複数のコンポーネント間で状態を共有したい場合
- コンポーネント間でどうやって同期するのか？あるコンポーネトで更新した値を、別のコンポーネントで使いたい場合とか
- アプリケーションの「状態」を1つにまとめたい

---

# @ngrx/store

- AngularにReduxライクな「状態管理」を導入するためのツールのひとつ
- Angularチームも積極的にコミットしており、今後デファクトスタンダードになりうるかもしれないと言われている
- データの受け渡しにRxJSを使っており、Angularとの親和性も高い

---

# Reduxとは？

- 「状態」を管理するためのフレームワーク（Flux、Elmから影響を受けている）
- 「状態」は一つのプレーンなオブジェクトとして管理
- Action => Reducer => Storeの3構成
- 「状態」はStoreで管理し、更新の手段はActionの発火（Store#dispatchを呼ぶ）のみ
- 「状態」をどのように更新するかは、Reducerにより判別
- Reducerは副作用のない純粋な関数で書く

---

# Reduxとは？

図で見るとこんな感じ

![redux.gif](https://qiita-image-store.s3.amazonaws.com/0/3548/bd55464d-e137-d45b-c0ad-71be3b051140.gif)

---

# @ngrx/storeを使ってみて

- これまでも書いてきたReduxの書き方で一連の処理を書けるようになったので、Angularで迷うことが少なくなった
- 更新した状態をストリームとして直接コンポーネントで受け取れるのが嬉しい。（Reactの場合は、毎回バケツリレーが発生…）
- 役割がはっきりしているので、テストコードもパターン化して書ける（スピードアップ！）

---

# まとめ

- 詳細は[公式リポジトリ](https://github.com/ngrx/platform/blob/master/docs/store/README.md)で
- Savkinの状態管理理論を使うと良さそう
- 他に良い状態管理の方法があれば教えてください

---

# ご静聴ありがとうございました
opensslコマンドで自己証明書をいっぱつで作成する

openssl コマンドの `-subj` オプションを使うとインタラクティブに聞いてくる指定を省けて便利。

```bash
openssl req \
	-subj '/CN=common_name.example.com/O=ORGANIZATION/C=JP' \
	-x509 -nodes -days 365 -newkey rsa:2048 \
	-keyout /etc/ssl/private/apache-selfsigned.key \
	-out /etc/ssl/certs/apache-selfsigned.crt
```
Docker100本ノック Dockerレジストリを利用する(EC2 Container Registry)


前回の記事
[Docker(compose)初学者が困ったときに約立つコマンド集](https://qiita.com/ryurock/items/d1372e9b4d561343a308)

でDocker環境が出来上がりました。
メンバーと共同で開発するのでDockerイメージの配布方法について考えなければなりません。

最初はdocker-{プロエジェクト名}のリポジトリからREADMEでこれ実行してね。
と配布したのですが、docker何それ？美味しいの？人だと億劫さを感じるかもしれません。
**もっとスマートな方法ないかなぁ** と思っていたら、

**あ、AWSつかってるから[ECR(EC2 Container Registry)](https://aws.amazon.com/jp/ecr/)
あるじゃん** 
と思い、プロジェクトメンバーには

```
docker-compose pull
docker-compose up -d
```

だけで環境を持ってこれる世界を作ったときのメモになります。

## 対象者

* まだDockerを触り始めた方
* [今から始めるDocker初心者にお届けするDockerの始め方](https://qiita.com/ryurock/items/c0515a4a9dcb3dd44d3b)でDockerに興味をもたれた方

## 環境

* MacOSX ElCapitan (HostOS)
    * 10.11.6
* Docker for Mac


## 事前準備に必要なもの

* [AWS CLI](https://aws.amazon.com/jp/cli/)
  * 入っていない人は何も考えずに ``` pip install awscli ``` と打とう。
  * ECRが比較的新しいサービスの為コマンドを打っていてそんなオプションがないとエラーがかえってきたら ``` pip install awscli --upgrade ``` を実行してみてください


## Dockerレジストリとは？

コンテナのイメージを保存できるものです。
有名なのは[Docker Hub](https://hub.docker.com/)ですね。
ただ自分の場合は

* すでにAWSを使っている。
* 試験段階でまだDockerHubに課金するほど、使い切れる自信はない
* ~~Dockerを導入するために上長を口説き落とすのが面倒~~

なので今回は[ECR(EC2 Container Registry)](https://aws.amazon.com/jp/ecr/)を使ってDockerレジストリを試してみました。


## ECRの料金について

[ECR料金](https://aws.amazon.com/jp/ecr/pricing/)

350TB 使っても月額0.050$なのでDockerレジストリだけなら気軽に使えそうです。

では試してみましょう
  
## ECSサービスに行く

図のようにリポジトリからリポジトリの作成を押しましょう

![ECSトップ](https://raw.githubusercontent.com/ryurock/qiita_images/master/ECS1.png)

## リポジトリを作る

![ECSリポジトリ作成画面](https://raw.githubusercontent.com/ryurock/qiita_images/master/ECS2.png)



自分はRailsの環境のイメージなので

```
{プロジェクト名}-rails
```

みたいな感じででつけました。

## Dockerイメージのレジストリのpush方法を見る

![ECR push方法](https://raw.githubusercontent.com/ryurock/qiita_images/master/ECS3.png)

このようにECRのイメージのpush方法が出てきます。
これの通りにやるだけです。

一点だけ注意が必要でawscliが古いとエラーになります。
(ちょっとどのバージョンからエラーとかは調べていません。)

エラーが出た方はawscliをアップグレードしておきましょう。

```
pip install awscli --upgrade
```

## Pushしたら反映されているか確認

Dockerイメージをpushするとこんな感じになります

![ECR push](https://raw.githubusercontent.com/ryurock/qiita_images/master/ECS4.png)

反映されているのがわかりますね。


## Docker-composeに記載する

あとは使っているdocker-composeにこんな風に記載するだけです。


```docker-compose.yml
version: '3'

services:
  rails:
    image: "xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/{リポジトリ名}:latest"
  mysql:
    image: "xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/{リポジトリ名}:latest"
```


上記のようにimageをECRのURIに設定した後に


```
docker-compose pull
docker-compose up
```

とすればイメージの最新を取得してコンテナのイメージが最新で起動します。
この2つのコマンドならDocker何それおいしいの？って方にも億劫にならずに始められそうです。

## 最後に

新しいものを導入するには相手方に億劫さを感じさせると全体導入までに合意形成が取れずに
断念しがちです。

自分は楽しいけども、相手が面倒にさせることは極力避けていきましょう。
以上100本ノック(何本目だっけ?)でした。mm
Python3のcsvライブラリで使うエンコーディング明示

Python3のcsvライブラリを使ってCSVファイルを読み書きする際，一般にはUTF-8(Unicode)が推奨されている模様．

しかしopen関数をそのまま利用した場合，CSVファイルの文字コードがUTF-8だと怒られる場合がある．
僕の環境ではShift-JISが正解で，文字コードを変えたら読んでくれた．

#読み込みに使ったコード
CSVファイルの中身を読み取って，1行ずつ表示するだけ．
先頭行が紛らわしいが，ソースコードの文字コードをUTF-8と明示している．

```python3:readCSV.py
# -*- coding: utf-8 -*-
import csv

# with文：中の処理が終われば自動でclose処理も行う
with open('book1.csv', 'r') as f:
	reader = csv.reader(f)
	for row in reader:
		print(row)
```

#CSVファイル（Excel2016で作成）
book1.csv
![csv文字コード.jpg](https://qiita-image-store.s3.amazonaws.com/0/201962/a4ca10a7-9d0a-5d98-d7d1-4d18b144d852.jpeg)

Excel2016でcsvを保存する時，選択する形式がCSV UTF-8(コンマ区切り)だとUnicodeテキストに，CSV(コンマ区切り)だとShift-JISになった．

UTF-8のCSVをPython3で読み込もうとすると怒られる．

```
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence
```

逆にShift-JISは読み込める．

```
['番号', '名前', '個数']
['1', 'りんご', '3']
['2', 'みかん', '6']
['3', 'ぶどう', '4']
```

#文字コードに関する記述
公式には書いてあったが，具体例まで見ないとわかりにくい印象がある．
>[Python 3.6.3 ドキュメント 14.1. csv ― CSV ファイルの読み書き](https://docs.python.jp/3/library/csv.html)
####14.1.5. 使用例
open() が CSV ファイルの読み込みに使われるため、ファイルはデフォルトではシステムのデフォルトエンコーディングでユニコード文字列にデコードされます (locale.getpreferredencoding() を参照)。他のエンコーディングを用いてデコードするには、open の引数 encoding を設定して、以下のようにします:
```
import csv
with open('some.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
```

恐らくこのデフォルトエンコーディングが原因で，僕の環境ではShift-JISだったということだろうか．

ドキュメントの通りにencoding='utf-8'を明示すると，UTF-8のCSVファイルも読んでくれた．
Windows7 64bit 環境で Vagrant を 2.0.0 にバージョンを上げると vagrant up できなくなる 場合の解決方法

## 解決方法: PowerShell のバージョンを上げろ
[PowerShell 5 にバージョンアップすればいけるらしい](https://github.com/hashicorp/vagrant/issues/8783#issuecomment-324915780)ので、素直にバージョンを上げましょう。

Chocolatey を使っている方は、 [`choco install -y powershell` でインストールする](https://chocolatey.org/packages/PowerShell)のがてっとりばやいです。

Chocolatey を使っていないかたは、 [Windows Management Framework 5.1](https://www.microsoft.com/en-us/download/details.aspx?id=54616)あたりをいれてください。PowerShell 5.1 がインストールされます。

## バグ報告の ISSUE
["Vagrant up" hangs on windows 7. Due to powershell? #8783](https://github.com/hashicorp/vagrant/issues/8783)

これ見てる感じ、 Vagrant 1.9.6 以降で発生するみたいですね。

## ハングアップする箇所
`vagrant up --debug` すると、デバッグ用のログを出力してくれるので、それを眺めてみるのも一興です。

> INFO subprocess: Starting process: ["C:\\Windows\\System32\\WindowsPowerShell\\v1.0/powershell.EXE", "-NoLogo", "-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-Command", "$PSVersionTable.PSVersion.Major"]
> INFO subprocess: Command not in installer, restoring original environment...
>DEBUG subprocess: Selecting on IO
>DEBUG subprocess: stdout: 2

やはり、 PowerShell が原因のようにみえますねー。
MetroWindowにBehaviorを加えると崩壊する

MahAppsのMetroWindowでアプリを作っていて、突然MetroWindowのデザインが崩れることがあったので、その対処方法です。

2017/04/16 追記
***この問題はMahApps.Metro v1.6以降は解決しています。***

#前置き
MahAppsとMaterial Design In XAML ToolkitはWPFで簡単に見た目をカッコ良くするライブラリです。
上記2つの基本的な説明は
[Material Design In XAML Toolkitでお手軽にWPFアプリを美しく](http://neue.cc/2015/09/10_515.html)
[WPF 「MahApps.Metro」を使ってWPFアプリケーションをModernUIにしてみる](https://qiita.com/kabosu/items/11fa400bdd82395f59fb)
等をご参考にしてください。

#問題発生
MetroWindowを継承して作ったMainWindowにBehaviorを加えると、デザインが崩れてしまいます。
![スクリーンショット 2017-11-02 18.55.23.png](https://qiita-image-store.s3.amazonaws.com/0/120077/a1e748bf-ba78-77ec-b125-415217a7675d.png)

↓
![スクリーンショット 2017-11-02 18.59.06.png](https://qiita-image-store.s3.amazonaws.com/0/120077/ca4be030-db3f-ec6b-f77b-ef3535ca8466.png)

MetroWindowの一番の特徴のWindowのタイトルバーが2重になってしまっています。

下記コードのBehavior部分を入れると問題が発生します。
Behaviorの中身はなんでもいいです。

```xml:MainWindow.xaml
<mahApps:MetroWindow
    x:Class="MetroErrorTest.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:mahApps="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
    Title="MetroWindow"
    Width="300"  Height="200">
    <!--  何かBehaviorを足すとデザインが崩れる  -->
    <i:Interaction.Behaviors>
        <ei:DataStateBehavior />
    </i:Interaction.Behaviors>
    <Grid>
        <Button Content="Button1" />
    </Grid>
</mahApps:MetroWindow>
```

#対処方法
https://github.com/MahApps/MahApps.Metro/issues/1760
によると、MetroWindowで元々定義されていたBehaviorが上書きされてしまうことが原因のようだ。
というわけで、以下の通りに変更。
これで最初と同じ状態に戻った。

```xml:MainWindow.xaml
<mahApps:MetroWindow
    x:Class="MetroErrorTest.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Behaviours="http://metro.mahapps.com/winfx/xaml/shared"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:mahApps="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
    Title="MetroWindow"
    Width="300"
    Height="200">
    <!--  MetroWindowのBehaviorを加えるとデザインが崩れない  -->
    <i:Interaction.Behaviors>
        <ei:DataStateBehavior />
        <Behaviours:BorderlessWindowBehavior />
        <Behaviours:WindowsSettingBehaviour />
        <Behaviours:GlowWindowBehavior />
    </i:Interaction.Behaviors>
    <Grid>
        <Button Content="Button1" />
    </Grid>
</mahApps:MetroWindow>
```

#環境
VisualStudio2017
.NET Framework 4.6
C#6
Material Design In XAML Toolkit 2.3.0.823
MahApps.Metro 1.5
現在のページにjQuery(3.2.1)を追加するブックマークレット


jQueryを使用したオリジナルJSを動かしたいときとかに活躍するかもしれないです。
動きとしてはそのページの`<title>`タグ直下に`<script>`タグを追加しています。

```js
javascript:ga=document.createElement('script');ga.type = 'text/javascript';ga.src='//ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js';s=document.getElementsByTagName('title')[0];s.parentNode.insertBefore(ga,s.nextSibling);
```

アドレス部分を変えたら読み込むjsとか変えられるかなと・・・。
（Chromeとかだと一回適当にブックマークを保存してから編集でコピペしたら行けるかと思います。）
For loop in PostgreSQL Stored Function

index incrementing for loop in PLpg/SQL is very similar to for loop in Ruby.

## For Loop in PL/pgSQL

```
FOR I IN 1..10 LOOP
  -- Process
END LOOP;
```

## For Loop in Ruby

```
for i in 1..10
  # process
end
```

Easy to memorize.

Regarding to CURSOR in PLpg/SQL, it is also similar.

```
FOR CR IN C LOOP
  RAISE NOTICE '%', CR.id;
END LOOP;
```

You can see PLpg/SQL similar loop pattern in `CURSOR` loop.

```
FOR xx IN xx LOOP
  --
END LOOP;
```
Alt+Tab を押さないとダイアログボックスが表示されない場合の対処法

# はじめに
C# で Windows アプリケーションを作っているとき（つまり、今である…（;´д｀)トホホ）に、ダイアログボックスが上手く表示されない現象が発生し、その対応策を見つけるまでにしばらく時間を費やしてしまいました。ネットで検索するも、そのものずばりの解決策を探し出すのに意外と手間取りましたので、ここに解決策を記しておきます。

ちなみに、Owner の指定は**もちろん**しています。それでも何故か各種ダイアログボックスが上手く表示されなかったので、困ってしまっていた状況です。

# 現象
SaveFileDialog で上書き確認を有効にしている状況で、ファイルの上書きを実施する場合、本当に上書きするのか？といった確認ダイアログが表示されます。私が遭遇した現象は、なぜか、この確認ダイアログボックスが正常に表示されない、といったものです。ちなみに実験のため、自前でファイルチェックを行い、既存のファイルが存在する場合に MessageBox を表示しようとしても、まったく同様の状況となりました。

正常に表示されない件について、もう少し詳しく説明します。該当のメッセージボックスは全く表示されません。これは他のフォームの下になっているとかではありません。そもそも表示されていません。この状況の時に Alt+Tab を何度か押下すると、表示されていなかったダイアログボックスが表示されるようになるのですが、フォームがダイアログボックスを覆い隠す状況でなくとも、ダイアログボックスが表示されないことが確認できていますので、全く表示されていない、ことが確認できます。

SaveFileDialog の場合、警告音は鳴ります。そして、MessageBox を呼び出しているフォームは一切操作することはできない状況に陥ります。このような一切操作できない状態にて、何度か Alt+Tab キーを押下すると、ダイアログボックスが最前面に表示されるようになり、それ以降は正常に機能する、という状況です。

# 原因と解決方法
原因は、ダイアログボックスを呼び出しているフォーム（もしくは、そのフォーム上にあるコンポーネント）におけるオーナードローでした。以下のページ（英語ですが…）に、まさにそのことが書いてあります。

[Modal common dialog not showing until pressing the alt key](https://stackoverflow.com/questions/4261162/modal-common-dialog-not-showing-until-pressing-the-alt-key)

同様の現象に遭遇した方は、まず、独自の描画（＝オーナードロー）を行っていないかどうかを確認してみましょう。もし、オーナードローを行っているのであれば、そのコンポーネントの　Visible を false に設定し、SaveFileDialog を Show する等してみましょう。問題が解消するかもしれません（もちろん、ダイアログの表示が終わったら、該当コンポーネントの Visible を true に戻すことを忘れないようにしましょう）。

# おわりに
久しぶりに C# で Windows アプリを作ったら、妙なところでハマってしまました。同様の現象で困っている方々に対し、少しでも問題解決のヒントにでもなれば幸いです。