OmniAICreator/Qiita-1.07M huggingface dataset:
【CSS】BEMのデメリットについて

BEMはとても便利で個人的に大好きなCSS設計です。しかし、他の記事では見たことがない(と思う)ようなデメリットを感じました。

それは、「別のBlockのElementを使い回せない」ことです。

```html:index.html
<header class="header">
  <a href="#" class="header__button">Button</a>
</header>

...

<footer class="footer">
  <a href="#" class="footer__button">Button</a>
</footer>
```

```css:style.css
.header {
  ...
}

.header__button {
  color: #fff;
  background-color: #f00;
  padding: 5px 15px;
}

.footer {
...
}

/* .header__buttonと同じスタイル */
.footer__button {
  color: #fff;
  background-color: #f00;
  padding: 5px 15px;
}
```

もちろんプリプロセッサを使えばextendなどで共通化はできますが、クラスの付け替えでの対応はできないままです。

## 結論

あまりBEMの構造にとらわれすぎずに、一部分はマルチクラスにするなど柔軟に対応していきましょう。いいとこ取りをして便利に使うことが大切だと思います。

ちなみに、いろいろな設計からいいところを集めたような設計の[FLOCSS](https://github.com/hiloki/flocss)というものが存在するので気になる方は見てみてください。
Pandasで条件に合致する行の欠損値のみを置換する

機械学習するためのデータの欠損値(NaN)を置換する方法のメモ。

ある列の欠損値を全て同じ値で置換するだけであればfillna()を使用すれば簡単にできるが、別の列の値によって置換する欠損値を変えたい場合は少し工夫が必要。

**＜例＞**
KaggleのTitanicチュートリアルのデータで、年齢の欠損値を平均値で置換する。

(A)全ての欠損値を全体の平均値で置換する場合

```python3
import pandas as pd

# データの読み込み 
train = pd.read_csv("train.csv")

# 年齢の欠損値を全体の平均値で置換
train.loc[:,"Age"] = train["Age"].fillna(train["Age"].mean())
```

(B)性別(Sex)が男(male)の行の欠損値を男性の平均値で置換する場合

```python3
import pandas as pd

# データの読み込み 
train = pd.read_csv("train.csv")

# 男性の欠損値を男性の平均値で置換
train.loc[(train["Sex"].values == "male") & (train["Age"].isnull()), "Age"] = train.query("Sex == 'male'")["Age"].mean()
```
make diffするとLaTeXソースファイルから差分PDFが作られるサンプル

# はじめに

査読のある論文誌に論文を投稿すると、査読コメントが返ってくる。たいていの場合は一発で通ることはなく、査読コメントに従って修正する必要があるだろう。この時、前回投稿した版との差分を明示したPDFを添付せよ、と言われることがある。Wordの差分表示などを想定しているのだろうが、LaTeXを使っていると、差分PDFを作るのがちょっとだけ面倒くさい。そこで`make diff`で差分PDFを作るmakefileを作って運用している。このmakefile、誰かの参考になるかもしれないのでちょっと紹介してみる。

サンプルファイルを以下に置いておく。

https://github.com/kaityo256/makelatexdiff

# 方針

差分抽出にはlatexdiffを用いる。

```shell-session
$ latexdiff before.tex after.tex > diff.tex
```

で、差分表示用のLaTeXファイルが作成されるので、それをコンパイルすれば良い。

差分を作成する元の版だが、GitやSubversionのタグで管理する方法もあると思われるが、とりあえずディレクトリで管理してしまうことにする。論文を投稿する時にsubmitというディレクトリを掘って、そこに投稿時のソースファイルを放り込んで置こう。

後に差分が必要になったら、カレントディレクトリと、その下のsubmitディレクトリにあるソース・ファイルから差分を作ることにしよう。ディレクトリ構成はこんな感じ(図や参考文献ファイルは省いてある)。

```
.
├── makefile
├── sample.tex
└── submit
    └── sample.tex
```

# Makefile

とりあえずmakefileはこんな感じになる。

```makefile
TARGET=sample
SRC=$(TARGET).tex
DVI=$(SRC:.tex=.dvi)
PDF=$(SRC:.tex=.pdf)
EPS=$(shell ls *.eps)
TEX=platex
DVIPDF=dvipdfmx
DIFFDIR=submit 

.SUFFIXES: .tex .dvi .pdf

all:$(PDF) 
	open $(PDF)

$(DVI): $(SRC) $(EPS)

$(PDF): $(DVI) 

.dvi.pdf:
	$(DVIPDF) $<

.tex.dvi: 
	$(TEX) $<
	$(TEX) $<

diff: diff.pdf
	open $<

diff.pdf: diff.tex

diff.tex: $(SRC)
	latexdiff $(DIFFDIR)/$(SRC) $(SRC) > diff.tex

clean:
	rm -f $(DVI) *.aux *.log *.toc *.pbm *.bmc $(PDF) diff.pdf
```

細かい説明は不要かと思うが、`TARGET`にLaTeXソースファイル名、`DIFFDIR`に差分表示の起点となる版が置いてあるディレクトリを指定すればそのまま使えると思う。`bibtex`を使う場合は、*.texから*.pdfを作成するルールにその処理も追加する必要がある。

このmakefileを使って、単に`make`するとカレントディレクトリの最新版がコンパイルされ、PDFが表示される。`make diff`すると、`DIFFDIR`に指定したディレクトリ以下のソースファイルと現在のソースファイルの差分を`diff.tex`に吐いてから、それをコンパイルして`diff.pdf`を作成し、表示する。

`diff.pdf`は例えばこんな表示になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/c726aa15-2021-9c96-a691-64c3ac61b503.png)

以前の版と比較して、削除されたところが赤、追加されたところが青く表示される。

# まとめ

makefileを使って差分PDFを作成するサンプルを作ってみた。普通は`make`でコンパイルし、たまに`make diff`すると自分でもどのように修正したのかわかって良い。僕はLaTeXのコンパイルにmakeを使っているので、差分表示もmakefileでできると便利だなと思って組み込んだんだけど、普通の人はTeXShopとかそういうのを使ってるんですかね？

ここでは単純にディレクトリでやったけど、おそらく文書はなんらかのVCSで管理されているだろうから、タグを使うのがスマートな気がする。まぁSubversionだとタグもディレクトリも似たようなものだけど・・・

どうでもいいけど、LaTeXのマクロとか書いているともういろいろつらいので、LaTeXの代替システム、例えば[SATySFi](https://github.com/gfngfn/SATySFi)みたいなものが発展することを期待。
【備忘録】WPFのDataGridのCanUserDeleteRowsとCanUserAddRowsの初期値を疑問に思った件

この記事は、簡単な情報共有です。
WPFのDataGridで、行の削除を禁止していたつもりが、キーボードでDeleteキーを押したら削除できてしまった時の備忘録。

#開発環境
Visual Studio Community 2017
WPFアプリ(.NET Framework) のプロジェクト
Windows10 Home 64bit

#はじめの状況
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/aa83bc6c-0aa1-03b7-5ac3-d9029c5bfd52.png)
DataGridのプロパティでは、[CanUserAddRows]と[CanUserDeleteRows]のチェックボックスは入っていません。
xamlをみると、CanUserAddRowsとCanUserDeleteRowsを指定していません。
当然、デフォルトはCanではない（つまり、追加も削除もできない）と思ってしまいました。

#Deleteキーで行が消えた！？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/d438d2cd-9691-abf5-d398-1078dac77498.png) → ![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/70b34f3e-442b-e069-4862-b636ef2b57e3.png)
行を指定してDeleteキーを押したら、行が消えてしまう！
しかも、なんか、データ2行しかないのに、データ追加用の行がある。

#プロパティを設定してみる
↓　はじめの状況に対して、プロパティのCanUserDeleteRowsにチェックいれても、XAMLのコードに変化がないので、違和感を感じる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/73b2c5f8-6421-4976-cc84-3757f2942b55.png)

↓　チェックを外してみると、XAMLのコードに変化が出た。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/8e9eff0b-ac98-db9a-dc20-ea0aaa61b8d8.png)

↓　もう一回、チェックを入れてみると、XAMLのコードから、CanUserDeleteRowsの設定コードが消えた！？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/7aaf9ff9-146a-123f-6716-3aef1f69c7b5.png)

はじめの状況では、**チェックなし＝コードなし**だったのに、
チェックを付けたり外したりしたら、**チェックあり＝コードなし**に変わった。

#結論
今の自分の開発環境しか確認していないが、
CanUserDeleteRowsとCanUserAddRowsの設定コードがない（＝デフォルト値）の時、
プロジェクトの新規作成後とプロジェクトの読み込み後に、プロパティ表示が正しくないようだ。

再現性があるので、思い違いではないと思うのだが、、、。
ググっても出てこないので、、、最近からの不具合？　それとも、みんな知っていすぎてWebに書かないからググっても出てこないのか？

#補足
CanUserDeleteRows：DataGridに画面上の操作で行の削除ができるかできないかを設定するプロパティ
CanUserAddRows：DataGridに画面上の操作で行の追加ができるかできないかを設定するプロパティ
Colaboratory上でOpenCVを使って顔認識をしてみる

# 下準備

[OpenCV公式GitHub](https://github.com/opencv/opencv)で配布されているカスケード分類器のファイル(haarcascade_frontalface_default.xml)をDLしておき、Colaboratoryにアップロードする。

```python
from google.colab import files #
f = files.upload() #ファイルアップロード
```

# コード

```python
import io
import numpy as np
import requests
import cv2
from matplotlib import pyplot as plt

# Web上の適当な画像を読み込む
res = requests.get('https://www.warnerbros.com/sites/default/files/styles/key_art_270x400/public/matrix_keyart.jpg')

bin_data = io.BytesIO(res.content)
file_bytes = np.asarray(bytearray(bin_data.read()), dtype=np.uint8)

img = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)

# OpenCV上はBGRフォーマットだが、matplotで表示するためにRGBフォーマットに変換する
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 事前にアップロードした分類器ファイルを使用する
cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')

# 分類器で検出
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
    
# 検出した領域を矩形で囲む
for (x, y, w, h) in face:
  cv2.rectangle(img, (x, y), (x + w, y + h), (200,0,0), 3)

# デフォルトだとグリッドとxy軸ラベルが表示されるので非表示にする
plt.grid(False)
plt.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False)
plt.imshow(img)
```

# 結果

|![opencv.png](https://qiita-image-store.s3.amazonaws.com/0/165884/fb51224f-fa07-dff4-f915-a1285ae8cc76.png)|
|:--|
ざっくり分かるNEM2(Catapult) 〜マルチレベルマルチシグネチャ〜

# はじめに

- そもそもNEMって何ができるの？という方
  - [NEM/mijinで備わっている基本機能](https://qiita.com/daoka/items/312cbe98c298e3364810)
- NEM2(Catapult)で追加されるもう一つ機能 アグリゲートトランザクションについて知りたい方
  - [ざっくり分かるNEM2(Catapult) 〜アグリゲートトランザクションを知る〜](https://qiita.com/daoka/items/6b78ab611232eb3b4541)

# マルチシグネチャとは

マルチレベルマルチシグネチャの話をする前に、そのベースとなるマルチシグネチャを軽く振り返ると、マルチシグネチャはあらかじめ定めた複数人の署名がないと送金できないアカウントとなります。

<img width="720" alt="スクリーンショット 2018-05-23 21.48.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/2dd10833-d689-7bb1-4a49-f80d01772555.png">

上の図では、あらかじめ定めた3人のうちの2人の署名がないとお店に代金を支払うことができません。
あらかじめ定めた期間内に署名がそろわなかった場合、送金はキャンセルされます。
マルチシグネチャは現行のNEMでも備わっており使うことができます。

# マルチレベルマルチシグネチャとは

マルチレベルマルチシグネチャは、NEM2(Catapult)で導入される機能で、マルチシグアドレスを階層化することができます。
現行のNEMではとあるマルチシグアドレスが別のマルチシグアドレスの連署人になることはできませんが、次期バージョンではそれができるようになります。従って以下の図のような会社のワークフローみたいな仕組みを作ることができます。

<img width="720" alt="スクリーンショット 2018-05-23 21.56.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/6c540fd8-8763-4efa-bd8b-bdb7874783b7.png">

上の図では以下のマルチシグが設定されています

- 1階層目: 部内投票マルチシグ (部員の3人中2人の署名が必要）
- 2階層目: 部長決済マルチシグ (部内投票と部長の両方の署名が必要)
- 3階層目: 社長決裁マルチシグ (部長決裁と社長の両方の署名が必要)

# まとめ

マルチレベルマルチシグネチャによって、社内のワークフローのような階層化された複雑なシーンにも対応しやすくなったと考えられます。
一方でアグリゲートトランザクションであげたとき同様、マルチシグの構造が複雑化し、誰の承認が必要なのか分かりづらくなったり、現行のマルチシグも同様ですが、連署人が秘密鍵をなくした際にマルチシグアドレスの資産も永久に取り出せなくなるリスクもあるため、可視化の仕組みやリスクに耐えうる構造にするなど考慮していく必要がありそうです。
Mac に最小限の LaTeX 環境を導入する（2018年版）

# 手順

## BasicTeX のインストール

[BasicTeX.pkg](http://tug.org/cgi-bin/mactex-download/BasicTeX.pkg) でインストールする方法と、Homebrew でインストールする方法がある。

Homebrew でインストールする場合は、以下のコマンドを実行する。

```shell-session
$ brew cask install basictex
```

## PATH の設定

`/usr/local/texlive/YYYYbasic/bin/x86_64-darwin` に PATH を通す

## Tex Live の初期設定

以下のコマンドを実行する

```shell-session
$ sudo tlmgr update --self --all                # TeX Live のアップデート
$ sudo tlmgr paper a4                           # デフォルトの用紙サイズの設定
$ sudo tlmgr install collection-langjapanese    # 日本語 pTeX / upTeX のインストール
```

# 参考資料

- https://texwiki.texjp.org/?BasicTeX
flutter l10n で No @@locale or _locale field found in intl_en, assuming 'en' based on the file name. 

```
flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/l10n --no-use-deferred-loading lib/l10n/l10n.dart lib/l10n/intl_*.arb
```

上記コマンドでdartファイルのジェネレートをしようとしたところ、次のようなメッセージが出力された。

```
No @@locale or _locale field found in intl_en, assuming 'en' based on the file name.
No @@locale or _locale field found in intl_ja, assuming 'ja' based on the file name.
No @@locale or _locale field found in intl_messages, assuming 'messages' based on the file name.
```

コマンドの終了コードは0で、翻訳リソースの取得自体もできているので、特に問題なさそうだが気になって調べた。

どうやらarbファイルのフィールドに `@@locale`がないよってことで出力されているらしい。
`@@locale`フィールドを手動で追加(`ja`,`en`)することで表示されなくなった。

`intl_messages.arb`の`@@locale`には`messages`を指定したが、`intl_messages.arb`の生成のたびに消えてしまう。さらにしらべると `--locale`オプションが使えることがわかり、`arb`の生成コマンドは次のようにすることで、再生成しても`@@locale`がある状態になった。

```
flutter pub pub run intl_translation:extract_to_arb --locale=messages --output-dir=lib/l10n lib/l10n/l10n.dart
```

### 参考
https://github.com/dart-lang/intl/issues/133
https://github.com/dart-lang/intl_translation/pull/16
Ether の単位一覧を取得

* Web3.js 1.0 を使用しています

# Example code

```js
var Web3 = require('web3');
console.log(Web3.utils.unitMap);
```

# Output
```json
{ noether: '0',
  wei: '1',
  kwei: '1000',
  Kwei: '1000',
  babbage: '1000',
  femtoether: '1000',
  mwei: '1000000',
  Mwei: '1000000',
  lovelace: '1000000',
  picoether: '1000000',
  gwei: '1000000000',
  Gwei: '1000000000',
  shannon: '1000000000',
  nanoether: '1000000000',
  nano: '1000000000',
  szabo: '1000000000000',
  microether: '1000000000000',
  micro: '1000000000000',
  finney: '1000000000000000',
  milliether: '1000000000000000',
  milli: '1000000000000000',
  ether: '1000000000000000000',
  kether: '1000000000000000000000',
  grand: '1000000000000000000000',
  mether: '1000000000000000000000000',
  gether: '1000000000000000000000000000',
  tether: '1000000000000000000000000000000' }
```

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Ether_の単位一覧を取得
Vue.jsのmixinをslotで代用する

Vueにはmixinという機能がある。

https://vuejs.org/v2/guide/mixins.html

同一の機能を複数のコンポーネントに適応させるというものだ。

共通の機能を提供する便利なものだが、あまり楽観的に使えるものではない。

例えばReactでも過去には存在していたが、既に廃止されている。
なぜ廃止されたかは理由を読めばmixinのどのような点が危険な点かが見えてくるだろう。

* https://reactjs.org/blog/2016/07/13/mixins-considered-harmful.html
* https://medium.com/@dan_abramov/mixins-are-dead-long-live-higher-order-components-94a0d2f9e750

ざっくりと要約するとこのへんが上げられている

* 暗黙の依存関係を導入してしまう
* 名前の衝突を起こす
    * 複数のmixinがあり、それらがプロパティを上書きするために名前が衝突してしまう
* 拡張のたびに雪崩的に複雑さを引き起こす

そこでVue.jsでもmixinを使わない方法を今回は記述したい

# どうするか？

Reactでは高次コンポーネントを導入することで解決している。
Vue.jsにおいては`<slot>`を使えばこれは多くの場合解決出来そうだ。

（render propsによる方法もあるが、こちらは下記の記事におまかせしたい。
[Vue.jsにおけるRender PropとScoped Slotsについて](https://qiita.com/seya/items/abccdd7b502535844659) ）

今回は例としてマウスイベントをトラッキングする処理を考える。

## まずはmixinを使った実装

マウスイベントをとるmixinはこんな感じ。

```js
// mouseMixin.js
export default {
  data() {
    return {
      x: 0,
      y: 0
    };
  },
  methods: {
    mousemove(e) {
      this.x = e.clientX;
      this.y = e.clientY;
    }
  }
}
```

利用側はこんな具合になる。

```html
<!-- Item -->
<template>
  <div @mousemove="mousemove">
    <div>Item with mixin</div>
    <div>x: {{ x }}</div>
    <div>y: {{ y }}</div>
  </div>
</template>

<script>
import mouseMixin from "./mouseMixin"

export default {
  mixins: [ mouseMixin ],
};
</script>
```

呼び出しはあとは下記のような感じになる。

```html
<!-- Parent.vue -->
<template>
  <div>
    <Item />
  </div>
</template>

<script>
export default {
  components: {
    Item,
  }
};
</script>
```

先のmixinの問題点として上げたとおり、`x`,`y`,`mousemove`が暗黙的になっており、定義を探すのに`mouseMixin`をたどることになる。
mixinが一つぐらいなら問題になることは少ないかもしれないが、これが増えてくると厳しくなってくるだろう。

## slotにする

まずmixinを利用する側。
`x`と`y`をもらうだけで至ってシンプル

```html
<!-- Item.vue -->
<template>
  <div>
    <div>Item with scope</div>
    <div>x: {{ x }}</div>
    <div>y: {{ y }}</div>
  </div>
</template>

<script>
export default {
  props: {
    x: Number,
    y: Number
  }
};
</script>
```

次にMouseEventの処理をするMouseEvent.vueを分離したもの。
mousemoveを取得して`slot`に対して`x`と`y`を渡す。

```html
<!-- MouseEvent.vue -->
<template>
  <div @mousemove="mousemove">
    <slot :x="x" :y="y"></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      x: 0,
      y: 0
    };
  },
  methods: {
    mousemove(e) {
      this.x = e.clientX;
      this.y = e.clientY;
    }
  }
};
</script>
```

最後に組み合わせるところ。`<MouseEvent>`の子として`slot-scope`を定義し`Item`に渡す

```html
<!-- Parent.vue -->
<template>
  <div>
    <MouseEvent>
      <div slot-scope="{x, y}">
        <Item :x="x" :y="y" />
      </div>
    </MouseEvent>
  </div>
</template>

<script>
export default {
  components: {
    MouseEvent,
    Item,
  },
};
</script>
```

## まとめ

* Vueだとscopeを使ってしまう場合、記述量が増えて冗長になってしまうのは否めない。
    * 願わくばもう少し簡易に書けると嬉しいが・・・・
    * そしてscope-slotの使い方は覚えづらいので慣れが必要な感じ
* とはいえ、それぞれ暗黙的な呼び出しは無くなったり、複数組み合わせても名前の衝突が起きないことは利点だろう。
* mixinを避けたい場合はそこそこあるので、使えるパターンだろう。
Eclipse~Javaのプロジェクト作成~

# はじめに
今回はEclipseでJavaプロジェクトの作成方法を記載したいと思います！
難しくはないので、サクサクといっちゃいましょー！！

# プロジェクトの作成
まずは、

「ファイル」→「新規」→「プロジェクト」ポチッ
![キャプチャ_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/259129/5f458781-2dd2-9c6f-14bb-6d37c4d61bd0.png)

「Java」→「Java プロジェクト」選択→「次へ」ポチッ
![キャプチャ_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/259129/e3870219-902b-984f-55b6-fff557b7fb9f.png)

プロジェクト名に「Main」と入力→「完了」ポチッ
(Mainでなくても好きなプロジェクト名でOKです)
![キャプチャ_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/259129/abc6c3d7-2219-e1f5-8af2-4f4d375e01aa.png)

そうすると「パッケージ・エクスプローラー」に「Main」というプロジェクトが作成されたかと思います。
(Mainではなく任意のプロジェクト名を入力された方は指定したプロジェクト名が出来てるはず)
![キャプチャ_5.PNG](https://qiita-image-store.s3.amazonaws.com/0/259129/7965f1c0-58b9-9976-0a10-98f6827e4c85.png)
パッケージエクスプローラーが表示されていない方は→[Eclipse~パッケージエクスプローラーの表示~](https://qiita.com/koukonko/items/6a0fec1ee90e6a4c0481)

左の▷をポチッで下のようになるかと。プロジェクトの中身が見れます。
![キャプチャ_4.PNG](https://qiita-image-store.s3.amazonaws.com/0/259129/227b090f-a55b-3dd8-f568-b3817ea88859.png)

まだ空っぽの状態のプロジェクトですねー笑

# おわりに
Eclipseのプロジェクト作成の基本を説明しましたが、分かりやすかったですか？

IDEが作成してくれるプロジェクトは管理しやすく非常に楽になります。
ガンガン活用していきましょー！
Eclipse~パッケージエクスプローラーを表示~

# はじめに
EclipseのJavaのパッケージエクスプローラーが開いてない！開き方が分からない！って方向けに書きます。
短編になります。

# パッケージエクスプローラーの開き方

「ウィンドウ」→「ビューの表示」→「その他」ポチッ
![キャプチャ_6.PNG](https://qiita-image-store.s3.amazonaws.com/0/259129/c42e1ab2-0d25-3bd7-7c63-6e13a1ebae52.png)

「Java」→「パッケージ・エクスプローラー」選択→「OK」ポチッ
![キャプチャ_7.PNG](https://qiita-image-store.s3.amazonaws.com/0/259129/483b2f42-bf23-eb9e-41dc-cc9a1d6ee20b.png)

以下のように「パッケージエクスプローラー」が表示されるはず！
![キャプチャ_8.PNG](https://qiita-image-store.s3.amazonaws.com/0/259129/17d934f7-2326-38a1-3ebd-6ed9cec3f933.png)

ちなみにパッケージエクスプローラーのウィンドウの固定化は右上(赤枠)をポチッっとすれば、OKです。
![キャプチャ_9.PNG](https://qiita-image-store.s3.amazonaws.com/0/259129/67287cf5-4d4e-f1ce-41dc-00a47ca4a26a.png)

# おわりに
今回は豆知識的でありますけど、必要なことですね。
メモ程度に覚えておいてください。
技術者視点でサトウの切り餅事件の特許を考える(4)　特許の理念とは？

[前回](https://qiita.com/kumokumocc/items/c9ee9353f5b344a68341) から、有名なサトウの切り餅事件で特許を考えてみています。
前回は価値のある特許とはどんな特許化という話を中心にしました。

以下が特許です。
https://patents.google.com/patent/JP4111382B2/ja?oq=%E7%89%B9%E8%A8%B1%E7%AC%AC4111382%E5%8F%B7

以下に絵なんかもあるので、概要を掴むにはいいと思います。
http://www.ypat.gr.jp/ja/case/patent/07.html

さて、今回は特許の理念についてです。


特許にはよく独占排他権が付与されるといわれます。

これについて、特許法には、
>第六十八条
特許権者は、業として特許発明の実施をする権利を専有する。

これしか書いてありません。
この権利は、一般的には、以下のようなものだと思われます。

***
##**1．発明した製品を自分だけが販売する権利**

サトウの切り餅事件でいうと、越後製菓だけが、側面にスリットが入った餅を生産できるということです。

##**2．自分以外が実施する場合、実施権を設定して、対価として収入を得る権利**

サトウの切り餅事件でいうと、越後製菓以外の企業が側面にスリットが入った餅を生産したい場合、生産を許可する代わりにライセンス料を徴収することができるということです。

##**3. 権利を売却する権利**
他の人に権利を譲渡したり、売却する権利です。
越後製菓がもう餅を作らないとなった場合、サトウに売却してしまってもいいということです。
日本では、特許権の価値をきちんと認識しておらず、結果として無償譲渡している場合が結構あります。

##**4．他社が販売しようとしたとき、それを禁止する権利**
サトウの切り餅事件でいうと、サトウが側面にスリットが入った餅を生産して販売しようとした場合、それをさせない権利です。
同時に、サトウが勝手に側面にスリットが入った餅を販売して自社の利益を侵害すれば、損害賠償請求できることも示しています。
サトウの切り餅事件では、まさにこの権利を行使しています。
ただし、当たり前ですが、サトウが側面にスリットが入っていない餅を販売するのを禁止はできません。

***
ここで、ちょっとだけ仮定の話をします。

越後製菓が**側面にスリットの入った切り餅**を権利化し、

その後、サトウが**側面に複数のスリットが入った切り餅**を権利化したとします。
***

(1)越後製菓はサトウが複数のスリットが入った切り餅を製造、販売するのを禁止できるか？

(2)サトウは、越後製菓が1本だけスリットが入った切り餅を製造、販売するのを禁止できるか？

(3)サトウは、越後製菓が複数のスリットが入った切り餅を製造、販売するのを禁止できるか？

***
どうでしょう？実際裁判が起こると少し難しい話になって来ますが、基本的に、

(1)に関しては禁止できます。スリットが複数であろうが、側面にスリットが入っているので、越後製菓に排他権があります。

(2)については、禁止できません。

(3)については、裁判で争わないとわからないでしょう。

サトウが出願するよりも前に越後製菓が側面に複数のスリットが入った切り餅を販売していたのだとすれば、
サトウの特許自体が無効になります。

逆にそういった証拠がない場合は、スリット1本→複数に変えるという発明が、容易に想像がつかないことを特許庁が審査して認めているわけですから、サトウに排他権があることになります。

いずれにしても、越後製菓の特許が基本特許になっていて、サトウはそれを改善したに過ぎないので、
より独創性が高い発明になっている越後製菓の方が強いということです。

***
さて、独占排他権、言えることはめちゃくちゃ強いということです。
**最初に作ったと言うだけで、他社の参入をほとんど完全にシャットアウト**できます。

なぜこんなに権利が強いのか？
これは、発明にお金がかかるからです。

自動車の発明を考えてみるとわかると思います。
エンジン、タイヤ、ギアボックス、アクセル、ブレーキ。非常にたくさんの技術が組み合わさって自動車ができています。
これを、一番最初に発明するためには、**莫大なコスト**がかかります。

A社が最初に自動車を作って売ったとして、
**競合するB社が販売した自動車をリバースエンジニアリングで解析して、ほとんど同じものを作って売った**としたらどうでしょう？

A社の開発にかかったコストよりもB社の開発にかかったコストは小さいし、
A社は、「開発途中で自動車の実現が不可能だとわかり、それまでの投資が無駄になる」というリスクも背負いながら開発しています。

###つまり、**B社の方が圧倒的に美味しい立場にいるのです。**

すると、すべての企業がB社の立ち位置で開発をしたくなります。
結果、**社会全体で新しいものに挑戦する意欲が失われてしまいます。**

だから、**A社に対して20年という期間を設定して、B社が自動車を販売するのを禁止したり、販売価格面で不利になる場合はライセンス料を支払わせる権利を付与する**のです。

**開発費が高いという不利益をプラスにかえるインセンティブをつける**ために、独占排他権を与えているのです。

***
さて、ここでサトウの切り餅事件に戻ってみます。

越後製菓は、「餅の側面にスリットを入れる」という特許を権利化しています。
では、越後製菓は、この特許を発明するにあたって、どの程度のコストを支払ったでしょうか？

###**おそらく、ほとんどコストをかけていません。**


それに対して、権利化している範囲を考えると

###**特許の権利範囲はものすごく広い。**
と思います。

お金がかかっていないのに、得られる恩恵がすごく大きい特許だということです。
なんでこんなアンバランスが起こってしまうかというと、進歩性の低い特許に特許権を付与してしまったからだと思います。

これは、**特許制度の欠陥**みたいなものです。

**ほんのちょっと変えただけで、「新しい発明をした」と主張して独占排他権を付与することを繰り返す**と、
他のメーカーが参入できなくなります。すると、競争原理が働かなくなり、社会全体に悪い影響を与えます。

だから、特許の発明は高度で、進歩性がないといけないのです。
それを審査するのが特許の審査請求という制度です。

越後製菓の特許は、進歩性の面でかなり薄いと思います。
サトウの切り餅事件は、

**「本当に特許権を付与するだけの価値がある発明だったのか」「どうして進歩性の低い特許が審査を通過してしまったのか？」**
についても議論する必要があると思います。
VelocityとSpringMVCの連携

###ViewResolverを設定

	<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> 
	  <property name="resourceLoaderPath" value="/WEB-INF/view/" /> 
	</bean> 
	
	<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> 
		<property name="suffix" value=".vm" /> 
	</bean> 

この設定で[/WEB-INF/view/]の中のvmファイルがマークされ、
更にveiwResolverに対してサフィックスに[.vm]を連結するように設定します。


※pomにライブラリを設定してください。


###テンプレートを配置

テンプレートとなるvmファイルは[/WEB-INF/view]フォルダに配置してください。

    <!DOCTYPE html>
    <html>
    <head>
        <title>Welcome</title>
    </head>

    <body>
    	<p>owner_name= ${owner.ownerName} </p>
        <p>owner_id= ${owner.ownerId} </p>
    </body>

    </html>

これで[Owner]BeanにセットしたownerNameとownerIdが置き換わることになります。
jspと一緒ですね。

###Owner

    class Owner {
        private String ownerId;
        private String ownerName;

        ゲッター
        セッター
    }

###実行クラス(@Controller)

    @Controller
    class SampleRun {

        @RequestMapping("hello")
        public String hello(Model model) {
            Owner owner = new Owner();
            owner.setOwnerName("taro");
            owner.setOwnerId("1");

            model.addAttribute("owner", owner);

            return "vmファイル名";
        }

    }

vmファイル名にテンプレート名を入れてください。
至って普通のコントローラーです。

どうやらこのコントローラーからview名を返して、VelocityViewResolverに名前解決をさせる際にvmファイルとmodelにセットしたBeanとを使ってマージしてくれるようです。

###感想
最初はとっつきにくく、よくわからない存在だったVelocity。
だけど振り返ってみると意外とあっさりしているもの。
そんなものです。
第6話 バーゼル問題

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第6話です。

```math
\frac{\pi^2}{\sum_{n=1}^{\infty} n^{-2}}=6
```
バーゼル問題と呼ばれるもので、平方数の逆数の和はいくらに収束するかを表す式です。
次の式と同等です。

```math
\frac{1}{1^2} +\frac{1}{2^2} +\frac{1}{3^2} +\frac{1}{4^2} +\cdots= \frac{\pi^2}{6}
```
有理数を足していくだけで円周率が出てくるのは不思議な気がします。
この式を証明していきます。

sin関数をマクローリン展開します。

```math
\sin ⁡x=x-\frac{1}{3!} x^3+\frac{1}{5!} x^5-\frac{1}{7!} x^7+\cdots \qquad (式1
```

次に、sin関数を因数分解します。次の式を思い出して下さい。

```math
f(a)=0\ ならば\ f(x)=(x-a)g(x)
```

$\sin ⁡x$は0,±π,±2π…ごとに0になりますので、それらの因数を持ちます。

```math
\sin{⁡x}=x(x-\pi)(x+\pi)(x+2\pi)(x-2\pi) \cdots\qquad (式2
```

この式2を展開すると、式1になります。
ここで、恒等式の法則を使います。

```math
f(x)=ax^2+bx+c,\ g(x)=dx^2+ex+f\\
f(x)=g(x)\ ならば\ a=d,b=e,c=f
```

$x$の係数は1になるはずなので、式2の各項を以下のように細工します。

```math
\sin{⁡x}=x(1-\frac{x}{1\pi})(1+\frac{x}{1\pi})(1+\frac{x}{2\pi})(1-\frac{x}{2\pi})\cdots\\
＝(1-\frac{x^2}{(1\pi)^2} )(1-\frac{x^2}{(2\pi)^2} )…
```

πの周期でx軸と交差する関数は、sinに限らず存在するはずなので、
この無限積がsinと証明する必要がありますが、それはおいておきます。

$x^3$の係数をみていきます。

テイラー展開した方は$-\frac{1}{3!}=-\frac{1}{6}$ です。
無限積の方は、次の式になります。

```math
x(-\frac{x^2}{(1π)^2} \times 1\times 1 \cdots)+x(1\times -\frac{x^2}{(2π)^2} \times 1\times \cdots)+\cdots
```

　これらが等しいのでまとめてみます。

```math
-\frac{1}{6}=-\frac{1}{(1π)^2} -\frac{1}{(2π)^2} -\cdots=-\frac{1}{\pi^2} (\frac{1}{1^2} +\frac{1}{2^2} +\cdots)
```
ついに待望の平方数の逆数の無限和が右辺に出てきました。
後は整理するだけで次の式が導けます。

```math
\frac{1}{1^2} +\frac{1}{2^2} +\cdots= \frac{\pi^2}{6}
```
そのプロジェクト、npmのバージョン固定できてる？

# 思い込み

「nodeとnpmのバージョン固定とかなにを今更…(苦笑)
[ndenv](#)でnodeを固定しとけば、npmもできてんでしょ」
…って思ってた時期が僕にもありました。。

**※下部に追記有り**

## 問題

```
$ cat .node-version
v8.11.1
$ which npm
/Users/username/.anyenv/envs/ndenv/shims/npm
$ npm -v
5.6.0
$ npm i -g npm@6.0.1
$ npm -v
6.0.1
$ which npm
/Users/username/.anyenv/envs/ndenv/shims/npm
```

😇 …こんな感じでカンタンに書き換えが可能です。
チームで開発してたら大問題ですね⤵️

「…でも、どうやってnpmを固定するんだろう？？」
と悩んでいたら、同僚に教えてもらいました。

要は、engineを指定すれば良いようです。🍻

## 解決

```package.json
"engines": {
  "node": "8.11.1",
  "npm": "5.6.0"
},
```

[.npmrc](https://docs.npmjs.com/files/npmrc)

```txt:.npmrc
engine-strict=true
```

こうしておくことで、 `$ npm i` の際にengineを確認して、バージョンの問題があった場合はインストールさせないようです🎉️
周知は必要ですが、npmのバージョン固定という目的は解決できそうです！

ちなみに自分は、[anyenv（=>ndenv）](https://github.com/riywo/anyenv)を使ってnodeのversion固定しています。今回の記事にあまり関係無いですが、env系とかを複数使ってる人には便利なのでオススメです。

--- 

# [追記]つづき

UPDATE: 2018/06/01

「npm固定できたから、やっと思い通り動くわー」

と思ってたのも束の間…

brewでherokuコマンド更新したら、ご丁寧にnpmまでインストールしてくださいました😇
そしてそのnpmは↑でバージョンを固定できない悪魔的な挙動で詰んだ。。

…で、悩んでて思いついたんだけど、 `npx` ならどのバージョンつかってもnpmを固定できるんじゃないか？と考えて試したらいけた。

```
$ which npm
/usr/local/bin/npm 
$ npx which npm
/Users/username/.anyenv/envs/ndenv/shims/npm
$ npx npm run hoge // ←これだと、ndenvで設定したnpmで起動できる。
```

UPDATE: 2018/06/20

brewを使ってる場合は、PATHをbrewよりもndenvの方を優先しておく。
参考: [https://qiita.com/n-oshiro/items/3c571a4fcdb023b1fe77](https://qiita.com/n-oshiro/items/3c571a4fcdb023b1fe77)
RedHat　プロキシ設定　自分用メモ　crossfish21

RedHat　プロキシ設定

[リンク1](http://fj.hatenablog.jp/entry/2014/08/20/204554)
[リンク2](https://access.redhat.com/solutions/9825)
[リンク3](https://qiita.com/chidakiyo/items/95cbc263f8157cfa5cd7)
[リンク4](https://oscasierra.net/2011/05/redhat-proxy/)

```
サーバー側

postgres

apache

jdbcDriver

jdk

tomcat

・プロキシ設定だけは、やっておこう

ローカル環境は特に無いかな



開発者への質問と確認

・LDAPサーバーへの接続の仕方を聞く
・サーバーの構築自体、開発者に任せたほうがいいのかも
(yumが自由に使えないので、何が必要か事前に判断が難しい)
```
Socialiteで取得できるアクセストークンの存在が本気で理解できなかったので勉強する

理解できなさすぎてイラついてきたので調べました。

# 前提
Socialiteを実装する！

的なサンプルを見ると、だいたい**何の説明もなしにアクセストークンとやらがDBに保管されています。**

- [ソーシャル（SNS）ログインをサクッと実装！Laravel Socialiteの使い方 - WPJ](https://www.webprofessional.jp/easily-add-social-logins-to-your-app-with-socialite/)

**保管できるのはわかったけどなんなんだテメーは**と言いたくなります。


## 使い方？
使い方を見ると、『これを渡すとユーザー情報をサクッと取得できるよ！』……という感じに見えます。

- [Laravel Socialite 5.5 Laravel](https://readouble.com/laravel/5.5/ja/socialite.html)

> トークンからのユーザー詳細情報の取得(OAuth2)
> ユーザーへの有効なアクセストークンを事前に取得している場合は、userFromTokenメソッドを用い、詳細を取得できます。
> 
> `$user = Socialite::driver('github')->userFromToken($token);`


# 混乱
ええ……待って待って……？

まあそりゃ、SNSでログインすると、SNSの情報を抜き出せるのはわかりますよ……？

でも、そこで**『簡易的にSNSの情報を取得できるコード』が一緒に渡される**のってなんか意味あるんですか？

**ログインすればいいんじゃないの……？**

しかもサンプルとかで、それをDBに保存する意味ってあるんですかね。

**そのアクセストークンに該当するユーザであることを証明できたなら、そこからアクセストークンを使って何をする必要があるの……？**

そんな感じで混乱してます。

**意図が全く読み取れません。**

こうして整理しつつ書いてるだけでもキレそうになってきます。

心の余裕がほしい。


# そもそもを調べる
アクセストークンというものがよくわからないので、一般的にどうやって使われるものなのか知りません。
その辺がわからないから理解できないのかなと思ったので調べてみます。

- [Webサーバー - アクセストークンについて。(43755)｜teratail](https://teratail.com/questions/43755)

うーん、読んだ限りでは……そこまで的はずれな理解はしてなさそうなんですが……。

ここまで意味がわからないのはなんででしょう。

そもそも何か見落としが……？


# FBの説明見たらなんとなく理解できた
- [アクセストークン - Facebookログイン](https://developers.facebook.com/docs/facebook-login/access-tokens?locale=ja_JP)

そうこうしつつ、FBのページを見たらなんとなくわかってきました。

ログインして終わり、じゃなくて**もっとこうなんかいろいろする**（あやふや）場合のパスワード的なものとして利用できるんですね。

というかそのまんま、SocialiteでFB認証するときに渡しているトークンと同じようなものですね。
なるほど。


# 自分のプロジェクトについては
自前でメアドとか持ちたくないときに使えるかなあ。
くらいしか利用場面がありませんでした。

そして、気付いてしまったんですが、

そもそもアレですね、

**普通のシステムはログインをSNSに外注しないですね。**

そこだ……ようやく理解できました。

ログインは普通にIDPASSで持ってて、それとは別にSNS連携ができるシステムの場合。
いちいちログインさせなくてもいいように、トークンを保存しておくわけですね。
で、必要ならそれを利用することで情報を取得したり、投稿を代行したりすると。

理解できました。

似たような悩みを抱える人がいるかはわかりませんが。
超訳: プログラミング原則  - 第一章

[プリンシプル オブ プログラミング](https://www.amazon.co.jp/dp/B071V7MY82/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1) の内容を、再解釈して表現することにより、概念の理解を試みた痕跡です。

学習とは何事も、自分自身の理解できる内容に置き換えて考えることから始まるのです。
可能な限り原文をそのまま、「自分の頭で考える」ことで。

## No Silver Bullet in programming.

万象を解決する「銀の弾丸」はない

全てを解決する、万能で確実な方法は存在しません。
改善に最も重要なのは、コードの複雑さを軽減する努力を地道に続けること。

## Code as design.

コードは設計書である
（設計書はコードで十分、という意味ではないぞ！）

そもそもプログラミングの「設計」とは**コードの製造のことではない**。設計からデバッグに至るまでが設計である。

## Code will be changed.

コードは必ず変更される

仕様変更とか、リファクタリングとか、機能追加によって。
変更に強いものを用意するため、読みやすいものにしておくこと。**書く時間より、読む時間のほうが長い**のだ。
Vuejs_meetup第7回で発表された素晴らしいスライドショーの纏め

# はじめに
本当にどれも凄く良い内容ばかりで、とても勉強になりました。
発表してくださった方々、ありがとうございます！

また、これ以外の資料は見つかりませんでした。
ある方いましたら頂けたら幸いです！

## 補足外部資料
https://skmt3p.hatenablog.com/entry/2018/05/23/204825

## Vuejsに、ありがとう
https://www.slideshare.net/mobile/carotene4035/vuejs-meetup

## 「結局Nuxt.jsって何がいいの？」 に対する回答
https://slides.com/potato4d/vuejs_meetup7#/

## SVG makes your components to testable
https://speakerdeck.com/haribote/svg-makes-your-components-to-testable

## VUE DESIGNER でコンポーネントを GUI で開発する
https://slides.com/ktsn/vue-designer-demo#/

## Vue.js + D3.jsでグラフを描く
https://niconare.nicovideo.jp/watch/kn3080

## Vue コンポーネント実装パターン
https://speakerdeck.com/kazuyaseki/vue-konponentoshi-zhuang-patan

## Nuxt.js ファーストインプレッション / Nuxt.js First Impression
https://speakerdeck.com/y_temp4/nuxt-dot-js-first-impression

## Building Real-time Vue App
https://speakerdeck.com/joere/building-real-time-vue-app
GitHub のリポジトリ検索を使う時には「部分一致ではなく単語一致」「Clone して Grep する」の二点を意識する

GitHub のリポジトリ検索を結構使うのですが、「なんかいまいちヒットしないな」と思うことが多々あります。そこでその辺の挙動を簡単に調べ、どう対処すればいいかをまとめてみました。

# リポジトリ検索とは
以下のことです。

トップページや自分のプロフィールページでは GitHub 内全域を検索できます。

![github_search_repository.jpg](https://qiita-image-store.s3.amazonaws.com/0/191170/82bdef44-ea8a-7508-0606-a812ca046eb2.jpeg)

また、リポジトリのページではそのリポジトリ内を検索できます。

![github_search_this_repository.jpg](https://qiita-image-store.s3.amazonaws.com/0/191170/0cdd1f85-e19d-d53f-3b0d-aafa848e65f8.jpeg)

# 結論
- GitHub のリポジトリ検索は **部分一致ではない**
- GitHub のリポジトリ検索は **単語一致である** (と思われる)
- 部分一致で探したいなら素直に **Clone してローカルで Grep とかしましょう**

# 詳しく
[stakiran/test_github_search](https://github.com/stakiran/test_github_search) というリポジトリを作って実験してみました。

リポジトリに hello.py というファイルがあるとします。

```python
import sys

print('Hello.')
print('はろー')
print('こんにちは世界')
```

さてここでクイズです。以下の検索ワードのうち、hello.py にヒットするのはどれでしょう？

- Q1. `import`
- Q2. `impor`
- Q3. `はろー`
- Q4. `こんにちは`
- Q5. `こんにちは世界`
- Q6. `ちは`
- Q7. `"ちは"`

正解（ヒットするもの）は以下です。

- Q1. `import`
- Q3. `はろー`
- Q5. `こんにちは世界`

Q1 は import という単語に、Q3 は「はろー」という単語に、Q5 は「こんにちは世界」という単語に一致するため、ヒットします。Q2, Q4, Q6, Q7 は **部分一致はするが単語一致していない** ためヒットしません。

ここで「単語一致とは何か」という話になりますが、詳しい仕様は私もわかりません :sweat: 見た感じでは「スペースやら `""` やら `''` やらで区切られた一繋がりの文字列」だなという印象です。この単語一致についても例を上げると、

```python
print('こんにちは世界')
```

上記の日本語部分の単語とは「こんにちは」でも「世界」でもなく、「こんにちは世界」のみです。意味的(セマンティック)な単語ではなく構文的(シンタックス)な単語、とでも言えばいいでしょうか。

# おわりに
軽く調べた程度の小ネタでしたが、GitHub のリポジトリ検索に関するモヤモヤが晴れて、少しだけ付き合いやすくなった気がします :smile:
UnityでQIX(陣取りゲーム)を作ってみた

チュートリアルを通してUnityの基本がわかってきた（気がする）ので
腕試しに簡単なゲームを作成してみることにしました。

題材に選んだのが[QIX(クイックス)](https://ja.wikipedia.org/wiki/QIX)です。
マーカーを操作して敵を避けつつ線を引いて自陣を拡大していきます。
線で囲んだ閉領域が自陣となり占領率が75%を越えるとゲームクリアです。

![QixClone.gif](https://qiita-image-store.s3.amazonaws.com/0/55307/bfaa4df1-8cbe-6a51-4989-d8f024b9e87b.gif)

QIXの最小限の要素しか抑えていませんが、とりあえずゲームの形になったので満足しています。

ソースコードは[GitHub](https://github.com/ayaseya/Qix)にアップロードしています。
[学習備忘録] hive テーブル構築 by テキストファイル

# 内容サマリ
Hive テーブルを、テキストファイルから作る方法の備忘録である。

# テキストファイルでHiveテーブルを作る手順

(1) テキストファイル(TSV形式)を準備する。カラム構造はすでに決まっているとする。
(2) hadoop コマンドでファイルをクラスタ上にアップロードする。

```bash
# コマンド例
hadoop fs -copyFromLocal some_tsv_file.tsv hdfs:///my_tmp/sample_dir/some_tsv_file.tsv

```

(3) hive テーブルをcreate文で作る。

```sql
CREATE TABLE IF NOT EXISTS some_scheme.some_table_by_text (
col_01        string,
col_02        string,
col_03        string 
)
ROW FORMAT DELIMITED
FIELDS TERNIMATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
```

(4) hiveに LOAD DATA INTO 文でデータを流し込む

```sql
LOAD DATA INPATH 'hdfs:///my__tmp/sample_dir/some_tsv_file.tsv' OVERWRITE INTO TABLE some_scheme.some_table_by_text
```

新規にテキストファイル(TSV形式）からhiveテーブルを作るときは上記の方法となる。


# 既存のＨＤＦＳ上のファイルを実態とするテーブルの作り方

(1) 既存のテキストファイルが、 hdfs:///my_temp/hive/some_table/some_sample.tsv にあるとする。
(2) LOCATION を指定して、CREATE文を発行する。
LOCATION で指定するのはディレクトリであることに注意。
指定したディレクトリの中にあるテキストファイルをテーブルの実態として適用する。

```sql
CREATE TABLE IF NOT EXISTS some_scheme.some_table_by_text_02 (
col_01        string,
col_02        string,
col_03        string 
)
ROW FORMAT DELIMITED
FIELDS TERNIMATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/my_temp/hive/some_table/'
```

以上でHiveテーブルが出来上がる。
テーブルを更新したいときは、LOCATION で指定したディレクトリにあるテキストファイルを差し替えればよい。

```bash
# ファイル差し替えの例
# 新しいファイルが /my_temp/cache/new_text.tsv であるとする。
hadoop fs -rm /my_temp/hive/some_table/some_sample.tsv 
hadoop fs -mv /my_temp/cache/new_text.tsv /my_temp/hive/some_table/some_sample.tsv
```
Wordpressで特定のユーザーを強制的にログアウトさせる方法(ID指定)

会員制サイトを構築する際、とある理由で特定のユーザーを強制ログアウトさせる機能が必要になった。
ってーことでちょっと調べた結果、下記の関数で実現できた。

```php
delete_user_meta( $user_id, 'session_tokens' );
```

参考ソースはwp-includes/class-wp-user-meta-session-tokens.phpの94～99行目。
usermetaテーブルのmeta_keyがsession_tokensっていうレコードがあったので、もしかしてと思って検索したらビンゴでしたとさ。

そもそもWordpressで会員制サイトってどうなんだという話は隅においておく。
一行でLookAt2D

Unity公式コミュニティより　[LookAt 2D Equivalent?](https://answers.unity.com/questions/585035/lookat-2d-equivalent-.html?page=1&pageSize=5&sort=votes)
>Surely the simplest solution is:
>>**transform.right = target.position - transform.position;**

【解説】
transform.rightはx軸（エディタの赤軸）にあたります。
targetの位置から自身の位置を引きtargetの方向を取得して、
これをx軸に代入するとx軸方向にtargetが来るようになります。
イメージとしては右腕をtargetの方向に向ける感じ。

また、
>transform.up = target.position - transform.position;

とすることでy軸方向にtargetが来るようになります。
こっちは頭頂部をtargetに向ける感じ。
Vimチートシート

# 凡例
* []内は同じ意味
* ()内は省略可能
* {}内は{}を含め読み替える
* 大文字のものは`Shift`キーを押しながら

# 通常モード
## カーソル移動

| コマンド | 動作 |
|----------|------|
| h        | ←   |
| j        | ↓   |
| k        | ↑   |
| l        | →   |
| ^ [0]    | 行頭へ |
| $        | 行末へ |
| w        | 次の単語の先頭へ |
| e        | 単語の先頭へ |
| b        | 前の単語の先頭へ |
| gg       | ファイルの先頭へ |
| G        | ファイルの末尾へ |
| Ctrl + f | 次のページへ |
| Ctrl + b | 前のページへ |

## 編集操作

| コマンド | 動作 |
|----------|------|
| y        | 選択範囲（選択されていない場合行全体）をコピー（ヤンク） |
| Y        | 行をヤンク |
| p        | ヤンクした内容をペースト |
| P        | ヤンクした内容を現在位置にペースト |
| x        | カーソル位置の文字を1文字削除 |
| d        | カーソル位置を起点として、続いて入力された方向の文字（もしくは行）を削除 |
| D        | 行内、カーソル位置以降を削除 |
| dd       | 行を削除 |
| u        | 元に戻す |
| Ctrl + r | やり直し |
| r        | 次に入力された文字でカーソル位置の文字を1文字置き換える |
| R        | 置換モードに切り替える（入力された文字で以降の文字を置き換えていく） |
| gu       | 小文字にする（選択されていない場合単語全体を小文字にする） |
| gU       | 大文字にする（選択されていない場合単語全体を小文字にする） |
| v        | ビジュアルモードに切り替える（選択できるようになる） |
| V        | ビジュアル 矩形モードに切り替える（矩形選択できるようになる） |

## 検索・置換
| コマンド  | 動作 |
|-----------|------|
| :{LINE_NUMBER} | {LINE_NUMBER}に指定された行にカーソルを移動 |
| #         | カーソル位置に存在する単語を検索する |
| /{SEARCH} | {SEARCH}に指定された文字列を検索、`n`で次へマッチ、`N`で前へマッチ |
| :%s/{SEARCH}/{STRING}/g | {SEARCH}に指定された文字列を検索しマッチした文字列を{STRING}ですべて置き換える |
| :%s/{SEARCH}/{STRING}/gc | {SEARCH}に指定された文字列を検索しマッチした文字列を{STRING}ですべて置き換える、置き換える際1つずつマッチを確認する |

## 文書の保存・破棄

| コマンド  | 動作 |
|-----------|------|
| :w        | 上書き保存 |
| :w        | 読み取り専用を強制上書き保存 |
| :w {NAME} | 名前を付けて保存 |
| :e {NAME} | ファイルを開く |
| :q        | Vimを終了（保存されていない場合は終了できない） |
| :q!       | Vimを終了（変更を破棄して終了する） |
| :wq       | 上書き保存して終了 |
| :wq!      | 読み取り専用を強制上書き保存して終了 |

## その他小技
* よく使うやつだけ
* その他は[vimエディタ・スターターマニュアル \#8 （設定ファイル） — 名無しのvim使い](http://nanasi.jp/articles/howto/user-manual/user-manual-config.html)参照

| コマンド | 動作 |
|----------|------|
| :set nu(mber) | 行番号を付ける（解除は`:set nonu(umber)`） |
| :set noet[noexpandtab] | Tabキーを押したときにTab文字ではなく半角スペースを使う（逆は`:set et[expandtab]`） |
| :set tabstop={N} | Tabキーを押したときのインデントを{N}文字にセットする |
| :set autoindent | オートインデントを有効にする |
| :set noautoindent | オートインデントを無効にする |

## 挿入モードに切り替える系

| コマンド | 動作 |
|----------|------|
| i        | カーソル位置で挿入モード |
| I        | カーソル行の行頭で挿入モード |
| a        | カーソル位置の1文字次で挿入モード |
| A        | カーソル行の行末で挿入モード |
| o        | カーソル行の次行に改行を入れ挿入モード |
| O        | カーソル行に改行を入れ挿入モード |
| c        | カーソル位置を起点として、続いて入力された方向の文字（もしくは行）を削除して挿入モード |
| C        | カーソル行を空行（削除するが行は残す）にして挿入モード |

# 挿入モード

| コマンド | 動作 |
|----------|------|
| Ctrl + n | キーワード補完、Ctrl + nで次のマッチへ |
| Esc      | 挿入モードを抜け通常モードに切り替える |

# 小技
## 複数行をインデント
* `V`で矩形選択モードに切り替える
* 複数行選択
* `^`で行頭に移動
* `I`で挿入モードに切り替えて任意の文字数スペースを入れる
* `Esc`で抜ける
* `j`（他のでも可）でカーソル移動

## 複数行のインデントを解除
* `V`で矩形選択モードに切り替える
* インデント部分を選択
* `X`で削除

# おまけ
## カラースキームの変更
* monokaiを使ってみる

```
$ cd ~/.vim
$ git clone https://github.com/sickill/vim-monokai.git
$ mv -T ./vim-monokai/colors ./colors
$ cd ~/
```

```vim:~/.vimrc
syntax enable
colorscheme monokai
```
DynamoDBへputしたらResourceNotFoundExceptionが発生した時の対処

## AWS CLIでDynamoにレコード挿入
DynamoDBへputしたら、うまく値を格納できず、少し苦戦したので、自分用のメモです。

>An error occurred (ResourceNotFoundException) when calling the Scan operation: Requested resource not found

AWS CLIからputしたら、上記エラーが発生しました。

Dynamoのテーブルはちゃんとあるし、スペルも間違えていない。。

##Credentialを疑え
他の端末から全く同じ、内容で送ってもエラーが発生しなかったので、
おそらくcredentialの違いかなと思いました。

>aws dynamodb put-item \
--table-name StaffManage  \
--item \
    '{"StaffID": {"S": "100１"}, "FirstName": {"S": "太郎"},"InvalidFlag": {"BOOL": false}, "LastName": {"S": "山田"}}' \
--return-consumed-capacity TOTAL

流したCLIコマンドは上記の通り。
aws configure get region

とすると、Dynamoでテーブルを作っているところと違うリージョンが帰ってきたので、
リージョンを指定すればきっと大丈夫だろうということで、

>aws  --region ap-northeast-1 dynamodb put-item \
--table-name StaffManage  \
--item \
    '{"StaffID": {"S": "100１"}, "FirstName": {"S": "太郎"},"InvalidFlag": {"BOOL": false}, "LastName": {"S": "山田"}}' \
--return-consumed-capacity TOTAL

とリージョン指定をしたら、問題なく実行できました。
[C#][Dapper]DapperでSUMを実行する

Dapper（C#のMicroOrm）でSUMを実行する方法です。

```cs
/// <summary>
/// ユーザーのバトルの合計スコアを取得する
/// </summary>
/// <returns>スコア</returns>
public uint SumBattleScore(ulong userId)
{
    IDbConnection conn = /* 何かしらの方法で取得する */;
    string sql = "SELECT SUM(score) FROM battle_result WHERE user_id = @UserId";

    return Convert.ToUInt32(conn.ExecuteScalar(sql, new { UserId = userId }));

    // ExecuteScalar が使えることを教えてもらいました
    /*
    uint? data = conn.QueryFirst<uint?>(sql, new { UserId = userId });
    return (data == null) ? 0 : data.Value;
    */
}
```

~~データが何も取得できないときはNullになるみたいなので、Nullable型で取得してあげる必要あるみたい。~~
RxJS Observableの作成 (2) 　Observable.from の使い方


## 用途
Observable.fromは、配列などのイテレータブルなオブジェクトやObservable、Promise等から新しいObservableを作成します。

## 基本的な使い方

Observableを作成する方法の一つとしてよく使用されるオペレーターです。
配列などのイテレータブルなオブジェクトからだけでなく別のObservableやPromiseから作成することが出来ます。
また、文字列を指定すると一文字づつ値を流すObservableを作成することが出来ます。

``` js
// 配列からObservableを作成
Rx.Observable.from([1,2,3]).subscribe(x => {
  console.log(x);
});

// 結果
// 1
// 2
// 3


// 文字列からObservableを作成
Rx.Observable.from('foo').subscribe(x => {
  console.log(x);
});

// 結果
// f
// o
// o


// PromiseからObservableを作成
Rx.Observable.from(new Promise((resolve, reject)=>{
  setTimeout(resolve, 100, 'foo');
})).subscribe(x => {
  console.log(x);
});

// 結果
// foo
```

[ ES6 stackblitz ](https://stackblitz.com/edit/rxjs-from-01-es6)
[ TypeScript stackblitz ](https://stackblitz.com/edit/rxjs-from-01-ts)


## 他のオペレーターとの組み合わせ

### mapを使って税込み価格を取得

```js
Rx.Observable.from([100, 250, 365])
  .map((n) => {
    return Math.floor(n * 1.08)
  })
  .subscribe(x => {
    console.log(x);
  }
);

// 結果
// 108
// 270
// 394
```

### APIから取得したデータをmapを使って必要なデータのみ抜き出す。
APIからのデータの取得にはaxiosを使っています。
[axios](https://github.com/axios/axios)

github APIから「tom」を含んだユーザーを取得し、responseの中からユーザー情報（items）のみを抽出する。

```
Rx.Observable.from(axios.get('https://api.github.com/search/users?q=tom'))
  .map(x => x.data.items)
  .subscribe(res => {
    console.log(res)
  }
)

// 結果
// items[]
```
[ ES6 stackblitz ](https://stackblitz.com/edit/rxjs-from-02-es6)
[ TypeScript stackblitz ](https://stackblitz.com/edit/rxjs-from-02-ts)
俺俺証明書をnginxに配置


* opensslのバージョンを調べる

```
[root@localhost nginx]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
```


* 最新を入れる
* 
```
[root@localhost nginx]# sudo yum install openssl openssl-devel openssl-libs
[root@localhost nginx]# yum clean all
[root@localhost nginx]# sudo yum update openssl openssl-devel openssl-libs
```

* key,pemを作成

```
[root@localhost nginx]# sudo mkdir /etc/nginx/ssl
[root@localhost nginx]# cd /etc/nginx/ssl/
[root@localhost nginx]# sudo openssl req -new -x509 -sha256 -newkey rsa:2048 -days 365 -nodes -out /etc/nginx/ssl/nginx.pem -keyout /etc/nginx/ssl/nginx.key
```

* パスワードを聞かれたら適当に入力しましょう。
  * 「nginx.key」が暗号化鍵、
  * 「nginx.pem」が自己署名証明書


* 暗号化鍵・自己署名証明書のアクセス権限設定

```
[root@localhost nginx]# sudo chown root:root -R /etc/nginx/ssl/
[root@localhost nginx]# sudo chmod 600 /etc/nginx/ssl/*
[root@localhost nginx]# sudo chmod 700 /etc/nginx/ssl
```


``` conf/default.conf
server {
  # ...
  listen 443 ssl;
  server_name secure.example.com;

  # 自己署名証明書
  ssl_certificate /etc/nginx/ssl/nginx.pem;
  # 暗号化鍵
  ssl_certificate_key /etc/nginx/ssl/nginx.key;
  # もしパスワードを入力したら追加（今回は省略）
  # ssl_password_file /etc/nginx/ssl/cert.password;
  # ...
}
```

* 設定が完了したらnginxを再起動します。

```
sudo /etc/init.d/nginx restart
```
Modal の中の ScrollView 系 Component の keyboardShouldPersistTaps 指定が効かない

```
<ScrollView>
  <Modal>
    <ScrollView
      keyboardShouldPersistTaps="handled"
    >
    </ScrollView>
  </Modal>
</ScrollView>
```

こういう構造していると Modal の中の ScrollView に `keyboardShouldPersistTaps` を指定しても、期待した通りに動きません。
どうすれば良いかというと、Modal の親にも同じ attribute を指定します。

```
<ScrollView
  keyboardShouldPersistTaps="handled"
>
  <Modal>
    <ScrollView
      keyboardShouldPersistTaps="handled"
    >
    </ScrollView>
  </Modal>
</ScrollView>
```

refs: https://github.com/facebook/react-native/issues/10138
VS Code に Emacs っぽいコメント切り替え (M-;) を導入する

単に `editor.action.commentLine` を `alt+;` にバインドしただけですが、 Emacs の `M-;` に近い挙動になった気がします。

`Emacs Keymap (hiro-sun.vscode-emacs)` を入れていても問題なく使えます。

# 手順

`keybindings.json` に以下を追加する

```json:keybindings.json
[
    {
        "key": "alt+;",
        "command": "editor.action.commentLine",
        "when": "editorTextFocus && !editorReadonly"
    }
]
```

以上
cycleGANで人間の顔をアニメ絵化

# 初めに

GAN(Generative Adversarial Network)の進化がどうやら止まらないようです。
DCGAN、pix2pixといった、最新のGANモデルが次々と登場しています。
(テキスト生成モデルや音楽生成にも使用されているようです)
そして、今回はcycleGANを使って人間の顔をアニメ絵に自動変換したいと思います。

# cycleGANとは

画像データセットAとBがあったときにAとBがそれぞれ対で無くても変換出来る凄い奴です。
つまり、沢山データを食わせれば自動的に学習してくれる訳ですね!(もし間違いがあればご指摘下さい)

# データを入手する

[Labeled Faces in the Wild](http://vis-www.cs.umass.edu/lfw/)と[animeface-character-dataset](http://www.nurs.or.jp/~nagadomi/animeface-character-dataset/)を使います。(もし、試す場合は自己責任でお願いします)
cycleGANは今回の目的は試すことであるのと、初心者が車輪の再開発をしてバグがあると困るので今回はこちらの実装をお借りします[CycleGAN-tensorflow](https://github.com/xhujoy/CycleGAN-tensorflow)
事前に二つともopenCVで顔を抽出しておきます。(アニメ顔はアニメ顔専用のモデルを使いました)

# 結果

epochは忘れてしまいましたが、10回未満だったと思います。
早速、testディレクトリを覗いてみます。

## 比較的うまくいった例

この人が

![211.png](https://qiita-image-store.s3.amazonaws.com/0/206651/aa0b877c-8344-bb19-b336-d686583642cd.png)

こうなりました

![AtoB_211.png](https://qiita-image-store.s3.amazonaws.com/0/206651/f001d457-7748-e2ba-4105-1ad1c065a6c7.png)

ちゃんと、目が生成されていますね!

## 上手くいかなかった例

この人が

![275.png](https://qiita-image-store.s3.amazonaws.com/0/206651/3a63633c-aca6-fbd5-3fd2-c123fc3313a6.png)

こうなりました

![AtoB_275.png](https://qiita-image-store.s3.amazonaws.com/0/206651/3b0beb11-e302-e485-8285-05c747a0363e.png)


# 反省点

どれが原因か分かりませんが

- 学習回数が少なすぎた? 
- データ量が足りなかった?
- データ量が顔写真とアニメ絵に偏りがあった?
- ニューラルネットワークそのものを設計を見直す必要があった?
- そもそも、現在の技術では不可能?
grep コマンドの使い方をサンプル付きでわかりやすく解説

## 🔍 grepとは？

`grep` は「**Global Regular Expression Print**」の略で、**文字列検索ツール**です。
ある文字列を含む行をファイルや標準入力から探して表示してくれます。

---

## ✅ 基本構文

```bash
grep [オプション] 検索文字列 ファイル名
```

---

## 📘 基本的な使い方

### 1. ファイル内で文字列を検索する

```bash
grep "Hello" sample.txt
```

> `sample.txt` の中から "Hello" を含む行を表示します。

---

### 2. 大文字・小文字を無視して検索（-i）

```bash
grep -i "hello" sample.txt
```

> "Hello", "HELLO", "heLLo" など、大文字小文字を区別せずにマッチします。

---

### 3. 行番号を表示する（-n）

```bash
grep -n "error" log.txt
```

> "error" を含む行と、その行番号を表示します。

---

### 4. 再帰的に検索（-r または -R）

```bash
grep -r "TODO" ./src
```

> ディレクトリ `./src` 以下の全ファイルから "TODO" を検索します。

---

### 5. 正規表現で検索（デフォルトで正規表現対応）

```bash
grep "error[0-9]" log.txt
```

> "error" の後に数字が1桁続くパターン（例: error1, error5）を検索します。

---

### 6. 該当しない行を表示する（-v）

```bash
grep -v "DEBUG" log.txt
```

> "DEBUG" を含まない行を表示します。

---

### 7. 一致した箇所だけを表示（-o）

```bash
grep -o "https://[^ ]*" urls.txt
```

> ファイル内のURL部分だけを抽出します。

---

### 8. 複数ファイルで検索（ワイルドカード）

```bash
grep "main()" *.c
```

> カレントディレクトリの `.c` ファイルすべてに対して "main()" を検索します。

---

## 🧪 応用例：パイプと組み合わせる

### 例: `ps` コマンドと組み合わせて特定のプロセスを探す

```bash
ps aux | grep "nginx"
```

> 実行中のプロセスの中から "nginx" を含むものを表示します。

---

### 例: ログファイルからエラー行だけを抽出

```bash
cat server.log | grep -i "error" | grep -v "404"
```

> "error" を含むが、"404" を含まないログ行を抽出します。

---

## 🎯 まとめ

| オプション       | 説明            |
| ----------- | ------------- |
| `-i`        | 大文字小文字を無視して検索 |
| `-n`        | 行番号を表示        |
| `-v`        | 一致しない行を表示     |
| `-r` / `-R` | ディレクトリを再帰的に検索 |
| `-o`        | 一致した文字列のみ表示   |
tf-coremlでcoreMLモデルが作れない ValueError: Graph has cycles.

# tf-coremlでモデルの変換
LSTM等のRNNを含むネットワークをpbファイルからcoreMLに変換しようとすると

```
ValueError: Graph has cycles.
```

と言われます。
これはRNNのような形のネットワークをcoreMLが対応していないかららしいです。しかし、純粋なネットワークで構成するRNNではなく、coreMLが用意しているRNN用のレイヤーを利用すれば同様の形のネットワークが構築できるようなのですが、要するにそれってcoreMLでモデルをゴリゴリ記述して、Tensorflowで学習した重みを全てcoreML上で適用してねって事みたいです。

参考: https://github.com/tf-coreml/tf-coreml/issues/124

これは辛い…

CaffeやKerasから変換のできるcoremltoolsではこのようなエラーは出なかったので多分そっちではある程度互換性があってそれぞれのレイヤーを利用している感じなのかな。
ajaxでServletにnullを投げると空欄""に変換される

ajaxからServletにリクエストを投げる場合、nullは空欄に変換されました。
仕様？

```sampleAjax.js

  var sampleAjax = function(){

    //リクエスト
    var request = {para : null};

    //ajax通信
    $.ajax({
      type    : "GET",
      url     : "urlSample",
      data    : request,
      async   : false,
      success : function(data) {
        console.log(data);
      },
      error : function(XMLHttpRequest, textStatus, errorThrown) {
        alert("リクエスト時になんらかのエラーが発生しました\n" + textStatus +":\n" + errorThrown);
      }
    });

  }
```


```servlet.java

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet(urlPatterns={"/urlSample"})
public class SvSample extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    public void doGet (HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {

      //パラメータ
      String para = req.getParameter("para");
      String para = req.getParameter("paraDummy");

      //表示
      System.out.println("----");
      System.out.println(para);
      System.out.println(paraDummy);
      System.out.println("----");
    }
}
```

```result.txt
----

null
----
```
空欄なので何も表示されない。
リクエストにないパラメタは、nullになる。
エンジニアの必須であるgitとは何か？

#エンジニアの必須であるgitとは何か？

  
　そもそもとはgit何かというところから、よく使われるgitの用語を初心者向けにわかりやすく説明していきます。





##gitとは
　gitというのは簡単にいうと「バージョン管理システム」のことです。  
gitを使うことでチーム開発をする際、共有をして作業することが出来ます。また、一度編集したファイルを過去の状態に戻したり、編集箇所の差分を表示したりすることも出来ます。


##リポジトリ
　リポジトリとは、ファイルやディレクトリの状態を記録する場所です。その中でも、リモートリポジトリとローカルリポジトリの2種類に分けられます。

* リモートリポジトリ  
専用のサーバに配置して複数人で共有するためのリポジトリ

* ローカルリポジトリ  
一人一人が利用するために、自分の手元のマシン上に配置するレポジトリ

この2種類に分けることで、普段の作業はローカルリポジトリで、公開したい時はリモートリポジトリにアップロードするという使い分けが出来ます。

##ブランチ
　ブランチとは、履歴の流れを分岐して記録していくためのものです。つまり、同じリポジトリの中で複数の変更を進めていくことが出来ます。  
　ブランチを使うことで、チーム開発をする際、メインのブランチから自分専用のブランチを作成し、作業が終わったらメインのブランチに変更を取り込んでいきます。このようにすれば、他のメンバーの作業に影響することがなく、自分の作業に取り込むことが出来ます。  
　

##コミット
　コミットとはリポジトリに記録するときに行う操作のことです。コミットを実行すると、リポジトリ内では前回との差分を記録したコミット(リビジョン)と呼ばれるものが作成されます。  
また、コミットの実行時にはコミットメッセージが入力できます。

##プッシュ
プッシュとはローカルリポジトリからリモートリポジトリにアップロードする際に行う操作のことです。  
プッシュを実行すると、リモートリポジトリ内の変更履歴がローカルリポジトリの変更履歴と同じになります。


##まとめ
　このようにgitはとても便利な上に問題を回避することが出来ます。  
今回はgitの基本的なことを解説しましたが、奥が深くいろいろな概念があるのでまた次回紹介していきます。



##参考文献
[サルでもわかるgit入門](https://backlog.com/ja/git-tutorial/)
スタートアッププロジェクトを




デバッグを開始できません スタートアッププロジェクトを起動できません

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/40e3b49c-3b71-b6b8-ff1b-641c0b8a0668.png)


[.NET SDKs for Visual Studio](https://www.microsoft.com/net/download/visual-studio-sdks)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/248598e5-2fee-2941-5113-a63ade092921.png)
Visual Studio >Blazor (下書き中)




[C# で Single Page Web Application が書ける Blazor が凄かった件 - Qiita](https://qiita.com/jsakamoto/items/20d4893f6c8cdb0356f6)



[aspnet/Blazor: Blazor is an experimental .NET web framework using C# Razor and HTML that runs in the browser with WebAssembly](https://github.com/aspnet/blazor)


## Getting Started

build.cmdを実行します。（ダブルクリック or cmd.exeで実行）

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/fe18cc69-2617-16f8-5447-563fe1f77a16.png)
NaNの判定

忘れないためにメモ

```js
	Number.isNaN = Number.isNaN || function(any) {
		return typeof any === 'number' && isNaN(any);
	};

```

使用例

```js
if(Comparison == 0 || Comparison== null || Comparison== undefined || Number.isNaN(Comparison)){

processing.......

}
```
超初心者が学ぶtransaction

## 学んだこと　
* トランザクション制御を行うことでデータを守れる。(実用的な利益を感じるところまでは勉強できていない)
* beginTransaction でトランザクションを開始
* commit で更新を確定
* rollBack で失敗時にデータを元の形に戻す

##使用例

個人で作成したワーク内で使ってみました。

```php:qiita.php
<?php
if (isset($_POST['submit']) === true) {
    if ($kind !== '' && $price !== '') {
        try {
            $accessHouseholdData->pdo->beginTransaction();
            $accessHouseholdData->insertKind($kind, $price, $userId);
        } catch (Exception $e) {
            $accessHouseholdData->pdo->rollBack();
        }
        $accessHouseholdData->pdo->commit();
    }
}
```

試しに

```php:qiita.php
<?php
if (isset($_POST['submit']) === true) {
    if ($kind !== '' && $price !== '') {
        try {
            $accessHouseholdData->pdo->beginTransaction();
            $accessHouseholdData->insertKind($kind, $price, $userId);
        } catch (Exception $e) {
            $accessHouseholdData->pdo->rollBack();
        }
        //$accessHouseholdData->pdo->commit();
    }
}
```

このように記述すると、commitできていなくDBにinsertもされていないにも関わらず、更新をかけるまでは結果が出力されてしまう結果に。
どうやらもう一度送信ボタンを押さないとトランザクションが走らないため、とりあえず保留していたところからfetch(このコードの下にインサートしたデータを取って来る処理もあります)できてしまう模様。

##難しかったこと、メモなど
* 最初はどこにcommitとrollBackを記述すれば良いか分からなかった
* if文の中でも使えるよ
* とりあえず使い方はわかったものの、実際に複数のDB処理を行う場面で使ってみないと有用性は実感できないかな
* 意外とすんなり勉強できました

## 参考サイト
PHP公式 http://php.net/manual/ja/pdo.transactions.php
PHP公式　http://php.net/manual/ja/pdo.begintransaction.php
[PHP + PDO + MySQL のトランザクション制御方法まとめ](https://www.websec-room.com/2015/11/17/2356)
[PDOのトランザクション](https://gray-code.com/php/transaction-by-using-pdo/)


##5/24 メモ
初心者なりの疑問→もし`commit`を`try`内に記述したら、エラーが発生後の記述のコミットを読んでからロールバックできるのか？

答え→`biginTransaction`を行って以降エラーが発生したら、その時点でスローをしてくれて、それ以降の処理は読まないため`commit`は`try`の中でも大丈夫。