OmniAICreator/Qiita-1.07M huggingface dataset:
Item 86: Implement Serializable with great caution

# 86.Serializableを実装するときは十分に気をつけよ
## Serializableにするにあたってのコスト
Serializeにするのは秒でできるが、長期的には大きなコストとなるかもしれない。

### Serializableを実装すると、一度リリースした実装クラスを変更する柔軟性が失われる
クラスがSerializableを実装するということは、バイトストリームエンコーディングされたもの（以降、serialized form）は公開されたAPIの一部となる。
一度クラスを公開したとなれば、永久にそれをサポートすることが求められる。
また、カスタムしていないデフォルトのserialized formでは、privateなフィールドも公開APIの一部となるので、アクセスできるフィールドを最小限にする（Item15）設計が無意味になってしまう。

デフォルトのselialized formを受け入れ、後でクラスの内部表現を変えたとすると、互換性のない変化が起こってしまう。
クライアントが古いバージョンのクラスを使ってインスタンスをシリアライズし、新しいバージョンのクラスでデシリアライズした場合には問題が起きてしまう。
変換を行うことは可能であるが、困難であり、コードが汚くなってしまう。
Serializableを実装するときは長く使うことを考えて、高品質なものを設計するように心掛ける必要がある（Item87,90）。

Serializableの実装において課される制限の一例として、serial version UIDというものが関わってくる。
全てのSerializableなクラスは、serial version UIDという自身を証明するための番号をもっている。（**復元前後でクラスのバージョンが異なっていないかを識別する為のものらしい。**）（http://www.ne.jp/asahi/hishidama/home/tech/java/serial.html）
static final longなフィールドとしてこいつを定義しなかった場合、実行時に自動的に割り振られる。
この値はクラス名、メンバー等に影響を受け、何か変えると、この値も変わってしまう。
UIDを定義せず、互換性も壊れてしまった場合、InvalidClassExceptionが実行時に発生してしまう。

### Serializableを実装すると、バグ、セキュリティホールの可能性が増大する
デシリアライズは「みえないコンストラクタ」のようなものである。みえないがゆえに、コンストラクタによって確立された不変条件（invariant）を保証し、攻撃者に構築中のオブジェクトにアクセスさせないようにする必要があることを忘れがちである。
デフォルトのデシリアライゼーションメカニズムに頼っていると、容易にinvariantを破壊されたり、不正アクセスされたりすることになる。

### Serializableを実装すると、新しいバージョンのクラスをリリースする際にかかる手間が増える
Serializableを実装したクラスが改定されると、新しいバージョンのインスタンスがシリアライズ可能で、古いほうのバージョンでデシリアライズ可能か、また、その逆も調べなければならない。
そのため、バージョン数とシリアライズ実装クラスの積に比例する形でテストケースが増える。
テストの必要量は、Serializable実装クラスの初版が注意深く設計されて入れば減らすことができる（Item87,90）。

## Serializableの実装は気軽に決めてよいものではない
オブジェクトの移送や永続化にJavaのシリアライゼーションを使用しているフレームワークにクラスを組み込むためには、Serializableを実装することは不可欠である。
また、Serializableの実装によって、他のクラスからコンポーネントとして扱うことは容易となる。
しかし、前述の通り、Serializableの実装にはさまざまなコストがある。
クラスを設計する際には、それらを天秤にかける必要がある。

歴史的には、BigInteger,Instantクラスなどの値クラスはSerializableを実装するが、thread poolなどのアクティブなエンティティを表すクラスでは滅多に実装されない。

## 継承用に設計されたクラス、インターフェースは基本、Serializableを実装、継承すべきでない
このルールを破るとそのクラスのサブクラスとなるクラスに、多大な重荷を負わせることになる。
本ルールの例外として、関わるもの全てにSerializable実装を求めるフレームワークに存在するクラス、インターフェースはSerializableを実装することは理解できる。
ThrowableやComponentはSerializableを実装している。
ThrowableがSerializableを実装しているため、RMIはサーバーからクライアントに例外を飛ばすことができる。
ComponentがSerializableを実装しているため、GUIの要素は移送されたり、保存されたりする。SwingとAWTの全盛期でもこの機能はあまり使われていなかったが。

## Serializableで拡張可能でフィールドを持つクラスを実装する場合には気を付ける
インスタンスフィールドに何らかのinvariantがある場合には、サブクラスにはfinalizeメソッドをoverrideさせないようにせねばならない。
そうしないとfinalizer attackの危険（Item8）がある。

また、クラスのinvariantが、インスタンスフィールドの初期化によって壊れてしまうような場合には、readObjectNoDataメソッドを加える必要がある。

```java
private void readObjectNoData()
     throws ObjectStreamException;
```
（**この辺謎**）

## Serializableにしないとなったときの注意
継承用のクラスでSerializableにしないと選択したときに、シリアライザブルなサブクラスを書くのはより手間がかかる。
そのようなクラスの通常のデシリアライズでは、スーパークラスにアクセス可能な引数なしのコンストラクタが必要となる。
それが用意できない場合は、Serialization Proxy Pattern（Item90）を用いる。

## インナークラスはSerializableを実装すべきでない
インナークラスは合成フィールドを使用する。
合成フィールドは、コンパイラーが生成するもので、エンクロージングインスタンスへの参照と、エンクロージングスコープからのローカル変数への参照を保持する。

合成フィールドに対するシリアライズの形式は不定なので、インナークラスでのSerializable実装は避けるべき。
ただし、staticなメンバークラスはSerializable実装可。
ポインタ型に付ける const は型名の後ろに付くと考えると憶えやすい

const 付きのポインタ型（C++ の参照 ```&``` も同様） ```const T *``` と ```T * const``` （T は任意の型名）はどう違うのか？ というのをよく忘れて検索する羽目になっていましたが、型名の後ろに付くと考えることで忘れなくなりました。

どういうことかというと、まず C/C++ の言語規格で ```const T *``` は ```T const *``` と同じです。多くの人は（理由はよくわかりませんが） ```const T *``` のほうが主で ```T const *``` はおまけの書き方だと考えがちですが、実は後者のほうが規則的です。
説明のためにconstがかかる範囲をカッコで括ると、```T const *``` は ```(T) const *``` となり、「Tの値はconstだがポインタはconstではない」という意味になります。同様に ```T * const``` は ```(T *) const``` となり、「Tの値は const ではないがポインタは const である」という意味、```T const * const``` ならば ```((T) const *) const``` で「Tの値は const でありポインタも const である」という意味になります。

表にまとめてみました。こうして比較すると、```const T *``` のように const を前につけるほうが例外的であることがわかります。

|型|意味|
|:---|:---|
|T|Tの値は const ではない|
|T const|Tの値が const である|
|const T|Tの値が const である|
|T const *|Tの値は const だがポインタは const ではない|
|const T *|Tの値は const だがポインタは const ではない|
|T * const|Tの値は const ではないがポインタは const である|
|const (T *)|こういう文法は存在しない|
|T const * const|Tの値は const でありポインタも const である|
|const T * const|Tの値は const でありポインタも const である|
|const (const T *)|こういう文法は存在しない|

# 変数名も含めた別の説明
変数名も含めると、```const``` は型名と変数名の間に入ると言ったほうがわかりやすいかもしれません。
```T const *x;``` は ```*x``` （値）が const であり、 ```T * const x;``` は ```x``` （ポインタ）が const である、となります。
あまりわかりやすくならなかった図↓

![constとポインタ.png](https://qiita-image-store.s3.amazonaws.com/0/235904/9baaeb28-dca2-908d-4ac1-64ea2ee5f67b.png)
processing(android mode)で日本語入力(widgetのEditText使用)

二日かかった割に単純なコード…
Fragment勉強した時間返してくれ

```

import android.view.*;
import android.widget.*;
import android.support.v4.app.*;
void setup() {
  runOnUiThread(new Runnable() {
    public void run() {
      FrameLayout fl=new FrameLayout(getContext());
      EditText et=new EditText(getContext());
      et.setBackgroundColor(color(255));
      FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(500, 200);
      lp.topMargin = height/2;
      lp.leftMargin = width/2;
      View surfaceView=getSurface().getSurfaceView();
      ViewGroup parent=(ViewGroup)surfaceView.getParent();
      parent.removeView(surfaceView);
      parent.addView(fl);
      fl.addView(surfaceView);
      fl.addView(et,lp);
    }
  }
  );
}
void draw(){
  background(255,0,0);
}

```

![Screenshot_2018-09-20-22-54-07.png](https://qiita-image-store.s3.amazonaws.com/0/68551/0284ca4f-d126-660c-6456-b198898bdc30.png)
javaモードならこちら

[processing3でAWT/swingを使う。](https://qiita.com/hotman78/items/7691d2cd7c8ee455c8c4)
Window 10画面を部分キャプチャーする

#知らなった・・・

Windows10環境限定だと思います
バージョン　1903現在も現役


[Win] + [Shift] + [S] を同時押ししてください


画面が白色に雲がかります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/46608/13d2c5f3-d9c8-519f-ced0-8c77ec59582a.png)

**からの・・・**

十字アイコンが現れるので　ドラッグ！　＆　ドロップ！！



画面キャプチャ成功！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/46608/df30aafa-6e75-69b9-5ad0-7e8c13d717d4.png)


資料作りはかどるわー
Microsoft Flowで1日前の日付を得る式


何かのAPIで前日のデータを取りたいときとかに、実行日の1日前の日付がほしくなります。そういう時に使います。

```
formatDateTime(addDays(utcNow(), -1), 'yyyy-MM-dd')
```

formatDateTimeのフォーマットについては、`mm`ではなく、`MM`です。`mm`だと**分**が入ってしまいます。日付フォーマット統一してほしい。

蛇足ですが、`utcNow()`だとUTC時間で返すので、JSTで考えて深夜1時に実行しよう、ってやると問題があるかもしれない。日中帯の時は動いたのに！みたいな。

そんな時は、`convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time')`とするとUTCからJSTになる。

合わせるとこう。

```
formatDateTime(addDays(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'), -1), 'yyyy-MM-dd')
```

辛いな？

あと、convertTimeZoneで使うタイムゾーンについては、補完でツールチップが出てURLは出るが、ハイパーリンクが張られてない上にコピペしようとするとツールチップが隠れてコピペ出来ない。
「ドキュメント見るのも面倒やし、`UTC`やし`JST`でいけるやろー」ってやると動かなくて死ぬ。ちゃんと読みましょう。

https://docs.microsoft.com/en-us/previous-versions/windows/embedded/gg154758(v=winembedded.80)

辛い。
第2回バカゲージャム に参加しましたー！(成果)

#はじめに
こんばんは！
ジャムに参加したので作ったものを、未熟は承知の上で出します。
今回もQiitaでの投稿なので、ちゃんと開発技術に関係することも書きたいと思います。

目次
・[バカゲージャムってなぁーに？](#jam)
・[プランニングシート](#planningSheet)
・[完成したゲームの動画](#movie)
・[使用アセット](#asset)
# <a name="jam">バカゲージャムってなぁーに？</a>
沖縄の琉ゲ部(IGDA-琉球大学)が主催しているゲームジャムです。
2日間のうちにチームでゲームを作ります。(大体31時間、更に睡眠&食事時間で減る)

1回目は昨年、台風の中開催されました。一日目はみんなリモートで作業するはめになってました。
くだらない話ですが、猛烈な暴風の中、
バイクが倒されないように、一生懸命押さえている女性がいまして、
これは何か助けになろうと「大丈夫ですか！」って声かけた瞬間、私の眼鏡が20mぐらい飛ばされまして...
逆に「大丈夫ですか！？」って聞き返されました。

こんな想い出も含めて***ジャムって楽しいです。***

無駄話はここらへんで、今回のジャムの成果をアップします。
# <a name="planningSheet">プランニングシート</a>
ジャム中に考えたものです。
10分ぐらいで思いついてから書き上げるまで行ってるので、
温かい目で見てほしいです。
(あ、でもご指摘＆アドバイスは大歓迎ですのでよろしくお願いいたします)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240260/b5e1b3d8-541b-fc09-1a30-074a078aa684.png)
タイトルが下品でごめんなさい。
でもこれ投票者12人中11人から票もらったんです。ありがたいことに

私はプランニングは下手ですが、自分なりに気を付けてることがいくつかあります。(上位ほど)
**1. 遊びの部分を一番に伝わるよう、わかりやすくする
2. 絵を頑張る！
3. 目立たせる何かを仕込む
4. 読んでもらうターゲットを忘れない(今回は男子大学生が多い)**

###### てめーの次のセリフは「え、頑張ってこれ！？」という
# プレゼンテーション
Jamでは最後に、作成したゲームの成果発表があることがほとんどだと思います。
プレゼンの流れは、プランニングシートと違って最後まで見てもらえるので、世界観から入るのが好みです。
(写真でボブ・サップやボディビルダーの写真を使っていたので、アップはしません)
>「どーもチーム○○です～」
>「筋肉鍛えたい、プロテイン欲しい)」
>「もっと鍛えたい。そこのプロテインも俺のもんだ！よこせ」
>「俺最強！弱点なし」
> ここでゲームタイトル「俺のケツが弱い」
> ゲーム説明へ

こういう流れにしないと説得力が出せなかったのが、下手な企画だなって思いました。
ゲームの中では表現しきれておらず、悔しいですが現状の実力です。

# <a name="movie">完成したゲームはこちら</a>
後ろを取り合うゲームなので、硬直状態にならないようにアイテムを集めるルールに変更しました。
また、壁際で背中を隠すことができないように、プレイヤーは前進し続けます。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">バカゲージャムの成果物ですー！<br>今回は昨年に比べてみんな真面目でした。<a href="https://twitter.com/hashtag/%E3%83%90%E3%82%AB%E3%82%B2%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%A0?src=hash&amp;ref_src=twsrc%5Etfw">#バカゲージャム</a> <a href="https://t.co/O0ICxsqfHC">pic.twitter.com/O0ICxsqfHC</a></p>&mdash; ryoma(ナポリ) (@7_znb) <a href="https://twitter.com/7_znb/status/1042749039769337857?ref_src=twsrc%5Etfw">2018年9月20日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
### <a name="asset">使用したアセット</a>
1. [Cinemachine](https://assetstore.unity.com/packages/essentials/cinemachine-79898)
今回のゲームのカメラワーク、一切スクリプトを書かずにできています。
できることが多くて、まだ使いこなせてません。
2. [Simple House Interiors - Cartoon assets](https://assetstore.unity.com/packages/3d/props/interior/simple-house-interiors-cartoon-assets-38027)
3. [Simple People 2 - Cartoon Assets](https://assetstore.unity.com/packages/3d/characters/humanoids/simple-people-2-cartoon-assets-82661)
シンプルな見た目ですが、これが統一感がでて良い味だしてました。
4. [Barbarian - Voice Pack](https://assetstore.unity.com/packages/audio/sound-fx/voices/barbarian-voice-pack-82559) リザルトで使ってます。

# 次回までに
**Cinemachineを上手に使えるようになりたいです！**
また、ゲーム作りは面白いのが正義だと思いますので、
もっと楽しく開発できるように、雰囲気作りに貢献できるよう自分を磨き続けようって改めて思いました。

くすぐったいこと言っちゃったので終わりまーす。
Pythonで競プロに挑む日誌 vol.13 ~余剰は便利~

数学ガールを読んで, 高校生からやり直したい気分です.

# 現在の目標
* 今年の10月内に茶色を取得する
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の A, B 問題を全部解く**←イマココ**
* 年内に緑色を取得する
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の C, D 問題を全部解く
* [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す

#今日の問題
ABC006B - トリボナッチ数列  
https://beta.atcoder.jp/contests/abc006/tasks/abc006_2

# 結果

```answer1.py
#coding: utf-8
a, b, c = 0, 0, 1
n = int(input())
 
if n == 1:
    val = a
elif n == 2:
    val = b
elif n == 3:
    val = c
else:
    for i in range(4, n+1):
        val = a + b + c
        a = b
        b = c
        c = val
 
print(val % 10007)

# 実行時間：TLE(時間オーバー)
# メモリ　：- KB
# コード長：262 Byte
# 得点　　：0/100
```
実行時間 2sec 以内が実現できませんでした.  いろいろ調べたところ, 10007 で割った **"余り"** がキーワードでした.

```answer2.py
#coding: utf-8
a, b, c = 0, 0, 1

for i in range(int(input()) - 1):
    a, b, c = b, c, (a+b+c)%10007
    #a, b, c = b%10007, c%10007, (a+b+c)%10007 #この方がわかりやすい

print(a)

# 実行時間：278 ms
# メモリ　：2940 KB
# コード長：117 Byte
# 得点　　：100/100
```
「求める答えは余りなので, an を余りで更新していけばよい」, という考え方でした.  

"10007 で割った余りを求める" という行為を考えると, 10007 の整数倍の塊に入れない数を求めることなのですから, 


　　　「もとの数の和から求めた余り」=「余り同士の和から求めた余り」

となるわけですね（ややこしい...）
 
* https://mathtrain.jp/mod
* https://www.slideshare.net/chokudai/abc006
* https://yamakasa3.hatenablog.com/entry/2018/04/11/020718


# 今回学んだこと
* 余りって便利


#明日やること
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) を解き続ける.
[Excel]罫線の優先度を今一度整理する

異なる罫線が被る時、どちらの罫線が優先して表示されるのか軽くまとめる。
列削除や行削除でセルが削除される場合によく見かけるので、なんとなく知っておくと罫線が崩れるストレスをある程度軽減できる。

### どういうこと？
こういうこと。
![罫線問題.png](https://qiita-image-store.s3.amazonaws.com/0/97601/5e0ac550-54fa-87a1-4d2a-f148cb9ad6da.png)


### 全部戦わせてみる
罫線は14種類しかないので「なし」を除いてすべての組み合わせを調べてみた。
![全組み合わせ.png](https://qiita-image-store.s3.amazonaws.com/0/97601/1defe772-0911-b3f7-08fc-a5ea752aa801.png)

### 結果
以下のような優先順位となった。
![優先順位.png](https://qiita-image-store.s3.amazonaws.com/0/97601/51d700b6-e567-0f72-0978-3ce47f60e382.png)

10番の位置がアレだけど右下ほど優先順位が高い。

以上。
今更ラズパイのセットアップしてみた

今更ながらラズパイ買ったので、Windows環境、モニタ無し、USBキーボードなしで頑張ってみた。
ラズパイからのインターネット接続まで書いてます。
# 環境
* PC : Windows 10
* ラズパイ：Raspberry pi zero W, [Raspbian stretch lite](https://www.raspberrypi.org/downloads/raspbian/)

※ SWITCH SCIENCEでスターターキットを購入。スターターキットを購入すれば、何も考えずともOTGケーブルやSDカードなど一通り揃います。

# イメージの準備
### SDカードにOS書き込み
イメージをダウンロードして、[Win32 Disk Imagier](https://sourceforge.net/projects/win32diskimager/)でSDカードに書き込みを行う

### SSH接続のために、SDカード内のファイル編集
SSH接続の有効化のために、WindowsにSDカードを繋いで直接ファイルを編集する
1. 設定ファイルcmdline.txt/config.txtを直接編集する
　　[この記事](https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573)が詳しい。
2. Bootフォルダ直下にsshという名前の空ファイルを作成する。
**注意**
上記ファイル編集時にVSCodeを使ったが、なぜか改行コードの変換等が効いてしまい、ラズパイが正常起動しなかった。WSLをインストールして、vi/emacsで上記ファイルの作成・編集を行うと間違いがない。

# ノートPC側の準備
### Bonjourをインストール
ホスト名でラズパイにアクセスするために[Bonjour]((https://support.apple.com/kb/DL999?locale=ja_JP))をインストール
 ※インストール前にファイアウォールのUDP5353を空けておく。これが手間な人は、iTunesインストールでもいいらしい。
### RPI Driverをインストール
ラズパイとUSB接続を行うために[RPI Driver](http://domotique.caron.ws/wp-content/uploads/telechargement/RPI%20Driver%20OTG.zip)をインストール

# 接続！！！
teratermやgitBashとかで、sshログインする
> ssh pi@raspberrypi.local

でパスワードは、raspberry

# ラズパイのインターネット接続
２つ方法がある。
1. ラズパイが直接WIFI接続
2. PCでネットワーク共有の設定をして、ノートPC経由で接続
ここらへんの設定方法は下記の記事が詳しい
https://qiita.com/msquare33/items/dc6fc9098f50d9b9dbf2
https://memoteki.net/archives/1494

もしラズパイを持ち歩くのなら、圧倒的に２がお勧めです。
外出先で、モニタもUSBキーボードもなく、ネットワーク設定周りでミスると一切接続ができなくなって致命的です。そのため、外部ネットワーク設定に直接依存しないUSB経由での接続が安定的です。

# トラブルシュート
Wifi設定とかを修正していたら、ラズパイに一切接続できなくなってしまった。
現象としては、
> ssh -v pi@raspberrypi.local
Connection reset by 10.0.0.69 port 22

となる。Teratermでは「無効なホスト」も何も表示されず永遠につながらなくなっている。
ラズパイフォーラムの[記事](https://www.raspberrypi.org/forums/viewtopic.php?t=206998)を参考に以下の２つを入力する。
>sudo rm /etc/ssh/ssh_host_*
>sudo dpkg-reconfigure openssh-server

これで解決した。原因はSSH鍵の不整合らしいので、一回鍵を再設定する必要がある。
このエラー解決方法には、USBキーボード・モニタをラズパイに直接繋ぐ必要があるため要注意。

# 参考記事
http://marrone.jp/labo/?p=1586
【Amazon3時間クッキング】材料費500円でAWSにWordPress環境を構築するレシピ ～後片付け～

※この記事は
[【Amazon3時間クッキング】材料費500円でAWSにWordPress環境を構築するレシピ](https://qiita.com/blackriver/items/9ef870b1624373d18dfa)
[【Amazon3時間クッキング】材料費500円でAWSにWordPress環境を構築するレシピ ～part2～](https://qiita.com/blackriver/items/37ff5937d56e7d4c19bb)
[【Amazon3時間クッキング】材料費500円でAWSにWordPress環境を構築するレシピ ～part3～](https://qiita.com/blackriver/items/a0ff95098cf0949aef0b)
の続きです。

# 完成図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/173ca172-350a-70fa-a489-54575d807990.png)
#今
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/267dea3c-1996-a529-451c-463414a9280d.png)

##NAT Gatewayを削除しよう##
①NATゲートウェイ　を選択する
②アクション　から　NATゲートウェイの削除　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/9b299bf1-98db-8fe4-f42d-9efd369c8de0.png)
①NATゲートウェイの削除　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/d9354d45-9941-c327-b294-03706e02e134.png)
##グローバルIPを固定にしよう##
再起動後もグローバルIPを固定にする設定をしよう。

①Elastic IP　を選択する
②新しいアドレスの割当て　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/349ab90f-a9a8-0b04-e67d-206cd9170576.png)
①割当　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/b148151b-195e-e7f4-5b33-bbad0d71a37e.png)
①割り当てられたIPアドレスを確認する
②閉じる　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/a5b95952-432c-ec41-05c0-ce43f63e365e.png)
①割り当てられたIPアドレスを選択する
②アドレスの関連付け　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/234cef5a-78ee-f867-b084-252e37b8d9a4.png)
①Web-server　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/5571ce40-84cd-8606-e543-7b6f755571ef.png)
①WebサーバーのIPアドレス　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/db3234e0-233b-374f-004b-1fc04643f122.png)
①関連付け　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/637a03f9-28ec-5600-d092-70608d32eacd.png)
①閉じる　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/2fb75306-f267-7813-0360-3401170f46f1.png)

##さて、いかがだったでしょうか？##
ITインフラの歴史を塗り替えるのは確実であろうAWS、
この技術を習得したいエンジニアは多いことだろう。

ただ、俺が大事にしている問いは
「結果、俺はAWSで世の中にどんなサービスを提供できたんだ？」
ということ。

「俺はAWSでWordPressを構築し、世の中に情報を発信している。」と言えれば
周りから一歩リードできるのではないか。

個人でAWSを触ったことがある だ け のエンジニアはごろごろいる。
原宿を歩き、ワイドパンツの女子と遭遇するくらいごろごろいる。

向かいの席のやつも、
窓際の先輩も、
隣の奥さんも、
無料枠で収まるよう課金にビクビクしながらインスタンスをすぐさまに停止し、
請求ページを何度も見ているか、もしくはクレジットカード登録の手前で
ただただ躊躇しているだけかもしれない。

AWSという技術、トレンド、将来性、
なぜコンビニコーヒーで毎日150円払っているのにAWSに月1000円出せないのだろうか。
なぜメルカリで2500円のジャケットを買ったが写真では伝わり切らない若者向けテイストが全然似合わず、結局クローゼットに眠っている、なんてことになっているのにAWSに月1000円出せないのだろうか。

そう、
アメブロじゃない。
はてなブログでもない。
これは君のシステムなのだ。
世界に、君のシステムが公開されているのだ。

ますます君のシステムに愛着が湧き、
もっと学びたいという欲望が湧いてくるだろう。

この記事がAWSの一歩を踏み出す勇気となれば幸いだ。
【Amazon3時間クッキング】材料費500円でAWSにWordPress環境を構築するレシピ

# 完成図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/267dea3c-1996-a529-451c-463414a9280d.png)

# 必要なもの
 - ネットに繋がったPC 1台
 - AWSのアカウント 1つ
 - 500円(月ごとAWS使用料目安)
 - 計3時間
 - teraterm

##1. AWSでネットワークを作ろう
**①AWSマネジメントコンソールでVPCを開く**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/4e42806b-851d-aac7-f104-96fb871e6b74.png)
**①右上の部分（リージョン部分）を選択する
②アジアパシフィック（東京）　を選択する**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/72bc894a-fa63-6799-7438-3e3609ea5aff.png)

①VPCの作成を選択する
②test-VPC　と入力する
③10.0.0.0/16　と入力する
④はい、作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/3c7b07c5-915c-dd35-901a-6b468b4d0a54.png)

①サブネット　を選択する
②サブネットの作成　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/604d098f-dea7-ee16-b60c-c7ec397186f1.png)
①test-パブリックセグメント　と入力する
②前手順で作成した[test-VPC]を選択する
③10.0.1.0/24　と入力する
④作成　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/d2c441e8-dd98-67b1-f7ba-ff3be79ef2fb.png)
①インターネットゲートウェイ　を選択する
②インターネットゲートウェイの作成　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/b5387fe9-3eed-aa63-b9bd-b28d0bb98581.png)
①test-ゲートウェイ　と入力する
②作成　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/9379d3a7-1094-33c2-3ae3-02de5f8e3cca.png)
①test-ゲートウェイ　にチェックをつける
②アクション　を選択する
③VPCにアタッチ　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/e5f60c29-98ad-43c0-7d1b-26c5889609f7.png)
①作成したtest-ゲートウェイ　を選択する
②アタッチ　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/fe9adba6-aef4-ea37-1b5e-8d22345ffd86.png)
①ルートテーブル　を選択する
②ルートテーブルの作成　を選択する
③test-パブリックルートテーブル　と入力する
④作成した[test-VPC]を選択する
⑤はい、作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/69205956-71e3-fac7-7db2-9ba4d40744da.png)
①test-パブリックルートテーブル　を選択する
②サブネットの関連付け　を選択する
③編集　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/b2083fa0-9dd3-06eb-9fc0-3e276b1b9a75.png)
①test-パブリックセグメント　を選択する
②保存　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/cadeb519-733b-6f30-8823-a4af2422d1bc.png)
①ルート　を選択する
②編集　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/beafe863-844b-4a5e-32a3-7c59914af15a.png)
①0.0.0.0/0　と入力する
②igw-から始まる宛先を選択する（選択候補が表示されるので、表示されたものを選択する）
③保存　を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/a49af537-26c0-c371-e5f1-38f640b8d921.png)
##コーヒーブレイクを入れる##
お疲れ様。
今3分の1くらい終わったかな。
コーヒーブレイクを入れて気分をリフレッシュしてくれ。

■完成図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/267dea3c-1996-a529-451c-463414a9280d.png)
■今
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/c9b136f5-2fc0-de1b-42b1-d4f15a779815.png)


早速続きをやりたくてウズウズしてるって？
しょうがねぇやつだなぁ。

**じゃあ続きをやってくぞ！**
[【Amazon3時間クッキング】材料費500円でAWSにWordPress環境を構築するレシピ ～part2～](https://qiita.com/blackriver/items/37ff5937d56e7d4c19bb)
ノンプログラマの同志へ向けた、GitLabのススメ

Qiita初投稿です。
業務で必要になり、プログラミングをヨチヨチ初めて一年弱になりました。
（pythonしか書けません！）
最近GitLabを使うようなりいろいろ考えることがあったので、
誰かの役に立てばいいなと思い記事にしました。

# 「Git」とか「GitLab」って？
Gitはバージョン管理ツール、
Gitlabはコード管理サービス……だそうです。
正直、厳密なことはよくわからず使っています。
ざっくり、コーディングの軌跡を残せたり、
コードをクラウドで他人と共有できる
ナウでイケてるアゲな何かという理解です。

ちゃんと知りたい方は、以下の記事を参照。
[GitLabとは？GitHub買収で10倍のインポート数。使い方を解説](https://tech-camp.in/note/technology/44434/)

# 「ノンプログラマ」なのに「GitLab」？  
## 「ノンプログラマ」って？
当記事では職業プログラマ、エンジニアではないという意味で
「ノンプログラマ」という言葉を使っています。
例えば業務の効率化、自動化目的でプログラミングを手段として使うことになった人です。
（私のことです）  
  
## なんで「GitLab」を使うの？
各人が作った小規模なスクリプトをきちんと管理したくて導入することになりました。
というのも職業エンジニアの方がお仕事で作るシステムやアプリケーションと違い
要件定義や仕様はおろか、メンバー内でのコーディングのルールもない状況でした。
作ったスクリプトも基本的に各自のローカルで保存しているだけ。
（しかもちゃんと管理できてない人が大半）
後々誰かが見返すことも意識しながら仕事をする環境を作りたかったのです。  
  
# GitLabを使ってみて
## 良かったこと
- コーディングを始める前に、タスクを言語化する習慣がつく！  
- やろうとしていることや懸念点、打ち合わせの内容などをオープンにして書き残せる！  
- 質問があった時に、参考にしてもらえそうなものをすぐに提供できる！  
- プッシュしておけば、うっかりローカルのファイルを消しても大丈夫！  
- 連携しながらの開発が容易になるので、積極的に作業分担できる！  
  
## 難しかったこと
- そもそも、Gitの仕組みや考え方について理解できる人が少ない。（学習コストがかかる）  
- あやふやな知識でつかおうとすると、誤った操作をしてしまう。（そしてGit嫌いが誕生する……）  
- ノンプログラマに適したモデルケースがなかなか見つからない。  
  
## 特に「GitLabスゲー！」と思ったこと
- ブランチを切ることで、ほかの人との並行開発がスムーズになった！  
 - おかげで、一人で片付けるのが大変そうな規模の依頼にも気軽に応じられるようになりました。  
- issueやプルリクを立てておけば、やり取りした際もスレッドで残せる！  
 - メールだとさかのぼるのが面倒な時もスレッド形式だと楽だし、書き込むときも同様です。  
  
# GitLabを使いやすくするためにしたこと 
前述した「難しかったこと」への対応策をいくつか。
この件については、また別の記事で詳しく書く予定ですので、とりあえず大雑把に。

## GUIを使う
本来、Gitを使うときはコマンドプロンプト（真っ黒い画面のやつ）にコマンド入力しますが、
ノンプログラマにはハードルが高く、クライアントをインストールして使うことに。
GUIだとブランチの様子など可視化される為、
プロジェクトが複雑になってきても現状を把握しやすいです。
今使っているクライアントはこれ。
[sourcetree](https://ja.atlassian.com/software/sourcetree)  

## 運用ルールを作る  
前述したように、自分たちに合うようなモデルケースが見つからなかったので、
Git-Flowの運用ルールをもとに、独自にルールを作ってみました。
Git-Flowについてはこちら。

[Git-flowって何？](https://qiita.com/KosukeSone/items/514dd24828b485c69a05)

こだわったポイントは以下の五つです。
1. リモートリポジトリのForkはしない。
2. 基本的にMasterブランチを使う
（プロジェクトのトップページに表示されるのがMasterだから）
3. ブランチを切る必要がある場合は、
  MasterからDevelop、DevelopからFeatureを切る。
4. 帰宅するときは必ずその時点までのコミットをプッシュしておく。
5. 単独でも複数人でのプロジェクトでも、マージする際はマージリクエストを出す。  
  
## issue,マージリクエストのテンプレート化  
これまでは各人が依頼内容を個人的なメモに取ってそれをもとに開発を進めていました。
しかし、それだと情報共有がしにくい！
さらに自分もメイン業務に追われてどこまで開発したのか、
何をしようとしていたのか分からなくなることも……。
コーディングを始める前に要件の整理をしてもらうことにしました。
また、各々好き勝手に書くと収拾がつかなくなるとも考えて、
テンプレートを埋めてもらう形式にすることに。

内容は大まかに以下の通りです。

- issueについて
 1. 何をする必要があるか
 2. それを達成するための課題は何か
 3. 思いつく限りの解決法（具体的な技術含めて）
 4. 他の人に助けてほしいこと

- マージリクエストについて
 1. 何をするスクリプトか
 2. 具体的に何をしているか箇条書き（○○のファイルを開く～など）  
 3. 依頼にはなかったが、あったほうがよさそうな機能などの提案
 4. 自信がないので念入りにチェックしてほしい部分

# まとめ
実際のところ、複数人での共同開発をしないのであれば
GitとGitLabのほんの一部の機能しか使いません。
それでも、導入のメリットがあると主張したい！

- コーディングを始める前に要件、タスクを整理して明文化する
- 「このコードは、自分以外の誰かが見る！」という意識をもってコーディングする
- だれが何の意図をもってどのような経緯で開発を進めていたかのログを残す。

などなど。
ノンプログラマであっても仕事を進めるうえで必要、
だけどなかなか根付かない意識や文化ってありますよね。
GitLabを使えば、こういう意識を持ちやすい環境作りができるのではないかと思います。
ナウでイケてるアゲなツール、GitLabを
ノンプラグラマの同志のみなさんも使ってみてください！
テーブルのカラムの順番を変える

#作成済みカラムの順番を変えたい
テーブルのカラムは***created_at***や***updated_at***カラムが最後にくるようにするのが暗黙の了解。
間違えて最後に新規カラムを追加していたので、位置を変更するで。

#mysqlならカラムの順番を変えられる
他のDBは知らんけどmysqlは変えられるらしい。
やり方はmysqlに接続して、下記を打ち込めばOK。簡単。

```ALTER TABLE テーブル名 MODIFY 順番を変えたいカラム名　データ型 AFTER 移動後に上に来るカラム名;```

参考URL：http://www.tailtension.com/mysql/995/

またカラムを追加していなかった場合の順番指定方法
⇨https://qiita.com/akira-hamada/items/91c5589e52e247ba8b8b
gzip 圧縮されたファイルをそのまま処理可能なコマンド（less, zgrep など）

こんにちは。
gzip 圧縮は Unix と親和性が良く、圧縮されたファイルをそのまま処理できるコマンドも多いようです。```cat```, ```less```, ```lv```, ```zgrep```, ```tar```の例です。

```console
$ cat 1.gz 2.gz > 3.gz
$ less 3.gz
$ lv 3.gz
$ zgrep ^hello *.gz
$ tar -xzf archive.tar.gz
```

* このようなコマンドは使って楽なので、自作もしたくなります（例：「[jq コマンドで gzip 圧縮された JSON ファイルを引数に取る（シェルスクリプト）](https://qiita.com/kkdd/items/2b5342347ed6bd4c3a52)」）。
Jenkins Pipeline内でビルドのパラメータ化した値を参照する方法

Jenkinsの**Scripted Pipeline**でビルドのパラメータ化した値を参照する書き方
（記事は色々あったのですが、答えにたどり着くまでにちょっと時間がかかったのでシンプルにまとめました^^;）

## ビルドのパラメータ化を設定
<img width="939" alt="jenkins-buildpramater.png" src="https://qiita-image-store.s3.amazonaws.com/0/61433/0d991b1c-bf4d-5f78-98bc-787d6211f96b.png">

## 参照
```
node {
   stage('sample') {
      print "パラメータ化した値：${params.hogeee}"
   }
}
```

以上！
C# おしゃれ構文３選

Java大好きー。
閑話休題。最近、C#をさわる機会がありました。
C#はJavaと類似性が多い言語と思っていましたが、
触っているうちに、ぜんぜん違うおしゃれな構文もあることを見つけました。

本日はそのおしゃれな構文の中から厳選して３つ書いていきたいと思います。

# [out パラメータ修飾子](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/out-parameter-modifier)
引数として、値を戻す変数を指定できちゃいます。

```csharp
class Program
{
    static void Main(string[] args)
    {
        int one, two;
        ReturnTwo(out one, out two);
        Console.WriteLine($"{one}, {two}");
    }
    public static void ReturnTwo(out int one, out int two)
    {
        one = 1;
        two = 2;
    }
}
```
{1, 2} と出力されます。例のように、引数に指定した変数に値を入れてくれるので、複数の値をメソッドから呼び出し元に返却することも可能です。
まるでポインタ渡しですね。おしゃれ。


#[ジェネリック メソッド](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/generics/generic-methods)
Javaでもおなじみジェネリックですが、C#だとちょっとおしゃれな書き方ができます。

```cs
using System;

class Program
{
    static void Main(string[] args)
    {
        var date = createNewInstance<DateTime>();
        Console.WriteLine($"{date}");
    }
    public static T createNewInstance<T>() where T : new()
    {
        return new T();
    }
}
```
Javaだと引数にClass型の値（Date.classとか）を入れそうですが、C#のジェネリクスはメソッド実行時につけることができるのです。おしゃれ。

# [拡張メソッド](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/extension-methods)
別で定義されているクラスに、メソッドを追加することができます。

```cs
using System;

static class Program
{
    static void Main(string[] args)
    {
        "fuga".HogehogePrint();
    }
    public static void HogehogePrint(this string arg)
    {
        Console.WriteLine("hogehoge " + arg);
    }
}
```
string にHogehogePrintというメソッドを追加してやりました。
この拡張メソッドの相当おしゃれなところは、拡張メソッドを別定義しておいて、それをusingするだけで、メソッドが拡張できちゃうところです。

こんななんの変哲もないクラスでも、

```cs
using MyExtension;
static class Program
{
    static void Main(string[] args)
    {
        "fuga".HogehogePrint();
    }
}
```
MyExtensionをusingするだけで、もともと定義されていなかったメソッドがクラスに追加されちゃうのです。

```cs:Extension.cs
using System;
namespace MyExtension
{
    public static class Extension
    {
        public static void HogehogePrint(this string arg)
        {
            Console.WriteLine("hogehoge " + arg);
        }
    }
}
```
LINQなどもこの仕組をつかって、配列にJavaのStreaming　APIのような動きをつけているようです。むちゃくちゃおしゃれですね。

# まとめ
まだまだC#の初学者ですが、おしゃれだと思う３選上げてみました。
Javaのほうが好きです。
【Xcode 10, swift 4】 UIAlertController を表示してからsegueで画面遷移するサンプル

【Xcode 10, swift 4】 UIAlertController を表示してからsegueで画面遷移するコードを書きましたが、エラーメッセージが出て、しばらくつまずきました。

下図のButtonを押すと・・・
![Button.gif](https://qiita-image-store.s3.amazonaws.com/0/193431/22c96786-322d-40f6-c1ca-74fc35ed16d2.gif)
以下のようなalertを表示して、キャンセルなら何もしない、OKなら次の画面に遷移するというコードを書きました。Buttonは"myButton"、segue identifierは"toSecondView"としています。
![alert.gif](https://qiita-image-store.s3.amazonaws.com/0/193431/5e9dfa69-d468-fc56-e96f-d00e029e944a.gif)

```swift
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet var myButton:UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func myActionSegue(){
        let titleString = "画面遷移"
        let messageString = "画面遷移しますか？"
        let alert: UIAlertController = UIAlertController(title:titleString,message: messageString,preferredStyle: UIAlertController.Style.alert)
        let okAction: UIAlertAction = UIAlertAction(title: "OK",style: UIAlertAction.Style.default,handler:{(action:UIAlertAction!) -> Void in
            self.performSegue(withIdentifier: "toSecondView", sender: true)
        })
        let cancelAction: UIAlertAction = UIAlertAction(title: "キャンセル",style: UIAlertAction.Style.cancel,handler:{(action:UIAlertAction!) -> Void in
        })
        alert.addAction(okAction)
        alert.addAction(cancelAction)
        self.view?.window?.rootViewController?.present(alert, animated: true, completion: nil)
    }
}
```
画面遷移自体はうまく行きましたが、コンソールに以下のようなエラーメッセージが表示されました。
pushViewController:animated: called on ＜・・・＞ while an existing transition or presentation is occurring; the navigation stack will not be updated.
しばらく悩みましたが、原因が分かりましたので提示します。

当初、以下の図のように、storyboardでフィールド上の「Button」を右クリックしてsecondViewにpushしていました。これがエラーメッセージの原因でした。
![wrongSample.gif](https://qiita-image-store.s3.amazonaws.com/0/193431/170fa188-c2fe-51bf-624f-60743407957d.gif)
以下の図のように、画面上部の黄色い印を右クリック（矢印）してsecondViewにpushした所、エラーメッセージが消えました。
![goodSample.gif](https://qiita-image-store.s3.amazonaws.com/0/193431/81366f22-1a52-9b50-daae-0ef3c344506b.gif)
以上、皆様のご参考になるかと思い、提示させて頂きました。
主なMIMEタイプ

| MIMEタイプ       | 意味 |
|:-----------------|:------------------|
| text/plain       |            テキスト  |
| text/html        |            HTML文書 |
| application/xml  |            XML文書 |
| text/css         |            CSS |
| image/gif        |           GIF画像 |
| image/jpeg       |           JPEG画像 |
| image/png        |           PNG画像 |
| application/pdf  |           PDF画像 |
Rails カラム名の変更。あとカラム名の付け方の規定

#カラム名はデータ型によって名前が変わる
データ型に日付を入れたい場合はカラム名の最後に***「_on」***をいれる。
日時を入れたい場合は最後に***「_at」***をいれる。

#一度つけたカラム名を変更する
①
$rails generate migration rename_カラム名_column_to_テーブル名

上記コードを実行すると
上記のコードを実行すると、
```db/migrate/201８0９２０055550_rename_カラム名_column_to_テーブル名.rb```
といったファイルが生成される。

②
生成されたマイグレーションファイルを編集
生成されたファイルにchangeメソッドを追加し、
その中に変更したいカラム名を記述する。　

```
def change
  rename_column :テーブル名, :元のカラム名, :新しいカラム名
end
```

③
DBに反映
```$rails db:migrate```

＊下記URLを参考。
https://qiita.com/kaito-chiba/items/723da8627438b67cc02c
WindowsでJuliusLibを使う

Juliusの音声認識を利用するプログラムを作ろうと思い当たったものの、モジュールモードで使うには使い勝手が微妙に悪く、JuliusLibをプログラムに組み込む方法を試してみようとしたところ、結構詰まってしまったので自分なりに備忘録を残しておきます。（割と当たり前のことかもしれませんが…）

# 実行環境
Windows 10 Home 64bit
Microsoft Visual Studio Community 2017
Julius 4.4.2

# 手順
今回は付属のjulius-simple.cをコンパイルして動かすことを目標にします。
makeコマンドでビルドする方法はエラーが出てしまうので、Visual Studioでビルドする方法を採りました。

1. Juliusのソースをダウンロード  
[GitHub](https://github.com/julius-speech/julius)のページから落としてきます。
`git clone`コマンドか、zipでダウンロード・解凍して任意のディレクトリに配置します。
ここでは、インストールしたJuliusのソースのディレクトリをjuliusとします。

2. JuliusLib.slnを開く  
julius\msvcにあるJuliusLib.slnをVisual Studioで開きます。
Windows APIを用いたGUIのサンプルプログラムが含まれています。

3. ソリューションをビルドする  
ソリューションエクスプローラーの「SampleApp」の上で右クリックし「スタートアッププロジェクトに設定(A)」を選択します。
次に、上のメニューから「ビルド(B)」→「ソリューションのビルド(B)」を選択し、ビルドします。
ここでは、ソリューション構成を「Release」にしておきます。
この時に、JuliusLibのプロジェクト(libjulius,libsent)等も一緒にビルドされ、ライブラリファイルが生成されます。

4. 新しいプロジェクトを作成する  
先ほどのJuliusLib.slnをカスタマイズして使うと、ソリューションが大きくなって不便なので、上のメニューから「ファイル(F)」→「新規作成(N)」→「プロジェクト(P)」で専用のプログラムを実行する用に新しいソリューション・プロジェクトを作成します。今回はVisual C++の空のプロジェクトを作成します。

5. julius-simple.cをプロジェクトに追加する  
とりあえず動かすサンプルプログラムとして、julius\julius-simpleにあるjulius-simple.cを新しく作成したプロジェクトにコピーします。

6. プロジェクトの設定をする  
    - インクルードパスを通す  
    プロジェクトのプロパティを開き「構成プロパティ→C/C++→全般」にある「追加のインクルードディレクトリ」に「**julius\libjulius\include**」「**julius\libsent\include**」のパスを追加します。
    - ライブラリをリンクする  
    3の手順でビルドしてできたライブラリファイルをリンクします。  
    「julius\msvc\Release」にある「**libjulius.lib**」「**libsent.lib**」、「julius\msvc\Library_PortAudio\lib」にある「**PortAudio.lib**」、「julius\msvc\Library_zlib\lib」にある「**zlib.lib**」を作成したプロジェクト(.vcxprojファイル)があるディレクトリにコピー。または、ライブラリファイルがあるディレクトリのパスをプロパティの「構成プロパティ→リンカー→全般」にある「追加のライブラリディレクトリ」に指定します。  
    次に、「構成プロパティ→リンカー→入力」にある「追加の依存ファイル」に「**libjulius.lib;libsent.lib;PortAudio.lib;zlib.lib;ws2_32.lib;**」と追記します。

7. ビルドする  
プロジェクトのプロパティの変更を適用後、ビルドすると問題なくコンパイルが通るはずです。
出力されたアプリケーションを、コマンドプロンプト等で`-C`オプションでjconfファイルを指定して実行すれば、julius.exeと同じように動作するはずです。

次からは、6の設定をするだけでJuliusLibを自分のプログラムで使うことができます。

#おわりに

ようやくJuliusを使うプログラムの環境構築ができたので、これからJuliusLibの使い方を読み解いて少しずつプログラムが書ければいいなと思います。
何か間違ってる・もっといい方法がある等あれば教えてください！
Java8以前向け: java.util.Calendar型からjava.sql.Date型に変換する方法

java.util.Calendar型からjava.sql.Date型に変換する方法を紹介する

1. 結論  
以下のようにすると変換できる
</li>

```java:CalendarToDateTest.java

import java.util.Calendar;
import java.sql.Date;

public class CalendarToDateTest {
    public static void main(String args[]) {
        Calendar calendar = Calendar.getInstance();
        Date date = new Date(calendar.getTime().getTime());
        System.out.println(date);
    }
}

```
実行結果

```terminal
$> javac CalendarToDateTest.java
$> java CalendarToDateTest
2018-08-12
```

2.&nbsp;解説
&nbsp; &nbsp; 1. CalendarのメソッドgetTime()は、Calendar型のオブジェクト(上記の例でcalendar)の時間値を表すjava.util.Date型のオブジェクトを返す。
&nbsp; &nbsp; 2. java.util.Date型のgetTime()は、java.util.Date型のオブジェクトの時間値の1970年1月1日　00:00:00　GMTからのミリ秒数をlong型で返す。
&nbsp; &nbsp; 3. java.sql.Date型のコンストラクタDate(long date)は、引数で指定されたミリ秒の値を使ってjava.sql.Dateオブジェクトを構築する。  
&nbsp;つまり、java.sql.Dateのコンストラクタの引数に、(Calendar型のオブジェクト).getTime().getTime()を渡すことによって、Calendar型のオブジェクトの時間値を表すjava.sql.date型のオブジェクトを取得することができる。
Flaskを使用してRESTful APIを実装する（ユーザー認証編）

#はじめに
Flaskを使用してRESTful APIを実装しましたので、以下に公開しました。
https://github.com/oliverSI/flask-restful-authentication

#使ったもの
- docker
- nginx
- uWSGI
- Flask
- MongoDB
- JSON Web Token(JWT).
 

#準備
1. GitHubからリポジトリをクローンします。

```
git clone https://github.com/oliverSI/flask-restful-authentication.git
```

2. 以下のようにメールサーバーの設定をします。

```
export EMAIL_SERVER=[EMAIL_SERVER]
export EMAIL_USERNAME=[EMAIL_USERNAME]
export EMAIL_PASSWORD=[EMAIL_PASSWORD]
```

3. 以下のコマンドでコンテナを起動します。

```
sudo docker-compose up -d
``` 

#使用方法

登録

```
curl -X POST -H "Content-Type: application/json" -d '{"email": "test@example.com", "password": "password"}' http://127.0.0.1/v1/register
```

アクティベーション

```
curl -X PUT -H "Content-Type: application/json" -d '{"activation_code": "activation code you received"}’ http://127.0.0.1/v1/activate
```

ログイン

```
curl -X GET -H "Content-Type: application/json" -d '{"email": “test@example.com", "password": "password"}’ http://127.0.0.1/v1/login
```

ログイン後の操作

```
curl -H "Authorization: Bearer [token you got]" -H "Content-Type: application/json" http://127.0.0.1/v1/todo
```
Go言語を真剣に勉強してみた〜基本構文編③（関数）〜

#はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
さて今回は「Go言語を真剣に勉強してみた〜基本構文編〜」の3回目と言うことで「Goの関数」についてみていこうと思います。
では、早速いってみましょう:point_up:

「Go言語を真剣に勉強してみた〜基本構文編①（変数、定数、条件分岐、繰り返し処理）〜」については[こちら](https://qiita.com/watataku/items/f12163ade0d820d00bba)から。
「Go言語を真剣に勉強してみた〜基本構文編②（配列）〜」については[こちら](https://qiita.com/drafts/50de84b191f73d281be9)から。
#関数

```
func 関数名(引数 データ型) 戻り値の型 {
    return 戻り値
}
```

**＊Goでは複数の戻り値が指定できる。(カンマ(,)区切り)で。その際、戻り値のデータ型もカンマ区切りで()でくくる。**

以下例

```golang:func.go
func main() {
	hello()
	n := plus(1, 2)
	fmt.Println(n)
}

func hello() {
	fmt.Println("HelloWould\n")
}

func plus (i, j int) int {
	n := i + j
	return n
}
```
出力結果

```
HelloWould

3
```

以上。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。
次回は「Go言語を真剣に勉強してみた〜基本構文編④（ポインタ、構造体）〜」です。

よろしければ、[Go言語を真剣に勉強してみた〜環境構築編〜](https://qiita.com/watataku/items/c2b25ace1aeaaf0b75c0)もご覧ください。
rubyでhashを再定義するとfetchできなくなる時がある

## Railsで新しいActiveRecordをキーにしたあと、saveするとfetchできなかった

```ruby
class Item < ActiveRecord; end

item = Item.new

item_hash = { item => 'fetchできたよ' }
item.save!

# fetchできない
p item_hash[item]
# => nil
```

## どうしてこうなったか
ActiveRecordはhashを再定義している

```ruby
def hash
  if id
    self.class.hash ^ id.hash
  else
    super
  end
end
```

### 以下の現象が起る

```ruby
class Item
  attr_accessor :id
  def hash
    id
  end
end

item = Item.new

item.id = 1

items = []
item_hash = {}

items << item
item_hash[item] = 'fetchできたよ'

p item_hash[items[0]]
# => 'fetchできたよ'

# hash methodに依存している値を変える
item.id = 2

# fetchできない
p item_hash[items[0]]
# nil

# keys経由なら何故か一致する
p item_hash.keys[0] == items[0]
# => true

# 同様にhashも一致する
p item_hash.keys[0].hash == items[0].hash
# => true

# 何がなんだかわからない
p item_hash[item_hash.keys[0]]
# => nil

p item_hash.has_key?(item_hash.keys[0])
# => false
```

## なんでこうなるの？(予測)
key側のhash値は代入のタイミングでしか計算されないので、その後hashが変わると一致しなくなる。
`item_hash[item] = 'fetchできたよ'`

.hashや.eql?で比較するとhashが再計算されるためtrueになる


# ~~object_idで比較するようにすれば回避できる~~

# 追記
コメントでHash#rehashを教えていただきました

リファレンスにがっつり書いてありますね。
Swiftでデザインパターン ファクトリーパターン

# ファクトリーパターン
 - オブジェクトの生成する処理をする専門のクラスを用意し、そこ（ファクトリー）に生成を任せてしまうもの
 - オブジェクトの生成にはパラメーターなどを指定する場合があるが、そこが複雑だと、いろんな場所で使い回すときにミスをしたり、面倒になるので、その問題を解決できる

```swift

import UIKit
/*
 記事を表示
 */
class ArticleViewController: UIViewController {
    
    // オブジェクト生成時にセットする想定
    var articleId: Int!
    
    func fetchArticleContentById() -> String {
        // ここでサーバーから記事IDから本文を取得する想定
        let content = "記事idが \(String(articleId)) の内容"
        return content
    }
}
```

# 問題点

- 下記の通り、利用する際に、articleIdをセットする必要がある
- このclassを作成したのが、自分だったら良いが、同僚のプログラマが作成していた場合、使い方を知る必要がある

```swift

// 例えば上記のようなViewContollerの場合、生成する際に、articleIdをセットする必要がある
let vc = ArticleViewController()
vc.articleId = 1
print(vc.fetchArticleContentById())
```

- articleIdを忘れた場合（このclassの使い方）、下記の通りエラーになる場合がある

```swift

// ここでarticleIdを指定するのを忘れた場合はエラー
let vc2 = ArticleViewController()
print(vc2.fetchArticleContentById()) 
// Fatal error: Unexpectedly found nil while unwrapping an Optional value
```

# 解決法（ファクトリーパターンを利用する）

- 生成を一任するFactoryクラスを実装する
- init時に、必要なパラメーターを指定できるようにする

```swift

// 生成を一任するクラスを作成する
class ArticleViewControllerFactory {
    private let articleId: Int
    
    init(articleId: Int) {
        self.articleId = articleId
    }
    
    func makeArticleViewController() -> ArticleViewController {
        let vc = ArticleViewController()
        vc.articleId = self.articleId
        return vc
    }
}
```

- 利用する際は、このようになる
- 生成時に必要なパラメーターの指定忘れや、手順が違うなどのミスや複雑性を排除されているのがおわかりいただけるだろうか

```swift
let factory = ArticleViewControllerFactory(articleId: 1)
let vc3: ArticleViewController = factory.makeArticleViewController()
vc3.fetchArticleContentById() // 記事idが 2 の内容
```

以上
DjangoのModelに数値の上限、下限のバリデーションをつける

Django Adminを使えば、Modelに応じたCRUDのフォームを作れちゃいます。
作れちゃうんですが、IntegerFieldとか上限下限を設定できる引数がなかったりします。
備忘録も兼ねて、上限下限のバリデーションの設定の仕方でも

# 実装例！

```between.py
class Foo(models.Model):
    number = models.IntegerField(
        validators=[MinValueValidator(1), MaxValueValidator(100)],
    )
```

上記のように指定してあげれば、DjangoAdminのCRUDで登録する時に
1以上100以下でない値を入力するとエラーを出してくれるようになります！
他にも正規表現のバリデーションを入れたりも出来るので、柔軟に設定できてしまいます:heart:
Rubyの基本記述の仕方〜その２〜　かつ/または　配列

前回の記事に引き続き、Rubyの基本記述をまとめていきます。

- かつ
-
複数の条件を同時に満たすことを表します。
（条件式)　&& （条件式）のように記述します。


```qiita.rb
＜例＞
x = 20　　の時、
x > 10 && x < 30
```
上の例では、xが20に定められていて
①10より大きい
②30より小さい
どちらの条件も満たしています。
ので、結果は「true」が返ってきます。

〜「かつ」の正誤結果組み合わせまとめ〜
◯　&&　 ◯　→　true
◯　&&　 ×　→　false
×　&&　 ◯　→　false
×　&&　 ×　→　false
※かつ、で並べた条件全てが正で初めて正になります
- または
-
複数の条件のうち、どれかひとつが満たされていることを表します。
（条件式)　|| （条件式）のように記述します。

```qiita.rb
＜例＞
x = 20　　の時、
x > 25 || x < 30
```
上の例では
①２５より大きい
②３０より小さい
ふたつの条件のうち、xは今20なので①は該当しませんが、②の条件を満たしています。
ので、結果は「true」が返ってきます。

〜「または」の正誤結果組み合わせまとめ〜
◯　||　 ◯　→　true
◯　||　 ×　→　true
×　||　 ◯　→　true
×　||　 ×　→　false
※または、で並べた条件のうちひとつでも正であれば正が返ってきます

- 配列
-

複数のデータをまとめて記述する際に「配列」という便利な概念があります。
下の例をご覧ください。

```qiita.rb
＜例＞
family = [ "父", "母", "兄", "妹", "祖父", "祖母"]
```

上の記述で、familyという変数に
①父、②母、③兄、④妹、⑤祖父、⑥祖母と、６つのデータを定義することができました。

- [ ]で囲むと「配列」の記法になります


- 配列の要素とインデックス番号
-
配列の記法を用いた場合、押さえておくべきポイントがあります。

- 中に入っているデータを「要素」と呼びます

また、要素が何番目に入っているかを指定することであとで自由に取り出すことができます。

- 「要素が何番目に入っているか」これを指して「インデックス番号」と呼びます


```qiita.rb
＜例＞
family    =   ["父", "母", "兄", "妹", "祖父", "祖母"]
インデックス番号 = [ 0 ,  1 ,  2 ,  3 ,  4 ,  5  ]
```
上の例では、「父」の要素のインデックス番号は[ 0 ]、「祖母」のインデックス番号は[ 5 ]となります。
※一番最初のインデックス番号が「０」から始まる点にご注意ください。
前回の記事でご紹介した式展開を用いると

```qiita.rb
＜例＞
family    =   ["父","母","兄","妹","祖父","祖母"]
puts "私は#{family[5]}の孫です。"
```
と、記述することで「私は祖母の孫です」と表現することができ、
配列として定義したfamilyからインデックス番号を用いてデータを取り出すことができました。


今日はこのあたりで失礼します。
「Google Apps Script で始める RPA」のスライド公開します #GoogleNext18

## Google Cloud Next '18 in Tokyo の概要

- 1 年に 1 度行われる Google 主催の大型イベント
- 2018/09/19, 20 の 2 日間で実施
- Google Cloud の技術についてのセッション多数
- 1 万人以上が参加
- ハッシュタグ: [#GoogleNext18](https://twitter.com/hashtag/GoogleNext18?src=hash)
- [公式サイト](https://cloud.withgoogle.com/next18/tokyo)
- 本家はアメリカで開催
    - [イベントサイト](https://cloud.withgoogle.com/next18/sf/)

## セッション内容

[Google Apps Script で始める RPA](https://cloud.withgoogle.com/next18/tokyo/sessions/session/223235) というタイトルで発表しました。

アジェンダは以下のとおりです。

- RPA とは
- Google Apps Script とは
- Google Apps Script の強み・弱み
- [グロービス](https://qiita.com/organizations/globis)での RPA の取り組み・事例集

40 分と長い時間をいただいたのですが、時間の都合で割愛した部分もあり、そのあたりも以下スライドには残してあります。

## スライド

詳しくはスライドに載せていますので、以下を御覧ください。 Speaker Deck はリンクが有効じゃないので、 Google スライド推奨です。（イベントロゴ等は権利の都合上、スライドから消してます。）

- Google スライド: [Google Apps Script で始める RPA](https://docs.google.com/presentation/d/16Oo0_rVPl-gieZNAj2HNtWqQMJCPhW27CqLk-c5peyY/edit?usp=sharing)
- Speaker Deck: [Google Apps Script で始める RPA](https://speakerdeck.com/tanabee/rpa-starting-with-gas)

## YouTube

YouTube も公開されたので共有します。

[D1-4-S10_Google Apps Script で始める RPA (Robotic Process Automation) @YouTube](https://www.youtube.com/watch?v=_8s-ZaS0LLg)

## GAS ハンズオンやります！

セッションの最後で案内しましたが、 Google Apps Script のハンズオンを実施します。

[第 1 回 Google Apps Script (GAS) ハンズオン @麹町](https://globis.connpass.com/event/100268/)

2 回目以降の開催の可能性もありますので、 [グロービス Connpass](https://globis.connpass.com/) のメンバー登録していただけると、通知受け取れて良いかと思います。イベント開催時は Twitter ( [@_tanabee](https://twitter.com/_tanabee) ) でも共有します。

### 2018/10/14 追記: ハンズオン開催しました！

資料: [Google Apps Script ハンズオン資料 ](https://qiita.com/tanabee/items/4a5056f468ae71d8d648)
勉強会の様子: [チューター少人数でも回せる！Slack を駆使したハンズオン勉強会のやり方](https://qiita.com/tanabee/items/04a648cede43956c0e9d)

## おわりに

セッションを観に来てくださった方々ありがとうございました！

弊社エンジニアによるセッションレポート出ましたので共有します！

[Google Cloud Next 2018 Day2 イベントレポート](https://qiita.com/kazuya_onuma/items/b70c3b92db00f031587c)
webの技術

##webAPI
**API**とは「Application Program Interface」のことでOSやライブラリの機能を利用するための呼び出し手段を示す。
**webAPI**とはwebサイトが提供する機能や情報を外部のプログラムから呼び出す方法のこと。

###webAPIの通信形式
HTTP通信を行うよう作られる。またその通信方法の設計にはRESTという考え方が強く反映している。

##マッシュアップ
webAPIと自社の情報、そして他者のAPIを組み合わせて、
新しい機能やユーザインターフェイスを作成しwebサービスを作ること。



##WEBAPIにおけるRESTの適応時の作法
1. あらゆる情報をリソースという言葉で管理
2. リソースの識別にはURIを用いる
3. リソースの取得や操作をGET,POST,DELETE,POSTといったHTTPのメソッドを利用して操作する。
4. 操作結果はHTTPのステータスコードで判断



##Webアプリケーションフレームワーク
webプログラムの開発に効率的とされる基本構造を提供し、データベースアクセスや入力チェックなど
web開発では必ず必要となる機能が提供される。開発者がフレームワークのルールに従って開発することで
記述するコード量を減らし、プログラムのロジック開発に集中できるようにすることがフレームワークの目的となる。


###基本構造
* MVCモデル構造
* データーベースアクセス機能
* URLマッピング
* エラー処理
* ロギング
* テンプレートエンジン
* キャッシュ
* プラグインによる拡張構造



##オープンソースソフトウェア
主にソフトウェアに適応されるライセンスの総称のこと。
オープンソースイニシアティブが認定した60種類以上のライセンスの下で開発・配布・利用される。

###主なオープンソースライセンス

| ライセンス名  | 特徴                                                         | 採用プログラム                       |
| ------------- | ------------------------------------------------------------ | ------------------------------------ |
| GPL           | 著作権表示の保持、無保証、自由な複製・改変、そして派生プログラムにもGPLを適応すべきであること | LinuxのカーネルやCentOS、MySQL、Ruby |
| BSDライセンス | 著作権表示の保持、無保証の2点                                | YahooUIライブライなど                |
| MITライセンス | BSDライセンスとほぼ同じ                                      | RubyonRailsやCakePHP、jQueryなど     |




##バージョン管理システム
多人数で共通のファイルを更新する時、古いファイルでの上書き「先祖返り」が起きやすい。
最新ファイルをバージョン管理システムのリポジトリで管理し、新しいへんくをサーバーに通知（コミット）することで
リビジョンを更新し、このリビジョンによってバージョンが管理されている。


###SVN
サーバ側でリポジトリを管理する集中型。
コミットするとファイルではなくディレクトリ構造丸ごとリビジョンとして管理する。
変更箇所、更新履歴などは都度サーバへ通信で問い合わせるため
サーバに接続している必要がある。


###git
サーバのリポジトリと同じものをローカルでも管理することができる。
こういったものを分散型と呼ぶ。
サーバに問い合わせる必要がなく、レスポンスが早い。


##サーバ側でのセキュリティ対策
###1. SQLインジェクション
Webページからの入力値やパラーメータを利用したSQL文でデータベースに問い合わせを行う。
[対策]：入力値に対して、SQL文の無力化

###2. ディレクトリトラサーバル
Webページからの入力値やパラーメータを利用した、ファイルに読み書きするシステムに対して行われる攻撃。
[対策]：入力値の検査

##クライアント側でのセキュリティ対策
###1. XSS
入力内容をそのまま表示するさい、表示するコンテンツに埋め込まれる攻撃のこと。
[対策]：出力時にユーザ入力部を排除する。

###2. CSRF
特定の情報を、特定のページに、ユーザーの意図とは無関係に送信する攻撃のこと。
[対策]：正規の手続きでワンタイムトークンを使用する。認証情報を入力させる。
Laravel Queつまずいたところメモ

#失敗したJob用のテーブルを忘れず作る

Jobが失敗した場合に、failed_jobsテーブルに状況を格納する。
なくても、Jobの実行自体はできるが、Job失敗したときにDB書き込みに失敗のログがたまるので、テーブルを作成しておく。

```php:failed_jobsテーブル作成コマンド
php artisan queue:failed-table
php artisan migrate
```

# ジョブが失敗した際の試行回数 `tries`

classにグローバル変数 `$tries`を設定することで試行回数を設定できる。

```php
class Hoge
{

    /**
     * 最大実行回数
     *
     * @var int
     */
    public $tries = 1;
}
```

$tries の試行回数は、**最大実行回数** なので、 `$tries = 1;` ならエラーで再実行しない。  
`$tries = 2;` ならエラー時に一回だけ、再実行する。

ここで、0を指定するとエラーで無制限に再実行を試みるようで、
Jobを管理する `jobs` テーブルの `attempts`　のカウンター(属性が`tinyint unsigned`)が振り切れてエラーが起こりました。

※内部ログなので画面上は反応なし

# AzureのApp Service(Windows)へのJobの登録

`App Service`自体の`Web ジョブ`を使えばクリックで登録できます。
workerコマンドをwindows用のcmdに流したいので、以下の`.cmd`ファイルを作成し

```cmd:WebJobでLaravelQueueを動かす
php %HOME%\site\wwwroot\artisan queue:work
```

`Webジョブの追加`ボタンから、アップします。
それ以外の項目は、下を選ぶのが良さそう。

~~~
種類:継続
スケール:マルチインスタンス
~~~


---

以上です。
リソース不足で仮想マシンが立ち上がらないときの対処法

#概要
今回直面したエラー内容は以下の通り。
**「Insufficient  resources to  satisfy  configured  failover level  for vSphere  HA」**

Veeam backup & replicationを使用して旧基盤から新基盤にVMを移行させていた。マイグレーション作業及び新基盤にてVMの設定が完了した後、VMを起動させようとしたとき上記のエラーが発生。

#環境
- 1クラスタ, 3ESXi, 50VM程度
- ESXiバージョン：6.0.0
- VMバージョン：11
- VCSAバージョン：6.0.0
- ESXi CPU：24×2.30 GHz
- ESXiメモリ：262×3 GB

#原因
3台のESXiが所属しているクラスタの設定にて、vSphere HAを有効にしており、加えてアドミッションコントロールの設定はデフォルトの「ホスト障害クラスタ許容台数：1台」のままであったため上記のアラームがトリガーされた。

**※アドミッションコントロールとは**
vSphere HAで保護されたVMが他のESXiで確実にフェイルオーバーできるように、クラスタ内のESXiホストに予備リソースを確保する機能。
[詳しくはこちらを参照](https://docs.vmware.com/jp/VMware-vSphere/6.0/com.vmware.vsphere.avail.doc/GUID-53F6938C-96E5-4F67-9A6E-479F5A894571.html)

vSphere Web Clientのバージョンが6.0の場合、スロットサイズポリシーが「全VMのパワーオン状態を保護する」にチェックが入っている。
![pic](http://drive.google.com/uc?export=view&id=1tgjB6q-jOS8ghPmvASwRsJPjVN4bdtYW)
この設定は、**「ESXiに障害が起きても確実に全VMをフェイルオーバーするためにリソースを確保する」**ので、有効にするとクラスタ内でリソース不足になりやすい。
絶対にESXi上にあるVMを1台たりとも落としたくない場合以外は、この設定を有効にするのは注意すること。

※vSphere Web Client6.5以降は、仕様が変更されたことで「全VMのパワーオン状態を保護する」にチェックがデフォルトで入らないようになったため、意図的に設定しない限り問題はない。

#解決方法
今回対処した方法は2つ。

###①フェイルオーバーホストを指定する。
構築した環境は、全部確実に全VMのパワーオン状態を保たなければならない訳ではなかったので、アドミッションコントロールの設定にて「フェイルオーバーホストを指定」を選択した。
![pic2](http://drive.google.com/uc?export=view&id=1oMqIMDC6vgos7SSALoRAiPFpdC8WUuY9)
ここでフェイルオーバーホストを指定すると、そのESXiはフェイルオーバーの時以外使用されなくなる。設定を有効にする以前にVMがフェイルオーバーホストに乗っていたとしても、異常なく設定変更することができる。

###②クラスタにESXiを追加する。
今回は、旧基盤から新基盤へVMを移行する際に生じたリソース不足だったため、万が一のことも兼ねてクラスタにESXiを1台追加することを決めた。

ESXiを新たにデプロイしクラスタに追加するのは手間がかかる方法だが、暫くはリソース不足になることはないので、時間と予算に余裕があればこの対処を行なえば良いと思う。
Laravel の Basic 認証で email 以外をユーザーIDとして利用する

はい、というわけでまたまた Laravel ネタです。

Laravel の認証では Basic 認証を使うことができるようになっています。
[参考](https://readouble.com/laravel/5.6/ja/authentication.html#http-basic-authentication)


しかしながら標準機能では email / password の入力で固定になっており、ユーザー名で認証することができません。

そこでちょちょいと手を入れて email 以外のパラメーターでIDを使えるようにしてみましょう。


### 元々のファイル


標準ドキュメントを見ると

```php

Route::get('profile', function() {
    // 認証済みのユーザーのみが入れる
})->middleware('auth.basic');
```

こんなふうに書くように指定があります。
route の中にmiddleware で指定するためには `App/http/Kernel.php` の中で指定が必要です。

```php:App\Http\Kernel.php
protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
```

ちゃんと auth.basic がありますね。ここを見ると使われているミドルウェアのクラスが
`Illuminate\Auth\Middleware\AuthenticateWithBasicAuth` であることもわかります。

ミドルウェアなので handler の部分を確認してみましょう。



```php:Illuminate\Auth\Middleware\AuthenticateWithBasicAuth

public function handle($request, Closure $next, $guard = null)
{
    return $this->auth->guard($guard)->basic() ?: $next($request);
}

```

ここで basic() という関数がでてきましたね。
guard()が登場しているので、`Illuminate\Auth\SessionGuard` を確認して見ます。

```php:Illuminate\Auth\SessionGuard.php

public function basic($field = 'email', $extraConditions = [])
{
    if ($this->check()) {
        return;
    }

    if ($this->attemptBasic($this->getRequest(), $field, $extraConditions)) {
        return;
    }

    return $this->failedBasicResponse();
}
```

はい、いました `basic()` さん。
引数を見ると、第一引数で email と書いてあるのが確認できますね。
ここで別パラメータを渡してあげると良さそうです。


### 対応

`basic()` を呼んでいるのはミドルウェアを少し変更してあげればよさそうです。
ということで


```

php artisan make:middleware BasicAuthUsername
```

と新規にミドルウェアを作成します。
そして上記のベースのミドルウェアを継承して変更部分を足しましょう。


```php:App\Http\Middleware\BasicAuthUsername

namespace App\Http\Middleware;

use Closure;
use Illuminate\Auth\Middleware\AuthenticateWithBasicAuth;

class BasicAuthUsername extends AuthenticateWithBasicAuth
{
    public function handle($request, Closure $next, $guard = null)
    {
        return $this->auth->guard($guard)->basic('username') ?: $next($request);
    }
}

```

user テーブルで username というカラムを使いたい場合はこのように記載してあげるだけですね。
あとは route の中で利用できるように kernel.php へ追記します。

```php:App\Http\Kernel.php
protected $routeMiddleware = [
	(略)
    'auth.basic_username' => \App\Http\Middleware\BasicAuthUsername::class,
];
```

最後は Route ファイルへ記載しましょう。

```php

Route::get('/hoge/', function(){
    return view('hoge');
})->middleware('auth.basic_username');

```


以上です。
ISUCON8で予選突破しました

[ISUCON8の予選突破できました](https://qiita.com/YasunoriISHIKAWA/items/43357601504176491dae) の補足投稿です。
こちらの記事に大まかな流れは書いてあるので、自分のやった部分について補足します。

## コード修正でやったこと

> 中陳：気になる処理の時間計測とループ処理の改善

最初、何か計測ツールでも入れようかと思いましたが、準備もしていなくて面倒だったのでやめました。
いったんget_event関数に改善ポイントを絞っていたので、その部分だけに処理時間をテキストに出力するようにしました。
どのAPIリクエストによるget_eventの呼び出しかを出力されるようにしました。
ベンチマークを流して、多く出力されているAPIリクエストについて改善をしていこうと決めました。

> 中陳：/api/users/{id}のget_event周りを改修

「石川：データの更新のない情報（sheets）をハードコード化」で作成していたメソッドを利用して、この部分も改善しました。

> 中陳：get_eventを改修
> sheets分SQLが発行されていたのを予約されているsheetsを先に取得することでSQLの問い合わせを削減

ループ内でSQLが発行されていて、ここは重いと分かっていたので、ここを改善することにしました。
最初の修正後、failになるためいったんリバートしてSQLを見直すことにしました。
元のSQLのようにGROUP BYとHAVINGを使ったSQLにしていましたが、GROUP BYとHAVINGを使わないSQLにして、プログラム側で処理をするようにしました。

## 感想

中盤で初期スコアからそこまで上がっていない中、他のチームが数万点までいっていて、今回は正直だめかなとモチベーションが下がっていました。
後半徐々にスコアが上がっていき、予選突破できてほっとしました。思った以上の結果がでて良かったです。
やはり地道な改善が大切なんだなと考えさせられました。
本戦は初参加なので頑張りたいと思います。