OmniAICreator/Qiita-1.07M huggingface dataset:
RPGアツマールに公開するゲームをScalaで書く

この記事は、[dwango advent calender](http://qiita.com/advent-calendar/2017/dwango)の13日目の記事です。

# 導入

最近、スマホゲームが隆盛を極めていますね。
しかし、Android用、iOS用とアプリを作るのは骨が折れます。
そこで、HTML5なゲームを作れば楽なんじゃないか、と思っています。

リバースエンジニアリングしやすいとか、いろいろ課題はありますが、PCやスマホにダウンロードなりインストールなりしなければいけない、通常のゲームアプリケーションに比べると、HTML5ゲームはユーザーが遊びはじめるのにハードルが低いため、大きなメリットがあると思います。
PCやスマホの性能も上がっていますし、セキュリティ的にも比較的安全です。

一方で、Scalaは型があって、Javaより融通がきいて、個人的にとても好きな言語です。おすすめです。

ということは、ScalaでHTML5なゲームを作れたら楽しいだろう、という趣旨の記事になります。

ゲームは作るのも楽しいですが、人に遊んでもらうともっと楽しいので、最後にRPGアツマールへ投稿します。

## RPGアツマール
dwangoの運営しているゲーム公開サイトです。
RPGツクールで作ったゲームの公開に便利なよう[^1]ですが、ただのJSで書いたプログラムも動くようです。

## Why Scala.js?
Javaで使えてHTML5ゲームに対応しているフレームワークというと、libGDX。
しかし、libGDXは、JSに変換するのにGWTを使っているため、Scalaは使えません[^2]。

どうしてもScalaでゲームを作りたい。
ならScalaで生JSを吐けばいいじゃないか。

ということで、Scala.jsを使います。

## CreateJS
最近？[^3]メジャーバージョンアップしてWebGLに対応した神ライブラリ。
EaselJSは、特に2D描画をするのに便利で、普通の3Dライブラリと比べ、文字の描画や、複雑な図形描画が簡単にできます。

CreateJS配下には、音声出力を司るSoundJSや、
アニメーションを司るTweenJSなどがあります。

# とりあえず動くものを作る

## 準備
### インストールする
- [JDK](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
- [SBT](http://www.scala-sbt.org/0.13/tutorial/Setup.html)
- [Node.js](https://nodejs.org/en/download/)

が必要になります。

### サンプルプロジェクトのClone
https://github.com/sujoyu/scala-atsumaru を`git clone`してきます。

```sh
git clone https://github.com/sujoyu/scala-atsumaru.git
cd scala-atsumaru
```

`source-map`を有効にするために、

```sh
npm install
```

も走らせておきます。

### ScalaをJSに変換する
以下のコマンドを実行します。

```sh
sbt fastOptJS
```

`index-fastopt.html`をブラウザで開くと、ゲームが動くと思います。

### Scalaを書き換えたら自動で変換する
以下のコマンドを実行します。

```sh
sbt ~fastOptJS
```

敵の動きがイマイチですね。

https://github.com/sujoyu/scala-atsumaru/blob/master/src/main/scala/jp/sujoyu/atsumaru/Enemy.scala#L26

ここの関数を書き換えてみましょう。
`render`関数は、1フレーム毎に呼ばれます。
`deltaTime`には前回の描画から何ms後に描画されたかが渡ってきます。
`x`, `y`に敵機の座標を入れます。

コンパイルが終わったら、ブラウザをリロードしてみましょう。
思うように動きましたか？

### プロダクション用の最適化したJSに変換する
以下のコマンドを実行します。

```sh
sbt fullOptJS
```

`index.html`をブラウザで開くと、ゲームが動くと思います。

# RPGアツマールに投稿する

## 作ったゲームをzipに固める

以下のように、不要なファイルを除いたディレクトリ構造をつくり、zipに固めます。

```
.
├── index.html
└── target
    └── scala-2.12
        ├── scala-atsumaru-tutorial-jsdeps.min.js
        └── scala-atsumaru-tutorial-opt.js
```

## アップロードする
1. [RPGアツマール](https://game.nicovideo.jp/atsumaru/) にとびます
2. ログインします（アカウントがない場合は、お手数ですが作成してください）
3. 右上の ![スクリーンショット 2017-12-12 17.53.48.png](https://qiita-image-store.s3.amazonaws.com/0/126428/4ff5f59d-75fb-aa0e-f267-d32b5100ae2c.png) ボタンをクリックします
4. ![スクリーンショット 2017-12-12 17.55.32.png](https://qiita-image-store.s3.amazonaws.com/0/126428/87058b78-c5cc-32a1-39f3-fd7c7c31566b.png)<br>
`ゲームファイルアップロード`ボタンからアップロード、必要事項を入力します
5. `保存`ボタンをクリックし、数秒 ~ 数分待てば、投稿完了です

実際に投稿したゲームは以下です。
https://game.nicovideo.jp/atsumaru/games/gm5351?key=4372c6088ebe

# 最後に

今回のサンプルプロジェクトを土台にして、ゲームを作ると楽かもしれません。
最初は、敵の動きや弾の制御を作ると面白いかも。
タイトル画面やゲームオーバー、スコア辺りを実装するとSTGっぽくなってきます。

イマイチな部分も多いので、一から作ったほうが良いかもしれませんけどね。

皆さんがもっと手軽にゲームを作って、公開していける世の中になるといいですね。


[^1]: RPGツクールで作ったゲームをアップロードしたことがないので...
[^2]: GWTはScalaに対応していない。
  Scala+GWTというプロダクトもあるけど、ぜんぜん更新されてない...
[^3]: 最近時が経つのが早い
[cocoa] NSWorkspaceとは？

<p>先日のAKIBA.swiftで、macOSでURLを開くAPIが以下なのだが、NSWorkspaceって何？となったので調べてみた。</p>

<pre><code>let urlString = "http://www.bitz.co.jp/"
if let url = URL(string: urlString) {
    NSWorkspace.shared().open(url)
}
</code></pre>

<p>NSWorkspaceのWorkspaceは、macOSのFinderに相当する、NeXTSTEPのWorkspace Managerからきている。</p>

![openstepfilemanager2.png](https://qiita-image-store.s3.amazonaws.com/0/12540/c1baa0c8-bc27-2ca5-8d10-d49490f8d4e2.png)

<p>macOSでは"workspace"サービスを提供するのがNSWorkspaceクラスで、Finderの操作の機能をて提供している。</p>

関連情報
<a href="https://qiita.com/advent-calendar/2017/cocoa">Cocoa Advent Calendar 2017</a><br />
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk>note</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />
【Java】ソースの書き方のメモ


今日、新しい単語を一つ知った。
【コーディング規約】という言葉。
もちろん、現場による微妙な違いはあるかと思うけれど
すっきりしたソースにはやはり美しさのルールがありました☆

なかなかすぐには身に着かないけれど…先輩曰く
「チェックシートを作ってチェックする様に」との事。
早速このメモとは別にエクセルシートを作りました。

というわけで、メモメモ。


　■｛（波かっこ）の前に【スペース】
 
　■　、(カンマ)　の後ろに【スペース】
 
　■　=、＋、＜、＞、　の前後に【スペース】
 
　■　if文において、elseやelse ifは…ifの閉じかっこ　｝　の後ろにスペースをつけて続ける
 
      if(int i = 0; i < a.length; i++) {
      
      } else {
      
      }
      
 　■　インデントに心を配る（段落はどうなっているのか確認する）
【Java】クラス名の名付けのメモ


Javaでは、変数名と並んで鍵となる『クラス名』
誰とでもスムーズにやりとりできる…（以下略）


というわけで、基本をメモメモ。


　◆英単語で（日本語のローマ字綴り禁止！）
 
　◆”名詞”で15文字程度
 
　◆どんな働きをしているのか誰がみてもわかるように
 　(Calculator(計算機の意）みたいな）
  
　◆頭は大文字で始める
【Java】変数名の名付けメモ

現場による…と言われ続けておりましたが
いよいよ、今回の現場で先輩にしっかり教えられております。

本で読んで目にした事はあったけれど、改めて
「たくさんの人で開発する時使う言語である」
という事を胸に刻んで。別々の場所で開発する
誰とでもスムーズに受け渡しできる
そんな優しく美しいソースを書きたいものです。
百里の道も一歩から。というわけで、まずは基本をメモメモ。

　●英単語であること(日本語のローマ字読みはダメ！)
 
　●略す事が一般的になっている用語以外は略さない
 　(PDFは○。numberをnumってするのは×。）
  
　●添え字をつけない(result1、result2等は書いた人しかわらかないっ！)
  
　●25文字とかは長すぎるっｆ＾＾；　最大でも15文字程度に☆
  
　●誰がみても、何が代入されているものかわかる様に☆
 　(number…ではなく、入力された数字⇒inputNumbersの様に具体的に）
  
　●先頭の文字は小文字で始める
PeerCast プログラミング配信 Advent Calendar 2017 12日目

自分用メモ
配列をもっている構造体のコピーについて参考になったサイト
[構造体のcopy-関数は中身までコピーしてくれない](http://d.hatena.ne.jp/masatoi/20160119/1453194877)

多次元配列のコピー
[copy-array](https://stackoverflow.com/questions/7912232/how-do-you-copy-an-array-in-common-lisp)
WSLから名前付きパイプ経由でDocker for Windowsに接続する方法

# 概要

MSの公式ブログWindows Command Line Tools For Developersで紹介されている。
[[Cross Post] WSL Interoperability with Docker – Windows Command Line Tools For Developers](https://blogs.msdn.microsoft.com/commandline/2017/12/08/cross-post-wsl-interoperability-with-docker/)

この方法を使えば、Docker for Windowsでtcpのポート2375を晒さなくても利用できる。

WSLから直接接続するのではなく、Windowsの名前付きパイプ（Named pipe）に通信するNpiperelay.exeとWSLのソケット通信ツールのsocatを使って、Docker CLIからのUnix socketへの接続を変換する仕組み。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86855/48b40032-3c3a-442b-14e3-82c132676897.png)
（上記ブログより）

# ざっくり手順

1. go, socat, Docker CEをインストール
2. goでNpiperelay.exeをビルドし、Windowsディレクトリに配置（WSL側にシンボリックリンクを作成）
3. socatでDockerのソケット通信をキャプチャしてNpiperelay.exeへ渡すためのスクリプトを作成
4. 3.のスクリプトをバックグラウンドプロセスとして実行してDockerを利用する

```sh
$ #
$ # 1. go, socat, Docker CEをインストール
$ #
$ sudo apt update
$ wget -O - https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz | sudo tar -C /usr/local -xzf -
$ export PATH=$PATH:/usr/local/go/bin
$ sudo apt install socat docker.io -y
$ sudo adduser ${USER} docker
$ #
$ # 2. goでNpiperelay.exeをビルドし、Windowsディレクトリに配置（WSL側にシンボリックリンクを作成）
$ #
$ go get -d github.com/jstarks/npiperelay 
$ # パスは任意。ここではc:\hoge\ にnpiperelay.exeを作成
$ GOOS=windows go build -o /mnt/c/hoge/npiperelay.exe github.com/jstarks/npiperelay
$ sudo ln -s /mnt/c/hoge/npiperelay.exe /usr/local/bin/npiperelay.exe
$ #
$ # 3. socatでDockerのソケット通信をキャプチャしてNpiperelay.exeへ渡すためのスクリプトを作成
$ #
$ cat << EOS > ~/docker-relay
#!/bin/sh
exec socat UNIX-LISTEN:/var/run/docker.sock,fork,group=docker,umask=007 EXEC:"npiperelay.exe -ep -s //./pipe/docker_engine",nofork
EOS
$ chmod +x ~/docker-relay
```

ここで一度WSLを開き直して

```sh
$ #
$ # 4. 3.のスクリプトをバックグラウンドプロセスとして実行してDockerを利用する
$ #
$ sudo ~/docker-relay &
$ docker info
```

でホストが見えてればOK。


# 問題点

* クリーンな環境で何度か試したが、上記手順どおりやって全然動かない時が多々ある。
* 一度コマンドが通ったら比較的安定する。
* socatとNpiperelay.exeの間で何か起きてそう。
* 再現性が突き止められてないが、WSLを開き直したり何度か試してるうちに使えるようになったり…。
* docker.ioだとCLIのバージョンが古いが、ブログでは1709ではバグってるぽいと言及。
* docker-ceの17.09.1を入れて試したが、一応動いてはいる。
* docker.ioを`apt remove docker.io`で削除しようとするとエラーになる罠がある。

# 追記(2017-12-20)

Unix SocketがWSLでサポートされるみたいなので、WSL側でDockerデーモンを動かせるようになる日が来るかも？

[AF_UNIX comes to Windows – Windows Command Line Tools For Developers](https://blogs.msdn.microsoft.com/commandline/2017/12/19/af_unix-comes-to-windows/)
GitのCUI最強クライアント「tig」のインストール(Mac)

## 「tig」とは？
GitのCUIクライアントです。
おそらくですが、名前は「git」を逆さまにしただけだと思います。
遊び心があっていいですね。

## 環境
- OS：macOS High Sierra 10.13.1
- Git：git version 2.3.2
- tig：tig version 2.3.0-12-gec9434a

## セットアップ
### インストール
GitHubからソースコードをダウンロードし、ビルドします。
私の場合、 `/usr/local/bin` にインストールしたかったので、プリフィックスを付けました。
何も付けずにビルドすると、 `$HOME/bin` にインストールされるので注意しましょう。

```bash
$ git clone git://github.com/jonas/tig.git
$ cd tig/
$ make prefix=/usr/local
$ sudo make install prefix=/usr/local
Password:
   INSTALL  src/tig -> /usr/local/bin
   INSTALL  tigrc -> /usr/local/etc
```

Macの場合、Homebrewで簡単にインストールすることもできます。

```bash
$ brew install tig
```

ただ、バージョンが古い可能性もあるため、最新版を使いたい場合はソースコードからビルドした方が確実です。

### バージョンの確認
インストールできたかどうか、バージョンを確認してみます。

```bash
$ tig --version
tig version 2.3.0-12-gec9434a
```

バージョンが表示されているため、インストールに成功しています。

### インストール先の確認
念のため、インストール先を確認します。

```bash
$ which tig
/usr/local/bin/tig
```

指定した通り、 `/usr/local/bin` にインストールされています。

### tigの起動
Gitリポジトリへ移動し、 `tig` コマンドを実行するだけで起動します。

```bash
$ tig
```

## 参考リンク
- [tig/INSTALL.adoc at master · jonas/tig](https://github.com/jonas/tig/blob/master/INSTALL.adoc)
ストアでの説明文やアップデート文で正しいプロダクト名を書けていますか？

# はじめに

以前からApp Storeを見るたびに個人的に気になっていることを書かせて頂きます。

# App Storeで正しいプロダクト名を書けていますか？

正しいプロダクト名とは何でしょうか。
App Storeのアップデートページからサンプルをいくつか持ってきましたので、そちらを例にご説明します。

## 正しい例

<img src="https://qiita-image-store.s3.amazonaws.com/0/11090/c5b4ae23-c776-3572-cf6f-5481bcd328ca.png" width=50%>

> iPhone X

OKです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/11090/061d8edd-226a-4bc0-4c9e-673a47039844.png" width=50%>

> iOS 11
> iPhone X

Apple公式アプリですから当然ですね。

<img src="https://qiita-image-store.s3.amazonaws.com/0/11090/66ce92c6-4456-a739-20ab-10819b9c2a02.png" width=50%>

> iPhone X
> iPhone 5, iPhone 5s, iPhone SE

私がリリースしたアプリも当然正しく書いています。

## 正しくない例

<img src="https://qiita-image-store.s3.amazonaws.com/0/11090/fdc5611a-7944-cc22-04a5-09396fae3042.png" width=50%>

> iOS7

大手のアプリでも書けていないこともありますね。

<img src="https://qiita-image-store.s3.amazonaws.com/0/11090/641dbbd1-460e-2c25-1532-26924656c81f.png" width=50%>

> iOS11
> iPhoneX

若干、残念な印象を受けてしまいます。

# 正しいプロダクト名って？

例をご覧になった方はお気づきかと思いますが、大体のプロダクト名はメインとなるプロダクトといわゆるバージョンやエディションの間にスペースが入っています。

> iOS 11
> iPhone X

### iOSに限らなくても、以下の通り

> Windows 10
> Oracle Database 12c

### 大文字小文字も製品名によって様々

> VMware

大抵は公式サイトの記述を見ればわかります。

# 私はこう思います

これまで全く気にしていなかった人からすると、本当に些細な話かもしれません。
社内のメールやチャット、ドキュメントなどでは本当にどのような記述でも、適当で構いません。相手に伝わればOKです。

ですが、普段みなさんは細部まで磨き込んだアプリを開発されているかと思います。
そして、その磨き込みはアプリ本体だけではなく、App Storeなど利用者の目に触れる部分についても同様に考えるべきだと思っています。

チーム体制によっては開発チーム以外のディレクターチームがストア申請やリリース文言を作成する場合もあります。そのようなチーム体制でもリリース前にクロスチェックするなど、コミュニケーションが取れるようなフローを検討してはいかがでしょうか。

# 最後に

当初、RxSwiftの記事を予定していましたが、諸事情のためこちらの記事にかえさせて頂きます。
今後ともよろしくお願いいたします。
VSCodeの拡張で仮想通貨のレートを見る拡張を作った

仮想通貨にハマりました。
今もレートを見て、ニヤニヤしています。
~~これがあれば仕事中、コーディングしながら~~
## 使い方
![coinchecker.gif](https://qiita-image-store.s3.amazonaws.com/0/46278/57bc8729-de2f-0600-96bf-ddc2b2bef3ac.gif)

こんな感じです。
ずっと表示しているバージョンで1日運用した結果、仕事にならないことが判明したので、気にならないように非表示にできるようにしました。
このバージョンで運用していないので、もしかしたら結局ずっと表示になるかもですし、表示しないとしないでかえって気になるかもしれません。

## ダウンロード先
とりあえずgithubにしかあげていません。
VSCodeの拡張も初めて作りましたし、typescriptもほぼ初めてだったので、コードは雑です。
node_modulesというものが必要っぽいですが、消してからアップしたので、本当に使いたい場合はご自身でなんとかされてください。
まあ、こういうものがつくれるんだという参考になればと思います。

https://github.com/ShunMc/coinchecker-vscode
MPI用のstd::coutのようなもの

これは多分[MPI Advent Calendar 2017](https://adventar.org/calendars/2548)の12日目の記事です。

# はじめに

わりと過疎ってる感のある[MPI Advent Calendar 2017](https://adventar.org/calendars/2548)ですが、10日目に[MPIプログラムのデバッグ](https://qiita.com/nariba/items/2277c2eb428886eae80d)という記事が投稿されました。それを見て、「そういう奴作った！」と思ったので紹介します。

# MPIと標準出力

MPIを使っていると、標準入出力まわりは結構面倒です。馬鹿パラとかやってる時、出力順序はどうなってもいいから複数プロセスから適当に標準出力に吐きたい、ということがたまにあります。この時、

```cpp
printf("My rank is %d\n",rank);
```

とかやると、

```shell-session
My rank is 0
My rank is 3
My rank is 1
My rank is 2
```

などとなって問題ないのですが、

```cpp
std::cout << "My rank is " << rank << std::endl;
```

とかやると

```shell-session
My rank is My rank is 0
3
My rank is 1My rank is

2
```

などとなったりします。これは`printf`では一つのプロセスが書き終わるまで他のプロセスが待っているのにたいして、`std::cout`は、`<<`のタイミングで別のプロセスが割り込む可能性があるからです。

で、先の記事にあったようにOpenMPIの`--output-filename`オプションとか使うと便利なのですが、このオプションのないMPI処理系もあるし、各プロセスからの出力をファイルに吐きつつ、たまに標準出力にも吐きたい、なんてことがあるので、それ用のストリームを自作しました。

# MPIStream

というわけでできたのがこれです。

https://github.com/kaityo256/mpistream

動作原理は簡単で、`std::cout`の代わりに`mout`に突っ込むと、内部で`std::stringstream`にためておいて、`std::endl`が来たらランクに対応したファイルに出力しているだけです。

使い方はこんな感じです。

```cpp:main.cpp
#include <iostream>
#include <mpi.h>
#include "mpistream.hpp"

int
main(int argc, char **argv){
  MPI_Init(&argc, &argv);
  int rank, size;
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  mout.SetRank(rank,size);
  mout << "My rank is " << rank << std::endl;
  MPI_Finalize();
}
```

* `mpistream.hpp`をインクルードする。
* `mout.SetRank`に、自分のランクとトータルのプロセス数を渡す。
* 後は`std::cout`の代わりに`mout`に吐くと、`rXXXX.out`というファイルに出力される

実行するとこんな感じになります。

```shell-session
$ mpirun --oversubscribe -np 4  ./a.out
$ cat r*.out
My rank is 0
My rank is 1
My rank is 2
My rank is 3
```

ただし、トータルプロセス数が1の時には、`mout`に出力された内容は`std::cout`にも出力されます(`r0000.out`にも出力されます)。

```shell-session
$ ./a.out 
My rank is 0
```

デバッグ時にシングルプロセスで実行した時に`mout`が`std::cout`の代わりになるのでいろいろ便利です。

# まとめ

MPIプログラムで、`std::cout`と似たような感じで使えるストリームクラス`MPIStream`を紹介しました。自分のプログラムで使っていますが、地味に便利なので、もしみなさんもよかったら使ってやってください。
文字列リテラルのリストはstr.split()を使うと短く書ける

この記事は [Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017](https://qiita.com/advent-calendar/2017/python-short-code) の13日目です。

# はじめに

文字列リテラルのリストを作りたいときは、普通にリストを書くより[str.split()]を使うと短く書けます。

[str.split()]:https://docs.python.jp/3/library/stdtypes.html#str.split

# 普通に書いた場合

```pycon
>>> ['black', 'gray', 'white', 'red', 'green', 'blue']
['black', 'gray', 'white', 'red', 'green', 'blue']
```

# `str.split()`を使った場合

[str.split()]は引数で指定したセパレータで文字列を分割しますが、省略した場合はスペースで分割してくれます。

```pycon
>>> 'black gray white red green blue'.split()
['black', 'gray', 'white', 'red', 'green', 'blue']
```

スペースを含む文字列リテラルを作成したいときは、別の文字をセパレータとして使うと良いでしょう。

```pycon
>>> 'Amazon Web Services|Google Cloud Platform|Microsoft Azure'.split('|')
['Amazon Web Services', 'Google Cloud Platform', 'Microsoft Azure']
```


# 参考

- Python3 ドキュメント
    - ライブラリーリファレンス
        - [str.split()]
OneLoginのaccount ownerユーザーでログインできなくなったときの対処法

# Mappingsでやらかした

OneLoginにはMappingsといって、条件指定に合ったユーザーに対してユーザー情報のマッピングができる機能があります。
これでaccount ownerユーザーのAuthentication DirectoryをOneLogin以外のものにしてしまい、account ownerユーザーでログインできなくなってしまいました。

# どんなMappingsを設定したのか

OneLoginとLDAPを連携させていて、LDAPユーザーのユーザー情報をMappingsで設定しようとしていました。

![OneLogin.png](https://qiita-image-store.s3.amazonaws.com/0/135041/6f61b3cd-a76b-ab64-0a0a-541673d7d9f6.png)

LDAPにいるユーザーはすべてメールアドレスのドメイン部が `gmail.com` だから、全部この指定でいいやと設定しました。

このときは気づかなかったんですが、account ownerユーザーのメールアドレスも `gmail.com` なので、しっかり変更対象になっていました。。。
翌日、account ownerのセッションも切れてログインもできずという感じです。

他にSuper userのアカウントがいれば最悪なんとかなりますが、このときはSuper userがひとりもいない状態でした。

# 対処方法

## 対処法1: LDAPにaccount ownerユーザーのdnを追加する

幸運にも `dn` は同じMappingsで設定していたので、LDAP側にaccount ownerの　`cn` や `email attribute`を持ったユーザーを追加して認証が通るようにしました。

とりあえずAuthentication Directoryだけ変更して、また明日としていなくて本当によかった。

## 対処法2: OneLoginサポートで状況を説明したあと送付状を添付し別アカウントに権限を付けてもらう

対処法1が失敗した時の保険で、OneLoginにログインできるLDAPユーザーはいたので（しかしSuper userではない）、そのユーザーでサポートに連絡を取っていました。

* account ownerのユーザーのAuthentication Directoryを変更できないか
* このユーザーにSuper user権限の付与とaccount ownerの移譲ができないか

この２つを質問したところ、サポートからは以下のような提案をされました。
（Freeプランなのに30分程度で返答が来ました、ありがたや）

> We will need to have a letter of authorization form you so that we can re-eanle your access.
> 
> 1. Print a letter on your company stationery (with letterhead etc) and then include the request as follows:
>  "Could you please assign super-user privilege to user XXXX and set them as the account owner"
> 
> 2. Have the letter signed by a manager / HR etc
> 3. Scan the printed letter back in and then attach it to this ticket.
> 4. We should be able to accept this as authorisation for us to carry out the task.
> 
> Make sure you specify a name of someone who is able to log in and is not an LDAP user. 

レターヘッド付きの送付状をマネージャーのサイン入りで作って、それをスキャンして添付してくれれば、（たぶんCompany infoと照合して確認が取れれば）account ownerの付け直しをしてくれるそうです。

日本では印鑑文化なのでサインのみでいいのかとか、レターヘッドのみでどうやってその会社だと判別するのかとか不明な部分はありますが、これでいけるそうです。
詰みそうになっている方がもしいたらサポートに連絡してみましょう。

この応答は私の場合はこうだっただけで、必ずしも同じ提案をされるとは限らないので、そこはご注意ください。
BitVisor boot/uefi-loader-loginの使い方

最近追加されたboot/uefi-loader-loginの使い方について超カンタンに紹介します。

# boot/login-simpleとは

boot/uefi-loader-loginの前に、boot/login-simpleについて説明しておきます。これは、暗号化した設定ファイルを読み込む機能を持つBIOS環境用のブートローダーです。bitvisor.confファイルの内容を設定してmakeすると、パスワードの入力を要求され、module1.binとmodule2.binというファイルが生成されます。

```
$ make
gcc -m32 -Wall -s -Wl,-Ttext,0x8000 -nostdlib -nostdinc \
                -idirafter ../../include/share/ -o module1.bin asm.s main.c
gcc -Wall -idirafter ../../include -o config config.c loaddata.c \
                configparser.c
./config < bitvisor.conf > config.raw
./makedata config.raw > module2.bin
Enter password: 
Retype password: 
```

module1.binにはパスワード入力画面を表示してパスワード入力を行うプログラム、module2.binには暗号化された設定項目が入っています。これらのファイルをGNU GRUBのkernelおよびinitrdとして指定するか、または、boot/loaderを用いてインストールすることにより、起動時にパスワード入力画面が表示され、正しいパスワードを入力すると復号されてシステムが起動するという仕組みです。

Simpleと名前に入っているのは、simpleじゃないやつがあるからなのですが、それはboot/loginに入っているもので、Linuxを一時的に立ち上げてスマートカードで認証を行い、スマートカードから暗号化鍵を読み出してストレージ暗号化に使用したり、スマートカードの秘密鍵を利用してVPN接続をしたりするためのものです。Simpleはスマートカードを使わず、ストレージ暗号化やVPNの共通鍵などを含む設定全体を、共通鍵によって暗号化しておこうというアイディアによるものです。起動の仕組み自体はどちらも同じものを使用していますが、simpleはLinuxを使わず、入出力をすべてBIOSで行っていますので、コンパクトなサイズに収まっているだけでなく、USBコントローラーの初期化等も行わないため、認証後にUSBキーボードが使えなくなるなどの問題も発生しにくくなっています。

# boot/uefi-loader-loginとは

暗号化した設定ファイルを読み込む機能を持つUEFI環境用のブートローダーです。今のところ、BIOS環境でboot/login-simpleに実装されているもののUEFI版に相当します。

UEFI環境ではその仕様上、BIOS環境のようにLinuxを一時的に起動するというような手法を使うのは困難です。その代わり、理論的にはUEFIだけでスマートカードへの対応も可能と考えられます。よって名前にsimpleが入っていないようです。

認証を通過すると本プログラムはboot/uefi-loaderと同様に単に終了します。続けてオペレーティングシステムを起動するなどの処理を行いたい場合は、適切にBootOrderなどを設定しておきます。

# ビルド

boot/uefi-loader-loginのビルドは、makeを実行するだけです。MinGWクロスコンパイラーを使用します。

# 設定ファイルの準備

bitvisor.confを用意してboot/login-simpleをビルドしておいてください。出来上がったmodule2.binを使用します。

# インストール

boot/uefi-loaderの場合と同様に、boot/uefi-loader-loginに生成されたloadvmm.efiと、bitvisor.elfに加えて、module2.binを、UEFIファームウェアがアクセスできる同じディレクトリにコピーすれば完了です。USBマスストレージ等からの起動を行う場合は、loadvmm.efiを\EFI\BOOTディレクトリにBOOTX64.EFIというファイル名で置き、それ以外のファイルは同じディレクトリに名前を変えずに置きます。

# 起動

loadvmm.efiを起動するとパスワード入力を求める画面が現れますので、パスワードを入力してEnterキーを押すと先に進みます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/103733/b45f6ceb-bcc5-5e99-e3e9-2459f3718ac9.png)

パスワードを間違えるとエラーになり再度入力を求められます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/103733/704c7a1f-0e3a-6cdd-ff62-7f742d7f3dc1.png)

3回間違えると再起動しかなくなります。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/103733/c51c3b52-8763-3d91-e82e-279af7e79d49.png)

# 仕組み

実は実装の単純化のため、復号はVMM側で行っています。core/vmmcall_boot.cにあるルーチンが復号を担当します。

BIOS環境で追加モジュールがロードされている場合、VMMは各ドライバーをロードする前に (暗号化等が有効になる前に) 仮想マシンを開始し、追加モジュールを起動します。そのようにして開始されたmodule1.binはパスワード入力後、VMM呼び出しでそのパスワードをVMMに渡します。復号に成功したら、ドライバーのロードを行い、割り込みコントローラーなどのデバイスを一部再初期化して、仮想マシンもリセットして起動を継続します。

UEFI環境ではもっと単純です。本プログラムが使用された場合は、VMMは各ドライバーをロードする前に仮想マシンを開始し、仮想マシン上で制御をローダーに返します。ローダーがパスワード入力を行い、VMM呼び出しでVMMに渡します。復号に成功したら、ドライバーのロードを行い、引き続き実行を継続します。ローダーは最後の後始末を行い、終了します。デバイス等はUEFIファームウェアの制御下にあるままですので、リセット等は行いません。

# 制限

起動デバイスの暗号化にはまだ対応していません。ファイルシステムを再認識させる必要があります。
第8回梅キャンIoT勉強会について

# はじめに
[梅キャンIoT勉強会](https://studygroup-umecanoit.connpass.com/)とは、大阪工業大学梅田キャンパスの学生数人が主催するLT大会です。テーマは主に**IoT**ですが、ここで述べるIoTには**Internet or Things**の意味も含まれています。要は**技術っぽい話なら何でもあり**な感じの勉強会ですね。今回は第8回梅キャンIoT勉強会のレポートについて記述します。

# 第8回のまとめ
といっても[ここのページ](https://studygroup-umecanoit.connpass.com/event/71328/)に登壇者のみなさんが資料をあげてくださったので、詳しい内容や雰囲気はそちらを見て下さったらいいかと思います。

# 今回のトピック
主に出てきたメインワードはこんな感じです。

- Node-RED
- HoloLens
- スマートスピーカー

最新トレンドばかりが並びましたね。

# Node-RED
詳しい話は[こういった記事](https://qiita.com/zuhito/items/e9abfd6f1ba188f908ed)を読んで下さればいいかなと思います。
本勉強会ではNode-REDの紹介をしてくださいました。今後の開発ネタに期待です。

# HoloLens
詳しい話は[どっかに](http://ascii.jp/elem/000/001/276/1276860/)投げます。私も使ったことないので何の説明もできません。
今回のネタは、これでドローンを操作した話でした（すごくね？）

# スマートスピーカー
**Google home**やら**Amazon Echo**とか話題のアレですね。一つのスピーカーが全部の家電をコントロールする、**スマートホーム**のミニチュア的なものをデモンストレーションで見せてくださいました。すごかった。

# おわりに
かなり雑になりました。しかし私としては本勉強会ではどんな感じのトピックが発表されるのかを知ってもらえればそれで良いです。次回の第9回は12/19の予定です。
もし興味ありましたら[ここのページ](https://studygroup-umecanoit.connpass.com/event/73670/)まで。
Python - モジュールのヘルプの参照方法、インストールパスを調べる方法

Python モジュールの使い方を調べるときに、知っていると便利なことをまとめました。

# ドキュメントを読む

```
>>> from google.cloud import vision
>>> help(vision)
Help on package google.cloud.vision in google.cloud:

NAME
    google.cloud.vision

FILE
    /Users/hoge/anaconda3/envs/py27/lib/python2.7/site-packages/google/cloud/vision/__init__.py

DESCRIPTION
    # Copyright 2017, Google LLC All rights reserved.
...
```

# インタラクティブシェルでモジュールのオブジェクト一覧表示

http://pypi.python.org/pypi/pbp.scripts から「pbp.scripts-0.2.5.tar.gz」をダウンロードします。

```shell-session
$ tar zxvf pbp.scripts-0.2.5.tar.gz
$ cp -p pbp.scripts-0.2.5/pbp/scripts/pythonstartup.py ~/.pythonstartup
$ export PYTHONSTARTUP=~/.pythonstartup
```

[Tab]キーを押すとオブジェクト一覧が表示されます。

```python
>>> from google.cloud import vision
>>> vision.[Tab]
vision.Client(                vision.__init__(              vision.__subclasshook__(      vision.enums
vision.ImageAnnotatorClient(  vision.__name__               vision.__version__            vision.face
vision.__all__                vision.__new__(               vision._gax                   vision.feature
vision.__class__(             vision.__package__            vision._http                  vision.geometry
vision.__delattr__(           vision.__path__               vision.absolute_import        vision.get_distribution(
vision.__dict__               vision.__reduce__(            vision.annotations            vision.image
vision.__doc__                vision.__reduce_ex__(         vision.batch                  vision.likelihood
vision.__file__               vision.__repr__(              vision.client                 vision.safe_search
vision.__format__(            vision.__setattr__(           vision.color                  vision.text
vision.__getattribute__(      vision.__sizeof__(            vision.crop_hint              vision.types
vision.__hash__(              vision.__str__(               vision.entity                 vision.web
```




# モジュールの属性リストを取得

```
>>> dir(vision)
['Client', 'ImageAnnotatorClient', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__version__', '_gax', '_http', 'absolute_import', 'annotations', 'batch', 'client', 'color', 'crop_hint', 'entity', 'enums', 'face', 'feature', 'geometry', 'get_distribution', 'image', 'likelihood', 'safe_search', 'text', 'types', 'web']
```

# モジュールのパス確認

```
>>> vision.__path__
['/Users/hoge/anaconda3/envs/py27/lib/python2.7/site-packages/google/cloud/vision']
```
RiotタグとHTMLのグローバル属性

[Riot.js Advent Calendar](https://qiita.com/advent-calendar/2017/riot)に空きがあったので、過去の日付を埋めるように飛び入り参加してみました。

Riotタグには`opts`に与えるものとしての属性を指定できます…が、ものによっては思わぬ動作をすることがあります。

# Riotタグの属性

マウントしてから完全にJavaScriptで動かすような用途であれば全く関係しないのですが、ページの一部にRiotエレメントをはめ込むような使い方をする場合、あるいは別のRiotタグの内部でタグを使うような場合に、Riotタグにも属性を指定できます。例えば、`<some-tag foo='bar'></some-tag>`のように書けば、タグ内ローカルの`opts`変数や、タグインスタンスの`opts`プロパティ（両者は同じオブジェクトです）で、`opts.foo='bar'`となっています。

# 想定外の、ツールチップだらけ

で、あるときモーダルを表示するRiotタグを作って、`title`でモーダルのタイトルを指定するように指定しました。もちろんそれ自体は動いたのです…が、モーダルのどこにマウスカーソルを持っていっても、`title`で設定したものがツールチップとして出現する、という事態に見舞われてしまいました。

# グローバル属性

実は、HTMLタグには、いくつか「グローバル属性」という、Riotに使うような**HTMLの仕様にないタグにも適用可能な**属性があります。

* `id`…文書の要素にIDを振る。これは（タグ内で使うのではなく）Riotタグに振っても普通に便利。
* `title`…ブラウザではたいていツールチップとして表示される属性
* `lang`…中身の言語を指定する。RiotとHTMLで同じ意味を指定するなら問題なさそう。
* `translate`…ページを翻訳する際に、中身まで翻訳するか指定する属性
* `dir`…横書きの向きを指定する属性
* `class`…CSSのクラスを指定する属性
* `style`…スタイルシート指定の属性
* `on***`…イベント時のスクリプトを指定する属性

`id`や`class`、`style`はわかりやすいかと思いますが、うっかり`title`や`dir`をRiot独自の目的に使ってしまわないよう、注意が必要です。

# 参考文献

* [HTML 5.1 § 3.2.5 Global Attributes](https://www.w3.org/TR/html51/dom.html#sec-global-attributes)
gitlabにてURLにユーザを含めているにも関わらず、403エラーでpushできない

# 問題
git cloneでほかの人(AAA)の作ったレポジトリをクローンしてきて、変更をかけてpushしようとすると、以下のように失敗。  

```shell-session
git push origin master
remote: Access denied
fatal: unable to access 'http://KI1208@<IP>/AAA/repository.git/': The requested URL returned error: 403
```

上記レポジトリはpublicで公開されており、上記のURLやブランチ自体にはwebからアクセスして閲覧は可能。(そもそもgit cloneも可能だった。)

# 原因
Webからファイルを置こうとすると、権限不足で失敗するため、権限不足と判断。
![20171212_168.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/727b03aa-b978-da9b-c6cb-d3149a89d6f6.jpeg)  
![image](https://qiita-image-store.s3.amazonaws.com/0/159980/fbc43dfe-90dc-0c13-2c56-f6a5cca75643.png)

# 対応
rootでログインして、adminのページを開く。
![image](https://qiita-image-store.s3.amazonaws.com/0/159980/fb4f1a01-054c-7658-8125-6e0d04412a89.png)  

Settings→Membersから自分をDeveloper権限で追加
![20171212_165.jpg](https://qiita-image-store.s3.amazonaws.com/0/159980/bb365451-abd1-19ef-e222-cddad7063f9f.jpeg)

これでもう一度pushするとOK。

```shell-session
git push origin master
Counting objects: 1202, done.

```

もちろん、通常はrootの情報なんてもっていないはずなので、管理者の方に連絡する必要がありますね。

# 補足
同じ条件で調べると、異なるユーザ情報でログインしてしまっているケースが多かった。
解決策としては、以下のコマンドで、remote serverのURLに自分のユーザ名(USERNAME)を含めるというもの。
`git remote set-url origin https://USERNAME@github.com/AAA/repository.git`

たぶん自分のケースはより初歩的なので、それゆえにはまる人もいるかもしれない。
GCPのプロジェクト間でインスタンスを移行する

最近GCPのプロジェクト間でインスタンスを移行する作業を行いました。
その時の手順について記載します。

# 前提
* gcloudコマンドがインストールされていること。
* 移行元・移行先両方のプロジェクトに対し、編集者以上の権限があること。

# 手順
移行するインスタンスのスナップショットを作成する。

```
gcloud compute disks snapshot [移行元インスタンス名] \
  --zone [移行元インスタンスのゾーン] \
  --snapshot-names [作成するスナップショット名] \
  --project [移行元プロジェクトID]
```

作成したスナップショットからディスクを作成する。

```
gcloud compute disks create [作成するディスク名] \
  --zone [作成するディスクのゾーン] \
  --source-snapshot [作成したスナップショット名] \
  --project [移行元プロジェクトID]
```

作成したディスクからイメージを作成する。

```
gcloud compute images create [作成するイメージ名] \
  --source-disk [作成したディスク名] \
  --source-disk-zone [作成したディスクのゾーン] \
  --project [移行元プロジェクトID]
```

作成したイメージから移行先でインスタンスを作成する。

```
gcloud compute instances create [移行先インスタンス名] \
  --zone [移行先インスタンスのゾーン] \
  --image [作成したイメージ名] \
  --image-project [移行元プロジェクトID] \
  --project [移行先プロジェクトID]
```

以上でインタンスを別のプロジェクトに移行することができます。
実際の作業では、イメージ作成後にTerraformを利用してインスタンスを作成しました。

# 後片付け
不要であれば、作成したスナップショット・ディスク・イメージは削除します。

スナップショットを削除する。

```
gcloud compute snapshots delete [作成したスナップショット名] \
  --project [移行元プロジェクトID]
```

ディスクを削除する。

```
gcloud compute disks delete [作成したディスク名] \
  --zone [作成したディスクのゾーン] \
  --project [移行元プロジェクトID]
```

イメージを削除する。

```
gcloud compute images delete [作成したイメージ名] \
  --project [移行元プロジェクトID]
```
※書き途中※【入門メモ】Google Homeを買ったので、google-home-notifierのサンプルコードで遊んでみたメモ

#はじめに
Yahoo! HackDay初日、買い出しに行ったビックカメラで半額最終日のGoogle Homeに遭遇。
3,000円のGoogle Home Miniを衝動買いしました（もともと買うつもりだったけど）

せっかくなのでいろいろ遊んで見たい！

#開発入門
検索するとたくさん出てきますが、便利なライブラリが公開されており、よく使われているのは下記のNode.jsのライブラリのよう。

<a href="https://github.com/noelportugal/google-home-notifier">google-home-notifier</a>

（これをインストールするために新調して何もインストールしてなかったMacにようやくNode.jsインストールしましたwそして毎度のごとくパス通し忘れてCommand not found地獄に。）

#google-home-notifierインストール
##package.json作成
```
$ mkdir google-home
$ cd google-home
$ npm init
```
##google-home-notifierをインストール
```
$ npm install google-home-notifier
```


#サンプルコードで喋らせてみる
国際宇宙ステーション"ISS"が頭上を通過するときにGoogle Homeにハラショーと言わせる！

[スマートスピーカーIFTTT 大喜利 アドベントカレンダー](https://qiita.com/advent-calendar/2017/ssifttt)13日目です。


アメリカのドラマ「ビッグバンセオリー」をAmazon primeで毎日少しづつ見ています。
天才で変人のオタク男4人が情けない騒動を引き起こすというしょうもない内容なのですが、昨日見たシーズン5第24話は、マザコンのハワードがついに宇宙に行く感動的な回でした。
ISSにむかうロケットはソユーズで、パイロットのロシア人と、流暢なロシア語を喋るアメリカ人が同乗しており、どうやら3人でISSに滞在する模様です。
ISSっててっきりアメリカ主導だと思ってたら、立案は西側でも、途中からロシアが計画を牽引してるんですね。1989年に東西冷戦が集結してから28年、今やISSでアメリカとロシアが一緒に宇宙で観測や実験をしてるなんてすごい時代になったものだと思います。

そんな中、今日はすげえニュースが、、
ＮＡＳＡ、有人月面探査再開へ－トランプ氏が大統領令で方針転換
https://www.bloomberg.co.jp/news/articles/2017-12-12/P0TM416JIJUP01
ロシアと共同のISSじゃなく、アメリカ独自で月へ行くっていうのかい。
うーん、なんかの火種にならないといいですが。(^^;)


# IFTTTのSpaceアプレットは超おすすめ

## NASAのトリガー
IFTTTにNASAが提供してるSpaceというトリガーがあり、できること一覧が超クールです。
![スクリーンショット 2017-12-12 21.57.21.png](https://qiita-image-store.s3.amazonaws.com/0/173392/3fb52f8c-1bed-4a9c-3c8c-0f55b5c8de6d.png)


- 火星の季節が変わったとき
- 宇宙飛行士が戻ってきたとき
- 宇宙飛行士が船外に出たとき
- 天文写真、今日の一枚 by NASA
- NASAからの速報　
- ISSが特定の場所の上空を通過したとき
- 今日の写真 by NASA
- ISSの軌道状況レポート(?)



これらを使ったレシピ一覧は[こちら](https://ifttt.com/search/query/space)。
中でも特におすすめは、「[NASAの今日の写真が更新されたら、Androidスマホの壁紙を自動的に変える](https://ifttt.com/applets/165156p-automatically-set-your-android-wallpaper-to-the-nasa-image-of-the-day)」です。

自分も、[ISSが特定の場所の上空を通過したとき,Googleカレンダーに登録する](https://qiita.com/sitopp/items/023624ba5f24cb046219)というアプレットを作ってみました。それを使って数えてみたら、昨日は7回も日本近辺の上空を通ってました。

すげー！

そこで、上空を通過したら歓迎してあげようと思って、Google Homeに「ハラショー！」と言わせるアプレットを作りました。
「ハラショー」はご存知の通りロシア語です。
最初、ロシア語のキリル文字をパラメタに渡して見たのですが、エラーが出てしまったので、仕方なくローマ字で書きました。(^^;)

# やりたいこと


ISSが自分の家の上を通過する際に、
Google Homeが「ISSが通過します　ハラショー」と言う。


# システム構成

- IFTTT 
 - Space (NASA)
 - Webhooks
- Ngrok
- Raspberry Pi3
- Google Home mini

## Raspberry PiとNgrokのセットアップ

[先日書いた記事](https://qiita.com/sitopp/items/89add216c500de5ace4e#raspberry-pi3%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)の、**「Raspberry Pi3のセットアップ」と、「Raspberry Piをインターネットからアクセスできるようにする」**をやります。

なお、ngrokをバックグラウンドを動かす方法については、
こちらを参考にさせていただきました！

ngrokをバックグランドで動かす
https://hakengineer.xyz/2017/11/15/post-629/

## IFTTT作る


![スクリーンショット 2017-12-12 2.48.07.png](https://qiita-image-store.s3.amazonaws.com/0/173392/08341205-db48-8367-8607-5baa2d2fa0b9.png)
![スクリーンショット 2017-12-12 2.49.57.png](https://qiita-image-store.s3.amazonaws.com/0/173392/a8b63306-8fb3-3d11-a6d0-d49a77e880d0.png)
![スクリーンショット 2017-12-12 2.50.50.png](https://qiita-image-store.s3.amazonaws.com/0/173392/d271e8ff-8b27-4a58-73af-291cad7baffc.png)


### IF

- Trigger: space "ISS passes over a specific location"
- choose location:自分の家を地図上で指定

### then

- Action:Webhooks:MAke a web request
- URL: http://xxxxxx.ngrok.io/google-home-notifier<br>
 (RaspberryPi上で動いているngrokに割り当てられたサブドメインを指定）
- Method:post
- Content type: application/x-www-form-urlencoded
- Body:text="aieses ga tsuka shimasu harrasho"<br>
（日本語をローマ字読みで読ませるという苦肉の策）


# きました！

夕飯を食いながら、「ビッグバンセオリー」でハワードがISSの無重力で発狂する回を見てたら、突然Google Home miniが**「うにゃうにゃうにゃうにゃ、ハラショ！」**と言ってくれました。

## ハラショー！やったね！


以上です！
Goを初めてみたがSliceの壁に激突したので調べてみた


# きっかけ
vimconf2017に参加したり、使える幅が増えたGo言語に興味を持ち始め
昔に作ったツールを移植しようと a tour of go を始めてみる

# しかしSliceというものの理解に追いつかずぶつかる
そこでの気づきを残す事にした

# まず、正直な所そこで勉強をやめそうになる
他の言語がある程度使えると、今目の前の新しい言語への壁を乗り越えなくても作りたいものは実装できてしまう。

「まぁ ちょっと勉強する時間ないし今回は使える言語のリファクタでいいか・・・」
となりそうになる・・・

そうなると

#### 新しい言語の学習が遅れて、考え方などが古くなっていく
新しい言語や新しいバージョンには新しい考え方、より時代に即した考え方が導入されていることが多いと思う

昔話だけで流行りの言語がさっぱり分からなくないおじさんになりそう

を自覚したので前に進むべく勉強してみた。

個人的な考えに

**分かっている人にはなかなか分からない人の気持ちが分からないので分からないうちから書いておく！！**

という思いがあるのであえて
誰かの参考になったらいいなと・・・

# Goをはじめる
https://go-tour-jp.appspot.com/
を知り合いに進められて始めました :writing_hand:
もともとポインタの理解もあったのでそこそこ順調に進んだと思っていましたが

# スライス
https://go-tour-jp.appspot.com/moretypes/8
で激突:boom:

| スライスは配列への参照のようなものです

```Go
names := [4]string{
	"John",
	"Paul",
	"George",
	"Ringo",
}
fmt.Println(names)
```
まだSliceでもなく、ここまでは納得・・・

```Go
a := names[0:2]
b := names[1:3]
fmt.Println(a, b)
```
ここが謎

## え？なにが分からないの？
a := names[0:2]
a := names[1:3]
は第一引数はindexだと思うが第二引数が何を表してるのが分からず
names[1:3]の3はcapacityなら3つ要素が入るのでは？
なんで 0:2, 1:3の指定で入る要素数が一緒なんだろう
（indexのデータからcapacity分入れるものと思ってた）

色々なサイトを見てみたが

そういうもの風に書いてあるのが多かったので

# 「そもそも公式のリファレンスを読もうよ・・・」と心の声が聞こえる

で、たどり着いたのがこちら

> **[スライス](http://golang.jp/go_spec#Slices)**
次の形式は文字列、配列、配列へのポインタ、スライスのいずれかであるaをスライスする基本式です。
`a[low : high]`
部分文字列またスライスが作成されます。結果として得たい要素をインデックス式のlowとhighで指定します。得られる結果は0から始まるインデックスを持ち、長さはhigh – lowになります。次の例は配列aをスライスしています。

`長さはhigh-lowになります`
これがそういう仕様なんだなと意外とすんなりスっと入ってしてしまった

勝手に
`a[offset : capacity]`
 でoffetの位置からcapacityの最大まで入ると勘違いしていたので
`a[low : high]`

で理由はわかったので一旦Goの前に進もうと思う

けどもう少し調べたら以下のサイトがわかりやすかったです。

# 他に学習の役に立つような情報サイト
https://www.slideshare.net/yasi_life/go-14075425

----

# 結局
新しい言語や新しい考え方を学ぶ際にはプログラムを何年やっててもぶつかる事は必ずあるものだと思います。
今、勉強し始めた方が特別なわけではないので

- 自分で手を動かして実装してみる
- インターネットで検索して調べる
- ドキュメントを読む
- **自分の理解が先入観による思い込みじゃないか振り返る**

のバランスの良さが学習効率には大事だなと再認識しました。

:dancer::dancer_tone1::dancer_tone2::dancer_tone3::dancer_tone4::dancer_tone5:
Discord.jsによるBotでボイスチャンネルに触れてみる

# [Discord Advent Calendar 2017](https://qiita.com/advent-calendar/2017/discord) の11日目！[^1]
まだまだ枠が空いています！
Discordに興味が湧いた方、どうぞお気軽に参加くださいませ :wink: 

# ボイスチャンネルを活用したDiscord Bot
先日はdiscord.jsによるBot開発の記事を書きました。
この界隈では、Discordの大きな特徴であるボイスチャンネルを活用したBot開発も行われているようです。具体的にはYoutubeやSoundCloudから引用してボイスチャンネルに流すなどの機能を持つBotをいくつか確認しています。
今回はDiscordらしい、ボイスチャンネルに触れることのできるBotの開発をやってみます。入門ということで、あまり大したことはやりません :sweat_smile: 殆ど公式ドキュメントで触れらているチュートリアル[^2]に従っていきます。

## 開発環境
今回も`Node.js`, `discord.js`を使っていきます。
ボイス系の機能を扱う場合、加えて`node-opus`, `opusscript` NPMパッケージが必要になります[^2]が、これらのパッケージはNode.jsにおけるネイティブ拡張を含むため`node-gyp`が自動インストールされます。
私はWindowsで開発していますが、`npm install`だけではうまくいきませんでした。[先人の知恵](https://qiita.com/AkihiroTakamura/items/25ba516f8ec624e66ee7) を参考に事前セットアップを済ませましょう。折角なので、コマンドの並びを載せておきます。

```shell:各々のシェル環境で

# (windowsの場合、管理者にて) 
npm install --global windows-build-tools

# (あとは共通) 
npm install discord.js
npm install node-opus
npm install opusscript
```

## コードを書いていく
基礎的なところはスキップして、さっそくコード解説に移りたいと思います。
認証やDiscordへの接続など、基礎的なコードはスキップしています。

```javascript:メンションされたら音楽流して帰るBot
client.on('message', message =>
{
	if (message.isMemberMentioned(client.user) && message.member.voiceChannel)
	{
		message.member.voiceChannel.join().then( connection => {
			const dispatcher = connection.playFile('test.mp3');
			dispatcher.on('end', reason => {
				connection.disconnect();
			});
		})
        .catch(console.log);
		return;
	}
});
```

上記のコードだけで音声チャンネルに参加・垂れ流しが出来ました。簡単ですね。

### コード解説
ボイスチャンネルに接続するにあたり、チャンネルの特定をしなければなりません。
（公式ドキュメント[^2]の引用ですが）今回はメンションして来たユーザのボイスチャンネルを参照しています。ユーザは1つのボイスチャンネルにしか接続できないため、`member.voiceChannel` にて参照できるというわけです。詳しい解説は[こちら](https://discord.js.org/#/docs/main/stable/class/GuildMember)をご参照ください。

#### ボイスチャンネルへの参加と音声の再生
##### `message.member.voiceChannel.join().then(Func)`
上記の [VoiceChannel](https://discord.js.org/#/docs/main/stable/class/VoiceChannel) 自体に`join`というメソッドがあり、これを使うだけでボイスチャンネルへの接続ができます。接続が成功した時は非同期で `join().then(Func)` のような形式で書いておくと関数`Func`がコールバックされます。
##### `connection => { ... }`
上記の関数には [VoiceConnection](https://discord.js.org/#/docs/main/stable/class/VoiceConnection) が引数として渡されてきます。ボイスチャンネルに何か作用したいときはここのブロックに記載することになります。今回は `test.mp3` というローカルファイルを置いて再生させています。
##### `dispatcher.on('end', reason => { ... } )`
ファイルの再生が終わったらボイスチャンネルを抜ける、目的のためにこのコードを記載しています。比較的わかりやすいですね。dipatcherは音声を再生した時に得られる [StreamDispatcher](https://discord.js.org/#/docs/main/stable/class/StreamDispatcher) です。

## 書いてみて（まとめ）
今回はほとんどサンプルのままですが、非常に簡単にボイスチャンネルに影響を与えるBotが作れました。単純なファイル再生であればファイル名指定だけで済んでしまうので、ライブラリが実に便利に作られているな・・と感じます。私個人はガッツリJavascriptを書く人間ではないので、Promiseやラムダ式を活用するサンプルコードを真似るだけでも大きな学びになりますね。
実は、今回の記事ではdiscord.jsの各クラスの紹介を交えることを目的としました。ドキュメントの充実っぷりはかなり良いと思いますので、ぜひ色々読んでみてくださいね。

[^1]: すみません。遅刻しました :worried: 
[^2]: https://discord.js.org/#/docs/main/stable/topics/voice
スカイプ英会話やってます

#はじめに
この記事は[英語 Advent Calendar 2017](https://adventar.org/calendars/2333) 12日目に向けて書いたものです。スカイプを用いた英会話について書きたいと思います。

##英会話遍歴
最初は駅前留学的なところに通っていました。かなり長く通っていたのですが、漫然と通っていたせいもあり、あまり上達した感じはありませんでした。

次に、個人がやっているところに通ってみましたが、(その先生が人気があって)時間が合わず、足が遠のくことになりました。

実際に顔を合わせて話すことにこだわっていたことから、スカイプを用いた英会話を横目にいろいろな英会話スクール/教室に通っていました。

#スカイプ英会話
そんなある日、「スカイプ英会話だとアメリカに住んでいる人とでも英会話レッスンができるじゃないか」と思うに至り、始めることにしました。結果としては、アメリカは時差の関係から深夜のレッスンとなり、なかなか厳しい状態でした。

そんなある日、会社から少し会社で負担するので... と、英語学習の~~要請~~お誘いが来ました。まあ、良いかと思って[DMM英会話](http://eikaiwa.dmm.com/)を始めることにしました。

一日一回25分のコースです。やらなかったらお金が消えていきます。というわけで、とりあえず登録するところから。そして、「英語の勉強」というのが苦手なので、まずは喋ることからはじめました。

時間と予約状況の関係から、毎日違う先生と話すことになり、内気な自分としては、なかなかハードな時間となりました。

#学習効果
まだ、始めて日が浅いですが、英語を喋るのが、なんとなくではあるものの、怖くなくなった気がします。毎日ちょっとずつでも、「続ける」ことが良いように感じています。
nginxでhttpからhttpsにリダイレクトされない！と思ったら

[光の速さのWEBサーバー(nginx)をlet's encryptでSSL化及びHTTP/2化。ついでにセキュリティ評価をA＋にする。](https://qiita.com/sak_2/items/ff835b669c0a7e110b09)
こちらの通り設定したものの、リダイレクトされなくて困った初心者の私のメモ

## 以下を確認
`/etc/nginx/nginx.conf`を開き、36行目の`include /etc/nginx/conf.d/*.conf;`の下に80番ポートの設定が生きていたらコメントアウトしてみる
ISSが特定の場所の上空を通過したとき,Googleカレンダーに登録する

# 作ったもの
IFTTTでアプレットを作りました。


![スクリーンショット 2017-12-12 22.25.57.png](https://qiita-image-store.s3.amazonaws.com/0/173392/3cd687ca-91ee-1425-ac5b-f1524c8d4a57.png)
https://ifttt.com/applets/UVZ3zXL5-iss-google


## IF

- Trigger: Space "ISS passes over a specific location"


## Then

- Action : Google Calender "Create adetailed event"<br>
値の設定は自動で表示されたデフォルトを使い、ただし以下の2箇所だけ指定してみた。
- start time : AppearsAt
- End time : DisappearsAt<br>



# ISSが1日に何回、自分の上空を通過してるか数えてみた

昨日は7回、日本の上を通過してました。
10:48ごろ
12:23　〃
14:01　〃
15:40　〃
17:18　〃
18:54　〃
20:31　〃




現在位置はこのサイトで見れます。→http://www.ncsm.city.nagoya.jp/astro/iss_live.html

宇宙、それは最後のフロンティア・・

以上です！
Unity WebGLをmBaaSで使ってみた

この記事は [富士通クラウドテクノロジーズ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/fjct) の13日目です。

昨日は @Ken-Moriizumi さんの「[KONGでニフクラスクリプトもチームもマネジメントする話](https://qiita.com/Ken-Moriizumi/items/146ff40f647bb4ff1392)」でした。
KONGとても面白そうですね。ぜひ触ってみたいです！

## 今回の概要

UnityはUnity 5からBuild ターゲットにWebGLが追加されていました。今までのニフクラ mobile backendの[Unity SDK](https://github.com/NIFCloud-mbaas/ncmb_unity)はこのWebGLには対応していませんでした。しかし、先日の[Unity SDK v3.2.0](https://github.com/NIFCloud-mbaas/ncmb_unity/releases/tag/v3.2.0)からこのWebGLにも対応するようになりました。
そこで今回は、[mBaaSのクイックスタート](http://mb.cloud.nifty.com/doc/current/introduction/quickstart_unity.html)をこのWebGL機能を使ってやってみようと思います。

## 動作環境

- macOS: 10.12.6
- Unity: 2017.2.0f3
- mBaaS Unity SDK: 3.2.0

## 事前準備

ビルドするまでは、mBaaSの[Unityクイックスタート](http://mb.cloud.nifty.com/doc/current/introduction/quickstart_unity.html)とやることは変わりません。
このクイックスタートの[サンプルコードの実装(データストア)](http://mb.cloud.nifty.com/doc/current/introduction/quickstart_unity.html#サンプルコード（データストア）)まで、手順通りに進めてください。
これで事前準備は完了です。

## WebGLでビルド

ここからWebGLでビルドしていきます。
「File」→「Build Settings...」を選択し、Platformを選択する画面を出します。
<img width="249" alt="Unity_bar.png" src="https://qiita-image-store.s3.amazonaws.com/0/165167/f7781db3-8d59-b8e1-8a68-678ff8efb4ee.png">

この画面で「Platform」内の「WebGL」にSwitch Platformします。その後、「Build」ボタンを押して保存先を選択し、ビルドします。このビルドですが、AndroidやiOSへビルドする際の時間と比較すると少し長くなりますが、気長に待ちましょう。
<img width="628" alt="BuildSettings.png" src="https://qiita-image-store.s3.amazonaws.com/0/165167/dcd7e60a-c08d-e57d-cfc2-0d758f569cb9.png">

このビルドが終了すると、出力先にビルドしたファイル群が出力されます。そのファイル群の中のindex.htmlを開くことでゲームをweb上で見ることができます。
<img width="1287" alt="実行画面.png" src="https://qiita-image-store.s3.amazonaws.com/0/165167/02bc8320-7608-b2e4-f22e-733dec9c4341.png">

※index.htmlを開く際に以下の画像のようなエラーが出て、ゲームが開始されないことがあります。このエラーが出た際には、ブラウザの設定を変更したり、Webサーバーを立てる必要があります。（[Chromeでの実行方法例サイト](http://ferret.gjgd.net/unity/chrome%E3%81%A7webgl%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)）
<img width="479" alt="WebGLエラー.png" src="https://qiita-image-store.s3.amazonaws.com/0/165167/70fb51c4-568a-74e2-2dec-88d543bb6270.png">

ゲームを開いた後、mBaaSのダッシュボードを確認するとデータが書き込まれていると思います。
<img width="969" alt="mBaaS管理画面.png" src="https://qiita-image-store.s3.amazonaws.com/0/165167/7f601e31-891a-ff06-5199-d3721647f042.png">

これでクイックスタートをWebGLで動かすことができました。

## まとめ

今回はクイックスタートでmBaaSのデータストア機能のみを使いましたが、他の機能も使えることができますので、ぜひ使ってみてください。ただし、プッシュ通知機能だけはWebGLでは使えませんのでご注意ください。
また、Unity SDKがWebGLに対応したことで、UnityでビルドしたAndroidやiOSアプリでmBaaSを使っていたゲームも、簡単にwebに移植することができるようになりました。今後のソーシャルゲームはどんどんクロスプラットフォーム化していくかもしれませんね。

明日は @mimi_act4 さんの「認定スクラムプロダクトオーナー研修を受けて気づいた大切なこと」です。スクラム研修は自分も気になっているのでとても楽しみです！
EC-CUBEのイベントに参加してみませんか


EC-CUBEオフィシャルサイトの運用周りを主に担当している株式会社ロックオンの喜納です。

最近EC-CUBEユーザーグループの勉強会にちょくちょく参加しているので、
今回は技術的な話は置いておいて、その内容を共有をしたいと思います。

ユーザーグループって？
-
既にご存じの方も多いと思いますが、EC-CUBEは
日本各地にユーザーグループがあり、各々で勉強会を行っています。
勉強会では、EC-CUBEやECについての講義が行われたり、悩みを相談し合ったりと
幅広い方が活動していらっしゃるみたいです。

※それぞれのユーザーグループにfacebookのグループが存在しているので興味があれば是非見てみて下さい。
https://www.ec-cube.net/news/#events_information


いってきた
-

私が最近参加したのは、[名古屋UG](https://www.facebook.com/groups/eccube.nagoya.user/)です。

 [【運営者向け】「なぜ売れない？！」を考えてみよう。 ～ECサイトとSNSを駆使して、売上アップを図る！～ | EC-CUBE名古屋 vol.49](https://ec-cube-nagoya.doorkeeper.jp/events/67406)



という内容。店舗主さんが喉から手が出る程欲しい内容でした。

扱う商品によってどういうSNSが訴求力があるのか、とか
そもそもなぜSNSなのか、とか。そのSNSの使い方講座とか。
それを実際に商品を扱う方々と額を突き合わせて話し合うと、
商材も色々あるのでそれぞれに合わせた色々な工夫が出てきて面白い勉強会でした。

また、定期的に勉強会を開催しているUGということもあって、とてもアットホームな雰囲気だったので
勉強会後の懇親会も色々なお互いの悩みとかを話あえる同志的な空気感があったのも印象的でした。

他には、[関西UG](https://www.facebook.com/groups/eccube.kansai/about/)にも参加しているのですが、
色々EC-CUBEを使った取り組みをされている方から、今からまさに個人店舗を開こうとしている方、受託開発を行っている方、
サーバー周りや決済周りでなんやかんやしている方等、色んな方と情報交換できるいい機会となっていると感じています。

勉強会にいくメリット
-
もちろん勉強会の中で得た有意義な情報を持ち帰ることもメリットなのですが、
それ以上に、同じ悩みを持つ人、悩みについて解決策をもっている人とつながることができるということかなと思います。


というわけで宣伝
-

12/21（木）東京・銀座にて「[EC-CUBEパートナー忘年会](https://www.ec-cube.net/event/detail.php?event_id=116)」を開催します。

インテグレートパートナー、コミッター、プラグイン登録を行われているパートナー、B2B認定制作会社、アライアンスパートナー、ホスティングパートナーなど、様々な方々に支えていただいているEC-CUBEについて、
皆で語り合ったり、EC-CUBEの次期バージョンや、オーナーズストアのリニューアルを含む、今後のEC-CUBEについての重要な発表もありますので、是非お越しください。

(詳細は[こちら](https://www.ec-cube.net/event/detail.php?event_id=116)を御覧ください。)

遠方でなかなか来られない方もいらっしゃると思いますが
そんな方は是非UGに参加してみて下さい！
比較演算はいかに実装すべきか - PHP

#テーマ
例えば変数Aに1というフラグを持たせて処理を分岐させたい時、
安易に

```php:example.php
if($A == 1){
//処理
}
```
として
何も考えずに通り過ぎる人もいると思います。


でもこれでは、"1"と1の判別や、
もっと言えばtrueと1の判別すらできず、
ここに潜在的なバグを忍ばせる余地を作ってしまうことになります。

筆者は、このことについて何が正解の形なのか、
正直わかりません。

が、ここで、著名な参考書の書き方を紹介して、
今後の考察に役立てたいと思います。

大重義幸『詳細!PHP7』
によれば、
if文を扱う章(P67)で、

```php:oshige.php
if($A == 1){
//処理
}
```
として、==の形で実装しています。(以下==説とする)
入門本なので、
もしかすると、厳密に考えることは
置いておきという趣旨がそこにあるのかもしれないが、
確かに他のどのページをめくっても==説に立って
話が展開しています。

一方、小川雄大・柄沢聡太郎・橋口誠　共著の
『パーフェクトPHP』では、

「本書では、比較演算を行う場合には厳密な比較を行うことを強く推奨しています。……意図しないところでキャストが発生し、それによって意図しない挙動をするプログラムを書かないためにはPHPの自動キャストをしっかりと把握し、必要に応じて明示的なキャストを行うなどのクセをつけることが大切です。」と書かれ

比較演算を行うサンプルコードは全て当たり前のように===を用いています。

```php:perfect.php
if($A === 1){
//処理
}
```



また、TIPSが指摘する通り
速度の観点（http://utututizu.info/?p=451）
からも===が良しとされています。

そこで、ここでは、
基本的には===の比較演算を使う立場を支持する結論とします。






参考文献：
『詳細！PHP7』大重義幸
『パーフェクトPHP』小川雄大・柄沢聡太郎・橋口誠
https://qiita.com/mamy1326/items/b79764919c839fce4367
http://utututizu.info/?p=451
Jupyter Notebookでビットコインのローソク足チャートを描画

Jupyter Notebookでビットコインのローソク足チャートを表示してみました。


# ライブラリの準備
pandasとmplotlibをインストールしてください。

現在のところ、ローソク足チャートの描画に必要な mpl_finance はパッケージ名で
インストールできなくなっているので、githubのリポジトリを指定してインストールしました。

```
pip install git+https://github.com/matplotlib/mpl_finance
```

# ビットコインの時系列データ
kaggleに登録後、下記ページからダウンロードできます。

https://www.kaggle.com/mczielinski/bitcoin-historical-data

このデータは1分足のデータで、期間がJan 2012 to October 2017となっています。

ちょっと試すには、大きいので、一部を抜き出しました。

```
$ head -n 1  bitstampUSD_1-min_data_2012-01-01_to_2017-10-20.csv    > bitcoin.csv
$ tail -n 1000  bitstampUSD_1-min_data_2012-01-01_to_2017-10-20.csv    >> bitcoin.csv
```

bitcoin.csvをJupyter Notebookからアクセスできる場所に置いてください。


# ローソク足チャートの描画

プログラム全体です。

```python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from pandas_datareader import data as dr
import datetime as dt
from mpl_finance import candlestick_ohlc
import datetime
%matplotlib inline
from pylab import rcParams
rcParams['figure.figsize'] = 20,10

data = pd.read_csv('/vagrant/share/bitcoin.csv')
data = data[1:200]
data = data.reset_index()
data["Date2"] = data['Timestamp'].apply(lambda x:mdates.date2num(datetime.datetime.fromtimestamp(x)))
tuples = [tuple(x) for x in data[['Date2','Open','High','Low','Close']].values]

fig, ax = plt.subplots()
ax.xaxis_date()
ax.xaxis.set_major_formatter(mdates.DateFormatter("%m-%d %H:%M"))
ax.grid(True)
plt.xticks(rotation=45)
plt.xlabel("Date")
plt.ylabel("Price")
plt.title("BTC-USD")
candlestick_ohlc(ax, tuples, width=0.0005,colorup='g', alpha =.4);

```

表示されたローソク足チャート
![btc_candle_chart.png](https://qiita-image-store.s3.amazonaws.com/0/42120/02aed1ca-a6f1-9578-5b00-d9c291720aa2.png)

分かる範囲で解説すると


```python
from pylab import rcParams
rcParams['figure.figsize'] = 20,10
```
これは表示されるグラフを大きくするおまじないです、横のサイズ、縦のサイズです。


```python
data = pd.read_csv('/vagrant/share/bitcoin.csv')
data = data[1:200]
data = data.reset_index()
```
CSVファイルを読み込んでいます。
あまり多いと、ローソクにならないので、200個にしています。


```python
data["Date2"] = data['Timestamp'].apply(lambda x:mdates.date2num(datetime.datetime.fromtimestamp(x)))
```
元々のCSVはUNIX秒なので、UNIX秒をdatetimeに変換して、それをmatplotlibの日時形式に変換してDate2カラムに挿入します。


```python
tuples = [tuple(x) for x in data[['Date2','Open','High','Low','Close']].values]
```
値をローソク足チャートで使う構造に変換します。


```python
fig, ax = plt.subplots()
ax.xaxis_date()
ax.xaxis.set_major_formatter(mdates.DateFormatter("%m-%d %H:%M"))
ax.grid(True)
plt.xticks(rotation=45)
plt.xlabel("Date")
plt.ylabel("Price")
plt.title("BTC-USD")
```
グラフのインスタンスを作成し、軸の設定をしています。

```python
candlestick_ohlc(ax, tuples, width=0.0005,colorup='g', alpha =.4);
```
ローソク足チャートを描画します。 widthをいい感じに設定する必要があります。
セミコロンも必要です。



#参考
[pythonでローソク足(candle chart)の描画](https://qiita.com/u1and0/items/1d9afdb7216c3d2320ef)
【入門メモ】node.jsのインストールからgoogle-home-notifierのインストールまで

#前提
新調したMacbookなのでnodeとか何も入っていない状態。

```
$ node
```
のコマンドで何も反応がないのも確認済み。

#nodebrewのインストール
まずはnodebrewのインストール。

```
$ brew install nodebrew
```

nodebrewは~/.nodebrewにインストールされます。
私毎回忘れて後から怒られるのですが、pathを通しましょう。

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```
nodebrew commandが動けばインストールは完了。
```
$ nodebrew help
```

#node.jsのインストール
まずはインストールできるnode.jsのversionを確認
```
$ nodebrew ls-remote
```
ずらりとバージョンが出てくるのでStableになっている最新バージョンをインストール。
```
$ nodebrew install-binary stable
```
v9.2.1だった。（2017/12/12現在）

インストールが完了したら、使いたいバージョンを利用するように設定。

```
$ nodebrew ls
v9.2.1

current: none
```
currentに出てくるのが、現在利用中のバージョン。
まだ、インストールしただけでnoneになっているので、使いたいバージョンをcurrentにすれば、完了。
```
$ nodebrew use v9.2.1
$ node -v
v9.2.1
```

#npmでパッケージをインストール
###npm install -g
```
$ npm install -g grunt-cli
```
###npm init
```
$ npm init
```
###npm install --save-dev

```
$ npm install --save-dev grunt
```
###npm install
```
$ npm install
```
ここまできてやっとgoogle-home-notifierのインストールです。

#google-home-notifierのインストール
```
$ # google-home-notifierを入れる
$ npm install google-home-notifier

$ # yarn の方は下記のように
$ yarn add google-home-notifier
```

なんとか設定が完了したので次はサンプルコードで喋らせて見たり遊んで見ます。
LeSS (Large-Scale Scrum) 日本語意訳

※ このページは[Less](https://less.works/jp/less/framework/index.html)の日本語意訳です。
  権利的にまずかったら消すのでご指摘ください。

[LeSS Framework](https://qiita.com/msuzuki/items/44df9c27a55ebf1214a7)
LeSS Framework

※ 元ネタは[こちら](https://less.works/jp/less/framework/index.html)

# LeSSフレームワーク

![why-less-framework.jp.png](https://qiita-image-store.s3.amazonaws.com/0/46776/b3ea3048-54e7-c5f2-9dba-79fb2cecc576.png)

大規模スクラムは、標準の1チームスクラムを理解することから始まります。
その後、組織はLeSSを理解し、採用することができなければなりません。
これは、1つのチームのスクラム要素の目的を調べ、標準的なスクラム規則の
制約内にとどまりながら同じ目的を達成する方法を考え出すことを必要とします。

スクラムによるアジャイル開発では、機能的になるためには組織の大幅な変更が必要です。 
したがって、スクラムもLeSSも単なるプラクティスと見なすべきではありません。 
むしろ、これらは組織的なフレームワークを形成します。

## 2つのアジャイルスケーリングフレームワーク

LeSSは、2つの大規模スクラムフレームワークを提供します。 
LeSSのスケーリング要素の大半は、すべてのチームの関心を「個人のパート」ではなく
製品全体に向けることに焦点を当てています。
スケーラビリティでは、グローバルとエンドツーエンドの焦点がおそらく支配的な問題です。 
基本的に単一チームのScrumスケールアップされている2つのフレームワークは次のとおりです。

* LeSS： 最大8チーム（各チーム最大8人）。
* LeSS Huge： それ以上の規模

### 1チームスクラムと同じであることはどういう意味ですか？

LeSSは、1チームのスクラムのスケールアップされたものであり、
1チームのスクラムの実践とアイディアの多くを維持しています。 
LeSSでは、次のものが採用されています。

* 製品のための単一のプロダクトバックログ
* 完了の定義
* インクリメンタルな開発とスプリントごとに出荷可能な製品
* 1人のプロダクトオーナー
* 多くの完全なクロス・ファンクショナル・チーム（単一専門チームはいない）
* 1つのスプリント

LeSSでは、すべてのチームが共通のスプリントにあり、共通の出荷可能な製品、すべてのスプリントを提供しています。

### LeSSの違いは何ですか？

* スプリント計画(第1部) ：1人のプロダクトオーナーに加えて、すべてのチームのメンバーが含まれます。 チームメンバーが自己管理して、製品のバックログ項目の担当を決めることができます。 チームメンバーは、特に関連項目について、共有作業を見つけて協力する機会についても議論します。
＊ スプリント計画(第2部) ：これは各チームによって独立して（通常は並行して）開催されますが、時には単純な調整と学習のために、2つ以上のチームが同じ部屋（異なるエリア）にそれを保持することがあります
* デイリースクラム ：チームAのメンバーがチームBのデイリースクラムを観察して情報共有を増やすこともできるが、これは各チームによって独立して行われる。
* 調整 ：各チームのチームや回転する代表者は、オープンスペース、タウンホールミーティング、またはスクラムのスクラムを定期的に開催し、情報の共有と調整を増やすことができます。
* 全体的なプロダクトバックログリファインメント：1つのプロダクトオーナーとすべてのチームのメンバーを含む、オプションの短期の製品バックログリファインメント（PBR）ミーティングがあります。 重要な目的は、どのチームがどのアイテムを実装する可能性が高いかを判断し、後で詳細を検討する単一チームPBRのアイテムを選択することです。 また、プロダクトオーナーおよびすべてのチームとのアライメントを高めるチャンスです。
* プロダクトバックログのグルーミング ：LeSSの唯一の要件は、1チームのスクラムと同じ1チームのPBRです。 しかし、一般的で有効なバリエーションは、2つ以上のチームが同じ部屋にいるマルチチームのPBRで、学習と調整を増やすことです。
* スプリントレビュー ：1つのプロダクトオーナーに加えて、すべてのチームのメンバー、関連する顧客/ユーザー、およびその他のステークホルダーが含まれます。 製品の増分や新しいアイテムを検査するフェーズでは、「bazaar」や「science fair」のスタイルを検討してください。チームによって開発されたアイテムが表示され、議論される複数のエリアを持つ大きな部屋です。
* オーバーオール・レトロスペクティブ ：これは、1つのチームに集中するのではなく、全体的なシステムを改善することを目的とした、1つのチームのスクラムにはない新しい会議です。 最大継続時間はスプリントの週当たり45分です。 これには、プロダクトオーナー、スクラムマスター、および各チームの代表者が含まれます。