OmniAICreator/Qiita-1.07M huggingface dataset:
ホロレンズのビルド成功環境について（2019/03月版）

### はじめに
* 久しぶりにホロレンズアプリをUnityで作成しようとしたところ、
    * コンパイルエラーになる
    * ビルドに失敗する
    * デプロイに失敗する

などなどいろいろ詰まりました。
検索してもヒットするのはバージョンが古かったりしてなかなかたどり着けなかったので同様の人が出ないようにメモしておきます。

### 結論
以下のバージョンに揃えて構築する。
* Unity 2017.4.17f1 
* Visual Studio 2017 （インストール時に細かな設定が必要＊後述）
* Mixed Reality Toolkit –Unity 2017.4.3.0

### 構築手順詳細
* こちらのHPをみて対応しましょう
    * HoloLens/Windows Mixed Reality開発環境構築
        * https://www.slideshare.net/TakahiroMiyaura/hololenswindows-mixed-reality-128235273

### 結論の補足事項
* Unity 2017.4.17f1 の理由
    * Unity2018 だとMixed Reality Toolkitが使えないため（コンパイルエラーになる）
        * ツールキットなしでも作成は可能だったがキーエミュレータなどのデバッグ環境が無いのでとても不便
* Visual Studio 2017 の理由
    * Visual Studio 2015からはデプロイが拒否されるため（両手サポートのホロレンズバージョンから）
        * Windows 10 1089アップデートからは完全にサポート外になるらしい
* Mixed Reality Toolkit –Unity 2017.4.3.0
    * 動作確認バージョン


### まとめ
* Unityは闇が深い
    * Unity Hub便利
ログインフローお試し

#１.ログイン画面（一般的）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/f4a2fb54-9e01-687d-9a78-d137fa251050.png)
#２.ログイン画面（拡張）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/46147262-9e69-4f4c-ad71-2f5c3b535b37.png)
#３.ログインフローの概要
ログインフローを使用して、ログイン操作をカスタマイズし、ビジネスプロセスを Salesforce 認証に統合できます。
一般的な使用事例として、ログイン時のユーザデータの収集と更新、2 要素認証の設定、サードパーティの強力な認証方式の統合などがあります。

**ログインフローの 3 つの一般的な使用事例**

- ログイン時のユーザデータの収集と更新
- *カスタマイズした 2 要素認証 (2FA) の適用*
- *サードパーティの強力な認証メカニズムの統合*

#４.ログイン時のユーザデータの収集と更新
このログインフローでは、ログイン時にユーザの電話番号を要求することでユーザに関する情報を収集して更新します。
1. Welcome画面を表示します。
2. 携帯番号を入力画面が表示します。
3. ユーザオブジェクトを更新します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/e28313e7-3be8-c656-d9df-e2d142a3a8da.png)
##Welcome画面の作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/4c4fda3d-9a37-8f09-3399-dfb5266e7e71.png)
##ユーザ情報入力画面の作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/5e4deaa4-a96e-bd34-926e-1f8c696395c3.png)
##ユーザ情報更新の作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/61915d2f-9dc8-fcb6-1cdb-3d314dc1e496.png)
##ログインフロー作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/b28898e6-cd13-0e63-90b9-a7192a1869de.png)
##テスト
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/1a22900c-2599-5af0-508d-e5d8ac8f0231.png)
画面作成でdraw.ioとCodePenを試してみた

#draw.ioとは
draw.ioは、WEB上で無料で使えるフローチャート作成ツールです。
インストールなどは必要なく、ブラウザからログインも不要で手軽に利用することができます。
通常、こういったドローツールは、「作業シート何枚まで無料であとは有料」などというサービスも多いのですが、draw.ioは完全無料で利用することができます。
#どう作る？
UIデザインはhttps://www.draw.io/ で。
draw.ioはブラウザ上でドローイングできるWebサービスです。
Visioのようにドラッグ＆ドロップで作図できるし、ステンシル(図形雛形)も豊富なので簡単なUIはここで十分作成可能です。
![usingdrawio.png](https://qiita-image-store.s3.amazonaws.com/0/230735/db6e4afd-9540-1a5a-bd7e-c9a5a29a022d.png)

今回はひとりで作図しましたが、URLでエクスポートできるので複数人で共有することもできます。
（共同編集の有無は未検証です。）

#CodePenとは
CodePenはブラウザ上でHTML / CSS / JavaScriptを書いてその場でプレビューできるWebサービスです。
Draw.ioでデザインした画面をCodePen上で書きました。ただ、無料版では画像ファイルをアップロードできないので、実質的にプロトタイピングやJavaScriptの検証で使う（あるいは有料版にアップグレードする）のがよいと思います。
![UsingCodePen.png](https://qiita-image-store.s3.amazonaws.com/0/230735/7093204d-9c1b-20cb-7e91-e6e9f5a5ba1b.png)

今回はある程度のHTML構造の作成とCSSの適用までをCodePenで行い、ローカルにエクスポートした後に画像を反映しました。
Linux ファイルのアクセス権の覚え方


##はじめに##
　現在[Linux標準教科書](https://linuc.org/textbooks/linux/)で簡単にLinux学習を始めているものです。

　文系プログラミング未経験者でOSすらもよく知らなかったわたしですが、学習する中でうまく飲み込むことのできなかった内容についてかみ砕いてかみ砕いて細かくして解説させていただきます。（非常に細かく解説することを心掛けているため、この記事はとても長いのでご注意ください）もし読んでいて理解が腹落ちしないという方がいらっしゃいましたら、参考にしてください。
　また、わたしなりに解釈した内容であるため、本来の意味とは違うよ？　というものがありましたら、コメントをお願いします。
（※2019年3月26日　コメントにご指摘いただきまして、一部加筆修正いたしました。ありがとうございます。）
　
　今回は、ファイルのアクセス権の数字表記について解説いたします。

Linux環境：仮想環境(Oracle VirtualBox)
　　　　　 [CentOS Ver.7](http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso)

##わたしが理解できなかった点##
　ではさっそく、わたしが何を理解できなかったのかについて説明します。わからなかったのはファイルのアクセス権限を８進数で表記するという説明です。新しい空のファイルを作成したとして、説明します。

```
$ touch idontknow.txt
$ ls -la indontknow.txt
-rw-rw-r--. 1 is212 is212 0  3月 25 11:11 idontknow.txt

```

ファイルのアクセス権とは、コードの３行目、
-rw-rw-r--
の部分がそれぞれ

ファイル or ディレクトリ or シンボリックリンク（- or d or l）
※シンボリックリンクにつきましては、[こちら](http://e-words.jp/w/%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%83%AA%E3%83%B3%E3%82%AF.html)をご覧ください。
所有ユーザーのアクセス権（--- ~ rwx）
所有グループのアクセス権（--- ~ rwx）
その他のユーザーのアクセス権（--- ~ rwx）

という区切りで示されています。
わからないのは、アクセス権を８進数を割り振って考えるというもの。
基数変換は簡単にやったものの、「８進数はそんなにつかわないよ」という言葉を信じてスルーした結果、なぜ８進数なのかさっぱりわかりませんでした。
一応、それぞれの組み合わせを０～７まで割り振っていて、その表が下記になるんですが、かなり覚えにくい。
・８進数表記の割り振り表
「
　　0（---）  　  4（r--）
　　1（--x）    　 5（r-x）
　　2（-w-）    　6（rw-） 
　　3（-wx）    　7（rwx）　　　　　　」
　　　　　　　　　　　
　
##２進数で理解するとわかりやすい##
　８進数が全く分からなかったので、訓練校の先生に聞いてみました。そうすると、まだわかっている（つもりの）２進数で理解してみた方がわかりやすいという答えをいただきました。
０～７は分解してみると、２の乗数で計算が可能になります。つまり、２進数変換で考えればもっと簡単に覚えられるのです。

考え方としては、
　桁の重み　＝　rwxの順番
　→２（２）　２（１）　２（０）　＝　r　w　x
　※（）内は乗数

表にすると

「
　　２（０）＝　１　＝x
　　２（１）＝　２　＝w
　　２（２）＝　４　＝r　　　」
という対応表になります。これを適応すれば今回のidontknowファイルは

```
$ touch idontknow.txt
$ ls -la indontknow.txt
-rw-rw-r--. 1 is212 is212 0  3月 25 11:11 idontknow.txt

```

所有ユーザーのアクセス権（rw-）
　→r(4) + w(2) + -(0) = 4 + 2 + 0
　　　　　　　　　　　　= 6
所有グループのアクセス権（rw-）
　→r(4) + w(2) + -(0) = 4 + 2 + 0
　　　　　　　　　　　　= 6
その他のユーザーのアクセス権（r--）
　→r(4) + -(2) + -(0) = 4 + 0 + 0
　　　　　　　　　　　　= 4

つまり、今回touchでつくった空のファイルidontknowのアクセス権を数字表記にすると、664となります。
MySQLでサーバを起動/停止できない

# 環境

- macOS 10.14.3
- mysql  Ver 8.0.15

# どんな現象？？

ローカルのMySQLでサーバが起動/停止できなくなってしまった。
(正確には起動した状態から制御できない…)

<br>
スタートしようとすると

```
$ mysql.server start
 Starting MySQL
 ...
 ERROR! The server quit without updating PID file (/usr/local/var/mysql/USERNAMEnoMacBook-Pro.local.pid).
```
<br>
ストップしようとしても

```
$ mysql.server stop
 ERROR! MySQL server PID file could not be found!
```

# 原因は？？

状態確認すると

```
$ mysql.server status
 ERROR! Multiple MySQL running but PID file could not be found (7939 8062 )
``` 
「複数起動してるよ！PIDファイルないよ！」 って言ってくる
起動中のMySQLデーモンプロセスを確認

```
$ ps -e | grep mysqld
 7939 ttys005    0:00.02 /bin/sh /usr/local/Cellar/mysql/8.0.15/bin/mysqld_safe --datadir=/usr/local/var/mysql --pid-file=/usr/local/var/mysql/USERNAMEnoMBP.pid
 8062 ttys005    0:32.95 /usr/local/Cellar/mysql/8.0.15/bin/mysqld --basedir=/usr/local/Cellar/mysql/8.0.15 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mysql/8.0.15/lib/plugin --log-error=USERNAMEnoMBP.err --pid-file=/usr/local/var/mysql/USERNAMEnoMBP.pid
 8723 ttys005    0:00.00 grep mysqld
```

# 解決方法

```mysql.server status```　したときに　```PID file could not be found (7939 8062 )```っていわれてたので


7939 8062のmysqldプロセスを切ります

```
$ kill 7939
```
```
$ kill 8062
```

スタートすると

```
$ mysql.server start
 Starting MySQL
 . SUCCESS!
```

なおった :relaxed:
クラウドのリソース命名ルールはバーバード大学がまとめたものを使うと便利になる

AWSやGCPなどで設計をする時、各リソースの命名ルールを先に作る必要がある。
技術的な問題ではないが、意外に悩まされる課題でもある。

その時には以下の
クラウドのリソース命名ルールはバーバード大学がまとめたものを使うと便利になるので、
おすすめしたい。


[https://confluence.huit.harvard.edu/display/CLA/Cloud+Resource+Naming+Conventions#CloudResourceNamingConventions-AWSAccountItems](https://confluence.huit.harvard.edu/display/CLA/Cloud+Resource+Naming+Conventions#CloudResourceNamingConventions-AWSAccountItems)
【Vue.js, React, Angular】事例から見るSPAフレームワーク

Vue.js, React, Angularといった各種のSPAフレームワークがどんな企業で使われているのか知りたくて、「SPA 事例」や「SPA 採用例」といったキーワードでググったけどめぼしい情報が出てこなかったので調べてまとめました。

## ソース
made with XXXを参考に、独断と偏見により有名な企業を5つずつ選出しました。FacebookがReact, GoogleがAngularを使っているのは自明なので除外しています。

* Vue.js https://madewithvuejs.com/
* React https://madewithreactjs.com/
* Angular https://www.madewithangular.com/

## Vue.js
開発者のEvan Youが台湾出身のためか中国で人気と言われています。

|企業|リンク|
|---|---|
|Alibaba|https://www.alibaba.com/|
|Baidu|https://www.baidu.com/|
|Expedia|https://www.expedia.com/|
|Nintendo|https://my.nintendo.com/|
|Line|https://store.line.me/home/|

Vue.jsはここで取り上げているフレームワークの中では最も後発で伸び盛りのため、これから採用例が増えてくると予想されます。国内の事例は以下の記事によくまとまっています。
https://qiita.com/00092/items/52d641af8d37e2b07916


## React
ギークな新興企業が好んで使っている、という傾向が強いです。

|企業|リンク|
|---|---|
|Netflix|https://www.netflix.com/jp/|
|Slack|https://slack.com/intl/ja-jp/|
|Uber|https://www.uber.com/jp/ja/|
|Airbnb|https://www.airbnb.jp/|
|Paypal|https://www.paypal.com/jp/home|

ここに挙げた企業は、Reactに関する情報発信や周辺ライブラリの開発によりコミュニティを盛り上げていっている存在という印象があります。

## Angular
Reactと対象的に、歴史のある大企業での実績が豊富です。

|企業|リンク|
|---|---|
|Microsoft|https://www.office.com/apps?auth=2|
|Forbes|https://www.forbes.com/|
|BMW|https://findadealer.bmw.com.au/#/dlo|
|Citibank|https://online.citi.com/US/ag/contactus|
|VMWare|https://clarity.design/|

AngularJS時代の実績も含めると、金融・政府機関など日本ではお堅いと位置付けられる業種での事例がさらに増えます。
https://www.madewithangular.com/categories/angularjs/

## まとめ
いかがでしたでしょうか？ こうして見ると、各フレームワークごとに色が見えてきて興味深いですね。個人的にはReactを採用している企業のラスボス感が印象的でした。
Rubyで作るGithubのadd~push効率化コマンド.

# 前書き
Githubでは自分の活動状況を生い茂る草で表現しています．<img width="731" alt="スクリーンショット 2019-03-25 10.10.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/241421/ec3f6154-3d1a-a515-be98-f2ae5b1a59b0.png">

実際にディレクトリに変更を加えて，pushするまでには以下の3つのコマンドを使用しています．

```terminal
// Githubに連携しているディレクトリ内
// originに自作のリポジトリが登録されています．
$ git add -A
$ git commit -m "add icons"
$ git push origin master
```

この一連の流れ，生い茂る草で自分のモチベーションを維持できるのではないかと考える僕は，**工程が多いよ！！**とツッコミを入れたくなります．こまめにプッシュした方が良いと思うので，工程を減らしたいと考えました．

# 実装

機能としては，

```terminal
// Githubに連携しているディレクトリ内
// originに自作のリポジトリが登録されています．
$ push_seq -A add icon
```
上記のコマンドで先ほどの3つのコマンドを自動で行ってくれます．
`-A`は`git add`のオプション指定です．
`add_icon`は`git commit -m`のコメント文です．

実装したのは以下の様なコマンドです．

```ruby:~bin/push_seq
#!/usr/bin/env ruby
require 'open3'
require 'shellwords'

add_opt = ARGV[0]
com_phrase = ARGV[1..-1].shelljoin                                                                              
add_opt = '-A' if add_opt.nil?
com_phrase = 'no_comment' if com_phrase.nil?

out, err, status = Open3.capture3("git remote -v")
out.split("\n").each do |line|
  if m = line.match(/^origin\s+git@(.+) \(push\)$/)
    puts m[1]
    system("git add #{add_opt}")
    system("git commit -m #{Shellwords.escape(com_phrase)}")
    system("git push origin master")
  else
    puts "Don't find origin branch."
  end
end 
```
簡単に説明をします．
`add_opt`と`com_phrase`はそれぞれadd時のオプションとcommit時のコメントに相当しております．それぞれの引数に指定がない場合は，`-A`と`no_comment`が代入されます．
`Open3`にて`git remote -v`を実行し，Githubに登録されているブランチ？を取得します．その後，そのブランチ内にoriginに対応するものがあるか確かめた後，３つのコマンドを実行します．

- 注意点が２つあります
    1. ~~commit時のコメント用に使用する第２引数には空白が入れることができない．~~(@sakuro様からのご指摘により解決いたしました．)
    2. branchに対応したpushができない．
- 解決策
    1. ~~第２引数には_(アンダーバー)等を空白の代わりに使用する．~~
    2. 第３引数などをコード内に用意してpush時に使用すればよい．

# （おまけ）僕の環境での自作コマンドの動かし方
Mac使ってます．
自作コマンドは`~/bin`に入れています．
terminalのシェルはfishです．
自作コマンドはfishの設定ファイル`~/.config/fish/config.fish`にailiasとしてPathを記載．

```config:~/.config/fish/config.fish
set PATH /usr/local/bin $PATH
alias push_seq '~/bin/push_seq'
```

これで使えるよ！
# 終わりに
毎度のことながら，何か思うところがあればご指摘お願いします．
ご指摘をいただけることで，僕も勉強になりますので助かっております．:boy_tone1:
Apache SolrJ で Core毎の文書数などを取得する


案外めんどくさかったのでメモです。

```java

package hello.solr;

import java.io.IOException;

import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.request.CoreAdminRequest;
import org.apache.solr.client.solrj.response.CoreAdminResponse;
import org.apache.solr.common.params.CoreAdminParams.CoreAdminAction;
import org.apache.solr.common.util.SimpleOrderedMap;

public class HelloGetCores {

	public static void main(String[] args) throws Exception {

		HttpSolrClient solrClient = new HttpSolrClient.Builder("http://localhost:8983/solr/").build();

		// Admin
		CoreAdminRequest request = new CoreAdminRequest();

		request.setAction(CoreAdminAction.STATUS);

		CoreAdminResponse adminStatusResponse = null;

		try {
			adminStatusResponse = request.process(solrClient); // throws SolrServerException, IOException
		} catch (SolrServerException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		System.err.println(adminStatusResponse.jsonStr());
		System.err.println("---");
		System.err.println(adminStatusResponse.getCoreStatus().jsonStr());

		for (int i = 0; i < adminStatusResponse.getCoreStatus().size(); i++) {
			// Core Name の取得方法(1)
			System.err.println("name: " + adminStatusResponse.getCoreStatus().getName(i));

			// Core Name の取得方法(2)
System.err.println(adminStatusResponse.getCoreStatus().getVal(i).get("name"));
			// 他情報の取得方法
System.err.println(adminStatusResponse.getCoreStatus().getVal(i).get("startTime"));

			{
				// 他情報の取得（javadocをよく読むか、JSON見ないとこの構造がわからないと思う。。）
				SimpleOrderedMap map = (SimpleOrderedMap) adminStatusResponse.getCoreStatus().getVal(i).get("index");
				System.err.println("numDocs: " + map.get("numDocs"));// Integer
			}
		}

	}

}


```
nvidia docker 上に pyenv をインストールして python を管理する


# モチベーション
docker上でpython3で実行したいと思うと、python3と毎回指定する必要がある。
単純にpythonと記述してpython3を実行するようにしたい。

# 方針
pyenvを入れる

# Dockerfile
` ~/.bashrc` のところを `mac` `ubuntu` に合わせて変更する。


```Dockerfile
 FROM nvidia/cuda:8.0-cudnn5-devel
 ENV DEBIAN_FRONTEND=noninteractive
 RUN apt-get update -y \
     && apt-get install -y \
     make \
     build-essential \
     libssl-dev \
     zlib1g-dev \
     libbz2-dev \
     libreadline-dev \
     libsqlite3-dev \
     wget \
     curl \
     llvm \
     libncurses5-dev \
     libncursesw5-dev \
     xz-utils \
     tk-dev \
     libffi-dev \
     liblzma-dev \
     python-openssl \
     git

 ENV HOME /root
 ENV PYENV_ROOT $HOME/.pyenv
 ENV PATH $PYENV_ROOT/bin:$PATH
 RUN git clone https://github.com/pyenv/pyenv.git $HOME/.pyenv
 RUN echo 'eval "$(pyenv init -)"' >> ~/.bashrc && \
     eval "$(pyenv init -)"
 RUN CFLAGS=-I/usr/include \
     LDFLAGS=-L/usr/lib \
     pyenv install -v 3.6.8 && \
     pyenv global 3.6.8
```
クラス変数とインスタンス変数

# クラス変数とインスタンス変数
前回まででクラスとインスタンス、クラス変数とインスタンス変数について説明していきました。
クラスとインスタンスについてわからない方は
[こちらのリンク](https://qiita.com/yuichir43705457/items/1c7d396ea07170f2a377)をご覧ください。

```school.rb
class Student

   def self.students_count
　　　puts "生徒の総数は30人です。"
   end

   def show_student_height
     puts "私の身長は１７０cmです。"
   end

end

student = Student.new
```

一応前回までのコード貼っておきます。

## クラス変数
クラス変数はクラス内で使える変数です。
クラス内であれば**インスタンスメソッド内**でも使う事ができます。
クラス変数もクラスメソッド同様、クラス内で共通の情報に対して使います。

### クラス変数の定義
それではコードに定義していきます。今回はクラス内共通の情報である生徒の総数を変数に代入したいと思います。

```school.rb
class Student
　　# クラス変数を定義
　　@@students_total = 30
   def self.students_count
　　　puts "生徒の総数は#{@@students_total}人です。"
   end

   def show_student_height
     puts "私の身長は１７０cmです。"
   end

end

student = Student.new
```
これで定義する事ができました。
クラス変数を定義するときは変数名の前に**「@@」**をつけることにより定義する事ができます。
今回は生徒の総数を変数にしたのでクラスメソッド内（self.students_count）でクラス変数を呼び出しています。
変数に関しては
　　　・クラス内で何度も使う情報
　　　・コードが冗長になってしまうもの
などに用いるのが効果的だと思います。
また変数名に関しても名前をみて一目でなんお変数かわかるような名前にしましょう。

## インスタンス変数
続いてインスタンス変数です。
インスタンス変数はインスタンスごとの個別の情報に対して使います。今回の例で言うのであれば**「生徒の身長」**これは個別の情報ですね。
なのでこちらを変数として定義していきたいと思います。

###インスタンス変数の定義

```school.rb
class Student
　　@@students_total = 30
   def self.students_count
　　　puts "生徒の総数は#{@@students_total}人です。"
   end

   def show_student_height
　　　# インスタンス変数の定義
　　　@height = gets.to_i
     puts "私の身長は#{@height}cmです。"
   end

end

student = Student.new
```

これで定義できました。
インスタンス変数を定義するときは変数名の前に**「
@」**を一つつけます。
また生徒一人一人の身長は違うので変数にはgets.to_iを代入しました。

getsメソッドはユーザーに入力をさせるメソッドで入力するまで一旦処理を止めます。

to_iメソッドは文字列を数値オブジェクトに変換する役割を持っています。getsメソッドの返り値は文字列ですので入力した値を数値に変換しています。

## 最後に
今回はクラスメソッドとインスタンスメソッドについて説明していきました。
普通の変数と定義の仕方が違い、どちらの変数として定義していくのか考えて使う必要があります。

最後まで読んでいただきありがとうございました。
カスタム表示ラベル、カスタム設定、カスタムメタデータ型

#1.カスタム表示ラベル
##概要
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/c390ac83-6fbc-1503-77a8-e15b3affa9f5.png)
##使用例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/f2a1f518-0995-4988-190f-fb6f03f50bb5.png)
#２．カスタム設定
##概要
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/dd447a93-968f-fe8b-19dd-9f6d3286177d.png)
##使用例(リストカスタム設定)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/92952daf-c96e-6a23-0e70-836acab7e0e6.png)
##使用例(階層カスタム設定)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/0318c561-4c4f-f79a-e172-2c9a15fe9013.png)
##注意事項
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/6d1bce68-d3bf-d474-18e5-7d7581037063.png)
#３．カスタムメタデータ型
##概要
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/56bd2748-71c6-5ac7-295d-4a1b804dcb8a.png)
##使用例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/5e5e49ae-334c-aa25-3592-efd3b44825b9.png)
##カスタムメタデータとカスタム設定の比較
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/2d1e6e5e-3749-0183-dfb5-2783fc430619.png)
##注意事項
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/a15b8ccd-5a40-3a6b-c99e-af9a0ef29c66.png)
Jenkins(blueocean)をUbuntuにDockerイメージで構築

CIツールの概念に触れるために、Jenkinsを使ってみる
* Ubuntu 18.04(Vagrant:VirtualBox)
* Jenkins(blueocean(Dockerイメージ))
* GitHub連携(privateレポジトリ)

### Docker CEを Ubuntu にインストール
* 古いdockertの削除 
* ダウンロードできるようにツールを準備
    
    * 削除

        sudo apt-get remove docker docker-engin docker.io containerd runc
    * 準備    
    apt-get update
    sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

* ダウンロード
* フィンガープリントの確認 
    
    * ダウンロード   
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

    * 確認 
    
        apt-key fingerprint 0EBFCD88

    ````
    pub   rsa4096 2017-02-22 [SCEA]
          9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
    uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
    sub   rsa4096 2017-02-22 [S]
    ````
* レポジトリの追加
    sudo add-apt-repository
* インストール
sudo apt-get install docker-ce docker-ce-cli containerd.io

### Jenkinsの設定
* jenkinsのdockerイメージを取得
  docker pull jenkinsci/blueocean

* 起動
  docker run -p 8080:8080 jenkinsci/blueocean

* ログイン
  adminログイン後メニューより設定

* プラグインインストール
  推奨インストールを選択し、各プラグインインストール

* ジョブ作成
  ユーザーを作成し、新規ジョブ登録

* ビルドジョブの設定
  GitHubの設定を行い、ビルドジョブを定義

### このあとやりたいこと
* ビルド→自動テスト(Ruby?PHP?の簡単なテストプロジェクト)→デプロイ
* BlueOceanについて
GAEで支払いユーザーと紐づかないプロジェクトができてしまいタイムアウトする


結構特殊な状態っぽいので他の人にはあまり参考にならなそうだが、原因がわからずにテンパったので将来のためにメモ。

あるGoのプログラムをGAEにデプロイしたところ、全く応答が返ってこず、しばらくするとタイムアウトのエラーログが吐かれるという問題が起こった。

理由がわからずリロードを何回かしたところインスタンスが６個立ち上がってしまい料金的な意味でも急いで落とそうとしたのだが落とすのにもエラーで失敗する状態。

正直めちゃくちゃ焦ったが、色々調べたところGAEの「1 日の使用量上限」の項目が$0.00になっているのを発見。しかも変更しようとしても出来ない（設定画面に行っても項目が無い）。

なんだこれ、と思い支払い設定画面に行くとこの**GAEプロジェクトと支払いユーザーの紐付けが出来ていない**だけだった。。

どうやらプロジェクト数の上限を超えていたらしい。

ただ、通常はプロジェクト数の上限を超えているとGAE自体新しく作成できないはずなのだが、なぜ作れてしまったのかは不明。しかも、GAE側でもプロジェクト数が上限超えているのに支払いアカウントに紐づいていないアクセスが来るのが想定外らしく、インスタンスがボンボン立ち上がったり、エラーログもアクセスはしようとしてもサーバーが応答を返さないのでエラーみたいなログしか出ていなかった。

支払いユーザーの紐付けをしたところなんの問題もなく動いたのでとりあえずめでたし。

また同じようなことが起きたらもう少し深掘りして調査するかもしれない。
Qiitaのユーザーページにタグ検索のリンクを追加するChrome拡張機能「Qiitag Link」を作った


# ユーザーが投稿した記事中からタグ検索したい

**ユーザーごとにどんな記事を投稿しているのかはユーザーページを見ればグラフで表示されているので一発でわかる**のですが、
じゃあその**タグの記事を見たいとなると、ユーザーページから絞れないし、検索の時にオプション指定する必要があったりでめんどくさい**。
ので、グラフで表示されてるタグを見て検索リンクを表示させるChrome拡張を作ってみました

↓からインストールしてください
つ [Qiitag Link - Chrome ウェブストア](https://chrome.google.com/webstore/detail/qiitag-link/holofoniknjhilakfpcabnealmhpmeid)

# 画面表示例

この拡張を有効にしてユーザーページ（ https://qiita.com/sola-msr ）へ行くと↓こんな感じでグラフで表示されているタグの検索リンクが表示されます
![qiitag_link.jpg](https://qiita-image-store.s3.amazonaws.com/0/85815/b682b3e9-e42c-f511-d10d-36512e9b7d41.jpeg)

「PHP」のリンクをクリックすると以下のようにユーザーとタグを絞り込んだ状態の検索結果画面へ遷移します。

![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/6bbb3cb2-3f51-799e-079c-c36d4ff43d3e.jpeg)

# ソース

実質処理的にはこれだけです。
~~JavaScriptわかんないので間違いは普通にありそうです。~~

```contents.js
let qiitaUrl = location.pathname.split('/');
let addTagLinkHtml = '';

if (qiitaUrl[1] !== '' && typeof qiitaUrl[2] === "undefined") {
    window.onload = function() {
        let userTagElem = document.getElementsByClassName('c3-legend-item');
        addTagLinkHtml = '<div id="qiita-tag-search-link">';

        if (userTagElem.length > 0 && qiitaUrl[1] !== '') {
            addTagLinkHtml += '<ul style="text-align:center;"><li style="display: inline-block; width: 5%;">タグ：</li>';
            for (var i = 0; i < userTagElem.length; i++) {
                if (typeof userTagElem[i] !== "undefined" && userTagElem[i].textContent != '' && userTagElem[i].textContent != 'Others') {
                    addTagLinkHtml += '<li style="display: inline-block; width: 10%;"><a href="https://qiita.com/search?utf8=%E2%9C%93&sort=&q=user%3A' + qiitaUrl[1] + '+tag%3A' + userTagElem[i].textContent + '" style="color:#337ab7;">' + userTagElem[i].textContent + '</a></li>';
                }
            }
            addTagLinkHtml += '</ul></div>';

            document.getElementById('main').insertAdjacentHTML('afterbegin', addTagLinkHtml);
        }
    };
}
```

# GitHub
つ [sola-msr/qiitag-link](https://github.com/sola-msr/qiitag-link)

# おわり

- 一度Chromeの拡張機能作ってみたかったんでいい機会でした（？）
- なにかおかしな所あれば指摘おねがいします

# 参考URL
- [Chrome拡張機能の開発は意外と簡単？！その１ | しもた帳](https://shimota.app/chromeext_create_01/)
- [Chromeのオリジナル拡張機能を開発しよう（ソースコードあり） | 東京上野のWeb制作会社LIG](https://liginc.co.jp/web/tool/browser/163575)
- [Google Chromeのエクステンションを作成する方法 – ajike developer's blog – UXデザイン会社アジケの開発者ブログ](https://ajike.github.io/build-chrome-extension/)
- [Chrome拡張　備忘録　１から１０まで - Qiita](https://qiita.com/Tachibana446/items/696bb93bd4a23525cbb0)
- [Chrome 拡張機能のマニフェストファイルの書き方 - Qiita](https://qiita.com/mdstoy/items/9866544e37987337dc79)
swi-prologで、utf-8のバイトシーケンスをコードポイントリストに変換し文字列にする

### はじめに

swi-prologでtcpサーバーを作る必要があって、送受信はできるのだが、マルチバイトの文字を送受信する時に、文字列にならない。socketのストリームからは、バイトシーケンスのリストで受け取るが、asciiの場合は、自動的に文字に変換する（というか、utf8のバイトシーケンスとprologの自動処理するコードポイントが一致しているからで、特に変換しているのではないのだろう）。マルチバイトだとダメなのだ。

swi-prologのmanualを1日にらめっこしていたが、うまく変換する手続きが見つからない（あると思うのだが・・・・）。utf8コードをコードポイント列にする宣言文を用意しようかと思ったが、7000行以上になるのでやめた。

結局、変換する手続きをprologで書くことになった。以下がその結果である。

### swi-prologプログラム

符号化のロジックについては、[UTF-8の符号化方法について](http://www.go-next.co.jp/blog/web/php/25499/)を参照させていただいた。

prologでビット演算しなければならないので、二の足を踏んだが、意外と簡単だった。実質9行で済むというのもprologらしいのかもしれない。

（注）utf8の1バイト文字と3バイト文字しか対応させていない。

```prolog:codepoint.swi
%%
%% utf8のbyte sequenceをprolog内の文字列に変換する
%%

%% （例）
%% byte sequence
%% ライオン => [227,131,169,227,130,164,227,130,170,227,131,179]
%% lion => [108, 105, 111, 110]
%% アスキーとマルチバイトの混合
%% ラlイiオoンn = [227,131,169,108,227,130,164,105,227,130,170,111,227,131,179,110]
%% codepoint
%% ライオン => [12521, 12452, 12458, 12531]

%% utf8のバイトシーケンスを文字列に変換する
%% asciiが終わってマルチバイトも調べないために、最後にカットを入れている
%% 何れにしても、ここでバックトラックは不要なのでつけておく
%% 途中経過のコードポイントリストも出力する
getstring(L,X) :- getcodepoint(L,Y),write(Y),atom_codes(X,Y),!.

%% 再帰の終了条件
getcodepoint([],[]).
%% アスキー文字の場合
getcodepoint(L,[H|X]) :- [H|T] = L
                ,isascii(H),getcodepoint(T,X).
%% utf8マルチバイトの場合
getcodepoint(L,[X1|X2]) :- headthree(L,Y,T),
                utf8iso(Y,X1),getcodepoint(T,X2).

%% マルチバイトの場合、頭の3個を取り出して、残りをTに入れる
headthree(L,[X1,X2,X3],T) :- [X1|T1]=L,
                [X2|T2]=T1,[X3|T]=T2.

%% 最高bitが0ならば、アスキー文字
isascii(A) :- (A >> 7) =:= 0.

%% 3バイトのutf8コードをコードポイントに変換する
%% 00001111 -> 15
%% 00111111 -> 63 
%% nth1はリスト(L)の指定位置(N)の要素を取り出す(X)
utf8iso(L,X) :- nth1(1, L, Y1), Z1 is 15 /\ Y1,
                nth1(2, L, Y2), Z2 is 63 /\ Y2,
                nth1(3, L, Y3), Z3 is 63 /\ Y3,
                X is Z1 << 12 \/ Z2 << 6 \/ Z3. 
```

### 実行結果

プログラムの冒頭コメントにある例などを実行させてみた。

```prolog
?- ['codepoint.swi'].
true.

?- getstring([108, 105, 111, 110],X).
[108,105,111,110]
X = lion.

?- getstring([227,131,169,227,130,164,227,130,170,227,131,179],X).
[12521,12452,12458,12531]
X = ライオン.

?- getstring([227,131,169,108,227,130,164,105,227,130,170,111,227,131,179,110],X).
[12521,108,12452,105,12458,111,12531,110]
X = ラlイiオoンn.

?- getstring([228,187,138,230,151,165,227,129,175,232,137,175,227,129,132,229,164,169,230,176,151,227,129,167,227,129,153,227,129,173],X).
[20170,26085,12399,33391,12356,22825,27671,12391,12377,12397]
X = 今日は良い天気ですね.

?- 
```

試していただければ幸いである。

サーバーから送信する時に、逆変換が必要になるので、上記プログラムを双方向に改良しなければならない。（その後作成した双方向のプログラムはブログ記事[「知識をクライアントに送付するprologサーバー」](http://www.ibot.co.jp/wpibot/?p=2681)の中に記載した）
git設定関連備忘録

## gitの設定関連で重宝している記事を備忘録としてまとめる
+ 初期設定：https://qiita.com/wnoguchi/items/f7358a227dfe2640cce3
+ ssh接続：https://qiita.com/shizuma/items/2b2f873a0034839e47ce
+ ubuntuでpbcopyしたい：https://qiita.com/yoshikyoto/items/1676b925580717c0a443
+ abort：https://qiita.com/chihiro/items/5dd671aa6f1c332986a7
+ gitignore：https://gitignore.io/
Raspberry Piで定点カメラを作っていて、画像ファイルは保存しないでWebサーバーにアップロードしたい！と思ったら意外と簡単にできたというお話

# はじめに

Raspberry Piを何個も使って色々と試しているなかで、定点カメラを作った時に撮影した画像を一時的にでもSDカードやRAMディスクなどに書き込まないでサーバーに送信できないだろうかと考えたら意外と簡単にできたので、まとめてみます。

# 用意するもの

- Raspberry Pi
- USBカメラ
- Webサーバー

# 環境構築

Raspberry PiへのOSインストールは複数の記事があるのでそちらにお任せするとして、OSインストール直後の作業は以下のとおり。

```
sudo apt update
sudo timedatectl set-timezone Asia/Tokyo
sudo apt install -y python-opencv python-requests
```

# 送信スクリプト作成

以下の手順で送信スクリプトを作成

```
nano fileupload.py
```

```py:fileupload.py
#!/usr/bin/env python

import cv2
import time
import requests
from datetime import datetime

cap = cv2.VideoCapture(0)

cap.set(3,1280)
cap.set(4, 720)

ret, frame = cap.read()

url = "http://[your server address]/getfile.rb"

files = {'imgData': cv2.imencode('.jpg', frame)[1].tobytes()}
res = requests.post(url, files=files)
print(res.text)

cap.release()
```

作成したら実行権限をファイルに付与

```
chmod a+x fileupload.py
```

# 受信スクリプト作成

受信するサーバーにはApacheとRubyがインストールしてあって、HTTPでアクセスができるようになっているものとして、以下の送信スクリプトを作成

```rb:getfile.rb
#!/usr/bin/env ruby

require "cgi"
require 'date'

formData = CGI.new

print "Content-type: text/html\n\n"

filename = Time.now.strftime("%Y%m%d%H%M")

open("#{filename}.jpg","wb") do |fh|
  fh.binmode
  fh.write formData['imgData'].read
end

puts "OK"
```

# 動作確認

送信・受信のスクリプトを設置したら、Raspberry Piで以下のように実行して「OK」と表示されればアップロード成功

```
./fileupload.py
```

# 自動撮影

10分間隔で自動的にアップロードするよう設定します。

```
crontab -e
```

以下の一行を追加

```
*/10 * * * * /home/pi/fileupload.py
```

できた！
esa のメインカラムの横幅をウインドウいっぱいに広げる Google Chrome 拡張を作りました

# 概要

esa のメインカラムの横幅は 800px に固定されています。ときどき、ネストが深いリストや 1 行が長いコードブロックを含んだ記事の場合、横幅を広げられたら見やすくなりそうだったので Google Chrome 拡張を作りました。

# 機能

- 拡張機能を有効にするとメインカラムの横幅を 100% に変更します。
- 右カラムは非表示になります。
- 右上の拡張機能のアイコンからこの機能の ON/OFF が行えます。(インストール直後は OFF になっているので、`Enabled` ボタンをクリックしてください)

## 適用されたイメージ

![wide-column-model-for-esa.png](https://qiita-image-store.s3.amazonaws.com/0/16758/32196a5b-b114-df2a-3caa-6b58ca1826ae.png)


# Chrome Web Store

https://chrome.google.com/webstore/detail/wide-column-mode-for-esa/bjbeipanlhaibjhnjbipfgpoafljiili?hl=ja

# ソースコード

https://github.com/suzuki86/wide-column-mode-for-esa

# 今回得られた Google Chrome 拡張機能に関する知見

- 設定値を保存するのに `chrome.storage.local.set()` メソッド、設定値を取り出すのに `chrome.storage.local.get()` メソッドが便利でした。
- 拡張機能のアイコンをクリックしたときに表示される HTML (および Javascript ) から、Content Script で定義されているメソッドを呼び出すには、 `chrome.tabs.sendMessage()` メソッドと `chrome.extension.onMessage.addListener()` メソッドを使って通信する必要がありました。
国家の生成法🌐

# 🌏国家を創る🌏
![country4.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/9ef753a2-717f-6372-3cd1-cf468b83451b.gif)

今回は自動生成した大陸に国家を建立していきます。

# 🌏自動生成アルゴリズム🌏

今回生成する地形の**自動生成アルゴリズム**は、[**"ボロノイ図法"**](https://qiita.com/Gaccho/items/08710de2c57da912b822)を使用します。
[**(>> ボロノイ図法について解説した記事はこちら)**](https://qiita.com/Gaccho/items/08710de2c57da912b822)

![m1.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/9705715f-0d89-b585-b66a-fb6a5c778670.gif)

# 🏯初期国家の生成🏯

最初に設置する初期国家の生成は[**"イベント生成"**](https://qiita.com/Gaccho/items/2269dc8f01d6faf24cb3)を使用します。
[**(>> イベント生成について解説した記事はこちら)**](https://qiita.com/Gaccho/items/2269dc8f01d6faf24cb3)

```cpp
dtl::utility::stl::setItem(matrix, n, set_value, clear_value);
```

**`setItem`関数で国家のスタート地点を設定します。**

<a href="https://qiita.com/Gaccho/items/2269dc8f01d6faf24cb3"><img src="https://qiita-image-store.s3.amazonaws.com/0/213065/d64cee33-6bf8-a692-1b11-a58aee21324e.png" width="384px"></a>

赤い点部分が**国家のスタート地点**です。

# ⚔領土の拡大⚔

```cpp:領土拡大関数を宣言
template<typename Matrix_, typename Matrix_Int_>
void territoryExpansion(Matrix_& matrix_, const Matrix_Int_ find_value_, const Matrix_Int_ set_value_);
```

```cpp:領土の周りを1/2の確率で領地にする
 for (std::size_t row{ 1 }; row < matrix_.size() - 1; ++row)
  for (std::size_t col{ 1 }; col < matrix_[row].size() - 1; ++col)
   if (matrix_[row][col] == find_value_) {
    if (matrix_[row][col - 1] <= 1 && mersenne_twister_32bit.probability()) matrix_[row][col - 1] = set_value_;
    if (matrix_[row][col + 1] <= 1 && mersenne_twister_32bit.probability()) matrix_[row][col + 1] = set_value_;
    if (matrix_[row - 1][col] <= 1 && mersenne_twister_32bit.probability()) matrix_[row - 1][col] = set_value_;
    if (matrix_[row + 1][col] <= 1 && mersenne_twister_32bit.probability()) matrix_[row + 1][col] = set_value_;
   }
 dtl::utility::stl::replace(matrix_, find_value_, set_value_);
```

![country6.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/a6bd3659-65d9-226a-032c-0bc5f652c9fe.gif)

各国家のスタート地点からじわじわと領土を拡大していきます。

### 陸地の領土がある程度埋まるまで拡大し続ける

```cpp:100回の領地拡大を行う
for (int i{}; i < 100; ++i)
 territoryExpansion(matrix, find_value, set_value);
```

![country5.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/d5aa635a-d175-5155-f6be-d47205701a99.gif)

これで海部分の領土を取り除けば完成です。

# 🌏完成🌏

![country4.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/9ef753a2-717f-6372-3cd1-cf468b83451b.gif)

無事に国家を建立することが出来ました！

# [実装ライブラリ(ソースコード)](https://github.com/Kasugaccho/DungeonTemplateLibrary)

今回解説した自動生成は**["Dungeon Template Library"](https://github.com/Kasugaccho/DungeonTemplateLibrary)**を使用して実装されています。
ぜひ、活用してみてください！

[![logo640.gif](https://qiita-image-store.s3.amazonaws.com/0/213065/b84a7834-2042-6704-fbbe-782a31f06091.gif)](https://github.com/Kasugaccho/DungeonTemplateLibrary)


# ソースコードのライセンス

These codes are licensed under CC0.
[![CC0](https://mirrors.creativecommons.org/presskit/buttons/88x31/svg/cc-zero.svg "CC0")](http://creativecommons.org/publicdomain/zero/1.0/deed.ja)

この記事のソースコードはCC0ライセンスとします。
ぜひ、自由に改変して遊んでみてください。

**最後までお読みいただきありがとうございました！**
Railsでassets下の画像URLだけを取得する

## とりあえず日本語の情報が少なかったのでメモ
Railsでassets下に置いた画像のURLだけ取得するには、

```
asset_url("images/以下のパス")

asset_url("admin/icon.png")    // 例
asset_url "admin/icon"         // 例：()と拡張子を省略
```

というようにしてやればできました。

## 経緯
Viewでassets以下の画像を表示する方法として`image_tag("ファイル名")`ヘルパーがありますが、これはURL含めた<img>タグ全部を返すヘルパーです。私はどうしてもそのURLだけを取得したかったのです。

（以上です、この先は私の日記です）

### production環境への移行に躓く
このヘルパーが必要になった経緯をメモ（日記）します。

まず私はWeb開発初心者でして、development環境でRailsアプリを元気に作って、ようやく完成と言える所まで来たので、

「さあ！本番環境に移そう、そういえば環境をproductionにしないといけないとか聞いたことある・・エラー画面消すだけじゃだめなん？」

とか思いつつ、「今までの開発みたいに検索したらたくさん情報出てきてくれるだろうな〜」と思って検索しました。そしたら急に、今までの親切なネットはどこへ・・って悲しくなるほど情報が少ないんですね。「初心者向け！RailsアプリをProduction環境にしよう！」みたいな記事が6件ぐらいヒットするのかと思ってました。実はみんなdevelopmentのまま世に出してるのでは・・・と思ってしまう。

それでも親切な記事はいくつかあって、それを見ると、特に説明もなくプリコンパイルがどうとか暗号化の鍵がどうとか書いてあったので、はーと思いつついろいろ調べました。そしたらどうやらproduction環境ではassetファイルを全部コンパイルしてpublic以下に静的なファイルとして設置しないといけないらしいですね。

こういうのって常識なんだろうなあと意気消沈しつつ、`rails assets:precompile RAILS_ENV=production`ってやればプリコンパイルできるらしいと知り実行するも、yarnが必要です的なエラーがでて、「はーなんでjsのパッケージ使うんだrubyでやってよ」と愚痴りながらインストールしました。

### やっとproduction環境に！しかし画像が読み込まれない
ようやくproduction環境になり、いくつかのエラーを乗り越えてサイトが表示されたのですが、画像が表示されない・・。ただこれはすごく親切な記事がヒットして助かりました。

developmentではヘルパーを使わずに画像にアクセスするときは`assets/images/logo.png`というようなパスでOKでしたが、productionでは全てのファイルにフィンガープリントが付いているのでこれではアクセスできないとのこと。

ということで、直接`assets/...`と書いていた箇所の画像が読み込まれていなかったようです。使用しているjsのパッケージの都合上URLが必要なので、それを動かすためにはフィンガープリント付きの画像URLだけを取得する方法が必要でした。調べた結果、この記事の始めに示した方法がわかったという日記でした。
田中コーパスを日英対訳形式に変換

## 概要

機械学習で使える日英対訳コーパスのひとつ、田中コーパスを使いやすくする前処理用のコードを書いた。

## 田中コーパス

「日本人の大学生が授業の一貫として集めた対訳文（多少のノイズあり）」(「[日本語対訳データ](http://www.phontron.com/japanese-translation-data.php?lang=ja)」)。研究用・商用ともに無料で利用できる。

日本語文、英文とも短くまとまっていて、機械的処理には向いていそうである。日本語文は自然。英訳は少し教科書的で硬い感じはある。

[田中コーパス]([http://www.edrdg.org/wiki/index.php/Tanaka_Corpus])はここからダウンロード可能。

中身を見るとこんな感じ。

```
A: ムーリエルは２０歳になりました。	Muiriel is 20 now.#ID=1282_4707
B: は 二十歳(はたち){２０歳} になる[01]{になりました}
A: すぐに戻ります。	I will be back soon.#ID=1284_4709
B: 直ぐに{すぐに} 戻る{戻ります}
A: すぐに諦めて昼寝をするかも知れない。	I may give up soon and just nap instead.#ID=1300_4727
B: 直ぐに{すぐに} 諦める{諦めて} 昼寝 を 為る(する){する} かも知れない
A: 愛してる。	I love you.#ID=1434_4851
B: 愛する{愛してる}
A: ログアウトするんじゃなかったよ。	I shouldn't have logged off.#ID=1442_4858
B: ログアウト~ 為る(する){する} ん[03] だ{じゃなかった} よ[01]
```

１対の対訳が `A:` と `B:` という２つ行に分かれて説明されている。対訳情報は A の行に置かれている。
対訳のみに関心がある場合、次のような形式に変換したいところだ。

```
ムーリエルは２０歳になりました。	Muiriel is 20 now.
すぐに戻ります。	I will be back soon.
すぐに諦めて昼寝をするかも知れない。	I may give up soon and just nap instead.
愛してる。	I love you.
ログアウトするんじゃなかったよ。	I shouldn't have logged off.
```
日本語文と英語文はタブで区切られている。

この変換を可能にするコードを Python 3 で書いた。

## 変換用コード(Python 3)

```python:convert.py
import re


while True:
    try:
        line = input()
        if re.match(r'A: ', line):
            line = re.sub(r'\AA: ', '', line)
            line = re.sub(r'#ID=.*\Z', '', line)
            print(line)
    except EOFError:
        break

```

## 使い方

1. [田中コーパス]([http://www.edrdg.org/wiki/index.php/Tanaka_Corpus])のページで、「complete version (UTF-8)」のリンクを探して、対訳データをダウンロード(examples.utf.gz)。
2. `gunzip examples.utf.gz` を実行して解凍し、`examples.utf` ファイルを得る。
3. `python convert.py < examples.utf > tanaka_corpus.txt` を実行。 `tanaka_corpus.txt` に前処理済みのデータが入っている。
【勝手に毎日投稿祭り】TeraTermのSCP転送機能使ってますか？

※1週間限定で、「勝手に毎日投稿祭り」と題して毎日投稿しています。
ぜひぜひ、皆さんも便乗して下さい。

##サーバで作業していると、ファイル転送って使う機会ありますよね。
![118654.jpg](https://qiita-image-store.s3.amazonaws.com/0/235933/4ca16cc3-cc75-81a6-3d08-1c0be4eb1582.jpeg)

使う際には、FFFTPを使用したり、WinSCPを使ったり、ツールを使ってデータを送ったりもらったりすると思うのですが、実は、TeraTermでログインしているなら、TeraTermで転送してしまった方が、早いです。

TeraTermを使って、転送機能を使う方法を紹介します。

###TeraTermのSCP転送
まず、ファイルタブにある、SSH SCPをクリックします。
[![Image from Gyazo](https://i.gyazo.com/15bc377e59c857c46abf1e055a532c97.png)](https://gyazo.com/15bc377e59c857c46abf1e055a532c97)

ここで、以下のようなSendとReceiveの枠が出てきます。クライアント(Windows作業端末等)から、サーバに対してデータを送るのかもらうのかの違いです。
[![Image from Gyazo](https://i.gyazo.com/1f4eb11ac96d862fabfab7c2bbe71d41.png)](https://gyazo.com/1f4eb11ac96d862fabfab7c2bbe71d41)

#####サーバに送る場合
上側のSendを使う枠に入力する。

From：クライアントから送りたいデータの格納場所を指定
To：サーバの送り先を指定
※Fromは、入力欄右側の「…」で、格納先を選択できますが、Toは、自分で打ち込まないといけないので、パスを覚えてない場合は、予めパスをコピーしておく
[![Image from Gyazo](https://i.gyazo.com/8079943af1bd24ee62ab41c19b756fb8.png)](https://gyazo.com/8079943af1bd24ee62ab41c19b756fb8)

入力後は、Sendを押せば、転送が完了する。軽いファイルだと一瞬で終わる。
[![Image from Gyazo](https://i.gyazo.com/e9313ff75a5e863dd31adb53d0c11fb3.gif)](https://gyazo.com/e9313ff75a5e863dd31adb53d0c11fb3)



#####サーバからファイルをもらう場合
下側のReceiveを使う枠に入力する。

From：サーバから送りたいデータの格納場所を指定
To：クライアントのもらい先を指定
[![Image from Gyazo](https://i.gyazo.com/d23b5cbd016078e81d08385a17a946db.png)](https://gyazo.com/d23b5cbd016078e81d08385a17a946db)
入力後は、Receiveを押せばファイル転送される。
[![Image from Gyazo](https://i.gyazo.com/7e25490f6a0b58ab64a1fbf24c53d978.gif)](https://gyazo.com/7e25490f6a0b58ab64a1fbf24c53d978)

###マメ知識
ちなみにファイルタブからSCPを使わなくても、ドラック＆ドロップでもデータは送れる。
[![Image from Gyazo](https://i.gyazo.com/ff85c38e75bb7263e5ac4df7e2d5c49a.gif)](https://gyazo.com/ff85c38e75bb7263e5ac4df7e2d5c49a)

また、転送とは関係ないが、ショートカットキーを覚えてしまうと、TeraTermの作業も効率よく行える。
例えば、同じサーバへアクセスするブラウザを複製したい場合は、```Alt＋d```でパスワードを入力することなく複製できる。他には、新しい接続先にアクセスする場合は、```Alt＋n```、TeraTermを閉じる場合は、```Alt＋q```など、覚えると作業効率もアップするので、是非、使ってみて下さい。
Node.jsでMySQL 8.0へ接続しようとする時に発生するエラー

#事象
Node.jsでMySQL 8.0へ接続しようとする時に、以下のエラーでちょっとハマりました。
クライアントツールでは問題なくSQLを実行できるのに、Node.jsからはエラーが発生してしまいました。

```
ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
```


#環境
　OS: Windows 10 Home 64bit
　DB: MySQL Server 8.0 Community Edition
　node: v10.14.2
　npm: 6.4.1
　mysql: 2.16.0

#原因・解決策
MySQL8.0でパスワードの認証形式が変更されているが、
Node.jsの「mysql」にはまだ実装されていないことが原因でした。

認証方法を「mysql_native_password」に変更することで、
この問題は解決できました。

以下のSQLを実行することで認証方法を変更することが出来ます。
ユーザー名とパスワードは各自の環境に置き換えてください。

```SQL
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'
```

参考になったサイト
[stackoverflow.com](https://stackoverflow.com/questions/50093144/mysql-8-0-client-does-not-support-authentication-protocol-requested-by-server/50961428:embed:cite)
Mastodonのプロフィールリンクにrel="me"のチェックマークを入れる方法[keybase, twitter]

![](https://raw.githubusercontent.com/mba-hack/images/master/mastodon-profile-link-twitter-verified.png)

現在、mastodonとkeybaseは統合されました。

最新の情報はこちらからお願いします。

[MastodonのKeybase統合について](https://qiita.com/syui/items/b60f8e1920930eff76b0)

https://qiita.com/syui/items/b60f8e1920930eff76b0

### mastodon verified keybase

mastodonは、profileのlink先にrel="me"が付いている場合、verified(認証マークが付く)します。

[keybase.pub](https://keybase.pub)というものがあります。これは、[keybase.io](https://keybase.io)が提供するweb serverで、index.md,htmlを置くと、web pageを表示できます。

よって、keybase.pubを使って、keybaseをmastodon認証してみました。ちょっと迂遠なやり方ですけどね。linkがkeybase.io/${USER}でないため。

https://keybase.pub

使い方は簡単で、アプリをインストールして、`/keybase/public/${USER}`にhtml,mdファイルを置きます。ここがrootになります。そして、domainは、${USER}.keybase.pubになります。

ファイル一覧は、`https://keybase.pub/${USER}`になります。

### mastodon verified twitter 

twitterのlinkって、短縮形なので、そのへんが難しいんじゃないかと思っていたら、できました。


やったことは、以下。

```
1. TwitterのProfile-Linkに"https://mstdn.syui.cf/@syui"を載せて保存する

2. TwitterのProfileからMastodonへのLinkを踏む、当然、Linkはt.coのかたちになっている。

3. Mastodon User Pageに飛ばされる。そこでTwitterへのProfile-LinkがVerifiedする
```

おそらく、MastodonへのLinkをTwitter Profile-Linkに登録後、t.coのLinkを踏む必要があったんじゃないかなって思います。

https://mastodon.social/@Gargron/100749399047652462
ServersMan@VPS+nginx+Let’s Encrypt使おうと思ったらつまずいた件(2019.03版)

ServerMan@VPSのCentOS7では[こちら](https://www-wp.dream.jp/search.php/?p=23141)の通りyum installが物によってコケる現象があって、いろいろつまずいたのでメモ

# 最終的にこうすればよいかと

- とりあえずnginxでhttpアクセスできるようにしておく。

以降でcertbot-autoが自動的に.conf関連をいじってくれます。

- certbot-autoは公式の物でよいかと。

https://certbot.eff.org/lets-encrypt/centos6-nginx

```
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
```

- yum install関連がコケるので以下のサイトを参考に自分でインストールした

https://www.kurage.net/tech/328

```
sudo yum install -y epel-release
sudo yum install -y python-pip
sudo pip install virtualenv
```

- 以上のサイトを組み合わせた渾身の一撃でうまく設定できました笑

```
sudo /path/to/certbot-auto --nginx --no-bootstrap
```

うまくいかなかったらコメントください。いつか返信します
PHP7.4ではPEARがインストールされなくなる

# Disable PEAR

2019/02/01に[Disable PEAR by default](https://github.com/php/php-src/pull/3781)という[プルリク](https://github.com/php/php-src/pull/3781)が提出され、2019/02/11にマージされました。

[commit](https://github.com/php/php-src/commit/e93d6d97aab7a5de1f7b8dc750ca9d08214de8c4)からmerge日はどうすればわかるのだろう？


## 内容

> Installation of PEAR (including PECL) is no longer enabled by default. It can be explicitly enabled using --with-pear. This option is deprecated and  may be removed in the future.

PEAR(PECLを含む)は、デフォルトではインストールされなくなりました。
`--with-pear`で明示的に有効にしなければなりません。
このオプションは非推奨であり、将来削除される可能性があります。

これまではPHPをインストールすると自動的にPEARも入ってきていましたが、PHP7.4以降は`--with-pear`を明示しないかぎりインストールされなくなります。
また`--with-pear`オプションも非推奨で、今後削除される可能性が有り、削除されるとPHPと一緒にPEARをインストールする方法がなくなります。

もちろんPEARが一切使用できなくなるわけではなく、PHPのインストール後に`go-pear.phar`などを使用して別途インストールすることは可能です。
[Composerと同じように](https://github.com/php/php-src/pull/3781#issuecomment-462275686)。


## メーリングリスト

[プルリク](https://github.com/php/php-src/pull/3781)と一緒に[メーリングリスト](https://externals.io/message/103977)で話が始まりました。
提案者の[Nikita Popov](https://twitter.com/nikita_ppv)はPHPのコア開発者で、[プロパティ型指定](https://qiita.com/rana_kualu/items/9b4502d229d19635ef34)とか[ジェネレータ](https://wiki.php.net/rfc/generators)とか作ってるすごい人で、最近[JetBrainsに入りました](https://blog.jetbrains.com/phpstorm/2019/01/nikita-popov-joins-phpstorm-team/)。

そもそもPEARはもはやまともにメンテされておらず、2017/11/30リリースのPHP7.2で非推奨になった[each](https://qiita.com/rana_kualu/items/db1ce401df627c46544a#the-each-function-has-been-deprecated)が[削除された](https://github.com/pear/pear-core/commit/832fd537c490a8cb26f20daff95d6966a273c2ce)のは、2018/08/23リリースの[v1.10.6](https://github.com/pear/pear-core/compare/v1.10.6...master)、[create_function](https://github.com/pear/pear-core/commit/72d3c6f66ea93441819e31a4814470f3e040a4e9)に至っては[2018/12/06](https://github.com/pear/pear-core/compare/v1.10.7...master)です。
そんな長期間誰も気付かないほど誰も使ってないんだからもう要らんじゃろ、みたいなことをNikitaは言っていて、概ね同意のうえ10日後にマージされました。
プルリク者本人がマージするのはどうなんだって気がしないでもない。

PEARはともかくPECLがなくなるのは惜しいという意見はいくつかありましたが、個別に入れられますし、[Pickleもある](https://github.com/FriendsOfPHP/pickle)ので欲しい人には各自でやってもらいましょう。


## RFC

[Deprecate Bundling PEAR/PECL & Replace with composer/pickle](https://wiki.php.net/rfc/deprecate-pear-include-composer)というRFCがあるのですが、これは完全にスルーされています。
PEARの排除だけ、RFCも立たずにさっくりと行われました。
Composerのバンドルについては[行うつもりはない](https://externals.io/message/103977#104016)ようです。


# 感想

正直もうPEARは仕方ないよね。

先日の[バックドアの件](https://qiita.com/rana_kualu/items/7d91931a03b83324ae98)も、2019/01/19にシャットダウンしたサーバが復旧したのが[2019/02/25](https://twitter.com/pear/status/1100156261163823104)で、公約してた[後日の報告](https://twitter.com/pear/status/1086634389465956352)も2019/03/25時点で[影も形もない](http://pear.php.net/)とかいうね。

Recent Releasesを見てみると一応月に数本は更新されてはいるのですが、Composer全盛の今にあえてPEARを使う意義はほぼ感じられません。
ネットワーク(Wi-Fi)経由でスマホをadb接続する

## はじめに

Android Studioでデバッグする際にADB経由でスマホを接続する方法を以前記載したけど、
接続をめちゃくちゃ簡略化できるプラグインがjetbrainsから出ていたので使い方をまとめる。

## プラグインのURL
英語だけどぶっちゃけここ見れば使い方わかる。
プラグインの開発自体は止まっているよう。
でも最近までレビューはついてるし問題なく利用できるとのこと。
[Android WiFi ADB](https://plugins.jetbrains.com/plugin/7983-android-wifi-adb)

## インストール
1. Android Studioのメニューから、下記パスを辿り、検索バーに[Android wifi adb]と入力。  
  [Preferences...]->[Plugins]->[Browse repositories...]
2. プラグイン名称が[Android WiFi ADB]となっているものを選択。
3. 右側に表示される詳細画面内に[Install]ボタンがあるのでクリック。  
 ここでAndroid Studioの再起動を求められるので聞かれたら[Restart]をクリック。


<img width="819" alt="スクリーンショット 2019-03-24 22.07.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/100317/f674cb7a-aff6-076e-dd3c-0263d2f9fe25.png">

## 使い方
1. PCとスマホをUSBで接続する
2. 上部に表示されているアイコン(ドロイド君が電波飛ばしてるみたいなやつ)をクリック  
 ※この時点でセッションが確立され、apkの実行やデバッグ操作など通常通りに行える

<img width="618" alt="スクリーンショット 2019-03-25 1.03.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/100317/8ffb5706-3d24-4058-a8f5-9db7b6032c3e.png">

右側のタブを押すと各スマホの接続状態を見ることができる。
Android Studioを再起動した場合は再度USB接続が必要。

## まとめ
本プラグインを導入することで、毎回コンソールで入力する手間がなくなる。
素直に便利なので特別な理由がなければ導入しておくと吉。
ローカル環境用SSLサーバ証明書を簡単に発行する(mkcert)

ローカル環境でSSLを使ったWebアプリを開発する際
サーバ証明書として自己署名証明書(いわゆるオレオレ証明書)を作成して使用したりしますが
手順が複雑だったり、ブラウザでアクセスした際に
信頼できない証明書として警告画面が表示される場合があります

[mkcert](https://github.com/FiloSottile/mkcert) は簡単なコマンドで
ローカル環境に認証局を登録し、サーバ証明書の発行を行ってくれるツールです

## インストール

### macOS (Homebrewを利用)

```
$ brew install mkcert
```

#### Firefoxを利用する場合

```
$ brew install nss
```

### Windows (Chocolateyを利用)

```
> choco install mkcert
```

#### Firefoxを利用する場合
1. `mkcert -CAROOT`コマンドを実行してCA証明書格納ディレクトリを調べる
2. オプション→プライバシーとセキュリティ→証明書を表示
3. 認証局証明書→インポート
4. 1のパスにある`rootCA.pem`を選択

## CA証明書をインストール (初回のみ)

```
$ mkcert --install
```

## サーバ証明書を発行

```
$ mkcert localhost
```

```
$ mkcert localhost *.localhost example.com *.example.com
```

証明書ファイルと秘密鍵ファイルの出力先を指定する

```
$ mkcert -cert-file 証明書ファイル -key-file 秘密鍵ファイルのパス localhost
```

## Docker(nginxコンテナ)で使ってみる

ローカルDocker環境でnginxを起動しmkcertで作成した証明書を使って
SSLページを表示する例です

- 証明書の作成

```
$ mkdir certs
$ mkcert -cert-file ./certs/localhost.crt.pem -key-file ./certs/localhost.key.pem localhost
```

- nginxの設定ファイルを作成

```
$ mkdir conf
$ vi conf/default.conf
```

```conf/default.conf
server {
    listen       443 ssl http2;
    server_name  localhost;

    # https://nginx.org/en/docs/http/ngx_http_ssl_module.html
    ssl_certificate     /etc/ssl/certs/localhost.crt.pem;
    ssl_certificate_key /etc/ssl/certs/localhost.key.pem;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
```

- docker-compose.yml の作成

```
$ vi docker-compose.yml
```

```docker-compose.yml
version: '3.7'

services:
  nginx:
    container_name: 'nginx'
    image: 'nginx:latest'
    volumes:
      - './conf:/etc/nginx/conf.d'
      - './certs:/etc/ssl/certs'
    ports:
      - '443:443'
```

- Dockerの起動

```
$ docker-compose up -d
```

- https://localhost/ をブラウザで開いてみる  
  「Welcome to nginx!」のページが表示されれば成功です
bash/複数ファイルを対象に処理する

## コマンドラインの引数を、全部処理する
~~~
while [ "$1" != "" ]
do
  echo "$1"
  shift
done
~~~

## lsの結果（ファイル）を一つずつ何かする
~~~
DIR="."
IFS=$'\n'
for FILE in `ls "$DIR"`
do
  echo $FILE
done
~~~

## ファイルを１行づつREADしてなんかするbash
[引用元](http://d.hatena.ne.jp/higher_tomorrow/20110424/1303653282)

~~~
BUFIFS=$IFS
IFS=

exec 3< 入力ファイル名
while read FL 0<&3
do
  処理
done
exec 3<&-

IFS=$BUFIFS
~~~

## ファイルを読み込んでなんかする
~~~
TMPF=`mktemp tmp.XXXXXX`
ls > $TMPF

while read INFILE
do
  echo INFILE:$INFILE
done < "$TMPF"
~~~

## ヒアドキュメントにファイル一覧を書いて、これを全部処理する
~~~
while read infile
do
  echo INFILE:$infile:
done << __EOT__
file1
file2
__EOT__
~~~
UnityのWWWクラスで擬似的に通信切断のテストをする

## はじめに

Unityでアプリ開発をしている際、モバイル環境ではWifiオフや機内モードで比較的簡単に通信エラーをテストできるが、PCで開発している最中は意外と通信エラーを起こすのが手間になる。なのでWWWクラスのラッパーを作って無理やりエラーが起こった挙動を再現してテストする。

なおUnity 2018.3などではすでにWWWクラスは非推奨になりUnityWebRequestを使わなければならないのでこの記事は無意味である。

https://github.com/sapphire-al2o3/WWWWrapper

実装としてはWWWと同じプロパティを用意してエラーフラグが設定されていたら、実際に通信に成功していてもエラー時に返すであろう値を返している。

## 使い方

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR
using WWW = WWWWrapper;
#endif

public class WWWWrapperTest : MonoBehaviour
{
    [SerializeField]
    bool forceError = false;

    [SerializeField]
    float delay = 0.0f;

    [SerializeField]
    string url = "http://unity3d.com";

    IEnumerator Start()
    {
        using (WWW www = new WWW(url))
        {
            www.delay = delay;
            www.forceError = forceError;

            yield return www;

            if (!string.IsNullOrEmpty(www.error))
            {
                Debug.Log(www.error);
            }
            else
            {
                Debug.Log(www.text);
            }
        }
    }
}
```

上記を適当なGameObjectにつけてインスペクタから `forceError` のチェックを入れることで通信エラーが発生したような挙動を擬似的に再現させる。
また `delay` に秒数をいれると `yeild return www` で返ってくる時間を遅らせることができる。これで通信結果を待つのを忘れてUI表示が先に動いてしまった、みたいなバグを探しやすくなる。

```csharp
#if UNITY_EDITOR
using WWW = WWWWrapper;
#endif
```

`using` 部分をエディタで実行時のみにしておくことでAndroidなどにアプリをビルドするときには影響が出ない。
C++で雪を降らす（？）CLIアプリケーション

# はじめに
休日だしC++で何かできないかなと思ったところ，「プログラミングを学習するために技術力より難しすぎることをすると断念する」という言葉を見かけたので，簡単ながら結果を視覚的に見ることができるものを模索した．
そこで，「ターミナルで雪を降らせる」という内容を考えた．`*`を雪と見立てた．

# コード
実際の雪を降らせるプログラムは以下である．

```c++:snow.cpp
#include <iostream>
#include <vector>
#include <thread>
#include <random>
using namespace std;
#include <color.hpp>

int snowwing(vector<vector<char> >&);
int displaySnow(vector<vector<char> >&);

int main(int argv, char **argc){
  const int R = 100;
  const int C = 50;
  const int sleepTime = 10;
  vector<vector<char> > snow (C, vector<char>(R,  ' '));

  while(1){
    snowwing(snow);
    system("clear");
    displaySnow(snow);
    this_thread::sleep_for(chrono::milliseconds(sleepTime));
  }
  return 0;
}


int snowwing(vector<vector<char> > &snow){
  for(int i=1; i<snow.size(); i++){
      snow[snow.size()-i] = snow[snow.size()-i-1];
  }
  for(int i=0; i<snow.front().size(); i++){
    if(rand()%20 == 0){
      snow[0][i] = '*';
    }else{
      snow[0][i] = ' ';
    }
  }
  return 0;
}


int displaySnow(vector<vector<char> > &snow){
  for(int i=0; i<snow.size(); i++){
    for(int j=0; j<snow.front().size(); j++){
      cout << CYAN << snow[i][j] << RESET;
    }
    cout << endl;
  }
  return 0;
}
```

```c++:color.hpp
#define RESET   "\033[0m"
#define BLACK   "\033[30m"
#define RED     "\033[31m"
#define GREEN   "\033[32m"
#define YELLOW  "\033[33m"
#define BLUE    "\033[34m"
#define MAGENTA "\033[35m"
#define CYAN    "\033[36m"
#define WHITE   "\033[37m"
#define BOLDBLACK   "\033[1m\033[30m"
#define BOLDRED     "\033[1m\033[31m"
#define BOLDGREEN   "\033[1m\033[32m"
#define BOLDYELLOW  "\033[1m\033[33m"
#define BOLDBLUE    "\033[1m\033[34m"
#define BOLDMAGENTA "\033[1m\033[35m"
#define BOLDCYAN    "\033[1m\033[36m"
#define BOLDWHITE   "\033[1m\033[37m"
```

color.hppはcoutで出力する際に色を変更するための値をdefineしたファイルである．

snowwing()関数はvector<vector<char>>型の配列の最上段に一定確率で雪を生成させつつ，雪を一つ下の段にスライドする関数である．

displaySnow()関数は雪の情報が格納されたvector<vector<char>>型の配列をターミナルに出力する関数である．

int型の変数Rは雪の配列の横の文字数を指定し，int型の変数Cは雪の配列の縦の文字数を指定する．int型の変数sleepTimeは雪を降らせる速度を意味する．

system("clear")では画面がずれないために毎回ターミナル画面をclearしている．

this_thread::sleep_for()関数では雪を降らせるための遅延をしている．

# 実行画面

![snowRunMovie.gif](https://qiita-image-store.s3.amazonaws.com/0/282145/f7b0a7bd-21a4-98bd-7923-0e7926b87f62.gif)