OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 10 Ver.1809 のHyper-VでRemoteFX 3Dビデオアダプターを追加する

Hyper-Vマネージャーで
> RemoteFX 3Dビデオアダプターはサポートされなくなりました。既存のVMでこのアダプターを使用し続けることはできますが、新しいVMには使用できません。

と表示されてRemoteFX 3Dビデオアダプターは追加できないんですが、PowerShellで

```powershell
Add-VMRemoteFx3dVideoAdapter -VMName "Windows 10"
```

ってやれば追加できました。

https://docs.microsoft.com/en-us/windows-server/remote/remote-desktop-services/rds-remotefx-vgpu

2020-08-12追記:
[WindowsでRemoteFX vGPUコンポーネントを無効にして削除するための更新プログラム](https://support.microsoft.com/ja-jp/help/4570006/)

> 無効化:RemoteFX vGPU は、2020 年 7 月の Windows セキュリティ更新プログラム (2020 年 7 月 14 日) で、該当するすべての Windows プラットフォームで無効になります。
> 削除:RemoteFX vGPU は、2021 年 2 月の Windows セキュリティ更新プログラム (2021 年 2 月 9 日) で、該当するすべての Windows プラットフォームから削除されます。
CentOS7にてpython3の仮想環境(venv)を作り、Djangoをインストールする手順

# 前提
ユーザ：dev1
python2系はインストール済みであるが、3系は未インストールの環境

# 手順
## python3系のインストール

```
[dev1@localhost ~]$ python3 -V
-bash: python3: コマンドが見つかりません
[dev1@localhost ~]$ python -V
Python 2.7.5
[dev1@localhost ~]$ sudo yum install epel-release -y
読み込んだプラグイン:fastestmirror
・・・
完了しました!
[dev1@localhost ~]$ sudo yum-config-manager --disable epel
sudo: yum-config-manager: コマンドが見つかりません
[dev1@localhost ~]$ sudo yum -y install yum-utils
読み込んだプラグイン:fastestmirror
・・・
完了しました!
[dev1@localhost ~]$ sudo yum-config-manager --disable epel
読み込んだプラグイン:fastestmirror
・・・
username = 
[dev1@localhost ~]$ sudo yum install --enablerepo="epel" python36 -y
読み込んだプラグイン:fastestmirror
・・・
完了しました!
```

## 専用のディレクトリ作成&venv適用
```
[dev1@localhost ~]$ mkdir -pv $HOME/.venv
mkdir: ディレクトリ `/home/dev1/.venv' を作成しました
[dev1@localhost ~]$ python36 -mvenv $HOME/.venv
[dev1@localhost ~]$ 
```

## venvの有効化
```
[dev1@localhost ~]$ source $HOME/.venv/bin/activate
(.venv) [dev1@localhost ~]$
```

## venvの無効化
```
(.venv) [dev1@localhost ~]$ deactivate
[dev1@localhost ~]$ 
```

## venvを有効化した状態でpipをアップグレード
```
(.venv) [dev1@localhost ~]$ pip install --upgrade pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/d7/41/34dd96bd33958e52cb4da2f1bf0818e396514fd4f4725a79199564cd0c20/pip-19.0.2-py2.py3-none-any.whl (1.4MB)
    100% |████████████████████████████████| 1.4MB 5.9MB/s 
Installing collected packages: pip
  Found existing installation: pip 10.0.1
    Uninstalling pip-10.0.1:
      Successfully uninstalled pip-10.0.1
Successfully installed pip-19.0.2
(.venv) [dev1@localhost ~]$ pip -V
pip 19.0.2 from /home/dev1/.venv/lib64/python3.6/site-packages/pip (python 3.6)
(.venv) [dev1@localhost ~]$
```

## djangoをpipでインストール
```
(.venv) [dev1@localhost ~]$ pip install django
Collecting django
  Downloading https://files.pythonhosted.org/packages/36/50/078a42b4e9bedb94efd3e0278c0eb71650ed9672cdc91bd5542953bec17f/Django-2.1.5-py3-none-any.whl (7.3MB)
    100% |████████████████████████████████| 7.3MB 1.9MB/s 
Collecting pytz (from django)
  Downloading https://files.pythonhosted.org/packages/61/28/1d3920e4d1d50b19bc5d24398a7cd85cc7b9a75a490570d5a30c57622d34/pytz-2018.9-py2.py3-none-any.whl (510kB)
    100% |████████████████████████████████| 512kB 8.6MB/s 
Installing collected packages: pytz, django
Successfully installed django-2.1.5 pytz-2018.9
(.venv) [dev1@localhost work]$ python -m django --version
2.1.5
```
質問です。

⚠️のところで、Fatal error: Unexpectedly found nil while unwrapping an Optional value
が出てしまいました。原因がわからず困っています。助けてください。
（なお、コードを書く練習のために、＠Simmonさんの記事を拝借させていただきました。）

import UIKit



class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate{
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var searchBar: UISearchBar!
    
let PPAP:[String] = ["PPAP", "I have a pen", "I have a apple", "Uh! Apple-Pen!", "I have a pen", "I have pineapple", "Uh! Pineapple-Pen!", "Apple-Pen, Pineapple-Pen", "Uh! Pen-Pineapple-Apple-Pen", "Pen-Pineapple-Apple-Pen"]
var searchResults:[String] = []


override func viewDidLoad() {
    super.viewDidLoad()
    
    let barHeight: CGFloat = UIApplication.shared.statusBarFrame.size.height
    tableView = UITableView(frame: CGRect(x: 0, y: barHeight, width: self.view.frame.width, height: self.view.frame.height))
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "PPAP") ⚠️
    tableView.dataSource = self
    tableView.delegate = self
    self.view.addSubview(tableView)
    
    searchBar = UISearchBar()
    searchBar.delegate = self
    searchBar.frame = CGRect(x:0, y:0, width:self.view.frame.width, height:42)
    searchBar.layer.position = CGPoint(x: self.view.bounds.width/2, y: 89)
    searchBar.searchBarStyle = UISearchBar.Style.default
    searchBar.showsSearchResultsButton = false
    searchBar.placeholder = "検索"
    searchBar.setValue("キャンセル", forKey: "_cancelButtonText")
    searchBar.tintColor = UIColor.red
    
    tableView.tableHeaderView = searchBar
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if searchBar.text != "" {
        return searchResults.count
    } else {
        return PPAP.count
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath as IndexPath)
    if searchBar.text != "" {
        cell.textLabel!.text = "\(searchResults[indexPath.row])"
    } else {
        cell.textLabel!.text = "\(PPAP[indexPath.row])"
    }
    
    return cell
}

// 検索ボタンが押された時に呼ばれる
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    self.view.endEditing(true)
    searchBar.showsCancelButton = true
    self.searchResults = PPAP.filter{
        // 大文字と小文字を区別せずに検索
        $0.lowercased().contains(searchBar.text!.lowercased())
    }
    self.tableView.reloadData()
}

// キャンセルボタンが押された時に呼ばれる
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searchBar.showsCancelButton = false
    self.view.endEditing(true)
    searchBar.text = ""
    self.tableView.reloadData()
}

// テキストフィールド入力開始前に呼ばれる
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
    searchBar.showsCancelButton = true
    return true
}
}
ローカルサーバー(8080)をターミナルから停止させる

##困ったこと
　eclipseでWEBアプリをつくっていて、サーバーを停止させた（停止ボタンを押した）はずなのに、ブラウザでは切断されない。eclipseを終了させても動き続けている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/205578/d2ed0eed-dc6d-6790-12c8-f428fbe82a7e.png)

この画面が欲しい。だが、eclipseをどういじくっても現れない。

　これは困った。

##やりたいこと
　そこでターミナルからローカルサーバーを停止しちゃえばいい、というのをGoogle先生が教えてくれた。
　eclipseが言うことを聞いてくれないのならば、ターミナルにお願いしよう。そうしよう。

##やったこと
まず、動いているローカルサーバーの状態を確認した。

```markdown
 $ lsof -i:8080
```
コマンドを叩いたら下の文字が現れた。

```markdown
COMMAND  PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    9748 takatoshi   67u  IPv6 0x4ba3b9d5580c711b      0t0  TCP *:http-alt (LISTEN)
```

どうやらこの「PID」というのが悪さをしているらしい。その悪のナンバーは9748っていう。

それならば、殺してしまおう。

PID9748をkillしてしまおう。

```markdown
 $ kill 9748
```

ふたたび「$ lsof -i:8080」を入力すると、何も現れなくなった。

そしてブラウザを更新すると

![DE0A535F-C581-4C33-9473-AA9A77510EF9.png](https://qiita-image-store.s3.amazonaws.com/0/205578/3ac5fd02-52d7-2efb-7f67-8e82724dd126.png)

切断されていることを確認。

PIDをkillして、ローカルサーバが平穏を取り戻した。

めでたしめでたし。

でも、PIDってなんだ。。。？



参考記事
https://qiita.com/maru_katy/items/8348a607b5f394c8d935
[R] DT::datatable()でクリック可能なリンクを作成する方法

# DT::datatable()でリンクを飛ばしたい
RMarkDownやShinyを使用してテーブルを表示したい場合、デフォルトでソート機能もあり、ある程度きれいな見栄えで、インタラクティブなテーブルを作成できる非常に便利なDT::datatableですが、特定のセルから別ページにリンク（ExcelのHyperlink的な）を飛ばしたいと思ったとき、どうやったら実現できるのか結構悩んだので記録として残すことにしました。

DTパッケージの機能については詳しい説明が下記リンク先に紹介されています。

- [DT: An R interface to the DataTables library
](https://rstudio.github.io/DT/)
- [DTでインタラクティブな表作り
](https://kazutan.github.io/SappoRoR5/DT_demo.html)

## 元データの準備
今回は下記のようなサンプルデータで試してみます。
以下のデータを手元に持っていたとします。

```r:sample.r
 No <- c(1, 2, 3)
 Page <- c("Google", "Yahoo", "Wiki")
 URL <- c("https://www.google.co.jp/",
          "https://www.yahoo.co.jp/",
          "https://ja.wikipedia.org/wiki/")
 sample <- data.frame(No=No, Page=Page, URL=URL)
```
||No|Page|URL|
|---|:---|:---|:---|
|1|1|Google|https://www.google.co.jp|
|2|2|Yahoo|https://www.yahoo.co.jp/|
|3|3|Wiki|https://ja.wikipedia.org/wiki/|

こんなテーブルをRMarkDownでhtml出力しても、URLはそのままだと文字データとして処理されますので、クリックしてもリンク先には飛びません。


「URL列は非表示にして、Page列のセルにリンクをつけたい！！」といった場合、以下に続きます。

## クリック可能なリンクを作成する方法
セルの値をhtmlのaタグ書式で書いてあげるとクリック可能なセルに変わります。

- [参考：aタグについて
](https://html-coding.co.jp/annex/dictionary/html/a/)

Page列の値をURL列のデータをもとにaタグ書式に変換してみます。
先ほど作成したsampleで試すと以下のような感じです。

````r:sample_click.Rmd
---
title: "LINK_TEST"
output: html_document
---
```
```r:chunk内
library(DT)
# sampleの作成
No <- c(1, 2, 3)
Page <- c("Google", "Yahoo", "Wiki")
URL <- c("https://www.google.co.jp/",
          "https://www.yahoo.co.jp/",
          "https://ja.wikipedia.org/wiki/")
sample <- data.frame(No=No, Page=Page, URL=URL)

# Page列をURL列を元にaタグ書式に書き換え
# "target = '_blank'"はクリック時に別ページで開くために記載※
sample$Page <- paste0("<a href=", "'", sample$URL, "'", "target = '_blank'", ">", sample$Page, "</a>")

# URL列の削除
sample <- sample[,-3]

# テーブルの作成（optionはお好みで）
sample_table <- datatable(sample, rownames=FALSE, escape=FALSE)

# テーブルの出力
sample_table 

```




上記をRmdファイルとして実行するとこんな表になります。
![Imgur](https://i.imgur.com/tWmb3hs.png)
Page列が青文字になり、無事リンクが飛ぶようになりました。
Shinyでは試してませんが、おそらく同じ方法で動作するのでは。

# ※ご注意!
記事中のaタグの表記方法はあまり推奨されないそうです。
下記リンク先の記事をご参考。

-  [target="_blank"には気をつけよう
](https://qiita.com/Apprentice_engineer/items/5db19a6d9bd4e7978aec)

# 蛇足
元データのExcelにハイパーリンクしかなく、URLを引きずり出したい場合

- [エクセルで、青文字のハイパーリンクから、URLだけを取り出したいのですが･･･
](https://ameblo.jp/sumitak1329/entry-11902166994.html)
ES6 の for-of 文でプロパティの値と一緒に index の値も取得する

ES6 の `for-of` 文を使うとき, index の値も同時に取得したい状況が稀によくある.

これは [Object.entries()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/entries) の分割代入を行うことで実現できる:

```javascript
const numArray = [0, 1, 2, 42]

for (const [index, num] of numArray.entries()) {
  console.log(`index: ${index}, num: ${num}`)
}

// index: 0, num: 0
// index: 1, num: 1
// index: 2, num: 2
// index: 3, num: 42
```

## TypeScript の場合

TypeScript で `target` を `ES5` 以下にしているとき, デフォルトでは上記のコードはコンパイルエラーとなる (TypeScript 3.2 で確認):

```
TS2569: Type 'IterableIterator<[number, number]>' is not an array type or a string type. Use compiler option '--downlevelIteration' to allow iterating of iterators.
```

エラーメッセージにあるように, `--downlevelIteration` オプションをつければコンパイルが通るようになる[^typescript-compiler-options]:

```tsconfig.json
{
    "compilerOptions": {
        "downlevelIteration": true,
        "target": "es5"
    }
}
```

## 参考にした記事

  - https://qiita.com/TakahiRoyte/items/dca532dd64bc782ad849
  - https://stackoverflow.com/questions/34348937/access-to-es6-array-element-index-inside-for-of-loop

[^typescript-compiler-options]: https://www.typescriptlang.org/docs/handbook/compiler-options.html
Rails初心者がWindowsにRails+Vueの環境構築して詰んだ話


# はじまり
唐突にRails+Vueの環境構築がしたくなったのでうぃんどうずに環境構築したがうまくいかなかった


※正確なエラーは覚えていません


# 最初にしたこと
一通りRubyとRailsを入れてRailsとVueを使う時に一般的に実行するであろうコマンド
`rails new myapp --webpack=vue`
を実行したがなんかエラーでた。
**can not load such file — sqlite3/sqlite3_native (LoadError)**
とにかくこのエラーがでた。
どんなコマンドを実行してもこのエラーが出た。

ググると一回sqlite3をアンインストールしてからもう一回インストールするコマンドを実行すれば解消されるらしい
`gem install sqlite3 --platform=ruby -- --with-sqlite3-include=パス --with-sqlite3-lib=パス`

もうこの時点でコマンドが長くて諦めたくなったが、たしかにエラーは出なくなった(rails sできた)
だがbundle installするたびにこの長いコマンドを打たなくてはいけないのはめんどくさかった

# 次にしたこと
後日bcryptというものを初めて知ったので、使おうとGemfileを書き換えてbundle installしたあとに
`gem install sqlite3 --platform=ruby -- --with-sqlite3-include=パス --with-sqlite3-lib=パス`
を実行したがエラーがでた。

ログみてググったら原因特定できたので
`ridk exec pacman -S mingw-w64-x86_64-dlfcn`
してGemfileに
`gem 'sqlite3', '1.4.0'`
を書いてbundle installしたらrails sできたがrails dbはエラーが出てできなかった
**can't activate sqlite3 (~> 1.3.6), already activated sqlite3-1.4.0. Make sure all dependencies are added to Gemfile. (Gem::LoadError)**

# 最後にしたこと
いろいろググったが結局解決方法がわからず諦めそうになったがどっかでRubyが2.4なら最初のcannot load such fileが出ないみたいなのを思い出す。

https://rubyinstaller.org/downloads/
で2.4のリンクをクリックしてRuby 2.4を入れる。するとruby 2.4のフォルダができる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/357698/a63caf8d-bea0-0b57-ba60-63a6dfa3ff66.png)

`ruby -v`で
`ruby 2.4.5p335 (2018-10-18 revision 65137) [x64-mingw32]`
と表示されたので2.4になってるのを確認

再度
`rails new myapp --webpack=vue`
を実行するとなにもエラーがでずに実行できた。

`rails s`で表示確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/357698/9df3b085-f2c2-a380-ece6-4a09b116fbfc.png)

てきとうにview作って
`<%= javascript_pack_tag 'hello_vue' %>`
を入れてVueのコンパイルが出来ることを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/357698/2d22c63c-3aed-8f4a-807f-aaebb8e09f58.png)

おわり。
KotlinのNullable型の拡張関数

Kotlinプログラマのみなさんにはお馴染みだと思いますが、次のコードはコンパイルエラーになります。

```kotlin
val nullableArray: Array<Int>? = null

// 次のコードはコンパイルエラー
println("nullableArray.isEmpty() is ${nullableArray.isEmpty()}")
```

Arrayの拡張関数、[isEmpty](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/is-empty.html)。

`nullableArray`は`Array<Int>?`型ですから、`.`での関数呼び出しはできません。コンパイルエラーになります。`?.`を使う必要があります。

さて、Kotlin 1.3から加わったメソッドに、[isNullOrEmpty](https://kotlinlang.org/docs/reference/whatsnew13.html#isnulloremptyorempty-extensions)というメソッドがあります。

* `fun <T> Array<*>?.isNullOrEmpty(): Boolean`
* `fun <T> Collection<T>?.isNullOrEmpty(): Boolean`
* `fun <K, V> Map<out K, V>?.isNullOrEmpty(): Boolean`

これは、

* `Array<*>?`
* `Collection<T>?`
* `Map<out K, V>?`

の拡張関数です。

* `Array<*>`
* `Collection<T>`
* `Map<out K, V>`

の拡張関数ではありません。`Nullable型`の拡張関数です。

`Nullable型`な`Array<*>?`の拡張関数である`isNullOrEmpty`は`isEmpty`との大きな違いがあります。

次のように、`.`でも呼び出すことができます。`?.`でなくても呼び出すことが可能です。

```kotlin
val nullArray: Array<Any>? = null

// 次のコードはコンパイルエラーにならない
println("nullArray.isNullOrEmpty() is ${nullArray.isNullOrEmpty()}") // true
```

このような拡張関数は、Kotlin 1.3に追加されたものもありますが、もともとKotlin 1.0からあったものもあります。例えば次のようなものです。


* [fun CharSequence?.isNullOrEmpty(): Boolean](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/is-null-or-empty.html)
* [fun CharSequence?.isNullOrBlank(): Boolean](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/is-null-or-blank.html)
* [fun String?.orEmpty(): String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/or-empty.html)
* [fun Array<*>?.isNullOrEmpty(): Boolean](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/is-null-or-empty.html)
* [fun <T> Collection<T>?.isNullOrEmpty(): Boolean](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/is-null-or-empty.html)
* [fun <K, V> Map<out K, V>?.isNullOrEmpty(): Boolean](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/is-null-or-empty.html)
* [fun <T> Collection<T>?.orEmpty(): Collection<T>](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/or-empty.html)
* [fun <T> List<T>?.orEmpty(): List<T>](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/or-empty.html)
* [fun <reified T> Array<out T>?.orEmpty(): Array<out T>](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/or-empty.html)
* [fun <K, V> Map<K, V>?.orEmpty(): Map<K, V>](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/or-empty.html)


`Nullable型`でも、`.`で呼び出せる拡張関数がある。面白いですね。
シンプルなトランプ用Class(Python)

[プログラミング入門者からの卒業試験は『ブラックジャック』を開発すべし](https://qiita.com/hirossyi73/items/cf8648c31898216312e5)

の記事を見かけ、自分も入門者から卒業目指してチャレンジしてみることに。
第一歩として、シンプルなトランプ用クラス作成。
（Deck=シャッフルされたトランプの山）

内部のデータは扱いやすいように整数、
表示は絵文字を使った形式に。

ソースコード: [gist](https://gist.github.com/zaq9/689e470be449073701ee77e33ac778e9)

```Python

import random


class Card:
	SUITS = '♤♡♢♧'
	RANKS = '0 A 2 3 4 5 6 7 8 9 10 J Q K'.split()

	def __init__(self, suit, rank): self.suit, self.rank = suit, rank

	def __repr__(self): return f'{Card.SUITS[self.suit]}{Card.RANKS[self.rank]}'


class Deck:

	def __init__(self):
		self.cards = [Card(suit, rank) for suit in range(4) for rank in range(1, 14)]
		random.shuffle(self.cards)

	@property
	def next_card(self): return self.cards.pop()
```

表示のテスト：

```python
d=Deck()
print(d.next_card)
print(d.next_card)
print(d.next_card)
```

```text:実行結果
♡Q
♢6
♢7
```
学生起業でAIスタートアップを1年間やってみてわかったこと

自己紹介
東京大学大学院在学中で
株式会社[Lightblue Technology](https://www.lightblue-tech.com/)というAIスタートアップの代表取締役をしている園田亜斗夢です。

## この記事の目的
起業して1年が経って、起業を考えている友人から相談されることが増えたから。

## 起業に至った経緯
### 研究とビジネスの垣根が非常に低いから
大学院では計算社会科学といったデータサイエンス的な研究をしています。特にニュースメディアの推薦システム周りについてやっています。この分野は、企業との共同研究によるデータの提供が非常に重要です。企業でのインターンでやる内容と研究室でやっていることの内容がほとんど変わらなかったりします。
それなら、ビジネスしないのはもったいないと言うわけです。

## 独立するということ
エンジニアにとって技術に集中できる状況は重要です。財務諸表を作るのは苦手ですし、営業で人に会うのも疲れます。価値が最大化されるのはコーディングしている瞬間だと思います。
しかし、起業すると会社で働くのと違って色々やらないといけないことが増えます。
##### しくじり
起業したら自由だと思ったら、やらないといけないこと（営業・調達・採用・経理等）が増えて自由な時間が減る

## 起業当初のサービス
Lightblue TechnologyはもともとBusiness Hubと言う社名でビジネスマッチングサービスを作っていました。
今は辞めてしまった友人と僕、僕がTAしている授業で見つけてきたバイトの3人でKadokawaのやってるコワーキングスペースで、2人にプログラミングを教えながら、目も当てられないデザインのサービスを作り上げました。AIによってマッチングの推薦をするというLinkedinとクラウドワークスを合わせたようなサービスでしたが、ユーザの獲得等をどうしていいか全くわからずwebサービスの難しさを学びました。
##### しくじり
- 顧客がいないうちから作り出してしまった
- デザインへの意識が低く、機能追加を進めていった


## 起業後半年
それまでは、僕がチャットボットの受託開発などをたまにすることで当面の資金を確保していましたが、
そちらの事業の方が**稼げる**こと、**クライアントに喜んでもらうのは楽しい**こと、**ニーズから生まれるサービスの方が当たる**ことに思い当たり、ピボットすることにしました。
## 調達
やることが決まったので、資金調達することにしました。
資金調達は別記事とするのですが、簡単に言うと出資してくれたGAUSSの副社長に一緒に調達資料を作ってもらうと言う訳わかんない感じで進みました。
pandasは使えてもエクセルは使えないエンジニアは、まずは社会人としてエクセルくらい使えた方がいい気がします。あと、創業メンバーの選択は重要です。スタートアップの失敗原因は資金ショートより不仲の方が多いです。
##### しくじり
- [創業者間契約](https://www.azx.co.jp/modules/docs/index.php?cat_id=35)を結ばなかった
- Excelなんてなくてもpandasがあればなんでもできると思っていた

## 事業選択
AI開発はこれまでのITシステムよりも汎用性が高いです。
例えば、工場に異常検知センサーを入れる場合ですが、対象が変わっても画像解析のモデルは変更することなく、データを変え再学習するだけで対応することが可能です。このような性質から、従来のベンダーが対応できなかった中小の企業でも費用的に導入することができ、市場が広いです。導入が広がり効率化が進むことで、生産性の問題や省エネなど様々な課題が解決されるはずです。
##### しくじり
営業資料作りやニーズがわかる人がチームにおらず、適切な提案ができるまでに時間がかかった

## 採用
通常のSIと違い、AI開発は汎用性が高いため、人手は多くかかりませんが、代わりに優秀な人材が必要です。
僕たちの会社では、大学の友人が多く働いていて、彼らはkaggleと研究と案件の分析を交互にやっています。しかし、それだけではプロダクトとして納品するのが難しいため、社内のエンジニアの育成も必要です。
##### しくじり
**Wantedlyのカスタマーサクセスの言うことを守らず**、記事の投稿や募集の**投稿を定期的に**行わなかった。
これをやるだけで、多くの応募が来ます。弊社にはWantedly経由で慶応のミスコン出身のエンジニアも働いています。

## マネジメント
採用ができても、続けてもらう必要があります。そこで、従業員にとって会社にいるメリットを考える必要があります。

##### しくじりから生まれた社内システム
- 知識の共有が不十分であった
   - 勉強会の開催
   - コードの社内共有
   - slackのパブリック化
- 個人へのチャンスの提供が不足していた
    - プロダクトへの個人名記載

## 最後に
創業メンバーがやめる、キャッシュがなくなる、未払いにあうと言うしくじりはベンチャーをやっていると高確率で起こります。
そういったときに1人で沈んでしまうこともあるのですが、今はコーチングやメンタリングだったりもあるので、必要経費としてそういったサービスを使うのも必要だと思います。

起業回りの知識は、プログラミングや機械学習の知識と同じで、知ってるとなんてことはないのに、知らないと難しい。
一番重要なのは、自分ができないことをできる仲間だと思います。

もしこの記事を読んで何か参考になるところがあればぜひいいねをお願いします。
またLightblue Technologyに興味があれば[焼肉ランチ](https://platform.wantedly.com/projects/289586)に行きましょう！
ありがとうございました。
githubの使い方を流れでまとめた備忘録

# はじめに
gitとgithubを使った開発を最近始めました.
何も分からなかったので調べたことを備忘録として書いておきます.
# 前提知識
- ローカルリポジトリとリモートリポジトリ  
簡単にいうと、PCがローカルでgithubがリモート
- branch  
branchは枝なので幹から生やすことができる.
共有データ(幹)からbranch（枝）を新しく生やして(=複製)、そこを編集する.
作業が終わったら枝を幹に戻すことになるが、データが衝突する可能性があるので、管理者以外はくっつけるのを申請するまでやる.
ちなみにこの枝をくっつけることを「マージ」と言うらしい.

# 最初だけやること
新規リポジトリのドアを叩くときは、色々準備が必要らしい.  
### 自分がリポジトリを作る場合
今回、私はこの範疇にありませんでしたので書きません(書けません).
方法はたくさんネットに転がってました.
### 既存リポジトリに参加する場合
```terminal:
$ git clone -b <branch_name> <repogitory_url>
# 例
$ git clone -b master http://...
```
これでカレントディレクトリにgithubのデータをローカルに落とせる.
branchによってデータが違う. ほとんどの場合masterをcloneしておけば良い気がする.
最初に選択されるbranchはこの時のbranch_nameだと思う.

# 普段の作業の流れ

1. ローカルの状態を更新する
2. branchを作成する
3. branchを切り替える
4. 作業する
5. 作業内容をローカルリポジトリに反映する
6. localのremoteへの反映をお願いする

## 作業を始めるまで
```terminal:
$ git pull #ローカルリポジトリを更新
$ git pull origin master #↑のプル先を明示した場合
$ git branch <branch_name> #ブランチを作成
$ git checkout <branch_name> #ブランチを切り替える
#　上2つをまとめたコマンド
$ git checkout -b <branchname>
-----
$ git branch #ローカルブランチ一覧表示(現在のbranchも確認できる)
$ git branch -a/-al/-all #全ブランチを一覧表示
```
`git pull`でローカルリポジトリ(pc)を更新できる(=リモートリポジトリ(web)の更新を反映する).
更新されるのは現在選択中のbranchなので、branchをmasterにしておく. `git branch`で現在ローカルにあるbranchを確認できる.
`git checkout <branch_name>`でmasterから脱しないと大変なことになりそう.
## 作業内容を反映する
作業が一通り終わったらリモートリポジトリへ、更新をお願いする.
作業内容はローカルリポジトリでは無く、また別の場所に保存されているので、↓の流れになる

1. 作業内容 → ローカルリポジトリ
2. ローカル → リモート（の申請）

```terminal:
$ git add * #全部ファイルをadd
$ git commit -m "編集コメント" #branchを更新、編集内容をコメントで
$ git push --set-upstream origin <branch_name> #初めてpushする時だけ
$ git push #現在選択中のbranchをgithub(origin)に送る
$ git push <branch> #明示する場合はこう書く
```
正直にいうとあまり理解できていないのだが、
add+commitでローカルのbranchに作業内容が反映されるっぽい.
commitのオプションで`-m`しなければ、commitコマンドの後にその編集画面になるけど面倒なので、一言コメントを同時に書いてしまおうと思う.
`git push (引数)`でリモートの(引数branch)にローカルのbranchを反映できる．
引数を与えない場合は、checkoutしているbranchが対象となる.

## 確認をお願いする
あとはwebページ上で、プルリクエスト(マージリクエスト)をすれば管理者に更新をお願いしたことになる.

### 跡を濁さない
```terminal
$ git branch -d <branch_name> #branchの削除(マージ済みのみ)
$ git branch -D <branch_name> #branchの削除(強制削除)
```
もう使わないbranchは削除したほうが良さそうな気がする.
# special thanks
- [今日からはじめるGitHub 〜 初心者がGitをインストールして、プルリクできるようになるまでを解説](https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000#Git%E3%81%A8GitHub%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98)
メディアサイトでServerlessな構成でSubscriptionモデルを構築する。

メディアサイトの会員管理、Subscriptionモデルをスクラッチで開発する。

* ユーザー管理、認証は、「Auth0 + カスタムデータベース dynamoDB」か、AWSのCognito。
* フロントは、React ReduxでSPA。
* 決済はStripe、StripeのReact Elements。
* APIはlambdaで、Node.js。

Severless Frameworkを使って、フロントエンド、APIを同時にデプロイ。

Frontend, BackendともJavascriptなので共通なライブラリも作れるはず。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/41550/04e4c377-3a3a-ad62-b4ce-c4c6c65f6809.png)
技術記事を投稿するときのタイトルの付け方のコツ

意外とQiitaでも、タイトルのせいで埋もれてしまっている記事が多いように感じます。

今回は技術記事を投稿するときのタイトルの付け方のコツを解説します。
## 技術記事を投稿するときのタイトルの付け方のコツ
要約すれば、「検索されやすいタイトル」をつけるようにすると、価値の高い、探しやすい記事になります。

それでは、検索されやすいタイトルとは何でしょうか？
それは、解決したい問題や悩みに関するワードが含まれているタイトルです。


例え話をさせて下さい。

あなたがRailsで開発しているWebページをTwitterでシェアした時に画像を表示出来るようにしたいと思ったとします。
しばらく調べると、
「このような設定はOGPタグで出来る。」
「Twitterのシェア時に表示されるものは、Twitterカードと呼ばれる」
ということが分かってくると思います。

そして。このことをQiitaにまとめようと思ったときに、「RailsでOGPタグを書いてTwitterカードを表示させる方法」というタイトルにするのはよくありません。

なぜなら、「OGPタグ」や「Twitterカード」という言葉に多くの人はたどり着くことが出来ないからです。

あなたの当初の知りたいことであった「RailsでページをTwitterでシェアした時に画像を出す方法」といった、解決手段ではなく、解決したい課題をタイトルにするようにしましょう。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
データベース連携フォームへの道

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているtsuyoshi0514です
#送信フォーム
僕の場合は下記のようにformを用いてとても簡単に最初のページを作りました。
 
    <body>
        <form action="check.php" method="post">
            名前：<br />
            <input type="text" name="name" value="" /><br />
 
            学籍番号：<br />
            <input type="text" name="number"  value="" /><br />
 
            年齢：<br />
            <input name="age"><br />

            備考：<br/>
          <textarea name="text"></textarea>
            <br />
 
            <input type="submit" value="送信" />
        </form>
    </body>

#確認画面
そして下記のようにif,elseを用いることで確認画面を作成しました。
フォームの内容が空の場合は戻るようにもしています。

```<h1>確認画面</h1>
<?php
  print '<ul>'."\n";
  print '<li>';
if($name==''){
  print 'お名前が入力されていません。<br>'."\n";
}else{
  print 'お名前：'.$name.'<br>'."\n";
}
  print '</li>'."\n";
  print '<li>';
if($number==''){
  print '学籍番号が入力されていません。<br>'."\n";
}else{
  print '学籍番号：'.$number.'<br>'."\n";
}
  print '</li>'."\n";
  print '<li>';
if($age==''){
  print '年齢が入力されていません。<br>'."\n";
}else{
  print '年齢：'.$age.'<br>'."\n";
}
print '</li>'."\n";
print '<li>';
if($text==''){
    print '備考が入力されていません。<br>'."\n";
  }else{
    print '備考欄： '.$text."\n";
  }
  print '</li>'."\n";
  print '</ul>'."\n";
アプリ　ダークモードの色調比較

#Darkmodeが気になる

白などのシンプルなデザインを基調としたアプリケーションが、ダークモードを作る事例が増えています。
Appleのmovajeで導入されたこともあり、今後iOSでの対応や、機能として需要が高くなるかもしれません・・・

（ダークモード自体については、この記事でよくまとめられていると思います。）
https://qiita.com/gotchane/items/f18c03411501081f1296

2019/10/11 こちらもかなり分かりやすく色調の考え方を明記しています
https://kudakurage.hatenadiary.com/entry/2019/07/29/083000
こちらで紹介するダークモードはほとんどアクセントカラーのあるUIですが、オールグレースケール場合の際などに参考になる考え方がまとまっています。

2019/11/15
この記事でやっていることの上位互換のような記事です。参考になります。
https://note.tsumikiinc.com/n/n949a295574d8


そのために、大手アプリがどのようなカラーリングのルールを採用しているか、なんとなく見ていこうと思います。

##色の取得方法
カラーをどう取得するかですが、リバースエンジニアリングみたいなことは行わず、
iPhoneでスクリーンショットをとり、PCのペイントのスポイトツールでカラー情報を取得します。

![pick.png](https://qiita-image-store.s3.amazonaws.com/0/200222/76cf3b51-c2c6-6351-78a0-bc18ede2fa0e.png)

なので、絶対的なカラーコードなどは異なるのかもしれませんが、あくまで調べたいのは、ダークとデフォルトの色の相対関係なので、同じ条件でサンプリングしているからよしとします。

また、文字色などは、一番面積が大きそうな箇所のなるべく中心からピックするようにしていますので、実際の設定値からかなり離れてしまっているかもしれません。
取れる手段の限界ということで許してください。


##Twitter
![ダークモード　資料.png](https://qiita-image-store.s3.amazonaws.com/0/200222/85f0a0c4-dba1-8986-3af0-83208e811495.png)

ポイントは、アイコンの色の水色が、変化していないことです。
しかし、薄い文字、アイコンが選択されてないさいのInactive表示は、デフォルトとダークでHueとSaturationはほとんど変えずBrightnessを変化させているようです。
背景のカラーが暗くなることで、「普通の文字色」から少しトーンを落とした色の落とし方がかわるというところでしょうか。


##Skype

![ダークモード　資料3.png](https://qiita-image-store.s3.amazonaws.com/0/200222/4056ba99-8105-193a-b397-5279d3a17cde.png)

双方に共通して存在している色は、白と＃２B2C32のカラーリングです。
ダークモードのになる時に大きい領域をとる色味を、デフォルトの際の文字色にしているので、面白い配色です。

デフォルトのあとからダークを構成したのではなく、ダークの際の色味を意識して、あえて文字色を少しだけBlueに寄せた暗い色にしているのかもしれません。


## YouTube
![ダークモード　資料2.png](https://qiita-image-store.s3.amazonaws.com/0/200222/fb66cc32-c479-b88c-159d-2c78dab4c048.png)

やはり、アクセントおよびブランドイメージになる、赤色は変化なしです。
youtubeのUIでいいなぁと思ったのが、背景・文字色・薄い文字色などは、ほとんどモノトーンで構成されているところです。
動画を表示することがメインの機能であるため、色味をつけたフレームにしないということでしょうか

白黒といいつつ微妙に色付けがされてるパターンもありますが、あくまでアクセントは赤色に絞り構成しているところが、青ベースでダークカラーに落としているTwitterとの大きな違いと言えると思います。




##他

また見つけてピックアップ次第、蓄積していければと思います。
そして、ここで採用されているルールというか、発想を元に、Dark ModeのUI設計を考えていこうと思います。

こちらも参考になりました。
https://qiita.com/shtnkgm/items/3dfaf126c286fd098f10
MySQLのファイル周り(5.6)


[公式ページ](https://dev.mysql.com/doc/refman/5.6/en/innodb-architecture.html)の存在を知ってわかりやすかった事と主な関連パラメーターも合わせて見たかったのでまとめ。色々足りないと思うので気がついたらアップデート。
あとエクセルで作成やめたい。
テキストボックスを縦書き出来るサービスないかな

<img width="908" alt="スクリーンショット 2019-03-01 23.35.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/94267/ab9768cf-9044-ac0e-ce79-79481357146d.png">


innodb_change_buffer_max_size: buffer pool内での割合
Kotlinで美しきFizzBuzzを書く

Kotlinにも拘わらず、Javaと同じようにFizzBuzzを解くプログラムをあるブログで見ました
というわけでKotlinの言語機能を活かして美しきFizzBuzzを書いて見たいと思います
ただ、StringBuilderありとなしで結構変わるので今回は２つに場合分けして教えたいと思います
###Kotlinらしくないコード(StringBuilderを使わない場合)
```kotlin
fun main(args: Array<String>) {
    for (num in 0..100) {
        if (num % 15 == 0)
            println("FizzBuzz")
        else if (num % 3 == 0)
            println("Fizz")
        else if (num % 5 == 0)
            println("Buzz")
        else
            println(num)
    }
}
```
###引数を取らない場合は`args: Array<String>`を省略できる

```kotlin
fun main() {
    for (num in 1..100) {
        if (num % 15 == 0)
            println("FizzBuzz")
        else if (num % 3 == 0)
            println("Fizz")
        else if (num % 5 == 0)
            println("Buzz")
        else
            println(num)
    }
}
```
これは多分殆どの人が知ってると思います

###if文をExpressionとして使う

```kotlin
fun main() {
    for (num in 1..100) {
        println(
            if (num % 15 == 0) "FizzBuzz"
            else if (num % 3 == 0) "Fizz"
            else if (num % 5 == 0) "Buzz"
            else num
        )
    }
}
```
これはあまり綺麗ではありませんが、Kotlinでの必須テクであるので一応載せました
後述するwhen文と合わせるともうすこし綺麗にできます
###when文を使う

```kotlin
fun main() {
    for (num in 1..100) {
        when {
            num % 15 == 0 -> println("FizzBuzz")
            num % 3 == 0 -> println("Fizz")
            num % 5 == 0 -> println("Buzz")
            else -> println(num)
        }
    }
}
```
見た目の美しさが全然違う!
やっぱりif...else-if...を延々と書かなくて済むのは楽ですね。ただしif...if...は作れないので注意です。

```kotlin
fun main() {
    for (num in 1..100) {
        println(
            when {
                num % 15 == 0 -> "FizzBuzz"
                num % 3 == 0 -> "Fizz"
                num % 5 == 0 -> "Buzz"
                else -> num
            }
        )
    }
}
```
ちなみにwhen文もExpressionとして利用可能です
まあ、正直さっきのほうが見やすい気もしますが一応
###Kotlinらしくないコード(StringBuilderを使う場合)

```kotlin
fun main() {
    for (num in 1..100) {
        val builder = StringBuilder()
        if(num % 3 == 0) builder.append("Fizz")
        if(num % 5 == 0) builder.append("Buzz")
        if(builder.isEmpty()) builder.append(num)
        println(builder)
    }
}
```
###buildString関数を使う

```kotlin
fun main() {
    for (num in 1..100) {
        println(buildString {
            if (num % 3 == 0) append("Fizz")
            if (num % 3 == 0) append("Buzz")
            if (isEmpty()) append(num)
        })
    }
}
```
buildString関数めっちゃ便利です。どんなプログラムでもよく使います
でもこれだとbuildStringがprintln関数の引数と使われているので、}の後に)があるのが少しきたないですね
###forEachを使って書き換える

```kotlin
fun main() {
    (1..100).map {
        buildString {
            if (it % 3 == 0) append("Fizz")
            if (it % 5 == 0) append("Buzz")
            if (isEmpty()) append(it)
        }
    }.forEach(::println)
}
```
今までに書いてきた1..100の実体はIntRangeです。これとfor文を組み合わせるのが最も一般的ですが、StreamAPIとその拡張をつかってモダンに書くこともできます
ちなみに```::println```はメソッド参照です。メソッドの引数が要求される引数と一致するときに使うことができます。またクラス参照というのもあり、例えばJavaの一部ライブラリとかだとクラスを要求されることがあるので、そういう時Kotlinでは```SomeClass.class```とはできないので```SomeClass::class.java```とします
余談ですが、プロパティを読み込むときとかは

```kotlin
val properties = Properties()
val file = File(filePath)
file.inputStream().use(properties::load)
```
みたいにすると三行で読み込むことができます。便利！！
複数の配列で２回以上出現する値を抽出する方法

 array_intersectではすべての配列の共通項を出せるが、いずれかの配列の共通項を出したいときに迷ったのでメモ。
もっと良い方法あったら教えてください。

```php:array_intersect_any.php
<?php
$a = ['hoge', 'fuga'];
$b = ['hoge', 'fuga', 'piyo'];
$c = ['hoge', 'fuga', 'piyo', 'hogehoge'];

/**
 * すべての配列をマージして出現回数が2回以上の値だけを抽出する
 * 連想配列には対応していない
 * 一つの配列に同じ値が2つあっても共通項として抽出される
 * 
 * @access
 * @return array
 */
function array_intersect_any()
{
    $list = call_user_func_array('array_merge', array_filter(func_get_args(), 'is_array'));
    $count = array_count_values($list);

    return array_unique(array_filter($list, function ($l) use ($count) {
        return $count[$l] > 1;
    }));
}

var_dump(array_intersect_any($a, $b, $c));
/*
array(3) {
  [0]=>
  string(4) "hoge"
  [1]=>
  string(4) "fuga"
  [4]=>
  string(4) "piyo"
}
*/
aws周りのメモ5


## dynamodbを使ってみる

AWS DynamoDBのメモ - Qiita
https://qiita.com/YukiMiyatake/items/c3f13d32d90d15e5cfe0

Lambda(js)とDynamoDBを連携する - Qiita
https://qiita.com/kojiro_ueda/items/303f2466e11b55e5ec21

DocumentClientをつかうといいのね

メモ書き直感的に理解

## amazon elasticsearch service

AWS LambdaからAmazon Elasticsearch serviceを利用する
https://wp-kyoto.net/using-aes-for-alexa-skills-datasource

lambdaからだと権限は設定できそうだけど、でも標準でなく自分でライブラリを入れる必要があるか。

Quick Start | elasticsearch.js | Elastic
https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/quick-start.html

jsライブラリ

## lambdaとdocker

suddi/claudia-local-api： Command line utility to launch Express local API for claudia-api-builder. Test drive your lambda functions before deployment (https：//www.npmjs.com/package/claudia-local-api)
https://github.com/suddi/claudia-local-api

macだとうまくうごかせなかった
dockerで動かす

danlynn/claudia - Docker Hub
https://hub.docker.com/r/danlynn/claudia/

こちらはローカルで動かすというよりデプロイとリモートへのリクエストっぽいかな

初めてのAWS Lambda（どんな環境で動いているのかみてみた） - Qiita
https://qiita.com/ch7821/items/e3831e0dd67a30a13eca




amd64/node - Docker Hub
https://hub.docker.com/r/amd64/node/

node - Docker Hub
https://hub.docker.com/_/node/
	
trentm/node-bunyan： a simple and fast JSON logging module for node.js services
https://github.com/trentm/node-bunyan

出力を綺麗にできる

## cognito

CognitoのWebサイトログインをES6で書く - Qiita
https://qiita.com/honmaaax/items/93945a5f98a2429d2dda

jsのライブラリがあるっぽい

## aws amplify

AWS Amplify
https://aws.amazon.com/jp/amplify/

公式

AWS Amplify CLIの使い方〜インストールから初期セットアップまで〜 - Qiita
https://qiita.com/Junpei_Takagi/items/f2bc567761880471fd54

基本

Try #020 – CognitoとAmplifyでフロントエンドのみでログイン機能を構築してみた | dayjournal memo
https://day-journal.com/memo/try-020/

cognitoの認証ができるっぽい

AWS Amplify+Angular6+Cognitoでログインページを作ってみる ~バックエンド編~ ｜ DevelopersIO
https://dev.classmethod.jp/cloud/aws/aws-amplify-angular6-cognito-loginpage-backend/

AWS-Amplifyの中身、とくにAuth - たれぱんのびぼーろく
https://tarepan.hatenablog.com/entry/2018/05/23/135402

amazon-cognito-identity-jsがamplifyに統合されたのか
gatewayのオーソライザーで設定できるのね。。
Vue.jsのデバッグを快適にする（VScode+Chrome or FireFox）

# 参考
https://jp.vuejs.org/v2/cookbook/debugging-in-vscode.html
https://qiita.com/hashimoto-1202/items/c81f5d4c271eef16d957

# 環境
vue-cli(この記事では3.0以上)
VScode
Chrome または FireFox

# Debugger for Chrome/FireFox(VSCode拡張機能)
## インストール
以下リンク、またはVSCodeの拡張機能検索からインストール
[Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome)
[Debugger for Firefox](https://marketplace.visualstudio.com/items?itemName=hbenl.vscode-firefox-debug)

インストール後、vue-cli3で作成したプロジェクトフォルダ直下に
vue.config.js を作成し以下を記述する。


```javascript:vue.config.js
module.exports = {
  configureWebpack: {
    devtool: 'source-map'
  }
}
```

VSCodeのデバッグビュー→歯車アイコンをクリックしlaunch.jsonファイルを開き
以下を記述する。
![スクリーンショット 2019-03-01 22.13.16.png](https://qiita-image-store.s3.amazonaws.com/0/230281/b5a94378-3bf0-b5c0-b17d-de85a371f3cd.png)


```json:launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "vuejs: chrome",
      "url": "http://localhost:8080",
      "webRoot": "${workspaceFolder}/src",
      "breakOnLoad": true,
      "sourceMapPathOverrides": {
        "webpack:///./src/*": "${webRoot}/*"
      }
    },
    {
      "type": "firefox",
      "request": "launch",
      "name": "vuejs: firefox",
      "url": "http://localhost:8080",
      "webRoot": "${workspaceFolder}/src",
      "pathMappings": [{ "url": "webpack:///src/", "path": "${webRoot}/" }]
    }
  ]
}
```
## 機能
* F5(メニュー→Debbug→StartDebugging)でブラウザ起動とlocalhost:8080の表示
npm run serve などをあらかじめ動かしておく必要あり
![スクリーンショット 2019-03-01 22.06.02.png](https://qiita-image-store.s3.amazonaws.com/0/230281/7ace6995-8aa9-2fe6-3cb6-8fc14a4dcbe1.png)
起動ブラウザは左上でlaunch.jsonファイル記載のものが選択可能。
![スクリーンショット 2019-03-01 22.37.32.png](https://qiita-image-store.s3.amazonaws.com/0/230281/c9a30651-7bf0-513b-30db-54ac1456189f.png)


* ブレイクポイントの設定が可能
行番号の左をクリックしてブレイクポイント設定


# Vue Devtools(Chrome/FireFoxアドオン)
## インストール
以下リンク、またはブラウザのアドオン検索からインストール
[Vue.js devtools(Chrome)](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd)
[Vue.js devtools(FireFox)](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/)

Chromeの場合インストール後に拡張器の設定を開き
「ファイルのURLへのアクセスを許可する」を有効にする。
![スクリーンショット 2019-03-01 22.33.01.png](https://qiita-image-store.s3.amazonaws.com/0/230281/b58ea459-52bf-0ed1-9e40-6c1e0a65509f.png)


## 機能
デベロッパーツールにvueタブが追加され
component内のデータなどが参照できる。
![スクリーンショット 2019-03-01 22.53.02.png](https://qiita-image-store.s3.amazonaws.com/0/230281/465340b8-7b1e-ccb2-bc83-edd299444109.png)
![スクリーンショット 2019-03-01 23.04.49.png](https://qiita-image-store.s3.amazonaws.com/0/230281/1810096e-9ba3-ba25-7c98-fba6cc5b9def.png)
Gitのやり方　Pushまで

**Gitの登録からPushまで**
こちらが参考になります。
・https://qiita.com/KosukeQiita/items/cf39d2922b77ac93f51d
・https://qiita.com/yo_dazy/items/3c5d027341ab6a03e4c4



**Gitで fatal: remote origin already exists. というメッセージが出る場合**
こちらを参照すれば出来ます
http://pyoonn.hatenablog.com/entry/2014/10/29/191744
iTerm2にIcebergを適用したら色が変わっていなかった件について

# 結論
[iTerm2 by aseom](https://github.com/aseom/dotfiles/blob/master/osx/iterm2/iceberg.itermcolors)を入れたら解決した。

# デフォルトのカラースキームから変わっていないのでは？？？
ターミナルのカラースキームで[Iceberg](https://cocopon.github.io/iceberg.vim/)を愛用している方も多いかと思います。

私は最近ターミナルをiTerm2に変更しました。
そしてカラースキームをIcebergにしようかと思い`iTerm2 Iceberg`でググって上位に出てきたページをいろいろと見ていると[Iceberg-iTerm2](https://github.com/Arc0re/Iceberg-iTerm2)が薦められていたのでインポートしました。
しかし，iTerm2のデフォルトのカラースキームから色が変わっているようには見えず，とてもIcebergのカラースキームではありませんでした。

iTerm2の設定をよく見てみるとどうやらBrightのカラースキームだけデフォルトのカラースキームと同じ模様。
[Iceberg-iTerm2](https://github.com/Arc0re/Iceberg-iTerm2)の`iceberg.itermcolors`を見るとBrightのカラースキームは定義されていませんでした。

# 公式からリンク貼ってありました

最初は自前で色を設定していこうと思ったのですが，ふと思い立って[公式のGithub](https://github.com/cocopon/iceberg.vim/)を見てみるとFor other environmentsの中に[iTerm2 by aseom](https://github.com/aseom/dotfiles/blob/master/osx/iterm2/iceberg.itermcolors)として紹介されているものがあったのでそれをインポートしてみるとちゃんとBrightのカラースキームまで定義されているようで，無事IcebergをiTerm2に適用することが出来ました！
【Rails】ルーティングは上から順に処理されるよという話

##ルーティングでハマった
```routes.rb
get '/users', to: "users#index"
post '/users', to: "users#create"
get '/users/:id', to: "users#show"
get '/users/new', to: "users#new"
```

このようなルーティングを設定していました。
すると、/users/newに飛んでほしいときもなぜかshowメソッドが呼び出されてしまいハマってました。

パラメーターを見てみると、
```
"id"=>"new"
```
ご丁寧にidがnewになりshowで処理されていました。

##対処法は簡単
```routes.rb
get '/users', to: "users#index"
post '/users', to: "users#create"
get '/users/new', to: "users#new"
get '/users/:id', to: "users#show"
```
対処法はいたって簡単でnewとshowの順番を入れ替えただけ！
ルーティングは上から処理されるのでnewメソッドをshowより上にしとけばきちんと処理されます。

単純なことですが、ルーティングの仕組みを理解してないとハマってしまうと思うのでここで共有させていただきました。

##参考記事
・[Rails のルーティング - Rails ガイド](https://railsguides.jp/routing.html)
【激初心者】知識ほぼゼロUnity～インストールと基本レッスン～

# はじめに
Unityを2日前ほどから弄り始めたけど、成果物を見せる相手が
ペットの犬くらいなもので、空虚なものを感じたためにネットに備忘録を残す。
まずはインストール及びネットに転がる基本レッスンをいくつかしたので、
どのサイトが良いかなどを書き残しておく。

# インストール
[ここからダウンロード](https://unity3d.com/jp/get-unity/download)出来る。
※Unity Hubを選ぶこと。Hubの方が後々の管理や日本語化がしやすくなる。

色々と選択肢があるけど取り敢えずPersonal版かつデフォルト選択肢を選べばOK。
コンポーネントセレクションで日本語を選んでおくと、後々エディタから日本語化出来る。
足りない追加機能はUnity Hubから簡単にインストール出来るので無問題です。

> 参考サイト
> [公式マニュアル](https://docs.unity3d.com/ja/2018.1/Manual/GettingStartedInstallingHub.html)
> [【Unity】Unityエディターを日本語化する方法](http://tsubakit1.hateblo.jp/entry/2018/05/07/222059)

#まずはブロック崩しを作るところから
下記サイトが非常に分かりやすかった。
[超初心者向けUnityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で] (https://qiita.com/JunShimura/items/cbb0db8087a5cc75735e)
ここで基本的な操作方法の感触を掴めました。

# おわりに
今の所先人が作った偉大なる道を後からなぞってるだけなので、
本記事では参考リンクしか無くて申し訳ありません。
現在は勉強のためにマリオライクな2Dゲームを作っているので
それについての記事を書く予定です。
将来的にはElonaとかWizardryみたいなゲームを作りたいなあと。
[論文紹介]Convolutional Neural Network with Layer Reuse

CNNの畳み込み層を再利用することにより、パラメータ数とメモリ使用量の大幅な削減を可能にする論文を読んだので要点をまとめます
# 論文リンク
最初にリンクを貼っておきます
pdf
https://arxiv.org/pdf/1901.09615.pdf
github
https://github.com/okankop/CNN-layer-reuse/tree/master/models

# 論文の概要
## 1. Introduction
AlexNetの最初の層の重みを可視化すると、色付けしたところのように、かなり似た重みが多い(**Fig 2**)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262908/6af97a61-245c-1b33-dfae-d0668a77dc62.png)

そのため、多くのConvolution層を用意してもそれは無駄なのではないか？
下の図のように、**Convolution層を再利用**すれば、パラメータの数やメモリ使用量の削減に繋がるのではないか？ (**Fig 1**)
これを以降、**Layer Reuse Network (LruNet)** と呼ぶことにする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262908/a111bf9a-e4ab-1ab1-201f-ea14c69dc298.png)

## 2. Approach
### 2.1 Layer Reuse (LRU)
層の再利用(Layer Reuse)は以下のように行う(**Fig 3**)
DwConvとPwConvを順に作用させ、それと入力をconcatさせて、Channelをシャッフルする

* PwConvの`group=8`は実験的に求められた値である
* `Channel Shuffle`は、[suffleNet](http://openaccess.thecvf.com/content_cvpr_2018/papers/Zhang_ShuffleNet_An_Extremely_CVPR_2018_paper.pdf)　を参考にしたが、元々の実装では最初と最後のチャンネルがシャッフルされないままだったので、単純にチャンネルの前半と後半を入れ替えてシャッフルした

(注) DwConvとPxConvについて参考
DwConv(depth wise convolution)
https://www.robotech-note.com/entry/2017/12/27/084952
PxConv(pixel wise convolution)
https://www.robotech-note.com/entry/2017/12/24/191936
![image.png](https://qiita-image-store.s3.amazonaws.com/0/262908/64369666-9c48-feb9-f8f6-3b084e265cb7.png)

### 2.2 NetworkArchitecture
LruNetのアーキテクチャは以下のようになっている （**Table 1**)

* Nは何回LRU Blockを繰り返すかを示している。
* この表には記載されていないが、$\alpha$(width multiplier)という変数があり、これは最初のConv層の出力を何倍にconcatして広げるかという値である。(githubに`width_mult`という変数名で書かれているのでそちらを参照するとわかりやすい）

これらをまとめて、**N-LruNet- αx**という名前で呼ぶこととする。

<img src="https://qiita-image-store.s3.amazonaws.com/0/262908/c9ce3225-ef23-4d54-14ad-8f16f8e2e59e.png" width="500">

## 3. Experiments
**Table 2**は各種類のLruNetのCIFAR10での精度を示している。
14-LruNet-1xがもっとも精度が良く、それ以上にNを大きくしても精度の向上は見られなかった。
Convolution層のパラメータ数はどれも等しく125kであるが、Nの値が大きくなるにつれパラメータ数が増加しているのは、Bach Normalization層が増えていくからである。
<img src="https://qiita-image-store.s3.amazonaws.com/0/262908/9ce5e286-417f-a56e-3258-54ce542c899e.png" width="500">

**Table 3**はchannel shufflingを加えた場合を加えなかった場合の精度を示している。
channel shufflingを行なったほうが精度が良くなることがわかる。
<img src="https://qiita-image-store.s3.amazonaws.com/0/262908/0d29a1c1-fa4d-8b63-606f-87ed5f88d0d6.png" width="500">

**Table 4**: パラメータ数をかなり抑えて同等の精度が出せる
<img src="https://qiita-image-store.s3.amazonaws.com/0/262908/4e4cbe86-6752-cd87-5c97-dd655db6b591.png" width="500">

**Table 5**: CIFER-100で実行した結果
width multiplierを2にしてdropoutを0.7にあげて実行している
<img src="https://qiita-image-store.s3.amazonaws.com/0/262908/8d3a8e24-f5b6-6210-1b31-38bbb91f120e.png" width="500">

**Table 6**: Fashion MNISTでの結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/262908/6e4dc4c2-5f81-141d-5a86-a9422e24b16a.png" width="500">

**Table 7**:各データセットでの実行結果のまとめ
LruNetはパラメータ数は小さいが、ほかのモデルとほぼ同等の性能を持っている
<img src="https://qiita-image-store.s3.amazonaws.com/0/262908/dc40f0a2-c6ff-5c8a-82b2-5cf56c50b135.png" width="500">
MacにVSCodeを使ったRuby on Railsチュートリアル環境を作成

##背景

[Ruby on Rails チュートリアル](https://railstutorial.jp) 2週目のため
Cloud9ではなく、ローカル端末内に環境を作成しました。
VSCodeを選択した理由は、使ったことがなく
使ってみたかったからです。

##使用環境
- MacBook Pro (15-inch, 2018)
- macOS Mojave 10.14.3
- VSCode 1.31.1

##VSCodeのダウンロード

https://code.visualstudio.com/
「Download for Mac」クリック
（Stable版のダウンロードが開始）

Stable：「安定版」
Insiders：「最新版」

Insiders版は新機能やバグフィックスが先取りされているが
動作が不安定とのことなので、Stable版を選択しました。

##VSCodeの日本語化
<img width="612" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/339369/82f84ddb-b734-2c57-386f-8fe8ea0826f3.png">
左の赤矢印のアイコンをクリックし、検索欄に"Japanese"と入力すると　
「Japanese Language Pack for」が出てくるので"Install"を選択。

<img width="656" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/339369/9ee70c48-82f9-ee4a-f0ae-56d93a8db287.png">
"Install"をクリックする。

<img width="454" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/339369/75665c8b-d3ef-d749-71bf-db763160cb52.png">
メッセージが表示されるので"Restart Now"をクリック。

VSCodeが再起動されたら、日本語表示に切り替わっています。

##拡張プラグインの追加
日本語化の方法と同じく、拡張プラグインで
Ruby開発に適したプラグインをインストールする。
※とりあえず最小限にしてみました。

###[Ruby](https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby)
各種gemを使用するため、必ず入れること。

###[vscode-icons](https://marketplace.visualstudio.com/items?itemName=robertohuertasm.vscode-icons)
各ファイルの拡張子で判断して、アイコンを表示してくれる。

###[endwise](https://marketplace.visualstudio.com/items?itemName=kaiwood.endwise)
正しいインデントレベルを保ちながら
Rubyコードの構造に"end"を追加してくれる

###[ruby-rubocop](https://marketplace.visualstudio.com/items?itemName=misogi.ruby-rubocop)
Rubyのコーディング規約に準拠しているかチェックすることのできる”rubocop”が使用できる。
”rubocop”については[こちら](https://qiita.com/t-vinn/items/fe57b5d6440712016742)を参照。

##Ruby on Railsの環境構築
・Homebrewのバージョンアップ
・rbenvのインストール
・Rubyのバージョンアップ(2.3.7 → 2.6.0)
・MySQLのインストール
・Railsのインストール

これらは、以下の記事を参考にしてインストールしました。
[Ruby初学者のRuby On Rails 環境構築【Mac】 - Qiita](https://qiita.com/TAByasu/items/47c6cfbeeafad39eda07)

Ruby on Railsはチュートリアル内にて、

自分がおこなったときの補足ですが
Homebrewを1.9.2から2.0.2にバージョンアップするとき
フリーズしているのでは？と思うくらい時間がかかりました。

進捗を確認するため、以下のコマンドを実行しました。

```
brew update -v
```

また、Rubyのバージョンがアップデートされなかったので
以下の記事を参考にして進めました。
[MacのターミナルでRubyをバージョンアップする方法 - Qiita](https://qiita.com/Ficus/items/bdef5c2b504d7a4008fb)

途中、Railsのインストールも手こずったのですが
こちらで解決しました。
[railsをインストールできない - Qiita](https://qiita.com/Arashi/items/ae982df5e534fd4bc97a)


##その他

チュートリアルを進めていき
必要なもの、便利なものを見つけた際は
こちらに反映させていく予定です。

何かおすすめの拡張機能、設定方法などがありましたら
教えていただけますと幸いです。
jQuery $.Deferredのthen,done,fail,alwaysの使い分けメモ

$.Deferredは非同期処理を行うための便利なモジュールですが、
その使い方についてはYahooデベロッパーネットワークの [爆速でわかるjQuery.Deferred超入門](https://techblog.yahoo.co.jp/programming/jquery-deferred/)がとても分かりやすくお世話になりました。

非同期処理を時系列で記述できるのでとても便利ですが、主に使う4つのメソッドの使い所についての自分メモ書きです。


# resolved,rejected時の動作を同時に定義できるthen() 
promiseオブジェクトが、resolveにもrejectにもなる場合、
then()でそれぞれの時のコールバックを定義します。

```javascript:
function hoge() {
  let defer = $.Deferred();
  if (isFuga()) {
    defer.resolve();
    return true;
  } else {
    defer.reject();
  }
  return defer.promise();
}

hoge().then(
  /**
   * resolve時の動作
   */
  function() {
    return $.Deferred().resolve().promise();
  },
  /**
   * reject時の動作
   */
  function() {
     return $.Deferred().resolve().promise();
  }
).then(
/**
   * resolve時の動作
   */
  fucntion() {
     return $.Deferred().resolve().promise();
  },
  /**
   * reject時の動作
   */
  function() {
     return $.Deferred().resolve().promise();
  }
);
```

例の関数が非同期処理ではないのですが・・
例えばAjaxを使って外部リソースを取得しその結果次第で処理を変えたい場合があるときに使うと便利です。

第2引数のreject時のコールバックは省略もできます。


# resolvedで実行されるdone()

 `then()` でもresolve時の動作を定義できますが、`then()` と違うのは、 `done()` を連結してもそれは順次実行されないことでしょうか。

```javascript:
// hoge()が返すpromiseがresolveだとする
hoge().then(
  /**
   * resolve時の動作
   */
  function() {
    // 実行順1
    return $.Deferred().resolve().promise();
  },
  /**
   * reject時の動作
   */
  function() {
    return $.Deferred().reject().promise();    
  }
).then(
  /**
   * resolve時の動作
   */
  function() {
     // 実行順2
     return $.Deferred().resolve().promise();
  },
  /**
   * reject時の動作
   */
  function() {
     return $.Deferred().resolve().promise();
  }
).done(
  function() {
    // 実行順3
    // このdoneと下のdoneは同時に実行されます
  }
).done(
  function() {
    // 実行3
    // このdoneと上のdoneは同時に実行されます
  }
);
```

[爆速でわかるjQuery.Deferred超入門](https://techblog.yahoo.co.jp/programming/jquery-deferred/)にも書かれていましたが、 `done()` を複数書いても、それは `done()`のコールバックを2つ定義しただけで、順次実行にはなりません。


# rejectedで実行されるfail()

`fail()` は　コールバックの中で新たにresolvedなpromiseをreturnしない限り、rejectedが継続されるため `done()` は実行されません。try-catchの catchのイメージ。


```javascript:
// hoge()が返すpromiseがrejectedだとする
hoge().fail(
  function() {
     // 実行1
     // 失敗時の処理
  }
).done(
  function() {
    // 実行されない
  }
);
```

# 必ず実行されるalways()

最後の後始末処理に使える `always()` 。
rejectedでもresolvedでも実行されるので、成功・失敗に関わらず実行したい処理があるときに使います。
try-catch でいえば、finally。

```javascript:
// hoge()が返すpromiseがrejectedだとする
hoge().fail(
  function() {
     // 実行1
     // 失敗時の処理
  }
).done(
  function() {
    // 実行されない
  }
).always(
  function() {
    // 実行2
    // 後始末の処理
  }
);
```
providerName="System.Data.EntityClient" にしているのに System.ArgumentException: 'Keyword not supported: 'metadata'.' が出る話

# providerName="System.Data.EntityClient" にしているのに System.ArgumentException: 'Keyword not supported: 'metadata'.' が出る話

ASP.NET MVC で Entity Framework な Web アプリを Azure App Service に載せたら System.ArgumentException: 'Keyword not supported: 'metadata'.' が出て動かない.
接続文字列の providerName="System.Data.SqlClient" を providerName="System.Data.EntityClient" にすれば OK という記事がググるといっぱい出てくるが既になっている.
何故? 何故?

答え: Azure ポータルで、Azure App Service のアプリケーション設定の接続文字列を設定するとき、種類に SQL Azure を選んでいた.
Azure SQL Database を使うからとよく考えずにこれを選んでいたが、ここは providerName 相当の設定箇所であり、SQL Azure を選んだことにより System.Data.SqlClient 相当で上書きされてしまっていた. Entity Framework を使うときは、ここは Custom を選ぶのが正解.
macOS+Node.js+OpenCV環境の構築

## 前提

OpenCVで遊ぶならPython環境が鉄板だと思います。

本稿はそれでもNode.jsからOpenCVを使いたい人向けの記事です。

## Node.js+OpenCVの選択肢

Node.jsからOpenCVを使いたい場合、ライブラリとして主な選択肢は次の2つになります。

- [opencv \- npm](https://www.npmjs.com/package/opencv)
- [opencv4nodejs \- npm](https://www.npmjs.com/package/opencv4nodejs)

前者はOpenCV version 2、後者はOpenCV version 3のライブラリになります。

前者は全然メンテされていません。最新バージョンの6.0.0リリースから2年経っています。後者はそこそこメンテされていそうです。

OpenCV3の方が画像まわりのAPIが増えているらしいので、顔認識をしたい場合は後者を使った方が良い可能性があります。

前者の方がネット上の利用例は多そうですが、Pythonに比べたら利用例は圧倒的に少ないので、その意味では五十歩百歩かもしれません。

## macOSで使おう

さて、上記ライブラリのうち、前者のライブラリ opencv をmacOS上で使おうと思うとイマイチうまくいきません。ネット上で調べてみても失敗事例が多い気がします。

後者のライブラリ opencv4nodejs は次のようにすれば使えます。

```
$ brew install cmake opencv@3
$ brew link --force opencv@3
$ export OPENCV4NODEJS_DISABLE_AUTOBUILD=1
$ npm i opencv4nodejs
```

`brew link` するのはカッコ悪いんですがlinkしないと正しく動くバイナリが作れませんでした。

## 動作確認

ビルドがうまくいっているか、動作確認してみましょう。

```
$ curl http://www.lenna.org/len_std.jpg -o lenna.jpg
```

で有名なLennaさんの画像を用意した上で

```javascript:lenna.js
const cv = require('opencv4nodejs');

const img = cv.imread('./lenna.jpg');

const classifier = new cv.CascadeClassifier(cv.HAAR_FRONTALFACE_ALT2);

const grayImg = img.bgrToGray();

const result = classifier.detectMultiScale(grayImg);

if (!result.objects.length) {
  throw new Error('failed to detect faces');
}

const minDetections = 10;
result.objects.forEach((faceRect, i) => {
  if (result.numDetections[i] < minDetections) {
    return;
  }
  const rect = cv.drawDetection(
    img,
    faceRect,
    { color: new cv.Vec(255, 0, 0), segmentFraction: 4 }
  );
});
cv.imshowWait('result', img);
```

上記スクリプトを実行すると次のウインドウが現れます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/46856/c5309d30-e3ba-45ab-b34c-fa6f4de9a8d6.png)

成功です。やりましたね。