OmniAICreator/Qiita-1.07M huggingface dataset:
Bancor Protocol 

#BancorProtcolとは
###Continuous Liquidity for Cryptographic Tokens through their Smart Contractsを目指して

Bancorとは、2017年6月にEthrereumベースで発行されたトークンで正式名称はBancor Protocol Network(略称BNT)という。ICOを実施、開始からわずか数時間で15.3億ドルの資金調達に成功した!!このトークンには、いわゆるBancor Protocolというものが実装されている!

#Bancorとは
そもそもbancorは、1940年から1942年にケインズとシューマッハーが提案した超国家的な通貨のことを言う。第二次世界大戦後に世界経済を安定させるため、英国がブレトン・ウッズ会議でバンコールの導入を公式提案したが、アメリカ合衆国の合意をとりつけることができず、実現には至らなかった。この会議では最終的に、バンコールではなく、世界銀行とIMFによって管理された制度において、物理的な金（きん）と結び付けられる固定為替相場制（金本位制）が採用された。そして、金との兌換性を維持した米ドルを基軸通貨とするブレトン・ウッズ体制は1971年のニクソンショックまで続くことになる。

#Abstruct

Bancor Protocolを実装することで可能なること。
1.売り手がいなくても買える。買い手がいなくても売れる。(流動性が上がる)
2.他のトークンとの交換が瞬時に取引所を返さずにできる。
3.トークンをまとめたトークンバスケットなどを作ることができる。


例えば、以下は特定のトークンの架け橋になるトークンである。このトークンを介して、
トークンAからトークンBに一瞬で交換される。
![スクリーンショット 2018-03-30 0.29.39.png](https://qiita-image-store.s3.amazonaws.com/0/245789/a9ec7719-36cb-0a7d-8502-574db442eb3b.png)
交換をほぼ手数料がかからず以下のようにできる。
![スクリーンショット 2018-03-30 0.30.48.png](https://qiita-image-store.s3.amazonaws.com/0/245789/b6ab2040-6960-e520-f733-882ced2374f3.png)

交換の際には、messengerかtelegramかwechatのアカウントが必要になる。
![スクリーンショット 2018-03-30 0.30.04.png](https://qiita-image-store.s3.amazonaws.com/0/245789/ad91ed79-15ae-32cb-fba6-b7f3934edd93.png)


新しいトークンを発行しても初めは、流動性の問題に悩まされる、、、
BNTには、売りたいときに売れて、買いたいときに変える流動性を担保する仕組みが備わっている!!

これはBancor ProtocolというProtocorを実装しているからだ。このProtocolは、価格方程式というロジックによって、ブロック上のトークンの自動価格決定と自律的な流動性メカニズムを支えている。また、bancor Protocolを実装した<font color="OrangeRed">スマートトークン</font>には、複数のスマートトークンと繋がっていて、接続されたトークンのスマートトークンをスマートトークンのコントラクトを通じて直接購入または清算することができる(後述、トークンリレー)。

ちなみに、ここで出てきた<font color="OrangeRed">スマートトークン</font>とは、上記のBancor Protocolを実装したトークンのことである。

これらの対応は、実は非中央集権の思想に合致している。トークンが株などと同様に取引所で扱われる場合、マーケットメーカが流動性を出すために安く売って違う市場で高く売るアービトラージ行為で儲かることになる。つまり資金を持っている人がさらに強くなる仕組み自体を変えられていない。一方、BancorProtocolを実装すれば、流動性の問題とアービトラージの問題を解消できる。

#結論
今後小さなスケールの経済圏や、youtubeのように個人が通貨を発行し、トークンの市場はロングテールになるだろう。その時、その通貨の流動性を上げるのにbancor Protocolはかなり役に立つだろう。


#Reference
https://qiita.com/ABmushi/items/e0886421617d4632c42b

https://steemit.com/bancor/@paulcoman/why-bancor-will-work

https://medium.com/@mach/bancor-protocol-%E3%81%AF%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%A8%E3%82%B3%E3%83%8E%E3%83%9F%E3%83%BC%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E5%A4%A7%E7%99%BA%E6%98%8E%E3%81%A8%E3%81%AA%E3%82%8B%E3%81%8B-%E5%89%8D%E7%B7%A8-9769b79f2bca
php7.1を入れようとして、依存性を解決できませんというエラーが出た

#状況
先にphp5.6を使っており、php7.1にバージョンアップを行いたかった


##コマンド
既存のphp5.6を削除
```
$ sudo yum remove php*
```

```
$ sudo yum install php71 php71-mbstring php71-pdo php71-ldap php71-xml php71-mcrypt php71-gd php71-imap php71-pecl-imagick php71-pecl-apc php71-jsonc php71-fpm php71-pecl-memcached php71-intl php71-devel

$ sudo yum install --enablerepo=remi,remi-php71 php71 php71-devel php71-mbstring php71-pdo php71-gd
```
私的TypeScriptコーディング規約

随時更新中。


## 命名

### Variable

- camelCaseを用いる。

bad

``` typescript
var Num = 10;
```

good

``` typescript
var num = 10;
```

### Function

- camelCaseを用いる。

bad

``` typescript
GetId(): number{ }
```

good

``` typescript
getId(): number { }
```

### Class

- Class名はPascalCaseを用いる。
- memberはcamelCaseを用いる。
- functionはcamelCaseを用いる。

bad

``` typescript
class user {
    Id: number;
    GetId(): number {
        return this.Id;
    }
}
```

good

``` typescript
class User {
    id: number;
    getId(): number {
        return this.Id;
    }
}
```

### Interface

- Interface名はPascalCaseを用いる。
- functionはcamelCaseを用いる。

bad

``` typescript
interface IUser {
    GetId(): number;
}
```

good

``` typescript
interface User {
    getId(): number;
}
```

### Namespace

- Namespace名はPascalCaseを用いる。

bad

``` typescript
namespace app {
}
```

good

```
namespace App {
}
```

### Array

- []の代わりにArrayを用いる。

bad

``` typescript
private Users: User[];
```

good

``` typescript
private Users: Array<User>;
```
sshクライアントのメモ

個人的な主観で書くので間違ってるかも

- [Tera Term](https://ja.osdn.net/projects/ttssh2/)
    - 余計なものが入ってない
    - とりあえず繋いで簡単なことするのには便利
    - マクロ書けば色々できる
- [poderosa](http://ja.poderosa-terminal.com/)
    - おしゃれ(デザイン性が高い)
    - タブ機能(見やすい)
    - 有償のソフトウェアですが、無期限に試用できる
    - 背景画像が変えられる
    - キャレットとアニメーション
    - スターウォーズ
- [RLogin](http://nanno.dip.jp/softlib/man/rlogin/)
    - タブ機能
    - 接続先情報の保存が簡単
    - 踏み台の設定も楽
    - 踏み台越しのsftpがとてもよい
    - おさかな飼える
ブロックチェーン概論

※勉強会に参加してメモを纏めたものです。
間違いや補足がありましたらご指摘お願いします。

## 概要
### どれくらい流行っているのか
関心度的には幻滅期に入っている。（メインストリームになるには5年くらいかな）

・ブロックチェーン1.0
　　通貨として
・ブロックチェーン2.0
　　インフラ技術として

#### インパクトの大きさ
よく言われているのが、インターネットと同等のインパクトがある。

ただ大きく違う点として、
　・インターネット：技術→ビジネス
　・ブロックチェーン：ビジネス→技術
という流れになっている。

### 発展と歴史
#### Satoshi Nakamoto
2008年に論文出して、そのままビジネス化。
・ビットコイン発明者=ブロックチェーンの生みの親
・日系人男性？（国籍不明）
・37歳
・非中央集権の社会を望み、政府・行政に不信感をきっかけにビットコインを発明
と考えられている。

#### genesisブロック
一番最初のブロック。
##### ブロックの内容
2009/1/3のイギリスのTimes紙の記事の見出し
「英の財務大臣が二度目の銀行救済の瀬戸際にいる」
意味：経済の危機に政府の介入を良しとしないのでビットコインを作ったという意志の現れではないか

## 特徴
そもそも、ブロックチェーンとは情報記録システム（台帳・データベース）である。
ビットコインが有名だが実践している「ソリューション」の一つである。
### 改竄が難しい

#### ブロックチェーンの仕組み
トランザクション情報を含んだブロックが連なったもの。
重要なのはナンス値。（マイナーが適当に入れた値）
そのハッシュ値を導き出す。

補足：前のブロックのハッシュ値を「ダイジェスト」という。

#### マイニング
ブロックの中にナンス値（適当な値）を打ち込み、ハッシュ関数を使ってハッシュ値を求めること。
ハッシュ値が正当でなければブロックが生成されずやり直しを繰り返す。
正当なハッシュ値ができればブロック化される。

#### どれだけ難しいのか
ハッシュレート（1秒間にどれくらいマイニングされているか）
ビットコインの場合は秒間2500京程度（投稿時点）
参考：https://blockchain.info/ja/charts/hash-rate
 
そこから10分間で正当なハッシュ値が出るようにプログラムが組まれている。
なので、ハッシュレートが高ければ難易度が高くなる。

#### 改めて改竄できない仕組みとは
一つの取引を改竄しようとすると次のブロックのナンス値が変わってしまう。
一回改竄するとマイニングをやり直しになる上に、次のブロックがどんどん変わってしまう。


### 非中央集権型
#### ブロックチェーンのネットワーク（P2P）
第三者機関が情報を管理し信頼性を担保しているが、サーバーダウンする可能性がある。
　↓　移行中
全員が情報を管理し、信頼性を担保する。
各ノード（node）がデータを保持している状態。
そのためnodeが増えるにつれ同期などの時間がどんどん掛かってしまう。（デメリットでもある）
誰かが新しいブロックを生成した場合、各ノードが全員で検証する。

メリットとしては
　・一つのノードが潰れても他のノードがあるのでリスクを分散できる
　・一つのノードに誤りがあると他のノードが指摘できる（コンセンサスアルゴリズム）

#### フォーク（分岐）
ノードが同時に同じナンス値が見つけ、チェーンが枝分かれすること。
　↓
枝分かれした場合は先に5つのブロックを続ければ正になる。
もう片方は正にブロックに乗り換え直す。（それまでの分はゴミになる）

参考：https://i0.wp.com/zoom-blc.com/wp-content/uploads/2017/10/branch-e1508996129817.png?resize=800%2C466&ssl=1

#### 故意的なフォーク
自然的なフォークは稀で、ソフトウエアの仕様変更、不具合修正、機能向上したいときにやる
　↓　非中央集権型の場合の決定権は誰にある？
賛成派と否定派で争う

現在はフォークバブルであり今年だけでも500以上はフォークする予定。
http://mapofcoins.com/bitcoin

#### コンセンサスアルゴリズム
スマートコントラクト(自動で契約)を実現するためのシステム。

##### PoW（Ploof of Stake）
仕事量による合意形成：最も早く正しいナンス求めたノードが正しい
ビットコインなどが採用している。

##### PoS（Ploof of Stake）
所有量による合意形成：最も多いコイン年数のノードが正しい
イーサリアム（プログラムが組み込まれたブロックチェーン）
が実証中。

##### PoI （Ploof of Importance）
重要度による合意形成：コインの保有数と取引の頻度で分配する。
Nemが採用している。

参考：https://www.newscrypto.jp/articles/2612

## まとめ
・改竄されず安全
・非中央集権であるため、信頼性が高い
・P2Pのためコストが低い
・スマートコントラクトができるのが良い

### ブロックチェーン最大の発明
複数のステークホルダがいる中で、特定の誰かを信頼することをなくデータの移動などができる。

## 関連の情報収集先
### 人物
・Vitalik Buterin（イーサリアムの人）
・Bobby Lee(BTCCの人)

### newsサイト
[ビットコインニュース](https://btcnews.jp/)
[海外Bitcoinニュース速報](https://coinnews.tokyo/tag/bitcoin/)
[Coindesk](https://www.coindesk.com/)（最速）
[Bitcoin.com](https://www.bitcoin.com/)

### データ
[blockchain.info](https://blockchain.info/)
[bitcoincharts.com](https://bitcoincharts.com/)
【JavaScript】 YYYY-MM-DD的な文字列をDateオブジェクトに変更するときの注意点

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">なんでやねん。 <a href="https://t.co/WGWqTjiVkN">pic.twitter.com/WGWqTjiVkN</a></p>&mdash; みぎ (@migi) <a href="https://twitter.com/migi/status/979198641842700289?ref_src=twsrc%5Etfw">March 29, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 原因

原因をちょっと調べてみた。

[Date \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date)

`new Date(dateString)`の説明としてこんなものが。

>日付を表す文字列値です。文字列は Date.parse() メソッドによる認識可能な形式でなければなりません (IETF 準拠の RFC 2822 timestamps および ISO8601 版 参照)。

なるほど。
内部で`Date.parse()`が走っていると。

`Date.parse()`については、みなさんご存知のとおり**ブラウザによって動作が不安定**なので使わないほうが良いやつ。

[Date\.parse\(\) \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/parse)

>ES5 に準拠して実装されるまで Date.parse の使用は推奨されません。

ということで、`new Date()`の引数として、文字列を渡すこと自体やめた方が良いようですね。。

というか、上記の`new Date(dateString)`の説明の直下にそもそもちゃんと書いてあったし。

>注記: ブラウザごとに動作が異なり一貫性がないため、Date コンストラクタ (または同等の Date.parse) で日付文字列を解釈しないように強くすすめます。


# 対処法

とは言え、APIで帰ってきた日付が`YYYY-MM-DD`で固定されていてそれを使わなきゃいけない、って状況は多そう。
APIを修正してわざわざ`{year: 2018, month: 12, day: 23}`みたいにするのもモヤッとするし。

## 対処法 A

**文字列`YYYY-MM-DD`から年月日それぞれの値を取り出して数値化して`new Date(year, month, day)`の形で渡す。**

たぶんこれが一番正確。
取り出すのも数値化するのも一手間かかってめんどくさいけど。
`YYYY-M-D`的な形だったら文字の位置からは取り出せないので正規表現使う必要もあるし。
めんどくさい。

でも正確で安定はしそう。

## 対処法 B

**文字列`YYYY-MM-DD`を文字列`YYYY/MM/DD`に変換して`new Date(dateString)`の形で渡す。**

相変わらず`new Date(dateString)`を使っちゃってるけど。

でもどうやら`YYYY-MM-DD`に比べて`YYYY/MM/DD`だと安定感は増すっぽい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8006/11abf314-df3a-f694-4487-481620c89345.png)

なんでや。

これだと`-`を`/`に変換するだけなので面倒さはほぼ無い。



なんかもっと良い方法を知っている人がいれば教えてください……。
PowerShellで"rm -rf"的なコマンドのエイリアスを作った

###### (An English translation is available [here](https://dev.to/tomoyukiaota/creating-an-alias-for-powershell-equivalent-of-rm--rf-in-bash-2gl3).)

Bashでは、`rm -rf`でファイルやディレクトリを削除します。PowerShellの場合でもこれぐらいのタイプ数で同様の処理をしたいので、`rmrf`というエイリアス（正確には関数）を作りました。

# 経緯
削除したいファイルやディレクトリを`target`とします。このとき、PowerShellでは、次のコマンドで`target`を削除できます。

```powershell
Remove-Item -Recurse -Force target
```

Tab補完を使ったとしても、これでは長いので、できるだけ短くすると、

```powershell
rm -r -fo target
```
となります。しかし、これでもまだ`rm -r -fo`は`rm -rf`に比べて若干タイプしにくいです。
いっそのことエイリアスを作ることにしました。

# 作り方
PowerShellのprofileを作成する必要があります。profileの作成方法については、次の記事に解説がありますので、参考にしてください。
[PowerShellの$profileに設定しておくと便利な定義 - Qiita](https://qiita.com/nkkn1008@github/items/90d45f6227867aaf59fd)

次のような内容のprofileを作成します。

```powershell:Microsoft.PowerShell_profile.ps1
function rmrf {
     <#
        .DESCRIPTION
        Deletes the specified file or directory.
        .PARAMETER target
        Target file or directory to be deleted.
        .NOTES
        This is an equivalent command of "rm -rf" in Unix-like systems.
        #>
    Param(
        [Parameter(Mandatory=$true)]
        [string]$Target
    )
    Remove-Item -Recurse -Force $Target
}
```

Gistは[こちら](https://gist.github.com/TomoyukiAota/05693e4f3e957ba9be343fc0486f3301)。

# 結果
```powershell
rmrf target
```
これだけで、`target`を削除できるようになりました。
【Python】PyGreSQLでPostgreSQLに接続する

# はじめに

PythonでPostgreSQLにアクセスするライブラリといえば[psycopg2](http://initd.org/psycopg)（LGPLライセンス）ですが、[PyGreSQL](http://www.pygresql.org/index.html)というBSDライクなライセンスのライブラリもあります。
というわけで使ってみました。

動作確認はWindows 10、Python 3.6.3、PostgreSQL 9.6.7、PyGreSQL 5.0.4で行いました。

# PyGreSQLのインストール

[PostgreSQL](https://www.postgresql.org/)をインストールします。
libpq.dllへのPATHを通します。

PyGreSQLは`pip`でインストールします。

```sh
pip install PyGreSQL
```

# 接続とSQL発行

## 接続

DBインスタンスを生成することでコネクションを張ります。

```python
In [1]: from pg import DB

In [2]: db = DB(dbname='pygrestest', host='localhost', port=5433, user='postgres', passwd='postgres')
```

## テーブル作成、行の挿入

```python
In [3]: db.query('CREATE TABLE persons(id SERIAL, name TEXT, age INTEGER)')

In [4]: db.query("INSERT INTO persons(name, age) VALUES('John', 33)")
Out[4]: '1'
```

INSERT文を発行したときは、挿入された行数が返されます。

## SELECT文の発行

SELECT文を発行すると、クエリオブジェクトが返されるので、それを`print`に渡すと、`psql`ライクな出力が得られます。

```python
In [5]: q = db.query('SELECT * FROM persons')

In [6]: print(q)
id|name|age
--+----+---
 1|John| 33
(1 row)
```

クエリオブジェクトの`getresult()`を呼び出すとタプルのリスト、`dictresult()`を呼び出すとディクショナリのリストで結果セットを取得できます。

```python
In [7]: q.getresult()
Out[7]: [(1, 'John', 33)]

In [8]: q.dictresult()
Out[8]: [{'age': 33, 'id': 1, 'name': 'John'}]
```

処理が終わったら、コネクションを閉じます

```python
In [9]: db.close()
```


# DB-API 2.0インタフェースでの接続

PythonのRDBMSへのアクセスインタフェース規格であるDB-API 2.0に準拠したインタフェースもあります。

```python
In [1]: from pgdb import connect

In [2]: con = connect(database='pygrestest', host='localhost:5433', user='postgres', password='postgres')

In [3]: cursor = con.cursor()

In [4]: cursor.execute("CREATE TABLE languages(id SERIAL, name TEXT)")
Out[4]: <pgdb.Cursor at 0x18452d93438>

In [5]: cursor.execute("INSERT INTO languages(name) VALUES ('Python'), ('C#')")
Out[5]: <pgdb.Cursor at 0x18452d93438>

In [6]: con.commit()
```

DB-API 2.0は明示的にコミットを呼び出す必要があります。
SELECT文を発行して結果セットを取得するには以下のようにします。

```python
In [7]: cursor.execute('SELECT * FROM languages');

In [8]: rs = cursor.fetchall();

In [9]: rs
Out[9]: [Row(id=1, name='Python'), Row(id=2, name='C#')]
```

# まとめ

PostgreSQLへアクセスするPythonのライブラリとして、PyGreSQLというBSDライクなライセンスなライブラリがあります。
このライブラリは、PyGreSQL独自のインタフェースの他に、DB-API 2.0インタフェースもサポートしています。
```
Pythonで学ぶDeepLearning〜ライブラリインストール編〜

#
#1.1　Pythonとは
>Pythonは、シンプルで読みやすく、覚えやすいプログラミング言語です。英語のような文法でプログラムを書くことができ、手間のかかるコンパイルはありません。C言語やアセンブラ言語はコーディングをした後に毎回コンパイル作業を挟むのでPythonは初心者に最適な言語です。
　また、Pythonは可読性が高いと同時に処理速度の早いコードを書くことができます。
　そして、Pythonは、科学の分野、特に機械学習やデータサイエンスの分野でよく使われます。更に、ディープラーニングのフレームワークに関しても、Pythonを利用する場面は多くあります。
　このように、初心者からプロフェッショナルまで、幅広い層のユーザーに利用されるだけの優れた資質を備えています。
 さらに、ディープラーニングのフレームワークでは、Pythonを利用する場面は多くあります。例えば[Caffe](http://caffe.berkeleyvision.org/),[TensorFlow](https://www.tensorflow.org/),[Chainer](https://chainer.org/),[Theano](http://deeplearning.net/software/theano/#)といった有名なディープラーニングのフレームワークでは、Pythonから操作できるインターフェイスが提供されています。そのため、Pythonを学べばディープラーニングのフレームワークを使用する際に必ず役に立つでしょう。
>
　

#1.2 インストールするライブラリ
 + Python3系
 + NumPy(Anaconda)
 + Matplotlib(Anaconda)

すでにこれらのライブラリをインストール済みの方はここで終了です！

##`Pythonをインストールする前に。。。`
Pythonには、`２系と３系の２つのバージョンが存在します`。現在、Pythoｎは最新の３系のバージョンだけでなく、旧式の２系を使用したものもあります。Pythonのインストールに関しては慎重に選択する必要があります。と言うのは、その２つのバージョンには完全な互換性はないからです。正確に言うと３系で書いたプログラムを２系で実行できない（後方互換がない）ということが起こります。
##**今回はPython３系を使用します。**


#`macosでインストール`
##※Macには**Python２系が標準搭載**されています！
ここではPython３系を搭載する方法を紹介します
　Pythonのインストールについてはいくつか方法がありますが、今回は[Anaconda]()を使用してインストールしていきます。（Anacondaについて詳しく知りたい方は上記のリンクをクリックしてください。）簡単にいうとAnacondaはデータ分析に特化したディストリビューションです。さきほど説明した`NumPy`や`Matplotlib`といったデータ分析に有用なライブラリも含まれています！
#Anacondaとは
>Anaconda はデータサイエンス向けに作成された Pythonパッケージで、科学技術計算などを中心とした数多くのモジュールやツールが独自の形式で同梱されています。
macOSやUnix環境では、ほとんどのモジュールがコンパイル済みパッケージを提供しているため、Anaconda を使わなくとも、通常の pip コマンドでも簡単に環境を構築できます。
しかし、Windows環境のように、簡単にインストール可能なモジュールが提供されていない環境で、機械学習などのためにPython を使用するなら、多くのモジュールがデフォルトでインストールされる Anaconda はとても便利です。
また、Anaconda でインストールされるモジュールは、Intel Math Kernel Library を使ってビルドされるなどの、特定用途向けパッケージならではの工夫が加えられている場合もあります。
Anaconda は一部に独自技術を使用しているため、公式パッケージでは一般的に使用されているツールなどでも、Anaconda では利用できないものがあるため、注意が必要です。特に、Anacondaは標準的な Pythonの 仮想環境 を利用できないため、専用の Conda コマンド を利用する必要があります。また、Anaconda はさまざまなツールを統合してインストールするため、もともと OS が提供している機能に干渉してしまうケースもあります。
[Python公式ガイドを引用](https://www.python.jp/install/windows/anaconda/install_anaconda.html)

##Anacondaをインストール
下記のURLからインストールできます。
※今回はPython３系を使用するのでAnacondaも３系をインストールしてください
https://www.anaconda.com/downloads

#1.3 Pythonの確認
```python
$ python --version
```
お使いのOSでターミナルを開いて実行
###result
```python
Python 3.6.4 :: Anaconda, Inc.
```
Python ３.＊.＊（＊はインストールしたバージョンによって数字は変わるここで２.＊ .＊と表示されていたらうまくPython３系をインストール出来ていない。）と表示されていたら**インストール完了です！**


###Python3系が正常にインストール出来ていたら＄pythonと入力してみる



```py
$python
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 12:04:33) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>入力待ち...
```
　すると、Pythonインタプリタが起動します。ここでは様々な計算を対話形式で試すことが出来ます。
ここでは詳しく説明しないので各自で色々試してみてください。
UbuntuのCLI環境でGoogleChromeを使ってウェブサイトのスクリーンショットを取得する

今回はChromeのHeadlessモードを使うのではなく、CLI環境でも通常のChromeが動作するようにpyvirtualdisplayの仮想ディスプレイを使った方法でスクレイピングを行う。

## 使ったもの
* Python3
* Google Chrome
* ChromeDriver
* xvfb
* Selenium
* pyvirtualdisplay

## 使わないもの
* ChromeのHeadlessモード

## 前提

ubuntu 16.04 LTS上の環境を想定しています。

## 環境構築

### Seleniumをインストールする。

プリインストールされてるPython3を使うので、pip3をインストールする。

```
sudo apt install python3-pip python3-dev
```
pip3でSeleniumをインストールする。

```
$ pip3 install selenium
```
libgconf2-4をインストールする。（Seleniumの起動に必要）

```
$ sudo apt install libgconf2-4
```

### Google Cromeをインストールする。
depファイルをダウンロードして、インストールする。

```
$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 
$ sudo dpkg -i google-chrome-stable_current_amd64.deb
```
必要な依存ファイルをaptでインストールする。

```
$ sudo apt update 
$ sudo apt -f install -y
```
インストールと配置場所を確認する。

```
$ which google-chrome 
/usr/bin/google-chrome
```

### ChromeDriverをインストールする。
zipファイルで提供されているので、unzipをインストールする。

```
$ sudo apt install unzip
```
zipファイルをダウンロードして、展開する。

```
$ wget https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip
$ unzip chromedriver_linux64.zip -d ~/bin/
```
実行ファイルの配置場所にPATHを通す。

```
$ export PATH=$PATH:$HOME/bin
```
インストールされていることを確認する。

```
$ which chromedriver 
/home/hoge/bin/chromedriver
```

### xvfbをインストールする。
pyvirtualdisplayの実行に必要なのでxvfbをインストールする。

```
$ sudo apt-get install -y xvfb
```
### pyvirtualdisplayをインストールする
pyvirtualdisplayをpip3でインストールする。

```
pip3 install pyvirtualdisplay
```
日本語ページが文字化けしないように日本語フォントをインストールする。

### 日本語フォントをインストールする
```
$ wget --content-disposition IPAfont00303.zip http://ipafont.ipa.go.jp/old/ipafont/IPAfont00303.php 
$ sudo unzip IPAfont00303.zip -d /usr/share/fonts/
$ fc-cache -fv
```

##検証

### ソースコード

google.py

```python

from selenium import webdriver
from pyvirtualdisplay import Display

display = Display(visible=0, size=(1024, 768))
display.start()

driver = webdriver.Chrome()
driver.set_window_size(1024, 768)

driver.get('https://www.google.com')

driver.save_screenshot("screenshot.png")

driver.quit()
display.stop()
```

上記をpython3で実行する。

```
$ python3 google.py
```

### 実行結果
無事Googleの検索ページのスクリーンショットが撮れました。

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/1697/44132cd5-3f1d-11ee-51cc-b7717de243e0.png)



## 参考記事
https://qiita.com/shinsaka/items/37436e256c813d277d6d
https://stackoverflow.com/questions/45370018/selenium-working-with-chrome-but-not-headless-chrome
http://b.ytyng.com/blog/python-selenium-chromedriver-error-127-install-libgconf2/
golang で reservoir sampling


# なにそれ

大量のテキストからランダムに行を抽出したい時のアレ。

詳細はこの辺を。 
http://sucrose.hatenablog.com/entry/2014/01/11/004615

まぁ書き直しただけなんですけど。

# コード

```go:reservoir_sampling.go
package main

import (
	"bufio"
	"flag"
	"fmt"
	"log"
	"math/rand"
	"os"
	"time"
)

var (
	seed       = flag.Int64("s", time.Now().UnixNano(), "random seed")
	samplesNum = flag.Int("n", 1000, "samples num")
)

func main() {
	flag.Parse()

	rand.Seed(*seed)
	k := *samplesNum

	reservoir := make([]string, k)
	scanner := bufio.NewScanner(os.Stdin)

	for i := 0; i < k; i++ {
		if !scanner.Scan() {
			log.Printf("input line less than %d", k)
			break
		}
		reservoir[i] = scanner.Text()
	}

	n := k

	for scanner.Scan() {
		n++
		r := rand.Intn(n)  // [0, n)
		if r < k {
			reservoir[r] = scanner.Text()
		}
	}
	if err := scanner.Err(); err != nil {
		log.Fatal(err)
	}

	for _, s := range reservoir {
		if s != "" {
			fmt.Fprintln(os.Stdout, s)
		}
	}
}
```

# ビルドして

```bash:bash
go build reservoir_sampling.go
```

# 実行

```bash:bash
$ wc -l data.csv
16357121 data.csv

$ time cat data.csv | ./reservoir_sampling -n 10000 | wc -l
10000

real  0m11.707s
user  0m2.691s
sys 0m10.424s
```

1600万件くらいの中から10000件抽出するのに10秒ちょっと。
手元のmacで python3 だと1分くらいかかったのでわりと満足。
インストールしたユーザーのみ実行できるようにする

# やりたいこと

プログラムをインストールしたユーザーだけが、そのプログラムを実行できるようにしたい。

# 環境

- OS:Windows 7/10
- セットアップ作成ツール:Inno Setup

# 方法

1. インストーラーでLocal Application Dataにインストールしたことを示すファイルを保存する。
```
// iss
Source: ".\installed"; DestDir: "{localappdata}\company\app"; Flags: ignoreversion;
```

2. プログラムの起動時に、そのファイルがあるかどうかをチェックして、ファイルがなければ、起動できないメッセージを表示して終了する。

```
// c#
string folder = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
string installedFile = Path.Combine(folder, "company", "app", "installed");
if (File.Exists(installedFile) == false)
{
    MessageBox.Show("You can't execute this program.");
}
```

# メモ

- 管理者権限を持たないユーザーの場合、管理者ユーザーに移行してインストールするので、インストーラーを実行したユーザーでも起動はできない。

- inno setupでインストールしたユーザーのデスクトップのみにアイコンを作成する

```
Name: "{userdesktop}\app"; Filename: "{app}\app.exe"; WorkingDir: "{app}";
```
- inno setupでインストールしたユーザーのスタートメニューのみにアイコンを追加する（本当はフォルダーを追加したかったが分からなかった。）

```
Name: "{userprograms}\app"; Filename: "{app}\app.exe"; WorkingDir: "{app}"; 
```

- Windows Installerのインストール対象を「このユーザーのみ」に設定しても、エクスプローラなどで直にexeファイルを起動すれば実行できる。このオプションはデスクトップとスタートメニューにショートカットを追加しないだけのフラグみたい。

- レジストリを使う方がスマートだったかもしれない。
vscode-backgroundのRandom buckground imageの展望

# まとめ

* ファイルを開く(エディタを分割する)ごとに異なる画像を表示することは現状、困難。(`random background everytime tab/file open`)
* VSCodeを開いたとき(restart)、毎回pane1,2,3にランダムな画像を設定することはできる。(`random background everytime vscode restart`)
* restartごとに画像をランダム設定する(`random background everytime vscode restart`)ことはできるが、作者はその機能を追加したくない。
* 作者が追加したいのはあくまで`random background everytime tab/file open`であり、それを達成するまでの間、暫定的に`random background everytime vscode restart`を追加しておく気もなさそうだ。


# Issue

[It would really be great if there was an option for random image from the array · Issue #93 · shalldie/vscode-background](https://github.com/shalldie/vscode-background/issues/93)


# Pull request

[Pull Requests · shalldie/vscode-background](https://github.com/shalldie/vscode-background/pulls?utf8=%E2%9C%93&q=random)

既に出されていたが、変更量が多く不完全なためか、マージはされていない。



# コード

[vscode-background/getCss.ts at d0c93f42044553e5d35d3cf6744bdd5addb58943 · shalldie/vscode-background](https://github.com/shalldie/vscode-background/blob/d0c93f42044553e5d35d3cf6744bdd5addb58943/src/getCss.ts#L14)

ランダムにするフラグを追加して、(画像配列を3つ以上設定して)`true`ならランダムに添え字をとってきて3つ設定する、というコードは比較的簡単そうにみえる。

CSSの設定なのでなるほど動的には難しそうだが、restartごとならできそうという印象。

どうしてもやりたければフォークか。


# background自体の導入

* [Visual Studio Codeの背景画像変更 - 雑多なノート](http://vayacico.hatenablog.com/entry/2017/05/01/205524)
* [vscode-backgroundの`background.style`設定について - Qiita](https://qiita.com/Azoson/items/9e06099ea738cf450c73)

`background.useDefault`を`false`にしないと自前画像が表示されないので、そこですこしハマった。
Go言語開門

まだ、入ってはいないので開門。

※ここでまとめるのは技術的なことよりも、勉強会に参加して良いなと感じたことなどエモい話中心です。
技術的なことでしたら、他の方が丁寧にまとめてくださっております。

## Goを使う上で良いなって感じたこと
### チームで開発する際の優位性
「[Goに入ってはGoに従え](http://ukai-go-talks.appspot.com/2014/gocon.slide)」という言葉あるように、大体の人が同じコーディングになる。
GofmtとGolintで整形する必要があるので、開発する際は個々が好きなフォーマットで開発しても問題ない。そのため、コーディング規約の同一や摺合せの必要がなくなる。

また、Goに触ったことがないニューカマーも
・[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)
・[Effective Go](http://golang.jp/effective_go)
を一通りこなせば、キャッチアップできる。

### 普通に開発すればそこそこパフォーマンスが出せる
愚直にコーディングするしかないので、読み/書きの量は多いが、基本的には無難なコーディングとなっていく。
並列処理が開発しやすく、FIFOキューといった順番を考える処理も担保しやすい。

また、pprofでパフォーマンスの改善点を探すことができ、改善ポイントさえ見つけてしまえば他の人に実装を委ねることもできる。

### シンプルな言語仕様
デザインが「悪い方が良い」原則（worse is better）である。
New Jersey アプローチ：はじめから必要なものは一通り用意されいる

Goのkeyword(予約語)は25語あるだが、マイナーチェンジの間は変わらない。言語のバージョンアップも原則バグフィックスかパフォーマンス改善となっている。なので、基本的にはひたすら同じコードは動く。

シンプルは後から足せないので、言語のバージョンアップによるデグレを確認しなくて良いのは良いと思いました。
（使っている機能が消されたら辛い

※対立的にMITアプローチというものがある。
（一貫性を欠かさない。代わりに完全性が少しだけ犠牲にしても良い）
参考：http://chasen.org/~daiti-m/text/worse-is-better-ja.html

### 配布が用意
バイナリとしてビルドができるので、自分で作ったツールを他に配りやすいのは良いと思いました。

## ハマりそうなポイント
http://www.yunabe.jp/docs/golang_pitfall.html
https://qiita.com/umisama/items/e215d49138e949d7f805
自分で立ち上げたローカルサーバーのポート番号のターミナルでの確認方法

よくいろんなポートで立ち上げたり被ったりするので忘れないように備忘録的なメモ。
終了しなくなる時の強制終了できるように終了コマンドも。

# 確認方法

```
lsof -i:<確認したいポート>
```

ex) localhost:8080のJobを確認したい時
lsof -i:8080

表示

```
COMMAND   PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    30062 USERNAME  117u  IPv6  ***********      0t0  TCP *:http-alt (LISTEN)
```

# 強制終了方法

```
kill -9 PID
```


ex)

```
kill -9 30062
```
vue-cliで作ったTypeScriptのプロジェクトにquasarを組み込む

#１．背景
vue-cliを使ってquasarを使いたかったので、チュートリアルを見ながら設定しようとしたが以下2パターンしか方法が無かった。
・既存のページに"script","link"タグでリソース読み込み（UMD Starter Kit）
・quasar-cliで最初から作る（Main Starter Kit）

###vue-cliで作ったTypeScriptのプロジェクトに組み込みたかったんです。

#２．答え
以下のプロジェクトで何をしているかを参考にして、自分のプロジェクトにその違いを反映させました。
https://github.com/JDrechsler/Quasar-with-TS-using-vue-cli-3

#３．バージョン
vue => 2.5.13
@vue/cli => 3.0.0-beta.6
quasar-framework => 0.15.10
quasar-extras => 1.0.2
typescript => 2.7.2

#４．やる事

###①必要パッケージインストール
必要パッケージはこれ

```
npm install --save quasar-framework
npm install --save quasar-extras  #こっちはicon使わなければ不要
```

###②tsconfig.jsonに以下コードを追加
quasarに型定義ファイルが無い為、ライブラリ読み込みでエラーになる問題を以下を追加で解消

```
"noImplicitAny": false,
"suppressImplicitAnyIndexErrors": true,
```

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/57219/1f6f0b95-ff4c-87ad-faf3-1dc17f0db94e.jpeg)

###③main.ts でquasarを読み込み
以下のコードを追加してquasarを使えるようにする。

```javascript

import Quasar, * as All from 'quasar-framework/dist/quasar.mat.esm.js'
import 'quasar-extras/material-icons'

require('quasar-framework/dist/umd/quasar.mat.min.css')
require('quasar-extras/roboto-font')

Vue.use(Quasar, {
	components: All,  // 使いたいコンポーネントのみ列挙でもよいはず
	directives: All   // こちらも上と同様
})
```
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/57219/fc0ae44b-e802-da24-e64f-4c2e86756b7f.jpeg)

#５．quasarを使う
あとは以下のようなタグを.vueファイルに入れるとスタイルが反映されます。

```html
      <q-btn label="My Button"/>
      <q-icon name="place" />
```

こんな感じで表示されます。
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/57219/accdb8b3-4124-d106-fb8d-423ed0b2bcb4.jpeg)


この解消に丸1日掛かりましたorz
pipのキャッシュにはまる

結局原因不明なのですが、pipでJupyterのインストールを実行すると、tornadoのインストールのところで固まってしまう現象に遭遇しました。

【追記】解決しました。最後に記載します。 
【追記】タイトルを変更しました。 

```
$ pip install jupyter
Collecting jupyter
  Using cached jupyter-1.0.0-py2.py3-none-any.whl
Collecting ipykernel (from jupyter)
  Using cached ipykernel-4.8.2-py3-none-any.whl
Collecting qtconsole (from jupyter)
  Using cached qtconsole-4.3.1-py2.py3-none-any.whl
Collecting jupyter-console (from jupyter)
  Using cached jupyter_console-5.2.0-py2.py3-none-any.whl
Collecting notebook (from jupyter)
  Using cached notebook-5.4.1-py2.py3-none-any.whl
Collecting ipywidgets (from jupyter)
  Using cached ipywidgets-7.1.2-py2.py3-none-any.whl
Collecting nbconvert (from jupyter)
  Using cached nbconvert-5.3.1-py2.py3-none-any.whl
Collecting ipython>=4.0.0 (from ipykernel->jupyter)
  Using cached ipython-6.2.1-py3-none-any.whl
Collecting traitlets>=4.1.0 (from ipykernel->jupyter)
  Using cached traitlets-4.3.2-py2.py3-none-any.whl
Collecting jupyter-client (from ipykernel->jupyter)
  Using cached jupyter_client-5.2.3-py2.py3-none-any.whl
Collecting tornado>=4.0 (from ipykernel->jupyter)
  Downloading tornado-5.0.1.tar.gz (504kB)
    99% |███████████████████████████████▉| 501kB 2.3MB/s eta 0:00:01
```

上記のようにtornadoのダウンロードが99%になったままインストールが止まってしまいます。

[anyenv](https://github.com/riywo/anyenv)を使っています。

```
$ anyenv version
pyenv: miniconda3-latest
```

OSはmacOS Sierraです。

# 対処方法

根本的な解決方法はわかりませんでした。
仕方がないので`tornado-5.0.1.tar.gz`を以下からダウンロードし、

* https://pypi.python.org/pypi/tornado

ダウンロードしたファイルを指定してtornadoをインストールしました。

```
$ pip install ~/Desktop/tornado/tornado-5.0.1.tar.gz
```

この後で

```
$ pip install jupyter
```

として、Jupyterを無事にインストールできました。

# 解決

投稿直後に「pipのcache！」と思いあたり、すぐに解決しました。
以下を参考にさせていただきました。

* [pipでキャッシュを無効にしてライブラリを再インストールする](https://qiita.com/tototoshi/items/7b74fe26eb7bf39be7b5)

検証のため、一旦tornadoをアンインストールして、

```
$ pip uninstall tornado
```

以下で再インストールできました。

```
pip --no-cache-dir install -I tornado
```

もっと早く気付けよって話でした…
PHP-FPMでドメインごとに違うユーザでプロセスを動かす

# 前提条件など
NGINX+PHP-FPMでバーチャルホストを構成していて、それぞれのホストごとに別ユーザとしてプロセスを動かします。


ユーザの作成をしておきます。example.comを動かすユーザ、exampleを追加しておきます。

```bash
$ useradd example

```

PHP-FPMでユーザごとにつながるようにしておきます。
ポイントは`listen`の箇所です。待受を行うTCP/IPのポート番号（若しくはユニックスソケット）を他のものと違う番号にしておきます。
今回はuseraddした時に出来たユーザIDが1005だったので9005としました。

```conf:/etc/php7-fpm.d/example.conf
; Start a new pool named 'www'.
; the variable $pool can we used in any directive and will be replaced by the
; pool name ('www' here)
[example]

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = example
group = example

; Note: This value is mandatory.
listen = 127.0.0.1:9005
```

NGINXの設定です。

```conf:/etc/nginx/sites-available/example.com.conf
   location ~ [^/]\.php(/|$) {

                fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                if (!-f $document_root$fastcgi_script_name) {
                                return 404;
                }
                fastcgi_pass 127.0.0.1:9005;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
                fastcgi_buffers 256 128k;
                fastcgi_buffer_size 128k;
                fastcgi_intercept_errors on;
                fastcgi_read_timeout 120s;
```

こちらも`fastcgi_pass`を`127.0.0.1:9005;`にしておきます。

# テスト

適当に負荷を掛けるコードを書いて、動かします。

```php:test.php
<?php
function hoge() {
  for($i=0; $i<1000000000; $i++) {
    if((rand()%100) === 0 ) {
  	echo 'hello'.PHP_EOL;
    }
  }
}
hoge();
?>
```

`top`などでプロセスの所有者が確認できればOKです。
Swiftyなextensionを書こうとしたら型がどっかいった話


`Class.ex_className`みたいなのをSwiftyにしたくて`Class.ex.className`みたいにしたかったんだけど、どうも動きが怪しい。

```swift

protocol ExCompatible {
  associatedtype CompatibleType

  static var ex: CompatibleType.Type { get }
}

final class Extension<Base> {
  let base: Base

  public init(_ base: Base) {
    self.base = base
  }
}

final class StaticExtension<Base> {}

extension ExCompatible {
  static var ex: StaticExtension<Self>.Type { return StaticExtension<Self>.self }
}

class Sample: NSObject {}

extension NSObject: ExCompatible {}

extension StaticExtension where Base: NSObject {
  static var className: String {
    return NSStringFromClass(Base.self).components(separatedBy: ".").last!
  }
}

func call1(klass: NSObject.Type) -> String {
  return klass.ex.className
}
func call2<T: NSObject>(klass: T.Type) -> String {
  return klass.ex.className
}

extension Sample {
  static func call5() {
    ex.className
  }
}
extension NSObject {
  static func call6() {
    ex.className
  }
}

call1(klass: Sample.self) //NSObject
call2(klass: Sample.self) //Sample
```

call1とcall2で結果が違う

```swift
extension NSObject {
  static var className: String {
    return NSStringFromClass(self).components(separatedBy: ".").last!
  }
}

func call3(klass: NSObject.Type) -> String {
  return klass.className
}
func call4<T: NSObject>(klass: T.Type) -> String {
  return klass.className
}

call3(klass: Sample.self) //Sample
call4(klass: Sample.self) //Sample
```

そのまま生やした時は問題無い。

call1はexを経由したタイミングでNSObject.Typeとして解決されちゃっている気がする。
staticなメソッドでクラス名ちゃんと取るのどうすればいいんだろ、気が向いたらsilとか読んでみたいと思う。
ページング操作中にデバイス \Device\Harddisk2\DR26 上でエラーが検出されました。   

ディスク 2 が突然取り外されました。
ディスク 2 (PDO 名: \Device\00000088) の論理ブロック アドレス 0x3d49421a で IO 操作が再試行されました。
ディスク 2 (PDO 名: \Device\00000086) の論理ブロック アドレス 0x5087 で IO 操作が再試行されました。

と出たので解決方法をメモります。

とりあえずぐぐってみると
https://answers.microsoft.com/ja-jp/windows/forum/windows_7-hardware/%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0/2fa2a939-d9b5-494f-9733-5c08f9a90a3a?messageId=edfb0fad-2a45-4e9c-92cc-1c03d75b07a9
```
過去の経験上から言えば、HDDの破損(故障)直前に同様のエラーを記録した記憶があります。
ただちにディスクの内容をバックアップしておいた方がよい状況かと...。

あと、外付けディスクとは決めつけず、システムドライブ(C:)に対してもチェックされてはいかがでしょうか？
時間があれば、修復オプションとともにセクタスキャンも実施されると良いかと思います。
```
というのが見つかった……
怖くてチェックディスクが出来ないので
他の情報も探し中…………
Homebrew, rbenvの組み合わせでRuby 2.5.1をインストールする

## 背景
Ruby 2.5.1 がリリースされました。
https://www.ruby-lang.org/ja/news/2018/03/28/ruby-2-5-1-released/

## インストールしてみる

### 最初にやったこと
以下を参考
https://github.com/rbenv/ruby-build#upgrading

```sh
brew update && brew upgrade ruby-build
```

が、駄目。

homebrewがデフォルトで参照するバージョンが`v20180224`になってるため
単にupgradeしただけでは最新にならなかった。
https://github.com/Homebrew/homebrew-core/blob/master/Formula/ruby-build.rb

~~なお既にPR(プルリクエスト)は出ているのでいずれ反映されると思います。~~
~~https://github.com/Homebrew/homebrew-core/pull/25895~~
マージされていました(2018/03/29 17:00追記)
なので、↑のコマンドで問題なく更新できると思います。

### 次にやったこと
brew upgradeの際にHEAD(最新)を参照するオプションを指定した。

```sh
brew upgrade ruby-build --HEAD
```

#### 確認
```sh
ruby-build --version
#=> ruby-build 20180329
```

#### Ruby 2.5.1 インストール
```sh
rbenv install --list | grep 2.5.1
  2.5.1
  rbx-2.5.1
```

listに出てくるようになったのでインストール

```sh
rbenv install 2.5.1
## ログ省略
```

#### バージョン指定
```sh
## 特定のプロジェクトで使う場合はPJのRootで以下
rbenv local 2.5.1
## 全体でつかうなら以下
rbenv global  2.5.1
```

## 確認
```sh
ruby -v
#=> ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
```

## 良かったこと
* homebrewの仕組みに少しだけ詳しくなれた
* 「N人が承認すれば自動でマージされる仕組み」を観測することができた

## おわりに
多分すぐにHomebrewも更新されて`--HEAD`付けなくてもできるようになるとは思うけど、
お急ぎの方はどうぞ。
Project Euler 63「べき乗の桁の個数」

# Problem 63 「べき乗の桁の個数」
5桁の数 16807 = 7^5は自然数を5乗した数である. 同様に9桁の数 134217728 = 8^9も自然数を9乗した数である.
自然数を n 乗して得られる n 桁の正整数は何個あるか?

```python
def hoge():
    cnt = 0
    # 10**1=10(2桁)、10**2=100(3桁)、... なので10以上の数字のn乗がn桁になることはない
    for m in range(1, 10):
        n = 1
        while 1:
            if len(str(m ** n)) == n:
                cnt += 1
            else: # これでいいのかちょっと疑問
                break
            n += 1
    return cnt

print(hoge())
```
Web制作・プログラミングで最初に学ぶ言語の特徴まとめ


# 当ページの目的

Web制作やWebアプリ開発などを目指すにあたり必須となる言語について特徴等をまとめていきます。



# HTML

HTMLは一般に「エイチ・ティー・エム・エル」と呼ばれ、**Hyper Text Markup Language**の頭文字の略です。


Webページを制作するための言語の一つです。


- Webページを制作するための言語の一つ
- HTMLは*タグ*で記述される
- 見出しや段落といったドキュメントの構造化、画像・リンクの埋め込みも可能な高機能マークアップ言語
- パソコン・スマホ等の端末で表示されるサイトの大半がHTMLで記述されている
- 記述の内容(タグ・ソースコード等)を各ブラウザが解釈することでWebページが正しく表示される
- HTMLは「XHTML」などの後継仕様の他、現在主流の**HTML5**がある(※）
  - （※）HTML5は最新のSEO対策(検索エンジン対策)でも推奨されている仕様
- HTMLの種類によって記述可能なタグが異なる


# CSS

CSS(Cascading Style Sheets：カスケーディング・スタイル・シート)


- Webページのスタイルやデザインを指定することができるスタイルシート言語の一つ 
- CSSはHTMLとセットで組み合わせて利用する
- HTML内に直接CSSを記述することも可能(インライン化)だが、外部ファイルとしてHTMLへ読み込むのが一般的
- 画像やテキストを中央寄せ・左回り(右周り)に配置する、というように文書構造を自由に指定できる
- CSSの最新バージョンは現在「CSS3」で、もっとも豊富なスタイルを表現できる
- CSSのほかに、*SCSS*といった「メタ言語」がある


### SCSSについての補足

SCSS(Sass記法とも呼ばれる)は*メタ言語*とよばれ、プログラミングによりCSSを直観的、構造的に作成することが可能。

- SCSSの利用にはRubyによるコンパイルが必要（Rubyインストール済みの環境必須）。
- SCSSによりCSSの保守性や管理性が飛躍的に向上
- 一般的なCSSと記述の仕方が根本的に違う点が特徴的
- 記述を構造的かつシンプルにできるため、スタイルシート肥大化の抑制、ページ速度の改善が期待
- スタイル使いまわしの際、CSSの継承問題を解決できる
- @importで各CSSをひとつずつ読み込まず、CSSを一つのファイルにまとめて利用するため早い処理を行える
- 上述の特徴があるため、サーバーへの負荷を減らせる等のメリット



# JavaScript


ジャバスクリプト


- 企業ホームページや個人ブログの制作、Webアプリ開発などで幅広く利用されている言語
- クライアントサイドのブラウザ上で動作するスクリプトなのでサーバーに負荷をかけない
- コンパイル作業が必須のコンパイル言語(例：C、C++など)とは異なり、スクリプト単体で動作するスクリプト言語
- 種類の異なるブラウザであっても表示される結果が同じになるような動作を提供する*JQuery*という規格が存在
- Webページ内で動的なイベント（ページ切替、ドキュメント表示、アニメーション、その他…etc）の実行が可能
- 名称が似ているため**Javaプログラミング言語と混同され易い**がJavaとは異なる


# Ruby

ルビー


- 日本で開発されたプログラミング言語で、初学者にも読みやすいといわれている
- 他の言語に比べよりシンプルなコーディングで実行できるため、スピーディーな開発が可能
- Rubyは厳密には**スクリプト言語**（※）である
   - ※スクリプト言語はコンパイル作業を行わずにプログラムの実行が可能
- データ、メソッド、プロパティがひと塊になったものを扱えるオブジェクト指向型の言語
- 多機能で様々な環境でも実行が可能な柔軟性を持つ
- 企業サイトやSNSサービス、ブログなどを構築することができるほか、スマホアプリなども開発できる
- オープンソース、無料で利用・開発が可能


# Ruby on Rails


Ruby on Rails(ルビー・オン・レイルズ）

- Ruby on Railsは、プログラミング言語RubyのWebアプリケーションフレームワーク(※)の一つ
   - (※) フレームワークは、Webアプリケーションを最短で簡単に作成するための枠組みです
   - この枠組みのおかげでアプリを構成する最小単位のプログラムを白紙の状態からコーディングする必要がない
   - 以上の特徴から、PerlやPHPよりも比較的スピーディーに開発を行える
- Ruby on Railsは、MVC(※)という理念で構築されている
   - (※)MVCは、Model(データを操作）、View（ページの見た目）、Controller(データと見た目の連携）の頭文字の略
- スマホアプリから出力されたデータをサーバー側で保存・管理する、といったサーバーサイドで動作するWebアプリを開発できる
- 企業の売上計算、在庫管理といった業務管理システムを開発することも可能
VCCWを使ってみてつまづいたところ。[Vagrant][Wordmove][VCCW][Wordpress]


## Movefileいじったらリロードした方がいい

まず、Movefile.ymlを編集したりwordmoveでpullして、
すでに`vagrant up`をしていたら`vagrant halt`で一旦停止するか`vagrant reload`で再起動した方がいい。

`vagrant ssh`
してWordmoveの
`wordmove pull --all`
した後にローカル見たら真っ白の画面で重くて読み込めない状態に。。。
そこで vagrant ssh　からログアウトして
`vagrant reload`したらうまく動きました。

そこだけ。

あとは快適にローカルに開発環境つくれました〜

いや〜いいですね〜VCCW

`wordmove pull --all`

で本番の環境ごっそり持ってこれて

`wordmove pull -d`
とかでデータベース持ってきて

`wordmove push -t`
とかでテーマファイルだけアップできたり
楽チン！

##参考
https://qiita.com/pugiemonn/items/043bf3a959cb8be69462
【R言語】指定した複数の変数削除

#1つのvariable削除

```R
remove(variable)
#removeはrmと短縮記述も可能
```

#全部のvariable削除

```R
remove(list = ls())
#ls()で変数名一覧を呼び出している
```

#複数の指定したvariable削除

```R
remove(list = c("variableName1","variableName2"))
```

ここで実はちょっとはまりました。

私のやっていた処理では、処理対象の名前を持つloadNameList がありました。
それに演算した結果を"a" + loadNamelist[x]で保持していました。
用済みになったのでこのlistで作った変数を削除しようと以下コマンドを実行しました。

```R
loadNameList <- c("123","456");
removeNameList <- list()
for(i in loadNameList)
{
  removeNameList <- c(removeNameList, sprintf("%s%s","a",i))
}
remove(list = removeNameList) 
```

するとエラー

```
Error in remove(list = removeNameList) : invalid first argument
```

なんでじゃ！？
と言うことで確認。

```
> ls()
  [1] "a123"                     "a456" 

> removeNameList
[[1]]
[1] "a123"

[[2]]
[1] "a456"
```

つまりベクトルとlistの概念を理解していなかったと言うことですね。

```R
#remove(list = 文字列ベクトル)でなければならない
remove(list = "a123") #これはOK
remove(list = a123) #これはNG そもそもremove(a123)で良いのですが
```

自信ないですがRでは

 * データの最小構造はベクトル
 * 「1」や「"a"」は長さ1のベクトル
 * c(1,2)は長さ2のベクトル
 
 と言うことのようです。

ベクトルとして扱うために以下の様にすると実行できました。

```R
removeNameList <- c()#空のベクトルとして宣言
for(i in loadNameList)
{
  removeNameList <- c(removeNameList, sprintf("%s%s","a",i))
}
```

または

```R
removeNameList <- list()
for(i in loadNameList)
{
  removeNameList <- c(removeNameList, sprintf("%s%s","a",i))
}
remove(list= unlist(removeNameList))#unlistでベクトルに変換できる。
```

うーん、中々慣れないと良く分からんですね。
Angularで一つのページに複数のbootstrapを埋め込む

古いサイトを順次angularに入れ替えていくなどの目的で、
ページのある部分だけをangular化したい場合があります。

その入れ替え部分が一箇所だけなら普通にbootstrapとなるComponentのselectorタグを埋め込めばいいのですが、複数箇所に個別にangular埋め込みたくなった場合それは可能なのか？


-> **結論から言うと、可能です。**
ただしちょっと注意が必要です。

```:html
<html>
  <head>...</head>
  <body>
    :
    <angular-root1></angular-root1>
    :
    <angular-root2></angular-root2>
    :
  </body>
</html>
```
のように書いてangular-root1、angular-root2をselectorに持つcomponentをbootstrapに指定したmoduleもjsを読み込めば、それぞれについてangularが埋め込まれて動作します。


## cssのセレクタ競合問題
componentでstyle(css)を使うと、

```
<html>
  <head>
  :
  <style>
  .classA[_ngcontent-c0] {...}
  .classA[_ngcontent-c1] {...}
  </style>
  </head>
  <body>
    :
    <angular-root1>
        <div _ngcontent-c0 class="classA">
        :
        </div>
    </angular-root1>
    :
    <angular-root2></angular-root2>
    :
  </body>
</html>
```

のようにタグ埋め込みかつ、**_ngcontent-c***というプロパティを用いたセレクタ指定でstyleが埋め込まれます。
通常の複数のcomponentに同じ名前のCSSクラスがある場合、このプロパティのサフィックスに違う値が割り振られるためにスタイルの競合が起こらないようになっています。

しかし、別のアプリケーションとして実行すると、このサフィックスはそれぞれで振られてしまうため、競合が発生していまいます。


## 回避方法
綺麗な回避方法は(もしかしたらあるかも知れませんが)見つけられていません。

パーツ埋め込みで使うcomponentのCSSクラス名は競合しなさそうな物を使うなどして下さい。
(というか、昔はみんなその辺り気をつけて命名してましたね。)
CentOS7でPHP7.1が動く環境をDocker上に作る

# コンテナの作成起動とbash

```bash
$ docker run --name centos7 -itd centos:centos7
$ docker exec -it centos7 /bin/bash
```

# PHP7.1のインストール

epelとremiリポジトリが必要なので入れておく。
その後でremi-php71からphpをインストール

```bash
$ yum update -y && yum -y install epel-release

$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

$ yum install --enablerepo=remi,remi-php71 -y php
```

# 確認

```bash
$ php -v
```

<img width="605" alt="Screen Shot 2018-03-29 at 13.37.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/8d0db1d0-2449-b4a2-fe22-6beb83873656.png">

(PHP7を使うだけならphp7のイメージを拾ってきたほうが良いです。
cronの最終行が実行されない原因と対処法

# cronの状態
ぱっと見る限り問題なさそう

```
$ crontab -l
0 1 * * 1-5 execute.sh
35 11 * * 1-5 execute.sh
```
# crontabで編集したものとファイルを比べる
ファイルの末尾に改行がなかった

```
$ sudo cp /var/spool/cron/hoge ~/hoge-before
$ crontab -e
:wq
$ sudo cp /var/spool/cron/hoge ~/hoge-after
$ diff ~/hoge-before ~/hoge-after
```
# 原因
改行か%がないとその行は実行されない

```
man 5 crontab
```
> The "sixth" field (the rest of the line) specifies the command to be run.  The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the cronfile.  Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.

意訳
6番目のフィールド（行の残りの部分）は、実行するコマンドを指定します。 行のコマンド部分全体（改行または％文字まで）は、/bin/shまたはcronfileのSHELL変数で指定されたシェルによって実行されます。 バックスラッシュ（\）でエスケープしない限り、コマンドのパーセント記号（％）は改行文字に変更され、最初の％以降のすべてのデータは標準入力としてコマンドに送られます。
# 解決
将来忘れそうなので、未来の自分でも気づける方法として、最終行にコメントを付与してみた。

```
 0 1 * * 1-5 execute.sh
 35 11 * * 1-5 execute.sh
 # Comment for the newline of crontab termination character. See man 5 crontab.
```
LocalからIBM Cloud IaaS(SoftLayer)への巨大ファイル送信

#はじめに
IBM Cloud IaaS(以後SoftLayer)に限らず、クラウド環境への巨大ファイル送信は面倒ですよね。
Public Network経由で送信可能な踏み台サーバーを作るのも予算的に厳しいし、VPN経由でPrivate Newtorkで転送すると速度が出ない上にVPN Clientが落ちてファイル転送が異常終了してしまうことも。
そんな時の対応策として、IBM Cloud Object Storage(以後ICOS)を介したファイル送信方法をご紹介します。
Local-ICOS間はPublic Networkで接続できるし、ICOS-SoftLayerも内部接続(だと思われるため)高速にファイルのやり取りができます。

#概要
大まかに以下の手順で進めて行きます。
1.ICOSの作成
2.ICOSへのファイル送信
3.SoftLayer環境からICOS上のファイル入手

#手順
1.ICOSの作成
[IBM Cloudのカタログ](https://console.bluemix.net/catalog/)から、オブジェクト・ストレージを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162686/c63465f2-08f8-649c-a03f-07eef70a2988.png)


任意のサービス名とプランを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162686/3a3a89e2-bb4c-ca83-f290-b7dc0a4cffdd.png)

サービス資格情報→新規資格情報を選択します。
アクセス役割をManagerにした上で、インラインの構成パラメーターの追加に{"HMAC":true}と入力して追加を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162686/900019c1-0a94-1c49-de43-47589f99b0e9.png)

資格情報の表示を選択して、access_key_idとsecret_access_keyを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162686/b060beaf-5ae2-0061-5eb3-6a139b8b31da.png)


2.ICOSへのファイル送信
と、この後はS3 APIを介してICOSにファイルを転送する方法を書く予定だったのですが。。。
なんとICOSのファイル送受信にAsperaが使えるようになったのですね。
検証してみたところ、こちらの方法のほうがはるかに速くファイルを送れるうえに、S3 APIのPUTの5GB制限が無いため、Asperaでのファイル送信をお勧めします。

8GB程度のファイルを送信中の様子。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162686/f60adc33-141d-dadd-df79-30e403e8d097.png)

以下の記事がとても分かりやすいので、そちらを参考にファイルを転送してください。
[IBM Cloud Object Storage（ICOS）へのファイルアップロードをAsperaで高速化！](https://qiita.com/y_tama/items/11de90d72b0eede9ac85)


3.SoftLayer環境からICOS上のファイル入手
ICOS→SoftLayerのファイルのやり取りまでAsperaでできるとこの記事の意味が無くなってしまうのですが、ICOSからのAsperaでのDownloadは有料のようで、S3 CLI経由でICOSのファイルを入手する方法をご紹介します。

まずSoftLayer環境にAWS CLIを導入します。
[AWS CLI のインストールと設定](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html)

続けて、~/.aws/credentialsを以下の中身で作成します。
XXX...には資格情報の表示で確認したaccess_key_idを、aws_secret_access_keyにはsecret_access_keyを入力してください。

```credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYY
```

続けて、バケットが見れることを確認します。以下のコマンドで確認できます。
aws --endpoint-url=https://\<endpoint_url\> s3 ls

\<endpoint_url\>はEndpointから確認できます。
今回はSoftLayer環境から外部接続が無い想定で、プライベートの方を使います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162686/65eb66a3-86d6-18e2-9f63-bc49b313b5ad.png)

雑なバケット名ですが、、、表示されますね。

```
# aws --endpoint-url=https://s3.us-south.objectstorage.service.networklayer.com s3 ls
2018-03-28 22:29:09 testdsadasdsa
```

続けてバケットの中身を確認します。以下のコマンドで確認できます。
aws --endpoint-url=https://\<endpoint_url\> s3 ls s3://\<backet_name>/

```
# aws --endpoint-url=https://s3.us-south.objectstorage.service.networklayer.com s3 ls s3://testdsadasdsa/
2018-03-28 22:38:57 8770697111 xxxxxxx.zip
```

最後にファイルをICOSから入手します。以下のコマンドで実行できます。結構速度が出てますね。
aws --endpoint-url=https://\<endpoint_url\> s3 cp s3://\<backet_name>/ <download_dir>

```
# aws --endpoint-url=https://s3.us-south.objectstorage.service.networklayer.com s3 cp s3://testdsadasdsa/xxxxxxx.zip /work
Completed 1.4 GiB/8.2 GiB (54.4 MiB/s) with 1 file(s) remaining
```
truffle console / truffle development におけるMyContract is not definedの対処法

##状況
truffle console / development において

```truffleの.console
truffle(console)>
truffle(console)>MyContract.at("0xabcd...");
```

と打ちデプロイしたコントラクトを取得しようとした。

## 原因
そもそもMyContractがコマンド名ではなくて、自分のデプロイをしたコントラクト名に置き換えるという意だった(恥ずかしい。。)

## 対策

```Auction.sol
pragma solidity ^0.4.14;

contract Auction {
------
}
```

```truffleの.console
truffle(console)>
truffle(console)>Auction.deployed();

```

truffleのドキュメントにあったatだとエラーが出たのでdeployed()にしてます。


## 備考
以下の環境です
web3: '0.20.5'
truffle: '4.1.3'
solidity: '4.1.14'


参考
http://truffleframework.com/docs/getting_started/console
ASP.NET MVCのモジュールをJenkinsで発行する

デプロイモジュールを発行するために

``` cmd
msbuild target.sln /p:VisualStudioVersion=14.0 /p:DeployOnBuild=true /p:Configuration=targetStaging /p:PublishProfile=targetProfile
```


をjenkinsのジョブに登録し、実行すると以下のエラーが発生。

``` cmd
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Transform\Microsoft.Web.Publishing.AspNetCompileMerge.targets(132,5): error : 
Can't find the valid AspnetMergePath [C:\Jenkins\workspace\Common_Build\Apps\Pajdis.CommonAndPortal\Pajdis.CommonAndPortal\Pajdis.CommonAndPortal.csproj]
```

なにこれ。VisualStudioで発行するときに見たこと無いぞ。
とりあえずコマンドにAspnetMergePathを明示すれば動くだろ。

``` cmd
msbuild target.sln /p:VisualStudioVersion=14.0 /p:DeployOnBuild=true /p:Configuration=targetStaging /p:PublishProfile=targetProfile 
/p:AspnetMergePath="C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\"
```

よっしゃ実行だ！

``` cmd
MSBUILD : error MSB1008: 1 つのプロジェクトのみを指定できます。
```

なん。。だと。。。。動かない。。。

よくよく見ると

``` cmd
Path To MSBuild.exe: msbuild.exe
Executing the command cmd.exe /C " msbuild.exe /p:VisualStudioVersion=14.0 /p:DeployOnBuild=true /p:Configuration=DebugPajdis /p:PublishProfile=DebugPajdis "\p:AspnetMergePath=C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools"" Apps\Pajdis.CommonAndPortal\Pajdis.CommonAndPortal.sln " && exit %%ERRORLEVEL%% from C:\Jenkins\workspace\Common_Build
[Common_Build] $ cmd.exe /C " msbuild.exe /p:VisualStudioVersion=14.0 /p:DeployOnBuild=true /p:Configuration=DebugPajdis /p:PublishProfile=DebugPajdis '\p:AspnetMergePath=C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools"' Apps\Pajdis.CommonAndPortal\Pajdis.CommonAndPortal.sln " && exit %%ERRORLEVEL%%
Microsoft (R) Build Engine バージョン 4.6.1086.0
[Microsoft .NET Framework、バージョン 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.

MSBUILD : error MSB1008: 1 つのプロジェクトのみを指定できます。
スイッチ:Apps\Pajdis.CommonAndPortal\Pajdis.CommonAndPortal.sln

スイッチの構文については、"MSBuild /help" と入力してください。
Build step 'MSBuildの実行' marked build as failure
Finished: FAILURE
```

jenkinsさんの解釈がおかしいのかな。うん。
というわけでCan't find the valid AspnetMergePathで検索。
[ここ](http://stackoverflow.com/questions/12713714/cant-find-the-valid-aspnetmergepath-on-visual-web-developer-publish)にたどり着いた。

結局、最初のエラーメッセージで指摘されたMicrosoft.Web.Publishing.AspNetCompileMerge.targetsを修正した。

``` xml
  <Target
      Name="GetAspNetMergePath"
      DependsOnTargets="$(GetAspNetMergePathDependsOn)"
      Condition ="'$(GetAspNetMergePath)' != 'false'">
    <PropertyGroup>
      <!--追加する行-->
      <TargetFrameworkSDKToolsDirectory>C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\</TargetFrameworkSDKToolsDirectory>
      <!--おわり-->
      <AspnetMergeName>aspnet_merge.exe</AspnetMergeName>
      <AspnetMergePath Condition="Exists('$(TargetFrameworkSDKToolsDirectory)$(AspnetMergeName)')">$(TargetFrameworkSDKToolsDirectory)</AspnetMergePath>
    </PropertyGroup>
    <Error Condition="'$(AspnetMergePath)' == '' Or !Exists($(AspnetMergePath))"
           Text="Can't find the valid AspnetMergePath" />
  </Target>
```

これで最初のジョブを実行することで無事にデプロイモジュールがjenkinsから発行できるように。
ListBoxのDataSourceバインドについて

## はじめに
C#のフォームにて、ListBoxのDataSourceに対して、
ReactiveProperty や ReactiveCollectionを使ってデータバインドを試みた。
しかし、初期値は反映されるけど、コレクションの操作はViewに反映されなくて困った。

[ReactivePropertyについてはこちら。](https://github.com/runceel/ReactiveProperty)

## PropertyChangedを使って反映
DataSourceに関して、ReactivePropertyを使わず、変更通知は自前でやる事にした。

1. ViewModelクラスにListBoxのDataSource用プロパティを定義する

	```C#:ViewModel 
	class HogeViewModel : INotifyPropertyChanged
	{
	    public event PropertyChangedEventHandler PropertyChanged;
	
	    public List<string> ListDataSource { get; } = new List<string>() { "初期", "データ" };
	
	    ...
	}
	```

1. Formのデザインビューから、ListBoxのDataSourceを、先程定義した **ListDataSource** を選択する

1. 各コレクションの操作用メソッドを実装する

	```C#:
	private void AddListItem()
	{
	    ListDataSource.Add("hoge");
	    PropertyChanged(ListDataSource, new PropertyChangedEventArgs(nameof(ListDataSource)));
	}
	
	private void ClearListItem()
	{
	    ListDataSource.Clear();
	    PropertyChanged(ListDataSource, new PropertyChangedEventArgs(nameof(ListDataSource)));
	}
	```

上記の手順で要求を満たせたので、メモとして残しておく。

**※追記 2018/03/30**
[BindingList](https://msdn.microsoft.com/ja-jp/library/ms132679(v=vs.110).aspx) を使えば、PropertyChanged を利用しなくても通知が行えた。

```C#:変更箇所 
public List<string> ListDataSource { get; } = new List<string>() { "初期", "データ" };
　↓　
public BindingList <string> ListDataSource { get; } = new BindingList <string>() { "初期", "データ" };

```