OmniAICreator/Qiita-1.07M huggingface dataset:
analogRead()用のライブラリを作ってみた

[Arduino(?)に繋いだ可変抵抗を本当に回した時だけ値を受けとるには？](http://qiita.com/tadfmac/items/0aa8b07385dc557ff387)にアイディアをいただいて[analogRead()用の関数作ってみた5 もっと関数](http://qiita.com/ttatsf/items/c8f7ec1b2d9fff89cae4)までやってきた、その続きです。

その後、配列が好きなサイズで作れたらいいな...なんて思ったのが運のつき、c++の深みにハマってしまい、どうせならと思ってライブラリにしてみました。ふう。[SmoothFunc for Arduino](https://github.com/ttatsf/SmoothFunc)

#使い方

[ZIPファイルをダウンロード](https://github.com/ttatsf/SmoothFunc/archive/master.zip)して、[スケッチ>ライブラリをインクルード>.ZIP形式のライブラリをインストール... でインストール](https://www.arduino.cc/en/Guide/Libraries)します。

三つの関数オブジェクトがあります。

+ "GetAverage" : 引数と内部の履歴から合計を計算し、引数を履歴に記憶しつつ一番古い値を捨て、平均を返す。
+ "IsNewInRecents" : 引数が履歴に含まれていないかを計算し、引数を履歴に記憶しつつ一番古い値を捨て、計算結果を返す。
+ "IsUniqueInUniques" : 引数が履歴に含まれていないかをを計算し、含まれていない場合のみ引数を履歴に記憶しつつ一番古い値を捨て、計算結果を返す。

この関数を使って、

+ 平均をとり(これだけでもかなり安定する場合があります)
+ 更にそれを直近の平均の履歴の中で新しいかどうかのふるいにかけ、
+ 新しいときだけ必要な処理をする

という戦略です。



```
#include <SmoothFunc.h>	//ライブラリを読み込む

GetAverage getAverage;  //関数オブジェクトをインスタンス化
IsNewInRecents isNew;      

const int ANA_PIN = 5;	//アナログ入力に使用するピン番号を設定

void setup(){
//...
}
void loop(){
  const int RAW_DATA = analogRead(ANA_PIN);			//入力ピンの値を読み込んでRAW_DATAを生成
  const int SMOOTHED_DATA = getAverage(RAW_DATA);	//平均を計算してその値でSMOOTHED_DATAを作成
  if (isNew(SMOOTHED_DATA)) {						//SMOOTHED_DATAが新しければ
    
    //...その場合にしたい処理をここに書きます。  
    
    }
  delay(10);
}
```


```IsUniqueInUniques``` は ```IsNewInRecents``` のバリエーションです。
```IsNewInRecents``` を使っても動作が安定しない場合にお使いください。使い方は同じです。
より小さいサイズの履歴で動作を安定させられる場合があります。
一方で履歴のサイズが大きいと出力データが不連続になる傾向があります。調整してお使いください。

デフォルトの履歴サイズは GetAverage が 8, IsNewInRecents,IsUniqueInUniques が 3 になっています。
単体の場合は
```GetAverage foo(5);```
配列の場合は
```GetAverage bar[3]={10,20,30};```
のようにすれば他の値を指定して作ることができます。
#使用例
今までの、複数のアナログ入力を受け取ってMIDIコントロールチェンジを返すスケッチがどうなるかというと

```c++
#include <MIDIUSB.h>
#include <SmoothFunc.h>

GetAverage getAverage[2];
IsNewInRecents isNewInRecents[2];
const int ANAPIN[2] = {0,1};
const byte CHANNEL = 0;
const byte CC[2] = {25,26};

void setup() {
  Serial.begin(115200);
}

void loop() {
  for (int i = 0; i < 2; i++) {
    const int SMOOTHED_DATA = getAverage[i]( analogRead(ANAPIN[i]) >> 3 );
    if ( isNewInRecents[i](SMOOTHED_DATA) ) {
      controlChange( CHANNEL, CC[i], SMOOTHED_DATA );
      MidiUSB.flush();
    };
  delay(10);
  };
}

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}
```

どうですか? なかなか見た目スッキリでいいんじゃない?と自画自賛。やってることは今までと同じですが...

#まとめ
よろしければお使いください。
おかしな英語のREADME作文ともども、おかしなところがあればコメントおねがいします。
Debianにstackをインストールする

このstackとは、javaのmvnみたいなものだと思います。
Debianのバージョンは7.6です。

[The Haskell Tool Stack](http://haskellstack.org/)
などを参考に、以下を実行してみました。

```
sudo aptitude install stack
```

（略）

できました。

```
➜  stack --version
Version 1.0.4.3, Git revision db1afb275ebd64016e8ef0db122f0f03da9e5906 (3242 commits) x86_64
```

### ちなみに
cabalというものもありますが、stackを使っていきたいと思います。
LINUX | pwd って何の略か知ってる？

Print Working Directory = 「作業ディレクトリを表示する」 の略らしい。

「どこが password なんだろう」とずっと思ってた。

# 参考


- [日本のWebエンジニアの大半が、変化に対応しきれなくなっている件について](http://d.hatena.ne.jp/tomoya/20160410/1460274822)
- [Unixに関するいろいろな略称とその意味](http://wadap.hatenablog.com/entry/2014/01/13/133034)



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
DebianにHaskellをインストールする

Debianのバージョン確認

```
➜  ~ cat /etc/debian_version                  
7.8
```

以下を実行してインストールします。

```
sudo aptitude -y install haskell-platform
```

（略）

できました。

```
➜  ~ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.4.1
```
GCEでSendGrid使う～Spring mail（Java Mail）編～

### はじめに
GCE上でSendGridを使います。Spring Bootでアプリケーションを開発している人ならSpring Mail（Java Mail）がオススメ。事前にSendGridのアカウントを作っておいて下さい。GCEも使えるようにしておいてください。

### 依存ファイル
```pom.xml
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-mail</artifactId>
  <version>1.3.2.RELEASE</version>
</dependency>

<dependency>
  <groupId>com.sun.mail</groupId>
  <artifactId>javax.mail</artifactId>
  <version>1.5.5</version>
</dependency>
```

前提はSpring Bootのアプリケーションを既に作っていることです。なので、Spring Boot系の依存ファイルは省略します。

### メール送信部分
```
@Autowired
private JavaMailSender javaMailSender;

public void setMailSender(JavaMailSender javaMailSender) {
  this.javaMailSender = javaMailSender;
}

public void send() {
  try {
    MimeMessage mail = javaMailSender.createMimeMessage();
    mail.setHeader("Content-Transfer-Encoding", "base64");
    MimeMessageHelper helper = new MimeMessageHelper(mail, false);
    helper.setTo("To");
    helper.setReplyTo("FROM");
    helper.setFrom("FROM");
    helper.setSubject("SUBJECT");
    helper.setText("CONTENT");
    javaMailSender.send(mail);
  } catch (MessagingException e) {
    //Exception
  }
}
```

### SendGridの設定
```application.properties
spring.mail.default-encoding=UTF-8
spring.mail.protocol=smtp
spring.mail.host=smtp.sendgrid.net
spring.mail.port=2525
spring.mail.jndi-name=mail/Session
spring.mail.username=your.sendgrid.username
spring.mail.password=your.sendgrid.password
spring.mail.properties.mail.smtp.auth=true
```

`spring.mail.username`にSendGridのユーザー名を、`spring.mail.password`にSendGridのパスワードをそれぞれ入力します。

### 終わりに
以上でGCEからSendGrid経由でメールの送信ができます。既にSpring Mailを使っていた人は気づいたと思いますが、基本的にはSpring Mail用の設定ファイルを多少変更するだけです。
windowsのbashでapt-get updateできないのをなんとかする

冷静に考えたらapt-getのupdate失敗の解決すればよいだけだった

# apt-get updateに失敗する
なんかErrとかFailedとか出てupdateうまくいかない
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/42777/ead87747-66f2-74f0-d188-f04456debe98.png)

# 解決策
hostsに足すとか

```bash:/etc/hosts
91.189.91.13 archive.ubuntu.com
91.189.92.201 security.ubuntu.com
```

nameserver足すとか

`echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null`

```bash:/etc/resolv.conf
nameserver 8.8.8.8
```

後者でうまくいった

---
[参考1](http://answers.microsoft.com/en-us/windows/forum/windows_10-other_settings/bash-apt-get-fails-to-connect-to-ubuntu-same-when/c5e129a2-b0d5-4005-8123-292134c328c3?auth=1)
[参考2](http://loumo.jp/wp/archive/20150611000058/)
Elixir入門（５）

勉強したことをほぼ写経するだけ

# Guard

```
def what_is(x) when is_number(x) do
  IO.puts "#{x} is a number"
end
def what_is(x) when is_list(x) do
  IO.puts "#{inspect(x)} is a list"
end
def what_is(x) when is_atom(x) do
  IO.puts "#{x} is an atom"
end

iex> what_is(1)
1 is a number
:ok
iex> what_is(:atom)
atom is an atom
:ok
iex> what_is([1,2,3])
[1, 2, 3] is a list
:ok
```

# Guardに使えるOperator

- 比較演算子
    - ==
    - !=
    - ===
    - !==
    - >
    - <
    - >=
    - <=
- 論理演算子
    - or
    - and
    - not
    - `!`, `||`, `&&`は不可
- 算術演算子
    - +
    - -
    - *
    - /
- 結合演算子
    - <>
    - ++
- in (operator)
- is_xxx (type check function)
- その他
    - 計算系のbuilt-in functionsで１６個程度

# Default Parameter

```
def func(p1, p2 \\ 2, p3 \\ 3, p4) do
  IO.inspect [p1, p2, p3, p4]
end

# デフォルト値がない部分からマッチしていく
iex> func
** (UndefinedFunctionError) undefined function func/0
    func()
iex> func("a")
** (UndefinedFunctionError) undefined function func/1
    func("a")
iex> func("a", "b")
["a", 2, 3, "b"]
["a", 2, 3, "b"]
iex> func("a", "b", "c")
["a", "b", 3, "c"]
["a", "b", 3, "c"]
iex> func("a", "b", "c", "d")
["a", "b", "c", "d"]
["a", "b", "c", "d"]
```

このような挙動をするので、↓のような定義はできない

```
def func(p1, p2 \\ 2, p3 \\ 3, p4) do
  IO.inspect [p1, p2, p3, p4]
end
def func(p1, p2) do
  IO.inspect [p1, p2]
end

** (CompileError) def func/2 conflicts with defaults from def func/4
```

デフォルト値を使うと、こんな書き方も

```
# 第二引数が省略されると、デフォルト値を設定し、そのままfunc/2をコール
def func(p1, p2 \\ 123)

def func(p1, p2) when is_list(p1) do
  "You said #{p2} with a list"
end
def func(p1, p2) do
  "You passed in #{p1} and #{p2}"
end

iex> func(99)
"You passed in 99 and 123"
iex> func(99, "cat")
"You passed in 99 and cat"
iex> func([99])
"You said 123 with a list"
iex> func([99], "dog")
"You said dog with a list"
```
Spring bootでSSL（HTTPS）を有効にする～Let's Encrypt編～

[Spring bootでSSL（HTTPS）を有効にする](http://qiita.com/keigohtr/items/001b84838fefcc170ea2)のつづき

### はじめに
Let's Encryptがベータ版から正式版になったので、Spring Bootサーバーの証明書を入れ替えてみた。

### Let's Encryptの実行
Let's Encryptの使い方は公式を見たほうがいいと思いますが、一応一連のコードを書いておきます。前提としては「自分のドメインを持っていて、そのドメインにIPアドレスが割り振られていること」です。ドメインはお名前ドットコムかなんかで購入できます。今回はその辺の話は省略します。実行前に80ポートと443ポートで動いているサービスは停止しておいてください。

```
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help
./letsencrypt-auto certonly --standalone -d example.com
```

`example.com`には自分のドメインやサブドメインを入力してください。メールアドレスを聞かれるので入力し、規約に合意するか聞かれるので規約を読んで判断してください。正常に完了すれば、`/etc/letsencrypt/live/example.com/`以下に各種証明書が格納されます。

証明書は90日間有効なので、都度更新します。更新はまだ試していないのですが、下記コマンドで大丈夫だと思います。

```
if !./letsencrypt-auto renew > /var/log/letsencrypt/renew.log 2>&1 ; then
    echo Automated renewal failed:
    cat /var/log/letsencrypt/renew.log
    exit 1
fi
```

### Spring Boot用にPKCS12に変換する
※他に良いやり方があったら教えて下さい

Let's Encryptで出力されるのはPEMファイルです。少し調べましたがそのままではSpring Bootに使えないようなので、[以前の記事](http://qiita.com/keigohtr/items/001b84838fefcc170ea2)で紹介したように、PEMからPKCS12ファイルを用意します。

```
sudo openssl pkcs12 -export -in /etc/letsencrypt/live/example.com/cert.pem -inkey /etc/letsencrypt/live/example.com/privkey.pem -out keystore.p12 -name tomcat -CAfile /etc/letsencrypt/live/example.com/chain.pem -caname root
```
パスワードを求められるので入力します。このパスワードは[以前の記事](http://qiita.com/keigohtr/items/001b84838fefcc170ea2)の`server.ssl.key-store-password`に使います。


### 終わりに
簡単ですが、以上で完了です。自己証明だとWarningが出ていましたが、出なくなりました。なんか少しセキュアになった気分。

Tomcatでやる場合は簡単に証明書の更新ができるみたいです。今回紹介した私のやり方だと、PKCS12ファイルを作るのにパスワードの入力を手でやらないといけません。つまりcron等で証明書の自動更新ができないです。誰かこのあたり良いやり方を知っている方がいれば教えていただければ幸いです。
vtlでズンドコ

#概要
vtlでズンドコやってみた。
#写真
![vtl.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/c047d06b-9b18-c6f3-5a42-bbef4e68cf89.jpeg)

#実行
http://jsdo.it/ohisama1/4CJx

#言語仕様
行番号無しで、ダイレクト実行。
代入文しかない。
？は、プリント文。?="hello"は、helloを表示。
リスト表示は、0
実行は、＃＝1
変数は、aからz
$は、乱数で0から9の整数を取る。
+　- * /  で加減乗除
数値は、2バイト整数符号無し。
%は、剰余
= < > で論理式　、値は０と1を取る
文は、左から順に評価される。2+5*6は、42となる。
goto文は、＃＝200で行200へ飛ぶ
if文は、#=a<100*20　で　aが100より小さいなら、行20に飛ぶ

#サンプルコード
```
10 #=$<3*60
20 ?="ズン "
30 a=a+1
40 #=a>4*90
50 #=10
60 ?="ドコ "
70 a=0
80 #=10
90 ?="ドコ　キヨシ！"

```
Subversion tip - リビジョン間で変更のあったファイル一覧

Linux のCUIでのネタです。 TortoiseSVN ではありません。
シェル変数 r1 と r2 がリビジョン指定、という事で読んで下さい。

```
$ svn di --summarize -r$1:$2
```

わざわざ記事にするような事でもありませんが、「リビジョン間で変更のあったファイルを一覧表示するオプションは無い」とどこかの記事で見かけた（ような気がした）ので…
PhpStorm内のSQLハイライトを無効にする

## 課題

初期設定ではPHPコード内のSQL文にハイライトがかかり、やや見辛い
![image](https://qiita-image-store.s3.amazonaws.com/0/100496/ad75db0c-12e2-bc32-71ff-4f4684ea460e.png)

### 環境
- MacOS X El Capitan: 10.11.4
- PhpStorm: 2016.1

## 対処

ナビゲーションバーから `Settings/Preferences` -> `Editor` -> `Language Injections` と辿り、
`php: "SQL select/delete/insert/update/create"` のチェックを外す
![image](https://qiita-image-store.s3.amazonaws.com/0/100496/b5a3684e-98e3-de1c-f404-bcb66f0e02dc.png)

スッキリ。通常の文字列として認識されます
![image](https://qiita-image-store.s3.amazonaws.com/0/100496/95211ca1-1509-a554-1b20-03026954b621.png)

> 参考：
> How to disable highlighting for SQL code in phpstorm?
> http://stackoverflow.com/questions/22592354/how-to-disable-highlighting-for-sql-code-in-phpstorm
Resque.inline と例外処理の落とし穴

[Resque](https://github.com/resque/resque/tree/master) にはワーカープロセスを別途立ち上げなくても動作する inline モードがある。

> Also, you could disable jobs queueing by setting 'inline' attribute. For example, if you want to run all jobs in the same process for cucumber, try:

```ruby
Resque.inline = ENV['RAILS_ENV'] == "cucumber"
```

しかし inline モードは例外処理と相性が悪い。ワーカークラスの `.perform` メソッド内で例外を送出すると、呼び出し元まで例外が伝播してしまう。 Rails コントローラーのアクションメソッド内から `enqueue` する場合などに困ったことになる。

```ruby
class MyController < ApplicationController
  def some_action
    if @model.save
      Resque.enqueue MyWorker, @model.id
      render json: {success: 1}
    else
      render json: {success: 0, message: "oops"}
    end
  end
end

class MyWorker
  @queue = :my_worker
  def self.perform(id)
    puts id
    raise RuntimeError, "oops"
  end
end

```

:point_up: のようなコードがあるとすると、

- `Resque.inline == false` の場合、 `{"success":1}`という `application/json` なレスポンスが返る。ジョブは RuntimeError が発生して失敗し、 Failed Jobs に入る。
- `Resque.inline == true` の場合、 RuntimeError がトップレベルまで伝播してしまい、 `application/json` なレスポンスは返らない。

development モードのときに `Resque.inline` を有効にしていたりすると、 production では不要な `begin ... rescue ... end` で `Resque.enqueue` の部分を囲ってやったりする必要が出てくる。

Resque は「例外が発生したら Job を Failed とみなす」というポリシーのようなので、例外の発生を抑制しつつ Failed にするのはちょっと難しそう（やり方は調べてません）つまり、ジョブを enqueue する側に（本来不要な）例外の捕捉処理を仕込むか、ジョブを fail させるのを諦める必要がでてくる。どちらも不自然。

なので、結論として、 `Resque.inline` は避けたほうがよさそう。
GCE(Google Compute Engine)を使ってみたい！〜サーバ調査編〜


GCE(Google Compute Engine)を使って、HPを公開してみたい！けどサーバーの定義すらあまりわからない！GCEの無料使用期間が迫っている！！勉強しよう！！！

#サーバとは
普段使っているPCと、細かな違いを除けばなんら変わらないらしい。Webサーバやメールサーバといったソフトウェアを入れることで、それらの機能を実行することが可能になるそう。


# サーバを借りるなら４種類から
サーバーは下記の４種類の中から選ぶそう

* 共用サーバ
* レンタルサーバ
* VPS(Virtual Private Server)
* パブリッククラウド

## 共用サーバ
Webサーバがインストールされたサーバの一部を借り、複数のユーザが1つのWebサーバを共有して利用する。
はい！でました！Webサーバ！サーバわかんないって言ってるのに！！
### Webサーバ
サイトの表示に必要なデータをブラウザに送り返すやつ。HTML・CSS・Javascript・画像などをブラウザに返して表示してくれるやつ、だそう。

続けます。
価格が安くて、サーバの知識が殆ど無くても使える。が、ソフトウェアを複数のユーザで共有して使うので、他のユーザの悪影響を受けやすい、そうです。
サーバの管理者権限を持てないので、好きなソフトウェアをインストールできないし、データベースの種類や、実行できるプログラミング言語などが限定されてしまう。

代表例はココ
* さくらのレンタルサーバ
* ロリポップ！レンタルサーバ

**簡単だけど自由がない、それが共用サーバ** 

## (レンタル)専用サーバ
物理サーバを完全に１台専有し、CPUやメモリ、ソフトウェアを1人で自由に使える！
が、ハイスペックな分価格帯も高価。自分で構築し、メンテナンスできるスキルが必要。

代表例はココ
* さくらの専用サーバ
* GMOクラウド 専用サーバ

**自由を手に入れるには、スキルとカネがいる！
そんな厳しさを教えてくれる、専用サーバ**

## VPS(Virtual Private Server)
物理サーバにインストールされているOS上に割り当てられた仮想サーバを専有して使える！ホストOSとは別のOS(ゲストOS)がインストールされており、ユーザが管理者権限を持って自由に操作可能。

CPUやメモリは仮想技術でそれぞれに割り当てられますが、ネットワークやディスクI/Oは他のユーザと共用で利用するそう。メンテナンスなどが入った場合にサーバダウンが生じる可能性！

代表例はココ
* さくらのVPS
* カゴヤ・クラウド VPS

**何も降りてこず。VPS**

## パブリッククラウド 
SaaS、PaaS、IaaSという領域があり、それぞれ自由に操作できる部分が異なる！この３つは勉強した気がする！また次回記事で！

VPSの長所に加えて、CPUやメモリ、ディスクI/Oをいつでも拡張・縮小ができるサービスが多くあるらしい。
サービスによっては、サーバへのアクセスが集中し負荷が高くなったときに、サーバのスペックを自動で上げる（オートスケールアップ）、負荷が通常時に戻ったときに自動で下げる（オートスケールダウン）機能があるそう。
サーバスペックと時間での課金となっている場合は、必要な時間だけ使って使用料金を抑えることができる！

代表例はココ
* **GCE**
* AWS
* Microsoft Azure
* さくらのクラウド

**読んでいて　良いとこ多そう　パブリック**


次回はパブリッククラウドについて詳しく書いていきます！(予定)
ローカルとherokuのpostgres間でデータをアップロード、ダウンロードする

heroku postgresは便利ですが、移行の際に初期データの投入をどうしようか悩みますよね。規模が小さければseedでインポートできますが、ある程度のサイズのデータだとそうはいきません。

その辺の方法を悩んでいたときに見つけたコマンドが`heroku pg:push`と`heroku pg:pull`です。このコマンドを使うとローカルのpostgres→heroku postgresへのアップロード、あるいはheroku postgres→ローカルのpostgresへのダウンロードが可能です。

もちろんローカルでpostgresが稼働していることが条件となりますが、安全にheroku postgresにデータを投入できるため活用の幅は広そうです。

ソースはこちら

[Heroku Postgres(英語)](https://devcenter.heroku.com/articles/heroku-postgresql#pg-psql)

## heroku pg:pull

    heroku pg:pull HEROKU_POSTGRESQL_MAGENTA mylocaldb --app sushi

`HEROKU_POSTGRESQL_MAGENTA`はherokuのデータベースURLが入ります。`DATABASE_URL`と置き換えれば使えるはずです。`mylocaldb`はローカルのデータベース名です。データの上書きを防ぐため、存在しないデータベース名を指定する必要があります。既存のDBは`dropdb mylocaldb`とでもすれば削除できます。

データベースにユーザー名、パスワードを指定する場合は以下のオプションを使います。省略するとパスワード無しのデータベースができあがります。

```
PGUSER=postgres PGPASSWORD=password heroku pg:pull HEROKU_POSTGRESQL_MAGENTA mylocaldb --app sushi
```

## heroku pg:push

アップロードの際はこちらです。こちらもデータの上書きを防ぐために存在しないデータベース名を指定する必要があります。

```
heroku pg:push mylocaldb HEROKU_POSTGRESQL_MAGENTA --app sushi
```

DBをダンプしてS3にアップロード、postgresへインポートするといった方法もありますが、この方法なら手元のデータを直接投入できるので便利ですね。
謎の演算子==!について

## はじめに

`PHP`のコードを読んでいて謎の比較演算子`==!`を発見したので調べてみた。
普通否定の比較をする際は`!=` or `!==`

* そもそもこんな演算子はない
* だがエラーにならない謎

## 調査1（整数比較）

いくつかパターンを出して調べてみた。
サンプルコードは以下

```php:not_equal1.php
<?php
if(1 === 1){
    echo("1 === 1はtrueです\n");
} else {
    echo("1 === 1はfalseです\n");
}

if(1 !== 1){
    echo("1 !== 1はtrueです\n");
} else {
    echo("1 !== 1はfalseです\n");
}

// 問題の比較演算子
if(1 ==! 1){
    echo("1 ==! 1はtrueです\n");
} else {
    echo("1 ==! 1はfalseです\n");
}
```

結果

```
1 === 1はtrueです
1 !== 1はfalseです
1 ==! 1はfalseです
```

エラーにならないし否定演算子と同じ結果になっている・・・おかしい・・・

## 調査2（bool値比較）

ふと気になってbool値で比較してみた。

```php:not_equal2.php
<?php
if(true ==! false){
    echo("true ==! falseはtrueです\n");
} else {
    echo("true ==! falseはfalseです\n");
}

// 試しにイコールの数を増やしてみる
if(true ===! false){
    echo("true ===! falseはtrueです\n");
} else {
    echo("true ===! falseはfalseです\n");
}

// これはエラーになる
//if(true ====! false){
//    echo("true ===! falseはtrueです\n");
//} else {
//    echo("true ===! falseはfalseです\n");
//}
```

結果

```
true ==! falseはtrueです
true ===! falseはtrueです
```

謎の演算子`===!`が成立した。
しかし`====!`は成立しなかった。

## 結論

つまりこういうことだと認識した。

```php:not_equal3.php
<?php
// つまりこういうこと
if(true == !false){
    echo("true === !falseはtrueです\n");
} else {
    echo("true === !falseはfalseです\n");
}

if(true === !false){
    echo("true === !falseはtrueです\n");
} else {
    echo("true === !falseはfalseです\n");
}
```

結果

```
true === !falseはtrueです
true === !falseはtrueです
```

`==!`は`==`の比較演算をして、後ろの要素を`!`で否定させているという意味。
`===!`は`===`の比較で、後ろを`!`で否定している。
だから`====!`はエラーになった（`====`という演算子はないため）

なるほどすっきり:smile:
Chainerでシンプルな熊本弁翻訳

## 背景

ある日，私は機械翻訳に興味を持った．
（英語に苦しむ日本の研究者の声を聞いたからかもしれないし，勉強会の準備に追われていたからかもしれない．）
しかし私は門外漢なので，encoder-decoderモデルの "あの" 図を読むことができなかった．
先日気持ちを掴むことができたので，自分なりに噛み砕いたものを記録・共有するためにこの記事を書いた．

先人の詳細な記事
http://qiita.com/odashi_t/items/a1be7c4964fbea6a116e

## RNNの図を翻訳

翻訳までの流れを別視点から描いた．
encoder-decoderモデルによって「彼 は 走る」を「He runs」と翻訳するまでの流れは，以下のようになっている．

<img width="818" alt="SS 25.png" src="https://qiita-image-store.s3.amazonaws.com/0/87943/65062105-7f2d-afdb-fd36-e1bc5535f02e.png">
<img width="814" alt="SS 26.png" src="https://qiita-image-store.s3.amazonaws.com/0/87943/c9832471-5823-18ba-4672-d2a8d349cf9d.png">

encode側の図において，日本語の登場順序がodashi_tさんの図とは逆になっている．
逆順に入力すると実験的に良い結果が得られているらしいので，実験を行う際はodashi_tさんの例に従うと良さそうだ．

理解できたような気がしたところで，Chainerを用いて実装した．
- TensorFlowのサンプルプログラムには，機械翻訳が含まれているらしい.
- ChainerにもシンプルなSeq2Seqのサンプルがあると良い？

## 実装

https://github.com/g329/seq2seq/blob/master/seq2seq.py
なるべくencoder-decoderの気持ちが伝わるように書いたつもりだ．
先人の記事を読みながらソースコードを眺めて欲しい．

```
python seq2seq.py
```

と実行し，しばらくすると以下のような出力が得られるはずである．

```
teacher :  黄昏に天使の声響く時，聖なる泉の前にて待つ
->  5時に 噴水の前で 待ってます 
```

熊本弁から日本語への翻訳の他，英語から日本語など様々応用が効く．
学習の様子を観察していると，あっという間に時間が過ぎてしまうので注意して欲しい．
データが沢山あれば "A Neural Conversational Model"に載っているようなこともできるらしい．夢が広がる．

## その他
Seq2Seqは，少しアレンジするだけで様々な面白い動きを見せてくれる．
そのあたりに関しては，LTの準備が終わったあたりにまた書くつもりだ．
Vagrantのmysqlにホストマシンからつなぐ

## Vagrantでポートフォワードの設定する。

```Vagrantfile
Vagrant.configure("2") do |config|

    config.vm.box = "scotch/box"
    config.vm.network :forwarded_port, guest: 3306, host: 3306
    config.vm.network :private_network, ip: "192.168.33.10" #自分の設定したIP

	# 省略
end
```

## vagrant reloadする

する。

## CentOS7のひとはfirewallをオープンする

```
sudo firewall-cmd --add-port=3306/tcp --zone=public --permanent
sudo firewall-cmd --reload
```

## mysqlの設定変更する

```
netstat -alnt
```
ってすると、mysqlのポート3306は、127.0.0.1からしか接続受け付けなくなってるので、mysqlの設定を変更する。

```
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:3306            0.0.0.0:*               LISTEN     
```

## /etc/mysql/my.cnfの設定を修正する
このファイル ``/etc/mysql/my.cnf`` の ``bind-address = 127.0.0.1`` を ``bind-address = 0.0.0.0`` に変更する。

変更した後mysqlを再起動とか``sudo /etc/init.d/mysql restart``する

## mysqlのリモート接続用ユーザーも作る。

ユーザーのIPは``192.168.33.1``ってなってるけど、``192.168.33``までは自分の環境に合わせて読み替えてください。パスワードも。

```
mysql> use mysql
mysql> GRANT ALL ON *.* to root@'192.168.33.1' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;
mysql> exit
```

ローカルにあるER図とか書くツールからつなげた。SSLトンネルやりかたわかんないからこんな風なことしてる。
AWS S3で403エラーが出た時

# S3にファイルをアップしてもアクセスができない

最近[ブログ](http://blog.shota-kameyama.com)を開設した。頻繁にブログを更新するわけではないので、Wordpress + Really Static + S3で静的ファイルをS3に渡して、セキュアなブログ環境を目指した。

##始めは何も問題がなかったが・・・

何故だか２投稿目から一部のファイルに403でアクセスできなくなった。[こちらの方法](http://stackoverflow.com/questions/26691286/amazon-s3-bucket-returning-403-forbidden)を試してみても変わらない・・・さてどうしたものか・・・

##Chromeの手動でフォルダ毎アップをすると問題が発生する？

クローム（Version 49.0.2623.112 (64-bit)　を使って、S3のコンソール上で手動でアップしていた。（自動化するのも手間なので、今は手動でアップしている）クロームブラウザ上ではアップロードが完了しているし、何も問題がなさそうに見える。しかし、ブラウザで対象のブログを開いてみると403になる。。。むむむ。

##ブラウザを変えてみた

Safariにブラウザを変えて問題の箇所にアクセスしてみると、アクセス権の問題が発生しアクセスができないというエラーが出る。（もちろん自分のアカウントはフルアクセスがある）そこで、対象のフォルダを削除し、**Safariでフォルダを手動で作成してから、対象ファイルをあげてみた。今回はすんなりいった。**

##Chrome対応がまだちゃんとなされていない？？

以上の点を踏まえて、もし403が出るときはsafariで作成しようと心に決めました。
それともやっぱり自動化しようかしら・・・・

もし、手動でエラーが出たらブラウザを変えて試してみましょう。
Wineプロジェクト派生の比較

# 以下の4つのプロジェクトを比較、使ってみた感想を書きます
- Wine
- EasyWine
- WineBottler
- Wineskin

//あとPlayOnMacとかCrossoverとかありますが使ったことないです。

## 簡易比較表
| 名前 | オススメ度 | 特徴 |
|:-----|:-------------|:-----|
| Wine | △ | 本家。だが基本的にコマンドで操作するため初心者には不向き |
| Wineskin | ☆ | 僕が今使っているもの。Wineのバージョン管理が優秀 |
| WineBottler | ◎ | ひとつ前に使っていたもの。十分優秀 |
| EasyWine | ○ | .exeをFinderから直接開けないなど少し残念な部分が多い |

## ①Wine
![スクリーンショット 2016-04-14 19.46.09.png](https://qiita-image-store.s3.amazonaws.com/0/107093/19a51056-9511-75e1-fe32-ec1e6ca611fc.png)

https://www.winehq.org/

- LinuxやMacOS、BSDなどで動作するオープンソースの互換レイヤ。
- ***"Wine Is Not an Emulator"***　と公式サイトに記載されているように、単にWindowsをエミュレートするものではありません。
- 詳しい技術的なことは省きますが仮想環境のように多くのメモリを消費することはなく、自分が使っているOSのネイティブアプリであるかのようにWindowsアプリケーションを動作させます。

- ただし、再現性はアプリや環境によってまちまちで、ちゃんと動作するかはWineのバージョンにも左右されたりします。

- 本家は基本的にCUIのためコマンド操作が主となります。よって、**初心者には難易度が高い**です。
- そもそも導入もコマンド主体です。初めての人は途中でわけがわからなくなります。
- また、Windowsアプリを起動できるということは**Windows向けのウイルスをMacやLinuxで動作させてしまう可能性がある**ということです。このあたりは自己責任ですね。


以下の3つのアプリはWineプロジェクトをベースにし、それぞれ独自のGUIなどからWindowsアプリを簡単に動作させる派生プロジェクトです。

## ②Wineskin
![スクリーンショット 2016-04-15 17.47.55.png](https://qiita-image-store.s3.amazonaws.com/0/107093/e04bb244-7faa-3aa0-1be3-0ca26f3426e8.png)


http://wineskin.urgesoftware.com/tiki-index.php

- Windowsアプリと必要なdll(DirectXなど)をバンドルしたMacOS用のアプリ(.appファイル)を作成します。完成したアプリは**普通のMacOS用アプリのようにクリックだけで起動できる**ようになります。
- Wineのバージョンを簡単に管理・変更できるので**細かい設定が可能**です。
  - 他の派生系では不可能(もしくは僕が気づいていないだけ)なフルスクリーン時の挙動なども簡単に設定可能です。
- ただし、Windowsアプリ1つ1つで設定を変えて.appを作成するのは少し手間です。
- 逆に言えば、設定しないWindowsアプリは動作しないから**ウイルスが動作する可能性は低い**……はずです。

## ③WineBottler
![スクリーンショット 2016-04-15 17.48.58.png](https://qiita-image-store.s3.amazonaws.com/0/107093/3ae3baab-591f-02e1-7e64-ae897e4808bd.png)

http://winebottler.kronenberg.org/
- Wineskinと同じように.appを作成できます。
- が、このアプリのポイントは.appを作成するためのWineBottlerではなくWine.appというメニューバーに常駐するアプリです。
  - このWine.appをがインストールされていれば、**Finder上の.exeファイルをダブルクリックするだけ**でWindowsアプリを起動できます。
  - また、どのアプリを起動してもすべてに同じ設定が適応されますので場合によってはWineskinよりも使い勝手はいいです。

- ただし、本家Wineの更新頻度と比較するとWine.appの更新はちょっと遅いです。
- また、別バージョンのWineを利用しようとするとそのバージョンのWine.appをインストールせねばならず、いくつもWine.appができてしまいます。

## ④EasyWine

http://mattintosh.hatenablog.com/entry/20140706/1404653173

- まともに日本語対応している唯一と言っていいほどのアプリです。
- インターフェイスがイマイチなのと独自ファイラから.exeファイルを起動、もしくは.exeファイルをEasyWine.appにドラッグアンドドロップしかできないなど操作性に難があります。
JSONSchemaからstructのようなコードを生成する"structr"というのを書いた

## TL;DR

- https://github.com/dameleon/structr
- JSONSchema draft v4のspecに沿ったJSONSchemaを入力すると、設定ファイルに記したtemplateを使ってJSONSchemaの構造を出力する
- 書いた、とは言ったもののまだテストもドキュメントも書き途中

## motivation

最近、どんどん型になっていってる中で通信部分で受けたデータをstructにマップするような実装を毎回手書きで書くのはしんどくなってきておりガッとgolangで実装してみた。
golangにしたのは、いずれはWindows環境やweb上(gopher.js)でも動けばいいなーとか。(まだ何も試してない)

templateはわりと柔軟に記述できるので、JSONSchemaを書く手間はあるもののわりとどんな言語でも出力できる。ただ、文字コードとか改行コードに関しては現在ノータッチ。

## 使い方

大体は[README.md](https://github.com/dameleon/structr/blob/master/README.md)に書いたとおりだが、

#### yamlで設定ファイルを記述する

```yaml
# JSONSchemaの型を変換するための定義を `"JSONSchemaの型": "変換する型"` のように指定
# 渡されるデータの構造は `struct{ .Type string, .InnerType string }`
type_translate_map:
  string: "String"
  integer: "Int"
  number: "Float"
  boolean: "Bool"
  null: "nil"
  array: "[{{.InnerType}}]"
  object: "{{.InnerType}}"

# ファイルとして出力する場合のファイル名にするテンプレートを指定
# 渡されるデータは `StructureNode`
output_filename: "{{.Name}}.swift"

# 入力するJSONSchemaに"$ref"(draft v4にある他のSchemaを参照する指定)があった場合、その参照先のSchemaを出力するか
output_dependencies: true

# 出力するstruct(のようなファイル)のテンプレートをgolangの`text/template`で使える記法で記述
# 渡されるデータは `StructureNode`
structure_template: |
  struct {{.Name|toUpperCamelCase}} {
  {{range .Properties}}
      var {{.Name}}: {{.Type|translateTypeName|toUpperCamelCase}}?{{end}}

  {{.Children|extractStructures}}
  }

# `StructureNode`の`.Children`を展開したときに、ネストする為の文字列を指定
child_structures_nesting: "    "
```

上記の設定ファイルは、以下のコマンドによってテンプレートが得られる

```
$ structr template 
```

#### コマンドを実行

```
# Stdoutに出力
$ structr generate -c ${設定ファイル} ${入力するファイルパス}

# 特定のディレクトリに出力
$ structr generate -c ${設定ファイル} --ourDir ${出力先のパス} ${入力するファイルパス}
```

のように指定する。
入力するファイルパスは内部で`Glob`しているので、`your/schema/*.json`のように指定できる(はず)

大体以下のような感じでstructっぽいものを出力してくれる。

```
struct YourStruct {

    var hoo: String?   
    var bar: String?  
    var child: ChildStruct?
    var dependency: YourDependencyStruct?

    struct ChildStruct {

        var baz: String?

    }

}

struct YourDependencyStruct {

    var hoge: String?
    var fuga: String?
    var piyo: String?

}
```


## 今後の予定

- テストを書く
- 詳細なドキュメントを書く
- Windowsでも動くように
- 文字コード, 改行コードの処理
- http(s)経由でJSONSchemaを取得して出力する
- 処理速度に対してまったく気を遣ってないのでその辺の対応
- "$ref"で指定されたJSONSchemaの取り回すらへんをもうちょっと綺麗にしたい
- 普通のjsonからでも出力できるようにする

などを予定してます。

---

初めてgolangをガッツリ書いたので結構時間がかかった。
変な記述とかそれなりにあると思うので、レビュー, 要望などお待ちしております。
CentOS6にseleniumとfirefoxのインストール

# CentOS6にseleniumとfirefoxのインストール

## 環境
- CentOS 6.7


## インストールするもの
- java-1.7.0-openjdk
- xorg-x11-server-Xvfb
- selenium-server-standalone-2.53.0.jar
- linux-x86_64/en-US/firefox-45.0.2


## javaのインストール

seleniumの起動にjavaが必要なのでインストールします。

```
$ sudo yum install java-1.7.0-openjdk
```

## XvfbとSelenium Serverのインストール
[参考] http://kohkimakimoto.hatenablog.com/entry/2013/08/17/095016


Xvfbとは、仮想フレームバッファです。FireFoxをGUI環境がないサーバーでも起動させるためのものです。 

```
$ sudo yum install xorg-x11-server-Xvfb
```

## FireFoxのインストール
[参考] http://tecadmin.net/install-firefox-on-linux/

yumでインストールすることもできますが、最新版をインストールしたいので、ソースから入れます。

```
$ wget http://ftp.mozilla.org/pub/firefox/releases/45.0.2/linux-x86_64/en-US/firefox-45.0.2.tar.bz2
$ tar xvjf firefox-45.0.tar.bz2
```


## seleniumのインストール
[selenium-standalone ダウンロード元](http://www.seleniumhq.org/download/)

standalone版をインストールします。

```
$ wget http://selenium-release.storage.googleapis.com/2.53/selenium-server-standalone-2.53.0.jar
```


## 起動

- 仮想のGUI環境を起動

```
$ /usr/bin/Xvfb :99 -screen 0 1024x768x8
```

- firefoxを起動<br>
optionの`display`に、Xvfbで指定した番号を設定します。

```
$ {firefoxをインストールしたディレクトリ}/firefox/firefox --display=:99
```

- seleniumの起動<br>
`Dwebdriver.firefox.bin`のオプションで、インストールしたFireFoxの起動ファイルを指定します。`firefox`、`firefox-bin`のどちらでも起動します。

```
$ java -jar selenium-server-standalone-2.53.0.jar -port 4444 -Dwebdriver.firefox.bin={firefoxをインストールしたディレクトリ}/firefox/firefox
```


ちなみに、`firefox`と`firefox-bin`の違いは下記にこう書いてあります。
http://forums.mozillazine.org/viewtopic.php?f=38&t=1076955

```
In the Firefox installation folder, there is "firefox" (and likely run-mozilla.sh) 
which is the launch script(s), and "firefox-bin" which is the binary program. If 
you look at the process hierarchy, you'll probably see something like this:
```

なるほど。


ちなみに、Codeceptionでテストを実行すると、下記のエラーが出てよくわからんので調査中。

```
$ php vendor/bin/codecept run acceptance --steps --verbose

Codeception PHP Testing Framework v2.1.7
Powered by PHPUnit 5.3.2 by Sebastian Bergmann and contributors.


  [Facebook\WebDriver\Exception\UnknownServerException]
  Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output:
  Error: no display specified

```



以上


[関連記事]
[Codeceptionというテストフレームワークを使ってPHPのテストをする](http://qiita.com/Esfahan/items/44c38b15c36e1adb05ff)
[UWP]MediaElementでニコニコ動画の動画再生




## 前提知識
ニコニコ動画には動画に関して正式なWebAPIが存在しないようです。（2016年4月現在）

ではどうやって動画を扱うというと、ユーザーがブラウザでアクセスするような流れをプログラム上で再現する形で動画情報の取得から再生までを行います。（ニコニコ動画の非公式APIを使っている状況、と言えます。）

ブラウザでアクセスする形を再現するにあたって、ユーザー認証及びセッション管理はHttpClientのクッキーを通して管理します。

また、ここではSystem.Net.HttpClientではなく、Windows.Web.HttpClientを利用します。Windows.Web.HttpClientはクッキー管理をインスタンス上で共有してくれるため、クッキーに関する知識をある程度ショートカットして扱えます。

（なお、コメント表示についてはここでは扱っていません。ここでは動画再生にのみフォーカスしています。）

UWPでの動画の再生にはMediaElementを利用します。

ニコニコ動画の動画ファイルURLをMediaElementに渡すことでを再生しますが、再生にはログイン済み、かつ再生したい動画ページにアクセスした後のクッキー情報を保持しているHttpClientが必要になります。


## 使用するライブラリなど

動画ストリームをMediaElementで扱える形(IRandomAccessStream)へラッピングする
https://github.com/kiewic/MediaElementWithHttpClient

C#のニコニコ動画の非公式APIへのサポートしてくれる
https://github.com/mntone/OpenNiconico2

OpenNiconico2の通信周りの実装をWindows.Web.HttpClientに書き換えたもの
（OpenNiconico2.UWPプロジェクトをビルドしてbin/Release内のdll等を使用します。）
（ついでにWatchAPI（仮）にも仮対応しています。）
https://github.com/tor4kichi/OpenNiconico2





## 動画再生までの概要設計

1. ログインフォームUIの実装とNiconico2を使ったログイン処理

2. ランキングや検索機能のUIを実装して、動画選択を行えるようにする

3. NiconicoContext.WatchAPI.GetWatchApiAsyncを利用して動画詳細を取得
（GetFlvAsyncを使う場合には、取得したい動画ページに予めアクセスしていなければならないようです。一方GetWatchApiAsyncでは、動画ページにアクセスした上でのその動画ページ内のデータを解析して、GetFlvAsyncと同じ情報＋αを取得しています。）
（GetFlvAsyncはそのまま使うだけでは公式動画などの情報取得に失敗してしまうようです。GetWatchApiAsyncであれば問題なかったため、こちらのほうが実装が楽＆確実かもしれません。）

4. WatchApiResponse.VideoUrlから動画ファイルへのURLを取得します。
（補足：動画ページURLとは別に動画ファイルのURLが必要です）

5. 動画URLとNiconicoContext.HttpClientを元にしてHttpRandomAccessStreamを作成します。(M/VM)

6. MediaElement.SetSourceにHttpRandomAccessStreamを渡します。(VM/V)
（MediaElement.SetSourceへの渡し方は添付ビヘイビアを使うとシンプルに扱えそうです）

## 動画再生までの実装

UWPアプリのコードを公開しているのでそちらを参考にしてください。
https://github.com/tor4kichi/Hohoema

* ログイン処理　→　Models/HohoemaApp.cs 及び SettingsPage.cs内のAccountSettingsPageContentViewModel.cs
* ランキングや検索　→　ViewModels/RankingPageViewModel.cs 及び Views/RankingPage.xaml(.cs)
* 動画再生　→　ViewModels/PlayerPageViewModel.cs 及び Views/PlayerPage.xaml(.cs)
* MediaElementへのStream設定　→ Views/MediaElementExtention.cs




## 参考にしたサイト

ニコニコ動画の動画URLを取得するところからMediaElementのSetSourceして再生するまで
http://garicchi.com/?p=18860

ニコニコ動画の非公式APIのまとめ
（WatchAPI（仮）という単語はこちらのサイトからお借りしています）
https://mrtska.net/NicoNicoAPIDictionary/

ユーザー認証付き動画ストリーム再生の方法について（英語）
http://stackoverflow.com/questions/18594659/how-to-play-a-video-stream-that-requires-authentication

## 実際に作ってるアプリ
https://github.com/tor4kichi/Hohoema


## 蛇足
UWPでもニコニコスマホSDKのようにOAuthとWebAPIで動画情報扱えるようになったらいいですね。と思う程度にニコ動の仕様を理解するのに時間が掛かりました…。

## 追記
MediaElementへのStream設定方法を添付ビヘイビアで行うように説明を変更しました。合わせてコードも更新しました。

## 追記その２
Windows10 Anniversary Update以降では、MediaPlayer 及び MediaPlayerElementを利用することでメディアトランスポートやバックグラウンド再生を簡単にサポートできるようになっています。

MediaElementは後方互換性が必要な場合のみ利用を検討し、新規アプリを作る場合にはMediaPlayer/MediaPlayerElementの利用をオススメします。
HubotをES6で書いてHeroku上で動かした時のメモ

# 準備
* Hubotの作成（[公式ドキュメント](https://hubot.github.com/docs/)）
* Slackとの連携 ([Github:hubot-slack](https://github.com/slackhq/hubot-slack))

上記の手順が済んでいてSlack上にhubotがいる状態を想定しています。

# babelのインストール

npmでインストールします。

```bash
$ npm install --save babel babel-cli babel-preset-es2015
```

成功すれば、package.jsonが変更されます。

```diff
   "dependencies": {
+    "babel": "^6.5.2",
+    "babel-cli": "^6.7.5",
+    "babel-preset-es2015": "^6.6.0",
     "hubot": "^2.18.0",
     "hubot-diagnostics": "0.0.1",
     "hubot-google-images": "^0.2.6",
```

# ES6でスクリプトを書く
* 例 (src/sample.js)   

```js
module.exports = ( robot => {
  robot.hear(/ぬるぽ/, msg => {
    msg.send("ガッ")
  })
})
```

* 以下のコマンドでコンパイルします。

```bash
$ node_modules/.bin/babel src --presets es2015 --out-dir compiled
src/sample.js -> compiled/sample.js
```

* コンパイル後のディレクトリを指定してHubotを起動します。

```bash
$ bin/hubot --require compiled
hubot> ぬるぽ
hubot> ガッ
```

# Heroku用設定
Herokuにデプロイした際に、babelによりES6がコンパイルされるように設定します。

## package.jsonの修正

package.jsonを修正し、Heroku上で依存パッケージのインストールが完了した後に、babelのコンパイルが実行されるようにします。

```diff
   },
   "engines": {
     "node": "0.10.x"
+  },
+  "scripts": {
+    "postinstall": "node_modules/.bin/babel src --presets es2015 --out-dir compiled"
   }
 }
```

## Procfileの修正

Procfileを修正し、Heroku上でコンパイル済みのjsを読み込むように修正します。

```
 web: bin/hubot -a slack -n myhubot --require compiled
```

# Herokuにデプロイ
 
```bash
$ git add .
$ git commit
$ git push heroku master
```
phalcon が php7 に対応したっぽいので試してみた

https://blog.phalconphp.com/post/phalcon-2-1-0-RC1-released
完全にこの通りにインストールする。

```
git clone http://github.com/phalcon/cphalcon
cd cphalcon
git checkout 2.1.x
zephir build --backend=ZendEngine3

```

　んだけど、zephir が必要。なので、 2.1.x をチェックアウトして、プロジェクトルートで

```
composer require phalcon/zephir
```

したら
![スクリーンショット 2016-04-14 18.25.28.png](https://qiita-image-store.s3.amazonaws.com/0/6496/b3b62ad1-2e0c-df92-fc73-d3f05648f431.png)
!!!This package requires php ~5.4 but your PHP version (7.0.2) does not satisfy that requirement.!!!

composer.json を修正しましょう。

```
"require": {
        "php": "7.0.*"
    },
```
こんどこそ問題なく実行できました。とりあえず ./vendor/bin/zephir をぶったたいてやります。すると。。。

```
error: re2c is not installed
```
なんだよまだなんか必要なのかよ。 [re2c](http://re2c.org/) が必要のようです。まっくんはこんな感じでいれるらしい http://macappstore.org/re2c/

ここで超困りました。re2cはすでにインストールされてます。が、re2c is not installedっていわれまくりです。とりあえず「zephir re2c is not installed」　でぐぐって一番上の[この記事](http://qiita.com/irihit/items/dfebfa641a41f25938d0)を参考にさせていただきました。インストーラーのバグらしい。

これで準備は整いました。なにをしてたのかわからなくなってしまいましたが、phalcon をインストールしようとしてたんです。

```
./vendor/bin/zephir build --backend=ZendEngine3
```

これでいけるぞ！と思いきやそんな簡単じゃありませんでした。まんまと[この通り](https://forum.phalconphp.com/discussion/11081/zep-syntax-errors-which-version-of-zephir-was-used-and-can-build)になりました。

zephir 0.9.2 以上じゃないとだめっぽいです。最初に書いとけよそんなのもう。なんなの？　

```
git clone https://github.com/phalcon/zephir
cd zephir
./install -c
```
こんどこそ、phalcon をインストールできるはずです。cphalcon 直下で、

```
zephir build --backend=ZendEngine3
```
![スクリーンショット 2016-04-14 19.15.22.png](https://qiita-image-store.s3.amazonaws.com/0/6496/4ea53bac-ee69-9cf6-69fd-9d211b34500a.png)

ぬあああああああああああああああああああああああ




![スクリーンショット 2016-04-14 19.19.53.png](https://qiita-image-store.s3.amazonaws.com/0/6496/470c5e63-164e-3833-efe2-87796e2d774c.png)
じゃーん
とりあえずインストールできました。これから軽くいじってみようっと。
【JavaScript】1つのFormで送信先URLを複数設定する方法

#【目的】
・クリックするボタンによって遷移する画面を変えたい

#【実装方法】
##①\<head>の中に以下のscriptを記載
```form.jsp
<head>
<script type="text/javascript">
	function goServletB(){
		document.getElementById('form').action="ServletBのパス";
	}
	
	function goServletC(){
		document.getElementById('form').action="ServletCのパス";
	}
</script>
</head>
```

##②\<body>の中に以下のhtmlを記載
```form.jsp
<body>
<form id='form' name='form' action="servletAのパス">
    <input type="submit" value="A" >
    <input type="submit" value="B" onclick="goServletB();" >
    <input type="submit" value="C" onclick="goServletC();>
</form>
</body>
```
モダンなエンジニアになるために：working with Panamax

よりトライ＆エラーが出来るWordPress環境をAWS上に作れないのかな？と試行錯誤中。いまのところデジタルキューブが提供している有償のAMI「AMIMOTO」が手っ取り早く素敵なのですが、他にも方法はないかな？と。
気になっていたDockerにチャレンジしようか？と思いましたが、Dockerを調べる時間をスキップしたいのと、短時間でより素早くを目指しているので、なんとかできないかと....
いろんな記事を読んで、たどり着いたのがCenturyLinkのPanamax<<http://panamax.io/>>です。

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/119358/8cad7cac-52fb-a855-68f9-c0a21de5ff44.png)
Panamaxの公式サイト。トップページのアニメーションを使った開設が、とっても分かりやすくて可愛らしいです。
*****
ざっくり手順を紹介すると：
1. 
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/119358/cfe60c94-0aba-2067-e37b-7143cee9a5ee.png)
CoreOSのRunning CoreOS on EC2<<https://coreos.com/os/docs/latest/booting-on-ec2.html>>でAMIを選択。（CloudFormationをクリックするとEC2のインスタンスが複数つくられるようで...）
2. 
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/119358/5e6fe1ec-9d36-8bc1-1e76-d60b60510fe8.png)

「t2.medium」でインスタンスを作成。その際、 SecurityGroupの設定でPanamaxの管理画面にアクセスできるように3000番ポートを開けておく。
3. CoreOSのインストールが完了したら、ログインして、Panamaxのインストール。

インストール方法：
`$ mkdir ~/.panamax
$ cd ~/.panamax
$ curl -O http://download.panamax.io/installer/panamax-latest.tar.gz
$ mkdir -p ~/.panamax && tar -C ~/.panamax -zxvf panamax-latest.tar.gz
$ sudo ./coreos install
`
4. 数分でインストールできるので、その後Panamaxへブラウザからアクセス。
5. 
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/119358/bad949c9-889d-7942-1562-491792fef8e1.png)

Search Panamax Templates & Docker Repositoriesという検索フィールドから、「WordPress」を検索。
6. 
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/119358/2587f1d0-267c-ab17-af8f-91558797fde0.png)

「WordPress with MySQL」の"Run Template"でDocker上にインストール開始。
7. 
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/119358/a7fbae3a-afe5-a932-4030-f25dfe5d6e88.png)

数分後、インストールが終了されたメッセージが表示され、WordPressが設定できます。
*****
ここまでは、参考にしたサイトにも詳しく書かれていたので、ハンズオントレーニングといったところですが、私が気に入ったのは。アプリケーションの右側にある歯車のボタンを押すと表示されるメニュー。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/119358/9c0c378b-f897-2f0e-3c74-9fe5d753cd18.png)

いま動いているアプリケーションを簡単にGitにテンプレートとして保存/Targetへのデプロイ/リビルドできること。テストして捨てるもよし、そのまま動かすのもよし、初期設定にすぐに戻すもよし。注目されている「Immutable Infrastructure」や「 Disposable Components」、言葉だけで理解できていなかったのですが、ここまで簡単にWordPress+MySQLのシステムが構築/廃棄できるのを目の当たりにすると、インフラやシステムへの考え方を根本から変えなければいけませんね～。
もっとParamaxのテンプレートが充実してくると楽しいですね！
*****
参考にしたサイト：
・注目すべきDockerの周辺技術 PanamaxとKubernetes
<https://thinkit.co.jp/story/2015/01/26/5561?page=0%2C1>

・コンテナ管理ツール「Panamax」をCoreOSと組み合わせて使ってみよう
<http://knowledge.sakura.ad.jp/tech/3089/>

・[技術ブログVol.15] PanamaxでDockerからSensuとUchiwaを作ってみた
<http://www.denet.ad.jp/technology/2014/09/vol15-panamaxsensuuchiwa.html>

・AWS上でDockerを使ってWordPressを動かす　(コマンドほぼ不要)
<http://qiita.com/ktr_type23/items/ffc02de9903d2df8c5e3>

・WordPressをdockerで構築してみた
<http://tech-blog.tsukaby.com/archives/989>
Macでクリップボードを直接編集する

コピーした内容をちょっと弄りたいとき。

## コマンド

```bash
pbpaste | vipe | pbcopy
# aliasを貼っておく。bashrcなど
alias viclip='pbpaste | vipe | pbcopy'
```

## 必要なもの

* HomeBrew
* moreutils

## 準備

HomeBrewのインストールをする。
そのあと、`moreutils`をインストール。

```bash
# vipeが使えるようになる
brew install moreutils
```

## 解説

`vipe` は `moreutils` 内のコマンド。
パイプで渡した出力を編集し、標準出力できる。
`pbpaste` でクリップボード内を出力し、 `vipe` で編集し、 `pbcopy` で編集した内容をクリップボードへ戻す。
Momentのマルチスレッド問題

# はじめに

MomentをサーバサイドJava※などのマルチスレッド環境で動作させているという奇特？な人向けに共有。Node.js環境な人は無視していいです。

※[Rhino](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino)とかJDK標準の[Nashorn](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/scripting/nashorn/api.html)を使うなど

日付系処理によく使われるJavaScriptライブラリの[Moment](http://momentjs.com/)を、マルチスレッドで共有して使うと問題が発生する恐れがある (スレッド毎に独立して処理している場合は問題ない)。

# 発生するバージョン
Moment 2.12.0 以下

# 現象
現象としては、フォーマット処理で変な値が返ってきたりする。現在日時を`YYYY-MM-DD HH:mm:ss.SSS`でフォーマットしても、`2016-04-::25.435`みたいになったりする。

```js:フォーマット処理
var now = moment().format('YYYY-MM-DD HH:mm:ss.SSS');
console.log(now); // => 2016-04-::25.435
```

その他、`TypeError: Cannot find function call in object -.` みたいなエラーがスローされることもある。

MomentのIssueにも2014年に挙げられている。 → https://github.com/moment/moment/issues/1756
が、未対応でクローズされていた。

# 原因
https://github.com/moment/moment/blob/2.12.0/src/lib/format/format.js#L57

のforループで使用しているインデックス変数の`i`がマルチスレッドで共有されているため。

# 解決策
そもそもマルチスレッドで共有すんな、という話もあるが、、、大人の事情でそこは直せないこともあるかと。

問題のfor文では`i`を0で初期化して使っている物なので、ここでvar宣言しておいてスコープをこの無名関数内とし、マルチスレッドで共有されないようにすれば良い。

https://github.com/moment/moment/pull/3109 でプルリクも出しておいた。次のバージョンで取り込んでもらえそうな感じです。
CocoaPods 管理の Facebook iOS SDK 3.23.0 で weak reference エラーを回避する方法

# エラー

CocoaPodsで依存管理している Facebook iOS SDK 3.23.0 でビルドエラーが発生。
メッセージ内容： Cannot create __weak reference in file using manual reference counting

[マニュアルでPodsのプロジェクトファイルをいじる](http://qiita.com/horobetsu/items/aeb6d21d596d89f27f9c)ことでローカルではビルドできるようになったものの、Jenkinsで自動ビルドする際に

```
pod update
```

を走らせているので、設定が巻き戻ってしまい、ビルドに失敗した。

# 対処方法

Podfileに、pod install / updateの後に走らせるスクリプトを記述できるので、そこに下記を記述する。

```
post_install do | installer |
    classy_pods_target = installer.pods_project.targets.find{ |target| target.name == 'Facebook-iOS-SDK' }
    classy_pods_target.build_configurations.each do |config|
        config.build_settings['CLANG_ENABLE_OBJC_WEAK'] = 'YES'
    end
end
```

# 余談

`CLANG_ENABLE_OBJC_WEAK`という魔法の言葉を探す方法。

![Pasted image at 2016_04_14 19_26.png](https://qiita-image-store.s3.amazonaws.com/0/20160/39749917-96e7-876a-87cb-57da6522249c.png)


# 参考サイト

本家サイト： https://guides.cocoapods.org/syntax/podfile.html#post_install
LINQはEntity Frameworkのことじゃねぇ。

社内で初めてLINQ使いだしたのは自分なんですが、その時に使ったのが、edmx ・・・ Entity Frameworkでした。それ以降、うちの会社のメンバーでは

LINQ = Entitiy Framework （ちがう）
= DBはSQL Serverでないとダメ （確かそれもちがう）
= あとあほみたいに遅いから使い物にならない（確かにあほなJOINすると遅かった）
= あと書き方へんだよね（それは坊主憎けりゃ袈裟まで憎いだ。）

と考えているようで、何とかその辺の誤解を解いてあげたいのになんかいい方法ないのかなぁ。

なお、データの集合体に対して計算とかするときに楽するためのものだよっていったら、
> ストアドでやるからなー

と言われた。確かに自分はあんまりストアド使ってないから何とも言えないけど、実際に開発におけるストアドの比重って昨今どれくらいなのか正直意見を聞きたいところですね。
(とはいえ、確かに偏差値計算とかはSQLのほうが強いかも)

自分も、LINQはforeachがなくなる！みたいな感じで使うようになったのは本当に今の業務に移ってからなので、人のことあんまり言えないかもしれませんけどね。とはいえ、コードのネストがどんどん減っていくのを見ると、すごい楽しいですね。

まとめ。
LINQの有用性を正しく理解してもらうためには。
ストアドプロシージャってどこまでの範囲で使うものなのか。
ファーストインプレッションてすごい大事。人でも・技術でも。
Unityちゃんを前後左右移動 & ジャンプさせる (初心者向け)

この記事の趣旨は、Unityを初めたばかりの人が「サクッとUnityちゃんを動かしたい」という願いを叶えるための記事です。

目標はこんな感じです。
画像をクリックするとYoutubeに飛びます。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/d5qSIRseSJs/0.jpg)](https://youtu.be/d5qSIRseSJs)


## STEP1: Unitychanをダウンロード、インポートする

AssetStoreからダウンロードします。
http://u3d.as/85c

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/949b7cf6-1a49-09b9-1e11-e34ec9c2ae0b.png)


## STEP2: Standard AssetのCharacterをインポートする

Projectビューで右クリック > Import Package > Characters

![Character.gif](https://qiita-image-store.s3.amazonaws.com/0/96970/508f785a-c0ef-86b9-ee18-cf3f57b0f36c.gif)

## STEP3: 床のオブジェクトの上にUnitychanを配置する

[UnityChanフォルダ] > [Prefabs] > [unitychan]を置く。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/d0730a9f-96bd-8c4f-4264-5d63f8acd8aa.png)

## STEP4: unitychanのAnimatorを設定する。

unitychanのAnimatorのControllerを
「ThirdPersonAnimatorController」に設定する。
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/153a0c4f-c179-62de-f6d2-52d4a20304ce.png)

## STEP5: Third Person User Control (Script)を Add Componentする

デフォルトでついている「Idle Changer」と「Face Update」は特に理由がなければチェックを外しておきましょう。

そして、AddComponentの検索窓から「Third Person User Control」を検索し、Add Componentしましょう。

すると「Rigidbody」と「Capsule Collider」と「Third Person Character」も一緒についてきます。

## STEP6: Capsule Collider と Third Person Character のパラメータを調整する。

このままだと動きが不自然なので、最低限下図のようなパラメータに変更してください。
それ以外のパラメータはお好みで (Jump Powerなど)
![image](https://qiita-image-store.s3.amazonaws.com/0/96970/30bb2434-0014-75b5-c3b0-63019d1b5e32.png)

これでUnityちゃんが前後左右に動き、ジャンプもできるようになりました！
![UnityMove-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/96970/2bd96ded-a954-94d4-077f-99a621cf8d16.gif)

## 番外編: 三人称カメラをつける

Standard Assetを使えば簡単に三人称カメラを付けることができます。

まず、[Import Package] から [Cameras]をImportしましょう。

次に、[Standard Assets] > [Cameras] > [Prefabs] > [MultipurposeCameraRig] をScene上にもってきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/e1a88b47-6784-855f-b7da-afb06037b232.png)

[MultipurposeCameraRig]の[AutoCam]の[Target]に[unitychan]を選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/daeb26f2-39ef-2f73-fcf7-22d7a05a9355.png)

これだけです！
簡単に3人称カメラを使いたい時に役立ちますね。
あとはパラメータを調整しましょう。
![UnityCamera-compressor.gif](https://qiita-image-store.s3.amazonaws.com/0/96970/d31336f2-386b-6241-2884-02671e625545.gif)

 

## ライセンス

© Unity Technologies Japan/UCL
Docker と cgroups と namespace 関連の映像がみれる資料まとめ

# 概要

* [4.5 カーネルで stable となった cgroup の単一階層構造 cgroup v2 - TenForwardの日記](http://d.hatena.ne.jp/defiant/20160414/1460560309)

この記事をみて、

いろんなところに、まとめた資料がありそうだが、映像がみれるものがいくつかあったので、自分用にまとめようとおもった。

# 結論

* [コンテナ型仮想化の情報交換会](https://sites.google.com/site/containerstudy/home)

ここで公開されている映像をみるとよさそう。

見たものは、どれもよかったです。資料もあるし。
なかでも、いかのものがおもしろかった。

* [第4回 コンテナ型仮想化の情報交換会＠東京 - コンテナ型仮想化の情報交換会](https://sites.google.com/site/containerstudy/home/di4hui-kontena-xing-jia-xiang-huano-qing-bao-jiao-huan-hui-dong-jing)
* cgroup あれこれ (@hiro_kamezawaさん)

* [第5回 コンテナ型仮想化の情報交換会＠大阪 - コンテナ型仮想化の情報交換会](https://sites.google.com/site/containerstudy/home/5thcontainerstudy)
* Linuxコンテナの基本と最新情報 (@ten_forward)

* [第7回 コンテナ型仮想化の情報交換会＠大阪 - コンテナ型仮想化の情報交換会](https://sites.google.com/site/containerstudy/home/7thcontainerstudy)
* 今さら聞けない Linux コンテナの基礎 (@ten_forward)

* [第8回 コンテナ型仮想化の情報交換会＠東京 - コンテナ型仮想化の情報交換会](https://sites.google.com/site/containerstudy/home/8thcontainerstudy)
* Linux Namespaces Internal (Masami Ichikawa さん)
プロンプトの表示形式を変えてみる

# ■ ことはじめ
複数のインスタンスにアクセスしていると、どのタブでどのインスタンスにアクセスしてるのか
混乱してしまうため、インスタンスの名前を常に表示しておきたかった。

# ■ 設定メモ

ユーザーごとなら `~/.bashrc` or `~/.bash_profile`
全ユーザーなら `/etc/bashrc` を変更。

## > [ユーザー名@インスタンス名 ディレクトリ名] 

```shell-session:/etc/bachrc
PS1="[\u@インスタンス名 \W]\$ "
```


## > 色を付けてみる　⇒　[ユーザー名@インスタンス名 ディレクトリ名] 

ちょっとテンションあがったので、ついでに色を付けました。

` \[\033[ 0;32m\] ` 緑色開始
` \[\033[ 0m\] ` 設定無効

```shell-session:/etc/bachrc
PS1="\[\033[ 0;32m\][\u@インスタンス名 \W]\$ \[\033[ 0m\]"
```

**32** の部分を変更すると、色が替えれます！

# 実用編～Git対応～

Gitを使用しているディレクトリでは、ブランチが表示されるように設定

```shell-session:/home/ユーザーディレクトリ/.bash_profile
parse_git_branch() {
  if type git > /dev/null 2>&1; then
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
  fi
}

export PS1="\[\033[1;36m\]\u@\h \[\033[1;37m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\]\n$ "
```

こんな感じになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/45080/bd96e35c-7ccc-5a92-0e51-3b80df51bed5.png)

# ■ 参考サイト様

- [コマンドプロンプトの表示形式を変更したい](http://www.itmedia.co.jp/help/tips/linux/l0166.html)
- [プロンプトの確認や設定](http://pocketstudio.jp/linux/?%A5%D7%A5%ED%A5%F3%A5%D7%A5%C8%A4%CE%B3%CE%C7%A7%A4%E4%C0%DF%C4%EA)
　こちらのサイトさんに色番号がいくつか載っています^^
- [gitディレクトリで現在のブランチを表示する](http://heart-shaped-chocolate.hatenablog.jp/entry/2013/07/16/024757)
Google AnalyticsをWebViewで使う

Google AnalyticsをWebViewで使う
=====

GoogleAnalyticsをインアプリブラウザで呼び出して使うのにハマったので備忘録。

普通はネイティブのGoogleAnalytics使えばいいと思いましょうが、いろいろ事情があるんですよ。。。


最初に結論
----
```javascript
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','__gaTracker');
__gaTracker('create', 'UA-00000000-1', {'cookieDomain':'none', 'storage':'none', 'appName':'HOGE'});
__gaTracker('set', 'checkProtocolTask', function(){} );
__gaTracker('set', 'forceSSL', true);
__gaTracker('send', 'pageview');
__gaTracker( function(tracker){ HOGEOBJ.analytics = tracker } )
```
で動いた。

前提
----
- インアプリブラウザ上で動いてるオレオレフレームワークにGoogleAnalyticsを組み込みたい。
- ネイティブ側にはあんまり手が出せない。
- iPhone、Androidで共通コンテンツ。
- デバッガなんか使えない。
- 察して。


ミソ
----
- インアプリブラウザで開くコンテンツ
- ローカルファイル扱いになる（プロトコルがFile）
- iOSはMac版Safari、AndroidはMac版Chromeで動けば 実機でもほぼ大丈夫っぽい雰囲気



やったこと
----
- 普通に組み込む

https://developers.google.com/analytics/devguides/collection/analyticsjs/?hl=ja#the_javascript_tracking_snippet

→ 普通に動かない。

- とりあえず名前を変える

gaなんて他と容易にぶつかりそうなのは嫌だ。

```javascript
(window,document,'script','//www.google-analytics.com/analytics.js','__gaTracker');
```


- 読み込むスクリプトのURLにプロトコルを明記

そのままだとページのプロトコルになるっぽい。
file://じゃ当然に読み込めない。

```javascript
(window,document,'script','https://www.google-analytics.com/analytics.js','__gaTracker');
```


- cookieDomainの指定

ローカルで動かす時はnoneにしろとかいてあるのでそうする。

```javascript
__gaTracker('create', 'UA-00000000-1', {'cookieDomain':'none'});
```

- forceSSLの指定

SSL使っといたほうが無難な気がするのでそうする

```javascript
__gaTracker('set', 'forceSSL', true);
```

- checkProtocolTaskの指定

プロトコルチェックが邪魔なので、空の関数で上書き。
nullでもいいっぽい。

```javascript
__gaTracker('set', 'checkProtocolTask', function(){} );
```

ここまでで、iOSでは動いた。
が、問題はAndoridとかいうやつ。

- storageの指定

いろいろ追っかけてたら、chromeだとstorageなしにしないと動かないらしい。

```javascript
__gaTracker('create', 'UA-00000000-1', {'cookieDomain':'none', 'storage':'none'});
```

おわり
----

後から考えると、__gaTrackerって別にTrackerオブジェクトじゃないから名前おかしいじゃん。
まあいっか・・・
AzureML packageを使ってみようと思ったら、401出ちゃった時の対応

# 前置き
## AzureMLってそもそも何よ？
AzureMLへのインタフェースとして動く便利なパッケージです。
対象はexperiments, datasets, webservice

現在カバーしてる機能は次の4つ

- Workspaceへの接続と管理
- Datasetsをアップロード/ダウンロード
- 独自関数やモデル学習を定義してウェブサービスとして公開
- 公開しているウェブサービスを利用する


※執筆時のバージョンは0.2.10

## インストール
最新版は、githubから落として来るのが良さ気です。

```r
if(!require("devtools")) install.packages("devtools")
devtools::install_github("RevolutionAnalytics/AzureML")
```

CRANにも上がっているので
```R
install.packages("AzureML")
```
でもインストールは可能です。


# 401エラーとその解決方法
[チュートリアル](https://htmlpreview.github.io/?https://github.com/RevolutionAnalytics/AzureML/blob/master/vignettes/getting_started.html)の手順を写経して、動作を確認してみようとおもって、workspace()を使ったところ...

```r
ws <- workspace(id="xxxxxx", 
          auth="xxxxxx")
```

```sh
Error: 401 (Unauthorised).  Please check your workspace ID and auth codes.
Request ID: 24f62e72-cc87-4668-a224-cfd61f3e9326 2016-03-10 04:38:08Z
```

えー… ここでつまづかなきゃいけないって…

ソースを眺めてみたところ、api_endpointに**asiasoutheast**を使うと明示しなきゃダメらしいです。
※今回、接続しようとしたworkspaceはasiasoutheastのリージョンで用意していました。

つまり、workspace()の引数は次のようにしなきゃダメってことです。

```r
ws <- workspace(id = "xxxxxx", 
          auth = "xxxxxx", 
          api_endpoint = "https://asiasoutheast.studio.azureml.net/")
```

これで、RからAzureMLをいろいろ弄る事ができるようになります。


ENJOY!!