OmniAICreator/Qiita-1.07M huggingface dataset:
【FileMaker】アンケートをコンバセーショナルフォームで提供する

よく、一問一答形式でアンケートに答えるサイトがあるのですが、こういうのを[コンバセーショナルフォーム](https://ferret-plus.com/7694?utm_content=buffer530b9&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer)というそうです。
初めて知りました。
でも、某ショッピングモールなどではよく見かけますね。
今回は、このような一問一答形式のアンケートをFileMakerで実装してみたいと思います。

質問ごとにプルダウンやラジオボタンなどを使うのはもうちょっと高度なので、今回は単にテキストで回答を進めていくことにします。

# 動き
動きを見ていきましょう。

まずは、質問を準備です。
![CONV1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/00d6ed21-5a0c-ba17-a3f0-9391f36c6885.png)
質問は、単純に答えられるものを用意しました。

最初のページを表示すると、何件の質問があるかを明示しています。
![CONV2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/6a9c2e14-48bb-02e8-6479-004c6735b93c.png)
この件数の表示があることで、回答をする人は、「いつまで質問が続くのか？」という心配がなくなりますね。

スターとボタンを押すと、１ページに１つの質問がでます。
![CONV3.png](https://qiita-image-store.s3.amazonaws.com/0/60538/53d62e96-229f-83b4-c0e5-871111a3797b.png)
回答が終わったら、「次へ」ボタンでさくさくと４つの質問に答えていきます。

最後は、Thank youページが出ます。
![CONV7.png](https://qiita-image-store.s3.amazonaws.com/0/60538/814d322a-dc8b-8196-119d-f167e1f36389.png)

実際に入力されたデータを見てみましょう。
![CONV8.png](https://qiita-image-store.s3.amazonaws.com/0/60538/f06b0164-33c5-08d5-623c-9c90005de529.png)
回答idは、回答をしてくれた人の数になります。
今回は３人が回答してくれたようですね。

これを集計してみます。
![CONV9.png](https://qiita-image-store.s3.amazonaws.com/0/60538/5318fb3d-dc01-56b7-81e5-9b0607ca538f.png)
なるほど、年齢に幅がありますね。なんてね。集計結果を眺めたりします。
その他、グラフを作成して見える化をはかるのもいいと思いますが、今回はテーマから外れてしまうのでやりません。

# 実装
では、実装をしていきましょう。

今回は、3つのテーブルを用意しています。
![CONV13.png](https://qiita-image-store.s3.amazonaws.com/0/60538/7c18ef81-6262-cf2e-ba03-b02bcf029265.png)
図のコメントにも書いていますが、通常の人の動きになぞらえると、
(1)コンバセーショナルフォームという原本から、コンバセーショナル回答テンポラリという用紙にコピー
(2)コピーした質問用紙に回答を書き込む
(3)回答が終わったデータを、コンバセーショナル回答というファイルに保存する
というところでしょうか。

こういう動きを、FileMakerで実装することになります。

## テーブル設計

今回は、質問idがわかったら、質問内容をコンバセーショナルフォームからコピーするために、ルックアップという機能を使います。
コードを書くのは、一つでも少ない方がいいですからね。
設定で済むことは、設定にお任せしましょう。

コンバセーショナル回答テンポラリの設定を例にとります。
これは、コンバセーショナル回答の設定もおなじようにします。
![CONV16.png](https://qiita-image-store.s3.amazonaws.com/0/60538/d7d3dfe4-87cb-19fb-3fa8-c1f30db0969d.png)
なぜルックアップで質問内容を持ってこれるかというと、先に提示したリレーションシップで、質問idを紐づけているからです。
これがないと、ルックアップできませんから、あらかじめリレーションシップはしっかりと張っておきましょう。

最初の画面で質問件数を出していますので、集計の設定を使います。
![CONV15.png](https://qiita-image-store.s3.amazonaws.com/0/60538/0c6efe64-9315-6e9a-e8fc-3b6f606c4638.png)

## スクリプト
スクリプトをいくつか書きます。

### 質問件数
最初の画面表示用です。
![CONV10.png](https://qiita-image-store.s3.amazonaws.com/0/60538/6ed420d4-3ff8-fd47-4e5f-d06aa4ce47ea.png)
このスクリプトを、レイアウトが表示するときにグローバル変数に設定して表示できるように、スクリプトトリガに指定します。
グローバルフィールドで実装してもいいのですが、将来的にカテゴリの違う質問を出すことを考えて、スクリプト化しておき、フィールド設定を極力変えないような設計にしてみました。
この辺は、作る人の好みですかね。

### スタートボタン
スタートボタンが押されたら、質問内容をテンポラリにコピーして回答の準備を行います。
![CONV11.png](https://qiita-image-store.s3.amazonaws.com/0/60538/82d67ee9-c916-d669-e925-de64e0bd96c8.png)

### 次へボタン
次へボタンが押されたら、次の質問へいきます。
もし、最終ページだったら、テンポラリの回答を、コンバセーショナル回答に保存します。
![CONV12.png](https://qiita-image-store.s3.amazonaws.com/0/60538/f26d7d82-f29d-100d-f504-8ba64eff5b02.png)

# 作るレイアウトを最小限に
質問数ごとにレイアウトを作るのは、はっきり言って手間だし、メンテナンスが大変ですよね。
ですので、なるべく少ないレイアウトで済むように設計してみてください。

今回は、単純に手入力の回答ですが、回答方法が違うとユーザが答えやすく、集計する人が集計しやすくなりますので、レイアウトをどう少なくかつやりやすくするかがキモになると思います。

では、楽しいFileMakerライフを！
ローカルのCSVをGoogleSpreadSheetに上げる

ローカルにあるCSVのデータをGoogleSpreadSheetに
そっくりあげたかったので、そのためのスクリプトを作った。

以下、導入の簡単な説明とサンプルのスクリプト

## GoogleSheetsAPIをONにする

ここを参考に
https://developers.google.com/sheets/api/quickstart/python#step_1_turn_on_the_api_name

## GoogleClientLibraryをインストールする

ここを参考に
https://developers.google.com/sheets/api/quickstart/python#step_2_install_the_google_client_library

## 認証用の関数を作る

ここの`get_credentials`をそのまま
https://developers.google.com/sheets/api/quickstart/python#step_3_set_up_the_sample

ただし`SCOPE`に関しては、編集を行うので次に変更`https://www.googleapis.com/auth/drive`

## サンプル
- CSVファイルを取得して行ごとに要素にして、リストにまとめる関数

```python
def csv2rows(csv_name):
    df = pd.read_csv(csv_name, index_col=False)
    rows = []
    for index, row in df.iterrows():
        values = []
        for c in row:
            values.append({'userEnteredValue': {'stringValue': str(c)}})
        rows.append({'values': values})
    return rows
```

- csvファイルを取得して、スプレッドシートにあげる

```python
sheet_index = 1
requests = []

rows =  csv2rows('aaa.csv', header=None)
sheet_title = 'aaa'
sheet_id = sheet_index
requests.append(
    { # シートの作成
      'addSheet': {
        'properties': {
          'title': sheet_title,
          'index': 0,
          'sheetId': sheet_id
        }
      }
    }
)
requests.append(
    { # 作成したシートを取得したcsvの内容でupdate
        'updateCells': {
          'start': {
            'sheetId': sheet_id,
            'rowIndex': 0,
            'columnIndex': 0
          },
          'rows': rows,
          'fields': 'userEnteredValue'
        }
    }
)

credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
discoveryUrl = ('https://sheets.googleapis.com/$discovery/rest?version=v4')
service = discovery.build('sheets', 'v4', http=http, discoveryServiceUrl=discoveryUrl)

spreadsheet_id = '${任意のSpreadSheetId}'

batch_update_spreadsheet_request_body = {
  'requests': requests
}

# リクエストの実行
result = service.spreadsheets() \
                          .batchUpdate(spreadsheetId=spreadsheet_id, body=batch_update_spreadsheet_request_body) \
                          .execute()
```
IPアドレスの固定とIPv6の有効化

# はじめに
RaspberryPiを使用して，ローカルのIPを固定とIPv6を使用しなければいけない事情ができてしまったので下に書く
RaspberryPiをサーバなどに使用する人にとっては通らなければいけない部分である

# IPアドレスの固定
/etc/dhcpcd.confの中身の末尾に以下のようなIPを固定する設定を記述

```
interface eth0
static ip_address=192.168.1.22
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
```

# IPv6の有効化
Raspberry PiはデフォルトではIPv6が有効化されていない
/etc/modprobe.d/ipv6.confの中身を編集する
`alias net-pf-10 off`の文章をコメントアウト（先頭に#をつける）
【AWS】EC2スナップショットの手動復元手順

#前提
- スナップショット取得済み

#手順
1.AWSコンソールにログインする。


2.現状（復元前）のボリューム情報を確認する。
>[サービス]⇒[EC2]⇒[ボリューム]⇒ボリュームを選択⇒[説明]タブ
>サイズ、ボリュームタイプ、アベイラビリティゾーンの3つを確認する。
![21.png](https://qiita-image-store.s3.amazonaws.com/0/168635/8ee576c0-8232-491e-7133-1d6370eb43db.png)


3.スナップショットからボリュームを作成する。
>[サービス]⇒[EC2]⇒[スナップショット]⇒スナップショットを選択⇒[アクション]⇒[ボリュームの作成]
![20.png](https://qiita-image-store.s3.amazonaws.com/0/168635/d0da29b6-2ca7-25c1-6eb5-ad282a2b399e.png)


4.ボリュームの情報を入力し、[作成]する。
>3.で確認した、サイズ、ボリュームタイプ、アベイラビリティゾーンと同じものにする。
![08.png](https://qiita-image-store.s3.amazonaws.com/0/168635/dc67237e-9495-bdfc-f329-dcb6238f7799.png)


5.ボリュームが作成されたことを確認する。
>[サービス]⇒[EC2]⇒[ボリューム]
>※状態が[available]になっていること。
![09.png](https://qiita-image-store.s3.amazonaws.com/0/168635/caee03c3-6d5f-2ac4-1ab8-7c78ff8b03f0.png)


6.インスタンスを停止する。（[インスタンスの状態]が>stoppedになっていることを確認する。）
>[サービス]⇒[EC2]⇒[インスタンス]⇒インスタンスを選択⇒[アクション]⇒[インスタンスの状態]⇒[停止]
![10.png](https://qiita-image-store.s3.amazonaws.com/0/168635/d615c39a-ca8e-d5c5-79af-b1f38dca1502.png)


7.ボリュームのデタッチをする。
>[サービス]⇒[EC2]⇒[ボリューム]⇒ボリュームを選択⇒[アクション]⇒[ボリュームのデタッチ]
![11.png](https://qiita-image-store.s3.amazonaws.com/0/168635/0a86835f-83f5-8287-a80a-228bc375cb6c.png)


8.最終確認をし、問題がなければ[デタッチする]
![12.png](https://qiita-image-store.s3.amazonaws.com/0/168635/52b05a0b-6603-84c5-63d3-e5b2342022cc.png)


9.デタッチされたか確認する。
>[状態]が[available]、[アタッチ済み情報]が空欄であること。
![13.png](https://qiita-image-store.s3.amazonaws.com/0/168635/01c3abe5-c4f9-e67d-8d8f-fbb953097c36.png)


10.アタッチするサーバーのルートデバイスを確認する。
>[サービス]⇒[EC2]⇒[インスタンス]⇒インスタンスを選択⇒[説明]
![device.png](https://qiita-image-store.s3.amazonaws.com/0/168635/1f0276f6-28c2-9cde-9e8e-7be357cd667a.png)


11.スナップショットから作成したボリュームをアタッチする。
>手順4.で作成したボリュームをアタッチする。
>[サービス]⇒[ボリューム]⇒ボリュームの選択⇒[アクション]⇒[ボリュームのアタッチ]
![14.png](https://qiita-image-store.s3.amazonaws.com/0/168635/f3e82c0b-44dd-721e-c8f1-235c1117aafc.png)


12.アタッチするインスタンスとデバイスの設定をし、[アタッチ]する。
>インスタンス：アタッチするサーバー
>デバイス：手順⑩で確認したデバイス（例：/dev/sda1）
![15.png](https://qiita-image-store.s3.amazonaws.com/0/168635/d0d9d50e-1142-56f8-b81b-fbf0598d084d.png)


13.アタッチされたか確認する。
>[サービス]⇒[EC2]⇒[ボリューム]
>[状態]が[in use]になっていること。
![17.png](https://qiita-image-store.s3.amazonaws.com/0/168635/3f1ce88d-3e26-faa0-b688-47e5df8f2f28.png)


14.インスタンスの起動
>[サービス]⇒[EC2]⇒[インスタンス]⇒インスタンス選択⇒[アクション]⇒[インスタンスの状態]⇒[開始]
![18.png](https://qiita-image-store.s3.amazonaws.com/0/168635/285f09df-90c6-13ab-8e61-2857a9b00ac9.png)


15.インスタンスの開始
[開始する]を押下する。
![19.png](https://qiita-image-store.s3.amazonaws.com/0/168635/20b8819d-a1a6-8b80-79a0-c97064abe695.png)


16.動作確認を行い、問題がなければ完了。
>・サーバーにログインが可能か
>・公開している機能（Webページ等）が正常か
MavenビルドしてたプロジェクトをAntでビルドできるようにした話

# はじめに
去年、好きに作って良いと言われたので、いつもどおりMavenプロジェクト作ってMavenビルドしていた仕事で、
客先に引き渡す前のリーダーチェックで、
「Mavenとかよく判らんし、インターネットからよく判らない手続きで依存ファイルを落とされるの嫌だ。
リテラシー低い人間に合わせてくれ。」
と、言われたので、イラっとしながらAntビルドできるようにしたときのTIPSです。

# ソース
最新のものは、Gistに乗っけてます。
https://gist.github.com/sh-ogawa/d74fd3b7d47169a1f2f64a6bcf6c6f45

```xml:build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="!!input-project-name!!" default="build" basedir=".">
  
  <property file="build.properties" />
  
  <path id="class.path">
    <fileset dir="${libDir}">
      <include name="**/*.jar" />
    </fileset>
  </path>
  
  <target name="build" depends="clean,compile,jar" />
  
  <target name="clean">
    <delete dir="${destDir}" />
    <mkdir dir="${destDir}"/>
    <mkdir dir="${destDir}/classes"/>
  </target>
  
  <target name="compile"
    description="ソースコードのコンパイルをします">
    <javac 
      srcdir="${srcDir}"
      destdir="${destDir}/classes"
      deprecation="${javac.deprecation}"
      debug="${javac.debug}"
      optimize="${javac.optimize}"
      encoding="${javac.encoding}"
      source="${javac.source}"
      target="${javac.target}"
      classpathref="class.path"
      includeantruntime="false" />
       
    <copy
      todir="${destDir}/classes"
      preservelastmodified="yes" >
       
      <fileset dir="${resourceDir}">
        <include name="**/*" />
      </fileset>
    </copy> 
  </target>
   
  <target name="jar">
    <jar jarfile="${destDir}/${ant.project.name}.jar">
      <zipgroupfileset dir="${libDir}" includes="*.jar" />
      <manifest>
        <attribute name="Main-Class" value="tools.main.Main" />
      </manifest>
      <fileset dir="${destDir}/classes">
      </fileset>
    </jar>
  </target>
</project>
```

```properties:build.properties
##
# dir setting (build.xml の basedir からの相対指定)
##
srcDir=./src/main/java
resourceDir=./src/main/resources
destDir=./ant/bin/
libDir=./ant/lib/

##
# javac setting
##
javac.debug=on
javac.deprecation=on
javac.optimize=off
javac.encoding=UTF-8
javac.target=8
javac.source=8
```

# 準備
* build.propertiesはプロジェクトに応じて書き換えてください
* jarを作る限りはbuild.xmlは原則、修正する必要はないです<BR>
※WEBアプリをビルドする場合は要修正

# 使い方
* maven-dependency-pluginを使って依存しているJARファイルを以下にコピーする

> /project-root/ant/lib
 
コマンド書くとこんな感じ
> mvn dependency:copy-dependencies -DoutputDirectory=ant/lib

* antビルドする

> ant -f build.xml

そうすると、以下にパッケージングしたjarファイルができる

> /project-root/ant/bin

# 最後に
Mavenなど、依存関係を自動解決してくれるツールを使えない人は、build.xmlも書けない人が多いので、
いい加減Antビルドするプロジェクトは無くなって欲しいです。
※前職での話です。
vimからVisual Studio Codeへの乗り換え方【Mac】

## 概要
リモートの環境で開発するときにイヤイヤながらもvimで開発している人は
日本だけでも5万人いるらしいです。:confounded:__（適当）__

そんな人向けにGUIのエディタを使ってリモートで開発できる方法を公開します。

要は、__ローカル（Visual Studio Code）からリモートの環境をいじる__

### 環境
OS:Mac
[sshfs](http://qiita.com/zwirky/items/8bbebf01f99078d392dc)
[Visual Studio Code](https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)

### 手順
#### 1.sshfsの準備
まずはsshfsを導入します。
[この記事](http://qiita.com/zwirky/items/8bbebf01f99078d392dc)を参考にして導入してください。
読んで理解したとは思いますが、
導入した後に
下記コマンドでリモートのディレクトリをローカルのHogehogeディレクトリにマウントできるようになります。

```
sshfs [username]@[domain]:/path/to/dir/ Hogehoge
```

僕はいつも下記コマンドを打ちます。

```
sshfs -o follow_symlinks [username]@[domain]:/ Hogehoge
```
これでルート直下をそのままマウントするようにしているのと
デフォルトではマウント元のシンボリックリンクが動かないので
__-o follow_symlinks__をつけてシンボリックリンクを追うようにしています。

#### 2.Visual Studio Codeの準備
ダウンロードをしていない方は
[Visual Studio Code公式](https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)からダウンロードしてください

エディタをもっと便利にするためのおすすめ拡張機能は[ここから](http://qiita.com/EbXpJ6bp/items/4b87a092a3d6a0ecf595)

VScodeでマウントしたリモートのファイルを開けばローカルで編集できる環境の構築完了です。

ただし、タイトルの通り今回のゴールはそこではありません。
vimから乗り換えてこそゴールです。

#### 3.ターミナルからVScodeを開けるようにする
vimでファイルを開くときこうしますよね？？

```
vim hoge.txt
```

これを　VScodeでこんな感じで開きたくないですか？

```
code hoge.txt
```

__実現できます!!__:clap:

[この記事](http://qiita.com/dz_/items/5a6e3813cf42b8d17fbf)を参考にして導入してください。

そうするとこんな感じでファイルを開いたり出来ます。
![スクリーンショット 2017-07-21 17.24.24.png](https://qiita-image-store.s3.amazonaws.com/0/109713/7233af67-11ef-97a6-c6b5-51c9d2cbf498.png)

ちなみに下記のようにコマンドを打つと
ディレクトリごと開けます！

```
code .
```

### 最後に
快適なGUIライフを♬
[JS初心者]#4 セレクタAPI編 JavaScriptを学ぶ

# [JS初心者]#4 セレクタAPI編 JavaScriptを学ぶ

## セレクタ（selector）とは？

スタイルを適用する対象のことです。
たとえば、下記で言うと、

```html
<style>
.color-red {
  color: red;
}
</style>

<div class='color-red'>hoge</div>
```
divは要素名、colorがプロパティ名、となります。

## セレクタAPIとは？

指定されたセレクタに対してDOMを取得できるAPIのことです。

```html
<style>
.color-red {
  color: red;
}
</style>

<div class='color-red'>hoge</div>
```

これで、このdivに対して指定したいときは、
div.color-red
とすれば、指定することができます。

| メソッド名   |       意味 |
|:-----------------|:-----------------|
|querySelectorAll(selectors) | 指定されたselectorsに合った文書中の全ての要素をリスト形式で返却| 
|querySelector(selectors) |指定されたselectorsに合った文書中の最初の要素を返却 | 

- querySelector(selectors)

```HTML
<div class='fuga'>fuga</div>
<div>fuga</div>
<script>
window.onload = function() {
  var divElement = document.querySelector('div.fuga');
  window.alert(divElement.innerHTML);
}
</script> 
```

fugaが出てくると思います。

- querySelectorAll(selectors)

```HTML
<div class='fuga1'>fuga1</div>
<div class='fuga2'>fuga2</div>
<div class='fuga3'>fuga3</div>
<script>
window.onload = function() {
  var divElement = document.querySelectorAll('div.fuga1, div.fuga2');
  for (var i = 0; i < divElement.length; i++) {
    window.alert(divElement[i].innerHTML);                                                                                           
  }             
}               
</script>    
```

fuga1, fuga2のみでてくると思います。

## これまでのページ

- [[JS初心者]#1 イベント編 JavaScriptを学ぶ](http://qiita.com/zwirky/items/d58922441764718a5446)
- [[JS初心者]#2 DOM編 JavaScriptを学ぶ](http://qiita.com/zwirky/items/aec423775da01070e8c9)
- [[JS初心者]#3 ウィンドウオブジェクト編 JavaScriptを学ぶ](http://qiita.com/zwirky/items/5f0f86a9db5c771e6340)
- [[JS初心者]#4 セレクタAPI編 JavaScriptを学ぶ](http://qiita.com/zwirky/items/a26a69f97852e87c0e44)
- [[JS初心者]#5 テスト＆デバッグ編 JavaScriptを学ぶ](http://qiita.com/zwirky/items/838e1b50c6afe5bdc9b3)
【備忘録】vcsaの足は1個しかダメよ、つけてもいいけどサポートしないんだからね！

vcsaは、足1個しか持てません。
Windows環境から移行する際に足沢山使ってたーなんてかたは、
Routingをさせるしかなくなります。
1つだけサポート許容されているのは、6.5から実装されたVSHAを使用するときだけです。

https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2148107
O記法についてメモ

# O記法は計算にかかる時間とデータ量の関係について便利な記法

$$O(n)$$
「$n$ のオーダーである」，「オーダーエヌ」，「オーエヌ」，「線形時間」と呼ぶ．
配列への挿入のように「データの量 $n$ が2倍になったら計算時間も2倍くらいになる」という性質
***
$$O(1)$$
「定数のオーダーである」，「オーダーイチ」，「オーワン」，「定数時間」と呼ぶ．
連結リストへの挿入のように「データの量 $n$ が2倍になろうが計算時間は変わらない」という性質
***
$$O(n^{2})$$
データ量 $n$ が2倍，3倍になったときに，計算時間が4倍，9倍に増える
***
$$O(\log n)$$ 
データ量 $n$ が2倍になったときに増える計算時間と，データ量が2倍から4倍になった時に増える計算時間が同じくらい
***
O記法は関数の増え方をざっくりと表現するものなので，$n^{2}+2n+1$ であっても $3n^{2}$ であっても，どちらも $O(n^{2})$

厳密な定義の解説はたとえば，奥村晴彦『[C言語による最新アルゴリズム事典](http://amzn.to/2uh50VI)』 技術評論社，1991年．を参照して欲しい
***
参考文献
西尾泰和　『[コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 (WEB+DB PRESS plus)](http://amzn.to/2ugUFcl)』　技術評論社，2013年，141頁．
apm install connect ETIMEOUT しちゃった話

久しぶりにターミナルから apm install 叩いたら、エラーが。
プロキシ設定書いてたからか、と思い何故か npm の方を弄る。
_当然解決せず… npmの方もついでに直してしまったわけだが_

```
$ npm -g config delete proxy
$ npm -g config delete https-proxy
$ npm -g config delete registry
```

## こっちが正しい
```
$ apm config delete proxy
$ apm config delete https-proxy
$ apm config delete registry 
```

現在のapmの設定を確認する方法

```
$ apm config get proxy
```

apm で -g をつけるとパッケージを見に行ってしまうので、要注意。
東京大学工学教程を読んでみた！


# はじめに
qiita書くのにいい題材ないかなって図書館を見てたら東京大学工学教程なるものを見つけました．（https://www.amazon.co.jp/%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E5%B7%A5%E5%AD%A6%E6%95%99%E7%A8%8B-%E6%83%85%E5%A0%B1%E5%B7%A5%E5%AD%A6-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E4%B8%AD%E5%B7%9D-%E8%A3%95%E5%BF%97/dp/4621089919/ref=sr_1_3?s=books&ie=UTF8&qid=1500622851&sr=1-3）
内容も体系的にまとまってました．
そして何よりも授業で使われてるところ見たことないのに東京大学工学教程っていうタイトルっていう面白さがあったので，この本が気に入っちゃいました．
そこでこの本で学習したことを元に，自分なりにココ大事だなってところを中心にまとめられたらと思います．
９章あるんで，１章ごと更新しようと思っています．
#１章　機械学習の概念
##1章の要旨
通信路モデルの導入，機械学習の例としてnaive Bayes分類を紹介する．さらに機械学習の基礎概念，例えば教師あり学習や教師なし学習について説明している．次に，アルゴリズムの評価方法を紹介している．
##通信路モデル
ここでは最尤法とよばれる方法の紹介があった．
卑近な例で説明します．
打率１割の打者Aと打率３割の打者Bがいるとする．
AとBのどちらかが打ったという情報が入った時，人は自ずとBの人が打った確率が高いと考えます．
これを機械学習に置き換えます．
情報源yとそこから派生し観測されたxがあったとします．
yは野球の例でいうと打者，xは打ったか打たなかったかという情報にあたります．
xが確定した情報であるときのyの確率をp（y|x）と書きます．
野球の例でいうと
p(y=A|x=打つ)＜p(y=B|x=打つ)とかける．
このようなp(y|x)の分布を求める計算を学習過程という．
またp（y|x）の分布から以下の式でもっともらしいp(y|x)を求められる．

$$\hat{y}　＝argmax_{y}p(y|x)-(1.1)$$

またベイズの定理より
$$p(y|x)p(x)=p(x|y)p(y)$$
を用いると(1.1)は
$$\hat{y}　＝argmax_{y}p(x|y)p(y)-(1.2)$$
となる．
##naive Bayes分類
文中の例
$$\begin{cases} \\ \end{cases}$$
$$$$
$$$$
UICollectionViewCellのDrag & Dropを実現するライブラリ集

iOSのUICollectionViewのDrag&Dropを実現するライブラリを探してみた。
とりあえず検索に引っかかったものを列挙。
Githubのstar数順(2017/07/21調べ)にソートしています。

## LXReorderableCollectionViewFlowLayout ★ 1692

* [lxcid/LXReorderableCollectionViewFlowLayout: Extends `UICollectionViewFlowLayout` to support reordering of cells. Similar to long press and pan on books in iBook.](https://github.com/lxcid/LXReorderableCollectionViewFlowLayout)

### 使い方解説
* [「LXReorderableCollectionViewFlowLayout」を使って並び替え可能なUICollectionViewを実現する - UROURO BLOG](http://blog.urouro.net/entry/2014/01/16/150114)


## RAReorderableLayout ★ 751
* [ra1028/RAReorderableLayout: A UICollectionView layout whitch can move item with drag and drop.](https://github.com/ra1028/RAReorderableLayout)

## DraggableCollectionView ★ 535
* [lukescott/DraggableCollectionView: Extension for the UICollectionView and UICollectionViewLayout that allows a user to move items with drag and drop. --- HELP WANTED --- Looking for maintainer and help with the experimental branch.](https://github.com/lukescott/DraggableCollectionView)

最終更新日が 4 years agoなので、最近はメンテされていないっぽい。"HELP WANTED" とのこと。

## KDDragAndDropCollectionView ★ 233
* [mmick66/KDDragAndDropCollectionView: This is a companion to the http://karmadust.com/drag-and-drop-between-uicollectionviews/ tutorial](https://github.com/mmick66/KDDragAndDropCollectionView)

## DragDropCollectionView ★ 124
* [LiorNn/DragDropCollectionView: A UICollectionView which allows for easy drag and drop to reorder cells. Mimicks the drag and drop on the iOS Springboard when reordering apps (wiggle animation included!). AutoScroll included also](https://github.com/LiorNn/DragDropCollectionView)

## その他
### [Custom Dragging with UICollectionView - NSScreencast](http://nsscreencast.com/episodes/215-custom-dragging-with-uicollectionview)
* UICollectionViewFlowLayoutを自作するチュートリアル。
Android Kotlin: Crosswalk WebView でNativeメソッド と JavaScript 相互呼び出し

# Kotlin から Crosswalk の javascript の関数を呼び出す

javascript で下記の関数が定義されているとする。

関数foo は、ネイティブからJavaScript を呼び出したい例。
関数bar は、JavaScriptからネイティブのメソッドを呼び出したい例。

```javascript:javascript
function foo(msg) {
    alert(msg);
    return msg + msg;
}

function bar() {
    alert(native.bar("A", "B"));
}
```

アクティビティのonCreateでCrosswalkにJavaScript呼び出しを担当するクラス（この例では JavaScriptBridge というクラス）を追加する。

```kotlin:MainActivity.kt
xwalkview.addJavascriptInterface(JavaScriptBridge(this, xwalkview), "native")
```

JavaScriptからの呼び出しを受け付けるクラスを作成する。

```kotlin:JavaScripBridge.kt
import android.content.Context
import android.net.ConnectivityManager
import org.xwalk.core.JavascriptInterface
import org.xwalk.core.XWalkView

class JavaScriptBridge(private val context: Context, private val web: XWalkView) {
    @JavascriptInterface
    fun bar(a: String, b: String): String {
        return a + b
    }
}
```

これで、JavaScript からは native オブジェクトを経由してネイティブ(JavaScriptBridgeクラス）を呼び出せるようになる。

# JavaScript から Kotlin のメソッドを呼び出す

evaluateJavascript メソッドで呼び出したいJavaScriptコードを文字列で渡す。
JavaScript からの戻り値はコールバックで受け取ることができる。

```kotlin
xwalkview.evaluateJavascript("foo('android')") { value ->
    Log.d("RESULT", value)
}
よく使うmetaまとめ

## 概要
いつもmeta書く際にコピペするので、よく使うものをまとめておきます。

## viewport
レスポンシブでサイトを作るときの設定です。

### 一般的な設定

```html
<meta name="viewport" content="width=device-width, initial-scale=1">
```

### 一般的な設定（ピンチイン、アウトなし）

```html
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
```

## 電話番号にリンクを自動的に貼らない
iphoneなどで電話番号を自動的にリンクに設定しません。

```html
<meta name="format-detection" content="telephone=no">
```
[swift3]画像を正方形に切り出すExtension

# はじめに
とあるアプリのために画像を正方形に切り出す必要があったのでそのコードを書きました
内容としては縦横のサイズの小さい方に合わせて中心からクリッピングするだけの内容です

# コード

```swift:UIImage+.swift
import UIKit

extension UIImage {
    /// 画像を正方形にクリッピングする
    ///
    /// - Returns: クリッピングされた正方形の画像
    func cropping2square()-> UIImage!{
        let cgImage    = self.cgImage
        let width = (cgImage?.width)!
        let height = (cgImage?.height)!
        let resizeSize = min(height,width)
                
        let cropCGImage = self.cgImage?.cropping(to: CGRect(x: (width - resizeSize) / 2, y: (height - resizeSize) / 2, width: resizeSize, height: resizeSize))
        
        let cropImage = UIImage(cgImage: cropCGImage!)
        
        return cropImage.rotate(angle: 90)
    }
    /// 画像をを回転させる
    ///
    /// - Parameter angle: 回転角度(deg)
    /// - Returns: 回転された画像
    func rotate(angle: CGFloat) -> UIImage{
        UIGraphicsBeginImageContextWithOptions(CGSize(width: self.size.width, height: self.size.height), false, 0.0)
        let context: CGContext = UIGraphicsGetCurrentContext()!
        context.translateBy(x: self.size.width/2, y: self.size.height/2)
        context.scaleBy(x: 1.0, y: -1.0)
        
        let radian: CGFloat = (-angle) * CGFloat.pi / 180.0
        context.rotate(by: radian)
        context.draw(self.cgImage!, in: CGRect(x: -self.size.width/2, y: -self.size.height/2, width: self.size.width, height: self.size.height))
        
        let rotatedImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        
        return rotatedImage
    }
    
    private func min(_ a : Int, _ b : Int ) -> Int {
        if a < b { return a}
        else { return b}
    }
}
````

中心から抜き出す処理の際にCGGImageに変換しているのですが、カメラの回転情報が失われてしまうので、rotate関数を作り90度回転させています
DreamweaverでGit操作をGUIにしてしまう

```
Dreamweaver CC 2017.5リリース
```

Dreamweaverでサイトを作るときに、Gitリポジトリと関連づけるというチェックボックスがあるので、チェックすると、下記のようなエラーが出た

<img width="723" alt="スクリーンショット 2017-07-21 15.44.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/7b273120-942a-6057-0ffe-bdd62f62caab.png">

ターミナルで
```git --version```
と打ち、確認してみると、git version 2.11.0 (Apple Git-81)が入っていた。

とすると、エラーに出ているように、環境設定でカスタムパスを指定すれば使えるのかもしれないと思い、試してみた。

```$ which git```
で取得したパスを、環境設定画面にそのまま入力して、Dreamweaverを再起動

<img width="819" alt="スクリーンショット 2017-07-21 15.55.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/b1224ffa-3bff-e374-8878-ad3d12c4ff71.png">


サイトの作成でgitの関連づけチェックできるようになった。
すでに、github連携して開発しているので、そのディレクトリを当てて、既存URLを設定しようとしたところ・・・

<img width="714" alt="スクリーンショット 2017-07-21 16.18.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/eebaec8a-1bca-ec9e-fdb8-7a3f184e0954.png">

どうやら、空のディレクトリじゃないと連携できないらしい。。
仕方ないので、からのディレクトリを作って、そこを新しいレポジトリに設定。
設定が完了すると、下記のようなログが流れて、Githubから、Dreamweaverのローカルサイトにファイルが転送されてきます。便利！

<img width="898" alt="スクリーンショット 2017-07-21 16.27.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/3ce14df0-9a07-472d-f04b-9b745c36963b.png">

git操作は、ウィンドウ→Gitで操作画面を開きます

<img width="426" alt="スクリーンショット 2017-07-21 16.31.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/c9c8bdec-c05a-3998-a3ad-36569c14e383.png">

すると、CUIが苦手にとって天国なGUIでのGit操作ができるようになっているではないですか！

<img width="594" alt="スクリーンショット 2017-07-21 16.35.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/9d19c400-ca0b-bffc-3e5e-87cbb7390d89.png">


<img width="386" alt="スクリーンショット 2017-07-21 16.35.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/9044bf20-6cee-3ce1-4395-0c4bbe64753e.png">


これでまたコマンドを打たなくなるだろうな・・・
Magento2でHTMLに埋め込める変数

####アップロードしたイメージのURLを出力
```
{{media url="wysiwyg/test.png"}}
```
####テーマのwebディレクトリにあるイメージのURLを出力
```
{{view url="images/test.png"}}
```
####ルートへのURL出力
```
{{store url=""}}
```
urlにURLキーを入れればページへのリンクURLを生成
####顧客名（フルネーム）出力
```
{{var customer.name}}
```
```
{{trans "%last_name %first_name様" last_name=$order.getCustomerLastName() first_name=$order.getCustomerFirstName()}}
```
transだと翻訳がかかる。
####テンプレートの埋め込み
```
{{template config_path="design/email/header_template"}}
```
####インラインCSS
```
{{inlinecss file="css/email-inline.css"}}
```
テーマのwebディレクトリより読み込む
Web制作によく使うChromeのエクステンション

## 概要
Web制作によく使うChromeのエクステンションです。
良いものが見つかれば随時追加します。

## Alt & Meta viewer
altタグを簡単に確認することができます。
https://chrome.google.com/webstore/detail/alt-meta-viewer/jjcjblcbnjhgjlnclhficglfjedhpjhl?hl=ja

## Clear Cache
キャッシュのクリアに使うエクステンション。
更新ボタンを押しても変わらない時などに重宝します。

https://chrome.google.com/webstore/detail/clear-cache/cppjkneekbjaeellbfkmgnhonkkjfpdn?hl=ja

## Dimensions
オブジェクト同士の距離を簡単に測ることができます。
https://chrome.google.com/webstore/detail/dimensions/baocaagndhipibgklemoalmkljaimfdj?hl=ja

## HTML5 Outliner
htmlのアウトライン構造が正しくできているかのチェックに使えます。
https://chrome.google.com/webstore/detail/html5-outliner/afoibpobokebhgfnknfndkgemglggomo?hl=ja

## WhatFont
使われているフォントのサイズや種類がわかります。
気になったフォントがあったらすぐにチェックできます。
https://chrome.google.com/webstore/detail/whatfont/jabopobgcpjmedljpbcaablpmlmfcogm

## Window Resizer
Windowサイズを手軽にリサイズできるエクステンション。
Wordpressなどでスマホの条件分岐をかけるとディベロッパーツールではサイズが出せないい（条件分岐が効かない）ので、こちらを使っています。

https://chrome.google.com/webstore/detail/window-resizer/kkelicaakdanhinjdeammmilcgefonfh?hl=ja
debian9でTensorFlow

#概要
debian9でTensorFlowやってみた。

#インストールの方針
linux debian-9.0.0 amd64　使う。
python 3.5　使う。
sshは、使わない。
ftpは、使わない。
apacheは、使う。
gui、使う。
日本語、使う。
ブラウザ、使う。
anacondaは、使わない。
pyenvは、使わない。
jupyterは、使わない。
gpuは、使わない。

#apt-getでインストール

python3-pip
python3-numpy
python3-scipy
python3-pillow
python3-matplotlib
python3-pandas

#pip3でインストール

tensorflow　1.2.1

以上。
NotificationCompatにhttpから取得した画像を入れる

NotificationCompat.Builderは端末のPush通知を送る事ができる機能です。
setLargeIcon(Bitmap bitmap)というメソッドがあるのでそれを使って実装します。

AsyncTaskを使って画像URLをHTTPで取得し、
NotificationCompat.BuilderでBitmapを設定したPush通知を送信するクラスを書きます。

```java
class SendNotificationBuilder extends AsyncTask<String, Void, Bitmap> {

  private String title;
  private String message;
  private String imageUrl;
  private Intent intent;

  public SendNotificationBuilder(Context context) {
    super();
    this.context = context;
  }

  public SendNotificationBuilder setTitle(String title) {
    this.title = title;
    return this;
  }

  public SendNotificationBuilder setMessage(String message) {
    this.message = message;
    return this;
  }

  public SendNotificationBuilder setImageUrl(String imageUrl) {
    this.imageUrl = imageUrl;
    return this;
  }

  public SendNotificationBuilder setIntent(Intent intent) {
    this.intent = intent;
    return this;
  }

  @Override
  protected Bitmap doInBackground(String... params) {
      if (imageUrl == null) return null;
      InputStream in;
      try {
        URL url = new URL(imageUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.connect();
        in = connection.getInputStream();
        Bitmap bitmap = BitmapFactory.decodeStream(in);
        return bitmap;
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return null;
  }

  @Override
  protected void onPostExecute(Bitmap bitmap) {
    super.onPostExecute(bitmap);
    try {
      NotificationManagerCompat manager = 
          NotificationManagerCompat.from(getApplicationContext());
      NotificationCompat.Builder builder;
      builder = new NotificationCompat.Builder(context)
          .setContentTitle(title)
          .setContentText(text);

      builder.setSmallIcon(R.drawable.icon_app);
      builder.setColor(ContextCompat.getColor(context, R.color.white));
      if (bitmap != null) {
        builder.setLargeIcon(bitmap);
      }
      builder.setAutoCancel(true);

      PendingIntent contentIntent = PendingIntent.getActivity(
          getApplicationContext(), REQUEST_ID,
          intent, PendingIntent.FLAG_ONE_SHOT);
      builder.setContentIntent(contentIntent);
      manager.notify(NOTIFY_ID, builder.build());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
```

呼び出します。

```java
new SendNotificationBuilder(getApplicationContext())
    .setTitle(title)
    .setText(text)
    .setImageUrl(imageUrl)
    .setIntent(intent)
    .execute();
```
Spring Boot で Azure MySQL(Clear DB)のFreeプランに接続する際

AzureのClear DB提供のMySQLでは接続数に制限があり、
Freeプランでは「4」と少ない。

で、何も考えずにSpring Bootで以下のようにapplication.ymlを設定して接続してみると・・・

```application.yml
spring:
  datasource:
    url: jdbc:mysql://{AzureDBホスト名}:3306/{DB名}
    username: {username}
    password: {password}
    driverClassName: com.mysql.jdbc.Driver
```

以下のようなエラーが出て怒られる。

>User '{username}' has exceeded the 'max_user_connections' resource (current value: 4)

いやいや、4も接続しとらんやん。
・・・と思ったんだけど、TOMCATさんがどうやら4以上poolしていることが判明。

なので、application.ymlを以下のように変更したところ正常に動いたよ。

```application.yml
spring:
  datasource:
    url: jdbc:mysql://{AzureDBホスト名}:3306/{DB名}
    username: {username}
    password: {password}
    driverClassName: com.mysql.jdbc.Driver
    tomcat:
      maxActive: 4
      maxIdle: 4
      minIdle: 1
      initialSize: 1
```

最大接続数？と思われる設定を4にして
最小接続数？と思われる設定を1にしました。

※解釈が間違っている可能性がありますのでご了承ください。
Atom BeautifyでPHPフォーマットをする方法

Atom BeautifyでPHPのソースフォーマットをする場合、デフォルトではできないのでPHP-CS-Fixerをインストール又は設定してあげる必要があります。
php-cs-fixer-v2.phar ファイルが必要になるので、ダウンロードしてくる必要があります。


## 前提条件
Atom、Atom Beautifyのインストール

## Composerからインストール
Composerからインストールする場合は、https://github.com/FriendsOfPHP/PHP-CS-Fixer に書かれているコマンドを実行すれば設定しなくてもフォーマット可能になります。

```
composer global require friendsofphp/php-cs-fixer
```

## 手動インストール
手動で設定したい場合は、http://cs.sensiolabs.org/ のトップ画面に「Locally」という項目があるので、php-cs-fixer.pharという名前でリンクが置いてあるのでまずはそれをクリックしてphp-cs-fixer-v2.pharをダウンロードします。ダウンロードしたファイルは任意の場所に配置してください。
次にAtomを起動してメニューから「ファイル」→「環境設定」→「Packages」→「atom-beautify」→「PHP」まで移動して、項目「PHP-CS-Fixer Path」に先ほどインストールしたphp-cs-fixer.pharの絶対パスを設定してください。

## 追記
Composerでも手動でも「PHP-CS-Fixer Path」を指定してください。
Composerからインストールした場合、エラーは消えるものの動作してませんでした。。。
読んだメモ: Apple ML Journal: Improving the Realism of Synthetic Images


先日始まった Apple Machine Learning Journal から
https://machinelearning.apple.com/2017/07/07/GAN.html
を読んだメモです。

自分なりなまとめ
===========
教師あり学習は上手くいくが、大量で多様な精度良いラベルがついたデータを用意する必要がある。
データを人工的に合成できれば、大量に精度良いラベル付きデータが得られるが、実際のデータとの乖離が大きくあまり良い結果にならない。そこで、合成画像を実際の画像にrefineする教師なし学習モデルを開発し、多くの機械学習タスクの結果を著しく向上させた。

概要
=========

* GANの仕組みを用いる
* Discriminator: 「realな画像」 or 「refineされた画像」 を識別
* Generator(Refiner): 「合成された画像」から「refineされた画像」を生成する

<img src="https://machinelearning.apple.com/images/journals/gan/block_diag_gif.gif">

手法
---------

* Generator は ２つの目的を持って学習する
  * Discriminator が 間違えるように
  * 「合成画像」と「refineした合成画像」の差分が小さくなるように(L1を使う)

* Discriminatorは識別性能を上げていくように学習する

メモ
========

アノテーションを保持する工夫
------------
例えば、視線推定用のデータを生成したい場合は、refineした画像の視線方向が変わると困る。
ので、合成画像とrefine画像の差にL1ペナルティを用いた。

artifactsを防ぐ
-----------
※ artifactsは人工物とか変なもの、という意味か？
Generatorが入力画像とは似ても似つかない画像を生成することを防ぐ必要がある。
Discriminatorを騙そうと必死になるうちに、そういうことが起こることがある。

そこで、Discriminatorは、画像の一部分を切り出して、本物かニセモノかを判断して、総合的に全てを合計することで、
その画像の真贋を判断させている。

(そうすると、全体的な改竄より部分的な改竄に努力の方向を向ける、ということかな？)

Generatorの生成履歴を使うことでDiscriminatorが向上する
--------------
Generator(G) が Discriminator(D) を騙す簡単な方法は、Dが知らない画像を見せること。
普通に学習させると、下図の左のようにおにごっこみたいになる。
(Dはつまり忘れっぽいのかな)
そこで、DのMiniBatchの半分くらいを過去の生成履歴を使い、残り半分を新規にGが作成したサンプルを使うと、
Dの訓練効率が良くなった（下図の右）。

<img src="https://machinelearning.apple.com/images/journals/gan/history.gif">
(上記記事内の画像)

学習の進め方
----------

最初は、L1 LossだけでGを学習させる。
Gが Bluerな（ぼやっとした）画像を生成し始めたら、DのLossも含めるようにする。

Is the self-regularization L1 loss limiting?
------------
この部分の意味がわからず。。。
ぐぬぬ。

感想
=======
つまり、計算ドリルをGANに作らせる、ということですね。
なるほどなぁ。
String型タイムスタンプ作成方法（MFC版）

# タイムスタンプ作成方法のひとつ

　タイムスタンプを作成するときは、time_tを使うのが通常かと思いますが、MFCの場合、unsafeだというエラーでコンパイルできなかった。セキュリティー強化型を使う必要があるのだろうか。
　
　MSDNには以下のような説明がされている。

>多くの旧来の CRT 関数に、新しくセキュリティが強化されたバージョンができました。 セキュリティが強化された関数が存在する場合、セキュリティが弱い古いバージョンは推奨されないバージョンとしてマークされ、新しいバージョンには _s ("secure") のサフィックスが付いています。

>ここで、"推奨されない" とは、その関数が CRT から削除される予定だということではありません。

>また、セキュリティが強化された関数は、セキュリティ エラーを防止したり訂正したりするのではなく、エラー発生時にそのエラーをキャッチします。 これらの関数はエラー条件をチェックし、エラーが発生した場合に、エラー ハンドラーを呼び出します (「パラメーターの検証」を参照)。


　また、`CTime`の場合、現在時刻を取得する`GetCurrentTime`のメンバーファンクションが使用できなかった。原因がわからないので、`__time64_t` を使用して作成できた。`__time32_t`もあるが年数制限が近いので、3000年まで利用可能な64を使用する。この場合、上記のMSDNの説明にもあるように_s（サフィックス）のついた関数を使うのが正しいようだ。

　このプログラム上で使いやすいString型に変換してありますが、int型のまま使用する場合はコード内の下半分、String以下は必要ありません。

必須ヘッダー
`<time.h>`

以下は必要に応じて追加する。
`<iomanip>`　は　`std::setw()` や　`std::setfill()`で使用。
`<sstream>`　は　stringstreamで使用。


```C++:timeStruct
std::string MFC_Fucntion::timeStamp() {

	struct tm timeStruct;
	__time64_t time64;
	errno_t err;
	
	_time64(&time64);
	err = _localtime64_s(&timeStruct, &time64);
	if (err) {
		exit(1);
	}

	std::string times;
	std::stringstream sst;
	sst <<  
		timeStruct.tm_year + 1900
		<< std::setw(2) << std::setfill('0') << timeStruct.tm_mon + 1
		<< std::setw(2) << std::setfill('0') << timeStruct.tm_mday
		<< std::setw(2) << std::setfill('0') << timeStruct.tm_hour
		<< std::setw(2) << std::setfill('0') << timeStruct.tm_min
		<< std::setw(2) << std::setfill('0') << timeStruct.tm_sec;
	times = sst.str();
	return times;

}
```

アウトプット
`20170721141845`
iframeのクロスオリジンを倒す

## iframeで別ドメインを呼び出して操作したい

iframeでクロスオリジン対応をする必要があったのでメモ。

同じドメインでiframeを呼び出すことは問題ないが、異なるドメインをiframeで呼び出す場合、クロスオリジン対応をしないとiframe内部のHTMLにアクセスできない。  
何が困るかって言うと「レスポンシブで高さが変わるから読み込み時のサイズに合わせてiframeの高さを中の要素に合わせたい」とかそういう時。

そういう時にはwindow.postMessageで子→親に情報を渡してやることで対応する。


### 子(iframe内のページ)

```javascript
$(function(){
    var h = $('html').height();
    // 親におくる。第2引数は親のドメインを指定
    parent.postMessage(h, 'https://fuga.com/');
});
```


### 親(呼び出し側)

```html
<iframe src="https://hoge.com/iframe.html"></iframe>
```

```javascript
$(window).on('message', function(e){
	var height = e.originalEvent.data;
	$('iframe').css({'height': height + 'px'});
});
```

### 参照

[Can I use](http://caniuse.com/#search=postMessage)
[PostMessageを使ったクロスドメイン通信](http://www.knockknock.jp/archives/221)
[jQuery doesn't support postmessage event?](https://stackoverflow.com/questions/9904490/jquery-doesnt-support-postmessage-event)
Rubyでリダイレクトした後のURLを返すメソッド

# 概要
個人的に必要だったので書きました。

# コード

```rb
# uri_strに示されたURLにおける、リダイレクト後のURLを返す
# 変換途中でエラーが発生した場合は""を返す
# limitはリダイレクト数の上限
def redirect_url(uri_str, limit = 10)
  return_url = uri_str
  redirect_count = 0
  # リダイレクト後のURLを取得するためのwhileループ
  while true
    # リダイレクト数の上限を超えると例外を返す
    if redirect_count >= limit
      raise ArgumentError, 'HTTP redirect too deep'
    end
    # HTTPレスポンスを取得する
    response = Net::HTTP.get_response(URI.parse(return_url))
    # リダイレクトが発生した場合のみ、whileループを続行する
    # 最後がNet::HTTPSuccessじゃない場合は""を返す
    case response
      when Net::HTTPSuccess
        break
      when Net::HTTPRedirection
        return_url = response['location']
        redirect_count += 1
      else
        return_url = ""
        break
    end
  end
  return return_url
end
```

# 参考資料
https://docs.ruby-lang.org/ja/latest/library/net=2fhttp.html
SlackのSlash Commandで自動議事録作成

# 目的
　社内で行われるMTGやディスカッションの議事録をSharePoint Onlineで議事録の作成、同時編集していました。
　「毎回毎回、ファイルを作成して、リンクを共有して面倒だ！」ということで社内で利用されているSlackのSlash CommandとMicrosoft Flowを利用して「コマンド→ファイル作成→リンクをSlackへ投稿」というフローを自動化しようと思います。

# 結果
<img width="532" alt="2017-07-21_13h42_13.png" src="https://qiita-image-store.s3.amazonaws.com/0/193204/a91965c0-0ab3-c188-e285-e7a6afc13d2c.png">
　上記のように『/minutes』コマンドで下記の様なリンクを返してくれるフローを作成しました。
　<img width="534" alt="2017-07-21_13h36_54.png" src="https://qiita-image-store.s3.amazonaws.com/0/193204/3edf1dd9-89c8-d752-a0d7-f6f581bbadec.png">
　一見するといい感じですが、SharePoint Online用の

# 内容
　詳細は随時追記していきます。
### 1．Flow側でトリガーとなるエンドポイントを作成する

### 2．SlackでSlash Commandを有効にする

### 3．Slash Commandの設定でFlowのエンドポイントを登録する

### 4．目的のフローを作成する
- 今回はファイルの作成（正確にはテンプレートファイルのコピー）を行い
- Slackの特定のチャンネルへメッセージを送る  
というフローを作成したら下記の様になりました。
<img width="691" alt="2017-07-21_14h03_06.png" src="https://qiita-image-store.s3.amazonaws.com/0/193204/a366bd20-de7f-5681-1a26-3c964525121a.png">
※ファイルのコピーでディレクトリ指定に手間がかかりました。  
下記サイトを参考に解決しました。何てことのない、実際のURLからディレクトリを指定してしまっていただけでした。
 > https://powerusers.microsoft.com/t5/Building-Flows/Unable-to-access-the-File-in-dataset/td-p/24780

### 5．完成
　　　 (((o(*ﾟ▽ﾟ*)o)))ﾜｰｲ

# 感想
　様々な経路で通知を行う様なアプリであれば簡単に作成できます。
　Microsoft FlowはAzureのLogic Apps上で動作しているようなので、調整をしたい場合はGUIで格闘するよりも、Logic Appsでコーディングするのが早そうです…

# 参考URL
- Slack Commands
https://api.slack.com/slash-commands

- Microsoft Flow
https://flow.microsoft.com/ja-jp/
【完全無料】Herokuで独自ドメイン + HTTPSに対応する【Rails】

## 前置き
「heroku ssl 無料」とかで、ググると

- SSLの使用量は無料
- Let's encryptを使えば無料
- **ただし、paid dynoを使う必要あり**

みたいな記事が多いと思いますが、 **完全無料** で **独自ドメイン + HTTPS**に対応する方法を見つけたので、共有しておきます。

### 環境
- お名前.comでドメインを取得済み
- herokuのアプリはデプロイ済み

を想定して書いています。


## Cloudflareを使う
`Cloudflare` という文字を見て、**「ああ、それかよ」**ってなった方は、この記事を読む意味はないと思われます。
![cloudflare](https://www.cloudflare.com/img/logo-cloudflare-dark.svg)

CloudflareはCDNとして有名っぽいのですが、SSLのサービスも提供しています。

### 仕様イメージ
クライアント(PC)からCloudflareを踏んで、Herokuに流しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82779/7a58f301-ca9b-4b4d-f25c-1c81657757bb.png)

### 手順
#### 1. https://www.cloudflare.com にアクセスしてアカウントを作る
#### 2. ドメインを入力する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82779/f9d3a827-94a7-c16e-cded-8d62c2b786c3.png)

#### 3. CNAMEとかを設定する
ここでは、herokuのapp名を`example`、取得したドメインも`example`の画像です。適宜読み替えてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82779/33f678a1-2353-6bda-f413-40c3f4117a07.png)

#### 4. Planをfreeに
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82779/295e5fd0-3d9f-de6b-f198-2ff0ac5df898.png)

#### 5. DNSを変える
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82779/d06394e6-2f81-8c0c-de53-799ed2fad05a.png)

最後のところでDNSをこれにしろって言われるので変える。
お名前.comにログインして、サイドバーから`ネームサーバーの変更`を選ぶ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82779/da351de2-76bf-4a56-1728-4d3af3496a45.png)

変更したいドメインにチェック入れて、さっき指定されたドメインを設定しておく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82779/25d23ca7-5ca8-c6be-1d0b-3930b18689ff.png)

(*画像では一致してないが、本当は一致させる)

#### 6. アプリケーションをSSLに対応させる
Railsを使っていたので、`production.rb` の force_ssl を true にして、Herokuにpushする。

```rb 
# config/environments/production.rb
...
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  config.force_ssl = true
...
```

#### 7. cryptタブからsslをfullにする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82779/b7e8bd4f-02a8-14c3-ee41-671177722c58.png)

#### 8. **一日待つ(重要)**
結構時間がかかるみたいで、設定してから1日ぐらいかかると思っておいた方がいいと思わます。
全然反映されなくて、焦るけど、とりあえず忘れて、1日過ごすのが吉。

1日待って、`https://example.com` を叩いてみても、herokuに向いてなかったら、何かがおかしい気がする。
頑張ってdigとか使って調査してみてください。
Skylake (Xeon Scalable Processor Family) 世代サーバの面白そうな動向

#NVDIMM関連

http://qiita.com/YasunoriGoto1/items/177c7a5b22a02d087ebf
ここの解説が参考になりました。

http://h20195.www2.hpe.com/V2/GetDocument.aspx?docname=4AA6-4681ENW&cc=us&lc=en

https://www.hpe.com/us/en/servers/persistent-memory.html

https://www.youtube.com/watch?v=c9OdZKEHhyw

https://github.com/pmem/nvml

#NVMe関連

- NVMe 24本!
http://www.dell.com/en-us/work/shop/povw/poweredge-r740xd

- NVMe 20本!
https://www.hpe.com/content/dam/hpe/download/pdf/gated/Servers/gen10-catalog.pdf?cc=jp&ll=ja
BigQueryのクエリをみんなで共有する方法


ええと、けっこう前からあったらしいんですがさっきまで全然知らなかったので書きました。

BigQueryのコンソール画面で `Save QUery`ってあるじゃないですか。
これ保存したあとどこで取り出すんだよ、むしろこの保存したクエリの共有方法ってどうすればいいんだよってずっと思ってたんですよ。

## 保存したクエリの行方は

![New_Query.png](https://qiita-image-store.s3.amazonaws.com/0/8637/b2351787-26e1-f6c4-61ba-e87b1dfbd68a.png "New_Query.png")

Slackでこの保存したやつどこに行ってるの？って聞いたらQuery Historyにあるよって答えをもらいました。
Queriesの下にある`Saved Queries`にありました。
もしくは`Project Queries`にあります。

![New_Query.png](https://qiita-image-store.s3.amazonaws.com/0/8637/6baf1e70-1af3-1bdf-f690-ea242a473da2.png "New_Query.png")

## クエリを保存する

そもそもクエリ保存の方法について。

先ほどの`Save Query`をポチるとクエリの名前とか入力できます。
あと共有の範囲が選べます。

![New_Query.png](https://qiita-image-store.s3.amazonaws.com/0/8637/2a72ecea-ee3a-d9d2-afd8-f0c0ee40b580.png "New_Query.png")

- Private(自分しか見れない。編集可能。)
- Protected(対象のGCPプロジェクトメンバー全員で共有可能。編集可能。)
- Public(URLを共有すれば誰でも見れる。ただし編集不可。)

Publicの場合クエリを見る事はできますけど、実際に実行しようと思ったらクエリのデータセットの権限が必要になるはず。

### URLの取得方法

保存するとクエリウィンドウの上の方が変わります。

Before
![Screenshot 2017-07-21 13.29.53.png](https://qiita-image-store.s3.amazonaws.com/0/8637/57dd2ee6-dd88-a2f7-f665-234066a2ed30.png "Screenshot 2017-07-21 13.29.53.png")

After
![Screenshot 2017-07-21 13.30.50.png](https://qiita-image-store.s3.amazonaws.com/0/8637/d740d36c-6fe1-0d0f-d4b1-ea9ae857dd72.png "Screenshot 2017-07-21 13.30.50.png")

名前のあたりをクリックするとリンクが出てくるのでこれをコピペすればみんなで共有できます。
![Screenshot 2017-07-21 13.31.38.png](https://qiita-image-store.s3.amazonaws.com/0/8637/952cb774-b33a-d70c-6d8a-63ee8ad969ae.png "Screenshot 2017-07-21 13.31.38.png")
RubyOnRails 数量変更可能なセレクトボックス

今からプールに泳ぎに行くんですが、その前にメモ。
# 作り方
`options_for_select`で簡単に作れます。
こんな感じで書くと最初から選択した状態にしてくれます。
@numbersには任意の配列を入れておきましょう。

    =f.select :quantity, options_for_select(@numbers, {selected: cart.quantity.to_i} )

# 画像
<img width="337" alt="スクリーンショット 2017-07-21 13.31.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/187119/ccc8de03-0bc9-d585-4f68-90243bb9d34f.png">

# 完成コード
    #carts/show.html.haml
    =form_for cart, url:"/update_item/#{cart.item_id}", method: :post do |f|
      =f.select :quantity, options_for_select(@numbers, {selected: cart.quantity.to_i} )
      =f.submit "数量の変更を確定"

# Railsガイドによるところ。
>options_for_selectでは、デフォルトにしたいオプションを値を渡すことでデフォルト値を設定できます。
>生成されるオプション内部の値がこの値とマッチすると、Railsはselected属性を自動的にそのオプションに追加します。

ちょっと良くわかりませんでしたが、とにかくできたので良いとします。
以上です。

##### 参考サイト：
[Action View フォームヘルパー]
(https://railsguides.jp/form_helpers.html#%E3%82%BB%E3%83%AC%E3%82%AF%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
Windows10でAnaconda(Python3.6)を導入して、pipでopencv3.2を入れてjupyter-notebookで使う

windows10で、Anacondaをつかった仮想環境で、Python+opencvをできるだけ新しいバージョンで利用しようと思い環境構築しました。その備忘録です。プログラムとその実行結果を記録しながら開発進められるのでjupyter-notebookも使います。

#Anacondaのインストール
参考
http://www.procrasist.com/entry/2016/10/04/200000

インストーラの最新バージョン(2017.07.20時点)は3.6だったのでそれをダウンロード&インストールしました。インストールの際のAdvanced Optionsで環境変数path通すやつにチェック入れます。
私の場合Anacondaのファイルpathは
C:\Users\ユーザー名\AppData\Local\Continuum\Anaconda3

もしAnacondaをアンインストールしたくなったらホーム画面左下のCortana(「ここに入力して検索」ってやつ)にPythonと入力するとUninstall Pythonというアンインストーラーが出てくるのでそれを使います
参考
https://www.codelab.jp/blog/?p=1168

pythonのエディタとして今回jupyter-notebookを使います。

#プロジェクト作成(コマンドプロンプト)
```
> conda create -yn プロジェクト名 python=3.6 anaconda
> activate プロジェクト名
```
参考
http://qiita.com/supersaiakujin/items/50def6f33b79f9a61b18

conda createのオプションについては公式ドキュメント
https://conda.io/docs/commands/conda-create.html

作成したプロジェクトは私の場合以下でした
C:\Users\ユーザー名\AppData\Local\Continuum\Anaconda3\envs\プロジェクト名

#opencvをpipでインストール
anacondaにopencvが入っていないので別途入れます。該当サイトからopencvのバージョン3.6の64bit版をダウンロードします(contlib付き)

http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv
この中のopencv_python‑3.2.0+contrib‑cp36‑cp36m‑win_amd64.whlというやつです。

ダウンロードが完了するとダウンロードフォルダにopencv_python-3.2.0-cp36-cp36m-win_amd64.whlというファイルがあるので適当な場所に移動またはコピーします。私の場合はデスクトップに移動しました。そしてpipでインストールします
#
```
> cd C:\Users\ユーザー名\Desktop
> pip install "opencv_python-3.2.0-cp36-cp36m-win_amd64.whl"
```
参考
http://ngi644.net/blog/archives/1415
http://hikuichi.hatenablog.com/entry/2016/01/05/121837

#jupyter-notebookでopencvを利用
わかりやすくデスクトップにフォルダを新規作成してフォルダ名はプロジェクト名とします
(例えばopencvtest)。そしてカレントディレクトリをそこに移動しておきます。そしてjupyter-notebookを起動します
#
```
> cd opencvtest
> jupyter notebook
```
jupyter-notebookそのものについては割愛します。
opencvの動作確認の為、jupyter-nodebookで以下コードを実行します
#
```
#-*- coding: utf-8 -*-
import numpy as np
import cv2, matplotlib
import matplotlib.pyplot as plt

print(cv2.__version__)
```
参考
http://qiita.com/Tawasshy/items/1692e4f4b1e84daee45f
~~でもたぶんcv2 not found エラーが出ると思います~~
でもたぶん下記エラーが出ると思います
ImportError: numpy.core.multiarray failed to import

#numpyのバージョンを上げる
#
```
> pip list
```
私の場合、numpyのバージョンは1.12.1と表示されました。
これを一旦アンインストールして再インストールします
#
```
> pip uninstall numpy
> pip install numpy
> > pip list
```
numpyのバージョンが1.13.1に上がりました。
これでnumpyエラーが消えるはずです。

#~~システム環境変数にPYTHONPATHを追加~~
~~cv2 not found エラーはwindows10のシステム環境変数設定にPYTHONPATHを新規追加する事で解消します。~~

~~ファイルエクスプローラーで、
コントロール パネル\システムとセキュリティ\システム
にアクセスして「システム詳細設定」->「環境変数(N)...」->「システム環境変数(S)」から新規で変数名PYTHONPATH、変数値に作成したプロジェクトのsite-packagesまでのPathを指定します。~~

~~私の場合はC:\Users\ユーザー名\AppData\Local\Continuum\Anaconda3\envs\opencvtest\Lib\site-packages;と入力しました。
※設定後、要PC再起動~~

~~参考
http://ser1zw.hatenablog.com/entry/2012/10/28/085233
http://blog1.erp2py.com/2010/10/pythonpath.html~~

これで再度jupyter-nodebookで以下コードを実行します
#
```
#-*- coding: utf-8 -*-
import numpy as np
import cv2, matplotlib
import matplotlib.pyplot as plt

print(cv2.__version__)
```
3.2.0
と表示されました。

これで完了です
リンク集。

# SPARQL
[W3C - RDF用クエリ言語SPARQL](http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/rdf-sparql-query.html#func-lang)
[W3C - SPARQL 1.1クエリ言語](http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/REC-sparql11-query-20130321.html)
[Find Something You’ve Lost - SPARQLを使い込む 補足](http://data.dbcls.jp/~yayamamo/fsyl/2012/07/sparql%E3%82%92%E4%BD%BF%E3%81%84%E8%BE%BC%E3%82%80-%E8%A3%9C%E8%B6%B3/)
# RDF
[W3C - RDFデータ・キューブ語彙](http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/REC-vocab-data-cube-20140116.html#ref_qb_MeasureProperty)
[RDFスキーマ - リソース表現の語彙定義](http://kanzaki.com/docs/sw/rdf-schema.html)

#LOD
[統計LOD](https://data.e-stat.go.jp/lodw/)
　[統計LODの基本的な使い方](https://data.e-stat.go.jp/lodw/guidelines/howto/)がわかりやすいです。
[LOD Diary](http://www.infocom.co.jp/das/loddiary/index.html)
　[RDFの検索とデータセット](http://www.infocom.co.jp/das/loddiary/2015/03/20150311001285.html)
[]()
[]()
[]()
[]()
[]()
[]()
docker-compose で作ったサービス用の /etc/init.d スクリプト


[docker-compose] で1サービスを構築した際に自動起動＆自動終了の為に度々必要になるのでメモ。

## chkconfig (CentOS6, Amazon Linux)

<font color="Red">※ /etc/init.d/docker のrun-levelが "chkconfig:   2345 95 05" なので、Docker起動以降に実行される様修正</font>

* ``workspace=`` は docker-compose プロジェクト (``docker-compose.yml`` のあるディレクトリ) を指します
* ``cmdpath=`` は docker-compose コマンドへのパスです。 ``pip`` でインストールした場合はこうなります
* *your-service-name* は適切なサービス名に書き換えます

```sh
#!/bin/sh
#
# chkconfig: 2345 96 04
# description: start your-service-name containers.
# author: Yusuke Kawatsu

workspace="/usr/local/your-service-name"
cmdpath="/usr/local/bin/docker-compose"
prog="your-service-name"
lockfile="/var/lock/subsys/your-service-name"
pidfile="/var/run/your-service-name.pid"
PATH="$PATH:/usr/local/bin"


start() {
    [ -x $cmdpath ] || exit 5
    echo -n $"Starting $prog: "

    cd $workspace
    $cmdpath up -d
    retval=$?
    pid=$!
    echo
    [ $retval -eq 0 ] && touch $lockfile && echo $pid > $pidfile

    return $retval
}

stop() {
    [ -x $cmdpath ] || exit 5
    echo -n $"Stopping $prog: "

    cd $workspace
    $cmdpath down
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile && rm -f $pidfile

    return $retval
}

restart() {
    stop
    sleep 3
    start
}

case "$1" in
    start)
        $1
        ;;
    stop)
        $1
        ;;
    restart)
        $1
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 2
esac
```

## OpenRC (Alpine Linux)


```sh
#!/sbin/openrc-run
#
# author: Yusuke Kawatsu

workspace="/usr/local/your-service-name"
cmdpath="/usr/local/bin/docker-compose"
prog="your-service-name"
lockfile="/var/lock/subsys/your-service-name"
pidfile="/var/run/your-service-name.pid"
PATH="$PATH:/usr/local/bin"


start() {
    [ -x $cmdpath ] || exit 5
    echo -n $"Starting $prog: "

    cd $workspace
    $cmdpath up -d
    retval=$?
    pid=$!
    echo
    [ $retval -eq 0 ] && touch $lockfile && echo $pid > $pidfile

    return $retval
}

stop() {
    [ -x $cmdpath ] || exit 5
    echo -n $"Stopping $prog: "

    cd $workspace
    $cmdpath down
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile && rm -f $pidfile

    return $retval
}

restart() {
    stop
    sleep 3
    start
}

depend() {
    need docker
}
```

## systemd (CentOS7)

<span class="red">※2017/07/26 systemd版が必要になったので追記</span>

↓で一応動くのですが ``Type=simple`` だと課題がありまして、 ``systemctl start your-service-name`` でサービス (docker-compose) が起動した瞬間に戻って来るので、コンテナの一つが起動に失敗していても、サービスとしては起動成功とみなされてしまいます。

うまい方法を何方か教えて下さい。
m(_ _)m

```ini
[Unit]
Description=Dockerized Your Service
After=docker.service
BindsTo=docker.service
Conflicts=shutdown.target reboot.target halt.target

[Service]
Type=simple
Environment=APP='your-service-name'
TimeoutStartSec=0
TimeoutStopSec=60
Restart=always
RestartSec=10

WorkingDirectory=/usr/local/your-service-name/
ExecStart=/usr/bin/docker-compose -f docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f docker-compose.yml down

NotifyAccess=all

[Install]
WantedBy=multi-user.target
```


[docker-compose]:https://docs.docker.com/compose/