OmniAICreator/Qiita-1.07M huggingface dataset:
python3x: returnとyieldの違い

前に書いた<a href="http://qiita.com/weedslayer/items/9ac165613bc896a1aaa1" target="_blank">impure function and pure function、difference between print and return</a>では主に`print`と`return`の違いを書いたが今回は`return`と`yield`の違いについてまとめておく。

#return vs yield

##returnは処理制限を返している

忘れないようにここで`return`と`yield`の違いを載せておく。そもそも通常の関数ならば一度`return`か`exception`もしくは最後の`return None`を通過すると同時に役目を終える。その関数に含まれていたローカル変数に関する情報は全て消えてしまう。つまり

>_return implies that the function is returning control of execution to the point where the function is called._ returnは処理結果を関数が呼ばれたところに戻している。リターンしているのでreturn。

returnは関数の出口のお手伝いと処理結果の受け渡しをしてくれているというイメージ。

```
def foo():
    a = 1
    b = 2
    return a #ここで処理を終えてaを返す
    c = 3
    return b
```

##yieldは関数内の情報を記録したまま処理を行う

これはこれで便利なのだがもし仮に「関数内の情報をそのまま記録したまま処理を行いたい」場合はどうしようか。例えば「必要に応じて奇数を返してくれる関数が欲しい！」とか「素数を順番に一つずつ出してくれる関数が欲しい」など。

>_"Yield," however, implies that the transfer of control is temporary and voluntary._　しかしyieldは処理結果の受け渡しが一時的、かつ任意的である。関数の処理制限が必ずしも関数が呼ばれたところに戻るわけではないということ。


```
def generator():
    print("Starting here")
    i = 0
    while i < 6:
        print("Before yield")
        yield i
        print("After yield")
        i += 1

>>> g = generator()
>>> g
<generator object generator at 0x106c1e9e8>
>>> next(g)
Starting here
Before yield
0
>>> next(g)
After yield
Before yield
1
```
Conditional GANをTensorflowで実装する

[前回の記事](http://qiita.com/ysasaki6023/items/119ed018d9f40bb05df9)では、Conditional VAEを実装しましたが、本記事ではそれと対を成す、Conditional GANをTensorflowで実装してみます。

#概要
Conditional GANに関する詳細な説明は、あらゆるところですでに行われていますので、ここでは割愛させていただきます。ただ個人的には、Discriminatorが比較的単純で学びやすいタスク(fake/real画像を識別する)に集中して高速に学習が進む一方で、Generatorがその傾き情報を使うことでやはりより高速な学習を行うという意味で、カリキュラムラーニングと蒸留のテクニックを合わせたような美しさを感じるところです。

通常のランダムに生成を行うようなモデルであるGANに対し、labelの情報を与えてやることで、labelに対応するカテゴリ内での出力を行うようにしたものが、Conditional GANということになります。

基本的に、Generator, Discriminatorの双方に、labelを入力してあげることだけが、通常のGANとの違いです。

- Discriminatorでは、カラー画像3channelに加えて、labelのone-hot vectorに対応するfeatureを追加してあげます。結果として、入力画像の時点でfeatureは、N+3となります
- Generatorでは、Noise input zにconcateneteする形で、labelのone-hot vectorを追加してあげます

学習の初期では、Generatorはlabel vectorを無視したような出力を出すこともできます。例えば、label=犬のときに、実際には猫の画像をGenerateすることが可能です。ただ、それがDiscriminatorに入ったときには、label=犬にも関わらず猫の画像が入ってきたということで、明らかに（本物の写真ではなく）生成された画像という判定ができてしまいます。そのようなわけで、間接的にではありますが、このlabelがDiscriminatorのfake/realの判定に使われることを通して、双方ともlabelに対応した画像を出力することを学びます。

#実装上の留意点
実装自体は、githubにアップロードしております：
https://github.com/ysasaki6023/conditionalGAN/tree/v1.0

以下に、いくつか実装上の留意点を示します。

##入力画像の規格化
対称にすべく、-0.5~+0.5の範囲内に規格化しました。
なので、画像の再構成時には、x*255+128を行う必要があります。

##Generator最終層をtanh(x)にて正規化
上記のために、Generatorの最終層にtanh(x)を掛けました。そうすると、普通は-1~+1までの出力になってしまいますが、学習の中でNNは-0.5~+0.5の範囲に収め、fake/realを同一のダイナミックレンジにしていくことを学んでいきます。

##学習係数・Adamのパラメータ・学習回数の設定
GANは非常に不安定なシステムです。実際、GCGANの論文は、安定に学習を進めるためのパラメータを見つけたということが一つの大きな貢献となっているそうです。ですので、パラメータもそれら準拠で設定します。

- learnRate = 2e-4
- Adamの$\beta_1$=0.5

学習の回数にも工夫があります。GANでは、GeneratorとDiscriminatorの学習を交互に行う必要があるのですが、下記実装では、経験則に基づき、Generatorの学習を2回、Discriminatorの学習を1回の頻度で行っています。そうでないと、学習の発散などが生じるようです。

https://github.com/carpedm20/DCGAN-tensorflow

#結果
MNISTの手書き文字を学習させました。0-9の数字をlabelとしています。
2000回 ✕ 64枚/バッチ = 3 epoch程度の学習です。大体15分程度だったと思います。

##labelを指定し、noize vector zは一様乱数
VAEと比べて、比較的「読める」文字になっていると思います。さすがDiscriminatorが、最低限「読める」ものになることを要求しており、可読性の低いものは少ないです。
![img_2000_fake1.png](https://qiita-image-store.s3.amazonaws.com/0/124438/6c84266f-338a-436c-bc83-f63d2b249c83.png "img_2000_fake1.png") ![img_2100_fake1.png](https://qiita-image-store.s3.amazonaws.com/0/124438/fde4f8d9-b8ad-fd55-11dd-16840dfc25ff.png "img_2100_fake1.png")

##labelを指定し、noize vector zは定数
こちらもきれいに見えているのではないかと思います。
![img_2000_fake2.png](https://qiita-image-store.s3.amazonaws.com/0/124438/bc662723-0ef6-770e-e074-836de06da21d.png "img_2000_fake2.png") ![img_2100_fake2.png](https://qiita-image-store.s3.amazonaws.com/0/124438/7213edf0-7a8c-b879-5ca8-3d77838d4ddf.png "img_2100_fake2.png")

#付録
ConditionalなGANを実装するまえに、普通のGANの実装もしてみました。その際、セレブの顔画像を使った生成も行っていますので、付録として展示します。

大体10時間くらい学習をさせた結果です。
![img_32900_fake.png](https://qiita-image-store.s3.amazonaws.com/0/124438/48789cb2-0846-713e-c56c-13fdfa2c5de2.png "img_32900_fake.png") ![img_33000_fake.png](https://qiita-image-store.s3.amazonaws.com/0/124438/064b0238-d955-cce1-9481-9c0fcd1dd654.png "img_33000_fake.png")

githubは、下記です:
https://github.com/ysasaki6023/faceGAN/tree/v1.0
匿名型を返すラムダを定義する

#C#小ネタ集
##前提
C#ではラムダを***var***で受けることができません。
例えば次のコードはコンパイルエラーになります

```csharp
// ラムダ式 を暗黙的に型指定された変数に割り当てることはできません
var f = i => true;
```

これは、ラムダが左辺の型定義によって、柔軟に解釈される影響だと推測されます。

```csharp
Func<int, bool> f1 = i => true;
Expression<Func<int, bool>> f2 = i => true;
Predicate<int> f3 = i => true;
```

そのため、コード上に型を書くことができない匿名型を返すラムダは一見記述不可能のようにみえます。

```csharp
Func<int, /* ここに型が書けない */> f = i => new { Age = i };
```

##Genericsメソッドによる型推論
***var***による型推論はできないものの、Genericsメソッド引数としてラムダを渡すことにより、***Func<>***の型引数を推論することは可能です。
これを利用することにより、以下のように、匿名型を返すラムダを定義することができます。

```csharp
static void Main(string[] args)
{
    // C#7ならローカル関数でもOK
    Func<int, T> ToLambda<T>(Func<int, T> f1) => f1;

    var f = ToLambda(i => new { Age = i });
    var a = f(10); // 匿名型を返す
}

static Func<int, T> ToLambda<T>(Func<int, T> f1) => f1;
```

##余談
VB.NETでは型推論でいい感じに解決してくれるので、小細工不要だったりします。

```vbnet
' 全てコンパイル可能
Dim f = Function( i as Integer) True
Dim f1 As Func(Of Integer, Boolean) = Function( i as Integer) True
Dim f2 As Expression(Of Func(Of Integer, Boolean)) = Function( i as Integer) True
```
Rails5 | omniauth でOauth認可をおこなう ( devise を使わない )

ここではSlackを例にする。

# App 側の設定をしておく

[Oauth 連携用の設定をする (コールバック用のURLも追加する)](http://qiita.com/YumaInaura/items/373e217f9368205550ed) を参考に Slack Apps の設定をおこなう。

- ID / SECRETを取得する
- コールバック用のURLを設定する

基本は二つの手順だけで良い。

コールバック用のURLとして、ここでは`http://localhost:3000/auth/slack/callback` を指定しておく。

# gem をインストールする


```diff:Gemfile
+ gem 'omniauth-slack'
```

```
bundle install
```

APIの種類ごとに omniauth-xxx シリーズが出ている。
(他にもTwitterやFacebookのomniauth用gemがある)

# omniauthの設定

`config/initializers/omniauth.rb` を作成する。

ここではRails サーバー起動時に、OAuthの ID / SECRET を環境変数を渡す仕様にしておく。
最終的にIDとCLIENTが initializer に渡れば良いので、面倒ならばベタ書きでも良い。

 ```rb:config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :slack, ENV['CLIENT_ID'], ENV['CLIENT_SECRET'], scope: "client"
end
```


# コールバック後の動作を作成する

Appでの認可完了後、Rails側でどのような動作をおこなうかを決める。
ここでは単純に、Appから得た情報を出力するだけにしておく。
 
`bundle exec rails generate controller slack`

```ruby:app/controllers/slack_controller.rb
class SlackController < ApplicationController
  def callback
    p request.env['omniauth.auth'].info
    redirect_to '/'
  end
end
```

```ruby:config/routes.rb
Rails.application.routes.draw do
  get 'auth/:provider/callback' => 'slack#callback'
end
```

# Rails サーバーを起動する

App 側発行された Client  ID と Client Secret を環境変数として指定する。

ちなみにここでは例として画像を貼ったが、通常は SECRET を外部に公開してはいけない。

```
CLIENT_ID=42945109268.178514494449 CLIENT_SECRET=bd5fc461f91accae86e91916356ee15c bundle exec rails server
```

# 認可を試す

`localhost:3000/auth/slack` にアクセスする。

うまくいけばSlackの認可画面が出る。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/75bbc725-c362-a155-0c2a-7316a34ed136.png)

# 認可が済むと、コンソールにSlackユーザーの情報が表示される

これはさっきControllerで設定した動作のとおり。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/fe557ae4-c405-aa0d-cd7e-a37a9a7a8bf4.png)

ここでは単にコンソールに情報を表示するにとどめたが、必要ならばセッションに情報を収めてRailsアプリケーション側で使えるようにしたり、deviseと連携してDBに情報を保存したりすれば良い。


# 参考

- [RailsでSlackのOAuth認証でログインしてみる - 動かざることバグの如し](http://thr3a.hatenablog.com/entry/20151204/1449240576)


# 環境

- Rails 5.1.0
- omniauth (1.6.1)
- omniauth-slack (2.3.0)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
HTTPSの設定 for nginx

# 背景
[前回](http://qiita.com/sshojiro/items/ef48d85846457281ff7d)は、レンタルサーバーにSSL証明書・SSL中間証明書及び秘密鍵をアップして設定しました。

何しろレンタルサーバーなので、設定を勝手にやってくれるということですね。
今回は、nginx, CentOS, SakuraVPSに、自分でSSL証明書・SSL中間証明書及び秘密鍵の3つを置いて、nginxのssl.confに読み込ませます。

# SSL設定の流れ
1. local(remoteも可)にてSSL証明書のモトであるCSRファイルを作成。同時に秘密鍵も作成される
2. SSL証明書発行会社のサイトにCSRをアップして、SSL証明書・SSL中間証明書を取得
3. サーバーにSSL証明書・SSL中間証明書・秘密鍵を設置して、設定ファイルに読み込ませる
4. ApacheなりNginxを再起動して設定を反映させる。
この辺はまあ色々調べてるとわかります。[0][1]

# Nginx
sslの設定ファイルが`/etc/nginx/conf.d/ssl.conf`にあるので、コメントアウトを外してみます。
`/etc/nginx/nginx.conf`など、nginx自体の設定ファイルの方で、`Include /etc/nginx/conf.d/ssl.conf`を書き足して、includeします。
設定の仕方によってはもともと`/etc/nginx/conf.d/`ってincludeされているようなのですが、ここは手動でやりました。

ssl.confの中身を書き換えて、証明書&中間証明書(同じファイルに書く)cert.pemと、秘密鍵cert.keyを読み込むようにします。
[参考：GlobalSignの証明書をnginxに設定する方法](https://jp.globalsign.com/support/faq/400.html)

# 設定のtestと再起動
```
$ sudo /etc/init.d/nginx configtest
$ sudo /etc/init.d/nginx restart
```

粗いですが、こんな感じです。精神的ハードルは高いですが、やってみると簡単かと思います。

# Reference
[0] [レンタルサーバのssl設定](http://qiita.com/sshojiro/items/ef48d85846457281ff7d)
[1] [さくらVPSにSSL証明書を導入しHTTPS通信の構築](http://qiita.com/yoshizaki_kkgk/items/e6f39a5bfb99900b44b2)
[2] [nginx:SSLサーバ証明書の設定\[スタンダード\]](https://cspssl.jp/support/nginx/config.php)
【TECH::EXPERT】TECH::CAMPのエキスパートコースを受講してみた

#:star: TECH::EXPERTとは？
![5be513d4-f40d-4ac7-8ec5-c281ed899444.png](https://qiita-image-store.s3.amazonaws.com/0/178077/5afca39f-62bd-f075-d392-84654c70dd75.png)

[TECH::CAMP](https://tech-camp.in/)とは、未経験からサービスをつくれるエンジニアになるための短期集中プログラミング学習プログラムです。

その中でも、**１０週間で未経験からプロのエンジニアとしての就職を目指す[TECH::EXPERT](https://tech-camp.in/expert)**を受講した体験談を記していきたいと思います。

※ こちらは**2017年4月開講（11期）の時点**での体験談となります。コースの内容等が変更している可能性がございますので、公式ホームページ等をよくご確認ください。

#:star: 【更新】無事に転職しました
* [農協からエンジニアへ！どこでも活躍できる人間になるために10週間でエンジニア転身に成功！](https://tech-camp.in/note/26418/)

#:star: TECH::EXPERTを選んだ理由
##:pencil: プログラミング未経験から実績を作れる
求人を見ると分かりますが、ITエンジニアとして条件の良い企業に就職するには、**プログラミングの経験や実績が必須**となります。もちろん、給与や待遇のハードルを下げれば「未経験者歓迎」という求人もありますが、それでは転職する意義があまりないように私は感じました。TECH::EXPERTを受講することで、「1日10時間の勉強を週6日、１０週間続けるというハードスケジュールをこなし、WEBエンジニアとして必要なスキルを一通り身につけた」という実績を作ることができます。
![d2a1e9e5-e946-4c45-971d-5474b27941f3.png](https://qiita-image-store.s3.amazonaws.com/0/178077/bf8bb785-4d16-9525-92e2-2f81cb800174.png)
##:pencil: 気軽に質問できる
分からないことがあった場合、何度でもメンターを呼んで質問することができます。また、応用カリキュラムに入ると自分の書いたコードについてアドバイスをもらえるため、自分では気づかなかったより良い方法やコードの書き方を身につけることができます。
### 就職支援サービスがついている
自分の希望に合った求人を紹介してもらうことができ、内定がもらえるまで面倒を見てもらえます。また、キャリアアドバイザーから雇用条件の交渉や推薦などもしてもらえるようです。
##:pencil: 周りと協力・競争しながら勉強できる
オンライン学習だと、自分が周りに比べてどれくらいのレベルなのかを知ることは難しいですが、TECH::EXPERTは同じ時期に一斉にスタートし、各自の進捗も確認できるようになっているため、自分のレベルを確認することができます。さらに、同じ内容のカリキュラムで勉強しているため、お互いにつまずいた部分について理解を深めたり協力して勉強を進めていけます。
##:pencil: 約40万円の受講料が全額キャッシュバックされる
「スケジュール通りにカリキュラムを終えること」「TECH::EXPERTを通じて就職すること」などの条件を満たせば、**受講料全額キャッシュバック**の対象なります。私にとって40万円は大金なので、俄然、やる気も出てきます。

#:star: 事前に確認しておくべき点
##:pencil: できればmacのノートパソコンが必要
TECH::EXPERTではweb系エンジニアに必要な技術を学ぶため、macのノートパソコンが望ましいです。実際に受講生の9割以上がmacで勉強しています。自分もWindowsユーザーだったのですが、これを機に下記のmacを購入しました。
[参考：Mac PC 推奨スペック](https://tech-camp.in/specs/mac)
##:pencil: 最低でも3ヶ月間は無職になる
EXPERTコースでは、ほぼ毎日10時間勉強することになるため、**仕事を辞める**必要があります。また、ほとんどの人はカリキュラム終了後に就活が本格的に始まるため、**再就職までに3ヶ月〜４ヶ月**ほどかかりそうです。その間の生活費は事前に確保しておく必要があります。
※ 働きながら勉強したい人向けに[週末集中スタイル](https://tech-camp.in/expert/weekend)が始まったようです。ただし、６ヶ月かかる模様。
##:pencil: 休日はないと思っていた方がよい
受講期間中は**「生活の全てをプログラミングに費やす」**ぐらいの覚悟で望まないとスケジュール通りに終えるのは難しいと感じました。スケジュールが厳しく設定してあり、例えばWebアプリケーションコースで１ヶ月かけてやる内容を1週間で行います。よって、1日でも休むと追いつくのが非常に困難になり、結局、日曜日に勉強する必要が出てきます。ちなみに、私の期はゴールデンウィークをはさんでいましたが、全て出席の前提でカリキュラムが組まれていました。
##:pencil: そもそも適性があるのか見極める
プログラミングは必ずしも時間を費やせばできるようになるものではありません。EXPERTコースの進捗についても、進んでいる人と遅れている人で何週間分も差がついているようです。受講する前に、自分は本当にプログラミングに向いているのかどうか、見極めておきましょう。私のオススメは**[Progate](https://prog-8.com)**です。基礎編であれば無料で学習できるので、試しに**HTML**や**Ruby**に挑戦してみてはいかがでしょうか。
##:pencil: 基本的には自主学習
これはほとんどのプログラミングスクールに共通することだと思いますが、授業や講義のようなものは一切なく、与えられた教材をひたすら読んで自力で勉強していく学習形式となります。もちろん、いつでもメンターに質問できますが、学校や塾のようなイメージを持たれている方は要注意です。
##:pencil: TECH:MASTERに全てが載っているわけではない
TECH::MASTERという教材を使って学習を進め、基礎カリキュラムについては質問する必要がないくらい懇切丁寧に説明がされています。しかし、応用カリキュラムになると説明が減り、自分で調べないと進めないようになっています。「自分で調べて解決する」というのはITエンジニアとして働くにあたって必要なスキルの一つなので、そのあたりも承知の上で受講しましょう。
##:pencil: 受講生の年代・性別について
社員の話によると20代後半の方が多いそうですが、自分の期はもう少し若い方が多かったです。また、ITエンジニアは性別によって扱いが変わるような職種ではないと思うのですが、受講生に女性はほとんどいませんでした。
Windows 10 での Windows コンテナーと Linux コンテナーの共存方法

# Windows 10 での Windows コンテナーの有効化

以前の投稿 "[Visual Studio 2017 による ASP.NET Core アプリの Docker コンテナーの利用](http://qiita.com/hiromasa-masuda/items/e1a58ad8dce0ea68bb91)" では、Windows 10 環境において、Docker for Windows をインストールして、Linux コンテナーを有効化しました。

一方、Windows コンテナーは、Windows 10 Anniversary Update から、Windows の機能として組み込まれており、ASP.NET 等の Windows に依存したアプリケーションを開発している場合は、この Windows コンテナーの方が利用頻度が高いかもしれません。

現状、Windows コンテナーでは、Linux イメージを動作させることはできず、また、Linux コンテナーでは、Windows イメージを動作させることはできません。

今回は、Docker for Windows をインストールした環境に対して、さらに Windows コンテナーをインストールして、共存化を行おうと思います。

[Windows の機能の有効化または無効化] - [コンテナー] を選択し、[OK] を選択し、Windows コンテナーをインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/12fb3a96-fe61-c5ab-7cfd-10fb0eda9179.png)

次に、タスク バーの通知領域から、Docker アイコンの右クリック メニュー [Switch to Windows containers...] を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/e85e9d41-7809-7905-15d0-b3c254585484.png)


docker version の出力を確認すると、Server の OS/Arch が windows/amd64 となっており、Windows コンテナーに切り替わっていることが分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/580df0a8-55e2-ca4d-1b92-c407bac62f3c.png)

Linux コンテナーに戻す場合は、タスク バーの通知領域から、Docker アイコンの右クリック メニュー [Switch to Linux containers...] を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/97ac52df-edee-557e-40c4-7755e1e2157b.png)

docker version の出力を確認すると、Server の OS/Arch が linux/amd64 となっており、Linux コンテナーに切り替わっていることが分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/8adbe8f8-a575-c389-c07b-9c23864a7166.png)

# Visual Studio 2017 による Windows コンテナーの開発について

Visual Studio 2017 における Windows コンテナーの開発サポートですが、ASP.NET アプリケーションにおいても [ASP.NET Core MVC アプリケーションと同様に](http://qiita.com/hiromasa-masuda/items/e1a58ad8dce0ea68bb91)、Docker サポートを有効でき、Windows コンテナーのデバッグ実行も可能です。
(**この時、Windows コンテナーに切り替えていないと、ビルド時にエラーとなります。**)
しかしながら、2017/05/05 現在では、発行のサポートがされていなようです。

Dockerfile は生成されるので、以下を参考に、docker コマンドによる発行が必要です。

- [Migrating ASP.NET MVC Applications to Windows Containers](https://docs.microsoft.com/en-us/aspnet/mvc/overview/deployment/docker-aspnetmvc)
- [CLD007_正式リリースした Windows Containers を使い倒す](https://docs.com/mstechsummit16/7290/cld007-windows-containers)
Java ラムダ式のバリエーション


Java8で導入されたラムダ式について、書き方のバリエーションを調べました。
迷った時に簡単に参照出来るよう、表形式で網羅しておくことにします。

## ラムダ式のバリエーション
| No. | 記述法 | 説明 |
|-----------:|:-----------|:------------|
|1| () -> System.out.println("foo") | 引数なし |
|2| (n) -> System.out.println(n) | 引数あり(括弧で囲う) |
|3| (int n) -> System.out.println(n) | 引数あり(括弧で囲う＋型明記) |
|4| n -> System.out.println(n) | 引数あり(括弧で囲わない) <br>※引数が一つの場合のみ括弧の省略可能|
|5| (m, n) -> m+n | 引数あり(複数個) |
|6| (int m, int n) -> m+n | 引数あり(複数個＋型明記) |
|7| (n) -> { return n * 2;} | ステートメント型のラムダ式 |

## サンプルコード
上記のサンプルコードです。

```java
// No.1 引数なし
Runnable lambda1 = () -> System.out.println("foo");
// No.2 引数あり(括弧で囲う)
IntConsumer lambda2 = (n) -> System.out.println(n);
// No.3 引数あり(括弧で囲う＋型明記)
IntConsumer lambda3 = (int n) -> System.out.println(n);
// No.4 引数あり(括弧で囲わない) ※引数が一つの場合のみ括弧の省略可能
IntConsumer lambda4 = n -> System.out.println(n);
// No.5 引数あり(複数個)
IntBinaryOperator lambda5 = (m, n) -> m+n;
// No.6 引数あり(複数個＋型明記)
IntBinaryOperator lambda6 = (int m, int n) -> m+n;
// No.7 ステートメント型のラムダ式
IntUnaryOperator lambda7 = (n) -> { return n * 2;};
```

## 参考元
- [【C#】ラムダ式書き方バリエーション](http://mackierx111.hateblo.jp/entry/2016/06/29/004506)
- [[Java] Java8のラムダに超入門（書き方、関数型インターフェース、独自に定義、ラムダ受け取り処理）](http://www.yoheim.net/blog.php?q=20160410)
- [標準的な関数型インターフェース](http://www.ne.jp/asahi/hishidama/home/tech/java/functionalinterface.html#h_API)
- [Java8ラムダ式の使い方の基本](http://www.task-notes.com/entry/20150418/1429359646)
- [Java8 Lambdaまとめ](http://qiita.com/tasogarei/items/60b5e55d8f42732686c6)
りんごループから抜け出すお話。

昨晩、友人のiPhone5にて発生中のりんごループ地獄をなんとか抜け出しました。
起動時のあのAppleマークのみがひたすら表示され続ける。らしい。


#やってみたこと（なおらなかったこと）
まず、[恐怖のリンゴループ！脱出のための4つの方法と最後の手段 - iPhone大学](http://iphone-college.com/repair-club/apple_loop.html)にたどり着き、
1. SIMカード抜いて起動 -> りんごループ:apple:
2. SIMカード差し直して起動 -> りんごループ:apple:
3. セーフモードで起動（起動の際にボリュームのプラスボタンを押し続ける) -> りんごループ:apple:
4. PCとUSB接続してもiTunesには、デバイス認識されず -> りんごループ:apple:

#やってみたこと（なおったこと）
"iPhone5 apple loop"でググって、[Stuck in continuous apple logo loop, turns off when cable removed? - iFixit](https://www.ifixit.com/Answers/View/150271/Stuck+in+continuous+apple+logo+loop%2C+turns+off+when+cable+removed#answer294051)をなんとなく覗いたら、これだった。

やってみたのはDeiselWeiselさんのSolution。
要はリカバリモードにする。

>In most cases, you can solve these problems by putting the phone into recovery mode and restoring it from backup. To do that, follow these instructions:
>
>1. Connect the iPhone's USB cable to your computer, but not your iPhone.
>
>2. Turn your iPhone off. If the phone won't turn off in the traditional manner, just keep holding the buttons until the screen goes dark.
>
>3. Once you've turned the device off, press the home button on the face of the device and plug in the USB cable to the device's dock connector.
>
>4. When it turns on, keep pressing the home button until the iTunes logo appears on the screen.
>
>5. You'll know the phone is now in recovery mode because a window in iTunes will tell you.
>
>6. You can then start the restore process by clicking the "Restore" button in the iTunes window.


1. iPhone接続する用のUSBケーブルをPCに挿す。iPhoneはまだ繋いじゃダメ。
2. iPhoneを電源OFF。いつもの方法でOFFれない場合、画面真っ黒になるまでボタン押す。
3. 電源切れたら、ホームボタン押しながらUSBケーブルをiPhoneに挿す。(iPhone7／7+ の場合は、音量ボタン(下)を押しながら接続)
4. 電源がついてもiTunesのLogoが表示されるまでホームボタン押し続ける。
5. iTunesの方にiPhoneがリカバリモードだとかなんだとかの説明が表示される
6. "初期化する"に進む。

今回は手順6で"復元"じゃなく"ソフトウェアアップデート" -> りんごループ脱出。


#まとめ
何かあったらリカバリモードにしてからなんとかする。

#その他リンク
- [iPhone・iPadでリカバリーモード・DFUモードに入る方法](https://decoy284.net/2014/01/17/iphone-recovery-mode-dfu-mode/)
WebアプリのツールチップをVueで簡単に実装する

# 前提
- フロントエンド（HTML/CSS, JavaScript）の知識がある
- 何かしらのJSフレームワーク（jQueryなど）を使ったことがある

# 特徴
- 一部を除いてほぼ HTML/CSS そのままで書くことができる
- VirtualDOM を利用するので、比較的軽量
- ツールチップの見た目のカスタマイズもしやすい

# 手順
## 1. Vue.jsの読み込み
```html:index.html
<script src='https://unpkg.com/vue' type='text/javascript'></script>
```
※手軽に利用するためにCDNで読み込む

## 2. ツールチップの準備
HTMLでは普通に`div`タグで記述すればOK。
Vueが識別するためのid（この場合は`tool-tip`）さえ付ければ残りの部分はどのようにしても問題なし。

```html:index.html
<div id='tool-tip'>
<!-- ツールチップの内容 -->
</div>
```

## 3. ツールチップを Vue で扱えるようにする処理を記述
### 3-1. JSに Vue コンポーネントを定義し、HTML側のdivと紐付ける
```js:index.js

let toolTip = new Vue({
    el: '#tool-tip',  // HTML側のidと対応
    data: {
        tipStyle: {  // 後述のスタイル用オブジェクト
            position: 'absolute',
            top: '0px',
            left: '0px',
        },
    }
});

```

### 3-2. HTMLのdivに対して Vue 独自のタグでVueコンポーネント内のスタイル用オブジェクトを指定する。

```html:index.html
<div id='tool-tip' v-bind:style='tipStyle'>
<!-- ツールチップの内容 -->
</div>
```

## 4. マウスについてくる処理を記述
```js:index.js
// 関数（処理本体）
let toolTipRendering = () => {
    return (e) => {
        toolTip.tipStyle.left = parseInt(e.clientX + 30 /*ここの数値は任意で、変えることによってカーソルからの距離が変わる*/) + 'px';
        toolTip.tipStyle.top = parseInt(e.clientY + 30 /*同上*/) + 'px';
    }
}

// 処理呼び出し（いい言い方が見つからなかった…）
document.addEventListener('DOMContentLoaded', () => {
    window.addEventListener('mousemove', toolTipRendering(), false);
}, false);

```


**完成**
以下でソースと実行テストが見れる

https://jsfiddle.net/1wupkgL1/2/

## ちなみに
Vue コンポーネントで作っているため、コンポーネント内に表示データ用オブジェクトを用意して、ツールチップ内の情報とバインドしたりも簡単に出来るのでオススメ。

```html:index.html
<div id='tool-tip' v-style='tipStyle'>
    id : {{tipData.id}} <!-- => これだけで "0000" が画面に表示される -->
    title : {{tipData.title}} <!-- => "hogehogefuga" が画面に表示される -->
</div>
```

```js:index.js
let toolTip = new Vue({
    el: '#tool-tip',  // HTML側のidと対応
    data: {
        tipStyle: {  // 後述のスタイル用オブジェクト
            position: 'absolute',
            top: '0px',
            left: '0px',
        },
        tipData: {
            id: '0000',
            title: 'hogehogefuga',
        },
    }
});
```

他にも、チェックボックスによって表示・非表示を切り替えたり、どの部分も拡張性が高いのがおすすめポイント

# 参考リンク
- http://tmlife.net/programming/javascript/javascript-mouse-pos.html
- https://jp.vuejs.org/v2/guide/class-and-style.html
【GUI】GUIウィンドウ表示位置のお話

#GUIウィンドウを生成する場合

```js
new Window(種類,タイトル,サイズ[Left,Top,Right,Bottom],{オプション})；

例）
var winObj = new Window("window","GUIName",[230,120,1500,900]);
```
で作成出来ます。


サイズは絶対座標になります。
左上が基準点0となり、基準点0からの長さになります。

![名称未設定-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/37bd3b50-43ea-72f5-01b8-d22c4bff7eea.jpeg)
Ruby on RailsをWEBrickで起動したとき、REQUEST_URIが変だった話

## 概要

Railsで`request.env["REQUEST_URI"]`が変な値を返すことがあり、それについて調べた。

`http://localhost:300/sample/hello`にアクセスした場合、`REQUEST_URI`は`/sample/hello`であることを期待していたのだが、`http://localhost:3000/sample/hello`となることがあった。
表にすると以下のようになる。

|    |`request.env["REQUEST_URI"]`|
|:--:|:------:|
|期待した値|`/sample/hello`|
|実際の値|`http://localhost:3000/sample/hello`|

## 検証

Rails 5.0.2でサンプルを作る。

```bash
$ bundle exec rails new .
$ bundle exec rails generate controller Sample hello
Running via Spring preloader in process 35760
      create  app/controllers/sample_controller.rb
       route  get 'sample/hello'
      invoke  erb
      create    app/views/sample
      create    app/views/sample/hello.html.erb
      invoke  test_unit
      create    test/controllers/sample_controller_test.rb
      invoke  helper
      create    app/helpers/sample_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/sample.coffee
      invoke    scss
      create      app/assets/stylesheets/sample.scss
```

helloメソッドで`request.env["REQUEST_URI"]`を返すように修正する。

```ruby:app/controllers/sample_controller.rb
class SampleController < ApplicationController
  def hello
    render html: "#{request.env["REQUEST_URI"]}"
  end
end
```

### WEBrickの場合

WEBrickでサーバを起動する。

```bash
$ bundle exec rails server webrick
```

`http://localhost:3000/sample/hello`にアクセスする。

![webrick.png](https://qiita-image-store.s3.amazonaws.com/0/31403/07d357c5-bdbb-1a6d-6cc7-4c61c44bda20.png)

### Pumaの場合

続いて、Pumaでサーバを起動する（Rails 5からデフォルトのサーバがPumaになったので、`bundle exec rails server`だけでも良い）。

```bash
$ bundle exec rails server puma
```

`http://localhost:3000/sample/hello`にアクセスする。

![puma.png](https://qiita-image-store.s3.amazonaws.com/0/31403/aed245a9-482a-f5f7-2586-52be97eeee5d.png)

## まとめ

WEBrickの場合、`REQUEST_URI`が変な値を返す。
Atomの設定同期(sync-settings)

# この記事は...  
エディタソフト[Atom][1]の設定を複数端末で同期するプラグイン [sync-stettings][2]の導入手順の備忘録。記事執筆時点(2017年5月5日)での情報となります。

[1]:https://atom.io/ "Atom"
[2]:https://atom.io/packages/sync-settings "sync-stetting"

# バージョン情報
 + Atom 1.16.0
 + sync-settings 0.8.1

# 導入手順
##必要なモノ
  - Atom
  - sync-setting(プラグイン)
  - GitHubアカウント

##インストール
 1. sync-settingのインストール
  - Atomのパッケージ管理画面より[sync-settings][2]をインストール

## 設定
 1. Atomからsync-settingsの設定画面を開く
 2. アクセストークン発行 (GitHub) 
  + settings -> Developer setting -> [Personal access tokens](https://github.com/settings/tokens)
  + 右上の Generate new token
  + scopeは`gist` のみで発行(Token descriptionはAtom sync-settings とか？)
 3.  トークンを登録(sync-settings)
  + sync-settings -> setting ->Personal Accses Token(一番上の欄)へ先ほど発行されたトークンをコピー
 4. 新規gist作成(GitHub)
  + [New gist](https://gist.github.com/)画面へ
  + 本文にダミーの文字を打ち込み(空では作成できない)、gistを作成(Create secret gistがいいかな？[^1])
 5. gist IDの登録(sync-settings)
  + gistの個別ページ(遷移先ページ)からgist IDをコピー(URLの”ユーザーネーム”/の後の英数字文字列)
  + sync-settings -> setting ->Gist ID(2番目の欄)へ先ほどのgist IDをペースト

 
> 1. Open Sync Settings configuration in Atom Settings.
> 2. Create a new personal access token which has the `gist` scope and be sure to **activate permissions**: Gist -> create gists.
> 3. Copy the access token to Sync Settings configuration.
> 4. Create a new gist and save it.
> 5. Copy the gist id (last part of url after the username) to Sync Settings configuration.

# 使い方
## バックアップ(アップロード)
二通り

+ コマンドパレット(<kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>(Win) / <kbd><kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>(Mac))より、`Sync Setting:Buckup`コマンド
+ メニューバー -> Packages -> Syncronize Settings -> Buckup

完了後、Atomに通知が出るはずです。
## レストア(ダウンロード)
二通り

+ コマンドパレット(<kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>(Win) / <kbd><kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>(Mac))より、`Sync Setting:Restore`コマンド
+ メニューバー -> Packages -> Syncronize Settings -> Restor

完了後、Atomに通知が出るはずです。設定の反映は再起動してみてください。  
## アップデートチェック
二通り  

+ コマンドパレット(<kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>(Win) / <kbd><kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>(Mac))より、`Sync Setting:Check Buckup`コマンド
+ メニューバー -> Packages -> Syncronize Settings -> Check for update buckup

完了後、Atomに通知が出るはずです。

# 補足
1．環境設定の中に同期したくない項目がある
**Blacklisted keys を利用する。**gistに保存されるsetting.jsonから対応するキーを確認し、Blacklisted keysに記入する。ネストされたキーは「.」でつなぎ(e.g. core.projectHome)、複数項目は「,」で並べて記述する。
**ただし、この設定はアップロード対象から除外されるもので、ダウンロードはgist上のものが強制的に上書きされるため、注意が必要。**初回アップロードの前に記述するか、gistから直接削除するなどで対策する。

****

[^1]: > Github Gists are by default public. If you don't want other people to easily find your gist (i.e. if you use certain packages, storing auth-tokens, a malicious party could abuse them), you should make sure to create a secret gist.
middlemanの開発環境構築でハマった

備忘録的に

#何にハマったか
bundler: failed to load command: middleman
のエラーがでてきてmiddleman serverできなかった。bundle exec middleman serverでもできなかった。

別プロジェクトのフォルダでmiddleman initしようとしたけどできなかった。（エラー忘れた）

いつもだったらbundle update　➝　bundle installとかでいけたんだけどな、あれ？

#やったこと
1.rubyのバージョン安定版にした
https://www.ruby-lang.org/ja/downloads/

➝　これで別プロジェクトではmiddleman initできた

2.Gemfile.lock削除した
bundle exec middleman serverでいけた


#考えられる原因
- Gemfile.lockと.rbenv/versions/2.3.4/lib/ruby/gems/2.3.0/gems/bundler-1.14.6/lib/bundler/で呼び出すGemのバージョンに差異があってダメだった？？
- gemのバージョンが自分のRubyの環境で対応してなかった？？
- failed to load command➝ ~/.zshrcとかみたけど問題なさそうだった
How to fix when new connection dialog fails in Visual Studio 2015



###
- Visual studio 2015
    - Close visual studio
    - eventvwr
        - check if any devenv error(s) in Application like
        - `The data source '{7931728a-ebfb-4677-ad6b-995e29aa15c2}' specifies no supporting providers or a set that are not registered.`
    - regedit
    - `HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0_Config\DataProviders\`
    - Delete the key(s) that referred to the faulty data provider above
        - eg. npgsql

###
 - npgsql uninstaller leaves the registry information which causes this error... :cry: 

###
cf. http://stackoverflow.com/questions/8217115/new-connection-fails-during-add-new-data-source-dialog
windowsでTensorFlow その11

#概要
windowsのTensorFlowの環境で、OpenAiやってみた。
落ちてくる果物を籠で受け取るフルーツバスケット作って、tensorflowで強化学習してみた。

#写真
![ss.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/e2090703-3182-f156-f363-e861c1d2d4b1.jpeg)


#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.0
pyqt5
OpenAi Gym 0.5

#サンプルコード

https://github.com/ohisama/CatchGame-QLearningExample-TensorFlow
Slack | Oauth 連携用の設定をする (コールバック用のURLも追加する)

# Slack App を作る

https://api.slack.com/ から作成可能。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/c1020f9d-12cf-d872-f02c-858b7b3e2084.png)

# IDとSECRETを確認する

どちらも、認可を受ける側のアプリケーション(あなたが作るアプリケーション)に必要なので、控えておこう。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/49bad7d8-15c7-2a56-d52b-673c4f089cf7.png)


# コールバック用のURLを設定する

同画面から

* Manage Distributions
* Add OAuth Redirect URLs

をたどると設定できる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/bf664068-429e-4fb5-dc58-e5bbd8251c2c.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/89618/04e85cbf-6084-dfed-7a7f-e3123275b045.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Slack Apps | ユーザーごとに OAuth認可を取り消す方法

# 1. Slack Appの管理ページにアクセスする

`https://[your-team-name].slack.com/apps/manage`

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/e88af4fe-3382-ac75-3e1d-147da2fdbc55.png)

# 2. 該当の Slack App を選ぶ

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/552ec7df-616f-c10f-bed9-088bace765be.png)


# 3. ユーザーを選んで Revoke する


![image](https://qiita-image-store.s3.amazonaws.com/0/89618/09d3d336-9845-50ae-6a92-c49d46b6a131.png)

# 結果

- 「認可を与える側のSlack Apps」
- 「認可を受ける側のアプリケーション」

この間のOauth連携処理で、ふたたびユーザーの同意が必要な状態になる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/e56b5ae0-02a6-a833-8b1f-40389fd0e5f5.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Firebase Analyticsの真面目なユーザープロパティ戦略

# ユーザープロパティはFirebase運用の一番のボトルネック
ユーザープロパティはFirebaseの運用を考える上でコアの機能（特にRemote Configと組み合わせてのABテスト）でありながら、ボトルネックになるリスクが非常に高い。

特に懸念として大きいのが以下の仕様である。

- ユーザープロパティは一度作成したら、ユーザプロパティ名を修正できない。
- ユーザープロパティは一度作成したら、**削除できない**。
- ユーザープロパティの**作成上限は25個**である。
- ユーザープロパティ名の**文字上限は24文字**である。

引用：
[ユーザー プロパティを設定する](https://firebase.google.com/docs/analytics/android/properties?hl=ja)
[setUserProperty()](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics?hl=ja#setUserProperty(java.lang.String, java.lang.String))

# ユーザープロパティ戦略
上記より運用に際し、慎重に戦略を練らなければいけない。
ユーザープロパティで使用されると想定されるのが、そのままの意味だが**ユーザーのプロパティ**（例えば、性別・地域など）、**ABテストのフィルタ**として使用される場合の２パターンである。

参考：
[【Android】Firebase RemoteConfig + Firebase AnalyticsでABテストを試す](http://qiita.com/takahirom/items/e2114a08acfa36f256ff)

なお、前者のユーザーのプロパティとしての使い方で、**もしアプリ内の情報の変更依存でRemoteConfigを使用する場合（例えば、地域情報を変えるとそれに応じてRemoteConfig値変更）、必ず必要となる**ので尚更意識する必要がある。
ユーザーリストも性質として一度その対象になったら永続的にそのメンバーとなるため、やはりこの場合はユーザープロパティを使わざるを得ないのが実情である。

参考：
[ユーザーリスト](https://support.google.com/firebase/answer/6317509?hl=ja)

以下、戦略を書いていく。

## 1. 将来的にも使用がせいぜい数カ所に限られる場合
そのまま以下のプロパティ名で設定する。

・ユーザのプロパティとして利用する場合
「プロパティ名」

・ABテストのフィルタとして利用する場合
「AB_画面名_ABテスト事象名」（*２４文字制限が非常にネックになる*）
→ RemoteConfig値もこちらと全く同じに合わすと運用しやすい。

## 2. 将来的にユーザープロパティ25個を超える可能性が少しでもある場合
この場合、1.のような戦略は当然難しい。

自身が考えているのは以下の戦略である。
**「ユーザーのプロパティとして15個、ABテストのフィルタとして10個。
計25個をユーザープロパティとして設定する。」**
→ ユーザーのプロパティは、それ自体の用途以外にもRemoteConfigと組み合わせてあえて設定する可能性があるため、多めにとる。

それぞれのネーミングは、「Prop1」「AB1」みたいなシンプルなものにし、管理をしやすくする。
→ それぞれの変数がどのように使われているかユーザープロパティの『説明』設定部分で管理する。

# 所感
やはりこのユーザープロパティの仕様は他でも不満が出ているし、Firebaseを考える上でもかなり致命的な気がする。。
仮に上記2.の戦略を適用したとしても、扱えるABテストは10個のみ。今後仕様の変更がなければ、正直きついと思う今日この頃です。


---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
Google Cloud for Goで OAuth アクセストークンを使う 


# 概要
[GoogleAPIを利用するデスクトップアプリのOAuth2.0認証](http://qiita.com/jkawamoto/items/a19361bff33607264c9f)では，アクセストークンの利用例として [Google APIs Client Library for Go](https://github.com/google/google-api-go-client) を使って利用可能な Zone リストを取得する方法を紹介した．

Go から [Google Cloud Platform](https://cloud.google.com/) にアクセスする方法には，[Google Cloud for Go](https://github.com/GoogleCloudPlatform/google-cloud-go) を利用する方法もある．
[Stackdriver Logging からログを取得する](http://qiita.com/jkawamoto/items/8e3e6c3e2a094a4ae214)や [Stackdriver Logging からログを取得する(その２)](http://qiita.com/jkawamoto/items/c8b9698572b858cfbe0f) で用いている [logadmin](https://godoc.org/cloud.google.com/go/logging/logadmin)，[logging](https://godoc.org/cloud.google.com/go/logging/apiv2) パッケージはこの Google Cloud for Go ライブラリに含まれている．

本記事では，取得した OAuth 2.0 アクセストークンを，Google Cloud for Go のクライアントから利用する方法を紹介する．

# Google Cloud for Go のクライアント
[Google APIs Client Library for Go](https://github.com/google/google-api-go-client) では，アクセストークンが付与された http.Client を渡すことで，そのトークンを使用していた．
一方 Google Cloud for Go のクライアントでは，[TokenSource](https://godoc.org/golang.org/x/oauth2#TokenSource) を接続オプションとして `NewClient` に渡すことで使用する．

[oauth2.Token](https://godoc.org/golang.org/x/oauth2#Token) 型のアクセストークンから TokenSource を取得するには，前回同様 [Config](https://godoc.org/golang.org/x/oauth2#Config) を利用する．Config に認証に必要な情報を渡していることで，アクセストークンの期限が切れていた場合に自動で更新を試みてくれる．

例えば，アクセストークンを使って [logging.Client](https://godoc.org/cloud.google.com/go/logging/apiv2#Client) を作成するには次のようなコードになる．


```go
import (
	"context"

	"cloud.google.com/go/logging/apiv2"
	"google.golang.org/api/option"
)

const (
    authorizeEndpoint = "https://accounts.google.com/o/oauth2/v2/auth"
    tokenEndpoint = "https://www.googleapis.com/oauth2/v4/token"
    gcpScope = "https://www.googleapis.com/auth/cloud-platform"
)

func NewLoggingClient(ctx context.Context, token *oauth2.Token) (*logging.Client, error){

	cfg := &oauth2.Config{
		ClientID:     ClientID,
		ClientSecret: ClientSecret,
		Endpoint: oauth2.Endpoint{
			AuthURL:  authorizeEndpoint,
			TokenURL: tokenEndpoint,
		},
		Scopes:      []string{gcpScope},
	}

	return logging.NewClient(
		ctx,
		option.WithTokenSource(cfg.TokenSource(ctx, token)))
}
```
Firebaseプロジェクトを開発環境用と本番環境用にシンプルに分ける方法

# 背景
Firebaseプロジェクトを運用していく上で、当然開発環境と本番環境を分ける必要が出てくる。
以下の記事も参考に一番簡単な方法で開発環境を分けた。

参考：
[Organizing your Firebase-enabled Android app builds](https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html)
[Managing Development Environments with Firebase](https://web.archive.org/web/20160310115701/https://www.firebase.com/blog/2015-10-29-managing-development-environments.html)

# 一番簡単な方法
1. 開発環境用と本番環境用のそれぞれのFirebaseプロジェクトを作る
https://1.bp.blogspot.com/-26CUGKjbZCI/V8XI9EWe8kI/AAAAAAAAANw/FrhuMzwsfbYYInR41jWlFG1guzW5fOmhwCLcB/s1600/image02.png

2. それぞれのプロジェクトの google-services.json を取得

3. `app/src/debug` 直下に開発環境用のjsonファイル、`app/src/release` 直下に本番環境用のjsonファイルを置く

以上で、開発環境用と本番環境用に分けたFirebaseプロジェクトを作ることができます。
なお参考記事では、productFlavorsを使ってより詳細に環境を分けている記述もあるので良かったら参考にされてみては？と思います

# その他
開発環境と本番環境を１つのFirebaseプロジェクトでトライされている記事もありますね
[Firebase Analyticsを本番環境とテスト環境で使い分ける](http://qiita.com/s_emoto/items/f8021275a2d3c2bf51ad)


---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
Firebase Analyticsのイベントの種類（コモンイベントとカスタムイベント）

# Firebase Analyticsのイベントの種類
以下の２つが存在する。

## コモンイベント
Firebaseが独自に用意しているイベント
パラメータは、各イベントで指定されているエクストラパラメータ及び独自に定義したカスタムパラメータを設定することが可能

コモンイベント及びそのエクストラパラメータの組み合わせは以下のようになる。
https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#SELECT_CONTENT

## カスタムイベント
自分たちで独自に定義できるイベント
パラメータは、独自に定義したカスタムパラメータを設定することが可能

参考：
[イベントのログを記録する](https://firebase.google.com/docs/analytics/android/events#log_events)

# 正直思うこと
Firebaseがコモンイベントを何故あえて用意しているか現状は理解出来ていない。
何故なら、SELECT_CONTENTを除き、Webコンソール上でイベントパラメータが反映されないことなどカスタムイベントと基本的に機能に差異はないからである（[参考記事](http://qiita.com/hinom77/items/9e7ab2880a12858a3d03)）
カスタムイベントで自由度の高いネーミングが使えることに対して、コモンイベントではそれも縛られる。
SELECT_CONTENT同様に、コモンイベントのみ付加するイベントパラメータがWebコンソール上で反映されるということが、将来的にあるのでしょうか？

---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
Firebase Analyticsのイベント名戦略（他のAnalyticsツールとの共存検討）

# 背景
Firebase Analyticsの使用を考えたときに、Google AnalyticsやAdobe Analyticsなど他のAnalyticsツールと併用して使用されることが多々あると思われる。
その場合、イベント事象を一元管理できたほうがありがたい。
また、それら他のAnalyticsツールを考えた際、殆どの場合PVイベントを有している。

# イベント名の命名規則
以上の背景より、自身の携わったプロジェクトでは以下の命名規則を導入した。
基本的にイベントもコモンイベントはほぼ使わず、原則カスタムイベントで他のAnalyticsツールとの併用も行えるよう以下の命名規則で統一した。

・PV
**「pv_画面名」**

・PV以外のイベント（クリックなど）
**「event_画面名_イベント事象名」**

なお、イベント名は40文字までなので文字数に注意を払う必要がある。
https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event?hl=ja


---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
Firebase AnalyticsのイベントプロパティはWebコンソールで反映されない

# 問題
**イベントと一緒に発火されたプロパティの状態や統計情報をWebコンソール上で確認することができない。**（２０１７月４月現在）
**Webコンソール上で確認できるのはあくまで発火されたイベントのみである。** 
有料オプションでBigQueryを導入すれば、イベントプロパティの測定も可能になるとのこと。

参考：
[Pricing](https://firebase.google.com/pricing/)
[イベントのログを記録する](https://firebase.google.com/docs/analytics/android/events#log_events)

なお、ユーザーリストで条件となるイベントとそれに付随するパラメータを設定すると、設定以後のそのパラメータ条件でのイベントの件数については一応取得はできる。

# 例外イベント
Firebaseのコモンイベントである*SELECT_CONTENT*に関しては、付加したCONTENT_TYPEパラメータがWebコンソール上で反映することがわかっています（もしかしたら他にもあるかもしれません。もしあったら情報提供欲しいです。）
https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#SELECT_CONTENT

**それ以外のコモンイベントもいくつか試してみていましたが、Webコンソール上でパラメータが反映されたものは自分の試した中ではありませんでした。**


---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
Swift3でTwitterのタイムラインを取得EP3(Xcode編-1)

#前回のおさらい
[EP3(Twitterツールの導入アプリ側)](http://qiita.com/thimi0412/items/b7911ce14a0aa4475154)

#Xcodeでの操作
1.以下の画面表示に従ってXcode場で操作をします。
※?マークを押すと操作の説明がでます。（英語ですが(^_^;)）
<img width="325" alt="スクリーンショット 2017-05-05 2.49.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/3ef85270-e785-73f3-4e56-abf800e4d4ff.png">

2.Xcode上のBuildPhasesの+(プラスボタン)をクリックしRunScriptを選択。
Shellは/bin/shにする。(私の場合は既にそうなっていました)
アプリ側に表示されているコマンドをコピーし貼り付けビルドします。
<img width="756" alt="スクリーンショット 2017-05-05 3.00.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/468308a0-62fc-94ac-9ec6-2401298e6943.png">

3.ビルドが成功するとアプリ側では以下の画面が表示されます。
画面上のカバンのアイコンをドラッグしてプロジェクト内にドラッグ&ドロップしましょう。
<img width="325" alt="スクリーンショット 2017-05-05 3.01.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/a225b2f3-9b76-bf55-ee34-fdac1f9eed8b.png">

注意
**Destinationのチェックは外す**
**Create groupsにチェックを入れる**
<img width="733" alt="スクリーンショット 2017-05-05 3.01.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/a283403c-036d-5806-8c7b-ca7199af0ead.png">

4.以下のような画面になればOK!
<img width="1013" alt="スクリーンショット 2017-05-05 3.20.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/8049e742-e964-069b-2ad8-9b037d476173.png">

今回はここまで！次回はキットを実際に使っていきます。

#索引
[Fabric導入編](http://qiita.com/thimi0412/items/6b1c50a45811d9bc7a35)
[Twitterツール編](http://qiita.com/thimi0412/items/b7911ce14a0aa4475154)
Firebase AnalyticsのログがWebコンソール上で反映されない問題（非常にハマった）

# 問題
リリース間近、AnalyticsのイベントログがWebコンソール上に反映されないことがあり、ハマった。
テスト観点を洗い出し、各状態についてそれぞれテストし、原因を突き止めた。

# 洗い出されたテスト観点
・端末依存
・通信状態
・端末のOSバージョン
・端末の時間設定
・Google Playへのログイン有無

# テストの実施結果
**1. 端末の時間設定が異常なとき**
**2. 端末上でGoogle Playへのログインがないとき**
以上のとき、発火したイベントはWebコンソール上で全く反映されない！

# 理由
1.については以下のページにそのような仕様であると書いてある。
[デバッグモードの有効化](https://firebase.google.com/docs/analytics/debugview?hl=ja#enabling_debug_mode)

```
重要: DebugView を使用する前に、端末の時刻が正確であることを確認してください。
端末の時計がずれていると、Analytics のレポートでイベントが遅延したり、欠落したりする
原因になります。
```

2.についてはFirebaseの仕様によるものだろう。
Google Playの広告IDを使用して、Analyticsにユーザ情報を反映させているため、ログインせず、その広告IDがとれないとAnalyticsへの反映もなし得ないということなのだろうと思う。
[Firebase: データ収集](https://support.google.com/firebase/answer/6318039?hl=ja)

# 余談
このテストを如何に行ったかというと、Firebaseプロジェクトを上限である10個作り、各テストごとに google-services.json のFirebaseプロジェクトのパスを変更して、DebugViewやStreamViewでWebコンソール上にデータが反映されるかを測定する形式でテストを行った。
なかなか労力を要したので二度と行いたくないテストではある。。

---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
Alfresco あんちょこ꒰｡･ω･`;꒱ 

# Alfresco 5.2

- 5.2.0 (r135134-b14) Build 201702
- @ Ubuntu 14.04.2 on VirtualBox

## Download

- Ubuntuは公式サイトよりダウンロード
- Alfresco Community(無償版）は[Download and Install Alfresco(公式サイト)](https://community.alfresco.com/docs/DOC-5792-download-and-install-alfresco)からインストーラをダウンロード
- ~~メール登録必要~~ →　"Maybe Later"を選択すれば不要

## How to install 

- インストーラ（alfresco-community-installer-201702-linux-x64.bin）を実行
- 詳細はこちら...[Installing Alfresco Community Edition on Linux](http://docs.alfresco.com/community/tasks/simpleinstall-community-lin.html)
- 最低構成として、CPUは2Core Memoryは4G以上推奨
- ~~英語版に日本語適用した場合は、うまくいかない？　（Authentication系のエラーとなる）~~

```bash:console
$ chmod +x alfresco-community-installer-201702-linux-x64.bin
$ ./alfresco-community-installer-201702-linux-x64.bin
#=>インストール先は /opt/alfresco-community
```
## 動作確認

- URL=http://[Server IP or Hostname]:8080/share/
- USER ID=**admin** PSWD=インストーラで設定したもの
- デフォルトインストールのFirefoxで確認しようとしたら、Profileが壊れたので、Chromeにて確認できた。

## How to Start

### Manual

```bash:console
$ /opt/alfresco/
$ sudo ./alfresco.sh start
```

### Auto-Settings

-  インストールした時点でデーモンに登録されている様子

----

# リファレンス

- [Alfresco Documentation](http://docs.alfresco.com/)

----

# Access to Alfresco via Restful API

- [RESTful API reference@Alfresco Documentation](http://docs.alfresco.com/4.2/references/RESTful-intro.html)
- テスト方法:MacOSX → Alfresco@Ubuntuにアクセスする

## ログイン

```rb:sample_login.rb
require 'json'
require 'rest-client' # gem install rest-client

TARGET_HOST = 'http://[Server IP or Hostname]:[Port]'
LOGIN_URL = TARGET_HOST + '/alfresco/service/api/login'

USER = 'admin' # ユーザー指定
PASSWORD = 'admin_pswd'

def login(user, password)
  begin
    response = RestClient.post LOGIN_URL, {'username' => user, 'password' => password}.to_json, :content_type => :json, :accept => :json
    @alf_ticket = 'alf_ticket=' + JSON.parse(response)["data"]["ticket"]
    puts @alf_ticket
  rescue => e
    puts e
  end
end

login(USER, PASSWORD)
```

```bash:console
$ ruby sample.rb 
alf_ticket=TICKET_95aec2355e94662cf687bf2475c84888fad32c32

```



----

# バージョン情報確認

- **http://[Server IP or Hostname]:8080/share/proxy/alfresco/api/server**にアクセスする

```json:version_info
{
   "data":
   {
      "edition": "Community",
      "version": "5.2.0 (r135134-b14)",
      "schema": "10005"
   }
}
```
----

# Docker 

- [pdubois/docker-alfresco](https://hub.docker.com/r/pdubois/docker-alfresco/)


----

## 役に立った情報
- [Alfresco勉強会@connpass](https://alfresco-study-group.connpass.com/)
- [qiita AlfrescoのREST APIを活用する by SavingThrow様](http://qiita.com/SavingThrow/items/2f6f84e7d9c25afbf359)
PixiJS自分用メモ


# PixiJS自分用メモ
(たぶん少しずつメンテする)

http://www.pixijs.com/
https://github.com/kittykatattack/learningPixi

## スプライト
### 位置

```js
sprite.x = 100;
sprite.y = 200;
```

```js
sprite.position.set(100, 200)
```

### サイズ

```js
sprite.width = 80;
sprite.height = 120;
```

```js
sprite.scale.x = 0.5;
sprite.scale.y = 0.5;
```

```js
sprite.scale.set(0.5, 0.5);
```



### 回転

```js
sprite.rotation = 0.5;
```


アンカーポイント

```js
sprite.anchor.x = 0.5;
sprite.anchor.y = 0.5;
```


# ローディング
```js
PIXI.loader
  .add([
    "image/image0.png",
    "image/image1.png",
    "image/image2.png"
  ])
  .on("progress", (loader, resource)=>{
    console.log("progress: " + loader.progress + "%"); 
  })
  .load(()=>{
    console.log("completed.");
  });
```

しかる後に以下のようにしてスプライトを作成することができる。

```js
var sprite = new PIXI.Sprite(PIXI.loader.resources["image/image01.png"].texture);
```

loaderを使わないお便利メソッドパターン

```js
var sprite = PIXI.Sprite.fromImage("image/image01.png");
```

なお、loaderとお便利メソッドを併用することは避けるべきのようだ。

http://www.html5gamedevs.com/topic/16019-preload-all-textures/?p=90907

> Just use the loader values if you are using the loader. If you don't want to preload and want to just create a sprite from arbitrary string urls, then use the convenience methods. DON'T MIX THEM PLEASE!! It only works under very specific circumstances and most of the time will be broken or duplicate objects in memory. The two APIs are not related, using the loader to warm the internal texture cache for use with those methods is a hack and should not be used in production code. The texture cache for convenience methods is private and could change at anytime DO NOT RELY ON THIS BEHAVIOR.



# テキスト

```js
var message = new PIXI.Text(
  "こんにちはPIXI!",
  {fontSize: 64, fill: "white"}
);
message.position.set(10, 10);
container.addChild(message);
```
Swift3でTwitterのタイムラインを取得EP2(Twitterツール編)

#前回のおさらい
[EP1(Fabric導入)](http://qiita.com/thimi0412/items/6b1c50a45811d9bc7a35)

#アプリケーションでの操作
1.ダウンロードしたアプリケーションを起動すると以下のようなログイン画面が表示されます。Fabric登録した際のメールアドレスとパスワードを入力しログインしましょう。
<img width="327" alt="スクリーンショット 2017-05-05 2.13.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/e44bdb5e-7f43-b18d-0261-a04188afcdad.png">
※ログイン画面が表示されない場合は画面したの電源ボタンを押してください。

2.ログインするとプロジェクト選択画面が表示されるのでプロジェクトを選択して、Nextをクリックしましょう。既にあるプロジェクトが表示されているので、プロジェクトを作成していない場合は作成しましょう。
<img width="324" alt="スクリーンショット 2017-05-05 2.17.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/4ee59eeb-6d75-c6ca-37d9-c1c491fe0636.png">

3.導入するキットの選択画面に移るのでTwitterを選択しましょう。
<img width="327" alt="スクリーンショット 2017-05-05 2.29.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/ef83ad3b-984e-a4fb-552a-a763f1741f1d.png">

4.選択をするの以下の画面になり表示されている手順をXcode上で操作をしましょう。
<img width="325" alt="スクリーンショット 2017-05-05 2.49.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/2ad4fc64-2429-67d8-7d99-0c2b3e655274.png">

Xcode上での操作は次回で！！
Firebase Analyticsのリアルタイムでの詳細なデバッグ方法

# 問題点

Firebaseのイベントのデバッグをしようと思うと、従来タイムラグが発生していた。
アプリ内で発火したイベントが反映されるのは、**Webコンソール上で２４時間ほどを待たなければならず**かなりの時間がかかっていた。

更に課題としてあったのが、**Webコンソール上のイベント項でイベントに付加したパラメータの状態を確認できない**（２０１７月４月現在）ことである。
Webコンソール上で発火したイベントはわかっても、基本的に付加したパラメータが何でどのような値だったかは確認できない。

# 1つ目のデバッグ方法（AndroidStudio DebugLogツール）
これに対する打ち手として、Android StudioのlogcatからAnalyticsのデバッグをする方法がある。
Android Studio上の"Terminal"で以下のコマンドを打ち込み、logcatを確認すると**イベントとパラメータがローカルでどのように発火したか、ユーザプロパティに何が設定されたか**を確認することができる。

```
adb shell setprop log.tag.FA VERBOSE
adb shell setprop log.tag.FA-SVC VERBOSE
adb logcat -v time -s FA FA-SVC
```

引用：
[Android Studio のデバッグログでイベントを表示する](https://firebase.google.com/docs/analytics/android/events?hl=ja#view_events_in_the_android_studio_debug_logソール)

# 1つ目のデバッグ方法の問題点
このデバッグ方法だと、ローカル内でのイベント発火は測定できるが、それがリモートのWebコンソール上でそもそも反映されているか、反映されている場合どのように反映されているかを確認することはできない。

また、ユーザプロパティの状態も今どのようなプロパティが設定されているかを確認しながらデバッグすることに手間がかかる。

# 2つ目のデバッグ方法（Debug View）
上記の打ち手の機能として、現状これが最適で導入も簡単なのでその方法を是非とも共有したい。
2017年2月終わりくらいに導入されたのでまだ知らない人もいるかもしれない。

Android Studio上の"Terminal"で以下のコマンドを打ち込み、Webコンソール上のDEBUGVIEW項を確認するだけで**イベントとパラメータがどのように発火しFirebaseコンソールに送られたか、ユーザプロパティの状態遷移がどうか**をリアルタイムに確認することができる。

```
adb shell setprop debug.firebase.analytics.app <package_name>
```

引用：
[デバッグモードの有効化](https://firebase.google.com/docs/analytics/debugview?hl=ja#enabling_debug_mode)

# その他
DEBUGVIEWの解説としては以下の記事もイメージをつかむ面でも非常に参考になります。是非とも併せて読んでいただけたらと思います。
[wootan's diary: FirebaseのStreamViewとDebugViewをつかってみた](http://wootan1102.hatenablog.com/entry/2017/03/14/201540)


---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
フォームから受け取った情報を出力する｜PHP学習メモ

#フォーム作成
```
<form action="送信先ファイル" method="post" or "get"></form>

   <input type="text" name="入力データにちなんだ名前" value=""></input>
```

#送信先から、受け取った情報を出力
HTMLファイルに書き込んでいくため、<?PHP...?>を忘れないこと。

```
<?php

echo $_POST["nameに指定した名前"];

?>
```
受け取った情報は、連想配列で収集されているため、出力をする時には送信した$keyの部分を指定して呼び出す。

```
$_POST[*]   *→取り出したい$valueの$keyを入力
```
Swift3でTwitterのタイムラインを取得EP1(Fabric導入編)

#はじめに
こんにちは初投稿です。今回は卒研でTwitterをSwift扱う関係でFabricの導入を行います。

#開発環境
・MacBook Pro (Retina, 13-inch, Early 2015)
・macOS Sierrra(Version.10.12.4)
・Xcode(Version 8.3.2 (8E2002))

#Fabricとは
**Fabric**はTwitter社が開発者向けに提供しているプラットフォームです。
[詳しい概要](https://blog.twitter.com/ja/2014/1023fabric "概要")
Fabricを使うとタイムラインの取得やユーザ承認が簡単に行うことができます。

#Fabricの導入
1.以下のURLからアクセスをしてサイト右上「GET FABRIC」をクリック
https://get.fabric.io
すると、以下のような登録フォームが表示されます。
<img width="415" alt="スクリーンショット 2017-05-05 1.39.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/df2b70b9-36f9-e54e-4101-82337796beb9.png">
Fabricを使うにはユーザー登録が必要になるので、メールアドレス、パスワード、
名前、所属を入力して確認メールを受け取りましょう。

2.確認メールのリンクから「View Details」をクリックする。
<img width="640" alt="スクリーンショット 2017-05-05 1.58.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/2ccb54f7-c413-f8ea-53eb-e0d847c99389.png">
アクセスしたサイトでチーム名の設定(最初は登録時に入力したチーム名が入力されています)、統合するプラットフォームの選択(iOS,Android,Unityから選択)を行います。
今回はiOSを選択。

その後以下の画面からzipダウンロードします。
※Macでは自動的に解凍されます。
<img width="469" alt="スクリーンショット 2017-05-05 2.07.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/dc178f68-3107-4101-3e2c-2ffee5724478.png">

#索引
[EP2Twitterツール編](http://qiita.com/thimi0412/items/b7911ce14a0aa4475154)
htmlを返すnode.jsのコードと簡単なHTMLのコード

現在のコードはこんな感じ

##Node.js

```
var http = require('http');
var fs = require('fs');


var server = http.createServer(function (request, response) {
    fs.readFile('./index.html', 'utf-8', function (error, data) {
        response.writeHead(200, {'Content-Type' : 'text/html'});
        response.write(data);
        response.end();
    });
});

server.listen(3000);
```

ほぼコピペなんで正しく理解できているかわからないですが

```
var http = require('http');
var fs = require('fs');
```

上のはモジュール（ヘッダーファイル的な何か）を呼び出していると思います。

他の部分は以下3つのパーツに分けられると思います。

```
var server = http.createServer(function1);
```

```
function1(request,response){
    fs.readFile('./index.html', 'utf-8', function2);
}
```

```
function2 (error, data) {
        response.writeHead(200, {'Content-Type' : 'text/html'});
        response.write(data);
        response.end();
}
```
というところまではわかっているけど
それぞれの役割はまだちゃんと理解できていないので要学習
→これよんだら理解できましたhttps://nodejs.org/api/

##HTML

```
<!DOCTYPE html>
<html lang="">
<head>
    <meta charset="UTF-8">
    <title>Untitled Document</title>
	<meta name="Author" content=""/>
	<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <h1>Test on Node</h1>


</body>
</html>
```

という非常に初歩的なものを使っています。
とりあえず今からjsをhtmlから呼び出して（？）使えるかテストしてみます。
→

下のを追加したらアラート出たので普通にjsは動きそうです。呼び出してはないけど理屈はそんなに変わらないでしょう、、、きっと
明日はmongoDBを触る予定（あくまで予定）

```
<script type="text/javascript">
    alert('TestAlert');
</script>
```


あと今まで一々AWS上にscpで上げてテストしていたのですが、
ぶっちゃけローカルとそんなに変わらないので
ローカルで散々遊び倒そうと思いました。

未だにGitを使う意味が見出せずにいる（元々scpの代わりに使おうと思っていた。）

2017/5/7 関数呼び出しの形を修正