OmniAICreator/Qiita-1.07M huggingface dataset:
[備忘録][イベント]Scrum Beginners Nightに参加した

# はじめに
- Yahoo!さんの[Scrum Beginners Night](https://smn.connpass.com/event/123053/)に参加してきました。
- ウォーターフォールだけやってきたので、アジャイルって資料いらん？という(まちがった)認識で参加
- アジャイルの手法の１つであるスクラムについて説明していただくイベント

# そもそもアジャイルって？
- アジャイルとは、**より良い開発方法を見つけ出そうとしている状態** とのこと
- アジャイルとは手法ではなく **状態** であったのだ
- スクラムとはアジャイルするためのフレームワークの１つであり現状を把握するためのもの

# スクラムの構成
ロール、イベント、アーキファクトの構成
洗い出したタスク（アークファクトで定義）をスプリントという仕事をする一区切りの時間に分割した単位ごとに作業していく

## ロール
- スクラムは**自己組織化チーム**によって成り立っている
    - 各々が責任を持って業務を遂行できる
    - 自分たちでゴールを達成できるチーム
- プロダクトオーナー(PO)、スクラムマスター(SM)、開発メンバーの３ロールがある
    - PO : 作成するプロダクトに対する、最終決定権と責任を持つ人　１人
    - SM : スクラムの理解と実践を推進し、プロジェクトを円滑に進めることに責任を持つ人　１人
    - 開発メンバー : プロダクトの開発を行い人、プロダクトの成果物の品質に責任を持つ人たち。何を使うか、細かい作業内容の落とし込み、テストどうするかなどやること多いイメージ　３〜8人
    - それぞれの相関 
     - PO -> 開発メンバー : WHAT　何をどこまでするのか提案
     - 開発メンバー -> PO : HOW　　WHATをどのように実現するのか提案
     - SM -> PO,開発メンバー : サポート　プロダクト作成で発生する障害物を取り除く
     
     **ポイント** 
  ```自担当のみしか見ないわけではなくみんなで解決する意識で取り組む
  最終的に担当フェーズの責任は各担当者にあり(迷った時など最終決定権は各担当にあるのかな)
  ```

## アーキファクト
スクラムで使うツールのこと
作業内容やその価値を管理

##### プロダクトバックログ
- タスクをリストにしてその詳細内容と工数を記載し、優先度順に並べたもの
- すぐに着手できるように、詳細は受け入れ状態(完成系)がどのようなものかわかるように書くこと
- 工数は**相対的な見積もり**で行う。例）作業Aはスプリント全体で言うと１％なので作業Bは３％など、基準となる作業を決めて見積もる(:girl:なるほどー！)
- 実績は前回スプリントのインクリメント(後述)と比べる

##### スプリントバックログ
- リリース可能なインクリメントにするための作業の一覧
- プロダクトバックログをさらに細かくして作業洗い出ししたリスト
- 作業内容、工数を決める
- 工数は具体的な時間で書く
- デイリーミーティングで随時更新可能

##### インクリメント
- 成果物
- １つのスプリントが終わればできるもの
- インクリメントは**常にリリース可能**な状態であることが必至!!
- 完成(DONE)の定義に法っておればOK 例）テストAをパスすればOK
- DONEの定義はいつ決めるのか本記事では抜けていますが、プロダクトバックログやスプリントバックログ決めるときに決めとかないといけないと思われ

## イベント
仕事をする一区切りの時間に分割したスプリントにはいくつかのイベントがある
スプリントを司るイベント(フェーズ)はこちら(1から順)

##### 1. スプリントプランニング
- スプリントのゴールを達成するためにどうするか決める
- 何から始めるか決める
- どこまで(WHAT)をどうやって実現するかタスク洗い出し(How) 

##### 2. デイリースクラム
- 毎日決まったタイミングで状況の共有を行う **議論は行わない**
- 作業の検査と今後の予想をする
- 昨日今日、問題あったか？の確認

```
デイリースクラムを繰り返す・・・
```

##### 3. スプリントレビュー
- 作業のフィードバックを行い**協力を引き出す**
- よりよくするための議論の場であって**POに承認をもらう場ではない**
- デモを行う(エンドユーザに見せるのもあり)
- プロダクトのインクリメントの検査
- バックログに必要あればタスク追加
- レビューは都度実施しても良い

##### 4. レトロスペクティブ
- 今までの成果を結果に、チームの改善、プロセスの改善を行う
- KPIなど

##### 5. バックログリファインメント
- バックログを最新にする
- 全体での共通理解を深める

これらイベントを経て、インクリメント（成果物）が完成する
```各イベントにはタイムボックス（スプリント全体のうち割り当てる時間）が決められている!!
レビューに時間制限儲けるっているのしてこなかったな・・・```



## まとめと感想
- スクラムにはPO（できる人）とSM（できる人）と開発メンバー（いろいろできる人）が必要
- アジャイルでは上下関係はない、というか持ってはいけない（誰かにOKと認めてもらうっていうのがない）
- それぞれが自信と責任とお互いを認め合う気持ちがいる
- 常にリリースできる状態って？難しいな・・・
- めっちゃわかりやすいイベントだったし楽しかった（:girl:ありがとうございます）
macOS の Node をアップデートする（トラブルシューティング）

macにて、npm init react-app した時に、Nodeのバージョンが古いぜ。と言われたのでアップデートした時のメモです。

```
$ npm init react-app my-app
npx: 63個のパッケージを4.154秒でインストールしました。
You are running Node 6.9.4.
Create React App requires Node 8 or higher.
Please update your version of Node.
$ node -v
v6.9.4
```
古すぎる。

恐らく最初にNodeをインストールした時に、macOS Installer (.pkg) を使ってインストールしたんだと思う。

途中からHomebrewでインストールしてたので、それをアンインストールして 

```
$brew uninstall node
Uninstalling /usr/local/Cellar/node/11.12.0... (4,417 files, 50.2MB)
```

再度インストール

```
$ brew install node
==> Downloading https://homebrew.bintray.com/bottles/node-11.12.0.high_sierra.bottle.t
Already downloaded: /Users/zzz/Library/Caches/Homebrew/downloads/2083cfa12d866a973b37a64ed53a9f5a52cc4c4d054b26ab09881c503cff53ff--node-11.12.0.high_sierra.bottle.tar.gz
==> Pouring node-11.12.0.high_sierra.bottle.tar.gz
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink lib/dtrace/node.d
Target /usr/local/lib/dtrace/node.d
already exists. You may want to remove it:
  rm '/usr/local/lib/dtrace/node.d'

To force the link and overwrite all conflicting files:
  brew link --overwrite node

To list all files that would be deleted:
  brew link --overwrite --dry-run node

Possible conflicting files are:
/usr/local/lib/dtrace/node.d
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
🍺  /usr/local/Cellar/node/11.12.0: 4,417 files, 50.2MB
$ node -v
-bash: /usr/local/bin/node: No such file or directory
$ sudo rm '/usr/local/lib/dtrace/node.d'
$ brew link node
Linking /usr/local/Cellar/node/11.12.0...
Error: Could not symlink lib/dtrace/node.d
/usr/local/lib/dtrace is not writable.
$ brew link --overwrite node
Linking /usr/local/Cellar/node/11.12.0... 197 symlinks created
$ node -v
v11.12.0
```

/usr/local/lib/dtrace/node.d　を削除して、
brew link --overwrite node　でリンクし直して、最新版のNodeをインストールできました。
Node-RED 0.20の新機能　その３

3/12(日本時間だと3/13)にNode-REDの0.20がリリースされました。

せっかくなので[Node-REDのブログ](https://nodered.org/blog/)に投稿されている[Version 0.20 released](https://nodered.org/blog/2019/03/12/version-0-20-released)の内容を試してみようと思います。

[その１の記事はこちら](https://qiita.com/kazsharp/items/43878eabe57d9d752bdb)
[その２の記事はこちら](https://qiita.com/kazsharp/items/a4e6b55bf6dc2d89b7a6)

##Adding env vars to a Subflow template
サブフローのテンプレートで環境変数が設定できるようになりました。
以前からNode-RED実行環境の環境変数を取得というのはできたのですが、今回、サブフロー内でのみ参照できる環境変数を設定することが可能になりました。
![subflow-env1.png](https://qiita-image-store.s3.amazonaws.com/0/100799/e0ceb2f0-ac8d-2be7-eac9-18c76711f19c.png)
サブフローのテンプレートで「プロパティを編集」をクリックすると編集ダイアログが表示されます。
そのダイアログに ```環境変数```という欄があり、「追加」ボタンをクリックすることで環境変数を設定できます。
上図では ```ENV1``` という環境変数に ```VAL1``` という値を設定しています。
これでこのサブフロー内で ```ENV1``` という環境変数が参照できるようになるはずです。
確認のため下図のようなサブフローを作成してみます。
![subflow-env2.png](https://qiita-image-store.s3.amazonaws.com/0/100799/39da941a-53b5-a2fd-70d6-70f6cdda7d0e.png)
changeノードを置いただけですが、changeノードでは環境変数の ```ENV1``` の値を ```paylod``` にセットするように定義します。
![subflow-env3.png](https://qiita-image-store.s3.amazonaws.com/0/100799/03b0a193-b456-8e54-0cd9-e3694599e947.png)
そしてこのサブフローを使うフローを作成します。
![subflow-env4.png](https://qiita-image-store.s3.amazonaws.com/0/100799/e0bce6c0-b636-3c8c-1d74-3b3d48170d5b.png)
フローを実行すると ```payload``` に環境変数から取得した値 ```VAL1``` が設定されていることがデバッグタブからわかります。
![subflow-env5.png](https://qiita-image-store.s3.amazonaws.com/0/100799/eabd3a70-c093-2ba4-f9ce-3e3e7da9d15c.png)

##サブフロー内の環境変数の特徴
サブフローに定義できる環境変数ですが、いくつかの特徴を持っています。
一つは、実行環境の環境変数が文字列のみ設定可能なのに対してサブフロー内の環境変数は

* string
* number
* boolean
* JSON
* Buffer
* 他の環境変数

を設定することが可能です。
次に、参照しようとした環境変数がサブフローで定義されていない場合は実行環境の環境変数を探しに行くということです。
これは、実行環境の環境変数を上書きすることができるとも言えます。
（あくまでサブフロー内の話で実行環境の環境変数の値は変わりません）
あと最後に、これはサブフロー内に限りませんが環境変数の値が取得できなかった場合、つまりサブフローでも実行環境でも設定されていない環境変数を参照した場合、取得される値は ```""```（空文字）になります。```undefined``` ではないことに注意してください。

以上、サブフローテンプレートでの環境変数の設定でした。
[備忘録] int/long型での各桁の取得

#はじめに
C#でint型の各桁の値を取る時に、今まで$char$配列→$string$→$int$っていうくそだるい変換をしてたんですよね...
でもさすがにめんどくさすぎるなーって思ってて、スタックを使ったらいいかんじにできそうと思ったので書きました。

スタックを使っているのは知っている人には自明だと思いますが先入れ後出しなので。例えば、260だと、0→6→2の順番に入り、2→6→0の順番に出す。


#コード
$int$型の場合

```.cs
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args) {
        int s = int.Parse(Console.ReadLine());
        foreach(int i in digits(s)) {
            Console.WriteLine(i);
        }
    }
    static int[] digits(int n) {
        Stack<int> digit = new Stack<int>();
        while(n > 0) {
            digit.Push(n%10);
            n /= 10;
        }
        return digit.ToArray();
    }
}
```

$long$型の場合

```.cs
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args) {
        long s = long.Parse(Console.ReadLine());
        foreach(int i in digits(s)) {
            Console.WriteLine(i);
        }
    }
    static long[] digits(long n) {
        Stack<long> digit = new Stack<long>();
        while(n > 0) {
            digit.Push(n%10);
            n /= 10;
        }
        return digit.ToArray();
    }
}
```
Web3.js で秘密鍵から Wallet を復元

Web3.js で秘密鍵から Wallet を復元する方法です。

`web3.eth.accounts.wallet.add` を使用します。

# サンプルコード

``` js
const privateKeyString = "YOUR_PRIVATE_KEY"
web3.eth.accounts.wallet.add(privateKeyString)
```

# Ref
- https://web3js.readthedocs.io/en/1.0/web3-eth-accounts.html#wallet-add
Hyper-V上のUbuntuでVSCodeの「行を上/下へコピー」が動作しない話

## Hyper-V上UbuntuでのVSCodeで問題発生

> 前回の記事
> Windows10 ProでHyper-Vを使ってみた
> https://qiita.com/hideki0145/items/844f003b6f6647cab081

前回、Windows10 Pro 1809のHyper-V上にUbuntu 18.04をインストールしました。
このUbuntuに**VSCode**をセットアップして開発作業をしていたところ、普段使用しているキーボードショートカットが動かないじゃないですか…。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/78896/087272e4-cbc4-8803-b15e-bbb0554b11d8.png)

`Alt+Ctrl+Shift+Up/Down`で動作するはずの「**行を上/下へコピー**」が動かないのです。
ショートカット入力すると、どうも仮想マシンからマウスリリースされているっぽいです。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/78896/d3a11e85-87b0-7758-21d5-17645c8282ce.png)

Hyper-Vの設定を確認しましたが、マウスリリースキーは`Ctrl+Alt+Left`となっています。
`Up/Down`は関係ないのになぁと調査を進めると、以下のIssueにたどり着きました。

> CTRL+ALT+UP arrow also releases the mouse and keyboard
> https://github.com/MicrosoftDocs/windowsserverdocs/issues/1328

Hyper-Vのバグで`Ctrl+Alt+Up/Down`がマウスリリースに割り当てられているっぽいですねー。
しばらくはキーボードショートカットをカスタマイズして回避するしかなさそうです。

尚、「Windows10 Pro 1809 OSビルド17763.379」「Hyper-Vマネージャー 10.0.17763.1」で現象を確認しています。
flexboxについて勉強したのでアウトプット


#floatがわからなかったので
floatイマイチぴんと来ません。
ですので色いろ調べてflexboxを知りました。

#flexboxって？
flexboxは要素を横並びにするために使います。縦並びもできます。

めちゃくちゃ簡単に横並びが実現できました。

#使い方
横並びにしたい要素を子要素として、その親要素のcssにdisplay:flex;
とつけるだけ。

#例
```html
 <div class='btns'>
     <div class='btn facebook'>
       <p>Facebookで登録</p>
     </div>
     <div class='btn twitter'>
       <p>Twitterで登録</p>
     </div>
   </div>
```

```css
.btns{
   width:500px;
   margin: 0px auto;
   display:flex;
   justify-content:space-around;
}

.btn{
  height:24px;
  width:150px;
  border-radius:5px;
}

.facebook{
  background-color:#3b5998;
  opacity:0.8;
  padding:8px 24px;
 
}

.twitter{
  background-color:#55acee;
  opacity:0.8;
  padding:8px 24px;
}



```

これで、<img width="960" alt="スクリーンショット 2019-03-16 19.33.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/307982/7bca1e97-c3a4-4f8c-06d5-9d7677384b6f.png">

左上のプレビューが完成品です。ちゃんと横並びになっている！

ちなみに、上のコードでjustify-content:space-around;
と書いてあるのは横並びをどういう風に配置するかを表しています。
今回のは、要素を隙間を開けて並べる設定です。

https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet
にまとまっているので興味のある方はぜひご覧になってください。
twitterでフォローするいい感じの海外エンジニアを探す方法

#はじめに
英語学習も兼ねてtwitterの英語用アカウントを作ってみたものの、ネットの情報やtwitterのレコメンドだけではなんとなく自分がフォローしたい人を探せなくて困ってました。

ネットで検索してみてると、こんな記事が出てきます。

[Who to follow on Twitter if you want to understand tech](https://www.digitaltrends.com/social-media/tech-people-influencers-follow-twitter/)

>- [Elon Musk](https://twitter.com/elonmusk)
- [Bill Gates](https://twitter.com/billgates)
- [Sundar Pichai](https://twitter.com/sundarpichai)
- [Tim Cook](https://twitter.com/sundarpichai)
- [Jeff Bezos](https://twitter.com/jeffbezos)

Tech界隈の大物がズラリと揃ってます。でもなんかこれじゃない感が。他にもパッと思いつくテック界隈の有名人やフレームワークの作成者などフォローしてみました。

Y Combinator創業者
- [Paul Graham](https://twitter.com/paulg)

python作者
- [Guido van Rossum](https://twitter.com/gvanrossum)

Vue.js作者
- [Evan You](https://twitter.com/youyuxi)

でもやっぱりこれじゃない感が。
「いい感じの」もっと普通の海外エンジニアをフォローしたいとずっと思ってました。

#解決策＝dev.to

[dev.to](https://dev.to/)に行きます。

<img width="614" alt="dev_main.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/256640/470cce73-fdb8-312f-9203-48a6a10862cf.jpeg">

話題になっている記事を選んで、

<img width="727" alt="dev_twitter.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/256640/9a47dde0-df7a-712a-208e-4c5cc7ad3bd7.jpeg">

あとはtwitterに飛んで面白そうならフォローするだけです。
dev.toで話題になる記事を書いている人のtwitterは面白いはず！という単純な発想です。

[@EmmaWedekind](https://twitter.com/EmmaWedekind)

>UX Engineer at @LogMeIn 👩🏻‍💻 Founder of @codingcoach_io 💾 Former Software Engineer at IBM 🇩🇪American living in Germany 💍 Wife to @kai_wedekind

上記の記事を書いた人は元々はIBMのソフトウェアエンジニアで現在はUXエンジニアをしているドイツ在住アメリカ人の方でした。旦那さんもエンジニアのようでGraphQLについてツイートしてました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">A couple of weeks ago I said that I want to bring GraphQL to <a href="https://twitter.com/vertx_project?ref_src=twsrc%5Etfw">@vertx_project</a> for JavaScript. Yesterday I published vertx-graphql@1.0.7.<br>🥳<br><br>Feel free to check it out and let me know what you think.<br>Documentation: <a href="https://t.co/tffle4oK9R">https://t.co/tffle4oK9R</a></p>&mdash; Kai Wedekind (@kai_wedekind) <a href="https://twitter.com/kai_wedekind/status/1079295149908340737?ref_src=twsrc%5Etfw">2018年12月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

そこからまたtwitter上でおすすめのエンジニアを辿っていって．．．という感じです。
フォローしたい人はそれぞれだと思いますので、ご参考までに！
Amazon API GatewayにPOSTされたJSONに改行を入れてAmazon Kinesisに送る

## 状況
IoT機器からJSONでPOSTされてくるデータをそのまま1行1レコードでS3に保存したい。
何も考えずに API Gateway => Kinesis Streams => Kinesis Firehose => S3 に流すと1行に複数のレコードが保存されてしまう。

こういうマッピングテンプレートにすると

```
{
    "StreamName": "MyStream",
    "Data": "$util.base64Encode(${input.json('$')})",
    "PartitionKey": "$input.path('$.key')"
}
```

こんなファイルができてしまう。

```
{"key":"hoge"}{"key":"fuga"}{"key":"piyo"}
```

欲しいファイルはこんな感じ。

```
{"key":"hoge"}
{"key":"fuga"}
{"key":"piyo"}
```

`Data` に改行を含めてKinesisに送ってあげる必要がある。

## 解決

文字列に改行をそのまま入れてあげれば良かった。

```
#set($Data = $input.json('$') + "
")
{
    "StreamName": "MyStream",
    "Data": "$util.base64Encode($Data)",
    "PartitionKey": "$input.path('$.key')"
}
```

## ダメだったパターン

エスケープシーケンス `\n` を書いても

```
#set($Data = $input.json('$') + "\n")
{
    "StreamName": "MyStream",
    "Data": "$util.base64Encode($Data)",
    "PartitionKey": "$input.path('$.key')"
}
```

エスケープされてなかった

```
{"key":"hoge"}\n{"key":"fuga"}\n{"key":"piyo"}\n
```

## メモ

API Gatewayのマッピングテンプレートを書く前に読むべきもの

- [VTL(Velocity Template Language) Reference ](http://velocity.apache.org/engine/devel/vtl-reference.html)
- [API Gatewayのマッピングテンプレートリファレンス](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)
C++用printfライク文字列フォーマッタを作ってみた

# はじめに

C++で書式付き文字列を出力する際、`std::cout`を使うと`"`や`<<`が大量に出現して可読性が落ちるし、`using namespace std;`を書くのは嫌なので、`printf`/`sprintf`を使いたい派の人のために、型安全文字列フォーマットライブラリを作ってみました。

`boost::format`の劣化再発明のような気もしますが、ヘッダオンリーのシングルファイルとなっており、依存ライブラリは無く、既存のプラグラムに簡単に組み込めますので許してください。

# 標準の方法

`std::cout`を使った一般的なプログラムは次のようになります。

``` .cpp
#include <iostream>

using namespace std;

int main()
{
	char const *name = "太郎";
	cout << "私は" << name << "です。" << endl;
	return 0;
}
```


一方、`printf`を使うと次のようになります。

``` .cpp
#include <stdio.h>

int main()
{
	char const *name = "太郎";
	printf("私は%sです。\n", name);
	return 0;
}
```

さて、どちらが読みやすいでしょうか？

私は後者の方が一目見て何が出力されるかわかりやすいです。`"`と`<<`がたくさん出てくるのは思考を妨げます。そこで`printf`を使いたいのですが、この関数には安全上の問題があります。

# 危険な罠

``` .cpp
#include <stdio.h>

int main()
{
	std::string name = "太郎";
	printf("私は%sです。\n", name);
	return 0;
}
```

文字列ポインタが必要なところに、`std::string`オブジェクトを渡しています。何が起こるか予想できません。少なくとも期待通りに動作しないことは明らかです。

``` .cpp
#include <stdio.h>

int main()
{
	printf("値は%fです。\n", 123.456);
	return 0;
}
```

これは問題ないプログラムで、実行すると次のように出力されます。

```
値は123.456000です。
```

次に、間違えた引数を渡してみます。

``` .cpp
#include <stdio.h>

int main()
{
	printf("値は%fです。\n", 123);
	return 0;
}
```

これを実行すると、

```
値は0.000000です。
```

もしかすると、これとは異なる結果が表示されることもありえます。`%f`は浮動小数点数を出力するためのものですが、引数は`123`という整数です。実数と整数ではメモリ上の内部表現のサイズが異なるため、期待した結果が得られません。場合によってはプログラムがクラッシュするかもしれません。

次はもっと危険なやつです。

``` .cpp
#include <stdio.h>

int main()
{
	char buf[10];
	sprintf(buf, "Hello, world\n");
	return 0;
}
```

10文字分のメモリに14文字書き込もうとします。これはバッファーオーバーフローです。もしたまたま動いてしまったとしたら運が良かっただけです。良くて異常終了。場合によっては悪意のあるコードを実行されて、情報漏洩を引き起こすなど、セキュリティ上の欠陥になります。

# strformatライブラリ

そこで、読みやすさと書きやすさ、安全性を両立した文字列フォーマッターが欲しいと考えました。

使い方は次のようになります。

``` .cpp
#include "strformat.h"

int main()
{
	char const *name = "太郎";
	strformat("私は%sです。\n").s(name).out();
	return 0;
}
```

`char const *`の代わりに`std::string`を渡しても問題なく動作します。そればかりか、

``` .cpp
	strformat("値は%sです。\n").d(123.456).out();
```

のような、一見間違った引数を与えても動作するようになっています。`%`記号に続く書式文字と、`d()`などの引数関数は、フォーマットする上でのただのヒントに過ぎません。

``` .cpp
	strformat("値は%fです。\n").s("123.456").out();
```

書式文字と引数関数は一致することが推奨ですが、異なっていてもそれなりに表示されます。上記の例では、文字列をパースして浮動小数点数化してから、フォーマットされます。

`operator ()`演算子を実装しているため、大抵の引数は簡略化して書くことができます。

``` .cpp
	strformat("値は%fです。\n")(123.456).out();
```

最後の`.out()`で、`stdout`に出力されます。
代わりに`.err()`とすれば、`stderr`に出力されます。
あと、`.str()`というのもあって、これは`std::string`を返すので、`sprintf`の代わりに使えます。
その他、`write_to()`というのを使えば、ファイルポインタやファイルデスクリプタに直接出力することもできます。

https://github.com/soramimi/strformat
numpyでのリストでのappendの方法まとめ（自分用メモ）

#同じミスをしないための自分用メモ

恥ずかしいくらいのミスをしたけどもう二度と間違えないために記事にして供養します。



```py

aa = np.array([]) 
bb = np.array([]) 

print(aa)
print(bb)

aa[0] =np.append(aa,1)
#IndexError: index 0 is out of bounds for axis 0 with size 0


bb[0] =np.append(bb,1)
#IndexError: index 0 is out of bounds for axis 0 with size 0
```

しょうもないミスすぎて検索にも引っかかりませんでしたが、普通に配列番号入れちゃだめですよね。

```py
aa = np.array([]) 
bb = np.array([]) 

print(aa)
print(bb)

aa =np.append(aa,1)
#(1.)

bb =np.append(bb,1)
#(1.)
```

numpyの配列は返り値が配列なので当然といえば当然ですよね。
listならappendするだけで良いのでわからなくなるんですよね。

余談ですが、配列の末尾に追加するときはlistのほうが速度が早いです。機械学習で大きいデータを扱っていたので苦労してnumpyの配列への要素追加ができたにもかかわらず最後にはlistで実装しました。

オチがついたところでここまで。
【アクチュアリー】年金数理 2018年度をPythonで解く。


> 基本的にウンコードだと思うので、リファクタリングしたコードをコメントに記載いただければ、反映していきたいと思います。
暖かい目でごらんください。

#問題1
##(1)

###コード
```
# 簡単のため、60歳の人口=1とする。
age = 60
l = 1
q_withdrawal = 0.05  #withdrawal
d_death = 0.005 #death


while True:
    print("年齢： %d，人口: %f" % (age,l))
    if l <  0 :
        break
    age = age + 1
    l = (1-q_withdrawal) * l - d_death
```
###結果
```
年齢： 60，人口: 1.000000
年齢： 61，人口: 0.945000
年齢： 62，人口: 0.892750
...
年齢： 106，人口: 0.003915
年齢： 107，人口: -0.001281
```


##(2)
これはどんなコードがいいかな？
###コード
```
# La   : 教科書P196のL'
# Lb   : 教科書P196のL'
# la_20 : 制度Aの20歳時点の加入者数
# lb_20 : 制度Bの20歳時点の加入者数

def q_a(age):
    return 1/(80-age)

def q_b(age):
    return 1/(120-age)

la    = 1
La   = 0
for i in range(20,60):
    La = La + la
    la  = la * (1-q_a(i))

print("制度Aで加入者1の場合の被保険者数: %f" % La)

lb    = 1
Lb   = 0
for i in range(20,60):
    Lb  = Lb + lb
    lb  = lb * (1-q_b(i))

print("制度Bで加入者1の場合の被保険者数: %f" % Lb)

print("La = 2 * Lb より la／lb= %f" % (2*Lb/La))
```
###結果
```
制度Aで加入者1の場合の被保険者数: 27.000000
制度Bで加入者1の場合の被保険者数: 32.200000
La = 2 * Lb より la／lb= 2.385185
```
RailsのN+1対策について

# ActiveRecordのメソッドについて

RailsでN+1対策をする時に使用するメソッド3つ`eager_load`, `preload`, `includes`について使用するケースをメモします。

## `eager_load`

* 引数に指定したassociationを`LEFT OUTER JOIN`で取得してキャッシュします。
* `preload`と違い一度のクエリで値を取得します。

```ruby
$ User.eager_load(:posts)
#=> SELECT `users`.`id` AS t0_r0, `users`.`name` AS t0_r1, `users`.`created_at` AS t0_r2, `users`.`updated_at` AS t0_r3, `posts`.`id` AS t1_r0, `posts`.`user_id` AS t1_r1, `posts`.`created_at` AS t1_r2, `posts`.`updated_at` AS t1_r3 FROM `users` LEFT OUTER JOIN `posts` ON `posts`.`user_id` = `users`.`id`
```

* `where`メソッド等をチェインできます。
* 対象テーブルのデータサイズが大きく`join`のコストが大きい場合にパフォーマンスが悪くなる場合があります。

## `preload`

* 引数に指定したassociationを`LEFT OUTER JOIN`で取得してキャッシュします。
* `eager_load`と違い複数のクエリで値を取得します。

```ruby
$ User.preload(:posts)
#=> SELECT `users`.* FROM `users`
#=> SELECT `posts`.* FROM `posts` WHERE `posts`.`user_id` IN (1, 2, 3, ...)
```

* **`where`メソッド等をチェインできません。**
* 対象テーブルのデータサイズが大きく`join`のコストが大きい場合に有効です。

## `includes`
Activerecordが最終的に生成するクエリに合わせて`eager_load`か`preload`の挙動を行う。

**個人的に、includesを使う事は以下の理由からオススメしません。**
後で自分が見た時や他の人が見た時に`eager_load`か`preload`のどちらを使用したかったのか意図がわからなくなる為です。意図が読み解けたとしても、そこに掛ける時間がもったいないので、コードを書いた時に意図が分かるようにしておいた方が良いと思います。
コードリーディング時よりも、チューニングする時に意図がわからず困る可能性が高いです。

# `eager_load`と`preload`のどちらを使うか

SQLは単純にクエリ発行数を減らせば良い場合とそうでない場合があり、テーブルサイズ、レコード数などの条件によって判断する必要があります。

例えば、データサイズが小さい、レコード数が少ないテーブルを処理する場合はクエリ発行数の少ない`eager_load`が有効な場合が多いと思います。

逆に、データサイズが大きい、レコード数が多いテーブルを`eager_load`で処理しようとした場合に、データがDBのワークメモリに収まりきれずディスク使用が発生し遅くなるという事もありえます。その場合は`preload`の方が有効です。

一方でMySQLを使っている場合は、`preload`で発行されるIN句の中身が多い場合にテーブルフルスキャンが実行される事がある為、スロークエリの温床になる事があります。

# 参考
https://qiita.com/k0kubun/items/80c5a5494f53bb88dc58
https://qiita.com/ostk0069/items/23beb870adf785506be2
https://moneyforward.com/engineers_blog/2019/04/02/activerecord-includes-preload-eagerload/
Chrome 73からInspect Modeのツールチップがより詳しくなった

Google Chromeではインスペクターを開いて、矢印ボックスボタンを押して（もしくは Ctrl+Shift+C / Cmd+Shift+C を押して）、ノードにホバーするとツールチップが表示されます。

このInspect Modeのツールチップが、Chorome 73からより詳しくなったみたいです。

こんな感じ！

![スクリーンショット 2019-03-19 22.45.27.png](https://qiita-image-store.s3.amazonaws.com/0/4125/1ed07ea4-6044-dfca-a781-6d0ca84bb51d.png)

* font size
* font color
* contrast ratio
* box model dimensions

などを表示するとのこと。

公式ドキュメントはこちら！ 

「[What's New In DevTools (Chrome 73)](https://developers.google.com/web/updates/2019/01/devtools)」の「[Detailed tooltips in Inspect Mode](https://developers.google.com/web/updates/2019/01/devtools#inspect)」
Ubuntu 16.04の解像度を変更したいときのメモ

##困ったこと
Ubuntu 16.04の解像度を1980x1080にしたいのに，640×480しか選択肢がない！！:rage:
Nvidiaのドライバは入っていない。

xranderで新しい解像度を追加する方法([例](https://kazuhira-r.hatenablog.com/entry/20180330/1522428151))，も試した！。

##直し方
なぜかは良く分からないが，カーネルのアップデートをしたら解像度が追加された！

```ruby:カーネルのアップデート
$ sudo apt update 
$ sudo apt install linux-generic-hwe-16.04
$ sudo apt update && sudo apt upgrade 
$ reboot
```

で，解像度が追加された！やったあ

###参考
こちら➡http://ponco2diary.hatenablog.com/entry/20170916/1505552489
Vagrant で既存のディレクトリを共有したらファイルが全て消えた？

# 環境

ホストOS -> Windows10
ゲストOS -> Ubuntu16.04

# やったこと

```rails
rails new hello_rails
```
railsの勉強をするため、上記コマンドを打った後、作成されたファイルをWindows上のエディタから触ろうとして、Vagrantfileに下記の１行を追加する。

```Vagrantfile
config.vm.synced_folder "./vagrant/hello_rails", "/home/vagrant/hello_rails", nfs: true
```
Vagrantfileを反映させる。

```
vagrant reload
vagrant ssh
```
すると、なぜか、railsのファイルが全てなくなっていた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/a7b35d35-ee87-41a3-ccfa-16c647dc94bc.png)

# 再度実行！

再度、railsを作成してみる。

```rails
rails new hello_rails
```
Windowsで確認すると、ゲストOS→ホストOSにファイルが反映されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94029/91d5a454-876c-cf46-c729-89279a6cbf99.png)

# 結論

自分としては、ゲストOS→ホストOSにファイルが共有されると期待していたのだが、どうも、ホストOS→ゲストOSにファイルが共有されたため、空のフォルダがそのまま共有されて、ゲストOS側のディレクトリが全てクリアされたと思われる。くれぐれも、Vagrantfileを触ってファイル共有する時は、ゲストOS、ホストOS共に空の状態から共有しましょうという教訓でした。
RubyでSeleniumを用いたWEBスクレイピング(Windows)

##使用資材

* rubyinstaller-2.6.1-1-x64.exe
* IEDriverServer_Win32_3.14.0.zip
* geckodriver-v0.24.0-win64.zip

##Rubyのインストール
https://rubyinstaller.org/downloads/
上記URLの「WITHOUT DEVKIT」より、最新版をダウンロードし、全てデフォルトの設定のままでインストールを行う。（インストール完了後のMSYS2の起動は不要なので、チェックを外す）
インストール後、コマンドプロンプトにてrubyのバージョンが取得できることを確認

```linux-config
>ruby -v
ruby 2.6.1p33 (2019-01-30 revision 66950) [x64-mingw32]
```

##ライブラリのインストール
コマンドプロンプトにて下記を実行

```linux-config
> gem install selenium-webdriver -r
> gem install csv -r
> gem install nokogiri -r
```

社内環境等でProxyの設定が必要な場合は、下記のようなオプションを末尾に追加する。
`-p [Proxyサーバアドレス]:[ポート番号]`

##IEドライバサーバのインストール
FireFoxを使用する場合は、本項目は不要です。
社内ではブラウザがIEしか使用できなかったため、IEのドライバサーバー(32bit)を使用した。

https://www.seleniumhq.org/download/
上記URLの「The Internet Explorer Driver Server」より32bit版のIEドライバサーバを取得し、解凍したファイルを「C:\Ruby26-x64\bin」に配置する。
64bitでは、何かの絡みでSeleniumの動作速度が遅くなるためNG（思い出し次第追記予定）

##geckodriverのインストール
https://github.com/mozilla/geckodriver/releases
上記URLより、「geckodriver-v0.24.0-win64.zip」をインストールし、解凍したファイルを「C:\Ruby26-x64\bin」に配置する。


##サンプルソース
社内サイトへのアクセスに使用したため作成したソースは載せられず。
下記ソースはGoogle起動処理まで。

```ruby
#!/usr/bin/ruby
# encoding: utf-8
require 'rubygems'
require 'nokogiri'
require 'selenium-webdriver'
require 'csv'
require "kconv"

# Driverの定義
driver = Selenium::WebDriver.for :firefox
wait = Selenium::WebDriver::Wait.new(:timeout => 10)

# Google起動
driver.get "https://www.google.co.jp/"
```
pythonでtryの中にifを入れる【selenium】

やりたかったことの最終型を先に書く。
使用ツールはanacondaとspyder。

```python:test.py
def test(huga)
    try:
        # 要素1の取得
        hoge_1 = driver.find_element_by_xpath("//*［@class='hoge class'］").text
        # 要素2の取得
        piyo_1 = driver.find_element_by_xpath("//*［@id='root'］/div/div/span").text
        # 上記パスの値を変えるシステムをクリック
        driver.find_element_by_xpath("//*［@id='root'］/div").click
        # 要素1と同パスの要素を取得
        hoge_2 = driver.find_element_by_xpath("//*［@class='hoge class'］").text
        # 要素2と同パスの要素を取得
        piyo_2 = driver.find_element_by_xpath("//*［@id='root'］/div/div/span").text
        # 要素1変更前と変更後で差異が出たか判定
        if hoge_1 == hoge_2:
            result = "NG(要素1の差異無し)"
        # 要素2変更前と変更後で差異が出たか判定
        elif piyo_1 == piyo_2:
            result = "NG(要素2の差異無し)"
        # 上記二つの判定に掛からなかったらelseへ進む
        else:
            result = "OK(要素1と要素2の変更を確認)"
    # xpath不整合時のエラー(ifに入る前にエラーになったらここ)
    except:
        result = "NG(要素取得失敗)"
    # 結果はどうあれ、resultの値を返す
    return result
```

# やりたいこと
tryの中にifを入れ、二つの要素を見た結果を返す。途中で何かミスったら共通のNGになる処理がしたい。
あと値を変える為のクリックについては至極個人的な処理なもんでたぶん使う人はいないので、基本的に消して頂きたい。
上記のコードは自作の別プログラムの参照(ローカルライブラリのインポート)をしているので、そちらに値を返すためにdefとreturnを使用している。
たぶんfinallyを付けたほうが良いんだろうけど、これでも動くから放置。

## 一つのプログラム内での処理
別のプログラムを参照しない、単体で処理する場合。
一つの要素を比較して出力結果をprintにした。
一応クリックも消してある。

```python:test.py
try:
    # 要素1の取得
    hoge = driver.find_element_by_xpath("//*［@class='hoge class'］").text
    # 要素2の取得
    piyo = driver.find_element_by_xpath("//*［@class='piyo class'］").text
    # 差異の判定
    if hoge == piyo:
        print("NG(差異無し)")
    # 判定に掛からなかったらelseへ進む
    else:
        print("OK(差異有り)")
# xpath不整合時のエラー(ifに入る前にエラーになったらここ)
except:
    print("NG(要素取得失敗)")
```

## 変数の値を出力
別プログラムの参照でreturnを使う時に、変数の値を見たいって場合。
単体ならprint(変数)でいけるけど、この場合どうしたもんかと少し詰まった。
最後のreturnに見たい値の変数を入れて「,」で区切る。つまり最後の行だけしか変わっていない。

```python:test.py
def test(huga)
    try:
        # 要素1の取得
        hoge_1 = driver.find_element_by_xpath("//*［@class='hoge class'］").text
        # 要素2の取得
        piyo_1 = driver.find_element_by_xpath("//*［@id='root'］/div/div/span").text
        # 上記パスの値を変えるシステムをクリック
        driver.find_element_by_xpath("//*［@id='root'］/div").click
        # 要素1と同パスの要素を取得
        hoge_2 = driver.find_element_by_xpath("//*［@class='hoge class'］").text
        # 要素2と同パスの要素を取得
        piyo_2 = driver.find_element_by_xpath("//*［@id='root'］/div/div/span").text
        # 要素1変更前と変更後で差異が出たか判定
        if hoge_1 == hoge_2:
            result = "NG(要素1の差異無し)"
        # 要素2変更前と変更後で差異が出たか判定
        elif piyo_1 == piyo_2:
            result = "NG(要素2の差異無し)"
        # 上記二つの判定に掛からなかったらelseへ進む
        else:
            result = "OK(要素1と要素2の変更を確認)"
    # xpath不整合時のエラー(ifに入る前にエラーになったらここ)
    except:
        result = "NG(要素取得失敗)"
    # 結果はどうあれ、resultの値を返す
    return result,hoge_1,piyo_1,hoge_2,piyo_2
```
Linkingデバイスの電池は実際どの程度持つのか確認した

[オススメ！1600円の無線(BLE)温度センサーをRaspberry Pi3 + node-redで活用する](https://qiita.com/tinoue@github/items/be50b80c7d6bb107a00c) で紹介している、[Linkingデバイス](https://linkingiot.com/devices.html) のBLE(Bluetooth Low Energy)無線温度センサー、果たしてどの程度電池が持つのか確認してみました。

以下、Beebotteで表示した温度・湿度グラフの履歴ですが、右端で電池切れでデータが途切れている状態です（執筆時点は年明けの3/18）。
年末にかけてぐっと寒くなってますね。リビングルームだけ暖房入れててあったかいのもよくわかります。

![tempandhumid.png](https://qiita-image-store.s3.amazonaws.com/0/12960/6c7f5b50-42d0-eff6-7f10-ea507c455587.png)

上のグラフによると、電池が持った期間がだいたい3ヶ月ちょっと。

温度センサーShizuku THAのドキュメントを見ると、

> 電池寿命は、BLE 接続状態で 500 日程度、接続してセンサー情報を取得すると 170 日程度、
> Linking Beacon で利用の場合は電池寿命 100 日程度になります。

とあり、ほぼ100日でドキュメント通りですね。別型番の温度センサーTukeru THも混在してますが、同じ寿命です。
ビーコンの間隔(800ms)をもっと長く設定できたらぐっと寿命のびると思うんですが、変更不可なのが残念です。

ただ、上のグラフに入ってない照度センサー Shizuku Luxは2週間ぐらいで電池が切れます。新品の電池に変えても同じ状況。
会社設置用に別に買ったShizuku Luxは普通に数ヶ月可動しているので、自分で購入した分が初期不良と思われます...
Kotlin文法メモ-クラスの継承-

# はじめに

Kotlin のクラスの継承に関するめも

# クラスの継承とは

オブジェクトが他のオブジェクトの特性（メンバやメソッド）を引き継ぐためのものです。

親クラスのことを**スーパークラス**、子クラスのことを**サブクラス**といいます。

# Kotlin でのクラスの継承

今回、親クラスとして`CarOptions`、子クラスとして`SuperCar`を定義します。

`CarOptions`には、引数としてメーカーを表す`type`、作られた年代を表す`model`を定義します。

`CarOptions`を継承する`SuperCar`には、引数として最大速度である`MaxSpeed`を定義します。

1. 親クラスに`open`をつける

```Kotlin
open class CarOptions(type:String,model:Int){
    var type:String? = type
    var model:Int?= model
}
```

2.子クラスの隣に親クラスの名前を付ける

言葉でうまく説明できないのでコードで説明します。

```Kotlin
//子クラス名:親クラス名にする
class SuperCar:CarOptions{
    //新しく追加するメンバのみでOK
    var MaxSpeed:Double? = null
    //contructorの()の中にすべてのメンバを書く
    //superの()の中に親クラスのコンストラクタにアクセスする
    constructor(type:String,model:Int,MaxSpeed:Double):super(type,model){
        //子クラスで新しく追加したメンバだけ初期化すればOK
        this.MaxSpeed = MaxSpeed
    }
}
```

省略するとこんな感じです

```Kotlin
class SuperCar(type:String,model:Int,MaxSpeed:Double):CarOptions(type,model){
    var MaxSpeed:Double? = MaxSpeed
}
```

親クラスのメソッドに子クラスからは普通にアクセスできます。

```Kotlin
open class CarOptions(type:String,model:Int){
    var type:String? = type
    var model:Int?= model
    fun printType(){
        println(type)
    }
}

class SuperCar(type:String,model:Int,MaxSpeed:Double):CarOptions(type,model){
    var MaxSpeed:Double? = MaxSpeed
}

fun main(){
    var car = SuperCar("Toyota",1999, 200.0)
    car.printType()
}
```

実行結果

```Kotlin
Toyota
```
Regexの結果から、行番号を計算する

# やりたいこと

- 正規表現でマッチした場所の行番号が知りたい

# やり方

下記のようにすればおk。execは、マッチ箇所を全て舐め終わるとnullを返すので便利です。

```js
function getLine(fileContent, matchIndex) {
  let indexCount = 0;
  let lineNumber = 0;
  const lines = fileContent.split('¥n');
  for (const line of lines) {
    lineNumber++;
    indexCount += line.length + 1; // 改行コード分
    if (matchIndex < indexCount) { // マッチした場所が見つかった
      break;
    }
  }
  return lineNumber;
}

const fileContent = ...;
const reg = /.../g;

const matchData = reg.exec(reg);
const lineNumber = getLine(fileContent, matchData.index);
```
Bootstrapとは


#＜まず初めに＞

自分用につまずいた点や、
エラー出た際の解決方法などを記載していきたいと思い
Qiitaのアカウントを作成しました。


なぜBootstrapの記事を書いたかというと、
Railsチュートリアルに出てきた際に
よく分からなかったです。（ちなみに５章です）



#Bootstrapとは、
レスポンシブデザインに対応したツイッター社が開発した
CSSのフレームワークで、
ルールに沿って利用するだけで整ったデザインのページが作成できてしまう神様のようなもの。


Bootstrapでよく使うのは、
・グリッドシステム
・テーブル
・ボタン
・フォーム


それぞれ簡単に説明すると、
・グリットシステム
→スマホやタブレットなどデバイスに応じて構造を変化させることができる仕組み
　　（スマホではここの表示消したいなーだとか、
　　　タブレットでは逆に出現させたいなーとかも実現できる）

・テーブル
→表組みを装飾できる。

・ボタン
→a要素、button要素のclassで使用できるその名の通りボタンの装飾。

・フォーム
→デザインの整ったフォームをつくることができる。
　ちなみに調べていくとあんまり聞きなれないコードとかが沢山でてきて
　placeholderって何？となり（他にもたんまりあるけれど）
　入力欄の中に初めから表示されているグレーの文字のことでした。
　あぁなるほど！いつもユーザーとして見慣れているアレはコレか！と妙に納得しました。



#＜まとめ＞
Bootstrapってすごく便利で誰でも簡単に、
ある程度整ったサイトが作れる神器でした。
Rubyでオブジェクトのクラスを調べる方法

##classメソッド

###レシーバ
任意のオブジェクト
###戻り値
レシーバが所属しているClassクラスのオブジェクト

```ruby

irb(main):001:0> String.class
=> Class
```

##superclassメソッド

###レシーバ
Classクラスのオブジェクト
###戻り値
レシーバが所属しているクラスの親クラスのClassクラスのオブジェクト

```ruby

irb(main):002:0> String.superclass
=> Object
```

##ancestorsメソッド

###レシーバ
Classクラスのオブジェクト
###戻り値
レシーバのクラスの継承しているクラス及びモジュールが全て入った配列

```ruby

irb(main):003:0> String.ancestors
=> [String, Comparable, Object, Kernel, BasicObject]
```
Azure IoT Edge モジュールをLinuxデバイスに展開する

# Azure IoT Edge のクイックスタート

クイック スタート: Linux デバイスへのコードのデプロイ
https://docs.microsoft.com/ja-jp/azure/iot-edge/quickstart-linux

どこかでハマると思いメモしましたが、マイクロソフトのドキュメントとしては珍しく最後までスムーズに試すことが出来てしまいました。

# Azure Cloud Shell の開始

Azure Portal からCloud Shell を実行しサブスクリプションを確認します。
通常は IsDefault が True のサブスクリプションで実行されています。

```bash
az account list --output table
```

show コマンドで確認できます。

```bash
az account show
```

Azure IoT の拡張機能を Cloud Shell インスタンスに追加します。

```bash
az extension add --name azure-cli-iot-ext
```

list コマンドで拡張機能を確認できます。

```bash
az extension list
```


クイック スタートで使用するリソース グループを作成します。

```bash
az group create --name IoTEdgeResources --location westus
```

# Azure IoT Hub のデプロイ

IoT Hub を作成します。
サブスクリプションに無料の IoT Hub が既にある場合は、SKU を S1 に変更します。

```bash
az iot hub create --resource-group IoTEdgeResources --name "hub_name" --sku F1
```

myEdgeDevice という名前のデバイスをハブに作成します。

```bash
az iot hub device-identity create --device-id myEdgeDevice --hub-name "hub_name" --edge-enabled
```

デバイスの接続文字列を取得します。

```bash
az iot hub device-identity show-connection-string --device-id myEdgeDevice --hub-name "hub_name"
```

# IoT Edge デバイス (Azure VM) のデプロイ

## 【初回のみ】プログラムによるデプロイの構成を有効化する

1. Virtual Machine の追加から[プログラムによるデプロイについて]を選択
1. 使用中のサブスクリプションを[有効化] し [保存]

プログラムによるデプロイを有効化していない場合、Cloud Shell から VM をデプロイする際「Azure Error: MarketplacePurchaseEligibilityFailed」エラーが発生します。

## Linux 仮想マシンをデプロイする
create コマンドの出力内容に含まれる publicIpAddress を書き留めておきます。

```bash
az vm create --resource-group IoTEdgeResources --name EdgeVM --image microsoft_iot_edge:iot_edge_vm_ubuntu:ubuntu_1604_edgeruntimeonly:latest --admin-username azureuser --generate-ssh-keys --size Standard_DS1_v2
```

IoT Edge デバイスに接続文字列を設定する

```bash
az vm run-command invoke -g IoTEdgeResources -n EdgeVM --command-id RunShellScript --script '/etc/iotedge/configedge.sh "{device_connection_string}"'
```
# IoT Edge ランタイムの状態を確認する

IoT Edge デバイスに接続する

```bash
ssh azureuser@{publicIpAddress}
```
Edge セキュリティ デーモンがシステム サービスとして実行されていることを確認します

active (running) を確認します。

```bash
sudo systemctl status iotedge
```

デバイスで実行されているモジュールを表示します

```bash
sudo iotedge list
```

# モジュールの展開

1. Azure portal で「Simulated Temperature Sensor」で検索し、Marketplace の結果を開きます。
1. サブスクリプション、IoT Hub名、デバイス名を入力し作成します。
1. IoT Hub のページからモジュールの状態を確認できます。

# データの確認

IoT Edge デバイスで、クラウドからデプロイされたモジュールが実行されていることを確認します。

```bash
sudo iotedge list
```

温度センサー モジュールから送信されているメッセージを確認します。

```bash
sudo iotedge logs SimulatedTemperatureSensor -f
```
Swift Windows OS DockerとVisual Studio CodeとPowerShellで簡単開発環境

# 概要
Windows環境でSwiftをやりたい。
コマンドプロンプトだけでは不便。
## 前提
- Dockerがインストールされている事。
- Swift Docker Official Imagesがpullされている事。
- Visual Studio Codeがインストールされている事。

# 方法
## ファイル環境
- Windows→Docker、Docker→Windowsでやり取りする必要がある。
- Docker側で作成したファイルを永続化する必要がある。

Docker Data Volumeで解決。
Windows OS内のフォルダとDocker内のフォルダを関連付けます。

```shell
docker run -v ${PWD}:/home --rm --privileged -it --name swiftfun2 swift /bin/bash
```

「-v ${PWD}:/home」オプションがData Volumeです。
ホスト側(Windows OS)ディレクトリ:コンテナ側ディレクトリ

## 開発環境
- Visual Studio Code起動
- エクスプローラにData Volumeで指定したフォルダを指定
- ターミナルをPowerShellで起動
- ターミナル(PowerShell)でData Volumeで指定したフォルダに移動
- Docker コンテナ起動

```shell
docker run -v ${PWD}:/home --rm --privileged -it --name swiftfun2 swift /bin/bash
```

<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_04.jpg"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_04-1024x753.jpg" alt="" width="1024" height="753" class="alignnone size-large wp-image-1191" /></a>

Data Volumeで関連付けたディレクトリ内ファイルはお互い即反映されます。
コーディングはVisual Studio Codeで、実行はDockerコンテナ上(ターミナルから)で可能になります。
Visual Studio Code上のみでSwift開発が可能になります。

<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_05.jpg"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_05-1024x753.jpg" alt="" width="1024" height="753" class="alignnone size-large wp-image-1192" /></a>

<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_06.jpg"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_06-1024x753.jpg" alt="" width="1024" height="753" class="alignnone size-large wp-image-1193" /></a>
Rails, CoffeeScript, 任意のページで自動的にページ移動する

# 目的
・任意のページで、数秒後に自動的に任意のURLへジャンプする
よくある
"数秒後に自動的に移動します。自動的に移動しない場合は[こちら](https://www.youtube.com/watch?v=IHYOhDe4FB8)へ"
みたいなやつです。

# とりあえずコード書かにゃ
そのまま書いたら以下の様になると思うんですよ。

```.js.coffee
  redirectToSomewhere = ->
    setTimeout ->
      window.location.href = <リダイレクト先のURL>
    , 5000 # 5秒後に移動
```

# RailsはJSというJSなんでもかんでも実行する
Railsはassets/javascripts/の中にある.jsファイルを全部実行するから
「このページだけで実行」とかできないんですよね、いぁconfigの中で[なんやかんや](https://qiita.com/Hijiri-K/items/1a3f7137cf3186580447)やればできるっぽいことは噂に聞きますが。~~めんどい~~
任意のページに`<script>`埋め込むというやりかたもあるけどできればやりたくない。
※全然関係無いですけどQiitaって`<script>`て書いたらそのままタグとして認識されるんですね
# 特定のIDを持っているリンクがあるときだけ実行する
結果として以下みたいな感じでやりました。

```.html.slim
= link_to '自動的に移動しない場合はこちらをクリック', <リダイレクト先のURL>, id: <特定のID>
```

みたいに書いてjsで

```.js.coffee
  redirectToSomewhere = ->
    url = $("#<特定のID>").attr("href")
    if url
      setTimeout ->
        window.location.href = <リダイレクト先のURL>
      , 5000 # 5秒後に移動
```

て書いた、ページ内に特定のIDをもったaタグがあれば自動的に移動します的な感じです。
欠点として、間違って同じIDをどっか違うところにも使ってしまう感じにすると容赦なく飛ばされる感じの素敵な感じになっています。

もっといい方法だれか教えてください。
GitHubの道② Gitの限界とリポジトリ

GitHubはGitを用いたリポジトリを提供するサービスである。リポジトリとはシステムの開発プロジェクトに関連するデータの一元的な貯蔵庫を意味する。Gitはリポジトリにあるファイルの更新履歴を管理するためのシステムで、バージョン管理システムの一つである。
この記事では、GitHubを本格的に利用する前にバージョン管理システムとリポジトリについて整理する。

#バージョン管理システム
バージョン管理システムは、当初ソフトウェアのソースファイル変更履歴を管理するのを目的に開発された。例えば開発中のソフトウェアが修正によって他の部分に不具合が生じてしまうことが珍しくない。そのとき以前のバージョンに戻すことができると原因究明に役立つ。このようにソースファイルの変更履歴は、ソフトウェアの品質を保つには欠かせない。現在ではバージョン管理システムはソースファイルに限らず様々な用途のファイルを管理するのに使われている。バイナリファイルも対象にできる。Gitの他にはRCSやSVN(Subversion)が有名である。

##Gitの限界
Gitの対象はファイルとディレクトリおよびシンボリックリンクである。それ以外のファイルの属性であるオーナーやグループ、アクセス権は管理しない。データベーススキーマなど、直接ファイルで管理しないものは対象外なので注意が必要である。データベースに関するバージョン管理には、必要に応じて別途にマイグレーションツールを用意する。他にも細かい制限だが空ディレクトリを対象にしない。空ディレクトリにはダミーファイル.gitkeepを設置し維持する。
また、簡単には***更新を完全に取り消せない***点にも注意してほしい。例えば、ある版に誤ってパスワードが混入してしまったら、それを削除した新しい版を作成しても、以前の版は自由に取り出すことができてしまう。新しい版には削除したという記録が残っているのだ。完全に取り消すには特別な操作が必要になる。予めGitを使う場合は、パスワードなど機密性が高いものは環境変数に持つようにするなどの運用上の対策が必要である。これらの対策は追って紹介していきたい。誤ってAWSの認証情報をGitHubでインターネット上に大公開してしまい仮想通貨のマイニングに利用され莫大な金額が請求された記事も見かける。今日、計算能力を現金化するのは容易である。
#リポジトリ
Gitのリポジトリは、貯蔵庫であると同時に作業スペースでもある。この概念は柔軟だが理解しにくい部分もある。簡単に説明する。
##リモート・リポジトリとローカル・リポジトリ
複数ユーザーで共有するリモート・リポジトリと、実際に各々が作業PC上のスペースにあるローカル・リポジトリに分けられる。GitHubが提供しているのは、リモート・リポジトリである。```GitHub＝リモート・リポジトリ```で```作業PC＝ローカル・リポジトリ```と考えてほしい。また、単に```リポジトリ```と呼ぶ場合は、***リモート・リポジトリを指す***場合が多いが、ローカル・リポジトリを指す場合もあるので、文脈で判断する必要がある。
GitHubを使った開発では、GitHubのファイルを主とし作業PCのファイルを従と考えて運用することが多い。複数のリモート・リポジトリを連携させることもできるようだが、著者は使用したことがない。GitHubを使った基本的な作業の流れを以下に示す。

1. GitHubのリモート・リポジトリを作業PCのローカル・リポジトリに複製する。(git clone)
2. 作業PCで作業を行う。(テキストエディタ等)
3. 対象とするファイルが追加された場合には追加する。(git add)
4. 作業PCのローカル・リポジトリに反映させる。(git commit)
5. GitHubに作業変更を反映させる(git push)

修正した内容は、直接GitHubに反映させることはできない。必ず作業PCのローカル・リポジトリに対して反映させることが必要である。リポジトリに反映させることをコミットと呼ぶ。ローカル・リポジトリもバージョン管理されているので、履歴を管理することができる。

##パブリック・リポジトリとプライベート・リポジトリ
GitHubが提供しているリモート・リポジトリは、公開範囲から2種類に分けられる。無制限に公開されるパブリック・リポジトリと限られたメンバー間だけに共有されるプライベート・リポジトリである。無制限に公開されるパブリック・リポジトリは無料で利用できる。扱い易いが、何がどこまで公開されるのかは常に意識する必要がある。

#おわりに
この記事では、GitHubやGitが対象にしている範囲とリポジトリの基本的な概念を紹介した。便利だが巨大なツールではあるので、対象範囲を把握する必要がある。次回は具体的な利用方法について解説していく。
CheckiOでJavaScriptの演習に励む【その１】

#概要
__[CheckiO](https://js.checkio.org/)__というJavaScriptとPythonの練習ができる面白いサイトがあったので、その日に解いた問題を通して学んだことをまとめます。

#本日解いた問題
__[Non-unique Elements](https://js.checkio.org/en/mission/non-unique-elements/)__
![スクリーンショット 2019-03-19 21.37.13.png](https://qiita-image-store.s3.amazonaws.com/0/343290/f45a4b9e-370b-fae0-76f4-3d2d0a902b52.png)

配列の中から、被っていない数字を除いて新たに配列を作る or 被っている数字のみを用いて新たに配列を作るという問題でした。

#学んだこと
__[1. filter](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)__

```javascript
var words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];

const result = words.filter(word => word.length > 6);

console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]
```

>引数として与えられたテスト関数を各配列要素に対して実行し、それに合格したすべての配列要素からなる新しい配列を生成します。

__[2. array.indexOf()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)__

```javascript
var beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];

console.log(beasts.indexOf('bison'));
// expected output: 1

// start from index 2
console.log(beasts.indexOf('bison', 2));
// expected output: 4

console.log(beasts.indexOf('giraffe'));
// expected output: -1
```

>indexOf() メソッドは引数に与えられた内容と同じ内容を持つ配列要素の内、最初のものの添字を返します。存在しない場合は -1 を返します。

__[3. array.lastIndexOf()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf)__

```javascript
var animals = ['Dodo', 'Tiger', 'Penguin', 'Dodo'];

console.log(animals.lastIndexOf('Dodo'));
// expected output: 3

console.log(animals.lastIndexOf('Tiger'));
// expected output: 1
```

>lastIndexOf() メソッドは配列中で与えられた要素が見つけられた最後の添字を返します。もし存在しなければ -1 を返します。配列は fromIndex から逆向きに検索されます。

__[4. array.includes()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)__

```javascript
var array1 = [1, 2, 3];

console.log(array1.includes(2));
// expected output: true

var pets = ['cat', 'dog', 'bat'];

console.log(pets.includes('cat'));
// expected output: true

console.log(pets.includes('at'));
// expected output: false
```
> includes() メソッドは、特定の要素が配列に含まれているかどうかを true または false で返します。 与えられた要素が見つかるかどうかを計算するために、SameValueZero(ゼロの同値)アルゴリズムを使用します。

#感想
久しぶりにJavaScriptを叩いたので忘れていることも多く、非常に良い勉強となりました。特に時間制限もなく、正解した後には他の人の綺麗な解答も見ることができるのでこれからも暇があればこのサイトで色々遊んでみたいと思います！JavaScriptの勉強をしたいと思っている方は是非！！
flask-sqlalchemyでデジタルサイネージを作りたい

# 目的
* DB読み込み結果をflaskで表示
* 2レコード取得する
* 参考サイトのサンプルを改変
* cssは使わない
* android(termux)でテスト
* windowsやraspiとはちがうかも
* 更新機能を追加した

# 構成
```
│  app3svr.py
│  app3db.py ...事前にDB作成する用のpy
├─ templates
│  └─ app3.html
└─ static ...空
```
# 結果
イメージです。
 
### Hello,Alchemy World!
[submit]
+------+
|world |
+------+
|hello |
+------+

# app3svr.py

```python
#svr.py

from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy 

app = Flask(__name__)

# DB設定
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app3.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)


# db.Model を継承して Word クラスを定義
class Word(db.Model):
	__tablename__ = 'words'
	id = db.Column(db.Integer, primary_key=True)
	word = db.Column(db.String(10))

	def __init__(self, id , word):
		self.id = id
		self.word = word


@app.route("/" , methods=["GET", "POST"])
def hello():

	if request.method == "GET":
		# wordsをid降順で取得
		words = Word.query.order_by(Word.id.desc()).all()
	
		# テンプレートにwordsを渡す
		return render_template('app3.html', words=words)

	if request.method == "POST":
		# cell:a1が更新ありかチェック
		row = Word.query.get(1)
		if request.form["cola1"] != row.word :
			row.word = request.form["cola1"]
			db.session.commit() 
		# cell:a2が更新ありかチェック
		row = Word.query.get(2)
		if request.form["cola2"] != row.word :
			row.word = request.form["cola2"]
			db.session.commit() 
		
		# 再表示
		# wordsをid降順で取得
		words = Word.query.order_by(Word.id.desc()).all()
		# テンプレートにwordsを渡す
		return render_template('app3.html', words=words)


if __name__ == '__main__':
	app.run(debug=True)
```

# app3.html

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Hello,Alchemy World!</title>
</head>
<body>
  <div>
    <h1>Hello,Alchemy World! </h1>
    <!-- ul でwordsを表示 -->
    <form method="post" action="/">
    <input type="submit" >
    <table border="1">
    <!-- 配列 words の件数分、li の表示を繰り返す -->
    {% for worddata in words %}
      <tr>
      <td> 
      <input type="text" name="cola{{ worddata.id }}" value="{{ worddata.word }}"> 
      </td>
      </tr>
    {% endfor %}
    </table>
    </form>
  </div>
</body>
</html>
```

# app3db.py

```python
from app3svr import db, Word

# テーブル作成
db.create_all()

# word のリストを作成
word_list = [(1,'hello'),(2,'world')]
words = [Word(d[0],d[1]) for d in word_list]

# 複数行インサート
db.session.add_all(words)
db.session.commit()

```

# 参考
* https://blog.mobming839.net/entry/flask-sqlalchemy-tutorial-02
* https://qiita.com/nagataaaas/items/3116352da186df102d96
【解決】sinatraアプリがherokuで動かなかった

# 事象

ローカルでは問題なく動作するsinatraアプリをherokuにpushするとなぜか落ちてしまう。

- ローカルでは動く
- publicディレクトリ内の静的ファイルにはアクセス可能
- sinatra管理下のURLにアクセスすると404エラー

herokuにpushした時のビルド〜デプロイのログ（```heroku logs --tail``` ）はこんな感じ
（長いので最初の方だけ抜粋）

```
2019-03-19T11:15:21.000000+00:00 app[api]: Build started by user MAILADDRESS
2019-03-19T11:15:30.000269+00:00 heroku[web.1]: Restarting
2019-03-19T11:15:30.003816+00:00 heroku[web.1]: State changed from up to starting
2019-03-19T11:15:29.373219+00:00 app[api]: Deploy ac7efc21 by user MAILADDRESS
2019-03-19T11:15:29.373219+00:00 app[api]: Release v27 created by user MAILADDRESS
2019-03-19T11:15:31.248162+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2019-03-19T11:15:31.276022+00:00 app[web.1]: [2019-03-19 11:15:31] FATAL SignalException: SIGTERM
2019-03-19T11:15:31.276065+00:00 app[web.1]: /app/vendor/ruby-2.5.3/lib/ruby/2.5.0/webrick/server.rb:170:in `select'
2019-03-19T11:15:31.276070+00:00 app[web.1]: /app/vendor/ruby-2.5.3/lib/ruby/2.5.0/webrick/server.rb:170:in `block in start'
```

# 解決

```config.ru``` の指定を変えたら解決。
この2日間の格闘はなんだったんだ。

```ruby:config.ru(抜粋)
- run Sinatra::Application
+ run MyApp # sinatraアプリのクラス名
```

# 原因

まだ調べてないけど解決策がわかったので先ずはシェア。
よく考えたらモジュラースタイルのsinatraアプリをherokuにデプロイするのは初めてかも。
- [Sinatra::Base - ミドルウェア、ライブラリおよびモジュラーアプリ | Sinatra: README (Japanese)](http://sinatrarb.com/intro-ja.html)
あるユーザー企業システムエンジニアの心境

今の僕の心境を記していきたい。
特定を避けることと、誰にでもわかりやすいよう、たとえ話で書いていく。

------

男は釣りが好きだった。海に行くこと、魚を釣ること、魚の種類や性格を覚えること、釣った魚を食べること、とにかく釣りが好きだった。

好きが高じ、釣りの技術や魚の知識はそれなりについた。

ある時、男はとあるグループに入ることになった。聞けばそのグループでは、釣りをすることを生業としており、難しいことはよくわからないが、世のためになっているらしい。

男は持ち前の釣りの知識と技術を総動員して日々を過ごした。重宝されることが嬉しかったし、今までの知識と技術だけでは補えないことがあることも、そのグループの活動を通じて理解することが出来た。

日々の釣果は上々で、普段見る魚に関する知識も頭打ちになることが実感出来るほど、少しだけ万能感を感じることが出来るようになった。

年を重ねるにつれ、自分自身が釣りをすることが少なくなってきたことに、男は気付いた。
グループのために知識を共有し、釣果が悪くなりそうなときには一肌脱ぐこともあったが、全体としては釣りをすることが少なくなった。

グループの活動範囲が広がるにつれ、自分の活動範囲を超えた物事の見方をする必要が出てきたため、男は若人たちからの報告を聞き、指示をし、時には指導し、全体としての釣果を管理するようになった。

男は考えた。「自分で好きに釣りをする時間は作れるが、他の釣り場や他の村ではどうやっているんだ？」
男の知識や技術は長年更新されておらず、だからといって自分が時代遅れだと感じないほどに無自覚ではなかった。

時々耳に入ってくる、新しい釣りの技術、見たこともない魚の種類、たくさんの釣果をあげるための方法論など、興味をそそることは多かった。

男に家族が出来た。待望の男の子で、すくすくと育った。子育てをしているときには自身に余裕はなく、ふと悶々とした気持ちになることはあっても、家族を顧みずに自分のしたいことをする軽挙へは至らなかった。

相変わらず男は釣りから離れていたが、もはや自分が釣りをしなくても家族の明日の飯の心配をせずとも良くなっていた。

もはや、男は、釣りで生計を立てているとは言えなかった。男のやっていることは、伝え、教え、数えているだけだった。

一方で男は気付いていた。
自分の持ち場の海がだんだん汚くなり、魚は減り、グループから抜ける者も増え、逆に入ってくる者も減っていることに。

自分なら釣り道具は綺麗にしておくが、若人はそうではないらしい。聞いたわけではないが、ここに来ると食うには困らないから来ているというだけで、特に釣りが好きというものでもないらしい。自分にとっては少し苛立ちを感じるが、自分だけでは維持できないほどグループ規模は大きいので、彼らを無碍に扱うことも出来なかった。

若人たちの言うように、食うに困ることは恐らくなさそうだ。目に見える環境の変化こそあれ、それが牙を剥いて自分の人生に襲いかかってくるとは今はまだ思えなかった。

日々を追うごとに耳に入る他の地域の様子。 

他のグループは魚の釣り方を大きく改善し、より良い釣果を手にし、さらなる高度な釣り方の研究へ一歩踏み出しているらしい。

他のグループは良い釣り師を良い待遇で迎え入れることで、更なる釣果を得ているらしい。

どうやら今の男の知識も技術も古めかしいようだとハッキリ気付いた時には、自分が若人たちに教えることそれ自体が恥ずべきことのように感じてきた。

仕事を終えれば、家では家族が楽しく過ごしていた。
家族は明日も変わらず安心出来る日々が来るものだと信じている。
それは自分が提供しているものだと言う自覚もあるし、自分のわがままで簡単に壊れてしまうだろうことも容易に想像出来る。

しかし自分は何がしたい？何故このグループに入った？何をすることが楽しかった？何をして嬉しかった？

今のグループを抜けて、家族は変わらぬ安心を得られるのか？
今のグループを抜けて、自分は本当にやりたかったことが出来るようになるのか？
若人たちを教えていくことは年長者の義務であることもまた気付いた今、時代遅れになった自分の知識と技術を更新しながら、昔のように最前線で感謝されるとでも？

繰り返される過去の記憶と未来への不安と環境の変化に対するリスクへの思考。

思考を遮断する家族の笑顔。自己犠牲への陶酔。

そして、ああ…また海が汚れ、魚が減っている…
tmux のアウトプットを適当なエディタで開く

![image](https://thepracticaldev.s3.amazonaws.com/i/q7bros6kcqvxog7r4vc8.gif)

デフォルトでも tmux のアウトプットは `c-b [` で遡ったりできるが、通常のエディタで開きたかった。

幸運にも、 tmux には `capture-pane` というナイスなコマンドがある。

`$HOME/bin/vim-edit-tmux-output`

```bash
#!/bin/bash

file=`mktemp`.sh
tmux capture-pane -pS -32768 > $file
tmux new-window -n:mywindow "vim $file"
```

`chmod +x $HOME/bin/vim-edit-tmux-output`

`$HOME/.tmux.conf`

```bash
setenv -g PATH "$HOME/bin:$PATH"

bind-key C-e run-shell "vim-edit-tmux-output"
```

あとは `C-b C-e` を押せば良い。

嬉しいのは、 tmux は 自動的に Vim が終了した後のペインを消してくれるところだ。
xcodeの実行ファイルのディレクトリ確認

opencvで画像読み込み時につまづいたので
#xcode上での操作
プロジェクトフォルダ内の"Products"フォルダを展開. すると実行ファイルが確認できるのでShow in Finderにて場所の確認.
<img width="424" alt="スクリーンショット 2019-03-19 20.58.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/378118/6c51f883-8b71-9631-eac6-9b0756bc5a63.png">
ファイルの情報を見ると
`/Users/＊ユーザ名＊/Library/Developer/Xcode/DerivedData/*プロジェクト名*/Build/Products/Debug`
となっているので, この場所に画像なり, 動画なり, テキストファイルなり, 読み込みたいファイルを保存すれば, コード内でいちいち絶対パスを記さなくても読み込んでくれる.