OmniAICreator/Qiita-1.07M huggingface dataset:
【CSS】「もっと見る」ボタン(使い切り)をCSSだけで実装

## こんなときに使える
1. 連続するアイテムがあり、その表示数を最初の数個に制限し、それ以降を隠したい。
2. 「もっと見る」ボタンを置いておき、それを押すことで全表示させる。
3. 「もっと見る」ボタンは押すと消え、折り畳む必要はなし。使い切りタイプ。
4. jsは使わず、cssだけでサラッと作りたい。


## ソースコード (pug, scss
```pug
.wrap
  input.check#isMore(type="checkbox", name="")
  label.label(for="isMore") もっと見る
  .itemWrap
    .item アイテム1
    .item アイテム2
    .item アイテム3
    .item アイテム4
    .item アイテム5
    .item アイテム6
    .item アイテム7
    .item アイテム8
```

```scss
.wrap {
  position: relative;
}

.itemWrap {
  margin: 30px auto;
}
.item {
  color: #fff;
  width: 100px;
  height: 100px;
  background-color: #555;
  margin: 0 auto 30px;
  &:nth-child(n+5) {
    display: none;
  }
}

.check {
  display: none;
  &:checked {
    & + .label {
      display: none;
    }
    & ~ .itemWrap .item:nth-child(n+5) {
      display: block;
    }
  }
}
.label {
  border: 1px solid #444;
  padding: 8px 12px;
  border-radius: 20px;
  position: absolute;
  bottom: -70px;
  left: 50%;
  transform: translate(-50%);
  cursor: pointer;
  &:hover {
    background-color: #444;
    color: #fff;
  }
}
```

## 解説
### 基本
inputタグによるチェックボックスを使う。
「もっと見る」ボタンを、inputタグのラベルとして用意する。

> ラベルとは、
> クリックすると対応するinputタグに自動フォーカスするタグ。
> http://www.htmq.com/html/label.shtml

ボタンを押すとチェックボックスがオンになる。
チェックボックスがオンの状態のとき、隠れているアイテムを表示するようcssを書く。

### 詳細

#### HTML
```pug
.wrap
  input.check#isMore(type="checkbox", name="")
  label.label(for="isMore") もっと見る
  .itemWrap
    .item アイテム1
    .item アイテム2
    .item アイテム3
    .item アイテム4
    .item アイテム5
    .item アイテム6
    .item アイテム7
    .item アイテム8
```

表示したいアイテム部分を囲うdivとの兄弟要素として、`input`や `label`を置く。
`input`側にはidを指定し、それを`label`の`for`属性でid名を記述する。これによりラベルがチェックボックスに紐づく。

これらはアイテム部分を囲うdivの前に書く。
`label`部分の配置は、絶対配置を使いたいため、更に外側にdivを用意しておく。

#### itemの非表示
```scss
.item {
	//省略
 &:nth-child(n+5) {
    display: none;
  }
}
```

今回は、初期表示を4個とする。（=5個以降を非表示

#### チェックボックス
```scss
.check {
  display: none;
  &:checked {
    & + .label { //---1
      display: none;
    }
    & ~ .itemWrap .item:nth-child(n+5) {//---2
      display: block;
    }
  }
}
```

チェックボックスは、今回の機能実装のために用意した要素なので、見えている必要はない。よって、まずデフォルトで`display: none;`。

チェック状態は `:checked`で取れる。
この中で、チェックon状態のCSSを記述する。

1. まず、ラベル（＝もっと見るボタン）は使い切りなので、チェックonでは消す。隣接セレクタ（`+`）を使って指定。
2.  itemの表示を指定。サンプルでは、チェックボックスの以降にある兄弟要素の、`itemWrap`の中にある`item`の5番目以降…と書いている。
兄弟セレクタ（`~`）を使っている。

※セレクタではあくまで兄弟を指定することしかできないため、itemを指定する際も、兄弟(itemWrap)の中にある〇〇(item)という書き方をしなければいけない。

> セレクタの使い方、チートシート
>  [https://webliker.info/css-selector-cheat-sheet/](https://webliker.info/css-selector-cheat-sheet/) 


#### ラベル
```scss
.label {
  //省略
  position: absolute;
  bottom: -70px;
  left: 50%;
  transform: translate(-50%);
  cursor: pointer;
}
```

ラベルはボタンぽい見た目に。
絶対配置で、itemWrapの下辺りに置いておく。


## 実装サンプル in codepen
https://codepen.io/dorara_css/pen/xNpovK?editors=1100

一度ボタンを押すと消えてしまうので、ボタンを復活させるときはリロードを。
Dockerでlaravelの環境構築

# Dockerを使用したlaravel環境構築
`laradock`を使用することで簡単にlaravelの環境構築をすることができるので、以下に手順をまとめる。

# 開発環境
MacOS Mojave
既に`Docker` `Git`はMacに導入済として下記記述します。

# laradockのダウンロード
Gitを使用して、任意のフォルダにlaradockをダウンロードします。

```
git clone https://github.com/Laradock/laradock.git
// laradockへ移動
cd laradock
// 公式ページの記載通り、下記コマンドを入力
cp env-example .env
```
[Laradock公式サイト](https://laradock.io/)

Mysqlのバージョンを指定（現行最新版の8だと、通常とは違う認証になり、詰まる可能性大。指定がなければ、5.7を使用したほうが無難）

```
//　.envを開き、"MYSQL_VERSION=latest" を以下のように変更
MYSQL_VERSION=5.7
```

# コンテナの作成
開発に必要なプログラムを指定し、コンテナを作成。なお、プログラムを指定しないとすべてのコンテナを作成しようとするため、時間がかかります。
通常のlaravel開発であれば、下記コマンドの指定で問題ないかと思います。

```
docker-compose up -d nginx mysql workspace phpmyadmin
```

終了後、`http://localhost`にアクセスすると、`404 Not Found`が表示されます。
これにより、Nginxに無事アクセスできたことが確認できます。

# laravelアプリの作成

コンテナの`workspace`内にて、laravelアプリを作成します。

```
// docker ps にて、workspaceのコンテナID確認後、下記コマンドでコンテナ内に入る
docker-compose exec -it workspaceのコンテナID bash
// コンテナに入り、"/var/www$"にて、下記コマンドを実行。バージョンは5.5以外でも変更できます。
composer create-project laravel/laravel sample --prefer-dist "5.5.*"
```

これによって、`sample`というアプリファイルが作成されます。
次に、laradockディレクトリの`.env`に、このアプリを作成したことを伝えるため、下記のように記述します。

```
### Paths #################################################

# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../sample
```

設定を反映させるため、dockerを再起動させます。

```
// 停止
docker-compose stop
// 再起動。以後は、nginxとmysqlのみを指定すればよい
docker-compose up -d nginx mysql
```

再度ブラウザで`http://localhost`にアクセスするとlaravelの画面が表示されます。

# MySQLとの接続
MySQLコンテナと、laravelのDB設定を合わせます。
`sample`フォルダ内の`.env`ファイルを開き、下記のように記述。
この内容はlaradockフォルダの`.env`内のMySQLの記述と合わせたものになります。

```
// laravelアプリ内の.envファイル
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
```

参考：laradockフォルダ`.env`のMySQL記述内容

```
### MYSQL #################################################

MYSQL_VERSION=5.7
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
```

再度、`workspace`コンテナに入り、migrateを実行

```
php artisan migrate
```

MySQLコンテナに入り、テーブルが確認できれば完了です。

```
mysql -u default -p -h 127.0.0.1
show tables from default
```

# 参照
[Laravel & Docker 環境構築 with Laradock](https://qiita.com/shunichi_com/items/9b09c5949233b88b9a4a)
[Laradockを使ったLaravel開発環境構築のやさしい解説](https://en-jp.wantedly.com/companies/scouter/post_articles/151939)
[Laradock公式サイト](https://laradock.io/)
Postfixのmessge_size_limitとmailbox_size_limit

毎月メールで送っているmp3ファイルがメールサーバ更改後送れなくなったという連絡があったので、message_size_limitを広げた。
この時に message_size_limit > mailbox_size_limit になっているとメールのローカル配送（転送含む）が一切行われなくなるので注意。なお、 mailbox_size_limit は main.cf に記載がなく、ログ見てて気づいた。罠。

```
message_size_limit = 102400000
mailbox_size_limit = 1024000000
```
html/css トレーニング

##htmlの基礎
```
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <link rel="stylesheet" href=" ">
  </head>
  <body>
    <div class="header">
      
    </div>
    <div class="main">
      
    </div>
    <div class="footer">
      
    </div>
  </body>
</html>
```
基本はこのフォーマットで全てが始まる！

##headタグについて
初心者の僕が解釈するにこのheadの中に入れる内容は、
ソース全体の設定みたいなものだと思う。

##bodyタグについて
ここにページの主な内容を書き込む
pandas CSVファイル・バッファの読み書き

# pandasでCSVファイルの読み込み

pandasのread_csv関数のパラメタがfilepath_or_bufferとなっていたので、
CSVファイルではなくbufferを利用する方法をメモしておく。

## ファイルを利用する
よく事例が転がっているタイプ。

### CSVファイルからDataFrameに読み込む
```python
import pandas as pd
df = pd.read_csv("in.csv")
```


### DataFrameをCSV形式でファイルに書き込む
```python
df.to_csv("out.csv")
```


## バッファを利用する
バッファを活用するパターンは事例がすぐにみつからない。

### バッファからDataFrameに読み込む
```python
import io
import pandas as pd

data = 'AAA,BBB\n1,2\n3,4'
df = pd.read_csv(io.StringIO(data))
```

### DataFrameをCSV形式でバッファに書き込む
```python
buffer = io.StringIO()
df.to_csv(buffer, index=False)    # indexを指定しないと行番号が出力される
print(buffer.getvalue())          # バッファの参照
```

```:実行結果
AAA,BBB
1,2
3,4
```

## 参考
[pandas 0.24.2 documentation » API Reference » Input/Output » read_csv](http://pandas.pydata.org/pandas-docs/version/0.24/reference/api/pandas.read_csv.html#pandas.read_csv)
Juliaで複雑ネットワークを可視化するにはGraphPlotがいいゾ

Keiです。自分は大学院で複雑系科学という領域の研究をしているのですが、そこでよくネットワーク(人間関係や感染症の広がりなど)を綺麗に可視化したい、という場面があります。
これまでそういうシーンではPythonのNetworkXに頼っていたのですが、最近研究で使うシミュレーションコードを全てPythonからJuliaに移行したのもあって**グラフ描画用のスクリプトもJuliaで書きたい!** という衝動に駆られていました。

そこでざっと調べてみたところJuliaでネットワークを可視化するためのパッケージは既に山ほど開発されており、僕が分かる範囲だけでもこれだけありました。

- [GraphPlot](https://github.com/afternone/GraphPlot.jl)
- [NetworkViz](https://github.com/abhijithanilkumar/NetworkViz.jl)
- [NetworkLayout](https://github.com/JuliaGraphs/NetworkLayout.jl)
- [Junet (α版)](https://github.com/inguar/Junet.jl)
- [TikzGraphs](https://github.com/sisl/TikzGraphs.jl)
- [GraphLayout](https://github.com/IainNZ/GraphLayout.jl)

通常のグラフ描画パッケージ(Gadfly, GR, PyPlot, Plotly, Plots, Makie, etc)に似て**色々あるけど結局どれが良いのか分からない**という状況です。

そこでひとまず判断軸として
1. 継続的にメンテナンスされている
2. ドキュメントが綺麗で充実している
3. 記述が簡潔
4. 静的な無向グラフが可視化できれば良い(有向グラフはめったに描かないし別にグラフをマウスでグリグリ出来なくていい)

の4つを設けた結果、GraphPlotを採用することにしました。まぁネットワーク分析系パッケージのコア部分であるLightgGraphsの[チュートリアル](https://nbviewer.jupyter.org/github/JuliaGraphs/JuliaGraphsTutorials/blob/master/Basics.ipynb)でもGraphPlotが使われてるくらいなんで1番手堅い選択かなという気はします。

以下LightGraphsで作ったネットワークをGraphPlotで可視化して画像ファイルにするまでの流れを説明します。

## 前提
Julia v1.0.0
IJulia v1.18.1

## 必要なパッケージ
- GraphPlot (ネットワーク可視化用ライブラリ)
- LightGraphs (ネットワークの生成に必要)
- Compose (グラフの保存に必要)
- Cairo (グラフをpngかpdfで保存したい時だけ必要。svgなら不要)
- Fontconfig (同上)

## パッケージのインストールと読み込み
まずはJuliaのREPLを立ち上げて]を押してpkgモードに入り、上で挙げたパッケージを全部入れます。

```shell
(v1.0) pkg> add GraphPlot
(v1.0) pkg> add LightGraph
(v1.0) pkg> add Compose
(v1.0) pkg> add Cairo
(v1.0) pkg> add Fontconfig
```
CairoとFontconfigを入れるときにエラーが大量に出るかもしれませんが動作には問題ないので無視してもらって大丈夫です。
次にpkgモードを抜けてJupyterを起動し, 必要なパッケージを読み込みます。

```shell
julia > using IJulia
julia > IJulia.notebook()
```

ここからはJupyter上で実行します。

```julia
using GraphPlot
using LightGraphs
using Compose
using Cairo
using Fontconfig
```
恐らくCairo, Fontconfig, Composeの読み込みでwarningを吐きますが無視して大丈夫です。
ここまでで準備が出来たので早速グラフを描いてみましょう。
サンプルとしてLightGraphsが提供しているbarabasi_albertグラフ(=BA-SFグラフ, スケールフリーネットワークの一種)を描画してみます。

```julia
# ノード数: 100, 平均次数: ~8 のBA-SFグラフを作る時の設定. 厳密にはこの設定だと平均次数は7.68になる。
g = LightGraphs.barabasi_albert(100, 4)
fig = GraphPlot.gplot(g)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227776/8cbbb32b-4350-3ff1-d76c-26f22aee7fc9.png" width=600>

**出来た!!簡単!!**
描画したグラフをpng形式で保存しておくには以下の一行でOK。

```
Compose.draw(PNG("barabasi_albert_graph.png", 10cm, 10cm), fig) # 引数で描画する際のグラフのサイズが指定できる
```

NetworkXと違って必要なパッケージがあちこちに散らばっているのが少し面倒ですが、一旦環境構築さえ出来てしまえばNetworkXと同じような感覚で使っていけそうです。

ノード・エッジにラベルを付けたり、ノードの大きさや色を変える方法も[公式ドキュメント](http://juliagraphs.github.io/GraphPlot.jl/)に綺麗にまとまっているので、見た目を細かく設定したい場合はそちらを参考にしてください。

次は外部データを読み込んでネットワークグラフを描く方法やマルチエージェントシミュレーションとの組み合わせ方について書こうと思います。

## 参考
http://juliagraphs.github.io/GraphPlot.jl/
https://github.com/JuliaGraphs/GraphPlot.jl
Rの演算子 %in% 

#1.はじめに
Rでデータやファイルを編集・加工してて役立ったので、備忘録も兼ねて投稿。

演算子　`%in%`　を使ってデータの処理。

`A　%in%　B`
A に B のデータがあれば TRUE 、なければ FALSE がかえってきます。

`! A　%in%　B`
逆パターンはこちら
A に B のデータがあれば FALSE 、なければ TRUE がかえってきます。


#２.まずはお手本データ
お手本データを作成。

```text:List1.csv
ID,NAME,Town,Age
1,A,Tokyo,27
2,B,Osaka,30
3,C,Nagoya,35
4,D,Tokyo,26
5,E,Osaka,41
```

```text:List2.csv
ID,NAME,Town,Age
1,A,Tokyo,27
3,C,Nagoya,35
```

csvファイルをRで読み込み

```R:R
List1 <- read.csv('List1.csv', sep=",",header=T)
List2 <- read.csv('List2.csv', sep=",",header=T)
```

#３.List1　と　List2、、、かぶってるデータ教えて
List1 の中に　List2　のデータあるかな？
（答え→　ID　１、３）


```R:R
List1$ID %in% List2$ID　#IDで検索
[1]  TRUE FALSE  TRUE FALSE FALSE　#１番目３番目がTRUE
```

重複している行（TRUE）だけのデータフレームを作ってみよう。

```R:R
List_1_2 <- List1[List1$ID %in% List2$ID,]
List_1_2
ID NAME   Town Age
1  1    A  Tokyo  27
3  3    C Nagoya  35
```

#４.List1　と　List2、、、かぶってないデータ教えて
List1 の中で　List2　のデータがないのはどれ？
（答え→　ID　2、4、5）

```R:R
! List1$ID %in% List2$ID　#先頭に　！
[1] FALSE  TRUE FALSE  TRUE  TRUE　#１番目３番目がFALSE
```

重複していない行（TRUE）だけのデータフレームを作ってみよう。

```R:R
List_1_2 <- List1[! List1$ID %in% List2$ID,]
List_1_2_
  ID NAME  Town Age
2  2    B Osaka  30
4  4    D Tokyo  26
5  5    E Osaka  41
```

#５.おまけ
結果データフレームをcsvで出力しましょう。

```R:R
out.name <- "List_1_2.csv"
write.table(List_1_2,file=out.name,quote=F,sep=",", row.names=F)
```

####補足
参考URL
[R マイナーな演算子 %in% で期間の重なりチェック](http://kenpg2.seesaa.net/article/416565274.html)

ひとりごと
データフレームの扱いは奥が深い。。。
WikipediaからCorpusを作る

最近、日本語解析をしっかりやろうと思い、日本語分析環境を作り始めました。
Python3系を開発ツールと考えています。

#### 環境
- MacBook Pro 15 2017
- macOS Mojave 10.14.4
- 2.8GHz Core i7
- Ram 16 GB

MeCabとNEologdをすでに入れてあります。

### 形態素解析と、SentencePieceを比べるが目的です
Wikipediaから日本語コンテンツをダウンロードする

コマンド　wgetでも curlでも　最新版指定
```
curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2
```
結構時間がかかる1時間程度　3GB程度です
#### ダウンロード後タグ除去する　WikiExtractor.py

WikiExtractor　　http://medialab.di.unipi.it/wiki/Wikipedia_Extractor
Gitから、 https://github.com/attardi/wikiextractor.git　
ダウンロードしてもクローンしても良い
```
$ git clone https://github.com/attardi/wikiextractor.git
```

ホルダーの中のWikiExtractor.pyを使えば良い
注意：Gitのinstallセクションで　python setup.py install と書いてあるが setup.pyが無いので無視

### WikiExtractor.pyを使って文章のみを切り出す
optional arguments:
 -h, --help            help
 -o OUTPUT, --output OUTPUT, output directory　出力ディレクトリー
 -b n[KM], --bytes n[KM]　defaultは1M　1つのCorpusサイズ
 -B BASE, --base BASE  base URL for the Wikipedia pages
 -c, --compress        compress output files using bzip
この程度分かれば使える

提供サイトのサンプルコードが分かり安い
extractedホルダーに、250Kで、Corpusを展開する
```
 $ WikiExtractor.py -cb 250K -o extracted itwiki-latest-pages-articles.xml.bz2
```
それを一つのテキストにまとめる
```
$ find extracted -name '*bz2' -exec bzip2 -c {} \; > text.xml

```

### sentencepieceのモデルを作成
$ pip install sentencepiece

モデルを作る
```python
import sentencepiece as spm
spm.SentencePieceTrainer.Train('--input=wiki.txt, --model_prefix=m --character_coverage=1.0 --vocab_size=32000')
```


なかなか上手くゆかない、Jupyter notebookではカーネルが落ちてしまう
メモリーとの関係で学習サイズを分解して実行しないといけない。
$ split -l 行数 対象テキスト 接頭子

Wikiならば学習されたモデルが公開されている
https://yoheikikuta.github.io/bert-japanese/
Vroidで作ったVRMをblenderでQuestのVRChatに対応させる。（ポリゴン編）

# 動機
Oculus QuestでVRChatが出来るようになりました。
しかしQuest本体のGPUが弱いため以下のようなアバターが推奨されています。

**・ポリゴン数は5,000まで**
**・マテリアル数は1つまで**
**・Draw callsは3まで**
**・ボーン数は66まで**
**・ダイナミックボーンはゼロ**
**・アバターサイズは10MBまで**
**・オーディオソースはゼロ**   >https://www.moguravr.com/vrchat-13/

Vroidで作ったモデルはアバターにもよりますが、おそらく**20000ポリゴン**、**15マテリアル**あるので、
そのままでは絶対に使うことが出来ません。
だから、なるべく**形を変えず**ポリゴン、マテリアルを減らしていきたいと思います。

#注意
**5000ポリゴンまで減らすのに、ギリギリまでポリゴンを削らないといけない**ので、髪が多いアバターは厳しいかもしれません。

　
#ポリゴンを減らす
　　　　![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404889/450b81a6-5071-d220-01e8-89e8e60c8f56.png)
まずBlenderにVRMファイルをインポートしてください。
https://github.com/iCyP/VRM_IMPORTER
からファイルを取ってきて、アドオンを入れると、インポートできるようになります。
参照>https://www.cg-method.com/entry/blender-import-vrm/

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404889/cf98ba4a-8257-1f41-26e1-c0e2ef10e3d4.png)
Body bakedを編集モードにしたのち、Pキーを押して、マテリアルでオブジェクト分割します。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404889/5460dabe-bc56-cc94-3743-f7f876d1b170.png)
服で隠れていて、いらない体の部分をBキーで箱選択して削除
**この方法で奥まで選択できます。http://webgl.akjava.com/blender/cut/yuya-aowo-xuan-zesuru**

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404889/9b4d838f-efa4-be02-9749-8da5246df7f7.png)
**オブジェクトモード**で残った体を移動。
頭の上の方も頂点を削除しましょう。（首は残す）

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404889/7c0203d4-1dfe-3c74-11a2-bb7765e83f0a.png)
頭のベースの髪も上は見えないので、削りましょう。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404889/841596a3-1049-4a23-6fc8-c877a688b9b6.png)
そして、やっとポリゴン数削減に入ります。**オブジェクトモードで**ペンチマークを押して、ポリゴン数削減をクリック。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404889/101570f0-d9dc-c47f-a8d5-d7ace693d1b2.png)
それぞれのオブジェクトで右の写真の右のほうにある、比率のバーを人の形がおかしくならない、ギリギリまで下げます。
そして、**必ず適用を押してください**。あとで顔面崩壊してしまいます。
**顔だけはやらないでください**　　　**手はVRで一番大事な部分なのでほどほどに**
#結果
![10_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404889/c0d71287-b5af-2184-911b-2f97a4c7b2f8.jpeg)
無事、4893ポリゴン！
ギリギリですが、5000ポリゴン以下に到達しました。

#最後に
あとはマテリアル統一ですが、これはまた今度書くので、
https://ch.nicovideo.jp/mikumiku_aloha/blomaga/ar1268900
これを見てください。
ありがとうございました。
Svelteっていういい感じのフレームワークを使って一瞬でNowる。Netlifyにも。

どうも、あんはるです。
Svelteいい感じだなぁと思ったので共有します。

#　Svelteって何ですか？
<img width="508" alt="スクリーンショット 2019-05-23 14.40.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188304/f8e97888-1c69-14ce-ac9f-5f56c253c43a.png">

<img width="422" alt="スクリーンショット 2019-05-23 14.39.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188304/75000291-9ae1-3812-33b7-526ea4e14167.png">

> Svelte is a tool for building fast web applications.

Svelteは、高速なWebアプリケーションを構築するツールです。
と、公式には書いています。

React、VueなどのVirtual Domで、クライアントで画面を表示するというアプローチとは異なります。

Svelteはビルド時に、理想的なJavaScriptのコードを吐いているのです。（ドノヨウニシテ速くなっているかは割愛）

よって、それらよりも速いWebアプリけションの構築を実現しています。

# 早速Svelteのアプリを構築しましょうね！

このコマンドで、一番シンプルなWebpackのテンプレートを導入できます。

```
npx degit sveltejs/template-webpack project-name
```

そして、即座にアプリを立ち上げられます。

```shell
cd project-name
npm installl # yarnでも可能
npm run dev
```

ここまではこれだけ。
<img width="1293" alt="スクリーンショット 2019-05-23 15.51.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188304/85c50ddc-adf2-7132-63c5-6bc8e80dd824.png">
<img width="1207" alt="スクリーンショット 2019-05-23 15.52.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188304/93452fee-69a9-496e-ace0-c843d0767079.png">


そして　http://localhost:3000 にアクセスすると、、


<img width="278" alt="スクリーンショット 2019-05-23 15.53.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188304/b175fc11-9908-6536-9498-85979d31129b.png">

Hello Worldできました！

## さあ、そしてNowっちゃいますか。

```
npm run build
cd public
now
```
ビルドして、nowと打つだけ。
<img width="955" alt="スクリーンショット 2019-05-23 15.56.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188304/20ffddbc-6ff8-703f-e119-5e593a0fd66e.png">

## わざわざNowじゃなくてもNetlifyでいいですよね。

```
cd public
netlify deploy
```
<img width="644" alt="スクリーンショット 2019-05-23 15.59.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188304/1c8e524e-83c8-eea4-0e10-4537ca2a3836.png">


## まとめ

**別にすぐにデプロイできるところがすごい！って言いたいわけじゃない**んですけど、すぐデプロイできるとモチベ**上がります**よね。
この勢いで、Svelteでなんか作って見ます。
PythonとTwitterAPIでTwitterクライアント的なのを作ったお話【びよりったー】

ヽ(廿Δ廿 )にゃんぱすー。情報系の学生をしております、なっぢです。
Qiitaの記事を書いてみたいと思ったので、[PythonでTwitterクライアントを作った](https://github.com/Na27i/biyoritter)話をします。

# 事の経緯
(ここは別に大事じゃないので読みたくなけりゃ飛ばしてもらって大丈夫です)

via芸のために愛用していた非公式クライアントが自分の引継ぎミスで使えなくなったのがきっかけです。

Twitterはやめたくないし、新しいクライアントを探すのも面倒なので、
Pythonの勉強も兼ねて自分で作ってみよう。という発想に至りました(？)。
以前、アプリケーションの登録をしていた。っていうのも大きかったです。

# 開発環境
Python 3.7.3

# コマンド一覧
実装したコマンドの一覧です。一応隠しコマンドもあります。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315731/42169fa9-a70f-b0f9-6058-2fb666f72bc1.jpeg)

(2019/6/5 追記)
最終的に実装したコマンドの一覧です。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315731/df18b2f0-92cc-1847-8347-79320875ca0f.jpeg)


### 置換コマンド
```:Example
>> おなかが減った-on
```

find関数を用いて文章中の置換コマンドを検索し、replace関数で置換します。
置換コマンドごとに検索を行うので、複数の置換コマンドにも対応しています。

### subコマンド
```:Example
>> おなかが減った-on
>> sub
```
任意の文章を入力後に実行するとツイートされます。このときのツイートがこちら。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315731/ebf8ffa1-4b1d-6a7e-0d8c-24f7d22ade46.jpeg "実行結果")

### mtlコマンド

```:Example
>> mtl
```
自分のツイートを表示するコマンドです。まともなツイートをしていないので実行結果は控えます。

### -mtlコマンド

```:Example
>> -mtl
>> 100
```
mtlコマンドとは違って、表示する数を指定できます(APIの仕様上、200件までですが)。
こちらも、まともなツイートをしていないので実行結果は控えます。

### srcコマンド
```:Example
>> src
>> にゃんぱす
```
検索コマンドです。リツイートとリプライは省いて表示します。

### img:コマンド
```:Example
>> img:XXXXXXX.png
```
知り合いが追加してくれたコマンドです。感謝。
Twitterでサポートしている一般的な画像ファイルであれば大丈夫(とのこと)です。
この記事の投稿時には複数画像をツイートする機能はありません。

### exitコマンド
```:Example
>> exit
```
プログラムを終了するコマンドです。

## 追加したコマンド群

### ersコマンド
```:Example
>> 誤字ってしまった分
>> ers
```
ツイートしたい文を間違えてしまったときに使うコマンドです。
Twitterでいう下書きの削除とほぼ同じと考えてもらえるとわかりやすいと思います。

### tlコマンド
```:Example
>> tl
```
タイムラインを表示します。

### -tlコマンド
```:Example
>> -tl
>> 100
```
タイムラインを表示します。
こちらは表示する数を指定できます(おそらくこちらも200件が最大)。

## 今後の展望

- タイムラインの表示機能を追加  
TwitterなのにTLが見れないのはどうなの。って感じなので早々に実装したいです。  
リプライとかリツイート(仕様上可能なのかは知らない)も実装したいと考えています。
- 現在ある機能のアップデート  
検索機能にオプション(Twitterでいうfrom)を追加したり、複数画像に対応させたいです。
- Webアプリケーション化

## おわりに
今まではPythonを避けていたのですが、今回の開発でなかなか面白い言語だなぁ。って思ったので
全く毛色の違うプログラムも書きたいと思います。

また、少しではありますが共同開発というものも体験でき、いい経験になりました。

拙い文章ではありましたがお読みいただきありがとうございました。
JIRAが遅いときの対応メモ

#####garbage collectionの強制を試してみる
　JIRA管理画面の　システム　→　システム情報
　　→　メモリーグラフ（画面中央にあります）
　　　　空きが少ない場合。garbage collectionの強制をクリック
　※効果は気休め程度です。。

#####JIRAの検索設定を変更してパフォーマンスアップをはかる
　JIRAの管理画面の　システム　→　一般設定
　　→ 設定の編集（画面右側にあります）
　　　●空のJQLクエリの無効化を**オン**にする（既定値オフ）
　　　 オフの場合はプロジェクト横断で全体検索された結果が表示
　　　 オンの場合は何も表示されない
　　　●検索結果の自動更新を**オフ**にする（既定値オン）
　　　 オンの場合はベーシック検索時、変更の度に検索が実行される
　　　 オフの場合はベーシック検索時、検索ボタンを押すまで検索が実行されない
　※こちらの検索設定は効果大です。

*JIRA Softwareバージョンは7.12.1*
プログラミング初心者がブックマークすべきおすすめのサイト集

#初めに
プログラミングの学習を続けていると、「このサイトもっと早くに知りたかった！」ということがままあります。
私がそういったことを何度も経験していて、これから学習する初心者には同じ轍を踏んでほしくないのでここでおすすめのサイトを7つ紹介します。
筆者自身も初心者ですので、情報不足ではありますがこれからも更新予定です。

###[Qiita](https://qiita.com/)
![qiita.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/1231cdda-f7b2-7168-c86b-40569ef40817.png)
あなたが今見ているこのサイトです。
登録していないなら是非登録しましょう。
毎日興味深い記事が更新されます。
技術的な記事を比較的簡単に書くこともできます。
###[ドットインストール](https://dotinstall.com/)
![dotinstall.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/a0759fda-b826-218d-e862-9780f9115777.png)
プログラミングを学習している人なら一度はお世話になるサイトです。
何よりも短い時間で概要を掴むことができるのが特徴です。
ただし手を動かさないと身につかないのでわかった気にならないように注意しましょう。
有料の講座もあります。

###[Progate](https://prog-8.com/)
![progate.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/2d9aba59-65d5-b7b7-f1b7-cbb209fb5ce2.png)
手を動かしながら学習できるサイトです。
HTML->CSS->Ruby->Ruby on Railsという順番で勉強すればWEBアプリを自分で作ることができるところまで学習を進めることができます。
挫折しにくいのでおすすめです。
ただしすべての講座を受講するためには月額980円が必要です。

###[Udemy](https://www.udemy.com/ja/)
![udemy.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/7f724868-ce0d-8864-8c8d-36c212ac955f.png)
ほぼすべてが有料ですが、その分質の高い講座がそろっています。
プログラミングだけではなく、photoshopの使い方やマーケティングを学ぶ動画などもあります。
###[HackerRank](https://www.hackerrank.com/)
![hackerrank.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/4a48e887-5ed8-e218-1f5c-a007b9be6edd.png)
プログラムのコーディングスキルを試すサイトです。
全て英語ですがGoogle翻訳を使いながらでなんとかなります。
プログラミングの基礎を学んだあとにチャレンジすればパズルのように楽しめるかもしれません。
###[paiza](https://paiza.jp/)
![paiza.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/b347fb94-a337-afb4-5513-888c66c766d6.png)
HackerRankの日本版と考えればOKです。
問題を解くだけでなく基礎を学ぶこともできます。
ただしすべての講座を受けるには月額980円が必要です。
###[terratail](https://teratail.com/)
![teratail.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/d4cd6f93-d07b-73fd-70b7-395d3677e258.png)
プログラミング初心者が独学する際に一番困ることはわからないことを聞く人がいないことです。
そんな人はこのサイトを利用しましょう。
yahoo知恵袋のプログラマー版のようなもので自分では解決できない問題を質問することができます。
URLエンコードのファイル名を置換

事務から送られてくるファイル名がURLエンコードになってしまうので，一括修正．

```bash:for-doでnkfに渡す
$ ls *.xls
%E9%80%81%E4%BB%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.xls
$ for i in  %*.xls ; do mv $i `echo $i|nkf -w --url-input` ; done
$ ls *.xls
送付ファイル.xls
```
VueでExportのいろいろ書き方を纏めておきます

#成功した構文

**Vueのファイル：index.vue**

~~~html:index.vue
<template>
  <div>
  <p>{{ msg }}</p>
  </div>
</template>
<script>
import { t1m1, t1m2 } from './t1'
import { t2 } from './t2'
import { t3m1 } from './t3'
export default {
  name: 'test',
  data () {
    return {
      msg: 'you are ok.'
    }
  },
  mounted () {
    t1m1()
    t2.t2m1()
    t1m2()
    t2.t2m2()
    t3m1()
  }
}
</script>
~~~

**Javascriptファイル１**

~~~javascript:t1.js
const t1m1 = function () {
  console.log('t1m1 ok')
}
function t1m2 () {
  console.log('t1m2 ok')
}
export { t1m1, t1m2 }
~~~


**Javascriptファイル２**

~~~javascript:t2.js
const t2 = {}
t2.t2m1 = function () {
  console.log('t2m1 ok')
}
t2.t2m2 = function () {
  console.log('t2m2 ok')
}
export { t2 }
```

**Javascriptファイル３**

~~~javascript:t3.js
export default function t3m1 () {
  console.log('t3m1 ok')
}
~~~

#失敗した構文
**例１**

~~~javascript:t2.js
const t2 = {}
t2.t2m1 = function () {
  console.log('t2m1 ok')
}
function t2.t2m2 () {
  console.log('t2m2 ok')
}
export { t2 }
~~~
エラーメッセージは以下
<font color="red">Module build failed: SyntaxError: t2.js: Unexpected token, expected</font>

**例２**

~~~javascript:t2.js
const t2 = {}
t2.t2m1 = function () {
  console.log('t2m1 ok')
}
t2.t2m2 = function () {
  console.log('t2m2 ok')
}
export default { t2 }
~~~
エラーメッセージは以下
<font color="red">[Vue warn]: Error in mounted hook: "TypeError: Cannot read property 't2m1' of undefined"</font>

**例３**

~~~javascript:t3.js
export function t3m1 () {
  console.log('t3m1 ok')
}
~~~
エラーメッセージは以下
<font color="red">[Vue warn]: Error in mounted hook: "TypeError: Object(...) is not a function"</font>

**例４**

~~~javascript:t3.js
export t3m1 = function  () {
  console.log('t3m1 ok')
}
```
エラーメッセージは以下
<font color="red">Module build failed: SyntaxError: t3.js: Unexpected token, expected { (1:7)</font>

**例５**

~~~javascript:t3.js
const t3m1 = function  () {
  console.log('t3m1 ok')
}
export { t3m1 }
~~~
エラーメッセージは以下
<font color="red">[Vue warn]: Error in mounted hook: "TypeError: Object(...) is not a function"</font>

**例６**

~~~javascript:t3.js
const t3m1 = function () {
  console.log('t3m1 ok')
}
export default { t3m1 }
~~~
エラーメッセージは以下
<font color="red"></font>

**例７**

~~~javascript:t3.js
function t3m1 () {
  console.log('t3m1 ok')
}
export default { t3m1 }
~~~
エラーメッセージは以下
<font color="red">[Vue warn]: Error in mounted hook: "TypeError: Object(...) is not a function"</font>
pyenv上でAnacondaを使ったKeras(Tensorflow)のインストール

## はじめに
完全に自分用なのでグダグダガバガバです。参考元の記事を見ていただいたほうがいいかもしれません。
大いなる力がない人の為の記事です。

## 環境
- OS  ： Debian 9.4
- CPU ： Intel Core i7-5930K 3.5GHz
- GPU ： GeForce GTX 980Ti
- Shell : bash

## pyenvのダウンロードとセッティング
参考元 : [pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法] (https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b)

 pyenvを以下のコマンドでGithubからダウンロード(クローン)します。

``` 
 $ git clone https://github.com/pyenv/pyenv.git ~/.pyenv 
```

 ~/.bashrcにPATHを追加しましょう。

```
 $ echo '##-------- pyenv settings --------##' >> ~/.bashrc
 $ echo 'export PYENV_HOME=$HOME/.pyenv' >> ~/.bashrc
 $ echo 'export PATH=$PATH:$PYENV_HOME/bin' >> ~/.bashrc
 $ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
``` 
 エディターで.bashrcに直書きでも大丈夫です。

```
 export PYENV_HOME=$HOME/.pyenv
 export PATH=$PATH:$PYENV_HOME/bin
 eval "$(pyenv init -)"
```

最後の evalコマンドを忘れないようにしましょう。
"pyenv init -"ではpyenvで使用する環境変数を出力します。
evalコマンドでは直後の文字列を評価した値(コマンドとして実行した出力)を実行します。

```bash:"pyenv&nbsp;init&nbsp;-"の出力
export PATH="/home/username/.pyenv/shims:${PATH}"
export PYENV_SHELL=bash
source '/home/username/.pyenv/libexec/../completions/pyenv.bash'
command pyenv rehash 2>/dev/null
pyenv() {
  local command
  command="${1:-}"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  rehash|shell)
    eval "$(pyenv "sh-$command" "$@")";;
  *)
    command pyenv "$command" "$@";;
  esac
}
```

 追加したPATHを適応させましょう。
 下記のコマンドを実行するか，再度ログインしましょう

```
 $ source ~/.bashrc
```

## pyenvでAnacondaをインストール
下記のコマンドでAnacondaをインストールしましょう。Anacondaのバージョンはお好きにどうぞ。

```
$ pyenv install anaconda3-5.3.1
```
pythonのバージョン切り替えは，"local" オプションで今いるディレクトリに，"global" オプションで全体に反映されます。

```
 $ pyenv local anaconda3-5.3.1
 $ pyenv global anaconda3-5.3.1
```

適応されているかpythonのバージョンを確認しましょう。

```
 $ python -V
 Python 3.6.8 :: Anaconda, Inc.
```
上のようになれば大丈夫です。 Python自体のバージョンは変わることがありますので末尾に "Anaconda, Inc." と入っているのが確認できれば問題ありません。

## パッケージのインストール
KerasとTensorflowをインストールしましょう。
GPUも使うのでtensorflow-gpu, cudatoolkit, cudnnを入れましょう。

```
 $ conda install cudatoolkit==9.0
 $ conda install cudnn==7.3.1
 $ conda install tensorflow-gpu==1.9.0
 $ conda install keras==2.2.4
```
私の環境ではこれでkerasのexampleがGPUで動作しました。
tensorflow-gpuを最新の1.13.xにすると，CUDA Tool KitとかcuDNNのバージョンがよくわからないことになるので動く組み合わせを探してみてください。

## 補足：GPUメモリの制限
複数人で使うことを想定したマシンにはGPUメモリに制限をかけなければメモリの取り合いになってしまいます。

制限をかけるには以下のコードをソースの先頭に記入してください。
0.25 は約25%ではなくあくまでも目安です。私の環境では約29%(1818MiB/6083MiB)の制限がかかりました。

```python:
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
# GPUメモリ制限
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.25 
config.gpu_options.visible_device_list = '0'
session = tf.Session(config=config)
from keras import backend as K
K.set_session(settion)
```

## 参考にしたサイト
- [pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法] (https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b)
- [GPU support | TensorFlow](https://www.tensorflow.org/install/gpu#hardware_requirements)
Material2 Dialog: no component factory found,did you add it to @NgModule.entryComponents?

# Material2 Dialog: no component factory found,did you add it to @NgModule.entryComponents?



Material2のDialogを使う際に出たエラー。Dialogは他のと違ってややこしい、の備忘録。



いちおう[Dialog OVERVIEW](<https://material.angular.io/components/dialog/overview>)のページに書いてある。まあ英語なのと、たいてい他のMaterialはサンプルコード見れば使い方わかるのでOVERVIEW読まないよね。



### インプリの仕方

たとえばapp.componentのページにボタンを付けてそのボタンをクリックするとモーダルウィンドウ（Dialog)が出るようにしたかったら。




###### app.component.ts

```typescript
import {MatDialog, MatDialogConfig, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material';

　constructor(
    public dialog: MatDialog,
  ) {}

// Mat-Dialogでedit-dialog.component（編集用モーダル）を開く
  openDialog(post: Post) {
    this.dialog.open(EditDialogComponent, {
      width: '600px',
      data: post,
      disableClose: false
    });
  }

```



###### app.component.html

```html
<button mat-raised-button (click)="openDialog(post)">編集</button>
```

postはObservableデータ。まあここではargumentに入れていろいろ渡せると思っておけばいい。このボタンをクリックするとDialogが開く。

<br>

####Dialog画面用のコンポーネントを作る
EditDialogComponentはそのDialog画面を表示するコンポーネント。

```cmd
ng g component editDialog
```


###### edit-dialog.component.ts

```typescript
import { Component, OnInit, Inject} from '@angular/core';
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material';

  constructor(
    public dialogRef: MatDialogRef<EditDialogComponent>,
    @Inject(MAT_DIALOG_DATA) public data: Post
  ) { }

  onClickCloseButton() {
    this.dialogRef.close();
  }
```



###### edit-dialog.component.html

```html
<div>
<p>投稿者：{{data.userName}}のメッセージ編集</p>
    <form #f="ngForm" (ngSubmit)="updatePost(data)" name="form">       
…フォーム…
   </form>
   <br>
   <button mat-raised-button (click)="onClickCloseButton()">閉じる</button>
</div>
```



このようにDialogの中にフォームを作ってデータベースを編集・削除できるようにしてもいいし、ただ警告メッセージを表示するだけでもいいし。
ちなみにフォームを使うなら`<button mat-raised-button (click)="onClickCloseButton()">閉じる</button>`は`<form></form>`の外に出さないと(ngSubmit)に反応していまいます。

<br>


問題はここから。

<br>

### エラーの原因

MatDialogの場合、**app.module.tsを編集しなければならない**。



###### app.module.ts

```typescript
//Material2モジュールのインポート
import {
  MatDialogModule,			  // MatDialogに必要な記述
  MAT_DIALOG_DEFAULT_OPTIONS,  // MatDialogに必要な記述
} from '@angular/material';


declarations: [
    EditDialogComponent,
],

providers: [
    {provide: MAT_DIALOG_DEFAULT_OPTIONS, useValue: {hasBackdrop: false}}  // MatDialogに必要な記述
],

entryComponents: [EditDialogComponent],　　// MatDialogに必要な記述
```



これは調べてもなかなかわからないっすー





以上





[no component factory found,did you add it to @NgModule.entryComponents?](https://stackoverflow.com/questions/46990389/angular-4-no-component-factory-found-did-you-add-it-to-ngmodule-entrycomponent)
Ubuntu 18.04でVagrantインストール（はまりました）

Ubuntu 18.04にVagrantをインストールした際にハマったので、備忘録として記述しています。
#何が起こったのか

実行環境


```>lsb_release -a```
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.2 LTS
Release:	18.04
Codename:	bionic


通常、以下の手順が様々サイトに記載されているので、sudo apt-get updateしてから実行した所、完全にハマったようです。

```bash

> sudo apt-get install virtualbox
> sudo apt-get install virtualbox-ext-pack
> sudo apt-get install vagrant
```

上記の３コマンドを実行すると、以下のエラーが発生

```bash

update-initramfs: Generating /boot/initrd.img-4.15.0-1036-oem
Errors were encountered while processing:
 lvm2
 libguestfs0:amd64
 libguestfs-reiserfs:amd64
 libguestfs-perl
 libguestfs-hfsplus:amd64
 libguestfs-tools
 libguestfs-xfs:amd64
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

色々試しましたが、現在の所これを修復する手段は見つけられてません。何か情報あれば、教えてください。

以下のコマンドで全て削除しました。

```bash

>sudo apt autoremove vagrant
>sudo apt autoremove virtualbox-ext-pack
>sudo apt autoremove virtualbox
```


#どうやってインストールしたの？

以下のサイトをそのまま、利用出来ました。(ありがとうございます。)
[Ubuntu Linux 18.04 LTSに、VagrantをインストールしてUbuntu Linux 18.04 LTSのboxを起動するまで](
https://kazuhira-r.hatenablog.com/entry/2018/12/02/235925)

サイトの情報では、2018/12時の時なので少しバージョンが古いのですが、最新のバージョンを試す勇気がなかったので、このサイト通りに実行してみました。

まず必要なパッケージのインストール

```bash
>sudo apt install libqt5opengl5 libqt5printsupport5 libqt5x11extras5
```
次にVirtualboxのインストール

```bash
>wget https://download.virtualbox.org/virtualbox/5.2.22/virtualbox-5.2_5.2.22-126460~Ubuntu~bionic_amd64.deb
>sudo dpkg -i virtualbox-5.2_5.2.22-126460~Ubuntu~bionic_amd64.deb
```

Virtualboxの設定でエラーが出るか確認

```bash
 >VBoxManage --version
5.2.22r126460
```

そして、Vagrantのインストール

```bash

>wget https://download.virtualbox.org/virtualbox/5.2.22/virtualbox-5.2_5.2.22-126460~Ubuntu~bionic_amd64.deb
>sudo dpkg -i virtualbox-5.2_5.2.22-126460~Ubuntu~bionic_amd64.deb
```

#Vagrant実行

```bash
>make poi
>cd poi
>vagrant init ubuntu/bionic64
>vagrant up
>vagrant ssh
```

これで新しいUbuntuに入れました。Ctr+x Ctr+cで一旦、新しいUbuntuから抜けて、よく使うコマンドが動くか確かめてみました。

```bash
>vagrant box list
ubuntu/bionic64 (virtualbox, 20190522.0.0)
>vagrant halt
>vagrant destroy
```

問題なく、一通り動いていました。

#最後に

最初の３つのコマンドがなぜ動かなかったのかわかりませんが、とりあえず動作させる所までは出来たようです。今後は、VirtualboxとVagrantのパッケージをアップデイト等も実施したいと思います。

また、複数のVMを簡単に構築出来る環境が作りたかったので、その環境作成も載せていきたいと思います。

Happy Hacking
VisualStudio2017 .NETCore 2.1から2.2更新しようとしてはまった

# 結論
.NET Core SDKだけではなく
「Compatible with Visual Studio 2017」
もインストールしないといけない

https://dotnet.microsoft.com/download

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/109819e9-f2bb-b352-f925-a2ec5f595e1c.png)

# 2.2のSDKをインストールしてプロジェクトを作成
.NET Core 2.2のSDKのみをインストールして、
Visual Studioで新しくプロジェクトを作成したら、2.2のプロジェクトが作れた。

でも実行できなかった
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/5153114c-e395-114b-ee4d-ee1614b6f0e1.png)

いろいろなところのログを見ても何の情報もなくはまった

# Windows Updateしてみた
意味なし

# windowsもvsも再起動してみた
さっきよりわかりやすい状況になった
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/623b82ae-13b3-178d-5af0-240c031b80de.png)

# プロジェクトのプロパティなるものを見つけた
ソリューションのプロパティじゃなくてプロジェクトの。
2.2が表示されなくて、「別のフレームワークをインストールします」というものをクリック
![コメント 2019-05-23 142620.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/8baf19ee-d83a-16e3-6a3c-02431f336ff5.jpeg)

# なんかいい感じのダウンロード画面が！
https://dotnet.microsoft.com/download/visual-studio-sdks?utm_source=getdotnetsdk&utm_medium=referral

![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/cb2041ec-62b0-644e-5377-9a4c110451de.png)

# 「Compatible with Visual Studio 2017」をインストールした後
自動で2.2が選択されていた
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107052/eb6dccdb-f053-6777-80d7-3c282d0ee8d8.png)
Rails5でMySQLのid以外にbigint + primary key + auto increment する。（migration）

# やり方

調べたところRails4の頃の情報しか見当たらず、漁ると

auto_increment オプションが搭載されたことにたどり着く。

cerate_tableでの:idに続けざまに書くことで対応可能となるらしい。

以下は、PKをcompany_idにした会社マスタのサンプルである。

```ruby:/db/migrate/example.rb
def change
  create_table :m_company, primary_key: "company_id", id: :bigint, comment: "会社ID", auto_increment: true, default: nil, force: true, comment: '会社マスタ' do |t|
    ## t.bigint :company_id, null: false, comment: '会社ID' ※←ここには書かない
    t.string :name, null: false, comment: '会社名'
    t.text :detail, comment: '内容'
    t.datetime :created_at, null: false, comment: '作成日時'
    t.datetime :updated_at, null: false, comment: '更新日時'
  end
end
```

以下となる。

```
mysql> desc m_company;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| company_id | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | NO   |     | NULL    |                |
| detail     | text         | YES  |     | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
| updated_at | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
```

## あとから変えたい場合は、change_columnで入る

こんな感じ。rollbackできるようにupとdownで書く

```ruby:/db/migrate/example.rb
def up
  change_column :m_company, :company_id, :primary_key, auto_increment: true
end
def down
  change_column :m_company, :company_id, :bigint
  execute "ALTER TABLE m_company DROP PRIMARY KEY;"
end
```

## 問題 コメントが入らない

create_tableでPKを作成してしまうと、テーブルのコメントはかけてもPKカラムのコメントが入らない。（comment:オプションが被るから）

ので、

```ruby:/db/migrate/example2.rb
def up
  create_table :m_company, primary_key: "company_id", id: :bigint, auto_increment: true, default: nil, force: true, comment: '会社マスタ' do |t|
    t.string :name, null: false, comment: '会社名'
    t.text :detail, comment: '内容'
    t.datetime :created_at, null: false, comment: '作成日時'
    t.datetime :updated_at, null: false, comment: '更新日時'
  end
  change_column :m_company, :company_id, comment: "会社ID"
end

def down
  # change_column :m_company, :company_id, comment: nil ※コメントだけ追加ならばこれ
  drop_table :m_company
end
```

これでコメントも追加できる”が”、schema.rbを確認するとわかるように
change_columnの内容がcreate_tableにマージされてしまっているのがわかる。

ゆえに、db:setupをした場合は、PKのキーにコメントが入らないためdb:migrateをすることをお勧めする。

# 参考資料

- [Add auto increment back to primary key column in Rails - stackoverflow](https://stackoverflow.com/questions/615272/add-auto-increment-back-to-primary-key-column-in-rails)
- [rails で id を BIGINT 型 + primary key + AUTO_INCREMENT する](http://mgi.hatenablog.com/entry/2015/03/29/191550)
- [Rails5から使えるActiveRecord便利機能](https://qiita.com/mitz/items/b2295e440585ba63b083)
- [class ActiveRecord::Migration](https://devdocs.io/rails~5.2/activerecord/migration)
- [Rails探訪 ~ create_table 編 ~](https://moneyforward.com/engineers_blog/2014/08/13/rails%E6%8E%A2%E8%A8%AA-create_table-%E7%B7%A8/)
- [Rails4 db:migrateでid以外のカラムにプライマリキーの設定を行う](https://blog.takanabe.tokyo/2014/11/30/47/)
いまさらLaravel4 Tips：Artisan::addしたくない

#概要
commands クラス作成する度に、app/start/artisan.php に Artisan::add 追加するのめんどくさいな～と思って、commands ディレクトリ配下のphpファイル見て自動で追加することにしました。

もっとちゃんと考えて書けば namespace とかも ちゃんと取り よいか書き方あるんだと思いますが 取り急ぎで必要だったのでご勘弁ください。

```artisan.php
<?php

$command_files = File::glob(app_path().'/commands/*.php');
if ($command_files !== false) {
    foreach($command_files as $file){
      $fp = fopen($file, 'r');
      $class = $buffer = '';
      $i = 0;
      while (!$class) {
          if (feof($fp)) break;
          $buffer .= fread($fp, 512);
          if (preg_match('/class\s+(\w+)(.*)?\{/', $buffer, $matches)) {
              $class = $matches[1];
              break;
          }
      }
      Artisan::add(new $class); 
    }
}

```
namespace とか取らないなら phpファイルの中身見なくてもファイル名でいいじゃんとか今更思ってますが...。
Processing を用いた WearOS 用ウォッチフェイスのテンプレート作成

# 概要
Processing で WearOS (AndroidWear) 用のウォッチフェイスをデザインすることができます．
練習がてら，簡単なアナログ時計とデジタル時計の表示プログラムを作成してみましたので公開します．

# 環境構築
1. [Processing](https://processing.org/) をインストールします．
2. 右上の "Java" と表示されている部分をクリックし， "モードの追加" を選びます．
3. "Android Mode" をインストールします．

# 開発方法
スマホ・スマートウォッチで開発者モードを有効にします．
スマートウォッチ側で Bluetooth デバッグをオンに，スマートフォン側で WearOS アプリから Bluetooth 経由のデバッグをオンにします．

スマートフォンをPCに接続し，次のコマンドを実行して接続します．

```shell-session
$ adb forward tcp:4444 localabstract:/adb-hub
$ adb connect 127.0.0.1:4444
```

エラーが出る場合は `abd kill-server` してから実行しましょう．

Androidモードでプログラムを書いて実行すると，実機にデプロイできます．
また，Javaモードで実行すればPC上で見た目を簡単に確認できます．
（ただし，日本語が文字化けしてしまいます．レイアウトの確認程度には使えますが...）

# サンプル
Processing は未経験だったので，調べながら作成しました．

![Analog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286106/3bd0b59f-5fc0-f313-b70d-9d337f1bcb91.png)

![Digital.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286106/79d7725a-3b2e-8943-9f9a-8d3109e32703.png)


テンプレートとして https://github.com/ryhoh/WatchFaceTemplates で公開しています．
商用・非商用問わず，このコードをどのように使用・改変していただいてもOKです．

# まとめ
Processing でウォッチフェイスを自由にデザインできるみたいです．
今回は簡単なデザインに留めましたが，今後，より複雑で綺麗なデザインのウォッチフェイスを作りたいです．
QiitaからのニュースメールがGmailでプロモーションに入ってしまい通知されなくなった対処法

## 事象
大体週一のペースでQiitaからQiitaニュースが送られて来ていたが、ある日を堺にスマホに通知が来なくなってしまった。
「ニュースメールやめちゃったのかな？」とかのんきに考えていたが、そんなことはなかったので通知が来るように設定し直した。

##　原因
タイトルに書いている通り、原因は「プロモーション」カテゴリに分類されてしまい通知が来ないようになっていた。
「来なくなったなー」と考えてすぐ見たのは迷惑メールボックスだったが、迷惑メールボックスにも入っていなかったのでちょと発見が遅れてしまった。

## 対処法(1) メールを「プロモーション」から「メイン」に移動する
PCでの操作より、アプリのほうが操作が若干わかりにくいのでアプリの方で説明をする。
※筆者が持っているスマホのOSはAndroidであるのでiOSと若干操作が異なる恐れがあるので注意。

### 手順
* アプリを起動
* 左上のメニューアイコン(ハンバーガーアイコン)をタップ
* 「プロモーション」のカテゴリをタップ
* Qiitaのニュースメールを長押し(選択状態となる)
* 右上の丸が縦3つに並んだアイコン(ケバブアイコン)をタップ
* 「移動」をタップ
* 「移動」のウィンドウが出るので、「メイン」をタップ

### 注意
筆者は現在この方法で対処しているが、**2周間ほどしか経過観察をしていない**。
しばらくすると、またプロモーションカテゴリに移動してしまう可能性はあると思う。

## 対処法(2) 「プロモーション」カテゴリをなくす
PCでの操作より、アプリのほうが操作が若干わかりにくいのでアプリの方で説明をする。
※筆者が持っているスマホのOSはAndroidであるのでiOSと若干操作が異なる恐れがあるので注意。

### 手順
* アプリを起動
* 左上のメニューアイコン(ハンバーガーアイコン)をタップ
* メニューを下までスクロールし「設定」をタップ
* 設定を変更したいアカウントをタップ
* 「受信トレイ」項目の「受信トレイのカテゴリ」をタップ
* 「プロモーション」にチェックが入っているためチェックを外す
*  ハンバーガーアイコンをタップし、メニューから「プロモーション」のカテゴリが消えていることを確認

### 注意
プロモーションのカテゴリがなくなってしまうため、Qiitaのニュースメール以外のメールも通知されるようになる。

## 確認環境
* OS : Android 9
* Gmail バージョン : 2019.04.28.246421133.release
PostgreSQLでソータブルなUUIDを生成する

PostgreSQLでIDを生成する方法は連番なIntegerをSEQUENCEで生成するか、UUIDを`gen_random_uuid()`等でランダム生成するかが一般的だと思われます。WebサービスではIDが連番だとURLからサービス規模を知られてしまうことが懸念されます。そこで私はランダムなUUIDをIDとして利用することが多いです。

一方、`gen_random_uuid()`で生成されたUUIDは順序性はなく、IDだけで生成順にはソートできません。この問題に対して、[ULID](https://github.com/ulid/spec)はミリ秒単位のepoch time(48bit) + ランダム(80bit)を用いることで、ランダム性と順序性を両立させています。ID生成におけるランダム性と順序性の比較はhttps://qiita.com/kawasima/items/6b0f47a60c9cb5ffb5c4 が詳しいです。

残念ながらPostgreSQL 11.2以前はULIDには対応していません。そこで、ULIDと同様の方法でUUIDを出力する関数を作ってみました。

```sql
create function gen_random_ulid() returns uuid as $$
select substring(
  (
    substring(
      decode(
        to_hex(
          int8'4611686018427387904' + ( -- b'0100000000000000000000000000000000000000000000000000000000000000'::bigint -- to_hexしたときに上位桁が0だと破棄される。必要な桁まで削除されてしまうのを防ぐ。
            (
              extract(epoch from now()) -- create epoch time
              * 1000 -- ミリ秒化 
            )::bigint::bit(64) -- マイクロ秒を切り捨て
            & int8'281474976710655'::bit(64) -- 下位48bitのみを残すため。10889年まで枯渇しないので、今のところなくても良い
          )::bigint
        )
      , 'hex') -- byteaで扱う
    , 3) -- 上位16bitを削除
    || gen_random_bytes(10) -- ulidの下位80bitの生成
  )::text
, 3)::uuid; -- bytea -> textしたときの\xを削除しuuidにキャスト
$$ language sql;
```

簡単ですね。作成した関数を利用して生成したIDを持つレコードに対するクエリは次のように記述できます。

```sql
app=# create table test (id uuid primary key default gen_random_ulid());
CREATE TABLE
app=# insert into test select from generate_series(1,1000);
INSERT 0 1000
-- n回繰り返す

-- ソート
app=# explain analyze select * from test order by id desc;
                                                               QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------
 Index Only Scan Backward using test_pkey on test  (cost=0.29..860.29 rows=24000 width=16) (actual time=0.045..6.179 rows=24000 loops=1)
   Heap Fetches: 0
 Planning Time: 0.147 ms
 Execution Time: 8.114 ms
(4 rows)

-- 範囲検索
app=# explain analyze select * from test where id >= '016ae321-dc38-0000-0000-000000000000';
                                                         QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------
 Index Only Scan using test_pkey on test  (cost=0.29..43.21 rows=1081 width=16) (actual time=0.069..0.714 rows=1000 loops=1)
   Index Cond: (id >= '016ae321-dc38-0000-0000-000000000000'::uuid)
   Heap Fetches: 0
 Planning Time: 0.182 ms
 Execution Time: 0.925 ms
(5 rows)
```

ソートも検索もIndexのみで検索できるので高速ですね。気になるのは関数の性能です。`gen_random_uuid()`と比較してみました

```sql
app=# create table test (id uuid primary key);
app=# \timing
app=# insert into test (id) select gen_random_uuid() from generate_series(1,1000000);
INSERT 0 1000000
Time: 5149.780 ms (00:05.150)
app=# insert into test (id) select gen_random_ulid() from generate_series(1,1000000);
INSERT 0 1000000
Time: 7144.387 ms (00:07.144)                
```

桁が変わるほど性能が落ちるわけではなく、実用的だと考えます。

以上です。
SqlServer_Management Studio 

Management Studioの既定のファイル保存場所（SqlServer2017）
--
"C:\Program Files (x86)\Microsoft SQL Server\140\Tools\Binn\ManagementStudio\Extensions\Application\ssms.Application.pkgdef"を開き、
DefaultProjectsLocationを変更する

プロジェクトの既定の場所を変更するには
1.ファイルまたはプロジェクトを別の場所から開くと、既定の場所が変更されます。 Microsoft SQL Server Management Studio は前回開いたプロジェクトの場所を記憶し、次回プロジェクトを開いたり保存したりする際に使用します。

テーブルデザインでカラム変更
--
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/bd3a2648-4e64-420a-4323-dee38b204bbb.png)
チェックをはずす
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381112/0aab1d0e-450d-a55e-d360-10d70a2ac22f.png)
MeCabを使ったテキスト生成&ツイートするBOTをCloud9で動かす

優秀な友達が、以前TwitterのBOTを作ってくれています。
<a href="https://github.com/Im-neko/text_writer"> 0から学ぶNLP(自然言語処理)[超入門]</a>

ここのページの通りに、今まで自分のMacでBOTを動かしていました。かなり人に近いツイートをしてくれます。
ただ、普段使ってるMacは外出先に持ち運びますし、MacのOSXのアプデで環境が壊れたりすることもありました。忙しい自分に変わって一日中一年中、呟いていて欲しい。ということで今後はサーバーで動かそうと決めました。

サーバーですが、Amazon Cloud9を使います。インスタンスのスペックは最小のを選びました。OSはAmazon Linuxです。


<img width="1071" alt="cloud9スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158553/59d1d46d-8cd3-7211-81da-8dfdaa2a4b28.png">

まずはPython3.5を入れます。
<a href="https://qiita.com/KeijiYONEDA/items/f9cf37cfc359aa893797">Amazon Linux (EC2)上でPython3とDjangoをインストールして、Webサーバを動かす</a>
↑Python3.5の入れ方はこちらを参考にしました。

```
$ yum list | grep python35
$ sudo yum install python35-devel python35-libs python35-setuptools
```

pipも

```
$ sudo /usr/bin/easy_install-3.5 pip
```


続いてMeCabとPythonバインディングをインストールします。
<a href = "http://saito400.hatenablog.com/entry/2017/07/31/194057">Amazon LinuxにMeCabとPython3バインディングをインストールする手順</a>

↑こちらのサイトを参考にしました。

MeCab

```
$ wget -O mecab-0.996.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE"
$ tar zxvf mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./configure
$ make
$ make check
$ sudo make install
```

辞書

```
$ wget -O mecab-ipadic-2.7.0-20070801.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM"
$ tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8
$ make
$ sudo make install
```


バインディング

```
$ pip3 install mecab-python3 --user
$ echo "/usr/local/lib" | sudo tee -a /etc/ld.so.conf
$ sudo ldconfig
```

mecab-ipadic-NEologdのインストール

```
$ cd ../../
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n -a
```

最後に、上のBOTを動かすにあたり必要なライブラリを入れます。

```
$ pip3 install requests_oauthlib --user
$ pip3 install numpy --user
```

これで、python35でmaketweet.pyを叩けます。
Disk Utility Command

# Disk Utility Command
## ブータブルUSBとかSDを作ります
- Create Bootable Disk
- 毎回ググるので書いておきます
- bs=バッファサイズを小さくしたら時間がかかります

### macOS

```
diskutil list
sudo umount /dev/disk2
sudo dd if=ubuntu-18.04.2-server-amd64.iso of=/dev/disk2 bs=16M
```
### Linux

```
sudo fdisk -l
sudo umount /dev/sdb
sudo dd if=ubuntu-18.04.2-server-amd64.iso  of=/dev/sdb bs=16m
```

## macOS, Linux 共用のパーティション
### ジャーナル（大文字小文字区別）

```
mount -v
diskutil disableJournal /dev/disk3s1
```

## よく使うコマンド
```
lsblk
sudo blkid
sudo fdisk /dev/sdb
sudo mkfs.ext4 /dev/sdb
```