OmniAICreator/Qiita-1.07M huggingface dataset:
文系から新卒でIT業界に入って思ったこと

2017年4月に新卒で某SIerに入社しました。そこで約1年間働いてみて思ったことを思いつくまま書いてみます。特に私と同じように、「文系からIT企業に入社することになったけどどうしようか」と何となく不安に思っている人に読んでもらえたら嬉しいです。
#プログラミングは思ってたほど恐くない
入社前はプログラミングに限らずPC関連の技術には苦手感が強かったです。それはもう苦手感というより恐怖の域にまで達していて、そんな自分がやっていけるのかと不安で不安で仕方なかったです。ところが、実際やってみると思ったより何とかなるな、と感じました。恐怖を持つまでに至った原因は単純に勉強不足だったと思います。
　書いてあることを書いてある通りにすれば同じように動く、というのは誤解を恐れず言えば簡単な部類だと思います。まずは実際にやってみると案ずるより産むが易しで何とかなると思います。

#やばいことはなかなか起こらない
PCに苦手意識がある人のほとんどが思っていることの中に、「うっかり触ったら何が起きるかわからない・・・。情報流出とかウイルスとかやばいことになりそう・・・」ということがあると思います。私自身もそうでしたし。しかし、プログラミングの本を買ってちょっと勉強してみる、くらいのことでそんなやばいことが起こることはなかなかないと思います(責任は持てませんが・・・)。過度にビビらずやってみてもらえれば、得られるものがあると思います。

#馬鹿にされることを恐れない
ある程度学歴が高かったり、社会的地位が高い人だと、「今更プログラミングやり始めたらできる人たちに馬鹿にされそう・・・」と思う人もいるんじゃないでしょうか。これについては基本的にみんな大人なので馬鹿にしたりされることはないと思います。ただ、それでも一部、そんな嫌な思いをすることはあるかもしれません。仕方ありません。こちらは初心者ですから。そんな時は気にしないようにしましょう。いつか見返してやる、と牙を研ぎながら粛々とスキルを身に付けていきましょう。

#終わりに
身の回りの知人に「qiitaで記事書く」と宣言してしまったのに準備不足でお茶を濁す記事になってしまいましたが、いかがでしたでしょうか。
　今回書いたことは、私が入社前に不安だったり、恐れていたことです。そんな人たちの一助になれば幸いです。
もうウインドウ・タブ切り替えにマウス使うのやめませんか？

アプリ切り替え

	command + tab
	
同じアプリのウインドウ切り替え

	command + F1

Chromeの隣のタブ移動

	command + option + →

ターミナル隣のタブ移動

	commanc + shift + →
	
これで一歩先のエンジニアに君もなれる！
C言語で不完全な動的配列を作った

C言語の復習がてらに文字列を格納する（不完全な）動的配列を作りました。
探せばいくらでも出てきそうですが、今回は自分で1から実装しました。
環境:visual studio 2017
##書いたもの
``` stringArray.h
#pragma once
#include<errno.h>
typedef struct {
	int size;//要素の数
	int memSpaceSize;//確保している領域の数
	char **str;//文字列を指すポインタ変数
}stringArray_t;
errno_t InitStringArray(stringArray_t *array);
void FreeStringArray(stringArray_t *array);
errno_t AddStringArrayItem(stringArray_t *array, char *str);
```
``` stringArray.c
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include<errno.h>
#include "stringArray.h"
errno_t InitStringArray(stringArray_t *array) {
	array->str = (char **)malloc(sizeof(char *));
	if (array->str == NULL) {
		return errno;
	}
	array->size = 0;
	array->memSpaceSize = 1;
	return 0;
}
void FreeStringArray(stringArray_t *array) {
	for (int i = 0; i < array->size; i++) {
		free(array->str[i]);
	}
	free(array->str);
	array->size = -1;
	array->memSpaceSize = -1;
}

errno_t AddStringArrayItem(stringArray_t *array, char *str) {
	long int memSpaceSizeCheck = 0;
	int memSpaceSize;

	if (array->memSpaceSize > array->size)
		memSpaceSize = 0;
	else if ((memSpaceSizeCheck = (long int)array->memSpaceSize + array->memSpaceSize) < INT_MAX)//2倍したものがint型で表せる数だったら
		memSpaceSize = (int)memSpaceSizeCheck;
	else if (array->memSpaceSize < INT_MAX)//
		memSpaceSize = INT_MAX;
	else
		return EINVAL;
	if (memSpaceSize > 0) {
		char **temp;
		temp = (char **)realloc(array->str, sizeof(char *)*memSpaceSize);
		if (temp == NULL)
			return errno;
		array->str = temp;
		array->memSpaceSize = memSpaceSize;
	}
	int length = strlen(str);
	char *newStr = (char *)malloc(sizeof(char)*(length + 1));
	if (newStr == NULL)
		return errno;
	memcpy(newStr, str, length + 1);
	array->str[array->size] = newStr;
	array->size++;
	return 0;
}
```
```main.c
#include <stdio.h>
#include<stdlib.h>
#include "stringArray.h"
int main(void) {
	stringArray_t stringArray;
	InitStringArray(&stringArray);
	AddStringArrayItem(&stringArray, "おはよう");
	AddStringArrayItem(&stringArray, "こんにちは");
	AddStringArrayItem(&stringArray, "こんばんは");
	for (int i = 0; i<stringArray.size; i++) {
		printf("%s\n", stringArray.str[i]);
	}
	FreeStringArray(&stringArray);
	system("pause");
	return 0;
}
```
###実行結果
```
おはよう
こんにちは
こんばんは
続行するには何かキーを押してください . . .
```


エラーチェック等main関数では省略しています。
何か変なところがあればアドバイスをお願いします。
Meteorのフレームワークを選ぶとき、ご参考までに！（Blaze派）

# はじめに
僕はあまりフロントエンドに詳しい方ではありません。
なのでAngularやReactはよく知りませんでした。

Meteorを勉強する前には、
PythonのDjangoを勉強していて、
「すげーな、Django！！」と感動していたクチです。

そして興味をもったMeteorのtutorialをやってみました。
Meteorは、フレームワークを選ぶことが出来ます。

・Blaze（謹製）
・Angular
・React

# Blazeを触ってみて
PythonのDjangoに良く似てるなって印象です。
HTMLコードとMeteorJSコードが綺麗に分けられる感じです。
書きやすいなと思いました。

tutorial通りに作ったあと、
MVC+Templateというフォルダ構成に作り変えることも出来ました。
これは設計思想を理解するために、やってみただけですが。


それに比べるとAngular版は
htmlタグの中にAngularコードが入り込むので分かり難い印象でした。

単純に僕の経験順序によるものですが、
フロントエンド初心者には、Blazeが良いのかなと思います。

React版はまだ試してません！
初めてのSpring-boot(Kotlin)で簡素なREST Web APIを構築してみる。

最近流行の(?)Spring bootを使って、仕事で学んだRESTful Web APIを構築していきます。

とりあえず、最近流行(?)のSPAを想定して、
クライアントサイド ～ サーバーサイド ～ データベース
まで繋げることを目標とします。

今回は、STSをダウンロード～Hello Worldまでを記載します。

#環境開発構築
STS(Spring Tool Suite)というプラグイン(?)を利用して開発を行います。
STSとは、Eclipseへインストールするプラグイン、それが既にEclipseにインストールされた状態のものの2種類を指すみたいです。(間違ってたらすみません...)
今回は後者をダウンロードして開発環境を整えます。

といっても、下のURLから最新版のzipファイルをダウンロードしてきて、

https://spring.io/tools

ダウンロードしたzipファイルを解凍して終了です。

#事前準備

##STSの動作を軽量化する
STSはEclipseをベースにしているからか、Eclipseと同様の方法で動作を軽くすることができるみたいです。
参考サイト：https://doruby.jp/users/YDM/entries/_eclipse_8_
iniファイルのメモリ設定を変える、コンテンツアシストのAuto設定を無効にするだけでも大分スムーズに動きます。
(コンテンツアシストを利用すると重くなりますが・・・)

#新規プロジェクト作成

##プロジェクトの作成
メニューバーのFile -> New -> Spring Starter Project
を押下します。すると、次の画面が表示されるので、

![Qiita](https://i.imgur.com/6sC8nyR.png)

Name:プロジェクト名
Language:Kotlin
Type:ご自分の使い慣れているものを設定すればよいと思います(今回はMavenを設定します)

を設定します。

nextを押下して、次の画面では、
Available:Jersey(JAX-RS)
を設定。(今回はHelo World出力までが目標なので、それ以外の設定(MyBatis)は省きます。)

![Qiita](https://i.imgur.com/F41UY2R.png)

他に設定したいものがなければそのままFinishします。


これでプロジェクトを作成できました。

##自動生成クラスの修正
自動生成されたApplicationクラスを開き、手動でクラス名にopen句を設定します
Kotlinでは、openをつけていないクラスは拡張不可(Javaでいうfinal句をつけた状態)として扱われるのですが、
Applicationクラスは拡張不可だと不都合が起きるらしく(サーバ起動時にエラーで落ちました)、その対応となります。

```Kotlin
@SpringBootApplication
open class RestsampleApplication
// class RestsampleApplication

fun main(args: Array<String>) {
    SpringApplication.run(RestsampleApplication::class.java, *args)
}
```

##Servletの設定
作成したプロジェクトをservlet3サーバーにデプロイするための設定を行います。
今回はWeb.xmlではなく、ResourceConfigのサブクラスを作成する方法をとります。
Javaの場合はpublicなコンストラクタ内に処理を書きますが、Kotlinではconstructorではなくinitキーワードを利用する必要があります。(ここら辺はプライマリコンストラクタ、セカンダリコンストラクタといったJavaにはない(直接見る機会がないだけ？)の概念が理由みたいです。)

```Kotlin
@Component
@ApplicationPath("/api")
class JerseyConfig :ResourceConfig(){
	
    init {
		// RESTの窓口クラスの格納されているパッケージを指定
        packages("com.example.demo");
    }

}
```

##Resourceクラスの作成
これで最低限の設定は完了しました。
後は、データの送受信を行うためのResourceクラスを作成します。

```Kotlin
@Path("/kotlin")
class KotlinResource {
	
	@GET
	fun test():String{
		return "hello Kotlin REST Web API!!"
	}
}
```

#動作確認
http://localhost8080/api/kotlin

ブラウザ上で下記画面が出力されたら成功です。
![Qiita](https://i.imgur.com/ZTNL8NM.png)

今回はここまで。
A server is already running. Check でrails serverが立ち上がらない


```
$rails s
```

でサーバーを立ち上げようと思っても
以下のようなメッセージでサーバーが立ち上がらなかった。

```
A server is already running. Check /ディレクトリパス/tmp/pids/server.pid.
Exiting
```

原因としては、前回のrails serverが
正しく停止しなかったことが障害が発生し
server.pid ファイルが残っていることが原因みたいです。

##環境
□OS : windows 10 home ubuntu on windows
 ubuntu : 16.04.3 LTS (Xenial Xerus)
□ruby : 2.4.2p198
□rails : 5.1.4


##対応策

```
/ディレクトリパス/tmp/pids/server.pid.
```

の server.pid ファイルを手動で削除することで

```
$rails s
```

でサーバーを起動できます。

ちなみに、正しくサーバーを停止させることができれば、
server.pid ファイルは削除されるはずです！
所持品

今週はお正月だったので、特にやりませんでしたので、
軽く持っているガジェットの紹介を...
誰も興味ないだろうけど、更新することを止めないためにも...

##MacBook Pro (Retina, 15-inch, Mid 2014)
プロセッサ:2.5GHz intel core i7
メモリ:16GB
HDD:500GB
//元々は動画編集とかに使ってたパソコン

##Lenovo Yoga Book with Windows
プロセッサ:インテル® Atom™ x5-Z8550 プロセッサー 
メモリー:4.0GB
HDD:64GB
//タブレット兼寝るときの動画視聴用、時たまお絵描き

##Dell デスクトップパソコン Inspiron 3268 Core i5モデル 
プロセッサ:core i5
メモリ:8GB
HDD:1TB
//Windowsの環境が欲しかったため購入

##自作PC
//必要最低限のスペックしかないため、実家で保存
//近いうちに、拡張しようか検討中

##iphone7 128GB
//主スマホとしてご活躍中

##Microsoft Lumia 750
//海外旅行用のスマホとしてご活躍中

##BLU(ブルー)GRAND M SIMフリースマートフォン シルバー
//Androidアプリ開発用に購入。ただの実験機

##LG モニター ディスプレイ 34UM59-P 34インチ/21:9 ウルトラワイド/IPS非光沢/HDMI×2
//ご褒美品として購入。モニターが小さかったし、PS4やるのに綺麗なのが欲しかった。

##Amazon Echo Dot
安かったし、去年の流行りだったのでつい...

##PS4
//娯楽もたまには必要でしょ


###しばらくは引越しもあるし、貯金のために購入しないつもりではいる予定
[Javascript] date-fnsで日本語の日付を表示する

# 概要
* javascriptで日付を表示するには、[moment.js](https://momentjs.com/)より[date-fns](https://date-fns.org/)がES6対応やimmutableの点でいい感じ。最近はよく使っている
* 日本語も含む国際対応もしている。
* 使う時は、`import ja from 'date-fns/locale/ja'`して、`format(date, formatStr, {locale: ja})`すればOK

# 手順

## date-fnsをインストールする

```console
yarn add date-fns
```

## サンプルコード

`ja`を`import`して日本語表示したい所に`{locale: ja}`を指定する。

```test.js
import {format} from 'date-fns'
import ja from 'date-fns/locale/ja'

console.log(format(new Date(), 'MMM Do dddd')) // 初期言語（英語）

console.log(format(new Date(), 'MMM Do dddd', {locale: ja})) // 日本語
```

## 出力結果

```
Jan 9th Tuesday
1月 9日 火曜日
```
以上
Unity備忘録、STG制作2:フレームレートの調整

※この記事は2年前くらい(2016年)に、当時在籍していた某社内で投稿したものを引き上げて、個人で再掲載しています。誰も読むことができない記事に価値なんてないからね～。Confidentialなネタは無いので念のため。

#背景
Unityの入門書を読むと、大抵は「Update関数のコールタイミングは環境や処理負荷に依存する」、というようなことが書かれている。
カジュアルゲームとかなら問題ないかもしれないが、例えばシューティングゲームのように「0.2秒間隔で弾を撃つ」というような処理を考えた場合、Update関数が不定期でコールされるとゲームバランスが崩壊してしまう。
そこで、今回はフレームレートを調整する方法を記載する。

#目標フレームレート
一般的なゲームは60FPSまたは30FPSである。
今回は60FPSとする。

#フレームレートを表示する
とりあえず初期設定でのフレームレートがどうなっているかを確認する。
以下のソースをMain Cameraに追加する。

```csharp:DebugInfo.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;


public class DebugInfo : MonoBehaviour {
	public Text FpsText;
	
	// Update is called once per frame
	void Update () {
		if (Time.frameCount % Application.targetFrameRate == 0)
		{
			FpsText.text = "FPS:" + (int)(1 / Time.deltaTime);
		}	
	}
}
```

これを自PCとスマホの両方で試したところ、何と普通に60FPSでした。
但し、今回はたまたまデフォルトが60FPSだったというだけなので、正式な手順で60FPSを設定する方法を次に記載する。

#フレームレート調整方法
(1)Edit -> Project Setting -> Qualityを開き、「V Sync Count」を「Don't Sync」にする。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/162164/b9c1cd5a-2cba-00a7-4a2d-c08bb772562d.png)


(2)以下のプログラムをMainCameraに追加する。

```csharp:SystemManager.cs
using UnityEngine;
using System.Collections;

public class SystemManager : MonoBehaviour {

	void Awake() { 
		Application.targetFrameRate = 60; //60FPSに設定	
	}
}
```

#実行結果
PC上ではこんな感じ。スマホでも同様の結果を得られた。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/162164/07f9f7d2-25bc-953b-3982-7f881d56be21.png)


試しにApplication.targetFrameRate = 40 にした場合もちゃんと反映される。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/162164/78f357af-6009-6697-4b99-fff93ea8a012.png)


以上
Kotlinの変数をクラス内でのみ変更可能にする方法

Kotlinで単純に再代入不可にしたい場合はvalを使えばいいですが、以下のような内部で変更可能なgetterのみのクラスを作る方法がわからなかったので調べてみました。

```java:Curry.java
public class Curry {
    private String spice = "トウガラシ";

    public String getSpice() {
        return spice;
    }

    private void changeSpice() {
        spice = "ショウガ";
    }
}
```

#方法

Kotlinの変数はプロパティなので、setterをprivateにして外部から使用できなくすればいいです。

```kotlin
    var spice : String = "トウガラシ"
        private set
```

上のJavaのクラスをKotlinで書いた場合

```kotlin:Curry.kt
class Curry {
    var spice : String = "トウガラシ"
        private set

    private fun changeSpice() {
        spice = "ショウガ"
    }
}
```

外部からは参照のみで代入はできません。

```kotlin:Main.kt
fun main(args: Array<String>) {
    val curry = Curry()

    // 読み取り可能
    println(curry.spice)
     
    // 代入不可 コンパイルエラー
    curry.spice = "胡椒"
}
```
インフラエンジニアとして大事な感覚を絵で描いてみた (レイテンシのタイムスケール)

# はじめに
本記事は、[Brendan Gregg著 - 詳細システムパフォーマンス](https://www.oreilly.co.jp/books/9784873117904/)で解説されている**"システムレイテンシのタイムスケール"**の表を**絵に描いてみて**います。**ただそれだけです。**

以下、書籍より引用 「P.19 第2章 メソトロジ - 2.3. タイムスケール より」
> 時間は数値として比較できるが、時間についての直観、異なるソースのレイテンシの予測ができれば役に立つ。システムコンポーネントが動作するタイムスケール(時間の割合)には非常に大きな差があるので、単に差がどれくらいかがわかっても把握しにくい場合がある。表2-2は、3.3GHzCPUのレジスタアクセスから順に例天使の例を示したものである。私たちが相手にするタイムスケールの差の大きさを具体的につかむために、この表は、レジスタアクセスがちょうど1秒かかる架空のシステム(実際には、0.3n 秒、すなわち約 30億分の1秒しかかからない)で、それぞれのオペレーションに平均でどれくらいの時間がかかるかを示している。

# 経緯
インフラエンジニアとしてほぼ3年が経ちました。まだまだ基礎力が足りないと思い立ち、年末年始でゆるーく勉強していました。
(著者は入社してほとんどクラウドしか触れていなくて、低いレイヤをまるっきりブラックボックスにしてきてしまったクラウドゆとりです。。)

[詳細システムパフォーマンス](https://www.oreilly.co.jp/books/9784873117904/)が体系的に学びやすそうだったので(ただただ)読み進めていたのですが、このお休みでなにもアウトプットがないのは寂しかったので連休最後で1記事投稿しました。
書籍では表で記載があったのですが、インフラエンジニアとしてすごく大切な感覚だと思いますので**絵に表すことで**深く刻みつけます。

「メインメモリへのアクセスが**6分**だとすると、回転ディスクへのアクセスは**数ヶ月**かかる」って感覚、ちゃんと持ち合わせていなかったなーと、自戒の念を込めています。

# システムレイテンシのタイムスケールの例

さっそく表を絵にしています

![スライド0.PNG](https://qiita-image-store.s3.amazonaws.com/0/108052/185c8262-0312-4d5c-37d6-04edaf42cdb5.png)
![スライド1.PNG](https://qiita-image-store.s3.amazonaws.com/0/108052/8336046d-2706-d13a-cdc4-8c91814d92d7.png)
![スライド2.PNG](https://qiita-image-store.s3.amazonaws.com/0/108052/99fb195f-7abd-b5be-234d-48cac81c9029.png)
![スライド3.PNG](https://qiita-image-store.s3.amazonaws.com/0/108052/ddec55df-0431-c6f9-284b-3b284d2f611c.png)

## 補足の図

書籍ではCPUサイクルのタイムスケールが極めて小さいということを補足しているので、それも絵で表現します
(そもそも光の速度ってめちゃくちゃ速いですね。1秒で地球を7周半)

CPUってすげーな。

> ご覧のようにCPUサイクルのタイムスケールはきわめて小さい。あなたの目からこのページまでは0.5mほどだが、光がこの教理を移動するためにかかる時間は約1.7n 秒である。同じ時間に、現代のCPUは5つのCPUサイクルを実行し、複数の命令を処理しているのである

![スライド4.PNG](https://qiita-image-store.s3.amazonaws.com/0/108052/b30c6ad1-267e-2e71-2256-08e2209c1e54.png)

※ 描いた絵は、PCから人間の目で表現しています(書籍では本のページから人間の目でしたが)

# おまけ： ping遅延

ネットワークの章でも対比の表があったためこちらも絵にしてみました。

「サンフランシスコからニューヨークのping遅延が**13分**だとすると、オーストラリアへのping遅延は**1時間**になる」って感覚は全然持てていなかったので勉強になりました。

「P.534 第10章 ネットワーク - 10.3.5 レイテンシ より」

> 表 10-1 は、ping遅延の例をまとめたものである。桁数の違いがわかりやすくなるように、localhostへのping遅延を仮に1秒としたときにそれぞれの値がどれくらいになるかを「対比」欄にまとめてある。

![スライド5.PNG](https://qiita-image-store.s3.amazonaws.com/0/108052/0a72a9bd-4421-ead7-b2e3-acab622d7b74.png)
![スライド6.PNG](https://qiita-image-store.s3.amazonaws.com/0/108052/f807daa9-4074-c0fe-3f49-7d05417e9c06.png)

# まとめ

レイテンシってタイムスケールが驚くほど違うので、大雑把でもちゃんと覚えておかないといけないですね。対比を絵で描くことでこの感覚がちゃんと身についた気がします。
SAP Cloud PlatformでJavaプログラムをデプロイ

#**はじめに**
SAP Cloud Platform（SAP CP）のトライアルの第2回目です。

今回は以下の記事を参考に、Java application（Helloworldプログラム)の作成から、Java applicationをSAP CPへデプロイするところまでやりました。

[触ってみよう！SAPのPaaS――第2回：SAP HANA Cloud Platform上にJava application（Hello World）をデプロイするまでの手順](https://www.sapjp.com/blog/archives/12410)

この記事は2015年7月時点の情報のため、
記事との差分を中心に記述します(2018年1月時点)。

**~~※手順4.SAP HANA Cloud Platformにてエラー発生。調査中です~~**

#**環境**
- Windows10 64bit
(記事のOSはWindows7)
- [SAP Cloud Platform Tools for Javaのセットアップ済](https://qiita.com/mahko2/items/ae0f7bd7916524ba9f1e)
(トライアルの1回目)

#**手順**
*※ここからは、参照元の記事の項番とリンクした内容で記載します*


##**1.Dynamic Web Projectの作成 ＠Eclipse**
####**★差異あり**
メニューパスが少し変わってました。
Eclipseを開いてwindowsタブ→Perspective→Open Perspective→Other
![スクリーンショット (393).png](https://qiita-image-store.s3.amazonaws.com/0/22526/771bfe38-bb7e-1116-e781-531982ab6429.png)

※Dynamic Web Project作成のwindowでは、configurationに”Default Configuration for Java”が選択されていました
##**2.Hello World Servletの作成 ＠Eclipse**
####**★差異あり**
コードのコピー元のダブルクォーテーションが誤ってました(設定なのかな？)
誤：“Hello World!”
正："Hello World!"
##**3.ローカル環境での実行 ＠ローカルPC上**
####**★差異なし**
![スクリーンショット (405).png](https://qiita-image-store.s3.amazonaws.com/0/22526/7a2fede1-c4e3-6085-c755-728784ab2b67.png)
##**4.SAP HANA Cloud Platformでの実行 ＠SAP HANA Cloud Platform**
####**★差異あり(エラーあり→解消)**

実行した結果、エラーに。
![スクリーンショット (410)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/8b8ff3d4-5c11-b958-0724-aaa5b54a3218.jpeg)

SAP CPへのデプロイは完了してるようですが、記載されているアプリケーションURLは存在していませんでした。
![スクリーンショット (414)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/ec592a04-e24d-fb17-405b-3b29adf1845d.jpeg)

![スクリーンショット (415)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/a3266e28-f62d-310c-6df1-4c1fd9b1295b.jpeg)

2018/1/10追記
Eclipseの設定で、JREのバージョンを8→7に変更したところ、エラーが解消しました。
![スクリーンショット (425)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/22526/20b6b147-0989-b979-c976-88644c3925e6.jpeg)



##**まとめ**
~~引き続きエラー原因の調査は行いますが、一旦おしまい~~
引き続き、SAP CPのトライアルを進めていきたいと思います。

※[はてなブログ](http://www.sapsumikko.jp/entry/2018/01/08/192932)で経緯などを追記
Androidでcpuminerを使おう (BitZeny)

# はじめに
簡単にやり方だけ解説します

# 必要な物
- Termux
  - openssl-dev
  - libcurl4-dev ?
  - clang

# やりかた

1. `gcc`を消す
  - `gcc`は`clang`のシンボリックリンクなので`clang`が`gcc`として誤検知されるのを防ぐ
  - cpuminerはclangでもコンパイル出来るので大丈夫
  - `rm $(which gcc)`
2. `syslog.h`の3行をコメントアウト
  - `nano ../usr/include/syslog.h`
  - 119行付近の以下で始まる行
     - `__android_log_vprint`
     - `__android_log_print`
     - `android_polyfill_vsyslog`
3. 後は https://github.com/macchky/cpuminer の通り
4. `./minerd ...`でLet's採掘

# 結論
遅くてそこまで儲からないのでスマホは普通に使おう
mac上のnode.jsでopencvを扱おうとした時の準備メモ。

mac上でnode.jsとopencvを扱おうと思ったのですが、その環境構築で時間を使ってしまったので、次に同じ失敗をしないためにも自分用にメモを残しておく

自分の場合はmacにopencvのv3.4.0が既にインストールされてしまっていたので、とりあえずこれのリンクを外します

```bash
brew unlink opencv
```

次にv2系のopencvをインストールする

```bash
brew install opencv@2
brew link --force opencv@2
```

あとはnpmコマンドを使ってインストールをするだけ

```bash
npm install -save opencv
```

opencvのバージョンが３系だといろんなエラーが出て大変だったけど２系にしてみたら簡単にできました。
その途中でnode.jsのバージョンを変えたりしたのですが、とりあえず今のバージョンを下にメモしておきます

|項目|バージョン|
|---|---|
|mac|10.13.1|
|node.js|v5.12.0|
|opencv|2.4.13.5|
TypeError: 'str' object is not callable

#背景

動的型付言語初心者なもんで、これが出た時に最初よくわからなかったのでメモ。
[テスト駆動開発](https://www.amazon.co.jp/dp/B077D2L69C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)を勉強がてらPythonで写経しているとき、第９章で"currency"の概念を導入するときに出会った。

#変数名と関数名が同じになっている

```
class Money():
  def __init__(self, amount, currency):
    self.amount = amount
    self.amount = currency
  
  :
  
  def currency():
    return self.currency
  :

```

こうしてしまっていたため、関数の"currency"を呼び出しているかと思いきやと変数の"currency"という文字列に対してcallをしてしまっているらしい。
試しにインタプリタで以下を実行してみると、同じようなエラーが出る。

```
>>> 'USD'()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
>>>
```

最初エラーの意味がよくわからなかったけど、よくよく考えれば当たり前のことだった…
とりあえずgetter/setter書いたり、変数の名前を"_currency"などに変えれば良いんだと思う。
Address already in use の対処法

# はじめに
サーバーを再起動しようとしたときに、 `Address already in use` がでるので、対処法をメモ。
# 原因
httpdが正常に終了していない、プロセスを終了せずにターミナルを閉じる等により古いプロセスが残っているのが原因。
雑に消しちゃいけないね。。。
# 解決方法
```
# プロセスの確認（rails）
$ ps ax | grep rails
7532 .....

# ポートNoが分かっていればこれで確認できる
$ lsof -i:ポートNo

# http
lsof -i | grep http
7532 .....
```

上記コマンドで該当のPIDをを見つけ、killすれば解決する

```
$ kill -9 [該当のPID]
```

`-9` は強制終了のオプションなんですが、なぜかこれを付けてプロセス終了させると再度同じポートのプロセスが立ち上がるという現象が発生して無限ループに陥ることがありました・・・

その解決方法としては、 `-9` のオプションを付けないということでした・・・

```
$ kill [該当のPID]
```


# 終わりに
エラー内容をよく読まずにだいぶ苦戦してました。

つら。
railsコマンドが使えないときにやったこと

# rails serverができない
railsを起動しようとしてもコマンド実行するたびに下記のメッセージが表示されるので困った。
rails初心者なのでとにかく動かしたい。

```
$ rails server
Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.
```
# rails serverができた！
下記のコマンドを実行したらrails serverが実行できました。

```
$　gem install railties
$　rbenv rehash
```
# 参考サイト
[railsをインストールできない](https://qiita.com/Arashi/items/ae982df5e534fd4bc97a)
[Railsのバージョンがなんかおかしい時はrailtiesをチェック](http://blog.supermomonga.com/articles/rails/rails-version-railties.html)
micro:bitのダウンロードファイル(*.hex)を自動インストールさせる方法

※2017/02/03追記：Windows10の環境の方は[MakeCode for micro:bit](https://www.microsoft.com/ja-jp/store/p/makecode-for-micro-bit/9pjc7sv48lcx?rtc=1) がリリースされました。こちらはダウンロード＝ダイレクトにインストールしてくれます。

#はじめに

micro:bitの開発環境 [JavaScript Blocks Editor](https://makecode.microbit.org) で「ダウンロード」をクリックすると、通常は *.hex というファイルが、ブラウザのダウンロードディレクトリに保存され、これをUSBドライブとして認識されている「MICROBIT」というドライブにコピーする必要があり毎度面倒な作業になります。

#解決作1. オフィシャルのtouch developツール Micorbit.Uploader を使う

Windows用しかありませんが [Micorbit.Uploader](https://www.touchdevelop.com/microbituploader) というのがあります。
これをインストールすると、ダウンロードディレクトリを監視し\*.hexファイルがダウンロードされると自動的に、MICROBITドライブにコピーされ、コピーが完了すると、\*.uploaded.hex というファイル名にリネームされます。

注意点としては、このツールは[touch develop](https://www.touchdevelop.com/app/)（JavaScript Blocks Editorの前身)のサポートプログラムなので、https://makecode.microbit.org/uploader では、
> Developer Zone! This is an experimental feature from touch develop. This is not supported by MakeCode and may be removed in future.

となっています。

#解決作2. Chrome拡張 Download Router を使う

Chrome拡張に[Download Router](https://chrome.google.com/webstore/detail/downloads-router/fgkboeogiiklpklnjgdiaghaiehcknjo)というのがあります。これは、ファイルの拡張子やドメイン名毎に保存先を変更してくれるという素敵な汎用ツールです。

一点、問題があり、ドライブの指定が出来ません。この解決方法としては、シンボリックリンクファイル（Windows場合はショートカットではありません。Windowsでシンボリックリンクファイルを作る[方法はこちら](https://qiita.com/opengl-8080/items/c2b6a93dfca5b61f9e6a)。）を作る事により、別ドライブ(MICROBIT)に直接保存させる事が出来ます。

設定は少々面倒だったり、ドライブが変わると追従できなかったりという問題はありますが、こちらの方がダウンロードフォルダーに *.hexファイルが大量に残らないメリットはあります。

#おわりに

子供にはじめてmicro:bitを教える場合、唯一のボトルネックがインストールのステップです。OS環境やブラウザ環境がまちまちだったりするとそこでタイムロスが発生します。対象がWindowsだけであれば、まずは問答無用でMicorbit.Uploaderを入れもらうのも手かもしれません。

なお、この解決作以外に「もっと素敵な方法がある！」という情報があれば教えてください。
PhpStormのタブをA-Z順でソートするには？

PhpStormのタブをアルファベット順でソートするには、タブを右クリックしてコンテキストメニューを出し、「Sort Tabs by Filename.」を押すと並び替わる。

![2018-01-08 18_09_33.gif](https://qiita-image-store.s3.amazonaws.com/0/889/7dcd5512-f9e0-8895-369c-d0780617d39e.gif)

(このGif、メニュー選びに迷いが感じられる…)
ST_AsMVTを使ってベクタータイルが作れるか？

**本記事については問題があり、原因については下記にて説明しています。**
https://qiita.com/R_28/items/49826f822121cb15e11c

# 前提

結論としてST_AsMVTでベクタータイルは作れます。（そういう関数なので）
下記に詳細は記載されていますので、ST_AsMVTを試してみたい方はこちらを参考にされるほうが良いです。
http://waigani.hatenablog.jp/entry/2017/12/22/060000

自分はベクタータイルの作り方は下記の「simple-vectorizer」を参考にしています。
https://qiita.com/honjo/items/8ea61f5a9c1bbaa669c0
https://github.com/mapion/simple-vectorizer

ここでの本題は
**ST_AsMVTで「simple-vectorizer」と同じベクタータイルが生成できるか？**
になります。

simple-vectorizerは次のような手順でベクタータイルを作成しています。

1. タイル状にクリッピングしたジオメトリとパラメータを作成
2. ジオメトリの結合、単純化を適用
3. 生成したジオメトリをGeoJSONに変換して出力
4. JSONをmapnik.VectorTileを使ってバイナリ化

http://mapnik.org/documentation/node-mapnik/3.6/#VectorTile.getData

１から３まではSQLで処理し、JSONからバイナリ化はNode.js側で処理している設計ですね。

この際、

- ジオメトリからJSONに変換している
- JSONをバイナリにNode.jsで変換している

といったところオーバヘッドになっているわけですが、
PostGIS2.4から「ST_AsMVT」が使えるようになったことから
「SQLでバイナリ化まで可能」になったようです。

で、ST_AsMVTで同様のベクタータイルが生成できるのかを検証。

# 環境

OS：
Windows10

PostgreSQL：
'PostgreSQL 10.1, compiled by Visual C++ build 1800, 64-bit'

PostGIS：
'2.4 USE_GEOS=1 USE_PROJ=1 USE_STATS=1'

タイル：
16/58306/25693

レイヤー：
rdcl

# SQL

ST_AsMVTを使用したSQL部分については下記の通り

``` sample.sql
SELECT ST_AsMVT(q, 'rdcl', 4096, 'geom') 
FROM (
	SELECT
    	rdctg AS c1,
    	ST_AsMVTGeom(
            ST_Simplify(ST_LineMerge(ST_Collect(geom)),map.pixel_at_zoom(16)), --- 1
            map.tile_to_box(58306,25693,16,2),
            4096,
            0,
            true) --- 2
            AS geom
    FROM (
        SELECT 
                rdctg,
                (ST_Dump(geom)).geom --- 3
        FROM rdcl 
        WHERE geom && map.tile_to_box(58306,25693,16,2)
    ) a GROUP BY a.rdctg
) as q
    
```
1. ST_Transformは実施していません。（ST_AsMVTGeomがやっている？）
2. タイルのクリッピング処理をST_AsMVTGeomで実施
3. そのため、map.safe_intersectionは省略



# 描画

SQLを一度テキストで吐き出してバイナリ化、vt2gejsonでJSON化し、表示。

やり方は下記参照
http://waigani.hatenablog.jp/entry/2017/12/22/060000

GEOJSONの表示は下記のサイトを使用
http://geojson.io/ 


![image.png](https://qiita-image-store.s3.amazonaws.com/0/13360/55e5bccd-3131-a89f-b650-6a27063ebcee.png)

# 比較

赤：simple-vectorizerで作成したジオメトリ
黒：ST_AsMVTで作成したジオメトリ

※simple-vectorizerで生成したベクタータイルのバイナリをvt2gejsonでJSONに変換して使用

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13360/5437724d-c590-7162-949e-1fc2f98e8b63.png)

なんかずれるんだよなぁ

# 考察

なぜずれるか

1. ST_TransformとST_AsMVTGeomの座標変換での差？
2. map.safe_intersectionの差？

ずれ方を見る限り、中心付近ではマッチしていることから、測地系のずれではなさそう。
投影法かなぁ
WindowsでPythonがうまく動かないとき(PATHの設定)

初めてWindowsでPython使うときに動かない人のためのメモ

#WindowsでPython
そもそもWindowsってPythonあんまやりにくいんですって
[WindowsでPython](https://www.slideshare.net/drillan/stapy22)
でも最近やりやすくなってきてるんですって

[【決定版】WindowsでPythonを使って『機械学習』を学ぶための環境構築](https://qiita.com/yoshizaki_kkgk/items/1057ed4dcc36ed9be7f5)
こういうのやろうとした
Anacondaをインストール！
WindowsでPythonするならPowerShellというやつがいいんですって


#動かないときー

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/77925/a6523d49-3abc-7fa5-92ce-0750c89a3900.png)
コロス

[Pythonで心理実験 - 準備編2 — 十河研究室](http://www.s12600.net/psy/python/00-2.html)
PATHの設定が必要らしい、デフォでしといてくれやRazer Blade...

#PATHを設定
スタートメニュー→設定→システム→[環境設定の編集]を検索

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/77925/101961ef-d2b6-692c-70c8-b3e773f3db3c.png)
Pathを選んで編集

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/77925/ea3853fe-0b17-993f-282b-21e37c295e87.png)
[新規]からAnacondaをインストールした場所のPathを書き足す
たぶん`C:\Users\**あなたのユーザー名**\Anaconda3`とかだと思う。ついでにpipとか使うときに必要な`C:\Users\**あなたのユーザー名**\Anaconda3\Scripts`も書き込んでおくと幸せになれる。

AnacondaインストールしてたらCドライブで検索→しばらく待って出てきたら右クリックでプロパティ、でPath（Anaconda3フォルダがどこにあるか）が見れるので、そのPathの一番後ろに\Anaconda3でOKのはず

# World Peace
PowerShellを再起動しましょう
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/77925/a70dd873-1837-e9be-4430-4fa250e11485.png)
Python使い放題です

# 追記
[windows10でpipが使えるようになるまで(python3.6) - Qiita](https://qiita.com/huushihi/items/c7f578bf51c0017c9076)
こちらにもありました
Python文字列や画像を保存

ブログに書くほどではないけど忘れたく無いノウハウを書き連ねていきます。

# 画像の読み書き with Opencv
Opencv3を用いた環境を仮定。

```python3
import cv2

# read Image with GrayScale
Img =  cv2.imread("Image.png",0)

# save Image
cv2.imwrite("Image.jpg",Img)

```
名前が先なのが結構ややこい。

表示は次の2パターン。
matplotlibはグレー指定を忘れて変な色で表示されがち。

```python3
# Using OpenCV
cv2.imshow("Read Image",Img)
cv2.waitKey(0)

# Using Matplotlib
import matplotlib.pyplot as plt # matplotlibの描画系
plt.imshow(Iref,cmap='gray')
```

# numpy行列をtxtやcsvに吐き出し
## Txtで吐き出し

numpyにはsavetxtというのがあるらしい。
http://conta.hatenablog.com/entry/2013/12/02/183538
ここにReferenceを書いてくれている人がいるので詳細はこちらで。
https://deepage.net/features/numpy-loadsavetxt.html

```python3
import numpy as np

# for 何らかのループでデータをappend
# dataset.append(何某か)

# 整形
dataset = np.array(dataset,np.float32).reshape(H,W)
# 出力
np.savetxt('out.txt',dataset,delimiter=',')
```

## CSV吐き出し
さっきのsavetxtで同様にcsvとしても保存可能。

```python3
import numpy as np

#csvファイルとして保存
np.savetxt('out.csv',dataset,delimiter=',')

```


# 超余談：Dialogを呼んでファイルを選択，ファイル名を取得
一番面倒なのがファイル名を取得する場所。

非常に便利そうなものを[ここの記事](https://qiita.com/chanmaru/items/d5303a93d29d52057608)からお借りした。

自分の目的用に書き直すとこうなる。画像ファイルのみを選択してその名前を返す関数である。

```python3
# Import module
import os, tkinter, tkinter.filedialog, tkinter.messagebox

def GetFileName():
    # Show Dialog
    root = tkinter.Tk()
    root.withdraw()
    # Any file type of Image
    fTyp = [("",["*.png","*.jpg","*.bmp"])]
    iDir = os.path.abspath(os.path.dirname(__file__))
    tkinter.messagebox.showinfo('Image choice','Choose Base Image!')
    file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)
    return file

```
PhpStormの「後方補完」を使うと後からvar_dumpで囲めたりと便利

![デモ]

`.var_dump`と打って<kbd>TAB</kbd>キーを押す。これで直前のコードが`var_dump()`で囲まれる。`var_dump`以外にも`echo`や`foreach`などがある。

<img width="1306" alt="設定 2018-01-08 17-53-48.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/27d98931-c12d-df5a-c4e5-604ac62a13af.png">

忘れていると使えない機能なので、何回か素振りして練習する必要はありそう。


[デモ]: https://qiita-image-store.s3.amazonaws.com/0/889/5e933073-9980-6b40-56e5-835d251ff4f1.gif
Hyperledger ComposerをGoogle Cloud Platformで動かす

# はじめに
最近、ブロックチェーン技術に興味を持ち、色々と勉強しています。
勉強する中で、分散台帳技術の発展性に可能性を感じ、自分でも何かアプリケーションを開発したいと思うようになりました。

そこで、まずHyperleger ComposerをGoogle Cloud PlatformのCompute Engineに
インストール＆動作させてみたので、その手順を記録として残しておきます。

# GCE(Google Compute Engine)のインスタンス作成

[Hyperleger Composer公式サイト](https://hyperledger.github.io/composer/stable/index.html)の[Installing pre-requisites](https://hyperledger.github.io/composer/stable/installing/installing-prereqs.html)に書かれている要件を参考に、以下の構成でインスタンスを作成。

- 構成（抜粋） ※無料枠の範囲を超えているのでコストに注意
    - custom（vCPU x1、メモリ4GB）
    - OS：Ubuntu Linux 16.04 LTS
    - ポート開放：tcp:8080　=> 後でPlaygroundにアクセスするため
    - 外部IP取得 => 後でPlaygroundにアクセスするため

# GCEにHyperleger Composerをインストール
続いて、[Installing the development environment](https://hyperledger.github.io/composer/stable/installing/development-tools.html)に沿って、順番にコマンド実行。

順調にインストール作業は進んでいたが、以下のコマンドを実行したときにエラー発生。

```
./createPeerAdminCard.sh
```

発生したエラーの一部。同時に、他のエラーもいくつか出力されました。

```Errorの一部
Error: Failed to load connector module "composer-connector-hlfv1" for connection type "hlfv1".
```


色々調べた結果、`/home/user名/.nvm/versions/node/v8.9.4/lib/node_modules/composer-cli`で、以下のコマンドを実行することで解決しました。

```
npm rebuild --unsafe-perm
```
# Hyperleger Composerの実行

ここも、[Installing the development environment](https://hyperledger.github.io/composer/stable/installing/development-tools.html)のControlling your dev environmentに沿って、順番にコマンド実行。

```
cd ~/fabric-tools
./startFabric.sh
./createPeerAdminCard.sh
```

以下のコマンドを実行して、Playgroundを実行。

```
composer-playground
```

ブラウザで、http:// GCEに割り当てた外部IPアドレス:8080 /loginにアクセスして、
Hyperledger ComposerのPlaygroundが自分のインスタンス上で実行されていることを確認。

以上、作業完了。
ES6でenum（列挙型）を実現する

es6には標準でenumがないため、自前でenum風のクラスを作ってみたいと思います。
今回はhttpリクエストのメソッドを列挙型で表現します。

# 定義
```javascript
class HTTP_METHOD {
    static get get() {
        return HTTP_TYPE_OBJECT.get;
    }

    static get post() {
        return HTTP_TYPE_OBJECT.post;
    }

    static get put() {
        return HTTP_TYPE_OBJECT.put;
    }

    static get delete() {
        return HTTP_TYPE_OBJECT.delete;
    }

    get string() {
        switch (this) {
            case HTTP_TYPE.get:
                return 'GET';
            case HTTP_TYPE.post:
                return 'POST';
            case HTTP_TYPE.put:
                return 'PUT';
            case HTTP_TYPE.delete:
                return 'DELETE';
            default:
                return null
        }
    }
}

const HTTP_METHOD_OBJECT = {
    get: new HTTP_TYPE(),
    post: new HTTP_TYPE(),
    put: new HTTP_TYPE(),
    delete: new HTTP_TYPE(),
};

```

# 使い方
HTTP_METHODは直接newしてインスタンスを作ってはいけません。
必ずstaticメソッドを使って該当のHTTP_METHODを取得してください。

```javascript
function postSome() {
    let postUrl = "https://hoge/post"
    let param = {
        hoge: "hoge"
    }
    request(postUrl, HTTP_METHOD.post, param)
}

function getSome() {
    let postUrl = "https://hoge/get"
    let param = {
        hoge: "hoge"
    }
    request(postUrl, HTTP_METHOD.get, param)
}

function request(url, method, param) {
    switch (method) {
            case HTTP_METHOD.post:
            case HTTP_METHOD.delete:
            case HTTP_METHOD.put:
                fetch(url, {
                    method: method.string,
                    body: JSON.stringify(param),
                });
                break;
            case HTTP_METHOD.get:
                searchParamsString = "";
                Object.keys(params).forEach((key) => {
                    searchParamsString += key + "=" + params[key] + "&";
                });
                searchParamsString = searchParamsString.slice(0, searchParamsString.length - 1);
                fetch(url + "?" + searchParamsString, {
                    method: method.string,
                });
        }
}
```
RISC-Vソースコード読書会(6)

##`<ID>`##
ここからIDステージ(`<ID>`)。`<IF>`でフェッチした命令に従い命令デコードをするほか、タグ生成を実行する。
###Tag Generator###
ソースはsrc/fpga/tag_generator.v。何のタグかというと、分岐投機実行タグである。"Modern Processor Design"の229ページから231ページにかけて、分岐の投機実行について書かれている。分岐予測の2つの側面があり、ひとつは分岐の投機実行と、他のひとつは分岐の妥当性検証及び修復である。分岐の投機実行は仮実行という印をタグに登録しておき、後で分岐予測の妥当性検証を実行する。その際に予測がはずれていれば、タグにより分岐を無効化する必要がある。これが修復と呼ばれるプロセスになる。

```verilog
`include "constants.vh"
`default_nettype none
module tag_generator(
		     input wire 		    clk,
		     input wire 		    reset,
		     input wire 		    branchvalid1,
		     input wire 		    branchvalid2,
		     input wire 		    prmiss,
		     input wire 		    prsuccess,
		     input wire 		    enable,
		     input wire [`SPECTAG_LEN-1:0]  tagregfix,
		     output wire [`SPECTAG_LEN-1:0] sptag1,
		     output wire [`SPECTAG_LEN-1:0] sptag2,
		     output wire 		    speculative1,
		     output wire 		    speculative2,
		     output wire 		    attachable,
		     output reg [`SPECTAG_LEN-1:0]  tagreg
		     );

//   reg [`SPECTAG_LEN-1:0] 		       tagreg;
   reg [`BRDEPTH_LEN-1:0] 		       brdepth;
   
   assign sptag1 = (branchvalid1) ? 
		   {tagreg[`SPECTAG_LEN-2:0], tagreg[`SPECTAG_LEN-1]}
		   : tagreg;
```
inst1が有効な分岐命令であることを示すbranchvalid1がtrueのとき、5bitの分岐投機タグtagregを左へ1ビットローテートし、sptag1とする。

```verilog
   assign sptag2 = (branchvalid2) ? 
		   {sptag1[`SPECTAG_LEN-2:0], sptag1[`SPECTAG_LEN-1]}
		   : sptag1;
```
inst2が有効な分岐命令であることを示すbranchvalid2がtrueのとき、5bitの分岐投機タグsptag1を左へ1ビットローテートし、sptag2とする。

```verilog
   assign speculative1 = (brdepth != 0) ? 1'b1 : 1'b0;
```
brdepth(投機分岐の深さ)が0で無い場合は、inst1が投機命令であることを示すspeculative1をtrueとする。

```verilog
   assign speculative2 = ((brdepth != 0) || branchvalid1) ? 1'b1 : 1'b0;
```
brdepth(投機分岐の深さ)が0で無いかまたはinst1が有効な分岐命令の場合は、inst2が投機命令であることを示すspeculative1をtrueとする。

```verilog
   assign attachable = (brdepth + branchvalid1 + branchvalid2) 
     > (`BRANCH_ENT_NUM + prsuccess) ? 1'b0 : 1'b1;
```
brdepth(投機分岐の深さ)と命令1及び命令2が分岐命令の場合の数を加えた数が、エントリ数を超えている場合は、
タグの割り当て可能を示す信号attachableをfalseとする。

```verilog
   always @ (posedge clk) begin
      if (reset) begin
	 tagreg <= `SPECTAG_LEN'b1;
	 brdepth <= `BRDEPTH_LEN'b0;
      end else begin
	 tagreg <= prmiss ? tagregfix :
		   ~enable ? tagreg : 
		   sptag2;
	 brdepth <= prmiss ? `BRDEPTH_LEN'b0 :
		    ~enable ? brdepth - prsuccess :
		    brdepth + branchvalid1 + branchvalid2 - prsuccess;
      end
   end
   
endmodule // tag_generator
`default_nettype wire
```
クロック毎にtagregとbrdepthを更新する。更新のしかたは、tagregは、予測ミスの場合はtagregの修復値をロードし、そうでない場合は、イネーブルでない場合はtagregを、イネーブルの場合はsptag2をロードする。
分岐深さは、予測ミスの場合はゼロをロードし、そうでない場合は、イネーブルでない場合は分岐深さを
イネーブルの場合は分岐深さにbranchvalid1及びbranchvalid2を加えたものをロードする。
M5Stack MicroPython API調査記録　スレッド編

※ 2018年1月8日現在

M5Stack版MicroPythonの ```_thread``` モジュールは本家ESP32版から大きく書き換えられています。MicroPythonの下で動いているFreeRTOSのマルチタスク機能をより活かすように実装されています。そのため、APIにも大きな違いがあり、共通しているのは ```_thread.start_new_thread()``` と ```_thread.stack_size()``` ぐらいです。

# モジュール ```_thread```

Python 関数はスレッド上で動かすことができる。これはメインのMicroPythonスレッドとは独立したESP32タスクとして関数が実行されることを意味している。

またスレッド間では通知やメッセージの送受信が行える。

## 関数

### ```_thread.start_new_thread(th_name, th_func, args[, kwargs])```

新しいスレッドを開始し、スレッドIDを返す。

*th_name* - スレッド名

*th_func* - スレッドで動かす関数

*args* - 関数の位置引数のタプル

*kwargs* - 関数のキーワード引数の辞書


### ```_thread.stack_size([size])```

新規にスレッドを作成する際のスレッドのスタックサイズをバイト数で返す。オプションの *size+ は以降で作成するスレッドのスタックサイズを指定する。

スレッドで使っている最大スタックサイズは ```_thread.list()``` でチェックできる。

### ```_thread.allowsuspend(allow)```

*allow* に ```True``` にすると、スレッドを休止状態にできるようになる。この関数で設定しない限り、スレッドを休止状態にすることは許されない。この関数は該当のスレッド関数内から呼ばなければならない。

### ```_thread.suspend(th_id)```

スレッド関数の実行を休止状態にする。

### ```_thread.resume(th_id)```

```_thread.suspend()``` で休止状態にしたスレッド関数を実行可能状態にする。

### ```_thread.kill(th_id)```

スレッドを停止し、スレッドが確保されていたメモリを開放する。

### ```_thread.getThreadName(th_id)```

*th_id* に該当するスレッドの名前を返す。

### ```_thread.getSelfName()```

スレッドで実行中の関数の名前を返す。

### ```_thread.getReplID()```

メイン(REPL)スレッドのスレッドUDを返す。メインスレッドに通知/メッセージを送るのに使える。

### ```_thread.getnotification()```

スレッドで実行中の関数に通知が送られてきているかチェックする。溜まっている通知があれば 1 以上の整数、無ければ 0 を返す。

### ```_thread.getmsg()```

スレッドで実行中の関数にメッセージが送られてきているかチェックする。溜まっているメッセージがあれば３要素、メッセージタイプ、送り元のスレッドID、メッセージ(整数か文字列)自体を持つタプルを返す。

### ```_thread.notify(th_id, value)```

IDが *th_id* であるスレッドに通知を送る。値 *value* は 1 以上の整数。

### ```_thread.sendmsg(th_id, msg)```

IDが *th_id* であるスレッドにメッセージを送る。値 *mag* は整数または文字列。

### ```_thread.replAcceptMsg([flag])```

メインスレッド(REPL)がメッセージを受け入れられる場合は True を返す。

メインスレッドから呼び出す場合、オプションの *flag* (True|False) はメインスレッドでメッセージの受付を許可/禁止するかを指定する。

### ```_thread.list([print])```

作成済のスレッドすべての状態を表示する。

オプションの *print* が ```False``` であれば、スレッドの情報をタプルで返す。スレッド情報のタプルは要素として、スレッドID、タイプ、名前、休止状態か、スタックサイズ、最大スタックサイズを持つ。
ウイルスバスター for Home Network

縁あって、ウイルスバスター for Home Networkをいただきました。
レビューを兼ねてセットアップ〜使用感を備忘録がてらあげます。

# セットアップ

## 見た目

![IMG_0038.jpg](https://qiita-image-store.s3.amazonaws.com/0/193001/b82d276c-28c7-2501-b0f1-b3906c469698.jpeg)

イメージよりもちょっと大きい感じ。

## 配置

電源とランケーブルを繋ぐだけ。楽チン。

## アプリ設定

取説のとおりにスマホでアプリをダウンロードしてペアリングコードを入力。
ペアリングコードを手入力しないといけないのが少し面倒に感じた。
せっかくのスマホなのでQRコードとか写真とってとかにしてくれると楽なんだけど。
セキュリティ的にダメなのか？？

そうこうしているうちにネットワーク上の機器を自動で認識してくれる。

## うちのネットワーク機器

- iPhone × 3
- iPad × 1
- Android × 1
- Mac × 2
- Windows × 1
- NAS × 1
- スマートウォッチ × 1
- スマートリモコン × 1
- スマートスピーカー × 2
- デジタルメディアレシーバー × 2
- プリンター × 1
- イーサネットコンバーター × 2

思ったよりも色々とあった。。

# 特徴

- 端末の使用状況監視
 + スマートスピーカーとかスマートリモコンの通信状況をパソコンでキャプチャしなくてもいいのはいい感じ
- 自宅内LANへの攻撃抑止
 + スマートスピーカーとリモコンのセキュリティって具体的にどうなってんの？？なのでなんだか安心感がある
- 悪意あるサイトへの接続防止
 + 家族全員がITリテラシー高いわけではないので防止する仕組みがあるのはなんとなく安心
- 電源つないでルーターに刺すだけでOK
 + セットアップ楽々

# スピードテスト
正直違いはわからないレベル。

## 設置前
![IMG_0040.jpg](https://qiita-image-store.s3.amazonaws.com/0/193001/6b901bba-7c46-9c16-5a81-3300e696ae7f.jpeg)

## 設置後
![IMG_0041.jpg](https://qiita-image-store.s3.amazonaws.com/0/193001/f1fbae4d-463b-48bc-4e17-e83bf889da3d.jpeg)

# 使用感
今は *ネットワークの保護* と *危険なWebサイトへのアクセスから保護* を設定して利用。
テスト（？）的にTrendが用意した検体へのアクセスのブロック確認がアプリからできる。

## 定期セキュリティチェック
![E0189F7C-E89D-4115-87EA-6D8CFAE94958.jpg](https://qiita-image-store.s3.amazonaws.com/0/193001/717b53f4-69ba-790b-e180-0ee5ab13f10b.jpeg)

定期的に脆弱性をチェックしてくれる。
問題がある場合はこんな感じで *ご確認ください* って教えてくる。
設定を初期化した際に、パスワードが初期値に戻ってしまっていた。。
早速変更。
色々と機器が紐づいているとこういった細かな漏れが出てしまうので教えてもらえるのはありがたい。

# 注意点
## 既存のアンチウィルスソフトの置き換え商品ではない
USBメモリ等のメディアに潜むウィルスに対しては効力を発揮できない。
あくまでもネットワークを介するものに効果を発揮する。
感染した後の通知はブロックしてくれるかもしれないが感染そのものを予防してくれるわけではない。

## 管理画面がスマホアプリのみ
スマホがないと設定できない。

# まとめ
ざっくり触って見た感じだと、スマートスピーカーやスマートリモコン、デジタルメディアレシーバーなどへの保険として考えれば、月500円ほどの出費で済むなら悪くはない。

うちはまだ子供が小さいですがやがてスマートフォンなどを持ち出した時に色々と制限、管理ができるのは魅力的。
ただ、モバイルデータ通信に切り替えたら何もできなくなるので根本的な対策にはならないので、
制限はかけずに様子見ながら対応するかもです。

オンラインゲームはしないので遅延に関しては深く考えていませんが、パフォーマンスはどうしても下がってしまう。

# 気になったこと
Fire TV Stickと義理の父にセットアップを依頼されたWindowsノートパソコンがデバイス一覧に出てこない。
Windowsノートパソコンはうちで利用するわけではないが、Fire TV Stickはちょっときになる。
おいおい調べてみる。

# 2週間ほど利用してみて
ブロック履歴があった。家族の端末を守ってくれた模様。

<img width="621" alt="Image.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193001/ff983497-2603-221b-1fe3-1ff0d18f9a4c.jpeg">
<img width="621" alt="Image2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/193001/d7a3b787-1265-b06f-43ba-598c4c66d70d.jpeg">

# 2018/01/15 追記
2018/01/15にFire TV StickがiPhoneとしてだけど認識された。
30分くらい後にパターンファイルが更新されたようだけど関係があるのか不明。

# 2018/01/16 追記
iOSのアプリがバージョンアップ。
インターネット時間制限が曜日や一日の利用時可能時間で制限できるなど細かな制限ができるようになった。
Vueコンポーネントの強く推奨される名付け方

Vueの公式ドキュメントが強く推奨するVueコンポーネントのファイル名の命名規則。

## 単一ファイルコンポーネント

* [単一ファイルコンポーネント](https://jp.vuejs.org/v2/guide/single-file-components.html)のファイル名はPascalCaseかkebab-case。
* :x: `mycomponent.vue`、`myComponent.vue`
* :o: `MyComponent.vue`、`my-component.vue`

## ベースコンポーネント

* 頻繁に使われるベースコンポーネント(ステートを持たないDumpコンポーネントやPureコンポーネントと呼ばれるもの)は、`Base`、`App`または`V`で始めないとならない。
* :x: `MyComponent.vue` `VueTable.vue` `Icon.vue`
* :o: `BaseButton.vue` `AppTable.vue` `VIcon.vue`

## シングルインスタンスコンポーネント

* シングルインスタンスコンポーネント(1ページにつき1個しか使われないコンポーネント)は、Theを付ける。
* :x: `Heading.vue` `SideBar.vue`
* :o: `TheHeading.vue` `TheSideBar.vue`

## 強い結合関係にあるコンポーネント

* 親子関係にあるようなコンポーネント群は、親コンポーネントの名前を子コンポーネントの接頭辞にする。
* エディタでファイル一覧を出した時、関連性のあるコンポーネントがまとまるようにするため。

:x:

```
TodoList.vue
TodoItem.vue
TodoButton.vue
SearchSidebar.vue
NavigationForSearchSidebar.vue
```

:o:

```
TodoList.vue
TodoListItem.vue
TodoListItemButton.vue
SearchSidebar.vue
SearchSidebarNavigation.vue
```

## 出典

* [Vue.js](https://vuejs.org/v2/style-guide/#Single-file-component-filename-casing-strongly-recommended)
Google Cloud Platformのプロジェクトの削除方法


プロジェクトの削除方法が少し見つかりにくかったのでGCPのプロジェクトの削除方法をメモしておきます。

削除したいプロジェクトのダッシュボードから、「プロジェクト設定に移動」をクリックします。

![gcp1.png](https://qiita-image-store.s3.amazonaws.com/0/18273/2ee97fc4-ac92-4450-4b1a-b6586e09e3f7.png "gcp1.png")

シャットダウンをクリックします。

![gcp2.png](https://qiita-image-store.s3.amazonaws.com/0/18273/06a1bc68-cb48-353b-d127-dfafaee45acd.png "gcp2.png")

確認のため削除したいプロジェクトのプロジェクトIDを入力し、シャットダウンをクリックします。
![gcp3.png](https://qiita-image-store.s3.amazonaws.com/0/18273/5de2e132-f607-8b4f-d7a7-edb3881153a7.png "gcp3.png")
MMD4Mecanimで表情モーフが上手く行かなかった件

ボーンのアニメはするけど、どうしても表情が変わってくれなくて数日泣いてました。

.vmdファイルの名前を「H.2 motion.vmd」とかにしてて変換後のファイルに「.」の文字が入っているのがまずかったようです。
読み込めない系はファイル名をシンプルにするのが基本ですね:sweat_smile:

```:良い例
motion.vmd
```

以上。
Catch2 IAR EWARM でビルドする方法

# これは何?

[Catch](https://github.com/catchorg/Catch2) を IAR [Embedded Workbench](https://www.iar.com/jp/iar-embedded-workbench/) でビルドする方法です。

# 結論

コンパイルはできます。
私が使用した無償評価版は 32KiB制限があり、リンクできませんでした。

# 実験環境

* IAR EWARM 8.20.2 無償評価版
* Windows 10 64bit版

# 必要な設定

## プロジェクトの設定

* `一般オプション` > `ライブラリ設定` > `ライブラリ` > `フル` を選択。
  ノーマルだと、ビルドエラーになります。Catch が fstream を使用するので、必須。
* `C/C++コンパイラ` > `言語1` > `C++オプション` > `例外を有効にする` にチェック。
  Catch が noexcept 修飾を使用しています。この解釈に必要です。
  `CATCH_CONFIG_FAST_COMPILE` を指定して例外を無効にしても、このキーワードを解釈するために必要になります。
  
## コンパイルスイッチ(toggle)
次の二つが必要

```c++:main.c
#define CATCH_CONFIG_COLOUR_NONE
#define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
```

# コードサイズ

下記コードをビルドして、 120キロオーバーです。

```c++:main.c
#define CATCH_CONFIG_RUNNER
#define CATCH_CONFIG_COLOUR_NONE
#define CATCH_CONFIG_NO_POSIX_SIGNALS
#include "catch.hpp"

unsigned int Factorial( unsigned int number ) {
    return number <= 1 ? number : Factorial(number-1)*number;
}

TEST_CASE( "Factorials are computed", "[factorial]" ) {
    REQUIRE( Factorial(1) == 1 );
    REQUIRE( Factorial(2) == 2 );
    REQUIRE( Factorial(3) == 6 );
    REQUIRE( Factorial(10) == 3628800 );
}

int main( int argc, char* argv[] ) {
    int result = Catch::Session().run(0,NULL);
    return result;
}
```

ビルドメッセージは下記

    エラー[Og008]: Code size limit exceeded. 122 988 code bytes is more than the limit of 32 768 bytes. 

コードサイズが変わらないかと思い、下記のコンパイルスイッチも追加したが変化なし。考えてみたら、未使用の機能はテンプレートが実体化されず、コードサイズに影響ないのは当然でした。

```c++:main.c
#define CATCH_CONFIG_NOSTDOUT
#define CATCH_CONFIG_FAST_COMPILE
#define CATCH_CONFIG_DISABLE_MATCHERS
```

# 参考情報

[List of platforms/compilers known to work?](https://github.com/catchorg/Catch2/issues/103) に試した人のコメントがあります。

ここを見ると、ヒープ、スタックサイズの調整と、tiemer 関数の実装が必要です。
ここは、ターゲットマイコン毎に変わるところなので、さもありなん。

# 感想

Cortex-M 系マイコンで使用できそうな予感。
std::cout から UART に差し替えて見て、どんな感じか試したいけど、どうするかなぁ。
docker-machine 関連コマンド備忘録

# 概要
dockerを扱う際に役立ちそうなコマンドを備忘録として残します。もしお役に立ちそうなものがあれば、参考にしていただければと思います。

# docker-machine コマンド＋諸々
１．Dockerホスト一覧表示
 
```
docker-machine ls
```

２．Dockerホスト停止

```
docker-machine stop [ホスト名]
```

３．Docekrホスト強制停止

```
docker-machine kill [ホスト名]
```

４．Dockerホスト起動

```
docker-machine start [ホスト名]
```

５．Dockerホスト再起動

```
docker-machine restart [ホスト名]
```

６．Dockerホストの切り替え

```
docker-machine active [ホスト名]
```

７．Dockerホストを作成

```
docker-machine create --driver virtualbox [ホスト名]
```

８．Dockerホストを削除

```
docker-machine rm [ホスト名]
```

９．Dockerクライアント用の設定を表示

```
docker-machine config [ホスト名]
docker $(docker-machine config [ホスト名]) ps
```

１０．Docker関連の環境変数を確認

```
env | grep DOCKER
```

１１．envコマンドを実行してexport文を表示

```
docker-machine env [ホスト名]
```

１２．サブシェルでenvコマンドを実行
　　　Dockerクライアントが任意のホストへ向くよう環境変数をセットして、
　　　任意のホストに対してdockerコマンドを実行する

```
$(docker-machine env [ホスト名])
env | grep DOCKER
docker ps
```

１３．セットしたDOCKER関連の環境変数をunset

```
$(docker-machine env -u)
```

１４．Dockerホストのマシン情報を表示

```
docker-machine inspect [ホスト名]
```

１５．DockerホストのIPアドレスを表示

```
docker-machine ip [ホスト名]
```

１６．DockerホストへSSH接続

```
docker-machine ssh [ホスト名]
```

１７．SSH接続でコマンドを実行

```
docker-machine ssh [ホスト名] "[コマンド]"
docker-machine ssh [ホスト名] -- [オプション付きコマンド]
ex)docker-machine ssh [ホスト名] -- df -h
```

以上です。
apfsインストール用のprebootボリュームを作成できませんでした

High Sierraを再インストールしようとしたら完了間近で
「apfsインストール用のprebootボリュームを作成できませんでした」
と言われた。

調べていくと、同じ問題が起きている人がいる。
https://discussionsjapan.apple.com/thread/110192298

SMC、PRAMのリセットはやってみたが、解決できず。
インターネット復元でエラー -3403F が出てしまい手詰まりに。

ジーニアスバーで、不要なSSDのボリュームが複数存在していることが判明した。
なぜかHigh Sierraのディスクユーティリティに現れず、Appleのシステムに繋いだら出てきた。
それを消してもらって、再インストールに成功した。
pythonで作ったパワーポイントで自己紹介してみた

これまでの仕事で、手動でレポートを書くことが多かったのですが、最近pythonでパワーポイントを作成できることを知ったので、勉強がてら自己紹介PPTXを作成します。

pythonでパワーポイントを作成できると、毎週・毎月報告するようなKPIレポートなどを自動で作成することが可能です。今回は`python-pptx`というライブラリを利用します。

* python-pptx
    * http://python-pptx.readthedocs.io/en/latest/
    * v0.6.7

* 実行環境
    * google cloud上でssh
    * Python 2.7.6

pip install でvirtualenv内にライブラリを入れました。

```
pip install python-pptx
```

なお、自己紹介は未完成なので更新していきますのであしからず。

注意しているのは以下のような点です。

1. ページレイアウトの替え方
1. 箇条書きの作り方
2. 太字の仕方
3. フォントサイズの替え方

今後実装したいのは以下の点。お待ちください。

* 画像挿入
* 表挿入
* 自動でKPIの数値を挿入
* スライドマスタを変更する


```python
from pptx import Presentation
from datetime import datetime
from pptx.util import Pt

today = datetime.today().strftime("%Y%m%d")

prs = Presentation()

# P1: title page
title_slide_layout = prs.slide_layouts[0]  # page layout
slide = prs.slides.add_slide(title_slide_layout)
title = slide.shapes.title
subtitle = slide.placeholders[1]

title.text = "Introduce Myself"
subtitle.text = "@ishio"

# P2
bullet_slide_layout = prs.slide_layouts[1]  # page layout
slide = prs.slides.add_slide(bullet_slide_layout)
shapes = slide.shapes

title_shape = shapes.title
body_shape = shapes.placeholders[1]

title_shape.text = 'Introduce My Hobby'
title_shape.text_frame.paragraphs[0].font.size = Pt(32)  # font size
title_shape.text_frame.paragraphs[0].font.bold = True  # font bold

tf = body_shape.text_frame
tf.text = 'Reading books'
tf.paragraphs[0].font.size = Pt(28)  # font size
tf.paragraphs[0].font.bold = True  # font bold

p = tf.add_paragraph()
p.text = 'Read 57 books in 2017'
p.level = 1  # down the bullet level
p.font.size = Pt(24)  # font size

p = tf.add_paragraph()
p.text = 'Try to read 70 books in 2018'
p.level = 1  # down the bullet level
p.font.size = Pt(24)  # font size

# This is a space between bullets
p = tf.add_paragraph()
p.font.size = Pt(28)  # font size

p = tf.add_paragraph()
p.text = 'Watching and playing football'
tf.paragraphs[4].font.size = Pt(28)  # font size
tf.paragraphs[4].font.bold = True  # font bold

# This is a space between bullets
p = tf.add_paragraph()
p.text = 'Love Urawa Reds'
p.level = 1
p.font.size = Pt(24)  # font size

p = tf.add_paragraph()
p.text = 'Play futsal every weekend to keep myself healthy'
p.level = 1
p.font.size = Pt(24)  # font size

prs.save('test_%s.pptx' % today)
```

作成されたPPTは以下のような感じです。

P1
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/408f43f8-a8e2-8093-edbe-fd2e6569b26d.png)

P2
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/87e3b63c-7971-b803-66d3-664d98cf0614.png)


2018年、よろしくお願いします。

@Ishio
リモートリポジトリに無理矢理プッシュする方法

#事象
Gitでcommitしたりresetしたり、いろいろしてから`git push heroku`したらエラー発生。


```
To https://git.heroku.com/***.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://git.heroku.com/***.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

違うんだ、ごちゃごちゃ操作してしまっただけで、僕のカレントブランチは決してビハインドじゃない。

#解決策
`git push heroku --force`（`git push heroku -f`でも可）で強制的にプッシュ。
これで一件落着。

#注意
と思ったけど、調べてみると、`--force`するのはあまりよくないらしい。

- [git push -f をやめて --force-with-lease を使おう](https://qiita.com/wMETAw/items/5f47dcc7cf57af8e449f)

今回は[Railsチュートリアル](https://railstutorial.jp/)をやっていただけなので問題ないけど、複数人で開発する際は、`--force-with-lease`を使った方がいいらしい。
ただし、注意も必要。

- [git push `--force-with-lease`はいつも安全？](https://qiita.com/upinetree/items/5d0b224b8e53ad276ea0)

#結論
- 怒られたら理由を考える。
- よくわかっていないコマンド（オプション）を使わない。
MySQL と H2 の両方で動作するデータ定義言語 (DDL) のパターン集

Spring Boot のプロジェクトでマイグレーションツールとして Flyway を利用している。RDB として MySQL を利用しているのだけど、自動テストでは H2 を利用しているので、マイグレーションファイルのデータ定義言語 (DDL) は MySQL でも H2 でも動作するような SQL で記述する必要がある。意外と両方で動作するように書くのは手間だったので発見したパターンをメモっとく。

# テーブル

## テーブル追加

```sql
CREATE TABLE book (
  id    INTEGER      NOT NULL AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
);
```

## テーブル名称変更

```sql
ALTER TABLE company
  RENAME TO publisher;
```

## テーブル削除

```sql
DROP TABLE book;
```

# カラム

## カラム追加

```sql
ALTER TABLE book
  ADD COLUMN isbn VARCHAR(255) NOT NULL DEFAULT '';
```

## カラム名称変更

```sql
ALTER TABLE author
  CHANGE family_name last_name VARCHAR(255) NOT NULL;
```

## カラム定義変更

```sql
ALTER TABLE author
  MODIFY last_name VARCHAR(31) NOT NULL;
```

## カラム削除

```sql
ALTER TABLE book
  DROP COLUMN isbn;
```

# インデックス

## インデックス追加

```sql
CREATE INDEX IX__author__first_name__last_name
  ON author (first_name, last_name);
```

## インデックス削除

```sql
ALTER TABLE author
  DROP INDEX IX__author__first_name__last_name;
```

# 一意性制約

## 一意性制約追加（テーブル作成時）

```sql
CREATE TABLE book (
  id    INTEGER      NOT NULL AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  isbn  VARCHAR(255) NOT NULL,
  PRIMARY KEY (id),
  CONSTRAINT UQ__book__isbn UNIQUE (isbn)
);
```

## 一意性制約追加

```sql
ALTER TABLE book
  ADD CONSTRAINT UQ__book__isbn UNIQUE (isbn);
```

## 一意性制約削除

```sql
ALTER TABLE book
  DROP INDEX UQ__book__isbn;
```

※ H2 データベースのバージョン 1.4.196 以前はサポートしていない。バージョン 1.4.197 以降でサポートされそう。

https://github.com/h2database/h2database/issues/570

# 外部キー制約

## 外部キー制約追加（テーブル作成時）

```sql
CREATE TABLE book (
  id           INTEGER      NOT NULL AUTO_INCREMENT,
  title        VARCHAR(255) NOT NULL,
  publisher_id INTEGER      NOT NULL,
  PRIMARY KEY (id),
  CONSTRAINT FK__book__publisher_id FOREIGN KEY (publisher_id) REFERENCES publisher (id)
);
```

## 外部キー制約追加

```sql
ALTER TABLE book
  ADD CONSTRAINT FK__book__publisher_id FOREIGN KEY (publisher_id) REFERENCES publisher (id);
```

## 外部キー制約削除

```sql
ALTER TABLE book
  DROP FOREIGN KEY FK__book__publisher_id;
```