OmniAICreator/Qiita-1.07M huggingface dataset:
SourceTreeとEclipseでGitを使う

# SourceTreeとEclipseでGitを使う

## 今回の目標
リモートのGitリポジトリをローカルにクローンして、それをEclipseで編集できるようにする(Eclipseでの編集がSourceTreeから確認できる)

## 事前準備
SourceTree、Eclipseをインストールしておく

## 今回の実行環境
OS：Windows7
SourceTree：1.6.23.0
Eclipse：4.4.2

## 実施手順
1. リモートリポジトリのクローン
2. EclipseにローカルGitリポジトリの登録
3. リモートリポジトリへのPush

### 1. リモートGitのクローン
SourceTreeを開き、リモートリポジトリのURL等からローカル環境へクローンを行う

![Qiita用SourceTree.png](https://qiita-image-store.s3.amazonaws.com/0/139291/c151313b-e21f-2163-0cf6-9f2a0d42fef4.png)

### 2. EclipseにローカルGitの登録
2-1. 「パースペクティブを開く」からGitを追加
2-2. 「既存のローカル Gitリポジトリーを追加」を選択し、手順1.でクローンしたローカルリポジトリを指定する
2-3. パースペクティブを変更し(今回はJava)、パッケージ・エクスプローラーにて右クリック→インポートを選択
2-4. 「インポート・ソースの選択」→「Git」→「Gitからプロジェクト」を選択し、「次へ(N)>」をクリック
2-5. 「既存のローカル・リポジトリー」を選択後「次へ(N)>」をクリック
2-6. 手順2-2.で追加したローカルリポジトリが表示されるはずなので、それを選択し「次へ(N)>」をクリック
2-7. 既存プロジェクトのインポート(E)→「次へ(N)>」をクリック後、インポートしたい「プロジェクト」にチェックを入れ「完了」をクリック。プロジェクトが追加されます

![Qiita用Git_1.png](https://qiita-image-store.s3.amazonaws.com/0/139291/acaf0af2-5721-5f6a-a091-3718b3c887dc.png)

![Qiita用_git_project.png](https://qiita-image-store.s3.amazonaws.com/0/139291/a6f9eed2-7ab5-db55-5e93-50767c35da15.png)


### 3. リモートへのPush
Eclipse等でプロジェクト内のファイル編集を行った場合、SourceTreeの「ファイルステータス」→「作業コピー」にて編集したファイルが表示されている。
そこまできたら、適宜コミット、プッシュ等を行なっていく
grafanaでadminのパスワードがわからなくなった時の対処方法

# 前提

grafana.iniを既定設定で利用している場合は、SQLITE3で情報が管理されている。
そのため、ユーザー情報もそこに格納されているので、SQLITE3のデータベースに接続して、userテーブルを修正すれば復活できる。

# sqlite3のインストール

sqlite3操作のためにインストール。
（sqlite3のクライアントだけ入れたかったのだけどわからず）

```
apt-get update
apt-get install sqlite3 
```

# grafana DBの操作

データベースがあるパスに移動して接続。

```
cd cd /var/lib/grafana/
sqlite3 grafana.db 
```

# adminユーザーのパスワードリセット

adminユーザーのパスワードをadminに[戻す](https://github.com/grafana/grafana/issues/1815#issuecomment-127717696)。

```
update user set password = '59acf18b94d7eb0694c61e60ce44c110c7a683ac6a8f09580d626f90f4a242000746579358d77dd9e570e83fa24faa88a8a6', salt = 'F3FAxVm33R' where login = 'admin'
```
Backlog(ヌーラボ)課題一括削除スクリプト

Backlog(ヌーラボ)のWeb画面から一括で課題(チケット)を削除する機能は標準で用意されていないようなので、Backlog-APIを使って一括削除するスクリプトを作成してみた。
結構[要望](http://feedback.backlog.jp/forums/140671-backlog-%E3%81%B8%E3%81%AE%E8%A6%81%E6%9C%9B-%E5%95%8F%E9%A1%8C%E3%81%AE%E5%A0%B1%E5%91%8A/suggestions/13532535-%E8%AA%B2%E9%A1%8C%E3%81%AE%E4%B8%80%E6%8B%AC%E7%B7%A8%E9%9B%86%E7%94%BB%E9%9D%A2%E3%81%8B%E3%82%89%E8%AA%B2%E9%A1%8C%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E5%89%8A%E9%99%A4%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%A6%E3%81%BB%E3%81%97%E3%81%84
"要望")は出ているようなのでQiitaで共有しておく

# 動作環境
OS: Linux等のBash及び以下のコマンドが使える環境
S/W: curl,jq(※apt-get等で予め取得)

# Backlog API-Key取得

以下からAPI-Keyを取得(※管理者権限ユーザのみ)
https://xxx.backlog.jp/EditApiSettings.action
※xxxはスペース名

# 一括削除スクリプト

課題(チケット)一括削除スクリプト(サンプル) 

```bash:backlog_delete.sh
#!/bin/bash
#===============================
# Backlog Delete Batch Script
#===============================

#-------------------------------
# Backlog Enviroment Variables
#-------------------------------
BACKLOG_API_KEY="<API-Key>"
BACKLOG_DELETE_LIST_FILE="backlog_delete_list.txt"
BACKLOG_SPACE="<Baclog-SpaceName>"

cat ${BACKLOG_DELETE_LIST_FILE} | while read BACKLOG_ID
do
	result=`curl -s -X DELETE https://${BACKLOG_SPACE}.backlog.jp/api/v2/issues/${BACKLOG_ID}?apiKey=${BACKLOG_API_KEY}`
	echo $result | jq '.'
done

exit 0
```

# 削除リストファイル

削除対象課題IDのリストを作成する。
(※親子関係を持つ場合は子を先に削除しないとエラーとなります)

```text:backlog_delete_list.txt
issueIdOrKey-002(子ID)
issueIdOrKey-003(子ID)
issueIdOrKey-004(子ID)
issueIdOrKey-005(子ID)
issueIdOrKey-001(親ID)
:
```

# 実行方法

スクリプトの実行方法は以下の通り
(※事前にバックアップなどを忘れずに)

```
$ mkdir tmp; cd ./tmp
$ vim backlog_delete.sh
---
・上記の「一括削除スクリプト」をCopy&Paste
・API-Key、スペース名を環境に合わせて設定
---
$ vim backlog_delete_list.txt
---
上記の「削除リストファイル」を参考に削除リストを作成
---
$ chmod 755 ./backlog_delete.sh
$ ./backup_delete.sh
```
vi　コマンド集

#概要
viのコマンドモードで便利なコマンドをまとめました。
viにはコマンドモードとインサートモードの二つがあります。

・コマンドモード
ファイル内に直接文字をタイプしても入力されない状態。
起動時はこちらの状態。
こちらで使用できるコマンドを以下に紹介します。

・インサートモード
ファイル内に直接文字を入力できるモード。
ここでは今から紹介する(コマンドモードの際の)コマンドは使用できません。
(移動は矢印ボタンで)


#モード変更
|コマンド|動作|
|:-----------|:------------:|
|i|コマンドモードからインサートモードに変更|
|escキー|インサートモードからコマンドモードに変更|


##カーソル移動
|コマンド|動作|
|:-----------|:------------:|
|J|下移動|
|K|上移動|
|L|右移動|
|H|左移動|

キーボードの"J"のところに膨らみがあるので
その周辺がカーソル移動キーと覚えておくと良いです。


##カット、コピー、ペースト
|コマンド|動作|
|:-----------|:------------:|
|dd|カーソルのある行を一行削除|
|yy|カーソルのある行を一行コピー|
|P|カーソルの前にペースト|
|p|カーソルの後ろにペースト|


##検索、置換
|コマンド|動く方向|
|:-----------|:------------:|
|/検索したい文字列|指定した文字列を検索|
|n|該当文字列が複数ある場合次(下)へ|
|N|該当文字列が複数ある場合次(上)へ|


##保存、終了
|コマンド|動作|
|:-----------|:------------:|
|:w|保存|
|:wq|保存してから閉じる|
|:q!|何も変更を加えず閉じる|
AWSサーバーに独自ドメインを設定する[編集中]

AWSサーバーにお名前.comで取得した独自ドメインを設定する手順を書きます。
これ以外でも設定する方法はあると思いますが自分がやった方法です。
ドメインは**[お名前.com](http://www.onamae.com)**で取得済みのものとします。
手順1~3は全てAWSコンソールでの操作で、手順4はお名前.comでの操作です。


作業時間目安 30分くらい？
設定が反映されるまで15分くらい?(設定によっては最大72時間)

参考
[IPアドレスとドメインを結びつける、DNSサーバの役割と名前解決の仕組み](http://oxynotes.com/?p=3919)
[お名前.comからAmazon Route 53へドメインを移管する](http://dev.classmethod.jp/cloud/aws/onamae-to-route53/)

#手順
1.AWSコンソールにアクセスし、**EC2インスタンス**を立ち上げる
2.立ち上げたEC2インスタンスに**ElasticIP**を紐付ける
3.AWSコンソールの**Route53**でドメインの紐付け設定し、ネームサーバー情報をメモしておく
4.**[ドメインナビ](https://www.onamae.com/domain/navi/domain)**にログインしてネームサーバー情報を入力する
## 1.AWSコンソールにアクセス、EC2インスタンスを立ち上げる

## 2.立ち上げたEC2インスタンスにElasticIPを紐付ける

## 3.AWSコンソールのRoute53でドメインの紐付け設定し、ネームサーバー情報をメモしておく

## 4.[ドメインナビ](https://www.onamae.com/domain/navi/domain)にログインしてネームサーバー情報を入力する
快適なSSH接続できる環境を整える

やったこと

 - Atomを使えるようにした。
 - パスワード認証から秘密鍵認証に切り替えた。

環境：macOS 10.12

## パスワードを使ったリモートログインではなく、公開鍵秘密鍵を利用した接続方式でセキュリティを確保する（ssh-keygen）
### 秘密鍵公開鍵を発行する

```:local_terminal
$ ssh-keygen -t rsa -f id_rsa
```
オプション-tは暗号化方式を指定。-fは出力ファイル名を指定。
上のように実行すると、id_rsa id_rsa.pubの二つのファイルが作成される。前者は秘密鍵で、自分のローカルに置いておく。後者は公開鍵で、SSH接続する先のサーバなり何なりに置いておく。
http://qiita.com/gotohiro55/items/36a22516de2b381b3c6e

### パスワードログインを無効化する
http://www.math.s.chiba-u.ac.jp/~sakurai/tmp/SSH.html#disable

### ssh-add ssh-?(nandakke) でパスフレーズ入力を省略する
http://qiita.com/isaoshimizu/items/84ac5a0b1d42b9d355cf

```:/etc/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
```
コメントインしてnoとする。両方必要。

## タイムアウトを防止する
http://www.maruko2.com/mw/ssh_接続をタイムアウトしないようにする


```~/.ssh/config
# sshd サーバと応答確認する間隔を設定する。分かな？
ServerAliveInterval 15
```

## 再起動してもssh-addをやり直さなくていい方法😆
### Sierraより前
`$ ssh-add -K {path to the key}`
これでキーチェンに保存されて、Macをログアウトしても覚えていてくれるとのこと。
http://unix.stackexchange.com/a/140077
### Sierra以降
上のコマンドが効かなくなっている。そのため.ssh/configに以下を記入する。

```~/.ssh/config
Host *
    # 下3行：ssh-add -KがSierraで効かないことの代替手段
    AddKeysToAgent yes
    UseKeychain yes
    IdentityFile /Users/user_name/.ssh/id_rsa
```
これでターミナルを再起動（習慣的にやった）して、いっかいsshアクセスしてパスフレーズを入力すれば、ログアウトしても覚えていてくれた！いぇぃ！
参考：https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain

# SSHしたファイルをローカルのAtomで編集できるようにする
[remote-atom](https://atom.io/packages/remote-atom)というatomプラグインを利用することで、SSH接続先のファイルをローカルのatomで開いて編集できるようになる。
これを利用するためには、rmateというツールが必要になる。これをSSH接続するリモート環境にインストールする。

```:remote
curl -o /usr/local/bin/rmate https://raw.githubusercontent.com/aurora/rmate/master/rmate
chmod +x /usr/local/bin/rmate
```
インストール先は適宜自分用に書き換えて使用すること。


http://qiita.com/informationsea/items/d2576b1ab678965d9a02
### Atom rmate
Atomのポートフォワーディングがポートが使われていますと怒られる時
http://stackoverflow.com/questions/11818131/warning-remote-port-forwarding-failed-for-listen-port-52698

```remote_terminal.
$ lsof -i -P | grep 52698
$ sudo kill -9 xxxx 
```

xxxxはプロセスのid.4桁の数字。

# 応用
GitHubに接続するときに使う
http://qiita.com/katsukii/items/9fd5bbe822904d7cdd0a
cronでログファイル名を実行日時に設定するときの注意

cronでバッチを実行し標準出力(エラーも含む)を `2017-01-01-12-00-00.log` のような形式で出力を試みた。
`/var/log/cron` のログ的にはバッチは実行されているが、ログファイルは出力されていなくてハマった。

# 確認環境

* AmazonLinux

# ダメな設定

```bash:/etc/crontab
0 * * * * user-name /path/to/command arg >> /var/log/test-`date +%Y-%m-%d-%H-%M-%S`.log 2>&1
```

shell上から /path/to 以下を実行した際は、問題なくログファイルが出力されていたが、cronで実行した際はログファイルが出力されていない。
実際、`/var/log/cron`のログを見ると、動的に生成されたファイル名の箇所が **batch_`date +)**と、意図しない形式になっていた。

# 正しい設定

[crontab(5)](https://www.freebsd.org/cgi/man.cgi?crontab(5)) によると、`%` は区切り文字として認識されていて、それ以降は実行されず、標準入力として扱われていたようだ。

> The entire command portion of the line, up to a newline or %	char-
     acter, will be executed by	/bin/sh	or by the shell	specified in the SHELL
     variable of the cronfile.	Percent-signs (%) in the command, unless
     escaped with backslash (\), will be changed into newline characters, and
     all data after the	first %	will be	sent to	the command as standard	input.

エスケープする必要があるようだ。

```bash:/etc/crontab
0 * * * * user-name /path/to/command arg >> /var/log/test-`date +\%Y-\%m-\%d-\%H-\%M-\%S`.log 2>&1
```

# 参考

* https://blog.manabusakai.com/2013/05/crontab-escape-percent/
* https://www.freebsd.org/cgi/man.cgi?crontab(5)
.NETで割り算の結果を整数にしたいとき

C#でおもむろに
```int a = 3/2; ```
なんてやるとaの結果は1になります。
つまりは切り捨てです。

切り上げや四捨五入をしたいときはこう？なんかめんどくさい・・・
```int a = Convert.ToInt32(Math.Ceiling((double)3/2));```

Math関数
- Floor  :切り捨て
- Ceiling:切り上げ
- Round  :銀行丸め（パラメータにより四捨五入）
capistranoでデプロイ完了時にSlackにうまるちゃんが通知してくれる様にした

#Capistrano デプロイ完了　通知 script
capistranoのデプロイScript内に以下を追記

```deploy.rb
namespace :deploy do
  task :cleanup do
    on roles(:app) do
      execute 'curl -s -S -X POST --data-urlencode "payload={\"channel\": \"#通知したいチャンネル名\", \"username\": \"umaru\", \"icon_emoji\": \":umaru:\", \"text\": \"デプロイ完了したよ〜\" }" "Slackのウェブフック通知様APIキー" >/dev/null'
    end
  end
end
```

* うまるちゃんのアイコンは手動で登録お願いします
* cleanupタスクの実行時に完了通知で良いのかという議論が残っています
htmlのformからjavascriptへ文字を渡してhtmlのtableに表示する

昨晩ムカデ人間という映画を見て絶句しました。よければ[こっち](http://off.tokyo/blog/2017/04/03/html-form-javascript-table/)で見ていただければ幸いです。



# html

<img width="287" alt="スクリーンショット 2017-04-03 13.28.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/78db963a-3a57-ff56-357b-9fc5b5ce1c50.png">

　　　　　　　　↓


<img width="287" alt="スクリーンショット 2017-04-03 13.28.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/403960b0-6cf2-7b92-c1ff-37e739f7c5f1.png">


### form

```index.html
<form name = "form">
<input type="text" name="txtb" id="textid">
<input type="button" value="決定！" onclick="tbox1()">
</form>
```

### table

```index.html

    <!-- テーブル実装 -->
    <table class = "Table">
      <tbody>
        <tr>
	        <th scope="row">項目名</th>
	        <td> <div id="textoutput"></div> </td>
	    </tr>
    </tbody>
    	</table>
```

# Javascript

### script

```script.js
//textboxの文字を取得する
function tbox1(){

str1 = document.form.txtb.value;

console.log(str1);


var x = document.getElementById('textid').value;
  numx = parseInt(x);
  numx = numx + 1;
  document.getElementById('textoutput').innerHTML = x;

};
```

# 参考

[formからjavascriptへ値を渡してhtmlで表示する](http://sonoshou.hatenablog.jp/entry/20110729/1311968271)
PostCSS CLI をv3に上げたら設定が反映されないときの対処法

yarnでupgrade-interactiveしてお気軽にpoctcss-cliをアップデートしたらPostCSSの設定が全部効かなくなって焦りました。
とりあえず対処法をメモしておきます。

## とにかくこれを見る
[Migrating from v2 to v3](https://github.com/postcss/postcss-cli/wiki/Migrating-from-v2-to-v3)

設定が変更されているので、かいつまんで説明すると、

- 順序の変更
    - 一番最初に読み込みディレクトリ、もしくはファイルの設定をしなくてはならなくなった
- pocscss.config.jsでの設定
    - useではなくpluginsの中にプラグインの設定をするようになった
    - [PostCSS Load Config](https://github.com/michael-ciniawsky/postcss-load-config)というプラグインが裏で動くようになったみたいなので、なにかおかしいときは設定を調整する
    -  設定は大体設定ファイルでやったほうが良いかも。JSならdevelopmentとproductionで分岐もできるので

---

PostCSSも色々大変だなあという感じです
Azure サブスクリプションもクレカも無しで始める Azure Machine Learning

#注意事項#
(2021年10月6日更新)
本記事で取り扱っている Azure Machine Learning については、2021年10月時点での [Azure Machine Learning Studio (Classic)](https://docs.microsoft.com/ja-jp/azure/machine-learning/classic/studio-classic-overview) となります。

[Azure Machine Learning Studio (Classic)](https://docs.microsoft.com/ja-jp/azure/machine-learning/classic/studio-classic-overview) については、2024年8月31日にサポート終了がアナウンスされています。[Azure Machine Learning](https://azure.microsoft.com/ja-jp/services/machine-learning/) への移行が推奨されていますのでご注意ください。

#はじめに#

[こちらの記事](http://qiita.com/yomatsum/items/9aebcd475ebd574db939) で Azure Machine Learning 内のモジュール名称の変更について投稿しました。
今回は、モジュール名？そもそもモジュールって何？という方が、実際に Azure Machine Learning 上でモジュール名を確認できるように、使い始め方をまとめてみたいと思います。

# Microsoft アカウントを準備する

既に Microsoft アカウントをお持ちの方は、そのまま使うことができます。Outlook.com や Hotmail 等をご利用いただいている方は、そのメールアカウントがそのまま Microsoft アカウントになっています。

まだ持ってないよ！という方は下記にアクセスして新しいアカウントを作成してください。
https://signup.live.com/

# 無償版がどのようなものかを確認

Azure Machine Learning は無償版と Standard 版の2種類があります。両者の違いは Azure Machine Learning の価格ページに記載があります。

![Azure ML Free and Standard.png](https://qiita-image-store.s3.amazonaws.com/0/163305/ffac13ce-74ae-7b99-f53e-ed7f58c750c6.png)

上記はこの記事を投稿した時点でのスナップショットです。最新の情報については、必ず下記のリンクを参照してください。
https://azure.microsoft.com/ja-jp/pricing/details/machine-learning/

# 無償版のAzure Machine Learning を有効化する

無償版を有効にするために、まずは以下のURLにアクセスします。
https://studio.azureml.net/

![studio.azureml.net top.png](https://qiita-image-store.s3.amazonaws.com/0/163305/2098ceb6-276f-57f0-7382-e8700bb31f20.png)

Sign Up ボタンをクリックします。

![studio.azureml.net sign up.png](https://qiita-image-store.s3.amazonaws.com/0/163305/846c0122-a3ea-4269-fded-4196e3fb97b3.png)


利用可能な 3 つのプランが表示されます。

- 左側はゲスト ワークスペースです。8時間だけ Azure Machine Learning を試すことができますが、8時間経過するとすべて削除されてしまいます。
- 右側はスタンダード版のワークスペースです。利用可能な Azure サブスクリプションが必要になります。
- 中央が無償版の Azure Machine Learning です。今回はこれを利用したいので、中央の Sign In ボタンをクリックします。

![studio.azureml.net sign in.png](https://qiita-image-store.s3.amazonaws.com/0/163305/82db0ab6-63bd-1c24-c3d8-a642ed2e29f0.png)


表示された画面に、Microsoft アカウントとして登録されているメールアドレスを入力します。メールアドレスのテキストボックスからフォーカスが外れた時点で、自動的に次の画面へと遷移します。

![studio.azureml.net password.png](https://qiita-image-store.s3.amazonaws.com/0/163305/edfc2a2d-cb05-2922-7736-8b3269833c76.png)

Microsoft アカウントのパスワードを入力します。パスワードを入力して サインイン ボタンをクリックすると画面が遷移します。

![studio.azureml.net studio.png](https://qiita-image-store.s3.amazonaws.com/0/163305/25c68c5d-3b93-36ff-923c-7f4458548df5.png)

これで、Azure Machine Learning を利用することができるようになりました。

# 次のステップ

今回の記事はここまでです。次は実際に、モジュールの名前を確認するところまでをまとめてみたいと思います。
Visual C++ 2017のバージョン番号がややこしすぎる件

先日、Visual Stduio 2017が公開されました。
これにはVisual C++ 2017も含まれています。

各種ツール群がVisual StudioやVisual C++のバージョンを指定する際に、外部バージョン（2017）ではなく、内部バージョンを指定する必要があることが多いです。

|製品|外部バージョン|内部バージョン|
|----|-------------|------------|
|Visual Studio|2013|12.0|
|Visual Studio|2015|14.0|

のように、似ているけど微妙に異なるから、混乱してました。
そして、Visual Studio 2017はますます混乱しているようです。

|製品|外部バージョン|内部バージョン|
|----|-------------|------------|
|Visual **Studio**|2017|15.0|
|Visual **C++**|2017|14.1|

裏をとれていないのですが、業界では上記解釈になっている様子です。裏付け情報を知っている方いらっしゃいましたら、是非教えてください。
（内部バージョン番号だから正式開示はないかもしれません。ならば、何故内部バージョン番号を使うのか？　外部から取れるのが内部バージョンだけとか？）

不十分ですが、下記を見つけています。

- [Visual C++ 2017のバージョン番号を14.1とする](https://github.com/cpprefjp/site/issues/387)
- [Visual Studio 2017 support](https://dev.opencascade.org/index.php?q=node/1190)<br>
マイクロフソトのブログへリンクしてますが、リンク切れてます。でも、見つけました。
[Visual C++ Compiler Version](https://blogs.msdn.microsoft.com/vcblog/2016/10/05/visual-c-compiler-version/)です。
同じ文言があります。<br>しかし、Visual Studio 2017が15.0でVisual C++が14.1とはかかれていません。VSのメジャーバージョン番号とVC++のメジャーバージョン番号が異なることが読み取れるだけです。（ここでもVS2015とVS2017が混乱しているっぽいし、まじ分かりにくすぎ。）

---
元ネタはTwitterからです。

- [14.1っていうのがVS2017ですね](https://twitter.com/yumetodo/status/848734913767526400)
- [これ、VSの内部バージョンとVC++の内部バージョンが狂うという面倒な事態なんだよなぁ。](https://twitter.com/espresso3389/status/848740364437475328)
サブドメイン/サブディレクトリの違い

##サブドメイン
abc.example.comのようにドメインの先頭に、サブドメインを追加。

メリット
・別のサーバーにサブドメインだけ移行できる。

デメリット
・seo的にはサブディレクトリに比べて不利？

##サブディレクトリ
example.com/abcのように、ディレクトリを作成。

メリット
・ルートドメインのSEO結果が反映される。

デメリット
・サーバーの容量の移行が、ディレクトリ単位ではできない。
GitBucketを自前のサーバーに構築しよう

- GitBucketを自サーバーに構築
- 
非公開リポジトリが必要だっため、GitHubクローンであるGitBucketを導入した。
OSはCentOSで以下が詳細である。

```
$cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```
###1. JDKのインストール
GitBucketを動かすためにはjavaが必要なので、まずはjdkをインストールする。
ここでは最新のjdkをインストールすることにする。

```
$yum install java-1.8.0-openjdk.x86_64
```
###2. Tomcatのインストール
次にJava Servletを動かすために、Tomcatをインストールする。

```
$yum install -y tomcat
```
インストールしたら、/user/share/tomcatがあることを確認。
###3. GitBucketのインストール
次に本題であるGitBucketをインストールする。
私は、一番最新のGitBucketではなく、バーション4.7.1をインストールした。
現在最新のバージョンは4.10みたいです。（2017年3月時点）
wgetで、先ほどのtomcat配下のwebappsにGitBucketをインストールする。
wgetをインストールしていなければ、以下のコマンドでインストールしてください。

wgetインストール

```
$sudo yum install wget
```

GitBucketインストール

```
$wget -P /usr/share/tomcat/webapps/ https://github.com/gitbucket/gitbucket/releases/download/4.7.1/gitbucket.war
```
###4. Tomcat自動起動設定
GitBucketがインストールし終わったら、tomcatの自動起動設定をする。
tomcatが自動で起動するように、以下２つのコマンドを叩く。

```
$systemctl start tomcat
$systemctl enable tomcat
```
###5. Tomcatポート変更
設定したいTomcatのポート番号を変更します。
```
$vi /usr/share/tomcat/conf/server.xml
```
71〜73行目にポート設定の記述があり、デフォルトでは以下のようになっています。

``` xml:server.xml
<Connector port="8080" protocol="HTTP/1.1"                                                                                                                                       
           connectionTimeout="20000"                                                                                                                                                           
           redirectPort="8443" />   
```
この71行目の以下の部分に設定したいポート番号を記述します。

``` xml:server.xml
<Connector port="ここに設定したいポート番号" protocol="HTTP/1.1"                                                                                                                                       
           connectionTimeout="20000"                                                                                                                                                           
           redirectPort="8443" />   
```
###6. Appatchのインストール
表題の通りAppatchをインストールします。

```
$yum -y install httpd
```
Appathの初期設定は各自でお願いします。
###7. 設定したポートの開放
さきほど設定したポートを開放するために、以下のコマンドを叩きます。

```
$ firewall-cmd --add-port=設定したポート番号/tcp --zone=public --permanent
$ firewall-cmd —reload  

設定の内容の確認のため下のコマンドを叩く。
$ firewall-cmd --list-all
```
###8. Appatchの自動起動設定
tomcat同様に自動起動させるため、以下のコマンドを叩きます。

```
$systemctl start httpd
$systemctl enable httpd
```

###9. GitBucketの画面が表示されるか確認
以下のURLにアクセスし、ブラウザでGitBucketのページが確認できれば、構築成功です。
http://アドレス:設定したポート番号/gitbucket

次回はこのGitBucketを用いた、webサーバーとの自動同期方法について
書きたいと思います。
[UniRx]CombineLatestで片方のObservableのみに反応させる


# やりたいこと

CombineLatestでまとめたObservableのどちらが流れてきたかを判断して、その片方のみで処理を行いたい。

# 普通にCombineLatest

```cs
var Subject1 = new Subject<string>();
var Subject2 = new Subject<string>();

Observable.CombineLatest(Subject1, Subject2, (subject1, subject2) =>
    {
        return new Tuple<string, string>(subject1, subject2);
    })
    .Subscribe(tuple => Debug.Log("subject1: " + tuple.Item1 + ", subject2: " + tuple.Item2));

Subject1.OnNext("1");
Subject2.OnNext("1");

Subject1.OnNext("2");
Subject2.OnNext("2");

Subject1.OnNext("3");
Subject2.OnNext("3");
```

```
subject1: 1, subject2: 1
subject1: 2, subject2: 1
subject1: 2, subject2: 2
subject1: 3, subject2: 2
subject1: 3, subject2: 3
```

両方流れてきた以降は片方が流れてくる度に処理される。

# やりたいCombineLatest

```cs
var Subject1 = new Subject<string>();
var Subject2 = new Subject<string>();

Observable.CombineLatest(Subject1.Timestamp(), Subject2.Timestamp(), (subject1, subject2) =>
    {
        // TimeStampを見て、新しい方が今流れてきたと判断
        var isUpdatedSubject1 = subject1.Timestamp > subject2.Timestamp;
        return new Tuple<string, string, bool>(subject1.Value, subject2.Value, isUpdatedSubject1);
    })
    .Where(tuple => tuple.Item3)
    .Subscribe(tuple => Debug.Log("subject1: " + tuple.Item1 + ", subject2: " + tuple.Item2));
    
Subject1.OnNext("1");
Subject2.OnNext("1");

Subject1.OnNext("2");
Subject2.OnNext("2");

Subject1.OnNext("3");
Subject2.OnNext("3");
```

```
subject1: 2, subject2: 1
subject1: 3, subject2: 2
```

両方流れてきた以降、片方（subject1）が流れてくる度に処理される。
PHPのdebug_backtraceで必要な項目だけを出力する

`object`の情報までdumpしてしまうとログが溢れて困るような場合、`array_intersect_key`と併用すると絞り込めて便利な気がしました。

```php
array_intersect_key($trace, [
        'function' => '',
        'line' => '',
        'file' => '',
        'class' => '',
        'type' => '',
    ]);
    }, debug_backtrace()
);
```
Kaggle - Dogs vs. Cats Redux: Kernels Edition

## [Dogs vs. Cats Redux: Kernels Edition](https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition)

## 問題概要
犬か猫かを見分ける問題

## Datasets.
#### 訓練データ
- ネコ: 25,000
- イヌ: 25,000

#### テストデータ
- 12500

## Solutions
転移学習のありがたみが分かる問題．

- ImageNetで学習済みのResNet-50を利用し転移学習
- ResNet-50のボトルネック(2048)と出力(2)とを結ぶ全結合層を作る．
- 前処理は従来のResNet-50での処理と同様
- KFold(K=5)でモデルを5つ作り，その予測値の平均を予測値とする．
- 外れた際のロスを軽減させるため，0.02, 0.98でclip

### Architecture
```
____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
input_1 (InputLayer)             (None, 224, 224, 3)   0                                            
____________________________________________________________________________________________________
lambda_1 (Lambda)                (None, 224, 224, 3)   0           input_1[0][0]                    
____________________________________________________________________________________________________
resnet50 (Model)                 (None, 1, 1, 2048)    23587712    lambda_1[0][0]                   
____________________________________________________________________________________________________
flatten_1 (Flatten)              (None, 2048)          0           resnet50[1][0]                   
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 2)             4098        flatten_1[0][0]                  
====================================================================================================
Total params: 23,591,810
Trainable params: 4,098
Non-trainable params: 23,587,712
____________________________________________________________________________________________________
```

## Memo
- 今回は転移学習させたほうが重み付けしていないネットワークより性能が段違いで良い．
- 前処理もLambdaでネットワークに組み込んだ方が，あとあとどの前処理を使ったかで悩まなくてよいので良さ気．

## Repository
- [kaggle-dogs-vs-cats](https://github.com/namakemono/kaggle-dogs-vs-cats)

## References
- \[1\]. [Kaggle - Dogs vs. Cats Redux: Kernels Edition](https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition)

- \[2\]. [Github - daavoo, kaggle_solutions](https://github.com/daavoo/kaggle_solutions/tree/master/dogs_vs_cats)
Dogs vs. Cats でResNet-50を用いて性能をだしたという報告．

- \[3\]. https://keras.io/ja/getting-started/functional-api-guide/
複雑なモデルを構築するための方法が記載されている．
canvasの図形を画像として出力する時のブラウザ毎の処理

canvasに描かれた図形を画像として出力する方法としてデータURIスキームの方法もありますがBlobを使用した出力方法もあるので、それぞれのブラウザ毎に出力を分けてローカルに保存できるようにしてみます。

#canvasの図形を画像出力する

既に何か描かれているcanvas要素から画像を出力するコードです。

```js
var
  // canvas要素
  canvas = document.querySelector('#canvas'),

  // 出力した画像を表示するimg要素
  image = document.querySelector('#outputImg'),

  // 画像のダウンロードリンク
  link = document.querySelector('#downloadLink'),

  blob, imageURL;

// リンクにdownload属性を設定
link.download = 'canvas.png';

if (canvas.toBlob) {
  // HTMLCanvasElement.toBlob() が使用できる場合

  // canvasの図形をPNG形式のBlobオブジェクトに変換
  canvas.toBlob(function (blob) {
    // BlobオブジェクトにアクセスできるURLを生成
    imageURL = URL.createObjectURL(blob);

    // 要素にURLを適用
    image.src = imageURL;
    link.href = imageURL;
  });

} else if (canvas.msToBlob) {
  // IE10以降やEDGEで使えるメソッド

  // canvasの図形からPNG形式のBlobオブジェクトを取得
  blob = canvas.msToBlob();

  // BlobオブジェクトにアクセスできるURLを生成
  imageURL = URL.createObjectURL(blob);

  // 要素にURLを適用
  image.src = imageURL;
  link.href = imageURL;

  // IEとEDGEの場合 navigator.msSaveBlob() でBlobオブジェクトを保存できるメソッドがある
  link.addEventListener('click', function (ev) {
    ev.preventDefault();
    navigator.msSaveBlob(blob, 'canvas.png');
  });

} else {
  // Blobオブジェクトに変換できない場合はPNG形式のデータURIスキームとして出力
  imageURL = canvas.toDataURL();

  // 要素にURLを適用
  image.src = imageURL;
  link.href = imageURL;
}
```

Blobオブジェクト用のURLは `blob:https://example.com/12345678-1234-5678-9012-123456789012` や `blob:12345678-1234-5678-9012-123456789012` といったような特殊なものになっています。
実際にサーバーにこのファイルがあるわけではなく、ブラウザ内部で持っているバイナリデータにアクセスするためのURLみたいなものですね。
このURLは `URL.revokeObjectURL(blobURL)` を使用したり、他のページへ遷移した時に破棄されます。

`HTMLCanvasElement.toBlob()` が非同期処理なのに対し、IE・EDGE独自実装の `HTMLCanvasElement.msToBlob()` は非同期処理ではないので大きな図形を扱う場合 `msToBlob()` では変換が終わるまで他のコードが実行できない事になります。

[HTMLCanvasElement.toBlob() - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/HTMLCanvasElement/toBlob)

MDNに `HTMLCanvasElement.toBlob()` のポリフィルもありますが、あくまでこういう処理でできるよ程度のものなので、パフォーマンスを考えると実用的ではありません。

##Blobオブジェクトのメリット

Blobオブジェクトであれば `blob.size` のように出力後のファイルサイズを取得することができます。
他にもimg要素に出力する時、データURIスキームだと画像のデータがテキストデータとして存在することになるので大き目の画像の場合ブラウザ側の動作が重くなる可能性がありますが、Blobオブジェクトの場合はブラウザ内部にバイナリデータとして持っているので動作は軽いです。

[Blob - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Blob)
ICST2017に参加してきました

こんにちは、[ノハナ](https://nohana.jp/)で品質管理を担当している田井です。
ノハナでは毎月１冊無料（送料別）で作成できるフォトブックアプリや、スマホから簡単に作成できる年賀状アプリを提供しています。

## はじめに
2017年3月14日から3月16日まで早稲田大学・西早稲田キャンパスで行われた「ICST2017」に参加してきました。
ICSTは「International Conference on Software Testing, Verification and Validation」の略で、IEEEというアメリカに本部を持つ電気工学と電子工学技術の学会が主催しています。
今年で節目の10回目となりますが、今までは北米とヨーロッパで開催されており、北米、ヨーロッパ以外で初めて開催される場所として東京が選ばれました。
<img class="alignnone size-medium wp-image-652" src="http://blog.nohana.co.jp/wp-content/uploads/2017/03/DSC_1645-1-e1490578214690-169x300.jpg" alt="" width="169" height="300" />

今年は世界各国から370名以上が参加しました。
本会議のメインは事前に応募された中から採択された研究論文、実践論文が30分の持ち時間で発表されるセッションです。発表は英語で行われるので英語力は必要ですが、一部は日本語への同時通訳が行われていました。
<img class="alignnone size-large wp-image-651" src="http://blog.nohana.co.jp/wp-content/uploads/2017/03/20170314_124743168-1-1024x576.jpg" alt="" width="720" height="405" />

## 特徴
このICSTはソフトウェア品質管理関連のシンポジウムであるJaSSTと比較して、アカデミックな発表が多いところが特徴です。大学関係者や学生も多く参加しています。
論文発表以外に、基調講演、討論会やテストツールのデモ、ポスターの展示などもあります。
ウェルカムレセプションやバンケット、コーヒーブレイクなどもあり、参加者の交流を図るイベントが多いのも特徴でしょうか。バンケットは池袋にあるサンシャイン60の展望レストランで行われ、280名以上が参加しました。
バンケットでは忍者ショーもあり、特に海外からの参加者に大好評でした。
<img class="alignnone size-large wp-image-650" src="http://blog.nohana.co.jp/wp-content/uploads/2017/03/DSC_1654-1024x576.jpg" alt="" width="720" height="405" />

## 目的
今回参加した目的として、日々の品質管理業務に活かせるものがあるのではないかということでした。その中で実際に取り入れてみようと思ったのが[BARISTA](http://play.google.com/store/apps/details?id=com.moquality.barista)です。
<a href="http://play.google.com/store/apps/details?id=com.moquality.barista" target="_blank"><img class="alignnone size-thumbnail wp-image-662" src="http://blog.nohana.co.jp/wp-content/uploads/2017/03/icon-150x150.png" alt="" width="150" height="150" /></a>
BARISTAはAndroidアプリ向けのテストケース生成ツールで、Playストアからもダウンロードできます。
生成したテストケースはエスプレッソなどのツールで、自動的に実行できます。
今までは手動で行っていた回帰テスト（変更を加えたことにより、アプリの機能に影響が出ていないことを確認するテスト）も、これを使い自動化することにより、工数削減と開発期間の短縮を達成できると考えています。
「TESTDROID RECORDER」や「ESPRESSO TEST RECORDER」などテストケース生成ツールはいくつもありますが、BARISTAが優れている点は以下のようなところです。

- インストールが簡単
- スマホの画面上でボタンや操作を指定することで自動でテストケースを生成
- 異なるメーカーの端末間での互換性が高い

### インストールが簡単
GooglePlayから通常のアプリをインストールする手順で完了します。

### スマホの画面上で簡単に自動でテストケースを生成
コードを書く必要はなく、BARISTAを起動し、操作を記憶するアプリを選択するだけで、スマホの画面上でボタン等を指定し、それに対する操作を指定することができます。
その後、サーバーにデータを送ると、メールでコードが送られてくる仕組みです。

### 異なるメーカーの端末間での互換性が高い
端末メーカーの細かい仕様によりテスト自動化ツールは実行時に制限を受けてしまうことが多いのですが、BARISTAは検証対象の7端末において、99.2％のテストケースを実施できたということです。　比較としてTESTDROID RECORDERは68.3％、ESPRESSO TEST RECORDERは36.3％という実施率だということでした。日本向けの端末ではどうかというとデータは少ないと思いますので、実際に試してみて確認できればと思います。

## 最後に
ICSTはアカデミック寄りのカンファレンスですが、実務でも活用できる発表がいくつもありました。BARISTAについては実際に導入を検討してみて、結果を後日ご報告したいと思います。
来年はスウェーデンで行われ、再来年は中国で開催される予定です。なかなか参加できないイベントですので、今回は貴重な体験をすることができました。
HTTP PHPのGETパラメーターの長さが512文字より大きいと消える

# <i class="fa fa-cubes"></i> 概要

PHPの
`$_SERVER["REQUEST_URI"]`
には
`/path/file?one= ~ そこそこ長い ~ &two=hogehoge`、
`["QUERY_STRING"]`にも`one= ~ そこそこ長い ~ &two=hogehoge`

と格納されているのに、
`$_GET`には`["two"]`しかない！という現象が起きた。

そう言えば**GET**にはリクエストの長さ制限があったなあーと初心に返ったのだが…
問題はブラウザやApacheではなかった。

# <i class="fa fa-graduation-cap" aria-hidden="true"></i> 結論

```
; suhosin.get.max_value_length
; ----------------------------
; * Type: Integer
; * Default: 512
;
; Defines the maximum length of a variable that is registered through the URL.
;
;suhosin.get.max_value_length = 512
;
```

おそらく守護神が主犯。
セキュリティの宿命ですが、Composer止められたり、いい思い出が無いぞ。

***

受け手のライブラリ、Apache、ブラウザ、HTTP、エンコード、圧縮、PHP、特殊文字などいろいろ思い浮かんで難しいぞ。

# <i class="fa fa-cube"></i> 調査方法

1. 「GET パラメーター 長さ」などでググる。  
ブラウザ、Apacheなどのよく遭遇しそうなのが出る。
2. Apacheの長さ制限(**LimitRequestLine**)はデフォルトでも手動で設定しても問題無い長さなのに解消しない。
3. パラメーターの文字列を短くし、問題の解消を確認。
4. 一文字ずつ追加し、消える直前のlengthを測る→512。
5. 「get param 512」などでググる。
6. suhosinっぽいよ。
7. suhosinオフにしたら解消したよ。(apacheのrestartを忘れずに)

# <i class="fa fa-book"></i> 参考

* [PHP - PHP GETパラメータに上限サイズを設定したい(1601)｜teratail]
* [php - Max size of URL parameters in _GET - Stack Overflow]
* [php - maximum length of post and get variable name - Stack Overflow]
* [Configuration | SUHOSIN]

* [core - Apache HTTP サーバ バージョン 2.2]
* [tech HTTP GETメソッドのURIの長さ制限を調べてみた - Kazumi007の日記]

[PHP - PHP GETパラメータに上限サイズを設定したい(1601)｜teratail]:https://teratail.com/questions/1601
[php - maximum length of post and get variable name - Stack Overflow]:http://stackoverflow.com/questions/17107364/maximum-length-of-post-and-get-variable-name
[php - Max size of URL parameters in _GET - Stack Overflow]:http://stackoverflow.com/questions/7724270/max-size-of-url-parameters-in-get
[Configuration | SUHOSIN]:https://suhosin.org/stories/configuration.html
[core - Apache HTTP サーバ バージョン 2.2]:https://httpd.apache.org/docs/2.2/ja/mod/core.html#limitrequestline
[tech HTTP GETメソッドのURIの長さ制限を調べてみた - Kazumi007の日記]:http://d.hatena.ne.jp/Kazumi007/20090921/1253501500
<fieldset>タグ

#`<fieldset>`タグ

`<FIELDSET>`はフォームの入力項目をグループ化する際に使用します。 グループの先頭には、`<LEGEND>～</LEGEND>`で入力項目グループにタイトルをつけます。

フォームの入力項目をグループ化することで、Tabキーなどでグループ間を簡単に移動できるという利点があります。

` <input>`・ `<select>`・ `<textarea>`等のフォーム部品がグループ化され、一般的なブラウザではボーダーで囲まれて表示されます。

フォーム部品のグループにキャプション（タイトルや説明）を付ける場合には、`<fieldset>`～<`/fieldset>`の中の 最初の`<legend>`で指定します。

#form属性
form属性は、どのフォームと関連付けるかを指定する際に使用します。
、 `<form>`のid属性の値と`<fieldset>`のform属性の値を一致させることで、 フォーム部品グループを特定のフォームと関連付けることができます。 フォーム部品を任意の場所に配置できます。
ionicをiosにデプロイする時にエラーが出る。

ionicで、作ったアプリをiphoneにデプロイしようとした時に、

```
xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH
```
というエラーが出ました。

stak overflowを調べてみると、公式で把握されてる、jenkins関連のバグだそうです。
今の所問題なさそう。

http://stackoverflow.com/questions/43068608/xcrun-error-unable-to-find-utility-packageapplication-not-a-developer-tool

[ionicをiosにデプロイ（公式ドキュメント）](http://ionicframework.com/docs/intro/deploying/)
bash > ディレクトリを移動して、コマンドを実行して、実行前のディレクトリに戻る > サブシェルを使った方法を教えていただきました

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

### 背景

以下が異なる。
- スクリプトディレクトリ
- データディレクトリ

データディレクトリ(複数)を切り替えながら、スクリプトを実行する。
viでの編集なども検討して、スクリプトディレクトリに常駐したい。

### `cd -`使用 > 要改善

`cd [dir]`と`cd -`を組合せてみた。

```bash
$ pwd
/home/user/WORK/BASH_170403

$ mkdir -pv TOP/MIDDLE/BOTTOM

$ cd TOP/MIDDLE/BOTTOM/; touch bfile; cd -
/home/user/WORK/BASH_170403

$ pwd
/home/user/WORK/BASH_170403
```

`touch bfile`には実際のスクリプト実行文が入る。

`;`で連結していることで、スクリプトが完了した場合でも、停止された場合でも、元のディレクトリに戻るようにしている。

上記のスクリプト実行分(データディレクトリ複数に対して複数ある）を複数用意して、ハッシュタグをつけて実行すれば、複数データディレクトリに対する動作チェックはしやすいように思う。
参考: [コマンド実行時にハッシュタグをつけて履歴から検索しやすくしてみる](http://qiita.com/akira6592/items/3ebd3f0ca2d93d5517f5)

```
$ cd TOP/MIDDLE/BOTTOM/; touch bfile; cd - #touchBfile
```

スクリプト自体に実行対象ディレクトリを指定する引数を用意するのは別案。

## 教えていただいた項目

@akinomyoga さんの[コメント](http://qiita.com/7of9/items/6675f62326ec657025e9/#comment-7986db7a41d788052ac7)にてサブシェルを使った方法を教えていただきました。

情報感謝です。

## 追記

`cd -`の実行方法ではスクリプトの書き方によってはCtrl+Cした時に元のディレクトリに戻らない状況もありました。例として、以下のスクリプトでは戻りませんでした。

```bash:sample_exec
#!/usr/bin/env bash

for loop in $(seq 1 10);do
	sleep 0.1
	date
done
```

サブシェルを使う方法の方が良さそうです。
[Unity][Shader] ビルド時にエラー"invalid input semantic 'POSITION' " が出力される

# 現象
エディターでは動いていたのですが、いざビルドしようとすると以下のエラーが出力される

    invalid input semantic 'POSITION'
   
エラーが出たコードは以下。
_CameraDepthTextureを使用せずに深度画像をレンダリングするシンプルなコードです。

	Pass {
		cull off

		CGPROGRAM
		#pragma target 3.0
		#pragma vertex vert
		#pragma fragment frag
		#include "UnityCG.cginc"
		
		struct v2f { 
			float4 pos : SV_POSITION;
		};

		v2f vert(appdata_base v)
		{
			v2f o = (v2f)0;
			o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
			return o;
		}

		float4 frag( v2f i ) : SV_Target
		{
			float depth = i.pos.z;
			return depth.xxxx;
		}
		ENDCG
	}
    

# 原因と対策
以下のサイトに情報が乗ってました。
http://www.boutin.de/hlsl-error-x4502-invalid-input-semantic-position/

POSITIONセマンティクスは頂点シェーダーでは使用できるが、フラグメントシェーダーでは使用できないとのことです。
考えてみれば、頂点を扱う変数をピクセルシェーダーで使用するのも変な話ですね。

頂点シェーダー内で、pos.zを別の変数に入れることで使用できました。
中心 O の単位円に内接する三角形 ABC について、 |OA+OB+OC|=1⇔ABCは直角三角形を示す

見かけてぱっと答えられなかったのでメモ。別解も色々あるらしい。

どっちかって言うと、Qiita に受験数学の解答を書いてみたかった。

# Q
> 中心 $O$ の単位円に内接する三角形 $ABC$ について、
> $|\overrightarrow{OA}+\overrightarrow{OB}+\overrightarrow{OC}| = 1 \Leftrightarrow ABC は直角三角形$
> を示せ

# A
## ⇐
一般性を失わずに $AB$ が長辺すなわち直径としていい。
このとき、 $\overrightarrow{OA} = -\overrightarrow{OB}$ だから、
$|\overrightarrow{OA}+\overrightarrow{OB}+\overrightarrow{OC}| = |\overrightarrow{OC}| = 1$

## ⇒
$OA$, $OB$, $OC$ それぞれの長さは 1 で、条件式より和も1である。
$OB$ を $A$ が始点となるように平行移動して $\overrightarrow{AB'}$ をとる。
また、$OC$ を $B'$ を始点となるように平行移動して $\overrightarrow{B'C'}$ をとる。

```math
|\overrightarrow{OA}+\overrightarrow{OB}+\overrightarrow{OC}| = |\overrightarrow{OA}+\overrightarrow{AB'}+\overrightarrow{B'C'}| = |\overrightarrow{AC'}| = 1
```

なので、4点 $OAB'C'$ の位置関係はそれぞれ以下のいずれかになる。

Case $A = C'$

$\overrightarrow{OB} = \overrightarrow{AB'} = -\overrightarrow{B'C'} = -\overrightarrow{OC}$ から、$B$, $O$, $C$ は一直線上にあり、直線 $BC$ は外接円の直径になる。このとき、ABC は BC 斜辺とする直角三角形である。

Case $O = B'$

$\overrightarrow{OA} = -\overrightarrow{AB'} = -\overrightarrow{OB}$ であり、$AB$ が外接円の直径になり、$ABC$ は $AB$ 斜辺とする直角三角形になる。

Case 4点がそれぞれ異なる位置にある

全ての辺の長さが1の四角形で、菱形となる。すなわち、$\overrightarrow{OA} = -\overrightarrow{B'C'}=-\overrightarrow{CO}$ ので、$ABC$ は $AC$ 斜辺とする直角三角形になる。
Rails5.0でのヘルパー読み込みと優先順位


昨年末にRailsチュートリアル第4版をやっていて調べたヘルパー関連のまとめお蔵出し。

- ControllerからのHelperメソッドを呼び出す場合、どのHelperでも呼び出せるのか。 
- Helperはメソッド名だけで呼び出しを行うことができるが、同名のメソッドが存在した場合どのようになるか（エラーになる or ならない or その他）
- 同名メソッドが存在した場合の呼び出し優先順位は存在するか。 

## 前提
- Railsチュートリアル第4版第9章くらいまでの知識
- 環境は以下のとおり

```bash
$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

$ rails -v
Rails 5.0.0.1
```


# まとめ
## View/Controller共通
- 同一ファイル同名メソッド、別ファイル同名メソッド、共にエラーにはならない
- 優先順位は、後優先（後で読み込んだものが勝つ）

## Controllerからの場合
- *include*したHelperのみ使用可能

```app/controllers/application_controller.rb 
class ApplicationController < ActionController::Base
  include TestsHelper
end
```

- 読込順は記述順
 - 同一ファイル同名メソッド　：　最後に記述されたもの
 - 別ファイル同名メソッド　：　最後にincludeされたファイルのメソッド

## Viewからの場合
- 基本的にはすべてのアプリケーションヘルパーが利用可能（includeは不要）
- 読込順はアルファベット順（ファイル）
 - 同一ファイル同名メソッド　：　最後に記述されたもの
 - 別ファイル同名メソッド　：　アルファベット順（a-z）
- 補足）ファイル名とヘルパー名が一致していなかった場合、エラーとなるため、ファイル名とヘルパー名の差異による読み込み順の変動はない。


# 確認過程
## 通常の読み込み
### Helper
``` app/helpers/tests_helper.rb
module TestsHelper 
  def hoge
    return false    
  end
end
``` 

### Controller
``` app/controllers/hoge_controller.rb 
class HogeController < ApplicationController
  include TestsHelper
  def help
    hoge
  end
end
```
`>> hoge => false`

### View
``` app/views/hoge/help.html.erb
<% hoge %>
```
`>> hoge => false` 


## 同一ファイル同名メソッド

### Helper
``` app/helpers/tests_helper.rb
module TestsHelper 
  def hoge
    return false    
  end

  def hoge
    return true    
  end
end
``` 

### Controller
``` app/controllers/hoge_controller.rb 
class HogeController < ApplicationController
  include TestsHelper
  def help
    hoge
  end
end
```
`>> hoge => true`

### View
``` app/views/hoge/help.html.erb
<% hoge %>
```
`>> hoge => true`



## 別ファイル同名メソッド
### Helper
``` app/helpers/tests_helper.rb
module TestsHelper 
  def hoge
    return false
  end
``` 

``` app/helpers/tests2_helper.rb
module Tests2Helper 
  def hoge
    return true
  end
``` 

### Controller
#### ケース１： *一方のみ* include
includeされたものしか適用されない。

``` app/controllers/hoge_controller.rb 
class HogeController < ApplicationController
  include Tests2Helper
  def help
    hoge
  end
end
```
`>> hoge => true`

#### ケース２： *両方* include
記述順にincludeされる。

``` app/controllers/hoge_controller.rb 
class HogeController < ApplicationController
  include Tests2Helper
  include TestsHelper
  def help
    hoge
  end
end
```
`>> hoge => false`


### View
すべてのHelperが、アルファベット順にincludeされる。

``` app/views/hoge/help.html.erb
<% hoge %>
```
`>> hoge => true`


# おまけ
（Rails5で発生するか未確認だけど、ヘルパー関連なのでメモ）
ActionMailerのViewでHelperを使おうとするとundefinedになる。
ActionMailerのViewでHelperを使いたい場合には、以下のように `add_template_helper(ApplicationHelper)` を追加する必要がある。


``` app/mailers/hoge_mailer.rb
class HogeMailer < ActionMailer::Base
  add_template_helper(ApplicationHelper)

  ...

end
```

参考サイト（感謝！）
http://morizyun.github.io/blog/action-mailer-rails-mail/
> 補足：ActionMailerのView内でHelperメソッドを使う場合
> 
> ActionMailerのView内でhelperメソッドを使いたい場合は、add_template_helper(ApplicationHelper)を追加すればつかえるようになるそうです。
es6のexportとimportについて

# import/exportとは

ES6で追加になった構文です。

まだ完全にサポート出来ていないブラウザもありますが、標準になりつつあります。
フロントエンドの技術を学ぼうとすると、ほとんどのサイトでimport/exportが使える前提で話しているので避けては通れぬ道です。

ただ、初見の方ではイマイチ挙動が把握しにくいと思ったので自分の知見をまとめてみました。
（間違い等ありましたらビシバシご指摘ください。orz）

# サンプル

```js:Module.js
export let Person = "太郎";
export let Dog = "ポチ";
export let Cat = "タマ";

export default Person;
```

```js:App.js
import Default from './Module.js'; //「default」で指定した変数を取得(変数名は自由)
import {
  Person,//変数名を指定して取得(変数名は固定)
  Dog,//変数名を指定して取得(変数名は固定)
  Cat//変数名を指定して取得(変数名は固定)
} from './Module.js';
import * as All from './Module.js';//全ての変数を含んだオブジェクトを取得(変数名は自由)

console.log(Default);//太郎
console.log(Person);//太郎
console.log(Dog);//ポチ
console.log(Cat);//タマ
console.log(All);
/*
Object {
  Person: "太郎",
  Dog: "ポチ", 
  Cat: "タマ", 
  default: "太郎", 
  ...
}*/
```
上記のように取得されます。

以下の書き方だと

```js:App.js
import {
  Taro,
  Pochi,
  Tama
} from './Module.js';
console.log(Taro);//undefined
console.log(Pochi);//undefined
console.log(Tama);//undefined
```
となってしまいます。

これは
`import {...} from 'xxx';`
という構文が
xxxのファイルの中に存在する変数名を指定することで読み出しているので、存在しない変数名を指定しても`Undefined`になってしまいます。

import側で変数名を**変えたい**場合は`as`を使って以下のようにする必要があります。

```js:App.js
import {
  Person as Taro,
  Dog as Pochi,
  Cat as Tama
} from './Module.js';
console.log(Taro);//太郎
console.log(Pochi);//ポチ
console.log(Tama);//タマ
```

`import/export`にはいろんな書き方がありますが、基礎がわかればすぐに使いこなせると思います。
もちろん、文字列だけではなく`Objectc`や`配列`もexport出来るのでかなり有能です！！

ただ、ブラウザによっては**サポートしていない**構文があるので、`babel`+`gulp`+`webpack`等で**トランスパイル**する必要があります。

そちらも頑張って覚えましょう。

じゃあの。
orhanobut/loggerのリリースバージョンで表示するログレベルの設定方法

## 概要
[orhanobut/logger](https://github.com/orhanobut/logger)は、Androidでログを表示するための便利なライブラリです。
ここでは、リリースバージョンでエラーログのみを表示するように、ログレベルを設定する方法について説明します。

## 設定方法
### 表示するログレベルの定義
LogAdapterを実装したクラスを用意します。BuildConfig.DEBUGは、リリースバージョンではfalseとなるため、ここではエラーレベルのログ以外のものはリリースバージョンでは表示しないようにします。

```java
public class MyLogAdapter implements LogAdapter {
    @Override
    public void v(String tag, String message) {
        if (BuildConfig.DEBUG) {
            Log.v(tag, message);
        }
    }

    @Override
    public void d(String tag, String message) {
        if (BuildConfig.DEBUG) {
            Log.d(tag, message);
        }
    }

    @Override
    public void i(String tag, String message) {
        if (BuildConfig.DEBUG) {
            Log.i(tag, message);
        }
    }

    @Override
    public void w(String tag, String message) {
        if (BuildConfig.DEBUG) {
            Log.w(tag, message);
        }
    }

    @Override
    public void e(String tag, String message) {
        Log.e(tag, message);
    }

    @Override
    public void wtf(String tag, String message) {
        if (BuildConfig.DEBUG) {
            Log.wtf(tag, message);
        }
    }
}
```

### Loggerの初期化
Application等において、Loggerを初期化し、MyLogAdapterを設定します。

```java
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        Logger.init(getString(R.string.app_name)).logAdapter(new MyLogAdapter());
    }
}
```

### 使ってみる！
```java
Logger.d("Displayed only debug build");
```

下記は、Loggerを使った際の出力例です。
デバッグバージョンのみ出力されます。

![image1](https://github.com/ayakix/Logger/raw/master/images/image1.png)

## サンプル
[Logger@github](https://github.com/ayakix/Logger)に動作するプロジェクトがあります。
クライアントサイド(JS)だけのURLクエリパラメータ取得

ちょっと変わったことをしなくてはいけなかったので、変数の受け渡しにURLのパラメータを使おうと…

ググって出てきたやつは、ぼくにとって使いやすい形じゃない気がしたので、みなさんにもおすそ分けがしたかった。

ってことで、良ければお使いください。

```javascript
function getQuery() {
	if(window.location.search === "") return;
	const variables = window.location.search.split("?")[1].split("&");
	const obj = {};
	variables.forEach(function(v, i) {
		const variable = v.split("=");
		obj[variable[0]] = Number(variable[1]);
	});
	return obj;
}
```

返り値はパラメータを変数名と値にわけたとき、変数名をキー、値をNumber型の値とする(?)オブジェクトです。
書いてて変なので、例を。

http://○○○/×××?year=2017&month=4&day=3というように渡した場合、
getQuery()の返り値は、

```javascript
{
	year: 2017,
	month: 4,
	day: 3
}
```
となります。
なお、パラメータがない場合はundefinedを返します。
技術英語 > I have heard that before.

> I have heard that before.

もしくは　

> I've heard that before.

意訳「それは過去に聞いたことがある」

@ 100年の難問はなぜ解けたのか
2007年放送の番組で出てきたフレーズ

100年の難問で「私はこうして解きました」という手紙と論文が届く中、Grigory Yakovlevich Perelmanの論文のabstractで「こうして解きました」という部分を見た数学者が発した言葉。

ある手法について、それは「聞いたことがある」ものか「経験したことがある」ものかには大きな違いがあると思っている。
時刻問い合わせに応答する (/etc/ntp.conf)

## 参考

* [Technical Note : NTP シリーズ パート 4 ntpd によるローカルホストの時刻同期 - Nature's Linux Tech Portal](http://tech.n-linux.com/index.php?%A5%C6%A5%AF%A5%CB%A5%AB%A5%EB%A5%CE%A1%BC%A5%C8%2FNTP%2FNTP%20%A5%B7%A5%EA%A1%BC%A5%BA%20%A5%D1%A1%BC%A5%C8%204%20ntpd%20%A4%CB%A4%E8%A4%EB%A5%ED%A1%BC%A5%AB%A5%EB%A5%DB%A5%B9%A5%C8%A4%CE%BB%FE%B9%EF%C6%B1%B4%FC)

## 設定

* 192.168.0.0/24 からの 時刻問い合わせに応答例。上から順に適用されるようなので、一番下に記述。

```diff:/etc/ntp.conf
  # By default, exchange time with everybody, but don't allow configuration.
  restrict -4 default kod notrap nomodify nopeer noquery
  restrict -6 default kod notrap nomodify nopeer noquery
  
  # Local users may interrogate the ntp server more closely.
  restrict 127.0.0.1
  restrict ::1
  
  # Clients from this (example!) subnet have unlimited access, but only if
  # cryptographically authenticated.
  #restrict 192.168.123.0 mask 255.255.255.0 notrust
  #restrict 192.168.0.0 mask 255.255.255.0 noquery nomodify nopeer notrust notrap
+ restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
```

## 注意点

* ntpサーバー機の設定を変更した後、ntpクライアント機のntpを再起動する必要があった(?)。
* `restrict`は何もせずとも時刻問い合わせに応答するっぽい(?未確認)


## ntpq -p の記号

* 参考: [NTPサーバーによる時刻同期](http://linux.kororo.jp/cont/server/ntp.php)

```rb
*	参照同期中のサーバーを表している
+	クロック誤り検査に合格したサーバー
#	参照同期中ではあるが、距離が遠いサーバー
 	左に何も表示されない場合（空欄）、サーバーを参照していない
x	クロック誤り検査に不合格となったサーバー
. 	参照リストから除外されたサーバー
refid	上位NTPサーバーが参照しているホスト名 or IPアドレス
st	上位NTPサーバーの階層
t	階層のタイプ　l:local、u:unicast、m:multicast、b:broadcast
when	最後のパケットを受け取ってからの時間（秒）
poll	問い合わせを行う間隔（秒）
reach	到達可能性に関するレジスタ・データ（8進数）
delay	推定遅延（ミリ秒）
offset	偏差補償（ミリ秒）
jitter	RMS Jitterの平均値（ミリ秒）
```
[メモ] Raspberry Pi Zero W + motionEyeOSでビデオ監視システム

## 概要
- [motionEyeOS](https://github.com/ccrisan/motioneyeos/wiki)が、Pi Zero Wに対応した模様(Pre-Releaseだけど)
- motionEyeOSとは？

	>**What is motionEyeOS?**
	>motionEyeOS is a Linux distribution that turns a single-board computer into a video surveillance system. The OS is based on BuildRoot and uses motion as a backend and motionEye for the frontend.
	>
	>(ぐーぐる先生翻訳)
	>**motionEyeOSとは何ですか？**
	>motionEyeOSは、シングルボードコンピュータをビデオ監視システムに変えるLinuxディストリビューションです。 OSはBuildRootに基づいており、バックエンドとしてモーションを、フロントエンドにmotionEyeを使用します。


	![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/0e0efe00-420f-9cfa-1dcb-cad28da3b436.png)
- イメージ焼いて、`wpa_supplicant.conf`を作っていれとけばいい。
- ssh, ftp, samba, http, http:8081ポートでストリーミング
- 関連: [らずぱい motionEye (Web UIベースのカメラサーバ)](http://qiita.com/mt08/items/96207abfba91954b50d4)

## 環境
- Raspberry Pi Zero W
- [Camera Module](https://www.raspberrypi.org/documentation/hardware/camera/) v1.3(5MP) / v2.1 (8MP)
- OSイメージ: `motioneyeos-raspberrypi-20170329.img.gz`

## 手順

1. イメージのダウンロード<br>[ccrisan/motioneyeosのリリース](https://github.com/ccrisan/motioneyeos/releases)から
最新版(Pre-release)の`motioneyeos-raspberrypi-20170329.img.gz` をダウンロード

2. microSDに焼く

3. BOOTパーティションに`wpa_supplicant.conf`を作成<br>参考: [Troubleshooting Raspberry PI Models A (Plus) And Zero](https://github.com/ccrisan/motioneyeos/wiki/Troubleshooting-Raspberry-PI-Models-A-(Plus)-And-Zero)

	```txt:wpa_supplicant.confこんなかんじ
	country=JP
	ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
	update_config=1
	network={
		ssid="Wifi_SSID"
		psk="plain_password" # 素のパスワードを使う場合
		#psk=3141592653589793238462643383279502884197169399375105820974944592		 
	}

	```
4. らずぱいにmicroSDを挿して電源ON
5. ブラウザから、`http://らずぱいのIPアドレス/` にアクセス。(`:8765`はいらない)
    - IPアドレスは、ルータでの情報表示にて、接続されてるデバイス、、から見つけた..
6. デフォルトのLoginは、Username: `admin` / Password は、無し!!なので、ログインしたら、パスワードの設定をしておく。
    - 設定かえると、再起動する。

## その他
- うまく IPアドレスを取得する方法はあるのだろうか？
- General Settings > Advanced Settingsのスイッチを `[  |ON]`にすると、細かい設定ができる。
    - TimeZoneの設定とか、ntpで時刻補正とか、動体検出してemail送るとか、いろいろできるらしい
![image](https://qiita-image-store.s3.amazonaws.com/0/75594/9c47520f-2f97-8580-6c81-69c2da725c63.png)
Ryzen + GeForce 1080 Ti + Ubuntu もしばらく辛抱が必要?(2017 April 02 時点)

追記: TL;DR Ubuntu 16.04.3(4.10 kernel) で Ryzen + 1080 Ti 安定動作確認しました.
 
Ryzen + amdgpu-pro + Ubuntu は 2017 年夏頃まで辛抱が必要
http://qiita.com/syoyo/items/37c4eae70595ac1185bd#_reference-aa7341a2e9e4b12f8d60

なため, NVIDIA GPU ならいけるかと思いましたが, ダメでした...

<img width="520" alt="Screen Shot 2017-04-03 at 3.59.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/301d2205-7cc2-bd17-d6a2-4d6efae921bb.png">


## Ubuntu 17.04 beta2

Ryzen + X370 + GTX 1080 Ti 構成にしてみましたが, Ubuntu 17.02 beta2 のインストーラーでは以下のように `nouveau` ドライバで `fifo SCHED_ERROR` が出ました.

<img width="948" alt="Screen Shot 2017-04-03 at 3.59.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/f35567e9-a5e2-d4ef-56cd-c6a5d9d6ac8f.png">

インストーラー起動時に `nomodeset` などを有効にしても同様でした.
一旦 server 版とかでテキストモードでインストールするしかないかもしれませんね.

Ubuntu 16.04 のインストーラーは動きました. ただ, 現時点の 16.04 は kernel 4.8 なので Ryzen のパフォーマンスを引き出すことができません.

17.04 正式リリースでは治るかもしれませんが, NVIDIA GPU の場合もしばらくはソフトウェアやドライバ周りで辛抱が必要そうですね...
(GTX 1080 Ti がダメなだけで, 1080 など古いモデルの NVIDIA GPU であれば動く可能性はあります)
CentOS7にMySQLを導入




## :beach_umbrella: 環境

CentOS: 7.3.1
MySQL: 5.7.17

## :file_folder: MySQLを導入

```
リポジトリを追加
$ sudo yum -y install http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
インストール可能な内容を確認
$ yum repolist enabled | grep "mysql.*-community.*"
infoコマンドで情報を確認
$ yum info mysql-community-server
インストール
$ sudo yum -y install mysql-community-server
バージョン確認
$ mysql --version
自動起動
$ sudo chkconfig mysqld on
起動
$ sudo service mysqld start
デフォルトのパスワードの確認
$ vi sudo vi /var/log/mysqld.log
log ファイルから以下の仮のパスワードを見つけ出す。 今回、自分のパスワードは N4IYvEp&)6%! のようだ
2017-04-01T20:05:05.561190Z 1 [Note] A temporary password is generated for root@localhost: N4IYvEp&)6%!
以下を実行するとパスワードを求められるので、上記で見つけ出したパスードを入力する
$ mysql -u root -p
仮パスワードを変更しないと、一切の処理を受け付けてくれないので変更する。 ただしこのパスワードは8文字以上、英字、数字、記号をそれぞれ含めないといけないと受け付けてくれないので、注意。
$ ALTER USER root@localhost IDENTIFIED BY '@Mysql0001';
設定されたら、一旦exit
$ exit;
以下のファイルに一行加えて日本語設定をする。 [mysqld]に、character-set-server=utf8 を追加。
$ sudo vi /etc/my.cnf
設定を反映
$ sudo service mysqld restart
```
Reactのチュートリアルをやった

下記の日本語翻訳をみてやった。
[Reactチュートリアル: Intro To React【日本語翻訳】](http://mae.chab.in/archives/2943)

# わかったこと

チュートリアルで[これ](https://codepen.io/edo1z/pen/GWzQyP)作った。下記が分かってよかったです。

- 複数の子コンポーネントからデータを集めたい時や、2つの子コンポーネント同士でやりとりを行わせたい時は、状態（state）を親コンポーネントまで渡すようにする。
- stateを親に渡す一般的なパターンは、親から子にクリックイベント時等に呼び出される関数を渡す。
- 状態を変化させる場合、必ずthis.setStateを使う
- renderのみのコンポーネントはシンプルに書ける
- Key大事

# renderのみのコンポーネントの書き方

```
function Square(props) {
  return (
    <button className="square" onClick={() => props.onClick()}>
      {props.value}
    </button>
  );
}
```
Redux 公式サイトの Redux Advanced を翻訳しながらやってみた。 Async Flow 編

#Redux Advanced
前回の続きです

##Async Flow

middlewareなしではReduxのストアは同期的なデータフローしか扱えません。
それによって得られるのはcreateStoreのデフォルトの値と同じです。

必須ではありませんがcreateStoreはapplyMiddlewareを使うことによって非同期的なactionを実装することができます。

redux-thunkやredux-promiseのような非同期的なmiddlewareでstoreをラップすることによってaction内でdispatch methodを使えるようになります、

例えば、promise middleware はPromiseを受け取り、非同期的に開始/終了アクションのペアをdispatchすることができます。

チェーン最後のmiddlewareはプレーンオブジェクトである必要があります。これは同期的なredux data flowであるときに行われます。


##Next Stepへ