OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidのBASICで音声を取扱う

前書き
* このスライドはニッチでマニアックです
* BASIC!以外の利用方法はないです。
* HTMLやJsは初心者レベルです。
* スライドの練習用に作りました。 

---

### BASIC!はAndroidで動くBASIC言語のインタープリタ。
### 詳しくは以下をどうぞ。

* [AndroidでBASICを使う(Qiita)](http://qiita.com/basictomonokai/items/25bcb21ec69c00e9ad23)

---

## 無料の電子書籍もあります。

* [BASIC！の無料電子書籍(初心者向)](https://peraichi.com/landing_pages/view/basictomonokai)

![honw.jpg](https://qiita-image-store.s3.amazonaws.com/0/35574/e178c13d-be37-c4a2-1cf6-dbd541fbb7d5.jpeg)

---

### BASIC!で音声を取扱う方法を説明します。


* STT命令で音声⇒テキスト化
* TTS命令でテキストを読上げ
* テキストをファイルに保存

---

[テスト動画へのリンク（音声付）](http://www.youtube.com/watch?v=6UAz7looRJg)
![youtube動画表示エリア](http://img.youtube.com/vi/6UAz7looRJg/0.jpg)


---

### ご覧の通り、音声⇒テキスト
### テキスト⇒音声をしてるだけです
* プログラムのソースは[こちら](http://pastebin.com/ARFdsUVz)
* HTML画面のソースは[こちら](http://pastebin.com/NpTyFERn)

---

STT命令（Speech To Text）

* Googleのサーバーで処理されるネットワーク接続必須
* HTMLモード実行中は利用不可

``` 
      stt.listen
      stt.results thelist
```

---

TTS命令（Text To Speech）

* 別途読み上げアプリをインストール要
* [N2TTS（KDDI研究所）](https://play.google.com/store/apps/details?id=jp.kddilabs.n2tts&hl=ja)が有名

``` 
      tts.init
      tts.speak spwk$
      tts.stop
```

---

## まとめ
* 音声のテキスト化は簡単！
* テキストの読み上げも簡単！
* BASICなので超簡単！

---

## 終　 [BASIC!友の会](http://basic.amsstudio.jp)
PHPのuse句でasは使わないほうが良いと思います

# こんなかんじのやつです

```php
use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;
```

Laravelのドキュメントから抜粋しましたが、Laravelが嫌いってわけじゃないです。

# 思った理由
* 飛んでソース見に行っても、クラス名が違うから頭でコンテキストスイッチが発生する。
* as使う理由って、命名に失敗していて、本当はクラス名を変えるべきでは？

# 反論を考えてみました
名前が被っているので仕方ないとかありそうです。

```php
use Hoge\Manager;
// use Illuminate\Database\Capsule\Manager;
use Illuminate\Database\Capsule;
$capsuleManager = new Capsule\Manager();
```

こうすれば解決する気がします。

# まとめ
asを使う、肯定的理由が思いつかないです。
PHPのFWでは、マジックメソッドとか、リフレクションとか、よく見かけます。分かりづらくなるので使用を控えたほうが良いのでは？と思いました。
（ここは仕方ないとかあると思うので、極力避けたいイメージです。）

また、僕がまだPHP経験が浅いからか分かりませんが、FWのソースを読んでいて、実行してみないとソースを追えないものがありました。分かりづらくなる機能は使わずに、シンプルに構築してほしいです。。。
【論文シリーズ】RNNを用いたブレーキトルクの制御

## 原文
[RNNを用いたブレーキトルクの制御 (Braking torque control using recurrent neural networks)](http://goo.gl/Q1fazi)
Ćirović Velimir (2012)

## 1. 要約／背景
* 深層学習の応用例として読む価値のある論文。
* ディスクブレーキが与えるブレーキトルクを予測することは、これまでの数学的モデルでは困難だった。
* 適用圧力、ディスク滑り速度、ブレーキ表面温度、といった因子を考え、ブレーキトルクとの関係性についてモデリングした。
* RNNを使うモチベーションは、過去時点の圧力・滑り速度・表面温度、およびトルクが現時点のトルクに影響するという物理学的見地による。


## 2. 骨子の理論
(1)NARXネットワーク(Non-linear AutoRegressive Network with eXogenous inputs)
自動回帰NNに非線形活性化関数を用いる。
教師データや出力を外部入力値(exogenus input)として、RNNに活かす構図である。

![151130225608_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/1cd6cdac-477e-2ae6-c63c-c32685bbda18.jpeg)

![151130225608_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/bd9a4374-8886-de38-9472-104bf0a381cc.jpeg)

![151130225609_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/4993b027-8f91-fc8f-783c-200e29ae7c63.jpeg)


## 3. モデル適用例
*************************************************************************
7000あまりのデータをホールドアウトにより、約4000の学習データと、3000のテストデータに分ける。

![151130225609_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/6b647c28-c6b1-6a39-080c-db1cdb9486d3.jpeg)


![151130225609_5.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/7ea0e253-f79e-6bf0-85cc-40f4f510f06d.jpeg)


入力ベクトルは、次式にしたがって、正規化の前処理を施した。

```math
x_{(scal)} = x_{(scal)min} + \frac{x_{(real)} - x_{(real)min}}{x_{(real)max} - x_{(real)min}}(x_{(scal)max} - x_{(scal)min})
```

実測(real)の範囲に収まるように、計測値(scale)を正規化した。
筆者によると、正規化の目的は、入出力の値の範囲をコントロールすることで、予測範囲の限定化、予測精度の向上に繋げることである。

活性化関数は、$tanh$を用いた。

$$f(x) = \frac{1 - e^{-x}}{1 + e^{-x}}$$

下記に、ブレーキトルクの学習誤差率の分布を示す。
テストデータも汎化誤差少なく学習された。

![151130225609_8.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/d0b46c64-8fd3-07af-7a30-e636397cffd5.jpeg)


予測例として、次の図は、内部圧力p = 23.5 *bar*, v = 18 *km/h*の時の、シミュレーションを表す。
実測のブレーキトルクに対する再現性が高いことが確認できる。

![151130225609_9.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/e0038094-37b3-0d37-7128-789fc0425aca.jpeg)
【論文シリーズ】適合MCMCによるサンプリング

## 原文
[適合MCMCを用いたDBMの学習 (Learning Deep Boltzmann Machines using Adaptive MCMC)](http://goo.gl/VaIeBd)
Ruslan Salakhutdinov (2010)

## 1. 要約／背景
* DBMのような高次元構造の学習装置では、学習そのものが不安定で困難を伴う。ギブスサンプリングにしても、局所解に嵌ったり、次のstateへの遷移が不安定になるのもしばしばである。
* Coupled Adaptive Simulated Temperingアルゴリズムは、上記の不安定性の改善に寄与する。ギブスサンプリングに比べて、計算スピードは遅くなるが、アウトプットは安定する。


## 2. 骨子の理論
(1) データの混合(mixing)と、学習速度の関係
Markov連鎖によるデータサンプリングを続けると、サンプリングデータにいち早く適合するように、重みの更新と変化が激しくなる。これは、実質的な学習係数の増加につながり、学習の精度が悪くなる。
継続的CD(PCD)アルゴリズムでは、重みの更新にfast weights(高速ウェイト)を用いる。
これは、サンプリングデータの停滞＝データの悪い混合を防止し、学習精度の担保に貢献する。

(2) Wang-Landau(WL)アルゴリズム
適合MCMCの一種である。
マルコフ連鎖による重みの更新において、分配関数の扱いが困難になる。
このアルゴリズムは、重みに更新に対応する遷移確率の不変分布が次のような比例関係にあることに、注目する。

```math
p({\bf x}; \theta, {\bf g}^t) \varpropto \sum_{k=1}^{K}\frac{p^*({\bf x}; \theta)}{g_k^t} I({\bf x} \in \chi_k)
```

この時、有向関数$I$と、重み適合因子$\gamma$を使って、次のような更新式を導ける。

```math
g_k^{t+1} = g_k^{t}(1+\gamma_t I ({\bf x}^{t+1}\in\chi_k))
```

WLアルゴリズムによる重み更新の挙動は、Fast PCDの重み更新と呼応するものがある。

(3) Simulated Tempering
サンプリングの確率分布の考え方の一つで、サンプルベクトルに、「逆温度(inverse temperatures)」という概念を付加する。エネルギー関数$E(x)$に対して、ターゲット分布は次のように表現される。

```math
p({\bf x},k) \varpropto w_k \exp(-\beta_k E({\bf x})) \\
p({\bf x}|k) = \frac{1}{Z_k} \exp(-\beta_k E({\bf x}))
```

(1) ~ (3)を総合して、Coupled Adaptive Simulated Temperingアルゴリズムは形成される。サンプリングの模式図を下に示す。
計算コストはかかるが、アウトプットの精度向上が期待できる。

![151130220419_5.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/f91e527b-870f-f176-8bc0-57665de7a405.jpeg)



## 3. モデル適用例
例によって、MNISTとNORBによる画像認識のテスト結果を示す。表は、対数尤度を分解した時の下界という値を示す。
数値は、ゼロに近いほど良好であるが、CASTがContrastive DivergenceやStochastic Approximation Procedureといった手法よりよい結果を出した。

![151130220419_6.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/3b23ca63-0242-8267-ea97-742821102e5c.jpeg)
アルファブレンドの高速化

色深度が 8bit のアルファブレンドの計算式の定義を以下とする。
`(dest * (255 - alpha) + src * alpha + 127) / 255`

これを高速化するにはどうするか？ 除算は遅いのでシフト演算などに変形するのが定石。

よく見かけるのが 255 ≒ 256 と見做してシフト演算に置き換えるだけの方法。
`(dest * (255 - alpha) + src * alpha + 128) >> 8`
255 → 256 では 1/255 の誤差がある。値域が 0～255 の計算においてこれは無視できない。
(実際に使ってみるとわかるが、最大値の 255 が得られないためブレンドを重ねるとだんだん暗くなる。)

では、16bit に桁を増やせば誤差が 1/65535 となって無視できるのではないだろうか？
まずは 255 での除算を 65535 での除算に変形してみる。
$\frac{x}{255} = \frac{x}{256 - 1} = \frac{(256 + 1)x}{(256 + 1)(256 - 1)} = \frac{257x}{65535}$

ということで 257 をかけてから 65535 で割る。
`((dest * (255 - alpha) + src * alpha) * 257 + 32767) / 65535`
そして 65535 ≒ 65536 と見做してシフト演算に置き換え。
`((dest * (255 - alpha) + src * alpha) * 257 + ???) >> 16`
??? の箇所は実際にプログラムで試してみて誤差が出なくなる値を見つけよう。

アセンブラで書く場合は `x * 257` → `(x << 8) + x` といった細かな式変形も忘れずに。
さらに SIMD 命令を利用すると RGBA のブレンドを同時に行うことが可能。
GradleとAndroid Studioを利用したマルチプロジェクトビルド


# 背景
マルチプロジェクトビルドに挑戦しているので記録を残す。
C, C++, Javaのネイティブ環境である。
ndk-buildはコマンドをgradleから直叩きする形。
Androidライブラリとテスト用のAndroidアプリケーションをそれぞれ複数含む。

# 執筆時点の環境情報
```bash
$ gradle -version

------------------------------------------------------------
Gradle 2.14
------------------------------------------------------------

Build time:   2016-06-14 07:16:37 UTC
Revision:     cba5fea19f1e0c6a00cc904828a6ec4e11739abc

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_60 (Oracle Corporation 25.60-b23)
OS:           Mac OS X 10.11.5 x86_64
```

# Gradleについて
## クロージャの扱い
```gradle
task hello {
	// これだとタスク実行前(評価時)に実行されてしまう
	println "hello world"
}
task hello {
	doLast {
		println "hello world"
	}
}
task hello << {
	println "hello world"
}
```

# まずはGradle単体でのマルチプロジェクトの設定
## 構成を設定する
```settings.gradle
rootProject.name = 'water'
include 'bluewhale:bluemoon'
include 'bluewhale:redmine'
include 'krill'
include 'tropicalFish'
include '123'
include 'アイウエオ'
```

```bash
$ gradle projects
Root project 'water'
+--- Project ':123'
+--- Project ':bluewhale'
|    +--- Project ':bluewhale:bluemoon'
|    \--- Project ':bluewhale:redmine'
+--- Project ':krill'
+--- Project ':tropicalFish'
\--- Project ':アイウエオ'
```

ディレクトリ自体は作成しなくても良い。
以降この節ではプロジェクトを例として解説。

## サブプロジェクトのタスクは親からでも設定できる
```gradle
Closure cl = { task -> println "I'm $task.project.name" }
task hello << cl
project(':bluewhale') {
    task hello << cl
}
```

## 子供からでも親のタスクを設定できる
```./build.gradle
task ok << {
    println "ok I'm water."
}
```

```bluewhale/build.gradle
// rootProjectにokというタスクがない場合はエラーになる
rootProject.ok << {
    println "ok! man!"
}
```

```bash
$ gradle ok
Configuration on demand is an incubating feature.
:ok
ok I'm water.
ok! man!

BUILD SUCCESSFUL
```

## 実行時のタスクの順番を指定する
```bluewhale/build.gradle
task hello(dependsOn: ":krill:hello") << {
	println "hello bluewhale"
}
```

プロジェクト単位では指定できない。

## 評価の順番を指定する
他のプロジェクトに依存

```gradle
evaluationDependsOn(':producer')
```

全部逆順にする場合はこう

```gradle
evaluationDependsOnChildren()
```

task単位では指定できない。
何も指定しない場合はalnum

## Configuration on Demand
関係あるプロジェクトだけ評価する
そのうちこれがデフォルトの挙動になるだろうと書いてありました。
こうしないと関係ないプロジェクトも全部評価して設定してしまう。
詳しくは[こちら](https://docs.gradle.org/current/userguide/multi_project_builds.html#sec:configuration_on_demand)

```gradle.properties
org.gradle.configureondemand=true
```

# Android Studio
## 一般的な構造
```bash
android-unsplash $ tree -L 2
.
├── CONTRIBUTING.md
├── LICENSE
├── NOTICE
├── README.md
├── android-unsplash.iml
├── app
│   ├── app.iml
│   ├── build
│   ├── build.gradle
│   └── src
├── build.gradle
├── gradle
│   └── wrapper
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle
```

Note: app/ はandroid-unsplash/ の単なるサブプロジェクトである

## To Be Continued
とりあえず今日はここまで (2016/6/21)

## ドキュメント

[マルチプロジェクトの概要](
https://docs.gradle.org/current/userguide/intro_multi_project_builds.html)
[マルチプロジェクトの詳細と設定](https://docs.gradle.org/current/userguide/multi_project_builds.html)
[Configure on Demand機能の設定](https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties)
Centos 旧バージョンでyum更新エラー時



http://luozengbin.github.io/blog/2015-08-29-%5Btips%5D%5Blinux%5D%E6%97%A7%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3centos%E3%81%A7yum%E6%9B%B4%E6%96%B0%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E6%99%82.html
サーバー証明書のPEMとPFXの相互変換

#PFXをPEMへ変換する

公開鍵を作成する

    openssl pkcs12 -in server.pfx -clcerts -nokeys -out server.crt


秘密鍵を作成する

    openssl pkcs12 -in pfx server.pfx -nocerts -nodes -out server.key

#PEMをPFXへ変換する

    openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx
Java EE7の勉強用のリポジトリを立ち上げた。

#Java EE7のプロジェクト作成について覚書#

----------------
##稼働環境##
謎にWin10、NetBeans8.1、GlassFish4.1.1、MySQL5.7.13

----------------
##ソース所在##
https://github.com/akiraabe/JavaEE7Marathon

ブログに逐一手順を書くのは効率よくないので、ソースをGitHubで晒すことにします。
（Readmeは後日書きます）
ソースだけだと読み取れない手順について、ブログで補足します。

----------------
##プロジェクトを作る##
NetBeansで、新規プロジェクト＞Maven＞Webアプリケーション

pomはweb-apiで出来るので**javaee-api**への書き換えが必要

```xml:pom.xml(書き換え前)
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
```

```xml:pom.xml(書き換え後)
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
```
----------------
##Glassfish管理コンソールの不具合があるのでコマンドラインから操作（備忘録）##
コマンドラインから全て投入する方が楽なので編集（2016/7/19）

```
 asadmin create-jdbc-connection-pool --datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlDataSource --restype javax.sql.DataSource --property user=root:password=********:DatabaseName=study:serverName=localhost:PortNumber=3306 marathon
``` 


 
```
C:\Program Files\glassfish-4.1.1\bin>asadmin create-jdbc-resource --connectionpoolid marathon jdbc/marathon
JDBC resource jdbc/marathon created successfully.
Command create-jdbc-resource executed successfully.
```
###文字化けの対応
発生する時としない時があり根本原因が不明だが、glassfish-web.xmlというファイルに以下の記述をすることで文字化けが解決する場合があった。
```
    </jsp-config>
    <parameter-encoding default-charset="UTF-8"/>
</glassfish-web-app>
```
そもそも当該ファイルが存在しない場合もあるので、その場合には、NetBeansでプロジェクトを右クリックしてGlassfishディスクリプタ作成をするのが良い。
MySQL 5.6 の時間式の限界について


# 概要
- MySQL 5.6.26 では時間式の限界は `34 22:59:59` のようです。
	- [リファレンス](https://dev.mysql.com/doc/refman/5.6/ja/time.html)に `838:59:59` の記載があるため、その通りの挙動です。
- `INTERVAL 35 DAY` とかで回避。

# 再現した環境
MySQL 5.6.19 と 5.6.26 と 5.6.30

# 起きた事
MySQL の datetime 型から SUBTIME 関数で引き算をやろうとした結果、Python-MySQL から `_mysql_exceptions.Warning: Truncated incorrect time value: '60 00:00'` と怒られました。MySQL クライアントで直接入力してる限りエラーは見当たらないんだけど・・・と思っていたのですが、中身をよく見るとおかしなことが起きていました。

```
SELECT SUBTIME('2007-12-31 00:00:00', '60 00:00');
```

```
+--------------------------------------------+
| SUBTIME('2007-12-31 00:00:00', '60 00:00') |
+--------------------------------------------+
| 2007-11-26 01:00:01                        |
+--------------------------------------------+
1 row in set, 1 warning (0.00 sec)
```
ここで求められる正解は `2007-11-01 00:00:00` のはずだけど、実際には `2007-11-26 01:00:01` が返却されている。

ここで MySQL の[関数リファレンス](https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_subtime)を調べると
>SUBTIME(expr1,expr2)

>SUBTIME() は、expr1 と同じ書式で表現される expr1 と expr2 を返します。expr1 は時間または日付時間式であり、expr2 は時間式です。

とありますが、時間式とされている方に限界がありそうです。恐らく `'34 22:59:59'` が限界。

```
SELECT SUBTIME('2007-12-31 00:00:00', '34 22:00');
SELECT SUBTIME('2007-12-31 00:00:00', '34 23:00');
```

```
+--------------------------------------------+
| SUBTIME('2007-12-31 00:00:00', '34 22:00') |
+--------------------------------------------+
| 2007-11-26 02:00:00                        |
+--------------------------------------------+
1 row in set (0.00 sec)

+--------------------------------------------+
| SUBTIME('2007-12-31 00:00:00', '34 23:00') |
+--------------------------------------------+
| 2007-11-26 01:00:01                        |
+--------------------------------------------+
1 row in set, 1 warning (0.00 sec)
```

概ね想定通りの結果です。せっかくなので足し算も試してみよう

```
SELECT ADDTIME('2007-12-31 00:00:00', '60 00:00');
```

```
+--------------------------------------------+
| ADDTIME('2007-12-31 00:00:00', '60 00:00') |
+--------------------------------------------+
| 2008-02-03 22:59:59                        |
+--------------------------------------------+
1 row in set, 1 warning (0.00 sec)
```

そうなると思ってた。`ADDTIME` や `SUBTIME` に問題があるのではなくて、`expr2` の方に入るべき時間式の方に問題がありそう。


## 追記
コメント欄で教えていただきました。[TIME型のリファレンス](https://dev.mysql.com/doc/refman/5.6/ja/time.html) にバッチリ記載されています。
>TIME 値の範囲は、'-838:59:59' から '838:59:59' です 

[rryu](http://qiita.com/rryu) さんありがとうございます。

# どうやって回避するか？
`INTERVAL` でチマチマ回避することにします。

```SELECT '2007-12-31 00:00:00' - INTERVAL 60 DAY;```

```
+-----------------------------------------+
| '2007-12-31 00:00:00' - INTERVAL 60 DAY |
+-----------------------------------------+
| 2007-11-01 00:00:00                     |
+-----------------------------------------+
1 row in set (0.01 sec)
```

問題ない。
めざせpythonライブラリマスター （63）easygui

#【ライブラリ説明】
　簡単にGUIが作れる

#【プログラム】
```py
# -*- coding: utf-8 -*-

import easygui

easygui.ynbox('Shall I continue?', 'Title', ('Yes', 'No'))

easygui.msgbox('This is a basic message box.', 'Title Goes Here')

easygui.buttonbox('Click on your favorite flavor.', 'Favorite Flavor', ('Chocolate', 'Vanilla', 'Strawberry'))
```

#【結果】
　<img width="453" alt="title.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/2964124d-e8b7-80ab-8fe0-983e13261275.png">

　<img width="453" alt="ok.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/a681d596-909c-8643-38c6-9862b81c6b6f.png">

　<img width="451" alt="select.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/99ede8d1-43cf-27d9-6b3b-937b24d479eb.png">

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/easygui/0.98.0)
　[github](https://github.com/robertlugg/easygui)
　[API](http://pythonhosted.org/easygui/api.html)
AssumeRole が面倒な人向け簡易 shell script


aws-cli は `~/.aws/config` の profile に `role_arn` を書いておけば、自動で assume-role してくれます。`mfa_serial` を書けば MFA code にも対応。

これに対して AWS SDK for JavaScript はまだ `~/.aws/config` に非対応。`~/.aws/credentials` しか見てくれないので、node 向けの管理ツールとかをさくっと作っても、assume-role が極めて面倒。

要は assume-role した後に出力される

- aws_access_key_id
- aws_secret_access_key
- aws_session_token

を `~/.aws/credentials` に書けば良い、ということなので、それを自動で行う shell script を。

## 使い方

最後に記載の script を適当に path が通っているところに mode 0775 で設置。


### aws-assume-role -l

`role_arn` を持つ profile のリストを出力します。

複数の profile を用意して様々な role に assume-role してると、profile 名を忘れてしまうので。。

### aws-assume-role -p PROFILE

指定した profile に定義されている role に assume-role します。
`mfa_serial` が定義されている場合には CLI と同様に Enter MFA code: と聞いてきますので、MFA デバイスで生成したコードを入力してください。

assume-role が成功すれば、set complete. と表示され、 `~/.aws/crefentials` の指定した profile 部分に一時的な `aws_access_key_id`、`aws_secret_access_key`、`aws_session_token` が設定されます。

後は SDK で profile を指定すれば自動的に解釈してくれます。

### aws-assume-role -p PROFILE -d SECONDS

`-d SECONDS` を指定することで、（role 側で許可されていれば）duration を変更することができます。
デフォルトの duration は 3600（1時間）ですが、role の設定で最大 43200（12時間）まで拡大できます。

## script file

```bash:aws-assume-role
#!/bin/bash
set -e

usage() {
  echo "Usage: $0 [-lh] [-p profile] [-d duration_seconds]" 1>&2
  exit 1
}

while getopts d:lp:h OPT; do
  case $OPT in
    d)  duration=$OPTARG
        ;;
    l)  cmd='show'
        ;;
    p)  cmd='assume'
        profile=$OPTARG
        ;;
    h)  usage
        ;;
    \?) usage
        ;;
  esac
done

[ -z "$cmd" ] && usage

fetchConfig() {
  sed \
    -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
    -e 's/;.*$//' \
    -e 's/[[:space:]]*$//' \
    -e 's/^[[:space:]]*//' \
    -e "s/^\([^=]*\)=\([^\"']*\)$/\1=\"\2\"/" \
    < ~/.aws/config
}

showProfileList() {
  config=$(fetchConfig)
  echo "${config}" \
    | awk 'BEGIN{RS="["}/^profile/{gsub("\n"," ");print "[" $0}' \
    | grep role_arn \
    | sed -n -e "s/^\[profile \(.*\)\].*/\1/;p"
}

assumeRole() {
  config=$(fetchConfig)
  eval "$(echo "${config}" | sed -n -e "/^\[profile ${profile}\]/,/^\[/{/^[^;].*\=.*/p;}")"

  prf=''
  param=''
  [ -n "${source_profile}" ] && prf="--profile ${source_profile}"
  if [ -n "${duration}" ]; then
    param="${param} --duration-seconds ${duration}"
  fi
  if [ -n "${mfa_serial}" ]; then
    stty -echo; echo -n "Enter MFA code: "; read token_code; echo; stty echo
    param="${param} --serial-number ${mfa_serial} --token-code ${token_code}"
  fi

  creds=($(aws ${prf} sts assume-role \
    --role-arn $role_arn \
    --role-session-name $profile_temp_$(date +%s) \
    ${param} \
    --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
    --output text))

  aws --profile $profile configure set aws_access_key_id ${creds[0]}
  aws --profile $profile configure set aws_secret_access_key ${creds[1]}
  aws --profile $profile configure set aws_session_token ${creds[2]}
  echo "set complete."
}

case "$cmd" in
  'show' )
    showProfileList
    ;;
  'assume' )
    assumeRole
    ;;
esac
```

## 備考

external-id は自分が使っていないので未サポートです。必要な場合は適当に改変してください。

----

2020-02-07 追記: duration に対応
Pleiadesダウンロード防備録

Pleiadesをダウンロードする機会があったので、その時に準備したものとかURLのまとめです。
PleiadesDLサイト：http://mergedoc.osdn.jp/
前はsourceforgeだったように思うのですが、URLが変わったのでしょうか。
そして次に、あんまりにもこのファイルはサイズが大きいため、
http://forest.watch.impress.co.jp/library/software/hashtabshlex/
にてHashTabをDL、インストール。MD5とかを照合します。まあそうでもしないとあれですよね…。
一応他に同じファイルをDLして、compで比較というのもあるんですが、あんまり時間がかかりますし、こんな感じで以降と思っています。
labstack/echoの2.0がreleaseされてたのでAppEngineで動かしてみる

**追記 2016/11/17
最新のechoではこの記事の内容は動作しません**

https://echo.labstack.com/

echoの2.0がreleaseされてfasthttpでも使えるようになってました。
`echo.HandlerFunc`も`context.Context`に対応していてAppEngineのサービスを呼び出すときにミドルウェア一つでそのままcontextを突っ込めば動くようになってるのが自分的には嬉しいです。

# echo

GoのWebFrameworkです。軽量で高速な動作で標準のnet/httpとfasthttpの両方に対応しています。

# Install

```bash
go get github.com/labstack/echo/...
go get google.golang.org/appengine/...
```

# HelloWorld

```yaml:app.yaml
runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app
```

```go:server.go
package main

import (
	"net/http"
	"github.com/labstack/echo"
	"github.com/labstack/echo/engine/standard"
)

func init() {
	e := echo.New()
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	s := standard.New("")
	s.SetHandler(e)
	http.Handle("/", s)
}
```

`goapp serve`で開発サーバーを立ち上げれます
`http://localhost:8080`にアクセスしてみたら`Hello, World!`と表示されます

# echo.ContextでAppEngineのサービスにアクセスできるようにする

v1の頃は以下のように ハンドラ内で`appengine.NewContext`を呼び出してDatastoreやURLFetchを使ってました。

```go
func (c *echo.Context) error {
	ctx := appengine.NewContext(c.Request())
	log.Infof(ctx, "Top")
	return c.String(200, "Top")
}
```

v2からはHandler内では以下のように書けるようにできます。

```go
func (c echo.Context) error {
	log.Infof(c, "Top")
	return c.String(200, "Top")
}
```

そのためにはミドルウェアを書きます

```go
func AppContext() echo.MiddlewareFunc {
	return func(next echo.HandlerFunc) echo.HandlerFunc {
		return func(c echo.Context) error {
			if r, ok := c.Request().(*standard.Request); ok {
				c.SetContext(appengine.WithContext(c.Context(), r.Request))
			}
			return next(c)
		}
	}
}

func init() {
	e := echo.New()
	e.Use(AppContext())
	e.GET("/", func(c echo.Context) error {
        log.Infof(c, "Path: %s", c.Request().URL().Path())
		return c.String(http.StatusOK, "Hello, World!")
	})
	s := standard.New("")
	s.SetHandler(e)
	http.Handle("/", s)
}
```

これでどっちのコンテキストだっけなぁと悩む必要はなくなりました。
`context.Context`対応の恩恵はこれだけではなくキャンセル処理やタイムアウト処理も実装しやすくなると思います。

概要はこの辺を見るとよいかと https://blog.golang.org/context
(サンプルが古いSearchAPIを使ってて動かなかったけど)

# まとめ

雑ですが試したリポジトリ
https://github.com/k2wanko-sandbox/appengine-echo

LoggerをLogAPIに流せるようにしたいなと思ってるのですが
どうすればいいかなで悩んでます。
Docker for Mac / Windows の Public beta 開始(事前申込・token不要)

本日（日本時間6月21日）より、Docker for Mac と Windowsについて**Public beta**が開始されたようです。

[公式サイトblog：docker-mac-windows-public-beta](https://blog.docker.com/2016/06/docker-mac-windows-public-beta/)

**Private beta**では、
事前申込み者へDocker社よりダウンロード先リンクとtokenの書かれたメール通知が届き
セットアップ時にtokenを入力してインストールが完了する形でしたが

**Public beta**からは、
以下公式サイトからダウンロードが可能となり、またセットアップ時にtoken等が不要になります。

https://www.docker.com/products/docker#/mac
https://www.docker.com/products/docker#/windows

**Private beta**の機会を逃していた方は是非。

なお、新たな[Private beta はAWSとAzure](http://qiita.com/tbuchi888/items/896907f13f77e5d49363)のようです。
picassoだけどfadeをコントロールしたい

そんな時ありますよね
glideを使えば良いのかもしれないがガッツリpicassoに染まってしまったアプリを書き直すのは骨が折れる
でも大丈夫、以下のようにすることでpicassoのままfade animationをコントロールすることができます

```java:
Picasso.with(context).load(url).noFade().into(imageView, new Callback() {
        @Override
        public void onSuccess() {
            Animation anim = new AlphaAnimation(0, 1);
            anim.setInterpolator(new AccelerateInterpolator());
            anim.setDuration(FADE_DURATION);  // 任意のミリ秒を指定しましょう
            imageView.startAnimation(anim);
        }
        @Override
        public void onError() { (略) }
    });
```

これで画像のfade処理も思うがままです
RailsでInstagramのハッシュタグ検索を作る

2016年6月からInstagramの仕様が変更となり、審査に通らないと自動的にsandboxモードになるようになりました。
詳しくは以下の様なサイトを参照してください。
>https://dandashokai.com/1315
>http://outof-rails.seesaa.net/article/432446339.html

自分のページだけで使用するアプリにInstagramAPIを利用する場合、審査に通らない可能性が非常に高いので、ここではsandboxモードで使用することを前提に書きます。

最終目的としては、特定のハッシュタグでの投稿を集めることです。
下記の猫stagramみたいな感じです。
>http://blog.ruedap.com/2011/02/28/instagram-api-of-exclusive-use-for-cat-lovers-nekostagram

基本的には上記の猫stagramのページのままなのですが、初心者用の詳しい内容などが載っているページが見つからなかったので、今後の自分のメモとしても残します。

必要となるgemは'instagram'のみです。

#環境
Ruby 2.3.0
Rails 4.2.3

#1.Gemファイルに　gem 'instagram'　を追加する

```Gemfile
gem 'instagram'
```

#2.bundle install実行
普通に「bundle install」を実行します。

#3.config > initializersにconstants.rbファイルを作成
Railsコマンドを使わずに「constants.rb」という名前のファイルを作るだけです。

#4.作成したconstants.rbファイルを編集

```constants.rb
module Constants

  # instagram
  ACCESS_TOKEN = "******"
end
```

その他も設定したい方はこちら↓

```constants.rb
module Constants

  # instagram
  CLIENT_ID = "******"
  CLIENT_SECRET = "******"
  ACCESS_TOKEN = "******"
  REDIRECT_URL = '******'
  TAG_NAME = '******'
end
```

各項目の取得方法は以下URL参照

>http://magicalsally.net/instagram-api-access-token/

確か上記ページの通りにするとエラーが出たと思うのですが、その時はエラーメッセージの最後の文章でググったらすぐ出てきたと思います。

「CLIENT_ID」とか「CLIENT_SECRET」は変数なので分かりやすければ何でもいいです。
twitterとかfacebookとか他のSNSの情報も持たせたい場合は「TW_CLIENT_ID」とかにすると分かりやすいです。
ただしコントローラーと整合性は持たせてくださいね（^o^）

#5.コントローラ(app > controllers > top_controller.rb)の設定

```top_controller.rb
class TopController < ApplicationController
  require 'instagram'
  require 'json'

  def index
    Instagram.access_token = "#{Constants::ACCESS_TOKEN}"

    unless Instagram.tag_recent_media("はんにゃらばんばんばん")
      @medias = ""
    else
      @medias = Instagram.tag_recent_media("はんにゃらばんばんばん")
    end
  end
end
```

嫌だー！access_token以外も使いたいんだー！という方はこちら↓

```top_controller.rb
class TopController < ApplicationController
  require 'instagram'
  # require 'uri'
  require 'json'

  def index
    Instagram.configure do |config|
      config.client_id = "#{Constants::CLIENT_ID}"
      config.client_secret = "#{Constants::CLIENT_SECRET}"
      config.access_token = "#{Constants::ACCESS_TOKEN}"
    end

    unless Instagram.tag_recent_media("はんにゃらばんばんばん")
      @medias = ""
    else
      @medias = Instagram.tag_recent_media("はんにゃらばんばんばん")
    end
  end
end
```

#6.view(app > views > top > index.html.erb)の編集

```index.html.erb

<% if @medias == nil %>
  <%= "投稿がありません" %>
<% else %>

<% @medias.each do |media| %>
<!-- 投稿画像 -->
  <%= link_to image_tag(media.images.low_resolution.url, :class => "img- rounded" ), media.link, :target=>["_blank"] %><br>
<!-- 投稿者名 -->
  <%= media['caption']['from']['full_name'] %><br>
<!-- コメント -->
  <%= media.caption.text %><br>
<!-- いいねカウント -->
  <img src = "/images/heart.gif"><%= media['likes']['count'] %><br>
<!-- コメントカウント -->
  <img src = "/images/comment.gif"><%= media['comments']['count'] %><br>
  <% end %>
<% end %>
```

#完成
これで完成です。
全然成形していないので、縦にダラダラでてきますのでCSSとかで適当にいじって下さい。
その他の情報を記載したい場合はindex.html.erbの中に「<%= @medias %>」を置けば、JSONが表示されるので、表示したい内容を探して付け加えて下さい。

全然出ないじゃねーか！と突っ込まれる前にAPIにユーザーを登録したか確認してくださいね(^^;)
sandboxモードだと登録済みユーザーの中でハッシュタグ検索した結果しか出ませんから（ToT）
非常に使いにくいAPIになってしまいましたね・・・
メモ: Jenkinsからssh接続しようとしたらエラー

## エラー1つめ

* [[JENKINS-25412] Update JSch to 0.1.49 - Jenkins JIRA](https://issues.jenkins-ci.org/browse/JENKINS-25412)

> fatal: Unable to negotiate with 121.200.152.223 port 37912: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1,diffie-hellman-group-exchange-sha1

```diff:/etc/ssh/sshd_config
+ KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
+ MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com,hmac-md5,hmac-sha1,hmac-sha1-96,hmac-md5-96
```

## エラー2つめ

* [[JENKINS-17440] SSH Plugin throws auth cancel - Jenkins JIRA](https://issues.jenkins-ci.org/browse/JENKINS-17440)

> com.jcraft.jsch.JSchException: Auth cancel

あきらめた。

以下メモ

## sshプラグイン

### プラグイン追加

1. Plugin Manager
2. Manage Jenkins
3. SSH plugin

### SSHホストの追加

1. SSHホストの追加
2. Manage Jenkins
3. Configure System
4. SSH remote hosts



## メール送信元アドレス設定

Manage Jenkins
\> Configure System
\> System Admin e-mail address
Laravel5.1 artisanのよく使うコマンド


Artisan（アーティザン：職人）とはLaravelを構成しているコマンドラインインターフェイスの名前で、Laravelアプリケーション開発で役立つコマンドを用意しています。
よく使うコマンドの使い方についてまとめました。

参考：http://readouble.com/laravel/5/1/ja/artisan.html
参考：https://laravel10.wordpress.com/

# 基本操作
artisanコマンドの全リストを確認。

```
php artisan list
```

artisanで実行できるコマンドのオプションの確認。

```
php artisan help コマンド
php artisan help make:controller
```

 対話コンソールtinkerを開始する。

 ```
php artisan tinker
```

# route
登録されている全てのrouteをリスト表示する。

```
php artisan route:list
```

# コントローラ
コントローラファイルを作成(デフォルトメソッドなし)

```
php artisan make:controller HogeController --plain
```

コントローラファイルを作成(デフォルトメソッドあり)

```
php artisan make:controller HogeController
```

# DB
## model
モデルを作成。

```
php artisan make:model Hoge
```

## migration
マイグレーションファイルを作成。
--createオプションをつけることで、作成ファイル内にテーブル作成・削除などの初期処理を記述してくれる。

```
php artisan make:migration create_hoges_table --create=hoges
```

マイグレーションファイルを実行する。
すでに実行したことがある場合は差分のみ実行。

```
php artisan migrate				
```

一番最後に実行したマイグレーションをロールバックする。
DB内のmigrations内に実行した番号が書いてある。

```
php artisan migrate:rollback
```

全てのマイグレーションをロールバックする。

```
php artisan migrate:reset
```

DBを全てロールバックし、再度全マイグレーションを実行する。（データはすべて消去される。）

```
php artisan migrate:refresh			
```

## seed
seedファイルを作成する。

```
php artisan make:seeder HogeSeeder
```

seedを実行する。

```
php artisan db:seed
```

# テンプレート生成
Bootstrapを使ったログイン画面、登録画面、パスワードリセット画面を生成する。
（新規アプリケーション生成時に実行するべき。そうでない場合は編集したauth関係のファイルが上書きされてしまう。）
*Laravel5.2から使用可能.


```
php artisan make:auth
```
provisioning profileの更新でエラー

証明書の期限が切れてたので、provisioning profileを更新してArchive Buildしたらこんなエラー。

```
No matching provisioning profile found: Your build settings specify a provisioning profile 
with the UUID “xxxxxx”, however, no such provisioning profile was found.
```

色々設定見たけど全く原因わからず、Xcodeを再起動したらエラーが消えた...。

この現象去年もはまったようなかすかな記憶が...。記事書いたらからすぐに気づけよ！ > 1年後の自分
Rails は MVC ではない

この記事はポーランドのソフトウェアエンジニア [Andrzej Krzywda](https://twitter.com/andrzejkrzywda) の [Rails is not MVC](http://andrzejonsoftware.blogspot.jp/2011/09/rails-is-not-mvc.html) の翻訳です。記事の内容は訳者の意見とは必ずしも同じではありません。

---

# Rails は MVC ではない

Rails コミュニティーには用語の問題があります。

みんな Rails を MVC フレームワークだと宣伝しています。私もしたことがあります。しかし実のところ Rails は [Model2](https://en.wikipedia.org/wiki/JSP_model_2_architecture) アーキテクチャです。MVC ではありません。

単に定義の問題ということは分かっています。どうでもいい話かもしれません。実際のところ最近まではそれほど問題ではありませんでした。最近 JavaScript MVC というトピックがよく話題になります。それは素晴らしいもので、ブラウザと JS の組み合わせは本当の MVC になり得そうです、Model2 ではなく。

# OK じゃあ 違いは何なの？

端的にいうと、モデルが (Observer パターンを用いて) ビューに対して変更の通知ができる時、MVC と言います。それは、通常の Rails アプリではできないことです(WebSocket や Push 通知を使えば可能ですが、今の所そこまで一般的ではない)。MVC はむしろデスクトップの分野で一般的なアーキテクチャでした。

一方で Model2 は Rails で私たちがやっていることそのものです。私たちはモデルの変更をビューに通知したりしません。コントローラーは単純にモデルデータをビューに渡して、ブラウザに送る HTML の生成を行います。

最近発展してきている面白いパターンで、Rails を JSON/REST API を扱うアプリのバックエンドのとしてのみ使うというものがあります。Model2 に似ていますが、HTML を生成する代わりに、JSON を生成する点が異なります。それでもやはり MVC ではありません。

より詳しく知りたい場合は[こちら](http://www.martinfowler.com/eaaDev/uiArchs.html)の Martin Fowler の UI アーキテクチャに関する記事をお勧めします。

# なぜ重要か?

これは問題になりつつあると思います。なぜなら私たちは JavaScript MVC についてよく話すようになってきているためです。JavaScript の MVC は本当の MVC です。モデルは簡単にビューに通知を送ることができます。しばしば、JS MVC を紹介された人たちが混乱して Model2 パターンをクライアントサイドで実装してしまっているのを見かけますが、私の目から見るとそれは滑稽です。

# Model2 と MVC の混乱についてどうするか

選択肢として3つ

1つめは MVC はオリジナルの意味が変わったと考えて、Model2 も MVC と呼ぶこと。この場合、もともとの MVC を指して classic MVC とか real MVC などのように呼ぶことができると思います。これは実際今起き始めていることですが、しかし私の意見では定義を変えるのは良い考えとは思えません。それはさらなる混乱を招くでしょう。

2つめはあくまで Rails は Model2 アーキテクチャであると言い MVC は元々の MVC を指すとすることです。これは険しい道ですが、もともとの定義を維持できます。

3つめは単に無視すること。どうでもいいじゃない。

個人的には 2つめの道でいきたいと思っています。
サーバーレスでリダイレクト

# こんなことありますよね？
* サービスをローンチしたのにも関わらず、正式なサービス名が決まっていない
* サービスをローンチ直後にドメイン名を変えたい衝動にかられ、変えてしまった
* その他、やたらドメインを変えなくてはいけない

とは言え、古いドメインは無視ではなく、新しいドメインにリダイレクトしたい。

---

# Webサーバでやればいいじゃん
確かにそうなんですけど、やたらドメインを変えまくったせいでリダイレクトの設定が意味不明になっているNginxの設定をよく見ます。
ただでさえややこしくなりがちなWebサーバの設定は極力すっきりさせておきたいものです。

---

# 現行サービスと無関係なものは外に
AWSを使用している場合、Route53, S3, CloudFront(httpsの場合)を使用してリダイレクトをすることができます。
![スクリーンショット 2016-06-21 14.18.05.png](https://qiita-image-store.s3.amazonaws.com/0/83411/05237c77-4022-a6aa-cfcc-99dc3ac06360.png)


---

# やり方
まず、S3の設定

* バケット名：旧ドメイン名(例 old.example.com)
 * エンドポイントはこんな感じになる。 old.example.com.s3-website-ap-northeast-1.amazonaws.com
* 静的ウェブサイトホスティングで
 * 「別のホスト名に全てのリクエストをリダイレクトする」を選択
 * リダイレクト先に新しいホスト名を設定

httpの場合はRoute53からAレコードで上記S３を設定すればOK。


---

httpsの場合は

* CloudFrontの設定
 * CNAME:旧ドメイン
 * Origin:上記S3
 * Behaviors：Default(*)で適当に
* Route53の設定
 * 旧ドメインのAレコードで上記CloudFrontを設定
Linuxを踏み台にWindows環境へリモートデスクトップ接続する方法


前提条件：
手元の端末から踏み台サーバ(Linux)にSSH接続が可能
踏み台サーバからリモートサーバ(Windows)にポート3389番で接続が可能

### ポートフォワードの設定

Teratermを起動し踏む台サーバにSSH接続する。
メニューの「設定」から「SSH転送」を選択する。
「追加」ボタンを押すと設定画面が開きますので次のように各項目を入力する。

```
ローカルポート：13389
リッスン：空
リモート側ホスト：リモートサーバのIP(内部IP)
ポート：3389
```

![teraterm.png](https://qiita-image-store.s3.amazonaws.com/0/25093/c67a5516-7cca-2acf-5b01-515915d72a5c.png)

「OK」ボタンを押すと設定が完了。
Teratermは開いたままでリモート接続を行う。

### リモートデスクトップ接続
リモートデスクトップを開き、接続先に「127.0.0.1:13389」を指定。

![teraterm4.png](https://qiita-image-store.s3.amazonaws.com/0/25093/3fb7a0e8-f70f-c49f-1151-04e16765de61.png)

これで踏み台(linux)を経由してリモートデスクトップ接続可能となる。
CSS3でフェードイン・フェードアウトするダイアログ

# 概要

ボタンを押すとダイアログがフェードインで出現し、もう一度押すとフェードアウトで消えるコードのサンプルです。`jQuery#show/hide`ではなく、CSS3の`transition`を使用しています。

# 動作環境
Chrome 51 で検証。
CSS transition http://caniuse.com/#feat=css-transitions

# コード

* `class="fading-box"`を指定した要素が fade-in/fade-out する
* 上記の要素に`visible`クラスを追加・削除して表示・非表示を切り替え
* フェードエフェクトは`.fading-box`の`transition`で変更
    * easeなどの timing function: [MDN &lt;timing-function&gt;](https://developer.mozilla.org/ja/docs/Web/CSS/timing-function#Keywords_for_common_timing-functions)

jsFiddle→ https://jsfiddle.net/noobar/hvbquqf9/3/

```html
<!DOCTYPE html>
<html>
<head>
  <title>Fade Sample</title>
  <style>
  main {
    position: absolute;
    width: 300px;
    height: 300px;
    background-color: green;
  }
  
  #dialog {
    position: absolute;
    left: 50px;
    top: 50px;
    width: 100px;
    height: 80px;
    background-color: orange;
  }
  
  /* Fading Effect - invisible state - */
  .fading-box {
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.3s ease-out, visibility 0.3s ease-out;
  }
  
  /* Fading Effect - visible state - */
  .fading-box.visible {
    opacity: 1;
    visibility: visible;
  }

  </style>
</head>
<body>

  <main>
    <button id="button">Click me</button>
  </main>
  <div id="dialog" class="fading-box">
    Hi!
  </div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<script>
$('#button').on('click', function() {
  $('#dialog').toggleClass('visible');
});
</script>
</body>
</html>
```

# 参考
* [CSS3 のみで display: none からフェードインさせる - Qiita](http://qiita.com/youcune/items/b0bb4c5979071d53eb99)
* [css - Transitions on the display: property - Stack Overflow](http://stackoverflow.com/questions/3331353/transitions-on-the-display-property)
fish shell環境にTensorFlowをインストールするまでの手順(Anaconda4.0.0)


TensorFlowを試そうと思い、まずはインストールをしました。
大体は公式のドキュメントの通りで大丈夫なのですが、fish shellを使っている場合、少しハマった部分があったのでそれをまとめておきます。


## TL;TR

現状 `source activate / deactivate` がfish shellでは使用できません。追加でfish用のスクリプトを使用する必要があります。

`.config/fish/conf.d` に [このスクリプト](https://github.com/conda/conda/blob/master/shell/conda.fish) をリンクさせるか、コピーしておけば `conda activate / deactivate` というコマンドが使用できるようになり、 `source activate / deactivate` のように使用できます。


## Python / Anacondaのインストール

さて、せっかくなのでPython / Anacondaのインストールから含めて手順を書いていきます。

インストールには `pyenv` を使用します。Anacondaもpyenvからすぐにインストールできるので便利ですね。

pyenv自体はbrewで入ります


```fish
brew install pyenv
```

さてAnacondaを入れましょう。Anacondaについては [こちらの記事が](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c) にまとまっているのでそちらを参照してください。


今回はPython3系を使いましょう。Anaconda3.4.0を入れれば大丈夫です。

```fish
pyenv install anaconda3-4.0.0
```

結構時間がかかりますが、関連パッケージも一緒に入ってくるので仕方ないです。気長に待ちましょう。
終わったら、そっちのSystemのPythonから切り替えておきましょう。


```fish
pyenv global anaconda3-4.0.0

python -V
# Python 3.5.1 :: Anaconda 4.0.0 (x86_64) と出ればok
```


## TensorFlowのインストール

簡単です。 Anacondaからインストールしましょう。

```
conda create -n tensorflow python=3.5
```

これだけです。

## source activateが使えない

ここまで終われば `source activate tensorflow` とすればTensorFlow環境がアクティベートされるはず、、なのですがfish shellだとこれが使えません。

なので、TL;TRにも書いた通り、Anaconda公式のリポジトリから `activate.fish` を持ってきて、`.config/fish/conf.d` に配置します。 Anacondaをインストールしたら入っていてほしいものですが、 [次のバージョンのリリースを待たねばならず](https://github.com/conda/conda/issues/2611)、現状はソースを持ってくるのが良さそうです。

これが終われば 

```fish
conda activate tensorflow
```

でTensorFlow環境をアクティベートできます。

ここまでできれば後は簡単です。公式のチュートリアルに従いましょう。
アクティベートした状態で以下のコマンドを入力すればokです。

```fish
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/tensorflow-0.9.0rc0-py3-none-any.whl

sudo pip install --upgrade $TF_BINARY_URL
```


deactivateしたい場合は

```fish
conda deactivate tensorflow
```

でok。


恒例の [MNISTチュートリアル](https://www.tensorflow.org/versions/r0.9/tutorials/mnist/beginners/index.html#mnist-for-ml-beginners) でも試してみましょう！
機械学習・Computer Scienceを勉強する。 リソース一覧

オンライン・オフラインのリソースで勉強に使ってるもの一覧。
多少プログラミングしていて少々の知識があるといいかも。

人工知能・機械学習に必要な教材やTipsを載せていくブログはこちら
[努力1mmブログ](http://takamichiblog.hatenablog.com/)

# Coursera Machine Learning
言わずと知れた機械学習の動画。Andrew Ngさんが丁寧に教えてくれる。日本語字幕あり。

[Coursera : Machine Learning](https://www.coursera.org/learn/machine-learning)

# Coursera Natural Language Processing
Courseraの自然言語処理講座。英語。

[Coursera : Natural Language Processing](https://www.coursera.org/course/nlp)

# 言語処理100本ノック
こちらも言わずと知れたリソースかも。自然言語処理をプログラミングするために必要なプログラミングテクニックとかが学べる。

[自然言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)

# Udacity Design of Computer Programs
これでプログラミング中級者。Python。動画を見ながら問題を解いていく形式。埋め込みエディタ。

[Udacity : Design of Computer Programs](https://www.udacity.com/course/cs212)

# Udacity deep learning
Udacityのディープラーニング。Googleが提供しているTensorflowでディープラーニングを学ぶ。

[Udacity : deep learning](https://www.udacity.com/course/deep-learning--ud730)


# Paiza プログラミングスキルチェック
アルゴリズム問題を解いていく。DランクからCランクくらいまでサーッとやると言語の文法を一通り確かめられる。組み込みメソッドとかね。慣れてきたらAやSに挑戦。

[Paizaスキルチェック](http://paiza.jp)

***
以下オフライン教材(書籍など)
# 集合知プログラミング
検索エンジンやレコメンドシステムなどを実装する。Python。

[オライリー : 集合知プログラミング](https://www.oreilly.co.jp/books/9784873113647/)

#  確率的言語モデル
言語処理の参考書。

[確率的言語モデル](https://www.amazon.co.jp/%E8%A8%80%E8%AA%9E%E3%81%A8%E8%A8%88%E7%AE%97-4-%E7%A2%BA%E7%8E%87%E7%9A%84%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%87%E3%83%AB-%E5%8C%97-%E7%A0%94%E4%BA%8C/dp/4130654047)

# パターン認識と機械学習 (通称PRML)
黄色い本。

[黄色い本](https://www.amazon.co.jp/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E8%AA%8D%E8%AD%98%E3%81%A8%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E4%B8%8A-C-M-%E3%83%93%E3%82%B7%E3%83%A7%E3%83%83%E3%83%97/dp/4621061224)



# pythoで機械学習をしている（しようとしている）ブログ
[努力1mmブログ](http://takamichiblog.hatenablog.com/)
Opusを利用しているソフトウェア／サービス一覧

* Cisco Spark (https://support.ciscospark.com/customer/en/portal/articles/1762125-audio-and-video-specifications-for-the-cisco-spark-app)
* Firefox
* Google Chrome
* Google Hangout (ライセンス表示より)
* Line (ライセンス表示より)
* Microsoft Edge (https://developer.microsoft.com/en-us/microsoft-edge/platform/status/opusaudiocodec/)
* Mumble
* Slack (https://webrtchacks.com/slack-webrtc-slacking/)
* TeamSpeak 3
* TwitCasting (http://about.moi.st/ja/2015/09/03/opus/)
* 各種音楽プレーヤー
* 各種VoIPソフトウェア
* WebRTC
* Facebook Messenger (ライセンス表示より)

コメントに情報をおねがいします。
KotlinでDagger2を使うときにInjectionが失敗する (RuntimeInvisibleParameterAnnotations)

KotlinでDagger2を使ってDIするときにビルドに失敗するケースがあったので、そのメモです。根本的には解決しておらず、例外が出ないようにコードを書き換えて対応しました。Kotlinのバージョンは1.0.2、Dagger2は2.4です。

### ビルドするとこんな例外

```
RuntimeInvisibleParameterAnnotations属性が不正です: ResourceType(String)
    削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。
```

- なぜかDIと関係なさそうなクラスで怒られました。。。

### これが起きる条件

- この場合のResourceTypeはこんなEnumを書いてました

```kotlin:ResourceType.kt
enum class ResourceType(val typeId: Int, val typeName: String) {
    HOGE(0, "hoge"),
    FUGA(1, "fuga");
}
```

- で、このenumをメンバ変数に持っているクラスに注入しようとすると上記の例外が発生しました。再現性もあります。
- JetBrainsの最近のissueにも同様のケース(https://youtrack.jetbrains.com/issue/KT-10629) が上がっていて、kaptを使っている場合に、kaptが生成するファイルで使われるenumのコンストラクタがStringの引数を受け付けてると発生するみたいです。

### とりあえずの解決

- 外から指定するのではなくて、中でプロパティをOverrideするようにしました。

```kotlin:ResourceType.kt
enum class ResourceType(val typeId: Int) {
    HOGE(0) {
        override val typeName = "hoge"
    },
    FUGA(1) {
        override val typeName = "fuga"
    };

    abstract val typeName: String
}
```
deeplearning4jの開発環境 on intellij

- mac osx上
- intellij上

の話

git cloneするもの

- deeplearning4j https://github.com/deeplearning4j/deeplearning4j
- nd4j https://github.com/deeplearning4j/nd4j
- Canova https://github.com/deeplearning4j/Canova
- libnd4j https://github.com/deeplearning4j/libnd4j

libnd4jをbuild

環境変数に設定

```
export LIBND4J_HOME=$HOME/workspace/libnd4j
```
残りもbuild

deeplearning4jは Lombokを使っているので、

intellijにlombok pluginをinstall

```
https://github.com/mplushnikov/lombok-intellij-plugin
```

な感じで

- http://deeplearning4j.org/devguide
- https://gitter.im/deeplearning4j/deeplearning4j
OpsGenieでGETWILDを流す

# こんなときに使います

* あぁ！
* 携帯やオーディオプレイヤーにGET WILDが入ってない！！
* しかも帯域制限かかってデータ通信が行えない。。
* いくらお金がかかってもいい！どうしても聞きたい！

<br>
ありますよね。わかります。
そんなお困りのあなた。OpsGenieを使えば音声通信からGET WILDを聴けます。

# OpsGenieの契約等

* 詳しくはこちらをご覧ください。
* [OpsGenieでMackerelのアラートを電話通知](https://developers.eure.jp/tech/opsgenie_mackerel/)
* Standard契約で多分良いです。

# Incoming Callの設定

* 下記のような設定をすればOpsGenie宛に電話をかければ、いつでもGET WILDが聴けます。
* ただ残念なのが、audioファイルのアップロードが2MBまでなので、shortバージョンくらいしか聴けません。

![アスファルトタイヤを切りつけながら.png](https://qiita-image-store.s3.amazonaws.com/0/29405/5842addd-ecee-6c3a-ca95-81fef9ca8df1.png)
![暗闇走り抜ける.png](https://qiita-image-store.s3.amazonaws.com/0/29405/4de58ea5-cf4d-7bd8-dabd-64be7b38ef90.png)



# 実際に聴いてみましょう

* 携帯電話でIncoming Callに書かれてるPhone Number宛（国際電話）に電話をかけてみましょう。
* 素敵な音楽がスタートします。

# 皆様も是非OpsGenieを導入してみてください

* お金はかなりかかるかもしれません。でもその気持ちや衝動はプライスレスです。
* レッツトライ！
Dell Inspiron 3647 不具合修理

##Dell Inspiron 3647 不具合修理

![2016-06-21 11.06.50.jpg](https://qiita-image-store.s3.amazonaws.com/0/82956/98c69754-560e-43c2-babd-29a3b6691667.jpeg)

####マシンスペック
>Windows 8.1 Pro 64bit
>CPU : Pentinum G3220 3.00GHz
>MEM : 4.0GB
>HDD : WDC WD5000AAKX 500GB

####症状
1. 使用中突然ブルーバックになる。
2. IEでネットサーフィン中によく固まる。

まずは「コンピューターの管理」でいろいろチェック。
![2016-06-21 10.55.19.jpg](https://qiita-image-store.s3.amazonaws.com/0/82956/d8b14526-ab9a-28ed-2005-b7a8f99e3e8a.jpeg)
デバイスマネージャーをみると
>PCIシンプル通信コントローラー
>SMバスコンローラー

が無いみたい・・・。
ハードウェアIDから検索するとチップセットドライバーだった、そりゃ～色々エラーになるわ。
[Dell Inspiron 3647 ドライバページ](http://www.dell.com/support/home/jp/ja/jpdhs1/product-support/product/inspiron-3647-small-desktop/drivers/advanced)で
Intel H81 Chipset Device Driver
Intel Management Engine Interface Driver
をダウンロード＆インストールで解決！

では次のチェックへ・・・。
OpenFOAMおよびFoam-extendに実装されているスマートポインタ（autoPtr, tmp）

OpenFOAM用の自作クラスを作る際は、基本的にOpenFOAMが提供するスマートポインタ（autoPtr, tmp）の使用が推奨されています。

# autoPtr

通常のスマートポインターです。

* [OpenFOAM C++ Documentation : autoPtr class](http://foam.sourceforge.net/docs/cpp/a00084.html)
* [autoPtr.H](http://foam.sourceforge.net/docs/cpp/a08392_source.html)
* [autoPtrI.H](http://foam.sourceforge.net/docs/cpp/a08393_source.html)

[OpenFOAM wiki: Understanding autoPrt](http://www.cfd-online.com/Forums/openfoam-programming-development/104220-understanding-autoptr.html)

# tmp

各種Scheme・Field用のスマートポインタです。

* [OpenFOAM C++ Documentation : tmp class](http://foam.sourceforge.net/docs/cpp/a02607.html)
* [tmp.H](http://foam.sourceforge.net/docs/cpp/a08395_source.html)
* [tmpI.H](http://foam.sourceforge.net/docs/cpp/a08396_source.html)

各種Scheme・Fieldは、メモリリークを防ぐためのrefCount Classを継承して実装されています。tmp Classを使ってScheme・Field用のメモリを動的に確保するポインタを作成すると、そのポインタのデストラクタが呼ばれた際に、ポインタが確保したメモリを開放していいか自動的に判断してくれます。

[OpenFOAM guide / tmp](http://openfoamwiki.net/index.php/OpenFOAM_guide/tmp)
[PENGUINITIS - autoPtrとtmp](http://www.geocities.jp/penguinitis2002/study/OpenFOAM/tankentai/19-autoPtr_and_tmp.html)
postfixでSMTP送信時「Temporary lookup failure」エラーの原因

dockerコンテナからSMTP送信しようと設定を変更していたら「Temporary lookup failure」エラーが出た。

原因: /etc/postfix/main.cf の mynetworks 値が間違えていた。

```diff:/etc/postfix/main.cf
- 172.17.0.1/16
+ 172.17.0.0/16
```

```bash:
sudo service postfix restart
```

解決したことを確認。
クロージャを一言で表すと (読書メモ)

以下、オライリー刊 [開眼！ JavaScript](https://www.oreilly.co.jp/books/9784873116211/) ※ 第7章「スコープとクロージャ」 P.106 からの引用

> 　クロージャを一言で表すと「スコープチェーンに存在する変数への参照を保持している関数」と言えます。クロージャが生成されるとスコープチェーン上の変数への参照は保持されます。親関数スコープで定義されている変数は、たとえ親関数自身が使われなくなったとしても、それらを参照するクロージャが生き残っている限り保持されます。
>　すべての関数はスコープチェーンを持っているため、すべての関数がクロージャであると言えます。

※原著：[JavaScript Enlightenment](http://shop.oreilly.com/product/0636920027713.do) written by [Cody Lindley](http://www.codylindley.com/)
ex.party

# ex.partyとは

* リアルクローズドコミュケーションツール
* 15-22歳までの女性限定コミュニティサイト（女子高生・女子大生に準じる）
* **上記に当てはまらない人は一般参加できない**

***

# 参加方法

* card申し込み申請
* card（小さい名刺）を交換する
* cardにはお互いの認証コード（当初はQRコードを想定）が付いている
* アプリでお互いがid認証しあうとアプリ上で相互フォローになる
* **インターネット経由だけではフォローもできないしフォロワーにもならない。**

***
# cardデザイン案

![namecardsample.png](https://qiita-image-store.s3.amazonaws.com/0/11300/c21b8c27-7a24-bf2a-f2ec-a640b5adb4ea.png)

***

# 制限

* 自分のフォロー上限はカードの発行枚数
* 使い回しはできない
* cardの発行は運営が行う
* フォロー数を見てカードが少なくなったら自動配送

***

# 目指す所

* facebookや当初のmixiのようなクローズドなコミュニティの形成
* pathが掲げたリアルな友人のみのコミュニティを実現させる

* 殆どのコンテンツがクローズドで運用される
（情報の公開範囲は人によって設定されるため）

***

# 何を実現したいか

* バイラルメディアとして情報の伝達が最速のものになる
* 友人しかいないため、リアルな話題をネット上で実現できる
* 企業のサンプリング対象として抽出しやすい群を作る

***

# 特徴

* 企業広告をがっちりマッチした価値で出せる
* フォーカスされている人を見つけやすい
* 流行などをキャッチしやすい

***

# 機能

***

* 日記 / 自分メモ
* つぶやき / いいね（リプライ）
* パブリックタイムライン
* ウェルネス
* カレンダー（時間割）
* コミュニティ
* チェックイン
* アンケート
* ニュース

* **など**

***

# 課金

* 企業側の広告
* 企業側のサンプリングモニター
* ユーザーに協力して貰う形での仕掛けでの全ての広告
* **ユーザー側での課金ポイントはなし**

***

# 獲得UU目標

* 3ヶ月で500人
* 1年で1万人
* 3年で5万人

***

# 収益化

* 3年でプラスマイナスゼロ
* 5年で回収完了完全黒字化

***

# 全然関係ないこと

***

# Qiitaプレゼン

* **インデント付けたい！！！！**
[Laravel5] 本番環境とテスト環境( or ローカル環境)で条件分岐させる方法 [PHP]

Laravel 5.2.31, PHP 5.6.22, CentOS 6.8環境にて動作を確認

まずは.envで各環境を正しく区別させておきます。
.envの場所がわからない場合はroot権限で

```
find / -name .env 
```
で場所を検索してください。

* 本番環境の場合　※APP_DEBUGの値は変更しなくてもOKです

```
APP_ENV=production
APP_DEBUG=false
```

* ステージング環境の場合


```
APP_ENV=staging
APP_DEBUG=false
```

* テスト環境の場合

```
APP_ENV=testing
APP_DEBUG=true
```


* ローカル環境の場合

```
APP_ENV=local
APP_DEBUG=true
```

設定が完了したら、条件分岐させたいPHPファイル内で次のように記述します。

```
if ( app()->isLocal() || app()->runningUnitTests() ) { // .env に APP_ENV=local (ローカル環境) または APP_ENV=testing (テスト環境) と書いてある場合
  // テスト環境, ローカル環境用の記述
}
else { // .env に APP_ENV=production (本番環境) などと書いてあった場合
  // 本番環境用の記述
}
```

以上。

追記

こんな書き方もできるみたいです。検証はしてませんが。
これ App::environment('testing') としてもうまく動かなかったのですが私の設定が何かおかしいのだろうか...

```
if (App::environment('production', 'staging')) {
 // 本番環境とステージング環境用
}

if (App::environment('local')) {
 // ローカル環境用
}
```

### さらに追記

Laravelはじめたての頃に書いたものですが、いまだに結構アクセスがあるので、実際の使用例も載せておきます。

本番環境では、ページが見つからなければ自作の404ページ(resources/views/errors/404.blade.php)を表示、
サーバーエラーはOops Looks Like Something Went Wrongのアレじゃなくて自分で作った500ページ(resources/views/errors/500.blade.php)を表示

テスト環境とローカル環境では、自作の404ページと、サーバーエラーはOopsのアレを表示する

```php:app/Exceptions/Handler.php
    public function render($request, Exception $e)
    {
        if ( app()->isLocal() || app()->runningUnitTests() ) {
            return parent::render($request, $e);
        }
        else {
            if ($this->isHttpException($e)) {
                return $this->renderHttpException($e);
            } else {
                return response()->view("errors.500");
            }
        }
    }
```
インスタンスメソッド内での気をつけたい変数の取り扱い（参照の値渡し）

#何の話？
変数について、参照の値渡し（共有渡し）とか。

まぁ、[Rubyの破壊的メソッドと参照の値渡し](http://qiita.com/metheglin/items/ca452bc0a3866d2de7bf)とほとんど同じです。

#ダメな例
とりあえず以下のコードを見てください

last_name(string)とfirst_name(string)というattributeを持ったUserモデルについて、この2つを結合して返すメソッドを用意しています。

```models/person.rb
class Person < ActiveRecord::Base
  def fullname
    str = last_name
    str << first_name
  end
end
```

```controllers/people_controller.rb
class PeopleController < ApplicationController
  def show
    @person = Person.find( params[:id] )
  end
end  
```

```ruby:views/people/show.html.erb
<%= @person.fullname %>
```

##何が問題か
`@person.fullname`がviewの中で2回呼ばれると期待しない値が返ってくる。

例えば`last_name:山田`、`first_name:太郎`というインスタンスについて、viewから2回呼び出すと`山田太郎太郎`が返ってきます。

##なぜか
インスタンスメソッドの`str = last_name`のところが参照の値渡しになっており同一のオブジェクトを参照しています。（`str.object_id`と`last_name.object_id`は同一の値です）
したがってstrを更新すると、同時に`@person.last_name`を更新しており、二回目に呼ばれた際に`last_name`は一回目の結果となる`str`（山田太郎）を返すからです。
（インスタンスは`people_controller.rb`で呼び出している通り`＠person`一つです。）

```models/person.rb
class Person < ActiveRecord::Base
  def fullname
    puts last_name #一回目は'山田'、二回目は'山田太郎'
    str = last_name
    puts first_name #一回目も二回目も'太郎'
    str << first_name
    puts str #一回目は'山田太郎'、二回目は'山田太郎太郎'
    str #↑にputsを入れたので明示的にreturnしています。
  end
end
```

#改善案
```models/person.rb
class Person < ActiveRecord::Base
  def fullname
    last_name + first_name
  end
end
```

処理がよほど重たい場合などはクラスインスタンス変数を使うなどすると良いですよ。

#参考
- [Rubyの破壊的メソッドと参照の値渡し](http://qiita.com/metheglin/items/ca452bc0a3866d2de7bf)
- [Rubyの文字列連結に関して知っておくべきこと](http://qiita.com/Kta-M/items/c7c2fb0b61b11d3a2c48)