OmniAICreator/Qiita-1.07M huggingface dataset:
Integromat + AzureFunctionsでスクレイピングしてみた

# やってみた理由
なんか正月ヒマだったのでかきぞめとしてプログラムを作りたかった。
あとAzure Functionsも使ってみたかった。

# 作るもの
毎朝決まった時間にYahoo占いのサイトにアクセスして、自分の星座の占い結果をメール通知してくれるシステム

# 構成
全体的な制御 -> Integromatで作る
htmlをパースするAPI -> Azure Functionsで実装

Integromatって何よ？って人は[こちら](https://qiita.com/nendocode/items/b3f9f9810a0dfd744dcf)を参考いただければ

# 作ったもの(Azure Functions側)
下記のようにhtmlとxpathの配列を受け取って、xpathに対応する値の取得結果を返すwebAPIを作った。
自分しか使わないのでエラー処理とかはなし。

```javascript:リクエストのjsonデータサンプル
{
   "html": "<html><body><div id=\"a\">val</div></body></html>",
   "xpathes": 
    [
        "//*[@id=\"a\"]",
        "//*[@id=\"lnk02\"]/div/div/div/div/div/div[1]/div/div/p"
    ]
}
```

```javascript:レスポンスのjsonデータサンプル
{
    "Values":["val"]
}
```

実装コードは以下。HtmlAgilityPackというパッケージを使用。
Azure FunctionsでNuGetパッケージを使用するやり方は[ここ]( http://tech.guitarrapc.com/entry/2016/04/05/043723 )を参考にした。

```csharp:run.csx
using System.Net;
using System.Xml;
using HtmlAgilityPack;

public class XPathResponse
{
    public string[] Values;
}

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    dynamic data = await req.Content.ReadAsAsync<object>();
    string html = data.html;
    var xpathes = data.xpathes;

    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(html);
    List<string> list = new List<string>();
    
    foreach(string xpath in xpathes)
    {
        var doc = htmlDoc.DocumentNode.SelectSingleNode(xpath);
        if(doc != null)
        {
           list.Add(doc.InnerHtml);
        }
        log.Info(xpath);
    }
    XPathResponse resp = new XPathResponse();
    resp.Values = list.ToArray();

    return req.CreateResponse(HttpStatusCode.OK, resp);
}
```

# 作ったもの(Integromat側)
簡単なシナリオを作成。
<img width="1234" alt="スクリーンショット 2018-01-01 21.32.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/211743/62084a3f-c9f2-9973-7266-249d4dd3036e.png">

シナリオのスクショだけ貼ってもわけわからんのでざっと説明すると
①
毎朝特定の時間になったら発火して、Yahoo占いのサイトにアクセスして、その日の占いのhtmlページを取得。
②
取得したhtmlデータと、解析用XPathでjsonデータを作って、先程のAzure Functionsで作ったAPIに投げる。
③
APIからのレスポンスデータを本文とタイトルにして、Gmailでメール送信。

これだけ。
本当はGoogle Homeに喋らせようと思ったけどデフォルトで占い機能がついてた（「今日の運勢は？」って聞いたら答えてくれた）のでやめた。

# 感想
サーバーやら何やら考えずにAPI作れるAzure Functionsは偉大。
全体制御はIntegromatでやって、コード書かなきゃいけない所はAzure Functionsでやるっていう構成でいけば柔軟に対応できる。
Logic AppとAzure Functionsの組み合わせがMicrosoft的には王道なんだろうけどLogic Appはまだ使ったことないから今度触ってみたいと思う。
canvas で作る在席表

canvas を使って簡単な在席表を作ってみました。

![zaiseki_jan01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/47922853-93d8-9118-fd44-8bf52ab7c0d3.png)

## プログラム

```html:index.html
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="zaiseki.js"></script>
<title>在席表</title>
</head>
<body>
<div>
<canvas id="bar_area" width="400" height="600"></canvas>
</div>
<hr />
version Aug/02/2022 AM 09:00<p />
</body>
</html>
```

```js:zaiseki.js
// -------------------------------------------------------------------------
//	zaiseki.js
//
//					 Aug/02/2023
// -------------------------------------------------------------------------
// jQuery  (function ()
window.onload = ()=>
{
	const file_json = "status.json"

	read_fetch_proc(file_json)
}

// -------------------------------------------------------------------------
function read_fetch_proc(url)
{
	fetch(url).then((response) => {
		if(!response.ok) {
			console.log('Read error!')
			throw new Error('error')
		} 
		console.log('Read ok!')
		return response.text()
	}).then((data)  => {
//		console.log(data)
		const dict_aa = JSON.parse(data)

		display_proc (dict_aa)
	})
}

// -------------------------------------------------------------------------
// [4]:
function display_proc (dict_aa)
{
	var bar = document.getElementById('bar_area')
	var ctx = bar.getContext('2d')

	ctx.font = "18px 'ＭＳ Ｐゴシック'"
	ctx.strokeStyle = "black" 

	const delt_y = 40

	const xx = 100
	var yy = 30
	ctx.strokeText("在席表",xx + 20,yy)

	yy = 70
	ctx.strokeStyle = "blue" 
	for (var key in dict_aa)
		{
		const unit = dict_aa[key]
		ctx.strokeText(unit.name,xx,yy)
		var color = 'red'
		if (unit.office)
			{
			color = 'green'
			} 
	
		draw_circle_proc (ctx,xx+100,yy-8,color)
		yy += delt_y
		}
}

// -------------------------------------------------------------------------
// [4-4]:
function  draw_circle_proc (ctx,xx,yy,color)
{
	const radius = 10
	ctx.beginPath()
	ctx.fillStyle = color
	ctx.arc (xx,yy,radius,0,Math.PI*2,false)
	ctx.fill()
	ctx.closePath()
	ctx.stroke()
}

// -------------------------------------------------------------------------
```

## データ

```json:status.json
{
"id0001": {"name": "中島","office": true},
"id0002": {"name": "長谷川","office": false},
"id0003": {"name": "藤田","office": false},
"id0004": {"name": "青山","office": true},
"id0005": {"name": "川上","office": true},
"id0006": {"name": "吉田","office": true},
"id0007": {"name": "小林","office": false},
"id0008": {"name": "坂本","office": true},
"id0009": {"name": "安藤","office": false},
"id0010": {"name": "中村","office": true}
}
```
MAMPのPHPをターミナルから実行する方法

Laravel等でPHPでもターミナルを使用する機会が多いかと思いますが、
通常ターミナルでPHPを実行すると、Macに最初からインストールされているPHPを使用されてしまいます。
MAMPを使用しているPHPをターミナルで使う方法を下記に記載します。
環境によって、下記の手順で上手くいかない場合もあるので、ご容赦ください。

## セットアップ環境
* MacOS Sierra 10.12.4
* MAMP 4.2.1
* MAMP内のPHP 7.1.8

記事中の`php7.1.8`の部分はご自身の環境に変えて実行してください。

## 現在使っているPHPのパスの確認

```bash:ターミナル
$ which php
# 実行例：/usr/bin/php
```
これはMacのデフォルトのPHPを指しています。
## パスを通す
```bash:ターミナル
$ vi ~/.bashrc

# ファイルに追記します
export PATH=/Applications/MAMP/bin/php/php7.1.8/bin:$PATH
# :wq で保存

source ~/.bashrc # 反映させます
```
## パスの確認
```bash:ターミナル
$ which php
# 実行例：/Applications/MAMP/bin/php/php7.1.8/bin/php
```
これでMAMP内のPHPで実行されていることが確認できました。

Macを再起動するとデフォルトの設定に戻ってしまう場合がありますので、
`source ~/.bashrc` のコマンドを叩いて再度反映します。
kerasでbackend

#概要
kerasのbackendだけで、学習して推定してみた。

#写真
![backend10.png](https://qiita-image-store.s3.amazonaws.com/0/18104/d279fbb3-20b6-e539-7414-2bc2bc51a677.png)

#環境

Raspberry Pi 3 model B v1.2 element14
2017-09-07-raspbian-stretch
tensorflow-1.3

#サンプルコード

```
from tensorflow.contrib.keras.python.keras import backend as K
from tensorflow.contrib.keras.python.keras.optimizers import SGD
import numpy as np
import matplotlib.pyplot as plt

dx = np.arange(-3, 3, 0.1)
dy = np.sin(dx)
input_dim = 1
output_dim = 1
hidden_dim = 8
x = K.placeholder(shape = (None, input_dim), name = "x")
ytrue = K.placeholder(shape = (None, output_dim), name = "y")
W1 = K.random_uniform_variable((input_dim, hidden_dim), 0, 1, name = "W1")
W2 = K.random_uniform_variable((hidden_dim, output_dim), 0, 1, name = "W2")
b1 = K.random_uniform_variable((hidden_dim, ), 0, 1, name = "b1")
b2 = K.random_uniform_variable((output_dim, ), 0, 1, name = "b2")
params = [W1, b1, W2, b2]
hidden = K.tanh(K.dot(x, W1) + b1)
ypred = K.tanh(K.dot(hidden, W2) + b2)
loss = K.mean(K.square(ypred - ytrue), axis = -1)
opt = SGD()
updates = opt.get_updates(params, [], loss)
train = K.function(inputs = [x, ytrue], outputs = [W1, b2, loss], updates = updates)
for ep in range(2000):
	for i in range(60):
		c1, c2, c3 = train([[[dx[i]]], [[dy[i]]]])
	if ep % 100 == 0:
		print (ep, c3[0])
pred = K.function(inputs = [x], outputs = [ypred])
p = []
for i in range(60):
	preds = pred([[[dx[i]]]])
	p.append(preds[0][0])
print (p)
plt.plot(dx, dy, 'b', dx, p, 'r--')
plt.savefig("backend10.png")
plt.show()



```

以上。
Qt/Android開発環境準備 - Qtで作るAndroid目覚ましもどき #2 -

今回はCentos7＋Qt＋Androidな開発環境を準備する話を少しだけ。
こういった話はググればなんだかんだ出てくるもので、自分もその場しのぎでやってきて大して覚えてないのでメモ程度。
Centos7の今の状態はこれです。

* CentOS Linux release 7.4.1708 (Core) (64bit)

# Java
このサイトみたいな感じで。
http://zero-config.com/centos/install-java8.html

# Android Studio
……Qtより先にいれるんだっけ？ よくわからん
基本は下記サイトの"android-studio-セットアップ"の部分。
https://qiita.com/Ohgochi/items/1d80b6b2651f24d70c96#android-studio-セットアップ
バージョンはその時々で変わる。ていうか最新じゃないとあとでアップデートしなきゃ動かんみたいになったような。

# Qt
基本的には同じサイトで。
https://qiita.com/Ohgochi/items/1d80b6b2651f24d70c96#qt-for-android-セットアップ
## まずダウンロード
バージョンは5.9以降の方が良い。5.7だとまだAndroid向けに十分な機能がなく機能の追加とか必要っぽい。
確か下記からとってきたはず。
（公式ページのトップからたどって拾っても良いが公式の海外のサーバーからの転送になるっぽく、遅い。なのでJAISTから）
http://ftp.jaist.ac.jp/pub/qtproject/official_releases/qt/5.9/5.9.1/
の qt-opensource-linux-x64-5.9.1.run のはず。
別のバージョンが欲しい人は上の階層に行って適宜選んでください。

## インストール
インストールのために必要そうなライブラリとかは適宜入れる。（もう詳細は忘れた。問いあわせにはわかる範囲で答えます……）
取ってきた.runファイルを実行。（ここでVNCだと環境次第でバトることに。後述）
ComponentsにはAndroidっぽいものなどを適当に選択して入れる。（全部入れでおｋ？）
JDK/SDK/NDK の場所を設定。

## サンプル実行
Qtのサンプルはよくわからないので下記がおすすめ。
https://github.com/KDAB/android
これのexamples/serviceがおすすめ。
ていうかこのプロジェクトの先生はこれなのでこれを理解すれば私から話すことはなくなる。
service.pro をプロジェクトで開き、Configure Projectではすべてのキット（Desktop/armeabi向け/x86向け）を選択。
開発・デバッグ可能なAndroid端末を接続。
証明書の登録、実行の仕方などは [参考のサイト](https://qiita.com/Ohgochi/items/1d80b6b2651f24d70c96) のとおりで良いはず。
アプリが別なので当然違う画面にはなりますが。

<br>

開発環境について主な話は以上です。


# 余談
VNC(Virtual Network Computing)とかAVD(Android Virtual Device)周りの話を少しだけ。最初苦労したので。

* VNCでのQt CreatorとかAVDがうまく動かず下記のようにしています
  + ウィンドウマネージャーをKDEに（前はGNOMEだったが）
  + ビデオドライバはnouveau（NVIDIAのカードを積んでるのでNVIDIAにしてたがうまく動かなかった）
* AVDはx11vncじゃないと起動しない＆起動しても結局Qtのデバッグに使えない？だったので諦め。
  + ちょっと離れた位置にあるcentosマシンにつながったAndroid実機を操作するにはTeamViewerを使ってます。
* Qtからのデプロイ対象の端末に実機が見えない場合はSdk/platform-toolにあるadbをkill-serverして
  sudoでstart-serverしましょう。
  + つなげたときにsudoでadb devicesとかすれば確認と開始が同時にできる。

AVD以外にもポートフォワーディングしてみようとしたりDockerを使ってみようとしたりいろいろはじめにはやりました。私の力不足か全部失敗しましたが。
auのiPhoneテザリングでhttpとその他でグローバルIPが違う

# 概要

MACをauのテザリングでインターネットに接続した時に、調べたグローバルIPアドレスをEC2のセキュリティグループに許可で追加したところsshがつながらない。

# 原因

auのグローバルIPアドレスは、httpとその他で違う可能性があるらしい。
( <a href="https://www.au.com/developer/android/kaihatsu/network/">https://www.au.com/developer/android/kaihatsu/network/</a> )例えばIP確認くんなどで調べたIPとSSHで使っているIPアドレスが違うことがあるらしい。

# 対応

ぱっとMACのネットワークの調べ方がわからなかったので、他のサーバに入って、実際にアクセスしているネットワークを確認してみた(余談: kdXXXXXXXXXXXX.au-net.ne.jp みたいな形式になるようで、XXXの9桁がIPアドレスになっているようだった)。

`設定>ネットワーク` では、IP確認サイトでは出てこないIPアドレスが出てくる(172から始まるIPアドレスでグローバルアドレス一覧になかった...)。ifconfigではこのIPアドレスがでてくるので、グロバールではなく別な機器につながっているのかしら、確認できてない。tracerouteでも対象のIPアドレスが出てこなくて辛い。

IP確認くん( <a href="http://www.ugtop.com/spill.shtml">http://www.ugtop.com/spill.shtml</a> )にでてくるIPはSSHの時に違うIPがくる。CMAN( <a href="https://www.cman.jp/network/support/go_access.cgi">https://www.cman.jp/network/support/go_access.cgi</a> )だとSSHに使っているIPアドレスが返ってくるようだった。
なのでこれらで調べたIPアドレスをセキュリティグループに追加することで無事SSHで接続できることを確認した。

私の場合は

* 他のサーバに接続してhostからIPを推測する
* CMANにアクセスしてIPを確認する

がいまのところ解決策でした。
コマンドで一発で出せるようにしたい。
[小ネタ] macOS標準IMEで矢印を最速入力する

矢印（←↓↑→）ってどう入力していますか？「やじるし」で変換？「みぎ」で変換？なるほど。でも、もっと簡単に入力する方法があるんです。

日本語入力モードの状態で：

| 矢印 | キー |
| --- | --- |
| ← | zh |
| ↓ | zj |
| ↑ | zk |
| → | zl |

[追記]
Google日本語入力では結構昔からある機能なんですね。
[Google日本語入力で使える「Zコマンド」がすごい | IDEA*IDEA](https://www.ideaxidea.com/archives/2009/12/google_z.html)
LinuxからRaspberry Piに何も考えずにVNC接続する

最近、個人のデスクトップ環境をWindows 10からLinux Mintに切り替えたわけだが、この環境からもRaspberry Pi 3B（Raspbian Jessie）にVNC接続したいと普通に思うわけだ。
世の中を検索すると、TightVNC Serverをラズパイに入れる記事が多く見つかるが、Raspbian Jessieに元から入っているVNCサーバーに繋ぐ記事が見つからない。
試しにVNCプラグインを追加したRemminaで接続してみたが、不明な認証方式エラーが発生して接続できなかった。
WindowsではRealVNCで簡単にラズパイにVNC接続できたが、UltraVNCでは接続できなかったことを思い出した。
そこでRealVNCのサイトを訪れてみれば・・・何だ、あるじゃないか・・・。

https://www.realvnc.com/en/connect/download/viewer/

上記から VNC-Viewer-6.17.1113-Linux-x64.deb をダウンロードし、パッケージインストーラでインストールして、メニュー → インターネット → VNC Viewerを選択すると、Windowsで使っていたものと同じ風合いの画面が表示されたので、あとはWindows上と同じ設定でさくっとラズパイにVNC接続できた。

あっ・・・そう言えば・・・あけまして、おめでとうございます、Qiitaの皆さん。
今年もお世話になるはずですので、よろしくお願いいたします。
Qtで作るAndroid目覚ましもどき



# はじめに
ちょっと大っぴらに言えない類の音声と画像を使った自分だけの目覚ましを作りたいなーと思ったのが発端です。
どういう音声かと言えばリポジトリ/プロジェクト名である *SummerIce* から推理してもらえればいいです。
仕事でQtを始めたのでこれを活用してみることに。結果としてこの記事を書いている段階ではまだ目覚まし**もどき**でしかないですが。

Qtの日本語の記事ってあんまりないなーと思ったのがこの記事を書く動機でもありますが、こういう文章を書く経験もあまりないのでぎこちない内容になりますが暇なら適当に見てください。
突っ込みも適宜受け付けます。ただしソースファイルの名前については突っ込み禁止です。

今回は概略の話だけなので役に立つ内容はほぼないです。

ソースコードは下記です。
https://github.com/hakua-doublemoon/SummerIce
#### プログラム更新情報
2018/05/05 アラーム時の画面起動の制御を修正とか。構造も変わってます。記事にはあまり反映されてません……

# 開発環境
* プラットフォーム
  + CentOS Linux release 7.4.1708 (Core) (64bit)
  + Android 5.1.1 （Acerの安い端末）
  + Windows 8.1 (64bit)

開発環境は基本Centosで行います。Windowsは単なるシンクライアントみたいなもん。

使用言語 | バージョン
-----------|---------------
Qt             | 5.9.1 / 5.10.1
Java           | 1.8.0_131 / 1.8.0_172
Android-Studio | 2.3.3

基本的に更新さぼってます。ごめんなさい。
(2018/05/05) QtとJavaは新しくしました

# 機能
* 目覚まし
  + 定刻に画面を起動し、事前に設定した画像と音声を出力する
    - 現状アプリから設定するのは音声のみ。画像は「音声リストJSON」に音声とセットで記述され読み込まれる。
* 音声はアプリ内蔵ではなく端末上の適当な場所に置いたものを読む。
  + 画像も同様
  + 音声と画像のリストは「音声リストJSON」で管理する
* 「音声リストJSON」で次の目覚まし時に使用する音声および画像の設定も管理する
* とりあえず設定できる時間は１つとする
  + 時間の設定は「時間設定ファイル」に持つ
* とりあえず繰り返し機能はなし。寝る前に必ず設定する

# アプリケーション構成
## 概略
構想ではなく現状はこうなった。

```

  +------------------------------------------+
  | アプリ画面（QMLで作成）                    |
  +------------------------------------------+
    ↑    ↓ 音声（画像）設定    ↑
    |    ↓      音声リスト提供 ↑
    |    +-------------------------+
    |    | 音声設定機能（c++で作成） |
    |    +-------------------------+
    |
   +-------------------------+
   │ 時間管理機能（c++で作成） | → +----------------------------+
   +-------------------------+ ← | 時刻監視サービス（c++で作成）|
                                 +----------------------------+
                                   　↓
                                 +------------------------------+
                                 | 画面・電源制御機能（Javaで作成）|
                                 +------------------------------+

```

## コンポーネント概要

#### アプリ画面
* 各種設定GUI
* 定刻に音声・画像を出力するのも画面が行う

#### 音声設定機能
* 「音声リストJSON」から設定可能な音声リストを作成し画面に提供する
* 画面で選択された音声をJSONに記録する

#### 時間管理機能
* 画面上で指定された時間を「時刻設定ファイル」に覚える
  + さらに指定された時間を時刻監視サービスに伝える
  + 時刻監視サービスの死活も一応見てる
* アプリ起動時にファイルから設定時間を読み出し画面に提供する

#### 時刻監視サービス
* 時刻管理機能から目覚ましの時間を通達されてからその時間までを監視する
  + 時間になったら画面・電源制御機能で端末の画面を起動する

#### 画面・電源制御機能
* AndroidのAPIで画面の点灯とロック解除を行う
  + （電源も常に握ってる。諸事情で）
  
<br>

-----

次からはコンポを切り口に勉強の成果をまとめていきます。
そういえば言い忘れてましたが、書いている人はAndroidのアプリ開発はこれが初めてです。Javaもほとんど書けません。
コマンドプロンプトから.msiや.exeをインストール

# はじめに

.msiや.exeが拡張子となっているインストーラー(セットアップファイル)をWindowsコマンドプロンプトからサイレントインストールする方法を紹介します。
インストーラーにて「次へ」を選択せずにインストールが可能であるため、バッチファイル経由で実行可能であり、インストールの効率化/自動化を実現できます。

# .msi でのインストール

`C:¥> msiexec` と入力すると、ヘルプが確認できる。

- サイレントインストール → `C:¥> msiexec.exe /i .¥hoge.msi /passive`
 - **`/passive`** を指定
- ＋再起動させない → `C:¥> msiexec.exe /i .¥hoge.msi /passive /norestart`
 - **`/norestart`** を指定
- 別の方法でサイレントインストール → `C:¥> .¥hoge.msi /qn`
 - **`/qn`** を指定


# .exe でのインストール

- サイレントインストール → `C:¥> .¥hoge.exe /s /v"/qn"`
 - **`/s /v"/qn"`** を指定
- ＋再起動させない → `C:¥> .¥hoge.exe /s /v"/qn REBOOT=ReallySuppress"`
 - **`REBOOT=ReallySuppress`** を指定
- ＋特定コンポーネントのみ → `C:¥> .¥hoge.exe /s /v"/qn ADDLOCAL=ALL REMOVE=Fuga,Piyo"`
 - **`ADDLOCAL=ALL`** で全てのコンポーネントを指定
 - **`REMOVE=Fuga,Piyo`** のようにインストールしないコンポーネントを指定
[備忘録] postgresql [工事中]

### postgresql - mac

#### インストールとか
```shell:とりあえずこの流れでインストールまで行く。
$ brew list
$ brew update
$ brew search postgresql
$ brew install postgresql
```

```shell:インストール後のターミナルの結果（格納先）
〜〜〜略
🍺  /usr/local/Cellar/postgresql/10.1: 3,372 files, 38.8MB
```

#### install後の色々な確認

```shell:
$ psql --version
psql (PostgreSQL) 10.1

$ which postgres  
/usr/local/bin/postgres
```

#### 文字コードにUTF-8を指定してDBを初期化(エラーに見えるけど問題なし)

```shell:CMD
$ initdb /usr/local/var/postgres -E utf8
```

```shell:OUTPUT
The files belonging to this database system will be owned by user "｛ユーザー名｝". 
This user must also own the server process.

The database cluster will be initialized with locale "ja_JP.UTF-8".　★
initdb: could not find suitable text search configuration for locale "ja_JP.UTF-8"　★
The default text search configuration will be set to "simple".

Data page checksums are disabled.

initdb: directory "/usr/local/var/postgres" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/usr/local/var/postgres" or run initdb
with an argument other than "/usr/local/var/postgres".
```

#### 起動
```shell:CMD
$ brew services start postgresql
```

```shell:OUTPUT
==> Tapping homebrew/services
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Counting objects: 14, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 14 (delta 0), reused 9 (delta 0), pack-reused 0
Unpacking objects: 100% (14/14), done.
Checking connectivity... done.
Tapped 0 formulae (42 files, 55.2KB)
==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql)
```

#### DB一覧の取得(初期化後のDBクラスタには３つのDBが存在）

```shell:CMD
$ psql -l
```

```shell:OUTPUT
                                        List of databases
   Name    |    Owner     | Encoding |   Collate   |    Ctype    |       Access privileges       
-----------+--------------+----------+-------------+-------------+-------------------------------
 postgres  |  {user name} | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 template0 |  {user name} | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/{user name}              +
           |              |          |             |             | {user name}=CTc/{user name}
 template1 |  {user name} | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/{user name}              +
           |              |          |             |             | {user name}=CTc/{user name}
(3 rows)
```

#### DB作成
```shell
$ createdb test
```

#### DB接続
```shell
psql test
```

#### DBへの接続
```shell
$ psql test
psql (10.1)
Type "help" for help.

test=# 
```
オープンデータ取得先まとめ

2018/1/1時点で利用可能な、オープンデータの主要取得先を記載します。

# 1. 世界中の国や都市の情報
* EUとイギリス
    * Public Data EU http://publicdata.eu
    * Open Data Europe http://data.europa.eu/euodp/en/home
    * UK Government Data https://data.gov.uk
* アフリカ
    * Africa Open Data https://africaopendata.org
    * Code for South Africa http://code4sa.org
    * Code for Africa https://codeforafrica.org
* アジア
    * Open Cities Project http://www.opencitiesproject.org
    * Open Nepal http://data.opennepal.net
    * National Bureau of Statistics of China http://www.stats.gov.cn
    * Open Data Hong Kong https://opendatahk.com
    * Indonesian Government Open Data http://data.go.id
    * データカタログサイト(日本) http://www.data.go.jp
* EU以外のヨーロッパ、中央アジア、インド、中東、ロシア
    * Russian Government Data Website http://data.gov.ru
    * PakReport - Pakistan Open Data and Maps http://pakreport.org
    * Open Data India https://data.gov.in
    * Turkey Open Statistics http://www.turkstat.gov.tr
* 南米とカナダ
    * Canada statistics https://crdcn.org/data
    * Open Canada http://open.canada.ca/en
    * Open Data Brazil http://dados.gov.br
    * Open Data Mexico https://datos.gob.mx
    * Open Data Latin America http://opendatalatinoamerica.org

# 2. 各種機関、NGO（非政府組織）のデータ
* United Nations Open Data http://data.un.org
* United Nations Development Program Data http://open.undp.org
* Open Knowledge Foundation https://okfn.org
* 世界銀行データ https://data.worldbank.org
* WikiLeaks https://wikileaks.org
* International Aid and Transparency Datasets https://www.iatiregistry.org
* DataHub http://datahub.io
* Population Reference Bureau http://www.prb.org/DataFinder.aspx

# 3. 教育機関と大学のデータ
* Lexis Nexis http://lexisnexis.com
* Google Scholar search http://scholar.google.com
* コーネル大学のarXivプロジェクト https://arxiv.org
* UCI Machine Learning Datasets https://archive.ics.uci.edu/ml/index.php
* Common Data Set Initiative http://www.commondataset.org

# 4. 医療および科学データ
* Open Science Data Cloud https://www.opensciencedatacloud.org/publicdata/
* Open Science Directory http://www.opensciencedirectory.net
* WHO http://www.who.int/gho/database/en/
* Broad Institute Open Data https://www.broadinstitute.org/data-software-and-tools
* Human Connectome Project http://www.humanconnectomeproject.org
* UNC's Psychiatric Genomics http://www.med.unc.edu/pgc
* Social Science Datasets http://3stages.org/idata/
* CDC Medical Data https://www.cdc.gov/nchs/fastats/
エラー: file owned by 'fbterm-git' and 'ncurses': 'usr/share/terminfo/f/fbterm'と怒られるとき

どうも。Archlinuxのパッケージマネージャを使っていると、毎回以下のように怒られるようになりました。
なお、パッケージ自体のインストールはきちんとできているようです。

```
:: パッケージの変更を処理しています...
:: トランザクション後のフックを実行...
エラー: file owned by 'fbterm-git' and 'ncurses': 'usr/share/terminfo/f/fbterm'
```

原因は、fbtermとncursesのパッケージが扱っているファイルが衝突していることが原因です。
なので、fbtermをインストールするときにPKGBUILDを編集します。


まず、一度fbtermをアンインストールします。その次に、もう一度インストールします。そのときにPKGBUILDを編集するかどうか聞かれるので、Yを入力しましょう。

```bash
$ yaourt -R fbterm-git
# 省略
$ yaourt -S fbterm-git

==> AUR から fbterm-git の PKGBUILD をダウンロード...

# 省略

fbterm-git 20150509-3  (2017-05-18 01:06)
( サポートがないパッケージ: 潜在的に危険です ! )
==> PKGBUILD を編集しますか ? [Y/n] ("A" で中止)
==> ----------------------------------
==> 
#ここでYを入力&エンター
```

そうすると、デフォルトエディタ(環境変数$EDITORのコマンド)が実行されるます。40行あたりに以下の行があると思うので、削除してください。

```
install -Dm644 terminfo/fbterm "${pkgdir}/usr/share/terminfo/f/fbterm"

```

これで、fbtermがterminfoに余計なファイルをインストールしないようになります。


参考: https://aur.archlinux.org/packages/fbterm-git/
TypeScriptでScalaのcase classのcopyのような物を実装する(継承対応)

# 初めに
継承が必要ない場合は他の方が書いた下記記事を参考にして下さい。
https://qiita.com/nwtgck/items/bbfd6e3ca16857eb9c34

# 必要な物
ts-copyable:上で紹介されていたnpmパッケージ
applyMixins関数:[ここ](https://www.typescriptlang.org/docs/handbook/mixins.html)から`utils.ts`にコピペしておいて下さい。export忘れずに。

# 実装の方針
mixinを使う。

# 実装
```ts
import Copyable, { PartialMap } from "ts-copyable";
import { applyMixins } from "./utils";

export abstract class Base<C extends Base<C>>{
  abstract readonly a: number;
  abstract readonly b: string;

  abstract copy(partial: Partial<Base<C>>): C;
  abstract mapCopy(partial: PartialMap<Base<C>>): C;

  addA(x: number): C {
    return this.mapCopy({ a: a => a + x })
  }

  setB(b: string): C {
    return this.copy({ b });
  }
}

export class Child extends Copyable<Child> implements Base<Child> {
  constructor(
    public readonly a: number,
    public readonly b: string,
    public readonly c: boolean) {
    super(Child);
  }

  addA: (x: number) => Child;
  setB: (b: string) => Child;

  addA2(x: number): Child {
    return this.addA(x).addA(x);
  }

  setC(c: boolean): Child {
    return this.copy({ c });
  }
}
applyMixins(Child, [Base]);
```

# 結論
Scala使いたい！
bashで大文字/小文字の変換

文字列を全て小文字(or大文字)にさくっと変換したい時は，`tr`コマンドを使うとよさそう。

小文字にする。

```bash
$ echo KOTATSU | tr '[:upper:]' '[:lower:]'
kotatsu
```

大文字にする。

```bash
$ echo mikan | tr '[:lower:]' '[:upper:]'
MIKAN
```

私の全然更新していなかったbashはversion 3.2.57で古くて，これ使えなかったので…。
[[Qiita] Bashで変数を大文字小文字変換(uppercase/lowercase)する]
(https://qiita.com/kawaz/items/211266021515b3f033a3)

`tr`コマンドの詳しい使い方はこちら。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230906/
Unity uGUI UIテクスチャフォーマット選択フローチャート


# Unity uGUI UIテクスチャフォーマット選択フローチャート(2017年末現在)

去年はUnityモバイル開発でのUIテクスチャのフォーマット選択に苦しめられました。
UnityではプラットフォームとグラフィックAPI、各種GPUによって圧縮フォーマットの制限やSpritePackerが使えなくなることによる管理の複雑さ、それらを回避するための開発コストの増大など考慮する点が多く、現状のプロジェクトの状態をみて取捨選択をする必要があります。
なので今回は2017年末時点でのUIテクスチャフォーマットを選択するためのフローチャートをつくってみました。フォーマット選択の指針にしてもらえれば幸いです。
個人が調べた範囲でのものになるので何かまちがいや抜けがあった場合はご連絡いただける助かります。

とりあえず個人的なおすすめは「RGBA16」です。

## フローチャート
![UITextureFormatFlowChart-3.png](https://qiita-image-store.s3.amazonaws.com/0/57778/39d898e2-4031-a5b8-aede-8ad98cbb53f4.png)

## ①RGBA16(オススメ)

このフォーマットだとios、android同じフォーマットでUnityのuGUIやSpritePackerなどの標準の機能を使って問題なく開発できます、またこの状況で開発していればそもそも素材の容量やパフォーマンスに気を遣い作る必要性があるので今後パフォーマンス不足でテクスチャフォーマットを変更することもできるためです。ただし、メモリ消費や描画負荷は他のフォーマットの方が低くなり、デザインへの制限も出てくるのでプロジェクト初期に作りかたをプロジェクトで共有する必要があると思います。あと減色だけなので基本劣化しないです。
デザイナーにはuGUIやテクスチャフォーマットの知識をつけてもらって最小限の素材を使い回すようにUI設計してもらう必要がありますが重複したUIなどができにくく今後のプロジェクトにもプラスになるはずです。
いったん減色できないようにつくりはじめてしまうと全体的に調整する必要が出てくるので注意です、作り始める前に話し合っておきましょう。

## ②「ios : astc」「 android : etc2」

こちらのフォーマットは古い端末を切り捨てることでクオリティを維持しつつ①と同様の開発のしやすさとメモリと描画負荷を最小に抑えることができます。対応端末はiphone6以上OpenGL ES3以上のandroid端末です。それ以下の端末で動かした場合は元テクスチャ+RGBA32でメモリ展開されて低スペック端末にさらに負荷がかかる状態になります。
すべてのモバイル端末でこれらのフォーマットが使えるようになった時心の平穏が訪れる気がします。

## ③それぞれGPUやグラフィックAPIに対応したフォーマット

これはios、androidの各種GPUに対して適切なフォーマットのアセットバンドルを配信することで実現できます。
この場合はUIをアセットバンドル化してそれぞれのテクスチャフォーマットのアセットバンドルを作り分ける（アセットバンドルを作り分ける環境、アセットバンドルビルド時間が増える、ダウンロードシステム開発など）必要があるので開発コストや管理コスト、確認コストが上がります。お金と人材と時間が余るほどないと厳しいと思います。

## ④「ios : pvr(アルファマスク)」「 android : etc(アルファマスク)」

この方法はアルファマスクを使うことでpvrとetcでアルファ付きの素材のクオリティを維持しつつメモリ消費を削減、パフォーマンスもほどほどよくといった感じのバランス良い感じになります。
ただしUnityのUIアトラスに対してアルファマスクを作る必要があるためSpritePackerの機能が使えなくなることとuGUIシェーダーをアルファマスクに自前で対応させる必要が出てきます。そのため作り方によってuGUIのSetPassが増えやすくなるなどのデメリットがあります（本来は標準シェーダーをつかうことでUIのSetPassが最小に抑えられる）。

## そもそも論

Unityではすぐゲームが動いてしまうため制作フローやフォーマットを決めないまま開発が進んでしまうことがよくあるみたいです。
ただそういった状態で進めると描画負荷やメモリ消費、開発コスト増大など開発中盤以降に押し寄せてきます。
なので最初からuGUIの機能を理解して不要な素材をへらしたり、共通のUIを使いまわしたり、減色に耐えられるデザインになっていたりということのほうが重要です。ので、ある程度最初に決めて、のちに起こる問題を排除しましょう。

デザインの注意点としてはグラデーションを避ける（減色したときに荒れる）、半透明を避ける（pvrで荒れる）、uGUIの機能を考慮した素材にする(スライス、色変え、スケーリング)、2048x2048ぐらいに全部収まるくらいを目指すようにしとくなどがあります。

## まとめ＋Unityへの提案

状況によってテクスチャフォーマットの選択が必要になることが伝わったでしょうか。
最大限の端末に対応する場合は現状ではRGBA16がオススメです、参考になれば幸いです。

SpritePackerを使うことでetcでもSplit alpha channelの機能でandroidの古い端末には対応できます。ただしiphone5や5sを対応する必要があるならpvrを使う必要が出てくるためアルファ付きのテクスチャは荒れます（作り方にもよりますがグラデーションや半透明を多用しているとUIでは許容できないレベルになると思います。）
個人的に決定的な解決策としてはUnity側でpvrもetcと同じようにSplit alpha channelの機能を使えるようにすることなんじゃないかなと思います。
またUnity2017.3でiosでもetc2が使えるようになるようでなのでiphone5はもう捨てるとして
「ios - etc2 : android - etc(Split alpha channel)」
がベストな選択肢になるかもしれません。※1

もしこの記事の盲点や他になにかいい方法があればご連絡お願いします。

## 参考

アルファ入りの PVRTC を奇麗にするコツ
https://github.com/keijiro/unity-pvr-cleaner
【Unity】iOSでASTCフォーマットのテクスチャ圧縮を使う
http://tsubakit1.hateblo.jp/entry/2016/09/28/235632
【Unity】iOSでもETC2が使えるようになった。
http://tsubakit1.hateblo.jp/entry/2017/11/22/001941
UnityでiOS向けのETC2 Textureを作る（Unity2017.3）※1
https://qiita.com/jun_moka/items/47240033d244370c9e6c
Unity iOS/Android におけるテクスチャ画質の改善
http://www.keijiro.tokyo/posts/mobile_texture_compression
Rustでcharを統一的な方法で読み込むchar_streamというクレートを作ってみた

## はじめに

ストレス解消にRustでプログラミング言語でも作ってみようと思ったのだが、文字列と標準入力とファイルから統一的な方法でcharを読み込むのが面倒くさく感じた。

仕方がないので、[char_stream](https://crates.io/crates/char_stream)というクレートをでっち上げてみた。

## 使い方

### 初期設定

Cargo.tomlファイルに次の行を追加。

```Cargo.toml
[dependencies]
char_stream = "*"
```

### ざっくりとした流れ

基本的には、CharStreamのオブジェクトを作成したら、```next()```あるいは```read_line()```を呼んで１文字（あるいは１行）ずつ処理する流れ。

その他に、１文字先読みする```peek()```メソッドもある。

### 標準入力

標準入力から読み込む場合は、```from_stdin```メソッドを使う。

```rust:(実行すると入力待ちになるので何か文字列を入力すること)
extern crate char_stream;

use char_stream::CharStream;

fn main() {
     let mut stream = CharStream::from_stdin();
     while let Some(ch) = stream.next() {
         println!("ch: {}", ch);
     }
}
```


### File

Fileから読むこむときは```from_file```メソッドを使う。

```rust
extern crate char_stream;

use std::fs;
use char_stream::CharStream;

fn main(){
    let mut f = fs::File::open("testdata.txt").unwrap();
    let mut stream = CharStream::from_file(f);
    // なんか処理
}
```

### 文字列（str）

文字列(str)のときは```from```メソッド。

```rust
use char_stream::CharStream;

fn main(){
    let mut stream = CharStream::from("Hello 世界❤");
    // なんか処理
}
```

### その他

Stringの場合は```from_string```、バイト列の場合は```from_bytes```が用意してあります。
（文字列として意味のないバイト列を食わせたときの動作保証は無し）

### Iterator

CharStreamはIteratorトレイトを実装しているので、Iteratorトレイトがデフォルトで提供しているメソッドも呼べる。

例えば、

```rust
extern crate char_stream;

use char_stream::CharStream;

fn main() {
    let stream = CharStream::from("Hello 世界❤");
    if let Some(c) = stream.max() {
        println!("max char: {}", c);
    }
}
```

のようなコードで、（意味はないけど）文字コードが最大になる文字を求めることができる。

### DoubleEndedIterator

~~Version0.1.1から文字列(strあるいはString)から生成したCharStreamに関してのみ、DoubleEndedIteratorトレイトへ変換可能になった。~~
Version0.1.5から、StdInから作成したものを除いたすべてのCharStreamから、DoubleEndedIteratorトレイトに変換可能になった。
(ただし、Fileから作成したものを変換するときには、ファイルの中身を一気にすべて読み込むので注意。この読み込みは```wend_iter```を呼び出した時に起きる。)


変換には```wend_iter()```を使う。

これにより下記コードのように、逆順を求めることなどが可能になった。
（問題は[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)を参考にした。）

```rust
extern crate char_stream;

use char_stream::CharStream;

fn main() {
    let input = "stressed";
    let stream = CharStream::from(input);
    let rev_stream = stream.wend_iter().rev();
    let result: String = rev_stream.collect();
    println!("'{}' reverse to '{}'", input , result);
}

```


## Example

### 標準入力から１行ずつ読み込む

```rust
extern crate char_stream;

use char_stream::CharStream;

fn main(){
    let mut stream = CharStream::from_stdin();
    while let Some(line) = stream.read_line() {
        println!("line: '{}'", line);
    }
}
```

### ファイルの中身をひっくり返す

```rust
extern crate char_stream;

use std::fs::File;
use char_stream::CharStream;

fn main(){
    let f = File::open("Cargo.toml").unwrap();
    let file_stream = CharStream::from_file(f);
    let stream = file_stream.wend_iter().rev();
    let result: String = stream.collect();
    println!("{}", result);
}
```
本番環境にアセットが反映されない場合

#事象

[Railsチュートリアルの5章](https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1)の最後でGit push herokuしたら、追加したはずのSCSSが反映されていなかった。
しかし、ローカルにはきちんと反映されている。
ファイルの追加やコミットを忘れていたのかと思いきや、そうでもない。

#原因
実行環境によってアセットパイプラインの挙動が異なるため。
<br />
アセットパイプラインはCoffeeScript（.coffee）やSCSS（.scss）を以下のように処理する。
<br />

####1. コンパイル
.coffeeや.scssを.jsや.cssにコンパイル（変換）する。

```:例
user.coffee => user.js
company.coffee => company.js

user.scss => user.css
company.scss => company.css
```

####2. 統合
コンパイル済みの.jsや.cssを統合する。

```:例
user.js
company.js
 => application.js

user.css
company.css
 => application.css
```

####3. 圧縮
統合済みの.jsや.cssを圧縮する。
（コメントや改行、空行を除去）

####4. ダイジェスト付与
圧縮済みの.jsや.cssのファイル名にダイジェスト（ハッシュ値）を付与する。

```:例
application.js
 => application-x1x2x3x4x5x6x7x8x9x0.js

application.css
 => application-x1x2x3x4x5x6x7x8x9x0.css
```

<br />
ただし、開発環境（development）では2,3の処理を行わない。
（デバッグの際に、原因箇所の特定がしづらくなり、可読性も落ちるため）
よって、開発環境と同じように本番環境（production）を動作させようとすると、.jsや.cssに正しくアクセスできない。


# 解決策

本番環境にデプロイする前に、.jsや.cssをプリコンパイルする。

```
rails assets:precompile RAILS_ENV=production
```


# 参考
[Ruby on Rails 5アプリケーションプログラミング](https://www.amazon.co.jp/dp/B071YC72X1/)
[Ruby on Rails チュートリアル](https://railstutorial.jp/)
WebIDE サービス始めました

 - (85%くらいの完成度ですが)サービス開始します。
 - 興味持って頂けましたら、以下のアドレス宛にメール下さい。  
  順番にアカウントを発行させて頂きます。  
  exabugs@gmail.com
 - ご意見/ご要望は[GitHub](https://github.com/exabugs/WebIDE)のIssueにお願いします

# WebIDE

### 対象
 - プログラムの勉強を始めたいけど、環境構築が面倒な人
 - 2020年プログラミング教育必修化に関わる教育関係者
 - IT勉強会の主催者
 - プログラミング塾の経営者
 - 大学/高校の情報系学科の関係者

### 概要
 - ブラウザからログインするだけで、すぐにプログラム開発が可能です。  
(対応言語: Java, Node.js, C/C++, Python, Markdown)
 - メニューはなし。アイコンによる直感的な操作。


### 仕組み
 - ユーザ毎に、エディタ、実行/デバッグ環境を含む専用のDockerコンテナが起動します。
 - ログアウト後も作成したファイル(コード)は保存されており、再ログイン時にコンテナにマウントされます。

### 注意
 - CPU/メモリの上限を制限しています
 - 経費節減のため 午前中 (00:00-12:00) はサービスを完全停止します。
 
### 料金
  - とりあえず正式リリースまでは無料
  - その先の予定は未定
     - 商用利用は有料とし、CPU/メモリ上限を高くする

### お願い
 - 画面/アイコン/Webページのデザイナー募集
 - ユーザ数が順調に増えそうならクラウドファンディング
 - 直接投資 / 寄付して頂けると助かります。
 - 別件で AWS でのシステム開発のご相談も承ります。

## 機能

 - [詳細マニュアル](https://github.com/exabugs/WebIDE) (GitHub)

### 全体
- 5つのエリアに分割されていて、タブは各エリア間で移動(D&D)できます。

![全体](https://raw.githubusercontent.com/exabugs/WebIDE/master/img/screen.png)

### エディタ
- 各言語対応のエディタ
  - 色
  - フォールディング(折り畳み)
  - 自動フォーマット
  - 文法チェック

![エディタ](https://raw.githubusercontent.com/exabugs/WebIDE/master/img/edit2.png)

### デバッガ
- ブレークポイント
- ステップ実行

![デバッガ](https://raw.githubusercontent.com/exabugs/WebIDE/master/img/debugger.png)

### 変数
- デバッガ連動の変数ビュワー
- 構造化されているので、詳細を見たい場合はドリルダウン

![変数](https://raw.githubusercontent.com/exabugs/WebIDE/master/img/variable.png)

### スタックトレース
- デバッガ連動のスタックトレース

![スタックトレース](https://raw.githubusercontent.com/exabugs/WebIDE/master/img/stack.png)

### シェル
- zsh が使えます。
- 以下のようなコマンドが使用できます
  - wget / vi などの 一般的なOSコマンド
  - git
  - npm / pip3 などの言語特有コマンド

![シェル](https://raw.githubusercontent.com/exabugs/WebIDE/master/img/zsh.png)

### 言語別対応表

|言語|バージョン|ブレーク<br>ポイント|ステップ<br>実行|変数|スタック<br>トレース|自動<br>フォーマット|文法<br>チェック|
|:-:|:-:|:-:|:-:|:-:|:-:|:--:|:--:|
|Java|1.7.0|◯|◯|◯|◯|astyle|javac|
|Node.js|8.6.0|◯|◯|-|◯|astyle|eslint|
|C/C++|gcc<br>4.9.2|◯|◯|◯|◯|astyle|cpplint|
|Python|3.4.2|◯|◯|◯|◯|yapf|flake8|

#### Python
 - numpy
 - scipy
 - matplotlib
 - pandas
 - scikit-learn
 - yapf
 - hacking
 - tensorflow-1.4.0
【MAYA】IKに極ベクトルでコンストレイントかける際のリグ位置を求める計算メモ

MAYA+python歴４ヶ月くらい?の僕です。リグとか勉強中です。

膝とか肘のジョイントにIKが設定してあり、極ベクトルを使ったリグで向きをコントロールしたい場合に、ロケータなどのリグを配置するいい感じの場所を求めるのに使ったクイックpythonコードをメモっておきます。
スクリプトエディタにペーストする用です。MAYA2018 + MacOS Sierraで動作確認しています。

ジョイントがx軸方向もしくはz軸方向に向いている場合はバッチリの位置にローケータが置けるので問題ないのですが、そうでない場合（そんな状態を作っていいのかは知らない）は適切な位置にリグを置くのが難しく、コンストレイントをかけた際にパーツの向きがピクッと若干変わってしまうのを避けるためにこのコードを書きました。

```python
import pymel.core as pm
import pymel.core.datatypes as dt


def temp_def(locator_name='loc', distance=1.0):
    """
    A点(起点)B点(中点)C点(終点)の３つのジョイントを選択して実行すると
    極ベクトルコンストレイントに適した位置にロケータを作成する

    :param locator_name: 作成するロケータ名
    :param ratio: ロケータを作成する距離
    :type locator_name: str
    :type ratio: float
    """
    sel = pm.selected()
    if len(sel) < 3:
        print('select 3 nodes')
        return
    vectors = []
    for n in sel:
        pm.select(n)
        t = pm.xform(translation=True, ws=True, q=True)
        vectors.append(dt.Vector(t[0], t[1], t[2]))
    A = vectors[0]
    B = vectors[1]
    C = vectors[2]
    AB = B - A
    AC = C - A
    n = (AB.x * AC.x + AB.y * AC.y + AB.z * AC.z) / (AB.x * AB.x + AB.y * AB.y + AB.z * AB.z)
    AD = n * AB
    DC = AC - AD
    X = C + distance * DC
    loc = pm.spaceLocator(n=locator_name)
    loc.translate.set([X.x, X.y, X.z])


temp_def('locatorA', 0.5)
del temp_def
```

<img width="315" alt=" 2018-01-01 18.00.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/a96577ff-e928-ed97-cc3d-0e1c52155322.png">
スクリプト実行の前に、始点・終点・中点の順に選択します。

<img width="292" alt=" 2018-01-01 18.05.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/3c365163-7260-d7c4-e032-b789ebc39540.png">
スクリプト実行するといい感じの位置にロケータが作成されます。

<img width="308" alt=" 2018-01-01 18.06.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/9d3b086d-83b8-4bae-44d7-1caa878385b0.png">
IKハンドルと極ベクトルコンストレイントさせます。うまく動いているようです。

ABから垂直に伸びてCを通る点を求める計算を１０年ぶり以上で真面目にやりました。なんか、もっとプログラムに任せて楽にできそうな気がします。お正月に何やってんだ。

<img width="320" src='https://qiita-image-store.s3.amazonaws.com/0/8302/455119a7-f8eb-a687-707d-c705d72827a6.jpeg'>

あけおめ、ことよろ。
非線形2層パーセプトロン続き シグモイド関数の切片を学習する

# この記事の目的
- こちらの記事で非線形2層パーセプトロンについて書いた
    - [前回](https://qiita.com/kasuyaSansan/items/36af5b2e488b0b9eb178)

- 2層パーセプトロンにおいてシグモイド関数のゲインと切片の両方を学習するとどうなるかを実験してみる
    - すなわちsigmoid(ax-b)= 1/(1+exp(-ax+b))のaを前回は学習したがbも学習する
     

# 実験データ
- 前回と同じ
- ![image.png](https://qiita-image-store.s3.amazonaws.com/0/119514/04662246-7e8c-13c6-9a6d-a8a5fd27f8c7.png)
- 模試の数学と英語の点数で赤が不合格


# 学習方法
- 前回同様単純にbで二乗誤差を偏微分した値に小さい定数を掛け算して減算する
- より探索が必要となるため、学習回数は10倍にした
- 今回は定数を出力するニューロンはなくした
    - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/119514/a386a090-6c85-ba29-960c-e94c23493e80.png)

# 実験結果
- ![image.png](https://qiita-image-store.s3.amazonaws.com/0/119514/9d351b21-9236-8f8b-6d1f-3dda97841b09.png)
- 英語と数学のシグモイド関数の出力
- ![image.png](https://qiita-image-store.s3.amazonaws.com/0/119514/fd0fd708-434d-d478-238b-4358cb6cde66.png)
    - 数学は80点ぐらいまでは影響なしで、80点から急激に上昇
- 二乗誤差7.86 -> 7.16
- 二乗誤差は減ったが過学習してしまった感

- 確かにデータの感じはよくとらえているが今回の目的（大学の合格可能性を基に示唆を与えるような目的）にはそぐわないか
    - 一番下の不合格のサンプルを無視すれば、確かに数学の点が上がっても合格率はそんなに変わらないので、このデータからはこうなるとは思う
    - 一方で、事前知識として数学が20点までで合格はしないということが分かっていれば、bを学習しないほうがより、実態に即している。

# 結論
- bを学習することで二乗誤差が減り、よりデータにフィットした判別が可能
- 問題(データや目的）によってbは学習すべきときとそうでないときがある


# Appendix（結果の解釈について）
- 三層と比べて結果を解釈しやすいことが利点だが、どうやって解釈するか。それぞれの特徴量ごとに活性化関数が設定されるので解釈しやすいとはいえ、いくつか注意が必要
- ![image.png](https://qiita-image-store.s3.amazonaws.com/0/119514/0ac1eb49-ae95-2bab-a37c-600811d8548a.png)
- この結果をどう読み解くか
    - １．絶対値の大きさは重要ではない。変化量が重要
        - 例えば数学は1.3ぐらいから始まっているがそれは数学が0点でも加算されている値であり、判別に影響を及ぼしていない
    - ２．シグモイド関数は意外と複雑でグラフを書いてみないと実際よくわからない
        - 例えば、重みが負であったとしても負の影響があるとは限らない。ゲインも負ならば正の影響となる
    - ３．導関数を書いてみるとよくわかりそうな気がするけど、あんまりよくわからないので、普通に初期値を合わせて書くのが一番わかりやすい
    - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/119514/32179395-3eeb-9956-c37f-16cfd14d3240.png)
リクルートのTalk API＋音声認識＋音声合成＋翻訳で、友達をつくってみた

リクルートのTalk API＋
ChromeのWeb Speech API+
ChromeのWeb Speech Synthesis API+
Microsoft Translator API

＝話し相手の友達をつくってみました

https://sadaki82.github.io/index.html

<img width="1429" alt="test.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/142055/73499833-e3ed-4e98-f8e8-d81b61f574e3.jpeg">


参考にさせていただいたページ
[A3RT] Talk API の使い方を簡単に解説。
https://goo.gl/vEUGwX
Elixirで有限オートマトンの仕組みを少し理解する。その①

## 内容について
有限オートマトンについて勉強したので、自分の理解を深める意味も込めて、読んだ本の中で出てきたオートマトンをElixirで書いてみました。

## 動作環境

Elixir version : 1.5.2
OS : debian 8 (docker container)

## 有限オートマトン

まずは有限オートマトンについて軽く定義しておきます。有限オートマトンとは


> 有限個の状態と遷移と動作の組み合わせからなる数学的に抽象化された「ふるまいのモデル」である。

簡単に言えば、ある状態に対して何かしら入力をすると、別の状態（そのままの状態のこともある）に遷移していく機械ってことです。

有限オートマトンは５つの要素から構成されています。

> Q : 状態の有限集合
∑ : アルファベットの有限集合
δ : Q × ∑ -> Q 遷移関数
q0 : 開始状態
F : F ⊆ Q　で表される受理状態の集合

上記５つの要素を合わせて

> M = (Q, ∑, δ, q0, F)

っと表します。

そして、ある文字列の集合Aがある有限オートマトンMで受理されたなら、Aは機械Mの言語であるといい、MはAを認識するっとも言います。

### 自動ドア

では、早速有限オートマトンをElixirで作っていきます。
今回勉強した本で、一番最初に出てきた有限オートマトンは自動ドアの有限オートマトンでした。
まずは自動ドアの用語。

```
                  ---
 --------------    |    -----------
|               |  |   |            |
| フロントパッド |  |   | リアパッド  |
|               |  |   |            |
 --------------    |    -----------
                   |
                  ---
                  ドア
```
フロントパッド : 通過しようとする人の存在を検知するパッド
リアパッド : ドアの後ろにいる人とぶtから内容にするためにドアの反対側に人がいないかを検知するパッド
※ 今回の自動ドアは前後方向に開閉する自動ドアを想定しています（本にそう書いてあったから）。

自動ドアを上記に記述した有限オートマトンの５つの要素に当てはめていきたいと思います。

> Q : open(開いてる状態）、close（閉じてる状態）
∑ : front（人がフロントパッドの上にいる）、rear（人がリアパッドの上にいる）、both（フロントとリアの両パッド上に人がいる）、neither（どちらのパッドの上にも人がいない）
q0 : close（本では定義してなかったが、今回はcloseが開始状態とする）
F : open（本では定義してなかったが、今回はopenを受理状態とする）

では、これをElixirで書いていきます。

```
# 自動ドア
defmodule AutomaticDoor do
    def open(:neither) do
        :close
    end
    def open(:front) do
        :open
    end
    def open(:rear) do
        :open
    end
    def open(:both) do
        :open
    end

    def close(:neither) do
        :close
    end
    def close(:front) do
        :open
    end
    def close(:rear) do
        :close
    end
    def close(:both) do
        :close
    end
end

# 有限オートマトン
defmodule FiniteAutomation do
    def q(:open, [head| tail]) do
        AutomaticDoor.open(head)
        |> q(tail)
    end
    def q(:close, [head| tail]) do
        AutomaticDoor.close(head)
        |> q(tail)
    end
    def q(state, []) do
        state
    end
end

# 入力される∑の集合
inputs = [:front, :both, :rear, :rear, :front, :neither, :front]
IO.inspect FiniteAutomation.q(:close, inputs)
```

簡単に解説していくと、AutomaticDoor モジュールでは各自動ドアの状態とそれに対する入力ごとにメソッドを定義していきます。
そして、その入力に対する次の状態を返します。

```
defmodule FiniteAutomation do
    def q(:open, [head| tail]) do
        AutomaticDoor.open(head)
        |> q(tail)
    end
    def q(:close, [head| tail]) do
        AutomaticDoor.close(head)
        |> q(tail)
    end
    def q(state, []) do
        state
    end
end
```
FiniteAutomationモジュールでは、それぞれの状態のパターンごとにメソッドを定義し、入力の集合がなくなるまで再帰処理を繰り返していきます。


とりあず、今回はここまでにしておきます。
次はもう少し複雑になった（予定）有限オートマトンをElixirで書いていきたいと思います。

[Elixirで有限オートマトンの仕組みを少し理解する。その②](https://qiita.com/kobatako/items/6834b22e2167fcf09774)
Java のライブラリとか

# Java のライブラリとか

色んなサイトからのクリップを自分用に編集したものです。

## 文字列処理

* [Ropes For Java](http://ahmadsoft.org/ropes/index.html)
* [StringTemplate](https://www.stringtemplate.org/)

## 視覚化

* [DataMelt](http://jwork.org/dmelt/)
* [prefuse](http://prefuse.org/)
* [The Apache™ Batik Project](https://xmlgraphics.apache.org/batik/) - SVG生成ユーティリティ

## ORマッパー

* [Mybatis3](https://blog.mybatis.org/) -- いけてないけど。。。
* [Doma2](https://doma.readthedocs.io/en/stable/)
* [clione-sql](https://code.google.com/archive/p/clione-sql/)
  * [takezoe/jjug-javalib](https://github.com/takezoe/jjug-javalib)

## OpenAPI

* [OpenAPI Generator](https://openapi-generator.tech/)

### refs

* [プログラマーが効果的な可視化を作成する](https://qiita.com/keiono/items/76c0aaabb4e6e0c10dc5)


## その他、参照元

* [Awesome Java : 素晴しい Java フレームワーク・ライブラリ・ソフトウェアの数々](https://qiita.com/h_digitalhearts/items/7868996e3eb5fa55f11a)
Haskellについてのアンケート



###今回の趣旨

Haskellをやった事がないエンジニア達からHaskellのイメージ等について質問してみました。
知らない方達の意見を受け入れ、改善し拡めていくことが重要だと感じた為記事にしました。
故にHaskellを知らない方深く知らない方も多いので、その辺りを考慮して一読頂けますと幸いです。何卒m(_ _ )m

------------------------------------------------------------------------

⛩</font>アンケート内容 ⛩
1. Haskellってどういうイメージですか？
2. Haskellやりたいと思いますか？
3. Haskell案件を増やす為にはどうしたらいいと思いますか？

<h3><font color=blue>実際の返答</font></h3>
**友人Aさんからの意見**
1. ザ FP(関数型プログラミング)モナド
2. 勉強のためにやりたいと思いつつちゃんとやれてない。他の言語でも役に立つ知識がたくさんある
3. 最近はプロダクションで使う人も増えてるけど破壊的な変更（後方互換のない変更）が文化的に多いので、その辺ケアできる必要があると思う。最近どう変わったのか追ってないからみんなどうしてるのかは知らないです。
にわか解答すみません。

**友人Bさんからの意見**
1. 関数型言語として評判も高いので興味はあります。数学とか好きな人が好むイメージ
その分実用性よりルールなどで色々と言う人が多い気もします。
2. はい。面白そうなので。でも業務で使う場面はあまり無さそう…
3. 幅広く使われるようなフレームワークがあるといいなとおもます.

**友人Cさんからの意見**
1. 純関数言語
2. 思わない
3. わからない

**友人Dさんからの意見**
1　関数型プログラミング言語の固くてすごいやつ。モナド？
2　まぁやりたいとは思うけど難しそうなのでとっつきにくいから後回しになる感じ。
3　ディープラーニングなど流行りの分野で便利なライブラリを作る。

**友人Eさんからの意見**
1. カブトムシ...
2. あまり思いません。
3. web(PHP)や機械学習(Python)など、その言語が輝けるマーケットが出ないとじゃないでしょうか？
そんなに深くも考えてないんですが、Haskellじゃないとできない or 
一番向いている、とエンジニア以外の人でも認知されていると言えるような仕事が必要なんじゃないですか？

**友人Fさん**
1. 怖い。なぜならモナドは単なる自己関手の圏におけるモノイド対象だよ。なんか問題でも？と言われそう..
2. あまり思わない
3. Haskellを使ったいいサイトやアプリが有名になれば

**友人Gさんからの意見**
1. - 関数型パラダイムの理想に燃える若者が一度はハマる沼
　 - 便利な拡張などの理由で処理系がGHCほぼ一択ぽい
　 - 代数的データ型でグラフ（木構造・形式言語）に強い
　 - 計算量の見積もりが難しい

2.そのテクノロジーを選択する理由があればなんでも使う.

- チームのメンバーがそもそもHaskellerだ
- Haskellをやるとチームがなんかアガる
- Haskellerを採用したい
  - 往々にしてアカデミックなバックグラウンドを持つ
- 取り組む問題がグラフだ
  - 人間関係（ソーシャル・グラフ）
  - 路線図
  - 複雑な業務フロー
  - （形式または自然）言語処理
    - 記号計算
    - コンパイラ
    - チャットボット、スマートスピーカー等
- プログラムの理由付けが求められる
  - 非プログラマにプログラムの正当性を求められる場合にHaskellの持つ型システムが便利かもしれない
  
3.Haskell案件を増やすには、技術を選定する人間がHaskellを選択すればよい。
Haskellでなければいけない理由は多くの場合には無く、
非合理的な理由（アガる等）で選定する必要があるので経営層が絡む必要がある。
または、エンジニアリングを取り巻く環境が変わればHakellを採用する合理性が出てくる。
Haskellerの多い大学・研究室に採用のコネを作る、Haskellを採用していた企業・事業・プロダクトを買う等。
コアとなる技術でHaskellを採用するとHaskellで拡張を書く、Haskellでカスタマイズを提供するというのが選択肢に入ってくる。

-------------------

###感想
Haskellに興味はあるけど難しそうまたは案件が少なそう等の理由で
入り込めない人が多い印象を受けました。
よくあるHaskellって何で使われてるの？
とかの質問もそれに該当するかと思います。
とにかくhaskellerを増やさないと案件の受注も取れないので、明日のページには
教授達がどう考えてるかをお知らせしたいと思います。
【数式なしで説明】なぜニューラルネットワーク分類にクロスエントロピー、シグモイド、ソフトマックスが使われがち？

## 背景

`ニューラルネットワーク`での`分類問題`に`クロスエントロピー`、`シグモイド関数`、`ソフトマックス関数`がよく使われている。

そして、計算式があふれ、目を背け、結果だけみて、修正できない。

こんな私ですが、`ニューラルネットワークでの分類問題にクロスエントロピー、シグモイド関数、ソフトマックス関数が使われがちか`を数式無しで説明してみます。

## ソフトマックス関数は確率分布表現にベスト

`ソフトマックス関数`の数式は気にせず、その特徴は以下の2つ

- ある数値群(ベクトル)を`ソフトマックス関数`に通すと、各要素の`和がぴったり1`
- ある数値群(ベクトル)を`ソフトマックス関数`に通すと、全要素が`0から1の間`にある

つまり、`最後の出力の直前の活性化関数`に`ソフトマックス関数`を使えば、分類問題の答えとして`カテゴリAが50%、Bが20%・・・`みたいな感じで理想的な結果を出力できるのです。

## クロスエントロピーとシグモイド関数の相性抜群

ニューラルネットワークでの分類問題において、`目的関数は正直なんだっていい`のです。
でもなぜ`平均二乗誤差`でなく、`クロスエントロピー誤差`なのか？

当然、目的関数は微分しないといけません。

驚くべきは、`クロスエントロピーの微分`と`シグモイド関数の微分`を掛け算するとすごくきれいな数式になるのです。

## 結論

これらの話を結論付けると、

- `ニューラルネットワーク最後`の活性化関数は`ソフトマックス関数`
- `途中`の活性化関数は`シグモイド関数`
- `目的関数`は`クロスエントロピー誤差`

とするのが、計算コストや求める答えにとって理想的ということがわかります。
peco で Docker container ID を選択するやつ。

いつもの Docker container を peco で選択するやつです。

![demo](https://raw.githubusercontent.com/ujiro99/docker-selector/master/demo.gif)

# 必要なもの
* docker
* peco
* bash or nyagos (キーバインドを設定して呼び出す)

# 使い方
bash または nyagos のキーバインドで呼び出すことを想定している。
私は`Ctrl + d`で呼び出すように設定している。

```
docker exec -it [ここでおもむろに Ctrl + d]
```
あとはpecoでcontainerを選択し、続く引数を入力していけば良い。

# 準備
キーバインドで呼び出せるようにするまでの準備方法

### 1. インストール

ここからバイナリを落とす。
[docker-selector/releases](https://github.com/ujiro99/docker-selector/releases)

対応したバイナリが無くてgolangが入ってればこちらを。

```bash
$ go get -u github.com/ujiro99/docker-selector
```

### 2. キーバインドの設定
bashまたはnyagosでの設定例。
これを`.bashrc`か`.nyagos`に書くと`Ctrl + d`で呼び出せる。

* bash

```bash
peco-docker-selector() {
    local l=$(\docker-selector -a)
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${l}${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=$(($READLINE_POINT + ${#l}))
}
bind -x '"\C-d": peco-docker-selector'
```

* nyagos

```lua
nyagos.bindkey("C_D", function(this)
    local result = nyagos.eval('docker-selector.exe -a')
    this:call("CLEAR_SCREEN")
    return result
end)
```

# 背景
pecoでDockerを使いやすくする取り組みは過去にも色々あった。

* [peco-docker を作ってみました](https://qiita.com/yungsang/items/6a076d1dabbdf2f4c429)
* [docker+pecoでコンテナ（イメージ）操作](https://qiita.com/sonodar/items/d2de15b98581108b5de8)
* [peco で Docker の container ID を楽に選択する alias](https://qiita.com/dtan4/items/839c85d2650e63f662b0)
* [peco で docker exec](https://qiita.com/lulichn/items/42ca6630a1b18749ef5f)

fzfにも存在する。

* [fzf support for docker #760](https://github.com/junegunn/fzf/issues/760)

だけど、いずれもbashやzshを使うことを前提としており、nyagosユーザの私には使えなかった。MinGW bashへの移行やLuaスクリプトで書くことも考えたが、それなら初めからクロスプラットフォームで使えるようにしておこうと思い、golangで書いたのであった。
Vultr の Bare Metal Instance では PMU の機能がフルに使える

[EC2 の c5 instance では専有ホストを使わなくても PMU が使える](https://qiita.com/methane/items/442bab9150bc13273447) で紹介したとおり、AWSでもc5からはPMUが使えますが、最低でも1ソケット専有するサイズ（9xlarge, 2018-01-01時点でオハイオリージョンで $1.53/h)でないといけない、使える機能も制限されていてLBRなどは使えないという欠点がありました。

最近 Vultr の [Bare Metal Instance](https://www.vultr.com/pricing/baremetal/) というものを見つけて、これならフルでPMUが使えるんじゃないかと思って契約してみました。

Ubuntu 17.10 で見た cpuinfo と perf list はこちらです。

* [/proc/cpuinfo](https://paste.ubuntu.com/26297410/)
* [perf list](https://paste.ubuntu.com/26297393/)

perf list を見ると大量のハードウェアイベントが取れているのがわかります。
また、 `sudo perf top --call-stack=lbr` で、 lbr が利用できることも確認しました。

これで 300 \$/month, 0.446 \$/hour なので、数日集中してガッツリとプロファイルや最適化をしてみたいときには良さそうです。

もちろん、EC2に比べて不便な点もあります。

* 停止しても課金される。
* (現時点では)スナップショットやバックアップは取れなさそう。毎回新規OSの状態からスタート。

一応起動時に実行するスクリプトを指定することができるのでそこでプロビジョニングすることはできます。
また、別途ストレージを契約してアタッチしておけば永続化したいデータをちゃんと残すこともできます。

ただし、PMUのフル機能が必要ない場合は、EC2の方が使い勝手が良さそうです。値段的にもSpot Instanceを使えば同じくらいにできますし、普段は2xlargeを使っておいてプロファイルを取りたいときだけ9xlargeに変更するといったことも可能です。
テキストの数字列を読み込んでNumpy列に変換

MATLABに慣れるとNumpyの初期化周りがだるく感じる。
今回はtxtファイルに 
> 4.0,8.1
2.2,1.1

みたいにして保存されている数字列を取り出してnumpyのarrayあたりで読み込めるようにする。

## ソースコード
```python3
import numpy as np

#Read data
p_r, p_c = [], []
for l in open('HOGE.txt').readlines():
    # Data division
    data = l[:-1].split(',')
    # append or + 
    p_r.append([float(data[0]),float(data[1])])
    p_c.append([float(data[2]),float(data[3])])
# Data convert
p_r = np.array(p_r,dtype='float32')
p_c = np.array(p_c,dtype='float32')

```

### 解説メモ
splitのところでは,の代わりにスペース' 'やタブ'\t'などを指定しても良い。
appendのところは+=でも似たような挙動になるが多次元配列に変換したければappendが良さげ。
arrayの変換はnp.array(p_r,np.float32)でも可らしい。
Ruby初心者で勉強中に気になる点

今回「たのしいRuby」の本を読んで、他の言語と比べながら、気になる点をメモします。

### インスタンス作成のnewメソッド
javaみたいにnewキーワードを利用するではなく、クラスのnewメソッドを使います。より自然だと思います。

```ruby
class Cat
  def initialize(name, color)
    puts "initialize called!"
    @name = name; @color = color
  end
end
 
cat = Cat.new("Tama", "white")
```

### 例外処理のretry
javaの例外処理機構と比べると、リトライしたい時の処理ロジックがより簡単になります。

```ruby
10.times do |i|
  retry_counter = 0
  begin
    raise
  rescue
    retry_counter += 1
    if retry_counter <= 5
      puts i.to_s + ": retry"
      retry
    else
      puts "retried 5 times so go to next loop"
      next
    end
  end
end
```

### reduceメソッド
一見reduceメソッドがないようですが、ネットで調べたら、勿論ありました。

```ruby
numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
numbers.reduce{ | sum, n | sum + n }  #=> 55
```

### 配列の範囲操作が気楽

```ruby
alpha = ["a", "b", "c", "d", "e"]
p alpha[1..3]  #=> ["b", "c", "d"]
```

### ファイル操作機能が豊富
ファイルの読み書きだけでなく、ファイルやディレクトリのコピーや移動も簡単に実装できます。

## 参考
[rescue 節で一定回数 retry したあとは次に移るループ](https://qiita.com/riocampos/items/0870f1b682a62d6477de)