OmniAICreator/Qiita-1.07M huggingface dataset:
文字列テーブルから動的にenum型を作る

案外情報が少なかった気がするのでまとめてみた。

ほとんどのことは文字列テーブルでも動的Enumでも同じことができる。

ただ、値の比較は文字列よりも動的Enumの方が早い。
(「文字列の比較」と「数値の比較」なので当たり前ですが)

値の比較を頻繁に行うような場合は動的にEnumを作成しても良いかもね。
(文字列テーブルのインデックス比較でも良いのですけどね。。。)

作り方
----

```csharp
using System.Reflection;
using System.Reflection.Emit;

static System.Type BuildEnum(string[] strings)
{
    AssemblyName asmName = new AssemblyName{ Name = "MyAssembly" };
    System.AppDomain domain = System.AppDomain.CurrentDomain;
    AssemblyBuilder asmBuilder = domain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);
    ModuleBuilder moduleBuilder = asmBuilder.DefineDynamicModule("MyModule");
    EnumBuilder enumBuilder = moduleBuilder.DefineEnum("MyNamespace.MyEnum", TypeAttributes.Public, typeof(int));

    for (int i = 0; i < strings.Length; ++i)
        enumBuilder.DefineLiteral(strings[i], i + 1);

    return enumBuilder.CreateType();
}
```

静的なenumとの書き方比較
----

```csharp
enum Animal { Dog, Cat, Horse, Elephant }
```

```csharp
string[] animalTable = new string[] { "Dog", "Cat", "Horse", "Elephant" };
System.Type enumType = BuildEnum(animalTable);
```

### インスタンス生成

```csharp
Animal animal;
```

```csharp
System.Enum animal = (System.Enum)Activator.CreateInstance(enumType);
```

### 値の代入

```csharp
animal = Animal.Cat;
```

```csharp
animal = (System.Enum)enumType.GetField("Cat").GetValue(null);
```

### 文字列から値生成

```csharp
animal = (Animal)System.Enum.Parse(typeof(Animal), "Horse");
```

```csharp
animal = (System.Enum)System.Enum.Parse(enumType, "Horse");
```

### int型との型変換

(注)例外処理は省略

```csharp
int val = (int)animal;
animal = (Animal)val;
```

```csharp
int val = (int)animal;
animal = (System.Enum)System.Convert.ChangeType(val, enumType);
```

おまけ
----

### Unityエディタ拡張のEnumPopupメソッド

```csharp
System.Enum newVal = (System.Enum)EditorGUILayout.EnumPopup(animal);
```

文字列のまま扱う場合はこちら↓

```csharp
int oldIndex = 〜;
int newIndex = EditorGUILayout.Popup(oldIndex, animalTable);
```
rspec で「一回だけ」例外発生させたい


久々にちょっとレアケースな感じの rspec 書いたら上手く動かずハマりました :innocent: 
一回目は例外出したいけど二回目からは出したくない、的な。
具体的には DynamoDB の WriteCapacity を超えてしまった際に時間を少し開けてリトライさせる処理のテストです。

## テスト対象のコード（簡略化したもの）

```rb
def call
  hoge.fuga
rescue PiyoError
  retry
end
```

### 上手く行かなかったやつ。

```rb
before do
  allow(hoge).to(receive(:fuga)).once do
    raise PiyoError
  end
end

it do
  subject
  expect(line_user).to have_received(:update_latest_talk_cache!).twice
end
```


- See: [Block implementation \- Configuring responses \- RSpec Mocks \- RSpec \- Relish](https://relishapp.com/rspec/rspec-mocks/v/3-8/docs/configuring-responses/block-implementation) 
    - `allow(dbl).to receive(:foo).once { do_something }` 

動作的には 1 回だけ raise されるようになるが、 expect で 1 回しか実行していない、と怒られる。
恐らく `fuga` が 1 回目の実行分しか spy オブジェクトにならないんだと思う。

### 結局こうした。

```rb
before do
  @count = 0
  allow(hoge).to(receive(:fuga!)) do
    if @count.zero? # NOTE: 一度目の実行のみ例外を出す
      @count += 1
      raise PiyoError
    end
  end
end

it do
  subject
  expect(line_user).to have_received(:update_latest_talk_cache!).twice
end
```
KibanaのIndex Pattern作成で、"Service Unabailable"になる

本当にくだらない話ですが、意図しないproxyによりハマってしまったので、書いておきます。

- Elasticのフォーラム : https://discuss.elastic.co/t/kibana-index-patterns-service-unabailable/147524 の話

# 現象

ElasticStackを使っていて、新たにIndexPatternsを作成しようとしたら、「Service Unabailable」となり、IndexPatternが正常に作成できなかった。

- Index Patterns作成以外は、正常に利用できている用に見える
- "Service Unabailable"となるが、Objectは作成されている
- Objectの中身は、Fields 以降の情報が途切れている
    - よって、正常にIndexPatternとしては利用できない

# 調査

- 念の為、登録されているDocumentのマッピングを確認する
    - `GET 対象のINDEX/_mapping`
    - Document側は問題なく登録されているようだ
- Index Patternの状況を確認する
    - `POST .kibana/_search`
    - 当該IndexPatternは、Fields以降の情報が登録されていない。
- 利用通信経路で、Proxyが意図する/しないにかかわらず設定されない事を確認する
    - 自部署以外がProxyを管理している場合は要注意
    - systemのproxyを利用する、とかも注意
    - Firefoxが、システムのプロキシに関係なく使えるのでオススメなのか？

# 結果
ブラウザ外とせずProxy設定されていた。
これを外すことでindex patternが作成できた。

"IndexPattern作成"以外に影響がなかったために気が付かなかった。
もしかしたら、Visualize作成でも保存ができないとかは有るかもしれない。
OculusGoでUnityアプリが落ちる問題と対処方法（Texture2D）

# はじめに
* OculusGoアプリをUnityで作成していた際に落ちるようになったので、その原因を調査していました。

# 現象
* アプリ上で画像の表示切り替えを繰り返していると落ちる
    * 画像の切り替えを3〜4回すると落ちる（画像の切り替えをしなければ落ちない）
    * PC上では落ちない

# 原因
* Texture2D.LoadImage()を複数回実施していたため
    * 読み込んでいる画像データは、JPEG画像をバイナリ化したもの（THETA V静止画、5376×2688）
    * ６〜７回目くらいで落ちる

# 対策
* 未使用となったテクスチャを意識的に開放するようにした

```c#:LoadImage（6〜7回実行すると落ちる）
    Texture2D tex = new Texture2D(2, 2, TextureFormat.RGBA32, false);
    tex.LoadImage(data);
    _mainScreen.GetComponent<Renderer>().material.mainTexture = tex;
```

```c#:LoadImage（落ちなくなった）
    Texture2D tex = new Texture2D(2, 2, TextureFormat.RGBA32, false);
    tex.LoadImage(data);
    Texture oldTex = _mainScreen.GetComponent<Renderer>().material.mainTexture;
    if (oldTex != null) {
        Behaviour.Destroy(oldTex);
    }
    _mainScreen.GetComponent<Renderer>().material.mainTexture = tex;
```

# 考察
* OculusGoでは、利用できるテクスチャが少ない？
    * システム上で落ちる前まで保持しているテクスチャは6〜7つ（＝利用できるテクスチャ）
* 未使用になったテクスチャは期待通りに開放してくれない
    * 明示的な開放が必要


# 参考資料
* https://qiita.com/tempura/items/b87eb07568d974664671
Elastic Beanstalk 特定環境の全インスタンス上でコマンドを実行する方法

# 結論

```
aws elasticbeanstalk describe-instances-health --environment-name my-app | jq -r ".InstanceHealthList[].InstanceId" | xargs -I {} eb ssh --instance {} --command pwd
```

上記を実行すると、`my-app` 環境にある全インスタンスで `pwd` コマンドが実行されます。

# 必要なもの

* awscli
    * `pip install --user awscli`
    * `aws config`
        * トークンとシークレットを入力
* ebcli
    * `pip install --user ebcli`
    * `eb ssh` を実行できるようにする
        * `eb init` や鍵のセットアップなどをした気がするが、覚えていない・・・
* jq
データをかっこよく可視化できる「Flourish」を使ってみた

#きっかけ
同じチームの後輩がデータを上手に可視化してくれるツール[「Flourish」](https://flourish.studio/)を見つけました！
普段の業務でデータをまとめる機会はあまりないのですが、面白そうなのでいじってみました。


#[Flourish](https://flourish.studio/)の使い方
![image.png](https://qiita-image-store.s3.amazonaws.com/0/261128/f7c0f821-b647-67d6-b7e4-9a56557c874f.png)

googleアカウントでログインまたは新規登録をすることで簡単に使う事ができます！
ログインするとチュートリアルがあり、
作りたいグラフの種類を選ぶ→デザインなどを微調整する→データを入れる...
と使い方をレクチャーをしてくれるのでわかりやすいです:grinning:

#どんなものができるの？
データを入れてさっと作ってみたのがこちら

**セ・リーグ順位表**
　6/3~6/10のセリーグ球団の貯金/借金を入力。
　rank表示/score表示も選べます。
![baseball.gif](https://qiita-image-store.s3.amazonaws.com/0/261128/27606b0e-a3f9-2c5d-fff0-03b3fca0dcf1.gif)

#所感
今回は手入力でデータを作りましたが、CSVやExcelファイルなどをインポートすることもできます！
GUIで簡単にデータを可視化できるのでお手軽です。
他にもたくさんのグラフがあるので、ぜひ[Flourish](https://flourish.studio/)に触れてみてください！
[MATLAB] コマンドウィンドウやエディタのカラースキーマを変更したい

デフォルト設定は背景が白で眩しいです。

色の指定はMATLABの設定で変更が可能ですけれど、制御構文、文字列、システムコマンド等など、多すぎて煩雑です。

色を一括して変更するためのツール「MATLAB Schemer」が公開されていますので、これを使うと簡単便利です。

[https://jp.mathworks.com/matlabcentral/fileexchange/53862-matlab-schemer](https://jp.mathworks.com/matlabcentral/fileexchange/53862-matlab-schemer)

1. Downloadボタンで zip ファイルをダウンロード（MathWorksアカウントが必要）
2. 適当なディレクトリに解凍
3. MATLABコマンドウィンドウで2のディレクトリに移動
4. schemer_importを実行し、ファイル選択ダイアログが開いたらschemes/*.prfを指定

最後に指定するprfファイルは、下記にイメージの一覧が掲載されています。
[https://github.com/scottclowe/matlab-schemes](https://github.com/scottclowe/matlab-schemes)
Qiitaでよく見る、よくない記事

# はじめに
投稿頻度はそれほど多くない自分ですが、Qiitaに投稿されている記事でよくある”よくない記事”のパターンを個人的な解釈でまとめてみました。
（少し過激な内容になります。途中で気分が悪くなった方はブラウザバックで。。。）

# ガイドラインでは
> Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」です。プログラマーが興味を持つものではなく、プログラミングに関する記事を投稿しましょう。

この記事、プログラミングに関する記事じゃないよね？って思うかもしれませんが、よくない記事が多いので書かせてください。。。

> 「プログラミング 」「プログラマー」という言葉の扱いについて
>>ガイドラインで記載されている「プログラミング」や「プログラマー」という言葉の扱いについて補足でご説明します。
私たちの認識としては、技術的な内容が記事の主目的である限りは、「プログラミングに関係ある」記事だと考えています。

>>例えば「厳密にプログラミングとは言えない記事」「プログラマーのライフスタイルに関する記事」など判断に迷う場合は、「技術的な内容が主目的かどうか」を基準として考えています。

>>厳密に定義されている「プログラミング」や「プログラマー」の意味合いとは解釈に違いがあることも理解しておりますので、今後、より適切な表現に改めていくことを検討します。

# よくない記事達

## 質問投稿サイト？
Qiitaは質問投稿サイトではありません。[stackoverflow](https://ja.stackoverflow.com/)とか[teratail](https://teratail.com/)などで質問することをおすすめします。

## メモツール
markdownが好きなら[Boostnote](https://boostnote.io/)とかで。
公開したいなら[note.mu](https://note.mu/)とか[Gists](https://gist.github.com/)で書くべきです。
メモだけでは、他人が見ても理解できません。

## ブログを投稿
ブログサービスを利用しましょう。
頑張ったこと、目標などの内容は「プログラミングに関する記事」ではないです。もし学習した内容を投稿するのであれば、学習したプログラムの解説などを投稿するべきです。

## 記事の一部を抜粋
[はてなブックマーク](http://b.hatena.ne.jp/)のコメント機能、[Twitter](https://twitter.com/)とか[Facebook](https://ja-jp.facebook.com/)のシェアなどで行うべきです。
記事の補足や、解説などを付けるのであれば良いかもしれません。

## 入門書
HTMLのタグやLinuxのコマンドなど投稿する前に、リファレンスを確認しましょう。既にまとめられている場合が多いです。
ものによってはバージョン毎に追加や変更される内容などもあるため、そのような記事を投稿する場合は既に投稿されているものがないか確認しましょう。

## 転載
メモをするのであれば、ブックマークを利用しましょう。
他人に共有したい場合はTwitterとかFacebookでシェアしましょう。

## 自己紹介
もし書くのであれば、「プログラミングに関する記事」の最初に少しだけ書くようにしましょう。
自己紹介だけの記事を投稿する意味はありません。（求人サイトなどにマークされ、TwitterやGoogleにいろいろ送られてくるかもしれません。）


# 最後に
かなりキツイことを書きましたが、別に初心者は書くなということではありません。
適材適所で、投稿サービスはちゃんと選んで書き込みましょう。

Qiitaがもっと盛り上がりますように。

# 追記
他にも同じように思ってる人もいるみたいですね。。。（しかもかなりコメント欄が盛り上がってる）
[Qiitaはxxxではない](https://qiita.com/tag1216/items/4323ce146933c7892e77) - [@tag1216](https://qiita.com/tag1216)さん
[あなたはなぜQiitaに投稿する？](https://qiita.com/I-201/items/e86a27bb217a4123e6f9) - [@I-201](https://qiita.com/I-201)さん
Flutterでテキストリンクのやり方

URLをブラウザで開くには、[url_launcher](https://pub.dartlang.org/packages/url_launcher)パッケージを利用します。

```yml
dependencies:
  flutter:
    sdk: flutter
  url_launcher: ^3.0.3
```

以下のように、`onTap`コールバックなどで`launch`メソッドを利用します。

```dart
import 'package:url_launcher/url_launcher.dart';

InkWell(
  child: Text("ここをクリック"),
  onTap: () async {
    if (await canLaunch("url")) {
      await launch("url");
    }
  },
),
```
IBM Cloud Internet Services (CIS) 関連記事（目次）

IBM Cloud Internet Services (CIS) 関連で書いたQiita記事へのリンクです。

オーダー・初期設定
https://qiita.com/y_tama/items/9151b4c981abbb65c53d

CDN
https://qiita.com/y_tama/items/a1e351b0ed9a7d4ac53b

Global Load Balancer
https://qiita.com/y_tama/items/7e1ddd5dc94990835311

IP Firewall
https://qiita.com/y_tama/items/cb75efc73bda75757cb9

Global Load Balancerで地理的経路（Geo routes）を設定
https://qiita.com/y_tama/items/314c5f5b8ad2b93cab2b

TLSオプション
https://qiita.com/y_tama/items/f6bddda9630052902e25

anycastをコマンドで確認
https://qiita.com/y_tama/items/11615687eaa24cd1d67b
sessionに登録するObjectはSerializableしなければならない

# sessionに登録するのはSerializableしたオブジェクト！

実装が終わった～ということで、[SonarLint](https://www.sonarlint.org/eclipse/)で解析をしたらコードのミスを指摘されました

```java
HogeData data = new HogeData();
//略(dataに値をつめる)
session.setAttribute("KEY", data); 
```


の setAttribute の data 部分に波線が...。
指摘内容は以下の通りです。


```
Make “HogeData” serializable or don’t store it in the session.
```
アプリは問題なく動いているので気づかなかったのですが、バグ:beetle:なので取り除きます！


#原因

[「セッションに登録するObjectはSerializableでなければならない」](http://konnichiwa-dou.cocolog-nifty.com/blog/2006/06/objectserializa_dd5d.html)より引用↓

>
セッションは画面遷移をまたいでオブジェクトを保存できる便利な「入れ物」ですが、基本的にメモリ領域の一部を割り当てて使っているため、 (1)割り当て領域が満杯になってしまったときや、(2)サーブレットコンテナを停止するときに、セッション上の保存オブジェクトをいったんDiskに書き出して退避させます。
このようなオブジェクトのDisk書き出し処理をシリアライズといいます。 Javaではどんなオブジェクトもシリアライズできるわけではなくて、 java.io.Serializable を実装(implements)したクラスだけが対象となります。
>
Serializableを実装していないオブジェクトをセッションに保存した場合、最初のうちは問題ないかと思いますが、シリアライズが必要な局面でトラブルを起こします。
（通常は NotSerializableException という例外を発生します。） 
この問題は開発環境での一過性のテストでは発見しにくく、本番環境で連続稼動しているうちにトラブルの形で初めて発覚することが多いため、十分な注意が必要です。

HttpSessionにObjectを格納する際にはシリアライズ可能であることが必須なようです。
TestDataはSerializableを実装していなかったので指摘されてしまいました。

#解決方法
SonarLintの指摘通り、TestDataクラスにSerializableをimplementsしました。

```java

import java.io.Serializable;

public class HogeData implements Serializable  {
    private String AAA;
    private String BBB;
    //略
}
```

#参考ページ
[・セッションに登録するObjectはSerializableでなければならない](http://konnichiwa-dou.cocolog-nifty.com/blog/2006/06/objectserializa_dd5d.html)
[・Tomcat のセッション永続化について](https://qiita.com/shintaness/items/73d176c0a4f369608898)
コマンドプロンプトからC#をコンパイル

C#コンパイラ(csc.exe)をC:\Windows\Microsoft.NETから検索する。
`where /r C:\Windows\Microsoft.NET csc.exe`
![csc1.png](https://qiita-image-store.s3.amazonaws.com/0/257554/9bb46473-e195-99fd-cc4a-97efe1df8e51.png)
以下のようなバッチファイルを用意し実行する。

```dev.bat
@echo off
path %path%;C:\Windows\Microsoft.NET\Framework\v4.0.30319
cmd
```

コンパイルと実行例。

```hello.cs
// csc hello.cs

using System;
using System.Runtime.InteropServices;

class Program {
	[DllImport("user32.dll")]
	private extern static int MessageBox(
		uint hWnd, string lpText, string lpCaption, uint uType);

	static void Main() {
		MessageBox(0, "hello, world", "hello", 0x40);
	}
}
```

![hello.png](https://qiita-image-store.s3.amazonaws.com/0/257554/921a926b-7da8-e2eb-bb12-eb76cc82dc5d.png)
Docker(Compose)を使ったローカル開発用MySQLの準備

忘れないようにメモ

あくまでローカル開発用のコンテナ作成を目的としており、
本番環境や、永続化するような環境へ適応する場合には色々と他の手順が必要ですのでご注意ください。

基本的にオフィシャルページに書いてあることしかやってません！
[公式ページ](https://hub.docker.com/_/mysql/)

## ディレクトリ構成

とりあえず↓のような構成で進めていきます

```
.
├── docker-compose.yml
├── docker-entrypoint-initdb.d
│   ├── 01_create_tables.sql
│   └── 02_test_user.sql
└── my.cnf
```

後述しますが`docker-entrypoint-initdb.d`配下には構築時に実行したいものを配置します。

## docker-compose.ymlの中身
まずは内容を先に紹介

```yaml
version: '3'
services:
  db:
    image: mysql:タグ
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: database_name
      MYSQL_USER: user_name
      MYSQL_PASSWORD: password
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    volumes:
      - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
```

要点だけ簡単に説明してきます

### environment
環境変数です。
せっかくなので公式ページに載っているものすべてを説明します。

|変数名|説明|
|---|---|
|MYSQL_ROOT_PASSWORD| この変数の設定は**必須**です!名前の通りROOTユーザのパスワードになります。 |
|MYSQL_DATABASE| 起動時に作成されるDBの名前です。|
|MYSQL_USER| 起動時に新しいユーザを作成します。ここで作成したユーザには[MYSQL_DATABASE] で指定したDBへの**GRANT ALL** 権限が付与されます。|
|MYSQL_PASSWORD|上記の[MYSQL_USER] で作成したユーザのパスワードです。<br>ユーザを作成する場合にはこちらが必須になります。|
|MYSQL_ALLOW_EMPTY_PASSWORD|[MYSQL_ROOT_PASSWORD] に空を設定できる用にするフラグです。<br>`"yes"`を設定することで空を設定することが可能になります。ただし、よくわからないならおすすめしない設定です。|
|MYSQL_RANDOM_ROOT_PASSWORD|`"yes"`を設定することでランダムなパスワードが発行されます。<br>起動時の標準出力へ`GENERATED ROOT PASSWORD:  xxxxxxx`と出力されますが、正直ローカル開発用ならこのオプションを使うことはないと思います。|
|MYSQL_ONETIME_PASSWORD|rootユーザのパスワード一度で期限切れにしてくれるらしいです。試してみたのですが、何故かうまく行かなかったので動作確認はできていません・・・ |

これらを踏まえてもう一度見てみると

```yaml
    environment:
      MYSQL_DATABASE: database_name
      MYSQL_USER: user_name
      MYSQL_PASSWORD: password
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
```

本当に必要最小限の設定ですね＾＾

### volumes
マウントするボリュームです。  

#### docker-entrypoint-initdb.d
mysqlのイメージは`/docker-entrypoint-initdb.d`配下のファイルを実行してくれます。
そのパスにマウントすることで、ローカルにあるSQLを実行してもらう作戦です。

実行してくれるのは  `.sh`, `.sql`, `.sql.gz` とのこと。
また、実行の順番はアルファベット順とのことなので、
ファイル名の先頭に01_,02_などをつけて実行順を制御してあげると良さそうです。

そしてこのSQLは環境変数「MYSQL_DATABASE」へ設定したDBで実行されます。

#### my.cnf
MySQLでマルチバイト文字を扱う場合に設定するものです。
詳しい内容は[こちら](https://qiita.com/luccafort/items/0553c589dcc6459746bc)を参考にしてください!

ちなみに中身はこんなんです↓

```
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

[client]
default-character-set=utf8
```

## そして実行
```bash
# 起動
$ docker-compose up -d # 起動

# rootユーザで接続
$ docker-compose exec db mysql

# 作成したユーザでログインする場合は↓
# docker-compose exec db mysql -u user_name -p

```

これでmysqlへ接続できるはずです！  
２つめのコマンドは、「dbコンテナで`mysql`コマンドを実行する」ということになります。
この設定ではrootパスワードを設定していないので`mysql`だけでも接続できています。

ちなみに`mysql`の部分を`bash`にすることで、
bash起動も可能ですのでそこは目的に応じて使い分けてください。

# 注意
もしローカルDBのデータも永続化したい！って場合だと、
このままではコンテナを作り直すとデータが吹っ飛んでしまうので、`/var/lib/mysql`をマウントしてあげるなどの必要があります。
ただし、今の構成は最初にSQLが流れてしまうので色々な**調整が必要です**・・・

# 感想
実際はクライアントツールの設定も同時に行うことになると思いますが、
最小構成としてはこの様になると思います。

思った以上にシンプルな設定で済んだので積極的に利用していきます＾＾
TypeScriptが優秀だと気付いた瞬間〜IDEとの相性抜群〜

#はじめに
TypeScriptが優秀だと気付いた瞬間の２つ目です。

1つ目はこちら。
[TypeScriptが優秀だと気付いた瞬間〜WebAPIが限りなくシンプルに〜](https://qiita.com/haru_iwamoto/items/4b55e3e02ac40ce25ade)

私はIDEにIntelliJを使っていますが、TypeScriptで書いていて非常に使いやすいなと感じる場面があります。そのいくつかを紹介します。
ちなみにこれはIntelliJに限ったことではなく、他のIDEやエディタでも可能だと思います。

#コード補完ができる

こういったUserクラスがあるとします。

```typescript:User.ts
export default class User {
    constructor(
        private _name: string,
        private _age: number,
    ){}

    get name(): string {
        return this._name;
    }

    get age(): number {
        return this._age;
    }
    
    public logName(): void {
        console.log(`name is ${this._name}`);
    }
}
```

関数sendUserがあるとします。
引数のuserに型定義をしておくと、userのコード補完が行われ、入力が楽になりタイポがなくなります。
![qiita_20180909.gif](https://qiita-image-store.s3.amazonaws.com/0/229739/dc56a717-63a5-ed07-ed1b-c2efe6cdd275.gif)

さらに、コード補完の副次的な効果として、入力が面倒だからという理由で、変数名、メソッド名に適当な短い名前がつけられることが少なくなリます。その結果、必要十分な情報を含む適切な名前付けがされるようになり、コードの可読性が上がります。

#リファクタリングしやすい
型定義してあることで、名前の変更がしやすくなります。
下記はIntelliJのRename機能を使って関数名を変更した例です。
参照先全ての名前も適切に変更されます。

![qiita_20180909_2.gif](https://qiita-image-store.s3.amazonaws.com/0/229739/122eaee3-8467-bf24-8336-a39d0ad15fa6.gif)

こういった変更が安全にできることで、変数の意味や関数、クラスの振る舞いが変わった時、すぐに適切な名前に変更することができ、読みやすいコードが維持されます。

#参照元参照先に飛べる
型定義していると、参照元や参照先にワンクリックで飛べます。
![qiita_20180909_3.gif](https://qiita-image-store.s3.amazonaws.com/0/229739/e56d9661-2bbe-79b1-53e9-8dd5eb965dfb.gif)
IntelliJだと、型定義していない場合、同名の関数が他にあると、そちらに飛ばされたり、候補に表示されてしまうことがあります。
それを嫌って、プロジェクト内でユニークになるよう冗長な関数名をつけてしまっては、可読性の下がるコードになってしまいます。

#まとめ
IDEを使ったコード補完とリネーム、参照移動の例を紹介しました。
コーディング作業が楽になるという単純なメリットだけでなく、読みやすいコードを保つ働きをするというところが大きいメリットだと私は思います。
型付き言語なら当たり前の機能ですが、型のないJavaScriptではこれができません。
TypeScriptを使うことで可能になるのです。

#関連
[TypeScriptが優秀だと気付いた瞬間〜WebAPIが限りなくシンプルに〜](https://qiita.com/haru_iwamoto/items/4b55e3e02ac40ce25ade)
Go言語のtext/templateでNewするときの名前について

Go言語の標準パッケージである`text/template`について  
けっこうハマってしまったのでメモとして残します。

# .ParseFilesを利用する場合の、template.Newの引数
まずは以下のコードを見てください

```go
package main

import (
	tmpl "text/template"
	"os"
)

func main() {
	t := tmpl.Must(tmpl.New("mytemplate").ParseFiles("test.txt"))
	if err := t.Execute(os.Stdout, "taqm"); err != nil {
		panic(err)
	}
}
```

■ test.txt

```
Hello {{ . }}
```

test.txtを読み込んで、"taqm"というパラメータを渡して標準出力へ吐き出しています。
実際にこのコードを実行してみると...

> panic: template: "mytemplate" is an incomplete or empty template

なんか怒られた... 
こういうときはじっくりエラー文言を呼んでみることが重要！  

> "mytemplate"は不完全または空のテンプレートです [by Google翻訳]

「中身は空じゃないし文法がおかしかったのかな？」ってことで、
テンプレートの文法がおかしいのかもう一度調べ直してみました。

`template.New`をせずに`template.ParseFiles`だと問題なく動くことを確認。
つまり`New`していることが原因なのか？

調べていると[ある記事](https://qiita.com/akiraak/items/aa259b3988e00c2a3820)に答えはありました。

`template.New`の後ろで`ParseFiles`を呼ぶ場合は、
`ParseFiles`の引数に設定するファイルパスの**ファイル名**を設定する必要があるらしい！  

```go
t := tmpl.Must(tmpl.New("mytemplate").ParseFiles("test.txt"))
```
↓ mytemplateをファイル名に変更

```go
t := tmpl.Must(tmpl.New("test.txt").ParseFiles("test.txt"))
```

やっと動きました・・・＾＾
なんだかんだ1時間くらいハマってしまいました。

素直にエラーメッセージでGoogle検索していればもっと早くに気付けたのかもしれません。
ですが、Goの公式ドキュメント見たり、ソースコードを見たりしたので
結果的に得るものは多かったのかなと思います。

もし同じことでハマった人がすぐにこのページにたどり着けるといいなってことで！

おわり＾＾

# 参考ページ
- [html/templateで自作の関数を利用する](https://qiita.com/akiraak/items/aa259b3988e00c2a3820)
郵便番号から住所を取得できるgemを作りました

[日本郵便が公開している郵便番号データ](https://www.post.japanpost.jp/zipcode/download.html)（いわゆるken_all.csv）を取り込んで、郵便番号から住所情報を取得できるgemを作りました。住所入力フォームの補完に使えます。

https://github.com/rinkei/jipcode

## jipcodeの特徴
* 日本郵便の公式データから郵便番号・住所情報のデータを取得し、ローカルに保存
* 事業所の個別郵便番号にも対応
* 毎月最新のデータに更新（毎月月初に自動化の予定）

## インストール方法
アプリケーションで使う場合、Gemfileに次の行を追加して`bundle install`してください。

```
gem 'jipcode'
```

あるいは、次のように手元にインストールしてください。

```
$ gem install jipcode
```

## 郵便番号から住所情報を取得する方法
`require 'jipcode'`でjipcodeを適宜読み込んでください。
`Jipcode`モジュールの`.locate`関数に郵便番号の文字列を渡すと、住所情報のHashを要素とする**配列**が返ります。
なぜ配列かというと、**郵便番号は1個の番号につき複数の住所が結びつくことがある**ためです。

住所情報のHashは郵便番号(`:zipcode`)、都道府県(`:prefecture`)、市区町村(`:city`)、町域番地(`:town`)のキー値を持ちます。

```ruby
Jipcode.locate('1510051')
# => [{zipcode: '1510051', prefecture: '東京都', city: '渋谷区', town: '千駄ヶ谷'}]

# 該当する住所がない場合
Jipcode.locate('hoge')
# => []
```

jipcodeの主な機能はこれだけで、後はデータとデータ更新のためのコードがリポジトリに含まれています。
そのため仕様を理解したい場合は`./lib/jipcode.rb`の`Jipcode.locate`を読むだけで良いかと思います。
Go言語でmainパッケージに複数ファイルある場合にハマった(初学者向け)

main.goの１ファイルから卒業するため、
とりあえずファイルを分けたらハマったのでメモ

前提としてプロジェクトがこうなっているとします。

```
.
├── main.go
└── foo.go
```

各ファイルの中身は以下の通り

■ **main.go**

```go
package main

func main() {
	Bar()
}
```

■ **foo.go**

```go
package main

import "fmt"

func Bar() {
	fmt.Println("hello main package")
}
```

とてもシンプルですね。  
それでは実行してみましょう! `hello main package` と出力されるはずです！

```bash
$ go run main.go
```

> ./main.go:4:2: undefined: Bar

おや？なにかエラーが・・・  

どうやら`foo.go`が認識されていないようです。  

すごく基本的な部分なのですが実行の仕方がまずかったようです。  
正しく動くパターンはこちら

```bash
$ go run *.go

# もしくはすべてのファイルを渡す
$ go run main.go foo.go
```

こうしないと本当に`main.go`しか対象としてくれないため、  
別ファイルで定義されたものが参照できなかったということです。

おしまい。


# 追記
今では`go run .` でも実行することができます :smiley:
WKWebViewでページ読み込み開始までを少し高速化する

## WKWebView
開発しているアプリにおいて、WKWebViewでページが表示されるまで結構時間がかかりストレスを感じていたので、パフォーマンスを改善できるポイントがないか色々と試していました。
その際、インスタンス化した直後のWKWebViewに[`load(_:)`](https://developer.apple.com/documentation/webkit/wkwebview/1414954-loadrequest?language=objc)メソッドでWebページを読み込ませた場合、実際に読み込み開始されるまで（WKNavigationDelegateの[`webView(_:didStartProvisionalNavigation:)`](https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455621-webview)が呼ばれるまで）に、私の環境では1秒近く遅延があることが分かりました。

## 検証方法
以下は検証した際のコードの本質的な部分の抜粋です。

```swift
func loadWebPage() {
  //以下をコメントアウトをする場合・しない場合で検証
  webView = WKWebView(frame: CGRect.zero)
  
  webView.navigationDelegate = self
  let url = URL(string: urlString)!
  let req = URLRequest(url: url)
  time = Date()
  webView.load(req)
}

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
  let diff = Date().timeIntervalSince1970 - time.timeIntervalSince1970
  print("\(diff)")
}
```
検証ではボタンタップの度に`loadWebPage`を実行していますが、このメソッドの中で毎回WKWebViewをインスタンス化するか、事前にインスタンス化したWKWebViewを使い回すかでWebページの読み込みが開始されるまでの時間に大きな違いが出ました。

| 都度インスタンス化  | 事前インスタンス化  |
|---|---|
| 0.8821330070495605  | 0.008857965469360352 |
| 0.9119091033935547  | 0.013974189758300781  |
| 0.9316868782043457  | 0.024454116821289062 |
| 1.1122016906738281  | 0.0029480457305908203 |
| 1.060987949371338  | 0.003103017807006836  |

上の表は`load(_:)`してから`webView(_:didStartProvisionalNavigation:)`が呼ばれるまでの遅延秒数です。
実際の秒数は端末によっても差がありますが、いずれにしろ都度インスタンス化するのと事前インスタンス化するのではかなり違いがあります。

Webページの読み込みを開始するまでの何かしらの事前処理を行なっていてこのような差が出ているのだと推察していますが、具体的には分かっていません。

## パフォーマンスを改善するには
もし対象のアプリで、画面内に1度に表示されるWKWebViewが１つだけであるなら、そのViewControllerのクラスプロパティとして持たせて使い回すようにするだけでページが表示されるまでのパフォーマンスがそこそこ改善しそうです。
もし1つの画面に複数のWKWebViewを同時に表示させる必要があるなら、事前に十分な数のWKWebViewをインスタンス化し保持しておく等のやり方ができそうです。
JavaScriptでEnumを定義する

GASとかちょっとしたJavaScript使う時にいつの間にかちょっとだけEnum使いたい時のメモ

```javascript:enum.js
/**
 * Enumの実装クラス
 */
Enum = function() {
    this._enums = [];
    this._lookups = {};
};

/**
 * enumを取得する
 * @return {array} enumオブジェクト
 */
Enum.prototype.getEnums = function() {
    return _enums;
};

/**
 * 繰り返し処理する
 * @param {array} callback コールバック
 */
Enum.prototype.forEach = function(callback){
    var length = this._enums.length;
    for (var i = 0; i < length; ++i){
        callback(this._enums[i]);
    }
};

/**
 * enumを追加する
 * @param {object} e enumの追加情報
 */
Enum.prototype.addEnum = function(e) {
    this._enums.push(e);
};

/**
 * 名前を取得する
 * @param {string} name 名前
 * @return {string} 名前文字列
 */
Enum.prototype.getByName = function(name) {
    return this[name];
};

/**
 * 値を取得する
 * @param  {string} field フィールド
 * @param  {object} value 値
 * @return {object} 設定した値
 */
Enum.prototype.getByValue = function(field, value) {
    var lookup = this._lookups[field];
    if(lookup) {
        return lookup[value];
    } else {
        this._lookups[field] = ( lookup = {});
        var k = this._enums.length - 1;
        for(; k >= 0; --k) {
            var m = this._enums[k];
            var j = m[field];
            lookup[j] = m;
            if(j == value) {
                return m;
            }
        }
    }
    return null;
};

/**
 * Enumを定義する
 * @param  {object} definition 定義内容
 * @return {object} enum
 */
function defineEnum(definition) {
    var k;
    var e = new Enum();
    for(k in definition) {
        var j = definition[k];
        e[k] = j;
        e.addEnum(j);
    }
    return e;
}
```
## 使い方
```javascript:main.js
// 定義
var COLORS = defineEnum({
    RED : {
        value : 1,
        string : 'red'
    },
    GREEN : {
        value : 2,
        string : 'green'
    },
    BLUE : {
        value : 3,
        string : 'blue'
    }
});

// 文字列を取得
COLORS.BLUE.string;
// 値を取得
COLORS.BLUE.value;
// 名前を元に文字列を取得
COLORS.getByName('BLUE').string;
// 値を元に文字列を取得
COLORS.getByValue('value', 1).string;
// enumの定義されている値一覧を処理する
COLORS.forEach(function(e){
  
});
```


## 参考URL
https://code.i-harness.com/ja/q/4649f
プログラミング学習をしていない生徒がKintoneを使ってアプリを作成

#目次
[１．課題について](#1課題について)
[２．作成したアプリについて](#2作成したアプリについて)
[３．各グループについて](#3各グループについて)
[４．その他](#4その他)
[５．試行](#5試行)

#1．課題について
今回はkintoneを使って高校生なりに身近な問題（普段の高校生活）の課題について考えてアプリを作成することになった。授業は科目名（電子商取引）で週２時間で１学期に実施をした。
※アイデアから作成までは合計10～12時間程度

#2．作成したアプリについて
アプリについては、高校生向けに作成をしているのでそれをヒントに違う使い方をしてもよいと思います。また、完成度が低い点などもあるかもしれませんがすみません。



#3．各グループについて
・１グループ　アプリ名　【日直日誌】
　内容:　普段、学校での日直日誌は紙なので湿気で書きにくく、晴れの日（暑い）日は汗で書きたくなくなります。
そこで、私たちは考えた！！！
『日直日誌など家で先に書きたい！！』
『家での隙間時間に日直をみたい！！』
『時間を短縮したい』
ということからこのテーマにそって作りました。
詳しい内容はこちらを[クリック][link-1]
[link-1]:https://qiita.com/tegoshi32/items/6779005c0c36a754ccac
|グループ名|Campus|
|---|---|
|![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/252831/9f72de85-3b38-ed39-d7f1-333249b6e97a.jpeg)|![1-1.JPG](https://qiita-image-store.s3.amazonaws.com/0/252831/ac0f5e4e-204a-7883-cee9-4f97e9a16bc7.jpeg)



・２グループ　アプリ名　【Shere×Dule】
　内容:　学校生活で委員会活動や時間割の変更など沢山あるときがあり忘れてしまったりすることが多い。また、予定を見ることにより誰がどこで何をしているのかがわかる！！そんなツールが欲しいので作成しました。日課変更は本当に多くてわかり辛いです。。。
詳しい内容はこちらを[クリック][link-2]
[link-2]:https://qiita.com/sakainagata/items/87a1ed005dfa63897a36

|グループ名|mono|
|---|---|
|![2.JPG](https://qiita-image-store.s3.amazonaws.com/0/252831/6f111ac3-9513-5740-f9b2-33aa2a967c1a.jpeg)|![2-1.JPG](https://qiita-image-store.s3.amazonaws.com/0/252831/c632a4bf-41e7-6bfe-f0ac-4f1422356e8c.jpeg)



・３グループ　アプリ名【Work-Sharing】
　内容:　普段学校生活をしていく中で突然の授業変更や台風など事故災害による休校の知らせが遅いことに不満を持っています。対応するのが遅くなることにより授業への移動が遅くなったり休校などで学校の途中まで来てしまうことがたびたび有ったためこのようなことがなくなればより効率的に時間を使えると考えました。また、部活の有無内容が分かるアプリと連携させることにより学校生活をより効率的に生活することが出来ます。
詳しい内容はこちらを[クリック][link-3]
[link-3]:https://qiita.com/kyorochan2148/items/920ddec19c6c3df26fd8
|グループ名|Shangri-La|
|---|---|
|![3.JPG](https://qiita-image-store.s3.amazonaws.com/0/252831/d4832982-68ea-f42a-af47-a0ebfbf1e6cb.jpeg)|![3-1.JPG](https://qiita-image-store.s3.amazonaws.com/0/252831/238f30ce-b5a9-de68-929a-96e0bf98114b.jpeg)

・４グループ　アプリ名【スタディプラン】
　内容:　一日の学習目標を立てることが最近の高校生が出来ないこと（私もですが・・・）が多いです。私たちの学校ではテスト前に学習時間やその感想を書いたものを紙で提出していますがそれがとても苦です。それがアプリを使うことによりもっと効率を上げることになると思いこのアプリを考案しました。
詳しい内容はこちらを[クリック][link-4]
[link-4]:https://qiita.com/maya1125/items/4a5176291f572d70de68
|グループ名|cotton candy|
|---|---|
|![4.JPG](https://qiita-image-store.s3.amazonaws.com/0/252831/6328f2ce-0e7e-f833-fcb5-37268fe02133.jpeg)|![4-1.JPG](https://qiita-image-store.s3.amazonaws.com/0/252831/79e09136-0cdd-9b66-6816-8d62521272fb.jpeg)





・５グループ　アプリ名【Tips♪】
　内容:　ネットに乗っているニュースに対する理解を深めたい方やニュースをじっくり見て自分の意見を考えるのを苦手な人達に向けて作成しました。自分だけの意見だけではなく他人の意見もみることで意見共有ができ、自分を伸ばすことが出来るのではないでしょうか？
詳しい内容はこちらを[クリック][link-5]
[link-5]:https://qiita.com/tatena/items/fa970076c351f54ae6a6
|グループ名|majestic|
|---|---|
|![5.JPG](https://qiita-image-store.s3.amazonaws.com/0/252831/8c393113-e69d-e344-c8b6-441808a2c06c.jpeg)|![5-1.JPG](https://qiita-image-store.s3.amazonaws.com/0/252831/aa05172e-ce8f-b888-ab55-263b61be97f5.jpeg)





#4．その他

静岡県立島田商業高校　こちら[クリック][link-6]
[link-6]:http://www.edu.pref.shizuoka.jp/shimada-ch/home.nsf/IndexFormView?OpenView

kintoneサイト　こちら[クリック][link-7]
[link-7]:https://kintone.cybozu.co.jp/jp/

#5．試行
　その後実際に試してみた記事になります。
　　　こちらを[クリック][link-8]してください。
※現在まだリンクされていません
H31/02公開予定

[link-8]:h
php-master-changes 2018-09-09

# 2018-09-09
## cmb69: Fix [#75273](https://bugs.php.net/bug.php?id=75273): php_zlib_inflate_filter() may not update bytes_consumed
- https://github.com/php/php-src/commit/90d863898cd4d7a1e073916b4730aca33cc29184
- ext/zlib の php_zlib_inflate_filter()（[zlib.inflate フィルタ](http://php.net/manual/ja/filters.compression.php)の実装） が bytes_consumed を更新せず、fwrite() が 0 を返すようになる場合がある問題の修正

## carusogabriel: Remove empty PHP tags from test
- https://github.com/php/php-src/commit/a303089ffe9f4eaaacc97ccd6acac272a03d13bd
- 謎の空 PHP タグを ext/mysqli のあるテストから削除

## weltling: Fixed bug [#76850](https://bugs.php.net/bug.php?id=76850) Exit code mangled by set locale/preg_match
- https://github.com/php/php-src/commit/c6ddd45650c295bdf800c600e89a15c0af9a1e09
- ext/pcre の setlocale()/preg_match() 利用時のメモリリーク問題を修正

## weltling: Add test for bug [#76850](https://bugs.php.net/bug.php?id=76850)
- https://github.com/php/php-src/commit/4905d5e0dfe13fa2645c34352d253b9a1ca11eed
- ↑の修正にテストを追加

## petk: Remove HAVE_ASSERT_H
- https://github.com/php/php-src/commit/77118fc925b3e84be02a80d8da6bbbb47f8c37e1
- autoconf の古いシステム向けマクロ HAVE_ASSERT_H の利用を削除
- C89 が最低要件だからチェックいらないでしょとのこと
- \<assert.h> を無駄に #include している部分もついでに削除

## petk: Remove not needed checking for <errno.h>
- https://github.com/php/php-src/commit/50b9ef8d9435d23be40cea7fb484a02e99fdb617
- \<errno.h> の不要な存在確認を削除
- C89 が最低要件だからチェックいらないでしょとのこと

## weltling: Fix memory leak in pcre cache
- https://github.com/php/php-src/commit/9278be148e751bc6d2107f4df667f6a6de4daa66
- ext/pcre のメモリリークを修正

## weltling: Make a copy unconditionally
- https://github.com/php/php-src/commit/68c34ce0dcf251169f9c41b4df66c06cd6993c5e
- [この日あったメモリリーク修正](https://qiita.com/drafts/ca1ef0402f7e8f024c45/edit#weltling-fixed-bug-76850-exit-code-mangled-by-set-localepreg_match)を再修正
- 文字列コピーを行う箇所で当初は zend_string_dup() を利用しており、これは [interned string](http://d.hatena.ne.jp/hnw/20151205) ではコピーを行わないものだが、無条件でコピーにする実装へ修正
VS Code使い方

## クイックオープン
```⌘ ＋ P```
- ファイルを開く
- その状態で → を押すとクイックオープンウィンドウが開いたまま複数ファイルを開ける

## コマンドパレット
```⌘ ＋ Shift ＋ P```
- 登録コマンドを実行

## 統合ターミナル
```Ctrl ＋ Shift ＋ @```
- コマンドプロンプト/ターミナルとエディタを切り替える必要がない
- ＋ボタンを押すと新しいターミナルが作成

## 自動保存機能
```[ファイル] - [自動保存]```
- 自動保存させない方がいいかも

## カーソル移動
```Option + ↓``` 前後の要素を入れ替え
```Option + →``` 飛ばしながら移動
```⌘ + →``` 先頭末尾に移動
```⌘ + ↓``` 一番上下に移動

## 便利なキーボード
```Shift + Option + ↓``` 
- liなど複製すると便利

```Shift + →``` カーソル移動分を選択
- ⌘ などと一緒に併用すると一気に選択できる

```fn ＋ delete``` バックデリート

```⌘ + alt + Shift ＋ ↓``` 直下にカーソルを増やす

```⌘ + D``` 当たっているカーソルと同じ文字列を

```⌘ + ファイルリンク``` リンクをクリックでファイルを開く

## ユーザー設定/ワークスペース設定
```[Code] - [基本設定] - [設定]```

## キーボードショートカット
```[Code] - [基本設定] - [キーボード ショートカット]```
登録されているショートカットを確認できる

## ウィンドウを閉じる
```⌘ ＋ W```

## VS Codeを終了
```⌘ ＋ Q```

## 備考
- ```⌘：Command```
- ```Option = alt```




# 拡張機能（エクステンション）
```[表示] - [拡張機能]```
拡張機能を選択

## Emmet
Emmet記述して `tab` で展開
```
ul.listInner>li.listItem*5
```

```
<ul class="listInner">
  <li class="listItem"></li>
  <li class="listItem"></li>
  <li class="listItem"></li>
  <li class="listItem"></li>
  <li class="listItem"></li>
</ul>
```


# 参考
[Visual Studio Codeを使いこなせ! フロントエンジニア必須の拡張機能7選 - ICS MEDIA](https://ics.media/entry/18544)
インメモリデータベースVoltDBの最大ヒープサイズを変更する

# はじめに

VoltDBの最大ヒープサイズを変更する方法は以下の公式ドキュメントに記載されています。

Administrator's Guide
https://docs.voltdb.com/AdminGuide/HostConfigProcOpts.php

デフォルトでヒープサイズは2GBですので、3GBに変更してみます。


# インメモリデータベースVoltDBの最大ヒープサイズを変更する

VoltDB中のDBのデータはオフヒープに保存されており、格納するデータ量とオンヒープ（ヒープサイズ）はほとんど関連がありません。
オンヒープのメモリはVoltDBのサーバ上の処理（プロシージャの実行等）で使用されます。

## 注意点

・スループットが高いほど、メモリ不足を避けるために必要な最大ヒープ量が大きくなります。
・通常最大ヒープサイズは2ギガバイト（2048）が推奨されます。実稼働環境では、スキーマのサイズ（テーブル数）、ホストあたりのサイト数、使用されている耐久性および可用性の機能から、必要なヒープサイズをより正確に測定できます。詳細は、VoltDB Planning Guideを参照してください。

## 変更方法

psで、現在のヒープサイズを確認します。「-Xmx2048m」となっており、最大ヒープサイズが2GBであることがわかります。

```
# ps -efl | grep volt
0 S root      3015     1 12  80   0 - 1051363 futex_ 00:17 ?      00:00:02 /usr/bin/java -Xmx2048m -server ～省略～
org.voltdb.VoltDB probe placementgroup 0 voltdbroot /opt/voltdb/voltdbroot mesh volt1 hostcount 1
```

/etc/profile.d/voltdb.shを修正します。

```
# vi /etc/profile.d/voltdb.sh

export VOLTDB_HEAPMAX="3072"
```

変更した設定を読み込んで、確認します。

```
# source /etc/profile
# export | grep VOLTDB_HEAPMAX
declare -x VOLTDB_HEAPMAX="3072"
```

VoltDB起動後に最大ヒープサイズが3GBに変更されていることを確認します。

```
# ps -efl | grep volt
0 S root      3452  2946 99  80   0 - 1320480 futex_ 00:25 pts/0  00:00:02 /usr/bin/java -Xmx3072m -server ～省略～
org.voltdb.VoltDB probe placementgroup 0 voltdbroot /opt/voltdb/voltdbroot mesh volt1 hostcount 1
```


# その他

他のJavaランタイム・オプションを変更する場合は、VOLTDB_OPTSに設定します。
Sharepointのアンケートアプリをスプレッドシートにエクスポートしたとき、順番が意図したとおりにならない

# Sharepointのアンケートアプリをスプレッドシートにエクスポートしたとき、順番が意図したとおりにならない

　Sharepointでアンケートアプリを作り、それをスプレッドシートに抽出してExcelで眺めたりしますが、順番通りにならない2例に遭遇したので記載。


## 「段階評価」質問が含まれる

　このとき、なぜか質問のカテゴリ順にソートされてしまいます。試してみた環境下では

　「1行テキスト」→「複数行テキスト」→「段階評価」　（それぞれのカテゴリは降順でソート）

という結果になりました。

例えば、このようなアンケートサイトを作った場合、

- 質問１：あなたのお名前を入力してください（１行テキスト）
- 質問２：この映画は面白かったですか？（段階評価）
- 質問３：次回作に期待しますか？（段階評価）
- 質問４：映画の感想を記入してください（複数行テキスト）

　エクスポートしたスプレッドシートの列がこのように並んでしまいました。

| 質問１|質問４|質問３|質問２|
|:----:|:----:|:---:|:---:|
|      |      |     |     |


## 質問が追加順にエクスポートされる

　あとから質問を追加して並べ替えということもたまにやりますが、あとから追加した質問はエクスポートしたときに列の後ろに来るようです。

　例えばこのようなアンケートサイトに「質問２：世代を教えてください（選択肢）」を足したいなと、

- 質問１：あなたのお名前を入力してください（１行テキスト）
- 質問２：この映画は面白かったですか？（選択肢）
- 質問３：次回作に期待しますか？（選択肢）
- 質問４：映画の感想を記入してください（複数行テキスト）

　以下のように質問を１つ追加し、順番を入れ替えたとします。

- 質問１：あなたのお名前を入力してください（１行テキスト）
- 質問２：世代を教えてください（選択肢）
- 質問３：この映画は面白かったですか？（選択肢）
- 質問４：次回作に期待しますか？（選択肢）
- 質問５：映画の感想を記入してください（複数行テキスト）


　このときエクスポートしたスプレッドシートの列がこのように並んでしまいました。

| 質問１|質問３|質問４|質問５|質問２|
|:----:|:----:|:---:|:---:|:---:|
|      |      |     |     |     |



## 対処法

　暫定的な回避策としては、以下くらいしかないようです。

- 段階評価の使用を避ける（代わりに選択肢を用いる）
- 質問の順番はよく考えておいて、あとから追加するようなケースを避ける

　SharePoint Designerを使えば回避できるかもしれませんが、まだ試せていません。
Qiitaのスパム対策を考える

いつもスパムを見つけたら報告してるんですが
最近、Qiitaに 300件/日 以上のスパムが投稿されるので、その対策を考えてみる。

## ユーザの登録時

* GitHubとの連携を必須にする
* 有名ドメインのメールアドレス認証

## ユーザの投稿時

* GitHub連携＆２段階認証設定済みユーザのみ投稿可能にする
* 既存スパムとの類似度が高い投稿をフィルタし、引っかかった場合に検閲し削除
* 特定の単語、熟語を投稿時にユーザをサスペンド
* 特定ドメインのURLが含まれる投稿を削除
* タイトルがURLのみで構成される場合に削除

## スパム報告

* 投稿一覧のページからスパム報告可能にする
* ユーザの報告機能
XGBoostの変数重要度を変数名を保ってグラフ化したい！！

# 課題
XGBoostは変数重要度を示してくれて便利ですが変数名が'f0'とか適当な値になってしまう！<br>
そこで、なんとかdatafrmeのcolumn名のままに表示してくれる方法はないか！と探してみました。<br>
<font color='DeepPink'>※matplotlib周りの使い方で困ってるんでアドバイスください！</font>


# 現状
まず、xgboostの変数重要度グラフは次のように表示します。

```
#clfはfit済みのモデル
xgb.plot_importance(clf)
```
![xgb_figure.png](https://qiita-image-store.s3.amazonaws.com/0/279518/8b7b93f0-62a1-315a-c163-df681e639c15.png)



これで↑の画像の用に表示されるのですがはっきり言って<br>

**<center><font color='red' >どれがどれだよ！！</font></center>**

ってかんじです。

そこで検索を開始したところ<br>
 [Xgboostのto_graphvizメソッドで変数名を表示 @hand10ryo
2018年06月29日に投稿
](https://qiita.com/hand10ryo/items/8d5759687cdcb0bd34ed "Xgboostのto_graphvizメソッドで変数名を表示")
(@hand10ryoさんありがとう！！)　には

```
plot_importanceには変数名をkey、そのfeature_importanceをvalueにもつ辞書を渡せば
"f1"などと表示されてしまう問題は解決できた
```
と書いてありました。<br>

なのですこし考えてみました。

# 回答(※簡潔なものも追加したので追記参照)

```
#dfは元データフレーム
#clfは訓練済みモデル

features =df.columns[df.any()]
fscore = clf.feature_importances_   
plt.figure(figsize=(10,10))
plt.barh(features,fscore)
```

これで横軸グラフがだせます。<br>

![figure.png](https://qiita-image-store.s3.amazonaws.com/0/279518/cba16791-750f-656a-1c56-54e301599c1a.png)


しかし、これだとグラフのソートがされていません。<br>

そこで(features:fscore)の辞書をつくろうと次のようなものを考えました。<br>

```
dict={}
for f,s in zip(features,fscore):
    dict[f]=s
dict=sorted(dict.items(), key=lambda x: -x[1])

```

これでvalueでのソート済み辞書ができました。
しかし、辞書のままだとうまくplt.barh()に突っ込めなかったので……

```
features=[]
fscore=[]
for (k,v) in dict:
    features[i]=k
    fscore[i]=v

plt.barh(range(len(features)), fscore, tick_label=features, align="center")
plt.show()
```
これで下から大きい順に詰みあがるグラフができます。


![hfigure.png](https://qiita-image-store.s3.amazonaws.com/0/279518/ba41a551-69c9-161e-4267-dd4ed09aea5e.png)


<font color='red'>※matplotlibで降順にする方法が分かってないので知ってる方はコメントなどで教えてください！
</font>

# @hand10ryoさんからのコメントにより改善(2018/09/12更新)
モデルのfitが終えた段階で次のような操作により、重要度の降順に表示してくれるようです。
@hand10ryoさん重ねてありがとうございます！

```
features =df.columns[df.any()]
mapper = {'f{0}'.format(i): v for i, v in enumerate(features)}
mapped = {mapper[k]: v for k, v in clf._Booster.get_fscore().items()}
xgb.plot_importance(mapped)
```
特定のportを使っているプロセスを調べる

Docker とか使ってると知らぬ間に port を使ってたりして競合するので、落とさねばならぬときがあります。

下記は Port 80 を使ってるプロセスを調べる場合。

```shell:console
$ sudo lsof -i:80
COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
httpd    83 root    4u  IPv6 0xab09e559c80cd03d      0t0  TCP *:http (LISTEN)
httpd   454 _www    4u  IPv6 0xab09e559c80cd03d      0t0  TCP *:http (LISTEN)
```
npmのバージョン管理の話

## 注意点

`tj/n` などのnodeバージョン管理ツールと一緒に使う場合、 [このような問題](https://qiita.com/jigen098/items/49e651c0ae759fd6350f)にぶち当たる可能性があります。その点だけ留意しておいてください。

## npmのバージョン

npm installとかした時に新しいnpmのバージョンあるで！ってコマンドラインに出た経験がある方も少なくないのではないでしょうか。今回はnpmのバージョンを管理する話です。

## 結論

`$ npm info npm versions --json`: インストールできるnpmのバージョン一覧をjson形式で
`$ npm install --global npm@<version>`: 任意の<version>のnpmをインストール
ex. `$ npm install --global npm@3.10.8`

## npmって

そういえば、npmってパッケージ管理ツールですよね…
そういえば、npmってバージョン指定でライブラリインストールできますよね…
そういえば、npmってライブラリをグローバルインストールすることができますよね…

-> ってことは、

```
＿人人人人人人人人人人人人人人人人人人人人＿
＞　npm自身でnpmインストールできるのでは　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣
```

## npmはnpmをインストールすることができるのか

`$ npm info <package>` で`<package>`の情報を手に入れることができます。
`$ npm info <package> versions` とするとバージョン情報だけ抜き出せます。多すぎると省略されます。
`$ npm info <package> versions --json` でjson文字列として出力してくれるので全部見れます。

-> `$ npm info npm versions --json`

```
＿人人人人人＿
＞　あった　＜
￣Y^Y^Y^Y￣
```

## バージョン指定でインストール

パッケージ名の後ろに`@<version>`とすればバージョン指定でインストールできます。例えば`npm@3.10.8`みたいな感じで。
あとはグローバルインストールするために`--global`つけましょう。

## エラーが出ましたか？

`sudo`しましょう。下みたいなログだったら。

```console
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator (though this is not recommended).
```

そうじゃないエラーはエラーログ見て考えてくださいｗ
ソフトウェアテストの概念と整理

# このドキュメントについて
ソフトウェアのテストをするにあたって、そもそもテストってどういった工程・観点・手法があるんだっけと初心に帰る再確認メモ

# 前提
ソフトウェアのテストはプロジェクトによって、工程の呼び方、テスト範囲が異なってくるので完全なテストの形というのは見えずらいが、何の為にテストをするか？どういうことをしないといけないのか？どのくらいの工数でやるのか？ということを念頭に置いてテストすることが大事

# 何のためにテストをするか？
- 欠陥やバグを見つけられる
- 仕様通りに実装されていることを担保する
- バグが出やすいポイントがわかったり、想定しなかった挙動を発見したりなど、起こりうるリスクを洗い出すことができる
- システム規模・バグ件数から開発指標を作ったり、自動化・効率化などの課題が見つかり、開発プロセス改善に役立つ　etc.

# 一般的なテストの種類
**単体テスト** *（Unit test, Module test etc.）*
最小単位である関数レベルで詳細仕様通りに作られているか確認するテスト
最近はテストコード記述するのが主流で、テスト対象部分以外はStub、Mockを使って外部の要因に影響されないようなテスト構成にする（例えばクラスAのテストコードを作成しているときに、クラスAで使われてるクラスBの処理内容は関係ないのでクラスBを Stub or Mock に置き換える etc.）


- **ホワイトボックステスト**
    - テスト対象関数の内部構造に着目し、条件分岐や繰り返しなどの各部分を確認する([コードカバレッジの網羅](http://www.itmedia.co.jp/im/articles/1111/07/news144.html)）
    - コードカバレッジの網羅は一般の商用ソフトウェアなら70～90%程度で十分と思われる
    - 構造の正しさのみをテストするため、ソフトウェアの仕様が間違っていることから起こるバグは発見できない

- **ブラックボックステスト**
    - テスト対象関数の内部構造は意識せずに仕様を満たしているかどうかを要点にテストする
    - ソフトウェアの挙動で大事な事は以下の４つなので、それについて確認する
        1. インプットデータ
        2. アウトプットデータ
        3. 業務処理
        4. データフロー（DBへの登録・変更・削除が正しく行われているか etc.）

    - 他にもバグが出やすいところを観点とする
        1. 境界値を確認する
        2. 最小値、0、最大値を確認する
        3. 桁数を確認する
        4. 空（null）データの確認をする

    - GUI（画面）を伴うソフトウェアの場合は、状態遷移の確認もする
        1. 画面遷移が正しく制御されているか確認する
        2. セッションデータ（キャッシュ etc.）の保持が正しく制御されているか確認する

※単体テストはホワイトボックステストの観点に注目されがちだが、それだけだと変更に対して弱くなるため、仕様目線でテストケースをつくるブラックボックステストの観点も織り交ぜた方が良いとされている

---
**結合テスト** *（Integration test, Join test, Interface test etc.）*
単体テスト完了後に行うテストで、開発した複数のモジュールなどを組み合わせて動作させたときに正しく動くか確認するテスト（ビジネス的な要因で一連のテストが実施できない場合は工程を前段階「内部結合テスト」、後段階「外部結合テスト」と分ける場合がある）

- **内部結合** *（Integration test A, Integration test 1 etc.）*
    1. 画面や複数モジュールに跨った処理が正しく動作しているかを確認する
    2. 画面や複数モジュールに跨ったデータフローが正しく行われているかを確認する
    3. 単体テストでは確認できないテスト項目を確認する（例外処理テスト, 業務シナリオテスト etc.）

※GUI（画面）を伴うソフトウェアの場合は、画面単位で結合テストを実施し、単体テストを包含テストする場合もある
※BEで完結するようなAPIテストの場合は、テストコードで内部結合を実施する場合が多い

- **外部結合テスト** *（Integration test B, Integration test 2 etc.）*
    1. 外部要因（外部システム etc.）との疎通確認をする
    2. 外部要因（外部システム etc.）とのインターフェイスのインパラメータ、アウトパラメーターの確認をする（インターフェイステスト）
    3. テスト手法はブラックボックステストで行うことがほとんど

---
**総合テスト** *（System test, Product test etc.）*
開発の最終段階で行われるテストで、製品として完成したものを本番同等の環境で行うテスト

- 以下のような観点でテストすることが多い
    1. システムが全体として要求された仕様のとおりに動作するか確認する
    2. 修正・変更を行った後にデグレードしていないか確認する（デグレードテスト）
    3. 極端に高い負荷をかけた状況下での動作は問題ないか（負荷テスト）
    4. 処理能力が仕様を満たしているか（パフォーマンステスト）
    5. 長時間の連続稼働によって処理能力や稼働率に問題が生じないか（ロングランテスト）
    6. 脆弱性が存在しないか（セキュリティテスト）

---
**ユーザーテスト** *（User test etc.）*
ユーザーが直接触ってみて、システムが全体として要求された仕様のとおりに動作するかはもちろん、操作性、見やすさなどユーザビリティの確認をするテスト

- 開発者や委託された側で実施することは少ない

---
# まとめ
- 工程に囚われず上記観点たちを確認できる場面で確認する、落とせるテストは削ってしまうなど柔軟で効率的なテスト計画をすることは大事だと思う。ただ、機械的なテストに偏る、面倒だからとテスト後回しにしたり、テストを怠ると痛い目をみるのは自分である。柔軟な観点をもつ、スケジュールはどのくらい余裕があるのか、テストすべき部分については相当のコストが掛かるなどの意識は常にもっていなければならない
- また、各種ツール（Selenium：自動打鍵ツール、JMeter：負荷ツール etc.）、テストフレームワーク（JUnit, DJUnit etc.）を駆使して容易に再実施可能なみんなが幸せになるようなテストを心掛けるようにしたい
Node.jsのバージョン管理にtj/nを使ってみた話(vs nvm, nodenv)

## まえがき

この記事はmacユーザー向けです。

筆者はNode.jsを取り入れた・取り入れる予定のプロジェクトに4つほど携わってきて、それぞれ新規・運用と状況は違って、一番困るのが新規と運用両方のプロジェクトに携わる時で、使っているNode.jsのメジャーバージョンが違ったりします。こういう経験をしたことがある方も少なくないでしょう。

こういう時にNode.jsのバージョン管理をするための方法が必要になります。

### どういうときですか

例えばプロジェクトAとBがあって、Aのプロジェクトでは`v6.14.4`、Bのプロジェクトでは`v8.11.4`使ってるとします。あなたはAのプロジェクトをメインで開発していましたが同じノートPCでBのプロジェクトの手伝いをすることになりました。仮想マシンなどを使って開発とかはしてません。そのままプロジェクトBにやってきましたがどうやら`v6.14.4`だと動かない機能がありました。さあどうしますか？

-> プロジェクトAでは`v6.14.4`, プロジェクトBでは`v8.11.4`を使いましょう。これをNode.jsのバージョン管理と呼びました。

## Node.jsのバージョン管理

Node.jsのバージョン管理が行えるライブラリは、有名どころだと以下の3つだと思ってます。

- [nvm](https://github.com/creationix/nvm)
- [nodenv](https://github.com/nodenv/nodenv)
- [tj/n](https://github.com/tj/n)

Macを使っていたらどれも[homebrew](https://brew.sh/index_ja)からインストールすることができるので、 `$ brew install` と `$ brew uninstall` コマンドと`~/.bash_profile`, `$PATH`環境変数だけ頭にたたきこんだら実際使ってみるのが早いと思います。

### 結論

nおすすめです。

### 比較

|項目\ライブラリ|nvm|nodenv|n|
|:--|:--|:--|:--|
|Latest version|0.33.11|1.1.2|2.1.11|
|Contributors|223|85|63|
|Commit activity|◎|×|○|
(2018/09/10時点)

リリースバージョンに関する話をすると、nvmはメジャーバージョンが0なのでその辺気にする人はnodenvかnでしょうか。ただ一番メンテナンスされてないのはnodenvみたいです。

nvmとnはコマンドでバージョンを指定してnodeを実行することができます。nodenvは`.node-version`というファイルにバージョン情報を書き込み参照するような方式なのですが文化の違いといった感じで出来ること自体はおそらく同じです。

### tj/n便利

nは任意のNode.jsのバージョンを、例えば`$ n v6.9.1` でインストールできて、 `$ n` でインストール済みのものから選択できる画面になります。

なのでいちいち`$ nodenv versions`して`$ nodenv install v6.9.1`とか`$ nodenv global v6.9.1`とかやらなくても済むので考えることが減ってよさそうです。

上に挙げたプロジェクトごとにバージョンが違う場合ですけど、実際のところ例えば作ったプログラムとかサーバー動かす時ってyarnとかnpm使って`$ yarn start`とか`$ npm start`ってやるために`package.json`書くと思うので、みんながtj/n入れることを前提にできるなら`scripts`に`"start": "n use v6.9.1 index.js"`みたいに書いておけばよさそうな気がします。ちなみにフラグも使えるみたいです。

## あとがき

…Qiita書いてて毎回思うんですが、別inputでタイトル入力させるのに記事内でh1相当のタグ`#`が使えるんだなあと。

なので#に何を書けばいいか迷います（というか、普通##で書くところをQiitaだと#で書かないといけないんだろうけどうーんって感じです）

マークアップ確認してみたんですが、どうやら予想通りタイトルはh1, ## はh2として扱われているのであえて#を使うとページ内にh1が重複してしまう始末になりそうです。でも、sectionが分かれていて（？）厳密に言うとh1を1つ追加しないといけないです。
なのでタイトルを2つ書けと…そういうことなんでしょうか…
初めてのHTML

ドットインストールとprogateのHTML初級編を終わらせた。
二つともやることによって違う視点で見ることができる。
それによって理解がさらに深まった。
ドットインストールは動画を見るだけではなく自分で考えながら横でATOMなどを開いて見本見まねでやることが大切だと感じた。
SPAフレームワークReact.jsを使ってWordPressを高速化する

## React.jsについて
![react-logo-300x289.png](https://qiita-image-store.s3.amazonaws.com/0/35613/3d36ff3d-5728-b07e-8280-9ea6842abfc3.png)

***
- SPAフレームワーク
- Facebook社が開発（2015年オープンソース化）
- ネイティブアプリも作れる (React Native)
- JavaScript （ES6,7）
- JSX

***
## 最近から流行りだした技術ではない

***
## なぜ 今、React.js ？

***
## 5年前ハイブリッドに苦い思い出

***
## 近年の動向
- HTMLベースからコンパイル型など、クロスプラットフォーム技術の近年の拡大ぶりがすごい
- グーグルやマイクロソフトなど大手が推進 （AngularJS・Xamarin）

***
- HTMLベースからコンパイル型など、マルチプラットフォーム開発の近年の拡大ぶりがすごい
- GoogleやFacebookなど大手が推進
- パフォーマンスが、かなりよくなった。ネイティブとの差は、ほとんどない

***
## 特徴
- 1方向データバインディング
- VirtualDOMで高速化
- Viewの一部の機能を提供するライブラリ

***
1方向バインディング
redux

dafda

***
豊富なライブラリ
axios

***
## 3大SPAフレームワーク

***
## 3大SPAフレームワーク
|adaaa|Angular|angular.js|Vue.js|
|:-----------------|------------------:|:------------------:|:------------------:|
| This             |              This |        This        |        This        |
| column           |            column |       column       |       column       |
| will             |              will |        will        |        will        |



***
ハイブリッドアプリとの違い


***
事例
Facebook
Instagram
etc

***
# WordPressをPWA化したい
ロカロカ PWA


***
WP touch 有料かよ
Super Progressive Web Apps 驚異の星5満点
でも、ReactでSPAアプリ作りたいんです
WordPressAPI + React.js という選択肢

***
WordPressをPWAにするメリット

ネイティブアプリも作れる
　ブログをネイティブアプリに組み込み。もくはその逆（つまり、ブログをネイティブアプリとして拡張）
サーバーサイドレンダリング
　高速化の期待

***
パフォーマンス


***
今後

HTMLタグを抜いて、ページビューの高い記事と低い記事の分析
ワードや
ブログを採点
ネイティブ化
高品質の写真を有料化
運用ようにGoogleAnaliticsからデータを取得して、分析データを同じ画面で表示しながら、ブログをウェブサーフィン
など
様々なテスト技法

#概要
「この1冊でよくわかるソフトウェアテストの教科書」という本を読んで、知ったいろんなテスト技法について、まとめてみる。

#ホワイトボックステスト
ホワイトボックステストは、ソフトウェアの中身を理解したうえでそれを意識しながら行うテストです。
ホワイトボックステストに含まれるテストは
「制御フローテスト」
「データフローテスト」

##ホワイトボックスを行うメリット
1.モジュールの命令文単位で動作確認を行える
2.ホワイトボックステストによって検出された欠陥は、そのモジュールを調査・変更を行うことで修正を完了できます。

##制御フローテスト
制御フローテストは、モジュールを構成する要素、「命令文」「分岐した経緯」「条件」に着目し、これらがすべて実行されるかを確認します。
また、「命令文」「分岐した経路」「条件」、この3つの要素を、どれだけ網羅しているかの割合をカバレッジといいます。
基本的に制御フローテストでは、カバレッジ100%を目指してテストを行います。

##データフローテスト
データフローテストは、ソフトウェアの中で使われているデータや変数が「定義」→「使用」→「消滅」の順に正しく処理されているかを確認するテストです。
このテストは、プログラムの処理内で、未定義のまま使用されているデータや、未使用なデータを見つけて欠陥を無くしていくのが目的のテストです。

#ブラックボックステスト
ソフトウェアの入力データと出力データの結果だけに注視して、それが仕様通りに正しく処理されているかを確認するテストです。

##ブラックボックステストのメリット
ブラックボックステストでは、仕様通りに動作するかの確認を行うテストなので、利便性や操作性、セキュリティなどの確認も行うことが出きるため、より良いものに出来ないかの見直しも行うことが出来ます。

#テスト技法
##同値テスト
同値テストは、同じ動作をする条件の集まりごとにテストを行う技法です。
例えばパスワードの入力文字数が4文字以上、15文字以下に設定されていて、この範囲の文字数が入力された場合は「設定完了メッセージ」が表示されるという仕様の場合、入力された文字数が4文字であっても、15文字であっても結果は「設定完了メッセージ」が表示がされるため、代表値を設けてその値でテストを行う技法です。
考え方としては、「代表値でテストをした結果、欠陥が見つかれば、他の値でも同じ欠陥が見つかるだろう。欠陥が見つかれば、他の値でも同じ血管は見つかるだろう。」という考えです。

##境界値テスト
境界値テストは、使用条件の境界となる値とその隣の値に対してテストを行うテスト技法です。
先程のパスワードの文字数を例にした場合、
境界値テストは入力文字数が、3文字と4文字、15文字と16文字が境界値となります。
境界値に着目してテストを行うのは、欠陥は境界に潜んでいる可能性が高いためです。
主に「境界を表す条件の誤解」「コーディング時の条件の記述誤り」と理由で欠陥が潜みやすいです。

##デシジョンテーブルテスト
デシジョンテーブルテストとは、複数条件によって決定されるソフトウェアの動作を一覧するための表を用いて行うテストのことです。
デシジョンテーブルとは、ソフトウェアの「ルール」「条件」「アクション」を一覧表に記載して、結果のパターンを洗い出した表です。

##デシジョンテーブルの作り方
以下の画像がデシジョンテーブルのフォーマットになります。
![ピクチャ 5.png](https://qiita-image-store.s3.amazonaws.com/0/251365/344cfa70-021a-db5f-e8d9-caa060eafce9.png)
この表に
例としてジエットコースターの乗車制限を当てはめてみます。

条件
・身長130cm以上
・年齢8歳以上
・持病に心臓疾患がない
上記の条件を当てはめると以下の様になります。
![ピクチャ 7.png](https://qiita-image-store.s3.amazonaws.com/0/251365/23651243-d66b-d895-727c-fb8cdaac2950.png)
条件を記載して、ルールに条件の状態のパターンを記載します。最後にルールに対して、アクションの結果を記載していきます。

##表の簡略化
先程のデシジョンテーブルを簡略化します。
各条件は、どれか1つでもNになった時点で、
アクションに対する結果はNになるので以下のように簡略化することが出来ます。
![ピクチャ 8.png](https://qiita-image-store.s3.amazonaws.com/0/251365/6c35de8f-72c2-03a7-3313-550968d30961.png)

##状態遷移テスト
状態遷移テストとは、ソフトウェアの動作中にいろいろなイベントで変化する「状態」に着目し行うテストのことです。
ストップウォッチを例にしてみます。
時間表示部が「00:00:00」でカウントが上がっていないときは停止状態、その状態がSTARTボタンを押すことで、カウントアップがはじまり計測状態に変化します。
さらにSTOPボタンを押すことで、カウントアップアップが止まり、結果表示状態へと変化します。
このように、STARTボタンを、押すことでストップウォッチの状態が、計測状態へ変化して、カウントアップアップが始まるなどの、状態に対して正しい挙動がされているかを確かめるためのテスト技法です。

##組み合わせテスト
組み合わせテストは、複数の条件を組み合わせてソフトウェアの動作を確認するテストです。
単一の条件だけでは発生しないが、複数の条件が組み合わさった際に発生する欠陥を見つけるためのテスト技法です。
例えばコピー機を、例にした場合、
コピー機は「用紙のサイズ」「コピー面」「カラーモード」「コピー倍率」などさまざまな設定を行える、これらのコピー機の設定のさまざまな組み合わせで洗い出し、テストを行うことです。
Raspberry PiをVPNサーバとする

## PiVPNのインストール
日本のサイトでは[SoftEther](https://ja.softether.org/)をインストールする例がよく紹介されているが、ここではより導入が簡単な[PiVPN](https://github.com/pivpn/pivpn)を、自宅のRaspberry Piにインストールする。Raspberry PiのIPアドレスは固定されているものとする。

以下のコマンドにより、PiVPNのインストール画面が表示される:

```bash
$ curl -L https://install.pivpn.io | bash
```

あとは質問に答えていくだけだ。

* Do you want to use your current network settings as a static address?
Yes.

* Choose a local user that will hold your ovpn configurations.
piなど、適当に選択する。

* Do you want to enable unattended upgrades of security patches to this server?
Yes. (セキュリティ上重要なアップデートを自動で実施する)

* Choose a protocol (press space to select). Please only choose TCP if you know why you need TCP.
UDPを選択する。

* Enter a new value or hit 'Enter' to retain the default
Enter.

* Choose your desired level of encryption
2048.

* OpenVPN 2.4 brings support for stronger key exchange using Elliptic Curves and encrypted control channel, along with faster LZ4 compression.
No.

* Will clients use a Public IP or DNS Name to connect to your server (press space to select)?
"Use this public IP".

* Select the DNS Provider for your VPN Clients
Google.

* It is strongly recommended you reboot after installation. Would you like to reboot now?
Yes.

再起動したら以下のコマンドによりovpnプロファイルを作成する:

```shell-session
$ pivpn add
Enter a Name for the Client:  pivpn-client
Enter the password for the client:
Enter the password again to verify:
```

ovpnsディレクトリの中にプロファイルが作成されているので、VPNを利用するクライアント端末にファイルを移動する。

残りの作業としては、クライアント端末でのプロファイルのインストール、および、ルーター等でのポート転送の設定をおこなえば、スマホなどからVPNで接続可能となる。