OmniAICreator/Qiita-1.07M huggingface dataset:
BOMやBlobを理解してJavaScriptでCSVを出力する


[BRIGHT VIE Advent Calendar 2018 - Qiita](https://qiita.com/advent-calendar/2018/brightvie) の4日目の記事です。

先日開発を行っている中で、JavaScriptだけでCSVを出力する仕組みを目にすることがあり、
コードの理解も含めて今日はこのことを記載できればと思います。

# はじめに

下記のコードを御覧ください。

```javascript
function exportCSV(records) {
   let data = records.map((record)=>record.join(',')).join('\r\n');

   let bom  = new Uint8Array([0xEF, 0xBB, 0xBF]);
   let blob = new Blob([bom, data], {type: 'text/csv'});
   let url = (window.URL || window.webkitURL).createObjectURL(blob);
   let link = document.createElement('a');
   link.download = 'result.csv';
   link.href = url;
   document.body.appendChild(link);
   link.click();
   document.body.removeChild(link);
};
```

これは、与えられたrecordsという２次元配列を、
'result.csv'というCSVファイルに出力するためのJavaScriptプログラムです。

ブラウザで下記のように実行すると

```javascript
let record = [
  ['ID','商品名','価格'],
  [1, 'りんご（箱)', 100],
  [2, 'みかん　(箱)', 1200]
]
exportCSV(record);
```

このようなCSVファイルをダウンロードすることが出来ます。

```
ID,商品名,価格
1,りんご（箱),100
2,みかん　(箱),1200
```

# 出力の仕組みについて

上記プログラムで利用されている、Uint8Arrayで作成するbomやBlobについてまとめてみようと思います。

## バイトオーダーマーク

プログラム先頭の[0xEF, 0xBB, 0xBF]は、バイトオーダマークと呼ばれるようです。

```javascript
let bom  = new Uint8Array([0xEF, 0xBB, 0xBF]);
```

> バイトオーダーマーク (byte order mark) あるいはバト順マーク（バイトじゅんマーク）は通称BOM（ボム）といわれる、Unicodeの符号化形式で符号化したテキストの先頭につける数バイトのデータのことである。このデータを元にUnicodeで符号化されていることおよび符号化の種類の判別に使用する。
> 引用: [Wikipedia] より

上記では、「UTF-8」という文字コードを示すことになるようですね。

「UTF-8のファイルですよ」ということを示すためにファイルの先頭にセットする場合には、
これを8ビット符号なし整数値を表現可能なUint8Arrayでバイナリデータとしてセットするようです。

- 参考
   - [UTF-8のBOM付き・BOM無しの違いと確認方法](https://uxmilk.jp/48923)
   - [UTF-8のBOMにはまった話](https://qiita.com/MuriNishimori/items/a89fe986e28909208e30)



## Blob

Blobとは、Binary Large OBjectの略であり、バイナリデータを表すオブジェクトです。

Web上でファイルのやり取りをするFileAPIでもこのBlobが利用されており、
ファイルを出力する際にもこのBlobを利用してファイルを生成します。

Blobでファイルを生成するには、第一引数に配列でセットしたいデータを
第二引数にMIME タイプを指定する形でファイルを生成します。

```javascript
let blob = new Blob([bom, data], {type: 'text/csv'});
```

なお、第一引数に指定できる型は、ArrayBuffer, ArrayBufferView, Blob, DOMStringのいずれかとなっており、
DOMStringって何だろうと調べてみたところ

> DOMString は、UTF-16 文字列です。JavaScript では UTF-16 文字列を用いるため、DOMString は直接 String に対応します。
> 引用: [DOMString | MDN web docs] より

と普段JavaScriptで利用している文字列でした。


- 参考
   - [Blob - MDN web docs](https://developer.mozilla.org/ja/docs/Web/API/Blob)
   - [File - MDN web docs](https://developer.mozilla.org/ja/docs/Web/API/File)
   - [DOMString - MDN web docs](https://developer.mozilla.org/ja/docs/Web/API/DOMString)
   - [BLOB とは何か](http://5509.hatenablog.com/entry/2013/04/26/012658)


## ファイルダウンロード

URLインタフェースのcreateObjectURLメソッドを利用して、
指定された File, Blob, MediaSourceなどのオブジェクトを参照することが出来るURLの発行を行います。

今回は、そのURLをa要素のhref属性にセットしてclickイベントを発火させることで
自動でダウンロードさせるような仕組みで動作しているようです。

# まとめ

昨年から個人的にJavaScriptで[バイナリデータを扱うことがすごく多く](https://qiita.com/megadreams14/items/dded3cf770010bb8ff08)なっており
今回ファイル領域までしっかり調べることが出来たのは良い機会になりました。

ファイルの作成などわざわざサーバ側で処理をしなくともブラウザ側だけで処理が完結出来るのは、
サーバの負荷対策や無駄な通信量がかからない点でもメリットがありそうですね。


## 余談

ちなみにこのBOMについて別案件でPHPでCSVを読み取り処理するプログラムがあったのですが、
その時に「CSVの先頭行が読み込まれない問題」でハマっていたことがありました。
このあたりの知識が無いと思わぬところでハマってしまうんだなと感じた瞬間でした。
カレー好きなデザイナーが贈る デザインセンスを感じるカレー屋 5選

# はじめに
**年間500食** カレーを食べ（信じられないくらい盛ってます）スパイスからカレーを自作することもある、自称CurryDesignerのAzegamiが、味・外観内観・調度品などから、独断と偏見でデザインセンスを感じるカレー屋さんを厳選しましたのでご覧下さい！！（○○ttyみたいな記事ですみません^^;）

# 1. マリーアイランガニー
![640x640_rect_88778480.jpg](https://qiita-image-store.s3.amazonaws.com/0/294079/0f75ce7a-21a1-344f-fcfc-9cd800678c2d.jpeg)

## センスを感じるポイント
**・ ロックな店主がお出迎え**
キューバの革命家かな？という出で立ちのロックな店主がお出迎え。

**・ トロットロッの角煮と香り豊かなカレーに思わずメロイックサイン**
エアーズロックのごとくそびえ立つ豚の角煮、カルダモンの風味が効いた品の良いカレーはジワジワと汗ばむ辛さで心地が良い。

# 2. カレーライス ディラン
![640x640_rect_65151450.jpg](https://qiita-image-store.s3.amazonaws.com/0/294079/6e18278d-339a-7636-de6f-914772d02b05.jpeg)
## センスを感じるポイント
**・ グッドバランスカレー**
辛過ぎず濃過ぎず、けれどスパイスの風味は豊か。バランスの良い味は、センスが半端ないって。

**・ 採光が最高でさぁ行こう！**
角部屋で日当たり最高！
晴れた日は日向ぼっこをしながらの優雅なランチへさぁ行こう！

# 3. カレー&オリエンタルバル 桃の実

![momonomi.jpg](https://qiita-image-store.s3.amazonaws.com/0/294079/b1bc3d75-7428-692e-0142-c40a2104193d.jpeg)


## センスを感じるポイント
**・ "コショウが少々"どころではない⁉︎ もはやこれはペッパーカレー**
食べた瞬間とても胡椒の風味と味を感じるが、ちゃんとカレーと調和している。その大胆さに脱帽。

**・ イカした選曲。イカした店主。**
ハナレグミ、クラムボン、サニーデイサービスなどカレーに合うイカした選曲。そして、常連さんにデザートのリワードを返してくれるイカした店主。

# 4. LAND

![640x640_rect_81822688.jpg](https://qiita-image-store.s3.amazonaws.com/0/294079/142a4111-696d-94f2-6850-f91a7c0b604f.jpeg)


## センスを感じるポイント
**・ 真打ち登場！ まさにカレーデザイナー**
店主の本業がデザイナー。もちろんそのカレーにはデザインセンスを感じざるを得ない。

**・ デザイン&デザイン&デザイン**
店名・販売しているグッズ・調度品など全てにデザインセンスが行き届いている。弟子入りしたい。

# 5. GOOD LUCK CURRY

![640x640_rect_84314823.jpg](https://qiita-image-store.s3.amazonaws.com/0/294079/42886b96-f017-d663-50ef-b8a109e7dd0b.jpeg)



## センスを感じるポイント
**・ 最近運が悪い…。そんなあなたにグッドラック！**
グッドラックカリー…。幸運が訪れること間違いなし！

**・ 映える〜！フォトジェニックなルックス**
ターコイズブルーなお皿、色鮮やかな野菜、サフランライス、カレーのハーモニーは目にもGood！視力もアップ⁉︎

# 紹介したお店の情報
1. マリーアイランガニー（MarieIranganee）
https://gpocket.jp/share_links/eRgINbTjGdU

2. カレーライスディラン
https://gpocket.jp/share_links/jH8RB7RBrGc

3. カレー&オリエンタルバル桃の実水道橋店
https://gpocket.jp/share_links/Rz4xwcDtlAg

4. LAND（ランド）
https://gpocket.jp/share_links/mZXPUxfEXx0

5. グッドラックカリー（GOODLUCKCURRY）
https://gpocket.jp/share_links/f4CKOq8ij-U

#都内のイケてるカレー屋が丸わかり!? カレーリストのシェア
<img width="320" alt="写真 2018-12-04 21 09 28.png" src="https://qiita-image-store.s3.amazonaws.com/0/294079/379dea39-3db4-cac8-1a9c-50b4120fd0ec.png">


「CurryDesigner畔上がセレクトしたカレー屋さんリスト」が欲しい方は下記のリンクから是非
ご参加下さい！

招待リンクを押して『カレー 』リストに参加してください！

1. まずはグルポケをダウンロードしてください！
https://itunes.apple.com/jp/app/id1290243466

2. 次の招待リンクを押して『カレー 』リストに参加しよう！
https://gpocket.jp/lists/Dsh9T6Ps9W5NFBg6aQ

# 最後に
今回紹介したお店に是非行ってみて、デザインを感じてみて下さい！w
肌寒い今日この頃、カレーを食べてポカポカしましょう！！
最後まで読んで頂きありがとうございました！
eslint-plugin-jsdocを入れてるのに警告が出ない


> [ESLint の組み込み JSDoc サポートが終了します \- Qiita](https://qiita.com/mysticatea/items/09f9dd4ab2569cd4cd68)

この記事を受けて、[eslint\-plugin\-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc)を導入した。

その同時期にstileを`google`から`JavaScript Standard Style`へ変えてみた。

(参考:  [JavaScriptの有名なコーディングスタンダードまとめ \| hifive開発者ブログ](https://blog.htmlhifive.com/2017/09/12/javascript-style-guide/))

## jsdocコメントのlintが出ない

`google style`ではjsdocコメントは必須だが、`JavaScript Standard Style`では必須ではない。
それらを加味してeslint-plugin-jsdocを入れてみた。設定は以下の通り。
`@description`タグは使いたくない、日本語だと警告がでる、その部分だけオフにしている。

```.eslintrc.json
{
  "extends": "Standard",
  "plugins": ["jest", "node", "promise", "jsdoc"],
  "env": {
    "es6": true,
    "node": true,
    "jest/globals": true
  },
  "rules": {
    ~~中略~~
    "jsdoc/check-param-names": 1,
    "jsdoc/check-tag-names": 0,
    "jsdoc/check-types": 1,
    "jsdoc/newline-after-description": 1,
    "jsdoc/no-undefined-types": 1,
    "jsdoc/require-description": 0,
    "jsdoc/require-description-complete-sentence": 0,
    "jsdoc/require-example": 1,
    "jsdoc/require-hyphen-before-param-description": 1,
    "jsdoc/require-param": 1,
    "jsdoc/require-param-description": 1,
    "jsdoc/require-param-name": 1,
    "jsdoc/require-param-type": 1,
    "jsdoc/require-returns-description": 1,
    "jsdoc/require-returns-type": 1,
    "jsdoc/valid-types": 1
  }
}

```

で、ふと気付いた。jsdocコメントを書いていないのに警告が出ない。  
適当なコメントを書いたら`Missing JSDoc @example declaration`とか言ってくれるのに。


どうやら全く書いていなければ警告は出ない。
書いているjsdocコメントについて「アレが足りないココがおかしい」とは言ってくれるが「コメント書かなきゃ！」とは言ってくれない。

## 修正方法

rulesに以下を追加します。これでjsdocコメントを書いていないことへの警告をしてくれます。プラグインの機能ではなく公式の機能です。

```.eslintrc.json
    "require-jsdoc": 2,
```

公式では「JSDoc サポートが終了します」とのことですが、`require-jsdoc`は残してくれるんでしょうか。
Glueのchoice型でハマった件

#自己紹介
オンプレ出身インフラエンジニア、AWS初心者のため勉強中
Qiita初投稿

#概要
やりたいことは単純で、S3内のjsonデータをAthenaで検索したり、加工してS3にエクスポートしたい！
他部署の方に最新のデータを提供して色々分析して貰いたい！

#実装方法
![スクリーンショット 2018-12-03 15.54.38.png](https://qiita-image-store.s3.amazonaws.com/0/261535/ff6b8f5c-736f-6b56-fcb1-ae79ef213aa2.png)

`Glueのクローラーを毎日実行`
　　　　↓
`Glueのテーブルを毎日更新`
　　　　↓
`jobを毎日実行(不要なカラム削除）`
　　　　↓
`S3にエクスポート`

#問題点
あるカラムの中にint型とdouble型が混在しているので、エクスポートした時にどちらかの方がnullになってしまう。提供した他部署の方に指摘されて気付きました。
その節はご迷惑お掛けしました。。この場を借りてお詫びします。

#実施したこと
複数の型があった場合はchoice型が選択されていい感じにやってくれるらしいので　、出力方法を変更してみる

```
applymapping1 = ApplyMapping.apply(frame = datasource3, mappings = [("columnA", "int", "columnA", "string")]
```
でstringで出力、でもできない！
ならばdouble型で色々試してみる

```
applymapping1 = ApplyMapping.apply(frame = datasource3, mappings = [("columnA", "int", "columnA", "double")]

applymapping1 = ApplyMapping.apply(frame = datasource3, mappings = [("columnA", "double", "columnA", "double")]

applymapping1 = ApplyMapping.apply(frame = datasource3, mappings = [("columnA", "double", "columnA", "int")]

applymapping1 = ApplyMapping.apply(frame = datasource3, mappings = [("columnA", "double", "columnA", "string")]
```
できない！！！

resolveChoice使えばできそう！！
サポートに聞いてみた。
>ResolveChoice の第一引数は JSON ファイルの属性と一致させる必要がありますので、以下のように記述することで int 型へのキャストが可能でございます。

#解決方法
```
datasource1 = datasource0.resolveChoice(specs = [('columnA','cast:int')])

applymapping1 = ApplyMapping.apply(frame = datasource3, mappings = [("columnA", "int", "columnA", "int")]
```
なるほど〜！
choice型で入っているので、一度型を揃えてから出力してあげればできるんですね。

#今後の妄想
S3内のデータをAthenaでゴリゴリ検索できる、エクスポートして他部署に展開できる！
不要なカラムを削除することで検索時間の削減、料金削減もできる！


#参考
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-api-crawler-pyspark-transforms-ResolveChoice.html
ReplayKit2でゲーム画面の配信 2018.12.3 Streaming Conference #5

#2018.12.3 Streaming Conference #5の資料

![資料.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/1b14d39d-7c40-3753-4004-71cdc2cb4799.jpeg)
![資料.002.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/903d146e-e22b-206d-50a0-e705a3d2146a.jpeg)
![資料.003.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/1207c58b-94a7-f596-8095-b12100df80e9.jpeg)
![資料.004.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/e89bfbb4-0346-123a-c023-ada86bfed119.jpeg)
![資料.005.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/23eb94aa-4fe0-d36d-87ef-2d6c1387ce30.jpeg)
![資料.006.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/9b5e1d42-0a0c-9e96-864f-fae295fbc836.jpeg)
![資料.007.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/e069376f-235a-0b6e-38f9-b675cc81feba.jpeg)
![資料.008.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/a0a04d03-ab69-df2c-238b-685b78624ee0.jpeg)
![資料.009.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/72cde248-b5be-a703-d3b4-8e681286e06c.jpeg)
![資料.010.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/7a6dcfac-6d25-9be7-fdf5-350f7229a38d.jpeg)
![資料.011.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/a95b90a2-10d9-c5b6-da5c-cb3ce6d68a14.jpeg)
![資料.012.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/a13fc608-9404-d1b5-ce28-48ce423b7293.jpeg)
![資料.013.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/3f3e0cad-6f83-5894-6dd3-36aa922ff89c.jpeg)
![資料.014.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/ab216f6a-f4f8-232a-a9f0-fc6190bdf106.jpeg)
![資料.015.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/cc4f1949-10d5-56e8-62ec-592400edba15.jpeg)
![資料.016.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/ee2e47e8-319b-443a-a8f5-cacfc6cb509b.jpeg)
![資料.017.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/05eeee4b-15be-565c-435c-3952dace1d1f.jpeg)
![資料.018.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/7baa51d0-5575-bfa1-7c24-f6cf6b4dc5cc.jpeg)
![資料.019.jpeg](https://qiita-image-store.s3.amazonaws.com/0/300377/ebf00dcd-2f30-2b93-957b-31bf4cc6593a.jpeg)



#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=085ec451d66944773136)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=085ec451d66944773136)
CryptZombiesレッスン2(チャプター6~10)の自分なりのまとめ

# 最初に
この記事は私がCryptZombiesを進めていく上で自分なりにまとめたものです。
前回の記事
https://qiita.com/daichi77/items/edf41bdf2b9953a71fd7
参考にしたサイト
サイト名: イーサリアム上のDApp開発をゲームを作って学びましょう
URL: https://cryptozombies.io/jp/　
#チャプター６ import
## 用語
**import**
これは別のファイルを読み込む時に使う。

```
import "ファイル名"
```
## 今回したこと(テスト)
今回は問題文にもあるように別のファイルをimportしただけ。

# チャプター７ ストレージ VS メモリ
## 用語
**ストレージ**
ブロックチェーン上に永久に保存される変数。
**メモリ**
ブロックチェーン上には保存されず一時的に保存される変数。用が終わったら消される。
memoryはコピーするだけ。
## 今回したこと(テスト)
1. ゾンビに餌を上げるための関数を定義
2. requireを使って自分のゾンビにしか餌を与えれないようにした。
3. myZombieストレージにzombies[_zombieId]を格納。

# チャプター８ ゾンビDNA 
今回は演算子使ってDNA設定できるようにしただけなので割愛。
# チャプター９ 別の関数とビジビリティ
## 用語
**インターナル**
privateと似ている。違う点は継承されたcontractから呼び出せるということ
**エクスターナル**
publicと似ている。違う点はcontractの外からしか呼び出せないという点。

## 今回やったこと(テスト)
_createZombie関数をinternalに変更。以上！
# チャプター１０ ゾンビは何を食べるのか？
## 用語
**interface**
他のコントラクトの関数がどのようなものかを知ることができる。
## 今回やったこと(テスト)
KittyInterfaceの作成。コントラクトと書き方はほぼ同じだが、関数の最後に{}をつけずに;で終わることでinterfaceと認識される。
## 思ったこと
他の言語と違いsolidityではreturnするものを複数指定できるのがいとすごし。
TODOはどこに書いても自由だ！

# 記事の目的

- 試した事に興味を持って貰えたのでメンバへ共有する
- だけじゃ勿体ないから公開してみる

## やった事

- TODO書いてからコードした
- 他メンバも同じことやると思い込んでた

## 背景

- あんま慣れてないスタックで
- 慣れてないTDDにも惑わされつつ
- リファクタリング済みの既存コードを真似て機能追加しようとして無理が露呈してきた頃
- 取ったタスクから設計に落とす段階で迷子になってた事が身に染みてきた頃
- サブタスクを文字に起こそうとなった、、、とある日のできごと

## ケース1

- ホワイトボード買ってきた人がいた
- サブタスク完＝消す＝快感で効率アップ？

## ケース2

- コンピュータのテキストエディタで書いた人がいた
- 環境に優しい！導入準備も不要！

## 私がしたこと

- [VSCodeにTODO拡張いれて](https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight)
- コードに埋めてpushした

## 気にしたこと

- テストは壊れてないからpushしても怒られないと踏んだ
- どのファイルのどの辺とか行数だと変わるし考慮が面倒い
- 手書きがそもそも面倒い
- TODO拡張の機能で一覧になるし、ジャンプできる（そもそもその為の拡張）
- プルリク時には自分のサブタスクTODOは全部消しておく
- issueではない

## 例をfizzbuzzで

まず仕様

1. 数を引数に取る
2. 引数の値文字列を返す
3. ただし、3の倍数のときは｢Fizz｣
4. ただし、5の倍数のときは｢Buzz｣
5. ただし、3と5両方の倍数の場合には｢FizzBuzz｣

- こんなのを想定しつつ一つ一つ別のTODOにします
- これをテスト側に書きます
- でとりあえず共有
- 1と2だけTODOやっつけて共有
- 3だけTODOやっつけて共有
- 引数の上限100でいいからTODO追加、みたいな？

## 明日の自分へ一言

- テスト駆動開発の付録Cを読もう
Stanford Core NLP の導入

言語処理100本ノック 2015

「53. Tokenization
Stanford Core NLPを用い，入力テキストの解析結果をXML形式で得よ．また，このXMLファイルを読み込み，入力テキストを1行1単語の形式で出力せよ」

Stanford Core NLP
https://stanfordnlp.github.io/CoreNLP/

の導入をしてみる。

#１回目

```shell-session:mac
$ docker run -it ubuntu /bin/bash
```
dockerが起動したら

```shell-session:docker
# apt-get update
# apt-get install -y wget
# apt-get install  -y unzip
# apt-get install  -y vim
# apt-get install -y sudo
# apt-get install  -y maven
# wget http://nlp.stanford.edu/software/stanford-corenlp-full-2018-10-05.zip
# unzip stanford-corenlp-full-2018-10-05.zip 
# java --version
openjdk 10.0.2 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)
# apt-get install make
# apt-get install default-jdk
```

下記２行を~/.bashrcに追記
```sh:~/.bashrc
for file in `find /stanford-corenlp-full-2018-10-05/ -name "*.jar"`; do export
CLASSPATH="$CLASSPATH:`realpath $file`"; done
```
実行してみる。

```
# sudo sh ~/.bashrc 
/root/.bashrc: 13: /root/.bashrc: shopt: not found
/root/.bashrc: 21: /root/.bashrc: shopt: not found
export HOME='/root'
export HOSTNAME='c0c48076c758'
export LOGNAME='root'
```

```sh:in.sh
echo "the quick brown fox jumped over the lazy dog" > input.txt
java -mx3g edu.stanford.nlp.pipeline.StanfordCoreNLP -outputFormat json -file input.txt
```
実行してみる。

```
# sh in.sh
Error: Could not find or load main class edu.stanford.nlp.pipeline.StanfordCoreNLP
Caused by: java.lang.ClassNotFoundException: edu.stanford.nlp.pipeline.StanfordCoreNLP
root@c0c48076c758:/stanford-corenlp-full-2018-10-05# cat ~/.bashrc
```

```
# make
if [ ! -e src ] ; then \
  mkdir src ; cd src ; jar -xf ../stanford-corenlp-*-sources.jar; \
fi;
mkdir -p classes
javac -O -d classes -encoding utf-8 src/edu/stanford/nlp/*/*.java \
    src/edu/stanford/nlp/*/*/*.java \
    src/edu/stanford/nlp/*/*/*/*.java \
    src/edu/stanford/nlp/*/*/*/*/*.java \
    src/edu/stanford/nlp/*/*/*/*/*/*.java
javac: file not found: src/edu/stanford/nlp/*/*.java
Usage: javac <options> <source files>
use --help for a list of possible options
Makefile:9: recipe for target 'corenlp' failed
make: *** [corenlp] Error 2
```
#２回目

```shell-session
$ docker run -it continuumio/anaconda /bin/bash
```
（中略）
これpython2だった。最後まで行ってから気が付いた。泣）

#3回目

```
$ docker run -it continuumio/anaconda3 /bin/bash
```
Qiita と Scrapbox の圧倒的な違い – Scrapbox はソーシャルじゃない

- いいねが出来ない
- コメントが出来ない
- Twitter拡散ボタンもない
- あまりにも大きな違い

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d214aee1-6bd7-4393-68dc-8bd202de6081.png)

# サービス性質の圧倒的な違い

- 絶対にソーシャル性を持たせないというポリシーが見える気がした
- サービスコンセプトが一貫していると思う
- Qiita勢ソーシャル勢には寂しいが、サービス側からが「お断りするユーザー」によって、サービス特質はさらに加速する








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rubyでrenderとcollectionを使う

#初めに

Controllrからの値を割り振る際にeachを使って下記のように割り振ることがあると思います。

``` views/_xxx.html.erb

<% @users.each do |user| %>
  <ul class="lists">
    <li class="list">#{user.name}</li>
  </ul>
<% end %>
```

Viewでの繰り返し部分を、eachメソッドを使用するのではなく、コレクションをレンダリングすることで実装する方法が綺麗になると思い以下のように私は書きます。

#Collection

``` views/yyy.html.erb

<ul class="lists">
  <%= render partial: "user", collection: @users %>
</ul>
```
```_user.html.erb

<li class="list">#{user.name}</li>
```
また、``as``で自分が指定したいローカル変数名に書き換えることも可能です。

``` views/yyy.html.erb
<ul class="lists">
  <%= render partial: "user", collection: @users, as: :person %>
</ul>
```
```_user.html.erb

<li class="list">#{person.name}</li>
```
東京在住のエンジニアが日頃の疲れを癒すのに最適だと思うスーパー銭湯3選

[ユアマイスターアドベントカレンダー2018](https://qiita.com/advent-calendar/2018/yourmystar) の5日目の記事です。

何気にアドベントカレンダーは初めてなので少し緊張しています。
僕はフリーランスでエンジニアやっているのですが、最近2日に1回くらい銭湯に通っています。個人的にはもはや趣味からルーティンの域に移行しています。

地元の銭湯からスーパー銭湯まで、エリアは東京から神奈川までをターゲットにこれまで開拓してきましたが、今回はその中から特に快適だな〜と思ったスーパー銭湯を今回は3つ紹介したいと思います。

# ランキング公開の前に…
**1. 僕が銭湯に通うようになった経緯
2. エンジニアと銭湯の相性**

この2つについて語ってみようと思います。

## 1.僕が銭湯に通うようになった経緯
実は今住んでいる賃貸の給湯器の調子が悪く、湯船を張るにも温度調整が難しくて非常に手間がかかることがそもそものきっかけでした。

最初は湯船ではなくシャワー浴びることで凌いでいましたが、そのうちシャワーも完全に身体を温めるのには効率が悪いと気付くようになり、

**「やはり湯船に浸かることは重要だ！」**

と思い始めるに至るわけです。

血流を良くして高い体温を維持することができると、免疫が高まったり体内の老廃物を排出するのにも効果的と聞きますが、これは実際あると思っています。仕事にも良い影響がある。こうした観点からも、湯船に浸かることは大切な習慣なわけです。


## 2.エンジニアと銭湯の相性
これはエンジニアに限ったことではないと思いますが、デスクワークしていると二の腕や肩こり、悪い姿勢から生ずる骨盤の位置のずれ、そして足のふくらはぎに結構ダメージがたまります。知らないうちにリンパの流れが滞ることも。

また、仕事量が多くてつい摂生が疎かになり、不健康になりがちな傾向があると感じています。

これらを解消するには

**1. 適度に運動する習慣を作る
2. 身体の柔軟性を高める
3. 栄養バランスと、適切な炭水化物量を意識した食事
4. 体温を上げる**

こうした取り組みが大切です。

上記のうち、銭湯は2.と4.に高い効果を発揮します。昨今の銭湯には炭酸泉を導入しているところが多く、二酸化炭素を添加した湯船に浸かると体内の血液循環に高い効果があるらしいです。実際、炭酸泉に浸かると体内から温まる感じがあります。（ただ、炭酸泉は銭湯毎に効果にムラがある気がする）

また、昨今のスーパー銭湯は休憩スポットがPCでプログラミングする環境としても良いなぁと思っています。何気に静かで集中しやすいんですよね。他にも、疲れてきたら昼寝したり漫画読んだり、直ぐに湯船に疲れるのも魅力。

そんなわけで、総合的に見てエンジニアと銭湯は相性が良いと思っています。

## お待たせいたしました…
というわけで、以下は独断と偏見で僕が**「ここはオススメ！」**と感じているスーパー銭湯ランキング上位3位の紹介です。

# 第1位：宮前平源泉 湯けむりの庄
![IMG_5938.jpg](https://qiita-image-store.s3.amazonaws.com/0/1906/b463ba8b-de66-377e-6564-1c9471b4856f.jpeg)
湯けむりの庄の魅力は**温泉・岩盤浴・清潔感**。

温泉は都内に多い黒湯をベースとした炭酸泉や壺湯、日替わりで柑橘系の果物を入れた湯船などなど。飽きないし、身体の温まり具合も申し分なし。これに加えてサウナと岩盤浴を活用することで、日頃の疲れをほぼ完全に取れると思います。

そういえば、東急東横線の綱島にも湯けむりの庄があります。綱島のほうが広いかも。
ただ、綱島駅から送迎バスで行く必要があります。宮前平の湯けむりの庄なら駅から歩いて行くことが可能（坂があり、若干きつい）。


# 第2位：湘南RESORT SPA 竜泉寺の湯 湘南茅ヶ崎店
![IMG_5708.jpg](https://qiita-image-store.s3.amazonaws.com/0/1906/57446563-f778-448e-e54a-7e0543df5e54.jpeg)
関東に4つある竜泉寺の湯のうちの1つ、茅ヶ崎店を2位とさせていただきました。

竜泉寺の湯は**炭酸泉が有名**で、そのクオリティの高さも他の銭湯より頭一つ抜きん出ていると感じています。身体がすぐに温まります。

店舗によって炭酸泉の質が違うといったことは今のところ感じられないので、住んでいる場所から近い店舗に行ってみてください。茅ヶ崎以外だと八王子にもあり、八王子のほうが広いです。

いずれの店舗も、近辺の駅から無料送迎バスが出ているので活用しましょう。


# 第3位：東京新宿天然温泉 テルマー湯
(Oops! あまりにも通うのが普通になりすぎて写真撮り忘れていた。。)

新宿歌舞伎町に佇む、言わずと知れたスーパー銭湯。

清潔感がピカイチな上に店内のフレグランスやシャンプー・リンス・化粧水・乳液・ドライヤーのクオリティが高く、伊豆から毎日輸送している温泉や炭酸泉なども充実しています。個人的には浴場の端っこにある超強力なジェットバスが大好きで、肩もみ代わりに使っていたことが多々あります。

数年前は人もまだ少なくて超快適だったのですが、最近はだいぶ利用者が多くなったような気がします。。

# 終わりに…
いかがでしたか？たぶん"関東 スーパー銭湯 ランキング"で調べると、僕が紹介したのと同じような銭湯がずらっとランクインしていると思います。銭湯開拓は結構面白いし、疲れを取る意味でも有意義なので、興味があったらぜひ銭湯にトライしてみてください。

## 銭湯はマナーをしっかり守って使いましょう
銭湯はパブリックスペースのため、マナーを守ることは大事です。銭湯側が禁止している行為はもちろん、周囲の人が嫌だな〜とか不快に思うこともしないよう、利用者全員が快適に過ごせるよう意識しましょう。
機械学習の目的変数を正規分布に

##導入
ほんの３ヶ月ほど前に機械学習を勉強しデータコンペに参加していました。しばらく機械学習は触れていませんでしたが、大学の学園祭が終わり、サークル活動がひと段落したので[Jリーグの観客動員数予測](https://signate.jp/competitions/27)のデータコンペを修正し、より良い評価にしようと思いました。（以前のものは[こちら](https://qiita.com/flystaslingan40/private/95115459b0384f03f90e)）機械学習において予測しようとしている値が正規分布に従ったほうが精度がよくなるということが知られているので、目的変数を正規化することを考えました。

##目的変数の分布
まず、本記事を書く上で利用したデータの分布を下記に挙げます。
<img width="376" alt="ver1.png" src="https://qiita-image-store.s3.amazonaws.com/0/287300/8559bed2-d8c4-522d-98af-35d16357211d.png">
明らかに正規分布とは言い難いですね。これを正規分布に近づけていこうと思います。

##import文
下記の通りです。

```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
import pylab
```

##対数変換
目的変数の分布が線形回帰が仮定している正規分布ではないので、目的変数を対数変換し、正規分布ライクな形に整形し直し、線形回帰を下記のコードで実施しました。

```python
## yは目的変数
## trainデータはdf_trainにDataFrame型で格納
y = df_train['y'].values
df_train['logy'] = np.log(y)
```

すると
>RuntimeWarning: divide by zero encountered in log

という警告が出てしまいました。
logの計算ができないことで出るWarningということで元データを確認してみると、1569番目のデータの目的変数に0が含まれていることが分かりました。そのデータを例外として削除することにしました。
０を1回対数変換すると-infという文字が格納され、2回logをとるとnullが格納されることがわかったので、下記のコードで処理を行いました。

```python
logy = df_train['logy'].values
df_train['loglogy'] = np.log(logy)
df_train=df_train.dropna(subset=['loglogy'])
```

結果として下図のようになり、正規分布に近づけることができたと考えられるが、QQプロットとシャピロウィルク検定を用いて再確認しようと思いました。

<img width="374" alt="ver1-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/287300/cd987f6c-2cc0-de71-a817-423206b819ac.png">

##QQプロット
QQプロットは、X軸上に観測した累積パーセント、Y軸上に期待累積パーセントを持つグラフで、一直線上になっていれば正規分布になっていることがわかることが知られています。コードは下記のように書けばいいです。

```python
stats.probplot(df_train['y'], dist="norm", plot=pylab)
plt.show()
```

この結果、正規化前のデータは下図のようになり、
<img width="425" alt="ver1-3.png" src="https://qiita-image-store.s3.amazonaws.com/0/287300/262d4f01-c40b-1ae6-50e9-8fc698b2e9e4.png">

正規化後のデータは下図のようになりました。正規分布に近づいていることは明白です。
<img width="419" alt="ver1-4.png" src="https://qiita-image-store.s3.amazonaws.com/0/287300/99eea1e7-b830-cb01-c0bb-f570fbafe865.png">

##シャピロウィルク検定

```python
b = stats.shapiro(df_train['y'])
print("対数変換前: ")
print(b)
print("")
a = stats.shapiro(df_train['logy'])
print("対数変換後: ")
print(a)
```

対数変換前: 
(0.8354302644729614, 6.124234808485181e-41)
対数変換後: 
(0.9928132891654968, 3.526571745737783e-08)
0.05以下であるため、正確な正規分布にならないが、対数変換により正規分布には近づいていることが分かります。

##最後に
logにした後の値を教師データにしているので、モデルが吐き出した値に対してexpを施す必要があります。必ず忘れないようにしましょう。この対数変換を行った結果、Scoreが3,356.78983点→3,268.64733点になりました。100点近く縮める事ができました。現在59位/580位です。もっと点数伸ばしていけるように頑張ります。
CORESERVERでwordpressを動かす

これはユアマイスターアドベントカレンダー2018の4日目の記事です
https://qiita.com/advent-calendar/2018/yourmystar

コアサーバーとwordpressを使って簡単なサイトを作るまでの一連の流れをまとめました

#手順

##1.コアサーバーとバリュードメインに登録する
サイトを作るために、サーバーの契約とドメインの取得をします。
今回使ったのはコアサーバーとバリュードメインで、どちらもGMOの会社です。
※今回は触れていませんが、他社で取得したドメインを使う場合はネームサーバーなど別途の設定が必要になります

下記サイトから手順どおり進めます。
https://www.coreserver.jp/signup/

①バリュードメインに登録後、好きなドメインを一つ取得する。
好きなドメインを選びます。個人で使う分には値段は安くて問題ないです

②コアサーバーでサーバー契約をする
私はそんなに使う予定もないので、ライトプラン(CORE-MINI)にしました。
最初の30日間は無料で使えるようなのでありがたいです。

##2.コアサーバーのドメイン設定をする
必要なものは揃ったので、ここからはコアサーバーの設定をします。
バリュードメインのコントロールパネル(以下VC)とコアサーバーのコントロールパネル(CC)を開きながら進めます。

①まずはVCからドメインのDNS設定をします
https://www.value-domain.com/userguide/manual/moddns

②DNS設定ができたらVCからコアサーバーのドメイン設定をします
https://www.coreserver.jp/support/manual/domainweb.php
サブドメインなどは不要かな？と思ったので、とりあえずwwwつきのドメインの設定までしました。

##3.ワードプレスを入れる
①CCの「サイト設定」→「ツール／セキュリティ」の一番下にある「CMSインストール」からワードプレスを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265420/1a2ae38e-733e-10a7-78cb-b6b005ceddca.png)
まず右側の緑四角からワードプレスを入れたいサイトを選んだ後、左側の緑四角にワードプレスを保存したいディレクトリを設定します。
今回は右側の四角に取得したそのままのドメイン名、ディレクトリは指定せず/public_html/の配下にインストールしました。
インストールに数分かかるとのことなので少し待ってから、インストールしたサイトを開き、下の画像が出ていれば成功です。
(インストールしたサイトへはCCのサイト設定からでも普通にURLからいっても大丈夫です)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265420/2c3d8188-7287-9350-9620-5999a54b6891.png)


###サイトが開けない場合
私が最初にやった時は、ワードプレスを入れた後サイトを開くと、「サイトにアクセスできません」とのエラーが出てしまいました。
原因を完全に特定出来ていないのですが、以下のことを確認したら開けたので、参考になれば幸いです。
・DNS設定は正しく設定されているか
・ドメインの設定は正しく設定されているか
・ネームサーバーは正しく設定されているか(初期で設定されていると思うのですが、一応確認)
・ワードプレスの保存先が正しいか(どのディレクトリに保存したか分からなくなったらCCのサイト設定から対象サイトを選択し、ファイルマネージャーから確認できます)

あとは、設定を変更してから反映されるまでに少し時間がかかるので、焦らずやっていくことが肝心です。

##4.ワードプレスを設定して完了
①上記画像の「さあ、始めましょう！」を押すと、設定画面が開くので、設定していきます。
上から、
・データベース名(作成したDB名)
・ユーザー名(同上)
・パスワード(作成したDBのパスワード)
・ホスト名(localhostのまま)
・接頭語(そのまま)
といった感じで設定しました。

②設定が完了し接続が確認できると、ボタンが表示されるので、クリックします。

③サイトのタイトルなどの設定画面が開くので、適当に入れて、インストールを実行します(タイトルなどは後で変更できます)

④そのまま指示に従って進むと、ワードプレスのダッシュボードが開けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265420/f07bcfb2-e8c8-fe6f-16ce-461d04437916.png)

⑤あとはワードプレスの手順に従って記事を投稿したり、カスタマイズしたりします。

###テーマがインポートできない場合
該当する人は少ないとは思うのですが、私自身が失敗したのでメモします。
公式のテーマをインストールする分には問題ないと思うのですが、他のサイトなどからダウンロードしたものをワードプレスにアップロードして使いたい場合、ダウンロードしたzipファイルを展開してしまうと上手くアップロードできないようです。
展開せずzipファイルのままアップロードしましょう。

#終わりに
コアサーバーとバリュードメインをつかって簡単にサイトをつくる方法を紹介しました。掛かる費用としてはサーバー代とドメイン代合わせても月額300円程度ですし、コアサーバーは最初の1ヵ月無料で使えるので、ブログを持ちたい方にはとても良いと思います。

今回思い立ったきっかけとしては、昔取得したコアサーバーとドメインを活用したいという目論見だったのですが、サーバーの使用期間が終わっていたり、パスワードを忘れていたりと結構躓きました。

今回作成したサイトですが、cssとかいじったりしてもっとカッコいい感じにしたいなと考えてます。見て頂きありがとうございました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265420/3523b2a8-e4bc-0bce-e80a-e2f966e35006.png)
Ansible: shellモジュールに冪等性および正しいchanged結果を持たせる為のロジック例

#追記
この例では、dry runに未対応
dry runに対応させるには、分離方式が必要と考えられる。つまり、冪等性確認の為の先行shellモジュールを{ check_mode: false, changed_when: false }で実行し、本処理はwhenなどでskipするかどうかを決める。

参考
https://dev.classmethod.jp/server-side/ansible/using_check_mode/



#問題
Ansibleのshellモジュールにて冪等性を担保するには、以下の方法が考えられる

- creates, removes バリヤーの使用
    - 使用できるケースが限定される。
- 事前に別モジュールで入手した結果をregister:にて連携し、shellモジュールのwhen:にてバリヤーとして使用
    - Chefではnot_ifなどにおいて対象システムの状態を入手/使用できるが、Ansibleでは(ファイル有無を除いて)事前に別モジュールで情報を入手する必要があり、冗長で美しく無い
- スクリプトロジックを再入可能とする



また、バリヤーが弱い事から、変更が必要な状態だから実行した(i.e.変更が試みられた筈)という推測が困難であり、正しいchanged結果出力が望まれる。

ここでは、冪等性の担保、および正しいchanged結果出力を得る、スクリプトロジックを考える。

#目標

- 事前モジュール実行による情報取得無し
- 変更無しならばok, 変更有りならばchanged状態を返す

#shellにて必要なロジック

イメージとしては以下の様な感じか。

1. set -e   # 途中でエラーとなった際に終了させる
2. if 変更を伴う処理の実行が必要ならば
    1. 変更を伴う処理を実行
    2. 外部へのchangedの連携
3. 必要なだけ2を繰り返し

一度も外部へのchangedの連携が試みられなかった場合、okとする。

外部へのchangedの連携だが、stderrなどを用いる方法, rcを用いる方法 などが考えられる。

##stderrを用いる方法例

```yaml
- shell: |
    set -e
    # ...
    if grep -q 'foo' /tmp/test.txt; then  # 変更を伴う処理の実行が必要ならば
      sed -ie 's/foo/bar/g' /tmp/test.txt # 変更を伴う処理を実行
      echo _changed_ >&2                  # 変更があった事を外部に連携
    fi
    # ...
  register: result
  changed_when: '"_changed_" in result.stderr_lines'
```


ここでは外部に連携する方法として、stderrに、"\_changed_"という行が1行でも出力されたかどうかを使用。
stdoutを使用するなら、echo \_changed_およびchanged_when: '"\_changed_" in result.stdout_lines'とする。

考慮点
exec 2>>/tmp/logなどstderrを横取りしてしまうと動作できない。


##rcを用いる方法例

```yaml
- shell: |
    set -e
    changed=false
    # ...    
    if grep -q 'foo' /tmp/test.txt; then  # test.txtにfooが含まれるならば
      sed -ie 's/foo/bar/g' /tmp/test.txt # fooをbarに置き換え
      changed=true                        # 変更があった事を外部に連携
    fi
    # ...
    if $changed ; then 
      exit 99
    fi
  register: result
  changed_when: result.rc == 99
  failed_when: result.rc not in [ 0, 99 ]
```

rcに、ok, failed, に加えて、changedの意味を持たせる為、ここでは99をchengedを示すrcとしている。

- rc == 0 ならば ok
- rc == 99 ならば changed
- rc not in [0,99] ならば failed

 if \$changed ... は、[[ \$changed == false ]] || exit 99 などでも。


##出力例

初回

```
TASK [shell] *******************************************************************************************************************
changed: [ansiblepush-centos-7]
```

2回目以降

```
TASK [shell] *******************************************************************************************************************
ok: [ansiblepush-centos-7]
```

##比較

rcの体系を考えなくても良いstderr使用の方が楽そう。
repoでtagを指定する

# はじめに
`repo init`コマンドは`-b`オプションでブランチを指定することができるがtagを指定することもできる。以下はtag指定方法の備忘録である。
# 実行例
[digi社のYocto環境マニフェストファイルのレポジトリ](https://github.com/digi-embedded/dey-manifest)から`2.4-r1.2`のtagを指定してみる。

```bash
$ repo init -u https://github.com/digi-embedded/dey-manifest.git -b refs/tags/2.4-r1.2
$ repo sync -j8 --no-repo-verify
```
【DjangoのModel】OR条件のクエリをつくる方法

## この記事で書いていること
- Qオブジェクトを使って、DjangoでOR条件を作れるという話
- 公式DOCSの以下の部分を参考にしてます

https://docs.djangoproject.com/ja/2.1/topics/db/queries/#complex-lookups-with-q-objects

## Qオブジェクトを使って実装する

例えば、pub_dateというDateTimeFieldを持つPollというモデルを持っているとして。

pub_dateが2018年の12月1日 or 12月3日のインスタンスを取得したい場合、以下のように書けます。

```
from django.db.models import Q

Poll.objects.get(
    Q(pub_date=date(2018, 12, 1)) | Q(pub_date=date(2018, 12, 3))
)
```

## filter, exclude, getなどの検索関数に渡すことができる

上の例でもすでに示していることですが。

filter()、exclude()、get()と言った、検索関数に対して、複数のQオブジェクトを渡すことができます。

上の例に、「questionが"Who"と言う文字列から始まる」と言う条件も付け加えたのが、以下のコード。

```
from django.db.models import Q

Poll.objects.get(
    Q(question__startswith='Who'),
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
```

「questionが"Who"と言う文字列から始まる」　　AND 「pub_dateが　2018年12月1日　OR　　2018年12月3日」

という意味のクエリが発行されます。


簡単ですが、以上です。
VSCodeについてくるターミナルがすばらしく使いやすい

こないだ友だちと話していてVSCodeのターミナルが細かいところで地味にいろいろ便利ということを言ったら「ええやん」ってなったので、VSCodeのターミナルを褒める記事を書こうと思いました。
Macを使ってる人にはピンと来ないかもしれません。WindowsのDOSプロンプトに長年苦しめられてきた人向けです。

#VSCodeターミナルのここがすごい
ソースコードのすぐそばにターミナルがあってコマンドを実行できるというのが一番なのですが、他にも細かいところで使い心地がよかった点がいくつかあるので紹介します。

・テキストをコピーするとき矩形選択にならず普通の選択ができる
・PgUp、PgDnが使える
・好きなフォントを使える
・円マークがバックスラッシュ

#テキストの選択
初めてこれを発見したとき個人的にすごく「おおっ！」てなりました。
DOSプロンプトではテキストを選択すると矩形選択になってしまいます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/127134/7616cd81-1cb1-54fb-27b0-cfffd283fc84.png)
（嘘でした。最近のWindowsでは普通の選択がデフォルトのようです）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/127134/ffd6a3c9-a50d-d03c-e05e-3c21054d1ec8.png)

VSCodeのターミナルは普通にテキストを選択でき、`Ctrl+C`でコピー、`Ctrl+P`で貼り付けができます。以前は長めのテキストをコピーすると画面端で改行されてしまっていたので、テキストエディタで改行を消したりしていました。その手間が不要になります。

# PgUpとPgDnが使える
これも最近のWindowsではできるんだろうか…。昔のコマンドプロンプトはPgUp、PgDnが効かず、マウスホイールか右のスクロールパーを操作するしかありませんでした。VSCodeのターミナルは `Shift+PgUp` `Shift+PgDn`でスクロールできます。

# 好きなフォントが使える
WindowsのDOSプロンプトもフォントを変えられるのですが、選択肢がこれしかありません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/127134/c3ca37b1-a6a5-d340-43f6-e441f2923963.png)

# 円マークがバックスラッシュになる
これも個人的にうれしかったところです。
最近はターミナルで起動するとアスキーアートで書かれた絵が出てくるソフトがあるのですが、アメリカで作られたからなのか、バックスラッシュを前提として作られていて、円マークになると絵が崩れてしまうのですね。
![WS000014.png](https://qiita-image-store.s3.amazonaws.com/0/127134/36c93a04-2d0a-9a0f-8093-4e0431babe51.png)

こういうのを見ると何だかとても残念な気持ちになって暗い気分で一日を過ごすことになるので、ターミナルでバックスラッシュが表示されるのはとてもうれしいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/127134/e37f1b8b-3c35-f586-9335-4cd1ffae1289.png)

# まとめ
他にもエディタの内容を選択してターミナルで実行できたりとか、デフォルトでは割り当てられていないけど、複数起動したターミナルをホットキーで行き来できたりするのでVSCodeのターミナルはとても使い心地がよいです。
現場でWindows7を強いられたりしている方は、ターミナル目的のためだけにVSCodeをインストールしてみてもよいと思います。
pyenv内のAnacondaで環境構築したい

# はじめに
今までvirtualenvで環境構築をしていたのですが、Tensorflowのインストールで詰まり、Anacondaを使いたいと思ったのがきっかけです。  
Anacondaを直接インストールする権限が無かったので、pyenv内のAnacondaを使用しようと思いました。
本当は、pyenvとAnaconda/minicondaを同時に使うのは大変なのであまりおすすめしません。
本記事は、Anaconda/minicondaを使いたいけど、インストールできない人向けの記事です。

# 公式URL
Anaconda: https://www.anaconda.com/
Miniconda: documentation: https://conda.io/docs/index.html
pyenv: https://github.com/pyenv/pyenv

# 環境
| ソフト | version or 有無 |  
|:-----------|:-----------|  
| CentOS | 6.5 |
| Python | Python 2.7.8 |
| pyenv | ○ |
| virtualenv | ○ |
| Anaconda/Miniconda | ✗ |
| pyenv-virtualenv | ✗ |
| pyenv内のAnaconda | anaconda3-5.2.0 |

有無と書いてありますが、✗をつけているのは権限の関係でインストールできなかったものです。（頼めばいいだけの話ではあるのですが）

# 解決法

設定を書いたyaml fileを使用します。以下は例です。

```yaml:myenv.yaml
name: myenv
dependencies:
- python=2.7
- beautifulsoup4
- h5py
- html5lib
- keras
- pandas
- pip
- pytest
- tensorflow

- pip:
  - slackweb==1.0.5
  ```

yamlファイルを作成したら、以下のコマンドで環境の作成をして、その環境をactivateします。

```
$ pyenv local anaconda3-5.2.0
$ conda env create --file myenv.yaml
$ pyenv local --unset
$ pyenv local anaconda3-5.2.0/envs/myenv
```

環境をいったん作ったあとに一度pyenvの設定を解除して、pyenvで環境まで含めたものを選択するという、まどろっこしいことをしているのですが、
理由については後述します。（もっと良い方法をご存知の方がいらっしゃいましたら教えていただきたいです！）

# 環境を削除したいとき

```terminal
$ pyenv local anaconda3-5.2.0
$ conda env remove --name myenv
```
anaconda3-5.2.0/envs/myenv に設定していると、削除できません。


# 解決法に至るまで
最初、以下のように、作成した環境をactivateしようとしていました。

```terminal
$ pyenv local anaconda3-5.2.0
$ conda env create --file myenv.yaml
$ source activate myenv
pyenv: -bash: command not found
```

上記のエラーが出るのは、PyenvとAnacondaのactiveがバッティングしてしまうのが原因のようです。
このために解決法では一旦pyenvを抜けてから、pyenvでcondaで作った環境まで含めて指定するようにしています。

# 環境作成時にyamlファイルを作っておくといい理由
Pyenv内のAnaconda内の環境内（記事内の例では myenv）では、condaコマンドを使えません。
環境を作る際に、conda installを済ませる必要があります。

# まとめ
Anaconda/Minicondaを直接インストールできるならその方が楽です。
Pyenv とAnacondaの両方を入れるのは、source activateが衝突してしまい、本当はあまり良くないと思うので、
本当に困ったときに参考にしてください。

# 参考URL
[Creating an environment from an environment.yml file](https://conda.io/docs/user-guide/tasks/manage-environments.html#id2)
[conda env create](https://conda.io/docs/commands/env/conda-env-create.html#conda-env-create)
[condaによるポータブルなPython環境構築のすすめ](https://qiita.com/yubessy/items/2dd43551aa8308dc7eca)
レイアウトファイルでLayoutのタッチイベントを伝搬させない方法

何かの処理中に画面操作をさせないために薄暗い背景を表示している時に、Layoutだとイベント伝搬で下層レイヤーにもイベント伝搬されてしまいます。

[コードで記述されている方](https://qiita.com/nbkn/items/b43d4fa20f429a1009f7)がいましたが、単純にLayoutにタッチイベントを伝搬させたくないだけなので、レイアウトファイルで簡潔に済ませました。

実装は簡単で以下のコードを入れるだけ。
```app:onTouchListener="@{(v, event) -> true}"```
※Databindingを使用しています。

```XML:activity_main.xml
<layout>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="@{viewModel.isProgress ? View.VISIBLE : View.GONE}"
        android:alpha="0.5"
        app:onTouchListener="@{(v, event) -> true}"
        android:background="@android:color/black">
</layout>
```
PHP5から7系への移行時には json_decodeの処理にご注意

PHP5.6から7.2に移行したときにけっこうな地雷を踏んだのでここに記録しておく。

# 対象
- remiでphp56とphp-jsonをインストールしてる人
- PHPアプリケーションに投げられてくるJSON文字列が、自分のコントロール範囲外の人

# ハマったポイント
- remiで入るPHPのJSON Parserは、php-pecl-jsonc(JSON-C)が使われている
- JSON-Cは、本来エスケープされているべき文字列が、エスケープされていなくても ちゃんと処理できちゃう
- ↑こいつらを、PHP7で入るJSON Parserでは、ちゃんとエラーにする（とても正しい）
- クソJSONを送ってきてるクライアントがいたが、PHP5.6時代にはちゃんと処理しちゃっていたので、問題に気づかず
- PHP7.2に移行したら、クライアントが送ってきたリクエストをエラー扱いして処理できなくなる
- 死

# 検証
docker環境を作って確認

## 確認用プログラム
- エスケープしてないタブを含んだJSONを処理してみる

```php:test.php
<?php

echo "PHP v". phpversion(). "\n";

if (defined('JSON_C_BUNDLED')) {
    echo "JSON-C\n";
}  else {
    echo "Not JSON-C\n";
}

$invalidJson = '{"item":"Invalid' . "\t" . 'JSON"}';

$decodeJson = json_decode($invalidJson);
echo 'json_last_error_msg: '.json_last_error_msg()."\n";
var_dump(json_encode($decodeJson));
```

## remi-php56 + php-json(php-pecl-jsonc)
```dockerfile:cent7-php56/Dockerfile
FROM centos:centos7

RUN yum clean all && yum -y update
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum clean all

### php
RUN yum -y --enablerepo=remi-php56 install \
php \
php-json
```

```terminal:実行結果
% docker build cent7-php56 -t cent7-php56
% docker run --rm -v $(pwd):/app -w /app cent7-php56 php test.php
PHP v5.6.38
JSON-C
json_last_error_msg: No error
string(24) "{"item":"Invalid\tJSON"}"
```

- 正しくないJSONをjson_decodeに喰わせてもエラーにならない

## remi-php70 + php-json
```dockerfile:cent7-php70/Dockerfile
FROM centos:centos7

RUN yum clean all && yum -y update
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum clean all

### php
RUN yum -y --enablerepo=remi-php70 install \
php \
php-json
```

```terminal:実行結果
% docker build cent7-php70 -t cent7-php70
% docker run --rm -v $(pwd):/app -w /app cent7-php70 php test.php
PHP v7.0.32
Not JSON-C
json_last_error_msg: Control character error, possibly incorrectly encoded
string(4) "null"
```

- 正しくないJSONをjson_decodeに喰わせるとエラーになり、nullを返す


# 結論
- クソJSONを投げてくるクライアントが悪いんだから、クライアント側を直させましょう
- PHP7系で引き続きクソJSONをパースする方法は知らない


# 参考
- http://iamapen.hatenablog.com/entry/2016/03/30/135457
- https://forum.remirepo.net/viewtopic.php?id=3613
- https://hnw.hatenablog.com/entry/20150419
ゲームプラットフォームQAの極意　~Part.2 イレギュラーテスト~

# 前置き
この頁はゲームプラットフォームQAの特徴について記載していく。
対象としては**長期運用**しているプラットフォームであり、新規開発の際のQAでないことは念頭に置いていただきたい。

[Part1.ゲームアプリQAとの違い](https://qiita.com/bug-taro/items/ebf9f4d11f66e09ae24a)

# ゲームプラットフォームQAにおけるイレギュラーテスト
Part2はゲームプラットフォームQAで実施するイレギュラーテストについて記載する。
ただし結論としてイレギュラーテストにおいてゲームアプリQAと大きな差異はなく
**対象がWebアプリかモバイルアプリかに寄るところが大きい。**

弊社のゲームプラットフォームQAで実施しているイレギュラーテストは下記になる。

 - **ブックマーク**
 - **ブラウザバック**
 - **通信遮断**
 - **複数処理**
 - **その他**

### ブックマーク
Webアプリのプラットフォームの場合、ユーザーは自分が良く使う頁をブックマークしているケースが多い。
そのため一般的なフローと異なる順で頁を遷移する場合がある。
例として下記の状況でこのテストが行われる。

 - ある頁を削除した場合
  - 確認項目：該当の頁に遷移できないこと
 - プラットフォームの規約が変更された場合
  - 確認項目：どの遷移でも規約同意の画面が表示されること
 - 新規の課金手段を導入した場合
  - 確認項目：本来表示されるべき画面(親権者同意画面など)を飛ばすことができないこと

### ブラウザバック
このテストもWebアプリ特有のものになる。
OSがAndroidの場合は端末にバック機能があるためOSごとの確認になるケースが多い。
基本的にどのような状況でも実施されるテストではあるが
特に**イベント進行やアイテム入手など不可逆な遷移がある場面**では確認が必須となる。

### 通信遮断
Webアプリ、モバイルアプリ関係なく発生するテストであり、**サーバとの通信が発生する場合**に行う。
余談にはなるが少し前はエレベーターや冷蔵庫を駆使して通信できない環境の構築を作り出していた。
今はもっぱら機内モードの使用が主流である。

### 複数処理
いわゆるトランザクションロックが正常に機能しているかの確認にあたる。
複数のブラウザなどで同時に処理が走った場合に
正常に動作するか(もしくはエラーが吐き出されるか)の確認を行う。
**イベントなどで不正が行えないか**、課金検証において同時に処理を走らせることで
**上限以上の課金ができてしまわないか**という確認の際にテストを実施する場合がある。

### その他
その他のイレギュラーテストとして下記のようなものも実施している。

 - 複数アカウントの使用(操作中のアカウント切り替えなど)
 - タスクキル
 - 連打

# 最後に
イレギュラーテストは多岐に渡るため実施しようとするといくらでもできてしまう。
そのため重要なのは**テストごとに必要なイレギュラーテストを見極めて取捨選択すること**である。

Part3では主にゲームプラットフォームの課金機能周りのQAについて記載する。
CSVって見づらくてストレス溜まるよね？ レインボーCSVすごい！エディタプラグインを使おう！ 今までが馬鹿らしくなる！

# sublimetextの例

Package install して一瞬で使えた。面倒な設定もなしに。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9bcb19e7-8501-246c-b08a-fb805f621ef0.png)

VScode にもあるらしい。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
なんとかウォッシングの話

Code for Ibaraki の柴田です。
この記事は、Civic Tech (シビックテック)をテーマにした、「Civic Tech Advent Calendar 2018」企画の5日目のための原稿です。他の記事は[一覧](https://qiita.com/advent-calendar/2018/civictech)から見られるようになっており、日ごとに記事が増えていく予定です。

「ITなどの技術を活用して地域やコミュニティーの課題を解決するための活動およびそのテクノロジー」を意味するシビックテックは元々、海外から来たアイデアです。そのため、シビックテック周辺で使われる用語も日本人の文化的背景からだと理解するのが難しいものがあります。

今日、ここではそんなものの一つ、「◯◯ウォッシング」という言葉をご紹介します。オープンウォッシングなんていう風に使ったりします。どんな意味だと思いますか？
ウォッシング（washing きれいにする、洗う）がついているんだから、〇〇をきれいにする、というような意味でしょうか？

実は、この言葉

>***「〇〇ウォッシング」とは「なんちゃって〇〇」「うそつき〇〇」***

ぐらいのイメージです。つまり、元々の〇〇に対するまがいもの、いい加減な〇〇を意味しており、悪い意味として使われます。実際は〇〇でない企業などが、〇〇であるとしてPRするような時に、それを批判して〇〇ウォッシングであると呼ぶようです。
つまり、オープンウォッシングとはオープンではないのにオープンのふりをするという意味になります。ここでのオープンはいわゆるオープンソースのオープンだったり、その哲学をひきついだオープンデータだったりします。
英語のつづりとしては単なる　Open washing ではなく特別な意味を強調して　Open-washing や　Openwashing　として使われることが多く、そのまま　[openwashing.org](http://openwashing.org/)　なんてサイトまであります。元々、環境保護（グリーン）活動をうたいながら、実は違ってるというgreenwashing（エセ環境保護活動）という言葉から着想を得て、[2009年3月14日にMozillaのMichelle Thorneさんによって作られた言葉](http://michellethorne.cc/2009/03/openwashing/)です。

Openwashing の語源や語義について詳しくまとめられている先達の皆様の素晴らしい記事がありますので、こちらもあわせてご覧ください。

[「閉じた」オープンデータ　あるいはその生い立ち　yasuto Furukawa](https://medium.com/howmori/what-is-wash-in-opnewashing-48896cbb2b52) 

[オープンウォッシング(Openwashing) - オープンであるように装いごまかすこと、上辺だけの欺瞞的なオープン訴求 yamachan360](https://qiita.com/yamachan360/items/8f03f3a78785276f024a)

[「オープン-ウォッシング」 – データをオープンにすることと単に利用可能にすることはどう違うのか OKJP OKFNがオリジナル翻訳記事](http://okfn.jp/2014/03/19/open-washing/)

念のため、ある程度合意が取れているオープンデータの定義についてはオープンデータハンドブックにあるものをご紹介しておきます。
[オープンデータとは何か？](http://opendatahandbook.org/guide/ja/what-is-open-data/)

結局、オープンウォッシングとは実際はオープンではないのに、世間ではやっているから、とか、行政の方針だからとかとの理由でオープンを名のっているものになります。AIウォッシング、ブロックチェーンウォッシング、SDGsウォッシングやら子育てサポートウォッシング、市民参画ウォッシング・・・いくらでもありそうでコワイです。

くれぐれも来年はシビックテックウォッシングみたいな言葉が流行らないことを願って筆を置くとしましょう。市民が誰も望んでいない謎のシビックテック施策が進んでしまうみたいなことにならないよう、自戒もこめて

皆様、良いお年をお迎えください
:nth-child()

#:nth-child()とは？
・疑似クラスである
・指定した要素が親からみて何番目にあるかを意識してつけてあげる


##（）の中身
|コード|内容|
|:--|:--|
|odd|奇数に指定|
|even|偶数に指定|
|（?n）|?n倍に指定|
|（?n+1）|?n倍+1に指定|
|n|n番目に指定|
|n+3|n+3番目以降に指定|
|-n+3|nを0として3番目より前に指定|

###コード
```css:css
.side tr:nth-child(odd){
background-color: #d1c0a5;
}
```
上記はクラス名「side」の中にいる「tr」の奇数行に対して色を「#d1c0a5」に変更するという指示


##:??-child
|コード|内容|
|:--|:--|
|:last-child|指定した要素の中にいる最後の要素に指定|
|:first-child|指定した要素の中にいる最初の要素に指定|
|:only-child|一つだけ|

###コード

```css:css
.side tr:first-child{
background-color: #d1c0a5;
}
```
上記はクラス名「side」の中にいる「tr」の一番初めの要素に対して色を「#d1c0a5」に変更するという指示
Visual Studioを使わずにコンパイルする方法（備忘録）

#概要
Qiitaの記事投稿練習も兼ねて、自分用の備忘録としてVisual Studioの無い(会社のセキュリティ云々でインストールできない)環境でも、今時のWindowsならテキストエディタでC#とかVBのソース書いてツール作れるよっていうメモ。

#参考URL
[C#：csc.exeだけで参照設定しながらコンパイルする方法](http://pineplanter.moo.jp/non-it-salaryman/2017/11/06/csharp-csc-reference/)

#コンパイラの場所とか
`C:\Windows\Microsoft.NET\Framework\v4.0.30319`
の中にcsc.exe(C#用)とかvbc.exe(VB用)が入ってるはずなので、引数にソースファイルを指定すればコンパイルしてexe(実行ファイル)にしてくれる。
(v4.0.30319の部分は.NETのバージョンによって微妙に変わる)

以下はコンパイラにパスが通っている前提のコマンドなので、パスが通っていなければパスを通すか絶対パスで記述する。
exeファイルはコマンドを実行した場所に生成される。

#参照設定しない場合
`/platform:x86`は環境に合わせて指定する。

```
csc /platform:x86 "ソースファイルのパス"
```

#参照設定する場合
`/reference`に参照するdll等を指定する。
;(セミコロン)で区切って複数指定できる。
また、Windowsアプリケーションの場合は`/target:winexe`を指定しないとコンソール(黒い画面)が表示されてしまう。

```
csc /reference:WPF\PresentationCore.dll;WPF\PresentationFramework.dll;WPF\WindowsBase.dll;System.Xaml.dll /platform:x86 /target:winexe "ソースファイルのパス"
```

#おまけ
バッチファイルにしてしまうとドラッグ＆ドロップでコンパイルできて楽(参照設定とかは適宜対応するとして・・・)。

```compile.bat
@echo off
cd %~dp0

rem 引数無し実行はエラーとする
if "%~1"=="" (
  echo ソースファイルをドラッグ＆ドロップしてください
  timeout 5
  exit
)

echo コンパイルを実行します
echo;
csc /platform:x86 /target:winexe %1
echo;
timeout 5
```

一応補足しておくと、
`cd %~dp0`でバッチファイルの階層に移動する。
`%1`には実行時引数(ドラッグ＆ドロップしたファイルの絶対パス)が入っている。
choiceコマンドと%errorlevel%でコンソールアプリかWindowsアプリか分岐させる、とかも出来るけど今回は割愛。

#あとがき
初めての記事投稿で見よう見まねでやってみたけど、簡単に書けて結構楽しい(小並感)。
基本的には備忘録がメインになるから大したことないかもしれないけど、誰かの参考になればいいなぁ、と思ってちょくちょく投稿してみる。
Rubyでファイル監視

inotifyなんかでファイルシステム監視しても、ファイルのコピー完了を検知できない。
ロック状態を判定するのが良いのかなと。
 
```ruby
paths = Dir.glob("/path/to/monitor/*")
paths.each do |path|
	status = open(path, "ab"){true} rescue false
	if status
		# do something
	end
end
```

あとは、cronで回すか、godでデーモン化するか。
pythonスクリプトをdaemonにする[sysvinit編]

# はじめに
[こちらの記事](https://qiita.com/katsuNakajima/items/7ece6c74f992f652d732)では`systemd`によるpythonスクリプトをdaemon化する方法を記載した。
本記事では、`sysvinit`でのpythonスクリプトをデーモン化する方法を書く。
# 手順
- テスト用のpythonスクリプトを用意する。

```python:/opt/hello.py
#!/usr/bin/env python3
import time
def main():
    filepath = "/tmp/hello.log"
    log = open(filepath,'a')
    log.write("hello!\n")

if __name__ == '__main__':
    while True:
        main()
        time.sleep(30)
```

- [こちら](https://www.madbit.org/blog/programming/1527/run-python-script-at-boot-as-daemon/)を参考に、sysvinit用のスクリプトを作成する。

```bash:/etc/init.d/hello.sh
#! /bin/sh
### BEGIN INIT INFO
# Provides: Python script
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start Python script at boot time
# Description: Start Python script at boot tim
#
### END INIT INFO
 
DAEMON=/opt/hello.py
NAME=hello
PIDFILE=/var/run/$NAME.pid
 
test -x $DAEMON || exit 0
 
. /lib/lsb/init-functions
 
case "$1" in
 start)
   log_daemon_msg "Starting system $DAEMON_NAME daemon"
   start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec $DAEMON --startas $DAEMON
   log_end_msg $?
   ;;
 stop)
   echo -n "Stopping daemon: "$NAME
   start-stop-daemon --stop --oknodo --retry 30 --pidfile $PIDFILE
   ;;
 restart)
   start-stop-daemon --stop --oknodo --retry 30 --pidfile $PIDFILE
   start-stop-daemon --start --pidfile $PIDFILE --exec $DAEMON
   ;;
 *)
   echo "Usage: python-script {start|stop|restart}" >&2
   exit 3
   ;;
esac
exit 0
```
- pythonスクリプトに権限を付与

```bash
$ sudo chmod 755 /opt/hello.py
```
- `hello.sh`の起動スクリプト用シンボリックリンクを作成する。

```bash
$ sudo update-rc.d hello.sh defaults
```
- reboot後、プロセスを確認する。

```bash
ps -ef | grep hello
```
# おわりに
本記事と[こちらの記事](https://qiita.com/katsuNakajima/items/7ece6c74f992f652d732)で記載したように、pythonスクリプトに`#!(shebang)`を書いてやれば、シェルスクリプトを扱うのに近い感覚でpythonスクリプトを扱うことができる。
Next.js で同名の meta タグを設定できるようになった

これは「Next.js Advent Calendar 2018」の3日目の投稿です。

本日、Next.jsに以下の修正がマージされ canary リリースされました。

Dedupe only items with unique key
[https://github.com/zeit/next.js/pull/5800](https://github.com/zeit/next.js/pull/5800)

これが待望の修正だったため紹介します。

これは、これまで

- 一部の明示的に許可された meta タグ以外は同名 meta タグの重複を許可しない

という仕様であったものを

- 重複が許可されない一部の meta タグを除いて同名の meta タグの重複を許可する

ように変更するものです。

## 何が嬉しいのか

外部サービスと連携させたい場合などに、同名の meta タグをリスト的に複数設定したい場面はあります。例えば以下の issue などがそのユースケース例です。
[https://github.com/zeit/next.js/issues/4407](https://github.com/zeit/next.js/issues/4407)

元々こういった要望としてあがっていました。
[https://github.com/zeit/next.js/issues/3705](https://github.com/zeit/next.js/issues/3705)

これを受けて、 `next/head` に「明示的に重複許可する meta タグ」を追加する改修が行われました。
[https://github.com/zeit/next.js/pull/4121](https://github.com/zeit/next.js/pull/4121)

しかし、この改修では重複を許可する meta タグがハードコーディングされているため、例えば上記したユースケースなどのカスタムタグを追加することができませんでした。つまり、追加するためにはユーザー側で fork したりパッチを当てるといった対策が必要でした。

僕も改めて要望を上げて修正案なども相談していたのですがうまい修正が思いつかず放置状態でした。
[https://github.com/zeit/next.js/issues/4656](https://github.com/zeit/next.js/issues/4656)

以上のような経緯があったため、今回の修正は待望のアップデートでした。

## 終わりに

要望の多い機能だったため、同じように困っていた方がいるかもと思い紹介記事を書きました。

この修正方法が思いついていれば pull-req 送れてもうちょっと早く対応できていたかもしれません…が、ひとまずよかった。Next.js チームには感謝です。
LaravelのEloquentで躓いたときの覚書

Laravelでとっても便利な機能Eloquent。
お手軽にDBからデータを取れるようになるのでよいものであるのだが、
微妙に躓いたので、その覚書。

### 前提
躓いたのは、SQLにおいては基本も基本select文投げたときのこと。
主キーを「user_id」としてvarchar型だったととき、なぜか返って来たuser_idの値が「0」となっていたから。
しかも、他のカラムは普通に正しい値が入っている、と来る。

`SELECT * FROM table;`とかしたときに理想としては
![image.png](https://qiita-image-store.s3.amazonaws.com/0/115860/26d84d47-d675-23cb-a497-49c8fbe50b27.png)
みたいな形で返ってきてほしかったのだが、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/115860/064ec8c8-90d4-4fc0-3c45-d2cf7aa8546c.png)
こんな形で返ったきたわけである。


謎謎謎、というか、理解し切ったうえで使っているわけでないことが響く。
実際に利用していたテーブルは連結していたり、別の処理も行っていたため、
当初はバックエンド側の処理やSQLが間違っているのでは、と調べていたが、間違っているところは見つからない、


### 原因
原因が判明したのは、Eloquentの仕様を調べていたときのことだった。
原因はコイツ……！
```$incrementing = true;
```
こいつが何かっていうと、主キーのオートインクリメントの設定パラメータである。
デフォルトが「true」。



そう、デフォルトでTRUEなのである。



falseにしておいてよ。
してほしいときは自分で書くって……。



ここがtrueであったためにどうやらカラムの値を数値型として取り扱おうとしていたっぽい。
Eloquentを継承しているクラスで、falseの設定でオーバーライドしたら、無事に想定していた挙動になった。
よかった。



ひとまず今回の教訓としては、
「使うものはまず仕様を確かめよう」
です。



組み立て以外で説明書読まずに触って覚えようとするのはやめないと……。
初めてのvulkan プログラミング step1 インスタンスの生成


[目次に戻る](https://qiita.com/tositada_nakada/items/db0f01c1c8c2945f786b)

ソースコードは以下の場所に置いておきます。各自のバージョンに合わせたプロパティ設定をしてから自由にご利用ください。
[github:  VulknAppAdocal2018](https://github.com/nakadasanda/vulkanAppaddcal2018)

最初に行うことは、インスタンスを作成してVulkanライブラリーを初期化することです。アプリケーションごとの状態は、VKInstanceオブジェクトに格納されます。インスタンスが作成されるとvulkanライブラリーが初期化されアプリケーションの情報を実装することができます。
こちらがソースコードになります。

```cpp
VkInstance	_instance = nullptr;

void Renderer::_InitInstance()
{
	VkApplicationInfo application_info{};
	application_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
	application_info.apiVersion = VK_API_VERSION_1_0;
	application_info.pApplicationName = "VulkanAppAdcal2018";

	VkInstanceCreateInfo instance_create_info{};
	instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
	instance_create_info.pApplicationInfo = &application_info;
	auto err = vkCreateInstance(&instance_create_info, nullptr, &_instance);
	if (VK_SUCCESS != err) {
		assert(0 && "Vulkan ERROR: Create instance failed!!");
		std::exit(-1);
	}
}

void Renderer::_DeInitInstance()
{
	vkDestroyInstance(_instance, nullptr);
	_instance = nullptr;
}
```
instanceの生成だけですごく重たい。ここで重要な関数は、vkCreateInstance()の部分です。この部分がインスタンスを作成する部分です。と、いきなり言われてもわからないので順を追って説明します。

インスタンスを生成するには、最初に構造体アプリケーションの情報を入力する必要があります。このデータは任意ですが、特定の特殊な動作をするグラフィクスエンジンを使用しているなど、特定のアプリケーションに最適化するためにドライバーに有用な情報を提供します。つまりこの部分ですね。このアプリケーションで使われているvulkanのバージョンやアプリケーションのタイトルといった情報が渡されます。

```cpp
	VkApplicationInfo application_info{};
	application_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
	application_info.apiVersion = VK_API_VERSION_1_0;
	application_info.pApplicationName = "VulkanAppAdcal2018";

```

vulkanの多くの構造体では、メンバー変数sTypeので構造体のタイプを明示的に指定する必要があります。今後拡張情報pNextなどに別のメンバーを多く持つためです。今回は、とりあえずインスタンスの作成をするということなので、拡張は使用せずにpNextには、宣言時にデフォルトでnullptrが入ります。Vulkanの多くの情報は、関数のパラメータの代わりに構造体に渡されます。インスタンスを作成するのに十分な情報を提供するためにもう１つの構造体を埋めなければなりません。

```
VkInstanceCreateInfo instance_create_info{};
	instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
	instance_create_info.pApplicationInfo = &application_info;
```

ここまでVulkanがインスタンスを作成するために必要なものをすべて準備できたので、vkCreateInstanceを呼び出します。

```cpp
auto err = vkCreateInstance(&instance_create_info, nullptr, &_instance);
```
これでインスタンスの作成は、終了です。

##最後に

Vulkanは、下準備がたくさんあるため、しばらくは、見ている人がグラフィクスを動かしているという実感がないかもしれませんが最後には、「自分で**GPU**に触れてグラフィクス描写している」といった実感ができると思いますので気長に待ってください。


## 連絡先

tweeter: [tositada_nakada](https://twitter.com/nakadasanda17)
mail: nakadasanda@outlook.com

## 寄付

paypal: [tositada_nakada](https://www.paypal.me/nakadasanda)
Amazon: [欲しいものリスト](http://amzn.asia/fGpGuJo)