OmniAICreator/Qiita-1.07M huggingface dataset:
AVTOKYO 2017 BADGE で OLEDプログラム

この記事は
「SPI SD1306 OLED を STM32Duino ( Arduino IDE + One of BluePill : Robotdyn STM32F103 Dev.Board )で動かす」
https://qiita.com/nanbuwks/items/25ccb1ac38ebb237f94a.md
を再構成したものです

AVTOKYO 2017 BADGE は、0.96inのディスプレイがついています。OLEDディスプレイで、SPIでSTMマイコンに接続しています。

# サンプルプログラム

STM32用のライブラリの中にあるサンプルプログラム

```

~/Arduino/hardware/Arduino_STM32-master/STM32F1/libraries/Adafruit_SSD1306/examples$ ls
ssd1306_128x32_i2c  ssd1306_128x64_i2c_STM32
ssd1306_128x32_spi  ssd1306_128x64_spi
```

がありますが、ssd1306_128x64_spiを使ってみます。
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/e448d1fb-6d40-43a7-cd27-b21feef4ffc3.png)

# ライブラリインストール

あらかじめ、Adafruit GFX Libraryをライブラリマネージャからインストールしておこう。

また、
https://qiita.com/nanbuwks/items/ba37f049f45378da0e2b
これになぞって、

 ~~Arduino_STM32-masterの中にある STM32F1/libraries/Adafruit_SSD1306/Adafruit_SSD1306_STM32.cpp
を修正~~ 
(2018/11/1時点の最新版で確認したところ、この作業は必要なくなりました。)


```

#include <avr/pgmspace.h>
//#ifndef __SAM3X8E__ || __STM32F1__
 //#include <util/delay.h>
//#endif
#include <stdlib.h>

//#include <HWIRE.h>
//#include <HardWire.h>
//HardWire HWIRE(1,I2C_FAST_MODE); // I2c1
HardWire HWIRE(2,I2C_FAST_MODE); // I2c2
```

 ~~を以下のように書きなおす。~~ 

```

#include <avr/pgmspace.h>
//#ifndef __SAM3X8E__ || __STM32F1__
 //#include <util/delay.h>
//#endif
#include "Wire.h"
#define WIRE_WRITE HWIRE.write

#include <stdlib.h>

//#include <HWIRE.h>
//#include <HardWire.h>
//HardWire HWIRE(1,I2C_FAST_MODE); // I2c1
HardWire HWIRE(2,I2C_FAST_MODE); // I2c2
```

 ~~としておきます。~~

# コンパイル


```

/tmp/arduino_modified_sketch_898425/ssd1306_128x64_spi.ino:22:30: fatal error: Adafruit_SSD1306.h: No such file or directory
 #include <Adafruit_SSD1306.h>
                              ^
compilation terminated.
```
となった。
ssd1306_128x64_spi.ino スケッチの、

```

#include <Adafruit_SSD1306.h>
```

を

```

#include <Adafruit_SSD1306_STM32.h>
```
としたらコンパイルが通るようになった。

# ピンアサインの設定

さて、AVTOKYO 2017 BADGEのピンアサインに合わせてssd1306_128x64_spi.ino スケッチを、以下のように変更


```

// If using software SPI (the default case):
#define OLED_MOSI  PA7
#define OLED_CLK   PA5
#define OLED_DC     PA6
#define OLED_CS     PA4
#define OLED_RESET  PA3 
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);


/* Uncomment this block to use hardware SPI
#define OLED_DC     6
#define OLED_CS     7
#define OLED_RESET  8
Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);
*/
```

こうすると、software SPIの設定になります。
なお、hardware SPIを使おうとしましたが、うまくいきまんでした。

ピンアサインを変更した後、コンパイルエラーが出るようになった。

```

STM32_ssd1306_128x64_I2C:65: error: #error ("Height incorrect, please fix Adafruit_SSD1306.h!");
 #error("Height incorrect, please fix Adafruit_SSD1306.h!");
  ^
exit status 1
```

該当箇所は


```

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#end
```

となっていたので

Adafruit_SSD1306.h

の該当箇所を書き換える。

```

   #define SSD1306_128_64
//   #define SSD1306_128_32
//   #define SSD1306_96_16
```
上記のように SSD1306_128_64 を有効にするとエラーが出なくなる。
【vimめも】 14. grep

vimでファイルの探索をしたい時ありますよね

そういうときに使うのがvimgrep

## 概要

1. vimgrepにて検索 => 結果をquickfixという一覧に読み込み
2. quickfixを表示
3. quickfixのリストから該当ファイルの該当行にジャンプ

## 検索の仕方

```vim
:vim[grep] /{pattern}/[g][j] {file}
```

`:vim`というまさかの検索の名前が「vim」
素敵なExコマンド

`g`オプションを付けると各行複数回マッチする
（なければ１度だけ）

`j`オプションを付けると、quickfixのリストを更新するのみ
（なければリストを更新したあと、先頭のものにジャンプする）

`{file}`はファイルを指定する
ワイルドカードも指定が可能
`**`すべてにマッチ。ディレクトリを再帰的にたどる
`*`すべてにマッチ

## quickfixを表示

`vimgrep`だけでは検索をしてquickfixを更新するだけなので
表示をさせないと結果がみえない。。
`:cw[indow] [count]`にて開く
`[count]`を指定しなければ10が、指定すればその値が表示するウィンドウの行数になる

毎回開くのめんどくさい・・・

```vim
autocmd MyAutoCmd QuickFixCmdPost * cw
```

これで、quickfixが更新されたら自動で開くようにできる
`MyAutoCmd`はautocmdのグループなので、各自の名称に書き換えてつかってください

## quickfixのリストからジャンプ

`<Enter>`でジャンプする

`<C-w><Enter>`で新しいウィンドウを開いてジャンプする

## その他

過去の検索したリストを再度表示したい・・・
そんなとき
`:col[der]`で１つ前の履歴へ切り替え
`:cnew[er]`で１つ後の履歴へ切り替え
`:chi[story]`で検索履歴を一覧で表示

前回: [【vimめも】 13. プラグイン](https://qiita.com/r12tkmt/items/21ebf99daeff0cc78c35)

次回: [【vimめも】 15. Vim scriptの基本]https://qiita.com/r12tkmt/items/aafe1406e5a0551c94b0)
goでdropboxにファイルアップロード

## 概要

dbのバックアップとユーザが上げた画像をzipにして
dropboxにあげるスクリプトをgoで書いた。
そのアップロード部分で若干ハマったのでsampleを残しておく

[github](https://github.com/smith-30/bu-go)

## sample

使用したライブラリ
[github](https://github.com/dropbox/dropbox-sdk-go-unofficial)

```go
package main

import (
	"fmt"
	"os"

	"github.com/dropbox/dropbox-sdk-go-unofficial/dropbox"
	"github.com/dropbox/dropbox-sdk-go-unofficial/dropbox/files"
)

func main() {
	config := dropbox.Config{
		Token:    "<your-access-token>",
		LogLevel: dropbox.LogInfo, // if needed, set the desired logging level. Default is off
	}

	cli := files.New(config)

	req := files.NewCommitInfo("<file-path>")
	f, _ := os.Open("<file-path>")
	res, err := cli.Upload(req, f)

	if err != nil {
		fmt.Printf("\n\n*** Error %v\n\n", err)
		return
	}
	fmt.Printf("\n\n%#v\n\n", res)
}
```

## アクセストークン

[ここから](https://www.dropbox.com/developers/apps) アプリを作る

アプリページに `Generated access token` があるので生成してそれを使う

期限とか特に書いてなかったので使ってる内に切れたらもう少し深く調べてみる

## ハマったこと

アップロードしたファイルが格納されるのは

- Root(Dropbox)
    - アプリ ← 自分の環境ではこの名前になっていた 
        - application-name
            - file-path

なのでDropbox上に`application-name`のフォルダ作っても
一向に格納されないので注意が必要かと。
FRBの金利データをRSSから抜き出してみる-2

　[前回の記事](https://qiita.com/heat_exchange/items/d0b67bcf0a938bb7b717)では、30年もの国債のデータを抜き出した。今度は、FF金利-30年もの国債までのデータを抜き出せるようにしたい。

#データの公表体制
<details><summary>データのurlを並べると、次のようになっている。</summary>
FF金利：https://www.federalreserve.gov/feeds/Data/H15_H15_RIFSPFF_N.B.XML
1ヶ月もの：https://www.federalreserve.gov/feeds/Data/H15_H15_RIFLGFCM01_N.B.XML
1年もの：https://www.federalreserve.gov/feeds/Data/H15_H15_RIFLGFCY01_N.B.XML
30年もの：https://www.federalreserve.gov/feeds/Data/H15_H15_RIFLGFCY
</details>
　とすると、URLはfederalreserve.gov/feeds/Data/H15_H15_RIFまでは共通で、そこから、FF金利は"SPFF_N.B.XML"、国債は、1年未満のものはLGFCM0+(残存月数)_N.B.XMLで、10年未満のものはLGFCY0+(残存年数)_N.B.XML、それ以上のものはLGFCM+(残存年数)+_N.B.XMLとなっていることがわかった。これでコードがかけそうだ。

#コーディング
##URL生成関数
　さて、URLの規則性がわかったところで、コーディングを始めていこう。まずは、さっき見つけた規則性に則ってURLを生成する関数を作った。色々悩んだが、センスのない条件分岐で妥協した。想定外のデータが入力されるとシステムが止まるようにしている。

```
def url_adjust(text):
    if text=="FF":
        adjText="SP"+text
    elif text in {"M01" ,"M03","M06","Y01","Y02","Y03","Y05","Y10","Y20","Y30"}:
        adjText="LGFC"+text
    else:
        sys.exit()
    return adjText
```

##金利の取得
　前回のコードを関数にして少し改良してみた。

```
def get_rate(data):   
    text=url_adjust(data)
    url= "https://www.federalreserve.gov/feeds/Data/H15_H15_RIF"+ text + "_N.B.XML"
    res=req.urlopen(url)
    soup=BeautifulSoup(res,"lxml")
    d=soup.item
    return d.find("cb:value").string
```

　get_rateに期日を入れると、その期日の金利が取得できるようになっている。関数を何度も呼び出すのも面倒なので、リストとforを使ってコードを短くした。また、現在データはstring型で定義されているが、今後データベースに放り込みたいと思っているので、floatで数値に直し、リストに放り込むかたちにした。

```
import urllib.request as req
from bs4 import BeautifulSoup 


def get_rate(data):   
    text=url_adjust(data)
    url= "https://www.federalreserve.gov/feeds/Data/H15_H15_RIF"+ text + "_N.B.XML"
    res=req.urlopen(url)
    soup=BeautifulSoup(res,"lxml")
    d=soup.item
    return d.find("cb:value").string


def url_adjust(text):
    if text=="FF":
        adjText="SP"+text
    elif text in {"M01" ,"M03","M06","Y01","Y02","Y03","Y05","Y10","Y20","Y30"}:
        adjText="LGFC"+text
    else:
        sys.exit()
    return adjText

Namelist=["FF","M01","M03","M06","Y01","Y02","Y03","Y05","Y10","Y20","Y30"]
rateList=[]
for Namelist in Namelist:
    rateList.append(float(get_rate(Namelist)))
print(rateList)
```
出力：[1.69, 1.67, 1.82, 2.01, 2.21, 2.44, 2.58, 2.77, 2.92, 3.01, 3.11]
※日によって変わります

これでほしいデータを全て取得することができた。次はクローリングでデータベース化していきたい。
HerokuにSendGridが追加できなかった話

クレジットカードの登録をしたにも関わらず、Herokuでメール送信するためのアドオンSendGridを追加することができませんでした。2回ほど同様の事象が発生し、Herokuに問い合わせたところ異なる返答が返ってきたため、記録しておきます。
#発生した事象
2018年2月、2018年4月にHerokuのアプリにSendGridを追加しようとした際に同様の事象が発生。

```
$ heroku addons:create sendgrid:starter
Creating sendgrid:starter on ⬢ ******app... !
 ▸    The account "*****@gmail.com" is not permitted to install the
 ▸    sendgrid add-on at this time. If you believe this is an error please
 ▸    contact support and reference ID **************
 ▸    when opening an ticket.
```
要するにherokuアカウントのSendGridをインストールする許可がされていない。もしエラーだと思うならサポートに連絡してみてとのこと。

#Herokuの対応
もちろん、エラーだろこれ！って思った私はサポートに連絡。すると翌営業日には返信がきました。まずは2月
###2018年2月
>
It looks like your account was flagged by our anti-spam protections by mistake. This blocked your ability to add email add-ons your apps. That happens sometimes with new accounts. I have unblocked your account. Please try again and get back to us if you still have an issue.

要するに
>
あなたのアカウントは誤って迷惑メール防止機能によってフラグが立てられたようです。これにより、あなたのアプリケーションに電子メールアドオンを追加する機能がブロックされました。それは時には新しいアカウントで発生します。あなたのアカウントのブロックを解除しました。問題が解決しない場合は、もう一度お試しください。

なるほど。確かにSendGridを追加できました。とりあえず連絡取るものだな〜と思いながら4月に別のアプリで同様の事象が発生！！なんでやねんっ！！！前回と同じアカウントなのに、、涙
というわけで再び連絡をしてみました。するとまた翌営業日には返信がきました。
###2018年4月
>
Some add-ons require additional identity verification as a countermeasure to potential platform abuse. At this point, please use our Add-on Verification Tool to authenticate, after which your account should have sufficient privileges to provision the add-on.

むむっ？前回と違う返信が、、
要するに
>
一部のアドオンでは、潜在的なプラットフォーム濫用の対策として追加の身元確認が必要となります。この時点で、Add-on Verification Toolを使用して認証してください。その後、アカウントにアドオンをプロビジョニングするための十分な権限が必要です。

早速[Add-on Verification Tool](https://addons-verification.heroku.com/)を使ってみることに。電話番号を登録して再びトライ。

```
$ heroku addons:create sendgrid:starter
Creating sendgrid:starter on ⬢ *******app... free
Created sendgrid-******** as SENDGRID_PASSWORD, SENDGRID_USERNAME
Use heroku addons:docs sendgrid to view documentation
```

できた！
ターミナルでコマンド履歴の絞り込み検索

# やりたいこと

 - コマンド履歴をいい感じに絞り込み検索したい

![3月-06-2018 20-23-22.gif](https://qiita-image-store.s3.amazonaws.com/0/81805/c6cbf1cb-72e0-51f9-f069-ae6b837fe1a4.gif)


**※以下zshを使っていることを前提としています**

# 準備
## インストール

- Homebrewで`peco`をインストール

```
% brew install peco
```

 - ```.zshrc```に以下を追記


```shell:~/.zshrc

function peco-select-history() {
    # historyを番号なし、逆順、最初から表示。
    # 順番を保持して重複を削除。
    # カーソルの左側の文字列をクエリにしてpecoを起動
    # \nを改行に変換
    BUFFER="$(\history -nr 1 | awk '!a[$0]++' | peco --query "$LBUFFER" | sed 's/\\n/\n/')"
    CURSOR=$#BUFFER             # カーソルを文末に移動
    zle -R -c                   # refresh
}
zle -N peco-select-history
bindkey '^@' peco-select-history
```

- 設定を更新

```
% source ~/.zshrc
```


## 使い方

- ターミナルで```Ctrl-@```

![3月-06-2018 20-23-22.gif](https://qiita-image-store.s3.amazonaws.com/0/81805/c6cbf1cb-72e0-51f9-f069-ae6b837fe1a4.gif)


# 参考

- [pecoでzshのコマンド履歴検索を超快適にする！](https://qiita.com/shepabashi/items/f2bc2be37a31df49bca5)
ターミナルでコマンド履歴の入力補完

# やりたいこと

- 文字入力時に直近の履歴を表示させたい

![3月-06-2018 20-30-18.gif](https://qiita-image-store.s3.amazonaws.com/0/81805/4d99bd6b-0d76-0524-808c-38cd161f3344.gif)


# 準備
##  インストール

zshとoh-my-zshを使った二種類の方法を紹介します

### zsh

- ```zsh-autosuggestions```をクローン (ここでは```~/.zsh/zsh-autosuggestion```へ)

```
% git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions
``` 

- ```~/.zshrc```に以下を記入
 
```shell:.zshrc
source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh
```

- 設定を更新

```
% source ~/.zshrc
```


### Oh My Zsh

- ```$ZSH_CUSTOM/plugins``` に```zsh-autosuggestions```をクローン 
- ```$ZSH_CUSTOM```はデフォルトだと ```~/.oh-my-zsh/custom```

```
% git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
```

 - ```.zshrc```のpluginsに```zsh-autosuggestions```を追記

```shell:~/.zshrc
plugins=(
    git,
    zsh-autosuggestions
)
```

- 設定を更新

```
% source ~/.zshrc
```

## 使い方

- 文字を入力すると薄地でサジェストが表示される
- ```→```か```C-f```か```C-e```で確定
![3月-06-2018 20-30-18.gif](https://qiita-image-store.s3.amazonaws.com/0/81805/4d99bd6b-0d76-0524-808c-38cd161f3344.gif)
- 色は以下を`.zshrc`へ追記し`fg`の値で変更できる。デフォルトは8

```shell:~/.zshrc
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=5'
```

# 参考

- [zsh-users/zsh-autosuggestions](https://github.com/zsh-users/zsh-autosuggestions)
labelImgとChainerCVを使ってアノテーション作業を楽にする

# あらまし

近年、研究者たちは、創造的な仕事を奪われ、AIのためにひたすら「アノテーション※」という儀式を繰り返していた・・・。

これは、そんな「アノテーション」を少しでも簡単にしようとした物語である。


※アノテーション（英語：annotation）
　あるデータに対して関連する情報（メタデータ）を注釈として付与すること。
　XML等の記述形式を用いてメタデータをタグ付けする場合が多い（[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)より）。

※注意
　本記事にて、対象とする「アノテーション」とは、画像からの物体検出に使用するアノテーション方法です。
　画像中の物体名（ラベル）と物体の位置（物体を囲む矩形）の情報をアノテーション情報として記録します。

# 1 labelImg

世の中には、便利なものがたくさんありますが、
今回注目したのは、「**labelImg**」というツールです。

Github:　https://github.com/tzutalin/labelImg

### 1.1 特徴

 + 矩形がPascal VOC形式とYOLO形式で出力できる
 + 矩形を付与する際に、補助線が出る（なにげに助かる機能）
 + **一度出力したxmlファイルを（自動で）再読み込みしてくれる**

これは！使える！（詳細は以下）

### 1.2 インストールと実行方法

作者のGitHubにも載っていますが、一応書いておきます。

#### Python 3 + Qt5

```bash
git clone https://github.com/tzutalin/labelImg.git
cd labelImg
sudo apt-get install pyqt5-dev-tools
sudo pip3 install lxml
make qt5py3
python3 labelImg.py
```

### 1.3 使い方

`python3 labelImg.py` を実行すると、以下の画面が表示されます。

+ `Open`か`Open Dir`で画像または画像の入っているディレクトリを指定すると画像が表示されます。
+ `Create RectBox`を押すと矩形をプロットできるようになるので、矩形をプロットします。
+ 矩形をプロットすると、ラベルの選択画面が表示されるので、矩形で囲った物体のラベルを選択します。
+ Saveでアノテーション結果が保存できます。
  + AutoSave機能もあります（オプションで設定できます）。

![Screenshot from 2018-04-09 23-13-27.jpg](https://qiita-image-store.s3.amazonaws.com/0/104675/2bc93fe0-4b99-3d00-0702-4d18b4f84c61.jpeg)

## 2 便利機能

ここまでは、普通のアノテーションソフトですが、このlabelImgというソフトは、「一度出力したxmlファイルを（自動で）再読み込みしてくれる」機能があります。

ということは、手持ちの物体検出アルゴリズムで物体検出をかけた出力結果をPascal VOCフォーマットで保存すれば、画像のアノテーション処理が半自動化できます。

### 2.1 実際にやってみた

ChainerCVのexampleにあるSSDの検出処理を少し改良し、画像に物体検出処理をかけ、
結果をPascal VOCのフォーマットで出力するプログラムを作成しました。
プログラムはGitHubにあげておきました。
まだ、機能としては入力がJPG画像で、出力がPascal VOCフォーマットだけですが、、、

アノテーションデータ生成：https://github.com/wakaba130/create_annotation

使用方法などは、GitHubに書きました。
わかりにくいなどあれば、こちらのコメントに記載いただいても対応します。

## 2.2 出力について

出力フォーマットは以下のとおりです。
`path`の部分が本家のPascal VOCにはなく、labelImgの仕様だと思われます。

```xml
<annotation>
	<folder>hogehoge</folder>
	<filename>image.jpg</filename>
	<path>/home/hogehoge/image.jpg</path>
  <source>
		<database>Unknown</database>
	</source>
	<size>
		<width>1125</width>
		<height>1600</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>person</name>
		<pose>Unspecified</pose>
		<truncated>1</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>4</xmin>
			<ymin>143</ymin>
			<xmax>947</xmax>
			<ymax>1600</ymax>
		</bndbox>
	</object>
</annotation>
```

### 2.3 作業の流れ

1. アノテーションする画像を１つのディレクトリにまとめる
2. `create_ano.py`を使用して、一度認識にかける
3. labelImgを起動し、`create_ano.py`で出力されたディレクトリを指定する
4. Let's annotation

## 3 最後に

アノテーションは、みんな困っているが、「そこまで作りこむか?」って感情もあり、
なかなか「これだ！」って納得するソフトはなかなか見つからないですね・・・

今回紹介したlabelImg以外にも、「これが便利だよ！」ってツールがあればご紹介いただければ幸いです。
線形代数①

#概要
何回かに分けて線形代数についてまとめていきます。
今回は、行列ってそもそもなんだっけ？ってこと。
全てが正確な説明ではないので、ご了承ください。

ちなみにおススメの本はプログラミングのための線形代数です。

#行列の意味
行列は、基底の変換を行う関数です。

```math
\begin{pmatrix}
a & b \\
c & d 
\end{pmatrix}
\\
↑こういうやつです

```
とはいえ、それだけ言われても良く分からないので
以下の例で理解を深めましょう。

一般的なxy座標は、基底を

```math
x =\begin{pmatrix}
1 \\
0  
\end{pmatrix}
,
y =\begin{pmatrix}
0 \\
1  
\end{pmatrix}

```

としています。

ここで、以下の基底α,βから、一般的なxy座標に基底を変換することを考えます。
＊基底とは座標軸のこと

```math
α =\begin{pmatrix}
2 \\
1  
\end{pmatrix}
,
β =\begin{pmatrix}
1 \\
2  
\end{pmatrix}

```
基底α,β上の点(2,1)はxy座標ではどの点に対応するか？
それを計算するのが以下です。

```math
\begin{pmatrix}
α,β  
\end{pmatrix}
\begin{pmatrix}
2\\1
\end{pmatrix}
=
\begin{pmatrix}
2 & 1 \\
1 & 2 
\end{pmatrix}
\begin{pmatrix}
2\\1  
\end{pmatrix}
=
\begin{pmatrix}
2×2+1×1\\
1×2+2×1  
\end{pmatrix}
=
\begin{pmatrix}
5\\
4  
\end{pmatrix}

```

上記で、分かったことは
α,β上の点(2,1)はx,y上では(5,4)に対応していることです。

以下に、絵をかいてみました。参考にどうぞ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250830/1fe9498d-49ad-8a77-53e8-d84e6b837e0c.png)


#まとめ
- [x] 行列は基底の変換をするもの。

では、お疲れさまでした。
Angular CLI 6.0.0 RCでUniversal + App Shell

Angular CLIの最新版である6.0.0がもうすぐ登場しますね！

<img width="1027" alt="スクリーンショット 2018-04-22 0.18.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/106886/03b12b44-140d-09e2-0c1a-723adb9dd073.png">

この記事では、現在RC版のAngular CLI 6.0.0でUniversal（サーバーサイドレンダリング）とApp Shellを組み込む手順を紹介します。

※6.0.0リリース後は操作が異なる場合があります

## プロジェクトの作成

まずはAngular CLI 6.0.0 RCをインストールしてください。

```shell
$ npm i -g @angular/cli@next
```

新しいプロジェクトを作成します。

```shell
$ ng new my-app --routing
$ cd my-app
```

## Universalを組み込む

Universal用のファイル一式を作成します。

```shell
$ ng g universal --client-project=my-app
```

依存関係を更新するため`npm install`を実行しましょう。

```shell
$ npm i
```

`angular.json`のパス設定が間違っているので修正します。
**※現在は修正されています**

```json:angular.json
"server": {
  "builder": "@angular-devkit/build-angular:server",
  "options": {
    "outputPath": "dist/my-app-server",
    "main": "src/main.server.ts",
    "tsConfig": "src/tsconfig.server.json"
  }
}
```
↑今後修正されると思います（https://github.com/angular/angular-cli/issues/10288）

`tsconfig.server.json`の場所が悪いので移動します。 
**※現在は修正されています**

```shell
$ mv tsconfig.server.json src/tsconfig.server.json
```

移動したので`entryModule`のパスを修正します。
**※現在は修正されています**

```json:src/tsconfig.server.json
{
  "extends": "./tsconfig.app.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app-server",
    "module": "commonjs"
  },
  "angularCompilerOptions": {
    "entryModule": "app/app.server.module#AppServerModule"
  }
}
```

## App Shellを組み込む

App Shellを作成します。

```shell
$ ng g app-shell --client-project=my-app --universal-project=my-app
```

プロダクションビルド用に設定を変更します。

```json:angular.json
"app-shell": {
  "builder": "@angular-devkit/build-angular:app-shell",
  "options": {
    "browserTarget": "my-app:build",
    "serverTarget": "my-app:server",
    "route": "shell"
  },
  "configurations": {
    "production": {
      "browserTarget": "my-app:build:production"
    }
  }
}
```

## アプリのビルド

`ng run`でビルドします。

```shell
$ ng run my-app:app-shell:production
```

ブラウザーで確認してみましょう。

```shell
$ npx http-server ./dist/my-app
```

でサーバーを起動して、`http://localhost:8080`を開くとビルドしたアプリを見ることが出来ます。

## おわりに

RC版のAngular CLIでApp Shellを組み込むところまでできました。
~~手で修正するのが非常に面倒ですね！~~
2018/05/06 v6.0.0でUniversalのバグが修正されました、やったね！

Angular CLI 6.0.0はまだ開発中のため、1.7系からコマンドが変更された部分では苦労するかもしれません。`--help`オプションで確認したり、[angular/angular-cli](https://github.com/angular/angular-cli)や[angular/devkit](https://github.com/angular/devkit)のドキュメントやIssuesを見ると良いと思います。


## 参考
https://next.angular.io/guide/universal
https://github.com/puku0x/angular-pwa-sample/tree/next
Sandisk製SDカード書き込み禁止問題の対策とその後

#症状（体験談）
mvコマンドで一個一個ファイルを移動してたら急に動かせなくなる

しょうがないから初期化しようとフォーマットするも**不明な容量**と表示される
*→フォーマットできない*

GPartedの使用を目論むも**「書き込み禁止です」**と言われた

#原因
https://kb-jp.sandisk.com/app/answers/list/search/1/kw/ＵＳＢ書き込み禁止%E3%80%80/suggested/1
これによると、
>書込み禁止エラーは、フラッシュドライブ自身が潜在的な不具合を検出した際に発生します。それにより、データ紛失を防ぐためにドライブは書込み禁止モードになります。**この症状を戻す方法はございません。**この問題が…
>
やりやがったなsandisk……

#解決方法
いろいろ調べてみたりしましたが、成功例が載ってるサイトがないので、成功した方はご報告お願いします！
[備忘録] Dockerfileとdocker-compose.ymlと遭遇したらの起動方法

最近、自分が混乱しているためのメモ書き。

# Dockerfileがあった場合の起動
→　Dockerfileの起動は単一のDockerイメージをカスタマイズしたファイル（Dockerfile）を起動するイメージ

```
docker build -t <<イメージ名：なんでもOK>> .
docker run -d <<イメージ名：なんでもOK>>
docker logs xxxx
```

起動例：Dockerfileにspringbootの起動するようイメージ作成している

```
docker build -t springboot .
docker run -d -p 8080:8080 springboot
docker logs xxxx
```

# docker-compose.ymlがあった場合の起動
→　複数のDockerイメージを定義し実行するイメージ

```
docker-compose up -d
```

# 共通で使っている「オプションD」
→　バックグラウンドで実行
老技術者Windows10にVisual Studio Code付きAnacondaを入れにけり

こんばんは、**老技術者**です。
今宵はマッコリを片手に**Visual Studio Code付きAnaconda**のお話し。

##0. はじめに
社内にて「数学で理解するディープラーニング」なんぞを始めたるが
テキストに**Python**のコードを装飾のように書いてしまったのだよ。
さうしたら、受講者に**Python**書ける人がほとんどいないときた。
「この講座では**Python**の文法解説はしませんので
皆さん各自でググって、とりあえず**Python**開発環境を
作り、このコードを**写経**してくださいね、南無…」
と言い放ちたるが、受講者の表情にわかに**かき曇り**たるなり。
「おすすめは、と言うか、私の周りはみんなVSCode使ってます。
で、pipするのが面倒な無精者の老技術者はAnaconda…」
お、皆さんなんかメモしている。
まあこれだけ言っておけば帰宅後に「VSCode Anaconda 開発環境」
なんて検索かければ、サル分かりのQiitaが出てくるだろうと。
一応、老技術者も講義後にググってみたのだが…
**全然ねえじゃねえくゎっ！**
代わりに出てきたのがこの記事。
https://forest.watch.impress.co.jp/docs/news/1106857.html
なんとAnaconda入れると漏れなくVSCodeが付いてくる、と。
そんな便利なことがあって良いのでせうか！
早速、前々職で**退職金代わり**にいただいたPCにぶち込んでみたるの記。

## 1. ダウンロード
Anacondaサイト（ https://www.anaconda.com/download/ ）から
Anaconda 最新版をダウンロード。
skip registrationをクリックすれば登録必要なし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/82bb47a1-27b7-8a0e-5959-ca66ba6eed26.png)

Work Email入れろみたいなの出るが「No Thanks」。
![q1.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/0dc245f0-57e6-a0ae-502e-44d5ae7f5c97.jpeg)

## 2. インストーラー起動
Anaconda3-5.1.0-Windows-x86_64.exeを起動。
![q2.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/3063cb73-bb01-829a-5ae8-f5277364f3c3.jpeg)

ライセンス規約読みたきゃ読んで **I Agree**。
![q3.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/89cb5a46-1d1a-7ab5-87ea-de09e6e79f8a.jpeg)

他人には使わせるものか！
![q4.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/23bdc80c-560c-efc6-2764-eca091f16d08.jpeg)

インストール先はC:\Anaconda3にしてNext。
![q5.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/c81b1560-6a64-da17-5e45-13cc3e901a8c.jpeg)


チェックボックスの両方にチェック入れてInstall。
![q6.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/1c1a11c1-8ad6-3c23-b44a-1fa5d6bcb22d.jpeg)


![q7.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/10631919-9892-c1a3-81a5-bae25f8c7d3f.jpeg)

Completeと出たらNext。
![q8.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/fefce46e-da59-1e90-d006-dfaa2801c2ca.jpeg)

お、いよいよ出てきました。
Install Microsoft VSCodeをクリック。
![q9.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/661931f2-8f04-6f3b-8891-b2c44274099a.jpeg)

VSCode Installation Succeeded! と出たらNext。
![q10.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/870af1e6-f9d9-804b-07af-22219be6a10b.jpeg)

チェック2つとも外してFinish。
![q11.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/09df75d3-20b9-35b7-5d8e-e965758d40d7.jpeg)

スタート画面で「Visual Studio Code」を見つけて起動！![q12.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/64c5b0ad-fd1a-0c28-df84-7a819ec7d3b1.jpeg)

パスもちゃんと通ってます。
![q13.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/bedebd42-5cdb-02cb-b3a2-8997a193d803.jpeg)

ライブラリのアップデートはこちらから。
![q14.jpg](https://qiita-image-store.s3.amazonaws.com/0/202911/724a7ca3-9b50-c9da-b8db-7ece23d624c5.jpeg)
ChatworkにPowerShellからメッセージ送信

#0. はじめに
うちの会社では、Chatworkをコミュニケーションツールとして使っています。
社内の情報共有は勿論のこと、システム管理のアラートもChatworkに飛ばしてますが、最近ガンガン使っているAzure環境からWebHookを利用した監視アラートを実施すべく、まずはその第一歩となるPowerShellからのチャットワーク通知です。

# 1. PowerShellスクリプトを準備
test.ps1 ファイルを作成しましょ。
固定メッセージであれば、簡単です。PowerShellの場合、curl ではなくInvoke-RestMethod を利用します。

```
$ROOM_ID="<ChatWorkのルームIDを指定>"
$TOKEN_ID="<ChatWorkのトークンIDを指定>"
$TO_ADDRESS="[To:<TOに指定するID>]"
$MSG=$TO_ADDRESS + "`n" + "<送信したいメッセージ>"

Invoke-RestMethod -Uri "https://api.chatwork.com/v2/rooms/$ROOM_ID/messages" -Method POST -Headers @{"X-ChatWorkToken" = $TOKEN_ID} -Body "body=$MSG"


<Sample>
$ROOM_ID="123456789"
$TOKEN_ID="abcdefghijklmnopqrstuvwxyz"
$TO_ADDRESS="[To:99999999]"
$MSG=$TO_ADDRESS + "`n" + "Oh...Yes"

Invoke-RestMethod -Uri "https://api.chatwork.com/v2/rooms/$ROOM_ID/messages" -Method POST -Headers @{"X-ChatWorkToken" = $TOKEN_ID} -Body "body=$MSG"

```
あとは、作成したスクリプトをPowerShellで実行するだけです。


# 補足
・ルームIDの確認方法

```
   送信したいチャットワークをブラウザに表示させて、URLを確認してください。
   https://www.chatwork.com/#!rid**********
   ****** 部分が数字になってます。これが_ルームID_！！
```


・[トークンIDの確認方法(Chatwork公式サイト)](https://help.chatwork.com/hc/ja/articles/115000172402-API-Token%E3%82%92%E7%99%BA%E8%A1%8C%E3%81%99%E3%82%8B)
prettier + git + webpack4でソースコードの変更の度に自動整形

# prettierで自動整形

[prettier](https://github.com/prettier/prettier)はソースコードのオートフォーマットをしてくれるライブラリ。

僕の用途は`.js`や`.jsx`のオートフォーマットです。（たぶん他にもいろいろ対応していますが現在何に対応しているかは知りません）

`prettier`コマンドを叩くと、`.prettierrc`や`.prettireignore`の設定を参考にソースコードを自動で整形してくれます。あら便利！

## prettierコマンド叩くの面倒じゃないですか？

毎回commitする前とかにprettierを手でかけるのは面倒だし忘れそう。かといってcommitフックで勝手にフォーマットかけられると最終どうなったか見えない（いや見える必要はないのだが。。）

なので`webpack --watch`や`webpack-dev-server`でソースコードが変わる度に自動で`prettier`かかるようにしよう！

ちなみに以下掲載していくソースコードはこんな環境で動かしたよ

- Mac OSX 10.11.6
- git 2.10.1 (Apple Git-78)
- node v8.11.1
- npm 5.6.0
- webpack 4.6.0
- webpack-cli 2.0.14
- webpack-dev-server 3.1.3
- prettier 1.12.1

### プラグイン

```javascript
const exec = require('child_process').exec;

class PrettierWebpackWatchPlugin {
  apply(compiler) {
    // compiler.hooks.run.tapAsync('PrettierWebpackWatchPlugin', this.prettify); *注1
    compiler.hooks.watchRun.tapAsync('PrettierWebpackWatchPlugin', this.prettify);
  }

  prettify(_, callback) {
    exec(/* prettier実行するコマンド ex. 'prettier' */, (error, stdout, stderr) => {
      console.log(stdout);
      callback();
    });
  }
}

module.exports = PrettierWebpackWatchPlugin;
```

*注1 `compiler.hooks.xxx`の`xxx`のところは、[Compiler Hooks](https://webpack.js.org/api/compiler-hooks/#hooks)を参考にしてね。`webpack`コマンドで一度だけ実行する場合、`compiler.hooks.run`に変更しないとtapされないよ。

こいつを`webpack.config.js`的なファイルで

```javascript
  plugins: [
    new PrettierWebpackWatchPlugin(),
  ],
```

したら、無事完成。

おっと、`/* prettier実行するコマンド */`のところでオートフォーマットかけないといけない。

## どのファイルを自動整形するか

`src`的なディレクトリを指定して全ファイル自動整形するのは楽そうだが、ソースコード変更する度にそれするのは大規模プロジェクトとかだと死亡するのが見えるので、gitでHEADから変更があったファイルのみかけるようにしましょう。プロジェクトの途中から導入するときは、全ファイル一括でかけたあとに今回のやつを導入すれば以降は幸せな世界が待ってる（はず）。全部一括でかけるときはくれぐれも他の人の作業ブランチとかには気をつけてくださいね。

### スクリプト

```bash
#!/bin/sh
jsfiles=$(git diff --name-only --diff-filter=ACM "*.js" "*.jsx" | tr '\n' ' ')
[ -z "$jsfiles" ] && exit 0

# Prettify all staged .js|.jsx files
echo "$jsfiles" | xargs ./node_modules/.bin/prettier --write

exit 0
```

これとかを`prettify.sh`とかにして`webpack.config.js`とかの階層に配置して、プラグインから呼ぶか、インラインコマンドにしてプラグインの中に埋めるかして自動整形かければよさそうです。

## おわりに

ちょっとgitの仕様とか、webpackのexecのあたりとか詳しいわけではないので何か指摘とかあったらいただけるとこの記事見る人が助かると思いますm(_ _)m

あと細かい説明とかなんで自動整形とか入れたのかとか、そういう話は時間があったら追記します。

そして記念すべきはじめての投稿です🎉🎉🎉

これからみなさんの役に立つ記事とかをなるべく再現性あるように記載していきます。余裕があったらリポジトリとかも公開していきますね。
Googleクラウド自然言語APIのscoreをよく見てみた

Googleクラウド自然言語APIの感情分析触っていまして、ポジネガを判定するシステムなど開発しています。ツイッターやらはてブのコメントなど分析した結果をみていると、まあまあの精度が出ています。
#自然言語APIについて
クラウド自然言語はこちらです
https://cloud.google.com/natural-language/?hl=ja
>Google の機械学習を使って、非構造化テキストから分析情報を得る 

というものになります。具体的には、ある文章を入力するとアウトプットとして、その文章に含まれる固有名詞、場所、人物などの情報、そしてその文章全体の感情などを測定することができます。センチメント分析は文章の感情を、ポジティブ・ニュートラル・ネガティブかを判断します。scoreとmagnitudeという値で感情を判断します。

#センチメント分析をやってみた
実際にセンチメント分析してみたました。
分析対象のページは [木梨憲武お悩み相談「自分の才能や合う仕事がわかりません（22才男性）」](http://b.hatena.ne.jp/entry/s/miyearnzzlabo.com/archives/49657) のブコメです。

#scoreが高い・低い文章を見てみた
スコアが0.9、0.5、0.0、-0.1、-0.5、-0.8のものを抜粋して見てみます。※0.9のコメントがなかったため

スコア0.9

- かっこいい
- 人に助けられてきた人は助けるのが上手だよね
- いいアドバイス貰ったな～　で終わらせないあたり強い
- 良い意味でのとんねるず感
- 好きな仕事を探す、でなく、環境が仕事を好きにさせる… わかる、いいね。


スコア0.5

- ただ上からモノ言って終わりじゃなく、会ったこともない人間にチャンスを作ってあげるお悩み相談ってすごいな。会社の上司ですら他人事な人間で溢れてるのに。
- 後の展開も気になるけどノリさんの「結局は人」ってすごい納得した
- 北方謙三が「ソープ予約しといたから！」ってくらいすごい
- かっけえ これでリバティー君が動くか。
- 出来る人と繋がろうとするの大事ね。


スコア0.1

- スターだな
- すっげぇな
- イカおやじを彷彿させる
- 続報知りたいわ
- はがき職人が出待ちして構成作家見習いになるような感じ。


スコア0.0

- 今回の結末はどうあれ、若い人に道を作ってあげられる人には憧れるし尊敬する。
- なんかすげー
- ぐっとくる
- 文字通りリバティか。
- コネがあれば...と思い描くことがあっても、こう急にチャンスが舞い込んできたら困惑するだろうなぁ。


スコア-0.1

- 相談じゃなくて解決させようとしてるっさすが
- らっきょうきらいきらいと隣で言い続けられたら、らっきょうがきらいになった人。
- なんでブクマめっちゃついてるんやろ、と思ったら何この展開、しびれるな
- どう考えてもこれ木梨憲武さんの才能の塊の賜物でしょこんなん誰もかなわんわ……


スコア-0.5

- ラジオにメールするというのは決して大それた努力ではないが、何もしないより何かした、という一点においてはるかに大きな一歩であるということ。
- すんごいとんねるずっぽい嫌な感じwのオチだけどラジオに相談メール出すって行動だけで人生大きく動かせるかもしれないからとりあえず動いて失敗したら次行く元気があればなんとかなる
- とは言え、たぶんこの回答はレギュラー出演なら言えなかったと思う。
- すてきな展開だけど同じことを石橋がやったら「権力ふりかざしてる」「周りのスタッフに迷惑」「新手のパワハラ」みたく叩かれて石橋もその空気を知ってて「憲武はいいよなー」って拗ねるパターン


スコア-0.8

- 落ち目扱いされてる時期でもこういうこと出来るのがとんねるずだよなあ。
- えっと・・・とりあえず長い！長すぎる・・・答えに行くまでに離脱しちゃいました。読んでもらえない時点で厳しいなぁ・・・ 

という感じです。分類できているような、できない部分もあるような。なんとなくですが、文脈は関係なしにネガティブっぽいワードが入っている文章はネガティブになりがちなのかなと思います。ただ、0.9と0.5の違いはよくわからないですかね、、、

#ネガティブな文章にポジティブな内容を足してみる
ここからは実験です。分析結果の文章を眺めていて「いいね」というワードってポジティブに捉えられるのかなと思って、ネガティブな文章に「いいね」というワードを足したらどうなるのかやってみました。

いいねをつける前

| 内容 | スコア |
|:-:|:-:|
| 相談じゃなくて解決させようとしてるっさすが |  -0.1 |
| どう考えてもこれ木梨憲武さんの才能の塊の賜物でしょこんなん誰もかなわんわ……  | -0.1  |
| とは言え、たぶんこの回答はレギュラー出演なら言えなかったと思う。  |  -0.5 |

いいねをつけた後

| 内容 | スコア |
|:-:|:-:|
| いいね。相談じゃなくて解決させようとしてるっさすが  |  0.2 |
| いいね。どう考えてもこれ木梨憲武さんの才能の塊の賜物でしょこんなん誰もかなわんわ……  |  0.3 |
| いいね。とは言え、たぶんこの回答はレギュラー出演なら言えなかったと思う。  |  0.1 |


というかんじで相殺されてポジティブになりました。

#「すごい」という言葉のスコアを調べた
「すごい」っていろんな言い方あると思うのですね。「すご」とか「すっげ」とかそういう言葉のスコアの違いを調べてみました。

| 内容 | スコア |
|:-:|:-:|
| すごい  |  0.7 |
| すげえ  | 0  |
| すげぇぇぇ  | 0  |
| すっごい  |  0.1 |
| すご  | 0.8  |
| すっごく  |  0.1 |
| すごーい  |  0 |
| すごーい！  | 0.1  |

でした。結構スコア違いますね。（大丈夫なのかな。）


ということで、センチメント分析についてでした。また今度自然言語APIについて記事にしたいと思います。
Ubuntu16.04でペアリングできているのにBluetoothヘッドホンの音が出力されない事象を解消する

UbuntuでBluetooth接続のヘッドホンを使って音楽を聴きたいのに、
ペアリングができているにも関わらず音が出力されないという事象でハマりまくったので、その時の対処をメモ。

# こんな人が読むと役に立つかも
- Ubuntuでオーディオを聴きたいのに、ペアリングはできているにも関わらず何故か音が出なくて困っている

こんな感じで間違いなくペアリングはできているのに、テストしてみても音が出ない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/a38d7a7c-b7de-62ff-a923-91e48ff094f1.png)

- 細かいことはどうでもいいけど音楽聴けないと死んじゃうからとりあえず何とかしたい

# 環境
- OS：Ubuntu 16.04
- ペアリング済ヘッドホン：SONY MDR-XB950BT
(恐らくこのヘッドホンに限らず事象は起き得るのであまり関係ないと思っている)

# 実施の流れ
1.Bluetoothマネージャの追加
2.Bluetoothマネージャでデバイス設定変更
3.動作確認

# 1.Bluetoothマネージャの追加

`Ubuntuソフトウェア`を起動
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/066d7d72-cd46-15ec-2bcf-8bdc187e947d.png)

検索窓で`blueman`と検索。
候補に`Bluetooth Adapters`が出てくるはずなので、それを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/d742d2ec-769a-31be-7512-5aebbab30623.png)

未インストールであれば`インストール`を、インストール済であれば`起動`を選択
(私は既にインストール済だったため、キャプチャはインストール済の場合)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/e4b56fd5-9c39-5ea5-0d75-416705a04f6a.png)

Bluetooth周りの設定を弄る間はツールがすぐに使えるところにある方が便利なので、`常に表示`を選択して`Close`。
(設定が終わったあとで非表示等にご自由に変更いただければ)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/184960c6-5319-a2bc-3b95-83ec9826461f.png)

# 2.Bluetoothマネージャでデバイス設定変更
1でインストールしたものを起動したタイミングでデスクトップ上部のバーにBluetoothマークのアイコンが増えているはずなので、
アイコンをクリック->`デバイス`を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/070b1c2b-f06a-698b-dd46-4aae4a7d0d15.png)

こんな画面が表示されるはず
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/f818ca5a-8098-6115-7d26-b7a44a8bda2f.png)

対象デバイスを右クリック->`オーディオプロファイル`->`High Fidelity Playback(A2DP Sink)`を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/b2ef7af3-b487-48c1-1372-5e8d7095bcd6.png)

# 3.動作確認
`システム設定`->`サウンド`設定を開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/bceaadac-5a96-5843-6e06-4ebbf4f2ecd0.png)

Bluetooth接続済みのデバイスを選択して`テスト`を使って音が出力されることを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/65a5c900-c0fa-3e9c-754b-822669a3375a.png)

## 参考情報
この設定によって、どうやらモードという設定項目が増えるようである。
ここのモードを変更すると出力されなくなったため、どうやらこのモード設定が重要な模様。
モードを変更すると何故がこの画面からモードの選択欄すら消えてしまい、2の手順を再度行う羽目になるため、一度変更したら大人しくその設定のままでいることがオススメ。

Before
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/3af70009-1451-89a0-efe4-0d4ee72e900b.png)

After
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244394/0ab17d40-d91c-f685-2c85-d363cb07f929.png)
ODEコンパイル【MINGW】【MSYS】【ODE】

# MSYSおよびMinGWのインストール
以下より、MSYSのインストーラをダウンロードし、インストールする。
https://sourceforge.net/projects/msys2/

その後、以下のコマンドでMSYSをアップデートする。

```
$ update-core
$ pacman -Su
```
その後、以下のコマンドよりMinGW等をインストールする。

```
$ pacman -S base-devel
$ pacman -S msys2-devel
$ pacman -S mingw-w64-x86_64-toolchain
```



# ODEのダウンロ―ドおよびコンパイル
以下より、ODEをダウンロードする。
64bitOSの場合は「ode-0.13.tar.bz2」をダウンロードする。
https://sourceforge.net/projects/opende/files/ODE/0.13/

インストール後、コマンドプロンプトにて、
以下URLを参照し、以下のコマンドを入力

```
premake4 --with-libccd --only-double --only-static --with-demos gmake
```

　その後、MSYSのmingwより、gmakeのフォルダに移動し、「make」をコマンド。
エラーが出るが、指定されたファイルのクォーテーションをダブルクォーテーションに直せばコンパイルが通る。

# 最近の感想（2019年12月18日）
　色々勉強のため、ODEについて調べていたけど、正直最近ならROSやOpenHRPなどの方が良いと思うね。なんたってODEは情報が古すぎる。でもまぁ、こういう奴の躓き経験こそ、レベルアップにはかもしれない。調査力を上げるという意味で。


# 参考
[MinGW 64 bit 版 のセットアップ](http://www.geocities.jp/penguinitis2002/computer/programming/MinGW-w64.html)
[ODE-0.13をMSVCでビルド](http://hara.jpn.com/_default/ja/Software/Build_ODE_with_MSVC.html)
はじめて転職するエンジニアのための履歴書・職務経歴書作り

# TL;DR
1. 転職をしたくなったら、いつでも会社訪問/面接にいけるように履歴書・職務経歴書を作っておく
2. エンジニアなら手書きの履歴書ではなくPDFで受け渡しできるようにしておく
3. JIS規格の履歴書テンプレート(Word)で履歴書を作り、PDF化する
4. Markdownで職務経歴書を作り、VSCodeのMarkdon PDFプラグインでPDF化を行う

# 転職したくなったら
転職をしたくなったはいいが、選考のプロセスが億劫でなかなか踏み切れず、現職に留まっている人も多いのではないでしょうか。
夢を叶えるために、次の会社へ移りたいと少しでも考えている/考えたことがあるのならば、まずは以下のものをさくっと準備しましょう。

- 履歴書
- 職務経歴書 

忙しい業務の中で、いつ採用選考が始まるかはわかりません。
いつでも動けるように、履歴書・職務経歴書を作ってメンテナンスしておくことが重要です。
履歴書・職務経歴書があれば、転職への一つ目のハードルをクリアしたも同然です。

# 履歴書・職務経歴書をPDFで渡せるように作ろう
最終的にはPDFで先方に提出できるようにすることがゴールです。
手書きじゃなくて、PCで作成できることも一種のアピールです。
それに、手書きの履歴書しか認めない会社なんて嫌じゃないですか？

PDFであることのメリットは以下の通り。

### 環境に依存しにくい
今や、ブラウザさえあれば開けるのがPDF。
Wordファイルをもらっても、Officeが入っていないPCの可能性もありますし、スタイルが崩れる可能性も。
また、Wordファイルだとマクロウイルスが仕込まれる可能性も考慮しなければいけないため、人事担当者にとっては大変です。
その点、PDFなら容易に受け渡しできます。

### コンビニでも印刷できる
データとして履歴書・職務経歴書を受け渡しするのではなく、紙ベースで受け渡しをしなければいけない場合になったら、
PDFならばセブンイレブンのネットプリントなどを通して、楽に印刷をかけることができます。

# JIS規格の履歴書の作成
履歴書を作るにあたって、どんな形態の履歴書にするか迷った場合には、JIS規格の履歴書を作りましょう。
企業によっては、JIS規格の履歴書での提出を求められる場合もあるとか。そんな企業にも対応できるためです。

Microsoftが、JIS規格の履歴書のテンプレートを用意してくれているので、これを使いましょう。
[履歴書(JIS規格）](https://templates.office.com/ja-jp/%E5%B1%A5%E6%AD%B4%E6%9B%B8-JIS%E8%A6%8F%E6%A0%BC%EF%BC%89-TM90002025)
※リンクが切れていたら、履歴書 JIS規格 などと検索すれば出てくると思います。

ダウンロードして編集するもよし、Word Onlineを使って無料で編集するでも良しです。

書き方は、「転職 履歴書 書き方」などで。
こんなところとか。[履歴書の書き方マニュアル完全版！　履歴書の見本（サンプル）・作成方法](https://tenshoku.mynavi.jp/knowhow/rirekisho)

作り始めと同時に、履歴書へ貼り付ける写真データの用意も。
私はカメラのキタムラの[証明写真サービス](http://www.kitamura-print.com/photo_id/)を利用して、証明写真をデータでもらいました。

Wordで体裁を整えたら、Word(Online)でPDFで保存しましょう。

# VSCodeを使ってMarkdownで職務経歴書を作ろう
あなたが何をしてきたのか、を表す大事な職務経歴書。
簡素にまとめて、自分の経歴をさくっと分かってもらうことを意識したとき、Markdown形式で作成することは大きなメリットがあります。
別にWordやHTML/CSSで職務経歴書を作っても構いませんが、Markdownを使えば無駄な記述/操作なしに伝えたいことだけをまとめあげることができます。
何より、一度作ってしまえば、GitなどのVCSで管理しておくことで差分の比較も容易にできます。

さて、Markdownで作るにあたって、[VSCode](https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)はMarkdownのプレビューが簡単に表示されるので、
Markdownの初心者にとっては便利なものです。
プラグインとして、[Markdown PDF](https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf)が便利で、保存のたびにPDF化してくれるオプションも用意されています。
PDF化したときに、どんな見た目になるのか確認しながら作りたいのならば、VSCodeを使いましょう。

何を書くか、どんな構成で書くかについても、
「エンジニア 職務経歴書 書き方」などで検索を。
私としては、[エンジニアが読みたくなる職務経歴書](https://dwango.github.io/articles/engineers-resume/)などが参考になりました。

# PDFファイルを作ったら
無くしてしまわないように、プライベートリポジトリなり、クラウドなりに保存しておきましょう。

# おわりに
大事なことは、読み手(人事・選考担当者)に如何に自分のありのままの姿が伝わるか、です。
シンプルでわかりやすい履歴書・職務経歴書を作って、意気揚々と読んでくれるようなPDFを作りましょう！
QRコードの読取、生成をする [Android]

## 開発環境

OS: macOS HighSierra
Android Studio: 3.0.1

・APIレベルの設定

```gradle:build.gradle
android {
    compileSdkVersion 26
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 26
        }
}
```

## ライブラリの導入
使用するライブラリ:
zxing-android-embedded (3.6.0)
https://github.com/journeyapps/zxing-android-embedded

プロジェクトへの追加方法:
    build.gradle (Module: app)に以下の一文を追加する。

```gradle:build.gradle
dependencies {
    ...
    compile 'com.journeyapps:zxing-android-embedded:3.6.0'
}
```

## QRコードの読み取り
###読み取り用カメラの起動
```java:

new IntentIntegrator(MainActivity.this).initiateScan();
```
読み取り処理をしたいところに上記のコードを記述する。
`MainActivity.this`の部分は対象のActivity名に変更して使う。

###読み取った結果の取得
```java
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if(result != null) {
            Log.d("readQR", result.getContents());
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }
```
読み取ったデータを`getContents()`でString型で受け取ることができる。

## QRコードの生成
```java:
//QRコード化する文字列
String data = "https://www.google.com";
//QRコード画像の大きさを指定(pixel)
int size = 500;


try {
    BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
    //QRコードをBitmapで作成
    Bitmap bitmap = barcodeEncoder.encodeBitmap(data,BarcodeFormat.QR_CODE, size, size);

    //作成したQRコードを画面上に配置
    ImageView imageViewQrCode = (ImageView) findViewById(R.id.imageView);
    imageViewQrCode.setImageBitmap(bitmap);

} catch (WriterException e) {
    throw new AndroidRuntimeException("Barcode Error.", e);
}
```
・`data`の中身がQRコードに反映される。
・`size`で画像の大きさを指定する。

Acticityに対応するxmlファイルでImageViewを用意しておき、
Bitmapで作成したQRコードを配置し、画面に表示する。

**<文字コードや、誤り訂正レベル、QRコードのバージョン等を指定したい場合>**

```java:

String data = "https://www.google.com"; //QRコード化する文字列
//QRコード画像の大きさを指定(pixel)
int size = 500;

try {
    BarcodeEncoder barcodeEncoder = new BarcodeEncoder();

    HashMap hints = new HashMap();

    //文字コードの指定
    hints.put(EncodeHintType.CHARACTER_SET, "shiftjis");

    //誤り訂正レベルを指定
        //L 7%が復元可能
        //M 15%が復元可能
        //Q 25%が復元可能
        //H 30%が復元可能
    hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);

    //QRコードのバージョンを指定
    hints.put(EncodeHintType.QR_VERSION, 20);

    Bitmap bitmap = barcodeEncoder.encodeBitmap(data, BarcodeFormat.QR_CODE, size, size, hints);

    ImageView imageViewQrCode = (ImageView) findViewById(R.id.imageView);
    imageViewQrCode.setImageBitmap(bitmap);

} catch (WriterException e) {
    throw new AndroidRuntimeException("Barcode Error.", e);
}
```
`EncodeHintType`を使用して細かい指定をしつつQRコードを作成できる。
instance_evalとclass_evalについての備忘録

メタプログラミングRubyを読んで書いています。
ちょっとした備忘録です。

instance_evalとclass_evalの挙動の違いについて。

<h1>instance_evalとは何か？</h1>
instance_evalは、オブジェクトの特異クラスにインスタンスメソッドを定義したり、そのオブジェクト自身が参照できるインスタンス変数を定義、または上書きしたりすることができる。

```instance_eval.rb
class Sample
  def initialize
    @x = 1
  end
end

sample = Sample.new
sample.instance_eval do
  @y = 1
  def output # =>　これは特異クラスのインスタンスメソッドになる
    @x + @y
  end
end

puts sample.output # => 2

puts sample.singleton_class.instance_methods.grep(/output/) # => output
```

<a href="http://rochefort.hatenablog.com/entry/effective_ruby_section6_singleton">特異クラスについてはこちら</a>

<h1>class_evalとは何か？</h1>
class_evalは、クラスにインスタンスメソッドやクラスメソッド（特異メソッド）を追加したり、そのクラス自身のインスタンス変数（クラスインスタンス変数）やクラス変数を定義、または上書きしたりするときに利用できる。

```class_eval.rb
class Sample
  def initialize
    @x = 1
  end
end

Sample.class_eval do
  @y = 1 # クラスインスタンス変数
  @@a = 1 # クラス変数
  def output # クラス内のインスタンスメソッド
    @x
  end
end

sample = Sample.new
puts sample.instance_variables # => @x
puts Sample.instance_variables # => @y
puts Sample.class_variables # => @@a
puts sample.output # => 1
puts Sample.instance_methods.grep(/output/) # => output
```

このように、class_evalの中で、インスタンス変数を定義しようとすると、それはクラスのクラスインスタンス変数になる。
クラス変数はそのまま書けば、クラス変数として扱われる。
メソッドはクラス内のインスタンスメソッドとして定義されるので、もちろん、作成したオブジェクト(sample）はそのメソッドを利用することができる。

<h1>とりあえず理解してけば良いこと</h1>

instance_evalについて
・レシーバーであるインスタンスのインスタンス変数を定義したり、上書きすることができる。
・レシーバーであるインスタンスが利用できるメソッド（インスタンスの特異クラスのインスタンスメソッド。他のインスタンスは当然ながら、このメソッドを利用することはできない）を定義したり、上書きすることができる。

class_evalについて
・レシーバーであるクラスのインスタンス変数（クラスインスタンス変数）やクラス変数を定義したり、上書きすることができる。
・レシーバーであるクラスのインスタンスメソッドを定義したり、上書きすることができる。

これだけわかっておけば、基本問題ない気がする。

<h1>試してみたこと</h1>
<h3>1. インスタンスには、インスタンス固有のメソッド</h3>

```instance_eval.rb
class MyClass
  def initialize
    @x = 1
  end
end

first = MyClass.new
first.instance_eval do
  @y = 1
  def calc
    @x + @y
  end
end
puts first.calc

second = MyClass.new
puts second.calc # => Error　secondにはcalcメソッドが定義されていないから。
```

instance_evalのレシーバーであるオブジェクトだけが、定義や上書きの対象になる様子。
上のコードではオブジェクトfirstにinstance_evalをして、中身をいじくっているが、
そのあとに定義されたオブジェクトsecondには全く反映されていない。

<h3>2. インスタンスに定義されたメソッドの行方</h3>

```evals.rb
class InstanceEval
  def initialize
    @x = 1
  end
end
sample = InstanceEval.new
sample.instance_eval do
  def output
    @x
  end
end
puts sample.instance_variables # => @x
puts sample.output # => 1

class ClassEval
  def initialize
    @y = 1
  end
end
ClassEval.class_eval do
  @v = 1 # クラスインスタンス変数。クラスのインスタンス変数。
  @@a = 1 # クラス変数。initializeの外に書いても、クラス変数。
  def output
    @y
  end
end
another_sample = ClassEval.new

puts sample.singleton_methods.grep(/output/) # => output
puts sample.singleton_class.instance_methods.grep(/output/) # => output
puts InstanceEval.instance_methods.grep(/output/)
puts ClassEval.instance_methods.grep(/output/) # => output
puts ClassEval.instance_variables # => @v
puts ClassEval.class_variables # => @@a
puts another_sample.instance_variables # => @y
```

instance_evalで定義したメソッドは、instance_methodsメソッドで発見できなかった。
なので、singleton_classのインスタンスメソッドを探したところ、発見した。
instance_evalで定義したメソッドは、レシーバーの特異クラスのインスタンスメソッドになるみたい。
１つ前のコードで、あるインスタンスの中で定義されたメソッドが、他のインスタンスでは使えないという理由がここにあったみたいだ。
M5 C5 インスタンスのOSが認識するデバイス名

#M5 C5 インスタンスのOSとして認識するデバイス名はいままでとは違う

最近ようやく東京リージョンにもM5 C5インスタンスが来ましたね。
仮想化方式がXenから変更されたことで、いままでとは少し違うみたいです。

ドキュメントをいろいろ見ていたら発見したプチ情報です。

>[Linux インスタンスでのデバイスの名前付け](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/device_naming.html)
NVMe ボリューム /dev/nvme[0-26]n1 *
* NVMe インスタンスストアボリュームは自動的に列挙され、デバイス名が割り当てられます。ブロックデバイスマッピングで NVMe インスタンスストアボリュームを指定する必要はありません。

いままではEBSのデバイスマッピングを指定してあげると、そのデバイス名かもしくは末尾は同じまま
OSとしては/dev/sda /dev/xvda のように認識されました。

このドキュメントに記載された**NVMe ボリューム**とはM5 C5 インスタンスで使用するEBSのことで
これらはOSとして /dev/nvme[0-26]n1　で認識するようです。

>[Amazon EBS と NVMe](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/nvme-ebs-volumes.html)
C5 および M5 インスタンスでは、EBS ボリュームは NVMe ブロックデバイスとして公開されます。デバイス名は、/dev/nvme0n1、/dev/nvme1n1 などです。ブロックデバイスマッピングで指定したデバイス名は、NVMe デバイス名 (/dev/nvme[0-26]n1) を使用して名称変更されます。

##M4
実際にlsblkコマンドで調べてみました。
EC2はAmazonLiinuｘ、ESBはルートがdev/xvda、追加で/dev/sdfを割り当てています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240644/d99129c2-1f53-353d-b294-da50d7dfebe9.png)

```bash
$ curl http://169.254.169.254/latest/meta-data/instance-type
m4.large

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
  xvda1 202:1    0   8G  0 part /
xvdf    202:80   0   1G  0 disk
```

##M5
M5も条件は一緒です

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240644/16ddf658-b5a7-425b-5119-4e4f6dd1b381.png)

```bash

$ curl http://169.254.169.254/latest/meta-data/instance-type
m5.large

$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme1n1       259:0    0   1G  0 disk
nvme0n1       259:1    0   8G  0 disk
  nvme0n1p1   259:2    0   8G  0 part /
  nvme0n1p128 259:3    0   1M  0 part
```

他にもいろいろ変更点がありそうですね！
HoloLensのOSをPreview版から戻す手順

HoloLensのOSを2018年4月時のPreview版であるRS4から元のバージョン(10.0.14393.596)に戻す作業をしたので、簡単ですが、その手順を残しておきます。（RS4のバージョン（10.0.17134.1000）が降ってきた際に色々と挙動が怪しくなったため）

RS4から戻す手順なので詳細な手順は省略しますが、もしわからない場合は@takashijonaさんの記事[HoloLensの工場出荷状態への戻し方、またはHoloLensを33万3千円の首飾りにする前にやった3つのこと](https://qiita.com/takashijona/items/be5e23c0f3cc91435426)を参照してください。

#工場出荷状態に戻すでは戻らない
Settings > Update & Security > Reset > Reset deviceで工場出荷時の設定に戻す手順では元のバージョン(10.0.14393.596)には戻らず、RS4をインストールしたときのバージョンに戻ります。（私の場合は10.0.17123.1004に戻りました）

#Windows Device Recovery Toolによるリカバリ
Reset deviceでは戻らないため、Windows Device Recovery Toolを使って元のバージョン(10.0.14393.596)に戻します。

1.Windows Device Recovery Toolを起動し、HoloLensをUSBでつなぎます。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/60734/ed20de07-b34b-4cea-c608-e4630cd6a76a.jpeg)

2.RS4に上げるときとは異なり、特にファイルを指定しなくとも元のバージョン(10.0.14393.596)がインストールバージョンに指定されます。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/60734/f08c2a94-0285-c088-6bc5-047a89070237.jpeg)

3.よくわからない日本語が出てきますが、「はい」を押せばインストールが実行されます。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/60734/7b773ace-7444-06f6-c9ca-b74bd3fe5ff0.jpeg)

#インストールが終わったら
いつもの通りHoloLensの初期設定が始まるので、設定すれば元のバージョンのメニューが起動します。
【Java】数値チェックなどを行いながら標準入力を受け取る

#【Java】数値チェックなどを行いながら標準入力を受け取る

##1
```java

while(true) {
	//数値チェック
	while(true) {
		if(sc.hasNextInt()) {
			a = sc.nextInt();
			break;
		}else {
			System.out.println("再度数値を入力してください");
			sc.next();
		}
	}
	//条件チェック
	if(a >= 0) {
		break;
	}else {
		System.out.println("再度数値を入力してください");
	}
}
```
##2(ボツ)
```java

public static int check(Scanner sc) {
	int a = 0;
	while (true) {
        //数値チェック＆条件チェック(不可)
		if (sc.hasNextInt() && a >= 0) {
			a = sc.nextInt();
			System.out.println("入力された数値は：" + a);
			break;
		} else {
			System.out.println("再度数値を入力してください");
			sc.next();
		}
	}
	return a;
}
```

こっちの方がいいよ！などあればお願いします！

##3(@shiracamusさんにより実践的なコードを教えていただきました)
```java

import java.util.Scanner;
import java.util.function.Function;

public class ValidatingInput {
    //(個人メモ)Function<T, R>の抽象メソッド。Integer型の引数を受け取って、 Boolean型の値を返す。
    public static int inputInteger(Scanner sc, Function<Integer, Boolean> isValid) {
        while (true) {
            System.out.print("数値を入力してください: ");
            System.out.flush();
            if (sc.hasNextInt()) {
                int value = sc.nextInt();

                //(個人メモ)受け取ったisValidによって条件チェック
                if (isValid.apply(value)) {
                    return value;
                }
                System.out.println("範囲外の数値です。");
            } else {
                System.out.println("数値ではありません。");
                sc.next();
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        //(個人メモ)条件を引数として渡す
        int a = inputInteger(sc, value -> value >= 0);
        System.out.println("入力された数値は：" + a);
    }
}
```
コメントは全て、後から個人的なメモとして書き足したものになります。
```Function<T, R>``` ```apply(T)```に触れるのは初めてでしたが、「[java.util.function以下の関数インターフェース使い方メモ](https://qiita.com/opengl-8080/items/22c4405a38127ed86a31)」を参考に理解することができました。
shiracamusさん、ありがとうございます。
XIBでViewを用意してswiftのソースコードで読み込む

#XIBファイル

- Custom ClassをAL1Viewにする
<img src="https://i.gyazo.com/44e4bb17542c655c55201566a25d3b57.png" width="80%" />


#swiftのソース

```extension.swift
import UIKit

extension NSObject{
  //クラス名を返すクラス変数
  static var CLASS_NAME:String{
    return NSStringFromClass(self.self).components(separatedBy: ".")[1]
  }
}

extension UIView{
  //クラス名.xibを読み込むクラスメソッド
  static func loadXIB()->Any?{
    return UINib(nibName: self.CLASS_NAME , bundle: nil).instantiate(withOwner: self, options: nil).first
  }
}

```

```AL1View.swift
import UIKit

class AL1View: UIView {

  @IBOutlet weak var iv: UIImageView!
  @IBOutlet weak var lbl: UILabel!
  @IBOutlet weak var swtch: UISwitch!

  override func awakeFromNib() {
    super.awakeFromNib()
  }
}
```

```ViewController.swift
import UIKit
import TinyConstraints

class ViewController:UIViewController{
  
  override func viewDidLoad() {
    super.viewDidLoad()
    self.setup()
  }
  
  private func setup(){
    if let v = AL1View.loadXIB() as? AL1View {
      self.view.addSubview(v)
      v.edgesToSuperview()
    }
  }
}
```
CocosCreatorでFacebookインスタントゲームを作る～準備編～

始めまして、やわらーと申します。
今日からQiitaを始めていきたいと思います。

さて最初の投稿はCocosCreatorでFacebookインスタントゲームを作る準備です。

# ダウンロード
何はともあれ、まずはCocosCreatorのダウンロードをしましょう。[ここから](http://www.cocos2d-x.org/download)ダウンロードできます。
Facebookインスタントゲームのビルドに対応したのはバージョン1.9からなのでそれ以降をダウンロード、インストールしてください。

# アカウント作成
CocosCreatorを使用するにはアカウントが必要になります。
[ここから](https://passport.cocos.com/auth/signup?lang=english)アカウントを作成してください。設定したメールに認証メールが届くので確認してください。登録が完了すると何やら中国語のページが開きますがこれでアカウント作成完了です。
CocosCreatorを起動するとアカウント情報の入力を求められるので先ほど作成したアカウントを入力してください。

# HelloWorld作成
早速最初のプロジェクトを作成してみます。
NewProjectからHello Worldを選択し、Createを押します。
![bandicam 2018-04-21 21-46-04-312.jpg](https://qiita-image-store.s3.amazonaws.com/0/167483/2a6524d9-f197-cdb1-a6aa-6a75870ed8f9.jpeg)
。シーンフォルダからhelloworldシーンを選択するとすでに準備されているシーンが開きます。

# ビルド
project→buildを選択し、ビルドウインドウを開きます。
PlatformをFacebook Instant GamesにしBuildを選択します。![bandicam 2018-04-21 21-52-15-309.jpg](https://qiita-image-store.s3.amazonaws.com/0/167483/27d212f8-7d47-d776-f836-0a962131fc20.jpeg)
ビルドが完了したら、完成したfb-instant-gamesフォルダをzipファイルにします。

# Facebook for Developersの準備
次はfacebook側の準備です。
まずは[ここから](https://developers.facebook.com/)facebookアカウントを使ってfacebook for developerにログインしてください。
ログインしましたら右上のマイアプリから**新しいアプリを追加**を選択。好きな名前を入力しアプリを追加してください。
自分のアプリ用ページが開いたら製品を追加の項目にインスタントゲームがあるので設定を選択。デフォルトでインスタントゲームを使用するがオンになっていると思いますが、もしオフになっていたらオンにしてください。このページからアイコンの選択などもできます。

# ゲームのアップロード
facebookの準備が終わりましたらいよいよゲームのアップロードです。アプリページのプロダクト欄のタブを開き、ウェブホスティングを選択してください。![bandicam 2018-04-21 22-06-02-503.jpg](https://qiita-image-store.s3.amazonaws.com/0/167483/a8461ba0-7aec-b3e1-9117-290e6388009a.jpeg)
ページが開きましたら、**+新しいバージョンをアップロード**を選択し先ほど作ったfb-instant-games.zipを選択、アップロードしてください。
しばらく待つとアップロードされたゲームのステータス欄が処理中からスタンバイに変わります。
スタンバイに変わったらアップロードしたものにマウスカーソルを合わせ、ステータス欄の星を選択。facebookのパスワードを聞かれるので入力してください。
ステータスがスタンバイからプロダクションに変われば成功です。![bandicam 2018-04-21 22-15-39-324.jpg](https://qiita-image-store.s3.amazonaws.com/0/167483/ec2fe13d-744b-ba42-5d66-1afb9fb8043f.jpeg)

# 確認してみる
さっそく確認してみましょう。スマートフォンならfacebookのメッセンジャーアプリを開き右下のゲームを選択してください。開発中の中に先ほど作成したアプリ名のものがあります。
![29138BD7-5DE7-4DB5-B398-C9E71F285B18.jpg](https://qiita-image-store.s3.amazonaws.com/0/167483/9f612e2f-f4af-ebfa-bda0-b803ee558902.jpeg)
PCからなら自分のページの左側のショートカットに表示されていると思います。
CocosCreatorのロゴとHelloWorldが表示されたら成功です。

2019/08/30追記
いつの間にかメッセンジャーからゲームが消えていました。検索欄で先ほどのApp名を入力すれば出てくるかと思います。

---

これでCocosCreatorでFacebookインスタントゲームを作る準備が整いました。あとはCocosCreatorでガンガン作っていきましょう！