OmniAICreator/Qiita-1.07M huggingface dataset:
【新卒エンジニアは絶対知っておきたい】CloudWatchLogsエージェントの設定方法

どうもこんにちは。新卒エンジニアの[@Tooonooo](https://qiita.com/Tooonooo)です。

AWSのCloudWatchLogsを使って、ログ出力の設定をすることがあったので、紹介していこうと思います。


僕は

- AWSについての知識がほぼない
- ログの設定なんてしたことがない

という状態で取り組みました。

僕みたいな経験の浅いエンジニアでもできるので、似たような新卒エンジニアの方でもこれを読めばできるようになると思いますよ。

# CloudWatchLogsとは
> Amazon CloudWatch Logs を使用して、Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、AWS CloudTrail、Route 53、およびその他のソースのログファイルの監視、保存、アクセスができます。その後、CloudWatch Logs から、関連するログデータを取得できます。




# ポリシーの設定
IAMユーザーもしくはIAMロールでポリシーを作成します。

```
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "",
         "Effect": "Allow",
         "Action": [
            "logs:CreateLogStream",
            "logs:CreateLogGroups"
            "logs:DescribeLogStreams",
            "logs:PutLogEvents"
         ],
         "Resource": [
                "arn:aws:logs:[リージョン]:[awsのアカウントID]:log-group:[ロググループ名]:log-stream:*",
                "arn:aws:logs:[リージョン]:[awsのアカウントID]:log-group:[ロググループ名]"
          ]
        }
    ]
}
```


# CloudWatchLogsエージェントのインストール
```
sudo yum install -y awslogs
```



# CloudWatchLogsエージェントの設定
AWSのコマンドラインインターフェイスであるCLIの設定をする。
リージョンは任意。

```/etc/awslogs/awscli.conf
[plugins]
cwlogs = cwlogs
[default]
region = リージョン
```

次にawslogsエージェントの設定をする。

- log_group_name
- log_stream_name

は任意の名前をつけてください。

```/etc/awslogs/awslogs.con
[CloudWatachLogsに出力したいlogファイル]
log_group_name = ロググループ名
log_stream_name = ログストリーム名 
file = CloudWatachLogsに出力したいlogファイル
datetime_format = "%Y %m %d %H:%M:%S"　
initial_position = start_of_file
buffer_duration = 5000
```


# CloudWatchLogsエージェントの起動
エージェントを起動します。

```
sudo service awslogsd start
```



# 最後に
これでログがCloudWatchLogs上で見れるようになりました。
本番環境のログを出力すれば、本番環境に入らずともログ確認ができるので便利ですね！



### 参考資料
これらの記事を参考にしました。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html
https://dev.classmethod.jp/cloud/cloudwatch-logs/
Ada言語 8日目 for文

#はじめに
今回はループをやりました。for文を使いました。
面白いことにAda言語ではC言語ではなかったreverseという機能がありましたのでそれもやってみました。

#ソースと結果
```main.adb

with Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;

procedure main is

    hennsuu : Integer := 0;

begin

    for hennsuu in 1 .. 5 loop
        Ada.Integer_Text_IO.Put(hennsuu, 1);
    end loop;

    hennsuu := 0;
    Ada.Integer_Text_IO.Put(hennsuu, 1);

    for hennsuu in reverse 1 .. 5 loop
        Ada.Integer_Text_IO.Put(hennsuu, 1);
    end loop;

end main;

```

`実行結果 : 12345054321`

#最後に
1から5までというfor文に対して、reverseという機能を使うと、5から1になるようです。

#日記一覧へ
[Ada言語を習得する日記一覧](https://qiita.com/C_Assembly/items/50a0f9d8542679d92ea8)
matlab 繰り返しの添字に一行で変換する

# はじめに
初投稿、matlabの小ネタです。

# 添字を変換する
matlabの添字は1から数えます。
そのため、以下のようにmodを取って添字の繰り返しに変換しようとすると…
当然ですが、5列目の値は0になります。
添字としてはここは5にしたいので、あとで0→5に変換します。

```
>> A = [1:5; 6:10]

A =

     1     2     3     4     5
     6     7     8     9    10

>> mod(A, 5)

ans =

     1     2     3     4     0
     1     2     3     4     0

>> ans(ans==0)=5

ans =

     1     2     3     4     5
     1     2     3     4     5
```

# 一行にしたい！
このためにわざわざ二行も使いたくない！と思い、以下のようにしました。

```
>> mod(A-1,5)+1

ans =

     1     2     3     4     5
     1     2     3     4     5
```

スッキリ！
以上、おしまーい。
ブラウザで実行できるJavaScriptコンソールを作ろう！

#ブラウザ上でJavaScriptを動的に実行する
####Q.ブラウザ上でtextboxなどに入力された値をJavaScriptとして実行するにはどのようなアルゴリズムを考えますか？

いろんなアルゴリズムが考えられると思います。
今回は入力された文字列をFunctionコンストラクタを用いて、関数化する方法をまとめます。

##Function コンストラクタとは
[Functionコンストラクタ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function)は関数オブジェクトを生成します。
このコンストラクタは引数に入力された文字列を関数オブジェクトとして生成します。
これを用いて、JavaScriptを動的に実行しようと思います。


```javascript:Function.js
var data = "alert('Hello World');";
var funs = new Function(data)();
```
dataには実行したいプログラムを入力します。 (今回は入力部分は省略)
そのdataの文字列をFunctionの引数に入力すると、無名関数が生成されます。

```javascript:console.log(funs);
ƒ anonymous() {
alert('Hello World')
}
```
これを即時的に実行することにより、textboxなどに入力されたJavaScriptを動的に実行することができます。

みなさんの
###Q.ブラウザ上でtextboxなどに入力された値をJavaScriptとして実行するにはどのようなアルゴリズムを考えますか？
のAnswerをコメントで教えてください。
【マイグレーションファイルを削除したいとき】

【マイグレーションファイルを削除したいとき】
・ロールバックして、downの状態に戻す。
・ロールバックできないときは、対象のマイグレーションファイルの中のchangeメソッドの中身を消してやるとロールバックされる
・down状態になっているのを確認出来たら手動で削除。
DJANGO for BEGINNERSをやってみる その2

# はじめに
[DJANGO for BEGINNERSをやってみる その1](https://qiita.com/d_uchida/items/8e14f7eb4cb6af8c28c3)の続き

# Chapter3: Pages App

その1に比べてちょっと高度なことをする。

## Templateの継承

まずは親テンプレートとなるbase.htmlを作る。

```django:base.html
<header>
    <a href="{% url 'home' %}"> Home </a>| <a href="{% url 'about' %}"> About </a>
</header>
{% block content %}
{% endblock content%}
```

ヘッダに先ほどまでに作ったhome.htmlとabout.htmlのリンクを貼る。
djangoのテンプレートタグは{% %}で囲まれている。{% url 'home'%}はurls.pyに記述したhome.htmlのURLになる。
参考：[Django: 組み込みタグとフィルタの一覧
](https://qiita.com/nachashin/items/d3f9cd637a9cecbda72c, 'Django: 組み込みタグとフィルタの一覧
')
home.htmlとabout.htmlにbase.htmlを継承させる。

```django:about.html
{% extends 'base.html' %} <!-- base.htmlを継承する -->

{% block content %} <!-- block tagで親templateのblock tagの中身をオーバーライドできる -->
<h1> About Page </h1>
{% endblock content %}
```

```django:home.html
{% extends 'base.html' %}

{% block content %}
<h1> Pages App !!  </h1>
{% endblock content %}
```
ここまできたら以下のようなページになるはず！

![fb3e1f71d7b54a62ccd5ffaafe645ffe.gif](https://qiita-image-store.s3.amazonaws.com/0/321139/ada700d6-b8f2-e1a8-a61b-af1ae1cb2b71.gif)


## Tests
> *In the words of Jacob Kaplan-Moss, one of Django's original creators, "Code without tests is broken as designed.*"
> (*William S. Vincent, DJANGO for BEGINNERS, Chapter3 Tests*)

"テストなしのコードは設計通りに機能しない" ということでその1で作ったページのテストを作成する。
プロジェクト作成時にテスト用のファイルは自動で作成されているので、そこへテスト関数を追記する。

```python:pages/tests.py
from django.test import TestCase, SimpleTestCase

# Create your tests here.
class SimpleTest(SimpleTestCase):
    
    # HttpRequestに対してリクエスト成功(=200)の応答が返ってきていることを確認するテスト
    def test_home_page_status_code(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200) 
    
    def test_about_page_status_code(self):
        response = self.client.get('/about/')
        self.assertEqual(response.status_code, 200)

```

テストがかけたら、実行する。

```Console:test_command
% python manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
..
----------------------------------------------------------------------
Ran 2 tests in 0.059s

OK
Destroying test database for alias 'default'...
```

コマンド一発で自動実行。便利！

## Deploy
Heroku使ってデプロイする手順もあるけど、気が向いたらやる。

# Chapter3まとめ
* Templateの継承
* クラスベース汎用ビューの利用
* 基本的なテストの追加と実行

# 続き
Chapter4 Message Borad App
MAのFESTA2018で音響さんをやってみて思った、オススメしたいマイクの扱い

FESTA2018では音響(PA)ということで、メインステージでのマイク音声を中心に、プレゼン音声やBGMまわりの操作を担当してました。キノコとならぶMAの食材担当、もやしです。どうぞよしなに。
![mixer.jpg](https://qiita-image-store.s3.amazonaws.com/0/69744/2787f183-30c9-1624-929d-803d78afd248.jpeg)

当日の音響のお仕事はというと、なるべく聞きやすい音をお届けしようと、音量や声質に応じてちょいちょいミキサー卓の操作をしていくあたりだったわけですが、マイクの扱い方や声量によりカバーしきれないこともまれにあった次第で。無理にボリューム補正しようとしすぎると、こんどはハウリング起こすというジレンマに...

そこで。
これさえ実践すれば、カンファレンスやプレゼンでのマイクの扱いは完璧！というコツをご紹介します！

## マイクはアゴにつける
マイクのボール部分を、アゴにつける。これだけです！
そしてマイクの向きは真下に。
読むのめんどくさい人は、ここまででOKですよｗ
![right.jpg](https://qiita-image-store.s3.amazonaws.com/0/69744/5b5ee795-e040-c070-369b-3600f79f391e.jpeg)

これで十分音を拾えるうえ、こんなメリットもあります。

- 破裂音(パやダなど)でノイズになることが少ない
- 口からの距離が一定に保てるので、一定の音量をキープできる
- 横(スクリーンのほうなど)を向いても、マイクを外さないですむ 

とくにプレゼンでは、PCを操作しながらたまにスクリーンを振り返るなどのシーンがあり、そういうときにマイクを外してしまうことが希にみられます。そうすると、客席側では何も聞こえなくなってしまうので絶対に避けたいですね。
こういうミスも、別段**意識することなく**回避できるのが大きなメリットです。

#### 意外にオススメできないのが

こちらは、一見問題ないようでいて、実はプレゼンではあまりオススメできないスタイルです。
![ng.jpg](https://qiita-image-store.s3.amazonaws.com/0/69744/d56f8da7-40ad-e44f-7783-ad7bf7f4d56a.jpeg)

なにより破裂音をモロに拾ってしまうので、そのたびに「ボフ！」みたいなノイズになってしまいがちです。避けるにはちょっとした発声法のコントロールが必要になってしまいます。
また口とマイクの距離を一定に保つのも難しく、前述のとおりスクリーンを振り返るときなどに、無意識にマイクを外してしまうことも多発します。
あと呼吸音も拾いやすく、避けようと息を抑えめにしてるうちに酸欠みたいになるなんてことも、よくありました。

## ボール部分を手で覆わない
もうひとつ、意外とやってしまいがちなのが、マイクのボールの下半分を手で握って覆ってしまう持ち方。
これをすると、マイクの構造上ハウリングしやすくなってしまうんです。
![hand.jpg](https://qiita-image-store.s3.amazonaws.com/0/69744/5f96797e-2d9a-ab45-b983-ce7002ca110e.jpeg)

なるべくならマイクの下の方を持って、そうすると手で顔を隠すこともなくなってオススメです！

## まとめ

知っていて、ちょっとやれば済むこれだけのコツで、プレゼンの聞きやすさを安定させられる。
これならやらないのは勿体ないですよ。
ぜひ実践してみてください！
ffmpeg一括変換

# ffmpegで一括変換する方法

一気に変換したい時のためのメモ。一撃で終わらせたいけどfind使うと以外にうまくいかない...
最近だとiPhoneで撮った画像がHEICとかで他人と共有したいときとかにjpeg置き換えたい時に使える。

```bash
$ for f in *.HEIC ; do ffmpeg -i $f `basename -s .HEIC $f`.jpg; done
```
qcow2のshrink

やりたいこと、40GBから20GBにへらす
シャットダウン前提です。オンラインではできない。

## 1. 縮小予定のサイズで新しいディスクを作る

```
qemu-img create -f qcow2 -o preallocation=falloc atarasi-vol.qcow2 20G
```

## 2. 作業用のVMに、元のボリュームと 1. で作ったボリュームの両方をアタッチする

 *   vda: 作業用のOS
 *   vdb: 元のボリューム
 *   vdc: 1で作ったボリューム

```
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/var/lib/libvirt/images/furui-vol.qcow2'/>
  <target dev='vdb' bus='virtio'/>
</disk>
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/var/lib/libvirt/images/atarasi-vol.qcow2'/>
  <target dev='vdc' bus='virtio'/>
</disk>
```


## 3. 作業用のVMを起動

```
virsh start work-os
```

## 4. vdb(元のボリューム)のファイルシステムを縮小する

```
e2fsck -f /dev/vdb1   (事前にやらないといけない)
resize2fs /dev/vdb1 15G (少し余裕を持たせるために、20GBより小さくする)
```

## 5. コピー先にパーティションを作る

```
fdisk /dev/vdc1
```
パーティションの開始セクタなどはコピー元とあわせる

## 6. コピーする

```
dd if=/dev/vdb1 of=/dev/vdc1 bs=1M
```

## 7. MBRをコピーする

```
dd if=/dev/vdb of=/dev/vdc bs=446 count=1
```

## 8. grubを再インストールする

```
mount /dev/vdc1 /mnt
cd /mnt

mount --bind /dev dev
mount --bind /proc proc
mount --bind /sys sys

chroot .

grub2-install /dev/vdc
```

## 9. 元のVMに新しいボリュームをアタッチして起動

```
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/var/lib/libvirt/images/atarasi-vol.qcow2'/>
  <target dev='vda' bus='virtio'/>
</disk>
```
ここで起動しなかったら、何かコピーで失敗している

## 10. ログインして、ファイルシステムを最大まで拡張する

```
resize2fs /dev/vda1
```

## 総括

もっといい手順があれば知りたい
【Kotlin】Bundleを使ったFragment間の値渡し

今回はFragmentPagerAdapterのgetItemメソッドの中で、position(Int)の値渡しをしてみます。

# 渡す側

```kotlin:HogeFragment.kt

override fun getItem(position: Int): Fragment? {
    // Bundle（オブジェクトの入れ物）のインスタンスを作成する
    val bundle = Bundle()
    // Key/Pairの形で値をセットする
    bundle.putInt("KEY_POSITION", position)
    // Fragmentに値をセットする
    val fragment = FugaFragment()
    fragment.setArguments(bundle)

    return fragment
}
```

渡したい値の型に応じて`putString`や`putBoolean`などが使えます。

# 受け取る側

```kotlin:FugaFragment.kt

// 値がセットされなかった時のために初期値をセットしておく
private var position = 0

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState){
    // Bundleを取得する
    val bundle = arguments
    // Bundleがセットされていたら値を受け取る
    if (bundle != null) {
        position = bundle.getInt("KEY_POSITION")
    }
}
```
受け取りたい値の型に応じて`getString`や`getBoolean`などが使えます。
フロントを開発する時に意識していること

今回は自分自身がフロントの開発をする上で意識していることを書こうと思います。
なので前に書いた記事よりもゆるい内容になってると思います。
また今回の記事は、最近僕が担当した案件でDjangoを使ってフロント開発をしたのでDjangoでのフロント開発を例に書きますのであらかじめご了承ください。

まず、自分がフロントを開発するにあたって気をつけてることは

```text
- 破綻しづらい構造やコードになっているか
- 誰が見てもわかりやすいディレクトリ構成になってるか
- コードが読みやすいか
- 一つのファイルのコード量が多くなっていないか
```

などを考えながら構築しています。
あくまで自分の中で意識したことなので、人それぞれだと思います。
少しでもフロントを始める人には参考になれば幸いです。

# ページごとにディレクトリを作る
Nuxt.jsですと、`page`ディレクトリが存在して、その中で各ページのvueファイルが展開されます。
Djangoの場合だと、ルートディレクトリに各ページのディレクトリを作成しました。

```bash
.
├── hoge1
│   ├── __pycache__
│   ├── static
│   ├── templates
│   └── views
├── common
│   ├── __pycache__
│   ├── static
│   ├── templates
│   ├── templatetags
│   └── util
├── config
│   ├── __pycache__
│   ├── settings
│   └── static
├── hoge2
│   ├── __pycache__
│   ├── static
│   ├── templates
│   └── views
└── hoge3
    ├── __pycache__
    ├── static
    ├── templates
    └── views
```

こんな感じです。

commonディレクトリには共通のテンプレートだったり、共通のテンプレートで使ってるimage画像や共通のjsなどが配置されています。

configディレクトリはsettingsファイルがあります。
settingsディレクトリ内では

```bash
.
├── __init__.py
├── base.py
├── development.py
├── production.py
└── staging.py
```

のように各環境ごとのsettingsファイルを作って配置してます。

hoge..は各ページごとのディレクトリになってます。
hoge..内にあるstaticディレクトリにはそのテンプレート内でしか使用しないscssファイルやimageファイル、jsファイルなどが配置されています。

```bash
.
├── images
│   ├── hoge.svg
│   └── hogehoge.svg
├── js
│   └── hoge.js
└── scss
    └── hoge.scss
```
こんな感じになってます。
この構成だとこのページでどのscssやimageが使われているのかが明確に分かります。

# scssの導入
こちらもフロントやってる方ならおなじみのscssです。
scssのメリットとしては

```
- 入れ子にできる
- 変数化ができる
- 継承が使える
- ファイルの分割管理が楽
```
他にもループができたり、css内で演算ができたりと色々なメリットがあります。
個人的には入れ子にできるので全体的なコード量の削減ができていいと思ってます。
ただネストを深く書きすぎると逆に読みにくくなるので注意です。

Djangoでのscssの導入は簡単です。

```bash
pip install libsass django-compressor django-sass-processor
```

で必要なモジュールをinstallします。

- libsass
    - コンパイラー
- django-compressor
    - js、cssファイルを圧縮できるモジュール
- django-sass-processor
    - sassプロセッサー

次にsettings.pyの編集です。

INSTALLED_APPSにsass_processorを追記します。

```python
INSTALLED_APPS = [
    'sass_processor',
]
```

次に下記を追記します。

```python
SASS_PROCESSOR_ROOT = os.path.join(BASE_DIR, 'static')
SASS_PROCESSOR_INCLUDE_FILE_PATTERN = r'^.+\.scss$'
SASS_PRECISION = 8
SASS_OUTPUT_STYLE = 'compressed'
SASS_TEMPLATE_EXTS = ['.html', '.haml']
```

- SASS_PROCESSOR_ROOT
    - 生成された* .cssファイルを配置するディレクトリを指定
- SASS_PROCESSOR_INCLUDE_FILE_PATTERN
    - sass/scssファイルでは、アンダースコアなしでファイルをインポートする必要があるため、正規表現で設定
- SASS_PRECISION
    - 出力されたcssの浮動小数点を設定
- SASS_OUTPUT_STYLE
    - コンパイル結果のコーディングスタイルを設定
- SASS_TEMPLATE_EXTS
    - 対象の拡張子からsass/scssを取得するための指定

最後にtemplate側で

```html

{% load sass_tags %}
```
を追加するとscssをtemplate側で呼び出すことができます。

# bem記法
フロントを開発する時に命名規則としてbem記法を使っています。
bem記法の説明に関しては[こちら](https://qiita.com/mrd-takahashi/items/07dc3b4bad027daa2884)の記事がかなりわかりやすく書かれているので、ご覧ください。

# 共通パーツは全てcommonディレクトリ内に配置する
例えばheaderやfooterなど、どのページでも再利用する部分は`common/templates`内に作り、baseのtemplateにincludeさせる形にします。
また、baseのtemplate内で各ページのtemplateを出力しています。
こうすることでかなりシンプルなコード構造になります。
個人的には2箇所以上で使う部分はすべて共通のtemplateとして扱っていいと思っています。

# まとめ
結構フロントを開発する上で基礎的な部分を書きましたが、意識しないで開発するとすぐ破綻するコードになってしまうのでちゃんと意識することが大事です。
そうすれば新規での開発や既存のコードの改修などがし易くなると思います。

明日は[@you8](https://qiita.com/you8)さんが書きます。
お楽しみに〜。
`rubygems-update requires Ruby version >= 2.3.0` のエラーが出るとき

## TL;DR

```shell
gem update --system
```
を下記のように変更する

```shell
gem update --system 2.7.11
# または
gem install rubygems-update -v '<3' && update_rubygems
```

## 事象

古い Ruby を使っているプロジェクトで `gem update --system` を実行すると下記のようなエラーが出るようになった

```shell
$ gem update --system
Updating rubygems-update
Fetching: rubygems-update-3.0.0.gem (100%)
ERROR:  Error installing rubygems-update:
        rubygems-update requires Ruby version >= 2.3.0.
ERROR:  While executing gem ... (NoMethodError)
    undefined method `version' for nil:NilClass
```

## 原因

Ruby 2.6 のリリースに向けて [RubyGems 3.0.0](https://rubygems.org/gems/rubygems-update/versions/3.0.0) がリリースされ、2.3 未満の Ruby はサポートされなくなった
`gem update --system` では最新版の RubyGems を取ってくるので、2.3 未満の Ruby を使っていると通らなくなる

## 対応

[2 系の最新版](https://rubygems.org/gems/rubygems-update/versions) を入れるようにする

```shell
gem update --system 2.7.11
# または
gem install rubygems-update -v '<3' && update_rubygems
```
cで複素数

#概要

cで複素数やってみた。

#サンプルコード


```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>

#define NCprintf(a)     (printf(#a " = "),Cprintf(a))
void Cprintf(complex double z)
{
    printf ("%f %+fi\n", creal(z), cimag(z));
}
int main(void)
{
    double complex z = 1 + 2i;
    double complex c;
    NCprintf(z);
    NCprintf(z * z);
    NCprintf(I);
    NCprintf(z * I);
    NCprintf(z + (4 + 2i));
    NCprintf(conj(z));
    printf ("cabs(z) = %f\n", cabs(z));
    printf ("carg(z) = %f\n", (double) carg(z));
    NCprintf(sin(z));
    NCprintf(exp(z));
    c = 3 + 4i;
    NCprintf(c);
    return (0);
}

```

#成果物

https://paiza.io/projects/sgbjcJgRE5yFN0KIb4ddnA

以上。
よく使うComponentまとめ[Unity 2018.2]

初心者でもわかるようになるだけ平易な言葉で、各コンポーネントの説明を書きます。
コンポーネントごとに、Unity公式のマニュアルとスクリプトリファレンスのリンクも載せてるので、詳しくはそちらを参照ください。

###Transform
```
ゲームオブジェクトの位置(Positon)・回転(Rotation)・スケール(拡大・縮小)(Scale)を保持するコンポーネント。
Transformコンポーネントははずす事ができず、1つのゲームオブジェクトに対して1つしか存在できない。
```
[マニュアル](https://docs.unity3d.com/ja/current/Manual/Transforms.html)
[スクリプトリファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/Transform.html)


###Mesh Filter
```
Mesh情報（オブジェクトの形の情報、スキンする対象）を持つコンポーネント。
MeshFilter.Meshに、CubeやSphereなどのオブジェクトの形の情報が入る。
```
[マニュアル](https://docs.unity3d.com/ja/current/Manual/class-MeshFilter.html)
[スクリプトリファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/MeshFilter-mesh.html)


###Mesh Renderer
```
MeshFilterで定義されたmeshをレンダリング(オブジェクトを生成、可視化)する。
Cast ShadowsをOnにすると投影され、Receive ShadowsをOnにすると自身が受けた影を表示する
```
[マニュアル](https://docs.unity3d.com/ja/current/Manual/class-MeshRenderer.html)
[スクリプトリファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/Renderer.html)


###BoxCollider
```
当たり判定の際に必要なコンポーネントで、Center(中心座標)とSize(大きさ)によって当たり判定をする範囲を指定する。
Is TriggerをOnにすると接触判定、Offにすると衝突判定となる
```
[マニュアル](https://docs.unity3d.com/ja/current/Manual/CollidersOverview.html)
[スクリプトリファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/BoxCollider.html)


###Rigidbody
```
ゲームオブジェクトに物理特性を付与するコンポーネント。
Use GravityをOnにするとこの要素があるオブジェクトに重力がかかかり、
Constraintsによって位置や角度などにおいて物理的な制約条件を設定するなど。
```
[マニュアル](https://docs.unity3d.com/ja/current/Manual/class-Rigidbody.html)
[スクリプトリファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/Rigidbody.html)


###Canvas
```
UIパーツ(Text,Buttonなど)が配置、描画される抽象的な領域であるCanvasを管理するコンポーネント。
モードには大きく3つあって、
Screen Space - Overlay：Camera関係なしにScreen上に表示するモード
Screen Space - Camera：Cameraと紐づいて、Cameraから一定の距離の部分に表示するモード
World Space：ただのゲームオブジェクトとして空間内に配置できるモード。
```
[マニュアル](https://docs.unity3d.com/ja/current/Manual/class-Canvas.html)
[スクリプトリファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/Canvas.html)


###Button
```
UIパーツの１つ。
Interactableがtrueだとボタンを押すことができて、押されるとOn Click()で指定された関数が実行される。
```
[マニュアル](https://docs.unity3d.com/ja/current/Manual/script-Button.html)
[スクリプトリファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/UI.Button.html)


###Animator
```
アニメーションを追加するためのコンポーネント。
Controllerに設定されたAnimationを実行する。
```
[マニュアル](https://docs.unity3d.com/ja/current/Manual/class-Animator.html)
[スクリプトリファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/Animator.html)


###Audio Source
```
AudioClipに設定されている音源を再生するためのコンポーネント。
```
[マニュアル](https://docs.unity3d.com/ja/current/Manual/class-AudioSource.html)
[スクリプトリファレンス](https://docs.unity3d.com/ja/2018.2/ScriptReference/AudioSource.html)
今さら聞けないPepperと「人工知能」についての基礎

本記事はPepperアドベントカレンダーの一環です。何日目だったっけ。

はじめに断っておきますが、本記事はPepperやプログラミングにこれまであまり触れたことのない方を対象としています。
具体的な実装の話はqiitaなどにたくさん紹介がありますが、本記事のような「今さら聞けない基礎」について説明しているページがあまりないので書いてみました。


#Pepperに「人工知能」は組み込まれていない<br>
私がアトリエ秋葉原(Pepperの開発スペース)のスタッフとして働いてきた中で何度か受けた質問の一例をご紹介します。
「Pepperには人工知能が入っているのか？」
「Pepperは家に置いておくと賢くなるの？」

「人工知能」という言葉の定義が曖昧なので、その言葉はあえて使わず上記の質問に回答をするならば、Pepperには
・人の顔を見分ける
・人の言葉を理解して返事をする
・人間のようにものごとをひとりでに学習する
といった、高度な認知機能は搭載されていません。

ですので、家庭にPepperをおいても勝手にあなたの名前を覚えてくれるわけではありませんし、お留守番をしてくれるようになるわけでもありません。

Pepperはあくまである程度の動作機能とネットワークを備えたハードウェアであり、【高度な計算や処理は外部媒体に投げる】ことを前提に作られたプロダクトです。
発売当初に「人工知能ロボット」という紹介のされ方をしていたので、こういった曖昧な言葉づかいが誤解を呼ぶきっかけになったのだと思います。

#「人工知能」が一般的に指すもの
非常に基礎的なお話ですが、「今さら聞けない」というタイトルの記事なので一応。
元々、一般的な会話で用いられていた「人工知能」という言葉は、ドラえもんや鉄腕アトムのようにロボットが人格を持って思考するようなものを指しているものだと思いますが、これは汎用人工知能と呼ばれるもので、近年のバズワードになっている「人工知能」はこれとは別物です。

ここ４、５年のバズワードの「人工知能」は「特化型人工知能」のことで、人の脳を模倣した「学習」によって、プログラムが特定のタスクを高い精度でこなせるようになる仕組みのことを指すことが多いです。
これによってコンピュータが画像に写っているものが何かを判別したり、対人戦では無敵の囲碁棋士を作り出したりすることができるようになりました。

ここに説明を割くと記事の本来の筋から逸れていく気がするので詳しくは
https://www.ai-gakkai.or.jp/whatsai/AIwhats.html
などを参考にしてください。

#Pepperに「知能」を

では、話題の「人工知能」（ここでは機械学習・深層学習を用いたプログラムのことを指しているものと解釈します）とPepperを連携させて、
・Pepperの視界に何が写っているのかを判別したり
・人の顔を見分けたり
・人間の言葉を柔軟に判別したり
・通訳をさせたり
といったことを可能にするにはどうしたらよいでしょうか？

選択肢は大きく分けて２つ。
・自分で機械学習などのプログラムを組み、外部のPCで実行。そのプログラムの挙動に応じて外部PCからPepperに指示を出す。
・クラウドサービスを活用する。
前者はPythonを書き慣れている人にとってはそれほど敷居が高いものではありませんが、そうでない方にとっては非現実的な選択肢であると思います。
そこで後者の方法が圧倒的にオススメです。

「人工知能」ほどメジャーではありませんが「クラウド」もここ5,6年ほどこの界隈では相当なバズワードです。
クラウドとは何かと検索すると
>「クラウド」とは、クラウドサービスプラットフォームからインターネット経由でコンピューティング、データベース、ストレージ、アプリケーションをはじめとした、さまざまな IT リソースをオンデマンドで利用することができるサービスの総称です。

参考：https://aws.amazon.com/jp/cloud/
といった難しい説明がいっぱいでてきますが、簡単に言えば、自分の手元にあるPCやサーバではなく、遠隔地にあるデータセンターのリソースを借りて、そこでサーバを立てたりプログラムを動かしたりすることができるサービスのことです。データセンターの巨大なリソースをみんなでシェアしているような感じです。

クラウドサービスは画像認識や音声認識などの知能系のサービスも沢山提供していて、「人工知能」が組み込まれた機能をお惣菜のような感覚で扱うことができます。

なお、クラウドサービスとしては
Amazon Web Services、Microsoft Azure、Google Cloud Platform、IBM Cloud、Alibaba Cloud などが有名です。

ちなみに、人工知能の代名詞のような感じで名前が一人歩きしているWatsonとは、IBM Cloudが提供するサービスのうち、知能絡みサービスの名称です。

#つづく
というわけで、Pepperと人口知能についてよくある誤解と今さら聞けない基礎についての説明を書いてみました。
本記事の内容を前提として理解されている方を対象として、次回の記事ではWatsonをバックエンドとして、Pepperが視界に写っているものを発話するアプリを実装する方法をご紹介します。

アトリエ秋葉原でたまに開講している「Pepperで学ぶはじめてのWatson」というワークショップの簡略版みたいな感じにしようかな。ではまた。
ぼくのわたしの23年間

こんにちは！

これは [Supership Advent Calendar 2018](https://qiita.com/advent-calendar/2018/supership) 21日目です。

Supershipの18新卒で入社した@Y-nakataniです。18新卒として入社してから、主にフロントエンドの開発をしています。

今回は、新卒で入社するまでと、してから、そして今後について考えていることをこの機にポエっていきます。思い返せばなんか色々やってました。

## 色々やろうと思うまで
中学生くらいのとき、将来の *自分のやりたいこと* というのがいまいちイメージできていなかったです。

自分なりに考えて、それは自分の *視野が狭い* のと *経験がないことが多い* からだという仮説のもと「いろいろやってみる」ということにしました。いろいろやってみて、一番楽しかったことを職にできればいいんじゃないかなとふんわりした思考のもと、一旦「なんかパソコンおもしろそう」と「物心ついたころから絵を描くのが大好き」という二軸に絞りました。

ちなみに小学生のころの将来の夢はピアニストです。ピアノは1ミリも習うことはありませんでした。

「なんかパソコンおもしろそう」「物心ついたころから絵を描くのが大好き」でしたので、高校受験は情報科と工業のデザイン学科を受験してなんやかんやでデザイン学科に進学しました。

## 今までやってきた色々
デザイン学科に進学できたのはいろいろやるに至って結果的に良かったと思ってます。入学初めの頃は、お絵かきとデザインが違うことくらい分かっていたので、ちょっと嫌でした。デザイン科でやってきたことはざっとこんな感じ。

* 製図
* アーク溶接
* ヘアデザイン
* ガラケデザイン
* ポスターデザイン
* 油絵（50号か100号くらいのものでなんちゃら賞授与）
* クレーン、玉掛け、ユンボの免許
* リスニング検定一級

デザインって一言でいっても色々あるんだということが分かりました。授業で学ばなければデザインの歴史なんて自分で調べたりすることもなかったですし、イモい実習服を着てアーク溶接をするなんて受験したときは知らなかったです。

高校3年生、花のJK。大学への進学を考えてる中、自分はものすごくデザイン力、アート力が優れているわけでもなかったので、ふと「自分はデザインで食べていけるのか…？」という不安がよぎりました。なので「なんかパソコンおもしろそう」の方面もやってみたいと思い、興味だけで大学は情報科学科へ進学しました。そこにたどり着くまで鍼灸やろうと思ってた時期もありました。意味わかんないですね。

大学の情報科（笑）でやってきたことはこんな感じ。

* AEでプロジェクションマッピング
* Mayaでモデリング
* 実写合成映像
* 教員免許取得
* 人工知能勉強会
* VRの卒業研究

情報科ときいてプログラミングとか不安でしたが、デザイン寄りのこともカリキュラムに含まれていて、大学で大好きなデッサンをまたすることができて、動画も作って、情報とデザインどっちもできて楽しかったです。


 
## 今やってる色々
最初に絞った二軸、「なんかパソコンおもしろそう」「物心ついたころから絵を描くのが大好き」に一応沿って、デザインと情報系やってみたけど、自分はどっちがやりたいんだと言われると、正直わからなかったです。

どっちも楽しいし、どっちか決めないといけない理由も分からなかったです。

なので、どっちもできる人間として、もっと伸ばしていくのがいいんじゃないかなと思いました。



厳しい母の「院進しろ」をガン無視して就職活動をめちゃくちゃ早い時期から初めました。学生はもう飽きたし、院進してまで研究したいことも無かったので、さっさと社会に出ようと思いました。

就職活動では逆求人を利用して、10社以上の選考を受けたりしましたが、どっちつかずの私はデザイナーなの？エンジニアなの？どっちがやりたいの？ときかれることが多く、どっちもやりたいですというのを理解してくれる会社や、受け入れてくれる会社が本当に少なかったです。滑りまくりました。

...2億年後


滑りまくって「もう次の逆求人で滑ったらニートやったるわ」とほぼ自暴自棄になっていたころ、髄膜炎を発症し、クソほど痛い頭を文字通り抱えながら痛み止めを飲み、死にかけの状態で挑んだ後の運命を大きく左右した逆求人。そこで某Mさんと某Wさんと運命の出会いをしました。ハイになっていたので記憶がほとんどないですが、Mさんの「イケてるね！」の発言に目が覚めました。こんな反応されたの初めてで、砂漠でオアシスを見つけた気持ちになりました。私の社会を舐め腐ったクソみたいな態度をものともせずキャッキャと喜んでくれるこのお二方がいる会社に、ぜひ入りたいと思いました。

正直なところ、就職は関西方面で考えていた部分もあるのですが、東京に出ることにも抵抗はなかったので面接を受けました。私が東京に来た理由は「そこに会社があったから」

そんな会社に無事入社することができ、現上司の某Oさんのもとで今までやってたこと、今やってることは合わせてざっとこんな感じ。

* ちょっとしたデザイン
* マークアップ
* アイコン作成
* ロゴ作成
* 開発（Vueとか）
* テスト
* リリースぽちー

某Oさんは、私の様子を見つつ上記に限らず様々なことをやらせてくれてます。Oさんは、カップ麺のことをカントリーマアムと言ったり妄言癖がありますが、このカップ麺さんには本当にお世話になってます。いつもありがとうございます。

Oさん「カップ麺は1日にしてならず」



## 色々やってきて思ったこと
いろいろやりましたが、好き嫌いがなさすぎてどれも中の下くらいで、幅は広がったものの飛び抜けて自慢できるものがない人間になってしまいました。「器用貧乏になっちゃうよ」とカップ麺さんに言われて気づきました。
なので私はとりあえず、JavaScriptを頑張って、そこから自慢できるものを一個づつ作っていきたいと思います。感謝の1日1commit頑張ってます。



まとまりなく書きましたが要は、無生産に学校に行って飲んで吐いてを楽しいと思ってたチンパンジーが、様々な人が見ることができるサイトのUIとか中身をいじるようになって、ようやく最近人間になれてきたんじゃないかと思います。これからどんどん人間らしさを磨いていきたいと思います。ちなみにチーム内でのあだ名は小籠包です。食いもんでした。


自慢できるものがどんどん増えれば、もっと様々な場所に飛び出して更に幅を広げていきたいと思ってます。
オッ飛び出して可能性を広げたい！今の職場に不満がある！転職エージェントってなにそれおいしいの？ってときはこれ！[DIGROWエージェント](https://digrow.jp/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268235/4759ac36-7be3-6434-6d0b-5a830b5e415a.png)
心を込めて一生懸命作ってます、イケてるチームのイケてるサービス。[DIGROWエージェント](https://digrow.jp/)*転職エージェントとのミスマッチを出会いのプロセスで解決する* なんとこんなにイケてるのに無料で利用できます。
レッツ無料登録！！！！！！！！！！！！！！！！１
Railsでtemporary tableを動的につくってActiveRecordで使えるようにする

ちょっとわけあって、1セッションのみで使うTableを動的に作ってすぐ捨てる必要ができた。1セッションのみで使うテーブルは、MySQLのTemporaryTableを使い、さらにActiveRecordとして使えるようにして実現したのでメモ。

## Temporary Table
>TEMPORARY テーブルは現在のセッションにのみ表示され、そのセッションが閉じられると自動的に削除されます。つまり、2 つの異なるセッションが同じ一時テーブル名を使用することができ、互いに、または同じ名前の既存の TEMPORARY 以外のテーブルと競合することはありません。(既存のテーブルは、一時テーブルが削除されるまで非表示になります。)一時テーブルを作成するには、CREATE TEMPORARY TABLES 権限が必要です。

 [13.1.17 CREATE TABLE 構文](https://dev.mysql.com/doc/refman/5.6/ja/create-table.htm) の一時テーブルの章

## 動的にTemporaryTable作ってActiveRecord化するサンプルコード
```rb

# temporary table 'tmp_tables'の作成
ActiveRecord::Base.connection.create_table('tmp_tables', temporary: true) do |t|
  t.date :date
end

# 作成したtemporary tableをActiveRecordに紐付ける。モデル名はTmpTable。
klass = Class.new(ActiveRecord::Base) do |c|
  c.table_name = 'tmp_tables'
end
Object.const_set('TmpTable', klass)

# 試しに使ってみる
TmpTable.new(date: Date.today).save!
pp TmpTable.all
# -> [#<TmpTable:0x00007feb594af550 id: 1, date: Thu, 13 Dec 2018>]
```

## 参考
- [Rails で動的にテーブルを作成して、大きな CSV のデータをインポートする方法 | feedforce Engineers' blog](http://tech.feedforce.jp/modelless-table-on-rails.html)
ReactNavigationの遷移でアニメーションさせない

`transitionConfig` を定義すればいいんですね。

参考：

- [Screen navigation without transition](https://github.com/react-navigation/react-navigation/issues/1254#issuecomment-297457689)
- [公式](https://reactnavigation.org/docs/en/stack-navigator.html#docsNav)

```javascript
const stack = createStackNavigator(
  {
    Hoge: HogeComponent,
    Huga: HugaComponent,
  },
  {
    //ここで遷移時の挙動を定義
    transitionConfig: () => ({
      transitionSpec: {
        duration: 0,
        timing: Animated.timing,
        easing: Easing.step0,
      },
    }),
  },
);
```
IntelliJで複数windowの管理を楽にする

IntelliJを使ってマイクロサービス開発していたりすると、複数ウィンドウ開いて作業する事がある。
6つとかウィンドウがあると切り替え時に視認して見分けるのは結構なストレスになるので、[FrameSwitcher](https://plugins.jetbrains.com/plugin/7138-frame-switcher)というプラグインを導入したところ管理が楽になった。

## Frame Switcher
Preference -> Plugin -> 検索から`Frame Switcher`と入力する。
候補に出てきたプラグインをインストールしてIntelliJを再起動する

## ショートカット
```
ウィンドウ切り替え or プロジェクトの再オープン - alt + F2
```

プロジェクト名を把握してる必要があるが、把握している場合には役に立つだろう。
プロジェクト名が重複している場合は楽にはならないかも知れない...
機械学習で使用する画像のサイズ変換

#画像処理ライブラリpillow

PIL(Python Imaging Library)の後継として開発されている。

*(参考URL)*
https://www.sejuku.net/blog/62599
https://python-pillow.org

##インストール方法
pip install pillow

##使い方
色々できますが、今回やりたかった内容について記載します。
今回やりたいことは、1万枚のサイズが異なる画像を、すべて224x24のサイズに変更する。

```python:
# -*- coding:utf-8 -*-
name_list = ["a.jpg", "b.jpg","c.jpg"]
from PIL import Image

#ファイル名を1つづつ取り出し、サイズ変換して、同じファイル名でsave
for i in name_list:
  img_resize = Image.open(i).resize((224,224))
  img_resize.save(i)

```

ファイル名のリスト箇所は、フォルダから1つづつ取り出すような効率いいやり方できると思うので、そこは後日。
今回はとりあえず、上記を実行して全画像224x224に変更できた。
MS Teams を使って例外が起きたら通知するようにしてみた

はじめまして！食べログでサービス開発エンジニアをしている @uribou です。
食べログ Advent Calendar 21日目の記事として、
例外が発生した時に MS Teams へ通知するようにした話をしようと思います。

# はじめに

食べログでは、発生した例外を確認出来る社内用のアプリケーションがあります。
エンジニアはそのアプリの画面を常にチェックしており、例外が発生するとすぐに対応出来るようにしています。
しかし、画面を常に開いておかないと例外が発生したのか分からないので、タブなりウィンドウなりで画面を常に開いておかなければいけない状態でした。
画面を開いてなくても、例外が発生したら受動的に通知される仕組みにしたいですよね、、、
そこで、例外が発生したらエンジニアのPCにプッシュ通知するようにしよう！というのが今回の話の始まりでした。

# プッシュ通知検討

プッシュ通知といえば Web Push や！ということで、まず始めに Web Push でプッシュ通知することを検討しました。
しかし、今回利用出来るサーバが https に対応しておらず Service Worker が動かせないので、Web Push 案は即頓挫しました、、、

次に Notifications API と WebSocket を利用する案を考えました。
この場合、WebSocket との通信を維持するために画面を開いておく必要がありますが、別タブで開いておけばプッシュ通知されるので、それなりに便利かなと考えました。
が、Chrome 62 から https の画面でしか Notifications API を使ってプッシュ通知出来なくなったので（[参考](https://bugs.chromium.org/p/chromium/issues/detail?id=779612)）、Chrome では Notifications API を利用してプッシュ通知することが出来ません。
もう http はオワコンなんだなという気持ちになりました、、、

つらくなって来たので、Qiita::Team でみんな助けてーと叫んだところ、
社内で利用している MS Teams へメッセージを送れば、プッシュ通知出来るんじゃない？という案を頂きました。
最高です。ありがとうございます。

# MS Teams へ通知

Microsoft Teams では API が用意されており、POST してメッセージを投稿する機能が用意されています（[参考](https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors/connectors-using)）。
Ruby で書くとこんな感じです。お手軽ですね。

```ruby
require 'net/http'
require 'json'

def notify!
  uri = URI.parse('MSTeamsのAPIのURL')

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  req = Net::HTTP::Post.new(uri.request_uri)
  req['Content-Type'] = 'application/json'
  req.body = body

  http.request(req)
end

# MS Teams へ送りつける JSON
def body
end
```

上記のようなスクリプトを一分毎に cron で実行して、その間発生した例外情報をサマって特定のチャンネルへ POST しています。
リクエストメッセージボディのサイズは制限がかかっているようで、16.8 KB を超えると POST を受け付けなくなったので、ここらで制限しているようです。
今回はメッセージボディが 16.8 KB を超えたら、めっちゃ例外出てる（想像したくないですが、、、）旨だけ通知するようにしました。
チャンネルをフォローすると投稿があった際にプッシュ通知されるようになるので、これで例外が発生したらプッシュ通知出来るようになりました！

ちなみに、MS Teams では POST する JSON 次第で、様々なリッチなメッセージを送信することが出来ます（[参考](https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors/connectors-using#example-connector-message)）。
POST 出来るボタンとか生成出来るの凄いですね :flushed:

# さいごに

今回の機能を導入したところ、今までよりも素早く楽に、例外の発生を検知出来るようになりました。
例外が出ているということは、何かしらサービスに不具合が存在している可能性があるということです。
素早く例外を検知し、サービスの不具合をいち早く修正出来るようにすることは、サービス開発を行う上で非常に重要です。
プッシュ通知を実現する方法はいくつもありますが、今回のような非 https 環境で実現したい方は、MS Teams を検討してみるのも良いかもしれませんね :grinning:

明日の食べログ AdventCalendar 22日目は、@tayu1605 さんによる「【初心者必見】Rubyのメソッド探索備忘録」です。
お楽しみに！
無線(Wi-Fi)の繋がりにくさを特定するMistSystems


[モダン情シス Advent Calendar 2018](https://adventar.org/calendars/3175)の21日の記事です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49877/3003e7aa-c640-24e1-9204-f60deb42221c.png)

注意：アクセスポイントの中にはAI入ってないです

# MistSystemsって？

クラウド管理型のアクセスポイントです。
2014年に創業し、2016年よりアクセスポイントの機器の提供を開始したそうです。
立ち上げメンバーを見てみますと、元Cisco　(Meraki)が主体！
これは、MerakiがCiscoに買収されたのは２０１２年(発表)なので、つまりそういうことですね。
https://www.mist.com/company/leadership/

# なんかWi-Fi(無線)がつながりにくいんですけど？
無線アクセスポイントを設置して、運用で一番大変な問い合わせはこれだと思っています。
ひたすら面倒です。本当に面倒です。
いつ発生した問題なのか、クライアントは何か、どのような問題がおきたか、移動しながら発生したか。
アクセスポイントの電波が届いているかの確認には、サイトサーベイ(電波調査)も必要になります。
さらに、ヒアリングや調査を頑張った末に、原因不明で最後には再現を待つなんでことはざらにあります。

## そんなあなたにService Level Expectation(SEL)
アクセスポイントからデータを収集して、マシンラーニングにより解析して可視化してくれるみたいです！！
アクセスポイントの中にはAI入ってないですよ！データを送りまくるだけです。

ということで、実際にどのような感じでトラブルシュートができるのか、
試しにどのようになるのかやってみます。

まずは、管理コンソールからモニターの画面に飛びます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49877/dc3f20e0-7547-ff57-5075-03408ba07c2d.png)

Time to Connectが低いですね、、、、
これは接続する際に問題が起きてそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49877/4e6a9e18-9e92-f1ee-184c-d04a89f6eba0.png)

Mistはどんどん問題の詳細を深掘りすることができます。
これではDHCPで接続の問題が多く起きていることがわかります。
問題が置きているクライアント、OS種別なども勝手に分類してくれます。

さらにここから、問題が起きている対象のクライアントを見にいけます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49877/58b9e1dd-19b8-36f5-9384-560d10a76531.png)

そうすると、発生した時刻とエラー内容まできっちり把握することができます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/49877/356fc94f-5c25-ddc3-5901-b2d510631dda.png)

しかも、パケットキャプチャのファイルもダウンロードできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49877/08754258-ec36-2a58-cb99-0f08762760a3.png)

原因究明したい放題ですね。
ということで、DHCPサーバの問題ということで、切り分けできました。
すぐに直しにいきましょう。

みたいな感じで、１００％の原因特定まで行けるかは難しいかと思いますが、
調査の足がかりにはとても良いと思います。
また、いつ、どのような問題が発生したのか、たいぶ調査がしやすい印象です。

# 初期設定のおまけ

検証利用するだけでも、まずはシングルサインオンをしたいですね。
ID発行するのも面倒なので、MistにOkta(IdP)からログインできるようにSAMLの設定を入れます。

Mistの管理者に登録しているメールアドレスはSAML経由でログインできないので、手動登録は1つか2つにしておきましょう。

管理コンソールから設定をしまして。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49877/d751302f-65c7-a460-4c3c-eeed616018e2.png)

Okta側も設定をすれば、
ぽちっと以下のアイコンを押すだけでMistへログインできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49877/ec032bd9-ee06-b7ec-276c-f01ecfc8c1ff.png)

新しく利用するクラウドサービスで、シングルサインオンに対応してなかったら選定外にしたいぐらいです。

https://www.mist.com/documentation/saml-setup-okta/
ロール(権限)をOktaのユーザー情報Titleから取得するのはイケてないので、
そこは指定するか、グループとかの値とかから持ってきたほうがいいです。

# サポートチケットは爆速対応

管理コンソールからチケットを作成することができます。
対応速度はマジで爆速です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49877/dbc81927-63ce-3112-a71c-bfec6b7ac65b.png)

初回応答はなんと3分！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49877/b4ab01fc-9908-88e2-aec9-4f12fb5ba56c.png)

解決までなんと19分！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49877/97e97c48-f32b-88fe-eaf5-926908a022ec.png)

驚きの対応速度で手厚さを感じました。

別のチケットも初回応答が3分という爆速でした、頭おかしいんちゃう（良い意味で


# おわりに
他にもvBLE(仮想ビーコン)が優れていて、物理的なビーコンがいらなくなるとか、
すべてにおいてAPIが提供されているなど、かなり多機能ですので、引き続き検証していきます。
ということで、Mistの紹介記事になりました。
これから対応製品が出るはずの11axの機種にも期待していきたいですね。
Akka-httpで出来ること

すでに多くのAkka httpの記事が出ているのでポイントを絞ってみました。
Akka httpを選択する理由として参考にして貰えると有り難いです。

## Akka httpにおけるask

```scala
path("hello") {
        get {
          onComplete(
            (supervisorActor ? "ping").mapTo[String]) {
              case Success(text: String) =>
                complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, s"<h1>Say hello to akka-http: $text</h1>"))
              case Failure(ex) =>
                complete(StatusCodes.InternalServerError)
            }
        }
      }
```

askを使ってメッセージを送る場合は、onCompleteを使います。

```scala
implicit val timeout = Timeout(5 seconds)
```

Timeoutをimplicitすることで、メッセージが帰ってこなかった場合は Failure が帰ります。

## ~

```scala
...
} ~
pathPrefix("hoge") { ...
```

チルダ(~)を使うと、最初のルーティングがリクエストを拒否した場合に次のルーティングを検証してくれます。
例外が発生しやすいaskを実行しても、うまくリカバリーできそうな所が良いですね！

## entity

```scala
entity(as[Apple]) { apple =>
   ...
}
```

jsonFormat1〜22までのjson文字列をパースしEntityに変換出来ます。

```scala
implicit val appleFormat = jsonFormat14(Apple)
```
キーが14個あれば、jsonFormat14を使います。
typeというキーが使いたい場合は、 ``` `type` ``` にします。

先程のチルダ(~)と組み合わせれば、型が一致するまでルーティングを検証してくれるので、型にあわせたルーティングも可能になりますね。

## entityが使えない場面でも・・・？

```scala
onComplete(Unmarshal(json).to[Apple]) { ... }
```
Unmarshalを使うことで、entityが使えない場面でもjsonをパースできます。
この場合は、onCompleteを使います。

## id

```
pathPrefix("item" / LongNumber) { id => ... }
```

URLからidを取得する方法です。わかりやすいです。
他にも[正規表現を使ったりパターンマッチなど様々なMatcher](https://doc.akka.io/docs/akka-http/current/routing-dsl/path-matchers.html)があります。

## 最後に

直感的でシンプルでわかりやすく、実際の処理は `!` や `?` に処理を投げ、例外時のリカバリもしやすいのでおすすめです。
Kubernetesでlatestイメージ運用する方法

# これは何
今までdocker stackを利用しており、ブランチ毎の最新のコードをそれぞれの環境にブランチ毎のコンテナイメージタグを付けてデプロイするという運用をしていました。
Kubernetesに移行した際に同じような運用を行おうとした時にハマりどころがあり、その解決方法について書きたいと思います。

# 前提
Kubernetesでは`latest`タグイメージの運用は適切なロールバックを行うことが難しいので推奨されていません。
できる限りVersion、もしくはdigest値でのイメージ指定を行いましょう。

# latest指定の問題点
通常、違うイメージタグを指定するのであれば[公式](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#updating-a-deployment)に書いてあるような、`kubectl set image`や`kubectl rolling-update`でコンテナイメージの更新を行うことができます。

しかし、同じイメージタグの最新イメージを更新しようとするときは上記の操作では更新されません。
`imagePullPolicy: Always`を設定すれば更新してくれるかと思いましたが、この設定値は`pod`が起動するときのポリシーの設定です。
よって、`pod`が起動するときにコンテナイメージリポジトリから`latest`がついているコンテナイメージをPullするような動作になります。

# 解決方法
## `pod`を手動で削除する方法
`pod`を手動で削除すると、`Deployment`は新規にpodを作成するので、その際にコンテナイメージリポジトリから`latest`がついている最新イメージをPullしてきます。しかしながら、手動で`pod`を削除すると勿論通信障害が発生するのでありえません。

## `Deployment`のPodTemplate(`.spec.template`)を書き換える方法
DeploymentのPodTemplateの変更は、rolloutのトリガーとなっているので、新しいpodへのアップデートが自動的に行われます。
新しいpodが作成される際に`imagePullPolicy: Always`が動作するので、最新のコンテナイメージをPullしてきてくれます。
PodTemplateを書き換える値はメタデータのラベルでも良いので、実際にイメージを更新する際には`kubectl patch`コマンドを利用し、以下のようなコマンドで行うことができます。

```
kubectl patch -n ${Namespace} deployment ${DeploymentName} \
              -p "{\"spec\": {\"template\": {\"metadata\": {\"labels\": {\"date\": \"$(date +'%s')\" }}}}}"
```

# 終わりに
パッケージとコンテナイメージは適切なバージョニングを行い、複数の環境毎にバージョン指定を行うと、現在動いている環境からソースコードまでたどり着くことが容易です。可能であれば適切なバージョニングを行うようにしましょう。
GoogleChartの軸のフォントの変更方法

# 概要
とあるWebサイトにGoogle Chartを導入したのですが、困ったことに背景色のせいで文字が非常に読みにくいです。
なんとか文字色を変えようとしたのですが、コードだけ乗っけても面白くないので、解決までの道のりを残しておきます。

#現象
![image.png](https://qiita-image-store.s3.amazonaws.com/0/85205/2d13e5e0-9026-2f99-5d94-af536cd98558.png)

文字色を変えないと文字が非常に読みにくいです。

#試したこと1. 公式ドキュメントを読む

何はともあれ公式のドキュメントを読んで見ます。

>Timelines | Charts | Google Developers
>https://developers.google.com/chart/interactive/docs/gallery/timeline

しかし、データの色(上の画像だと黄色の部分)を変更するオプションはいくつか用意されているのですが、軸の文字に関するオプションは見当たりません。

次。

#試したこと2. Google検索

>googlechart timeline 軸 で検索
https://www.google.com/search?q=googlechart+timeline+軸

>googlechart timeline 軸 文字色 で検索
https://www.google.com/search?q=googlechart+timeline+軸+文字色

いつも通りGoogleで探してみたのですがどうもそれっぽいものはヒットせず。

ここで1時間以上足止め食らってます。。。

次。

#試したこと3. 英語で検索
英語アレルギーなので、効率が悪いとは思いつつも仕方無く英語で検索してみることに。

>google chart axis color timeline で検索
https://www.google.com/search?q=google+chart+axis+color+timeline

![image.png](https://qiita-image-store.s3.amazonaws.com/0/85205/b4f34e24-7e25-6f01-a5db-3a9408416dc1.png)

なんと一発でそれらしき記事を発見。

>Google Charts Change color of X-Axis Font for Timelines - Stack Overflow
https://stackoverflow.com/questions/52156120/google-charts-change-color-of-x-axis-font-for-timelines
![image.png](https://qiita-image-store.s3.amazonaws.com/0/85205/39df3245-1af9-fcbb-6cf4-4e299402edef.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/85205/3af0ad90-4093-4da7-aa31-ff0d81bd6138.png)

>```
google.visualization.events.addListener(chart, 'ready', function () {
  var labels = container.getElementsByTagName('text');
  Array.prototype.forEach.call(labels, function(label) {
    if (label.getAttribute('text-anchor') === 'middle') {
      label.setAttribute('fill', '#ffffff');
    }
  });
});
```

意訳すると、
>`hAxis.textStyle`は無効なオプションだから使えない。
>けれど`ready`イベントの発生後に文字の色を書き換えることが出来るよ。

とのこと。

上記サイトを参考にしてコードを追加してみます。



#結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/85205/5a5511d5-ef8e-e447-822e-4169b4b51d69.png)
無事、文字色を変えることができました。


#まとめ
日本語で検索していた時間はなんだったんだと思わざるを得ない結果に・・・。

まあ英語の検索とは言いつつも、単語自体は単純で、
Google Chart: サービスの名前
axis : 軸
color : 色
timeline : チャートの種類
と、これだけ。

検索ワードに日本語を含めてしまうと日本人向けにパーソナライズされてしまうため、出来るだけ日本語を含めないほうがよさそうですね。

そろそろまじめに英語を勉強しよう。
今日、mecabの導入に失敗した

Python(MeCab) on Dockerで日本語テキスト処理APIをサクッと実装
https://qiita.com/oreyutarover/items/909d614ca3b48d2c9e16

順調に進んで、エラーがでたのは


```
bin/install-mecab-ipadic-neologd -n -y
...
[make-mecab-ipadic-NEologd] : Make custom system dictionary on /mecab-ipadic-neologd/libexec/../build/mecab-ipadic-2.7.0-20070801-neologd-20181210
make: Nothing to be done for 'all'.
[make-mecab-ipadic-NEologd] : Finish..
[install-mecab-ipadic-NEologd] : OK. Let's install mecab-ipadic-NEologd.
[install-mecab-ipadic-NEologd] : Start..
ls: cannot access '/usr/lib/x86_64-linux-gnu/mecab/dic': No such file or directory
/mecab-ipadic-neologd/bin/../libexec/install-mecab-ipadic-neologd.sh: line 56: [: 0: unary operator expected
[install-mecab-ipadic-NEologd] : /usr/lib/x86_64-linux-gnu/mecab/dic isn't current user's directory
[install-mecab-ipadic-NEologd] : Sudo make install to /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
/mecab-ipadic-neologd/bin/../libexec/install-mecab-ipadic-neologd.sh: line 72: sudo: command not found
```
また明日がんばろう。
【現時点では全て追記予定】PythonでSEM：pypeR経由

## Pythonで共分散構造分析(SEM)したい

#### 【こんな人向け】
* 普段はほぼpython
* Rは簡単に触ったことあるから書けないわけじゃない．
* PypeR初心者．
* Macをつかっていて，AMOSは使えない

#### この記事を書く動機
* 研究やらなんやらで，質問紙実験をすることになり，  
  <b>pythonで共分散構造分析（SEM）できたらいいのに</b>なぁと思い立ちました．
* 自分は，普段のデータ整形から集計，分析にかけてほとんどpythonでやってしまうので，  
できればあらゆる分析を<b>pythonでやりたい</b>．
* 「python SEM」と調べてみると確かになんかある．けど圧倒的に知見が少なそう．  
一方で，SEMと調べるとR,AMOSといった文字が並ぶ...  
じゃぁ，<b>pypeR使ってpythonからR</b>やってみるかとおもってそれをまとめます．  

## 共分散構造分析とは...
これだけで，何こも記事書けそうだけど．とりあえず追記予定

## Step1　pythonからRをつかう：pypeRにまじ感動
とりあえずinstallation  

```python
pip install pypeR
```

python上でimport

```python
import pyper
```

ためしに，a=1+2をやってプリントしてみる]

```python
import pyper
r = pyper.R()                     #Rをこれで呼び出してるみたい．
r("a = 1 + 1")                    #r(code)の形， codeはstr型でrのコード
print(r("a"))

# try({a})
# [1] 2
```


## Step2　SEMに必要なデータ整形

## Step3　RでSEM

## Step4　pythonから結果取り出し



## 参照記事
https://qiita.com/m__k/items/df83a03bc7aa1ad0a59e

https://qiita.com/deaikei/items/9e5de7f97c5e0a061c5d

http://mizumot.com/handbook/?page_id=625
[BigQuery]日時情報の取得や日付処理

自分で作業する用のメモ

#現在時刻の取得
```sql

SELECT current_datetime('Asia/Tokyo')
```

#現在年月日の取得
```sql
SELECT current_date('Asia/Tokyo')
```

#n日前の年月日の取得
```sql
SELECT DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL n DAY)
```

#n日後の年月日の取得
```sql
SELECT DATE_ADD(CURRENT_DATE('Asia/Tokyo'), INTERVAL n DAY)
```

#月日を取得する
```sql
SELECT FORMAT_DATE("%m-%d", DATE "2008-12-25")
>12-25
```

#今日から一か月前の年月日
```sql
SELECT DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 1 MONTH)
```

#先週の最初の日を取得する（日曜始まりの場合）
```sql
SELECT DATE_SUB(DATE_TRUNC(CURRENT_DATE('Asia/Tokyo'), week), INTERVAL 1 week)
```

#先週の末日を取得する（日曜始まりの場合）
```sql
SELECT DATE_SUB(DATE_TRUNC(CURRENT_DATE('Asia/Tokyo'), week), INTERVAL 1 DAY)
```

#先月の月初を取得する
```sql
SELECT DATE_TRUNC(DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 1 MONTH), MONTH)
```

#先月月末を取得する
```sql

SELECT DATE_SUB(DATE_TRUNC(CURRENT_DATE('Asia/Tokyo'), MONTH), INTERVAL 1 DAY)
```

#unixtimeをJSTに変換する
```sql

SELECT FORMAT_TIMESTAMP('%Y-%m-%d %H:%M:%S', TIMESTAMP_SECONDS(カラム名), 'Asia/Tokyo')
FROM テーブル名
```
#unixtimeをDATE型に変換する
```sql
SELECT DATE (TIMESTAMP_SECONDS(カラム名))
from テーブル名
```

#参考にしたサイト
[BigQueryドキュメント](https://cloud.google.com/bigquery/docs/reference/standard-sql/)
Stretch Databaseを使ってみる

#はじめに

最近、Azureのサービスに触れる機会がありましたので、
比較的新しい!?はずのサービス[Streach Database]について触れてみます。

##〇Stretch Databaseとは
透過的かつ安全にコールド データを Azure クラウドに移行する方法、です。
<参考>
https://docs.microsoft.com/ja-jp/azure/sql-server-stretch-database/

ローカルDBに蓄積されたコールドなデータ(参照頻度が低いもの)をAzure上に移管するイメージ。
必要に応じてオンラインでコールドデータへのアクセスが可能。
※SQLServerがバックグラウンドで頑張る感じ

###具体的なメリット
〇価格・コストがスケーラビリティ★。
https://azure.microsoft.com/ja-jp/pricing/details/sql-server-stretch-database/
上記サイトで試算可能です。

〇基本そのまま使える
サーバー換えた、接続先情報変更しなきゃ、といったものは不要。

使いどころのイメージとしては
 - オンプレミスでSQLServerを利用しているがストレージの空きが不安(物理的な拡張コスト含めて）
 - 履歴データなど、過去データが蓄積されていてメンテナンスしたいが消すのは微妙(いつか使うかも)
こういうシーンに効果的なのでは。。と想定しています。

SQLServer2016以降であれば利用可能なようです。
基本的にローカル - Azure間の通信は暗号化されるようです。

##〇はじめに2
クラウド化が進む世の中ですが、まだまだオンプレミスでの運用も見受けられますので
出来るだけコスト・影響を少なく長期的な運用を提供するか、を考えた際の一つのアプローチにつながれば、
と思い実際に使ってみようと思いました。
なので、この記事は初めて触れてみる、的なレベルの内容になります。
ご了承くださいませ。

#〇実践
##診断する
https://docs.microsoft.com/ja-jp/sql/sql-server/stretch-database/stretch-database-databases-and-tables-stretch-database-advisor?view=sql-server-2017

Stretch Databaseに向いているか診断する[Data Migration Assistant]というツールがある模様。
こんな感じ。
<トップ画面>
<img width="636" alt="img_datamigrationassistant_top.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215731/24d8eebe-2bab-ea18-209d-dc622d0cdd1d.png">

<途中の画面>
<img width="634" alt="img_datamigrationassistant_step1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215731/c9054db2-927d-c61f-128e-a089bc90f8b8.png">

英語版しかないのであれですが、個人的には雰囲気である程度触れました。

##設定する
ローカルの適当なデータベース＞テーブルにStretch設定。
SQLServerManagementStudioで操作します。
対象のテーブル名で右クリック＞Stretch＞有効化の順に進めます。
そうすると以下の画面が起動。
<img width="412" alt="img_streach_step1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/215731/9592196c-f1ed-adf8-a1a3-8144ec75ed29.png">

[次へ]で進めていくとAzureへのサインインを要求されますのでサインイン。
サブスクリプションを選択。
リージョンを選択。
サーバーを新設する or 既存サーバーを利用するか選べます。(今回は新設を選びました)
新設する場合のサーバー名は以下のルール見たいです。
※stretchserver-[PC名]-sql-[カタログ名]-[タイムスタンプ]
ログイン名、パスワードを入力。

資格情報保護目的のデータベースマスターキー(DMK)の入力を要求されます。
入力し次へ。
通信する際のIPを設定。
完了です。(データ次第かと思いますが約1000レコードでプロビジョニング5分くらい)

AzurePortalで確認するとそれっぽいサービスが出来ています。
※拡張データベースといった表記になります

##確認
移管されているか確認。
データ領域を確認してみると0.180MBから0.008MBに変わっていますね。
まじかー

接続してクエリで確認してみます。
実際にレコードあるかのように結果が返ります。
クラウド側への参照情報のみが残っている感じなのかな。。

##その他
関数フィルターを定義してテーブル情報にセットする形で任意の条件で移管できるようです。
例) ある日付型のカラムの値が2018/01/01より前のデータを。。等

<参考>
https://docs.microsoft.com/ja-jp/sql/sql-server/stretch-database/select-rows-to-migrate-by-using-a-filter-function-stretch-database?view=sql-server-2017


#おわりに

雑な記事ですが、最後までお付き合い頂きありがとうございました！
「カバレッジ100%になった」だけでは足りない

# そもそもカバレッジって一体何なの
> コードカバレッジは、コードのテストされていない部分を発見するための有用なツールである。
[テストカバレッジ](http://bliki-ja.github.io/TestCoverage/)

コードを書いた、それからとりあえず動作確認するときに気にするといいですね。
コードの中に動かしてない箇所がある、何それ怖い。だからテストを実行してカバレッジを取得して、動かしてない部分があるか確認する。
そういう使い方が正しいと、私は考えています。

あとはリファクタリングや改修の後の確認のひとつとして。
通るはずの行が通らない/通らないはずの行が通る、そんな箇所では修正ミスをしているかもしれません。

素敵なツールですね。積極的に使っていきたいです！

# カバレッジ100%であるコードの正確性
ですが、こんなことも言われています。なぜでしょうか。
> ただテスト自体がどれだけ良いかという指標としては、テストカバレッジはほとんど役に立たない。
[テストカバレッジ](http://bliki-ja.github.io/TestCoverage/)

カバレッジは、その行を通ったか/通っていないかだけを教えてくれます。
その行を通ることが正しい/正しくない、それは検証しません。
あれ？ということは、処理内容の正しさの確認としては無意味ということ……？

# なぜ目的にしてはいけないのか
> カバレッジの数字ばっかり気にして、自分が何をやっているかわかっていない人間のいる臭いがする。
[テストカバレッジ](http://bliki-ja.github.io/TestCoverage/)

カバレッジ100%を目的にした場合、これこそが陥りやすい罠です。

以前、単体テスト完了とする基準が「JUnit実行してカバレッジ100%」であるプロジェクトに遭遇したことがあります。
結合テストやってるけど、品質がやばくて単体テストからやり直ししたいからヘルプしてどうぞって指示で見てみたところ、テストコードはJUnitテストクラスなだけで、テストの意味がなかったんです。
カバレッジは、ステートメントカバレッジ(C0:命令網羅率)でいえばほぼ100%でした。
(判断文カバレッジ(C1：分岐網羅率)はいいとしても、単純条件カバレッジ(C2：条件網羅率)は随分と漏れがあったけど[^1])
その上で、実行結果に対する検証は一切ありません。

──つまり、テスト対象を呼び出しただけ。だって目的がカバレッジ100%だから。
その結果、処理結果に対する正確性の確認が、丸ごと漏れていました。

具体的に再現例を出しましょう。恐れ慄くといい。

```java:Sample.java
// 空文字チェック
public static boolean isEmpty(String value) {
	if (value.length() != 0) {
		return true;
	}
	return false;
}
```
```java:SampleTest.java
// 空文字チェックのテスト
@Test
public void test_isEmpty() {
	Sample.isEmpty("");
	Sample.isEmpty("ABC");
}
```
上記は、確かにカバレッジが100%になります。
戻り値がtrue/falseのどちらでその値が意図通りなのかどうかが未検証ですが、基準が前述の通りでしたのでテスト完了！としていました。
……ひどい。この世の地獄か。……まあ実際地獄でしたよテストクラスの修正は。

実際にあった本当に怖い話、です。

#### ※再現例について
上記で不足しているのは、処理結果の検証だけではありません。
テストケース(データのバリエーション)もですが、そちらは別の話なので割愛しています。

再現例では例えば、引数がnullだとNullPointerExceptionが発生します。テストは失敗です。
NullPointerExceptionが発生するのが仕様として正しいのかどうかは、別問題ですが。
また、テストを実行しても引数がnullの場合の検証がありませんので、その仕様が正しいかどうかの検証もされません。
引数がnullの場合の仕様が設計から漏れているのか、それとも単に実装者の考慮漏れなのかもわかりませんね。

ただ、**カバレッジ100%が目的のテストでは、品質が保証できない**ことだけは確実です。

# 何のためにテストを行うのか
どうしてテストを行うのか。
それはカバレッジを100%にするためではなく、コードが仕様通り動くことを確認するためです。
テスト自体の品質評価として、カバレッジだけでは役に立ちません。
カバレッジが100%にするためのテストは、いくら実施しても品質向上に寄与しません。
ですので、カバレッジ100%を目的とするのはやめましょう。

個人的には、「カバレッジ100%」は、品質向上のための**手段のひとつ**としてなら、いいと思うんですけどね。
自分の書いたコード内に動かしてないところが存在するなんて不安ですし。
手段ではなく目的にしてしまうケースがとても多いので、いろんなところで否定されているのだと思います。


[^1]: カバレッジの種類について [カバレッジ(網羅率)分析とは](https://www.techmatrix.co.jp/t/quality/coverage.html)
見たくないもの

# Version 1.1901
**見たくないもの！**

```perl:1.1901
$ perl -MTime::Local -le 'print $Time::Local::VERSION'
1.1901
$ perl -MTime::Local -le 'print timelocal(59, 59, 23, 16, 0, 2038)'
2147266799
$ perl -MTime::Local -le 'print timelocal(00, 00, 00, 17, 0, 2038)'
Cannot handle date (0, 0, 0, 17, 0, 2038) at -e line 1
```
# Version 1.2300

```perl:1.2300
$ perl -MTime::Local -le 'print $Time::Local::VERSION'
1.2300
$ perl -MTime::Local -le 'print timelocal(59, 59, 23, 16, 0, 2038)'
2147266799
$ perl -MTime::Local -le 'print timelocal(00, 00, 00, 17, 0, 2038)'
2147266800
```

**バージョンアップは忘れずに！**
フロントエンドのデバックチェックリスト

どうもこんにちは私です。
本日は私がいつも行なっているデバック項目をご紹介しますー。

　
## form動かない編
フォームが動かなくなることが割とよくあります。
その時にチェックする項目をご紹介します。

### action先があっているか確認する
肝です。formというのは「情報を次のページに送ることのできるリンク」みたいなものなので、はじめに送信先を設定しなければ当然エラーがおきます。

```
<form method="post" action="[ここがあってるかcheck]">
```

### nameがちゃんと全て送信できているか確認する
formというものはnameに紐づけてデータを送信しています。また、actionで設定されている送信先では大抵あらかじめ受け取るnameを設定した上で、一つでもなかった場合エラーを吐くようにしています。
なので、バックエンドの人に受け取る前提のnameリストをもらった上で、「そのネームがちゃんとあるか・スペルミスがないか」をしっかりと確認しましょう

```
<input type="text" name="[ここをcheck]">
```

### formタグに囲われていない
稀に、意図しないところにinputタグを置いてしまっていて、formが正常にnameに付与されたデータを送信できていな場合があります。
formタグにしっかり囲われているか確認しましょう

```
<form method="post" action="/check.html">
　　　<input type="text" name="aaa">
 <input type="submit" value="go">
</form>
```

### そもそも送信先のページが存在しない
稀に、自分の作り忘れでこんなことが起こることもあります。しっかり確認しましょう


## CSS効かない編
cssがなぜか効かない！そんな時のチェック項目を紹介します

###  リンクが切れている
ページ移行をした時などは特に多いです。しっかり確認しましょう。
一番確認しやすい方法は、ブラウザに　html　を入れて、cssが聞いていない状態のwebサイトを開きます。
検証ツールなどでcssのURLを貼っているところまで行き、そのURLを開いてみます。
開けなければ、それはリンクが切れているので、URLを再度見直しましょう

### プリプロセッサーのコンパイルの関係でcssが反映されれいない
これもありがちです。私たちではわからないレベルのエラーか何か起きているのでしょうか、たまに、見た目では回っていてもcssが吐き出されていないことがあります。この場合も一旦、吐き出し元のcssを参照し、ちゃんと記述として吐き出されているかを確認しましょう。

###htmlとcssの名前のスペルミス
私の中ではこれが圧倒的に多いです。
私はキャメルケース（kimihaKirei）を使うことが多いのですが、うっかり大文字の箇所を小文字にしていたり、名前を変えた関係上冒頭が大文字になってるとかでcssで設定している名前と誤差が生じて効かなくなります。今一度チェックしましょう

### html内のclassのスペルが間違っている
プリプロセッサーを使っている人は無縁かもしれませんが、html直書き時代はよくやらかしていました。cssネームにだけとらわれていてなかなかん気づかないんですよね！

### cssの優先順位的に負けている
検証ツールでもし自分の設定したcssが打ち消されていればそれは優先順位の関係上負けていることになります。
他のcssに影響がなければそこの記述を変更。ありそうであれば、さらに優先順位をあげるか、あまりいい方法ではないですが！importantを付与して優先順位をあげてあげましょう。
vimのsyntaxのデバッグの補助コマンド

# vimのスタイル(syntaxとhighlight)

vimのsyntax定義はなかなか複雑なことができてしまうので、(プラグイン作成中など)適用状態の確認がそれなりに必要です。

というわけで、ぐぐって、「現在状態を出力する方法」を学びました。
毎回やるのは面倒なのでコマンド化します。

さすがにキーにアサインするほどじゃないかな...

```vim:.vimrc
" function
function! s:EchoSyntax(status)
  if a:status
    redraw | echon synIDattr(synID(line('.'), col('.'), 0), 'name')
  endif
endfunction

" command
command! SyntaxEcho        :call <SID>EchoSyntax(1)
```

これで現在のカーソルの位置のsyntax名をechoすることができます。