OmniAICreator/Qiita-1.07M huggingface dataset:
5分でMacにDockerをインストールしてElasticsearchを起動する

巷で話題の[2018年の最先端バックエンドエンジニアに必要なスキルについて考えてみました。](https://qiita.com/poly_soft/items/fb649573c19b7a5c0227)という記事に  
>現在業務でまだDockerを使用したことがないという方は強烈な危機感を持った方が良いと思います
  
と書かれていたので急いでDockerの勉強を開始しました。

Hello Worldにちょっと毛の生えたことをしてみたく。

## 前提
- macOSであること
- homebrewがインストール済であること
- 9200ポートが未使用であること

## Dockerアプリをインストール
```
$ brew cask install docker
```

## Dockerアプリを起動
```
$ open /Applications/Docker.app
```

## ElasticsearchのDockerイメージをpull
```
$ docker pull elasticsearch
```

## Elasticsearchのコンテナを作成
```
$ docker run -p 9200:9200 -p 9300:9300 elasticsearch
```

## 動作確認
```
$ curl http://localhost:9200
{
  "name" : "hoge",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "hogehoge",
  "version" : {
    "number" : "5.6.9",
    "build_hash" : "hoge",
    "build_date" : "2018-04-12T16:25:14.838Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
  },
  "tagline" : "You Know, for Search"
}
```

これだけでは何も意味ないので、
参考にさせていただいた記事に書かれている下記要素を今後抑えていきます。。。


- Dockerfileを書いて
- docker buildコマンドでDockerイメージをビルドして
- そのイメージを何らかのリポジトリ(DockerHub等)にdocker pushして
- そのイメージを何らかのVM上にdocker pullして (済？)
- そのイメージをdocker runしてコンテナを実行して (済？)
- そのコンテナの特定のポートに外部からアクセスする (済？)
sshでMacに入って遠隔にROOTを使うための設定

#背景

メインのPCがiMacからMac miniに変わったところ、あまりの処理能力の低さにブチギレました。
研究室にはMac Proがあるため、計算力がほしい解析はそちらで行い、Mac miniはsshとYouTube専用とすることにしました。
sshに-Yオプションをつけることで、X11を持ちいてローカル側の画面にヒストグラムなどを描画することができます。これならばネットワークの帯域を食う画面共有を行う必要がありません。

ところがsshで入ってROOTからヒストグラムを描画させても、リモート側(Mac Pro)の画面に描画されてしまい、ローカルで見れません。
以下はその解決までの手順です。

#環境
ローカル側
Mac mini(late 2014)
Mac OSX High Sierra 10.13.4

リモート側
Mac Pro(late 2013)
Mac OSX High Sierra 10.13.4

#原因と対策
- sshでうまくX11トンネリングができていない
  リモート側の/etc/ssh/sshd_configのX11Forwading, X11DisplayOffset, X11UseLocalのコメントアウトをはずして値を設定する。
  ローカル側の/etc/ssh/ssh_configのxauthのパスを確認する。

- brewで入れたリモート側のROOTはX11に対応していない
  ソースをダウンロードしてきてビルドし直す。
  cmakeのオプションで-Dcocoa=OFF -Dx11=ONを設定する。

#結末
オプションをつけてビルドしたところ、無事にssh経由で描画できるようになった。

#追記
vscodeもリモートで使えるようにした。
http://carrinova.com/vscode_xserver_remote_edit/

#参考
X11のトンネリング
https://stackoverflow.com/questions/39622173/cant-run-ssh-x-on-macos-sierra

ROOTのビルド
https://root.cern.ch/building-root
関数の多重処理を初めて使ってみました。

Pythonを使用するのであればせっかくなので並列処理したい。
1つの関数を複数多重起動したい。と思い、やってみました。
流行は`asyncio`なのかもしれませんが、
いまいちよくわかりませんでした…。


単処理と多重処理を2つ載せてみます。

1.シーケンシャル（単処理）

リスト化したオブジェを一個づつ取り出して、
forでループするだけなので、自分がよく使う手です。

`sec.py`

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

from time import sleep

targets = ['target1', 'target2', 'target3', 'target4', 'target5', 'target6', 'target7', 'target8', 'target9', 'target10', ]

def sequential_call(targets):
    print("targets: ", targets)
    for hostname in targets:
         res = func(hostname)
    return "sequential func call end."


def func(target):
    print("start func :" ,target)
    """ 必要な処理を書いてください """
    sleep(2)
    print("end func :" ,target)


if __name__ == '__main__':
    sequential_call(targets)
```


2.パラレル（同時処理）
Forでループする前に、エグゼキュータを定義してます。
`concurrent.futures.ProcessPoolExecutor(max_workers=5)`

```
$ cat para.py
# -*- coding: utf-8 -*-

from time import sleep

import concurrent.futures

targets = ['target1', 'target2', 'target3', 'target4', 'target5', 'target6', 'target7', 'target8', 'target9', 'target10', ]


def parallel_call(targets):
    with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
        for result in executor.map(func, targets):
            print(result)
    print("parallel func call end.")
    return


def func(target):
    print("start func :" ,target)
    """ 必要な処理を書いてください """
    sleep(2)
    print("end func :" ,target)
    return True


if __name__ == '__main__':
    parallel_call(targets)

```



3.実行結果

シーケンシャル（単処理）

```
~/test$ python3 sec.py
targets:  ['target1', 'target2', 'target3', 'target4', 'target5', 'target6', 'target7', 'target8', 'target9', 'target10']
start func : target1
end func : target1
start func : target2
end func : target2
start func : target3
end func : target3
start func : target4
end func : target4
start func : target5
end func : target5
start func : target6
end func : target6
start func : target7
end func : target7
start func : target8
end func : target8
start func : target9
end func : target9
start func : target10
end func : target10
```

パラレル（同時処理）


```
$ python3 para.py
start func : target1
start func : target2
start func : target3
start func : target4
start func : target5
end func : target1
start func : target6
end func : target2
end func : target3
end func : target4
True
True
True
True
start func : target7
start func : target8
start func : target9
end func : target5
True
start func : target10
end func : target6
True
end func : target9
end func : target8
end func : target7
True
True
True
end func : target10
True
parallel func call end.

```

無事バラけました。
ctypesでhelloworld

ctypesで簡単なCのコードをPythonから呼び出してみます．

# Cのコードのコンパイル

```c:test.c
#include <stdio.h>

void hello_world(void)
{
  printf("Hello, world!\n");
}
```

これを以下のコマンドでコンパイルし，共有ファイルにします．

```shell
gcc test.c -shared -fPIC -o libtest.so
```

# Pythonからの呼び出し

```python:ctypes_test.py
import ctypes

libc = ctypes.cdll.LoadLibrary('./libtest.so')
libc.hello_world()
```

以下のコマンドで実行できます

```shell
python3 ctypes_test.py
```

実行結果

```
Hello, world!
```
[bat]特定バイトのファイルを削除するバッチ

## 概要
特定バイト数のファイルを指定したフォルダから削除するバッチ.

VBSではなく、batで実現する必要が発生したので・・・。

## バッチの中身

```bat
echo off

rem 出力フォルダからファイル名を取得して、特定のバイトサイズのファイルを削除する.
for %%A in (C:\test\*) do (
	rem デバッグ用Echo
	rem echo %%A %%~zA %%~aA

	rem 9,216 byteのものであれば削除する.
	if %%~zA equ 9216 (
		del /Q %%A
	)
)

PAUSE
```
## 補足
- バイト数固定入力がいけてないね.
- フォルダの指定は引数にすれば、多少使いやすくなります.
- 何かジョブ管理ツールから実行するならpauseはコメントアウトor削除してください.
- 参考にしたサイトのURLもあればよかったのですが、作成してから時間経過して確認出来ず・・・。判明したら載せます。
競技プログラミングを始めたいけど何していいか分からないあなたへ

#概要
最近競技プログラミングを始めてみたはいいけど**何からやり始めてどういう流れで進めていけばいいのか**、サクッと書いてくれてる記事がなかったのでまとめることにする。
熟練者からしたらツッコミどころ満載かもしれないけど温かい目でお願いします。

#まずはじめに
とりあえずAtCoder( http://atcoder.jp/ )さんに登録しよう。
調べれば色々あるし英語に慣れた方がいい派もいるけど日本人はとりあえずAtCoderで始めればいいと思う。

#登録したら
AtCoder上で初心者用に10問練習セットがある( https://abs.contest.atcoder.jp/ )。
この10問をググりながらでいいから自分で解いていこう。プログラミング言語は強いこだわりがないなら**C++**で始めること。

Macユーザーは環境構築しなくてもC++は使えるよ。
>(テキストエディタ(SublimeTextがオススメ)でコード書いて、<ファイル名>.cppで保存して、ターミナルからc++ <ファイル名>.cppでコンパイルして、./a.outで実行)
この辺は書き出したらキリないから各々「C++ 実行方法」とかで調べてね。

#上の10問セットが全部解けたら、、
AtCoderでは基本的に毎週土曜日9時からAtCoder Beginner Contest(通称ABC)があるからそれに参加していけばオッケー！！

ABCは大体2時間で４問出題されるから、時間内に全完できるようになるまではABCに参加したらいいよ。youtubeで解説もしてくれるから分からなかったらそっち聞こうね。

全完できたらAtCoder Regular Contest(通称ARC)に移ったらいいかな。
そこまできたら目的に合わせてレッドコーダー目指したり、TopCoderに移ったり、各々で判断。

僕はとりあえずAtCoderでコンテスト出まくってレッドコーダー目指します。

#毎週土曜日が待ちきれない人
ABCの過去問がAtCoderのホームやAtCoderProblem( https://kenkoooo.com/atcoder/ )で見れるから解いてみるか、

AIZU ONLINE( http://judge.u-aizu.ac.jp/onlinejudge/finder.jsp?course=ITP1 )ってサイトもオススメ。Preblemのとこに問題めちゃくちゃあるしチェックもしてくれる。
初心者ならAll-Japan High School Programming Contest:Prelimから解き始めるといいかもネ。

本で勉強したいなら[プログラミングコンテストチャレンジブック [第2版]　～問題解決のアルゴリズム活用力とコーディングテクニックを鍛える～](https://amzn.to/3jIz9Jl)という本は必読の一冊！
僕は手元に置いて索引として使ってるけど、この本を一周するだけで見違えるレベルになる。

#補足
レベルが上がってくるとアルゴリズムの知識が必要になってくるけどそれはやりながら、その都度調べながら覚えていけばいいと思う。アルゴリズムだけ勉強しても結局コード書けんかったりそもそも面白くなくて飽きたら元も子もないし。
もっと速いコード書きたいなとか、スッキリしたコードが書きたくなったらランキング上位者のコードを読んで学んでいこう。

#おまけ
僕が競技プログラミング好きになったのは、最初はすごい簡単な問題なのに段々難しくなってきて、forループ回して順番に探索していけば解けるんだけどそれだと時間がないみたいな問題に直面してからです。もっと早く解く書き方はないか、そこで頭を使う感じがたまらなく楽しかったからです。

自分は今電気系の学科に通っているが、それでも競技プログラミングをやっている人は一部だし、もっと広まってほしい、敷居は低いということを知ってほしいと思いこの記事を書いています。

学校の勉強が退屈だったりエネルギー向ける先がなくて暇だったりしたらやってみてもいいんじゃないでしょうか。友達と一緒にやったら就活でも役立つかもね！
gem install rails でハマった話

gem install rails でPermission Deniedがでた。

#環境
・macOS Sierra 10.13.4

#症状
コマンドラインからrailsアプリケーションを作ろうとした際、「railsがインストールされてないよ」みたいなエラーメッセージが出て、gem install railsしようとしても

```ERROR:  While executing gem ... (Errno::EACCES)
 Permission denied @ rb_sysopen
```
と出てきてインストールできなかった。

#対処
ググったら、[こういう記事](https://qiita.com/tokimari/items/feda1ed61f2d8b5b317c)が見つかったので、記事を参考に

```
which gem
```

を実行。

が、system内のrubyを使っているわけではなく、一応記事の手順を踏んだけどうまくいかず。

めげずに調べたら、[こんな記事](http://infinity108.com/114/)があった。

要約すると、「/Users/(ユーザ名)/.rbenv/versions」配下にあるものは本来ユーザーアカウントの権限のものだが、何らかの時にsudoをつけてgem installを行うことでファイルへ書き込みする権限を失ってしまうことがある、とのこと。

これによって gem installがPermission Deniedで弾かれていたというわけだった。

記事内の手順に沿って
```
sudo chown -R (ユーザ名):staff /Users/(ユーザ名)/.rbenv
```
を実行し、ディレクトリの権限をユーザーに取り戻したら解決した。
GitHub上で不要になったリモートブランチを削除する手順

必要なくなったリモートブランチの削除方法です。
GitHubサイト上で操作することはあまりなかったので、備忘録として残しておきます。

# リモートブランチの削除方法

## 1. ブランチ一覧を開きます。

GitHubにアクセスし、branchesタブを選択します。

※余談ですが、ちょうどMicrosoftによるGitHub買収についての通知が表示されていたので記念にスクリーンショットに含めました:sunny:

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/2fd04095-9243-07e6-56f1-e8c9e704a8a0.png)

## 2. すべてのブランチを表示します。

はじめに開くページはブランチの概要が表示されるため、目的のブランチが表示されていない場合があります。
消したいブランチが見つからない場合は「All branches」ボタンを押します。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/9124acc1-c0d5-d1e7-ed5b-4202f83c2ebb.png)

## 3. 実際に削除します。

一覧から削除するブランチを探します。
このとき、右上のテキスト検索(Search Branches...)にブランチ名を入力すると、一致するブランチだけに絞り込まれるので安全です。

右端のごみ箱ボタンを押します。
確認ダイアログは出ないので、間違いないか確認してから押しましょう。

![a.png](https://qiita-image-store.s3.amazonaws.com/0/87995/a6b55a4a-a620-f949-4d9c-c3baae541460.png)

# :bangbang:間違って消してしまった場合

消した後のページはこんな感じです。
もう一度、削除したブランチが間違っていないか確認しましょう。

**別ページに移動**したり、**ページを閉じたりしない間**は、「Restore」ボタンを押せば元に戻すことができます。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/b5fca4d5-30e5-0c02-bccb-b6ed94a9f6fc.png)
jQueryでclassをつけたり外したりするときの注意点


```javascript
$('.parent .child').each(function () {
    $(this).addClass('no-border');
}

///

// これだと外れない、、
$('.child').each(function () {
    $(this).removeClass('no-border');
}
```

```javascript
// つけた時と同じセレクタを指定する必要がある
$('.parent .child').each(function () {
    $(this).removeClass('no-border');
}
```

以上。
earthを叩く

# 概要
google earthをcom apiから叩く。

# 写真

![earth.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/c497936e-9aa2-76e2-a05b-5020a59f4bf3.jpeg)

# 環境
windows vista
earth 6.2

# サンプルコード

```
Dim App
Dim Appflg
Set App = Createobject("OHIcompo6.srv")
WScript.ConnectObject App, "App_"

Sub App_exit()
	'Msgbox "exit"
	Appflg = 2
End Sub

Sub App_ok()
	line = App.text
	item = split(line, ",")
	oCamera.FocusPointLongitude = item(1)
	oCamera.FocusPointLatitude = item(2)
	oCamera.FocusPointAltitude = item(3)
	objEarth.SetCamera oCamera, 0.5
End Sub

Dim objEarth
Set objEarth = WScript.CreateObject("GoogleEarth.ApplicationGE")

While (objEarth.IsInitialized = 0)
	WScript.Sleep 1000
Wend

Dim oCamera
Set oCamera = objEarth.GetCamera(0)
oCamera.FocusPointLongitude = 140.00
oCamera.FocusPointLatitude = 38.00
oCamera.FocusPointAltitude = 0.0
oCamera.Range = 200000
oCamera.Tilt = 0
oCamera.Azimuth = 0
Appflg = 1
App.text = "1234.44,140.0,38.0,200"
Do
	WScript.Sleep(100)
	App.ping
Loop Until Appflg = 2
Set App = Nothing
WScript.Quit


```

以上。
[AWS] 使用中のキーペア一覧をCSVで取得するワンライナー

# 内容
不要なキーペアをあぶり出すためにインスタンスとキーペアの一覧を取得する

# 前提条件
- AWS-CLIが使用可能
- jqが使用可能
- EC2の情報取得に関するIAM権限を有している

Macクライアントから投げて調査しました

# 方法

```bash:インスタンスIDとキーペアのセットを出力するワンライナー
aws ec2 describe-instances \
    --query 'Reservations[*].Instances[].{InstanceId:InstanceId, KeyName:KeyName}' \
    --output text |
    sed -e "s/ /,/g" > /pathtocsv.csv
```

```text:結果
i-xxxxxxxxxxxxxxxxx,hoge-key
i-aaaaaaaaaaaaaaaaa,hoge-key
i-bbbbbbbbbbbbbbbbb,fuga-key
```

上記コマンドでインスタンスIDとキーペアのセットを取得できます。

```bash:インスタンスIDと名前のセットを出力するワンライナー
aws ec2 describe-instances \
    --query 'Reservations[*].Instances[].{InstanceId:InstanceId,HostName:Tags[?Key==`Name`].Value}' \
    --output json |
    sed -e "s/null/[\"none\"]/g" |
    jq -r ".[] | [.InstanceId, .HostName[]] | @csv" | sed -e 's/"//g' > /pathtocsv.csv
```

```text:結果
i-xxxxxxxxxxxxxxxxx,hogeHost
i-aaaaaaaaaaaaaaaaa,fugaHost
i-bbbbbbbbbbbbbbbbb,none
```

上記コマンドでインスタンスIDと名前タグのセットをCSV形式で取得します。名前タグついてないのは`none`と表記しています。
0606授業課題 オブジェクト指向

オブジェクト指向とは
C#はオブジェクト指向に基づいて考えられています。
C#に限らず言語のほとんどがオブジェクト指向に基づいて設計されています。
オブジェクト指向を支援する機能として型(クラス)の定義やカプセル化、継承などがあります。

カプセル化
オブジェクト指向は通常、中身を隠蔽し、なにができるかを公開すべきです。

継承
オブジェクトのデータや機能を引き継ぐことを継承といいます。

多様性
オブジェクト毎にさまざまな表現をすることを多様性といいます。
授業課題　2

#オブジェクト指向言語
##カプセル化
オブジェクトがデータや処理のうち、直接利用される必要のないものを
隠すことを言う。
##継承
特定のオブジェクトの機能を引き継ぎで使うこと
##ポリモーフィズム
クラスによって同一のメソッドで異なる処理が行える性質
##抽象クラス
継承されることを目的とした、インスタンスを生成することができないクラス
##インターフェイス
オブジェクトを外部と繋ぐための機能で、工業製品なんかで
使われる「インターフェイス」と同じ意味
##静的クラス
動的にインスタンスを生成することなくクラスに
実装それたメンバーにアクセスすることができる機能です。
※静的メソッド・・・インスタンスに依存しないメソッドで、インスタンスが作成
　　　　　　　　　　されていない状態でクラスを通じてアクセスできる
次へ…
ネットが止まって3つ目どころじゃねぇー…
Windowsで開発に使えるショートカットキー


生産性を向上させるための方法はご存知でしょうか？
考えればいくつも出てくると思います。
今回はその中でショートカットキーについて紹介していきたいと思います。

#ショートカットキーとは？
Wikipediaでは、以下のように説明されています。
**ショートカットキー（キーボードショートカット、もしくはホットキーとも言う）とはコンピュータの特定の機能を動作させるために押すキーである。**
**多くの場合、マウスなどのポインティングデバイスを使用した操作でも同様の機能が使用できるが、「ショートカット」という語が示す通り、(ある程度PCの操作に慣れている場合)一般的な操作を迅速に実行できる。**

>引用　https://ja.wikipedia.org/wiki/ショートカットキー

<font color="Red">要約</font>
特定の機能を動作させるために押すキー
マウスでもできるがショートカットキーの方が早い

#Windows開発者向けショートカットキー
私は基本的なコピーや貼り付け程度のショートカットキーは知っていても他に何が出来るかは知りませんでした。ですが他にも多くのショートカットキーがあり、使うだけで効率的に操作することができます。
そして自身が楽になります。
そういった経験から覚えてほしいショートカットキーをご紹介していきます。

>※以降ではWindowsをWinと表記して、説明します。

#【Ctrl + N】エクスプローラ起動
パソコン起動し、**Ctrl + N**を押すことでエクスプローラーを起動することが出来ます。
また、ブラウザの操作中で新しいタブを作成する時、カーソル使わなくとも**Ctrl + N**を押すことで新しいタブを作成することが出来ます。

<font color="Red">※補足※</font>
エクスプローラーを開くだけでしたら**Win + E**でも開くことが出来ます。

#【Alt + Tab】開いているアプリを切り替え
**Alt + Tab**は知っている方も多いと思います。
現在開いている、アプリケーションを切り替えることが出来ます。
ブラウザ,ソースコードエディタ,テキストエディタなど様々なアプリケーションを同時に開くことが多いですよね。
そんな時に今、使いたいアプリケーションを瞬時に選ぶことが出来るのが**Alt + Tab**です。
<font color="Red">※補足※</font>
**Alt + 方向キー**を押すことでマウスを使うことなく、現在操作しているアプリケーションのサイズの表示分割をすることが出来ます。

#【Win + D】アプリケーションの非表示・再表示
**Win + D**を押すことで、開かれているすべてのアプリケーションを非表示・再表示をすることが出来ます。
開発中は様々なアプリケーションを操作します。そのため覚えておくとよいと思います。
<font color="Red">※補足※</font>
開いていない、アプリケーションは**Win + D**を押しても表示することはできません。
**Alt + Tab**と組み合わせて使うととても便利です。

#【Win + L】画面ロック
**Win + L**はとても単純で画面のロックを行います。
小休憩などで離席するときにはセキュリティを意識し、**Win + L**で画面ロックをすることをお勧めします。

#仮想デスクトップとは
<font color="Blue">Windows10</font>の新機能の一つです。
一つのモニターで複数ウィンッドを開いていた場合、管理しづらいですがデスクトップ１デスクトップ２...ということができ、それぞれで何をしているかわかりやすく管理しやすくなります。
>引用　https://ja.wikipedia.org/wiki/仮想デスクトップ

#【Win + Tab】仮想デスクトップメニューを開く
現在使っているデスクトップが表示されます。
新しいデスクトップ+を選択することにより仮想デスクトップを増やすことが出来ます。

#【Win + Ctrl + D】新しい仮想デスクトップの作成
新しい仮想デスクトップを作成することが出来ます。
**Win + Tab**で一回一回カーソルを合わせて増やさなくても、**Win + Ctrl + D**で仮想デスクトップを増やすことが出来ます。
増やした場合、新しい仮想デスクトップに自動で移動します。
<font color="Red">※補足※</font>
**Win + Ctrl + 左右キー**で操作したい仮想デスクトップを切り替えることが出来ます。

#【Win + Ctrl + F4】表示している仮想デスクトップの削除
表示している仮想デスクトップを削除することが出来ます。
仮想デスクトップを削除することが出来るだけですので表示しているアプリケーションなどは別の仮想デスクトップに移動します。



#今回、紹介したショートカットキーまとめ
|ショートカットキー|操作|
|:----------|:----------:|
|Ctrl + N|エクスプローラ起動|
|Alt + Tab|開いているアプリを切り替え|
|Win + D|アプリケーションの非表示・再表示|
|Win + L|画面ロック|
|Win + Tab|仮想デスクトップメニューを開く|
|Win + Ctrl + D|新しい仮想デスクトップの作成|
|Win + Ctrl + F4|表示している仮想デスクトップの削除|

#まとめ
今回はWindowsキーでのショートカットキーを多く紹介させていただきました。
ショートカットキーが使えれば使えるほど効率よく、素早く快適にパソコンを使うことが出来ます。
開発者でなくとも便利ですのでぜひ、試してみてください！
cssアニメによる立体的な折り畳み

#これをcssアニメで！
リンク先の動画にある「折りたたまれた紙」のような演出をcssアニメで実現できないか挑戦してみました。**3Dを使わずにシンプルな方法で**。
https://vimeo.com/83492387

#それっぽくできた
メニュー内の文字を折ることはできませんが、それっぽいアニメはできました。オレンジ色のメニューをタップすると隠れていた項目がアニメで表示されます。確認しやすいようにアニメ速度を遅くしています。
→ [折りたたみメニュー（htmlファイル）](https://jquerystudy.info/test/gps/pf.html)

<img width='400' height='300' src='https://qiita-image-store.s3.amazonaws.com/0/214180/25f1f58d-07e3-851e-114a-55e88f201944.gif'>



#簡単なサンプルの作成
仕組みを確認しやすいように簡単なサンプルを用意しました。buttonをタップする毎にメニューが開閉します。
→ [折りたたみメニューの土台（htmlファイル）](https://jquerystudy.info/test/gps/pf0.html)

###ボーダーで台形を描く
擬似的な折り曲げ表現はcssのborder設定を利用しています。以下のリンク先に詳しい説明があります。
[Qiita:[CSS] 台形をつくる（角を丸くしてみたり、中に文字を入れてみたり。）](https://qiita.com/mochizukikotaro/items/f0a2ff58bc28dd48f45b)

###html構成
body内にはbuttonとdiv要素があるだけです。

```html:pf0.html
<button id='btn'>button</button>
<div id="card0_in" class="pf_in"></div>
```

###javaScript構成
開閉アニメはdiv要素にclass属性（open）を脱着することで制御しています。

```javascript:pf0.html
document.getElementById("btn").addEventListener('click', function(){
	document.getElementById("card0_in").classList.toggle("open");
}, false);
```

###css構成
cssは以下のように記述され初期状態ではpf_inクラスのみで、hightが0のため表示されません。これにopenクラスを付加すると「.pf_in.open」の設定となり、4辺のborder設定を変更しながらheightを100pxに拡げていきます。

```css:pf0.html
.pf_in{
	box-sizing:border-box;
	background-color: #ecb041;
	width: 100%;
	transition: all 1000ms 0s ease-out;

	height: 0px;
	border-bottom: 0px solid rgba(255,255,255,0.1);
	border-top: 0px solid rgba(0,0,0,0.3);
	border-left: 50px solid #000000;
	border-right: 50px solid #000000;
}
.pf_in.open{
	height: 100px;
	border-bottom: 50px solid rgba(255,255,255,0);
	border-top: 50px solid rgba(0,0,0,0);
	border-left: 0px solid #000000;
	border-right: 0px solid #000000;
}
```

#中に文字を表示する
前述の簡単なサンプルでは開閉するdiv要素内にコンテンツを入れるのは難しそうなので、最終的なサンプルでは「折りたたみアニメ」と「表示内容」は別のdiv要素に分けました。
→ [折りたたみメニュー（htmlファイル）](https://jquerystudy.info/test/gps/pf.html)

###html構成
1行目のcardクラスのdiv要素が簡単なサンプルでのbuttonと同じ役目を持ちます。
4行目のpf_inクラスのdiv要素が簡単なサンプルのメニューと同じ役目を持ちます。
3行目のcardDetailクラスのdiv要素に表示したいコンテンツを設定します。
2行目のpf_outクラスのdiv要素は上記2つをまとめています。

```html:pf.html
<div id="card0" class="card"></div>
<div id="card0_out" class="pf_out">
	<div id="card0_detail" class="cardDetail">Card_0 detail text</div>
	<div id="card0_in" class="pf_in"></div>
</div>
```
###css構成
ポイントは「cardDetailクラスのdiv要素」と「pf_inクラスのdiv要素」を**重ねて表示**することです。外側をpf_outクラスのdiv要素で囲んでいるので、以下のようにposition設定を利用することができます。

```css:pf.html
.pf_in{
	position: absolute;
	top: 0px;
	right: 0px;
	--以下略--
}
.pf_out{
	position: relative;
	--以下略--
}
```
javaScriptの構成は少し複雑になっていますが、簡単なサンプルと同様にopenクラスをaddしたりremoveするだけです。

**おしまい**
6/6課題

第1章まとめ
ツールボックスが表示されていないとき
左上のメニューの表示からツールボックスを選択すれば表示される
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249275/2ca4838a-adfa-7deb-9492-b8e79d7bc487.png)
配色テーマの変更
ツールメニューからオプションを選択する
環境から全般を選択し視覚的効果の配色テーマを選択
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249275/4f53163f-7dac-d90f-4c26-449a8bd5fecf.png)
オーバーライド

#オーバーライドとは
オーバーライドとは、スーパクラスから継承されたサブクラスにおいて、メンバ関数を独自の機能で上書きすることです。
例：
<pre>
namespace Sales
{
    class Section
    {
        private string _title;
        public string Title
        {
            get
            {
                return _title;
            }
            set
            {
                _title = value;
            }
        }
        public byte Id { get; set; }

        public override int GetHashCode()
        {
            return Id;
        }
        public override bool Equals(object obj)
        {
            if (obj == null) return false;
            int a = GetHashCode();
            int b = obj.GetHashCode();
            bool r = (a == b);
            return r;
        }
        public override string ToString()
        {
            return Title;
        }

        static public bool operator ==(Section a, Section b)
        {
            if ((object)a == null) return ((object)b == null);
            return a.Equals(b);
        }
        static public bool operator !=(Section a, Section b)
        {
            if ((object)a == null) return ((object)b == null);
            return !a.Equals(b);
        }
    }
}
</pre>
上記の19行目~のメソッドはObjectクラスのメンバをオーバーライドしています。
オーバーライドしたい場合は宣言部にoverrideというキーワードを記述します。
ただし、すべてのメンバーがオーバーライドできるわけではなく、オーバーライドできる基本クラスのメンバーの宣言には「virtual」「abstract」「override」のいずれかが記述されている必要があります。
上で言っていますが今回の場合、ソースの中にあるものをオーバーライドしているわけではなく、Sectionクラスが暗に継承しているObjectクラスがオーバーライドされています。
#Objectクラスとは
Objectクラスとは.NetFrameworkのクラス階層の基本クラスであり型階層のルートです。
基本的に継承を何も指定していないクラスはObjectクラスを指定したことになります。
っていうかすべてのクラスは例外なく暗黙的にObjectクラスを継承しています。
Error: File to import not found or unreadable:  でgulp-sass-globしてくれない問題

gulp4系での開発においてトラブったのでメモ。

## 問題と解決

### 問題
`npx gulp sass`を叩くと

```
[12:34:23] Failed to load external module @babel/register
[12:34:23] Requiring external module babel-register
[12:34:28] Using gulpfile ~\dir1\dir2\sample\gulpfile.babel.js
[12:34:28] Starting 'sass'...
[12:34:28] Plumber found unhandled error:
 Error in plugin "gulp-sass"
Message:
    src\sass\style.scss
Error: File to import not found or unreadable: modules/**/*.
        on line 3 of src/scss/style.scss
>> @import "hoge", "hogehoge", "hogehogehoge", "modules/**";
   ^
```

と怒られます。動かない。

### 解決方法
`gulp-sass-glob`さんに*の存在を認識してもらうには他の読み込むファイル名並列してはいけないようです。

つまり、

```scss:style.scss
@charset "UTF-8";
@import "normalize";
@import "hoge", "hogehoge", "hogehogehoge", "modules/**";
```

ではなく

```scss:style.scss
@charset "UTF-8";
@import "normalize";
@import "hoge", "hogehoge", "hogehogehoge";
@import "modules/**"
```

**こう！！！**


これで解決。めでたしめでたし。


## 解説

環境

- OS: Windows7
- nodeJS: 8.11.2
- npm: 6.1.0



モジュール

- gulp: 4.0.0
- gulp-sass: 4.0.1
- gulp-sass-glob: 1.0.9



はしょっていますが、階層構造はこんなかんじです。

```
sample
  ├─ src/
  │  ├─ sass/
  │  │  ├─ modules/
  │  │  │     └─ *.scss
  │  │  └─ *.scss
  │  └─ ...
  │     
  ├─ temp/
  ├─ dist/
  │
  ├─ .node_modules/
  ├─ .babelrc
  ├─ gulp.babel.js
  ├─ package-lock.json
  └─ package.json  
```


gulpfileはというと、こんなかんじ。

```js:gulpfile.babel.js
import gulp from 'gulp';
import babel from 'gulp-babel';
import plumber from 'gulp-plumber';
import gulpSass from 'gulp-sass';
import sassGlob from 'gulp-sass-glob';
import autoprefixer from 'gulp-autoprefixer';

const paths = {
  styles: {
    src: 'src/sass/**/*.scss',
    test: 'temp/styles/',
    build: 'dist/styles/'
  },
  scripts: {
    src: 'src/js/**/*.js',
    test: 'temp/scripts/',
    build: 'dist/scripts/'
  }
};

function sass() {
  return gulp.src(paths.styles.src)
        .pipe(plumber())
        .pipe(sassGlob())
        .pipe(gulpSass({outputStyle: 'compressed'}))
        .pipe(autoprefixer('last 2 version'))
        .pipe(gulp.dest('./temp/styles/'))
};
exports.sass = sass;
```

あとは先述のように、style.scss内で`@import`で読み込ませるときに並列させないように
気をつければOKでした :D


### おまけ

`npx gulp`をコマンドプロンプトで叩くと
`Failed to load external module @babel/register`と怒られるけど
そのあとに`babel-register`を読み込んでいるので無視しています。

gulpのバージョンを3.9に下げる以外にいい方法を知っている方がいればぜひコメントください。
無線LANがつながらない

<h1>無線LANのトラブルシューティング</h1>
無線LANで接続していると、つながらない、時々切れる、不安定になるというトラブルは比較的よく起きるトラブルです。

無線LANの接続では、無線LANルーター及びアクセスポイント、無線子機、暗号化、他のアクセスポイントとの電波の干渉など有線LANの接続よりもいろいろなデバイス、環境などが関わってきます。

また無線LANルーター・アクセスポイント以外でも WimaxやLTEなどのモバイルルーターを使用した接続でも共通しているところはあります。

無線LAN・Wi-Fi接続が不安定になる場合の考えられる原因や対処法をまとめています。

<h1>原因・対処法</h1>
1.無線LANルーター

無線LANルーター及びアクセスポイントである機器の問題が原因になっていることがあります。特に重要なのは、無線LANに搭載されているROMのファームウェア（プログラム）の問題です。

ファームウェアは、不具合や新しいデバイスへの対応などもありメーカーサイトで随時更新されています。

2.無線子機

無線子機、および無線子機のドライバや付随したソフトウェアの不具合が原因になっていることもあります。

OSのアップデートが行われたことに対する不具合修正や機能追加など、無線子機のドライバやソフトウェアはメーカーサイトで随時更新されていることがあるので、確認しておく必要があります。

またパソコンにもともと内蔵されている無線子機（無線LANカード）を使用している場合も同様です。

パソコンのメーカーサイトで、無線子機のドライバのアップデートや無線LAN接続を管理しているソフトウェアのアップデートが提供されていないか確認したほうがいいでしょう。

3.電波の干渉

最近は無線LANの導入が増えているため、近くに無線LANルーターやアクセスポイントが多く様々な電波が感知されているということがあります。

無線LANの電波は、周波数やチャンネルというものがあり同じ周波数帯、特に2.4Ghz帯では干渉が起きやすくなります。

周囲の無線LANルーター・アクセスポインと同じチャンネルを使用している場合は、それが原因で接続が不安定になっていることも考えられます。

2.4GHz帯の少しでも空いているチャンネルへの変更や 無線LANルーターや子機が5GHzに対応しているかどうかの確認もしてみるべきです。

親機側も子機側も5GHzに対応しているなら 5GHzに切り替えるという方法があります。

無線LANの電波状況を調べる inSSIDer
Wi-Fiの電波状況を調べる （スマートフォン・タブレット）
2.4GHzと5GHz
無線LANの設定
干渉などで電波が弱まり無線LANのSSIDが見えなくなることもあります。

パソコンと無線LANルーターを近付ける、アンテナの角度を変える、ルーターをおく場所を窓際から離す・場所を変えるなど試してみる必要もあります。

またマウス・キーボード・スピーカーなどで使われる Blutooth ブルートゥースも2.4GHzの電波を使用しています。

同じ部屋などで Blutoothを使っているようなら 一度OFFにしてどうなるか？確認します。

Bluetooth
4.無線LANルーターの不具合

よくいわれることですがモデムやルーターの機器の電源を一度切り、再起動をかけるとインターネット接続が安定することもあります。

有線ルーターでもそうですが、古い機種の場合はルーターの不具合で時々切れたり、接続が不安定になるということはあります。

最近の無線ルーターは高機能化・高性能化がすすんでおり、高速な11nの規格にも対応しているものがほとんどです。転送速度（スループット）も向上しています。

ルーターが古い機種の場合は、比較的最新のものに変更することでトラブルが改善することもあります。

ネットワークに関してはまだまだ知らないことばっかなのでしっかり勉強したいと思って問題が起きたら先生方や先輩にやってもらうんではなく自分で解決したいです。
railsでテーブル要素の一つ一つにリンクを貼る方法

##やりたいこと
テーブルの列を全部クリック可能にして、リンクで飛ばせるようにしたい。



trタグの間にaタグを置けないということで、
テーブルのへjsを仕込むやり方になりました。

リンク先は"/topics/1"など、それぞれのtopicのidが入ることを想定しております。

```erb

<tr onclick='window.location="<%= '/topics/' + topic.id.to_s %>"' role="link">
```

加えた後のコードは以下。

```erb:index.html.erb

  <tbody>
    <% @topics.each do |topic| %>
      <tr onclick='window.location="<%= '/topics/' + topic.id.to_s %>"' role="link">
        <td class="well"><%= link_to topic.content, topic %></td>
        <td><%= topic.like %></td>
      </tr>
    <% end %>
  </tbody>
```

##困っていること
マウスオーバーした時にポインタがリンクっぽく変わらないのが微妙。


###参考にしたリンク

以下の回答の2つ目を使用。
1つ目は戻ったのちに使えなくなるという問題があり。
https://stackoverflow.com/questions/17147821/how-to-make-a-whole-row-in-a-table-clickable-as-a-link
PocketMine-MP / pocketmine.phar の最新版をダウンロードする

公式に配布されているものを紹介します。

# GitHub のリリースページ

ある程度は安定したもの。

https://github.com/pmmp/PocketMine-MP/releases

![pocketmine-phar.png](https://qiita-image-store.s3.amazonaws.com/0/183014/0e36e488-9fee-7633-0c69-a549dcc149ef.png)

# Jenkins

master ブランチの最新ソースから自動的にビルドされたもの。
GitHub のリリースページにある安定版ものより新しいが、開発版のためバグや動作不安定な場合がある。

https://jenkins.pmmp.io/job/PocketMine-MP/

![2018-06-13_11h05_45.png](https://qiita-image-store.s3.amazonaws.com/0/183014/65bc4baa-bc40-9421-0336-cd84e4c64c55.png)

![2018-06-13_11h06_35.png](https://qiita-image-store.s3.amazonaws.com/0/183014/af4b2b78-b5ce-d07e-e78e-2798b5dcd23a.png)

この phar は、そのままでは起動しないので、pocketmine.yml に下記を追記する。

```
settings.enable-dev-build: true
```

![2018-06-13_18h15_07.png](https://qiita-image-store.s3.amazonaws.com/0/183014/0715e9c4-80b9-4933-f349-ec8ec9ba88c6.png)
多態性

多態性(polymorphism: ポリモーフィズム)とは、 同じメソッド呼び出し(オブジェクト指向用語的には「メッセージ」という)に対して異なるオブジェクトが異なる動作をすることを言います。

（ ちなみに、polymorphism は多相性とか多様性と訳す場合もあります。 「poly（多）＋morphism（射：形を変えるみたいな意味） → いろいろな姿を映し出す」という意味。 ）

オブジェクト指向プログラミング言語には、 多態性を実現するために、仮想メソッドというものが用意されています。

ポイント
オブジェクト指向の中核概念その3: 多態性。

同じ名前のメソッドを呼び出しで、異なる振る舞いをすること。

特に重要なのは、仮想関数を使った動的多態性。インスタンスの動的な型に応じて異なる振る舞いをする。

（メソッドのオーバーロードも多態性の一種（静的多態性）。）
windowアプリ開発基礎今まで習ってきた中で不明な所

<h1>オブジェクト指向</h1>
そもそもオブジェクト指向とは、コンピュータプログラムの設計や実装についての考え方の一つで、互いに密接に関連するデータと手続き(処理手順)をオブジェクト(object)と呼ばれる一つのまとまりとして定義し、様々なオブジェクトを組み合わせて関連性や相互作用を記述していくことによりシステム全体を構築していく手法です。
<h1>オブジェクト指向の3大要素とは</h1>
<ul><li><h1>カプセル化</li></h1></ul>
カプセル化とは、オブジェクト指向を構成する概念の一つ。オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、オブジェクトの実際の型を隠蔽したりすることをいう。
<ul><li><h1>継承</li></h1></ul>
オブジェクト指向を構成する概念の一つである。
あるオブジェクトが他のオブジェクトの特性を引き継ぐ場合、両者の間に「継承関係」があると言われる。
<ul><li><h1>多様性</li></h1></ul>
多様性とは種々の動作原理の制御回路や種々のタイプの装置または部品を使用することにより、共通の障害および故障の確率を低減できる。

これらはまだあまりどういう意味か分かっていないので勉学します。
Pythonで音を鳴らす(pygame)

#Pythonでmp3を再生させる
##実行環境
・Pythonのバージョン->3.6.5
・pygameのバージョン->1.9.3

事前にpygameライブラリをインストールしてください．

##ソースコード
ソースコードは以下になります．

```Python
#coding:utf-8
import pygame.mixer
import time

def sound():
    pygame.mixer.init() #初期化

    pygame.mixer.music.load("chime.mp3") #読み込み

    pygame.mixer.music.play(1) #再生

    time.sleep(3)

    pygame.mixer.music.stop() #終了

if __name__ == '__main__':
    sound()
```

今回はmp3ファイルを鳴らしていますが，loadするファイルを.wavにしても再生できるそうです．

また，pygame.mixer.music.play()の()の中で再生回数を指定できます(-1にすると無限ループ)．

time.sleep()でスリープする時間を指定しないとplayしてすぐstopが処理されるので音が鳴らないようです．

##参考リンク
http://westplain.sakuraweb.com/translate/pygame/Music.cgi
単回帰分析

## pythonで単回帰分析したときのメモ
### 気づき
回帰分析とはある変数から、もう一方の変数を予測するためのもの
似たものに、「相関係数」というものがあるが、2変数の関係の強さを数量で示すものなのでそもそもの目的が違う
単回帰分析とは、一つの目的変数を1つの説明変数で予測する。具体的には、Y=aX+bのa(回帰係数)とb(切片)を求める。
求め方：最小二乗法
最小二乗法とは回帰式との誤差を最小にするという方法

a = (xとｙの共分散)/(xの分散)
b = yの平均値 - a(xの平均値)

決定係数：回帰式の説明力を示す指標(1-0の値をとり、１に近いほど説得力がある)


### 参照URL
>単回帰分析とは
>https://www.albert2005.co.jp/knowledge/statistics_analysis/multivariate_analysis/single_regression
>例題
>https://algorithm.joho.info/machine-learning/python-scikit-learn-regression-single/
>相関係数と回帰係数
>https://www.study-channel.com/2015/07/correlation-regression.html


```text:data.csv
"x1","x2","x3"
45,17.5,30
38,17.0,25
41,18.5,20
34,18.5,30
59,16.0,45
47,19.0,35
35,19.5,25
43,16.0,35
54,18.0,35
52,19.0,40
```

```python3:LinerRegression.py
import pandas as pd
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt

def main():
    # pandasの関数read_csvを使ってcsvを読み込む
    data = pd.read_csv("data.csv", sep=",")
    # scikit-learnにある関数を呼んでくる
    clf = linear_model.LinearRegression()
    # # 説明変数に"x1"のデータを使用
    # loc[] で dataにあるラベルx1の値をとる
    # as_matrix で arrayにキャスト
    X = data.loc[:, ['x1']].as_matrix()
    # # 目的変数に"x2"のデータを使用
    Y = data['x2'].as_matrix()
    # # 単回帰分析をかける
    clf.fit(X, Y)
    # 回帰係数
    a = clf.coef_
    # 切片
    b = clf.intercept_
    # 決定係数
    r = clf.score(X, Y)
    # # 出力
    print("回帰係数：", a)
    print("切片：", b)
    print("決定係数：", r)

    # データのプロット
    plt.plot(X, Y, "o")
    # x軸の設定
    fig_x = np.linspace(30, 60, 30)
    # グラフｙの定義
    fig_y = a*fig_x + b
    # 直線の描画
    plt.plot(fig_x, fig_y, "r-")
    # 表示
    plt.show()

if __name__ == "__main__":
    main()
```
C++でビルドが通らない時のメモ

#地味に時間とられる
ノリノリで開発してても、いざビルドするとたくさんエラーが出て萎えることあるわね。
なんだか意味が分からないエラーがでてしまって解決まで時間かかることもまぁよくある。
この記事では時間とられたエラーについて、状況と解決方法を書いていく。

#全角スペースが入っている
ソースコード中に全角スペースがはいってしまっている。
コメント内ならいいんだけど。
全角スペースを半角スペースに置換しよう。
エディタに表示されるようにしてもよい。
参考：http://www.atmarkit.co.jp/ait/articles/1503/03/news057.html

#ソースコードの文字コードがsjis(CP932)の時
sjisにはたとえコメントであっても使ってはいけないダメ文字が存在する。
可能ならUTF-8あたりに変換しておこう。
参考：https://sites.google.com/site/fudist/Home/grep/sjis-damemoji-jp

#インクルードの順番
インクルードするファイルの順番によって、コンパイル時にコンパイラが知らないクラスが出てくる。
そうすると、構文エラーやらがたくさんでてきてしまって、原因の推測も面倒になってくる。
これは、ヘッダファイルをインクルードし合うときにおこりやすい。

```cpp
class hoge;  //ここでクラスの存在だけ宣言しておくとよい
class piyo{
    piyo(){};
    ~piyo(){};

    void Sethoge(hoge* p);
};
```

この時、hogeは存在が確認されているだけのふんわりした状態なので
実体としてpiyoのメンバ変数では宣言できないし、
ヘッダ中でhogeのメンバ関数も呼ぶことができない。

#実体がない
ヘッダファイルで宣言だけしてあって、実装していない時とか、
ファイルがあって、実装してあっても、cppがビルドの対象に入っていないとか
前者はわかりやすいけど、後者はちょっと迷うかもね

#既に宣言されています
こんな感じで、ヘッダにクラス書いてるとき。

```cpp
#pragma once

class hoge{
    hoge();
    ~hoge();
};

hoge::hoge(){
   //...
}

hoge::~hoge(){
   //...
}
```
関数の中身はcppを作ってそっちに書くか、こうする

```cpp
#pragma once

class hoge{
    hoge(){
         //...
    };
    ~hoge(){
         //...
    };
};
```

#セミコロンがない
まぁまぁよくあるやつなので、普通はすぐ気が付く。
だけど、クラスの末尾につけるやつは結構わすれがち。
さらにヘッダに書いてあるクラスだと、インクルード元でエラー出たりするから
余計にわからなくなる。困る。
プロジェクターの接続コネクタの規格


フリー画像がみつからなかった＆手元にケーブルがなかったため手書きで。

## VGA端子
RGB端子ともいう。
昔からある規格で、後述するDVI・HDMIが主流になる前までは大体のパソコンについていた端子。
PCのデジタル情報をアナログ信号に変換して送り、ディスプレイに表示する。

![Screen Shot 2018-06-06 at 15.23.01.png](https://qiita-image-store.s3.amazonaws.com/0/109241/14b0c568-8daf-ce1d-50db-6063b7065405.png "Screen Shot 2018-06-06 at 15.23.01.png")


## DVI
DVIには二種類ある。

| 規格 | 送るデータの形式 | 
|:-----------|:------------|
| DVI-I      | デジタル信号、アナログ信号両方 |
| DVI-D      | デジタル信号のみ |

### DVI-D
![Screen Shot 2018-06-06 at 15.31.10.png](https://qiita-image-store.s3.amazonaws.com/0/109241/aeaf2d81-af86-7255-7300-742cd98fa30a.png "Screen Shot 2018-06-06 at 15.31.10.png")

### DVI-I
![Screen Shot 2018-06-06 at 15.31.18.png](https://qiita-image-store.s3.amazonaws.com/0/109241/f6def2c5-440b-8fcc-95f7-7ae0178f4471.png "Screen Shot 2018-06-06 at 15.31.18.png")

## HDMI
DVIをベースに作られたデジタル入出力規格。
音声も送れる。

![Screen Shot 2018-06-06 at 15.42.33.png](https://qiita-image-store.s3.amazonaws.com/0/109241/1cbfaaef-b06a-8bac-567f-f7ec8e0516eb.png "Screen Shot 2018-06-06 at 15.42.33.png")
6月６日授業課題３

#今回はクラスメンバーについてまとめました。
#メンバー
クラスにはいろいろな種類のメンバーがあります。

・定数
クラスに関連付けられている定数値

・フィールド
クラスの変数

・メソッド
クラスによって実行可能な計算とアクション

・プロパティ
クラスの名前付きプロパティの読み取りと書き込みに関連付けられているアクション

・インデクサー
配列など、クラスのインスタンスのインデックス作成に関連付けられているアクション

・イベント
クラスによって生成可能な通知

・演算子
クラスによってサポートされている変換と式の演算子

・コンストラクター
クラスのインスタンスまたはクラス自体を初期化するために必要なアクション

・ファイナライザー
クラスのインスタンスが完全に破棄される前に実行するアクション

・種類
クラスで宣言される、入れ子にされた型

#ユーザー補助
アクセシビリティには 5 つの有効な形式があります。 これらの概要を次に示します。

・public
アクセスは制限されません。

・protected
アクセスは、このクラスまたはこのクラスから派生したクラスに制限されます。

・internal
アクセスは、現在のアセンブリ (.exe、.dll など) に制限されます。

・protected internal
アクセスは、それを含んでいるクラスまたは含んでいるクラスから派生されたクラスに制限されます。

・private
アクセスはこのクラスに制限されます。

・private protected
アクセスは、それを含んでいるクラスまたは同じアセンブリ内のそれを含んでいる型から派生されたクラスに制限されます。
C#基礎プログラミング　getとset

#getとset
<pre>例：
class Section
{
     private string _sample;
     public string Sample
     {
          get
          {
               return _sample;
          }
          set
          {
                _sample = value;
          }
     }
}
</pre>
まずこの例の3行目の<b>private string _sample</b>によって
Sectionクラス全体からフィールド変数<b>＿sample</b>が使用できるようになります。
次に4行目の<b>public string Sample</b>ではSampleプロパティをstring型で宣言しています。
＊プロパティ名の頭文字が大文字なのが一般的
＊フィールド名がsampleだったからといってSampleにする必要性自体はないが関連付けたほうがわかりやすい。
6行目～9行目の
<pre>
　　　　　get
          {
               return _sample;
          }
</pre>
はSampleプロパティに対して値の取得要求が来た場合の処理を記述します。
このプロパティはフィールド変数＿sampleに格納されています。
この記述ならSampleプロパティが要求されたときに＿sapleの値をreturnで返します。
最後に
<pre>
         set
          {
                _sample = value;
          }
</pre>
はSampleプロパティに対して値の設定要求が来た場合の処理を記述します。
プロパティに渡された値は常にvalueという変数に格納されます。
<b>＊valueとは</b>
要するにvalueはsetとgetの中でのみキーワード扱いされ、それ以外では普通に変数名として使用されます。
valueの中身は例えばtest　＝　10って代入するとvalueの中にも10が代入された状態になります。
xamppで[mysqli 拡張がありません。]によりMySQLに繋がらない・・・

PHPのバージョンを上げたのが原因なのかわからないんですが、気がついたら
以下のMySQLの管理ページが開けなくなっていました。
http://localhost/phpmyadmin/

アクセスすると次の画像のような状況でした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/23032e55-6dfa-0398-7c94-6575aa1c672d.png)

メッセージ内容

```
mysqli 拡張がありません。PHP の設定をチェックしてみてください。 See our documentation for more information.
```

####対策

php.ini ファイルに以下を記載することで、接続できるようになりました！

```
extension=php_mysqli.dll
```

php.ini の開き方
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215529/3469d1c9-331f-5d5a-e27f-3e1275ef23ec.png)
rust 簡単なオーバーロードをする overload

# やりたいこと
+ 同じ数の引数、違う型の引数で関数を呼ぶ

``` rust
over_load(0);
over_load(1.2);
```

+ 違う数の引数、同じ型の引数で関数を呼ぶ

``` rust
over_load(0);
over_load(1, 2);
```

+ 違う数の引数、違う型の引数で関数を呼ぶ

``` rust
over_load(3, 1.2);
over_load('a', "bcd", "efg".to_string());
```

## version
![image.png](https://qiita-image-store.s3.amazonaws.com/0/218691/4119666e-dec8-acf1-470f-969be215d589.png)

# どうやるか？
異なるタプル型のメソッドを用意し、traitでまとめます。
なので、Unit-like 構造体を用意し引数はタプル型で渡します。

``` rust
Type::over_load(0); //引数一つはタプル型にしなくて良い
Type::over_load((1, 2));
Type::over_load((3, 1.2));
Type::over_load(('a', "bcd", "efg".to_string()));
```

## 一つのファイルの場合

``` rust:main.fn
struct Type;

trait Overload<T> {
	fn over_load(T);
}

impl Overload<i32> for Type {
	fn over_load(args: i32){
		println!("i32: {}", args);
	}
}

impl Overload<(i32, i32)> for Type {
	fn over_load(args: (i32, i32)) {
		println!("i32: {}, i32: {}", args.0, args.1);
	}
}

impl Overload<(i32, f64)> for Type {
	fn over_load(args: (i32, f64)) {
		println!("i32: {}, f64: {}", args.0, args.1);
	}
}

impl<'a> Overload<(char, &'a str, String)> for Type {
	fn over_load(args: (char, &str, String)) {
		println!("char: {}, &str: {}, String: {}", args.0, args.1, args.2);
	}
}

fn main() {
	Type::over_load(0);
	Type::over_load((1, 2));
	Type::over_load((3, 1.2));
	Type::over_load(('a', "bcd", "efg".to_string()));
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/218691/b0428b9a-306b-28d8-d2a5-9301b008948f.png)

## ファイルを分割する場合

``` rust:main.fn
mod overload;
use overload::{Type, Overload};

fn main() {
	Type::over_load(0);
	Type::over_load((1, 2));
	Type::over_load((3, 1.2));
	Type::over_load(('a', "bcd", "efg".to_string()));
}
```

``` rust:overload.fn
pub struct Type;

pub trait Overload<T> {
	fn over_load(T);
}

impl Overload<i32> for Type {
	fn over_load(args: i32){
		println!("i32: {}", args);
	}
}

impl Overload<(i32, i32)> for Type {
	fn over_load(args: (i32, i32)) {
		println!("i32: {}, i32: {}", args.0, args.1);
	}
}

impl Overload<(i32, f64)> for Type {
	fn over_load(args: (i32, f64)) {
		println!("i32: {}, f64: {}", args.0, args.1);
	}
}

impl<'a> Overload<(char, &'a str, String)> for Type {
	fn over_load(args: (char, &str, String)) {
		println!("char: {}, &str: {}, String: {}", args.0, args.1, args.2);
	}
}
```

# まとめ
自明でした
Vue.jsをCentOS7.4＋nginx上で動かしてみる

# はじめに
ふとしたことから素の `CentOS 7.4` 上に `nginx` 入れて `Vue.js` 動かしてみたくなったのでやってみた。
`Vagrant` ・ `npm` （全てローカル）はインストール済みである前提です。

# 目的とするもの

* Virtual Machine
    * nginx
* Local Machine
    * Vue.js

# VM作成
基本的に途中までは [**こちら**](https://qiita.com/tosite0345/items/b9ec1594f359f03b0403) の記事を参考に進めていく。

## Virtual Machine構築まで
```bash:LocalMachine
vagrant box add centos/7 https://atlas.hashicorp.com/centos/boxes/7
mkdir nginx
vagrant init centos/7
vagrant up
vagrant ssh
```

`vagrant up` できない場合は [**こちら**](https://qiita.com/tosite0345/items/b9ec1594f359f03b0403#rsync-could-not-be-found-on-your-pathwindows%E3%81%AE%E3%81%BF) を参照。主にWindows機の問題？

## nginxインストール

### リポジトリ追加

以下のファイルを新規作成。
基本的に `sudo su` でスーパーユーザーとして実行すること。

```text:/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
```

### インストール・起動

```bash:VirtualMachine
yum install nginx -y

# バージョンチェック
nginx -v

# 起動
nginx -v
```

もしマシン起動時にサービスを自動起動したいなら「サービス 自動化」とかで調べてね！

## テスト環境に接続
`http://192.168.33.10` に接続してWelcomeページに接続できるか確認する。
ちなみにこのIPはローカル側、 `Vagrantfile` から変更できる。

![2018-06-06_15h07_38.png](https://qiita-image-store.s3.amazonaws.com/0/165355/ef4b6ab8-fd6e-dd68-d6d5-0680793ee93f.png)

# Vue側の準備

次にローカル側でVue.jsの環境を構築していきます。
本当はVM上に入れてもいいんですが、今回はローカルで。

## vueのインストール

```bash:LocalMachine
npm i vue
npm i vue-cli
# プロジェクトの作成
vue init webpack vue-test
# テスト環境のビルド
cd vue-test
npm run dev
```

ここで試しに `http://localhost:8080` にアクセスして以下の画面になることを確認する。
![2018-06-06_15h13_31.png](https://qiita-image-store.s3.amazonaws.com/0/165355/17f5459c-cfc8-f0fd-503d-4f833eb3d42d.png)


## ビルド

問題なければビルドしてみる。

```bash:LocalMachine/vue-test
npm run build
```

ここで作成された `dist` をVMに持っていく。
持っていくためには、自分のストレージを共有してVM側からマウントする、設計図共有サイト（笑）からコードを持ってくる、とかとか。お好きにどうぞ。

# デプロイ
ここでもう一度VM側に戻る。
`nginx` は初期設定の場合、受け口を `/usr/share/nginx/html` 内の `index.html` に持っている。
要はここを入れ替えればいいってわけ。

```bash"VirtualMachine
cd /usr/share/nginx/html
# 名前を変えて退避
mv index.html index.html.org
# マウント先からソースコードを配置する
cp -rf [mounted directory]/dist/* ./
```

## アクセスしてみる
これでもう一度 `http://192.168.33.10` にアクセスしてみると...。
![2018-06-06_14h56_00.png](https://qiita-image-store.s3.amazonaws.com/0/165355/debdba01-aba6-ffb8-7f64-1589deda73dd.png)

# 終わりに
ね？簡単でしょ？
MacOs, LinuxでのGitコマンド　

* gitのバージョンをチェック
<pre>
$ git --version
</pre>

* gitのユーザー設定
<pre>
$ git config --global user.name "[ユーザー名]"
$ git config --global user.email "[アドレス]"
</pre>

* gitの出力をカラーリング
<pre>
$ git config --global color.ui auto
</pre>

* gitコマンドのエイリアスを設定
<pre>
$ git config --global alias.[エイリアス] [コマンド]
</pre>

* ローカルリポジトリの作成
<pre>
$ git init
</pre>

* ファイルの変更をコミットする

<pre>
$ git add [ファイル名]
$ git commit -m "[コミットメッセージ]"

# インデックスのバリエーション
$ git add .   # gitが管理する全てのファイルをインデックス
$ git add -u  # 最新のコミットから変更があったもの全てインデックス
</pre>

* 現在のブランチとインデックスの状態を確認


<pre>
$ git status

# 現在のブランチを表示
On branch master

# インデックスしていない変更がある場合
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   sample.txt

no changes added to commit (use "git add" and/or "git commit -a")

# インデックスしているがコミットしていない変更がある場合
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   sample.txt

# 最新のコミット以後変更がない場合
nothing to commit, working directory clean
</pre>
* ファイルの編集履歴を確認
<pre>
$ git log

</pre>

* リモートリポジトリをローカル環境にクローン
<pre>
$ git clone [リモートリポジトリのURL] [ディレクトリ名]

</pre>

* リモートリポジトリからローカルにプル
<pre>
$ git pull orgin master

</pre>
初心者、私の.vimrc

#自分の.vimrcを公開しながら、良い設定やプラグインなどを随時更新していきます。

```.vimrc
:syntax on$
:set ruler$
:set autoindent$
:set list$
:set shiftwidth=4$
:set softtabstop=4$
:set hlsearch$
:set nowrap$
:set sidescroll=10$
$
"背景"$
syntax enable$
set background=dark$
let g:solarized_termcolors=256$
$
set nocompatible$
filetype plugin indent off$
$
if has('vim_starting')$
  set runtimepath+=~/.vim/bundle/neobundle.vim$
endif $
$
call neobundle#begin(expand('~/.vim/bundle'))$
NeoBundleFetch 'Shougo/neobundle.vim'$
$
$
NeoBundle 'Shougo/unite.vim'$
NeoBundle 'Shougo/neosnippet.vim'$
$

"Node.js関連の設定"$
NeoBundleLazy 'heavenshell/vim-jsdoc' , {'autoload': {'filetypes': ['javascript']}}$
NeoBundle 'pangloss/vim-javascript'$
NeoBundle 'Townk/vim-autoclose'$
NeoBundle 'moll/vim-node'$
$
NeoBundle 'scrooloose/syntastic'$
let g:syntastic_check_on_open=0 "ファイルを開いたときはチェックしない$
let g:syntastic_check_on_save=1 "保存時にはチェック$
let g:syntastic_check_on_wq = 0 " wqではチェックしない$
let g:syntastic_auto_loc_list=1 "エラーがあったら自動でロケーションリストを開く$
let g:syntastic_loc_list_height=6 "エラー表示ウィンドウの高さ$
set statusline+=%#warningmsg# "エラーメッセージの書式$
set statusline+=%{SyntasticStatuslineFlag()}$
set statusline+=%*$ 
let g:syntastic_javascript_checkers = ['eslint'] "ESLintを使う$
let g:syntastic_mode_map = {$
      \ 'mode': 'active',$
      \ 'active_filetypes': ['javascript'],$
      \ 'passive_filetypes': []$
      \ }$
$
NeoBundle 'thinca/vim-quickrun'$
" 水平に分割する$
let g:quickrun_config={'*': {'split': ''}}$
$
NeoBundle 'tomasr/molokai'$
$   
call neobundle#end()$
$   
filetype plugin indent on$

```
作業効率UPを上げるwindows10ショートカットキー

#windows10ショートカットキーまとめ
*作業効率UPのためにwindowsのショートカットキーをまとめてみようと思います*

##個人的によく使っているもの
| ショートカットキー | 動作 | 補足  |
|---|---|---|
|F7|入力した文字をカタカナに||
|F8|入力した文字を半角カタカナに||
|F9|入力した文字を英数字に||
|F10|入力した文字を半角英数字に||
|F6|入力した文字をひらがなに||
|Tab|次の項目に移動||
|Shift + Tab|前の項目に移動||
TabとShift + Tabを使うことによって、いちいちマウスクリックをする必要がなくなる
![test4.gif](https://qiita-image-store.s3.amazonaws.com/0/262464/03895901-c463-ff2b-4158-e1e04a398b6b.gif)



| ショートカットキー | 動作 | 補足  |
|---|---|---|
| Alt + Tab | アプリケーションの切り替え  |トラックパッド指三本横スワイプでも可能|
| Ctrl + C |  選択項目のコピー |  |
| Ctrl + X |  選択項目の切り取り | 切り取ったら元はなくなる |
| Ctrl + V |  コピーまたは切り取りした項目の貼り付け |  |
| Ctrl + F |  ウィンドウ内検索 | ブラウザやエディター等で使える |
| Ctrl + S |  上書き保存 | エディター等で使える |
|Ctrl + Z|操作を元に戻す|エディター等で使える|
|Ctrl + Y|操作をやり直す|Ctrl+Zも戻せる|
Ctrl + Zで間違いで消してしまった文章などをやり直すことができる
![test5.gif](https://qiita-image-store.s3.amazonaws.com/0/262464/839374d4-83fb-2d58-6812-e6303c7dfbc3.gif)

| ショートカットキー | 動作 | 補足  |
|---|---|---|
|Alt + ←|戻る||
|Alt + →|進む||
これらはよく使ってます。使えると作業効率UP間違いなし！
##調べてみて使えそうなショートカットキー
| ショートカットキー | 動作 | 補足  |
|---|---|---|
|Alt + F4|アプリを終了する|シャットダウンメニューも開ける|
| Alt + Tab + Shift | アプリケーションの切り替え  |Alt + Tabの逆の順番|
|Windowsキー + 矢印キー|矢印方向にウィンドウを最大化または最小化する||
ウィンドウの整理や並列させたいときに役立つ
![test2.gif](https://qiita-image-store.s3.amazonaws.com/0/262464/6c1542a6-7b19-4062-ff01-2f3afbe4150f.gif)


| ショートカットキー | 動作 | 補足  |
|---|---|---|
| Windowsキー + L|PCをロックする||
|Windowsキー + D|デスクトップを表示する|ウィンドウ整理に使える|
|Ctrl + D|選択したファイル等をゴミ箱に移動する||
|Shift + Delete|選択したファイル等をゴミ箱に移動せず削除する|完全に消えます|
![test6.gif](https://qiita-image-store.s3.amazonaws.com/0/262464/d2f075f2-c504-278c-dabc-270b6ffdfc30.gif)


| ショートカットキー | 動作 | 補足  |
|---|---|---|
|Windowsキー|スタート画面を開く|押してから文字入力でアプリやファイルの検索もできる|
|Esc|キャンセルまたは閉じる|動作等を中断したり|
|PrtSc(PrintScreen)|スクリーンをプリントする|画像として保存するにはペイント等に張り付けて保存|
|Windowsキー + PrtSc|スクリーンをキャプチャする|画像として保存される|
|Ctrl + Insert|選択項目のコピー|コマンドプロンプト等Ctrl + Cが使えない場合はこれ|
|Shift + Insert|選択項目のコピー|コマンドプロンプト等Ctrl + Vが使えない場合はこれ|
##仮想デスクトップショートカットキー
|ショートカットキー|動作|補足等|
|---|---|---|
|Windowsキー + Tab|タスクビューを開く||
|Windowsキー + Ctrl + D|仮想デスクトップを作成する||
|Windowsキー + Ctrl + →|右側の仮想デスクトップに切り替え|トラックパッド指四本で右スワイプでも可能|
|Windowsキー + Ctrl + ←|左側の仮想デスクトップに切り替え|トラックパッド指四本で左スワイプでも可能|
|Windowsキー + Ctrl + F4|仮想デスクトップを閉じる||
デュアルモニターの環境だとあんまり使いませんが、シングルの環境だと結構使えると思います
![test8.gif](https://qiita-image-store.s3.amazonaws.com/0/262464/1ed4b47d-59e4-0575-8069-056b4e6c59f4.gif)


その他ショートカットキーはここで
[Windows のキーボード ショートカット](https://support.microsoft.com/ja-jp/help/12445/windows-keyboard-shortcuts)
railsでbootstrapを入れてもiPhoneでレスポンシブにならない時


application.html.erbに以下が書かれているかをチェック

```erb:application.html.erb
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
```

いか、修正後。

```erb:application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>NarouOsusume</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

    <!-- ここ！！！-->
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- ここ！！！-->

  </head>

  <body>
    <%= yield %>
  </body>
</html>
```
【codility】Lesson 4: Counting Elements PermCheck

#subject
Lesson 4: Counting Elements PermCheck
順列（Permutation）の配列になっているかどうかをチェックする問題。
例）
`A = {4, 1, 3, 2}`ならば1を返す
`A = {4, 1, 3}`ならば0を返す

#submit
下記の項目がどうしても解決できない。
antiSum2 :total sum is correct, but it is not a permutation, N = ~100,000

![image.png](https://qiita-image-store.s3.amazonaws.com/0/237869/ccf3d854-22b1-89ac-c8ff-9d3d57e8186c.png)
#program
1~Nまでの各数値の足し算、及び掛け算の総数をあらかじめ計算し、与えられた配列の全ての値の足し算、及び掛け算の総数も計算し、それらの差分がゼロならば、それは順列であると定義した。
そうすると、
`A = {1, 4, 1}` の場合
`totalSum = 6, arrSum = 5, totalMultiple = 6, arrMultiple = 4`となり、順列ではないとなる。


```c++:permCheck.cpp
#include<iostream>
#include<vector>
using namespace std;

int solution(vector<int> &A) {
	int totalSum = 0;
	int arrSum = 0;
	unsigned long totalMultiple = 1;
	unsigned long arrMultiple = 1;
	int sumCount = A.size();

	if (!A.empty()) {

		while (sumCount) {
			totalSum += sumCount;
			if(sumCount != 0)
			    totalMultiple *= sumCount;
			sumCount--;
		}
		for (auto i : A) {
		    if(i <= (int)A.size()){
    			arrSum += i;
    			arrMultiple *= i;
		    }else{
		        return 0;
		    }
		}
		if ((totalSum - arrSum) + (totalMultiple - arrMultiple))
			return 0;
		return 1;
	}
	return 0;
}
```
ワイヤレスジャパン2018 Androidセッション めいどさんにたっちなう2018・おうちハック編～これからのRFIDが実現するタッチレスなお給仕～

[ワイヤレスジャパン2018](http://www8.ric.co.jp/expo/wj/)に参加してきましたのでその結果をまとめています。

内容の間違い、誤字脱字等はご了承ください。正確なところは、本家のサイトを参照いただければと思います。

# タイトル等

## タイトル
ワイヤレスジャパン2018 Androidセッション めいどさんにたっちなう2018・おうちハック編～これからのRFIDが実現するタッチレスなお給仕～

## 演者
* 大坂泰弘さん　日本Androidの会秋葉原支部／ハヤトインフォメーション

## 日時
2018/05/24 11:00-12:20のうち2回目

# 概要

NFCタグについて、とにかく実例を交えた応用方法など、NFCタグが使いたくなるセッションでした。

# すっかり身近になったNFC

NFCはすっかり身近なものとなっている。

NFCを広めるために、NFCワークショップ（NFCリーダーの上に置いたものが反応して光る簡単なLチカ）を行ったり、NFCタグの実演販売を行ったり、月間自動認識にNFCの記事を書いている。

# 実際にやってみたことや、実例

* CDジャケットにNFCタグ
    * 音楽を視聴する
* 洗濯機にNFCタグ
    * 取説を簡単にみる
* 子供のおもちゃにNFCタグ
    * おもちゃとリアルの世界をつなぐ。1枚50円60円のNFCタグを使えば、子供のおもちゃをつくることができる
* NFC仏壇
    * 仏壇の中にNFC対応のタブレットをつないでおくと、おもちゃに反応して撮りためた愛犬の写真が流れる
* 子供のテルテル坊主にNFCタグ
    * 天気予報を見せることで天気予報の概念がつく
* NFCタグでボタンを押す
    * 注文のページを行う。Amazonのオマージュ。
    * ピザハットスニーカーにNFCタグがあってタッチすると注文できるというようなことを行った。
* ロシアワールドカップのボールにNFCタグが付いている
    * タッチしないと読めないが、プレミアムコンテンツにアクセスするためのURLを表示する
* ユニクロは値段の中にICタグが付いている
    * セルフレジができるためのシステム。ICチップNFC13.65M　IC925M
* 大学のパソコンの貸し出し
    * 返却するとき台車にポンと乗っけるとすべて足りているときにだけOKとなる
    * 台車にリーダーをつけて、NFCIDをよめた時と読めなくなった時を契機として管理している
    * 金属に張るときは専用の金属タグが必要になる
* LED照明＋RFID
    * 鍵を探すときにLED照明の光り方で判断してくれるなど
* 子供の教科書にICタグ。
    * いくら言っても教科書を忘れる子供のために作った。ランドセルの外からICタグを見つけることで教科書が入っているかどうかを知らせてくれる。子供が面白がっている。
    * 安否確認や、学力との相関関係分析にも使えるかもしれない。
* しゃべる冷蔵庫
    * 冷蔵庫内入っているお茶の本数を読み上げてくれる。

**ICタグもNFCタグも盛り上がっている**

# メイドさんが使ってみた

鞄をなくしたときに、なくしたかばんを見つけるための実演。

* きりちゃん（メイドさん）のかばんがどこにいった？
    * ICタグを張っていれば、どこにあるかがわかる
* かばんの中身教えてよ
    * 誰がどこに何を入庫しようとしているか
    * 鞄の中に何がはいっているかを、スキャンしたりできる実演

# リソース

RFIDの用語、よくある質問と回答 
https://www.systemgear.com/products/acr122/rfid_word.html