OmniAICreator/Qiita-1.07M huggingface dataset:
【Serverlessconf Tokyo 2018】カンファレンス資料まとめ

2018/9/29に開催されたServerlessconf Tokyo 2018 Conference Day の資料まとめです。

http://tokyo.serverlessconf.io/agenda.html

見つけ次第更新しますが、抜け漏れなどありましたらコメントや編集リクエストいただけましたら幸いです。


都合により途中で離脱してしまいましたが、運営/スタッフのみなさま、登壇者のみなさま、スポンサーのみなさま、このような機会をありがとうございました。

## STUDIO EARTH
* **サーバーレスのこれまでとこれから**
    * 

* **Serverless for the Enterprise**
    * 

* **The design for serverless ETL pipeline**
    * https://www.slideshare.net/shoujishirotori/the-design-for-serverless-etl-pipeline-489

* **aiboクラウドサービスを支えるサーバーレス技術**
    * https://speakerdeck.com/ryoheimorimoto/serverlessconf-tokyo-2018-aibo

* **サーバレス時代の運用監視**
    * https://speakerdeck.com/kazutomo/sabaresuapurikesiyonfalsejian-shi-yun-yong

* **What We Should All Worry About When Monitoring Serverless Applications**
    * 

* **リアルタイム動画ラップ・バトル・アプリを短時間で作り上げた完全サーバーレスな秘技]**
    * https://riotz.works/slides/?2018-serverless-conf
    
* **ブロックチェーン と フルサーバレスでのシステム構築**
    * 

* **LTバトル**
    * FaaSのインターフェースに見るサーバーレス
        * https://www.slideshare.net/nekoruri/20180929-serverlessconf-lt-117277060
    * メテオフォール型開発 X サーバーレス開発
        * https://www.slideshare.net/ssuser084061/x-117338837
    
## STUDIO JUPITOR
* **サーバーレスなシステムのがんばらない運用監視**
    * https://www.slideshare.net/takanorig/serverlessconf-tokyo2018

* **ストリーミングデータ処理サービスを使ったサーバーレスアプリケーション設計**
    * https://speakerdeck.com/yuukigoodman/serverless-design-and-streaming-date-processing-service

* **Serverless Framework "Dispatch" の紹介**
    * https://www.slideshare.net/motonorishindo/serverless-framework-disptach-125505994

* **Serverless Architecting and NoSQL Data Modeling for Successful Microservices**
    * https://speakerdeck.com/marcyterui/serverless-architecting-and-nosql-data-modeling-for-successful-microservices
    
* [**サーバーレスシステムの複雑化に立ち向かう - IoTを例にみるAWSとDDDを駆使したアプリケーション設計**](https://dev.classmethod.jp/server-side/serverless/serverlessconf_tokyo2018_coding_testing_logging_pattern_serverless/)
    * https://speakerdeck.com/wadayusuke/coding-testing-logging-pattern-for-get-along-with-complicated-buisiness-in-serverless-application
Twitter APIをNiFiで叩いて、情報収集

# 参考記事
* [北瀬さん記事](https://qiita.com/kkitase/items/eedb273d6bfe2b8b6737)

## GetTwitterプロセッサの設定
<img width="1693" alt="Screen Shot 2018-09-30 at 15.39.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/ec4df889-0164-a179-46da-dc622046b617.png">

## 処理状態
Twitter内容
<img width="1671" alt="Screen Shot 2018-09-30 at 15.39.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/2f675167-f303-945f-e831-09f80c2d0d62.png">

Data Flow概要
<img width="1359" alt="Screen Shot 2018-09-30 at 15.39.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/f0bd9bad-2c74-4316-be60-b38719017811.png">
fishからLINEにメモを書く

#コマンドラインからLINEにメモを送りたい！
こんにちは超初心者エンジニアのtomy_tomyです。初投稿なので暖かい目で見守っていただけると幸いです。

僕は良く忘れないようにLINEでメモを取るのですが、ある時に思いました。

**「メモするのにLINEを開くのめんどくさい、、、」**

という訳でコマンドラインからLINEに文章を投稿するコマンドを作ってみました。

ゴールは、

```
$function メモ
```
でLINEのメモ用トークに「メモ」と投稿されることです。

環境
ターミナル: iTerm2 3.1.7
shell: fish shell

##LINEのAPIを取得する
まずはLINEのAPIを取得します。
1. [LINE notify](https://notify-bot.line.me/my/)のページに飛ぶ
2. トークンの発行を選ぶ
<img width="1004" alt=" 2018-09-30 14.47.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/296515/f4f93f90-383d-a842-1b29-7d908f595227.png">
3. 以下のように発行されたトークンをメモ帳などにコピペ
![ 2018-09-30 14.54.20.png](https://qiita-image-store.s3.amazonaws.com/0/296515/88f443b7-c397-2fe1-d8f5-06a6d8b31366.png)

##fishで関数を作る
僕の愛用するシェルである**fish**を使って関数を作りました。

LINE Engineeringの[ページ](https://engineering.linecorp.com/ja/blog/detail/88)を参考にしながら

```shell
function line_memo 
    curl -X POST -H 'Authorization: Bearer [access_token]' -F 'message=$1' https://notify-api.line.me/api/notify
end
```

と書くものの失敗。（今思うと当たり前ですね笑）
引数の設定方法を変更

```shell
function line_memo
    curl -X POST -H 'Authorization: Bearer [access_token]' -F 'message='@argv https://notify-api.line.me/api/notify
end
```
上記のように直すことでちゃんと引数をメッセージとして扱えるようになりました。
ここから

```shell
source ~/.config/fish/condig.fish
```
を実行して

```shell
$line_memo  今日の夕飯はハンバーグ
```
 と、打つと

、、、

![ 2018-09-30 15.35.26.png](https://qiita-image-store.s3.amazonaws.com/0/296515/c6a09e20-c424-5ad1-0cfd-e59ddd047987.png)

以上です。
LINEを開く手間の労力の方が小さかった気がしますが、気にしない方向で行きます。

##参考
LINE Engineering: [https://engineering.linecorp.com/ja/blog/detail/88](https://engineering.linecorp.com/ja/blog/detail/88)
[Java]compareTo

#compareToとは
2つの変数のどちらが大きいかを（辞書的な意味で）判断してくれる便利メソッド。
String型やInteger型にも実装されているので、お手軽に使えちゃう。

Ex. A.compareTo(B)とすると、

|       　　|返す値|
|:----------------:|:--------------:|
| A < B            |              負 |
| A = B          |            0 |
| A > B             |             正 |


```java:qiita.java
public class Main{
    public static void main(String[] args) {

		int a = 400;
		Integer b = 10000;

		System.out.println("Compare1: " + "ABC".compareTo("XBD"));
		System.out.println("Compare2: " + "DDD".compareTo("DDD"));
		System.out.println("Compare3: " + b.compareTo(a));
	}
}
```
実行結果：

```
Compare1: -23
Compare2: 0
Compare3: 1
```
Git関係メモ

#1.利用背景
　共同開発時共有等に利用
　　-変更
　　-準備
　　-共有

#2.基本的な利用方法

|Command|内容|
|:---|:---:|
|git init|初期化|
|git add file01|管理へ加える|
|git commit -m "コメント"|記録＋メモ|
|git remote add origin URL|GitHubなどの保存場所を指定|
|git push origin master|リモートへ保存|
|git pull origin master|リモートからDL|

基本順序
(add)→(commit)→(push)→(pull※利用者)
※ファイル更新時でも：対象ファイルadd→commit→pushu

#3.把握と選択
|Command|内容|
|:---|:---:|
|git status|変更ファイルの把握|
|git diff|変更箇所の把握|
|git log|変更履歴確認|
|git log|変更箇所履歴確認|

(status+diff)→(add)

　[status]
　　※変更実施済AndAdd=緑時
　　※変更実施済ButNotAdd=赤字

#4.git関連の設定情報の把握
なぜだか、PCで設定済みの名前(本名)でcommitがなされてしまい。
散々困ったので設定状態を把握する方法を忘備録として記載。

 ```config:[出力イメージ]
（把握）
　git config --global --list
　--
  user.name="commitされる時の名前"
  user.email="現在設定されているアドレス"
  --

（変更方法）
　git config --global user.name "Githubアカウント"
　git config --global user.email "Github登録アドレス"
 ```

#5.作業ディレクトリ確認

 ```config:[出力イメージ]
（確認）
$ git rev-parse --show-toplevel
---
gitファイルで指定されているTopディレクトリ：
　/〜HOGEHOGE〜/Python3-LAB/gitsandbox
---

gitsandbox$ pwd
/〜HOGEHOGE〜/Python3-LAB/gitsandbox

gitsandbox$ ls
README.md       ReviewP8-2      ReviewP8-5      commitcheck2.py tw.py
ReviewP8-1      ReviewP8-3      commitcheck.py  if.py           tweetnew.py
gitsandbox$ 

（追加方法）
gitsandbox$ git add ReviewP8-1/main.py
 ```

#6やらかし修正

　前回のcommitへ修正戻したい：
　　git reset --hard HEAD

　間違えてadd：
　　git reset HEAD main.py

　フォルダ構成変更：
　　1.git rm -r ReviewP8-1(いらないフォルダ)
　　2.git commit -m 'HOGEHOGE'
　　3.git push origin master

　コミットしたユーザー一括変更：

```command:git
git filter-branch -f --env-filter "GIT_AUTHOR_NAME='HOGEHOGE'; GIT_AUTHOR_EMAIL='hogehoge@hoge.co.jp'; GIT_COMMITTER_NAME='HOGEHOGE'; GIT_COMMITTER_EMAIL='hogehoge@hoge.co.jp';" HEAD

git push --force --tags origin 'refs/heads/*'
```
php-master-changes 2018-09-29

7.1 系の開発バージョンを↑、ジェネレータのGC修正、reflection の諸修正、使われてないファイルの削除、一部のエラーハンドリングの修正

# 2018-09-29
## sgolemon: Bump versions for 7.1.24-dev
- https://github.com/php/php-src/commit/69c1b619c9d6a20dd5a50a058659c5c4233aea82
- [7.1~]
- 7.1 系の開発バージョンを 7.1.24 へ、7.1.23 は 10/11 リリース予定

## nikic: Fixed bug [#76946](https://bugs.php.net/bug.php?id=76946)
- https://github.com/php/php-src/commit/83e2b9e2202da6cc25bdaac67a58022b90be88e7
- [7.1~]
- ジェネレータでの循環参照が GC されない問題の修正

## nikic: Only store zend_type inside reflection type_reference
- https://github.com/php/php-src/commit/570f9f628193b5c3c83fde1b5b6a17666259cd30
- ext/reflection で type_reference 内のメンバが zend_type だけになるよう修正、コードの単純化がしたいのかな

## nikic: Remove redundant ce from reflection property_reference
- https://github.com/php/php-src/commit/36a4f58ab9e566b014e73caa24a6fdbc3e8b8f75
- ext/reflection で property_reference から冗長なクラスエントリを削除

## petk: Remove unused ext/bz2/php_bz2.def
- https://github.com/php/php-src/commit/61536b9d642d4c359622ff379bf42a126c220aa1
- ext/bz2 の使われていないファイル（windows 用 DLL のエクスポートシンボル定義ファイル）を削除

## petk: Remove outdated soap examples
- https://github.com/php/php-src/commit/ab60b799128d5a99e7b8a1210155a4f63b3d81c7
- ext/soap の古くなった利用例ファイルを削除

## petk: Remove and refactor ext/spl/examples
- https://github.com/php/php-src/commit/80c6ba26e3fe83174a0e7dce367d8a39aa093ae1
-　ext/spl/examples 下のファイルについて、テストファイルは ext/spl/tests 下へ移動、それ以外は削除

## nikic: Fixed bug [#72635](https://bugs.php.net/bug.php?id=72635)
- https://github.com/php/php-src/commit/8b8b625d088c859a3dc42f31acd7ec95b780158e
- [7.3~]修正
- 定数式で未定義クラスのクラス定数を使おうとした際、例外を投げず Fatal になっていた問題の修正

## nikic: Fixed bug [#76737](https://bugs.php.net/bug.php?id=76737)
- https://github.com/php/php-src/commit/96da1fe8a906da8d2927f57ff94ed25a8e6ea411
- Reflection オブジェクトのシリアライズ/アンシリアライズの禁止を明示
- クラスエントリの serialize や unserialize へ zend_class_serialize_deny や zend_class_unserialize_deny を突っ込むと禁止になるらしい、なるほど
package.jsonのnameと同名のパッケージはインストール時に拒否される

ちょっと考えたら至極当たり前な挙動なのですが、先日うっかりやらかしたので。

`npm init`を使って対話形式で新規パッケージを作成する際に、`name`と同名のパッケージはインストールできません。
使いたいパッケージ名と重複しないように`name`を指定しておく必要があります。

```json:package.json
{
  "name": "gulp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
```
↓

```terminal:terminal
$ npm install --save-dev gulp
npm ERR! code ENOSELF
npm ERR! Refusing to install package with name "gulp" under a package
npm ERR! also called "gulp". Did you name your project the same
npm ERR! as the dependency you're installing?
npm ERR! 
npm ERR! For more information, see:
npm ERR!     <https://docs.npmjs.com/cli/install#limitations-of-npms-install-algorithm>

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/hoge/.npm/_logs/2018-09-30T05_24_34_882Z-debug.log
```

`--force`フラグの指定で強制的にインストールすることもできますが、そこまでインストールするよりパッケージの`name`値を変えてしまうほうが圧倒的に早いと公式にも記載がありました。ちゃんと読まないとだめですね…。

https://docs.npmjs.com/cli/install#limitations-of-npms-install-algorithm
コーディングでよしなに作成する404ページ（NotFound）ページ


##概要

404ページのデザインが無い場合があります、
そんなときコーディングでよしなに404ページ（NotFound）を作成できるテンプレートです。

##コード

```html

<article class="p-error">
<h1 class="p-error__title">Page Not Found</h1>
<p class="p-error__sub">お探しのページは見つかりませんでした。</p>
<div class="p-error__entry">
<p>ご指定のページは削除されたか、移動した可能性がございます。</p>
<div class="p-error__back"><a href="<?php echo home_url( '/' ); ?>">トップページへ</a>／<a a="" href="#" onclick="history.back(); return false;">前のページへ戻る</a></div>
</div>
</article>

```


##参考サイト
404 - Calltoidea
https://calltoidea.com/404/
【しずおかアプリ部】活動ログ　第54回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/ee800648-fa25-1829-20c3-bad9c2055d35.jpeg)

##■公式サイト##
[http://monolizm.com/shizuoka-app](http://monolizm.com/shizuoka-app)
「Slack」も利用しています。 shizuapp で検索し、ご参加ください。

##◾️参加申し込み##
しずおかアプリ部への参加申し込みは[こちら](https://shizuoka-app.connpass.com/)から

##■タイトル##
第５４回


##■開催日##
２０１８年９月２９日（土）　１６：３０～１８：３０


##■参加者##
６名


##■活動内容（概要）##
・菅原プレゼン：「Unity始めるよ　脱初心者向け講座！簡易レースゲーム制作でゲーム制作方法を覚えよう３」
・菅原プレゼン：「Unity始めるよ　揺れモノを試してみた」
・交流





##■活動内容（詳細）##

【実演・プレゼン】

**・菅原プレゼン：「Unity始めるよ　脱初心者向け講座！簡易レースゲーム制作でゲーム制作方法を覚えよう３」**
 簡易レースゲーム制作シリーズの第３回目。
　　周回判定と順位判定方法の解説を行った。

　　![スクリーンショット 2018-09-30 14.23.17.png](https://qiita-image-store.s3.amazonaws.com/0/88105/de678991-481d-e7f1-39af-725350718188.png)

　　考え方はAI処理の時と同じで、チェックポイント用の見えないオブジェクトを作りTriggerとし、
　　通過した際に「スコアを増加」「通過時のタイムを記録」を行う。
　　スコアを他車と比較すれば周回状況と順位が求められる（スコアが同じ場合は通過タイムで順位付け）。

　　上記で実装したところ、想定通りの動作となった。
　　順位付けの精度を上げるためには、次のチェックポイントまでの距離など、判定要素を追加すると良い。

　[資料](http://monolizm.com/sab/pdf/第52回_プレゼン資料(脱初心者向け講座！簡易レースゲーム制作でゲームの作り方を覚えよう3).pdf)　 
　[プロジェクト一式](http://monolizm.com/sab/src/RaceGame.zip)　

<hr>

**・菅原プレゼン：「Unity始めるよ　揺れモノを試してみた」**
　鎖やロープ、布、髪の毛など、アニメーションとしてデータに焼き付けるよりも、リアルタイム演算で動かした方が都合が良いパーツを、
　Unityでどうやって実装するのかを解説。
　
・ジョイントコンポーネントを使う方法
・ricopin氏が作ったSpringBoneスクリプトを使う方法

　の２種類を試した。

　ジョイントを使う方法は、Unity標準パーツだけで作れるメリットがあるが、
　設定が正しくないと物理エンジンの影響でパーツがぶっ飛ぶ可能性がある。
　重めのものには使いやすいのではないだろうか。
　今回はモーニングスターの鎖と鉄球部分を想定して作成した。
　![スクリーンショット 2018-09-30 14.28.12.png](https://qiita-image-store.s3.amazonaws.com/0/88105/b129f6bc-07ed-6047-3790-861223bb0373.png)

　SpringBoneを使う方法は、もっと軽いものに向いている。
　名前の通りバネのような動きの特徴を持つ。
　重力に逆らって元の形状に戻ろうとする力が働く。
　今回は女の子のポニーテールを表現した。（単発の髪の毛やうさぎのしっぽみたいなものの方が向いているかも）
　![スクリーンショット 2018-09-30 14.28.23.png](https://qiita-image-store.s3.amazonaws.com/0/88105/a0dbdbec-4cd5-e853-6164-d740bf85418c.png)
　　
　[資料](http://monolizm.com/sab/pdf/第54回_プレゼン資料(揺れモノを試してみた).pdf)　　
　[プロジェクト一式](http://monolizm.com/sab/src/YuremonoTest.zip)

<hr>
　今回は初参加の方がお二方（エンジニア）いらっしゃいました。
　ゲーム寄りの内容のプレゼンだけとなってしまいましたが、
　これを機にゲーム開発にも興味を持ってもらえたらゲームクリエイターとして嬉しい限りです。
【Git】よく使うコマンドコピペ集


## リモートブランチをローカルブランチにチェックアウトする
```bash
git checkout -b ローカルブランチ名 origin/リモートブランチ名
```

## マージされたローカルブランチを全て削除する
```bash
git branch --merged | grep -v '*' | xargs -I % git branch -d %
```

## 修正したファイルをリセットする
```bash
git reset --hard HEAD
```

## 新規作成したファイル、ディレクトリを削除する
```bash
rm -rf `git status --short | grep '??' | awk '{print $2}'`
```
Unityで学ぶDecoratorパターン ~三人称視点のカメラを作る~

[前の記事](https://qiita.com/nebusokuhibari/items/81428f6e5e575318d84a)　―　[目次](https://qiita.com/nebusokuhibari/items/f403b40bea0ad790176c)

Zenjectが流行ってるけど、UnityのInspectorをDIコンテナに見立てて、デコレータパターンを実装する考察

## 作るもの

キャラクターの周りを旋回する三人称カメラを作成する。

通常はマウスの動きに合わせてカメラが動く。しかし、イベントリを表示するなどGUIを操作する際は動かしたくないので、それに備えてカメラが動く条件を装飾できるようにする。

## 準備

こんな感じでシーンを用意。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291470/ae614007-df5f-6fe2-4fc5-25a046a69220.png)

準備の説明は面倒なので、Githubで配布してます。

[05-Decorator-FirstPerson-Base](https://github.com/nebusokuhibari/Adaptive-Code-Unity/tree/master/05-Decorator-FirstPerson-Base)

## コンポーネントの作成

デコレータパターンを実装するための、４つのコンポーネントを作ります。

### CameraRotationBase

継承させて使う雛形のコンポーネント。
Rotationメソッドでゲームオブジェクトを回転させますが、値が０なので動かないです。

```C#:CameraRotationBase.cs
using UnityEngine;

public class CameraRotationBase : MonoBehaviour {
    
    virtual public float XValue { get { return 0; } }
    
    virtual public float YValue { get { return 0; } }

    public virtual void Rotation()
    {
        transform.localEulerAngles += new Vector3(YValue, XValue, 0);
    }
    
}
```
### CameraRotationMouse

さきほどのコンポーネントを継承します。
値をマウスの動きでオーバーライドします。

```C#:CameraRotationMouse.cs
using UnityEngine;

public class CameraRotationMouse : CameraRotationBase
{
    override public float XValue { get { return Input.GetAxis("Mouse X"); } }
    
    override public float YValue { get { return Input.GetAxis("Mouse Y"); } }
    
}
```

### CameraRotationClickDecorator

デコレータ用コンポーネント。
Rotationメソッドを右クリックを押していないと、呼ばれないようにデコレーションします。

```C#:ParameterPresenter.cs
using UnityEngine;

public class CameraRotationClickDecorator : CameraRotationBase
{
    public CameraRotationBase decorator;

    public int buttonIndex = 1;

    public override void Rotation()
    {
        if (Input.GetMouseButton(buttonIndex))
        {
            decorator.Rotation();
        }
    }
}
```

### CameraControl

RotationメソッドをUpdateメソッドで呼び出すコンポーネントです。

cameraRotationはCameraRotationMouseかCameraRotationClickDecoratorを登録できます。

```C#:CameraControl.cs
using UnityEngine;

public class CameraControl : MonoBehaviour
{
    public CameraRotationBase cameraRotation;
    
    void Update()
    {
        cameraRotation.Rotation();
    }

}
```

## 完成

CameraControlのcameraRotationに登録するコンポーネントによって挙動が変わります。

CameraRotationMouseを登録した場合は常にマウスの動きに合わせてカメラが動くようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291470/2c25dd31-d15c-94bc-d15f-04491d847c76.png)

CameraRotationClickDecoratorを登録した場合は右クリックを押していないとカメラが動きません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291470/dfab52c7-4dfc-1436-91e1-0cae28b24428.png)

比較のデモを記事上で披露できれば良いですが、ちょっと難しい。
完成版プロジェクトはこちら

[06-Decorator-FirstPerson](https://github.com/nebusokuhibari/Adaptive-Code-Unity/tree/master/06-Decorator-FirstPerson)

## まとめ

デコレータパターンで既にある機能に何かを加える例を紹介しました。

自分が書いたコードを誰かに改編される際に、
デコレータパターンで変更可能なコードにしておけば、既にあるコードを崩されずに処理を変えられます。

本来のデコレータパターンはinterfaceとか使って作るんだけど
inspectorの仕組み考慮したら、Unityではこんな感じで作ると良いかもしれない。
Phpstormでエディタのタブが1行に隠れないようにする方法

## 設定方法
エディタのタブは1行表示で、はみ出した分は隠れてしまうのがデフォルトだが、以下の設定で複数行に渡って表示される
設定から Editor >Editor Tabs > Show tabs in one rowのチェックを外す

[settings-editor-tabs](https://www.jetbrains.com/help/phpstorm/settings-editor-tabs.html)
Proxy内でrustをインストールしようとしたらハマった

## 環境
- Ubuntu 16.04

Proxyを利用しているで$HOME/.bashrcには次のような設定がしてある.

```
HOST="proxy.example.com"
PORT="8080"
PROXY="$HOST:$PORT"
export http_proxy="http://$PROXY"
export https_proxy="https://$PROXY"
```
## インストールの流れ
Rustの[サイト](https://www.rust-lang.org/ja-JP/install.html)にしたがって以下を実行した.

```
$ curl https://sh.rustup.rs -sSf | sh
```

インストールが成功したか確認したいので以下の簡単なプログラムを実行してみる.

```rust:main.rs
fn main(){
    println!("Hello, world!");
}
```

インストールがうまくいったと思いきやrustc main.rsでエラーが出たのでインストールをやり直す.

```
$ sudo /usr/local/lib/rustlib/uninstall.sh 
```

こちらのサイト[(リンク)](https://github.com/rust-lang-nursery/rustup.rs/blob/master/README.md#working-with-network-proxies)によるとcurlなどの実行に際してはhttp://やhttps://などが余計らしいので以下の操作を行う.

```
$ export http_proxy=proxy.example.com:8080
$ export https_proxy=proxy.example.com:8080
```

もう一度インストールしてみる.

```
$ curl https://sh.rustup.rs -sSf | sh
$ rustc main.rs
$ ./main
```

Hello, World!が表示されました.いえーい

## 参考URL
- [Proxy内でCargoを使ったツールインストール時のエラー対策(Windows環境)](http://boiled-mag.hatenablog.jp/entry/2017/08/11/215015)
- [Rustのインストール](https://www.rust-lang.org/ja-JP/install.html)
- [Working with network proxies](https://github.com/rust-lang-nursery/rustup.rs/blob/master/README.md#working-with-network-proxies)
redshiftでUbuntuスクリーンの温度調整、ブルーライトカット

Ubuntuでのスクリーン温度調整にはredshiftというツールが使える(AmazonのサービスRedshiftとは関係ない)
コマンドラインから簡単に温度調整ができる
今回想定している環境はUbuntu16.04


#インストール
```
$ sudo apt-get install redshift
```

#温度指定

手動指定 (1000K~25000K)

```
$ redshift -O 5500
```

自動指定 (5500K)

```
$ redshift -o
```

値が低いほど赤に、高いほど青に近くなる(公式では3500~5500をデフォルトとしている)

#温度リセット

```
$ redshift -x
```
redshiftが解除される。
関数で戻り値を指定する

#　return文への指定を省略

golangでは戻り値に変数を割り当てると、return文へ指定する戻り値を省略可能。
つまり、次のような関数fooはa,bを正しく返す。


```golang:foo.go
func foo() (a, b int){
  a = 1
  b = 2
  return
}
```
安価に工作機械を揃える



個人の趣味で工作機械を揃える際に、値段を抑える方法を書く。
対象：卓上ボール盤、バンドソー・丸ノコ、CNC、３Dプリンター

#要旨
- ボール盤・バンドソー・丸ノコの購入推奨場
中古工作機械店
整備されている。実物・使用方法を確認できる。ついでに細かい工具を買える。

- 入手性安さバランス重視
ヤフオクで購入（３Dプリンターはこの方法がよい）

- 安さ重視
時間が掛かってもよいなら、ジモティに個人同士で直接取引


- ネット購入のデメリット
工作機械は５kg以上あるものがあり、送料が高くなる傾向がある。

- 買ってはダメな物
安価過ぎる新品はガタがあり精度が悪い物がある。

- その他
普通に買ったら数十万する特殊な機械がジモティだと格安で手に入ることがある。

#本文
工作機械の範囲として、今回卓上ボール盤、バンドソー・丸ノコ、卓上CNC、３Dプリンターの購入に絞って記述する。卓上CNC、３Dプリンター工作機械は流通量がボール盤に比べ少ないため後で別に記述する。機械はただ動けば良いというわけではなく、精度が必要な物がある。そのため、単純に値段が安さだけで購入すると、精度として使用に耐えられない。
ボール盤で言うと、小型の木工用は、中国製がAMZONで送料込み１万以下にて買えるが、軸のブレが酷い物が多い。ミリ単位のズレが出ても構わない日曜大工レベルだと使えるが、
本格的な工作物を作るには厳しい。また数ミリブレを許容する日曜大工レベルでいいなら電動ドリルスタンド※（１）を用いる方法もある。そのため、精度がまあまあの１．５万円送料込みで買える藤原産業がAmazonだと人気のようである。
しかしブレの少ない物を購入したいと考えるとき、ある程度値段が高くなる。またアルミ加工以上も考えると、出力２００W近くを欲しくなる。安定的に考えると、メーカーの日立、マキタ、ホーザン、リョービ、遠州、育良等が良いが新品３、４万以上になる。
そこで、メーカーの中古品を購入することで安価に精度を手に入れることを推奨する。




## １番目お勧め中古工作機械店

筆者が最もお勧めするのは、中古工作機械店で買う事である。
理由として、整備されている。実物・使用方法を確認できる。ついでに細かい工具を買える。
という点が挙げられる。

### メリット
特に整備されている点である。値段だけで見るとネットオークションで個人から買うと最も安くなるが、使用状況において、大工作業にて外で雨ざらし・固い鉄鋼を対象に使用でベアリングが痛んで精度が悪くなっている物があるからである。
その点、中古工作機械店はベアリング交換、錆落とし、色の塗りなおし、グリスアップを行っており、元々の精度に近い状態に修繕している。
他の理由で、実物・使用方法を確認できるという点は、中古機械店は機械の整備、修繕をメインにしており普段から使用しており、どれぐらいまでの物まで加工できるか、修繕履歴はあるか等を確認できる。
他に細かい工具を買える点だが、ドリルや万力等を併用して取り扱っており、こちらも中古ながら整備されており必要な物を確認しつつ購入できる。

### デメリット
直接行く手間、送料と探す手間である。
探す際にWEBだと卓上サイズの物が掲示されていないことが多いため電話で確認しないといけない点である。


### 購入場所
全国的には点在しており、何店舗か回るのが大変であるが、東京・大阪に関しては、数が多く集中している箇所がある。東京は大田区、大阪は大阪駅から２km以内に点在しており本庄西等にある。




## ２番目お勧めネットオークション

### メリット
現在、ネットオークションでは、個人、業者共に多くの物を出している。
中古工作機械店で買うより安く済む場合がある。また商品が探しやすい。
ネットオークションサイトとしてヤフオク、メルカリ、フリマ（楽天）、モバオク等があるが工作機械はヤフオクが圧倒的に多い。次点にメルカリである。
ボール盤、丸ノコなどは、一般的な工作機械であり、流通量が多く選択肢が多い。
値段で行くと個人から買うのが一番安いが使用状況を確認し消耗していないか確認する必要がある。中古工作機械店からも出しており、こちらは整備具合が書かれている物もある。他に中古機械全般を取り扱っている店からも出してあり、こちらは整備がされておらず、そのまま出されている。写真の状態、文面、質問で確認する必要がある。その代わり劣化しづらい機械・可動部がない機械、電源インバータ等を買う際はお勧めである。
上の文に反して可動部がある機械になるが調べていて特に安いと思ったのは電動ドリルで新品１，２万円が中古にて１０００円台（送料別）で買える。

### デメリット
整備されていないものがある。



## ３番目お勧め中古店

### メリット
ハードオフや、リサイクルショップでの購入はネットオークションより少し高いか同等ぐらいで値段が安い。ただ、工作機械の種類として少なくバンドソー・丸ノコが店によっては置いてある程度で、ほとんどの店では置いていないので電話で確認したほうがよい。卓上ボール盤はあっても小型のものである。

### デメリット
ほとんどの店で置いてない。整備がされていない点である。

## 卓上CNC、３Dプリンターに関して
ボール盤、バンドソー等は日曜大工で使われているため流通量が多いが、卓上CNC、３Dプリンターはまだ流通量が少ないため、中古工作機械店でほぼ置いていない。そのため、中古品はネットオークションで購入を推奨する。
３Dプリンターに関して、ヤフオクだけでなくメルカリにも多く出てきている。


## その他

格安で手に入れる方法として、ジモティ（直接受け渡しのサイト）の個人同士で直接取引がかなり安く手に入ることがある。ネットオークションで出品して送る準備が面倒な人が利用することがあり、場合によっては無料で手に入ることがある。見たことがある機械で数十万する革のミシン機械や業務用印刷機、プレス加工機が無料であった。自営していた工房を畳んでその処分で行っている等の理由がある。


## 電動ドリルスタンド※（１）

中古品で安価な電動ドリルと組み合わせ使用ができる。こちらも値段が１５００円～２万程の物がある。ただ精度に関して、電動ドリルの精度に加え固定の位置決めが重要になり傾きによっては１～３ミリの精度の差が出る。
 
![drillbase.png](https://qiita-image-store.s3.amazonaws.com/0/247563/cab97a1e-3ba0-006c-a2f6-681643318087.png)
図：電動ドリル設置例
配列か否かの判定をする、配列の要素のタイプを取得する

通常のプログラムでは不要だが、ライブラリを作るときには、このような処理が必要になることがある.
実行環境はJDK 1.6.

```java:Tips0022.java
package jp.avaj.lib.algo;

import jp.avaj.lib.test.ArTest;
import jp.avaj.lib.test.L;

class Tips0022 {
  public static void main(String[] args) {
    //
    String nonArray = "aaaa";
    Integer[] integerArray = new Integer[]{
      0,1,2,3
    };
    int[] intArray = new int[] {
      0,1,2,3
    };
    String[] strArray = new String[] {
      // サイズゼロ
    };
    //
    // 上記の変数がどんなものかを忘れてしまったので、調べてみる
    //
    // テストケースを開始する
    ArTest.startTestCase("Tips0022");
    //
    boolean result;
    //
    // nonArray
    {
      // 配列であるかを調べる
      result = nonArray.getClass().isArray();
      ArTest.isFalse("nonArray","result",result);
    }
    // integerArray
    {
      // 配列であるかを調べる.
      result = integerArray.getClass().isArray();
      ArTest.isTrue("integerArray","result",result);
      // 配列の要素のタイプを取得する
      L.p("integerArrayの要素="+integerArray.getClass().getComponentType().getName());
      // 配列の要素がprimitiveであるかを調べる
      result = integerArray.getClass().getComponentType().isPrimitive();
      ArTest.isFalse("integerArray","result",result);
    }
    // intArray
    {
      // 配列であるかを調べる
      result = intArray.getClass().isArray();
      ArTest.isTrue("intArray","result",result);
      // 配列の要素のタイプを取得する
      L.p("intArrayの要素="+intArray.getClass().getComponentType().getName());
      // 配列の要素がprimitiveであるかを調べる
      result = intArray.getClass().getComponentType().isPrimitive();
      ArTest.isTrue("intArray","result",result);
    }
    // strArray
    {
      // 配列であるかを調べる
      result = strArray.getClass().isArray();
      ArTest.isTrue("strArray","result",result);
      // 配列の要素のタイプを取得する
      L.p("strArrayの要素="+strArray.getClass().getComponentType().getName());
      // 配列の要素がprimitiveであるかを調べる
      result = strArray.getClass().getComponentType().isPrimitive();
      ArTest.isFalse("strArray","result",result);
    }
    // テストケースを終了する
    ArTest.endTestCase();
  }
}
```

結果は次のとおり。

```java:Tips0022-result.txt
**** Tips0022 start ****
OK nonArray:result=false
OK integerArray:result=true
integerArrayの要素=java.lang.Integer
OK integerArray:result=false
OK intArray:result=true
intArrayの要素=int
OK intArray:result=true
OK strArray:result=true
strArrayの要素=java.lang.String
OK strArray:result=false
**** Tips0022 summary ****
test count = 7
success    = 7
```
ターミナル上にQRコードを表示するコマンドをGoで作ってみた


![gqr.gif](https://qiita-image-store.s3.amazonaws.com/0/102944/9d3073fc-6d45-ffbc-c6b9-3571648de125.gif)


# インストール

```
$ go get -u github.com/dorako321/gqr
```

# 使い方

-m に続く文字列をQRコードに変換します。

```
$ gqr -m foo
```

パイプで文字列を渡すことも可能です。

```
$ echo "bar" | gqr
```

# 作った経緯

前回[GoでQRコードを出力するサービスを作ってみる](https://qiita.com/dorako321/items/ad22d41fb51d67cc2a5d)でQRコードを少し触ったのでその流れで作ってみました。使いみちとしてはターミナル上の文字列をすばやくスマホに送ることができるかもしれません。ネタです。

コードは以下
https://github.com/dorako321/gqr
Backlogの課題一覧を毎日slackに通知させてみた

backlogの各プロジェクトに登録されている課題をSlackに通知する仕組みを、Backlog APIとGoogle Apps Scriptを使って実現しました。

# backlogとは

https://backlog.com/ja/

プロジェクト・タスク管理ツールです。
チーム用と銘打っていますが、個人用のフリープランもあります(気づきにくい)

最近流行りのカンバン方式はドラッグするのが面倒なのですが、このツールはシンプルなリスト表示です。

# キーワード
- backlog (及びそのAPI)
- Google Apps Script
- Slack (bot)

# 構成

<img width="935" alt="スクリーンショット 2018-09-30 12.26.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/135833/51b25f45-dea7-6f72-1ed4-c040adc0e444.png">

Google Apps Script(以下GAS)を使うことで自分でサーバー構築をしなくても簡単にサーバーサイドスクリプトを書くことが出来ます。
さらに、トリガーと呼ばれる機能を使うことで、毎時間に指定の関数を起動するなどのルーティン処理を実行することができます。

# backlog APIの使い方

リファレンスはこちら
https://developer.nulab-inc.com/ja/docs/backlog/

今回は以下の機能を使っています

- プロジェクト一覧の取得  (プロジェクト名を取得)
- 課題一覧の取得

リクエストするURLは、
```https://{スペース名}.backlog.com/```  
(backlogにログインした後のホーム画面のURLに含まれている部分と同じ)

※一部記事では {スペース名}.backlog.jp となっていることがありますが、2018年9月現在では .backlog.comになっています。

この後ろに、リファレンスに書かれているURLを含めます。
```/api/v2/issues ```

さらにその後ろに、認証のためのAPIキーの文字列を含めます。
```?apiKey={APIキー}```

クエリを含める場合には & でつなげましょう。 Idの番号が何を表すかは叩きながら確認しましょう...
```"&statusId[]=1&statusId[]=2"```  //状態 未対応:1, 処理中:2
```"&priorityId[]=2&priorityId[]=3"```  //優先度 高:2, 中:3
などなど...

プロジェクトIdは、backlogのプロジェクト設定画面の ```project.id=```後の数値です。

組み合わせたリクエストURLをGASの ```UrlFetchApp.fetch```で投げればレスポンスが返ってきます。
for文で要素を回しながら値を取得しましょう。
```res[i]["summary"]```
などなど...

# slackの指定チャンネルに投稿
slack botを作成し、GASからWebhook URLを使って投稿します。

https://api.slack.com/slack-apps

投稿先のチャンネルを表すIdの取得は、slackをWebで開くとURLに含まれている数値になります。

```
function sendSlack(message) {

  var payloadData = {
    "text": message,
    "channel": SLACK_CHANNEL_ID,
    "parse": "none",
    "as_user": true,
    "link_names": true
  }

  var payload = JSON.stringify(payloadData);

  var options = {
    "method": "post",
    "contentType": "application/json",
    "payload": payload
  }

  UrlFetchApp.fetch(WEBHOOK_URL, options);

}
```

こんな感じで関数作るとわかりやすいのかなと。
"as_user"でbotをユーザー認識させ、"link_names"でslackのメンション機能を有効化させています。

# GASで毎日決まった時間にプログラムを実行
GASのエディタを開き、メニューバーの「編集」->「現在のプロジェクトのトリガー」をクリックし、トリガー設定を行えます。

<img width="854" alt="スクリーンショット 2018-09-30 13.03.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/135833/f9a8de39-204b-ab21-e778-f546dfbb28cb.png">

例えばこのようにすると、毎日午前9時~10時にmain関数を実行してくれます。

もっと厳密な時間設定をする場合にはプログラムを書く必要があります。

# 参考

- [【GAS】Backlogの残タスク（課題チケット）をGASで取得してチャットワークに流す](https://qiita.com/kingpanda/items/44667f2ddc39e760ea8b)  
異なる点はスプレッドシートとslack。
- [GAS のGoogle謹製CLIツール clasp](https://qiita.com/HeRo/items/4e65dcc82783b2766c03)  
web上のGASエディタだけで開発するのが辛くなってきたガチ勢は使ってみては。

# まとめ

GASとbacklog APIを使って、slackにbacklogの情報を通知する仕組みをご紹介しました。

backlogはiOS、Androidともに専用のアプリがあるので、それを見れば詳細情報を確認することもできますが、
slackのメンション機能を使うことで自動的にタスク情報が手に入るので楽になるのかなと思います。
Azure functions でexeを使う

#やりたいこと
Blob Storageに配置されたオブジェクトをexeで処理したい

#前提
- Blob Triggerなど Blogとバインディングされたfunctionを登録
- functionの場所にBinフォルダを用意
- exeをBinフォルダに置いておく

#やりかた

例) ffmpegで動画ファイルから音声だけ抜き出す

```json:function.json
{
  "bindings": [
    {
      "name": "myBlob",
      "type": "blobTrigger",
      "direction": "in",
      "path": "files/{name}",
      "connection": "xxx_STORAGE"
    },
    {
      "type": "blob",
      "name": "outputBlob",
      "path": "files/{rand-guid}.wav",
      "connection": "xxx_STORAGE",
      "direction": "out"
    }
  ],
  "disabled": false
}
```

以下、ソース内コメントで解説

```csharp:run.csx
#r "Microsoft.WindowsAzure.Storage"

using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.Diagnostics;

public static void Run(CloudBlockBlob myBlob, string name, string blobTrigger, Stream outputBlob, TraceWriter log)
{
    try {
        // フルパス
        String basePath = @"D:\home\site\wwwroot\BlobTriggerCSharp\";
        String stFilePath = basePath + name;
    
        // ファイルをダウンロード
        myBlob.DownloadToFile(stFilePath, System.IO.FileMode.Create);

        System.Diagnostics.Process process = new System.Diagnostics.Process();
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();

        // exeを指定
        startInfo.FileName = basePath + @"Bin\ffmpeg.exe";

        // 実行時パラメータを指定
        startInfo.Arguments = "-i " + stFilePath + " -ac 1 -ar 16000 -acodec pcm_s16le -f wav " + basePath + "sample.wav";

        // ウインドウ非表示
        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

        // 標準エラー出力をリダイレクト
        startInfo.RedirectStandardError = true;

        // 標準出力をリダイレクト
        startInfo.RedirectStandardOutput = true;

        // シェル実行ではない
        startInfo.UseShellExecute = false;
        process.StartInfo = startInfo;

        // 実行
        process.Start();

        // 処理完了をまつ
        process.WaitForExit();

        // 出力したファイルを読み込む
        FileStream SourceStream = File.Open(basePath + "sample.wav", FileMode.Open);

        // 出力用blobに出力
        SourceStream.CopyTo(outputBlob);        

        // 標準エラー出力をログ出力
        StreamReader myStreamReader = process.StandardError;
        log.Info( myStreamReader.ReadLine());

        // 標準出力をログ出力
        StreamReader myStreamReader2 = process.StandardOutput;
        log.Info( myStreamReader2.ReadLine());

        // 読み取り専用を解除
        System.IO.FileInfo cFileInfo = new System.IO.FileInfo(stFilePath);
        if ((cFileInfo.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly){
            cFileInfo.Attributes = FileAttributes.Normal;
        }
        // 使い終わったファイルを削除
        cFileInfo.Delete();

    } catch(Exception e) {
        log.Info(e.Message);
        log.Info(e.StackTrace);
    }
}


```

# 注意
上記例だと、トリガーを設定している入力用blobと出力用blobが同じなので、ファイルができた瞬間に再度呼ばれてしまう。
エラーになるので無限ループにはならない。

azure functions も C# script も初めて使ったので、書き方おかしかったりしたらご指摘ください。

# 参考
[Azure Functions で EXEを実行する](https://buchizo.wordpress.com/2017/01/19/azure-functions-%E3%81%A7-exe%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)
AmbariでOozieのUI、WorkFlow Manager view作成時、[User Home Directory Test] エラー対照法

## 問題現象
Got error [User home directory not found] when creating WorkFlow Manager view in Ambari
エラーは下記通り：
<img width="1345" alt="Screen Shot 2018-09-30 at 12.43.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/fff32984-c3ff-8a22-9a12-5be6b98abdce.png">



##Resolve:

```
sudo -u hdfs hdfs dfs -mkdir /user/admin
sudo -u hdfs hdfs dfs -chown admin /user/admin
```

##結果:
<img width="1445" alt="Screen Shot 2018-09-30 at 12.46.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/a6f31cb1-1b2b-7ebd-1bad-c8fdcf264b67.png">
[Java]Queue, Deque

Java Goldのお勉強をしていたら出てきたので走り書き。

#Queue\<E>
Collection\<E>を継承する。すなわち配列とかみたいに複数のデータをまとめて使うための物。
では他のコレクションと何が違うのか、Queueという単語を某英語翻訳サイトで調べてみると、


**(順番を待つ人や乗り物の)列**


とのこと。（）内がわりとミソ。

すなわち「FIFO（First-in-First-out）」という**最初に入れたものを最初に取り出すことのできる**データ構造になっています。
順番待ってる人も先に並んでる人が先に順番回ってきますしね。

そんなわけで「待ち行列」と呼ばれていたりもします。

ただし別にFIFOの実装でなければならない、ということではないそうです。

###メソッド
|        |エラー時に例外を投げる|エラー時にnullを返す|
|:------:|:------------------:|:------------------:|
| 挿入    | add(e)|        offer(e)        |
| 取出し    |remove()|       poll()       |
| 参照    |element()|        peak()        |


```java:QueueTest.java
import java.util.Queue;
import java.util.ArrayDeque;

public class QueueTest {
    public void myQueue() {
        Queue<Integer> queueTest = new ArrayDeque<Integer>();
        for(int i=0; i < 10; i++) {
            // キューに値を挿入
            queueTest.add(i);
        }
        // キューに値を挿入
        queueTest.offer(100);

        System.out.println(queueTest);
        
        // 先頭を取り出す
        Integer r = queueTest.remove();
        System.out.println("remove value: " + r);

        // 先頭を参照
        System.out.println(queueTest.element());

        // 先頭を取りだす
        Integer p = queueTest.poll();
        System.out.println("poll value: " + p);

        // 先頭を参照
        System.out.println(queueTest.peek());

        System.out.println(queueTest);
    }
}
```
実行結果：

```
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 100]
remove value: 0
1
poll value: 1
2
[2, 3, 4, 5, 6, 7, 8, 9, 100]
```

#Deque\<E>
Queue\<E>を継承する。正式名称は「Double Ended Queue（両端キュー）」
その名の通り要素を両端から挿入・削除できるキューです。

ちなみにDequeは「デック」と読むらしいです。
「『デキュー』じゃないのか…」と思ったのですが、「データを取り出す操作」を意味する「dequeue（デキュー）」と
ごっちゃになってました。同じ過ちを犯した人は絶対いるはず。

###メソッド
|        |エラー時に例外を投げる|エラー時にnullを返す|
|:------:|:------------------:|:------------------:|
| 挿入（先頭）   | addFirst(e)|        offerFirst(e)        |
| 挿入（末尾）    |removeFirst()|       pollFirst()       |
| 取出し（先頭）    |getFirst()|        peakFirst()        |
| 取出し（末尾）   | addLast()|        offerLast()        |
| 参照（先頭）    |removeLast()|       pollLast()       |
| 参照（末尾）    |getLast()|        peakLast()        |
なんで例外スローの方の参照elementFirst/Lastじゃないんや…

```java:DequeTest.java
import java.util.Deque;
import java.util.ArrayDeque;

public class DequeTest {
    public void myDeque() {
        Deque<Integer> dequeTest = new ArrayDeque<Integer>();
        for(int i=0; i < 10; i++) {
            // キューに値を先頭から挿入
            dequeTest.addFirst(i);
        }

        System.out.println(dequeTest);

        // 末尾を取り出す
        Integer r = dequeTest.removeLast();
        System.out.println("remove value: " + r);

        // 末尾を参照
        System.out.println(dequeTest.getLast());

        // 先頭を取りだす
        Integer p = dequeTest.pollFirst();
        System.out.println("poll value: " + p);

        // 先頭を参照
        System.out.println(dequeTest.peekFirst());

        System.out.println(dequeTest);
    }
}
```

実行結果：

```
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
remove value: 0
1
poll value: 9
8
[8, 7, 6, 5, 4, 3, 2, 1]
```

0~9の値の挿入順がQueueと逆になっているのがわかりますね。
両方向から挿入可能なので、「LIFO（Last-in-First-out）/ 後入れ先出し法」を用いるスタックとして使用することも可能です。
CloudFormationを使ってEC2にAutoRecoveryの設定をする

#はじめに
本記事では、AWS CloudFormation管理コンソールを使って、EC2にAutoRecoveryの設定をする手順を説明しています。（初心者向け）

本記事で掲載しているテンプレートの最新版は、下記に置いてます。
https://github.com/okubo-t/aws-cloudformation
#AutoRecoveryとは
EC2 インスタンスをCloudWatchでモニタリングし、基になるハードウェア障害または AWS による修復を必要とする問題でインスタンスが正常に機能しなくなった事象を検知すると、CloudWatchが自動的にインスタンスを復旧するアクションを実行する機能のことです。
#詳細
AWS ドキュメント
[インスタンスの復旧]
(https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-recover.html)
[Amazon Elastic Compute Cloud インスタンスの復元]
(https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/quickref-cloudwatch.html#cloudwatch-sample-recover-instance)

#設定手順
１ AWS CloudFormation管理コンソールから、スタックの作成をクリックします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/e0c3e7c3-f478-18c7-2dc2-7e669d1b399d.png"　 width=50%>

２ 後述のテンプレートを選択します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/060a4709-622a-2394-de5f-ac2103045137.png"　 width=50%>

３ 各パラメータを入力します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/e7987ecd-1b04-338e-5596-c6a7ea8ab677.png"　 width=70%>

|パラメータ名|用途|備考|
|:---|:---|:---|
|スタックの名前|テンプレートから作成するリソース一式の名前|例　prd-stack-vpc-20180801|
|EC2Instance|AutoRecoveryを設定するEC2を選択します||

4 後続は、デフォルトのまま次へ次へで、作成します。

５ 状況が CREATE COMPLETEになれば、EC2のAutoRecoveryの設定が完了です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/f919b748-e62b-9f47-0eed-a3ab499405f0.png"　 width=50%>

6 EC2の管理コンソールで、設定したEC2のモニタリングの情報を確認します。
設定した直後はまだデータ(メトリックなど)を収集していないので、下記のメッセージが表示されます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/ee128933-ec8a-b72b-8ef3-68eccca7910e.png"　 width=70%>

データが収集されて、下記のメッセージが表示されたら、設定が完了です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/283246/e268491d-9e5a-782f-392e-1da80d251010.png""　 width=70%>

#テンプレート
```cloudwatch-autorecovery.yml
AWSTemplateFormatVersion: "2010-09-09"
Description:
  Auto Recovery for EC2

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------# 
Parameters:
  EC2Instance:
    Type: AWS::EC2::Instance::Id

Resources:
# ------------------------------------------------------------#
#  Auto RecoveryAlarm
# ------------------------------------------------------------#
  AutoRecoveryAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: !Sub "${EC2Instance}-autorecovery"
      Namespace: AWS/EC2
      MetricName: StatusCheckFailed_System
      Statistic: Minimum
      Period: 60
      EvaluationPeriods: 10
      ComparisonOperator: GreaterThanThreshold
      Threshold: 0
      AlarmActions: 
        - !Sub "arn:aws:automate:${AWS::Region}:ec2:recover"
      Dimensions:
        - Name: InstanceId
          Value: !Ref EC2Instance
```
Xamarin live player appが見つからない。

どうも、iOS版の公開は無くなったよう。。。

[Xamarin Live Player Down?](https://forums.xamarin.com/discussion/135000/xamarin-live-player-for-ios-down)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/294947/db57c273-5cd3-ae90-a86a-ead9ae584286.png)



欲しくなった経緯としては、iOSアプリ作ってみたい熱が再燃したため。
昔ダウンロードしていた、LivePlayerを立上げ、動作させてみたわけですが
とりあえず、Visual Studio 2017のテンプレートからXamarin.Formsで作成し、
いざ、Visual Studioから実行してみるとエラーで動作しない。
（LivePlayとのペアリングは成功している。）

> C:\Users\okamoto\source\repos\App1\App1\App1\App.xaml.cs(1,1): error: The type or namespace name 'XamlCompilationAttribute' could not be found (are you missing a using directive or an assembly reference?)
> C:\Users\okamoto\source\repos\App1\App1\App1\App.xaml.cs(1,1): error: The type or namespace name 'XamlCompilation' could not be found (are you missing a using directive or an assembly reference?)
> C:\Users\okamoto\source\repos\App1\App1\App1\App.xaml.cs(1,1): error: The name 'XamlCompilationOptions' does not exist in the current context
> C:\Users\okamoto\source\repos\App1\App1\App1\App.xaml.cs(1,1): error: The type or namespace name 'Xamarin' could not be found (are you missing a using directive or an assembly reference?)
> C:\Users\okamoto\source\repos\App1\App1\App1\App.xaml.cs(1,1): error: The type or namespace name 'Xamarin' could not be found (are you missing a using directive or an assembly reference?)

とりあえず、最新版を手に入れようと思い、
ネット上で情報を集めると、最近はTestFlightからダウンロードする必要があるとか。
なので、最新版を求めて入手するため、以下のサイトに足を運んだのですが、、
[Xamarin Live Player のセットアップ](https://docs.microsoft.com/ja-jp/xamarin/tools/live-player/install?tabs=windows)

Android版しかない。



やっぱ、iOS版は難しいがかな。。。。
PythonでAPIに繋いでデータを取得する（with コインチェック and requests）

# この記事について
[コインチェック](https://coincheck.com/ja/)で公開されているAPIに接続してデータを取得して、そのデータをPythonの変数に代入するまでを書きます。
今回はビットコインの価格を取得してみます。
なぜコインチェックを選んだかというとなんとなくです。


今回使用するPythonのライブラリのrequestsは、[過去の記事](https://qiita.com/yokotate/items/e91aadbdf9e18b40b832)を参考にしてインストールしてください。

# 関連記事
[ANACONDA NAVIGATORを使って仮想環境を作ってpsycopg2を入れる](https://qiita.com/yokotate/items/e91aadbdf9e18b40b832)

# 取得するAPI
公開されている[API](https://coincheck.com/ja/documents/exchange/api)の中の[ティッカー](https://coincheck.com/ja/documents/exchange/api#ticker)という情報を取得してきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/7d7e7bdd-b59a-53ea-ff4a-3b94b2b57d3a.png)
画像の赤枠で囲われた部分、そこが取得するためのアドレスになりますので、覚えておいてください。

# ソースコード

```python:coincheck.py
import requests
res = requests.get('https://coincheck.com/api/ticker')
Data = res.json()
```
簡単にデータを取得できました！！！
requests.get()の部分で指定しているのが前の画像の赤枠部分です。
https://coincheck.com/api/ticker のhttps://coincheck.com/ までがサイトのURL、そのあとの api/ticker が赤枠部分です。
とりあえず見てみます。

```python:coincheck.py
print(Data)
```

```text:result.txt
{'last': 746991.0, 'bid': 746628.0, 'ask': 746977.0, 'high': 752000.0, 'low': 734701.0, 'volume': 1806.24942343, 'timestamp': 1538276575}
```
おめでとうございます。
これでAPIを使用してデータを取得できるようになりましたね！

# データの変数への代入
というところで終わってしまうと私のような初心者SEにはちょっと厳しいものがあります。
ですのでこのデータを変数に代入してみようと思います。

```text:result.txt
{'last': 746991.0, 'bid': 746628.0, 'ask': 746977.0, 'high': 752000.0, 'low': 734701.0, 'volume': 1806.24942343, 'timestamp': 1538276575}
```
データを見てみると「名前：値,名前：値」というような内容になっているのが分かります。
各データが名称とそれに紐づいた値になっています。これが辞書型のオブジェクトです。
取り出し方は簡単で、配列では数値であるところをこのデータの名称にしてあげれば取得することができます。

```python:coincheck.py
last = Data["last"]
print(last)
```

```text:result.txt
746991.0
```
それではこれにて終了です。
ありがとうございました。
Vue+Nuxt+Firebaseで作るSPA（１）

# Vue+Nuxt+Firebaseで作るSPA
　この記事では、Vue+Nuxt+FirebaseでカンタンなSPAを構築したいと思います。web素人でも、なんとか構築できたので、皆様に紹介したいと思います。
## SPAとは
　spaとは、Single Page Application　の略です。平たく言えば、モダンなウェブページを作る技術です。
　普通のウェブページは、操作ボタンをクリックすると、カチっといって、画面がまるごと切り替わります。その間、通信速度が遅かったりすると、待たされることになってしまいます。
　また、ページが切り替わるので、フォームに入力した内容が全部消えてしまったりもします。
　SPAは、これらの欠点がありません。ページは画面全体の切り替えをせずに切り替わりますし、画面が切り替わっても、フォームの内容は消えないようにできます。
　私がこの記事でシェアしたい技術を使って趣味で作った掲示板サイト
　https://trip-8c6a8.firebaseapp.com
も、いじって頂けるとわかりますが、SPAらしく動きます(友人にちょっと荒らしてもらってます笑)。

# 環境構築

　それでは、早速、環境構築からしていきましょう。
　手順は、
１　vue+nuxtのセッティング
２　firebaseのセッティング
３　試験デプロイ
　です。
## vue+nuxtのセッティング

まずは、npmとnodeを用意してくださいね。
それが整っていることを前提に、話をすすめます。

```terminal
yarn global add @vue/cli
```

これで、vue-cliがインストールされます。
npm install を使わないのは、後々、妙なエラーが続発して手に負えなくなるからです。yarnだと、うまく行きます。

これで、nuxtのパッケージも合わせてインストールされたことになります。

firebaseのセッティングは、次回、です。
ありがとうございました。
JSON Serverを使ってGETとPOSTでレスポンスを変えてみた

## はじめに
APIのモックを一瞬で作れるJSON Serverというものがあり、
使っていて微妙に痒い所に手が届かなかったりしたので、本記事を書いてみた。

JSON Server
https://github.com/typicode/json-server

## 導入・起動方法
基本的な使い方については、
他の方が記事を書いているのでそちらを参照。

【個人メモ】JSON Serverを使って手っ取り早くWebAPIのモックアップを作る
https://qiita.com/futoase/items/2859a60c8b240da70572

JSON Server - 簡単にAPIのモックを作成
https://qiita.com/yhikishima/items/46860ffc48913182a3ee

## 本題
JSON Serverのデフォルト仕様だと、
POSTの場合、扱いづらいデータが返ってくる。

まずは、説明用に以下のJSONを用意。

```json:db.json
{  
  "user":[  
    {  
      "id":1,
      "name":"Jones",
      "age":18
    }
  ]
}
```

GETすると、こんな感じのレスポンスが返る。

```json:GET
[
  {  
    "id":1,
    "name":"Jones",
    "age":18
  }
]
```

POSTすると、idのみのデータが返る。(しかも、db.jsonにも同じデータが追加される)
うーん、、、レスポンスは違うフォーマットで返したい。

```json:POST
{  
  "id":2
}
```

## 解決策
middlewaresオプションを使う。

以下のファイルを作成し、
JSON Serverの起動パラメータにmiddlewareファイルを含める。

```js:middleware.js
module.exports = function (req, res, next) {
    if (req.method === 'POST') {
        req.method = 'GET' // GETに偽装
        req.url += '_post' // アクセス先をPOST用に変更
    }
    next()
}
```

後、POST用のレスポンスを追加。

```json:db.json
{  
  "user":[  
    {  
      "id":1,
      "name":"Jones",
      "age":18
    }
  ],
  "user_post":{  
    "code":0,
    "msessage":"success"
  }
}
```

ターミナルで起動。

```terminal
json-server -w db.json -m middleware.js
```

## 確認
Postmanを使って、それぞれ確認。

GETの場合。
<img width="405" alt="GET.png" src="https://qiita-image-store.s3.amazonaws.com/0/112186/139ee0ab-64e4-f73d-932c-e2bad1e3b5b1.png">

POSTの場合。
<img width="389" alt="POST.png" src="https://qiita-image-store.s3.amazonaws.com/0/112186/e6a728cf-9af3-59f5-e1ea-c755d76653db.png">

期待通り、GETとPOSTでレスポンスを変える事が出来た。
数学のお勉強-マルコフ連鎖

#この記事は..
マルコフ連鎖を勉強したのでまとめてみた.
簡単な行列計算はpythonでやりました.

#行列
大学では線形代数で学ぶ.高校では数Cで学ぶ.
最近数Cがなくなった,なくなっていたらしい..
こんな感じで数字を管理するもの.

3×3行列

```math
A = 
\begin{bmatrix}
a_{11} & a_{12} & a_{13}\\\ 
a_{21} & a_{22} & a_{23}\\\
a_{31} & a_{32} & a_{33}\end{bmatrix},
a_{ij} (i,j ={1,2,3} )
```

#npと行列の対応表
| numpy関数       |  行列 |
|:--|:--|
|np.zeros()|零行列|
|np.eye()|単位行列|
|arr.T arr.transpose()|転置行列|
|np.dot()|内積|
|np.outer()|外積|
|おまけ|---|
|np.ones()|全部1の行列|
|np.empty()|空の行列|
|np.arange()|例にしやすい行列|
|arr.reshape()|行列の変換|

#slice,copy
少しハマった..今後遠回りしないために..
初級者はいろいろなことを勉強しないといけないから大変..

* slice:参照
* copy:コピー

```python:
array = np.array([1,2,3,4])
array_slice = array[:]
array_slice[:] = 0
print (array)
#=>[0,0,0,0]
```

#マルコフ連鎖
厳密な定義は知らない..けど,
ある地点における事象(j)の起こる確率は,その前の結果(i)にのみ依存する.
その推移する確率を

```math
p_{ij} = P(X_{n+1} = j | P(X_{n} = i )
```

と定義する.
先のA行列に以下の条件を加えると推移行列になります.

```math
\sum_{j=1}^{n=3} a_{ij} = a_{i1} + a_{i2} + a_{i3} = 1\\(i={1,2,3} )
```

つまり,その前の結果(i:行)を固定して,次の起こりうる事象の総和は1になる行列.
確率行列はPの方が一般的だけどただの表記の問題なのでAで続けます.

なるほど,確かに世の中の現象に当てはめて考えることができそうだ.

#感想
マルコフ連鎖を調べて見て,推移行列は量子力学などでなんとなくやったけど,具体的に数字を当てはめると面白いと思った.
SourceTreeでGitlabリポジトリをクローンする

Windows環境で作りましたが、Macでも変わらないと思います。

# Gitlabアカウントを作成する
- Github連携などで作成

# プロジェクトの作成
- privateリポジトリで作成
- ウェブ上からReadme.mdを1つ作っておく

# Gitlabパスワードの設定
- SNS連携で作った場合、「Password」のサイドバーからパスワードを設定しておく 

# SourceTreeでクローン
1. リモートからクローン
2. クローン先のhttpsのアドレスを指定
3. 別ウィンドウが起動して、ユーザーネームとパスワードを聞かれるので、Gitlabアカウントのパスワードを入力（SNS連携だけしている状態だと、ここでうまくいかない）
4. クローン完了
Dockerを使用したRails開発④(テーブル関連付け)

# やること
[前回の続き](https://qiita.com/Nishi53454367/items/9ca85eede43e492c7cd4)として今回は1対多の関係のテーブルを作り、テーブルの関連付けについてまとめていこうと思います。

よくある掲示板の投稿とそれに対するコメントを管理するテーブルを作成する感じです。
１投稿につき、複数コメントできるようにしていこうと思います。

やることは以下の通り
1. 投稿テーブルの作成
2. コメントテーブルの作成
それぞれジェネレータコマンド実行→マイグレーションコマンド実行でモデルとテーブル作成を進めていこうと思います。

# 投稿テーブルの作成
まずは、ジェネレータコマンド実行
`docker-compose exec web rails g model post title:string event_date:datetime start_point:float capacity:integer member:string`

次にマイグレーションコマンド実行
`docker-compose exec web rake db:migrate`

ここまではテーブル名とカラム名が変わっただけで前回と同様

# コメントテーブルの作成

次にコメントテーブルを作成します。

ジェネレータコマンドは以下の通り
`docker-compose exec web rails g model comment post:references comment:text`

**post:references**の指定で投稿テーブルと関連付けを指示します。

作成されたモデルファイルを確認すると以下のようになっています。

```ruby:comment.rb
class Comment < ApplicationRecord
  belongs_to :post
end
```

**belongs_to**の記述がされているため、
commentsテーブルから見てpostsテーブルは、多対１（「belongs_to＝属する」で訳すとしっくり）の関係にあります。

反対にpostsテーブルから見てcommentsテーブルは、１対多（「has_many＝複数持ってる」で訳すとしっくり）の関係にあります。

ジェネレータファイルは以下のようになっています。

```ruby:20180930020108_create_comments.rb
class CreateComments < ActiveRecord::Migration[5.2]
  def change
    create_table :comments do |t|
      t.references :post, foreign_key: true
      t.text :comment

      t.timestamps
    end
  end
end
```

**t.references〜**行の記述で外部キーとしてpostsテーブルのidと関連付く形でカラム作成されます。

マイグレーションコマンド（`docker-compose exec web rake db:migrate`）を実行してテーブルを確認すると・・・

```
+------------+------------+------+-----+---------+----------------+
| Field      | Type       | Null | Key | Default | Extra          |
+------------+------------+------+-----+---------+----------------+
| id         | bigint(20) | NO   | PRI | NULL    | auto_increment |
| post_id    | bigint(20) | YES  | MUL | NULL    |                |
| comment    | text       | YES  |     | NULL    |                |
| created_at | datetime   | NO   |     | NULL    |                |
| updated_at | datetime   | NO   |     | NULL    |                |
+------------+------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
```

post_idが作成されています。
keyがMULとなっているため、重複可能な外部制約キー(MULTIPLE KEY)であることが確認できます。

これでテーブルとモデルの作成はひとまず完了！
今日はここまで！
Gitコマンドまとめ

# Git更新基本手順
`git init`（最初のみ）
`git add FILENAME`
`git commit -m COMMENT`
`git remote add origin https://github.com/XXXX/XXXXXX.git`
`git push -u origin master`

# ファイル削除関連
リポジトリから削除、かつ、ディレクトリから削除（i.e. 完全に削除）
`git rm FILENAME`

リポジトリから削除、かつ、ディレクトリには残す
`git rm --cached FILENAME`

リポジトリには残す、かつ、ディレクトリから削除
`rm FILENAME`
Markdown PDFとテキスト校正くんをいれてVisual Studio Codeを最強のMarkdownエディターにしよう

## 自分好みのMarkdownエディターを求めて

わたしは、開発しているアプリの仕様やQiitaに投稿する文章などを、マークダウンで書いています。

CotEditorがお気に入りなので、マークダウンで書くときはCotEditorをつかっています。しかし、アプリのスクリーンショットを載せられなかったり、つくった資料をPDFに出力して配布できなかったりして困っていました（そういうときは、Pagesをつかっていました）。

そんな悩みを抱えていたときに、会社の人にVisual Studio Codeの [Markdown PDF](https://github.com/yzane/vscode-markdown-pdf/blob/master/README.ja.md) を教えてもらいました。

## Makdown PDFをつかってみよう

Markdown PDFは、その名のとおりマークダウンのテキストをPDFに出力してくれるVS Codeの拡張機能です。
試しにつかってみたらとても便利だったので、インストール手順と使用方法を紹介します。

<img width="1413" alt="001.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/2b6c6d02-dc63-841b-69c2-9c17e82f380f.png">

まず、VS Codeの拡張機能をクリックして、検索欄に「Markdown PDF」と入力します。
すると、Markdown PDFが表示されるので、インストールボタンをクリックしてインストールします。

これでインストールは完了です。

つぎに、PDFにしたいファイルを開いて、command + shift + pを押します。

<img width="1413" alt="002.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/6440811d-d1ef-b99c-1793-d76dd5229b3e.png">

すると、検索窓が開くので、「export」と入力します。

表示される候補のなかから、「Markdown PDF: Export (pdf)」を選択します。

<img width="1413" alt="003.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/209a2c19-4ce1-bdd0-f8c4-4d61756c2ae2.png">

PDFが出力されました。

出力先は、左下のステータスバーに表示されるので、見にいってみましょう。

<img width="928" alt="004.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/6d176790-7298-74f6-e426-80a45003bb8e.png">

ダウンロードフォルダーにPDFが作成されています。やったね！

<img width="1011" alt="005.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/4d0a3376-8749-ed0a-481a-a994b4e71740.png">

リンクや画像もバッチリですし、ページ番号も振ってくれます。
しかも、けっこう見栄え良くしてくれます。

Mac標準のPagesもいいアプリですが、ちょっとした資料をつくるには機能が多すぎます。
複雑なレイアウトの資料でなければ、マークダウン＋Markdown PDFで、手軽に書けるようになりました。

## 文章の校正のお供にテキスト校正くんをつかおう

文章は書くのもたいへんですが、校正もたいへんです。
そんなときに便利なのが、VS Codeの拡張機能 [テキスト校正くん](https://marketplace.visualstudio.com/items?itemName=ICS.japanese-proofreading) です。

<img width="1413" alt="006.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/a86bde0d-3e5a-ecf4-5c84-e1a52318f59f.png">

VS Codeの拡張機能をクリックして、検索欄に「テキスト校正くん」と入力します。
すると、テキスト校正くんが表示されるので、インストールボタンをクリックしてインストールします。

これでインストールは完了です。

校正するときは、VS Codeでテキストファイルを開くだけです。

<img width="1413" alt="007.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/f328d826-d974-084f-e7e7-aefe19e3e1c6.png">

テキスト校正くんが開いたテキストファイルの文章を自動的にチェックして、画面下の問題パネルに文章の問題点を表示してくれます。

とても便利で素敵ですね！

## おまけ　〜VS Codeでファイルのパスを取得する〜

VS Codeで画像を表示するときには、画像のパスを取得する必要があります。
VS Codeをつかうと、パスの取得も簡単にできます。

<img width="1299" alt="008.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/48c573d5-934e-9678-3871-07b7af21c690.png">

画像ファイルをVS Codeにドラッグ&ドロップすると、画像が表示されます。画像のタブを右クリックして、「パスのコピー」をクリックすると、 `/Users/toshi/Downloads/VSCode/009.png` のようにファイルのパスをコピーしてくれます。

<img width="1413" alt="009.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/fb0ec5f2-9204-240c-6438-f2e0949993a6.png">

あとは、 `![9番目の画像](/Users/toshi/Downloads/VSCode/009.png)` のようにマークダウンでリンクを書くと、VS Codeに画像を表示してくれます。

最近VS Codeを使いはじめましたが、簡単に機能を拡張できていいですね。Markdown PDFやテキスト校正くんのような便利な拡張機能を作成してくださった方々にも感謝です。

VS Codeを活用して、バリバリ文章を書いていきましょう。