OmniAICreator/Qiita-1.07M huggingface dataset:
SpringSecurity ハッシュ化したパスワードでログイン処理をしようとしてハマった（解決済み）

# 環境
- SpringBoot 1.5.3

# やりたかったこと
画面から入力されたIDとパスワードを用いたログイン処理です。
パスワードはハッシュ化してデータベースのユーザーテーブルに保存しているので、入力されたパスワードとデータベースに保存されたハッシュ値を比較する必要がありました。

# ハマったこと
ユーザーテーブルに格納されているはずのアカウントでログインしようとして認証NGとなる。
ハッシュ化する処理を取り除いて平文でログインを行うと認証OKとなる。

# 原因
こんなソースを書いていました。

```java:WebSecurityConfig.java(修正前)
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	UserDetailsServiceImpl userDetailsService;

    /** ～省略～ */

	@Bean
	PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}

	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		auth.userDetailsService(userDetailsService);
	}

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder());
    }
}
```

ググってSpringのログイン認証に関する記事を調べると、ほとんどのサイトで`configureGlobal`メソッド内でパスワードエンコーディング方式を設定する的なことが書かれていました。
参考にしてるサイトに書いてある通りにしてるのになんでや！？と思っていたら、
どうやら`configure`メソッドでの設定で上書きされていたようです。

1. configureGlobalメソッドで設定
2. configureメソッドで設定

という処理順だったようです。
あまり細かく理解できていないので、Springのライフサイクルをちゃんと知るべきだと思いました。


```java:WebSecurityConfig.java(修正後)
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	UserDetailsServiceImpl userDetailsService;

    /** ～省略～ */

	@Bean
	PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}

    /** ～configureメソッドを削除～ */

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder());
    }
}
```
[tensorflow]tf.get_variable()で変数を参照する

tensorflowでL2正則化の導入のためにネットワークのパラメータを参照する必要があり，見事にハマったのでメモ．

# L2正則化
ここでいう正則化は，過学習を防ぐためにパラメータが発散するのを抑えること．
学習データにフィットするモデルを作る際に，なるべくシンプルなモデルを作った方が未知のデータに対応できる．逆に複雑すぎるモデルを作ると過学習を起こす．[ここ](https://datachemeng.com/overfitting/)とか見るとわかりやすいかも．

正則化は，損失関数の定義にパラメータそのものの大きさを加えれば実現できる．大きさにパラメータの絶対値を用いるものをL1正則化，2乗の値を用いるものをL2正則化と呼ぶ．

# ネットワークのパラメータを参照する
正則化を実現するためには，損失関数の定義式の中からネットワークのパラメータを取ってくる必要があるが，変数名をそのまま指定してもダメらしい．

以下のようにmy_CNNクラスとTrainクラスを定義したとして，

```python
class my_CNN:
  with tf.variable_scope("conv1", reuse=False):
    filter1 = tf.get_variable("weights", shape=[28, 28])

class Train:
  self.cnn = my_CNN()
  def loss(self):
    tf.nn.l2_loss(ここでfilter1を取ってきたい)
```

my_CNNクラスで定義したfilter(最適化するパラメータ)を，Trainクラスのlossから参照したい場合，単に`tf.nn.l2_loss(self.cnn.filter1)`とやっても取ってこれない．

# tf.get_variable()を使う
tf.get_variable()は引数にnameを取り，そのnameの変数が既に存在する場合はそれを返し，存在しない場合は新しく作る．
ただし既に存在する変数を取ってきたい場合は，tf.get_variable()するscopeで`reuse=True`とする必要がある．
今回は，my_CNNの中で宣言するときは`reuse=False`,Trainの中で宣言するときは`reuse=True`とすると参照できる．

```python
class my_CNN:
  with tf.variable_scope('conv1', reuse=False):
    filter1 = tf.get_variable("weights", shape=[28, 28])

class Train:
  self.cnn = my_CNN()
  def loss(self):
    with tf.variable_scope('conv1', reuse=True):
      got_variable = tf.get_variable("weights", shape=[28, 28])
    tf.nn.l2_loss(got_variable)
```
Unibo から Slack にメッセージを投稿してみた

## はじめに
会社で [Unibo](https://www.unirobot.com/) を使って何かしてみようということで、どうやって活用するか考えた結果、Slack から Unibo を使えるようにしてみよう！という話になりました。
まずは Unibo から Slack にメッセージを投稿してみました。
![cloudfunding-396x296.jpg](https://qiita-image-store.s3.amazonaws.com/0/311982/a497880f-2618-a091-d408-539137f5b2a9.jpeg)


## 準備するもの
- Unibo
- skillcreator
- Slack

## やってみたこと
「こんにちは」と話しかけると、Slack に「こんにちは」と投稿されるようにしてみます。

######1.「聞く」ノード
　<img width="112" alt="「聞く」ノード.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/311982/dd45a77b-e565-1c6b-91b9-1947709b7269.png">
　「聞く」ノードには「こんにちは」を記入。
　<img width="299" alt="「聞く」ノード中身.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/311982/144181ef-99a0-21c2-4902-158989626dc9.png">

######2.「関数」ノード
　<img width="91" alt="「関数」ノード.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/311982/7581f2a2-ca1d-15e1-6db2-b27d82be6565.png">
　Slackに投稿するデータを msg に格納します。
　<img width="299" alt="「関数」ノード中身.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/311982/46433f4c-b893-ef54-dd6e-d20604047b64.png">

```js
msg.headers = {
    "content-type": "application/json",
    "Authorization": "Bearer xxxx"
};
msg.payload = {
    "channel": "CDVSKQUAZ",
    "text": "こんにちは"
};
return msg;
```
######3.「http request」ノード
　<img width="94" alt="「http request」ノード.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/311982/dfcbdc50-eb55-9ed8-029e-c0cf558c7674.png">
　Slack に WebAPI を使ってデータを送信する。
　<img width="307" alt="「http request」ノード中身.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/311982/aeff3c42-2dbd-7662-c290-05797496783f.png">

######4. 結果をデバッグコンソールに表示する
　<img width="85" alt="「デバッグ」ノード.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/311982/4501f9e5-4a23-352a-89ed-6dbb252104b3.png">
　<img width="303" alt="「デバッグ」ノード中身.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/311982/fd13613f-4035-fff1-c4eb-a5233c13fccc.png">

######5. これらを順番に繋ぐ
　<img width="478" alt="こんにちはを投稿する処理.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/311982/ade8e4c6-2888-6889-f833-911f30d880df.png">


######できました！:clap_tone2:
Unibo に「こんにちは」と声をかけると以下のように投稿されました。
　<img width="167" alt="こんにちは.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/311982/ae1b50d7-3553-c69b-ea25-0ff0b0ac1c71.png">


##実際にやってみて
skillcreator の使い方があまり分かっていない状態でしたが、実際に使いながら学習できていると思います。他のノードもどんどん試してみたいです！
Slack に投稿するデータを msg に格納する方法と Slack に WebAPI を使ってデータを送信する方法は、会社の先輩に教えてもらいました。（先輩の記事は:point_right_tone2:[こちら](https://qiita.com/s-suefusa/items/86b5eab5c9d9d84e054c)）
Rubyにおけるcallable

多くの言語に、コールバックとして作り付けの仕組みがありますが、Rubyの場合は一味違う見方ができるかもしれません。

## 他言語におけるコールバック

多くの言語に、ある処理から別なコードを呼び出すための仕組みがあります。

### C言語

C言語の場合は関数あるいは関数ポインタを使うことになりますが、規格外の手段を使わない限り、動的に関数を生成することはできません。

### C++

C++の場合、`operator()`を備えたオブジェクトも、関数と同様の構文で呼び出すことができます。そして、関数と関数オブジェクトを統一的に扱う、`std::function`のような仕組みもあります。

### JavaScript

ホストオブジェクトという例外を除けば、`()`を付けて呼び出せるオブジェクトは`Function`オブジェクトです。`this`が分離すると意味が変わってしまうことがあるのが要注意かもしれません。

### PHP

PHPの場合、コールバックとして`'strlen'`のようなグローバル関数名の文字列や、`[$object, 'method']`のような配列、そして`Closure`という無名関数のインスタンスを渡せます。渡せるものが多岐にわたるので、`is_callable`というチェック専用の関数まであります。

## Rubyの文法的な事情

Rubyの場合、上に挙げた4つの言語とは違って、オブジェクトから遊離して呼べる「関数」というものは存在しません。また、`operator()`のようなものもなく、関数として呼び出し可能なオブジェクトも作れません。

```rb:こんな書き方はできない
foo = some_object.some_method(:some_parameter)

# 直接()を付けられるオブジェクトはない
foo(42)
```

Rubyでコールバックとして使うものとして「ブロック」がありますが、これもメソッドに指定するしかなくて、単体で変数に代入することはできません。

### 特定のメソッドを呼ぶ形のコールバック

以前[Railsのコールバックについて自分が書いた中でも触れました](https://qiita.com/jkr_2255/items/4dddb731d5166e0bc7e3#%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)が、Railsのダックタイピングを活かした「この名前のメソッドを呼ぶ」という形のコールバックもあります。インスタンスでも、クラスやモジュールでも、そのメソッドに応答するなら何でも置くことができます。

### `Proc`や`Method`

ブロックは直接オブジェクト化できませんが、`Kernel.#proc`を使うことで、`Proc`というクラスのオブジェクトに変換することができます（もっとも、周囲の環境と全く独立なコード片を作りたい場合、`Kernel.#lambda`を使ったほうがいいかもしれません）。また、メソッドも`Method`というオブジェクトを抽出可能です。どちらも、ブロックの中身やメソッドを実行したい場合には、`.call`というメソッドを使います。

### デファクトとしての`.call`

もちろん、`.call`も単なる1メソッドのはずですが、Rubyの世界では特殊な地位があります。

* `foo.call(arg)`を、`foo.(arg)`のように略記できます（もっとも、読みづらいのであまりおすすめはしません）
* Railsでも使っているRackは、「`.call`を呼べば要素が3つの配列を返す」ものを、Rack middlewareとして扱います。

というように、「何かしら呼び出すもの」を作りたい場合、`.call`を呼ぶ形で作っておけば、直接`lambda`なども渡せて便利ですので、ダックタイピング的に`.call`を見る、というようなハンドリングもいいかなと思いました。
Golang glide up の時にエラーが出た場合の対処法　[ERROR] Failed to do initial checkout of config: Unable to retrieve checked out version: exit status 128

Golangを扱っていると、その時々で　glide.yaml にpackageを追加する場面が出てきます。

通常通り yaml に追記後、

```
- package: github.plaid.com/plaid/go-plogger-client
  version: 6d7a49971a9273ca885599004f850b4a6486010c
  repo: git@github.plaid.com:plaid/go-plogger-client.git
  vcs: git
```

glide upします

```
$ glide up
```
すると下記エラーが発生

```
[ERROR] Failed to do initial checkout of config: Unable to retrieve checked out version: exit status 128
```
-check1: yamlの書き方は正しい事を確認
-check2: package元は存在している

など、とにかく自分自身の設定がおかしくない場合
glideのcacheをクリアしてみるとよい。
状況にもよりますが、私はこれで解決しました。

```
$ glide cache-clear
```
※　yamlに"package"の他に、"repo"もしくは"version"を指定した場合に、なんらかの都合で1度失敗するとcacheに何かを抱え込むっポイ。その場合にclearしなければ、どはまりします。

参考元URL
https://github.com/Masterminds/glide/issues/732

https://github.com/Masterminds/glide/issues/316
FixedMidashiでスクロールすると微妙にヘッダ列の幅がずれて困ったときに確認すること

CSSの何処かでbox-sizingを指定していないでしょうか？

例えばBootstrapで

``` 
* {
   box-sizing: border-box;
}
```
ってなってるとか。


ライブラリ中で、いろんな幅を取得しstyleでwidthを指定して別DOMで描画するみたいなことをやっていると思われるので、もし上記の状態であれば、単純にbox-sizing指定を解除するだけで解決するかもしれません



``` my.css
.scroll_div{
  box-sizing: initial;
}
```

``` 本家の使用方法.html
<body onLoad="FixedMidashi.create();">
  <div class="scroll_div">
    <table _fixedhead="rows:1; cols:2">
      ...
```
（http://hp.vector.co.jp/authors/VA056612/fixed_midashi/manual/index.html より引用）
golangでGoogle Cloud StorageへのUploadからBigQueryへLoadする

#golangでGoogle Cloud StorageへのUploadからBigQueryへLoadする

##GCP認証
```go
func Auth() error {
	// 環境変数にセットしたGoogleApplicationCredentialsを指定
	fn := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")
	b, err := ioutil.ReadFile(fn)
	if err != nil {
		return err
	}
	_, err = google.JWTConfigFromJSON(b)
	if err != nil {
		return err
	}
	return nil
}
```

##CloudStorege Upload
```go
func GcsPut(bktName string, objName string, path string) error {

	err := Auth()
	if err != nil {
		return err
	}

	ctx := context.Background()

	// Creates a client.
	client, err := storage.NewClient(ctx)
	if err != nil {
		return err
	}
	defer client.Close()

	w := client.Bucket(bktName).Object(objName).NewWriter(ctx)
	// option
	w.ObjectAttrs.ContentType = "application/octet-stream"
	w.ChunkSize = 1024

	defer w.Close()

	f, err := os.Open(path)
	if err != nil {
		return err
	}

	defer f.Close()
	if _, err = io.Copy(w, f); err != nil {
		log.Fatal(err)
	}

	return nil
}
```
|ContentType|ChunkSize|
|---|---|
|型：String<br />ContentTypeを指定します。|型：Int<br />指定したサイズを上限にオブジェクトを分割してアップロードする指定。<br />1回のリクエストでアップしたい場合はCunkSizeを指定。<br />上限を指定しない場合は０または無指定。|
[オプションの詳細はこちら﻿](https://godoc.org/cloud.google.com/go/storage)

##BigQuery Load
```go
func BigQueryLoad(config Config, gcspath string, tableid string) error {

	err := Auth()
	if err != nil {
		return err
	}

	projectid := config.BigQuery.Projectid
	gcsuri := config.BigQuery.Gcsuri + gcspath
	datasetid := config.BigQuery.Datasetid

	ctx := context.Background()

	// Creates a client.
	client, err := bigquery.NewClient(ctx, projectid)
	if err != nil {
		return err
	}

	gcsRef := bigquery.NewGCSReference(gcsuri)

	// option
	gcsRef.AllowJaggedRows = true
	gcsRef.Compression = bigquery.Gzip
	gcsRef.MaxBadRecords = 1000
	gcsRef.FieldDelimiter = "n"

	schema := bigquery.Schema{
		&bigquery.FieldSchema{Name: "col1", Required: true, Type: bigquery.IntegerFieldType},
		&bigquery.FieldSchema{Name: "col2", Required: false, Type: bigquery.StringFieldType},
		&bigquery.FieldSchema{Name: "col3", Required: true, Type: bigquery.StringFieldType},
	}

	dataset := client.Dataset(datasetid)

	err = dataset.Table(tableid).Create(ctx, &bigquery.TableMetadata{
		Schema: schema,
	})
	if err != nil {
		return err
	}

	loader := dataset.Table(tableid).LoaderFrom(gcsRef)
	loader.CreateDisposition = bigquery.CreateNever

	job, err := loader.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	return nil
}
```
|AllowJaggedRows|MaxBadRecords|Compression|FileDelimiter|
|---|---|---|---|
|型：bool<br />不正なレコードがあった場合、NULLとして扱うかエラーとして扱うかを選択します。|型：Int<br />不正なレコード数を許容するレコード数を指定します。|型：String<br />Google Cloud StorageにuploadされたLoadするObjectの圧縮タイプを指定します。|型：String<br />Loadされるファイルのdelimiterを指定します。|
[オプションの詳細はこちら﻿](https://godoc.org/cloud.google.com/go/storage)
圧縮されたファイルをLoadをする場合はCompression、CSV形式ではないファイルをLoadする場合はFileDelimiterを指定しましょう。
5分でtsungを使った超シンプルな負荷試験環境を用意する

# できあがるもの
- 単一エンドポイントに対して、ただひたすらリクエストを投げまくるようなシンプルな負荷試験環境
- 負荷はクライアント側のインスタンスを増やせば結構どんどん増やせる(15,000qpsまでは確認済)
- シナリオがー とか、計測のUIがー とか、料金がー とかは全く考えず、サクッと作ってサクッと試すためのもの

# 環境
- GCP(AWSでもいけるはず)
- クライアント(GCE) -> サーバー(GAE) の単一のendpointに対してリクエスト
- GCEのOSはCentOS7

# やることを3行で
- 1. instanceを起動
- 2. tsungをインストール
- 3. 設定ファイルを用意&&実行

# 手順 

## 1. instanceを用意
- サーバーとなるGAEと同じリージョンでGCEのinstanceを起動させます
  - machine_typeはmicroとかでだいじょぶ
  - OSはCent7の前提ですすめる

## 2. tsungをインストール
- tsungってなに?
  - Erlang性の負荷試験ツール -> [tsung](https://github.com/processone/tsung)
- 起動したインスタンスにログインしてrootになってyum installでおｋ

```shell

# ログイン
sudo su - 
yum install tsung
```

## 3. 設定ファイルを用意して実行

### 設定ファイルの作成
- root直下に設定ファイル setting.xml を作成
- この設定で秒間4000 - 5000qpsくらいリクエストが1時間ほど飛びます
- 詳しい設定内容は -> [tsung.config](http://tsung.erlang-projects.org/user_manual/conf-file.html)

```shell:setting.xml
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">

<clients>
  <client host='localhost' maxusers="1000000" use_controller_vm="true"/>
</clients>

<servers>
  <server host="myproject.appspot.com" port="443" type="ssl"/>
</servers>


<load>
  <arrivalphase phase="1" duration="60" unit="minute">
    <users maxnumber="10000000" arrivalrate="10" unit="second"/>
  </arrivalphase>
</load>

<sessions>
  <session probability="100" name="http-test" type="ts_http">
    <for from="1" to="1000" incr="1">
      <request subst="true">
    <http url="/some_path?param1=aaa&amp;param2=iii" method="GET" version="1.1" />
      </request>
    </for>
  </session>
</sessions>

</tsung>
```

### tsungを実行

```shell

tsung -f setting.xml -l log start
```

以上。試験が終わったら立てたインスタンスは停止しましょう。

# 補足
- 負荷を増やしたければクライアントとなるインスタンスを増やしていきましょう
  - 4インスタンスで15,000qpsになりました
- クライアント側のログはroot直下の `log/YYYYMMdd-HHDD/tsung.log`に吐かれます

- 10秒毎にログが吐かれるので例えば以下のようにtailすると10秒ごとのリクエスト数がわかったりします

```shell

tail -f log/20181030-0918/tsung.log | grep request
```

- 動的にクエリパラメータを変えたりもできます
  - user & request_countをパラメータに指定してリクエストを送りたかったので以下のようにしました
  - `％％hoge:fuga％％` で囲ってライブラリ変数を指定すると出力できるようです
  - 詳しく -> [Advanced Features](http://tsung.erlang-projects.org/user_manual/conf-advanced-features.html)
 
```shell:setting.xmlのsessionの部分

<sessions>
  <session probability="100" name="http-test" type="ts_http">
  <for from="1" to="1000" incr="1" var="counter">
    <request subst="true">
      <http url="/some_path?user=%%ts_user_server:get_unique_id%%&amp;counter=%%_counter%%" method="GET" version="1.1" />
    </request>
  </for>
  </session>
</sessions>

```

# 参考
- [Macとtsungで手軽に数千~数万req/sのHTTP負荷テスト](https://qiita.com/kurebio/items/2eac819962f7886bae4a)
Phoenix 1.3 で ESpecを書く時にハマった

# はじめに
タイトルのとおり， Phoenix 1.3 で ESpecをかいていて， `Router.Helpers` まわりのエラーに遭遇したので残しておく。

ESpecの導入だとかは割愛する。

## 環境
- Elixir 1.7.4
- Phoenix 1.3.4
- ESpec 1.6.3
- ESpec.Phoenix 0.6.10

## 内容
ESpec実行時に，以下のようなコンパイルエラーになる。

```
** (CompileError) spec/controllers/v1/sessions_controller_spec.exs:2: module AppEx.Router.Helpers is not loaded and could not be found
```

もう1つ実行時に，
`module AppEx.Endpoint is not available` が発生する。

どうやら，Phoenix 1.2 -> 1.3 の変更が影響しているようだ。

## 解決方法
コンパイルエラーは， `espec_phoenix_extend.ex` の，`import AppEx.Router.Helpers`を，
`import AppExWeb.Router.Helpers` とすれば解決する。

`module AppEx.Endpoint is not available` に関しては，`@endpoint AppEx.Endpoint`　を，
`@endpoint AppExWeb.Endpoint` に変更すれば解決する。



具体的にはESpec.Phoenixのissue [#48](https://github.com/antonmi/espec_phoenix/issues/48) を参照するとよい。


## おわり
それではみなさん良いBDDライフを！
[ASP .NET MVC 5] ValidationメッセージLocaleを変えたい/多言語化

### 基本

Resourceファイルを言語ごとに分けたい場合、ResourceをCultureInfoごとに作っておき、CurrentCulture の設定で切り替えればよい。

Resources
├─ Messages.en.resx
└─ Messages.resx

```
CultureInfo culture = CultureInfo.CreateSpecificCulture("en");
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
```

### よくある間違い

ActionFilterに上記処理を記述し、リクエストによってメッセージの切替をする。
通常のRazor(CSHTML)のメッセージの切替は正常に動作するが、ActionFilterより前に実行されるModelValidationのメッセージは切り替えられない。

```
    public class LangActionAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //言語設定
            string lang = AuthorizationUtil.GetAuthData()?.Lang ?? Const.DEFAULT_LANG;
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
            return base.BeginExecute(requestContext, callback, state);
        }
    }
```

### 対応

ModelValidationよりも前で実施する。

```

    public abstract class BaseController : Controller
    {
        protected override IAsyncResult BeginExecute(RequestContext requestContext, AsyncCallback callback, object state)
        {
            //言語設定
            string lang = AuthorizationUtil.GetAuthData()?.Lang ?? Const.DEFAULT_LANG;
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
            return base.BeginExecute(requestContext, callback, state);
        }
    }

```

参考：
https://afana.me/archive/2011/01/14/aspnet-mvc-internationalization.aspx/
https://stackoverflow.com/questions/24060184/how-to-set-culture-as-globally-in-mvc5
Laravel & Docker 環境構築


## はじめに
LaravelをDockerで動かせるようにしたので、
環境構築の参考になればと思います。

Laradockを使えばラクにできますが、あえて使わないで、
docker-compose.yml、Dockerfileで動くようにしました。

## Docker インストール
公式から Docker for Mac をインストール。
https://docs.docker.com/docker-for-mac/install/

## docker-compose.ymlの作成
```
version: '3'
services:
    nginx:
        build:
            context: ./docker/nginx
        depends_on:
            - php
        ports:
            - 8088:80
        volumes:
            - ./:/var/www/html

    php:
        build:
            context: ./docker/php
        environment:
            DB_HOST: mysql
        volumes:
            - ./:/var/www/html

    mysql:
        image: mysql:5.7
        volumes:
            - ./docker/mysql:/var/lib/mysql
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_USER=sample
            - MYSQL_PASSWORD=sample
            - MYSQL_DATABASE=sample
        ports:
            - 3306:3306
           
```

見ればわかるようにプロジェクトルートを/var/www/htmlとして設定している。
コンテナ側では基本的に/var/www/htmlに入るようになっていてそれを公開する形になっている。

またこの設定ファイルにあるように、docker-composeで使用するコンテナの設定ファイル群は./dockerディレクトリ以下にある。

PHPのDockerfileは以下の通り

### phpのDockerfile
`docker/php/Dockerfile`

```
FROM php:7.2.8-fpm
COPY php.ini /usr/local/etc/php/

# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

WORKDIR /var/www/html
```

`docker/php/php.ini`

```
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

## Nginxの設定
`docker/nginx/Dockerfile`

```
FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/default.conf
```

`docker/nginx/default.conf`

```
server {
    
    listen 80;
    server_name _;

    root /var/www/html/public;
    index index.php;

    access_log /var/www/html/docker/nginx/logs/access.log;
    error_log  /var/www/html/docker/nginx/logs/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;    
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
        
}
```

諸々のパスはコンテナ側に準拠している。
そして一番重要なのがrootを設定すること。

Laravelではpublicディレクトリ以下のindex.phpにアクセスが飛ぶためここをrootに設定する。


## 環境を立ち上げる
```
ログファイルを格納するディレクトリを作る
mkdir docker/nginx/logs

MySQLで使用するディレクトリを作る
mkdir docker/mysql

githubで管理した時にignoreされたファイルをなかったら作る
echo '' >> storage/logs/laravel.log

権限を与える
sudo chmod 777 .storage/ .bootstrap/

composer install

Laravel
cp .env.example .env
php artisan key:generate

docker-compose up -d
```
今からにおすすめな言語

今から勉強するのにいい言語を個人的に書いていきたいと思います。
正しくない記述もあるかもしれませんので、ご指摘頂けると幸いです。

# Python
動的型付けの汎用スクリプト言語です。
ちょっとしたスクリプトからWebサーバーなど色々なことが記述できます。
コンパイルが不要なので手軽なのも魅力の一つです。

最大の強みは、科学計算系や機械学習系のライブラリがかなり豊富な点です。
NumPyやTensorFlow、Kerasなど色々な種類があるので、ちょっと試してみるという使い方から真面目に機械学習に取り組むという使い方までできます。

Pythonは2系と3系がありますが、今から始めるなら3系からにすると良いです。

# Kotlin
静的型付けの汎用言語です。
ベータ版なども含むとJVM, JS, Nativeと大体の環境用にコンパイルができます。
言語も新しい機能も取り入れつつ、昔ながらの書き方もできる丁度いいものになっていると思います。
Androidで開発するなら確実にJavaよりKotlinを使うべきでしょう。

強みはバランスの良さかなと思います。
先進的すぎず古典的すぎない言語仕様でプログラミングをしてきた人に使いやすく、IntelliJ IDEAのような強力な開発環境で初心者でもある程度使えるようになっていることは非常強いでしょう。

# TypeScript
AltJSの一つでJavaScriptのコードを生成できます。
静的型システムを持つため型にまつわるエラーをある程度潰すことができます。
AngularはTypeScriptを採用していますし、他のフレームワークでも対応しているものは多いです。

強みは、JavaScriptに似ていることだと思います。
TypeScriptはECMAScript 2015のスーパーセットなのでJavaScriptの開発者にも使いやすく作られているように思います。JavaScriptに慣れ親しんでいる開発者も少ないコストで習得できることはかなりの強みでしょう。

# Haskell
静的型付けの関数型言語です。
関数型言語は考え方として重要なものであると思います。
一度触っておくだけでも得られるものがあると思います。

# C++
静的型付けの汎用言語です。
最初に言っておくと**プログラミング初心者が最初にやる言語としては全くおすすめしません**。最初に別の言語をやってプログラミングに慣れてからCをやって、ある程度書けるようになったあとに勉強し始める言語だと思います。

C++11以降であれば、使いやすい機能も増え最近の言語らしさが出てきました。2018年現在の最新はC++17ですが色々な機能追加や機能の改善が行われ楽にコードを書くこともできるようになってきたと思います。

歴史ある言語ですが、ただの古臭い言語ではないので使ってみてください。

# まとめ
個人的オシはPythonとKotlinですが、バランスを考えると他の考え方を持つ言語もやってみるほうが良いでしょう。
いろんな言語を触ってさらにパワーアップしてください。
eclipseインストール時にエラーが出る

以下のようなエラーが出る。

ERROR: org.eclipse.equinox.p2.repository code=0 An error occurred while downloading http://download.eclipse.org/technology/epp/packages/neon/content.xml.xz. 

原因はダウンロードしたブラウザの下部に表示されたアイコンをそのままクリックしたため。
保存先のフォルダから起動すればOK

引用元
https://www.eclipse.org/forums/index.php/t/1086672/
TypescriptのPickキーワード

#今日、暇だから。小さいことを共有したいんです。
（外国人だから、間違った言葉があれば申し訳ございません。投稿の下にコメントください）
Typescript 2.1バージョンから「Pick」キーワードを提供されます
##Pickとは
以下のサンプルを見てください。
<p>型を定義します:</p>

```typescript
export interface User {
  id: string;
  username: string;
  password: int;
  address: string;
  phoneNumber: string;
}
```

以上のソースコードはユーザーの型ですが。
Create機能を使うとき

```typescript
createUser(user: User) {
  let user: User = {
    id: user.id,
    username: user.username,
    password: user.password,
    address: user.address,
    phoneNumber: user.phoneNumber,
  }
  insertUser(user); // この関数は他のファイルで定義されます。でも。機能はデータベースにユーザーを挿入します
}
```
以上のように正常に動作できます。
ですが、私の経験はデータベースに挿入するとき、id項目は自動作成されます。
それで以下のようにやります：

```typescript
createUser(user: User) {
  let user: any = {
    username: user.username,
    password: user.password,
    address: user.address,
    phoneNumber: user.phoneNumber,
  }
  insertUser(user); // この関数は他のファイルで定義されます。でも。機能はデータベースにユーザーを挿入します
}
```
User型の代わりにanyです。
例えば、anyタイプを使用しない場合。どうすればいいでしょうか。
この場合はPickを使用します。

```typescript
type CreateUserType = Pick<User, 'username' | 'password' | 'address' | 'phoneNumber'>;
```

CreateUserTypeを使用するとき、他の人はソースコードがわかりやすいです。簡単なメンテナンスできると思います。
###まとめ
Pickというキーワードは便利だね。機会があれば是非、やってみてください
最後まで読みいただきありがとうございます。
間違っているところがあれば直接教えてください。幸いです
ドメインオブジェクトを中心としたClean Architecture のためのレイヤー構成

ドメインオブジェクトを中心とした[Clean Architecture](https://amzn.to/2Qo1GlZ)は、どういうレイヤー構成にするとよいか、簡単にまとめてみた。

# イメージ

たぶん、こんな感じになるはず。通常は円状に表現するが、わかりにくいので層状に書いてみた。

![](https://qiita-image-store.s3.amazonaws.com/0/8329/4a0fb837-19c7-7839-3bfb-579ba7336cb6.png)

# レイヤー構成

赤い部分の層は、直接依存の方向が上から下です。グレー部分の層は、契約だけが定義された独立した層で、ユースケース層やインターフェイス層から依存できるものとします。

- インターフェイス（アダプタ）層
    - 内外とのデータ形式の変換が主な役割
    - コントローラ、プレゼンター（内部から外部へデータ形式を変換する責務）,ゲートウェイ(外部と通信する責務。DBやRPC)
- ユースケース層
    - アプリーケーション層ともいう
    - アプリケーション固有のビジネスルールをカプセル化する
- ドメイン層
    - [Clean Architecture](https://amzn.to/2Qo1GlZ)本では、中心にはエンティティとだけ書かれているが、DDDでは中心はドメイン層になる
    - ドメインモデルを表現した実装
- 契約層(契約だけを表現した型を配置)
    - ⚠️こういう層を定義するというのは[Clean Architecture](https://amzn.to/2Qo1GlZ)にはない、アイデアです。
    - Input Port, Output Port, DTO
    - リポジトリ
    - DAO, Record
 
# DIによるオブジェクトグラフの構築

- コントローラに対してDIするオブジェクト
    - ユースケース
    - プレゼンター
- ユースケースに対してDIするオブジェクト
    - リポジトリ
    - DAO(CQRSのリード責務なら)

# インフラストラクチャ層はどこに行った？

インフラストラクチャ層は、要件が変化しても依存し続ける層。すべての層が依存できる汎用的な技術基盤(言語を拡張するような実装が提供されることが多い)。Clean Architectureでも導入できる。インターフェイス層とごっちゃにしないこと。

# 所感

- 永続化に関する層が上位に配置される以外は、伝統的なレイヤー化アーキテクチャと基本的に差がないと考えてよい。あとは、Input Port, Output Portが仰々しく見えるだけ。
- [Clean Architecture](https://amzn.to/2Qo1GlZ)本によると、Input PortとOutput Portはバウンダリの抽象っぽい。バウンダリだけに限らず、永続化に関するInput Port, Output Portの概念があってもよい気がするが、用語の使い方は[Clean Architecture](https://amzn.to/2Qo1GlZ)本に合わせておいた。
- インターフェイス層からユースケースの実装を直接呼べてしまうので、Input Portの抽象がどこまで必要かわからない。そもそも抽象がなくてもいいのではないか。Output Portは間接依存のために必要。コールバックとして抽象化する方法もあるし、単にプレゼンターのインターフェイスだけを定義する方法もある。
- 集約は本来ライフサイクルのためのパターンの一つなので、インターフェイス層ではないか説がある。集約にも契約と実装に分離し、実装はインターフェイス層に配置した方がいいかもしれない。
ラムダ式でプロパティ名を取得する

`Expression<Func<TEntity, object>> expression`を使う。
プロパティ名を取得できれば、ASP .NET MVC のHTMLヘルパ作りなどが捗る。

Expressionの使い方は、詳しい資料を別途参考にしてください。

``` ExpressionExtentions.cs
    public static class ExpressionExtentions
    {
        /// <summary>
        /// MemberExpressionへの変換(string以外の型に対応するため)
        /// </summary>
        /// <param name="expression"></param>
        /// <returns></returns>
        public static MemberExpression ToMemberExpression(LambdaExpression expression)
        {
            var memberExpression = expression.Body as MemberExpression;
            if (memberExpression != null) return memberExpression;
            var unaryExpression = expression.Body as UnaryExpression;
            if (unaryExpression != null) return unaryExpression.Operand as MemberExpression;
            return memberExpression;
        }


        /// <summary>
        /// プロパティ名を取得する
        /// </summary>
        /// <param name="expression"></param>
        /// <param name="names"></param>
        /// <returns></returns>
        public static IEnumerable<string> GetPropertyNames(this LambdaExpression expression)
        {
            return GetPropertyNames(ToMemberExpression(expression));
        }

        /// <summary>
        /// プロパティ名を取得する(再帰で取得)
        /// </summary>
        /// <param name="memberExpression"></param>
        /// <param name="names"></param>
        /// <returns></returns>
        public static IEnumerable<string> GetPropertyNames(MemberExpression memberExpression, IList<string> names = null)
        {
            if (names == null)
            {
                names = new List<string>();
            }
            if (memberExpression.Expression is MemberExpression)
            {
                GetPropertyNames(memberExpression.Expression as MemberExpression, names);
            }
            names.Add(memberExpression.Member.Name);
            return names;
        }
    }
```

使い方

``` HtmlHelper.cs
        public static MvcHtmlString ImageLinkFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
        {
            var propertyNames = expression.GetPropertyNames();
/*色々処理*/
        }
```

``` Index.cshtml

@Html.ImageLinkFor(x=>x.Image)

```
High Sierra / Mojave で  OpenGL を使用する際の ld warning について


Xcode10以降の Mojave, HighSierraにおいて、OpenGL, GLUTを用いたC++ファイルのコンパイルを行うと以下のような警告がされます。なお、コンパイル自体は成功するので無視できますが、せっかくなので全て修正しましょう。

（はじめての記事なので見づらいところ・知識不足などご容赦ください…！笑）

```
$ g++ -framework OpenGL -framework GLUT -framework Foundation hoge.cpp -Wno-deprecated
ld: warning: text-based stub file /System/Library/Frameworks//OpenGL.framework/OpenGL.tbd and library file /System/Library/Frameworks//OpenGL.framework/OpenGL are out of sync. Falling back to library file for linking.
ld: warning: text-based stub file /System/Library/Frameworks//GLUT.framework/GLUT.tbd and library file /System/Library/Frameworks//GLUT.framework/GLUT are out of sync. Falling back to library file for linking.
ld: warning: text-based stub file /System/Library/Frameworks//Foundation.framework/Foundation.tbd and library file /System/Library/Frameworks//Foundation.framework/Foundation are out of sync. Falling back to library file for linking.
ld: warning: text-based stub file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.tbd and library file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib are out of sync. Falling back to library file for linking.
ld: warning: text-based stub file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.tbd and library file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib are out of sync. Falling back to library file for linking.
```

# シンボリックリンクを作成

warningの表示では`/System/Library/Frameworks/*.framework`が見つからないという表示ですが、実際に読み込まれているのは`/Library/Frameworks/*.framework`のようです。
`$ ls -la /Library/Frameworks/`で見るとおそらくOpenGL.frameworkやGLUT.frameworkは見当たらないはずです。

そこで、以下のコマンドでシンボリックリンクを作成します。

```
$ sudo ln -s -i /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework /Library/Frameworks
$ sudo ln -s -i /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/GLUT.framework /Library/Frameworks
$ sudo ln -s -i /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework /Library/Frameworks
```

ここで一度コンパイルしてみると…

```
$ g++ -framework OpenGL -framework GLUT -framework Foundation hoge.cpp -Wno-deprecated
ld: warning: text-based stub file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.tbd and library file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib are out of sync. Falling back to library file for linking.
ld: warning: text-based stub file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.tbd and library file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib are out of sync. Falling back to library file for linking.
```

warningが5つから2つに減っていますね。

# 残りのwarningについて
残りの２つについては力尽きました。何か分かる方、情報提供していただけると助かります。

# 参考
[Odd ld warning from rstudio - stack overflow](https://stackoverflow.com/questions/52804295/odd-ld-warning-from-rstudio/53111824#53111824)
IEで背景画像が重なってしまうバグ

# 現象

```
background: repeat-x　url('img/xxx.png');
```
透過pngを並べると、端と端が若干重なってしまう

▼実際のバグ例（IEで閲覧してください）
http://laplace-movie.jp/
→　霧の画像が重なってしまい、薄い四角ができてしまっている

# 解決策

画像の縦横比を1:1（正方形）にする
Vue + Jest のテストを WebStorm から実行する設定

メモ書き的ではありますが、WebStorm で既存の Vue プロジェクトの テストを Jest から実行する際に少し設定が必要なことを忘れていたので記します。

Run => Edit Configration

すると以下のように Jest という大項目と、Templates という大項目の中にある Jest がみつかります。

![Screen Shot 2018-11-07 at 16.45.46.png](https://qiita-image-store.s3.amazonaws.com/0/240885/a53e44a1-0c6b-ef15-3211-106c4c661215.png)

まずは、今までうまくいない状況であれば、大項目 Jest の中にある設定を `-` ボタンを押して消してしまいます。(この画像であれば ChartUtils というものですね。これを消します。)

その後、Templates の中から Jest を選択します。

一番上にある Configuration file という選択項目から、同プロジェクト内の jest.conf.js を選択します。

あとは Jest Package も指定がなければ同プロジェクト内のものを指定します。

これで Jest の設定が正常に読み込まれるので、テストを実行できるようになります。
Node.jsのMySQLでAsync/Awaitしたらプロセスが終わらない

Node.jsのMySQLでAsync/Awaitしたら、データの取得はうまくいったけどプロセスがいつもまで経っても終わらなかったのでメモ。

Node.jsのMySQLでAsync/Awaitについてはこちらの記事を参考にさせていただきました。
[Node.jsのMySQLでAsync/Awaitする方法](https://qiita.com/reon777/items/d3781e40ba518a6544f8)


# プロセスが終わらないコード

```js
const mysql = require('mysql');
const util = require('util');


// 取得
async function findRecord(id) {
  var pool = mysql.createPool({
    host: ' *** ',
    user: ' *** ',
    password: '***',
    database: ' *** ',
  })
  pool.query = util.promisify(pool.query)
  try {
    var records = await pool.query('SELECT * FROM xxxx WHERE id = ' + id);
    return records[0];
  } catch (err) {
    throw new Error(err)
  }
}


(async () => {
  const record = await findRecord(1);
  console.log(record);
})();
```

# なぜプロセスが終わらないのか

mysqlのコネクションが残ったままになっていると仮定し、コネクションを終了させたところ、解決しました。

# 完成したコード
```js
const mysql = require('mysql');
const util = require('util');


// 取得
async function findRecord(id) {
  var pool = mysql.createPool({
    host: ' *** ',
    user: ' *** ',
    password: '***',
    database: ' *** ',
  })
  pool.query = util.promisify(pool.query)
  try {
    var records = await pool.query('SELECT * FROM xxxx WHERE id = ' + id);
    pool.end();// ←これです
    return records[0];
  } catch (err) {
    throw new Error(err)
  }
}


(async () => {
  const record = await findRecord(id);
  console.log(record);
})();
```
VSCodeのキーボードショートカットのオススメ設定例

<img width="640" alt="VSCode.png" src="https://qiita-image-store.s3.amazonaws.com/0/26536/ee70b680-44b8-2758-4d77-c8e823e3754c.png">

（2020.7.10 追記；アップデート記事を投稿しました。
　→・[[2020年版]VSCodeオススメのカスタマイズ例](https://qiita.com/noanoa07/items/1d0af25f330edfc9558f) ）


Visual Studio Code のキーバインディングを以下のようにカスタマイズしたメモです。
（VSCode 1.28.2, macOS 10.13.6）

- コード補完の候補選択を「Tab」キーと「Shift+Tab」キーで上下に移動させる
- 「Tab」キーでカッコの外にカーソルを移動させる
- 「Shift+Tab」で Tabの挿入にする

今まで自分が使っていた Sublime Text 3 に合わせた変更です。
→・[Sublime Text 3 で使っているキーバインディングの設定](https://qiita.com/noanoa07/items/3a32ab2bc22da5ddb8be)

# キーボードショートカットの変更方法
メニュー＞「Code」 ＞「基本設定」＞「キーボードショートカット」
を選ぶと、一覧が出ます。
検索するなどして変更したい設定を見つけたら、その行の左側の鉛筆マークをクリック（または行をダブルクリック）して、新しいキーボードショートカットを押すだけです。
（元のDefault設定に戻したい時は、その行で右クリックして「キーバインドのリセット」を選ぶ。）

さらに詳細は、一覧の上の
`高度なカスタマイズを行うには、次を開いて編集: keybindings.json`
をクリックすることで自分の設定したjsonファイルを編集できます。

#キーボードショートカットの設定例

```keybindings.json
[
    {
        "key": "tab",
        "command": "selectNextSuggestion",
        "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"
    },
    {
        "key": "shift+tab",
        "command": "selectPrevSuggestion",
        "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"
    },
    {
        "key": "tab",
        "command": "cursorRight",
        "when": "!suggestWidgetMultipleSuggestions && !suggestWidgetVisible && textInputFocus"
    },
    {
        "key": "shift+tab",
        "command": "tab",
        "when": "!suggestWidgetMultipleSuggestions && !suggestWidgetVisible && editorTextFocus && !editorReadonly && !editorTabMovesFocus"
    },
    {
        "key": "tab",
        "command": "-tab",
        "when": "!suggestWidgetMultipleSuggestions && !suggestWidgetVisible && editorTextFocus && !editorReadonly && !editorTabMovesFocus"
    },
    
]
```

###注記
- "command": 行の "-（マイナス）" はその設定が実行されないことを示す
- "when": 行の "!" は否定を示す
- カスタマイズした設定が衝突することがあるので、適時 "when": 行の条件を設定すること

####参考
→・[キーバインディング - 非公式 Visual Studio Code Docsの日本語訳](https://vscode-doc-jp.github.io/docs/getstarted/keybindings.html)
→・[Visual Studio Code Key Bindings](https://code.visualstudio.com/docs/getstarted/keybindings)

　
（→・[元記事](http://blog.livedoor.jp/noanoa07/archives/2196964.html)）
ターミナルからSoXで音声ファイルのサンプルレートを変換する方法。

SoX は音声ファイルの編集に長けた、高度なコマンドラインツールです。

* [SoX](http://sox.sourceforge.net/)
* [SoXチートシート](https://qiita.com/moutend/items/50df1706db53cc07f105)

iTunes ではサンプルレートを 44100Hz  でないと iCroud ライブラリに追加できなかったので、コマンドラインでパパッと変換したくなったので、今回の Tips です。

Sox を homebrew でインストールします。

```bath
brew install sox 
```

実行します。

```
sox input.mp3 -r 44100 output.mp3
```

他にも、というか、あらゆる音声編集のコマンドが用意されている SoX はめちゃ強いなとおもいます。
[SoXチートシート](https://qiita.com/moutend/items/50df1706db53cc07f105) で、できることをひととおり確認できるので、SoX の恩恵にあずかっていきましょう＊
mysqlで見えない文字（空白文字など）が入っているのを確認する方法

「なにか表示はされない文字が入ってるんだけど、何が入ってるかわからない」ってときないですか？
今まさにそんな事態に陥ったので、HEX関数を使いました

```
（具体例）
select hex(comment) from reviews where id = 1
=> 0A
```

で、 `hex 0A` で検索したら、改行文字でした
Ruby on RailsをXserverで動かす

レンタルサーバーの中でも高速と噂のあるXserver。XserverではSSHができるのでRoRも動かせるだろと思ったら、皆さん意外と苦戦している様子。
私も結構苦労しましたが、出来た。
[記事はこちら](https://www.nijitei.com/it/run_ruby_on_rails_on_xserver_4/)
react-tooltipを使って、ReactでBootstrapっぽいツールチップを表示する

# 概要
ReactでBootstrapのTooltipが使えないので、[react-tooltip](https://www.npmjs.com/package/react-tooltip)を使ってbootstrapっぽいツールチップを表示してみました。
# 比較
#### bootstrap
![bootstrap.PNG](https://qiita-image-store.s3.amazonaws.com/0/87843/d84fae6e-7f9c-b852-c29a-b2c16f5bc839.png)
#### react-tooltip
![react_tooltip.PNG](https://qiita-image-store.s3.amazonaws.com/0/87843/35b8c942-2d48-76c0-eac3-468695a3a347.png)
# バージョン
> "react": "^16.4.0",
> "react-tooltip": "^3.9.0",

# 実行方法
> yarn add react-tooltip

```jsx:button.jsx
import React from 'react';
import ReactTooltip from 'react-tooltip';

const Button = props => (
  <button type="button" data-tip="一覧から選択">
    アイコン
    <ReactTooltip effect="solid" place="bottom" />
  </button>
);

export default Button;
```

デフォルトだと表示が`effect="float" place="top"`になっているので、`effect="solid" place="bottom"`に変更しています。
Python＋Django入門資料メモ

①Python Django チュートリアルまとめ
https://qiita.com/maisuto/items/17653f344d1f64afa019
→Djangoの入門資料（ファイルにパラメータ説明もある）　０から
②[Python] Djangoチュートリアル - 汎用業務Webアプリを最速で作る
https://qiita.com/okoppe8/items/54eb105c9c94c0960f14
→CRUDのアプリの作成
③DjangoによるWebアプリケーション開発入門 
https://eiry.bitbucket.io/index.html#
独自WEBで入門資料　も０から

④Django Girls のチュートリアルのホームセンター
https://tutorial.djangogirls.org/
最強なDjango勉強資料、いろいろ言語版があるので、とても便利ですよね
Windows スレッドスケジューラーのタイマ割り込み間隔

#概要
以前 Wondows PCのスレッドスケジューラーの周期タイマ割り込み周期を間接的な方法で調査していたので少しまとめておく。

# 方法
1. Slepp()関数の待ち時間をパフォーマンスカウンタで計測する。
最初にSleep()関数に引数0から29までを与えそれぞれ時間測定する。

2. timeBeginPeriod()関数で15を設定する。
Sleep()関数に引数0から29までを与えそれぞれ時間測定する。

3. timeBeginPeriod()関数で14から1までを設定し、それぞれSleep()にかかった時間をする。

注) プロセスとスレッドの優先は以下のように設定した。
	SetPriorityClass( hProcess, REALTIME_PRIORITY_CLASS );
	HANDLE hThread = GetCurrentThread();	// 擬似ハンドルを返す。
	SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL);      // 




#Windows10 ファンレスPC

![キャプチャファンレスPC.PNG](https://qiita-image-store.s3.amazonaws.com/0/134736/b56091b3-3cec-c391-7308-4daab83752c7.png)
注) 凡例のPeriod(0)はtimeBeginPeriod()関数を呼び出す前です。
![キャプチャNovo-2500E.PNG](https://qiita-image-store.s3.amazonaws.com/0/134736/142e04aa-d1b3-4298-b229-98e4276aeb9b.png)
timeBeginPeriod(1)で、なぜなスリープ時間が1 ms づづ長くなっています。


#Windows10 DELL PC
![キャプチャDELL-PC.PNG](https://qiita-image-store.s3.amazonaws.com/0/134736/a307cef5-7ae5-ba51-7991-9008a226360d.png)
![キャプチャTABLE_DELL.PNG](https://qiita-image-store.s3.amazonaws.com/0/134736/ed1cfada-5b8f-0d66-9fc9-82aa87e8795a.png)

timeBeginPeriod(1),timeBeginPeriod(2)でsleep()が変則的にずれています。
原クロックを分周するのに特別な分周期をつかっているのでしょうか。

#Windows7 T510
![キャプチャT510.PNG](https://qiita-image-store.s3.amazonaws.com/0/134736/f42fe870-663c-1f05-5bbc-95650cdf524a.png)
![キャプチャTable_T510.PNG](https://qiita-image-store.s3.amazonaws.com/0/134736/61238690-a23c-5019-241a-fbf00e59dcc8.png)
これは完ぺきな出来ですね。

#Windows7 エプソンダイレクト
![キャプチャEPSON DIRECT.PNG](https://qiita-image-store.s3.amazonaws.com/0/134736/839a93a1-ad54-859b-c6a3-bf2d99d3a9ba.png)

![キャプチャTableエプソン.PNG](https://qiita-image-store.s3.amazonaws.com/0/134736/80a620f2-48f8-305b-fc58-c12f829f7192.png)

timeBeginPeriod(1)のsleep()に問題がないのでよしとしますかな。

#まとめ
DELL ノートPCとThinkPad T510は起動から周期が1msなのか、別のプロセスがtimeBeginPeriod(1)を呼び出してるかは不明です。

ThinkPad T510は、チップセットに入れるクロックの水晶発振周波数をこのために合わせているようですね。

PCにより特徴がありますが、timeBeginPeriod(1)を設定しておくとどのPCでもだいたい再現性がとれそうです。ただしCPU負荷は上がりますね。
SORACOM LTE-M Button+AWS LambdaでEC2インスタンスの状態を操る

#はじめに
タイトルそのままです。
SORACOM LTE-M Buttonを買ったので同一リージョン内のインスタンスの起動・停止・再起動をボタンだけでできるようにしました。
#注意
Lambda関数のIAMロールを設定しましょう。
[この辺りが参考になると思います](https://mseeeen.msen.jp/start-ec2-instance-by-aws-lambda-with-python-36/#IAM)
#AWS Lambda上での実装(Python 3.6)
今回は1回押すと起動/2回押すと再起動/長押しで停止するようにします。

```python:IoTEC2Button.py
from __future__ import print_function

import boto3
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)



def lambda_handler(event, context):
    logger.info('Received event: ' + json.dumps(event))
    #今回は東京リージョン内のインスタンスを操作するのでap-northeast-1
    client = boto3.client('ec2','ap-northeast-1')
    responce = client.describe_instances()
    #全インスタンスIDを入れておく配列
    all_list = []
    for reservation in responce['Reservations']:
      for instance in reservation['Instances']:
          ##ステータスがterminatedになっているインスタンスがあるときのエラー対策
          if instance['State']['Name'] != "terminated":
              all_list.append(instance['InstanceId'])
    click_type = event['deviceEvent']['buttonClicked']['clickType']
    #操作対象のインスタンスのID(個別で操作したい場合はここに操作対象のインスタンスIDを入れる)
    ilist=list(all_list)
    #1回押した時
    if click_type == "SINGLE":
        start =  client.start_instances(InstanceIds=ilist)
        return start
    #2回押した時
    elif click_type == "DOUBLE":
        reboot =  client.reboot_instances(InstanceIds=ilist)
        return reboot
    #長押しした時
    elif click_type == "LONG":
        forcestop =  client.stop_instances(InstanceIds=ilist,Force=True)
        return forcestop
    logger.info('OK')
```

#おわりに
LTE-Mボタンは外出先でも使えるので使う時だけ起動/作業終わったら停止させればコストも減らせて非常に便利です。
インスタンス常時稼働させとくとコストが...ただいちいちコンソール開くのもなぁ...なんて面倒くさがりな方(主に私)にもいいかもしれません。
Rubyでのゲッターとセッターについて

## はじめに
<strong>「ゲッターとは何か？」「セッターとは何か？」</strong>
また、それらを簡単に定義することのできる、<strong>「アクセスメソッドとは何か？」</strong>について、
私なりにまとめてみました。

## ゲッターとは
通常、インスタンス変数内の値はクラス外からでは参照できません。

```user.rb
class User
  def initialize(name)
    @name = name
  end
def

user = User.new("Tom") 
user.name  #=>undefined method `name' for #<User:0x00007fc5c98af3b8 @name="Tom">
```

これを<strong>クラス外からでもインスタンス変数内の値を参照できるようにしたメソッドのことをゲッター</strong>といいます。

```user.rb
class User
  def initialize(name)
    @name = name
  end

  def name #ゲッター
    @name
  end
end

user = User.new("Tom") 
user.name  #=>"Tom"
```
先ほどでは参照できなかった``＠name``内の値が、ゲッターを介すことで、参照することができているのがわかります。
<br>

## セッターとは
通常、インスタンス変数内の値はクラス外からは更新ができません。

```user.rb
class User
  def initialize(name)
    @name = name
  end
end

user = User.new("Tom") 
user.name = "Bob"  #=>undefined method `name=' for #<User:0x00007fdc0092f368 @name="Tom">
```

これを<strong>クラス外からでもインスタンス変数内の値を更新できるようにしたメソッドのこと</strong>をセッターといいます。

```user.rb
class User
  def initialize(name)
    @name = name
  end

  def name=(name) #セッター
    @name = name
  end
end

user = User.new("Tom") 
user.name = "Bob"  #=>"Bob"
```
先ほどでは更新できなかった``＠name``内の値が、セッターを介すことで、更新することができているのがわかります。

<strong>※セッターは末尾に＝をつける</strong>``name=(name)``
<br>

## アクセスメソッドを使って、ゲッターやセッターを簡単に定義する
<strong>アクセスメソッド</strong>というものを使って、ゲッターとセッターを簡単に定義することができます。
アクセスメソッドは、3種類存在します。
* attr_reader
* attr_writer
* attr_accessor

|定義式| 機能 |
|:-----------|:-----------|
| attr_reader :変数名|ゲッターと同じ役割を持つ。インスタンス変数内の値を参照する。|
|attr_writer :変数名|セッターと同じ役割を持つ。インスタンスな変数内の値を更新できるようにする。|
|attr_accessor :変数名|ゲッターとセッター両方の役割を持つ。インスタンス変数内の値を参照、更新できるようにする。|

※変数名はシンボル``:変数名``で渡す。

### attr_reader
ゲッターと同じ役割を持ち、インスタンス変数内の値を参照します。

```user.rb
class User
    attr_rader :name  #ゲッター

  def initialize(name)
    @name = name
  end
end

user = User.new("Tom") 
user.name  #=>"Tom"
```

### attr_writer
セッターと同じ役割を持ち、インスタンスな変数内の値を更新できるようにします。

```user.rb
class User
    attr_writer :name  #セッター

  def initialize(name)
    @name = name
  end
end

user = User.new("Tom") 
user.name = "Bob"  #=>"Bob"
```

### attr_accessor
ゲッターとセッター両方の役割を持ち、インスタンス変数内の値を参照、更新できるようにします。

```user.rb
class User
    attr_accessor :name  #ゲッターとセッター

  def initialize(name)
    @name = name
  end
end

user = User.new("Tom") 
user.name  #=>"Tom"
user.name = "Bob"  #=>"Bob"
```

##参考サイト / 書籍
[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/gp/product/B07JHQ9B5T/ref=oh_aui_d_detailpage_o01_?ie=UTF8&psc=1)
[Rubyリファレンス](https://ref.xaio.jp/ruby/classes/module/attr_accessor)
[【Ruby】「ゲッター」と「セッター」を理解する](https://qiita.com/k-penguin-sato/items/5b75be386be4c55e3abf)
[アクセスメソッド](https://www.javadrive.jp/ruby/class/index6.html)
laravel5.4でリダイレクト後にpostの値やメッセージを表示する

##やりたいこと
登録処理などの完了後やエラー時にリダイレクトしてメッセージやpostされた値を表示したい

##コード
```myController.php
public function postData(Request $request){
  //postされた内容
  $text = $request->input('text');
  //直後のHTTPリクエストの間だけセッションにpostされた$textを保存します
  $request->session()->flash('posttext', $text);
  //メッセージも同様に保存します
  $request->session()->flash('message', '登録完了しました。');
  //リダイレクトします
  return redirect('/redirect/path/');
}
```
表示する際は以下のようにします。

```myContents.blade.php
@if(Session::has('message'))
<p>{{ session('message') }}</p>
@endif
@if(Session::has('posttext'))
<p>{{ session('posttext') }}</p>
@endif
```

参考：[Laravel 5.4 HTTPセッション](https://readouble.com/laravel/5.4/ja/session.html)
【未解決】Ruby on Rails：テーブルのカラム構成を変更する時、なぜマイグレーションファイルを新しく作成するか

Ruby on Railsはモデルという単位でデータベースを管理するけど、
実際にレコードを追加したり削除したりの操作するためには
1. モデルの作成
2. マイグレーションファイルの定義
3. マイグレーションの実施
のように操作を実施するのですが、
ここでわからなかった事が出てきまして、、。
カラムに変更が生じたときはマイグレーションファイルをいじるのではなく、新しく変更用のマイグレーションファイルを作成してマイグレーションしなければいけないかということです。

同じマイグレーションファイルいじってもう一回そのファイルをつかってマイグレーションしなおせばいいじゃん、と。	
でもRailsの仕様で同じバージョンのマイグレーションファイルはデフォルト実行しないみたいです。

自分なりに以下のように解釈しています。参考になるURLなどあれば追記します。
結論として、ActiveRecordでSQL文をデータベース管理システムに送るときに矛盾が発生するためかなと考えています。

そもそもデータベースはRailsではなくMySQLなどのデータベース管理システムが管理しています。
いくら便利なRailsさんでもデータベース管理まではできないようで、MySQLなどのデータベース管理システムにおまかせしています。なのでデータベースに手を加えるときはSQL分で命令しなければいけません。
（たぶんここまでは間違っていないですよね、、）

そして、Railsでデータベースを扱うときは、マイグレーションファイルを作成して、その中で書いた設定情報にしたがって
ActiveRecordという機能を通してSQLの命令文に翻訳しデータベース管理システムにその命令を渡す、
というやりかたでデータベースとやりとりをします。
ここでもとのマイグレーションファイルを修正する形でテーブルのカラムを変更しようとすると
テーブルを作成する、という命令を重ねてデータベース管理システムに渡してしまうことになり
いまあるテーブルと命令しようとしている内容に矛盾が生じてうまくいかなくなるのではないかと。

なので、ちょっぴし不便でも一度作ったテーブルを変更したいときは正規のSQL文で変更用の命令文を渡さなければいけないのではないかと。

以上、推測です。
SQL勉強します。ゴミ記事ごめんなさい。
Heroku Changelog 2018

# はじめに
[Heroku Advent Calendar 2018](https://qiita.com/advent-calendar/2018/heroku)、16 日目です。Changelog はどういうタイミングで確認していますか？みなさんのアプリが日々進化しているのと同様に Heroku Platform もより洗練され、新機能が追加されています。この 1 年でどんなことがあったか振り返ってみましょう。

# Changelog 
1 月 1 日 から 12 月 15 日までで **209** ありました。みなさん何か印象に残っているものはありますか？

今年最初の Changelog はこちら

- 03 January 2018: [Heroku PostgreSQL 9.3 deprecation](https://devcenter.heroku.com/changelog-items/1331)

現在は既存のものを除き 9.3 は新規作成できなくなっています。サポートし始めたのが [09 September, 2013](https://blog.heroku.com/postgres_93_now_available) なので ５ 年程たっています。息が長い！[version 11](https://devcenter.heroku.com/changelog-items/1511) は現在ベータなので来年は GA になっていることでしょう。

現時点で今年最後の Changelog はこちら

- 15 December 2018: [Ruby 2.6.0-rc2 now available on Heroku](https://devcenter.heroku.com/changelog-items/1539) 

この Changelog にある Ruby を含め公式の Buildpack を提供している言語は引き続き手厚くサポートされていますね。

# 大きな変更やリリースはどんなものがあったか

全ては挙げられないので2018年にちなんで、18つほどピックアップ、というようにしていくと毎年増えていくので 10 つに絞りました。時系列に並べていきます。

|公表日|内容|
|---|---|
|14 March 2018|[Shield-S dynos are now available for Shield Private Spaces](https://devcenter.heroku.com/changelog-items/1385)|
|20 April 2018|[Heroku Connect Bulk Writes to Salesforce Now Generally Available](https://devcenter.heroku.com/changelog-items/1401)|
|24 April 2018|[Webhook dyno events now in public beta](https://devcenter.heroku.com/changelog-items/1406)|
|24 May 2018|[Heroku CLI Autocomplete in GA](https://devcenter.heroku.com/changelog-items/1421)|
|12 September 2018|[Heroku CI Parallel Test Runs now generally available](https://devcenter.heroku.com/changelog-items/1477)|
|13 September 2018|[Private Space VPN and Internal Routing are now generally available](https://devcenter.heroku.com/changelog-items/1483)|
|17 September 2018|[Adding a custom domain will now return a randomly generated DNS target](https://devcenter.heroku.com/changelog-items/1488)|
|22 October 2018|[Automatic HTTPS support for <appname>.herokuapp.com domains in Private Spaces](https://devcenter.heroku.com/changelog-items/1505)|
|13 November 2018|[Building Docker images with heroku.yml is now generally available](https://devcenter.heroku.com/changelog-items/1520)|
|05 December 2018|[Heroku CLI login now opens the browser by default](https://devcenter.heroku.com/changelog-items/1530)|

ブラウザからのログインは [1Password](https://1password.com/jp/) とか [LastPass](https://www.lastpass.com/ja) とか使っていちいちパスワードを覚える必要がないので、CLI のログインもブラウザ経由になるのは地味に便利ではないでしょうか。Docker image も Heroku 側でビルドできるようになったりとこのあたりの変化も要チェックですね。

# Changelog をどうやって追うか

- [Heroku Changelog](https://devcenter.heroku.com/changelog) を定期的に確認
- [Heroku Changelog twitter account](https://twitter.com/herokuchangelog) をフォロー
- [Feeds](http://feeds.feedburner.com/herokuchangelog) を購読する


# その他

[Heroku Blog](https://blog.heroku.com/): 主な新機能についてアナウンス

Changelog より技術的につっこんだ内容が多く面白いと思うので、こちらも時々見ることをお勧めします。