OmniAICreator/Qiita-1.07M huggingface dataset:
言語処理100本ノックやってみる　15

#15. 末尾のN行を出力
自然数Nをコマンドライン引数などの手段で受け取り，入力のうち末尾のN行だけを表示せよ．確認にはtailコマンドを用いよ．

#解答
```py
frame="hightemp.txt"
n=int(input("自然数入力よろ"))

if n > 0:
  with open(frame) as f:#frameをfという変数に代える
    lines=f.readlines()#①ファイル全体をリストに読み込む
   
  for i in lines[-n:]:#②インデックス番号-n番目以降が範囲
    print(i.rstrip())#③末尾の空白文字を消去する
```

#参考記事
#①readlines()とは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/b7d1d341-b3d0-0752-a0c6-1d71f990c5dc.png)
https://www.sejuku.net/blog/62683
#②[ ]の使い方とは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/938632c1-1601-3894-3b97-422a15b3bb89.png)
https://magazine.tech-boost.jp/Programming-languages/python/1073478

#③rstrip()とは？(空白文字=スペース・タブ・改行)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/81e5bb5d-7828-d0fe-87e3-83b8b4c52ea1.png)
https://tonari-it.com/python-strip/

#UNIXコマンド確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/8d847f5d-4316-0b5a-4c57-bb7a244112d7.png)


##①Nを入力

```py
echo -n "自然数入力よろ"
read n
```

##②切り出す

```py
tail --lines=$n hightemp.txt
```
PostgreSQLでTIMESTAMPカラムにデフォルトでINSERT時刻を設定する場合

(ちょっと詰まっていろいろ試したので、備忘録に・・・)

```
psql -V
psql (PostgreSQL) 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1)
```

テーブル作成時・・・
```CREATE TABLE time_table ( time_column timestamp default "timestamp"('now'::text) );```

カラム変更時・・・
```alter table time_table alter column time_column set default "timestamp"('now'::text);```
IBM Tealeaf UI Capture SDK Release 5.6.0 の作成方法

# IBM Tealeaf UI Capture SDK Release 5.6.0 の作成方法
この記事では2019年9月にリリースされたIBM Tealeaf (Acoustic Experience Analytics) UI Capture SDK Release 5.6.0 の構成手順について記載します。
なお当リリースからこれまで提供されていたJQuery版は無くなり、w3c版のみとなりました。

##1. UI Capture SDKの入手
以下のURLからUI Capture SDK 5.6.0 (cxUICaptureJS.zip)をダウンロードし解凍します。

https://github.com/ibm-watson-cxa/SDK_Tools/tree/master/SDKPackages/tealeaf/UICapture

##2. JSファイルの作成
解凍したディレクトリ内のW3C/tealeaf.jsをコピーし、適当なファイル名（ここではtealeaf_5.6.0.js）を指定して保存します。
そのファイルの最後に解凍ディレクトリ内のdefaultconfiguration.jsファイルの内容を追加します。

##3. Pakoライブラリーの入手と設定
以下のURLからPakoライブラリーを入手します。
https://github.com/nodeca/pako/blob/master/dist/pako_deflate.min.js

入手したライブラリーのコードを#2で作成したJSファイルの先頭に追加します。

##4. JSファイルの編集
JSファイルのパラメーターを設定します。

①TLCookieモジュールを有効化（enabledをfalseからtrueに変更）

```js:tealeaf_5.6.0.js
TLCookie: {
    enabled: true
}
```

②endpoint：データポスト先のURLを指定。以下はAustraliaデータセンターの例。
③encoder: "gzip" を追加

```js:tealeaf_5.6.0.js
queues: [
    {
        qid: "DEFAULT",
        endpoint: "https://aucollector.tealeaf.ibmcloud.com/collector/collectorPost",
        maxEvents: 50,
        timerInterval: 300000,
        maxSize: 0,
        checkEndpoint: false,
        endpointCheckTimeout: 3000,
        encoder: "gzip"
    }
```

④domCaptureを有効化（enabledをfalseからtrueに変更）

```js:tealeaf_5.6.0.js
replay: {
    // DOM Capture configuration
    domCapture: {
        /**
         * NOTE: Enabling DOM Capture has significant implications on data transmission and infrastructure.
         * Hence this feature should be enabled judiciously. If enabled, it requires further configuration
         * to only perform the DOM Capture based on specific events and elements. Please refer to the
         * documentation for more details.
         */
        enabled: true,
```

⑤tlAppKeyを設定（アプリケーション固有の値を指定）

```js:tealeaf_5.6.0.js
TLCookie: {
    appCookieWhitelist: [
        { regex: ".*" }
    ],
    tlAppKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
```

基本的な構成手順は以上になります。
後は要件に応じてマスキング設定やパラメーター調整を行います。
iOS(Swift)でカラーピッカー [YSColorPicker]

iOSアプリ開発で簡単に使えるswift製カラーピッカーライブラリYSColorPickerを作成しました。とても簡単に使えてとても強力なカラーピッカーです。

![screenshot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492697/628a182e-0d1b-4fa5-42e0-f5fbd5a744f2.png)　![screenshot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492697/9a03cae5-f641-9622-2d31-a4e2b1f2b028.png)　![screenshot3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492697/e0017ec8-8556-639c-46c8-620597ad74e6.png)



[GitHubはこちら](https://github.com/sekies/YSColorPicker)

では早速使い方をみていきましょう！


# Features
- RGB
- RGBA
- HSB
- HSBA
- ColorPicker
- ColorPicker(alpha)
これらのモードから任意で複数選ぶことができます。

# Installation
### CocoaPods

Podfileに 

```:Podfile
use_frameworks!

pod 'YSColorPicker', :git => 'https://github.com/sekies/YSColorPicker.git'
```
と追加します。
pod install します。


# Usage
YSColorPickerをインポートします。

 ```Swift:ViewController.swift
 import YSColorPicker
 ```
任意のUIViewContorollerで`YSColorsTabViewControllerDelegate` プロトコルに準拠します。

 ```Swift:ViewController.swift
 class ViewController: UIViewController,YSColorsTabViewControllerDelegate {
 ```
カラーピッカーを使用したいタイミングで`YSColorsTabViewController`インスタンスを生成します。生成時に初期カラーとピッカーのタイプを指定します。  

  ```Swift:ViewController.swift
  let tabvc = YSColorsTabViewController(color: .blue, colorTypes: [
      .YS_COLOR_RGB,
      .YS_COLOR_RGBA,
      .YS_COLOR_HSB,
      .YS_COLOR_HSBA
  ])
  ```
カラーピッカーはTabViewControllerとして表示されます。viewの背景色、delegateを設定しモーダルで開きます。  
  ※delegateの設定はysColorDelegateですのでご注意ください。

  ```Swift:ViewController.swift
  tabvc.view.backgroundColor = .white
  tabvc.ysColorDelegate = self
  present(tabvc, animated: true, completion: nil)
  ```
  タイプの指定は以下の6種類から可能です。

  ```
  .YS_COLOR_PICKER,
  .YS_COLOR_PICKERA,  
  .YS_COLOR_RGB,
  .YS_COLOR_RGBA,
  .YS_COLOR_HSB,
  .YS_COLOR_HSBA
  ```
デリゲートメソッドを実装します。ピッカー上でカラーが変更されるたびにこのメソッドが呼び出されます。

  ```Swift:ViewController.swift
  func ysChanged(color: UIColor) {  
        print(color)  
  }
  ```
コードの全体像です。

  ```Swift:ViewController.swift
import UIKit
import YSColorPicker

class ViewController: UIViewController, YSColorsTabViewControllerDelegate {
    
    @IBOutlet weak var colorBtn: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func tapped(_ sender: UIButton) {
        let tabvc = YSColorsTabViewController(color: .blue, colorTypes: [
            .YS_COLOR_RGB,
            .YS_COLOR_RGBA,
            .YS_COLOR_HSB,
            .YS_COLOR_HSBA
            ])
        tabvc.view.backgroundColor = .white
        tabvc.ysColorDelegate = self
        present(tabvc, animated: true, completion: nil)
    }
    
    func ysChanged(color: UIColor) {
        print(color)
    }
}
  ```
GCIデータサイエンティスト育成講座の解答を作ってみた(6章)

[松尾研究室のGCIデータサイエンティスト育成講座](https://weblab.t.u-tokyo.ac.jp/gci%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E8%82%B2%E6%88%90%E8%AC%9B%E5%BA%A7%E3%83%BB%E6%BC%94%E7%BF%92%E3%82%B3%E3%83%B3%E3%83%86/ "松尾研究室のGCIデータサイエンティスト育成講座")
をやってみたところ、解答が無かったので、自分で作ってみました。
間違えていたらすみません、教えて頂けると嬉しいです

<練習問題 1>
下記の2つのデータテーブルに対して、内部結合してみましょう。

```
pd.merge(attri_data_frame5,attri_data_frame4,on="ID")
```
<練習問題 2>
attri_data_frame4をベースにattri_data_frame5のテーブルを外部結合してみましょう。

```
pd.merge(attri_data_frame5,attri_data_frame4,how="right")
```
<練習問題 3>
attri_data_frame4に対して、以下のデータを縦結合してみましょう。

<練習問題 1>
以前の章で使用した「student-mat.csv」のデータを使います。ageを2倍にしたカラムを追加してみましょう。

```
# chapter1で用意したデータがあるpathに移動して、以下を実行してください。例） cd pathの名前
student_data_math = pd.read_csv("student-mat.csv",sep=";")
student_data_math["d_age"]=student_data_math["age"].map(lambda x:2*x)
student_data_math
```

<練習問題 2>
上記と同じデータで、「absences」のカラムについて、以下の3つのビンに分けてそれぞれの人数を数えてみましょう。なお、cutのオプション設定で、デフォルトは右側が閉区間になっていますが、今回は0が入るためのright=Falseを追加してください。

```
#　分割の粒度
absences_bins = [0,1,5,100]
cut_ab=pd.cut(student_data_math.absences,absences_bins,right=False)
pd.value_counts(cut_ab)
```

<練習問題 3>
上記と同じデータで、「absences」のカラムについて、qcutを用いて3つのビンに分けてみましょう。

```
#　分割の粒度
absences_bins = [0,1,5,100]
cut_ab=pd.qcut(student_data_math.absences,3)
pd.value_counts(cut_ab)
```

<練習問題 1>
先ほど使用した「student-mat.csv」を使って「student-mat.csv」を使って、pandasの集計処理してみましょう。まずは、schoolを軸にして、G1の平均点をそれぞれ求めてみましょう。

```
student_data_math.groupby("school")["G1"].mean()
```

<練習問題 2>
次は、schoolと性別を軸にして、G1,G2,G3の平均点をそれぞれ求めてみましょう。

```
student_data_math.groupby(["school","sex"])["G1"].mean()
student_data_math.groupby(["school","sex"])["G2"].mean()
student_data_math.groupby(["school","sex"])["G3"].mean()
```
<練習問題 3>
次は、schoolと性別を軸にして、G1,G2,G3の最大値、最小値をまとめて算出してみましょう。

```
functions=["max","min"]
student_data_math.groupby(["school","sex"])["G1"].agg(functions)
student_data_math.groupby(["school","sex"])["G2"].agg(functions)
student_data_math.groupby(["school","sex"])["G3"].agg(functions)
```

<練習問題 1>
以下のデータに対して、1列でもNaNがある場合は削除し、その結果を表示してください。

```
# データの準備
import numpy as np
from numpy import nan as NA
import pandas as pd


sample_data_frame2 = pd.DataFrame(np.random.rand(15,6))

# NAにする
sample_data_frame2.ix[2,0] = NA
sample_data_frame2.ix[5:8,2] = NA
sample_data_frame2.ix[7:9,3] = NA
sample_data_frame2.ix[10,5] = NA


sample_data_frame2.dropna()
```

<練習問題 2>
上記で準備したデータに対して、NaNを0で埋めてください。

```
sample_data_frame2.fillna(0)
```
<練習問題 3>
上記で準備したデータに対して、NaNをそれぞれの列の平均値で埋めてください。

```
sample_data_frame2.fillna(sample_data_frame2.mean())
```
6.3.1 総合問題1
以前使用した「student-mat.csv」を使って、以下の問いに答えてください。

(1) 上記のデータに対して、年齢×性別でG1の平均点を算出し、縦軸が年齢、横軸が性別となるような表（テーブル）を作成しましょう。

```
student_data_math.groupby(["age","sex"],as_index=False)["G1"].mean()
```


(2) (1)で表示した結果テーブルについて、NAになっている行(レコード)を全て削除した結果を表示しましょう。

```
student_data_math.groupby(["age","sex"],as_index=False)["G1"].mean().dropna()
```
KibanaでLiferay7.2のElasticSearchを連携してINDEX確認

#はじめに
Liferayは7.2のバージョンをリリースしました。
中の検索エンジンはElasticSearchの最新の7.3ではなく、まだElasticSearchの6系です。

ElasticSearchのRestAPIを使って中身も確認できますが、
可視化のKibanaでLiferay7.2のElasticSearchを閲覧する手順をまとめてみました。

#Liferayとは
https://www.liferay.co.jp/en/

パーソナライズを実現する次世代ポータルプラットフォームです。
Osgiのフレームワークで対応し、モジュール開発は柔軟にできます。

#ElasticSearchのインストール
## ダウンロードし、解凍する
https://www.elastic.co/downloads/past-releases/elasticsearch-6-8-2

##プラグインをインストール
PowerShellを起動しbinフォルダーに移動
例：
`cd C:\Projects\elasticsearch-6.8.2\bin`

プラグインをインストール

```
.\elasticsearch-plugin install analysis-icu 
.\elasticsearch-plugin install analysis-kuromoji
.\elasticsearch-plugin install analysis-smartcn
.\elasticsearch-plugin install analysis-stempel 
```

## 設定ファイル変更
設定フォルダーに移動
`cd C:\Projects\elasticsearch-6.8.2\config`

elasticsearch.yml設定フィアル修正

```yaml
#cluster.name: my-application
cluster.name: LiferayElasticsearchCluster

#ローカルではKibana連携で認証不要にするため、xpackを無効化
xpack.security.enabled: false

```

##ElasticSearch起動
###binフォルダーに移動
`cd C:\Projects\elasticsearch-6.8.2\bin`

###起動
` .\elasticsearch`

### localost:9200 でアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/39cf440b-ffd9-0cb2-1651-fb1efff2eefe.png)

#Kibanaインストール
##ダウンロードし、解凍
https://www.elastic.co/downloads/past-releases/kibana-6-8-2

##Kibana起動
### binフォルダーに移動 
例：
`cd C:\Projects\kibana-6.8.2\bin`

###起動
` .\kibana`

###localhost:5601 でアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/a307e58c-9361-afd0-77d4-f04d738806c5.png)

#LiferayのElasticSearchをRemoteに変更
LiferayのデフォルトはElasticSearchはEmbeded版として利用しています。
別サーバ、別プロセスの場合はRemoteに変更する必要があります。

##Liferayのシステム設定画面に遷移
コントロースパネル⇒システム設定⇒検索⇒ElasticSearch６
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/8275ae65-049a-6d9b-ad30-44f5a219f49f.png)

クラスタ名は、ElasticSearch側のクラスタ名と同じものにし、動作モードをREMOTEに変更。
また、トランスポートアドレスも設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/41a5b4ca-d72d-b918-83ec-82c10910dbef.png)

##LiferayのINDEXの再構築
コントロールパネル⇒設定⇒検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/e2df842a-3f1a-1858-25f6-a58749225fca.png)

##KibanaにてINDEX確認
liferayのindexを見えました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/3115ca18-67f7-afd6-e7d3-7a35619fc1c4.png)

検索欄に条件を入れて結果にてドキュメントのデータを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/46b6f2a5-8398-5635-d621-b4709c06e737.png)


以上
統計検定2級日記 Day2

今日は出勤前に2時間くらい勉強した。
シャーペンと消しゴムと大学ノートと下敷きっていう懐かしさの極みみたいな勉強道具使ってる。楽しい。

いまやってるのはマセマの確率統計。
大学基礎数学って書いてあってちょうどいいレベルかなと思ってたんだけど、普通にむずい。
リハビリのつもりだったのに普通に勉強してる。
思い出せばもっとやりやすくなるだろうか。

確率らへんはほんと当時からろくにできてなかったから、今回しっかり固め直すってのもありかもな。

復習のはずなのに全然できなくて自己嫌悪高まってたけど、勉強なんだからできなくて当然かって気がつけて心の安寧を取り戻した。

後半チラッと見たんだけど、忘れたもなにもそもそも知らない単語いっぱいあって不安感襲ってきた。
ちゃんと勉強しよう。
ちゃんと用語を理解すれば理解できないほど難しいもんでもない、はず。

がんばろ。

# 重要単語

## 「事象A, Bは排反である」とは？
VRoidでモデルを作ってQuest版VRChatに持っていく

※若干グロい画像があります、注意してね！

みなさん、バ美肉してますか？

VRoidは絵心のない人でもそれっぽいアバターを作れる神のようなツールです
VRChat用のアバターを作る人も多いんではないでしょうか

VRoidのデータをPC版VRChatに持っていくには、この記事が参考になります。
https://shinrinmusic.com/vroid-vrchat-avatar-upload/

あと、足が地面にうまるという謎挙動で困っていたのですが、
こちらの記事に解消方法が書いてありました。
https://www.pixiv.net/fanbox/creator/3706458/post/467194

この記事はPC版VRChatへ持っていけたあと、Quest版にも対応するという内容ですので、
PC版まで持っていけてない人は上の記事を参考に持っていけるようにしてください。

まず、Quest版としたアバターをアップロードする方法です
・Switch PlatformでAndroidに切り替える
・PipelineManagerのBlueprintIDを対応するPC版のアバターと同じIDを入れる
・使うシェーダーをVRChat/Mobile/以下の物を使う

ここで問題になるのが、シェーダーが限定されていることです。
そして、このシェーダーではアルファチャンネルを使った透明化が出来ません。

具体的にこうなります
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/71862dcb-98c6-78bd-34b9-a1b2bf91d637.png) ![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/d8b82686-3ceb-245d-3db3-365302591729.png)

いわゆる深緑のところがだめな部分ですね

髪の付け根、まゆげ、まつげ、目の部分が深緑になっています。
ですから、この辺のだめなポリゴンは取っていきましょう！

これからやる作業は、PC版のアバターをコピーして別のディレクトリで行いましょう。
PC版のデータをいじる必要はないです。

Blenderを使い、ポリゴンを削除していきます。
削除するべきポリゴンは、編集モードでソリッドにすればわかりやすいです。
![blender1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/baf0cde3-1e0e-34b5-41c1-d10fd4319d81.png)

面選択にして、削除したいポリゴンを選択して、Lキーを押せば繋がったポリゴンが全て選ばれます。
DELキーを押して、面と辺を削除していきます。
目の中もポリゴンが二重になっているので片方をとります。

左目だけ処理しました。
化粧前っぽい感じだし、目のハイライトも消えています。
![blender2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/036dba58-1725-1625-c84c-30c639a9b5b4.png)

消したまつげとかを復元していきます。
再びUnityに持っていき、シェーダーをVRChat/Mobile/Toonlitにします。

あとは、顔のテクスチャを開いてまゆげとまつげを書き込みます。
まゆげ、まつげのテクスチャデータもあるのでそちらを使って
いい感じの大きさにしておいていくだけです。
まつげは目の形に沿って変形しないといけないので、
Photoshopのパペットワープの機能が役に立ちました。
![face.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/cf44f5be-c727-3433-5759-8d712180eb65.png) ![face2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/ab763af8-00ce-9b5d-f2b7-db2b5a628afc.png)

Unityが参照しているテクスチャに上書きすれば、
画面にすぐに反映されるので、それを見ながら調整します。
PhotoshopだとPNGでクイック書き出しってのがあるのでそれを使うのが便利ですね。

目のハイライトも追加します。こっちは大きさも変えなくていいので楽です。

髪の部分は透明な部分を肌色で塗り足してあげます。
![hair.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/016fb360-deb7-503d-4f59-ec7936a7cf86.png)

ということで、Quest版ができました。
結構明るめの色合いになっているので、髪色も黒くしています。
肌色の色味が若干違いますけど、調整しないといけないのはPC版かな？
![quest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985/2a5fe0bc-220f-84de-8fc0-21013bad79b2.png)

最近、VRChatもQuest民が増えているので、Quest対応していきましょう。

※Blenderの機能で、テクスチャの透明部分を取り除いて
メッシュ化する方法がありそうなんですけど、なんか知っていたらコメントほしいです。
[TypeScript] error TS6059: File is not under 'rootDir'. の対処法

表題のエラーに関して、詰まりましたのでメモを残しておきます。

## 症状

>error TS6059: File '.ts' is not under 'rootDir' '**'. 'rootDir' is expected to contain all source files.

TypeScriptの`tsc`コマンド実行時に、上記のエラーが発生します。

## 環境

*▼package.json*

```json
"typescript": "^3.6.2"
```

症状が発生するミニマムな設定は以下の通りです。

*▼tsconfig.json*

```json
{
  "compilerOptions": {
    "outDir": "./output",
    "rootDir": "./source"
  }
}
```

この環境で、`./source`ディレクトリ以外の場所に`.ts`という拡張子を持つファイルが存在すると表題のエラーが発生します。
この`.ts`ファイルはTypeScriptファイルでなくとも、ファイル名に含まれているだけでエラーが発生します。jestのテスト用ファイルや動画ファイルの拡張子にも反応します。

## 原因

この症状は、tscコマンドが実行されたディレクトリ以下のすべてのファイルを検索するために発生します。
`rootDir`オプションはtscコマンドのファイル検索範囲を制限しません。
このオプションは`outDir`にファイルを出力する際、ディレクトリ構成を維持するためだけに使用されます。

[参考リンク : tsc should not care and fail with ts files outside of rootDir](https://github.com/microsoft/TypeScript/issues/9858#issuecomment-370537216)

直感的には`rootDir`という設定があれば、そのほかのファイルはすべて無視するような気がしますが、tscコマンドはそのようには振る舞いません。

## 対策

解決策として、tsconfig.jsonに`rootDir`と`include`の両方のオプションを設定します。

*▼tsconfig.json*

```json
{
  "compilerOptions": {
    "outDir": "./output",
    "rootDir": "./source",
                 ^^^^^^^
  },
  "include": ["source"]
               ^^^^^^^
}
```

[参考リンク : tsc should not care and fail with ts files outside of rootDir](https://github.com/microsoft/TypeScript/issues/9858#issuecomment-370443762)

includeを使用することで、明示的に検索対象ディレクトリをtscコマンドに教えられます。
この設定により、includeディレクトリ以外のファイルは無視されるようになります。

以上、ありがとうございました。
初歩的な質問なのですが...

初歩的な質問で申し訳ありませんがよければ回答お願いします。

現在、プロを目指す人のためのRuby入門をしているのですが
if分を使うところなどで

status = 'error'
if status != 'ok'
  '何か問題があります'
end

ということをしているのですがputsを省略すると出力がされません。
unless文やcase文なども同様に出力されないのですが
どこに問題があるのでしょうか？

初歩的な質問で申し訳ありませんがご教授のほどよろしくお願いいいたします。
QVTKOpenGLWidgetの表示内容をファイルに出力する

QVTKOpenGLWidgetで表示中のデータをファイルにエクスポートする場合、3Dデータファイルであれば、
`vtkSmartPointer<vtkPolyData> part1 = vtkPolyData::SafeDownCast(actor->GetMapper()->GetInputAsDataSet());`
のようにvtkActorからpolyDataを取得し、[vtkXMLPolyDataWriterを使う方法がある](https://qiita.com/vs4sh/items/76d81ae8f9e03bfae7cf)

2D画像であれば表示中のactorを操作せずに出力することが可能である。この時使用するクラスはベクタフォーマットとラスタフォーマットで異なる。

#ベクタ画像への出力(vtkGL2PSExporter)
名前はPSExporterだがPS, EPS), PDF, SVG, TeXでの出力が可能(デフォルトはEPS)。

```code
auto exporter = vtkSmartPointer<vtkGL2PSExporter>::New();
exporter->SetRenderWindow(qvtkWidget->GetRenderWindow());
exporter->SetFileFormatToPDF();
exporter->SetFilePrefix("test.pdf);
exporter->Write();
```

#ラスタ画像への出力(vtkImageWriter)
vtkImageWriterはpure virtualなので、出力したいフォーマットに応じてその実装、vtkBMPWriter, vtkJPEGWriter, vtkPNGWriterなどを使う。

```code
// qvtkWidgetが QVTKOpenGLWidgetインスタンスのポインタとする
auto writer = vtkSmartPointer<vtkPNGWriter>::New();
writer->SetFileName("test.png")
auto filter = vtkSmartPointer<vtkWindowToImageFilter>::New();
filter->SetInput(qvtkWidget->GetRenderWindow()); // 引数はvtkRenderWindow *
writer->SetInputData(filter->GetOutput());
filter->Update();
writer->Write();
```
iOS(Swift)でラジオボタン[YSRadioButton]

iOSアプリを開発していてブラウザ標準のようなラジオボタンを使いたいと思ったことはありませんか？そんな時のためにシンプルなデザインのswift製ラジオボタンライブラリを作成しました。各種プロパティを設定することでデザインもある程度自由に変更することができます。

![Sep-05-2019 10-48-11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492697/5d78126a-024e-8644-abcc-5248b7412507.gif)![radioButton3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492697/601bfa1d-438b-5906-8b7f-c29337bc680e.gif)![radioButton2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492697/2ffc495d-2b23-d26e-61d2-a0f6e7f96faa.gif)


[GitHubはこちら](https://github.com/sekies/YSRadioButton)

CocoaPodsでインストールできるのでとても簡単です。それでは早速インストールの手順を説明します。

### CocoaPods

Podfileに 

```:Podfile
use_frameworks!

pod 'YSRadioButton', :git => 'https://github.com/sekies/YSRadioButton.git'
```

 と追加します。

pod install します。


# Usage
YSRadioButtonをインポートします。

 ```Swift:ViewController.swift
 import YSRadioButton
 ```

任意のUIViewContorollerで`YSRadioButtonViewControllerDelegate` プロトコルに準拠します。 

 ```Swift:ViewController.swift
 class ViewController: UIViewController,YSRadioButtonViewControllerDelegate {
 ```

`YSRadioButtonViewController`インスタンスを生成します。生成時にラジオボタンのラベルを配列で指定します。  

  ```Swift:ViewController.swift
  let radio = YSRadioButtonViewController(labels: ["Orange","GrapeFruits","Banana"])
  ```
delegateと各種デザインプロパティを設定します。必須となるのはdelegateのみです。

  ```Swift:ViewController.swift
  radio.delegate = self  
  radio.font = UIFont.systemFont(ofSize: 18)
  radio.labelColor = .black
  radio.labelMargin = 0
  radio.lineWidth = 1
  radio.radioHeadFillSize = 0.6
  radio.radioHeadMargin = 5
  radio.radioHeadStroke = .darkGray
  radio.radioHeadFill = .red
  ```
親UIViewControllerに生成したYSRadioButtonViewControllerをaddChildしコンテナとなるUIViewにYSRadioButtonViewControllerのviewをaddSubviewします。ラジオボタンの位置はコンテナとなるUIViewに依存します。

  ```Swift:ViewController.swift
  addChild(radio)
  radio.view.frame = container.bounds
  container.addSubview(radio.view)
  radio.didMove(toParent: self)
  ```

デリゲートメソッドを実装します。ラジオボタンを選択するとこのメソッドが呼ばれます。YSRadioButtonViewController生成時に追加した配列の順にIntが割り振られます。

  ```Swift:ViewController.swift
  func didYSRadioButtonSelect(no: Int) {
    print(no)
  }
  ```
コードの全体像です。

  ```Swift:ViewController.swift
import UIKit
import YSRadioButton

class ViewController: UIViewController, YSRadioButtonViewControllerDelegate {

    @IBOutlet weak var container: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let radio = YSRadioButtonViewController(labels: ["Orange","GrapeFruits","Banana"])
        radio.delegate = self  
        radio.font = UIFont.systemFont(ofSize: 18)
        radio.labelColor = .black
        radio.labelMargin = 0
        radio.lineWidth = 1
        radio.radioHeadFillSize = 0.6
        radio.radioHeadMargin = 5
        radio.radioHeadStroke = .darkGray
        radio.radioHeadFill = .red

        addChild(radio)
        radio.view.frame = container.bounds
        container.addSubview(radio.view)
        radio.didMove(toParent: self)
    }
    
    func didYSRadioButtonSelect(no: Int) {
        print(no)
    }
    
}

  ```
suicaに仕事用とプライベート用の２つをAppleWalletに設定して使い分ける方法

交通系ICカードのモバイルsuicaを使える店舗は多く、決済処理も早いのでとても便利です。
日常的に使っている方は多いのではないでしょうか。

個人事業主（フリーランス）の方や法人の方など、家計簿の管理上ビジネス用の交通費専用のsuicaと
その他コンビニや飲食で使うプライベード用のsuicaを分けたいことはないでしょうか？

AppleWalletでsuicaを２枚以上設定する方法があるのでメモです。

## AppleWalletから２枚目を追加する

Suicaの追加はSuicaアプリから行います。
右上の「＋」ボタンから追加ができます。
アプリから新規で発行もできますし、既存のカードから取り込むことも可能です。
発行の場合は「My Suica(記名式)」にして使用用途の名前をつけておくと分かりやすいかと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/296b9fd8-88d0-655c-faa7-b2d6b2bda30b.png" width="320px">

## エクスプレスカード設定とAppleWalletで優先度を設定する

次に重要なのは使い方ですね、

TouchIDやFaceIDの認証なしで決済できるカードの設定を**エクスプレスカード**といいます。
（認証なしで改札通る時にピッと通れますよね）

それとは別に認証が必要なカードの優先度を別途設定します。

認証は、画面ロック状態で

* TouchIDタイプのデバイスの場合は、ホームボタンを２回連続押し
* FaceIDタイプのデバイスの場合は、電源ボタンを２回連続押し

でAppleWalletの認証を起動できます。（クレジットカードなどと同じです）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/0620ea5b-fc15-fac6-70e0-ece26bf631b6.png" width="320px">

この際、認証されるカードの指定はAppleWalletでの優先度設定が高いものになります。

優先度は、

AppleWalletでカードを下記のように一番手前に持ってくることで優先度を高くできます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/011373b2-76b2-e0c8-1c9a-e2147438d352.png" width="320px">

基本は交通系で使うカードをエクスプレスカードに、
買い物で使うカードをTouchID、FaceIDで認証するものにすると使いやすいと思います。
最近見つけたVSCodeのいい感じのコマンド

大体個人用メモ
[関連記事1](https://qiita.com/xx2xyyy/items/2375606278f125501349)
[関連記事2](https://qiita.com/xx2xyyy/items/00bcbb5466e5dd97f71c)

# Find All References Shift + Alt + F12
選択している要素の呼び出し元の一覧を探索できる。
Typescriptで修正範囲を確認する場合にとても便利。

# Ctrl + Shift + Rのリファクタ
範囲指定してコンテキストメニューからでも可。
スコープを指定して関数を切り出す
``Extract Function in　XXX Scopr``辺りがとても便利。
ごちゃごちゃしたロジックの見通しを良くするために。
定数切り出しも出来る。

# Run Task
今までこれを知らずTerminalに移動して自分でyarnを叩いていたが、これを使えば
package.jsonからnpm scriptsを読み取って生成したタスクや自分で登録したタスクをコマンドだけで実行できる。
デフォルトだとnpmでしかタスクを自動読み取りしてくれないが、yarn系拡張を入れればyarnにも対応可能。
ただし、導入後に再起動しないと反映されないのには注意。

# ToggleMiniMap
エディタの横のミニマップの開閉。
全画面でエディタを出してくれている場合は分かりやすいが、
画面分割してエディタグループを増やしている時はこれにスペースを割きたくない。
状況によって使い分けるべき。

# ToggleRenderWhiteSpaces
空白文字の表示非表示切替。
出しておいた方が色々事故らないと個人的には思う。

# Toggle Block Comment Shift Alt A 
ブロックコメントの開閉。
languageModeに応じて上手くやってくれる賢い子。
ラインコメントはCtrl + /

# Split Terminal Ctrl + \
Terminalを横に割る　と思いきやTerminal以外でも横方向に均等に割れる。

# Go To Symbol in WorkSpaces Ctrl + T
ワークスペース全体からシンボルを検索できる。
便利そうだが若干動作がもっさり。(全走査だから仕方ないが)
【Ethereum on Raspberry Pi】GethをインストールしてRinkebyテストネットに接続するまで

#概要
Raspberry PiでEthereumクライアントを動かす方法。
フルノードでもライトクライアントでも動かせます。

#手順
1. Raspbianをインストールする
2. Gethのバイナリファイルをダウンロードする
3. Ethereumのテストネットに接続する

##1. Raspbianをインストールする
[こちら](https://qiita.com/tktktktk/items/aff737aa477744d99a1d
)の記事を参考にDebian系OSのRaspbianをインストールする。

##2. Gethのバイナリファイルをダウンロードする
Raspberry PiのCPUアーキテクチャを以下のコマンドで確認します。

```shell:
$ uname -m
//例
armv7l
```

[こちら](https://geth.ethereum.org/downloads/)のサイトからGethのバイナリファイルをダウンロードします。

Linuxのタブを選択して、所持しているRaspberry Pi のCPUのアーキテクチャにあったバージョンをダウンロードします

<img width="1155" alt="スクリーンショット 2019-09-05 10.58.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/23790117-7dd2-9743-aa7a-87cad439ef48.png">

以下のコマンドで解凍してgeth本体が置いてあるディレクトリに移動します。

```shell:
$ tar -xf ダウンロードしたファイルのパス
$ cd 解凍したファイルパス
```

以下のコマンドでgethをインストールします。

```shell:
$ sudo mv geth /usr/local/bin
```

インストールできたかを確認します。

```shell:
$ geth version
```
各種環境の情報が表示されたらOK。


##3. Ethereumのテストネットに接続する
今回はライトクライアントでRinkebyに接続します。

```shell:
$ geth --rinkeby --syncmode "light"
```

コンソールモードでEthereumテストネットと対話してみます。

```shell:
$ geth attach ~/.ethereum/rinkeby/geth.ipc
```

試しに現在のブロック高を表示します

```shell:
> eth.blockNumber
5034155
```

表示されたら成功！

#Happy Hacking :sunglasses: !

#参考
https://github.com/ethereum/go-ethereum
tmux2.9aにアップデートしたらマイグレーションが必要だった

## 環境
```
% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.6
BuildVersion:   18G95
```

### 事象
Macでtmuxを使っていた。
`.tmux.conf`を用意してカスタマイズして使っていた。
このとき、homebrewを使って `brew upgrade` をしてtmuxをバージョンアップしたときに差異を発見。

### バージョン 2.9aを使用
```
% tmux -V
tmux 2.9a
```

#### 警告
```
/Users/hoge/.tmux.conf:114: invalid option: status-attr
/Users/hoge/.tmux.conf:117: invalid option: window-status-fg
/Users/hoge/.tmux.conf:118: invalid option: window-status-bg
/Users/hoge/.tmux.conf:119: invalid option: window-status-attr
/Users/hoge/.tmux.conf:122: invalid option: window-status-fg
/Users/hoge/.tmux.conf:123: invalid option: window-status-current-bg
/Users/hoge/.tmux.conf:124: invalid option: window-status-current-attr
/Users/hoge/.tmux.conf:127: invalid option: pane-border-fg
/Users/hoge/.tmux.conf:128: invalid option: pane-active-border-fg
/Users/hoge/.tmux.conf:131: invalid option: message-bg
/Users/hoge/.tmux.conf:132: invalid option: message-fg
```

どうも書式が変わってしまったようだ。

### CHANGES FROM 2.8 to 2.9
relase：https://raw.githubusercontent.com/tmux/tmux/2.9a/CHANGES

2.8と2.9の違いより

```
* The individual -fg, -bg and -attr options have been removed; they
  were superseded by -style options in tmux 1.9.
```

`-fg`, `-bg` と個々に設定していたがなくなったようだ。
`pane-active-border-fg` や `window-status-current-bg` の設定に `invalid option` と言われる理由はここ。


### マイグレーションする
参考：[tmux v2.9 マイグレーションガイド 〜 tmux をv2.9 に上げたらinvalid option エラーが出た - Qiita](https://qiita.com/TsutomuNakamura/items/663b8e456768f29e37ed)


こちらより便利ツールの紹介あり。

[For tmux configs: Merge deprecated/removed -fg, -bg, and -attr options into the -style option · GitHub](https://gist.github.com/tbutts/6abf7fb5b948c066bf180922fb37adcf)

これを使って実行するとさくっとマイグレーションすることができた。

### 変更点より差分例
- status-style ... status barの色変更

```diff
-set-option -g status-bg black
-set-option -g status-fg yellow
-set-option -g status-attr dim
+set-option -g status-style bg=black,fg=yellow,dim
```

- windows-status-style ... window titleの色変更

```diff
-set-window-option -g window-status-fg blue
-set-window-option -g window-status-bg black
-set-window-option -g window-status-attr dim
+set-window-option -g window-status-style fg=blue,bg=black,dim,fg=brightblue
```

- window-status-current-style ... active window tilteの色変更

```diff
-set-window-option -g window-status-fg brightblue
-set-window-option -g window-status-current-bg blue
-set-window-option -g window-status-current-attr dim
+set-window-option -g window-status-current-style bg=blue,dim
```

- pane-border-style / pane-active-border-style

```diff
-set-option -g pane-border-fg black
+set-option -g pane-border-style fg=black
-set-option -g pane-active-border-fg brightgreen
+set-option -g pane-active-border-style fg=brightgreen
```

- tmessage-style ... textの色

```diff
-set-option -g message-bg black
-set-option -g message-fg brightred
+set-option -g message-style bg=black,fg=brightred
```

色はひとそれぞだが、変更箇所の例として紹介する。
[覚書] gitコマンド逆引き [git command]

# ざっくりまとめ
### 修正中内容は残したままどうにかこうにか処理したい。
`reset --hard`ではなく`reset --soft`など、softで行う。

### 変更修正を反映させたくないファイル設定
 * 常にunstaged
`git update-index --assume-unchanged [ファイル名]`

https://qiita.com/usamik26/items/56d0d3ba7a1300625f92

### ローカルブランチを別名のリモートブランチにpush
`git push local_branch:remote_branch`

# commitで困った時
### 自身の修正内容の次にcommitする
`git pull リモート名 ブランチ名`
 * commit履歴がmasterなどとずれるが、コンフリクトしていないのであれば問題ない。
 * masterなどにプルリク後mergeされる際には追加修正分だけきちんとのる。
 
### 自身の修正前にmaster(リモートブランチ)をpullする
`git pull --rebase リモート名 ブランチ名`
    * rebaseなので、修正箇所以外の変更履歴に齟齬があると動作しない。
    * コンフリクトだと思って直すと、commit番号が変わる。
    * 問題なく動作すれば、コミット履歴がmasterなどと同じ状態になるため、確認しやすい

### 別のブランチに特定のコミットをマージしたい場合。
` git checkout branch_name `
` git cherry-pick コミット番号 `

### 特定のファイルだけ、以前のcommitの状態に戻す方法
` git checkout コミット番号 ファイルパス`

# 別のリモートに関わる時
### 別のリモートを追加する
`git remote add リモート名(任意) リモートURL`
`git fetch リモート名`
※ここで、`fetch`をしていないと、以下のようなファイル確認等ができない。

### 別のリモートのファイル確認
`git show リモート名/ブランチ名:./ファイル名`
    * 場所は同じところでやるか、パス指定するっぽい

### 別のリモートから特定のファイルやディレクトリを取り込む場合
`git checkout リモート名/ブランチ名 ./ファイル名`
    * 場所は同じところでやるか、パス指定するっぽい

# pullした後困った時
### 直前のpullを全て無かったことにする
`git reset --hard ORIG_HEAD`

### ローカルブランチをリモートブランチの内容で上書き
`git reset --hard リモート名/ブランチ名`
 
###直前の変更分を残したままにできる。
`git fetch リモート名`
` git reset --soft FETCH_HEAD`

# 特定のブランチ切る時
### 特定のコミット番号からブランチを切る方法
`git checkout -b ブランチ名 コミット番号`

### 特定のremoteブランチからローカルブランチ切る方法
`git checkout -b ブランチ名 リモート名/ブランチ名`
AWSでボリューム増やしただけでは実質的なスペックは上がらない

# EBSをアタッチした
AWSのコンソール上からEBSを使ってボリュームサイズを拡張しました。ポチポチでできてしまったので、簡単かと思っていました。しかし、これは物理システム上で増えただけで実際のスペックアップにはなっていません。

```
$ lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  150G  0 disk
├─nvme0n1p1   259:1    0    8G  0 part /
└─nvme0n1p128 259:2    0    1M  0 part
```

現に、dfコマンドを使用すると、

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        1.9G   56K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/nvme0n1p1   99G   89G     0 100% /
```
となっており、ディスク容量を確認してみると、Avail部分、つまり使用可能になっている枠が0になっていることがわかります。つまり、これはまだディスク装置としてのファイルシステムとしては拡張されていないことを意味します。

##　何をしなくてはならないのか？
必要な手順としてEBSを利用するためのパーティションを作り、ファイルシステムを拡張するという２つの手順をふむ必要があります。

- **パーティションとは**
OSに一般的に備わっている機能の１つ。記憶領域系に作ることができる。システム領域とデータ領域を分けておけば、データ量が大きくなった時にシステム領域を圧迫することがなくなったり、システムを初期化する際に楽だったりする。

- **ファイルシステムとは**
ファイルシステムもまたOSの機能の1つで、永続的にデータを保存できる記憶装置（ストレージ/外部記憶装置）内部の記録状態を管理・制御し、区画分けし、そのどこに何が記録されているかを記録する管理領域を作成し、書き込みや読み出しができるようにするシステムである。

ここまでの手順を踏んでようやく増やしたストレージを利用することができるようになる。

## 実際に作ってみます
### パーティションを作る
これを行うために使用するコマンドは、growpartコマンドです。

```
# growpart デバイスパス　パーティション数

##今回の場合の引数はこんな感じになる
# growpart /dev/nvme0n1 1
```

これを行うことによって、

```
$lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  100G  0 disk
├─nvme0n1p1   259:1    0  100G  0 part /
└─nvme0n1p128 259:2    0    1M  0 part
```

増えていることが確認できます。

###  システムファイルを拡張
続いては、resize2fsコマンドでシステムファイルを拡張していきます。

```
# resize2fs /dev/増やしたデバイス名

##今回の場合の引数はこんな感じになる
# resize2fs /dev/nvme0n1p1
```

そうすると、再びdfコマンドを打ってみると、

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        1.9G   56K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/nvme0n1p1   99G   89G  9.7G  91% /
```

反映されているのがわかると思います。これでようやくEBSをスペック向上になったことになります。

# 素朴な疑問:マウントとは何が違うのか？

[環境移行作業で経験したことまとめ[インフラっぽい編]
](https://qiita.com/Nedward/items/1b6df89fba79e6bb2e5e#mysql%E3%81%AE%E6%8B%A1%E5%BC%B5%E7%94%A8%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%82%92%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%99%E3%82%8B)

以前の記事の中で書いたものはlsblkコマンドまで使用して確認した後はmountのコマンドを使ったわけですが、今回のスペックアップの手順をする前はてっきり以前やった作業からマウントすることを連想してこちらの手順をしようと思ったわけですが、違うと言われたので、違いを明確にしておきたいところです。

- **マウント**

> OSがファイルシステムを介してストレージデバイス上のファイルやディレクトリを利用できるようにすること。

ということだそうで、こうしてみると、ファイルシステムを作成するところまではなんだか使用しているコマンドの違いを除けば本質的にやっていることは同じに見えます。
が、マウントとファイルシステムを拡張する行為はそれぞれ用途別に分けている節があるので、考察として、両者の違いは今回やったやつだとEC2自体のスペックが上昇していますが、マウントしている場合はあくまでEBSが外部ストレージ的な役割のみを果たしている・・・ようなイメージですが、間違っていたらここの部分に指摘をください。
NotificationMessageクラス（MVVM Light Toolkitリファレンス）

# NotificationMessage
## 概要

```csharp
public class NotificationMessage : GalaSoft.MvvmLight.Messaging.MessageBase
```

- 文字列のメッセージのクラス。

##### 名前空間
- `GalaSoft.MvvmLight.Messaging`

#### アセンブリ
- GalaSoft.MvvmLight


## メソッド
### コンストラクター
<details><summary>コンストラクター</summary><div>

```csharp
public NotificationMessage(object sender, object target, string notification)
public NotificationMessage(object sender, string notification)
public NotificationMessage(string notification)
```

##### 概要
- `notification`がメッセージ本体の文字列。
- `sender`は、メッセージの送信者となるオブジェクト。
- `target`は、メッセージの受領者となるオブジェクト。メッセージの配信には影響しない。つまり、メッセージの受領者として指定した`target`以外のオブジェクトにも、メッセージは配信される。したがって、メッセージが自分宛であるかどうかは、メッセージの受領したオブジェクトが判断する。
</div></details>


## プロパティ
### Notification
<details><summary>Notification</summary><div>

```csharp
public string Notification { get; private set; }
```

##### 概要
- メッセージとして渡す文字列を戻す。
</div></details>


## 参照
- [目次](https://qiita.com/h084/items/c5355fa734936c56ca50/)
- [MessageBase](https://qiita.com/h084/items/9e8e8745b296f93442ac)
【WordPress】小技集

メモ書きしていきます。


※例ではechoとprintが混ざってるかもしれませんが特に意味はないです。
強いていえば実際にコードに埋め込むときはechoで、変数になにが入ってるのかな。って確認するときはprintを使ってますが、php初心者なので多分間違ってます。

## 投稿ページとかのカスタマイズで使える系
 
### 検索された文字列を取得したい

```php
echo get_search_query();
```

### 現在のカテゴリー名を取得したい

```php
print get_queried_object()->name;
```

クリックされたカテゴリ名を取得したいときに使えます。


### ページ番号を取得したい

```php
echo $paged;
```


## 管理画面のカスタマイズで使う系

### テキストエディタのクイックタグを削除


```php

add_filter( 'quicktags_settings', function ( $qtInit ) {
        // $qtInit['buttons'] = 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,fullscreen';
        // 上記文字列から不要なタグを取り除く
        // 以下の形だと、strongのクイックタグのみが表示される
        $qtInit['buttons'] = 'strong';
        // ちなみに全部削除したい場合は、
        // $qtInit['buttons'] = 'dummy';
        // とでも書いておく。（''だとなぜか全部表示されてしまう）

        return $qtInit;
} );

```
v-slot="{ validate, errors }" をIE１１で使えるようにするには

#v-slotの書き方 for IE11
先日、VeeValidate の ValidationProviderを使っていて、v-slotの書き方でIE11に対応したときの備忘録です。

vue.js のv-slotの指定方法で、IE11以外だと

```html:a.js
<ValidationProvider v-bind:rules="'required|max:20'" name="'ほげ'" v-slot="{ validate, errors }" slim>
    <input v-bind:value="value"
       @input="validate($event)"
    />
    <span id="error">{{ errors[0] }}</span>
</ValidationProvider>
```
て書けるのですが、IE11だとスクリプト言語仕様によりスクリプトエラーになってしまいます。

IE11に対応した書き方をするには、以下のようなコードにすることで対応可能なことがわかりました。

```html:b.js
<ValidationProvider v-bind:rules="'required|max:20'" name="'ほげ'" v-slot="slotProps" slim>
    <input v-bind:value="value"
       @input="slotProps.validate($event)"
    />
    <span id="error">{{ slotProps.errors[0] }}</span>
</ValidationProvider>
```

*IE11*
*vue.js v2.6.10*
*vee-validate v2.2.15*
AWSの超基本的なお話し

はいど～も～
記念すべき第２回目の投稿で～す。
ということで前回とはまた違うお話ですが、今日の話は<b>AWS</b>についてです！
なぜAWSの話かといいますと、Railsでアプリ作ったとしても
どうやってアップロードしたらみんなにサービスを提供できるのだー！？
ってなったときに知ったのが、AWSだったので
備忘録として残していきます～！（いぇ～い）


<h1>そもそもAWSって何？</h1>
そう！今日のお話しはAWSです。
<b>AWSって何？</b>って人もいるかと思いますので説明していきますね。

```
Amazon 社内のビジネス課題を解決するために生まれた 
IT インフラストラクチャのノウハウをもとに、
2006 年、アマゾン ウェブ サービス（AWS）は
ウェブサービスという形態で、企業を対象に 
IT インフラストラクチャサービスの提供を開始しました。
クラウドコンピューティングの主なメリットの1つは、
必要な時に、必要なだけ、低価格で IT リソースを
提供することができることです。クラウドを使用することで、
企業はもはや数週間・数ヵ月も前から、
サーバーや他の IT インフラストラクチャを
計画・調達する必要がなくなります。
クラウドなら、即座に何百・何千ものサーバーを数分で起動し、
迅速に結果を出すことができます。
```


引用元： https://aws.amazon.com/jp/about-aws/
まぁ公式ページではこんな感じで説明してますね～（堅苦しい言葉得意じゃないやつ←）

簡単にまとめると

◆Amazonはすごいからインフラ環境をクラウドサービスで
　提供できるようにしちゃったぜぃ
◆今までオンプレ（機械）とか準備してたのが不要に
　なっちゃうサービス作ったんだぜぃ

ってこと。（すげーーーー）
なので、企業とかからしたらコストがかなり浮くし、
個人でもサーバーとかの準備がすごーく楽になったってことですね！

ということでさっそく<a href="https://qiita.com/sinkuro06/items/8efb211d29cbe9cf2a04">次回</a>！AWS触っていきましょう！

次回：https://qiita.com/sinkuro06/items/8efb211d29cbe9cf2a04
SWESTに参加するときに心がけるとよいかもしれないこと。仮説（181）

SWEST
http://swest.toppers.jp/

宿泊型行事。
# 心がけるとよいかもしれないこと
## 自分が何がやりたいか
自分探しに来てもいい。
いろいろな発表を聞いたり、
いろいろな作業をしたり、
いろいろな人と話しをしたり、
自分が何がやりたいかが見つかるかもしれない。

## 聞く側よりも、話す側、でなければ主催者
参加するだけより、話す側で参加した方がよい。
毎年、行事の募集をしていて、企画の通る可能性は50%以上。
場合によっては、他の企画と統合してという話になることはあっても、
頭っから駄目という場合は少ない。

企画がうまくたてられない場合は、実行委員になって主催する側に回るとよい。
## 同部屋の人は大切に
同じ部屋になった人と、いろいろ話しはきいてみよう。

５人部屋だと、知らない人が４人いる。
その人たちと、一宿一飯の縁ができるのはめったにない。

学生だからと上から目線で話すだけでなく、その学生が何をやりたいかを聞くとよい。
年寄りだから使えないと見下すのではなく、その人の一番よかった経験を聞くとよい。
## 手を動かそう
できれば、期間中に一度はコンパイルしよう。
インタプリタであれば走らせよう。

口だけで偉そうにしている人たちはいっぱいいる。
そういう人たちの話は、本当に役に立たない。

手を動かす人の話は面白いだけでなく、自分で再現できる。
## 報告の書き方
### 案1 日報式
わかったこと、わからなかったこと、よかったこと、あらためるとよいことなどを単元ごとに書くとよいかも。

仮説(73)プログラマの「日報、週報、月報、年報」考
https://qiita.com/kaizen_nagoya/items/97ad8ac9217c12c3bb69

### 案2 作業記録式
実際に手を動かしたことを、dockerにあげておくとよい。
あとで、続きをするのに便利。
githubのbranchを切っても、issueをあげてもよい。

docker(18) なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2
### 案3 次回講師式
次回、自分が講師なら、ここをこう直すとか、
こういうことをやるとか、仕事場に戻って、教育するときの資料を作ってしまえばよい。

IT教育の基本としてきたこと
https://qiita.com/kaizen_nagoya/items/efeed472847aa4fcc835
# 耳寄り情報
## 帰りの特急券は指定を購入しておくこと
帰りの特急は行事が終わって帰る人でいっぱいで、
自由席が溢れることがある。
その時点で、特急券は売り切れて満席になっていることがある。

前日には購入しておくとよい。

私は今回、初めて購入した。
## 多治見経由の方が安い人たち。
名古屋東北部、春日井、東濃地方、長野県から来る人は、中央線で多治見乗り換えで、
太多線で美濃太田まででると安い。

おまけに、多治見で一旦改札を出て精算し、美濃太田でも改札を出て精算するとなお安い。
多治見＝美濃太田間は、あらかじめ切符を買っておかずに、交通カードを使うとよい。

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
teratermの文字がぼやけているときの対処

teratermのメニューやログイン時のウィンドウの文字がぼやけているなと
感じたときは以下の方法を試してみるといいかも。

# 設定方法

![teraterm04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/bcaf4e50-2c18-b9df-c85f-5c9eb72e5e8d.png)
![teraterm05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/10e704bb-8a39-aa18-4f9f-0fe07ccd98e7.png)

# 設定前と設定後の比較

## 接続

![teraterm01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/90a6dffa-68bf-afa4-f1db-02bc23c2b7a5.png)
![teraterm06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/c6381d9b-e2c2-955d-3944-47ec74b5fd60.png)

## ログイン

![teraterm02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/1aa48c55-a674-ed43-bf36-01905f3e733c.png)
![teraterm07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/1cd3a98f-1ea8-6570-7333-d02d965fcaf5.png)

## コンソール

![teraterm03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/00c98b27-a694-c199-1f6a-a7007608c056.png)
![teraterm08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/a072a13e-ce39-b882-1811-43a1ac9e7bd4.png)

# 注意

* 全体的に文字やウィンドウが小さくなる
* メニューやコンソールを日本語使っている場合はフォント設定を日本語フォントに変えてみよう
  * デフォルトはTerminalというフォントなので日本語表示は微妙。。
* 利用しているモニターの解像度にもよるのでモニター変えてみるといいかも
  * HDMIで高解像モニターを使っていると表示も綺麗だった(というか高解像なので人が気にならないぐらいのドットになったのかな)
【エラー対処】Electronでレンダラープロセスrequireができない


# はじめに

[Electronでアプリケーションを作ってみよう](https://qiita.com/Quramy/items/a4be32769366cfe55778)

を参考に、とりあえず書いて真似させていただきながら書き方を勉強していました。

しかし、「アプリっぽく」の

```javascript:index.js
'use strict';

//electronの読み込みができない
const electron = require('electron');

const remote = electron.remote;
const fileUtil = remote.require('./lib/fileUtil');

//当然ここも動かない
fileUtil.fetchReadmeList(function(err, matches) {
  if(!err) document.write(matches.join());
});
```

のところでconst electronの読み込みがうまく行きませんでした。

# 改善策

Electronのメインプロセス側で

```javascript:main.js
const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;

let mainWindow = null;

app.on('window-all-closed', function() {
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

app.on('ready', function() {

    // nodeIntegrationをtrueに！！！
    mainWindow = new BrowserWindow({width: 800, height: 600, webPreferences: {
        nodeIntegration: true
        }});
    mainWindow.loadURL('file://' + __dirname + '/index.html');

    mainWindow.on('closed', function() {
        mainWindow = null;
    });
});
```

nodeIntegrationプロパティをtrueにすると
きちんとHTMLで読み込んだindex.jsから、requireすることができました。

# どうしてうまく動かなかったのか？

![IMG_0162.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211482/f77f4464-0f3a-a8b3-c87e-4c5865972211.jpeg)

うまく動かなかった理由は、Electronの仕組みにあります。

## プロセス

Electronでは２つのプロセスがあります。
メインプロセスは、Node.jsの機能をすべて触ることのできるものであり、一つのプロセスしかありません。
そして、ユーザからすると目でみることができません。
（見えるとすれば、Macなどでは、左上にあるメニューバーに当たります。）

レンダラープロセスは、ChoroniumからHTMLを読み込んで描画する、いわゆるウィンドウのプロセスです。
当然、ウィンドウは何枚でも出せるので、レンダラープロセスは何個でも作れます。
このレンダラープロセスはメインプロセスから生成されます。

このとき、これらメインプロセスとレンダラープロセスはそれぞれ別々であることに注意してください。

## セキュリティ

レンダラープロセスはユーザが触ることができます。
なぜならば、普段自分たちが使っているChromeのように、画面がでます。
そして、キーボードからの入力やマウスクリックを可能とします。

このような性質から、レンダラープロセスでユーザが悪い操作をすると
メインプロセスと同じNode.jsの機能すべてを触ることができます。
Node.jsはfsというディレクトリ管理系も持っているため、すべてのファイルを削除してしまう！ということも可能であり、危険です。

そのため、Electron version5からは

```javascript
    mainWindow = new BrowserWindow({width: 800, height: 600, webPreferences: {
        nodeIntegration: false
        }});
```

となっていて、レンダラープロセス、HTML側からはNode.jsの機能が一切使えない、
よってただのChromeで使えるようなECMAJSしか使えないということになります。


この、nodeIntegrationをtrueにすれば、Node.jsの機能も触れるのでrequireなどを使うことができます。
ただし、セキュリティ上の危険が生えます。

# 参考文献

- https://teratail.com/questions/172094
- [Electron Webviewのセキュリティで注意すべきこと](https://qiita.com/RyosukeCla/items/6f072947bfcba3819ef0)
- [Electronのセキュリティは難しい？](https://engineer.dena.jp/2016/04/electron-security.html)
- [Electronでアプリケーションを作ってみよう](https://qiita.com/Quramy/items/a4be32769366cfe55778)
Macをテレビ（AQUOS）のリモコンに

#はじめに
Macからネットワーク経由でシャープのテレビをコントロールできるらしいので、やってみました。

#必要なもの
・シャープのテレビ（AQUOS）
・ホームネットワーク
・MacBook Pro（macOS Mojave）など

#準備
（１）AQUOS側にネットワークアクセスのアカウント名とパスワード、ポート番号を設定します。
※AQUOSとMacBook Proの間で通信ができることを確認しておいてください。
（２）MacBook Proでターミナルを起動します。
（３）必要なパッケージをインストールします。

```
$brew install socat
```

#やってみよう
##テレビをONにする
（１）ターミナルで以下のコマンドを実行します。

```
$echo -e -n '[USERNAME]\x0d[PASSWORD]\x0dPOWR1   \x0d' | socat - tcp4:[IP_ADDR]:[PORT_NO]
```

[USERNAME]には、テレビで設定したユーザー名を入力します。
[PASSWORD]には、テレビで設定したパスワードを入力します。
[IP_ADDR]は、テレビのIPアドレスを指定します。
[PORT_NO]は、テレビで設定したポート番号（デフォルト＝10002）を入力します。
\x0dは、改行コード（CR）です。

（２）これで、テレビがONになります。

##テレビのチャンネルを変更する
ここでは試しにテレビ東京（地デジ7チャンネル）に変更してみようと思います。
（１）ターミナルで以下のコマンドを実行します。

```
$echo -e -n '[USERNAME]\x0d[PASSWORD]\x0dCTBD71  \x0d' | socat - tcp4:[IP_ADDR]:[PORT_NO]
```

（２）これでチャンネルがテレビ東京に変わります。

##テレビをOFFにする
（１）ターミナルで以下のコマンドを実行します。

```
$echo -e -n '[USERNAME]\x0d[PASSWORD]\x0dPOWR0   \x0d' | socat - tcp4:[IP_ADDR]:[PORT_NO]
```

（２）これで、テレビがOFFになります。

#補足
・テレビON・・・POWR1
・テレビOFF・・・POWR0
・地デジチャンネル切り替え・・・CTBD[0-999]
・BSデジチャンネル切り替え・・・CBSD[0-999]
・音量・・・VOLM[0-100]
・消音・・・MUTE[0-2]※0=トグル、1=消音、0=消音解除
他にもあるようです。機種によっても違うかも。

　コマンドは、A portとB portの組み合わせで8文字＋改行コード（CR）のようです。
B portで4文字に満たない場合は、スペースが必要です。
　例えば、テレビONだと
「POWR」（4文字）がA portで「1   」（4文字）がB portです。（1の後ろはスペースが3つ）です。

#まとめ
Macからネットワークに接続されたテレビをコントロールできました。

Mahalo
Blazor テンプレートを更新する

Blazorは 、.Net Core 3.0 Previewの更新と共にテンプレートも更新されています。

.Net Core 3.0 Preview の更新を行うと、古いテンプレートのバージョンで作成したソースはコンパイルが通らなくなってしまう場合があるので、注意が必要です。

[(参照) Microsoft.AspNetCore.Blazor.Templates ](https://www.nuget.org/packages/Microsoft.AspNetCore.Blazor.Templates/)

# コマンドラインから現在のテンプレートを確認する

現在のテンプレートは、 **dotnet new** コマンドで確認できます。
![dotnet_new.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/da56d428-18f1-0835-3954-5f5277a4072d.jpeg)

Blazor関連のテンプレートは、Blazor Server App,Blazor(ASP.NET core hosted),Blazor Library,など、Blazorがつくテンプレートになっています。これは、Preview7 のものです。

テンプレートの詳細なパッケージ名は、**dotnet new -u**コマンドで確認できます。
![dotnet_new_u.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/38128b7b-7cff-72e8-0257-91281351fd09.jpeg)

# コマンドラインからテンプレートを更新する。

Visual Studio 2019 Preview や.Net Core 3.0 Preview の更新が行われても、テンプレートの更新は手動で行う必要があるようです。

```terminal:Preview7
dotnet new -i Microsoft.AspNetCore.Blazor.Templates::3.0.0-preview7.19365.7

Blazor Server App                                 blazorserver             [C#]              Web/Blazor
Blazor (ASP.NET Core hosted)                      blazorhosted             [C#]              Web/Blazor/Hosted
Blazor Library                                    blazorlib                [C#]              Web/Blazor/Library
Blazor (client-side)                              blazor                   [C#]              Web/Blazor/Standalone
```

```terminal:Preview8
dotnet new -i Microsoft.AspNetCore.Blazor.Templates::3.0.0-preview8.19405.7

Blazor Server App                                 blazorserver             [C#]              Web/Blazor
Blazor WebAssembly App                            blazorwasm               [C#]              Web/Blazor/WebAssembly
```

```terminal:Preview9
dotnet new -i Microsoft.AspNetCore.Blazor.Templates::3.0.0-preview9.19424.4

Blazor Server App                                 blazorserver             [C#]              Web/Blazor
Blazor WebAssembly App                            blazorwasm               [C#]              Web/Blazor/WebAssembly
```

## Visual Studio 2019 Previewで新しいプロジェクトを選択

.Net Core 3.0 や Blazorのテンプレートを 最新版に更新し、新しいプロジェクトを作成するとき、Blazorアプリを選択します。

![vs1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/5c120e41-3b36-870c-3541-c364695fdb00.jpeg)

サーバーアプリは、「Blazorサーバーアプリ」を選択します。
クライアントアプリは、「Blazor WebAssembly App」を選択します。
Asp.Net Core + Clientアプリ(ASP.NET Core hosted)は、**「Blazor WebAssembly App」で「ASP.NET Core hosted」を選択**することで作成できるようです。

![v2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110304/d5c19ba3-4007-3deb-c0bb-391144b1f67d.jpeg)
Rails6でjQueryの導入方法

Introducing jQuery in Rails 6 Using Webpacker

https://www.botreetechnologies.com/blog/introducing-jquery-in-rails-6-using-webpacker

こちらのページを参考にRails6でjQueryを導入しました。

``` bash
$ yarn add jquery
```

``` webpacker/environment.js
const { environment } = require('@rails/webpacker')

#追記
const webpack = require('webpack')
environment.plugins.prepend('Provide',
    new webpack.ProvidePlugin({
        $: 'jquery/src/jquery',
        jQuery: 'jquery/src/jquery'
    })
)
#ここまで

module.exports = environment
```

``` app/javascript/packs/application.js

require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require('jquery') #追記

```
コマンドプロンプト よく使うコマンド 


コマンドプロンプトの入出力をクリアする

```
cls
```

【Dドライブに移動する Cドライブに移動する】

Dドライブに移動する方法を書いていきます

```
C:¥d:
```

カレントディレクトリの位置に依らず、Dドライブに切り替えができます

```
C:¥Users¥d:
```

DドライブからCドライブに移動することもできます

```
D:¥>c:
```


次も同じような書き方です

```
C:/d:
```

カレントディレクトリの位置に依らず、Dドライブに切り替えができます

```
C:/Users/d:
```

DドライブからCドライブに移動することもできます

```
D:/>c:
```
XbeeでArduino2台のシリアル通信を無線化＋縦のレンジがどのくらいか実験する

Arduino2台のシリアル通信をXbeeで無線化しました。
また、商品ページに『室内レンジは60m』と書かれているのを見て、
「横が60mだとして、縦のレンジはどのくらいなんだろう」と気になったので、実験してみました。

# 準備
### 環境
- XCTU 6.4.3
- Arduino IDE 1.8.9
- MacOS High Sierra 10.13.6

### 材料
- Arduino × 2台
　<br>同じもの2台なら楽だったのですが、持ち合わせが無かったので、UNOとSeeeduino Megaを使いました。
- Xbee × 2台
　<br>2.54mmピッチ変換基板とUSBシリアル変換基板にそれぞれ載せています。
- ブレッドボード × 2個
  <br>変換基板2つをそれぞれ挿してArduinoに接続しています。
- LED × 2個
- ジャンパワイヤ

### プログラム
送信機のカウンターを受信機で受け取り、奇数か偶数か判別して点滅するだけの、至ってシンプルなプログラムです。
送信機と受信機のArduinoにそれぞれプログラムを書き込みます。

- 送信機

```c:send.ino
int LED = 13;
int counter = 0;

void setup(){
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop(){
  counter++;
  Serial.write(counter);
  if(counter % 2){ 
    digitalWrite(LED, HIGH);
  }else{
    digitalWrite(LED, LOW);
  }
  delay(1000);
}
```

- 受信機

```c:receive.ino
int LED = 13;

void setup(){
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop(){
  while(Serial.available()){
    byte inChar = (byte)Serial.read();
    if(inChar % 2){ 
      digitalWrite(LED, HIGH);
    }else{
      digitalWrite(LED, LOW);
    }
    delay(10);
  }
}
```

### Xbeeの設定
Xbeeに送信・受信の設定をそれぞれ行います。
Xbeeの設定の詳細は[前回の記事](https://qiita.com/s_fujii/items/9804eaf3599139164aa3)に載っています。
プログラム中の通信速度とXbeeの通信速度を統一するよう気を付けてください。
（上のプログラムを何も変更していなければ9600です）

- 送信機

| 項目名 | 項目名正式名称 | 変更前 | 変更後 |
|:-:|:-:|:-:|:-:|
| ID | PAN ID | 0 | 7<br>(受信機と合わせてください) |
| CE | Coordinate Enable | Disabled[0] | Enabled[1] |
| DH | Destination High | 0 | 13A200 |
| DL | Destination Low | 0 | 受信機のSL |

- 受信機

| 項目名 | 項目名正式名称 | 変更前 | 変更後 |
|:-:|:-:|:-:|:-:|
| ID | PAN ID | 0 | 7<br>(送信機と合わせてください) |
| DH | Destination High | 0 | 13A200 |
| DL | Destination Low | 0 | 送信機のSL |



### 配線
送信側のArduinoとXbee、受信側のArduinoとXbeeをそれぞれ配線します。

| Arduino | Xbee |
|:-:|:-:|
| 3.3V | VCC(1) |
| RX(D0) | TX(2) |
| TX(D1) | RX(3) |
| GND | GND(10) |


また、ArduinoのD13ピンにLEDを繋げておいてください。

### 動作確認
送信機と受信機が同じ周期で点滅を繰り返していれば、正常な動作です。
![ezgif.com-video-to-gif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/36aac532-abf3-a560-0271-464e30c8ebb9.gif)


# 実験
冒頭に書いた通り、室内での縦のレンジがどのくらいか知りたくなったので、実験してみました。
送信機を執務室に置いたまま、受信機を持って階を移動する、というアナログな手法で実験します。

### 同じフロア（遮蔽物あり）
同じフロア内では、執務室とトイレの扉2枚を隔てた状態でも、正常に動作していました。
直線距離はおよそ15〜17mくらいです。

### 階移動
続いて、階を移動してみたところ、送信機が置いてある7階から5階まで降りたところまでは正常に動作していました。
しかし、5階から4階への移動中、受信機のLEDが光らなくなりました。
天井高がおよそ2.5mくらいなので、単純に計算して、天井という遮蔽物があっても5mまでは正常に動くということになります。
この後、5階に戻ってリセットボタンを押してみましたが、LEDの反応はありませんでした。
結局、7階（執務室外）まで戻ったところでリセットボタンを押すと、LEDが正常通りに光るようになりました。

# まとめ
「意外と遮蔽物があっても正常に動作できるんだな」と分かった良い機会でした。
あまり推奨されていない使い方をしたと思いますが、こうして実験することで、
仕様書には書いていない限界を知ることができて良かったと思います。