OmniAICreator/Qiita-1.07M huggingface dataset:
RedshiftでVarChar型の桁数を増やす


2019年3月20日のアップデートにおいて
ALTER TABLE でVARCHAR型の桁数が増加可能になった
…はずでした。

ちょうどVARCHAR型の桁数を増加する必要があり、
下記コマンドを試したのですが、「サポートしてない」と怒られる。

```sql
ALTER TABLE tablename ALTER COLUMN columnname TYPE VARCHAR(100);
```

#【結論】現在、機能停止中
以下、AWSさんの回答です

- 現在、同機能に問題が発見されたため機能を無効化中
    ※2019年4月14日時点
- 修正完了次第、再度利用可能になる
- ただし、いつ修正完了するかは不明

AWSさんの対応を待ちましょう。

#2019年6月19日現在
利用できるようになっていました！
AWSさんで対応完了したようです。


#参考
↓の記事で、VARCHAR型の変更方法を知りました
[Amazon Redshift：ALTER TABLE文でVARCHAR型の桁数を増やせるようになりました]
(https://dev.classmethod.jp/cloud/aws/amazon-redshift-alter-table-can-increase-varchar-type-column-size/)
[Announcement: Amazon Redshift Maintenance (February 20th - March 14th 2019)](https://forums.aws.amazon.com/ann.jspa?annID=6593)
Nuxt.js v2.4.0以上でnuxt-sass-resources-loaderを使ってはいけない

vueコンポーネントにグローバルなscssファイルを読み込ませる時にハマったのでメモ。
ここら辺のライブライが名前がどれも似かよっていてどれを使えないいかわからない方も多いと思います。
# 結論
style-resources-moduleを使いましょう。
https://github.com/nuxt-community/style-resources-module

手順は以前とほぼ変わりません。

```terminal
yarn add -D @nuxtjs/style-resources
```

```nuxt.config.js
  /*
  ** Nuxt.js modules
  */
  modules: [
    '@nuxtjs/style-resources', //　追記します
  ],

  styleResources: {
    sass: [
      '~/assets/scss/variable.scss' // 読みませたいscssファイルを指定します。
    ]
  },
```

#ちなみに
issueを見ると、
Nuxt.js v2.4.0にバージョンアップされた際に、nuxt-sass-resources-loaderはサポート終了になったとのこと。
v2.4.0になったのは今年の1月29日なので、それ以前の記事は参考にしないほうがよさそう。

https://github.com/anteriovieira/nuxt-sass-resources-loader/issues/25
> ⚠️ We are closing the support for this package and transferred to the official community package. So we strongly suggest that you use the official community package @nuxtjs/style-resources.
[Cinema 4D] 時間トラックにキーをステップ状に作成するXPressoノード

今回のCinema 4D Pythonエクササイズは「XPressoを使って時間トラックをXPressoから追加してキーを記録する」です．

時間トラックを追加するというノードは提供されていなかったので必要パラメータはXPressoのユーザデータから取り出して，Pythonノードで作成してみました．

処理内容をもう少し具体的に書くと，
任意のオブジェクトに指定したフレームから指定したフレーム間で時間トラックを作成し，
等間隔にステップ上にキーを記録するスプリプトです．

最低限必要なパラメータはユーザデータとしてXPressoタグに追加しておきます．

Add Time Track: 時間トラックを追加する
Object: 指定したオブジェクトに対して時間トラックを作成する
FPS: ドキュメントのFPSでも良いです
Start Frame: 最初のキーフレームの時間
End Frame: 最後のキーフレームの時間
Key Step: 指定した値ごとにキーを作成する
Value Step: キー毎に加算する時間トラックのパーセント

![20190414-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195698/10de4224-920d-57f9-5e52-3fe0b08f96f8.jpeg)


テストしたスクリプトは以下です．
今回のテストコードでは既存の時間トラックがある場合は，一旦削除してから新しく追加しなおしています．時間トラックは複数追加できるのですが，テスト用のため簡易的なものにしています．

```
import c4d
from c4d import gui

def AddTimeTrack(obj, doc):

    findTrack = obj.FindCTrack(c4d.DescID(c4d.DescLevel(c4d.CTtime)))
    if not findTrack:
        print "not find time trackx"
        tTrack   = c4d.CTrack(obj, c4d.DescID(c4d.DescLevel(c4d.CTtime)))
        obj.InsertTrackSorted(tTrack)
        newTrack = tTrack
    else:
        print "already exist time track"
        findTrack.Remove()
        c4d.EventAdd()
        tTrack   = c4d.CTrack(obj, c4d.DescID(c4d.DescLevel(c4d.CTtime)))
        obj.InsertTrackSorted(tTrack)
        newTrack = tTrack

    c4d.EventAdd()
    return newTrack

def main():
    print "AddTimeTrack Test"

    doc     = c4d.documents.GetActiveDocument()
    obj     = object_in
    fps     = fps_in
    frame   = start_in
    fend    = end_in
    fstep   = fstep_in
    stepVar = value_in
    setVar  = 0

    doc.StartUndo()

    tTrack = AddTimeTrack(obj, doc)
    curve  = tTrack.GetCurve()

    while frame < fend:

        fKey = c4d.CKey()
        tTrack.FillKey        ( doc  , obj, fKey )
        fKey.SetTime          ( curve, c4d.BaseTime(frame, fps) )
        fKey.SetInterpolation ( curve, c4d.CINTERPOLATION_STEP )
        fKey.SetValue         ( curve, setVar )
        curve.InsertKey       ( fKey )
        frame  += fstep
        setVar += stepVar

    doc.AddUndo(c4d.UNDOTYPE_NEW, tTrack)
    doc.EndUndo()
    obj.Message(c4d.MSG_UPDATE)
    c4d.EventAdd()

    return
```

スイッチでノードをオンオフを切り替える時は必要に応じて〈フレーム依存〉と〈フレーム0でリセット〉の二つのオンオフ設定に気を付けた方が良いと思います．また，このXPressoタグの次に動作する二つ目のXPressoタグで一つ前のスイッチをオフにします．

![20190414-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195698/6e7d257b-a906-fba2-0465-6904aa388054.jpeg)

###結果:

立方体の45フレームでX方向に移動する元アニメーションに追加した時間トラックを適用したところです．
![20190414-4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195698/418498f1-d07b-b883-8fee-c814ad3b6228.gif)



###課題：

Add Time Trackをオンにした後，カーソルをタイムラインの上にもっていかないと更新が反映されないので，MessageとEventAddの用法に解決の糸口があるかもしれません．

AddUndo()が機能しない．XPressoのPythonノードから立方体を追加するというテストコードでもAddUndo()ができませんでした．スクリプトマネージャから単独のコードで実行するとUndo()できるのでXPressoで使う場合はできないか，別の処理が必要かもしれません．
今年の言語はRust その１２


# 今年の言語はRust その１２

Rustを学びます


Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/



## 7. モジュール

### 7.1 modをファイルシステム

```sh
$ cargo new communicator --lib
```

最初の以下のモジュールを考える

lib.rs

```rust

mod client {
    fn connect(){
        
    }
}

mod network {
    fn connect(){
        
    }
    
    mod server {
        fn connect(){
            
        }
    }
}

```


さて、networkとclientモジュールを整理しよう

ファイル構成はまずいかのようになり

```rust
.
├── Cargo.lock
├── Cargo.toml
├── src
│   ├── client.rs
│   └── network.rs

```



src/client.rs

```rust

fn connect(){
    
}
```


src/network.rs

```rust

fn connect(){
}

mod server {
    fn connect(){
        
    }
}
```

## モジュール用ディレクトリを作る

networkディレクトリを作りその下に
mod.rsというファイルを作る

```rust
.
├── client.rs
└── network
    ├── mod.rs
    └── server.rc
```

- client
- network
- network::server

の三つのモジュールを定義できた




おそらくほぼ理解した！
以降の例題で体で覚える！
深く考えてもしかたない


次回！


イエス！
Elixir ~演算子の基本~

#ここまでのあらまし

[こちら](https://dev.to/gumi/elixir-03--33im) のページを参照しながらElixirの基本について備忘録的にドキュメントをしたためています。今回は演算子を扱います


#本題

四則演算については前回暑かったので割愛します。

文字列をつなぐ演算子は<>

```elixir
iex > name ="kento"
"kento"
iex > "my name is "<> name
"my name is kento"
```

アトムを加える場合は#{}で囲んで。

```elixir
iex> "hello #{:world}"
"hello world"
```

論理和演算子||と論理積演算子&&について。

```elixir
iex> -1 || true
-1
iex> false || 2
2 
iex > nil && 3
nil
iex > true && 4
4
```

左オペランドを評価し、||はtrueなら左オペランドを、falseなら右オペランドを返す。
&&はその逆。

比較演算子について、だいたい覚えてるからいいかな...と思いましたが異なる型のデータでも大小比較ができるようです。

データの大小について、

```
number < atom < reference < function < port < pid < tuple < map < list < bitstring
```

という決まりがあるようです。

＃編集後記

突っ走って本日3本目のドキュメント更新です。
基本的には自分のために書いていますがどなたかのご理解の一助のきっかけになったら幸いです。
うまずたゆまず、頑張ります。
Kento Mizuno
ブラウザバックでページ表示された時にだけ処理を実行する方法

みんな大嫌いブラウザバックに関連した処理のお話し。

# 実現したいこと
ブラウザバックにより表示された場合にだけ、通常のページ表示とは違う処理を実行したい。
たとえば、ページ表示直後に何らかの演出が表示されるが、当該ページから離脱後にブラウザバックで戻ってきた時には（冗長なので）その演出を見せたくない場合があったりする。

## やりたいのは以下ではない
- 当該ページでブラウザバックされたのを検出する（popstate）
- 通常のページ表示では実行される処理が、ブラウザバック時に実行されない事態を回避する（ = 通常表示時もブラウザバック表示時も同じにしたい）

# 実現方法
ページ離脱時に、history.stateに任意の値を指定して履歴を書き換えておく。
そして、ページ表示時にhistory.stateを確認して、ブラウザバックか否かを確認する。

```Javascript
window.onunload = function () {
  if (history && history.replaceState){
    // ページ離脱時に、Stateオブジェクトに任意の文字列を指定して履歴を書き換える
    history.replaceState('unloaded',null, null);
  }
}

window.onpageshow = function () {
  if(history && history.state === 'unloaded'){
    // ブラウザバック時にのみ実行する処理を記述する
  }
}
```

### 注意
onpageshowイベントのpersistedは使えない。
キャッシュからページ表示された場合にtrueになるのだが、表示環境が十分に早いなどしてブラウザがキャッシュを使わない場合には、falseになる。ゆえに、ブラウザバックか否かを判定する場合には使えない。
[golang]改行コードを維持して、1行単位にファイルを読み書きする

# はじめに
数GB単位の様々なテキストファイルをちょっとだけ置換したファイルを作る必要があり、最近勉強をはじめたGo言語で実装しようと思ったところ、色々混乱してしまったので、備忘録がてらここに記載します。

# ソース
```go:main
package main

import (
	"bufio"
	"io"
	"log"
	"os"
)

func main() {
	// 入力ファイルの指定
	srcFile, err := os.Open("./file1.txt")
	if err != nil { log.Fatal(err) }
	defer srcFile.Close()

	// 出力ファイルの指定
	dstFile, err := os.Create(".file2.txt")
	if err != nil { log.Fatal(err) }
	defer dstFile.Close()

	r := bufio.NewReader(srcFile)
	w := bufio.NewWriter(dstFile)

	for {
		row, err := r.ReadString('\n') // LF(\n)まで読み込み。結果、CRLF(\r\n)でも問題なし
		if err != nil && err != io.EOF { log.Fatal(err) }
		if err == io.EOF && len(row) == 0 { break } // 最終行に改行が無い場合を考慮し、len(row) == 0を入れる

		// ここに加工処理を書く
    	// row = strings.Replace(row, "hogehoge1", "hogehoge2", -1) など

		// 出力ファイルに書き込み
		_, err = w.WriteString(row)
		if err != nil { log.Fatal(err) }
	}
	err = w.Flush()
	if err != nil { log.Fatal(err) }
}
```

# 解説
Go言語におけるファイルや標準入出力にはbufioパッケージが良いとのこと。
bufioには、bufio.readline()や、bufio.Scan()など、一行単位に読み込みするためのメソッドがあるのですが、これらは改行コードがトリムされるので私の目的には合致せず。
bufio.ReadString('\n')を使うとLF('\n')が登場するまで読み込みを行うため、CRLF('\r\n')でもLF('\n')でも想定通りの挙動をします。CR('\r')だけのファイルを扱うことはないので無視・・。

# 最後に
普段はPython書いてます。Go言語は始めたばかりで分からないことばかりですが、不備や改善点などあればご指摘ください。

# 参考
[Go でファイルを1行ずつ読み込む（csv ファイルも）](https://qiita.com/ikawaha/items/28186d965780fab5533d)
Elixir ~基本概要つづき~

#ここまでのあらまし

[こちらのサイト](https://dev.to/gumi/elixir-02--30n1) を参照しながらひさびさにQiitaドキュメントをしたためました。

続きをいってみようと思います。

#本題
無名関数から。

```elixir
iex > sum = fn(a, b) -> a + b end
#Function<12.128620087/2 in :erl_eval.expr/5>
```

呼び出し

```elixir
iex > sum.(1, 2) 
3
```

変数に関数が収められているかを調べるのがis_function/1、アリティの数を調べるのがis_function/2

```elixir
iex > is_function(sum)
true
iex > is_function(sum,2)
true
```

以前わたしのドキュメントで扱った&記法。

```elixir
iex > sum = &(&1 + &2)
&:erlang.+/2
iex > sum.(3,4)
7
```

ここからはリストについて。

```elixir
iex > list = [3.14, :pie, true, "Apple"]
[3.14, :pie, true, "Apple"]
iex > length(list)
4
```

++や--といった演算子でリストに要素を加えたり差し引いたりすることもできる模様です。

```elixir
iex > list ++["Kento"]
[3.14, :pie, true, "Apple", "Kento"]
iex > ["Π"]++
... > ["Π"]++ list
["Π", "Π", 3.14, :pie, true, "Apple"]
iex > list --["Π","Kento"]
[3.14, :pie, true, "Apple"]
```

この際注意しなければならないのはリスト演算子がリストの中身を書き換えるのではないということで、返ってくるのは新しいリストだということです。
これがイミュータブル(immutable、公式ドキュメントでしばしば出てくる単語で)ということ、データの書き換えではなくデータの変換が行われている。
これは地味なようで非常に重要なポイントだと思われます。

シングルクオーテーションとダブルクオーテーションで囲ったものの違い。

```elixir
iex > i("hello")
Term
  "hello"
Data type
  BitString
Byte size
  5
Description
  This is a string: a UTF-8 encoded binary. It's printed surrounded by
  "double quotes" because all UTF-8 encoded codepoints in it are printable.
Raw representation
  <<104, 101, 108, 108, 111>>
Reference modules
  String, :binary
Implemented protocols
  Collectable, IEx.Info, Inspect, List.Chars, String.Chars
```

```elixir
iex > i('Hello')
Term
  'Hello'
Data type
  List
Description
  This is a list of integers that is printed as a sequence of characters
  delimited by single quotes because all the integers in it represent valid
  ASCII characters. Conventionally, such lists of integers are referred to
  as "charlists" (more precisely, a charlist is a list of Unicode codepoints,
  and ASCII is a subset of Unicode).
Raw representation
  [72, 101, 108, 108, 111]
Reference modules
  List
Implemented protocols
  Collectable, Enumerable, IEx.Info, Inspect, List.Chars, String.Chars
```

詳しいことを出てきたinfoの英文で追いかけるのは今回は割愛しますが、ふたつは違う。興味深いです。

タプルへと行きます。
要素を中括弧で囲い、カンマ区切りにしたもの。
要素の数を測るには、tuple_size/1。

```elixir
iex > tuple = {3.14, :pie, true, "Apple"}
{3.14, :pie, true, "Apple"}
iex > tuple_size(tuple)
4
```

elem/2関数で指定した要素の取り出し、put_elem/3で、指定した要素の置き換え。

```elixir
iex > elem(tuple,3)           
"Apple"
iex > put_elem(tuple,3,"Orange")
{3.14, :pie, true, "Orange"}
```

#編集後記

Elixirの型の基本について、２回に渡ってさらってゆくことができました。
参照させていただいているページがElixirの基礎について参考書のような構造になっているので、引き続き備忘録をしたためながらやってゆこうと思います。

うまずたゆまず、頑張ります。
Kento Mizuno
なぜActive Recordからデータを取得するときに必ずorderをつける必要があるのか

Active Recordからデータを取得するとき`order`は必ずつけたほうが良いという話を聞きました。
`Article.last`は`Article.order(id: :asc).last`と解釈されるのだから`order(id: :asc)`をわざわざつけなくてもいいケースもあるかなと個人的に考えていたのですが、プロジェクトが育ってきた時に不具合になることがあるなと思いました。`order`をつけないことで不具合が起こりえるケースを記事に残そうと思います。

# ケース1（default_scopeにorderがある場合）

例えば、下記のように`default_scope`に`order`が設定されている場合、`Article.last`の結果が変わってしまいます。

ちなみに、下記のような設定がない場合は`Article.last`は`Article.order(id: :asc).last`と同等の結果が返ります。
（この例以外でも順番が変更されてしまう事例があるかもしれません）

```ruby
class Article < ApplicationRecord
  default_scope { order(id: :desc) }
end
```

# ケース2（has_manyにorderがある場合）

例えば、下記のように`has_many`に`order`がある場合、`Article.find(1).comments.last`の結果が変わってしまいます。

下記のような設定がない場合は`Article.find(1).comments.last`は`Article.find(1).comments.order(id: :asc).last`と同等の結果が返ります。
（この例以外でも順番が変更されてしまう事例があるかもしれません）

```ruby
class Article < ApplicationRecord
  has_many :comments, -> { order(id: :desc) }
end
```

# 最後に

`Article.last`のようにシンプルに最後の要素を取得するだけだから、`order`つけなくてもいいや〜って思っていると、何処かのタイミングで思わぬバグが発生する可能性があると思うので、今後、必ず`order`をつけていきたいと感じました。

他にも`order`をつけていないとこういう不具合が起こり得る事例がありましたら、教えていただけるとうれしいです。
人の気持を考えてPythonコードを書こう

>PythonからSwiftに移行した人の9割は死ぬ

こんなお告げを聞いたことがあります。
なぜなら、動的な言語ばかり書いているとだんだん<b>人の気持ちが考えられなくなってくる</b>からです。
それだけではありません。機械の気持ちすらも考えられなくなります。だから動的言語は罠なのです。

しかし、Pythonerのみなさん。そしてPythonistのみなさん。Pythonにも人と機械の気持ちを考えられる機能があります。
それが`Type Annotation`です。

# Type Annotationとは

`Type Annotation`とは、和訳すると「型注釈」です。
要は変数の型をカッチリ決めておこうということです。

例えば、なんの変哲もないPythonコードがあったとしましょう。

```Python
a = [1, 2, 3]
```

こいつの型は？と聞かれて、みなさんは右辺の`[1, 2, 3]`という形を見てようやく`list`型だ〜！と理解できます。
次に、またまた何の変哲もないコード

```Python
a: list = [1, 2, 3]
```

ここでSwift勢が全員歓喜します。そう、`Type Annotation`です。これなら、変数の中身を見なくても`a`が`list`型だとひと目でわかります。

Pythonで大規模開発をしたいと考えている人、<b>可読性</b>のためにも今すぐ`Type Annotation`を使いましょう。
`Type Annotation`を肌で感じたいという人はSwiftを触ってみればいいと思います。

Pythonでの詳しい使い方は[こちら](https://docs.python.org/ja/3/library/typing.html)。
サポートはバージョン`3.5`からなので注意してください。実は`Generics`型なんかも使えるんですね。すごい。


# 型と値の違い

俺が`Type Annotation`を推すのにはもう一つ理由があります。
それは、<b>思考の整理のため</b>です。

たとえば、以下の関数があります。

```Python
import numpy as np


def sigmoid(x):
    return 1 / (1 + np.exp(-x))
```

はい。Python使いならお馴染みの何の変哲もないシグモイド関数$\sigma$です。

これだけを見て、xが`list`型なのか`np.ndarray`型なのか、はたまた`int`型なのかすぐに見分けがつきませんよね。
ではこれならどうでしょう。

```Python
import numpy as np


def sigmoid(x: np.ndarray) -> np.ndarray:
    return 1 / (1 + np.exp(-x))
```

ここで再びSwift勢が歓喜。

こうして、引数と返り値の型をアノテートしてやることで自らの思考の整理になります。

特に初心者が躓きがちなのは**型がごちゃごちゃになる**という問題です。
このように、慎重に一つ一つの変数やメソッドの型に気をつける癖を付けることがプログラマへの第一歩と言えるでしょう。<br>



# 変数の乱用はやめましょう

さあ、これでようやくみんなも`Type Annotation`の重要性がわかってきたと思います。

それでいざ`Type Annotation`を使ってみると、だんだんこういうのが気持ち悪くなってきませんか？

```Python
a = 1
a = "hello"
```

Swift勢なら大激怒ですね。

変数への異なる型の再代入はまじでキモいので止めたほうが良いことに気づきます。
いくら動的といえど、型を変えられると再代入を機械に任せることになります。

また、テスト時に参照を追えなくなるのでつらいです。

<br>

型が異なるときは新しい変数を宣言しましょう。

```Python
a = 1
b = "hello"
```

<br>
こうすれば `a` は`int`型で`b`は`str`型であることが判断できます。そして、さらにこのように型を記載してあげましょう。

```Python
a: int = 1
b: str = "hello"
```

<br>

これで誰が見てもこの2つの変数がどういった値かがわかります。
しあわせなPythonコーディングへの第一歩を踏み出すことができました。

# 機械にも人間にもやさしいプログラマになろう

`Type Annotation`は宣言したところでランタイム時にチェックされないので、もし型をミスっててもエラーを出してはくれません。(出すようにすることもできますが)

しかし、`Type Annotation`を使うことでコードを書く自分も、読む他人も、反映する機械も幸せになれるのです。
そして、プログラミングのまだ見ぬ可能性に気づくことができるでしょう。これからは積極的に`Type Annotation`を使っていきましょう。
AnacondaのPythonをUpdateするときのコンフリクトエラー対策

AnacondaのPythonを3.5系→3.7系にUpdateしようとしたら、
コンフリクトエラーが起きてインストールできなかったので、
その時の手順メモ

#経緯
Anacondaプロンプトで、conda install python=3.7と入力。
これで完了かと思いきや、エラーが発生

```terminal:terminal
>　conda install python=3.7
Fetching package metadata .............
Solving package specifications: .

UnsatisfiableError: The following specifications were found to be in conflict:
  - conda-manager -> python 3.5*
  - python 3.7*
Use "conda info <package>" to see the dependencies for each package.
```

#解決策
仮想環境を作成したらインストールできた
コマンドは以下
conda create -n 仮想環境名 インストールするパッケージ␣[パッケージ␣...]

途中でProceed ([y]/n)? 
と聞かれるので、yを入力

```terminal:terminal
> conda create -n py37 python=3.7 anaconda
.....（略）
    widgetsnbextension:                 3.4.2-py37_0
    win_inet_pton:                      1.1.0-py37_0
    win_unicode_console:                0.5-py37_0
.....（略）

Proceed ([y]/n)? y

.....（略）
menuinst-1.4.1 100% |###############################| Time: 0:00:00   4.22 MB/s
blas-1.0-mkl.t 100% |###############################| Time: 0:00:00   1.24 MB/s
.....（略）

#
# To activate this environment, use:
# > activate py37
#
# To deactivate an active environment, use:
# > deactivate
#
# * for power-users using bash, you must source
#
```
最後に表示されるコメント文で、次のように表示された

この環境をアクティベートするには、以下のように使う：
\> activate py37
アクティベートした環境をデアクティベートするには、
\> deactivate

####アクティベートを試す
現在は3.5系。これを確認してからアクティベートし
Pythonのバージョンがどう変化するかを確認

```terminal:terminal
[Anaconda3] C:\Users\User>python --version
Python 3.5.4 :: Anaconda 4.0.0 (64-bit)

[Anaconda3] C:\Users\User>activate py37

(py37) [Anaconda3] C:\Users\User>python --version
Python 3.7.3
```
仮想環境py37では、Pythonのバージョンが3.5系→3.7系になった。
続いてデアクティベート

####デアクティベート

```terminal:terminal
(py37) [Anaconda3] C:\Users\User>deactivate

[Anaconda3] C:\Users\User>
[Anaconda3] C:\Users\User>python --version
Python 3.5.4 :: Anaconda 4.0.0 (64-bit)
```
仮想環境を脱出したら、3.7系→3.5系に戻った

#参考
condaのドキュメント
https://docs.conda.io/projects/conda/en/latest/commands/create.html?highlight=create
https://teratail.com/questions/115370
【STATA】asdocで綺麗な相関係数の表を作成（Wordに出力）

## 目的
統計ソフトSTATAを用いて、論文に載っているくらいの綺麗な相関係数の表を作りたい。

## 環境
STATA13.0

## 手順
``asdoc``をインストール（すでにインストールされている場合、この手順をスキップ）

```stata
ssc install asdoc 
```

使うファイルを指定。（今回はサンプルデータを利用するため``sysuse...```としてある点に注意。）

```stata
sysuse auto, clear
```

``myreg.doc``ファイルに表を出力。
※``.xls``形式ではうまく出力できなかった。

```stata
asdoc cor, save(myreg.doc)
```

下記画像のような結果を得られたら、画像下部の青い``myreg.doc``をクリック。
![20190414b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363036/781b3c27-4287-73a5-b201-bed4de124d56.png)


## 結果
``myreg.doc``ファイルをWordで見ると下記画像のような感じ。
![20190414a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363036/5d54f671-dec6-cd16-59bc-7057496c48ae.png)

## 追記
変数名の代わりにラベル名を表示したい場合

```stata
asdoc cor, label
```

1行目（上記画像の``Variables``の行）にも変数名を表示たい場合

```stata
asdoc pwcor, nonum
```

## 参考
・http://fintechprofessor.com/2018/03/05/export-high-quality-table-correlations-stata-ms-word/
【Java】axis2のSOAP StubにWS-SecurityのUsername Tokenを設定する実装方法メモ

いろいろ探したけど具体的な実装方法に関するhintがStackOverFlow(しかも英語…)にしかなかったので備忘のためにメモ。

StackOverFlowの出展は以下
StackOverFlow:https://stackoverflow.com/questions/7910776/adding-user-password-to-soapheader-for-webservice-client-call-with-axis2
著者:https://stackoverflow.com/users/957076/shiv-gopal
（この人、自力で解決したらしい（I resolve the issue myself)、、、すげーなー）

ほとんどこの人の回答通りだがそのままやるとエラーになったので下記コメント部分の通りの追加修正を施している。

```java

OMFactory omFactory = OMAbstractFactory.getOMFactory();
OMElement omSecurityElement = omFactory.createOMElement(new QName( "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security", "wsse"), null);

OMElement omusertoken = omFactory.createOMElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "UsernameToken", "wsu"), null);
// createOMElementの引数QNameの第一引数にWS-SecurityのURIを指定
OMElement omuserName = omFactory.createOMElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Username", "wsse"), null);
omuserName.setText("myusername");
// createOMElementの引数QNameの第一引数にWS-SecurityのURIを指定
OMElement omPassword = omFactory.createOMElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Password", "wsse"), null);
omPassword.addAttribute("Type","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText",null );
omPassword.setText("mypassword");

omusertoken.addChild(omuserName);
omusertoken.addChild(omPassword);
omSecurityElement.addChild(omusertoken);
stub._getServiceClient().addHeader(omSecurityElement);
```

追記修正点として、StackOverFlowの回答では、QNameオブジェクトつくるときに第一引数に空文字を指定しているが、これだと実行時に「java.lang.IllegalArgumentException: Cannot create a prefixed element with an empty namespace」が発生する。
なので明示的にWS-SecurityのURIを指定させている。
だからたぶんコレ回答の誤記じゃないかと思うのだが…なんかやり方あるのかな。

また、omuserName.setText("myusername");とomPassword.setText("mypassword");に自身のユーザーとパスワードを設定する。

WS-Securityの「仕様」や「概念」に関しては、検索すればそこそこ出てくるのだが、具体的な実装方法があまり見つからず、仮に見つかってもaixsのバージョンが違うみたいで気軽にsetHeaderとかできなかったりして、結構困った。
<A HREF="http://axis.apache.org/axis2/java/core/apidocs/org/apache/axis2/client/Stub.html" target="_blank">aixs2のStub</A>はServiceClient取り出す以外は全てprotectedになっていて、外からはほとんど何もできなく、<A HREF="http://axis.apache.org/axis/java/apiDocs/org/apache/axis/client/Stub.html" target="_blank">axis1のStub</A>に比べて自由度が非常に制限されている印象である。
今回のように、headerの設定方法にはなかなか苦労させられた。
ffmpeg nvenc における GPU ベンチマーク

# 目的
新しいアーキテクチャってハードウェアエンコする時に有効なの？
って思ったので
まとめも兼ねて

# 環境
 |HW List
:-:|---
CPU | i7-920 @2.66GHz  
M/B | P6T Delux v2
MEM | DDR3-1066 12GB
SSD | WD 128GB

  |SW List
:-:|---
OS  | Ubuntu 18.04
nvidia driver | 390.116
ffmpeg version | n4.1

# GPU
何個か持ってるけど nvenc 走れたのは以下

 | GTX670 | GTX980
:-: | :-:| :-:
Architecture | Kepler | Maxwell
Technology | 28nm | 28nm
Shaders | 1344 | 2048 
GPU Clock | 915MHz | 1126MHz
Memory | GDDR5 2GB | GDDR5 4GB

# コマンド
```
time ffmpeg -i ypt.mov -b:v 20M -c:v h264_nvenc ypt.mp4
```
h264で入力動画（130秒）を 20Mbps で mov -> mp4 変換する
なお CPU エンコでは -c:v h264 を代わりに使用する

# リザルト
結果は3回試行の中央値

使用プロセッサ | エンコード時間 | CPU比
:-: | :-:| :-:
i7-920 | 416秒 | x1.0
GTX670 | 98秒 | x4.2
GTX980 | 69秒 | x6.0
GTX980 + GTX670 | 70秒 | x5.9
GTX670 + GTX980 | 70秒 | x5.9

#結論
・新しいやつは強い
Automotive SPICE 3.0 実践ガイドブック　入門編　読み進め　１章

[Automotive SPICE 3.0 実践ガイドブック入門編](https://www.amazon.co.jp/dp/4822200566/)の読み進めです。
自分向けのノートとして記録します。
#1 概要
##1-1 誕生の経緯と動向
開発体制の多様化
⇒✖技術者同士の阿吽の呼吸
　〇共通言語での根拠の共有

ISO26262　システムの故障、誤作動での危険を回避するための要求をまとめている。


##1-2 改善活動の基本的考え方
###改善活動のマネジメントのためのPDCAサイクル
- PDCAサイクル

改善活動が事業目標と紐づくことが前提⇒でないと経営層と管理層の理解を得られない。
改善活動のPDCAには⇒運営の責任者による「目標の周知」、「リソース提供」といったインフラの確率が必要。

- 改善活動PDCA
   - 改善目標設定（定量的）
      - 現状把握
      - 分析した弱みに対する改善策（全ての弱みに対処しなくてもよい）

改善策をパイロット実施し、効果を確かめる。
OKなら組織標準プロセスを定義する。

- 作業タスク
- 手順
- 適用技術・ツール
- 必要スキル・役割

以上を整理する。測定の尺度も定義すること。
改善策を試行したら、測定データから有効性を検証する。


###段階的な目標設定の考え方
関係者の慣れ・学習を想定して
グループ ⇒ プロジェクト ⇒ 小組織 ⇒ 大組織　と段階的な目標を設定する。
また逆方向で、
組織の目標を想定して ⇒ 中間目標を立て ⇒ プロジェクトレベルの活動を始める。

###プロジェクトレベルの改善
目標とリソースのギャップ⇒設計方法の見直し、テストの効率化

###組織レベルの改善
各プロジェクトの改善内容を展開する。
【注意】メンバーに改善活動の経験がないと、展開された標準プロセスの意味が理解できない。
プロセス実績を蓄積する。

###事業レベルの改善
実績データの分析から。


## 車載システム開発における改善活動
失敗事例を参考として、改善活動の勘所を説明。

### 失敗事例とその要因
- プロジェクトはSPICEの目標レベルを達成したが、メンバーが意味を感じていない。
- メンバーがプロセス改善の横展開の必要性を感じていない。
- 何のための、誰のための改善かの理解がされていない。

### 失敗の共通要因
■改善目的と手段の入れ替わり「SPICEの能力レベルを達成する！」
　能力レベルを達成する！ではなく、あくまで「日程遅延を少なくする」、「コストを低減する」といった具体的な目標で改善活動を実施しないとメンバーに達成感がわかない。

■改善活動の範囲がパイロット（改善対象として初めに実施される）プロジェクトに限定されている。
　プロジェクト限定で言われたことだけをやればいい。⇒横展開ができない。

### 改善に対する期待
- プロジェクトメンバー層の改善活動への期待
   - 技術者自身が成長する？
   - 上手くいった達成感が得られるか？
   - 納得する評価が得られるか？
- 管理者層の改善活動への期待
   - 部門がかかえる課題を意識している？
   - 個人のノウハウを集合知として共有できている？
   - 複数のプロジェクトの状況を一元的に管理できている？
- 経営層の改善活動への期待
   - 顧客満足度はあがるのか？
   - 部門間が協調して相乗効果が出るのか？
   - 経営判断のスピード、競争力が向上するのか？

### 著者が推奨するアプローチ
切っ掛けの大半は取引先からの要求。⇒組織力強化の機会ととらえる。

■中長期の段階的な目標設定（管理者層の責任）

- ステージ１：開発の基礎力強化
  - プロセスモデルに基づいた標準プロセスの構築と展開
  - プロセス改善活動を通して、改善基盤を構築
     - 「成果」：初めて構築した標準プロセス、改善活動の経験蓄積
     - 納期の問題もあって、後継プロジェクトには適用しやすいが、横展開にはリスクがある。
- ステージ２：組織力＆組織運営力強化（事業部）：本書対象外
  - モノづくりの土台を構築し、組織力を強化
  - マネジメントサイクルを構築し、継続的製品価値を生み出す組織力を強化
  - 指標、データ収集、分析の仕組み
     - 開発対象の製品に必要な人材リソース、アーキテクチャ、手法を体系化する。
     - 「成果」：ノウハウが自然とたまる、活用できる標準プロセスができる。
- ステージ３：企業競争力強化（全社）：本書対象外
  - カイゼンの定着から、企業文化の形成と企業成長を継続させる。
  - 必要に応じてカイゼンの革新
RDKitで原子間の最短パス、距離行列を求める

### はじめに
RDKitで掲題の件、調査したためメモっておく

### 環境
- Windows 10
- Python 3.6
- RDKit 2018/9/2

### やり方
まずは、必要なものをインポート

```python
from rdkit.Chem import AllChem, Draw, rdmolops
from rdkit.Chem.Draw import IPythonConsole
```

molファイルを読み込んで、分かりやすいようインデックス付きの画像で化合物を表示。

```python
def mol_with_atom_index( mol ):
    atoms = mol.GetNumAtoms()
    for idx in range( atoms ):
        mol.GetAtomWithIdx( idx ).SetProp( 'molAtomMapNumber', str( mol.GetAtomWithIdx( idx ).GetIdx() ) )
    return mol


mol = AllChem.SDMolSupplier("../som/2D2_new/16.isoliquiritigenin.mol")
mol_with_atom_index(mol[0])
```

するとこんな画像が得られる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/d77fe8e1-7716-1608-44e4-8cb3573257da.png)

0番目のOHと、13番目のOH間のパスは、以下のように得られる。
```python
rdmolops.GetShortestPath(mol[0],0,8) 
(0, 1, 2, 3, 4, 5, 6, 7, 8)
```

また全ての原子間の距離行列はこんな感じで得られる。

```python
rdmolops.GetDistanceMatrix(mol[0])
array([[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  8.,  9., 10., 11.,
        12., 10.,  9., 10.,  3.,  2.],
       [ 1.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  7.,  8.,  9., 10.,
        11.,  9.,  8.,  9.,  2.,  1.],
       [ 2.,  1.,  0.,  1.,  2.,  3.,  4.,  5.,  6.,  6.,  7.,  8.,  9.,
        10.,  8.,  7.,  8.,  3.,  2.],
       [ 3.,  2.,  1.,  0.,  1.,  2.,  3.,  4.,  5.,  5.,  6.,  7.,  8.,
         9.,  7.,  6.,  7.,  2.,  3.],
       [ 4.,  3.,  2.,  1.,  0.,  1.,  2.,  3.,  4.,  4.,  5.,  6.,  7.,
         8.,  6.,  5.,  6.,  1.,  2.],
       [ 5.,  4.,  3.,  2.,  1.,  0.,  1.,  2.,  3.,  3.,  4.,  5.,  6.,
         7.,  5.,  4.,  5.,  2.,  3.],
       [ 6.,  5.,  4.,  3.,  2.,  1.,  0.,  1.,  2.,  2.,  3.,  4.,  5.,
         6.,  4.,  3.,  4.,  3.,  4.],
       [ 7.,  6.,  5.,  4.,  3.,  2.,  1.,  0.,  1.,  1.,  2.,  3.,  4.,
         5.,  3.,  2.,  3.,  4.,  5.],
       [ 8.,  7.,  6.,  5.,  4.,  3.,  2.,  1.,  0.,  2.,  3.,  4.,  5.,
         6.,  4.,  3.,  4.,  5.,  6.],
       [ 8.,  7.,  6.,  5.,  4.,  3.,  2.,  1.,  2.,  0.,  1.,  2.,  3.,
         4.,  2.,  1.,  2.,  5.,  6.],
       [ 9.,  8.,  7.,  6.,  5.,  4.,  3.,  2.,  3.,  1.,  0.,  1.,  2.,
         3.,  3.,  2.,  3.,  6.,  7.],
       [10.,  9.,  8.,  7.,  6.,  5.,  4.,  3.,  4.,  2.,  1.,  0.,  1.,
         2.,  2.,  3.,  4.,  7.,  8.],
       [11., 10.,  9.,  8.,  7.,  6.,  5.,  4.,  5.,  3.,  2.,  1.,  0.,
         1.,  1.,  2.,  3.,  8.,  9.],
       [12., 11., 10.,  9.,  8.,  7.,  6.,  5.,  6.,  4.,  3.,  2.,  1.,
         0.,  2.,  3.,  4.,  9., 10.],
       [10.,  9.,  8.,  7.,  6.,  5.,  4.,  3.,  4.,  2.,  3.,  2.,  1.,
         2.,  0.,  1.,  2.,  7.,  8.],
       [ 9.,  8.,  7.,  6.,  5.,  4.,  3.,  2.,  3.,  1.,  2.,  3.,  2.,
         3.,  1.,  0.,  1.,  6.,  7.],
       [10.,  9.,  8.,  7.,  6.,  5.,  4.,  3.,  4.,  2.,  3.,  4.,  3.,
         4.,  2.,  1.,  0.,  7.,  8.],
       [ 3.,  2.,  3.,  2.,  1.,  2.,  3.,  4.,  5.,  5.,  6.,  7.,  8.,
         9.,  7.,  6.,  7.,  0.,  1.],
       [ 2.,  1.,  2.,  3.,  2.,  3.,  4.,  5.,  6.,  6.,  7.,  8.,  9.,
        10.,  8.,  7.,  8.,  1.,  0.]])
```

この行列の最大値を調べることにり、全原子間で最大のパスが原子0と原子13の間の12であることもわかる。
ユースケースから始めるドメイン駆動設計

ソフトウェア開発手法「ICONIX（アイコニクス）プロセス」の整理

##### 概要
ICONIXプロセスの思想は「漸進的な反復と洗練による継続的な改善」。


##### ICONIXプロセスのワークフロー
1. 要求段階
 1-1. 機能要求：システムが提供する機能を定義  
 1-2. ドメインモデリング：問題領域の理解（ユビキタス言語の定義）※作業時間目安：2時間  
 1-3. 振る舞い要求：最初のユースケース（ドラフト版）を作成  
 1-4. 要求レビュー：ユースケースが顧客要求を満たしているか確認  
2. 分析・予備レビュー  
 2-1. ロバストネス分析：ロバストネス図を使ってユースケース記述を書き直す  
 2-2. ドメインモデルを更新（作業：見落としていたクラスの発見や曖昧だった部分を修正したり、属性の追加）  
 2-3. システムに機能名をつける  
 2-4. ユースケース（ドラフト版）を更新  
3. 予備設計レビュー  
4. 詳細設計  
 4-1. ユースケースごとにシーケンス図を作成（シーケンス図の目的はクラスの責務割当て）  
 4-2. ドメインモデルを更新（ドメインオブジェクトに操作を追加）  
 ドメインオブジェクトはエンティティとなり、ドメインモデルは静的クラス（クラス図）へ生まれ変わる  
 4-3. 静的モデルの整理  
5. 詳細設計レビュー
6. 実装

##### 学習範囲
1-2.ドメインモデリングと1-3.振る舞い要求まで 

##### ドメインモデリング
[目的] 
ドメインモデリングはプロジェクトで利用される共通言語（辞書）を作成する作業。 
ドメインモデリングの目的はプロジェクトメンバー全員に明確な用語で問題領域を確実に理解させること。 
プロジェクトのドメインモデルはスコープを定義しユースケース作成の基盤とする。 
最初のドメインモデリングからユースケースを作成していく過程でドメインモデルを固めていく。 

[ガイドライン]
現実世界（問題領域）に焦点をあてる 
オブジェクト間の関係は汎化（A is B)、集約(A has B)を利用 
最初のドメインモデリングにかける時間は2時間が目安 
問題領域の主要な概念を中心にクラスを構成する 
ドメインモデルとデータモデルはイコールではない 
オブジェクト（単一インスタンスを表現した存在）とDBのテーブルを混同しない 
ドメインモデルをプロジェクトの共通言語として利用する 
名前が曖昧にならないようにユースケースを書く前にドメインモデルを作成する 
最終的なクラス図とドメインモデルは正確に一致するとは限らない 
画面やその他GUI固有の部品クラスを配置しない 

[MEMO」

| 関係       | 記号 | 説明 |    
|:-----------------|:-----------------|:-- |
| 汎化（A is B)| A --▷ B|AはBである（例：テレビは家電である）|
| 集約(A has B) |A ◇-- B  | AはBをもっている（例：ソニーはテレビを持っている）|


##### 振る舞い要求（最初のユースケース）
[目的] 
ユースケースはシステムの振る舞い要求を得る為の構造化された手法。 
具体的には「ユーザーはこのシステムで何をしたいのか。」「ユーザーは何を得たいのか。」といった疑問に答える。 

[ガイドライン] 
ユースケースのシナリオは「基本的なシナリオ」と「例外的なシナリオ」を用意する 
ユースケースはドメインモデルで用いた単語を使って記述する 
設計が可能となるユースケースを書く 
ユースケース記述は2段階以内で記述する 
アクターとユースケース図を使ってユースケースを組織化する 
ユースケースは叙述的に記述する 
イベントの応答の流れとしてユースケースを記述し、ユーザーとシステムの対話の両側を記述する 
GUIプロトタイプや画面モックアップを使う 
ユースケースは実行時の振る舞いの仕様である 
名詞 - 名詞 -動詞という構文に従って記述する 
バウンダリングクラス（システムと外部の境界）の名前を使う※ログイン画面、決済画面など 

[MEMO] 
ユースケースの関係

| 関係       |       説明 |    
|:-----------------|:------------------|
| A --▷ B| AはBの一種|
| A \<\<invokes\>\> B |Aが実行中にBが実行される |
| A \<\<precedes\>\> B |Bの実行前にAが完全に実行されている|
Microsoft Azure資格 (AZ-101) を取得するまでにやったお勉強のお話

# はじめに
Microsoft Azure の資格の一つである AZ-101 を取得したので、
勉強した内容&所感についてメモします
（試験内容には触れていません)

AZ-100についてはこちらの記事を参照いただければと思います
(https://qiita.com/spinrock/items/294ce7e3cf2b306fea81)

※ 5月で資格体系が変わって(?)、AZ-100(もしくはAZ-103)だけでAdministrator資格となるそうです  
(https://blogs.partner.microsoft.com/mpn-japan/2019/03/21/simplifying-the-certification-path-for-microsoft-certified-azure-administrator-associate/)

# AZ-101について
https://www.microsoft.com/ja-jp/learning/azure-exams.aspx#exam-az-101-section  
こちらを参照のこと

# 事前知識
+ 普段は仮想化サーバ(vSphere)などを触ってます
+ AWSのAssociate資格を取得できるくらいには趣味レベルでクラウドサービスを使っています
+ 実際のAzure構築経験はありません
+ Azureポータルはそこそこ触っていました、主に以下の部分(AZ-100の範囲)
  + IaaS(VM/Storage/VNETなど)周り
  + VPN Gateway を用いたサイト間VPN周り(Azure-vSphere/AWSは試してみた)
  + Azure Migrate (手元のvSphere環境にデプロイして遊んだ程度)

# やったこと(ほぼAZ-100と同じです)
+ mstepへの登録しました
  + Azureの仕組みを学ぶスライドでざっくり仕組みを学びました
+ 練習用のWeb問題集を解きました(不明点は以下で解消しました)
  + Azureの無料アカウントに登録して実機検証しました
  + Microsoft のドキュメントを読み込みました  
    (私は、問題集の問題を自分で答えを導き出せるように簡易的な解説をまとめました)
+ udemyで出ている資格勉強用動画の視聴しました  
  (https://www.udemy.com/ja/)
+ その他、参考にした書籍
  + 「Azureテクノロジ入門 2019」
  + 「ひと目でわかるAzure Active Directory 第2版」

# 試験が終わったあとの個人的な所感
+ Load Balancer/WebApp/FunctionApp周りについて理解できてなかった部分が多いと感じました  
  + AWSのLambdaなどで遊んでいた時の知識(なんとなくレベル)を基に消去法で選択しました  
  (正解していたのかどうかは今となってははっきりしませんが、、、)
+ やっぱり英語は苦手
iOSアプリエンジニアのためのAndroidアプリ開発入門　その2 〜新規プロジェクト作成編〜

## はじめに（対象読者と内容の方向性）

この記事は『iOSアプリ開発はやったことあるけど、Androidアプリ開発ははじめて』という方向けにAndroidアプリ開発についてまとめたものです。

iOSアプリエンジニア向けなので、『iOSでのこういう機能は、Androidではこうやって実装する』、『iOSではこういう考え方だけど、Androidではこういう考え方で実装する』みたいな形で紹介できればと考えています。

## 免責事項

Androidアプリ開発初心者が勉強しながら書いているので、たぶん間違いがたくさんあります。勉強していく過程で間違いに気がついたらその都度修正をしますが、「ここ間違ってるで〜」というのがあれば、ぜひツッコンでください。

## 全体の目次

[その1 〜インストール編〜](https://qiita.com/toshi586014/items/28a6dc614f3e8d879e9c)
その2 〜新規プロジェクト作成編〜　←イマココ
[その3 〜エミュレータ編〜](https://qiita.com/toshi586014/items/2e4478a7f7fa49f24826)
[その4 〜Git編〜](https://qiita.com/toshi586014/items/65d0875a99292d03d539)

## 新規プロジェクトの作成

まずは、新規プロジェクトを作成します。

ここで言うプロジェクトは、Xcodeのプロジェクトと同じように、アプリの内容（ソースコードやリソースなど）をひとまとめにしたものです。

<img width="778" alt="02-001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38924/35ab951a-e06c-5ae2-9352-7739d2428d8c.png">


Welcom画面で『Start a new Android Studio project』をクリックします。

<img width="1012" alt="02-002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38924/d3f30a7a-9a8a-db5f-14a2-3e660be1b6db.png">


Xcodeと同じように、プロジェクトのテンプレートが表示されるので、これから開発するアプリで使うテンプレートを選択します。今回は、Empty Activityを選択してNextボタンをクリックします。

Activityというのは、画面を表示するためのコンポーネントです（iOSアプリで言うところのViewControllerみたいなものですね）。

今回選んだEmpty Activityは、XcodeのSingle View Appみたいな感じで、空っぽの画面が一つだけあるシンプルなプロジェクトです。

<img width="968" alt="02-003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38924/e0e68008-01f4-bb6d-b256-91b8f3d18d55.png">


つぎに、プロジェクトの設定画面が表示されます。

NameとPackage nameはそのままにします（たぶん、nameはXcodeのProduct Name、Package nameはXcodeのBundle Identifierだと思います）。
Save locationはプロジェクトを保存する場所です。そのままでも構いませんが、別の場所がいい場合は変更してください。
LanguageはKotlinに変更します（Kotlinは最近Androidアプリ開発の公式になった言語です。たぶん、Java→Objective-C、Kotlin→Swiftみたいなイメージではないでしょうか）。
設定を変更したらFinishボタンをクリックします。

<img width="1012" alt="02-004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38924/bc8b2be8-e11a-4408-6e8f-52fd1bf19200.png">


インストール画面が表示されるので、しばし待ちます。終わったらFinishボタンをクリックします。

<img width="1512" alt="02-005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38924/769b01ad-7bdb-b28c-1065-8cd609d64f4e.png">


Android Studioのメイン画面が表示されました。やったね！

## Android Studioの画面構成

Android Studioの画面構成を、Xcodeと比較しながら、簡単に見てみましょう。

<img width="1595" alt="02-006.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38924/ab9e7489-a8b8-4bad-b4f3-bb6367193eec.png">

<img width="1512" alt="02-007.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38924/7f4f7e99-48f6-b04f-3394-9109a81d999f.png">

Xcodeと似ているので、なんとく想像できますね。

画面上のツールバーが、Xcodeのツールバーに当たる部分です。Xcodeと同じようにアプリの実行などを行うことができます。

左側のプロジェクトビューが、Xcodeのナビゲータエリアに当たる部分です。プロジェクトが持っているソースファイルや、画像などのリソースファイルなどを一覧表示するエリアです。

右側の編集エリアが、Xcodeのエディタエリアに当たる部分です。画面レイアウトやソースコードの編集をするエリアです。

画面下のツールウィンドウが、Xcodeのデバッグエリアに当たる部分です。アプリを実行しているときのログを表示することができます。

表示したいファイルを選ぶときは、プロジェクトビューでファイルをダブルクリックします。Xcodeと違ってシングルクリックでは表示されないので注意してください。

## 終わりに

細かいところでは違いがありますが、Xcodeと似ているところもあるので、なんとなく親近感がわきますね。

それでは、次回の更新をお待ちください。
Node.js,Expressメモ②

さてこいつを組み込みたいぜ！と始めたNode.jsの世界。こんにちは。

Expressのノリを知ってから下のページをみて組み込みの実験をしてみたいと思っています。
https://codepen.io/Ni55aN/pen/xzgQYq

ここまでわかってれば簡単に組み込めるのでは！？という気持ちをぐっと抑えて
またチュートリアルをやってみます。

https://developer.mozilla.org/ja/docs/Learn/Server-side/Express_Nodejs

こちらはこれだけやっとけばExpressのことがいろいろわかっちゃうぜ!という優れもの(まだやっていませんが)

# やっとくといい設定
①デバックを有効にする。
`SET DEBUG=express-locallibrary-tutorial:* & npm start`
express-locallibrary-tutorialはこれからやるチュートリアルのプロジェクト名です。
これをやることでプロンプトにログがでるみたいですね。

②サーバーのオートリロード
`npm install --save-dev nodemon`
パッケージをインストールする必要があるみたいです。
常に必要そうだから-gをつけてインストールしとこうかと思います。
ドラえもんみたいな名前で親しみがわきます。

これはインストールだけではだめでpackage.jsonに追記する必要があるんですね。
`
"scripts": {
    "start": "node ./bin/www",
    "devstart": "nodemon ./bin/www" < こっち
}
`

これで①のコマンドをdevstartに書き換えればよいということは
ここの名前は決められたものじゃなさそうなのでいろいろなバリエーションを持てることが予想されます。
`SET DEBUG=express-locallibrary-tutorial:* & npm run devstart`

# script > startの"bin/www"?
プロンプトでstartしたときに呼び出されるスクリプトがさしているファイルもjsのようです。
前にapp.jsが起動しないと勝手にサーバーのコマンドを書き加えましたがそれは作法と違ったことがわかりました。
wwwファイルの冒頭でapp.jsが読み込まれています。
serverの立ち上げなどもこちらで行われているようです。

# アプリケーションの追加
アプリケーションを追加するときは他のものと同じように読み込んで
`var indexRouter= require("./routes/index");`
`var usersRouter = require('./routes/users');`

①viewの設定
アプリケーションごとに変更可能みたいです
viewsフォルダ以下の同名のファイルが適応される？
`app.set("views", path.join(__dirname, "views"));`
`app.set("view engine", "pug")`

②リクエスト処理チェーン(というらしい)の設定
他にも設定されていますがとりあえず文脈的にこれだけ。
indexは特別扱いで省略できるようです。
`app.use('/', indexRouter);`
`app.use('/users', usersRouter);`

# routerとして認識させるには
app.jsではexpress()そのものを最後にexportsしていますが
routerの場合はexpress.Router()というオブジェクトを作ってexportsするみたいです。

appの場合
`
var app = express();
 ---省略---
module.exports = app;
`

routerの場合
`
var router = express.Router();
---省略---
module.exports = router;

# viewsフォルダ
view engineのファイルが置かれていますが、要するにプログラム的に拡張できるhtmlなのかな?と予想できます。
GETされてきた値を元にjsで処理して、テンプレートに渡して表示。ということになりそうです。
pugファイルは継承できるんですね。
render時に置き換え用のデータを渡すようですが宣言されていない変数はなんなんでしょう。。
titleは定型なのかな。

index.js
`res.render('index', { title: 'Express' });`

# 最後の課題
users.jsに手を加えてusers/coolを表示させるというもの。
うん。とりあえずわかっていることを実行します。
①cool.jsの作成。
　これがないとどうにもならなそうなのでindexをコピーしてリネーム。

②users.jsに構造をつくる
　フレームワークの合理性から考えてapp.jsのvar appとindexのvar express.Routerは構造は同じなのでは？と
　思ったのでusersに以下を追加したらちゃんと表示されました。
`var coolRouter = require("./cool");`
`router.use("/cool", coolRouter);`

appのuseにはもっといろいろ設定しているので何かやろうとしたときに必要なものもあるかもしれませんが
最小はこれのようです。

ついでにviewsにcool.pugって作っただけで読まれるかどうかの実験をしましたがそれはダメ。
動的に読まれているわけではないんですね。
じゃあどこで読んでいるんだろうと思ってみてみたらrender関数の第一引数がそれでした。
`res.render('cool', { title: 'You are so cool' });`

renderするときにこのテンプレ使ってね！ってことだったんですね。
なるほど。

因みにviewsの中を構造化できるのかなとテストしてみたら出来そうです。
views/cool.pug を以下に移動 views/test/cool.pug
記述の変更
`res.render("./test/cool", {title: "You are so cool"});`

注: cool.pugを移動させただけでは1行目のextend(継承)でエラーがでました。
    layoutを階層にあわせて../layoutにしないとうまくいきません。
つづく
A simple example of creating a datetime object with a specific date / hour / minute / second specification in #python and parsing it into a string

<p> <code>datetime.datetime()</code> . </p>

<pre> <code class="py">&gt;&gt;&gt; import datetime 
 &gt;&gt;&gt; datetime.datetime(2016,1,2, 10,20,5, 100).strftime(&#39;%Y-%m-%d %H:%M:%S %a %f&#39;) 
 &#39;2016-01-02 10:20:05 Sat 000100&#39; 
</code> </pre>

<h1> ref </h1>

<p> <a href="https://www.programiz.com/python-programming/datetime/strftime">Python strftime ()-datetime to string</a> </p>


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1261








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Example of randomly generating tomorrow's hour and minute with datetime of #python

<pre> <code class="py">&gt;&gt;&gt; import datetime 
 
 &gt;&gt;&gt; now = datetime.datetime.now() 
 &gt;&gt;&gt; now 
 # datetime.datetime(2019, 4, 13, 18, 44, 57, 269002) 
 
 &gt;&gt;&gt; rand_datetime_today = now.replace(hour=random.randint(1,23), minute=random.randint(1,59), second=0, microsecond=0) 
 &gt;&gt;&gt; rand_datetime_today 
 # datetime.datetime(2019, 4, 13, 3, 8) 
 
 &gt;&gt;&gt; rand_datetime_tomorrow = rand_datetime_today + datetime.timedelta(days=1) 
 &gt;&gt;&gt; rand_datetime_tomorrow 
 # datetime.datetime(2019, 4, 14, 3, 8) 
 
</code> </pre>


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1260








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
An example of writing multiple standard output of echo and cat together in one file with #shell

<pre><code>echo $(echo &quot;abc&quot; &amp;&amp; echo &quot;b&quot; &amp;&amp; cat tmp/in.txt &amp;&amp; cat tmp/in.txt) &gt; tmp/out.txt
</code></pre>


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1265








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
A simple Dockerfile example that creates an image or container with various gems in #ruby with #docker

<h1> Dockerfile </h1>

<pre> <code>FROM ruby 
 
 RUN gem install reverse_markdown redcarpet 
 
</code> </pre>

<h1> EXE </h1>

<pre> <code>$ docker build . -t ruby-gems 
</code> </pre>

<pre> <code>$ docker run -it ruby-gems /bin/bash 
</code> </pre>

<pre> <code>root@dd130726b871:/# echo &quot;&lt;h1&gt;Hello&lt;/h1&gt;&quot; | reverse_markdown 
 # Hello 
 root@dd130726b871:/# echo &quot;&lt;h1&gt;Hello&lt;/h1&gt;&quot; | reverse_markdown | redcarpet 
 &lt;h1&gt;Hello&lt;/h1&gt; 
</code> </pre>


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1262








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
An example of a simple script that combines multiple #JSON arrays flat with #python

<h1> script </h1>

<pre> <code class="py">#!/usr/bin/env python3 
 
 import sys, json 
 
 results = [] 
 
 for input_data in sys.argv[1:]: 
 results += json.loads(input_data) 
 
 print(json.dumps(results)) 
 
</code> </pre>

<h1> EXE </h1>

<pre> <code>$ ./concat-array.py &#39;[1,2,3]&#39; &#39;[{&quot;a&quot;:&quot;b&quot;,&quot;c&quot;:&quot;d&quot;}]&#39; &#39;[&quot;e&quot;,&quot;f&quot;]&#39; | jq . 
 [ 
 1, 
 2, 
 3, 
 { 
 &quot;a&quot;: &quot;b&quot;, 
 &quot;c&quot;: &quot;d&quot; 
 }, 
 &quot;e&quot;, 
 &quot;f&quot; 
 ] 
</code> </pre>


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1263








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
代表的な正規表現一覧

代表的な正規表現一覧はこちら。

![正規表現.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342318/54f3bd06-f956-c455-f58a-74faa47201f4.png)

上の画像の一覧はこの本からの引用。
実際に使えるコードが沢山あり、初心者には
有益かと思います。
![71+C+rf5o8L._AC_UL436_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342318/be6e8713-91ed-3dd2-0ac3-b3a1fdc0a819.jpeg)
[注意] Vue CLIは勝手にgit initしてしまう時がある

# 勝手にgit initする条件
gitで管理されていないディレクトリでオプションを付けずに`vue create NEW-VUE-APP`をすると
NEW-VUE-APP生成中に勝手にgit initしてしまうそうです。（バージョン3.5.5時点）

```
parent              <- ここだけでgit管理したいのに
├── server/
└── NEW-VUE-APP/    <- なぜか生成時からgit管理されている
```

# 勝手にgit initされたら困る場合は
* 事前にparentディレクトリで git init しておく
* [Vue CLIの公式ドキュメント](https://cli.vuejs.org/guide/creating-a-project.html#vue-create)にある以下のオプションでコントロールする　(`vue create -n NEW-VUE-APP`でgit initを回避)

```
  -g, --git [message|false]       Force / skip git initialization, optionally specify initial commit message
  -n, --no-git                    Skip git initialization
```

# 所感
アプリを自動生成するツールとしてはオプションを付けた時だけgit initするほうが自然だと、私は思います。
なので私のように罠にはまる人が少なからずいるだろうなと思ってこの記事を書きました。
公式ドキュメントを読むのは大事ですね・・

以下のissueの結果、現在の仕様になっているようです。（以前は問答無用でgit initしていたようです）
https://github.com/vuejs/vue-cli/issues/967
JmeterでMySQLへの接続

### インストール
#### Requirements
- Java 8 or Java 9
- JREまたはJDK(HTTPS扱うならJDK推奨)

実行環境

- macOS 10.14.4
Javaなんでプラットフォームは基本的になんでもよさげ。

インストールコマンドはbrewでいける。versionは5.1.1だった。

```
brew install jmeter
```

それとMySQLに接続する為、ドライバをダウンドロードし、jmeterのlibフォルダ配下にjarファイルを置く

```
curl  -LO https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.15.tar.gz
tar -xzvf mysql-connector-java-8.0.15.tar.gz 
cd mysql-connector-java-8.0.15
cp mysql-connector-java-8.0.15.jar /usr/local/Cellar/jmeter/5.1.1/libexec/lib/
```

### スクリプト作成

参考URL: https://jmeter.apache.org/usermanual/build-db-test-plan.html

1. Add -> ThreadGroup
2. Add → Config Element → JDBC Connection Configuration. 
3. Add → Sampler → JDBC Request
4. Add → Listener → Summary Report

### CLI
[オプション](http://jmeter.apache.org/usermanual/get-started.html#non_gui)
ざっくり

 - -n でcli
 - -t test file
 - -l ファイル出力
 
```
jmeter -n -t example.test -l test.log
```

### 変数
Test Plan -> Config Element -> User defined variables

${}で呼び出し
insert into t1 values (null,'${test_var}');

#### CSVからの読み込み
Thread Group -> Add -> Config Element -> CSV Data Set Config

variable namesに変数名を入れる。カンマ区切りで複数入力可能

csvファイルは実行するファイルと同じ場所に配置しておく。
スレッド毎に新しい行を読み込む。新しい行がなければループする。

### Tips
基本的に負荷試験はCLIでの実行する。
GUIはスクリプト作成時や確認用。
リスナーは無効化しておく。

Memory不足で落ちたらHEAPサイズ(Xmx)を上げる。

```
$ grep -i Xmx /usr/local/Cellar/jmeter/5.1.1/libexec/bin/jmeter
##   JVM_ARGS="-Xms1g -Xmx1g" jmeter etc.
##                    Defaults to "-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"
: "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"
```

2年ぐらい前に触った時は1Gもなかった気がする。

それでもダメなら、下記を参考に調整かな
https://www.blazemeter.com/ja/blog/nine-easy-solutions-jmeter-load-test-%E2%80%9Cout-memory%E2%80%9D-failure
SEOバイブル

##コンテンツマーケティング
#もくじ
+ 目的
+ キーワード選定方法
+ ライティングで気をつけること
+ 記事のSEO価値の公式
+ 記事タイトルについて
+ 権威性と信頼性の具体的な対策
+ 被リンク獲得方法
+ 滞在時間
+ サーバーについて
+ 回遊率
+ ペナルティ

#目的
売上UP、採用数UP、認知度UP
###ポイント
+ 検索意図を満たしているか
+ 記事の内容
+ いろんな人から支持を得てる(最適な被リンク)

###なにをするのか
+ 有益な情報を発信し、様々なキーワードで上位表示をする
+ 悩みや役立つ情報をコラムを書く
+ 自社商品の顧客になりそうなユーザーが検索しそうなキーワードでたくさん上位表示

自社のビジネスに関連するキーワードをピックアップ
↓
それらのキーワードで上位表示するために記事を書く
↓
様々なキーワードで上位表示される
↓
見込み客が集客できる

###キーワードの選定方法

商品が明確×悩みが明確なキーワード

「婚活サイト おすすめ」
「ドッグフード 人気」
「パーソナル トレーナー 新宿」
「商標キーワード」

ニーズが高いキーワード
「結婚したい」
「犬 長生きする方法」
「小顔になりたい」
「筋トレ 効率的」
「相続 家族 問題」

見込み客を育てるキーワード
30代 平均　年収
犬　しつけ　上手くいかない
ボブ　似合う　顔の形
男性　モテる方法
保険　受け取り方

軸となる単一キーワードを考える
「婚活サイトの場合」
結婚、婚活、お見合い、恋活、出会い、相席屋
「ドッグフードの通販会社の場合」
ドッグフード 無添加、犬 しつけ、マルチーズ　エサ　おすすめ
「パーソナルトレーナーの場合」
筋トレ　食事、ダイエット　お腹、大胸筋　鍛え方、プロテイン　飲むタイミング

検索キーワードツールを使ってリストを作成する
複合キーワードをまとめたリストを検索意図でグループ分けをする

コンテンツ制作で考えておくべきこと

+ 検索意図
狙っているキーワードはどんな意図で検索されるか

+ 専門性
調べたい人にとって深く言及されているか
+ 網羅性
あらゆる角度から説明されているか

■記事

+ そのキーワードの１位-20位のサイトをリサーチして、なにが書かれているかリストアップする
+ リストアップした内容を全て記事に盛り込み網羅する
+ アマゾンでそのジャンルの書籍を買って読む

```
目次にする
<h2>妊娠した時にかかるお金</h2>
<h3>定期検診の費用</h3>
<h3>入院費用</h3>
<h3>出産費用</h3>
<h3>出産までに準備しとくもの</h3>

<h2>妊娠したときにもらえるお金</h2>
<h3>育児休業手当</h3>
<h3>出産一時金</h3>

<h2>税金などについて</h2>
<h3>産休中の社会保険料</h3>
<h3>出産後の所得税について</h3>

<h2>こんな場合は高くなる場合も</h2>
<h3>個室で入院する場合</h3>
```

##ライティングで気をつけること
自分の体験談が入っていることをアピール
他の記事のやんわりした否定
とにかく詳しく書いていることをアピール
簡単な結論を先に書いちゃう
絶対に覚えておくことを書いちゃう
絶対にしてはいけないことを書いちゃう
※どれか一つをはじめに書く

「〇〇　ランキング」ならランキングから書いたり、ユーザーの気持ちになって記事の順番を考える

キーワードを上から下までまんべんなく入れる

難しい言葉は使わない

共起語に変換したほうがいい場合は変換する

とにかく見やすくわかりやすく
画像での説明
図での説明
表での説明
イラストでの説明
動画での説明
列挙する場合はリストにする(brタグ)

##記事のSEO価値の公式
記事コンテンツ「オリジナリティ」「専門性」

内部リンクなどでの補足「網羅性」

参照リンク「客観性」「正当性」

一覧とさらに深掘りした内容の記事への内部リンク

##記事タイトルについて
「文字数」
34文字以内
「狙っているキーワードは全て入れる」
できれば上のほうに入れる
「具体的な数字を入れる」
〇〇品全て比較してみた
「絞る」「かぎかっこで強調する」
〇〇限定

##権威性と信頼性の具体的な対策
どういう指標で判断しているか？
運営者名を入れる　サイト名を入れる　どんなサービスかわかる
→他のサイトで取り上げられる工夫をする
→被リンクの数

##被リンク獲得方法
エイチレフスでどこからリンクを受けているかをリサーチしてマネする
有力者とのタイアップ
キュレーションメディア
youtube
イベントを立ち上げる

##滞在時間
目安5分程度
読み込ませることができれば8-10分

##サーバーについて

+ MIXサーバー
+ エックスサーバー

##回遊率
ページセッション 3-6
直帰率30-60%

##ペナルティ
サイト内リンクがたくさん切れている
画像が表示されない
文字が見づらい
ディスクリプションが全てのページで同じ
React Release v16.8.6

https://github.com/facebook/react/releases/tag/v16.8.6

## v16.8.6
### React DOM
- `useReducer()`での誤ったbailoutを修正
- Safari DevToolsにおけるiframeの警告を修正
- `contextType`が`Context`ではなく`Context.Consumer`にセットされたときに警告するように
- `contextType`が無効な値にセットされたときに警告するように
React Release v16.8.5

https://github.com/facebook/react/releases/tag/v16.8.5

## v16.8.5
### React DOM
- selectタグで選択されている最初のoptionにsize属性を設定しないように修正
- `useEffect(async () => ...)`のwarningメッセージを改善
- 重複したReactによるエラーメッセージの改善

### React DOM Server
- サーバレンダリング時のuseLayoutEffectのwarningメッセージを改善

### React Shallow Renderer
- Hooksで動くshallow rendererの`setState`を修正
- shallow rendererで`React.memo`をサポートするように修正
- shallow rendererでHooks内の`forwardRef`をサポートするように修正
React Release v16.8.3

https://github.com/facebook/react/releases/tag/v16.8.3

## v16.8.3
### React DOM
- UMDビルド時に入力フォームが正しく動作しなバグを修正
- renderフェーズの更新が破棄されるバグを修正

### React DOM Server
- renderが完了する前にストリームが破棄された場合、context stackを巻き戻すように修正
  - その後のrenderで誤った値が渡されるのを防ぐため


### ESLint Plugin for React Hooks
- recommendedルールに`exhaustive-deps`を追加
  - useEffectの依存関係周り
    - https://www.npmjs.com/package/eslint-plugin-react-hooks
    - https://github.com/facebook/react/issues/14920
React Release v16.8.2

https://github.com/facebook/react/releases/tag/v16.8.2

## v16.8.2
### React DOM
- `useEffect`内で`ReactDOM.render`が動作しない問題を修正
- 空のPortalsをマウントした際にクラッシュする問題を修正
- dependenciesが指定されなかった際に`useImperativeHandle`が正しく動くように修正
  - `useImperativeHandle`の第3引数
- `crossOrigin`属性がSVG要素で動くように修正
- HooksでSuspenseを使用した際の誤検知を修正

### React Test Utils and React Test Renderer
- コンポーネントスタックを`act()`に含めるように
React Release v16.8.0, v16.8.1

https://github.com/facebook/react/releases/tag/v16.8.0
https://github.com/facebook/react/releases/tag/v16.8.1

## v16.8.0
### React
- Hooksの追加
- Hooksの`useReducer`のlazy initialization APIを改善

### React DOM
- `useState`/`useReducer`で同一値の再レンダリングを回避
- `useState`/`useReducer`の値の比較に`Object.is`を利用
- `useEffect`/`useMemo`/`useCallback`で最初に渡された引数を比較しない
- `React.lazy()`にsynchronous thenablesをサポート
- strict-modeのHooksでコンポーネントを2回レンダリングするように
- 開発モードでHooksの順序に対して警告を出すように
- cleanup関数はundefinedを必ず返すように(その他の値やnullは禁止)

### React Test Renderer and Test Utils
- shallowレンダリングでHooksをサポート
- shallowレンダリング時に`getDerivedStateFromProps`があるときの`shouldComponentUpdate`内の誤った状態を修正
- テストが実際の動作とより厳密に一致するよう、バッチ処理のための`ReactTestRenderer.act()`および`ReactTestUtils.act()`を追加

### ESLint Plugin: React Hooks
- 初回リリース
- ループが発生した際のレポート機能を追加
- throwingをルール違反とみなさないように

## v16.8.1
### React DOM and React Test Renderer
- 古いバージョンのReactと同時に利用した際にクラッシュする問題を修正

### React Test Utils
- Node環境でクラッシュする問題を修正
Script名をオブジェクト名に設定するエディター拡張

#動機
Unityではゲームオブジェクトの名前を任意に設定できるが、管理クラスなど大きな役割を果たすものはスクリプト名をそのまま設定したいこともある。
そういった場合でのタイプミスを減らすためにもエディター拡張を作ってみた。

#動作環境
- Windows 10
- Untiy2018.3.12f1

#スクリプト
```C#
using UnityEngine;
using UnityEditor;
public static class SetScriptNameToGameObject
{
    // 1.コンテキストメニューから処理を呼び出せるように属性を付加
    [MenuItem("CONTEXT/MonoBehaviour/Set ScriptName To GameObject")]
    private static void Excute(MenuCommand command)
    {
        // 2.選択したスクリプト名を取得
        var name = command.context.GetType().ToString();
        // 3.スクリプト名の名前空間を取り除く
        while (name.Contains("."))
        {
            var index = name.IndexOf('.');
            name = name.Remove(0, index + 1);
        }

        // 4.選択したコンテキストの先頭文字は現在のオブジェクト名になる
        var target = command.context.ToString().Split(' ')[0];
        // シーン内にあるオブジェクトを取得してスクリプト名を設定
        GameObject.Find(target).name = name;
    }
}
```

##使ってみた
![SetScriptNameToGameObject.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96676/2f63e260-77f4-cc72-6038-6b02dfd96aac.gif)
MonoBehaviourを継承したスクリプトのコンテキストメニューから**SetScriptNameToGameObject**を選択することでゲームオブジェクトの名前がスクリプト名になるようになった。
これでタイプミスが減るし、そもそも手入力する必要がなくなる。