OmniAICreator/Qiita-1.07M huggingface dataset:
AWS認定クラウドプラクティショナー　受験記録(2020/1)

# はじめに
先日(2020/1)、AWS認定クラウドプラクティショナーを受験し、何とか合格することができましたので、具体的な勉強方法などについて記録したいと思います。

# AWSにかかるスキル
AWSを使うプロジェクトはこれまでに2つほど経験しているのですが、いずれも開発したシステムのホスト先がAWSというだけであり、AWSを直接触ることはありませんでしたので、実質的な実務経験は無しに等しいです。

#使用した教材
以下の教材を使用しました。

[1.AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー 
](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=aws&qid=1579328446&sr=8-3)

全般的に非常にわかりやすく説明されていて、各章の最後にある問題も、実際の試験と同程度のレベルのものとなっており、説明・問題ともに非常に有用でした。

通勤の電車内で、説明・問題合わせて2周しました。

[2.AWS認定　クラウドプラクティショナー　模擬問題集 Kindle版](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E6%A8%A1%E6%93%AC%E5%95%8F%E9%A1%8C%E9%9B%86-Yoshi-Otobe-ebook/dp/B081D4ZJ5G/ref=sr_1_22?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=aws&qid=1579328446&sr=8-22)

実際の試験と同数の65問×2セットの問題集となっており、こちらも実際の試験と同程度のレベルのものとなり、非常に有用でした。

受験日の前日・当日の午前中に、一通りの問題を解きました。

[3.AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)

こちらはUdemyの動画講義ですが、EC2・VPC・RDS・S3など、AWSの基本的なサービスを使ったプロトタイプ開発に沿った内容となっており、講師の説明も丁寧でわかりやすく、実際に手を動かしてAWSの基本を覚えるのに非常に有用でした。

週末、自宅で受講しました。

以上の教材による学習を1か月程度の期間で行いました。

#試験結果

スコア846で合格でした。

#所感

今後についてはわかりませんが、癖のあるような問題は基本的には出ないようで、上述の教材などを使って一通りの試験範囲の学習と問題をこなせば、十分合格できる試験だと思いました。

Qiitaへの投稿は初めてなので、読みづらいところなどあるかもしれませんが、今後受験予定の皆様のご参考になればと思います。
バックエンドとフロント(Nuxt.js)開発中、手元のスマホで検証する際に同一ネットワーク内のAPIへIPでのアクセスを自動化する

バックエンドとフロントの両方を開発しているときに
手元のスマートフォン等からPCで開発中のバックエンドに接続したいことが多く
ローカルIPの固定されていない環境でenvのbaseURLを毎回変更するのが
面倒だったので自動でbaseURLのlocalhostを
自分のIPに書き換えるようにしたときの手順です

## 1.Nuxtで開発中のサイトをローカルIPで公開する

スマートフォンのブラウザからIPアドレスで
自分のパソコンにアクセスするために
`nuxt.config.js` にserverの項目を追記する
ポートは任意


``` javascript
export default {
  server: {
    port: 8000,
    host: '0.0.0.0'
  },
```

``` bash
   ╭─────────────────────────────────────────────╮
   │                                             │
   │   Nuxt.js v2.11.0                           │
   │   Running in development mode (spa)         │
   │                                             │
   │   Listening on: http://192.168.0.31:8083/   │
   │                                             │
   ╰─────────────────────────────────────────────╯
```

yarn devするとlocalhost:8000ではなくipアドレスで起動することを確認する。

## 2. nodeでipアドレスを取得する際に必要なプラグインを入れる。

``` bash
$ yarn add os -D
```

② corss-envで開発環境毎にファイルを読み込んでいるのでその後でdevelop環境だったとき
IPアドレスに置換する

`nuxt.config.js`

注意：nodeのバージョン10.15.xでは.flat()が使えないので適宜修正するかLTS推奨

``` javascript 
const envSet = require(`./config/env/env.${process.env.NODE_ENV ||
  'development'}.js`)
if (envSet.env === 'development') {
  const os = require('os')
  const infs = os.networkInterfaces()
  const ip = Object.values(infs)
    .flat()
    .filter((i) => !i.internal && i.family === 'IPv4')[0].address
  envSet.apiBaseUrl = envSet.apiBaseUrl.replace('localhost', ip)
  console.log('API URL', envSet.apiBaseUrl)
}

export default {
  mode: 'spa',
  env: envSet,
...
```

再び yarn devして APIの向き先が自分のローカルIPになっていればOK

``` bash
API URL http://192.168.0.31:4000/api/v1/                                                                                                         

   ╭─────────────────────────────────────────────╮
   │                                             │
   │   Nuxt.js v2.11.0                           │
   │   Running in development mode (spa)         │
   │                                             │
   │   Listening on: http://192.168.0.31:8083/   │
   │                                             │
   ╰─────────────────────────────────────────────╯
```

バックエンドのCORSの許可忘れないでね！
ChromebookでWEBサーバーをたてよう

#何の記事？
Chromebookでwebサーバーを立てて、ブラウザからアクセスします。

#使うもの
Chromebook
VS Code
Spring Boot

#普通に立てる
まずはVS CodeからSpring Bootで普通に立ててみます。
VS CodeにSpring Bootを入れるところは省略します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287607/8bab4f7b-2882-b9da-e919-1e12ea69e821.png)

立ち上がりました。
今回は訳があってポート'8081'を使用しています。
それではブラウザからアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287607/96a0627a-46e6-4374-47b8-033ec4ad33dc.png)

だめでした。

#なんで？
ChromeOSでlinuxを使うということは、仮想環境を立てるということです。
なので、ChromeOS側のブラウザからアクセスするときに、localhostではアクセスできません。

なので、ホスト名を変えてアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287607/3acb7a0d-acf9-3aec-d7a6-49028302d0a1.png)

これでChromebookで立てたWEBサーバーにアクセスすることができました。
JSTQB AL（TM）でよく出る問題

#1．概要
JSTQB AL（テストマネージャー）の試験に2度落ちているMomotarouです。
3度目の正直として今年度も受講しますが、2回受けてよく出てきた問題についてまとめたいと思います。
**※途中に出てくるサンプル問題はうろ覚えで書いていますので、どれを選んでも正解です。**

また、ALはほとんどが長文問題（1問の説明文が1～2ページに及ぶ。。。）ですが、さすがに長文は覚えられなかったので、**短文問題のみとなっております。**
（思い出したら、徐々に更新します）

#2．各章でよく出る問題

- 2章

次のうち分析的戦略、対処的戦略の説明として正しいものを選べ。

	①分析的戦略とは、テストベースを分析してカバーするテスト条件を決め、対処的戦略では本来のシステムの動作方法の各モデルを作成する（モデルベースド戦略）
	②分析的戦略とは、テストベースを分析してカバーするテスト条件を決め、対処的戦略では品質標準から汎用的かつ論理的な一連のテスト条件を決める。（方法論的戦略）
	③分析的戦略とは、テストベースを分析してカバーするテスト条件を決め、対処的戦略では規格委員会または他の専門家達が定義した一連のプロセスに従う。（プロセス準拠または規格準拠戦略）
	④分析的戦略とは、テストベースを分析してカバーするテスト条件を決め、対処的戦略では実際のソフトウェアができてからテスト設計、実装を行う

上記のように各種戦略の説明文がちりばめられている中で、正しいものを選べ、という形で2年連続で出題されています。

次の文章から正しいものを選べ。

	①ハザード分析とは、各リスクの根底にあるハザードの識別を試み、
      分析プロセスを上流に拡張する手法である
	②エクスポージャーコストとは、リスクアセスメントプロセスで、
     各品質リスクアイテムに対して、 3つの要因を決定する
	③故障モード影響解析（FMEA）とは、品質リスク、その考えられる原因、および起こりうる
     影響を識別し、重要度、優先度、および検出率を割り当てる方法である
	④品質機能展開（QFD）とは、顧客またはユーザ の要件に対する理解が誤っている、
     または不十分なことから生じる品質リスクに関連する方法である

2年連続で1問は出題されています。

次のうち正しい説明文を選べ。

	①ITILとは、IT グループが自分の所属する組織に価値あるサービスを、確実に提供できるようにするフレームワークのこと
	②PRINCE2とは、北米とヨーロッパで一般的に使用しているプロジェクトマネジメントフレームワークである
	③PMBOKとは、プロジェクトマネジメントの知識体系ガイドのことである
	④PMIとは、プロジェクトマネジメントの手法や用語などの標準の策定、プロジェクトマネジメントに関する資格試験の
     運営などを行っている非営利団体のこと

問題の項目名はあっていますが、説明文がなんか違う気がする。。。

- 3章

（レビュー表が表示され）このレビュー表に抜けている項目は何か。

	①成果物のサイズ（ページ数、コードの行数など） 
	②欠陥を解決するための再作業時間 
	③発見した欠陥の数とそれらの重要度 
	④レビューを実施した時間 


- 5章

次のプロセス改善のうち正しいものを選べ。

	①TMMiとはCMMI を補間するもので、5つの成熟度レベルで構成されている。
	②TPI-Nextとは16のキーエリアで定義されている
	③CTPとは12 のクリティカルテストプロセスに分けられる
	④STEPとは要件ベースのテスト戦略を 適用することで「テストしてからコーディング」という方法を重視している

上記のような問題か、例えば「4つの説明のうちSTEPに該当するものを選べ」といった形で2年間で必ず1～2問ほど出題されます。


- 6章

オープンソースのツールを入れるメリットのうち正しいものを選べ。

	①ユーザが変更または拡張できること
	②テストケースマネジメントから欠陥追跡、さらにはテストケースの自動生成に至る、
     テストプロセスのほとんどすべての局面で利用できるものがある
	③初期購入コストが低い
	④非公式のサポーターがいる

ツールのライフサイクルのうち正しい説明を選べ。

	①調達では、ツールの利用方法をまとめ適切なトレーニングを行う必要がある
	②サポートとメンテナンスでは、ツールのバックアップとリストアを検討する必要がある
	③進化では、改善を検討する必要がある
	④廃棄では、前のツールを別のツールに置き換える作業が発生する

上記のような問題か「4つの中から調達に該当する説明を選べ」という形で出題されます。


- 7章

以下の中からテスト担当者のモチベーションを上げる方法として、正しいものを選べ。

	①達成した仕事に対する評価を正当に行う
	②マネジメント層から認められる
	③プロジェクトチーム内および同僚が敬意を払う 
	④責任と自己裁量を増やす


#3．そのほか出題された問題
###見積もり
テスト計画で〇時間、テスト設計で〇時間～かかったとする。その次のプロジェクトでは、計画に1.2倍ほどかかりそう。。。
といった情報を与えられたうえで、次のプロジェクトにかかる工数を選択する問題です。毎年1問出ていますが2018年は難しく、2019年はすごい簡単だったので出題にむらがありそうです。

■TM過去問
http://jstqb.jp/dl/AL_Exam_Seminar_TM.pdf

###組織の独立性
ものすごーい長い長文が示され、この各チームを独立性の高い順に並び変えると、どれが正しいのか？といった形で1問は出題されます。

###欠陥マネジメント
不具合の運用フロー図が表示され、この図のを正しくするにはどうすればいいか？といった形で2年連続で出題されています。イメージとしては、JSTQBのHPにあるサンプル問題を見るとわかりやすいと思います。

■TMサンプル問題
http://jstqb.jp/dl/JSTQB_Sample_Questions_ALTM_V2012_1_02_J01.pdf
Canary版Chromeでflutter-webのデバッグをする

開発環境をCanaryに集約しているので標準のChromeで起動させず、指定したい。

```bash
CHROME_EXECUTABLE=/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary flutter run -d chrome 
```

環境変数 `CHROME_EXECUTABLE` でバイナリのパスを与えると指定できるらしい(ドキュメントには書いてなさそう)
PromQLでストレージ容量を予測する

[`predict_linear(v range-vector, t scalar)`]
============================================
PromQLでストレージ容量が切れることを予測したい場合は、
[`predict_linear(v range-vector, t scalar)`]を使うのがよいです。
これは現在時から`t`が経過した時点での時系列データ`v`の予測値を、線形回帰で算出する関数です。

`v`に入れられるのはGaugeタイプのみであることに気をつけてください。
Counterタイプのメトリックに対して使いたい場合は、一度`rate()`などでラップしましょう。

具体例
------
24時間後の各`kubelet_volume_stats_available_bytes`の値を直近2時間のデータから予測する例です。

```promql
predict_linear(kubelet_volume_stats_available_bytes[2h], 24*2600)
```

具体的なアラートルールとしては、この式の値が`0`以下になればアラートみたいな感じにすると良い感じかと思います。`kubelet_volume_stats_capacity_bytes`と組み合わせてストレージ最大量に対する割合でアラートルールを書くのも良いでしょう。



参考
----
- https://prometheus.io/docs/prometheus/latest/querying/functions/#predict_linear

[`predict_linear(v range-vector, t scalar)`]: https://prometheus.io/docs/prometheus/latest/querying/functions/#predict_linear
ChromeのデベロッパツールでonfocusのときだけDOMに挿入される要素を確認したい

普段エディタを暗色系のテーマに設定していると
真っ白な背景のWebページに目を焼かれるなどして、

**「必ず、かの 邪智暴虐のデザインを除かなければならぬ」**

と決意することがままある（ない）。
そういうときは [Stylus](https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne?hl=ja) のようなGoogle拡張機能を使って、個人用のCSSを適用すればいい。
カスタマイズ対象のWebページのHTMLをChromeのデベロッパツールで調べて
良い具合になるようにこまごまとCSSを作成する。決意に反して地味な作業を強いられる。

##困ったこと
そんな作業中にちょっとめんどくさい要素に遭遇した。

こんな仕様の検索formがある。
①formにフォーカスが移る：入力候補や検索履歴の**リストが表示される**。
②formからフォーカスが外れる：**リストが非表示にされる**。

このリストのHTML構造を確認したい。
だが、デベロッパツール上の該当要素を展開するためクリックした瞬間、
デベロッパツールにフォーカスが移り（＝formからフォーカスが外れ）、
該当要素がDOMから削除されてしまう…

##解決策
DOMに挿入された直後の要素が折り畳まれてさえいなければ、中身を確認できるので、
デベロッパツールで**「常に全要素を展開して表示する方法」**みたいなのを探したが、見つからなかった。

仕方がないのでjavascriptでDOMの変更を監視して、追加されたリスト部分のHTMLを取得した。
下記の例では単純なセレクタで指定しているが、実際は構造が込み入っていたのでjQueryを使った。

```javascript:example.js
// jQuery読み込み
document.body.appendChild((function(){
    var jq = document.createElement("script");
    jq.src = 'https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js';
    return jq;

// 要素Aに挿入された要素BのHTMLを取得する
$('#A').on('DOMSubtreeModified propertychange', function() {
    console.log($('#B').html());
});
```
とりあえずこれをconsoleで実行すれば、変更部分のHTMLを取得できる。
改行なしの状態なのでエディタにコピーして整形した。

（もっといい方法ありません？）
NPDを取り込まないために

NPDの存在を見分けるのは非常に困難である。

なぜならば、大多数の人間にとってそれは認識すらできないものだからである。

では、どうすれば認識できるようになるか？

こればかりは経験からしか身につけることはできないが、この経験は言葉では表現できないほど残酷なものである。

もしあなたがNPDの存在に気づき警鐘をならそうとも、大多数の人間には気づくことができないため無視される。それどころかあなたが問題源として処罰されるであろう。

それほど危険な存在であるが、排除する事は不可能に近い。こればかりは運としかいいようがない。
Discogsに見るクラブDJ／レコードコレクターがレコードを掘る時のドメインモデル

# はじめに
[Discogs]は音楽に関するデータベース＋マーケットプレイスサイトで、主にクラブDJやレコードコレクターがお目当てのレコードを掘るために構築された。これゆえ、クラブDJやレコードコレクターがレコードを掘る時のメンタルモデルを忠実にデータベースに落とし込んだと言える（創立者はプログラマー兼DJ）。
[Discogs]:https://www.discogs.com/

# ユースケース
ざっと思いつく限り以下のユースケースがあげられる。

- レーベルの発表トラックを軸にレコードを掘る。
- 楽曲の別バージョンを軸に掘る。
- 楽曲に関わっているミュージシャンを軸にレコードを掘る。
- 楽曲に関わるコンピレーションを軸にレコードを掘る。
- アーティストの変名からレコードを掘る。

# クラス図
[Rest API仕様]を元にクラス図として表現したものを示す。

- レコードにReleaseという概念を導入して表現している。また、一番最初に販売されたのをmain release、そこから各レーベルにライセンスされたり、CD等、別フォーマットで販売されたのをvariationsとして管理している。これにより、各音源の微妙な違いを表現している。
- Artistは集団とメンバーに分かれている。おそらく、集団としての活動とメンバーソロとしての活動を補足するためである。
- ArtistとReleaseはRoleを介して紐づいている。これは楽曲制作として関わったのか、リミキサーとして関わったのか、プロデューサーとして関わったのかを補足するためである。
- LabelはEntity Typeを介してReleaseと紐づいている。これはレーベルが著作権管理を行っているのか、販売を行っているのか、制作に関わっているのか明確するためである。また、companyというロール名でプレス会社まで補足できるようにしている。
- Genreの階層化は行ってなく、その下にStlyeという概念を持ち込んで細分化をおこなっている。おそらくジャンルの階層化を行うと混乱するため？
- クラブDJ(=ドメインエキスパート)では当たり前だが、GenreとReleaseは多対一で紐づいている。理由はジャンルはある視点でまとめたものに過ぎないため複数の解釈が存在するからである。
 
[Rest API仕様]:https://www.discogs.com/developers#page:database,header:database-release)

![クラス図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39706/b567fa08-33b6-4e6f-dfc3-e17588136393.png)

# オブジェクト図
前述の説明を基に[Miguel Migs ‎– Take Me To Paradise]をオブジェクト図として表現したものを示す。クラブDJ/レコードコレクターがレコードを掘る時にはこのメンタルモデルを頭に浮かべている。

[Miguel Migs ‎– Take Me To Paradise]:https://www.discogs.com/Miguel-Migs-Take-Me-To-Paradise/release/51

![オブジェクト図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39706/0ef8d581-37ef-116d-49b5-3fbfa154a6d7.png)

# まとめ
- Release/Master Releaseという概念を持ち込んで、別バージョンやCDバージョン、ローカライズ等と上手にまとめ上げている(ここ重要)。
- 全体的に普通の楽曲管理をより詳細化している。
- 音源とレーベル/制作/プレス会社の関連を上手に表現している。

# 参考文献/スライド
[オブジェクト指向方法序説基盤編 - ジェームズ-マーチン] (https://www.amazon.co.jp/dp/4810185923/)
[モデルとプロセスをめぐる冒険 - 橋本 隆成]  (https://www.amazon.co.jp/dp/4798110558/)
[業務別データベース設計のためのデータモデリング入門](https://www.amazon.co.jp/dp/B009QRF3JQ)
[ストリームラインオブジェクトモデリング](https://www.amazon.co.jp/dp/4894715775)
[アナリシスパターン―再利用可能なオブジェクトモデル](https://www.amazon.co.jp/dp/4894716933)
[UMLモデリングレッスン]
(https://www.amazon.co.jp/dp/4822283496)
Oculus Questアプリが画像として表示され、起動が不安定になった時の対策

# 症状
- Oculus Quest上で起動するが、VRアプリがただの画像として表示される、または黒い画像が表示される。
- Oculus TVが落ちたり、繰り返し起動される。


# 対応
1. Build Settings> Build Systemを　internalからGradleに変更。
  (公式ドキュメントによると、internalは非推奨とのこと。https://docs.unity3d.com/ja/current/Manual/android-BuildProcess.html)

2. Android StudioでインストールしたAndroidのバージョンに合わせて、player setting> minimum API levelを変更した。

#### 最低APIレベルをどう変更したか
- Android StudioでAPI level 21-29 インストール済み。
- minimum API level 19から21に変更

3.再度ビルド＆実行

## version
- Unity 2018.4.15f1
- Oculus Integration 12.0
Express で簡単な WebAPI を作成

## 必要なライブラリーのインストール

```bash
sudo npm install -g express
sudo npm install -g cfenv
```

## サーバープログラム

フォルダー構造

```text
$ tree
.
├── app.js
└── routes
    └── index.js
```

```js:app.js
//-------------------------------------------------------------------------
//	app.js
//
//					May/24/2023
//-------------------------------------------------------------------------
const express = require('express')
const routes = require('./routes')
const cfenv = require('cfenv')

var app = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true }));

app.use(express.static(__dirname + '/public'))

var appEnv = cfenv.getAppEnv()

app.post('/post_test',routes.post_test)

app.listen(appEnv.port, '0.0.0.0', function() {
  console.log("server starting on " + appEnv.url)
})

//-------------------------------------------------------------------------
```

```js:routes/index.js
// -----------------------------------------------------------------------
/*
	routes/index.js

						Jan/18/2020
*/
// -----------------------------------------------------------------------
exports.post_test = function(req,res)
{
	var aa = 0
	var bb = 0

	if (req.body.aa) {
		aa = parseInt(req.body.aa,10)
		}

	if (req.body.bb) {
		bb = parseInt(req.body.bb,10)
		}

	var dict_aa = {}
	dict_aa["aa"] = aa
	dict_aa["bb"] = bb
	dict_aa["sum"] = aa + bb
	dict_aa["diff"] = aa - bb

	var str_out = JSON.stringify(dict_aa)

	res.send(str_out)
}

// -----------------------------------------------------------------------
```

## サーバーの起動

```text
$ export NODE_PATH=/usr/lib/node_modules
$ node app.js 
server starting on http://localhost:3000
```

## curl のテストスクリプト

```bash:go_test.sh
#
URL=http://localhost:3000/post_test
#
curl -X POST -d aa="12" -d bb="45" $URL
#
echo
#
curl -X POST -H "Content-Type: application/json" \
	-d '{"aa":"32", "bb":"41"}'  $URL
#
echo
#
curl -X POST -H "Content-Type: application/json" \
	-d@in01.json $URL
#
echo
#
```

```json:in01.json
{"aa":"52", "bb":"84"}
```

実行結果

```text
$ ./go_test.sh 
{"aa":12,"bb":45,"sum":57,"diff":-33}
{"aa":32,"bb":41,"sum":73,"diff":-9}
{"aa":52,"bb":84,"sum":136,"diff":-32}
```

## HTTPie のテストスクリプト

```bash:go_http.sh
URL=http://localhost:3000/post_test
#
http POST $URL aa="12" bb="45"
#
echo
#
echo '{"aa":"32", "bb":"41"}' | http POST $URL
#
echo
#
http POST $URL < in01.json
#
echo
#
```

## 確認したバージョン

```text
$ node --version
v20.2.0

$ npm info express version
4.18.2
```
Expo.ioを使ってスマホアプリ開発環境を整える(React Native)

React Nativeを使ったスマホアプリの開発環境を[Expo.io](https://expo.io)というサービスを用い爆速で整えましょう。

手元のiPhoneがなかったので、本記事の実機検証はAndroid(Pixel4)を用いていますが、シミュレータ/エミュレータを導入すればiOSもAndroidも開発マシン上で検証できます。

## Expo.ioのアカウントを作成する

アカウントを作成しておきましょう。
[Expo.io](https://expo.io)

上記サイトでアカウントを作成します。

ここで登録したユーザーの認証情報は実機検証の際にも用いるので、もしパスワードをブラウザの自動生成で作成した場合は実機と共有するか、覚えておいてください。

作成したら、実機側にExpoアプリをインストールします。

[Android版Expoアプリ](https://play.google.com/store/apps/details?id=host.exp.exponent)
[iOS版Expoアプリ](https://apps.apple.com/app/apple-store/id982107779)

インストールが完了したら、アプリ側でも同じ認証情報でログインしておいてください。

## 開発マシン側の環境を整える

Expoはnpmでインストールするので、最新バージョンかどうかを確認しましょう。

```shell
$ npm -v
$ node -v
```

最新バージョンであれば、expo-cliをグローバルにインストールします

`$ npm i -g expo-cli`

少しだけ時間がかかります。

インストールが終われば、適当なディレクトリでinitします。

```shell
$ expo init MyProject
? Choose a template: (Use arrow keys)
  ----- Managed workflow -----
❯ blank                 a minimal app as clean as an empty canvas
  blank (TypeScript)    same as blank but with TypeScript configuration
  tabs                  several example screens and tabs using react-navigation
  ----- Bare workflow -----
  minimal               bare and minimal, just the essentials to get you started
  minimal (TypeScript)  same as minimal but with TypeScript configuration
```

テンプレートを選べ、と言われるのでアローキーを使ってテンプレートを選択してください。

用途に合わせて選びますが、今回は`blank (TypeScript)`を選択します。

Enterで進めると、必要なパッケージがインストールされますので待ちましょう。

完了すると

```shell
To get started, you can type:

  cd MyProject
  npm start
```

と表示されます。指示通りcdしてstartしましょう。

```shell
$ cd MyProject
$ npm start
```

すぐにブラウザで新しいページが開きます。

一応ターミナル側でもQRが表示されますが、ブラウザに表示されているものと同じものです。

ブラウザ側のQRの上にあるメニューからiOS/Androidのシミュレータ/エミュレータが起動します。入っていなければ開発マシンに追加しろってエラーを吐かれます。

<img width="3005" alt="スクリーンショット 2020-01-18 14.58.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249725/93d69975-2ac0-d39f-86e6-6b4577d66348.png">

<img width="620" alt="スクリーンショット 2020-01-18 14.58.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249725/14eb1e14-9015-135f-117f-359dfcf67368.png">

ここまで来たら、実機側のアプリからScan QR Codeを選び、スキャンします。

![Screenshot_20200118-150311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249725/b080eb20-45b7-d600-35d3-19444cecb461.png)

App.tsxを開いて開発を始めましょう！って表示されるので、開発マシンでApp.tsx(テンプレートでTypeScript選ばなければApp.js)を開き、コードを編集してみます。

```typescript:App.tsx
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';

export default function App() {
  return (
    <View style={styles.container}>
      <Text>Hello!! MyProject!</Text> 
      <Text>Open up App.tsx to start working on your app!</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});
```

編集し、保存すると実機側もリアルタイムで更新されます。ホットリロード機能が最初からついているのです。

![Screenshot_20200118-150707.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249725/a6da2611-bebd-eb77-eadd-c9a268152763.png)

これでReact Nativeを使ってアプリ開発を行う環境が整いました。
初心者による JavaScriptの基礎

#概要
JavaScriptの基本的な書き方や特徴をメモとして箇条書きのように書いていく。なにかあれば順次追加していく

###文のルール
javascriptの文のルールとして、

1. 文の末尾にセミコロンをつけることを推奨している。
2. 大文字/小文字は厳密に区別される。

###文字リテラル
文字リテラルは(')や(")で囲む必要があるが、ふたつ使いたい場合は、

```javascript:sample.js
'He's a doctor!' -> 悪い例
"He's a doctor!" -> よい例
```
ただしエスケープ処理をすれば、大丈夫である。

```javascript:sample.js
'He\'s a doctor' 
```
###テンプレート文字列
テンプレート文字列を利用することで、以下のような文字列表現が可能になる。

1. 文字列への変数の埋め込み
2. 複数行にまたがる文字列

```javascript:sample.js
let name = '斉藤'
let str = `こんにちは${name}さん。今日も天気いいですね！`
console.log(str)
```

###分割代入(配列)
分割代入とは、配列/オブジェクトを分解し、配下の要素/プロパティ値を個々の変数に分解するための構文です。

```javascript:sample.js

//従来のやり方
let data = [1, 2, 3]
let x1 = data[0]
let x2 = data[1]
let x3 = data[2]

//分割代入
let data = [1, 2, 3]
let [x1, x2, x3] = data
```
とてもすっきりしている。

###分割代入(オブジェクト)
オブジェクトのプロパティを変数に分解することもできます。

```javascript:sample.js
let book {
 title: 'javascript',
 price: 270
}

//分割代入
let {price, title, memo='なし'} = book
```
複雑な分解も可能です。


####1. 入れ子となったオブジェクトを分解する
```javascript:sample.js
let book = {
 title: 'javascript',
 price: 270,
 other: {
  author: '斉藤',
  logo: 'logo.jpeg'
 }
}

//分割代入
let {title, price, other: {author}} = book
```
####2. 変数の別名を指定する

```javascript:sample.js
let book {
 title: 'javascript',
 price: 270
}

//分割代入(名前変更)
let {price: value, title: name} = book
```

###ショートカット演算(短絡演算)

```javascript:sample.js
if(x === 1) {console.log("Hello!")}

x === 1 && console.log("Hello!")
```
上の二式は同じ挙動をする。if文を使わなくても簡単に同じことができる。よく使う印象。

###for...of命令
「配列など」を順番に列挙するための一つの手段がfor...of命令だ。
配列などというのは、for...of命令は、Arrayオブジェクトやイテレーターやジェネレーターなども処理できるためである。これらを総称して列挙可能なオブジェクトという。

```javascript:sample.js
for(仮変数 of 列挙可能なオブジェクト){
 //コード
}
```
for...inに対してfor...ofは値を順に列挙するのが特徴だ。
Ruby で C言語の enum っぽく連番定数を作る

この場合の「enumっぽい」というのは、下の C コードのように単に「整数を連番で入れた定数を作りたい」程度の意味です。

```c
enum { // 曜日ごとに順番に 1, 2, 3, .... が割り振られる
    SUNDAY = 1,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
};
```

Ruby では言語としては enum は用意されていないので、通常の方法では下のように１つ１つ定数を定義することになります。

```ruby
module Foo
  SUNDAY    = 1
  MONDAY    = 2
  TUESDAY   = 3
  WEDNESDAY = 4
  THURSDAY  = 5
  FRIDAY    = 6
  SATURDAY  = 7
end
```

曜日くらいならいいんですが、もっと大量の連番を作りたいときはこれでは大変ですね。

そんなわけで、Ruby でできるだけ手軽に enum っぽいことをする方法を考えてみました。

```ruby
module Foo
  %i(
    SUNDAY
    MONDAY
    TUESDAY
    WEDNESDAY
    THURSDAY
    FRIDAY
    SATURDAY
  ).each.with_index(1){ |v, i| const_set(v, i) }
  # ruby2.7 なら { const_set(_1, _2) } でも行けますね
end
```

C の enum と違って途中から値を変更するということはできませんが、比較的手軽に実現できたのではないかと思います。もっとシンプルな方法があればぜひコメントお願いします。
Dockerメモ

公式サイトでアカウント作成

作成完了したらDocker for Macをダウンロードしてインストール


```
### Dockerファイルからイメージを作成
$ docker build . -t {name}

### 新しいコンテナを作成
$ docker create -it -p {PORT}:{PORT} --name {NAME} {IMAGE}

### 新しいコンテナを作成して起動までする
$ docker run -it -p {PORT}:{PORT} --name {NAME} {IMAGE}

### 起動しているコンテナの停止
$ docker stop {container_name}

### 停止しているコンテナを起動
$ docker start {container_name}

### コンテナの削除
$ docker rm {container_name}


### イメージ一覧
$ docker images

### コンテナ一覧
$ docker ps -a


### イメージ削除
$ docker rmi {image_name}
```


DockWikiを動かしてみる

```
$ docker pull bitnami/dokuwiki
```

## CMDとENTRYPOINT
コンテナ内で起動するプロセスの指定方法は2つ
1. docker run コマンドの引数で指定する
2. DockerfileのENTRYPOINT項目に設定する

CMD項目の使われ方
ENTORYPOINTが指定されていない場合
docker runでコマンドが指定されていない場合のデフォルトのコマンドと引数として

ENTORYPOINTが指定されている場合
ENTORYPOINTで指定されたコマンドの引数として
現場でよく使う scikit-learn 予測モデルTIPS集 SVM編

---
### サポートベクトル編
#### ここではscikit-learn 予測モデルを汎化して現場でコピペTIPS集として掲載します。
---
##### 条件
###### １．データ、特徴量
・某エンターテインメント系銘柄の2019年一年分の株価データを使用
・同期間の日経平均インバース・インデックスを使用
・特徴量の最適な組合せか否かバリデーション手法については言及しない
###### ２．モデル
・実装方法を趣旨とし学習不足や過学習、予測値の精度といった評価指標についてパラメータチューニングまで追求しない

---
#### サポートベクトル回帰
１．線形回帰
出来高と株価の相関をみる
・回帰線とSVR境界線の傾きを確認する
・マージン内の分布を確認する
・線形回帰とSVR回帰の平均二乗誤差を確認する

```python
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

npArray = np.loadtxt("stock.csv", delimiter = ",", dtype = "float",skiprows=1)

# 特徴量(出来高)
x = npArray[:,2:3]

# 予測データ（株価）
y = npArray[:, 3:4].ravel()

# 訓練データと評価データに分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)#, random_state=0)

# 特徴量の標準化
sc = StandardScaler()

# 訓練データを変換器で標準化
x_train_std = sc.fit_transform(x_train)
# 訓練データで訓練した変換器でテストデータを標準化
x_test_std = sc.transform(x_test)

# 線形回帰モデルを作成
mod = LinearRegression()
# SVRモデルを作成
mod2 = SVR(kernel='linear', C=10000.0, epsilon=250.0)

# 線形回帰モデル学習
mod.fit(x_train_std, y_train)
# SVR
mod2.fit(x_train_std, y_train)

# 訓練データ（出来高）のプロット
plt.figure(figsize=(8,5))
# 出来高のソート（最小値、最大値間まで0.1刻ndarray作成)
x_ndar = np.arange(x_train_std.min(), x_train_std.max(), 0.1)[:, np.newaxis]

# 出来高の線形回帰予測
y_ndar_prd = mod.predict(x_ndar)
# 出来高のSVR予測
y_ndar_svr = mod2.predict(x_ndar)

## MSE(平均二乗誤差）
mse_train_lin=mod.predict(x_train_std)
mse_test_lin=mod.predict(x_test_std)
mse_train_svr= mod2.predict(x_train_std)
mse_test_svr  = mod2.predict(x_test_std)
# 線形回帰のMSE
print('線形回帰MSE 訓練 = %.1f,テスト = %.1f' % (mean_squared_error(y_train,mse_train_lin),mean_squared_error(y_test, mse_test_lin)))
# SVRのMSE
print('SVRMSE 訓練 = %.1f,テスト =  %.1f' % (mean_squared_error(y_train,mse_train_svr),mean_squared_error(y_test, mse_test_svr)))
```
random_stateを指定せず数回トライするといずれも当然の事ながらSVRのMSEが少ない
１回目
線形回帰のMSE 訓練 = 38153.4 ,テスト = 33161.9
SVRのMSE     訓練 = 52439.9 ,テスト =  56707.7
２回目
線形回帰のMSE 訓練 = 37836.4 ,テスト = 33841.3
SVRのMSE     訓練 = 54044.5 ,テスト =  51083.7
３回目
線形回帰のMSE 訓練 = 37381.3 ,テスト = 35616.6
SVRのMSE     訓練 = 53499.2 ,テスト =  53619.4

以下でこれを散布図にプロットしてみよう

```python
# 出来高と株価の散布図
plt.scatter(x_train_std, y_train, color='blue', label='data')
#　回帰直線
plt.plot(x_ndar, y_ndar_prd, color='green', linestyle='-', label='LinearRegression')
# 境界線
plt.plot(x_ndar, y_ndar_svr ,color='red', linestyle='-', label='SVR')
# マージン線
plt.plot(x_ndar, y_ndar_svr + mod2.epsilon, color='orange', linestyle='-.', label='margin')
plt.plot(x_ndar, y_ndar_svr - mod2.epsilon, color='orange', linestyle='-.')
# ラベル
plt.ylabel('Closing price')
plt.xlabel('Volume')
plt.title('SVR Regression')
# 凡例
plt.legend(loc='lower right')

plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348536/86ef333f-1707-4e32-e03b-5cdcdd28c11d.png)

回帰線の傾きよりSVRの境界線のほうがなだらかとなる
マージンをepsilonを250円でとってみたが出来高に合わせ株価も目立った投げもなく概ね順調に上昇基調で推移しているといって良さそうだ。
awkについてメモ

たまーにawkを使うことがあります。
ただ、数ヶ月にすこしというペースなので使うたびに「あれ？どうやって使うんだっけ」となって
ネットで調べる、ということをやってしまっているので自分がよく使うものを記載。

# これだけ知っとくだけでも結構使える

 * print
 * 変数\$1~\$...
 * 変数NR
 * 変数NF
 * 変数FS
 * 変数FPAT
 * STAR, END

各項目の詳細は以下

# 超基本

以下のようなファイルがあるとします。

```none:sample.txt
No data1 data2 data3
1  101   102   103
2  201   202   203
3  301   302   303
4  401   402   403
```

以下のようにawkスクリプトを用意

```awk:sample.awk
{
  print $1 " " $3
}
```

ターミナルから -f オプションでスクリプトを指定したあとにsample.txtを指定。

```shell-session
$ awk -f sample.awk sample.txt
```

以下のように出力される。

```
No data2
1  102  
2  202  
3  302  
4  402  
```

## 解説

### print

出力

### 変数 $1～$...

一行の各要素が入る。

```none:sample.txt
No data1 data2 data3 <----- $1 = "No", $2 = "data1", $3 = "data2", $4 = "data3" 
1  101   102   103
2  201   202   203
3  301   302   303
4  401   402   403
```

# 各列の合計を出す

以下のようなファイルがあるとします。


```none:sample.txt
No data1 data2 data3
1  101   102   103
2  201   202   203
3  301   302   303
4  401   402   403
```

以下のようにawkスクリプトを用意

```awk:sample.awk
{
    if(NR > 1){
        sum1 += $2;
        sum2 += $3;
        sum3 += $4;
    }
}

END {
    print sum1 " " sum2 " " sum3;
}
```

ターミナルから -f オプションでスクリプトを指定したあとにsample.txtを指定。

```shell-session
$ awk -f sample.awk sample.txt
```

以下のように出力される。

```
1004 1008 1012
```

## 解説

### 変数NR

現在の行数。この例では一行目はタイトルなので無視している。

### END

終了処理。ここでは合計値を出力。

# 行ごとに合計を出したい。

以下のようなファイルがあるとします。

```none:sample.txt
No data1 data2 data3
1  101   102   103    <----- 101 + 102 + 103 を求めたい。
2  201   202   203
3  301   302   303
4  401   402   403
```

以下のようにawkスクリプトを用意

```awk:sample.awk
{
    sum = 0;
    for(i=2; i<=NF; i++) {
        sum += $i;
    }
    print sum;
}
```

ターミナルから -f オプションでスクリプトを指定したあとにsample.txtを指定。

```shell-session
$ awk -f sample.awk sample.txt
```

以下のように出力される。

```
0
306
606
906
1206
```

## 解説

### 変数NF

各行の要素数が入る。

# ファイルの区切りがスペースじゃなくてカンマ

以下のようなファイルがあるとします。

```none:sample.txt
No,data1,data2,data3
1,101,102,103
2,201,202,203
3,301,302,303
4,401,402,403
```

以下のようにawkスクリプトを用意

```awk:sample.awk
BEGIN {
    FS = ",";
}

{
  print $1 " " $3
}
```

ターミナルから -f オプションでスクリプトを指定したあとにsample.txtを指定。

```shell-session
$ awk -f sample.awk sample.txt
```

以下のように出力される。

```
No data2
1 102
2 202
3 302
4 402
```

## 解説

### 変数FS

各要素の区切り位置。デフォルトは空白。

### START

開始処理を書ける。

# ファイルの区切りがスペースじゃなくてカンマ。あと、各要素にカンマが含まれている。

```none:sample.txt
No,data1,data2,data3
1,101,"102,101",103
2,201,202,203
3,301,"302,101",303
4,401,402,403
```

以下のようにawkスクリプトを用意

```awk:sample.awk
BEGIN {
    FPAT = "([^,]+)|(\"[^\"]+\")"
}

{
    print $1 " " $3
}
```

ターミナルから -f オプションでスクリプトを指定したあとにsample.txtを指定。

```shell-session
$ awk -f sample.awk sample.txt
```

以下のように出力される。

```
No data2
1 "102,101"
2 202
3 "302,101"
4 402
```

## 解説

### 変数FPAT

各要素を正規表現で記載できる。
forked-daapd からiPadへ音楽ストリーム再生

# やりたいこと

Raspberry Pi上で動くforked-daapdからiPadへ音楽ストリーム再生したい。

ネットワークは以下のような構成。

```
+--------------+
| Raspberry Pi |    LAN    +--------+   Bluetooth   +---------+
|              |-----------|  iPad  |---------------| Speaker |
|    10.0.0.2  |           +--------+               +---------+
+--------------+
```

# Raspberry Pi

[forked-daapdをインストールする。](https://qiita.com/hro/items/5cc02cae0dda053af7b7) （Web Interfaceが必要）

# iPad

VLCをインストールする。

## VLCの準備

* VLCを開く
* 「ネットワーク」をタップ
* 「ネットワークストリームを開く」を選択
* アドレス欄に「http://10.0.0.2:3689/stream.mp3」を入力

## いざ音楽再生

* Safariを開く
* http://10.0.0.2:3689を開く
* 好きな曲を選んで再生
bash で入力中のコマンドをエディタで編集して実行するショートカットキー

bash でコマンドを入力中に、ちょっと長くなってきたからエディタで編集したいな、となったら以下のショートカットキーを押せばエディタが立ち上がる。

`CTRL-X` + `CTRL-E`

保存終了後、編集した内容でコマンドが実行される。


（bash マニュアル内の記述）

```man
edit-and-execute-command (C-x C-e)
    Invoke an editor on the current command line, and execute the result as shell commands.  Bash attempts to invoke $FCEDIT, $EDITOR, and emacs as the editor, in that order.
```
SeleniumのChromeDriverでChromium版MicrosoftEdgeを動かす

#はじめに
ブラウザ自動テストのデファクトスタンダードである`Selenium`
そして正式リリースされた`Chromium版MicrosoftEdge`
はたして`ChromeDriver`を使ってChromium版MicrosoftEdgeを操作することができるのか？

※動かせた時の感動は省略
<font color='red'>**2021/11/07 Selenium4が正式リリースされたので新たに記事を書きました**</font>
<font color='red'>こちらの記事を参考にしてください：</font>
[【正式版】Selenium4のEdgeDriverでChromium版MicrosoftEdgeを動かす（IEモードもできるよ♪）](https://qiita.com/yk109/items/f16cabb9be7064f49f94)


~~**2020/01/23 色々間違っていたので修正しました**~~
~~<font color='red'>**2020/06/14 色々状況が変わったので新たに記事を書きました**</font>~~
~~<font color='red'>こちらの記事を参考にしてください：</font>~~
~~[Selenium4のEdgeDriverでChromium版MicrosoftEdgeを動かす](https://qiita.com/yk109/items/41bf80a309bf20d5f1e6)~~


<font color='red'>`MsEdge`の`v80`以降で当記事のやり方を採用すると、以下のような例外が発生するようになってしまいました。。</font>
>System.InvalidOperationException: session not created: No matching capabilities found (SessionNotCreated)

#やったこと
##`Chromium版MicrosoftEdge`の取得
[こちら](https://www.microsoft.com/en-us/edge?icid=SMC-IA-4501095)からダウンロード＆インストール

##`msedgedriver.exe`の取得
[こちら](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)からダウンロード
このとき、お手元の `Edge` のバージョンに対応した `driver` を取得する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432322/2a17c2e2-ec3b-0973-8242-b622721afca0.png)

##NuGet
`Selenium`系のモジュール参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432322/6ceb371c-c444-8379-b19d-a632efdcecb3.png)

##ソース
ポイントは3つ

* `ChromeDriver` クラスを使用する
* `ChromeDriverService` で、取得した `msedgedriver.exe` を指定する
* `ChromeOptions.BinaryLocation` で、`msedge.exe` を指定する

```csharp
// モジュールと同階層に driver.exe を配置した場合
var service = ChromeDriverService.CreateDefaultService(".", "msedgedriver.exe");
var options = new ChromeOptions
{
    // MsEdgeがインストールされたパスを指定
    BinaryLocation = @"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
};

// ヘッドレスモードも可能！
//options.AddArgument("--headless");

using (var driver = new ChromeDriver(service, options))
{
    var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 5));

    driver.Navigate().GoToUrl("https://www.google.com");

    var q = driver.FindElementByName("q");
    q.SendKeys("Chromium");
    q.Submit();

    wait.Until(ExpectedConditions.TitleIs("Chromium - Google 検索"));
    ((ITakesScreenshot)driver).GetScreenshot().SaveAsFile($"{DateTime.Now.ToString("yyyyMMddHHmmss")}.png");
}

```
#ヘッドレスにも対応！
オプション指定によるヘッドレスモードにも対応していることを確認しました！

```csharp
options.AddArgument("--headless");
```
画面ショットがこんな感じで取得されます！
![20200123233058.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432322/15a6a2df-95a4-2131-d0cf-6455e6ca886a.png)


#おわりに
+ ~~`BinaryLocation`を直接指定する必要があるので環境ごとに変更する必要が出てくる可能性がある。~~
 - `Selenium4` 以降、`BinaryLocation`
+ ヘッドレスモードがサポートされているのは熱い。
+ ~~`driver` は `NuGet` 配布してほしいなぁ。~~
 - `NuGet` にて `Selenium.WebDriver.MSEdgeDriver` が配布されるようになりました！
PhpStorm パス内検索で 100件以上の検索結果をダイアログ上に表示させる

検索結果が 100件を超える場合、検索ワード入力欄に以下のメッセージが表示され、100件より後の検索結果が表示されない。[^1]

[^1]: パス内検索ダイアログ右下の「検索ウィンドウで開く」クリックでメインウィンドウ上での検索結果確認は可能。

> 100+ matches in N+ files

![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/5bdebde2-c41e-5c9e-d667-2ccd7575b1ca.png)

100件以上の検索結果を表示させたい。

# バージョン
- PhpStorm 2019.1.4

# 手順
1. PhpStorm の「ヘルプ」メニューより「カスタム VM オプションの編集」を選択する。
2. `-Dide.usages.page.size=1000` と追記する。
3. PhpStorm を再起動する。

![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243093/045aa2c7-42c4-6db5-b665-322211130711.png)

# 参考
https://intellij-support.jetbrains.com/hc/en-us/community/posts/360002679840-Find-in-Path-shows-max-100-results
【ハッカソン】RaspberryPi にCDできるツールを作った件について【便利ツール】

# はじめに

最近のwebアプリケーション開発ではCI(Continuous Integration)やCD(Continuous Delivery)が充実していて、リモートリポジトリにpushすれば自動的に本番環境が更新されるので便利ですよね

でも、本番環境がローカル端末だった場合は、CIツールにCDしてもらうわけにもいかず、リモートの変更を毎回pullしなきゃいけないので**面倒くさい**

ましてや[ハッカソンみたいな時間がない中で](https://qiita.com/tiwasa/items/dbd4a6de952467d21d5c) 本番環境がRaspberryPiの場合、RaspberryPiでの開発はどころかコマンドを打つ手間も減らしたい

ということで、RaspberryPiに仕込んでおけばリモートリポジトリが更新されるたびにpullしてくれるCDツール、**CanDyPi** を作りました！

[GitHub](https://github.com/ta9ya/candypi)
[PyPI](https://pypi.org/project/candypi/)

~~これで来年は最優秀賞間違いなし~~

# CanDyPi

`CanDyPi is a Continuous Delivery tool for raspberry Pi.`

![candypi_structure.png.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275279/b9560a18-a7b4-aa17-afa6-9db306d4a562.png)

作りは簡単。GitHubのwebhook機能を使って、RaspberryPiからforwardingしたngrokのエンドポイントにwebhookをひっかけます。CanDyPiがリポジトリ更新のメッセージを受け取ったら、pullコマンドを実行して最新のソースに更新します。

CanDyPiはpythonで書かれていて、サーバに`flask`・git操作に`gitpython`を使っています。

# 使い方

## 事前準備

- python 3系
- ngrok
- git
- GitHubのリポジトリ

## 手順

4ステップで使えます

### 1. ラズパイで、gitのSSH接続

SSH設定にしないと、pullの度にパスワードを入力しなきゃいけないので、ラズパイ操作から解放されません・・・

この辺りの記事が参考になります。
[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)

### 2. ラズパイで、CanDyPiのインストール＆実行

pipでインストールできます。
㊟python3系でインストール＆実行してください

`$ pip install candypi`

実行も簡単！
CDしたいリポジトリのパスを引数に与えてください。
(デフォルトでは、50000ポートで立ち上がります)

`$ candypi /Users/tiwasa/sample_project`

### 3. ラズパイで、ngrokの起動

candypiを起動したポートを指定して、ngrokを起動してください。

`$ ngrok http 50000`

```実行結果
ngrok by                                      (Ctrl+C to quit)

Session Status                online                                            
Account                       XXXXXXXX (Plan: Free)                             
Version                       2.2.8                                             
Region                        United States (us)                                
Web Interface                 http://127.0.0.1:4040                             
Forwarding                    http://XXXXXXXX.ngrok.io -> localhost:50000        
Forwarding                    https://XXXXXXXX.ngrok.io -> localhost:50000 
```

### 4. GitHubで、webHooks設定

CDしたいリポジトリにwebhookを登録します。
GitHubのSettings -> Webhooksで、add webhookのPayload URLに、ngrokの `Forwarding https://XXXXXXXX.ngrok.io -> localhost:50000` 表示されたhttpsのアドレスを入れてadd webhook してください。

（その他の項目はdefaultのままで大丈夫です。）

### 5. 完成

CDしたいリポジトリのmasterブランチに更新が発生すると、ラズパイ内のローカルリポジトリでpullコマンドが走って、最新になります。

# さいごに

年末年始に作ったので、私自身もまだ実践投入していません。なんか手ごろなハッカソンないかな～？

もし使っていて気が付いたことがあったら、GitHubのissueか、このページのコメント欄に書いていただけると回答します。

ちなみに、ラズパイと同じローカルネットワーク上に開発用PCを配置できるんだったら、[vscodeのリモートデベロップ](https://qiita.com/hukatama024e/items/b9be0d7216bd77aeb7f6)のほうが便利だと思います。ま、会場次第で別のLANに配置される可能性もあるから、CanDyPiの存在価値もある

・・・と

・・・思いたい
SQL文とバインドについて

・SQLに変数を組み込むならprepare、execute
・変数がないならSQLはqueryでもいい。基本的にprepareでOK
・パラメータ部分を示す記号「?」のことをプレースホルダと呼び、そこへ実際の値を割り当てることを「バインドする」と呼びます。
・bindValueは文字列以外の型とプレスホルダーの値を渡す（使わなくてもOK）

・prepare:入力を受け取る準備
・プレスホルダー:入力をSQL文に含める
・execute:SQL文の実行

## 疑問符プレスホルダー
```php
$stmt = $pdo->prepare('SELECT * FROM users WHERE city = ? AND gender = ?');
$stmt->execute([$city, $gender]);
```

## 名前付きプレスホルダー
```php
$stmt = $pdo->prepare('SELECT * FROM users WHERE city = :city AND gender = :gender');
$stmt->execute([':city' => $city, ':gender' => $gender]);
```

```:executeの引数に配列を渡す場合（こっちの方が好き）
$stmt = $pdo->prepare('INSERT INTO users (id,title,uptime) VALUES (null,?,?)');
$params = [];
$params[] = $title;
$params[] = $uptime;
$stmt->execute($params);
```
## バインドについて
・エミュレーションがONの時、変数は文字列型になる。PHP5.2以降のデフォルトは true
・文字列で渡したくないなら、bindValueで型指定をする

・配列で渡す場合には
・executeの引数に配列を渡すと、バインドされて、全てが文字列で渡される
・すでにバインドしていても無視されるから、引数でバインドする

## 静的、動的プレスホルダーについて
・PDO::setAttribute(PDO::ATTR_EMULATE_PREPARES, [true または false]);
デフォルト、true
の一文を実行するとき以外実際にどちらのプレスホルダーを使用しているのかを意識する必要はほぼない
・また、動的プレスホルダーを利用する場合でも、進んでエスケープする必要はない
初心者による Array/Map/Setオブジェクト

#Arrayオブジェクト
Arrayオブジェクトは、配列型の値を扱うためのオブジェクトで、配列に対して要素の追加/削除、結合、並べ替えを行うための機能を提供する。配列を生成するには原則、配列リテラルを利用する。

```javascript:sample.js
let array = []
```
のように定義する。

##Arrayオブジェクトの主なメンバー
Arrayオブジェクトで利用できるメンバーは以下のようなものがある。

```javascript
length : 配列のサイズ
isArray(obj) : 指定したオブジェクトが配列にあるか
toString() : 「要素 , 要素 , ...」の形式で文字列に変換
toLocaleString() : 配列を文字列に変換(区切り文字はロケールによって変化)
indexOf(elem[, index]) : 指定した要素に合致した最初の要素のキーを取得(indexは検索開始位置)
lastIndexOf(elem[, index]) : 指定した要素に合致した最後の要素のキーを取得(indexは検索開始位置)
entries() : すべてのキー/値を取得
keys() : すべてのキーを取得
values() : すべての値を取得

concat(ary) : 指定配列を現在の配列に連結
join(del) : 配列内の要素を区切り文字delで連結
slice(start[, end]) : start + 1 ~ end番目の要素の抜出し
splice(start, cnt[, rep[, ...]]) : 配列内の start + 1 ~ start + cnt番目の要素をrep...で置き換える
from(alike, [map[, this]]) : 列挙可能なオブジェクトを配列に変換する
of(e1...) : 可変長引数を配列に変換
copyWithin(target, start[, end]) : start + 1 ~ end番目の要素をtarget + 1番目からの位置にコピー
fill(val, start[, end]) : 配列内のstart + 1 ~ end番目の要素をvalで置き換え

pop() : 配列末尾の要素を取得、削除
push(data1[, data2, ...]) : 配列末尾に要素を追加
shift() : 配列先頭の要素を取得し、削除
unshift(data1[, data2, ...]) : 配列先頭に要素を追加

reverse() : 逆順に並べ替え
sort([fnc]) : 要素を昇順に並べ替え

//コールバック関数を使ったメソッド
forEach(fnc[, that]) : 配列内の要素を関数fncで順に処理
map(fnc[, thst]) : 配列内の要素を関数fncで順に加工
every(fnc[, that]) : 配列内のすべての要素が条件fncに合致するか
some(fnc[, that]) : 配列内のいずれかの要素が条件fncに合致するか
filter(fnc[, that]) : 条件fncで合致した要素だけで配列を生成
find(fnc[, that]) : 関数fncが初めてtrueを返した要素を返す
findIndex(fnc[, that]) : 関数fncが初めてtrueを返した要素のインデックス番号を取得
reduce(fnc[, init]) : 隣同士の要素を左から右へ関数fncで処理して単一の値にする
reduceRight(fnc[, init]) : 隣同士の要素を右から左へ関数fncで処理して単一の値にする
```

かなり多くのメソッドがあるが、どれもC++などにもライブラリで備えてあるものである。違いとしては、Arrayオブジェクトはスタック/キューの区別がないことが挙げられる。コールバック関数を使ったメソッドは使用頻度が高い印象。

#Mapオブジェクト
Mapオブジェクトは、キー/値のセット、いわゆる連想配列を管理するためのオブジェクトです。

```javascript:sample.js
//mapの定義
let m = new Map()

//アクセス
for(let [key, value] of m){
 console.log(key)
 console.log(value)
}
```

##Mapオブジェクトの主なメンバー
Mapオブジェクトで利用できるメンバーは以下のようなものがある。

```javascript:sample.js
size : 要素数
set(key, val) : キー/値valの要素を追加。重複時は上書き。
get(key) : 指定したキーの要素を取得
has(key) : 指定したキーの要素があるのかを判定
delete(key) : 指定したキーの要素を削除
clear() : すべての要素を削除
keys() : すべてのキーを取得
values() : すべての値を取得
entries() : すべてのキー/値を取得
forEach(fnc[, that]) : マップ内の要素を関数fncで順に処理
```

#Setオブジェクト
Setオブジェクトは、重複しない値の集合を管理するためのオブジェクトです。

```javascript:sample.js
//Setの定義
let s = new Set()

//アクセス
for(let val of s){
 console.log(val)
}
```

##Setオブジェクトの主なメンバー
Setオブジェクトで利用できるメンバーは以下のようなものがある。

```javascript:sample.js
size : 要素数
add(val) : 指定した値を追加
has(key) : 指定した値の要素があるのかを判定
delete(key) : 指定した値の要素を削除
clear() : すべての要素を削除
values() : すべての値を取得
entries() : すべてのキー/値を取得
forEach(fnc[, that]) : マップ内の要素を関数fncで順に処理
```

#参考資料
山田祥寛様　「javascript本格入門」
reduxのreducerの部分にimmerを導入してみた


## 動機
reduxで構成されているアプリケーションの中でreducerの部分をもう少しスッキリ書きやすくしたいなーと思ったのがモチベーションでした。

## immerの導入

この記事ではイミュータブルの良さについては言及しません。

https://github.com/immerjs/immer

```
yarn add immer
```

ライブラリのバージョンは以下になります。

```json
"typescript": 3.7.5
"redux": 4.0.5
"react-redux": 7.1.3
"immer": 5.3.2
```


ここでは、簡単なTODOアプリの実装を例に話します。
例えば、ある特定のタスクのタイトルを変更したい場合

### 従来の書き方

```typescript
export const changeTaskTitleReducer = (
  state: TodoAppState,
  { id, title }: Payload
): TodoAppState => ({
  ...state,
  todoList: {
    ...state.todoList,
    byId: {
      ...state.todoList.byId,
      [id]: {
        ...state.todoList.byId[id],
        title: title
      }
    }
  }
})
```

immerを使わない場合には、スプレッド演算子を使うことで新しいオブジェクトを返却します。
かなりネストしますし、stateのデータ構造が深い場合はキツイです。


### immerを使った書き方

```typescript
export const changeTaskTitleReducer = (
  state: TodoAppState,
  { id, title }: Payload
): TodoAppState =>
  produce(state, (draftState: Draft<TodoAppState>) => {
    draftState.todoList.byId[id].title = title
  })
```

スプレッド演算子を使った時の書き方に比べるとかなりスッキリしています。

この`produce`関数の中では、第一引数に`state`と第二引数に`producer`と呼ばれる関数を指定します。
producerの中でimmer側がstateをミュータブルに変換してくれます。そしてこの中でデータ変更をします。
immer側で型定義ファイルを用意していくれているので、別途型定義ファイルをインストールする手間もありません。

## まとめ

このように部分的に手軽に導入することができました。
一度にすべてimmerに置き換えるのではなく、段階的に置き換えていくこともできるのも良いです。

immerのパフォーマンスについては下記に書いてあります。
https://immerjs.github.io/immer/docs/performance

簡単ではありますが以上です。
Q11.フォルダを作成するには？

フォルダを作成する方法を考えていきましょう。

今までは、セルの文字色を変えたり、セルの値を別のセルにコピーしたりとかエクセル内の操作を取り扱ってきましたが、今回はフォルダ作成を行います。

意外と知らない人も多いかも知れませんが、エクセルVBAでフォルダを作成することもできます。
ただ、特段エクセルVBAでフォルダを作成するのみだとあまり意味がないかも知れませんが、
たとえば、出力先をフォルダを作成して、そこにエクセルファイルにある特定のシートや情報などのバックアップを取るようなマクロを作れば、簡単にバックアップすることができますよね。


ただし、今回は単純にフォルダー作成のみを行っていきます。

では、どのようなマクロにするかというと、
サンプル1～サンプル10という10個のフォルダをCドライブ直下に作成することとします。


###■ポイント
フォルダ作成を行うために方法についてですが、以下になります。
Mkdir "パス"
です。
パスに新しいフォルダ名を含んだものにします。

例えば、Cドライブ配下にaaaという名前のフォルダを作成する場合は、
Mkdir "C:\aaa"
となります。

ただし、単純にMkdir "aaa"とすると、
カレントフォルダを作成することができます。

カレントディレクトリはCurDirプロパティに格納されていますので、
例えば、Msgbox CurDirとすることで表示することができます。

フォルダを作成する際の注意点ですが、すでに存在している場合は、
エラーとなりますので、事前に存在確認をするコードを記述しておくといいでしょう。



###■回答
```VB
Sub Q11_Answer()
    Dim ForderPath As String
    Dim ForderName As String
    Dim i As Integer
    ForderPath = "C:\"
    ForderName = ForderPath + "サンプル"
    For i = 1 To 10
        If Dir((ForderName & i), vbDirectory) = "" Then
            MkDir (ForderName & i)
        End If
    Next i
    Shell "explorer" & Chr(32) & ForderPath, vbNormalFocus
End Sub
```

###■解説
Forループ内にフォルダを作成する処理を記述することによって、
サンプル1～サンプル10のフォルダを作成しております。

Forループ内にあるIf Dir((ForderName & i), vbDirectory) = "" Thenで、
フォルダを作成する前に、作成しようとするフォルダがすでに存在するか調べることができます。
もし、存在していた場合は、フォルダ名が取得されますので、条件に合致しない為、フォルダの作成は行われません。

最後にあるShell "explorer" & Chr(32) & ForderPath, vbNormalFocusは、
今回作成したフォルダがあるフォルダを開く為に記述しています。
こうすることで、いちいちエクスプローラから開く手間を省くことができます。

最後に実行結果はこちらです。ちゃんとフォルダが作成されていることが確認できます。


![Q11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560479/ff9920cf-34a9-f3f4-188e-de0b695cf7c8.png)
WordPressでjQueryを使ってAjax

いつも忘れるので自分の備忘録として。各引数は適宜変更すること。

#jsファイルの読み込み

```functions.php
wp_register_script( 
    'sample-js', 
    plugins_url( 'js/sample.js', __FILE__ ), 
    array('jquery'), 
    null, 
    true 
);  
wp_enqueue_script('sample-js'); 

$config_array = array( 
    'ajaxURL' => admin_url('admin-ajax.php'), 
    'ajaxActions' => 'sample_response', 
    'ajaxNonce' => wp_create_nonce('sample-nonce'), 
); 
wp_localize_script('sample-js', 'ajaxConf', $config_array); 
```

#読み込むjsファイル
```sample.js
$.ajax({
    type: 'POST',
    url: ajaxConf.ajaxURL,
    data: {
        'action': ajaxConf.ajaxActions,
        'nonce': ajaxConf.ajaxNonce,
        'dataType': 'json',
        'name': 'hoge',
        'age': 27
    } 
}) 
.then( 
// 成功時
function (data) { 
    console.log(data); 
}, 
// 失敗時 
function (data, textStatus, jqXHR) {
    console.log(data);
    console.log(textStatus);
    console.log(jqXHR);
}); 
```

#レスポンスの処理
```functions.php
add_action( 'wp_ajax_ sample_response', 'sample_response' ); 
add_action( 'wp_ajax_nopriv_sample_response', 'sample_response' ); 

function  sample_response() { 
    $nonce = $_POST['nonce']; 
    if(!wp_verify_nonce($nonce, 'sample-nonce') ) die('Unauthorized request!'); 
    echo json_encode($_POST); 
    die(); 
} 
```

#動かない場合

- JSONがおかしくないか
- admin-ajax.phpのIP制限確認
医療従事者のための機械学習・ディープラーニング~学習方法②医用画像情報学会主催深層学習実践セミナー~


医療従事者の方が、機械学習・ディープラーニングを学習する２回目です。

コニカミノルタ科学技術振興財団支援による医用画像情報学会主催深層学習実践セミナー
http://mii-sci.jp/handson/

年に2回、春と秋に実施されています。
私も2018年に参加させていただきました。

岐阜大学の藤田名誉教授、岐阜大学の原先生等が１日を使って、
人工知能の概要、ディープラーニングの基礎から、モデル作成、画像分類などを
しっかりと教えてくださいます。

ただし前日までに、Anacondaのセットアップは必須です。
私は、超初心者でしたのでセットアップにほぼ徹夜でした・・・。

対象は、医用画像情報会員を対象にされていますが，非会員でも受け付けて頂けます。
また当日、医用画像情報学会へ入会すれば、会員料金で受講できます。

昨年は、東京でも行われたみたいで非常に人気なセミナーだと思います。
本当に内容が濃くて格安です。

本セミナーの内容を含んだ本が昨年出版されてました。

岐阜大学の藤田名誉教授は、昨年以下の本を出版されておられます。

①医療AIとディープラーニングシリーズ 標準 医用画像のためのディープラーニング: 入門編 (日本語)
https://www.ohmsha.co.jp/book/9784274223648/

②医療AIとディープラーニングシリーズ 標準 医用画像のためのディープラーニング: 実践編 (日本語)
https://www.ohmsha.co.jp/book/9784274223631/

③医療AIとディープラーニングシリーズ 医用画像ディープラーニング入門 (日本語) 
https://www.ohmsha.co.jp/book/9784274223655/

現在、私のバイブルとなっております。
本セミナーに参加される方は、医用画像情報学会に入会されるのがベストです。

医用画像情報学会
http://mii-sci.sakura.ne.jp/wps/
IntuneのプライマリユーザーをPowerShellで変更する

Intuneを運用しているのですが、2020年1月現在GUI上でプライマリユーザーを変更することができません。
これとても困るのです・・・
登録はキッティング時に情シスで対応しているため、情シスメンバーアカウントがプライマリユーザーになってしまい、
端末を誰が利用しているのかが一目でわかりません（台帳では別に管理はしていますが）

AADやIntuneのこの部分です。
![2020-01-18_13h39_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48100/e61cd27e-d58d-eb33-eb1f-ccbb16a58d31.png)
![2020-01-18_13h41_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48100/6afd506a-4e01-2d0b-68b7-b90a51824a2b.png)

PowerShellで変更するには下記のコードを実行します。
実行には、AzureADモジュールが必要です。

```PowerShell
install-module azuread
import-module azuread
```

2020/03/04追記
-Allがない場合取得件数が１００件までとなり、
１００件以上あった場合エラーとなるため修正

```PowerShell
$deviceName = 'PC名'   # configure device name
$newOwner = 'UPN' # login name of the new user
Connect-AzureAD
$device = Get-AzureADDevice -All $true| where { $_.DisplayName -eq $deviceName }
$aduser = Get-AzureADUser -All $true| where { $_.UserPrincipalName -eq $newOwner }
$oldowner = (Get-AzureADDeviceRegisteredOwner -ObjectId $device.ObjectId).ObjectId
"Change owner of device " + $device.DisplayName + " to " + $aduser.DisplayName
Add-AzureADDeviceRegisteredOwner -ObjectId $device.ObjectId -RefObjectId $aduser.ObjectId # add the new owner
Remove-AzureADDeviceRegisteredOwner -ObjectId $device.ObjectId -OwnerId $oldowner         # remove the previous owner
Get-AzureADDeviceRegisteredOwner -ObjectId $device.ObjectId    
```

このコードを実行すると認証が求められるので、変更権限をもつユーザでログインします。
実行後しばらく待つと、デバイスの所有者情報が変更されます。

ちょっと面倒ですが、登録後に貸与ユーザーを指定して変更しています。
カメラとRaspberry Pi(Jetson)と機械学習を利用したスマート介護カメラ　アイディア　要件定義

##カメラとRaspberry Pi(Jetson)と機械学習を利用したスマート介護カメラ　アイディア　要件定義
カメラとRaspberry Piと機械学習の組み合わせで、思いついたアイディア
####スマート介護カメラ使用例
#####準備
　介護者、関係者、ヘルパーの顔を登録しておく
　トイレ　風呂場　玄関　食器に定義用バーコードを貼る　
　玄関にスピーカーとマイクを設置しておく
#####体調管理　データに記憶する
　具合悪そう　顔の表情で判断　機械学習とラズベリーが判断　メールする
　寝ている時間をカメラ画像と機械学習で判断する　記憶する
　便を機械学習で判断。便が正常化判断する　記憶する
　食べ物を残した　カメラ画像から判断　食器をバーコードを張って識別
　食事をちゃんと食べたか記憶　食器が空かどうかで判断する
　食べ物以外を口に運んでしまった　カメラ画像から画像で判断　緊急メールする
　サーモセンサーで火元を管理する　緊急メールする
#####行動
　人がいるかどうかを人感センサで検知　いたらカメラ画像で解析開始
　転倒したかどうか判断　カメラ画像から転倒しているか機械学習　してたら緊急メールを送る
　部屋の中を徘徊している　玄関から外に出て行きそう　ドアをロックする
　入浴してから出てこない　緊急メール　風呂場の前にバーコードを貼る　時間をチェックする
　トイレから出てこない　緊急メール　トイレの前にバーコードを貼る　時間をチェックする
#####トイレ
　漏らしているかどうか　臭気センサTP-401Aをベットに仕込んでおく　におったらおむつを替える
#####安全
　部屋に人がいるかどうか　人感センサで判断
　知らない人（登録顔以外）と玄関で会話している　押し売りかもしれない　緊急メールを送る　玄関にスピーカーとマイクを置き代わりに話す。
　格好で判断する。スーツ姿　サラリーマン　押し売りと判断
　徘徊しそうで外でに出そう。ドアをオートロック　注意をRaspberryが発する
　強い音がした検知　緊急メール　
　焦げ臭い匂いがした　緊急メール
　悲鳴が聞こえた　音声で認識　緊急メール
#####コミュニケーション
　話がしたい。人工知能に会話させる　　AquesTalk PI
#####特徴
　Raspberry Piが中心　（中央サーバーに画像は送信しない）
　中央サーバーに画像を送信しない。パケが超えてしまう　プライバシーの問題
　アップデート、パターンデータのみダウンロードする
　画像解析はRaspberry内のローカル機械学習でやる
　ネット環境のない場所で運用することが前提　
　Raspberry Piが体調管理データを管理する
　Raspberry Piがメールの送信、緊急メールをやる
　Raspberry PiにローカルWebサーバーを搭載　日報の作成や設定画面に使用する
　超広角カメラモジュールで幅広い管理が可能
　360度カメラ　広角モジュールで幅広く介護
　秘密の言葉を発するとRaspberry Piが音声認識し警察に通報してくれる
#####オプション
　クラウドストレージ(OneDrive Appleストレージ DropBox)は非同期に
　データーをアップロードできる
　パターンデータを管理会社からダウンロードできる
　アップデートで機能追加
#####Raspberry Pi
　人感センサー　HC-SR501
　臭気センサー　TGS2450
　温度センサー　DHT11 温湿度センサー
　音声認識　Julius
　しゃべらせる　AquesTalk Pi（ゆっくりのやつ）
　バーコードリーダー
　スピーカー
　超広角カメラモジュール(VR220)で360度にも対応
　サーモグラフィ機能　赤外線で夜の画像に対応
　サーモセンサーモジュール　火を検知する
　設定画面をタッチパネルとキーボードで操作できる
　Webサーバー　日報作成し閲覧用　管理画面用
　SDカードを使用できる
　HDD差し替えられる　容量の増量に対応
#####専用アプリ　
　詳細設定する画面
　緊急メールを受信
　Raspberry Piが一週間の日報を作成しアプリで閲覧できる(ローカルWebサーバー)
#####カメラ　
　超広角カメラ
　隠しカメラ型
　ミニカメラ型
　赤外線カメラ
　サーモカメラ
####その他
　[スマート防犯カメラ](https://qiita.com/raspberryPiLove/items/44ded568020498d988d4)
　[スマート介護カメラ](https://qiita.com/raspberryPiLove/items/9f70c96383e7ccdfcc62)
　[スマート畑盗難防止カメラ]
(https://qiita.com/raspberryPiLove/items/24e81cebde33eb8c8366)

　スマート育児カメラ
　スマート園児カメラ
　スマート小学生カメラ
　スマート病院用カメラ
　スマート害獣カメラ
　スマートペットカメラ
　スマート酪農カメラ
　スマート牧場カメラ
　スマート田んぼ畑監視カメラ
　スマートお留守番カメラ