OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxの基本コマンド実習01

やってみよう

mkdir Kho　％ディレクトリを作る
cd Kho ％移動
cal > khocal.txt ％khocal.txt作成
ls -l ％確認

```
[root@ik1-331-25935 ~]# mkdir Kho
[root@ik1-331-25935 ~]# cd Kho
[root@ik1-331-25935 Kho]# cal > khocal.txt
[root@ik1-331-25935 Kho]# ls -l
total 4
-rw-r--r-- 1 root root 133 Apr  4 08:57 khocal.txt
```

mkdir -p subKho/subKho2 ％subKho/subKho2二つのディレクトリ作成
cd subKho ％移動
cp ../khocal.txt . ％Khoディレクトリにあるkhocal.txtコピー
cp ../khocal.txt ./subKho2 ％subKho2ディレクトリにもコピー
ls -l ％確認 
cd subKho ％移動
ls -l ％確認

```
[root@ik1-331-25935 Kho]# mkdir -p subKho/subKho2
[root@ik1-331-25935 Kho]# cd subKho
[root@ik1-331-25935 subKho]# cp ../khocal.txt .
[root@ik1-331-25935 subKho]# cp ../khocal.txt ./subKho2
[root@ik1-331-25935 subKho]# ls -l
total 4
-rw-r--r-- 1 root root 133 Apr  4 09:01 khocal.txt
drwxr-xr-x 2 root root  23 Apr  4 09:01 subKho2
[root@ik1-331-25935 subKho]# cd subKho2
[root@ik1-331-25935 subKho2]# ls -l
total 4
-rw-r--r-- 1 root root 133 Apr  4 09:01 khocal.txt
```

mv khocal.txt khotest.txt　％khocal.txtファイル名をkhotest.txtに変更

```
[root@ik1-331-25935 subKho2]# mv khocal.txt khotest.txt
[root@ik1-331-25935 subKho2]# ls -l
total 4
-rw-r--r-- 1 root root 133 Apr  4 09:11 khotest.txt
[root@ik1-331-25935 subKho2]# ^
```

mv khotest.txt .. ％mv khotest.txtをsubKhoディレクトリに移動

```
[root@ik1-331-25935 subKho2]# mv khotest.txt ..
[root@ik1-331-25935 subKho2]# cd ..
[root@ik1-331-25935 subKho]# ls -l
total 12
-rw-r--r-- 1 root root 133 Apr  4 09:01 khocal.txt
-rw-r--r-- 1 root root 133 Apr  4 09:11 khotest.txt
-rw-r--r-- 1 root root 133 Apr  4 09:01 subKho
drwxr-xr-x 2 root root   6 Apr  4 09:13 subKho2
```

cat khotest.txt　％内容確認

```
[root@ik1-331-25935 subKho]# cat khotest.txt
     April 2018
Su Mo Tu We Th Fr Sa
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

[root@ik1-331-25935 subKho]#
```
macOS High SierraでHFS形式のフロッピーからファイルをコピー

## デバイスファイルの確認

USBフロッピードライブを接続し、フロッピーを挿入してから以下を実行。フロッピードライブは`/dev/disk2`であることがわかる。

```sh
$ diskutil list

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                            ñºèÃñ¢ê›íË *1.5 MB     disk2
```

## HFS Utilitiesをインストール

```sh
$ brew install hfsutils
```

## HFS Utilitiesを使ってファイルをコピー

```
$ sudo hmount /dev/disk2               # デバイスをマウント
$ sudo hls                             # カレントHFSボリュームのファイル一覧
$ sudo hcopy -m file dst               # ファイルをMacBinary形式でコピー
$ sudo hcopy -r file.bin dst           # ファイルをそのままコピー(既にMacBinaryの場合）
$ sudo hvol                            # カレントHFSボリュームの表示
  Current volume is mounted from:        # カレントは/dev/disk2
    /dev/disk2
$ sudo humount /dev/disk2              # デバイスをアンマウント
$ sudo hvol                            # カレントHFSボリュームの表示
  No known volumes; use `hmount' to introduce new volumes
                                         # カレントはなし
```
【UE4】マルチプレイでクライアントごとにレベルストリーミングをする

# 概要
- MMO的なゲームを作ろうとした際にプレイヤーごとに表示するエリアを制限したい
    - 主にプレイヤーが関係ない場所まで処理してしまうと負荷がかかってしまうため
    - サーバーは常にすべてのエリアをストリーミングする
- Listen ServerではなくDedicated Serverの話です（Listen Serverは後日検証します）
- 個人の備忘録目的なので解説が雑です

# やり方
1. World SettingタブからUse Client Side Level Streamingを有効にする
2. それぞれ表示したいエリアをサブレベルに分ける
3. ストリーミング方法は**常にロード済みにする**
4. パーシスタントレベルにサブレベル毎にLevel Streaming Volumeを配置する
5. 各Level Streaming Volumeの設定をする（サブレベルとのヒモ付を行う）

# 確認方法
1. Dedicated Serverを建てる
2. クライアントでサーバーに接続する
3. ユーザー毎に異なるレベルがストリーミングされていることを確認する

# まとめ
- これを使えばMMORPGみたいな広い世界に複数人がいるというのも実現できるかも…？
    - 実際はマップごとに１サーバーでマップごとに接続先を切り替えるほうが賢いかも（MMOの実務経験がないのでセオリーは知らないです）
Forecast models > YouTube | システムのアンケート

アンケートに回答することで、教えていただいたリンク。

Interpreting Extended-Range Forecasts: https://www.youtube.com/watch?v=pjZM48Czfxg&feature=youtu.be​

Interpreting Long-Range Forecasts: https://www.youtube.com/watch?v=kuae14Wy5hA&feature=youtu.be

可視化について、実利用者の意見をくみ取るという取組みをしているようだ。
開発者と実利用者の「ずれ」を解消するように試行しているのだろう。
新人向けの記事をみて触発されたので初心を忘れないように書き留めておく

# はじめに 
何事も三日坊主になってしまいがちで、そのうちやっていたことも忘れてしまうので
アウトプットの場所としてQiitaを利用してみようと思います。
技術的にだれかの助けになれることはないかもしれないけど、
エンジニアなりたての人たちが見て、難しい 辛いと思ったときに
こんなアホでもなんとか仕事していけるんだからもう少し頑張ってみよう的な励みになれたら嬉しいです。

# 初心を忘れないように書き留めておく 
年度がかわり、Qiitaのトレンドに新人向けの記事がたくさん上がっていて触発されました。
アウトプットが大事って書いてあったので、ずっと見てるだけだったQiitaに自分も情報を貯めていこうと思いました。
忘れっぽい自分のための備忘録です。

エンジニアとして、自分だけのために使える時間がもうあまり長くないので、
今年一年はがむしゃらにいろんなことを覚えて楽しいことができるようになりたいです。

# 半期の目標 
今期とか、長いスパンだとだれそうなのでミニマムスケールで

## エンジニアの友達を作る 
去年の7月から今の会社でエンジニアを始めて、まだまだ新人なわけだけれど仕事以外でエンジニアと関わる事がないから同じ目線で切磋琢磨できるような人が居ないです。
（前職は別業種だし、大学も情報系じゃないのでプログラミングとかの話をする=会社の人と話す、という状態）
会社の人も親切で優しいし、経験の浅い人も沢山居るのだけれど、
プライベートで技術的な話をフランクにできる友達がほしい！

そういう友達が居るとモチベーション保ちやすいって言っている人がいて羨ましくなりました。

勉強会等に参加してみて、人脈を広げられないかやってみようと思います。


## 自宅にwedサーバーとアプリケーションサーバーを立てる 
会社の人に勉強したいと相談したらまずここからだと言われました。
実際に成果物が出来上がってきて公開したくなったりした時は,次段階としてawsも検討していく流れにしたいです。

まずは自宅のpcにVMWareを入れてLinuxでサーバーをたてたいです。


## javaで動くwedアプリをサーバーで動かしてみる 

サーバーが立ち上がったらアプリを動かしたいです。
アプリの中身は簡単でいいので、
サーバーたてて、アプリ作って、ビルド、デプロイ、テストまで全工程を１人で通してやりたいです。
余裕があったらjavaのフレームワークも触れたらなと思います。


## java以外の言語を味見してみる 
入社時の研修からjavaを使っていて、他の言語に関する知識が全くありません。
何を覚えるのが良いのかを調べたり、何が自分の肌に合うのかをちょっと触ってみたりしたいです。

PHPやPythonに興味があるので、そこら辺を中心に調べてみようかと思います。


## GoogleHomeとアレクサを使って自宅のスマートhome化を進める
少し毛色が変わりますが…
買ったきり天気の確認にしか使っていないGoogleHomeと、
突然笑いだされたら怖いから電源を抜いているアレクサを活用していきたいです。

はやく学習リモコンを買って～とも思うのですが、
学習リモコンの作り方をQiitaで見つけたので自作も検討しつつ
テレビのリモコンを探さなくて良くなる生活ができるようにしたいです。


# さいごに
前述の通り、大学の専攻は情報系ではありません（生物系でした）
前職もプログラミングとは無縁でした。

いろんな事がしんどくて辞めて今があるわけですが、新しい事を覚えていくのはとても楽しいです。
いたらない部分は多いでしょう。
まちかったことを言うかもしれません。
ベテランのかたからしてみたら考えもしないようなミスをするでしょう。

それでも、今すごく楽しくて、いろんなことを頑張って覚えようとしています。
その気持ちを忘れないようにここに書き残していこうかと思います。

何を作るかよりも、どうやってそれを実装するのかを考えているときが好きです。
まずは上半期、頑張っていきます！
Scipy lecture notes, Edition 2017.1 > typo > 3.1.5 Indexing and slicing

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
p55
3.1.5 Indexing and slicing
Exercise: Array creation

実行コードがページ下部にはみ出している。

使用ツールではこういうエラーはチェックされないのかもしれない。
publishする前に人によるチェックは必要に思う。

https://github.com/scipy-lectures/scipy-lecture-notes/issues/370

Edition 2017.2に修正版が入ることになるのだろうか?
(ハイライト情報がなくなる。。。)
個人開発者向けサーバ環境の選び方まとめ（heroku,aws,firebaseなどなど）

# この記事は下記のブログに移行しました

https://you88.space/519

# この記事の目的

上記の記事で

- 個人開発における特有のインフラ周りの悩み
- それぞれのサーバー、インフラを使った人の生の声
- パターン別のおすすめサーバー

などをまとめています。

個人開発や広告マネタイズなどtwitterで発信しているのでその辺興味ある人は気軽にフォローしてください。

https://twitter.com/you8802
Laravel5.6でscaffoldが動かなかった件

PHPの大人気フレームワークLaravelの5.5や5.6だと、scaffoldすると、3箇所エラーが出ます。

Macです。xxxxはホームディレクトリの名前です。
``/Users/xxxx/todo/vendor/laralib/l5scaffold/src/Commands/ScaffoldMakeCommand.php``

​の21行目の

``use AppNamespaceDetectorTrait, MakerTrait;``
が嘘なので、
``use DetectsApplicationNamespace​, MakerTrait;``
に変えます。

同様に6行目も間違いなので
``use Illuminate\Console\DetectsApplicationNamespace;​``
と変えます。

次に
``Method Laralib\L5scaffold\Commands\ScaffoldMakeCommand::handle() does not exist``

とでるので、
``/Users/xxxx/todo/vendor/laralib/l5scaffold/src/Commands/ScaffoldMakeCommand.php``​

の一番最後に、関数を追加します。

``public function handle() { return $this->fire(); }​``

そして、最後に

``Trait 'Illuminate\Console\AppNamespaceDetectorTrait' not found``

とでるので、

``/Users/xxxx/todo/vendor/laralib/l5scaffold/src/Makes/MakeController.php``

の13行目を

``use AppNamespaceDetectorTrait, MakerTrait;``

から、

``use DetectsApplicationNamespace​, MakerTrait;``

にします。これで、scaffoldが動きます。
フロントエンドは HTML5 で置き換える

Flash と IE11 のサポート切れについて
----------------------------------

以前の記事に Flash と IE11 の サポート期限について公式の情報をまとめました。
つまり、今から7年半の間で、多くの企業の SoR[^1] のシステムのフロントエンド部分を改修する作業が発生することになります。

[Flash の 記事：Flash の サポートは「2020年末」まで](https://qiita.com/kouji-kojima/items/f663cd1448dcdf0e9437)
[IE11 の 記事：IE11 延長サポート終了日は「2025/10/14」](https://qiita.com/kouji-kojima/items/ec6607297e870fe91fbb)

なぜこんなことが起きてしまったのか
--------------------------------

今のようにクライアントPCのスペックが高くなかったことも一つの要因です。しかし一番の要因は「統一されたブラウザの仕様」がなかったことではないでしょうか。
HTML4.1 の勧告後、HTML5[^2] が生れるまでの空白の時代にブラウザベンダが自由にブラウザを良くしていこうと努力していきました。Microsoft の IE もその一つでした。
ここで原点に立ち戻ってみましょう。Webアプリケーションとは何かということです。それは端的に言うと、Webブラウザ上で動くアプリケーションことなのです。
そのブラウザの仕様があいまいな時代に Flash や IE が全盛期をむかえます。その為、今回のようなことが起きてしまいました。

今後このような理由での置き換え作業はなるべくやりたくない
---------------------------------------------------

SoRのシステムは、遵法に従って構築されているものも多く、長期間大きな改編もなく利用していく類いのものです。そのようなシステムでは、今後なるべくこのような理由での置き換えは発生させたくはありません。
それでは、今後どうやってフロントエンドを置き換えていくべきか考えてみます。

フロントエンド開発の肝はやはりブラウザ
-----------------------------------

ブラウザの大きな要素は「 HTML 」「 CSS 」「 JavaScript 」です。
「 HTML 」は「 W3C の HTML5.x 」と 「 WHATWG の HTML Living Standard 」、「 CSS 」 であれば「 W3C の CSSx 」、「 JavaScript 」 は 「 Ecma International の ECMAScript 20xx 」 に、その仕様がまとめられています。
つまりこれらの仕様を理解して置き換えしていくことが重要になっていきます。

まとめ
------

フロントエンドの置き換え、またはその準備は今からでも遅くはない、けれど決して早くもありません。
しかし、個人、組織としてゼロからスタートするという場合は、まずは「[HTML5プロフェッショナル認定試験](https://html5exam.jp/)」の 資格取得を目標にしてみてはどうでしょうか。
その過程で、ある程度の知識は得られます。また「[HTML5 Conference](https://html5j.connpass.com/event/64992/)」等のコミュニティイベントに積極的に参加して、有識者の意見を聞いてみるのも良いでしょう。

そして「なるべく自分で開発しない」ということも一つのキーワードかもしれません。

例えば、CSS であれば [Bootstrap](https://getbootstrap.com/) と呼ばれる CSSフレームワーク が提供されています。
JavaScript であれば、[TypeScript](http://www.typescriptlang.org/)([Angular](https://angular.io/)もTypeScriptベース) で記述し、 JavaScript の生成はコンパイルに任せることで ECMAScript 20xx に準拠したソースを得ることもできます。


[^1]: SoRとSoEの説明記事参照：[システムを SoR と SoE に色付けして最適なシステム開発環境を](https://qiita.com/kouji-kojima/items/c16966438a26933b5454)

[^2]: [HTML5](https://www.w3.org/standards/history/html5) は、既にその役目を終えています。現在は [HTML5.2](https://www.w3.org/standards/history/html52) が勧告され、更に [HTML5.3](https://www.w3.org/standards/history/html53) を 策定しています。
Jenkins の「説明の編集 (Edit Build Information)」にメモを残しておくと便利

周囲にあまり使ってる人を見かけないので紹介。

Jenkins には「説明の編集 (Edit Build Information)」という機能がある。定期実行しているバッチ処理を Jenkins で動かしていたりする場合に、普段と違う実行方法をとったときなど、メモを残しておくと後々便利。

「表示名 (DisplayName)」に何か入力するとビルド番号まで上書きされてしまうので、ここは空欄のままのほうが使い勝手が良い。

# 日本語UI

<img width="368" alt="Screen Shot 2018-04-04 at 3.35.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/339/b06559ef-725b-3f95-2ceb-f08f3f0ad05b.png">
<img width="925" alt="Screen Shot 2018-04-04 at 3.36.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/339/4a652cec-d2e1-0bb3-8d79-501eec84689c.png">
<img width="838" alt="Screen Shot 2018-04-04 at 3.36.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/339/2c4bb39b-1fba-6b33-6b81-fdc68a7f0fc9.png">

# 英語UI

<img width="360" alt="Screen Shot 2018-04-04 at 3.36.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/339/e3862de3-6c7b-b282-a405-653f5cf8ce95.png">
<img width="956" alt="Screen Shot 2018-04-04 at 3.36.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/339/ea596314-48b8-0266-6385-b0e0e4db249b.png">
<img width="888" alt="Screen Shot 2018-04-04 at 3.36.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/339/97640eaa-ca49-290b-08df-68f4bad2fe0a.png">
MacBook Pro 初期設定としてやったことメモ

MacBook Proを購入したので、初期設定した内容を以下に記載します。
初めてのMacOS機なのでいろいろ調べながら設定していきました。

## 環境
MacBook Pro 2017 13インチ
macOS High Sierra 10.13.3

# 最初に
- ソフトウェアアップデート
    - App Store -> アップデート -> ソフトウェアアップデート

# システム環境設定
自分の使いやすいように変えていきます。
## Dock
- サイズ
    - デフォルトより小さめに
- 拡大
    - オン
- Dockを自動的に表示/非表示
    - オン

## ディスプレイ
- 解像度
    - 最大

## 省エネルギー
- ディスプレイをオフにするまでの時間
    - 10分

## キーボード
- キーのリピート
    - 速い
- F1、F2などのキーを標準のファンクションキーとして使用
    - オン

## 日付と時刻
- 時計 -> 日付を表示 -> オン

## その他
### 電源
- 割合を表示
    - 画面右上の電池マークをクリック -> 割合（%）を表示 -> オン

### Finder
- パスバーの表示
    - Finder -> 表示 -> パスバーを表示

# 各種システム・アプリのインストール
## パッケージ管理：Homebrew
Mac用パッケージ管理システム。現在の主流らしくブログ等での紹介も多いので導入しました。
Homebrewの詳細とインストール手順については下記の記事が詳しかったです。
[パッケージ管理システム Homebrew
](https://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc)

## ターミナル：iTerm2
画面分割できたりするのが便利そうだったので使ってみることにしました。
以下のサイトからDLできます。
[iTerm2](https://www.iterm2.com/downloads.html)

また、シェルはデフォルトのbashからzsh + Preztoに変更しました。下記ブログのほぼ丸パクリです。
[【超初心者向け】Macにモダンなコマンドライン環境を構築【zsh&Prezto編】](http://kinchiki-it.hatenablog.jp/entry/build-command-line-environment-mac-2)

## ブラウザ：Google Chrome & Firefox
各種サイトよりインストール。
https://www.google.co.jp/chrome/index.html
https://www.mozilla.org/ja/firefox/

## メールソフト：Thunderbird
定番。こちらも公式サイトよりインストール。
https://www.mozilla.org/ja/thunderbird/

## テキストエディタ：Atom
WindowsではVScodeをメインに使っていましたが、Macを使うにあたってエディタ環境も一新しようと思い、Atomにしました。
https://atom.io/

とりあえず最初にインストールしたパッケージは以下の通り。
- atom-beautify
- autocomplete-paths
- file-icons
- git-controlhub
- git-history
- git-log
- git-plus
- japanese-menu
- minimap
- project-manager

## IME：Google日本語入力
少し使ってみましたが標準のIMEより変換が好みだったのでこちらを使用します。
https://www.google.co.jp/ime/

## Franz
Macのアプリで良さそうなものを探しているとこれが見つかりました。
複数のコミュニケーションアプリをまとめて管理できるアプリです。
https://meetfranz.com/

同じサービスの複数アカウントも管理できるのが便利です。
私はTweetDeck、Gmail、Googleカレンダー、Slack×2、Discordを連携しています。

# 最後に
MacBook Pro、初めて使っていますがフォントは綺麗で文字が見やすいですし快適です。
これからバリバリ使い込んでいきます。
Petalinuxで起動時のログを出す際に躓いた点

#記事の作成背景
Petalinuxのリファレンスガイド通りに自動起動スクリプトを作ったのになぜかデバックが上手くいかない。
そんな事があったので忘れないうちに書いときます。
**※かなり初歩的な内容です**

#開発環境
- OS      
Ubuntu16.04（Windows10 Virtualbox）
- 動作環境  
Zynq QEMU
- コンパイル環境  
Cygwin64bit


#今回の失敗
**起動スクリプトで標準出力が使えないことを忘れていた**
printf()をつかって、起動スクリプトが起動したかを確認してました…

#作業内容
下記記事を基に起動スクリプトを作成
https://qiita.com/take-iwiw/items/50065df6cdd1ba8bcbd6
（この記事はPetalinuxのリファレンスガイド内の”起動時のアプ リ ケーシ ョ ン自動実行”内のアプリケーションを、スクリプトに変更したもの）
[Petalinuxリファレンスガイド](https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2017_2/ug1144-petalinux-tools-reference-guide.pdf)
※P55参照

手順はそのままでOK。ちゃんと起動スクリプトは実装され、プログラムは起動します。


ですが…自分は起動したかどうかを、printfで文字が出たか否かで確認してしまった事でドハマりしてしまいました。
アプリケーションを/etc/rcS.dにS99+(ファイル名)のスクリプト、/etc/init.d/の中に(ファイル名）のスクリプトが入った状態になっていました。
rcS内のファイルは起動スクリプトが走った最初に実行されるので、printf()での情報出力先が決まる前に処理を走らせて、情報を出す場所がなかったからコンソールに文字が出なかったのかなぁ…
ここはまだ継続調査が必要だと思う


※printf()が起動スクリプト実行時に使えない理由は下記サイト参照
https://www.uquest.co.jp/embedded/learning/lecture03.html

#なんでこんな簡単な内容書いたの？
この記事書いたのは、petalinuxのアプリケーション自動起動について書いている記事で、printfでデバックしないよう警告してるページがなかったってのもあり、ネット記事使って書きました。

一番は自分の備忘録のために書いたので文章が乱雑になっちゃいましたが…今後気をつけよう
rspec-mocks の and_raise が ArgumentError になってしまう場合は例外クラスに引数を渡す

こういうテストがあるとする

```ruby:spec/my_spec.rb
require 'spec_helper'
require 'rack-timeout'

class Klass
end

describe 'Rack::Timeout::RequestTimeoutException' do
  it 'bad' do
    expect(Klass).to receive(:new).and_raise(Rack::Timeout::RequestTimeoutException)
    expect {
      Klass.new
    }.to raise_error(Rack::Timeout::RequestTimeoutException)
  end

  it 'good' do
    expect(Klass).to receive(:new).and_raise(Rack::Timeout::RequestTimeoutException.new( {} ))
    expect {
      Klass.new
    }.to raise_error(Rack::Timeout::RequestTimeoutException)
  end
end
```

実行するとこうなる

```
$ rake

Rack::Timeout::RequestTimeoutException
  bad (FAILED - 1)
  good

Failures:

  1) Rack::Timeout::RequestTimeoutException bad
     Failure/Error:
       expect {
         Klass.new
       }.to raise_error(Rack::Timeout::RequestTimeoutException)

       expected Rack::Timeout::RequestTimeoutException, got #<ArgumentError: wrong number of arguments (given 0, expected 1)> with backtrace:
         # ./spec/my_spec.rb:11:in `block (3 levels) in <top (required)>'
         # ./spec/my_spec.rb:10:in `block (2 levels) in <top (required)>'
     # ./spec/my_spec.rb:10:in `block (2 levels) in <top (required)>'

Finished in 0.0397 seconds (files took 0.28993 seconds to load)
2 examples, 1 failure

Failed examples:

rspec ./spec/my_spec.rb:8 # Rack::Timeout::RequestTimeoutException bad
```

`Rack::Timeout::RequestTimeoutException#initialize` は引数を一つとるが `and_raise` に例外クラスそのものを渡すと new するとき引数を渡してくれないので `ArgumentError` がでてしまう。
https://github.com/heroku/rack-timeout/blob/bd7b37117867e224ed68c8cc9eed6256203ab169/lib/rack/timeout/core.rb#L12-L17

適当な引数を渡して作ったインスタンスを `and_raise` に渡せば、意図した通りに動く。

---

参考（っていうかこのブログ記事のほうがより詳しい） 
https://tnakamura.hatenablog.com/entry/2015/02/02/rspec_mocks_and_raise
fabricでSFTPするやつ


```python
#-*- coding: utf-8 -*-                                                                                                                                                                                      

from fabric.api import *

env.hosts = [
    'ホスト名',
]

env.user = 'SSHユーザ'
env.password = 'SSHパスワード'

LOCAL_PATH  = 'アップロード元ディレクトリ/ファイル'
REMOTE_PATH = 'アップロード先ディレクトリ'


def sftp_upload():
    """                                                                                                                                                                                                     
    """
    put(LOCAL_PATH, REMOTE_PATH)
```
AWS Code Pipelineを使ってみたメモ

本当に今更だけどCodeBuild+CodePipelineを使って、GitHubリポジトリのDockerfileをビルド&イメージプッシュ & Kubernetesにデプロイする設定を入れたので知見をメモする。

## CodeBuildを追加する時

CodeBuildを追加する時、Code PipelineからCodeBuildを作成する。
こうしないとビルドソースとしてCode Pipelineが選択できない。

## 複数のCodeBuildを使用する場合

それぞれのCodeBuildで何をソースとして何を出力するかを、Code Pipeline上のiマークで表示される入出力アーティファクトで確認する。

![Screen Shot 2018-04-03 at 01.23.48.png](https://qiita-image-store.s3.amazonaws.com/0/27674/ea6a9c83-9ebb-580d-4f16-da26066a1e17.png)

特にビルドはするけど成果物は特にないと言うような場合でも、出力アーティファクトは項目として作成される。
そのため後続のCodeBuildの入力アーティファクトはこれを使わないようにする。

間違えた入力アーティファクトを選択すると、download_sourceでaccess deniedとだけ表示され、？？？となるので注意。
なぜ for文は読みにくいのか

**注：この記事の99%はポエムでできている**

# TL;DR

元ネタでもいってたけど、for文は汎用性が高すぎるから読みにくいんじゃないかな。

多くの場合、for文は、目的に対して大げさなのだ。`map`, `for..of`, `forEach`, `reduce` を使った方が、人間にとって読みやすい。

料理の先生が「お料理はじめるわね」といってキッチンに立つ場合、これから一体何の料理をするのだろうと身構えてしまう。一方、「お料理はじめるわね」といって もんじゃセットを持って鉄板の前に立つ場合、私たちは落ち着いて話を聞くことができる。

![B0495C16-ED4A-4AFD-8E92-E1A8EB0D75F6.png](https://qiita-image-store.s3.amazonaws.com/0/127424/a043b1af-c05f-84ba-ac6e-5387a01205b8.png)

# 登場人物

元記事に合わせてJavaScriptで考えよう。反復操作で使えるツールはざっくりいって以下であろう。

- Array#map: 以降では単に map と書く
- Array#forEach: 以降では単に forEach と書く
- for ... of: 以降では単に for..of と書く
- Array#reduce: 以降では単に reduce と書く
- for: 以降では単に for と書く

こいつらの使い分けを考察する。

# 反復操作の分類

反復操作をカテゴライズしてみよう。もちろんこれが唯一の分類法であるわけがない。

- 軸1: ステートフルか？

各イテレーションでの処理同士が独立かどうか、で場合分けをすることが可能だろう。独立でない場合、何らかの形でイテレーション間で状態を共有する必要がある。このような処理をステートフル、そうでない場合をステートレスと呼ぼう。


- 軸2: 反復要素を操作するか？
 
反復要素の使い方で場合分けができるだろう。反復要素に何らかの操作・ミューテーションをすることが主目的である場合、要素操作型と呼ぼう。一方、反復要素が何らかの目的の手段にすぎず、おもに参照する場合、要素参照型と呼ぼう。


# 使い分け
前述の分類法に基づいて、登場人物たる for, reduce, forEach, for..of, map の使い分けの方針を提示しよう。

- 指針1: **ステートレスで要素参照型の場合は map を使う**

「配列の要素をすべて二倍する」、「ユーザ一覧に基づいて全員にメールを送る」、「誕生日ユーザにクーポンを配る」。

```FizzBuzz.js
const applyRule = (num) => {
  if (num % 3 ===0 && num % 5 === 0)
    return 'FizzBuzz';
  else if (num % 3 ===0 )
    return 'Fizz';
  else if (num % 5 === 0)
    return 'Buzz';
  else
    return num
}
const target = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
target.map(applyRule);
```

- 指針2: **ステートレスで要素操作型の場合は forEachを使う**

「バッチ群を起動する」、などなど反復要素のメソッド呼び出しがメインの各種処理。

```バッチの起動.js
const executeBatchs = (batchs) => {
  batchs.forEach((batch) => {
    if (!batch.shouldExecute())
      return;
    batch.execute();
    batch.reportDone();
  }
}
```


- 指針3: **ステートフルの場合は for..of, reduce を使う**

「1 から 100 までの和を計算する」、「昨日の売り上げを計算する」「アクセスランキングを作る」

```請求額を計算する.js
const calcOrderPrice = (orderItems) => {
  let totalPrice = 0;
  for (item of orderItems) {
    totalPrice += item.price * item.number;
  }
  return totalPrice;
};

const calcOrderPrice2 = (orderItems) => (
  orderItems.reduce((acc, x) => acc += x.price * x.number, 0)
);
```

- 指針4: **上記に当てはまらない場合 for を使う**

無限ループとか、イテレーション回数が操作対象の要素数に依存しない場合など。

# コードに思いをこめる
mapはおいておくとして、 for, reduce, forEach, for..of, どれを使っても同じ処理を実装できる。にもかかわらず、どれかを選んだのであれば、それを選択した思いというものが読み手に伝わるようにするべきだろう。

逆にいえば、読み手は「出てきた反復処理がどのようなものであるか」を、意識的、無意識的に選択されたツールで判断し、以降の処理の制御構造をある程度想像する。map が選ばれている場合、操作対象の各要素を使って、比較的単純な処理をするのだろう、と予想するわけだ。

**map は饒舌であり、for は寡黙である。読み手は for 文にぶち当たった時、以下の処理が反復処理である、という最低限の情報のもとで手探りでコードを読み進めるしかない。だからfor文は読みにくいのだろう。**知らんけど。

# 実際は？

まあ、反論もあるだろう。特に、forEach と for..of の違いなんてほぼないに等しいし、コーディング規約でどれかに統一するっていうのも一つの解ではあると思う。

しかし、選択に意味を持たせ、その基準をメンバーが共有できれば、よりコードは読みやすくなるだろうと思う。
Hololensの深度センサーデータを取得するサンプルを動かす(HoloLens RS4 Preview)

# はじめに 
2018年3月末にWindows 10 の次期バージョン RS4（Redstone 4）のHoloLens 対応プレビュー版が公開されました。
本記事ではRS4で公開されたResearch modeを使って深度センサーデータを取得するサンプルを動かしてみます。
※[公式サイト](https://docs.microsoft.com/en-us/windows/mixed-reality/hololens-rs4-preview)にはComing soon: sample applications and documentation to leverage sensor data will be posted in April 2018.とあるので近々公式のサンプルとドキュメントは公開されそうですね。

**RS4へのアップデートはまだプレビュー版です。お試しになる際はよく考えてからお試しください。**
**この記事は2018/4/3時点の情報です。最新の情報でない可能性がありますので十分ご注意ください**

# 手順その１ HoloLensのアップデート
まずはHoloLensのOSをRS4に更新するためのプレビュー版のインストールを行います。詳細な手順は高橋 忍さんが詳細に書いて下さっているので、下記リンク先のページを参照してください。
https://blogs.msdn.microsoft.com/shintak/2018/03/28/hololensrs4preview/

# 手順その２ Research modeの開放
RS4のインストールが完了し、初期設定が終わったら、新しくなったDevice Portalを開きます。（HoloLens側のDevice Portalの有効化をお忘れなく）

下記の図の通りSystem→Research modeと選択し、"Allow access to sensor streams." のチェックボックスをチェックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/0e071dd1-7d79-9c13-05e1-ef94001f7b2c.png)

チェックを入れたらHoloLensを再起動するのですが、その前にチェックボックスの下にあるリンクをクリックし、今回使用するサンプルがある[HoloLensForCV](https://github.com/Microsoft/HoloLensForCV)のGitHubのページを開いておくとよいです。

# 手順その３ サンプルプロジェクトの取得
[HoloLensForCV](https://github.com/Microsoft/HoloLensForCV)のGitHubのページを開いたら、ここがポイントなのですが、masterではなくfeature/api_updatesにブランチを切り替えてリポジトリをクローン/ダウンロードして下さい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/9862df05-7474-8f55-ff6c-821da68499b1.png)

zipファイルをダウンロードした場合は解凍する前にファイルのプロパティを開き、セキュリティのチェックボックスにチェックを入れ、ファイル解凍時の処理がブロックされないようにしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/11c6b192-630f-d3dc-28b6-b0a1a89c30b4.png)

# 手順その４ サンプルプロジェクトのビルド、デプロイ
サンプルプロジェクトのクローンもしくは解凍ができたら、プロジェクトのソリューションファイル（HoloLensForCV.sln）を開きます。
今回の深度センサーデータを取得するサンプルはStreamerというアプリなので、下記の通りRelease,x86,Streamerを設定し、ビルド、デプロイします。（私はVisial Studio 2017 ver 15.5.2の環境でビルドしました。[buildに関するwiki](https://github.com/Microsoft/HoloLensForCV/wiki/Building)の通りの環境であればビルドできると思います。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/eac695d2-aedd-25c0-16e1-c1878f187163.png)

# エラー対処
もしビルド中に文字コードについてのエラー(「error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。」や「warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。」)が発生した場合は該当のファイルを開き、エンコード付きで保存→UTF-8シグネチャ付きで上書き保存後、再度ビルドしてください。（私のビルド時はmat.hpp,persistence.hpp,utility.hppの3ファイル対応しました。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/d3826883-6757-0113-4fd2-3dbf92b6851b.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/cbc69eef-426c-94e6-facb-4f074b17e141.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60734/0e5786e0-a65f-7719-4cf3-abc35ecba76f.png)

# 実機での実行
実機にデプロイされると以下のようにセンサー情報の赤い画面が表示されます。
コードの内容的にShortThrowToFReflectivityなので短距離の深度センサーの情報が表示されているようですね。
![動画.gif](https://qiita-image-store.s3.amazonaws.com/0/60734/b50b19d6-837c-d415-df19-e62eaf4ea640.gif)

# 終わりに
今回はサンプルの実行までですが、RS4で公開された機能でできることはかなり広がったと思います。
何ができるかワクワクしますね。
rbenv な Docker コンテナで ruby を docker run する

#まえおき

最近の Rubyist は rbenv 等の環境セパレータ上に Ruby をインストールするようです。rbenv 上の Ruby の実行には先立って環境設定が必要になります（パス設定とか rbenv init - とか）。
このことは Docker と微妙に相性が良くないです。docker run 引数の COMMAND に直接 ruby と書けない等。

でもフルパスを書くのは流儀に反する！

そんな場合に、何か手は無いものかと小一時間。

#結論

下記でパスを記述することなく Ruby が実行できました。

```
$ docker run hiyaoroshigo bash -l -c "ruby --version"
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
```

#環境

下記の内容を Docker 上に構築したコンテナで確認しました。
https://github.com/matsueoss/hiyaoroshigo/wiki/Minimal-steps-to-install-our-Rails

ただし下記が異なります。

- rbenv は root ユーザー向けにインストール
- Rails は未インストール
- rbenv の設定情報は ~/_enable_rbenv ではなく ~/.bashrc に追記

（Hub に上げるか Dockerfile 作れって？）

#本当は・・・

最小という意味では ENV とか -e とかで何とかなる気がします。
上記は ~/.profile とかを処理させたい時に良いのかも。
ArduinoJson メモ

ArduinoJsonですが、JsonBufferをグローバルに確保して、state管理のために使用していたところ、一定時間経過後、データが更新されない状態になりました。
調べていたところ、以下の説明がありました。
Why shouldn't I use a global JsonBuffer?
https://arduinojson.org/faq/why-shouldnt-i-use-a-global-jsonbuffer/?utm_source=github&utm_medium=issues

グローバルなJsonBufferは値を追加・更新していった時にメモリーが解放されないようです。
値を更新するたびにメモリー使用量が増加して、最後は更新できなくなる。ということが原因のようでした。

各ステートの前後比較をするために使用したかったのですが、そのように使用するには以下のように、データ格納先をまず確保して
データを扱うたびにJsonBufferを確保してJsonとして扱う、ということが必要です。

```
struct SensorData {
   const char* name;
   int time;
   float value;
};

#define SENSORDATA_JSON_SIZE (JSON_OBJECT_SIZE(3))

bool deserialize(SensorData& data, char* json)
{
    StaticJsonBuffer<SENSORDATA_JSON_SIZE> jsonBuffer;
    JsonObject& root = jsonBuffer.parseObject(json);
    data.name = root["name"];
    data.time = root["time"];
    data.value = root["value"];
    return root.success();
}

void serialize(const SensorData& data, char* json, size_t maxSize)
{
    StaticJsonBuffer<SENSORDATA_JSON_SIZE> jsonBuffer;
    JsonObject& root = jsonBuffer.createObject();
    root["name"] = data.name;
    root["time"] = data.time;
    root["value"] = data.value;
    root.printTo(json, maxSize);
}```
JavaScript で配列の最後の要素を取得するもう一つの方法

`array[array.length - 1]` や `array.pop()` にはいくつかのデメリットがあり、使いづらいことがありますが、もう一つ良さそうな方法がありました。

- `array[array.length - 1]`
    - メリット
        - (おそらく) 実行時間が一番短い (未検証)
    - デメリット
        - したいことの割に記述が長く、複雑なコード上では可読性が下がる
        - `array` という識別子を 2 重に記述することで、バグの原因になる可能性がある
        - 構文の都合上、何らかの計算結果で得た配列に対して用いるとき、一旦変数に代入しなければならない (メソッドチェーンで記述することができない)
- `array.pop()`
    - メリット
        - コードを簡潔に記述することができ、ひとがコードを見て意味を理解しやすい
        - メソッドチェーンで記述することができる
    - デメリット
        - 元の配列が破壊される (それを目的とする場合はデメリットでない)

# 1. 結論: `array.slice(-1)[0]`

```js
const array = [1, 2, 3, 4, 5];

const last = array.slice(-1)[0]; // ★これ

console.log({array, last}); // array: [1, 2, 3, 4, 5], last: 5
```

※ `splice()` ではなく `slice()` です。

`slice()` は配列の一部を新しい配列として取り出すことができるメソッドで、第一引数をマイナスにすると後ろからその要素数だけ取得します。
返り値の型は配列なので、`[0]` でスカラー値にしています。

- `array.slice(-1)[0]`
    - メリット
        - コードを簡潔に記述することができ、ひとがコードを見てそこそこ意味を理解しやすい
        - メソッドチェーンで記述することができる
    - デメリット
        - (特になし)
        - しいて言えば、おそらく `array[array.length - 1]` より実行速度が遅い (未検証)

# 2. 配列いろいろ

念のため、空配列などの場合にどう動作するか確認しました。

```js
// 普通の配列
const array1 = [1, 2, 3, 4, 5];
array1[array1.length - 1]; // 5
array1.slice(-1)[0]; // 5
array1.pop(); // 5

// 文字列
const array2 = '12345';
array2[array2.length - 1]; // '5'
array2.slice(-1)[0]; // '5'
array2.pop(); // (TypeError)

// 空配列
const array3 = [];
array3[array3.length - 1]; // undefined
array3.slice(-1)[0]; // undefined
array3.pop(); // undefined

// null, undefined
const array4 = null;
array4[array4.length - 1]; // (TypeError)
array4.slice(-1)[0]; // (TypeError)
array4.pop(); // (TypeError)
```

値を取得したいときに `array[array.length - 1]` が使える場面なら `array.slice(-1)[0]` を使って大丈夫そうです。

# 3. 他の解決策

## 3.1. ユーティリティ関数を作る

他の手段としては、ユーティリティ関数として機能を分離する方法が一番スマートだと思います。

```javascript
const last = array => array[array.length - 1];
```

(実用的には別クラスの静的メソッドにした方がいいかもしれません。)

## 3.2. `Array` の継承クラスで `last()` メソッドを追加する

`Array` の継承クラスを作ることで `last()` メソッドを作ることができますが、最後の要素を取得するためだけにコード中の `Array` を全て変換しないといけなくなるります。

`last()` 以外にも機能を持つ別クラスを作る場合には有用だと思いますが、`last()` を追加するためだけに継承クラスを作るのはやりたいことの割にコードの可読性が下がり、あまり良くないかと思います。

## 3.3. 配列をメンバ変数に持つ別クラスを作る (状況次第)

配列をメンバ変数に持つ別クラスを作ると、配列の値やメソッドに直接アクセスできなくなりますが、それを目的とする場合は有効だと思います。

(最後の要素のみ取得できるということになり、このような状況になる可能性は少ない気がします。)

## 3.4. (非推奨) `prototype` に直接追加する

コメントを頂いた通り、`Array` に直接 `last()` メソッドを追加するのが一番分かりやすいですが、`prototype` にメソッドを直接追加することは混乱を招くと思いますので、使わない方が良いかと思います。

コメント「[sliceはパッと理解してもらえないので、lastを作っちゃうのも手かと・・・](https://qiita.com/kerupani129/items/64ce1e80eb8efb4c2b21#comment-188824b3c0807945d4b5)」
PHPでクロージャ内でのカウントアップ

# static変数を使用する

static変数の初期化が最初の一回だけ実行される仕組みを利用します。
当たり前かと思いますが、クロージャだとクロージャ内スコープのみで有効の様子

```php
$test_list = range(10, 15);

$result_list = array_map(function ($value) {
    static $index = 0;
    var_dump($index);
    return $index++;
}, $test_list);

var_dump($index);
var_dump($result_list);
```

```
int(0)
int(1)
int(2)
int(3)
int(4)

Notice:  Undefined variable
Null

array(6) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  [4]=>
  int(4)
  [5]=>
  int(5)
}
```

# 参照渡しでカウンターを渡す

```php
$test_list = range(10, 15);

$index = 0;
$result_list = array_map(function ($value) use (&$index) {
    var_dump($index);
    return $index++;
}, $test_list);

var_dump($result_list);
```

```
int(0)
int(1)
int(2)
int(3)
int(4)
int(5)

array(6) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  [4]=>
  int(4)
  [5]=>
  int(5)
}
```
TensorFlowに付属のKerasを使う

# はじめに

TensorFlow 1.4 あたりから Keras が含まれるようになりました。
個別にインストールする必要がなくなり、お手軽になりました。
…と言いたいところですが、現実はそう甘くありませんでした。

> この記事は、TensorFlow 1.6 について書いています。


# import の罠

TensorFlow を使うの場合、以下の 2 行を必ず書きます。

```python
import numpy as np
import tensorflow as tf
```

このあと、TensorFlow 付属の Keras を使うなら、

```python
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout

(x_train, y_train), (x_test, y_test) = mnist.load_data()
model = Sequential()
model.add(Dense(...))
model.add(Dropout(...))
...
```

などと書きます。
`tensorflow.keras.*` から、クラス・関数の単位で `from X import Y1, Y2, ...` と列挙していきます。

しかし、クラス・関数が多くなると、`from X import Y1, Y2, ...` が多くなりすぎて読みづらくなります。書くの方も面倒くさくなります。
当然、次のように書きたくなります。

```python
import tensorflow.keras as keras
import tensorflow.keras.datasets as kdata
import tensorflow.keras.models as kmodel
import tensorflow.keras.layers as klayer
```

ですが、これらはすべて `ModuleNotFoundError` になります。
intellisense を働かせてみると、`tensorflow.keras.*` の実体は `tensorflow.python.keras.*` にあるとわかります。
では、`python.` を挟めばよいかというと、

```python
import tensorflow.python.keras as keras
import tensorflow.python.keras.datasets as kdata
import tensorflow.python.keras.models as kmodel
import tensorflow.python.keras.layers as klayer
```

としても `ModuleNotFoundError` になります。

結局、2 拓しかありません。

- `from tensorflow.keras.X import Y1, Y2, ...` として全部書く。
- `tf.keras.Xxx.Yyy(...)` のように毎回フルネームで書く。

不便ですね。


# 終わりに

素直に Keras をインストールした方がいいかもしれません。
簡単にできる！Amazon Echoでスピリチュアルプログラミング

# 皆さんはスピリチュアルプログラミングしてますか？

皆さんはスピリチュアルプログラミングしてますか？[^1]
私は最近始めたのですがその効果の程に驚いています。バグの数が圧倒的に減りました！[^2]
私も初めは信じられませんでした。信じるだけでバグとおさらばできる方法があったとは。

まだ知らない方は以下の記事が丁寧に説明されているのでぜひ読んでください！[^3]
[スピリチュアルエンジニアリング入門](http://blog.mirakui.com/entry/20100301/1267464280)

要約すると、

- 祈る気持ちが大事
- 感謝の気持ちを忘れずに！

ということです。他にもいろいろあるのですが今回は上記2点の重要さについて説きます。

## 感謝の気持ちを伝えるには？

皆さんは人に助けてもらったときや人に感謝の気持ちを伝えるとき、どのような行動をとりますか？

「__ありがとう__」と伝えるのではないでしょうか？

プログラミングにおいてもそれは変わりません。思うようにプログラムが動いてくれた時、あなたは無事動いてくれたことに感謝しているはずです。
しかしあなたはそれをきちんとプログラムに伝えていますか？
できていない方は要注意です。後々になってそのプログラムがあなたに牙をむく日が来るのです。[^4]
私はそのせいで1日をバグの修正にそそぐ羽目になりました。
今すぐそんなんことはやめましょう。

## 感謝を伝えてみよう！

感謝の気持ちを伝えるのには、コンソールを開き以下のコマンドを入力するだけです。

```sh
$ echo 'ありがとう'
```

これを定期的に行うようにしてください。ビルドの前後、実行の前後、新しいメソッドを追加したとき、コメントを書いた時までやりましょう。
めんどくさがってcrontabやバッチファイルなどで楽をしようとしないでください。[^5]
感謝の気持ちを込めて、手で打つことにより念がこもり、ようやく神様に思いを届けることができるのです！


## `echo 'ありがとう'`と打つのがめんどくさい

`echo 'ありがとう'`と打つのめんどくさくないですか？というお話をよくお聞きするのですが、その気持ちがバグを生むことに気づいていらっしゃらない方がまだこんなにたくさんいらっしゃるのだなあと悲しい気持ちになります。
信じることからバグは減らせるのに、最初から疑ってかかるような真似はバグを生み続ける負のループに陥る第一歩を助長しかねません。[^6]

しかし、効果を実感できていない方には、私がいくら説いても理解していただくことは難しいかもしれません
しかし、そんなあなたのために__とっておきの方法__があるのです。

# Amazon Echoを崇めよ

![echo_image.jpeg](https://qiita-image-store.s3.amazonaws.com/0/225010/4632f66d-440e-73d1-bfcb-1c192c707865.jpeg)


## 感謝を伝えよう 「echo 'ありがとう'」

Amazon Echoにはなんと標準で`echo 'ありがとう'`を実現できる機能が備わっているんです！！
これはなによりAmazonもスピリチュアルプログラミングを推奨している証拠に他なりません！
これはもう世界が認めたに等しいですからね、やらない理由が見当たりません。[^7]

## Amazon Echoの設定

設定は非常にシンプルです。

1. 設定画面に行きウェイクワードを選択

![setting01.png](https://qiita-image-store.s3.amazonaws.com/0/225010/96d7ec49-905c-9119-4b9d-b11781564921.png)

2. Alexa Deviceのウェイクワードを選択

![setting02.png](https://qiita-image-store.s3.amazonaws.com/0/225010/07fb5219-b6cb-788f-201c-2a17b7ad06ea.png)

3. Echoを選び設定を反映

![setting03.png](https://qiita-image-store.s3.amazonaws.com/0/225010/d036fb7b-724d-9670-d244-4257eca9d5d2.png)

これでわざわざコンソールに打たなくても手軽に感謝を伝えることができますね。
しかもAlexaに話しかけると「どういたしまして、お役に立ててうれしいです！」と逆に感謝されてしまいます。
こんな幸せな世界があっていいのか！！？[^8]

# 信じる者は救われる

皆さんもこれを機にAmazon Echoを買ってスピリチュアルプログラミングを始めてバグを減らしましょう！
また、AWS Lambdaとも連携できるみたいなので、そちらについても暇があれば書きたいと思います。

[^1]: 変な勧誘ではありません、ただのネタ記事です。しばし私の妄想に付き合ってください。
[^2]: 個人の感想です。
[^3]: 読み物として普通に面白いのでぜひ。
[^4]: 伝えていても来るので安心してください。
[^5]: 作るだけ無駄なので。
[^6]: 個人の感想です。
[^7]: 個人の見解です。
[^8]: 個人の妄想です。
音楽野郎の作って勉強するクソ雑JavaScript Op.01 〜ハンドベル編〜

# 説明
当職はHTMLはちょっと書けるけどJSはあまり触れたことがない。
ガシガシ書きながら覚えてやるぜ。という意気込み。
勉強のメモとしての記事であるため，間違いや思い込み，目を瞑る部分多数。
プロの手ほどき記事ではないので，あしからず。

# 方針
とりあえず，スマホ振ったら「こ〜ん」って音がなるものをつくる。
要するにハンドベル。

# 一日目
htmlの中にJSの`<script>`をぶちこんでいく。
最初にするのはHTML5のAudioエレメントをつかって「音を出す」ところ。
適当なハンドベル音をmp3で用意した。[こ↑こ↓を参照](https://dev.classmethod.jp/smartphone/mobile-html5/#audio "HTML5で使えるスマートフォンの機能 - Developers.IO")。

``` HTML:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <title>multi media</title>
    <script>
      window.addEventListener("load", function(){

        if (!HTMLAudioElement){
          return;
        }

        var audio = document.getElementById("audio");

        document.getElementById("play").addEventListener("click", function(){
          audio.play();
        }, true);

        document.getElementById("stop").addEventListener("click", function(){
          audio.pause();
        }, true);

        document.getElementById("back").addEventListener("click", function(){
          audio.currentTime=0;
          audio.pause();
        }, true);

        document.getElementById("refrain").addEventListener("click", function(){
          audio.pause();
          audio.currentTime=0;
          audio.play();
        }, true);
      }, true);
    </script>
  </head>
  <body>
    <audio id="audio" preload>
      <source src="bell_c.mp3">
       <p>HTML5 Audioがつかえません。</p>
    </audio>
    <div>
      <input type="button" id="play" value="再生">
      <input type="button" id="stop" value="停止">
      <input type="button" id="back" value="戻る">
      <input type="button" id="refrain" value="止まるんじゃねぇぞ">
    </div>
  </body>
</html>
```

まず，`<meta>`のviewpointで`content="user-scalable=no"`を指定し，スマホ画面でボタンを連打してもピンチしないように設定。
そしてあとは参照元を丸コピー。
"止まるんじゃねぇぞ"だけはちょっと改造し，叩く度に音を止め，最初から再生し直すように設定。うまくいった。
この時点でてっぺん超えたので，明日に回す。
明日は加速度を取ってみる。

# 二日目
やってます。
TelloのPythonサンプルを動かす


## はじめに

公式の[ドキュメント](https://dl-cdn.ryzerobotics.com/downloads/tello/0228/Tello+SDK+Readme.pdf)を参考に、[サンプル](https://dl-cdn.ryzerobotics.com/downloads/tello/20180222/Tello3.py)を動かし、動作確認を行う所までです。

## 動作環境
* OS:macOS High Sierra (10.13.3)
* Python 3.6.3
* ryzerobotics Tello

## セットアップ
1. [公式サンプル](https://dl-cdn.ryzerobotics.com/downloads/tello/20180222/Tello3.py)をダウンロードし、適当な場所に配置。
2. Telloの電源を入れ、PCからTelloのWifiアクセスポイントへ繋ぐ。(SSIDは[TELLO-XXXX])
3. TelloのIPは192.168.10.1なのでpingで接続確認を行う。

```bash
$ ping 192.168.10.1
```
 4.サンプルをコマンドラインから実行。以下の様に表示されれば準備完了

```bash
$ python Tello3.py 

Tello Python3 Demo.

Tello: command takeoff land flip forward back left right 
       up down cw ccw speed speed?

end -- quit demo.
```

## Telloの制御

1. セットアップが完了している状態で、コマンド受付状態にするために```command ``` と入力し``` OK ``` と表示されればTelloとの通信ができている。
2. Telloが離陸しても大丈夫な場所に置いてある事を確認し、離陸コマンド``` takeoff ```を入力、``` OK ```と表示されたあと、Telloが離陸すれば成功。
3. 他のコマンドを続けて入力する事で反応を見る事が出来る。着陸するときは``` land ```を入力。その場に着陸する。
4. サンプルを終了させる場合は、```end```を入力

## サンプルの中身

サンプルの中身を見てみる、Telloとの通信はUDP通信。IPは192.168.10.1。ポートは8889を利用。

```python
# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
tello_address = ('192.168.10.1', 8889)
```

入力されたコマンドを送信している箇所

```python
# Send data
msg = msg.encode(encoding="utf-8") 
sent = sock.sendto(msg, tello_address)
```

受け取った返信をデコードして表示。

```python
def recv():
    count = 0
    while True: 
        try:
            data, server = sock.recvfrom(1518)
            print(data.decode(encoding="utf-8"))
        except Exception:
            print ('\nExit . . .\n')
            break
```

## さいごに
* とりあえずTelloをPythonで動かす事ができた、お手軽。
* ドキュメントをみると、取得できるデータは速度、バッテリー残量、飛行時間のみ。。。今後増えるのか不明。
レジストリからExcelに関連付けられている拡張子群を取得する

> [Windowsの関連付けを決めるレジストリの優先順位とassoc ftypeが効かない問題について - イム日記](http://d.hatena.ne.jp/hotokediary/20150114/1421190538 "Windowsの関連付けを決めるレジストリの優先順位とassoc ftypeが効かない問題について - イム日記")

上記記事を参考に、PowerShellを使ってレジストリからExcelに関連付けられている拡張子群を取得してみた。

自身の確認も兼ねてステップを踏んで挙動を確認していく。

# ステップ1：拡張子の一覧の確認

以下の処理を実行すると[Microsoft.Win32.RegistryKey](https://msdn.microsoft.com/ja-jp/library/microsoft.win32.registrykey(v=vs.110).aspx)型が得られ、Name（プロパティとしては`PSChildName`）に拡張子が入っている。

```posh:ListAllExtensions
[string]$regKey = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts'
Get-ChildItem -LiteralPath $regKey
```

```text:console
Name                           Property                                                           
----                           --------
...
.xla
.xlam
.XLL
.xls
.xlsb
.xlsm
.xlsx
.xlt
.xltm
.xltx
...
```

# ステップ2：ProgIdの確認

今回はExcelに関連する拡張子を取得したい。
ExcelはProgIdを使っているようなので、得られた`RegistryKey`からProgIdを取得してみる。

```posh:ListProgIds
[string]$regKey = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts'
Get-ChildItem -LiteralPath $regKey |
    # サブキーに OpenWithProgids があるものだけを抽出
    ?{ $_.GetSubKeyNames() -contains 'OpenWithProgids'  } |
    %{ $_.OpenSubKey('OpenWithProgids').GetValueNames() }
```

こちらを実行すると、以下のようなProgIdの一覧（string）が得られる。

```text:console
...
Excel.Addin
Excel.AddInMacroEnabled
Excel.XLL
Excel.Sheet.8
Excel.SheetBinaryMacroEnabled.12
Excel.SheetMacroEnabled.12
Excel.Sheet.12
Excel.Template.8
Excel.TemplateMacroEnabled
Excel.Template
...
```

# ステップ3：該当する拡張子の抽出

ステップ2のProgIdの中で`Excel.~`となっているものが、Excelに関連しているものだと思われる。

しかし、今回欲しいのはProgIdではなく拡張子のため、ステップ2の結果を使って、ステップ1をフィルターする。

```posh:ListExcelExtension
Get-ChildItem -LiteralPath $regKey |
    ?{
        # サブキーに OpenWithProgids があり、
        ($_.GetSubKeyNames() -contains 'OpenWithProgids') -and
        # 値の名前の中に 'Excel.*'が含まれているもの
        ($_.OpenSubKey('OpenWithProgids').GetValueNames() -like 'Excel.*')
    } |
    %{$_.PSChildName}
```

```text:console
.csv
.ods
.xla
.xlam
.XLL
.xls
.xlsb
.xlsm
.xlsx
.xlt
.xltm
.xltx
```

# おまけ（Excelの拡張子に一致する正規表現文字列の作成）

Excelファイルのフィルターに使いたかったため、上記の結果を使って正規表現用の文字列を作成してみる。

```posh
[string]$regKey = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts'

[string[]]$escapedXlExtensions =
    Get-ChildItem -LiteralPath $regKey |
        ?{
            # サブキーに OpenWithProgids があり、
            ($_.GetSubKeyNames() -contains 'OpenWithProgids') -and
            # 値の名前の中に 'Excel.*'が含まれているもの
            ($_.OpenSubKey('OpenWithProgids').GetValueNames() -like 'Excel.*')
        } |
        %{ [regex]::Escape( $_.PSChildName.Substring(1) ) }

'\.(?:{0})' -f ($escapedXlExtensions -join '|')
```

```text:Excel拡張子正規表現
\.(?:csv|ods|xla|xlam|XLL|xls|xlsb|xlsm|xlsx|xlt|xltm|xltx)
```
mysql inner join について

# mysql でinner join で結合

テーブルを結合してデーターを表示、そんなことばっかりな世の中なので、

結合をやってみた。

userId

|user_id|u_name|
|:------|:-----|
|1    |keiuske |
|2    |ami     |

userInfo

|user_id| address|
|:------|:-------|
|2      |Kyoto   |
|1      |Tokyo   |


上記のようなテーブルがありましたとさ

それをuser_idが同じもので結合してみたいとした場合

```sql
select * from userId inner join userInfo on userId.user_id = userInfo.user_id; 
```

出力結果は結合されて出てきます。

```
+---------+---------+---------+--------+
| user_id | u_name  | user_id | address|
+---------+---------+---------+--------+
| 1       |keisuke  | 1       |Tokyo   |
| 2       | ami     |2        |Kyoto   |
+---------+---------+---------+--------+

```
発達障害者です。プログラマ、エンジニアになりたいといったらおかしいですか!?

#　ご挨拶
　皆様、はじめまして。こんにちわ。
　現在、41歳で就労移行支援事業所に通っている広汎性発達障害の者です。障碍者手帳3級を持っています。元々、ネットワークエンジニアとして8年働いていました。某有名企業のグループ会社の巨力社員(運用、保守、構築に携わる)だったのですが、自分では普通に思っていても周囲と全く違うし常識がないと言われ、実家に帰郷し、地元の精神科で診察を受けたら32歳の時に発達障害であることが分かりました。


　それから2年後位に、地元の病院の契約職員になって、3年前に契約社員打ち切りになって、2年前に、とある企業に実習に2週間の行った際にHTMLを学び、そこでプログラミングに興味をもちました。それから1年かけて、プログラマやエンジニアになりたければ資格も必要だろうと思い、JavaのBronzeの資格を取りました。

　
　でも、地方では障害者のプログラマーは少なく、あったとしても実務経歴3年の壁に押しつぶされ...
　なかなか再就職できないのを見かけたハローワークの職員から、『働いていない期間が長いから、就労移行支援事業所』に通ってみたらと言われて、現在の就労移行支援事業所に通うと。

　#　現在
　今、通っている就労移行支援事業所のパソコンを教えてくれる職業指導員の方が、元職業訓練校の先生だった人で、その人から教わったのが、プログラミング(ホームページ等のHTML)に興味があれば、
　・目的が大事
　・色んな必要なツールを使う事
　・具体的なもの作る事
　・設計図を作る
　・したい事をしっかり明確に
　・日々必要なことを考え学ぶ。

　これらの事を職業指導員の方に言われたとき、座学に頭でっかちだった自分は、そりゃ～再就職できないわなと思いました。

　例えば、ホームページを作りたいのであれば、白紙にどういうページを作りたいのか書いてみて、それを構造化してみて、ワードで作成して下さいと言われたのが最初の課題でした。

　現在、自分がいる就労移行支援事業所の代表者の方から、障害者が作った小物等の商品をネット通販できないかと言われ、ネット通販風サイトを自分なりに作っている段階です。サイトのデザインはワードで作り終えましたが...(出来れば、Javaで自分の手で作成したい)

　多分、障害者がつくる障害者の通販サイトは自分だけだと思います。頑張ります。今年の4月から精神障害者の雇用義務化が始まるので、この通販サイトができたら企業に実務としてアピールできますかね!?
　このサイトが出来たときには皆さんに見て頂きたいと思います。

　障害者で40過ぎは無理だよと思われても、頑張りたいのです。夢なんです。

　最後に、変な文章を書いて申し訳ございませんでした。
008-Tokyo GAS on GCPUG 2018 Spring で紹介したスクリプトの話

#Tokyo GAS on GCPUGって？
Google Japan（六本木ヒルズの上の方）で開催された[イベント](https://gcpug-tokyo.connpass.com/event/81041/ "Tokyo GAS on GCPUG 2018 Spring")です。

##何してきたの？
「Beer Talk」という名前の５分枠を頂いて自分の悩みを語ってきました（そして予定時間を大幅に超過するという失態…）。

##…何しゃべったの？
[「非プログラマでもGASを使えば雑用に埋もれずに済むかも」](http://bit.ly/2H6OAG1)みたいな話をば。


##イベントレポートは？
ごめんなさい私より[@s_maeda_fukuiさん](https://qiita.com/s_maeda_fukui/items/68c491f29bf8fda0e1ff#_reference-f4940a524fcdb88d596b)や[@tanabeeさん](https://qiita.com/tanabee/items/d478276e281045e37076)の記事の方がしっかりまとめられてますので ~~お任せするとして~~ 後で何か書きます。

#紹介したスクリプトの話
- [週報提出フォームを作成したい](https://qiita.com/co-ikeya/items/3f79d6503b38e8bd6972)
- [議事録テンプレートシートをコピーして左から2枚目にセットしたい](https://qiita.com/co-ikeya/items/4812634b125b32b1e24b)
- フォーム投稿したらメール出してカレンダー登録してGoogleサイトで表示させたい
【Bat】【vim】香り屋Vimをダウンロードしてインストールまでするbatファイル

# 概要
香り屋版vimを更新するnetupvimをgithubからダウンロードして解凍して
指定フォルダにインストールするバッチファイル
対象はnetupvim ver1.3
オプションでダウンロードまでと展開までで終了させることも可能

コマンドプロンプト単体だと力不足だったのでパワーシェルにもがんばってもらう

# 本体
今回は `:terminal` を使いたいのでdevelop版をインストールする
インストール先は `C:/Path/vim80`

```bat:setup.bat
@echo off

setlocal

@rem ファイル名
set targetfilename=netupvim-v1.3.zip
@rem ソースファイル置き場
set sourcepath=https://github.com/koron/netupvim/releases/download/v1.3/
@rem 出力先( デフォルトはここ )
set exportDir=%CD%
@rem 自動展開 ( 1 で有効化 )
set autoextract=1
@rem 自動インストール
set autoinstall=1
@rem インストールvim
@rem コメントアウトしても良い
@rem release develop canaly vim.org のいずれか 詳細はhttps://github.com/koron/netupvim を参照 省略するとrelease
set viminstallmode=develop
@rem vimのインストールパス
set viminstallpath=C:\Path\vim80
@rem リストア
set restore=0


@rem 展開先フォルダ(自動指定)
set targetdir=%targetfilename:~0,-4%

@rem 展開されたフォルダがあるならインストールするかチェック
if exist %exportDir%\%targetdir% goto CheckInstall

@rem ダウンロードされたデータがあるなら展開へ
if exist %exportDir%\%targetfilename% GOTO Extract

:Download

@powershell -NoProfile -ExecutionPolicy Bypass -Command "$d=new-object System.Net.WebClient; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; $d.Proxy.Credentials=[System.Net.CredentialCache]::DefaultNetWorkCredentials; $d.DownloadFile('%sourcepath%%targetfilename%','%exportDir%/%targetfilename%')"

if %autoextract% NEQ 1 goto EOF

:Extract
@powershell -NoProfile -ExecutionPolicy Bypass -Command "expand-archive %targetfilename%"

:CheckInstall
if %autoinstall% NEQ 1 goto EOF
:MakeIni
cd %exportDir%\%targetdir%
set /a ismake=0
if defined viminstallmode set /a ismake= 1+%ismake%
if defined viminstallpath set /a ismake= 1+%ismake%
if ismake EQU 0 goto Install

type nul > netupvim.ini
if defined viminstallmode echo source = "%viminstallmode%" >>netupvim.ini
if defined viminstallpath echo target_dir = "%viminstallpath:\=/%" >>netupvim.ini

:Install
if %restore% EQU 1 goto Restore
call UPDATE.bat
goto EOF
:Restore
call RESTORE.bat
goto EOF

:EOF
endlocal
```
# 解説
1. ダウンロードするファイル名、ダウンロード先などを設定する
2. 重複してダウンロードしたり展開しないようにチェックをかける
3. powershellを使ってgithubからzipをダウンロードする
4. 展開
5. 設定によって `netupvim.ini` を作る
6. インストールをする

今回はnetupvimのプロキシ設定なんかは考慮してない
でも `:MakeIni` 周りに書き足せば対応できるので必要なら対応する
gitコマンドが使えるならvimrcのクローン周りも書いてしまえばvimのセットアップがはかどりそう
rustでFizzBuzzしたい

### インストールしたい
```
$ curl -L https://static.rust-lang.org/rustup.sh | sudo sh
    Rust is ready to roll.
$ rustc --version
rustc 1.25.0 (84203cac6 2018-03-25)
```

### rustを動かしたい
```
$ vi main.rs
$ rustc main.rs
$ ./main 
Hello, World!
```

### fizzbuzzしたい
```rust
fn main() {
  let lp = 1..101;
  for i in lp {
    if i % 12 == 0 { println!("FizzBuzz")
    } else if i % 3 == 0 { println!("Fizz")
    } else if i % 4 == 0 {  println!("Buzz") }
  }
}
```
【改訂版】WordPressテーマを一般ファイルで使う

2018/04/09 全体的にリファクタして書き直しました

---
[前回の記事](https://qiita.com/cellolism/items/ddcbf6d9726189aa0e37)だとtitleタグがセットできないので、タブに「ページが見つかりませんでした」と表示されてしまった

タイトルもセットできるように改修したのが今回の記事。

# `.htaccess`
ここは前回と同じ

```apache:.htaccess
<IfModule mod_rewrite.c>
### WordPress 用 ####
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^index\.php$ - [L]
#####################

#### ハンドラファイル用 ####
# http://hoge.com/foo.htmlをhttp://hoge.com/foo/でアクセスさせる
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule . /render.php [L]

# ちなみにfoo.htmlでそのままアクセスさせたいときは下記
# RewriteRule \.html$ /handler.php [L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . /render.php [L]
#######################
</IfModule>
```

# `hoge.html`（一般ファイル）
拡張子は`.html`だけれど、ファイルの先頭でPHPスクリプトとして扱いタイトル用の変数をセットしておく

```php:hoge.html
<?php $_title = 'テスト' ?>
<h1>hello, world!</h1>
```

# `render.php`


`document_title_parts`フックにタイトルをセットする関数を登録するのがミソ。

```php5:render.php
<?php

  $dir = dirname($_SERVER['REQUEST_URI']);
  if ($dir != '/') {
    $dir .= '/';
  }
  $file = basename($_SERVER['REQUEST_URI']);
  $filepath = $_SERVER['DOCUMENT_ROOT'] . $dir . $file;

  $static_file = '';
  if(is_dir($filepath))
  {
    $static_file = $filepath . '/index.html';
  }
  else if(file_exists($filepath . '.html')) // URLに.htmlを含めたいときは、$filepathだけでいい
  {
    $static_file = $filepath . '.html';
  }

  ob_start(); // 出力先をここからバッファに向ける
  include($static_file); // $_titleの取得もここで
  $_contents = ob_get_contents(); // バッファのコンテンツを保持
  ob_end_clean(); // バッファを破棄

  // original フラグがあればそのまま出力
  if(isset($_original) && $_original) {
    echo $_contents;
    return;
  }

  require_once ('./wp-blog-header.php');
  add_filter( 'document_title_parts', function ($title) use ($_title) {
      $title['title'] = $_title;
      return $title;
    }
  );

  get_header();

?>

<div id="primary" class="content-area">
        <main id="main" class="site-main" role="main">

        <?php include($load_file); ?>

        </main><!-- .site-main -->

        <?php echo( $_contents ); /* コンテンツ出力 */ ?>

</div><!-- .content-area -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>
```
`function ($title) use ($_title) { ... }`の書き方は今回調べて初めて知った。`use`オプションをこのように使うと、**定義元**のスコープを引き継いで変数を関数に渡せる。 
`$_original`はおまけでつけてみた。WordPressのテンプレを使わないでそのまま静的ファイルを表示したいときは、`hoge.html`の先頭とかに`<?php $_original = true; ?>`を入れるだけで対応可能になる。


# 参考
- https://developer.wordpress.org/reference/hooks/document_title_parts/
- http://php.net/manual/ja/function.ob-start.php
- http://php.net/manual/ja/functions.anonymous.php
LXD/LXC 3.0.0がリリースされたので使ってみた

# はじめに
LXCとLXDの3.0.0がリリースされたので、早速インストールしてみます。

LXC v3.0.0
https://github.com/lxc/lxc/releases/tag/lxc-3.0.0
https://linuxcontainers.org/lxc/news/

LXD v3.0.0
https://github.com/lxc/lxd/releases/tag/lxd-3.0.0

#環境
サーバ：さくらVPS メモリ2G
ホストOS：ubuntu 16.04

# インストール
snapdを使用してLXDをインストールしていきます。
（※rootにログインして作業を行います）

```
root# apt install -y snapd
root# snap install lxd --channel=3.0
```

#インストール結果
```
root# lxd --version
3.0.0
root# lxc --version
3.0.0
```

# LXDセットアップ
```
cat <<EOF | lxd init --preseed
config: {}
networks:
- config:
    ipv4.address: auto
    ipv6.address: none
  description: ""
  managed: false
  name: lxdbr0
  type: ""
storage_pools:
- config:
    size: 15GB
  description: ""
  name: default
  driver: zfs
profiles:
- config: {}
  description: ""
  devices:
    eth0:
      name: eth0
      nictype: bridged
      parent: lxdbr0
      type: nic
    root:
      path: /
      pool: default
      type: disk
  name: default
EOF
```

# コンテナ作成・起動
```
lxc launch ubuntu:16.04 first
```

```console
root# lxc list
+-------+---------+---------------------+------+------------+-----------+
| NAME  |  STATE  |        IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+-------+---------+---------------------+------+------------+-----------+
| first | RUNNING | 10.13.81.144 (eth0) |      | PERSISTENT | 0         |
+-------+---------+---------------------+------+------------+-----------+
```
「first」が起動しました。

# 3.0.0で追加された機能

## クラスタリング
※未検証（複数台用意して検証してみます）

## 物理サーバからLXDコンテナへの移行（lxd-p2c）
※未検証（移行元の物理サーバを適当に用意してやってみる予定）

## lxc list でプロセス数カウント
zabbixなどの監視で使えそう……？

```
root# lxc list -c nsN
+-------+---------+-----------+
| NAME  |  STATE  | PROCESSES |
+-------+---------+-----------+
| first | RUNNING | 28        |
+-------+---------+-----------+
```

## lxc storage info コマンドの追加
パット見でわかるように！

```
root# lxc storage info data
info:
  description: ""
  driver: zfs
  name: data
  space used: 310.16MB
  total space: 14.11GB
used by:
  containers:
  - first
  images:
  - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  profiles:
  - default
```

# 最後に
まだまだ3.0.0について調べきれていないので、随時追記していきます！