OmniAICreator/Qiita-1.07M huggingface dataset:
[codexa]統計 入門 (前編)

- 統計 入門 (前編)
- https://student.codexa.net/contents/view/44
    - 機械学習のための統計
- 対象
    - これから機械学習を学ぼうとしている人
    - 統計の基本に不安がある人

## 機械学習と統計
### 統計とは
- データを分析して、性質を調べ、推測する
    - 推測統計：採取したデータ（標本やサンプルとも呼ぶ）から母集団（全体のこと）の性質を確率統計的に推測する
    - 記述統計：収集したデータの統計量（平均、分散など）を計算して分布
を明らかにすることにより、データの示す傾向や性質を知る

### ドットプロットとヒストグラム
- バラバラとしたデータを分析しやすくグラフ化する
- 度数分布表
    - 統計資料を階級に分け、各階級ごとの度数を表の形式で表したもの。
- ドットプロット
    - 統計用グラフの一種。横軸に名義尺度（カテゴリ、番号など）を取り、1標本を1個の点（ドット）で表現する。
- ヒストグラム
    - 統計グラフの一種。縦軸に度数、横軸に階級をとって表現する。

>
```
# 使用するライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt
# 練習問題「ゴルフのスコア」データ作成
golf = np.array([110,107,121,137,87,92,104,129,98,99,139,82,105,100,114,122,109,94,106,111])

>
# ヒストグラムの作成
plt.hist(golf, range=[80,140], bins=6)
plt.grid(True)
plt.show()
```
![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/242985/10ef1823-9774-b085-7df7-2546ba367e67.png)

### 平均値・中央値・最頻値
- 平均値（mian）
    - データの合計値をデータ数で割った値
- 中央値（median）
    - データを小さい順に並べたときにちょうど真ん中に来る値
    - データ数が偶数の場合は、２つの値の真ん中を中央値とする
- 最頻値（mode）
    - 最も頻繁に出現する値
- 四分位範囲（Interquartile range）
    - データのばらつきの大きさ（散らばり具合）を表す指標

>
```
# 使用するライブラリのインポート
import numpy as np
# 練習問題「1日のコーヒーの量」データ作成
coffee = np.array([2,2,3,5,7,9,10,15,16])
coffee.mean() #平均値(Mean)
np.median(coffee) #中央値(Median)
# 「coffee」のデータから中央値を除いて前半(Q1)と後半(Q3）に分ける
coffee_q1 = np.array([2,2,3,5])
coffee_q3 = np.array([9,10,15,16])
# Q1とQ3の中央値(Median)を求めよう
q1_median = np.median(coffee_q1)
q3_median = np.median(coffee_q3)
# IQRを算出
# 後半の中央値から前半の中央値を引く
IQR = q3_median - q1_median
# 答え確認
print(coffee_q1)
print(coffee_q3)
print(IQR)
```

>
```
[2 2 3 5]
[ 9 10 15 16]
10.0
```

### 分散と標準偏差
- データの散らばり具合を示すもの
- 母集団
    - 全てのデータ
- 標本
    - 母集団から一部を取り出したデータ
- 母平均 = μ（ミュー）
- 母分散
    - 平均から各データポイントがどれくらい離れているか
- 母集団標準偏差




### 標本標準偏差
- 標本分散
    - 標本分散は標本から計算した分散
    - 母集団に比べ標本数が少ない時は、標本分散が母分散よりも小さくなる
- 不偏分散
    - 標本分散が母分散に等しくなるように補正したもの 

###　外れ値と平均値/中央値
- 外れ値 (Outlier)
    - 他の値から大きく外れた値のこと
    - 外れ値 < （Q1 - 1.5 * IQR）
    - （Q3 + 1.5 * IQR） < 外れ値
【Revit】選択されていない要素IDの取得方法

Autodesk Revitにて選択されていない要素情報を取得する方法例です。
備忘録的なモノなので動作は保証しませんがヒントになれば幸いです。

```C#
/// <summary>
/// 要素IDコレクションを取得する
/// <param name="revit">ExternalCommandData</param>
/// <return>要素IDコレクション</return>
/// </summary>
private ICollection<ElementId> GetElementIds(ExternalCommandData revit)
{
    UIApplication uiapp = revit.Application;
    UIDocument uidoc = uiapp.ActiveUIDocument;
    Application app = uiapp.Application;
    Document doc = uidoc.Document;

    // フィルターセット(例では解析モデル床でフィルタリング)
    ElementCategoryFilter filter = new ElementCategoryFilter(BuiltInCategory.OST_FloorAnalytical);
    FilteredElementCollector collector = new FilteredElementCollector(doc);
    elementIds = collector.WherePasses(filter).WhereElementIsNotElementType().ToElementIds();

    // 要素IDを取得する
    return elementIds;
}
```
i18nの階層と表示

#i18nの使い方と表示のさせ方
以下に例

```ja.yml
  ja:
    general:
      greeting:
        morning: 'おはよう!'
        hello: 'おっす、%{name}!'
```
上記で階層を作ってymlファイルに記入できる。
表示するときは下記のように記入。階層は.で繋げて表示させる。

```html.erb
  <%= t 'general.greeting.morning' %>
  <%= t 'general.greeting.hello',name:'tanaka' %>
```

```
#表示結果
おはよう！
おっす、田中！
```


##jsファイルに表示させる場合は書き方が異なる

jsファイルに表示させたい場合は***js_ja.yml***とかのjs用のファイルに定義する必要がある(ファイル名は適当ですが)。

```js_ja.yml
ja:
  js:
    general:
      greeting:
        morning: 'おはよう!'
        hello: 'おっす、%{name}!'
```

以下はjsファイル。

```js
I18n.t("js..general.greeting.morning")
#結果　おはよう！
```

jsだとこんな風な書き方になるので、注意が必要。

参考；
https://qiita.com/rik0/items/b022c111b4ae3347926b
Mysql日記１

#Mysql基礎

```sql:
$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 343
Server version: 8.0.12 Homebrew
...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+-----------------------
| Database                |
| information_schema      |
| mysql                   |
| ~~~~~~~~_development    |
| ~~~~~~~~_test           |
| performance_schema      |
| sys                     |
+-------------------------+
mysql> use ~~~~~~~~_development
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------------------------+
| Tables_in_originalapp_development |
+-----------------------------------+
| ar_internal_metadata              |
| ~~~~~                             |
| ~~~~~~~_~~~~~                     |
| ~~~~~~~                           |
| ~~~~~~~                           |
| ~~~~~~                            |
| ~~~~~~~_~~~~~~~                   |
|  users                            |
+-----------------------------------+
mysql> scheme users;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'scheme users' at line 1
mysql> desc users;
+-----------------
+------------------------+--------------+------+-----+---------+----------------+
| Field                  | Type         | Null | Key | Default | Extra          |
+------------------------+--------------+------+-----+---------+----------------+
| id                     | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| email                  | varchar(255) | NO   | UNI |         |                |
| encrypted_password     | varchar(255) | NO   |     |         |                |
| reset_password_token   | varchar(255) | YES  | UNI | NULL    |                |
|    .                   |     .        |   .  |  .  |    .    |           .    |
+------------------------+--------------+------+-----+---------+----------------+

他にも、
mysql> desc tweets;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | NO   |     | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
| updated_at | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
でデータを確認できる
mysql> exit
Bye
```
TwitterAPIのApplication-only  authenticationを使う

TwitterAPIが提供しているApplication-only authenticationという認証方式を使ってみたのでその記録を残す。

## Application-only authenticationについて

TwitterAPIは、 **Application-only authentication** という特定のユーザの認証を必要としない認証方法を提供している。下記リンクにその詳しい説明がある。
https://developer.twitter.com/en/docs/basics/authentication/overview/application-only

ユーザの認証を必要としないので、例えば特定のクエリで検索したツイートを取得したいだけ、などのケースなどで役に立つ。
逆に言うと、ユーザのコンテキストを必要とするような情報にはアクセスできない。

## 使い方

### base64エンコードしたBearer token credentialsを生成する

まず最初に、Twitterにアプリを登録すると発行される **Consumer Key** と **Consumer Secret** から、Bearer token credentialsというのを次のコマンドで生成する。

```
$ echo -n <CONSUMER_KEY>:<CONSUMER_SECRET> | openssl enc -e -base64 | tr -d "\n"
```

仮に、CONSUMER_KEYが`aaa`、CONSUMER_SECRETが`bbb`だとすると次のようになる。

```
$ echo -n aaa:bbb | openssl enc -e -base64 | tr -d "\n"
YWFhOmJiYg==
```

### アクセストークンを取得する

次に、生成したBearer token credentialsをAuthorizationヘッダにのせてTwitterAPIへリクエストし、アクセストークンを取得する。

```
$ curl -X POST \
       -H 'Authorization: Basic <BEARER_TOKEN_CREDENTIALS>' \ 
       -H 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8' \ 
       -d 'grant_type=client_credentials' \ 
       'https://api.twitter.com/oauth2/token'
```

成功すると、次のようなアクセストークンを含むレスポンスが返ってくる。

```
{"token_type":"bearer","access_token":"xxx.."}
```

### TwitterAPIを使う

アクセストークンが取得できたら、あとはAuthorizationヘッダにのせてTwitterAPIを使うだけとなる。
例えば、Search APIを使うときは次のようにリクエストする。

```
$ curl -H 'Authorization: Bearer <ACCESS_TOKEN>' 
'https://api.twitter.com/1.1/search/tweets.json?q=hello'
```

以上、使ってみた記録でした。
Qiitaの記事でページ内リンクを使う

## 1. はじめに

今回はQiitaの記事でページ内リンクを使う方法について説明します。
ページ内リンクとは、その記事ページ内の指定した箇所に遷移（フォーカス）するものです。

* 例）[WindowsにMavenリポジトリのNEXUSサーバを構築する方法](https://qiita.com/5zm/items/6ccaae74511fcc3841e9)

表内の項目がページ内リンクです。Qiitaの記事では右側にリンクメニューが表示されますが、そのメニューと同じリンクになります。
![qiita_link_in_page.jpg](https://qiita-image-store.s3.amazonaws.com/0/195748/ea1037f7-0654-d4af-fabb-ba1aeae0b84b.jpeg)

## 2. ルール

ページ内リンクを利用する際の注意点について以下に示します。

* Qiitaの見出し（`#で始めるヤツ`）にリンクすることができる。
* リンクの書き方は通常のリンク書式`[表示する文言](リンク先のURL)`を使う。
* リンク先のURLは`#見出し名`にする。
 *  見出しの英字は全て小文字にする。
 *  見出しに**`.（ピリオド）`**を含む場合は取り除く。
 *  見出しにスペースを含む場合は**`-（ハイフン）`**に置換する。

## 3. 実装

サンプルとして今回の記事のページ内リンクを作成してみたいと思います。

| 項番 | ページ内リンク |
|:----:|:-------------|
| 1 | [1. はじめに](#1-はじめに) |
| 2 | [2. ルール](#2-ルール) |
| 3 | [3. 実装](#3-実装) |
| 4 | [4. さいごに](#4-さいごに) |

```qiita:この記事のページ内リンク
| 項番 | ページ内リンク |
|:----:|:-------------|
| 1 | [1. はじめに](#1-はじめに) |
| 2 | [2. ルール](#2-ルール) |
| 3 | [3. 実装](#3-実装) |
| 4 | [4. さいごに](#4-さいごに) |
```

## 4. さいごに

今回はQiitaの記事でページ内リンクを使う方法について説明しました。
ちょっと長い記事などでページ内リンクを利用すると、記事内を参照させることができるので読みやすくなるかと思います。ぜひ利用してみてください。
3D空間に辺の長さが1の立方体を追加する (Python for Blender クックブック)

# 一辺の大きさが1の立方体を追加する (Python for Blender クックブック)

Pythonを使ってBlenderでできる事をまとめています。解説もあります。

[はじめに](https://qiita.com/KTakahiro1729/items/5de5f60982af37d23aa0)
[レシピ一覧](https://qiita.com/KTakahiro1729/items/57f4e1f5495c5e54d431)

Pythonの難易度: ★☆☆☆☆

### 動機
普通の立方体追加で追加される立方体は一辺の長さが2です。
スクリプトを使うことで、最初から長さ1の立方体を追加してみましょう。

### 細かい仕様
- オブジェクトモードのとき、一辺の長さが1の立方体を追加してください。
- スケールは1にしてください。
- 3Dカーソルの位置に立方体を追加してください。

## サンプルコード

```python
import bpy
bpy.ops.mesh.primitive_cube_add(radius=0.5)
```

上記サンプルコードを、Blender内蔵のテキストエディタに貼り付けた後、<kbd>Alt</kbd>-<kbd>P</kbd>を実行してください。

## 解説
### `import bpy`
PythonからBlenderを使うには`bpy`というライブラリを使います。
例えば、`bpy.ops`にはBlenderで編集するための関数が入っています。

内蔵Python Consoleで実行するときは既にimportされていますが、テキストエディタや外部ファイルの時は`import`文が必要です。

### `bpy.ops.mesh.primitive_cube_add(radius=0.5)`
まず、<kbd>Shift</kbd>-<kbd>A</kbd>から、立方体を追加してみましょう。（被るので適宜消してください）
次に、infoバーを引き下げると現れるコマンド履歴を見てみてください。

```python
bpy.ops.mesh.primitive_cube_add(radius=1, view_align=False, enter_editmode=False, location=(0, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
```

というコマンドがあると思いますので、コピーしてBlender内蔵のPython Consoleに貼り付けてください。

すると、先ほどと同じ位置に同じ大きさの立方体が追加されました。

今度は、

```python
bpy.ops.mesh.primitive_cube_add(
```

のように、閉じカッコなしで貼り付けたあと、`AutoComplete`を押してください。すると、

```console
>>> bpy.ops.mesh.primitive_cube_add(
primitive_cube_add()
bpy.ops.mesh.primitive_cube_add(radius=1, calc_uvs=False, view_align=False,
enter_editmode=False, location=(0, 0, 0), rotation=(0, 0, 0),
layers=(False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False
))
```

のように、様々な引数とそのデフォルト値が表示されます。

|	引数	|	内容	|	型	|
|	:-:	|	:-:	|	:-:	|
|	radius	|	立方体の大きさ	|	float	|
|	calc_uvs	|	UVを自動生成するか	|	bool	|
|	view_align	|	立方体の配置を視点と合わせるか	|	bool	|
|	enter_editmode	|	追加後、編集モードに切り替えるか	|	bool	|
|	location	|	座標	|	floatのtuple（長さ3）	|
|	rotation	|	回転	|	floatのtuple（長さ3）	|
|	layers	|	どのレイヤーに追加するか（Trueのレイヤーにだけ追加)	|	boolのtuple（長さ20）	|

この中で大きさに関係するのは、`radius`ですが、デフォルト値の1では2倍も大きすぎます。
これを半分にすると、一辺の大きさが1の立方体が追加できます。


```python
bpy.ops.mesh.primitive_cube_add(radius=0.5)
```
はてなブログをカスタマイズしたい！

はてなブログのカスタマイズやノウハウを集めています。

#テーマ編集
[Minimalismテーマカスタマイズ タイトルビッグ、記事文字ちょっと大きく、画面幅ワイド](https://www.shibomb.xyz/entry/2018/10/25/000000)
人気テーマ Minimalism をベースに、カスタマイズをする方法が載っています。

#テクニック
[LazyLoad 2018.10版 画像の遅延読み込みで爆速表示！](https://www.shibomb.xyz/entry/2018/10/24/180000)
LazyLoadを導入して、たくさんの画像を掲載した記事の表示高速化しています。
斉藤一人　俺の人生　すべてが成功する絶対法則

目次
第１章：　あなたは神の道を行ける人です
第２章：　「好き」があなたの道しるべ
第３章：　人生は楽しい学びであふれている！
第４章：　「法則」がわかればうまくいく
第５章：　ズバリ、成功の秘訣を教えます！
第６章：　神様はあなたの笑顔が大好き
特別付録：　みんなが笑顔になれる「一笑百福」カード

#なぜ読むか
斉藤一人さんが、高額納税者＆超ポジティブマンということで、ぜひマインドセットを真似したいと思った。

#要約、筆者の言いたいこと
みんな幸せになろう。人生の方向、今の自分を変えるだけで見える世界が変わるよ

#神に近づけ！
愛をもって、だれにでも接しよう。
悪口や愚痴を言いたくなっても、神からもらった修行だとおもってがんばろう
そして人をゆるし、自分をゆるしましょう

#悩みが多い人へ

##悩みの多い人は目標が近すぎる
もっと遠い目標を持ってその目標に向かっていけばよい

##人生を変えたかったらいままでと違うことをする
愚痴をいってたり、環境のせいにしてたりしても何も変わらない

##思い込みをなくそう
だいたいのことってできるよ

##失敗とは挑戦しないこと
逆にそれ以外は失敗でもなんでもない


#成功のコツ
##自分だけがうまくいくと思って行動すること
そういうやつは神が味方してくれる。自分のためだけじゃなく、世のためになると守護霊が守ってくれる。

##人生にはハズレがなくて、当たりばっかりだと思いこむ
「人生はそんな甘くない」といってるひとは、そういう人生になる

##幸せは楽しいのと一緒
人生はとにかくおもしろくなきゃいけない

##発想の転換
本質思考になる。固く考えない。
うまくいってないことはいいこと、シンプルにやり方を変えれば良いだけ

##与えられた環境でしっかり幸せになる
例えば病気だからって幸せになれないことなんてない。看護師さんを口説きまくってるツワモノもいる。

##幸せになるのに苦労はいらない
難しいことに挑戦することがだんだん楽しくなってくる
- まず本人は苦労だと思ってない
- 神様は笑顔がすき
- 二宮金次郎もあそびまくってた



#アクションプラン
- 「絶対うまくいくよ」を口癖にしてみる
- 楽しいこと、好きなことを意識的に探してみる
- 笑顔になる
GISソフト（QGIS)でGoogle Mapなどの汎用地図をプラグインする方法．

 これまでの記事の続き．

[無料で最新の衛星画像を入手する方法．](https://qiita.com/nigo1973/items/9bb6a11caac8e3e1e850)
[QGISによる衛星画像のカラー画像化.](https://qiita.com/nigo1973/items/d61ef7e0862a6932bbdd)

QGISは便利なソフトですが，このままではただの画像閲覧ソフトにしかなっていません．
他のGIS情報と一緒につかうことで，その効果がわかります．
今回は，使用頻度が高いGoogle Mapなどの汎用地図ソフトのプラグインの方法について紹介します．

##1. QGISのPlugin
QGISの一般的なプラグインの方法として，メニューの”プラグイン”から”プラグインの管理とインストール”を選択し，
検索ウィンドウから拡張するプラグインを検索し，インストールします．
参考；[[QGIS]プラグインを使って動かすまでの手順](https://webbibouroku.com/Blog/Article/qgis3-plugin)

QGISがVersion３になってから，これまで２で使えていたプラグインが選べなくなっています．

例えば，今回のテーマであるGoogle Mapなどの汎用地図ツール，になります．

有名なところで，Openlayersのプラグインです．
参考：　[QGIS#002　背景地図の表示 「OpenLayers Plugin」](https://day-journal.com/memo/qgis-002/)

なにか方法がないかと探してみると，XYZTilesで追加する方法がありました．
この方法について紹介します．

##2. XYZ Tilesによる汎用地図情報の追加方法．
QGISの左のウィンドウにXYZTilesがあります．

![XYZtiles.png](https://qiita-image-store.s3.amazonaws.com/0/187602/f1ab8dbd-f5ec-25b5-54be-8f3574f35194.png)

ここを右クリックし，"新しい接続"を選択します．

![XYZtiles2.png](https://qiita-image-store.s3.amazonaws.com/0/187602/88deaec7-caaa-af40-a786-915b73e1b95d.png)

ここで，名前に任意の対象の名前（ここでは"Google Map Satellite"）を入力し，その下のURLに使用する情報のリンクを入力します．

例えば，Google Mapの衛星画像を使う場合は以下のリンクを入力（コピー＆ペイスト）します．

http://www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}

そして，OKをおすと，XYZTilesにいま選んだ名称のレイヤーが追加されているのが確認できます．
これをダブルクリックすると，左下の選択されたレイヤーにいまのレイヤーが入力されます．

![XYZtitle_google.png](https://qiita-image-store.s3.amazonaws.com/0/187602/8d82ef37-ed35-d12f-f38a-02214851392a.png)


そして，上の画像のように北海道の衛星画像地図が選ばれます．
この方法で，汎用の地図情報を追加することができます．

##3. XYZ Tilesの汎用地図リンク．
よく使うものをいかにリストします．

Google Maps: https://mt1.google.com/vt/lyrs=r&x={x}&y={y}&z={z}
Google Satellite: http://www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}
Google Satellite Hybrid: https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z}
Google Terrain: https://mt1.google.com/vt/lyrs=t&x={x}&y={y}&z={z}
Google Roads: https://mt1.google.com/vt/lyrs=h&x={x}&y={y}&z={z}
国土地理院地図: https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png
OSM(Open Street Map): http://tile.openstreetmap.org/{z}/{x}/{y}.png

２で紹介した方法で，汎用の地図情報を追加できます．

これをつかうことで，入手した衛星画像と汎用の地図画像を重ね合わせることができます．
例えば，今回　ダウロードした厚真町の土砂崩れの衛星画像と，過去の衛星画像を比べることで，
どこで土砂崩れが発生したのか確認することがえきます．
レイヤーの選択は，ひだりしたの”レイヤー”ウィンドウにあるレイヤーをチェックすることで表示され，
またレイヤをドラッグして上下にすることで，レイヤーを重ねる順番を変えることもできます．

色々遊んでて見ください．習うより慣れろ，ですね．

##4. おわりに．
ここまで，最新の衛星画像の入手方法，入手した画像のGISソフトによる閲覧方法，を紹介しました．
次回は，このQGISソフトでどういったことができるのか，プラグインを使って紹介します．
WSLコマンドメモ

# WSL（Windows Subsystem for Linux）のコマンドメモ
※必要になったら随時コマンド追加していくスタイルで更新

### WSL起動

1. コマンドプロンプト立ち上げ:`Win` + `R`キーで「ファイル名を指定して実行」ウィンドウを立ち上げ後名前欄に`cmd`と入力し、`OK`を押す
1. コマンドプロンプトで`wsl`を入力しenter

### WSLコマンド

``` bash
# Cドライブに移動
$ cd /mnt/c

```
Laravelで開発をするためにおさえておきたい便利な情報

Laravel5.7で開発する際に参考にしたサイトや開発中にとったメモをまとめてみました。

#環境構築
[Laravel開発環境 with Laradock on Mac](https://www.shibomb.xyz/entry/2018/10/22/155538)
Laravel開発用のローカルサーバー(Docker)環境を簡単に構築できる手順が載っています。
Mysql8のユーザー認証にも対応しています。

#デバッグ
[Laravelでリクエストとレスポンスのかんたんアクセスログ](https://www.shibomb.xyz/entry/2018/10/28/000000)
Webアクセスのリクエスト、レスポンスを常にログ出力する方法が記載されています。

#その他
[Laravel Voyager 日本語 ja-JP 言語ファイル](https://www.shibomb.xyz/entry/2018/10/20/000000)
需要は少ないかもしれませんが、管理画面を簡単に作成できるVoyagerの日本語言語ファイルがあります。
HTTPのまとめメモ

頭の整理の為のメモ

# HTTPメソッド代表的な５種

|HTTP method| Description  |
|:---:|:-------------------:|
|GET|　URIのデータを取得するメソッド|
|POST|　URIにリソースを追加するメソッド|
|PUT|URIの内容を作成・置換するメソッド|
|DELETE|URIの内容を削除するメソッド|
|OPTIONS|URIに対して利用できるメソッドの一覧を取得するメソッド|

#ステータスコード
|Code|Description|
|:-:|:-----------------:|
|2XX| 成功|
|3XX|リダイレクト|
|4XX|クライアント側のエラー|
|5XX|サーバー側のエラー|
![Web 1920 – 1.png](https://qiita-image-store.s3.amazonaws.com/0/270122/34a228b0-2694-f239-2d98-217879344b84.png)

#HTTPリクエスト
URLを指定してクライアント側からサーバー側へ要求＝リクエストすること通信のこと
#リクエストボディ
必要に応じて補足情報的なのが適当な形式で入っている


#HTTPレスポンス
クライアントから要求されたデータを応答＝レスポンスする通信のこと
#レスポンスボディ
レスポンスのボディはリソースそのものであり、文章や画像データなど様々な形式のデータが入っている
ESLint + Prettierで自動コード整形する方法

ESLintとPrettierを導入します。
ESLintはJavaScriptのための静的解析ツールのことです。
Prettierはコードフォーマッターのことです。
今回は、両方のツールを併用して自動コード整形する方法を紹介します。

## ESLintとPrettierを併用する理由
ESLintもPrettierと同様にコードを整形することができます。
ESLintでもコードを整形できるにもかかわらず、ESlintとPrettierを併用する理由は、Prettierの方がコード整形に優れているためです。ESLintで整形できないコードも整形することが可能。ただし、ESLintのような構文チェックができないため、両方のツールを併用するメリットがあります。

## 導入手順
### ESLintを導入
ESLintを導入します。.eslintrcに自分でルールを書くのは労力がかかるため、スタイルガイドも導入します。ESLintにAirbnbのJavaScriptスタイルガイドを利用します。以下のコマンドでパッケージをインストールします。

```
yarn add -D eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-react eslint-plugin-jsx-a11y
```

```.eslintrc
 {
     "extends": "airbnb",
     "plugins": [
         "react",
         "jsx-a11y",
         "import"
     ]
 }
```

### Prettier 導入
Prettierを導入します。ESLintと併用するために、 eslint-plugin-prettier と eslint-config-prettier というESLintのプラグインを追加します。
`yarn add prettier eslint-config-prettier eslint-plugin-prettier -D`

```.eslintrc
 {
   "extends": [
     ...
     "plugin:prettier/recommended",
     "prettier/react"
   ],
   ...
 }
```

`eslint . --quiet --fix` コマンドを実行することで、ESLint + Prettierで自動コード整形されるようになります。

## 参考
- [アメブロに ESLint + Prettier で自動コード整形を導入した話] (https://developers.cyberagent.co.jp/blog/archives/15068/)
- [2018年のJavaScriptのコードフォーマッター事情 - Qiita](https://qiita.com/shibukawa/items/c2f1bf8e5bb485252402)
char,nchar,vachar,nvarcharの違い


備忘録です。

- char(n)
固定長の文字を扱う。nByteまで文字をつめこめる。
- nchar(m)
固定長の文字を扱う。文字をm個詰め込める。Unicodeに対応。
- varcher(n)
可変長の文字を扱う。nByteまで詰め込める。
- nvarchar(m)
可変長の文字を扱う。文字をm個詰め込める。Unicodeに対応。

#補足
- charおよびncharについて、nおよびmByte以下の場合には末尾に空白が付与される。
- char型の最大Byte数は255Byte。これを超えた分は切り捨てられるので注意。

今後これらを使っていく上で、敢えてchar,varcharを使っていく理由はないのかなと感じました。
char,varcharを使うべきシーンがあれば教えていただけると喜びます。
[Centos7]TimeZone設定を変えたあとはサーバを再起動しよう

次回サーバ設定するときの備忘として残す

## TimeZoneを「Asia/Tokyo」に設定
CentOS7でTimeZone設定を「Asia/Tokyo」に設定した

```bash
$ sudo timedatectl set-timezone Asia/Tokyo
```

cronで1日1,2回動かしたいスクリプトを設定し、
「/var/log/cron」を確認したところ、cronの実行時刻がUTCのままだった

## サーバを再起動
```bash
$ sudo systemctl reboot
```
再起動後「/var/log/cron」を確認したら、JSTで動いてた！

## ちなみに：cronサービスを再起動
```bash
$ sudo systemctl restart crond
```
GCEでCentOSを動かしているのだが、crondの再起動ではUCTのまま動き続けていた
Heroku 体験談

#Heroku体験談
```ruby
$ heroku run bundle exec rake db:migrate
Running bundle exec rake db:migrate on ⬢ guarded-ocean-10560... !
 ▸    ETIMEDOUT: connect ETIMEDOUT 50.19.103.36:5000
```
```ruby:
$ heroku config
=== guarded-ocean-10560 Config Vars
CLEARDB_DATABASE_URL:     mysql://~~~
DATABASE_URL:             mysql2://~~~
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE:  ~~~
```
```ruby:
$ heroku help addons
```
<img width="598" alt="スクリーンショット 2018-10-29 21.42.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/239663/8f0683c3-3672-212f-69e4-51c023ae68d5.png">

```ruby:
$ heroku addons -A
Owning App               Add-on                Plan            Price  State  
───────────────────────  ────────────────────  ──────────────  ─────  ───────
guarded-ocean-~~      cleardb-rugged-~~~    cleardb:ignite  free   created
~~~                   cleardb-closed-~~~    cleardb:ignite  free   created
~~~                   cleardb-pointy-~~~    cleardb:ignite  free   created
```
```
$ heroku apps
=== ~~~@gmail.com Apps
guarded-ocean-10560
~~
```

```ruby:

CLEARDB_DATABASE_URL: = DATABASE_URL: にする
```

```
$ heroku config:set DATABASE_URL=mysql2://~~@~~.cleardb.net/heroku_~~~?~~~~~~=true
```

```ruby:
$ heroku logs --tail
マイグレーションがズラーっと
$ heroku run:detached bundle exec rake db:migrate
Running bundle exec rake db:migrate on ⬢ ~~~~~~~~~~~~... done, run.~~~ (Free)
Run heroku logs --app ~~~~~~~~ --dyno run.2186 to view the output.
いけました
keyはrun:detached
学校のwifiを使っていたのでセキュリティー上跳ね返されちゃってうまくいかなかったぽい。
```
NASMでファイル分割からのHello, World

#環境

- OS : Ubuntu 18.04
- アセンブラ : nasm 2.13.02
- リンカ : ld 2.30

#ソースプログラム
```ruby:main.asm
extern hello
extern end

global _start

[section .text]
_start:
	call hello
	call end
```

```ruby:function.asm
global hello
global end

[section .data]
	string1: db "Hello, World", 0x0a
	length1: equ $ - string1

[section .text]

hello:
	mov rax, 1
	mov rdi, 1
	mov rsi, string1
	mov rdx, length1
	syscall
	ret

end:
	mov rax, 60
	mov rdi, 0
	syscall

```

#コマンド
```nasm -felf64 main.asm -o main.obj```
```nasm -felf64 function.asm -o function.obj```
```ld -o exe main.obj function.obj```
```./exe```

#最後に
記事の最初に書くべきなのでしょうが一応書いておきます。
「実行等は自己責任でお願いします。」
下の書籍は私が読んでいていいなと思ったものです。
ただ、30日でできるOS自作入門は、やっていることはすごいのですが、説明と開発環境がいまいちだと感じました。
あとセンター試験まで少ししかないので発狂しました。
#おすすめの本
[低レベルプログラミング](https://www.amazon.co.jp/%E4%BD%8E%E3%83%AC%E3%83%99%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Igor-Zhirkov/dp/4798155039/ref=sr_1_1?ie=UTF8&qid=1540816833&sr=8-1&keywords=%E4%BD%8E%E3%83%AC%E3%83%99%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
[30日でできるOS自作入門](https://www.amazon.co.jp/30%E6%97%A5%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B-OS%E8%87%AA%E4%BD%9C%E5%85%A5%E9%96%80-%E5%B7%9D%E5%90%88-%E7%A7%80%E5%AE%9F/dp/4839919844/ref=sr_1_1?ie=UTF8&qid=1540816871&sr=8-1&keywords=OS%E8%87%AA%E4%BD%9C)
なんども書いてるAjax送受信の雛形



ただのコピペ、メモとして。
詳細は元記事を。

[以下のコード解説](https://qiita.com/sola-msr/items/3ed0d557c5a63e090c8c) @sola-msr 様感謝

```javascript
{
		var hostUrl= 'https://*****.php';
		//var param1 = 1;
		//var param2 = 10;
		$.ajax({
			url: hostUrl,
			// username: "*****", // Basic認証用ユーザー名
			// password: "*****", // Basic認証用パスワード
			type:'POST',
			dataType: 'json',
			data : {name : "hoge"},
			//data : {parameter1 : param1, parameter2 : param2 },
			timeout:3000,
		}).done(function(data) {
			console.log('Successful communication with API!');
			console.log('ReturnParameter:' + data['name']);
		}).fail(function(XMLHttpRequest, textStatus, errorThrown) {
			console.log('Ajax fail (communication error)');
		})
	}
```


[以下のコード解説](https://qiita.com/sola-msr/items/609677e6e57e7f126487) @sola-msr 様感謝

```php
<?php
/* スタブAPIが受け付けるPOSTパラメーター：name */

// header('Access-Control-Allow-Origin: *'); // どこからでもアクセス許可するならワイルドカード
header('Access-Control-Allow-Origin: https://*******/post.php');
header('Access-Control-Allow-Credentials: true'); // Basic認証やCookieのやり取りする際は必要（ワイルドカード使用すると使えない）
header('Access-Control-Allow-Headers: Content-Type');
header('Content-Type: application/json; charset=utf-8');

date_default_timezone_set('Asia/Tokyo');

if(isset($_POST['name']) === false || $_POST['name'] === '') {
    $_POST['name'] = 'TEST_API';
}

$postName = htmlspecialchars($_POST['name'], ENT_QUOTES);

$array = [
    'name' => $postName . '_RECEIVED', // API側で受け取ったよというマーク的なやつを付加
    'date' => date("Y-m-d H:i:s"),
];

$json = json_encode($array);

/* logをAPI側のサーバーに出力する */
$file = new SplFileObject('log.txt', 'a');
$file->fwrite(
    "【→API】RequestParameter:" . $postName . "'\n【←API】ReturnParameter :" . $json . "\n----------\n"
);

echo $json;
exit;
```
TypeScriptでJavaのStream#peekがしたい

# はじめに

Java8から追加されたStream APIの`peek`をTypeScriptでする場合の実装例です。
C#の拡張メソッドのようにArrayに`peek`というメンバーを追加することで実現していきます。

# 方法

TypeScript1.8から追加された**Global augmentation**を使います。
これをすることで、補完機能や型チェックを効かせながら`peek`を使用できるようにします。

[#global-augmentation Declaration Merging · TypeScript](http://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation)

# 実装例

```ts:ArrayAugmentation.ts
declare global {
  interface Array<T> {
    // JavaのStream#peekを参考に実装
    peek(
      callbackfn: (value: T, index: number, array: T[]) => void,
      thisArg?: any
    ): T[];
  }
}

// プロトタイプ汚染しないように`peek`を拡張。
// コード自体はJavaScriptのときと同じ書き方。
// TypeScriptでもArray.prototype.peek = function...みたいに実装してしまうとプロトタイプ汚染になってしまう。
Object.defineProperties(Array.prototype, {
  peek: {
    value: function(callbackfn) {
      this.forEach(callbackfn);
      return this;
    }
  }
});

// ReadonlyArray<T>やTypedArray（Int8Arrayなど）はArray<T>と継承関係はないため、
// もし、そちらでも使いたい場合は両方ともに実装する必要があります。
// 今回は省略。

// `declare global`を使って拡張する場合は必要となる。
export {};
```

```ts:PeekSample.ts
// peekを実装したモジュールを名前指定せずにimportする。
import "./ArrayAugmentation";

// 以下、peek関数の検証。
// 参考） peekの使い方。
// http://marxsoftware.blogspot.com/2018/06/peeking-inside-java-streams.html

class Person {
  constructor(
    public lastName: string,
    public fistName: string,
    public age: number = 0
  ) {}
}

// ログの出力形式。
const logMessage = function(e: Person): void {
  console.log(`${e.lastName}${e.fistName}、${e.age}歳。`);
};

// 赤の他人２人を初期化
const perfectStrangers = [
  new Person("野原", "ひろし", 27),
  new Person("小山", "みさえ", 21)
];

perfectStrangers
  .peek(logMessage)
  // 1年後
  .peek(e => (e.age += 1)) // 正確には結婚時期は未定。
  .peek(e => (e.lastName = "野原"))
  .peek(logMessage)
  // 2年後
  .peek(e => (e.age += 2))
  .concat(new Person("野原", "しんのすけ"))
  .peek(logMessage)
  // 5年後
  .peek(e => (e.age += 5))
  // シロも追加するべきだがPersonではないため省略。
  .concat(new Person("野原", "ひまわり"))
  .forEach(logMessage);
```

# おわりに
`peek`は`forEach`同様、副作用のある処理を実行することになるので多様は厳禁です。
デバッグ時にログ出力するために使うなど、使用場所は限定しておいた方がいいと思います。

あと、余談ですが、`peek`と聞くと、[java.util.Deque#peek](https://docs.oracle.com/javase/jp/10/docs/api/java/util/Deque.html#peek())かと思ってしまいます。
peekという英単語が「そっとのぞく、ちらっと見る」という意味になるので、確かにどちらも間違いではないですね。

# 参考
[Declaration Merging · TypeScript](http://www.typescriptlang.org/docs/handbook/declaration-merging.html)
[プロトタイプ汚染とループ - latest log](http://uupaa.hatenablog.com/entry/2012/11/07/143947)
[Peeking Inside Java Streams with Stream.peek](http://marxsoftware.blogspot.com/2018/06/peeking-inside-java-streams.html)
[Stream (Java SE 10 & JDK 10 )](https://docs.oracle.com/javase/jp/10/docs/api/java/util/stream/Stream.html#peek(java.util.function.Consumer))
Pythonでソルフェジオ周波数のwavファイルを生成してみる①

#はじめに
##モチベーション
最近、わたし陰謀論にはまっておりまして、つらつらとWEBを見回っていたところ、ある周波数の存在にたどり着きました。

その名はソルフェジオ周波数。

なにやらこの周波数、恐ろしい力を秘めているようで、聞くだけでDNAが修復されたり、トラウマや恐怖からも解放してくれたり、ついにはチャクラもひらくという奇跡の周波数だそうです。（諸説あり）

まじですか！？チャクラ開きたい！！

ということで、

まず検索してみると、どうやら周波数としては528Hzだそうです。しかし、この世の中には全部で9個のソルフェジオ周波数があるそうです。そして、この周波数は中世から受け継がれているグレゴリオ聖歌の音階としても使われているそうです。

ちなみに、いま現在基準として使われている基準周波数A=440Hzは奇跡の周波数に対して悪魔の周波数と呼ばれているそうです。

そして、これを知ったジョンレノンは、意図的にチューニングをずらして528Hzの音をいれた楽曲を作っていたそうです。しかし、それを悪魔は見逃すはずはありませんね。その結果は皆さんもご存じの通りです。ジョンレノンは凶弾に倒れてしまうわけです。（諸説あり）

そんな陰謀論が大好物のわたしの為かは知りませんが、youtubeでもいろいろな動画がアップされています。そして、いくつか聞いてみましたが、確かに落ち着くような気もします。チャクラも開いちゃったかもしれません、すでに。

だがしかし！

うたぐり深いわたしは、これを聞いても本当に528Hzなのかと不安になった訳です。なにしろ敵は恐ろしいやつらですから。（敵ってだれ？）

ということで、「そんなら自分で音を作ればいいじゃないか」となりました。

#作るもの
前置きが長すぎて、あぶなくこれがQiitaの記事だという事を忘れそうになりました。
ここからちゃんと技術的な話になります。

今回作るものはこちらです。
ソルフェジオ周波数の中で一番ポピュラーな528Hzが再生されるwavファイルを生成するプログラム。

※本当はここに出来上がりのファイルをアップしてお聞きいただきたかったのですが、wavは対応していないようなので、各自ご確認をお願い致します。

#使うもの
開発環境：
・AWS cloud9
言語：
・python(2.7.14)
パッケージ：
・numpy(1.15.3)
・scipy(1.1.0)

AWS cloud9はクラウド上で様々言語の開発環境と実行環境がいい感じに構築されてるサービスです。サクッと動くプログラムを試してみたいときにとても便利です。基本わたしの記事はこれを使っています。

pythonは敢て説明するまでもないですよね。今回使用する理由は特にありません。私が使い慣れているからです。

numpyとscipyはpythonで数値解析を行うときに、使うパッケージです。今回は正弦波の生成とwavファイルへの書き出しで使っているだけです。

#やってみた
前置きが長かった割にはやることは単純です。

『シンプルであるってことは、複雑であることより、ずっと難しい』（byスティープジョブズ）

##パッケージのインストール
まずは、使うパッケージをインストールします。pythonではパッケージを使いたいときはインストールが必要です。何をいまさらですが念のため。
pythonのライブラリはpipでインストールするのが良いと思います。

以下のコマンドをターミナルに打ち込んでください。

`$sudo pip install scipy`

これだけで必要なパッケージがあれよあれよとインストールされてしまいます。scipyを入れると自動的にnumpyも入ります。

##コードを書きます
続いてコードを書いていきます。

```python:MakeWav.py
import numpy as np
from scipy.io import wavfile

rate = 44100
frequency = 528
seconds = 3

phases = np.cumsum(2.0 * np.pi * frequency / rate * np.ones(int(rate * seconds)))
wave = np.sin(phases)

wave = (wave * float(2 ** 15 - 1)).astype(np.int16)

wavfile.write("music.wav", rate, wave)
```
これだけです。世の中便利になったものです。

一応、簡単にコードの説明をしていきます。
まずはnumpyとscipyをインポートします。理由は先ほどお伝えしました。

パッケージをインポートした後は変数を定義しています。
rateはwavファイルのサンプリングレートです。frecuencyは周波数、secondsは今回作成する音の長さです。

その後にnumpyのcumsum()とsin()を使って1から-1の正弦波を作成し、続いて16bitに変換します。最後にwavファイルとして保存します。

##聞いてみる
では早速実行してみます。と言ってもファイルが出来上がるだけですけど。

ターミナルに以下のコマンドを打ち込みます。
`$python MakeWav.py`

無事実行されてmusic.wavがディレクトリに出来上がれば成功です。

適当にローカルなどにダウンロードして再生してみましょう。
プーというテレビの試験放送みたいな音がなれば成功です。

いかがですか、チャクラ開きましたか？

#終わりに
今回はチャクラを開いて第３世界に行くために、ソルフェジオ周波数のwavファイルを生成するプログラムを作ってみました。前置きが長かった割にはプログラミングは９行で終わりましたが、これを応用すれば、様々な音も創り出せますし、もしかしてAIで音楽も作り出すみたいなこともできるかもしれません。

次回は、その他の周波数の音を作って、倍音を追加したり和音にしたりもう少し、いい感じに仕上げていきましょう。

続きはこちら
[Pythonでソルフェジオ周波数のwavファイルを生成してみる②]
(https://qiita.com/ympnov22/items/135d36aace176adc5a3d)
【TIC-80】 4tile to 2x2 simple Auto tile

![4タイルスプライトエディタ.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/4f536869-e9be-6ee6-7d2c-dcb4a4b71810.gif)
![qiita.gif](https://qiita-image-store.s3.amazonaws.com/0/284455/dc023675-739c-eb69-9907-4e5410866fa8.gif)

```4tile2x2auto.lua
-- title:  auto2x2tile
-- author: uokagi
-- desc:   4tiles to 2x2 simple auto tile
-- script: lua

W,H=240,136
U,D,L,R,LU,RU,LD,RD=1,2,3,4,5,6,7,8
AT={[0]={U,L,LU},{U,R,RU},{D,L,LD},{D,R,RD}}
OF={{{0,3},{1,1}},{{1,1},{2,2}}}
FN={[0]=1,0,3,2}

-- my function
rm2x2tile=function(t,x,y)
	if t==0 then return 0 end
	local fU=(t==mget(x%W,(y-2)%H))and 1 or 2
	local fD=(t==mget(x%W,(y+2)%H))and 1 or 2
	local fL=(t==mget((x-2)%W,y%H))and 1 or 2
	local fR=(t==mget((x+2)%W,y%H))and 1 or 2
	local fLU=(t==mget((x-2)%W,(y-2)%H))and 1 or 2
	local fRU=(t==mget((x+2)%W,(y-2)%H))and 1 or 2
	local fLD=(t==mget((x-2)%W,(y+2)%H))and 1 or 2
	local fRD=(t==mget((x+2)%W,(y+2)%H))and 1 or 2
	local an=x%2+y%2*2
	local fl={fU,fD,fL,fR,fLU,fRU,fLD,fRD}
	local vn,hn,sn=AT[an][1],AT[an][2],AT[an][3]
	local oid=OF[fl[vn]][fl[hn]][fl[sn]]
	if fl[vn]==2 and fl[hn]==1 then
		return t+oid*16,FN[an],1 end
	return t+oid*16,an end

testinit=function()
	chipset={0,1,2,3,4}
	i=1
end

testinit()
function TIC()
	cls(13)
	map(0,0,30,17,0,0,12,1,rm2x2tile)
	if btnp(4,1,20) then i=i%#chipset+1 end
	x,y,p=mouse()
	spr(256,x-x%16,y-y%16,0,2)
	idx=chipset[i]
	for j=0,3 do
		spr(idx+32,208+j%2*8,8+j//2*8,12,1,j)
	end	
	spr(257,208-4,8-4,12,3)
	if p then
		for j=0,3 do
			mset(x//16*2+j%2,y//16*2+j//2,idx) end end
	if btnp(5,1,20) then sync(0,0,true)end
end
```

前の8x8の簡易オートタイルのgif動画をtwitterで上げたら、外国の方から
「いいね」をもらってビビってます

---

TIC-80 は 8x8ドットのタイル単位で表示します。
remap はタイルIDの他に、flip（反転）、rotate（回転）も指定できます。

よって上下左右対称なら、

1. 境界なし
2. 一方向境界
3. 二方向境界
4. 斜めのみ境界

の4種類のタイルを用意しておけば、後は反転と回転で
16x16のシンプルなオートタイルなら実現が可能です。
タイルを組み合わせて保持しておく必要もないので
タイル領域の節約にもなります。

ただ、remap用の関数に割当てられるメモリが小さい（？）のか、
だらだら書いていたら正常に動作しなくなりました。
（ローカル変数の種類を減らしたら動くようになったり？）


対称ではないものは4x5の20必要だけど、これくらいなら大丈夫かなー、今度また作ってみよう。
いまさらですが　JavascriptでMath.random()



##動作確認環境
Chrome　バージョン70.0.3538.67

##Math.random()
Javascriptでランダムな値を得たい場合、`Math.random()`を使うことができます。
`Math.random()`は0以上、1未満の値を返します。

```
console.log(Math.random());
// 0.8369887702642478
// 0以上、1未満
```

この値を用いて計算処理をすることで、用途に合わせた数値を得ることができます。


###0以上10未満の数値の中から1つ数値を選ぶ
```
var num = Math.floor(Math.random() * 10);
console.log(num);
// 0~9の数値の中のどれか
```
`Math.random()`の結果に数値を掛け合わせ、`Math.floor()`で小数点以下を切り捨てることで目的の数値を得ることができます。
`Math.random()`が0以上、1未満の数値を返すため(1は返らない)、10をかけても10になることはありません。
そのため、10を含んだ数値の中から値を得たいときは`11`をかける必要があります。(次の例)

###0以上10以下の数値の中から1つ数値を選ぶ
```
var num = Math.floor(Math.random() * 11);
console.log(num);
// 0~10の数値の中のどれか
```

###1以上10以下の数値の中から1つ数値を選ぶ
```
var num = 1 + Math.floor(Math.random() * 10);
console.log(num);
// 1~10の数値の中のどれか
```
`Math.floor(Math.random() * 10)`によって0~9の値が返るため、1を足すことで1~10の間のどれかになります。
[SIGNATE]画像で遊んでみる(土砂崩れを探せ)　その２

[前回](https://qiita.com/ryo_naka/items/6580d8048d41dfd5b2c9)はあまりにさっぱりだったので別の方法を試してみる。


# Deep Learningを試してみる

scikit-learnでDeep Learningもできそうということで入れてみることにする

https://qiita.com/ToshikiShimizu/items/3c0b8713a26ee10b689e
https://algorithm.joho.info/machine-learning/python-scikit-learn-neural-network-iris/


ついでに画像についても正規化してから差分をとるようにしてみる。
MLPについてはとりあえずデフォルトのまま試す。

### 正規化
	np_feature = np_feature.astype(np.float64)
	np_feature =np_feature / np_feature.max()
※これで合っているのかどうかわからんので適当な実装。


### MLP
	# デフォルトで実施してみる
	model_MLP = MLPClassifier()
	model_MLP.fit(predictor_var, response_var)
※ハイパーパラメータを設定したいのだがいっぱいあってもわからんすぎる。
https://spjai.com/neural-network-parameter/

### 実施結果
とりあえずやってみたら、ALL 0ではない結果に。
ということで、これも投稿してみる。

<img width="194" alt="2018-10-27_19h26_25.png" src="https://qiita-image-store.s3.amazonaws.com/0/106639/2af33c14-56e8-8f9e-5852-1f5abcde6246.png">

0じゃなかった！
しかし0じゃないだけでほぼビリみたいなものだ。

# OpenCVを使って水増しさせてみる。
## インストール
https://qiita.com/cointoss1973/items/92d82f9accb239a276a0

## 回転/反転
https://qiita.com/jun1_0803/items/533cc8db31c66520a450

    feature = data.imread(file)
    feature = cv2.flip(feature, flip_no)

回転についてはコードを書くのがめんどくさかったのでRalphaで加工
https://forest.watch.impress.co.jp/library/software/ralpha/download_11000.html

で、この水増し。全体を増やすのではなく、Positiveのデータに対してだけ実施。
というのもふとPosiとNegaの件数の差が大きすぎるせいなのでは？という思い立ったから。

## 実施結果
<img width="231" alt="2018-10-29_20h47_36.png" src="https://qiita-image-store.s3.amazonaws.com/0/106639/c5a85de2-0b19-53e0-d81f-a7cf69c61763.png">

だいぶ増えた。
水増し案は割とありなのかもしれない。
もう少し何かしらで増やして、PosiとNegaの比を半々に近づけたい。
※回転、反転でようやく24480枚。negativeと比較してやっとこ1割といったところ。

ひょっとすると、LANDSATのデータを白黒にすればTrainとして使えたりするのかな？
AWS EC2上に自分専用のWebHookスタブサーバーを構築する

# 背景

コールバック付きのWeb APIを開発していると、コールバックURLの呼び出しが上手くできているか確認するために、受信したHTTPリクエストを表示するスタブHTTPサーバーが欲しくなります。
この用途に最適な[Webhook Tester](https://webhook.site)という便利なサイトを公開されています。
しかし、多くのリクエストを送るとレスポンスが安定しなくなり、エラーレスポンスが混ざることがあります。また他のユーザーが負荷を掛けているときも同様の現象が起きます。
そこで、自分専用のWebhook Testerインスタンスが欲しくなります。

# 提案手法

AWS EC2のインスタンスを使って、自分専用のWebhook Testerを構築します。
Webhook Testerは[Dockerイメージ](https://hub.docker.com/r/dahyphenn/webhook.site/)を公開しています。
これを使うことで構築手順が簡単になります。

## 前提条件
AWSアカウントの作成方法、EC2インスタンスの作成方法は割愛します。
ググってください。

インスタンスは`t3.nano`で十分動作します。無料枠が利用できる場合は、`t2.micro`を使っても良いと思います。
AMIは`Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-04d3eb2e1993f679b`を使いました。Amazon Linux 2の最新版であれば同様の手順で構築可能です。

## 手順

EC2インスタンス作って、sshログインします。
次のコマンドのを実行します。

```sh
sudo yum update -y
sudo yum install -y docker
sudo service docker start
sudo docker run -it --rm --init -p 80:80 --name webhook_site dahyphenn/webhook.site
```

## 動作確認

ブラウザでEC2インスタンスの`IPv4 Public IP`を開き、次のような画面が表示されていれば成功です。

<img width="980" alt="スクリーンショット 2018-10-29 20.58.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/15964/5a4fdfcc-f5ae-6994-72e8-983dcbe85c00.png">
git clone した Lem を実行する

### git clone した Lem を実行する方法

以下のコマンドで GitHub から Lem を `git clone` して、実行することができます。

````lisp
$ git clone https://github.com/cxxxr/lem.git
$ cd lem
$ ros run -e '(setf ql:*local-project-directories* (list #p"."))(ql:quickload :lem-ncurses)(lem:lem)(quit)'
```` 

初回の実行時はコンパイルが行われるため、起動に少し時間がかかります。
コンパイルされたプログラムは `~/.cache/common-lisp` にキャッシュされるため、次回の起動時からは比較的早く立ち上がります。

Lem のソースコードを編集して起動し直すと、自動で再コンパイルが実行されます。

Lem 自身のソースコードを弄りたい場合に、Roswell でインストールした Lem とは別に、git でクローンした開発用の Lem を保持することができるので便利です。

### 参考
- [The Quicklisp local-projects mechanism](http://blog.quicklisp.org/2018/01/the-quicklisp-local-projects-mechanism.html)
Custom App Development: How does it reap multiple benefits for businesses

Mobile has conquered the world with 1% quotient and zero as the reminder. The businesses are living and breathing in the mobile space. Even the start-ups, operating under the rock are not spared from its influence. If the budget becomes an issue, the businesses opt for the off-the-shelf mobile software to ensure they are not lagging behind.

It’s a good alternative for enterprises as it does not cost much. However, in the long run, it is not a viable option as no one-size-fits-all solution can cater to and satisfy the various types of business needs and serve the prospects in a unique manner. In the end, it impacts the business throughput and the bottom line.

So, the app must be tailored to win the attention of the target audience, which has given birth to the custom app development. This is a development approach where a new software is engineered that meets various business-specific demands. It’s the reason why choosing the custom app development for the business has become a hot trend that’s expectedly growing ceaselessly.

The custom solutions are pertinent to the businesses to perform at the peak exceptionally and the recent trends are promising the same if believed. Know in details.. https://www.prismetric.com/custom-app-development-how-does-it-reap-multiple-benefits-for-businesses/
McAfeeのせいで react nativeがbuild出来ない　解決メモ

McAfeeがReactNativeのデバッグ実行で使用する　PORT８０８１を占有しちゃうため、
それを回避してバンドルを置いておかないといけないみたい。

まかふぃーを殺すのもいいけど、以下で解決しました。

#参考文献

https://facebook.github.io/react-native/docs/troubleshooting
https://github.com/facebook/react-native/issues/10715

#iOS

> /node_modules/react-native/local-cli/server/server.js

`default: process.env.RCT_METRO_PORT || 8081, `
ここの8081のポート番号を、任意の番号に変更する

> /node_modules/react-native/React/React.xcodeproj/project.pbxproj

8081を検索し、ポート番号にかかわる部分をすべて変更する。

> ios/main.jsbundle

に書かれているlocalhost:8081を 変更

□xnodeで、info.plist > Allow Arbitrary Loads : YES
（なぜかcocoapodsのエラーでビルドできないので、iosのプロジェクトファイルがあるところで、
　pod installする。）

> ios/Project内 AppDelegate.m

jscode位置を以下のように変更
(元の記述は残しておいてコメントアウトとかが良いかも）

`jsCodeLocation = [NSURL URLWithString:@"http://192.168.2.100:8088/index.bundle?platform=ios&dev=true"];`


#android

androidは、buildした後に、
`$ adb reverse tcp:8081 tcp:8088`
 を実行
SECCON 2018 Writesup

日本のCTFとしておなじみになったSECCONのオンライン予選に参加してきたので、WritesUpを記載します

[SECCON](https://2018.seccon.jp/)

#Unzip
ファイルをダウンロード。fileコマンドで確認するとzipなので解凍する。解凍後、更にzipファイルとスクリプトファイルが出てくる。

zipファイルはパスワードが付けられているのでスクリプトファイルを確認すると、
・中にあるテキストファイルはflag.txtの中身を読んだもの
・スクリプト実行時の時間をパスワードとして、zipファイルを作成する

zipファイルの更新日時を確認すると2018年10月27日　0:10:41なので、その時間帯にzipファイルが作成されたとして、パスワードは上記であると想定する。
該当時間帯を[UnixTimeに変換](https://tool.konisimple.net/date/unixtime)してパスワードとして入力すると、flag.txtが出てくる。

**FLAG**
SECCON{We1c0me_2_SECCONCTF2o18}


#感想
今年はこれしか解けなかったので精進しなければと感じた。特にPwn、Web、Reverse辺りを勉強しないと話にならないが、正直今の業務と全然内容が異なるので、付き合い方を考えた方が良いかもしれない。
CentOS7でsshのポートを変更する

## sshdでポート番号を変更
デフォルト設定がコメントアウトされているので、コメントアウト解除し、ポートを変更する
`sudo vi /etc/ssh/sshd_config`
> \#port 22
port 2222

再起動する
` sudo service sshd restart`


## firewalldでsshのポートを開放する
デフォルトのssh用設定が存在するので*/etc/firewalld/services*にコピーしてポートを変更する
`sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml`
`sudo vi /etc/firewalld/services/ssh.xml`
> <?xml version="1.0" encoding="utf-8"?>  
\<service>
  \<short>SSH\</short>
  \<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.\</description>
  \<port protocol="tcp" port="2222"/>
\</service>

リロードする
*/etc/firewalld/services*以下の変更済みファイルが読み込まれ、設定が反映される
`sudo firewall-cmd --reload`

## 参考
CentOS7のfirewalldでsshのポート番号を変更する方法
https://qiita.com/DQNEO/items/5780d81b2e0af4cc1544
【GAS】GoogleスプレッドシートのデータをGoogleドキュメント化する

## やりたいこと

あるサービスで自動配信しているメールの

- タイトル
- 本文

をGoogleドキュメント化したい。
いちいちドライブ上でドキュメントを作成して、コピペして...ってのはだるいし、
今後もメールは増えていく予定なのでGASを使って楽に作れるようにしよう。

## スプレッドシートを用意する

![Screen Shot 2018-10-29 at 19.14.42.png](https://qiita-image-store.s3.amazonaws.com/0/109241/a50eacf3-702e-41f6-c019-758507566dce.png)

## スクリプトエディタにコードを書く

スプレッドシートのツールから「スクリプトエディタ」を選択して、

![Screen Shot 2018-10-29 at 19.23.35.png](https://qiita-image-store.s3.amazonaws.com/0/109241/e4706437-697f-45ec-c02e-27af5b6e351a.png)

以下のコードを書く。

```js
function makeDocuments() {
  //スプレッドシート、シート、行数を取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var count = sheet.getLastRow();
    
  //項目タイトルを覗く2行目~最終行について、ドキュメントを作成する
  for(i = 2; i <= count; i++){
    //タイトル、本文を取得
    var title = sheet.getRange("A"+i).getValue();
    var body   = sheet.getRange("B"+i).getValue();
        
    //ドキュメントを作成
    var document = DocumentApp.create(title);
    //本文を書き込む
    document.getBody().setText(body);
    
    //ドキュメントを格納するフォルダを取得（指定しない場合はマイドライブ直下に作成される）
    var targetFolder = DriveApp.getFolderById("[フォルダのid]");
    
    //指定したフォルダに所属（移動）させる
    var docFile = DriveApp.getFileById(document.getId());
    targetFolder.addFile(docFile);
  }
}
```

### フォルダのid
URLの一番最後の部分です
`https://drive.google.com/drive/folders/[フォルダのid]`

## スクリプトの実行
![Screen Shot 2018-10-29 at 19.32.28.png](https://qiita-image-store.s3.amazonaws.com/0/109241/a0fdfeb5-3c5a-60a6-8569-1fba1afd398d.png)

▶︎ を押して実行すると

![Screen Shot 2018-10-29 at 19.38.41.png](https://qiita-image-store.s3.amazonaws.com/0/109241/bcb0722e-817e-a20d-b363-9186348366fd.png)

![Screen Shot 2018-10-29 at 19.39.36.png](https://qiita-image-store.s3.amazonaws.com/0/109241/f2e130b4-cc67-16a9-692b-697f624e1512.png)

できた。

## その他もろもろ

### トリガーの設定
編集 > 現在のプロジェクトのトリガー（すべてのトリガーでもよいらしい）

### デバッグしたいときは...
▶︎ の右横の虫ボタンをクリック

### ログ出力
こちらの記事をご参照ください
https://qiita.com/chihiro/items/09c996d41d80f0d30e17

## 参考記事
http://tech.innovation.co.jp/2018/05/02/create-Google-Document-From-Spreadsheet.html
JavaScript:末尾再帰が何となくわかったかも

何となくもやもやしてたので。

# 階乗を例に：

末尾再帰じゃないやつ

```js:
const fact = x => 
  (x==0)? 1
  : x * fact(x - 1);
```
末尾再帰したやつ

```js:
const fact = (x, acc = 1) => 
  (x==0)? acc
  : fact(x - 1, x * acc);
```
ああわかった。
末尾再帰じゃないやつは次回の引数で再帰的に自分を呼んでいる。
末尾再帰は次回の引数と今回のとりあえずの結果を次回に送っている。

3の階乗で流れを追ってみます。

```
//末尾再帰じゃない版
fact(3)
3*fact(2)
3*(2*fact(1))
3*(2*(1*fact(0)))
3*(2*(1*1))
3*(2*1)
3*2
6

//末尾再帰版
fact(3) // fact(3, 1)と同じ
fact(2, 3*1)
fact(1, 2*3)
fact(0, 1*6)
6
```
厳密なものではないですが、末尾再帰じゃないほうは手順が多くなるし、数値が出揃ってから計算するのでメモリーが沢山必要ってのがわかる。
WebSphere Libertyのコンテナ別フィーチャー比較

# 目的

WebSphere LibertyのコンテナイメージがDockerHubで公開されていますが、いくつかバリエーションがあります。その中でも主要な**javaee8**,**webProfile8**,**microProfile2**の3つについてDockerfileからフィーチャーの違いを抜き出してみました。

バージョンは18.0.0.3を使用しています。

> https://hub.docker.com/_/websphere-liberty/

# フィーチャー比較

|javaee8|webProfile8|microProfile2|
|---|---|---|
|appSecurity-2.0|appSecurity-2.0|appSecurity-2.0|
|ldapRegistry-3.0|ldapRegistry-3.0|ldapRegistry-3.0|
|localConnector-1.0|localConnector-1.0|localConnector-1.0|
|monitor-1.0|monitor-1.0|monitor-1.0|
|requestTiming-1.0|requestTiming-1.0|requestTiming-1.0|
|restConnector-2.0|restConnector-2.0|restConnector-2.0|
|sessionCache-1.0|sessionCache-1.0|sessionCache-1.0|
|sessionDatabase-1.0|sessionDatabase-1.0|sessionDatabase-1.0|
|ssl-1.0|ssl-1.0|ssl-1.0|
|transportSecurity-1.0|transportSecurity-1.0|transportSecurity-1.0|
|webCache-1.0|webCache-1.0|webCache-1.0|
|webProfile-8.0|webProfile-8.0|webProfile-8.0|
|appSecurityClient-1.0||microProfile-2.0|
|javaee-8.0|||
|javaeeClient-8.0|||

3者の違いは最後の3行だけということがわかりました。microProfile2の方がwebProfile8よりフィーチャーが多いです、意外です。
[python] datetime.time型で時間の足し引き

# 概要（というか経緯）

時刻の足し引きにはdatetime.timedeltaを使うようですが、
datetime.time型とdatetime.timedelta型を+,-でつないだところ以下のエラーになってしまったので、
対処を調べました。

```
TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.timedelta'
```

## エラーの原因と対処
pythonのdatetimeには、日付を表すdate型と時刻を表すtime型、両方を表すdatetime型がある。
timedeltaはdatetime型を元に計算するので、date型、time型はまずdatetime型への変換が必要
変換にはclassmethod datetime.combine()を使う。

## 時刻の足し算引き算をするコード
```python
import datetime

basetime = datetime.time(23, 59, 00)

# 23時59分の一分後
dt1 = datetime.datetime.combine(datetime.date.today(), basetime) + datetime.timedelta(minutes=1)
# 23時59分の1秒前 
dt2 = datetime.datetime.combine(datetime.date.today(), basetime) - datetime.timedelta(seconds=1)

print(dt1.strftime("%H:%M:%S"))
print(dt2.strftime("%H:%M:%S"))
```

※コードの中では仮の日付としてdatetime.date.today()を利用していますが、**うるう秒**の入る日にどうなるかわからないので、適当な日付にしたほうが良いです。

### output

```
00:00:00
23:58:59
```
C++ Builder XE4 > SimpleRoundTo() > XE4: DateUtils.hppインクルードでエラーが出ない |  10.2 Tokyo: 明示的なSystem.Math.hppインクルードが必要

```txt:動作環境
C++ Builder XE4
```

### SimpleRoundTo()

http://docwiki.embarcadero.com/Libraries/XE4/ja/System.Math.SimpleRoundTo

System.Math.hpp
をインクルードすることで使えるSimpleRoundTo()

### XE4: DateUtils.hppインクルードでエラーが出ない

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	int val = SimpleRoundTo(1.5);
}
//---------------------------------------------------------------------------
```

上記のように「System.Math.hpp」ではなく「DateUtils.hpp」インクルードにてXE4ではエラーが出ていなかった。

System.DateUtils.hppに以下がある。

```delphi
#include <System.Math.hpp>	// Pascal unit
```

### 10.2 Tokyo: 明示的なSystem.Math.hppインクルードが必要

10.2 Tokyoでは同じコードはエラーになるようだ。

確認したところ、System.DateUtils.hppにはSystem.Math.hppのインクルード行はなくなっている。

System.Math.hppを明示的にインクルードしないといけない。
(本来、関数を使う時点でインクルードをすべきであったが、XE4ではエラーが出なかったこともあり、明示的にインクルードをしていなかった）
JenkinsfileのPipelineで任意のDockerイメージでビルドを行う

Jenkins の Declarative Pipeline を使って任意のDockerイメージを利用したビルドを行うための設定のメモです。

Jenkins の実行環境は以下です。

```
Linux version 4.4.0-134-generic (buildd@lgw01-amd64-033) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) ) #160-Ubuntu SMP Wed Aug 15 14:58:00 UTC 2018

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.5 LTS
Release:        16.04
Codename:       xenial
```

agent で Docker のイメージを指定できるようなので以下のような Jenkinsfile を用意してビルドしました。

```groovy
pipeline {
    agent { docker 'node:8.12.0-jessie' }
    stages {
        stage('build') {
            steps {
                sh 'npm --version'
            }
        }
    }
}
```

すると以下のようなエラーが出ました。
もちろんですが Docker が必要なのでインストールして動作するまでのメモです。

```
/var/lib/jenkins/workspace/ractive_jenkins-test_...略.../script.sh: docker: not found
```

## Docker のインストール

以下を参考に Docker をインストールします。

<https://docs.docker.com/install/linux/docker-ce/ubuntu/>

```sh
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce
```

docker がインストールできました。
だたこのままだと sudo を毎回付けないといけないので jenkins ユーザーへ権限を付与します。

<https://docs.docker.com/install/linux/linux-postinstall/>

インストール時に作られる docker グループに権限が振られているようなので、以下のコマンドで付与するユーザーを docker グループへ追加します。

```sh
sudo usermod -aG docker jenkins
```

追加できたので適当に以下を実行してエラーが返ってこなければ問題ないと思います。

```sh

sudo -u jenkins docker ps
```

再起動します。

```
sudo service jenkins restart
```

ちなみに再起動せずにここでビルドしてみると以下のエラーが出ました。

```
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
```

## 実行結果

`npm --version` `node -v` `ls` `pwd` `uname -a` を実行して結果を見ました。
ホストには node v10.12.0 が入っているので node のバージョンがちゃんと変わっているのが確認できます。

```
+ node -v
v8.12.0

+ npm --version
6.4.1

+ ls
Jenkinsfile
README.md

+ pwd
/var/lib/jenkins/workspace/ractive_jenkins-test_master-O5GQEJQUAJS4MRYSEHJYLHNLOQRNHDZT7ZZSUG2O4HABE3GEJGWQ

+ uname -a
Linux 04b08571f26c 4.4.0-134-generic #160-Ubuntu SMP Wed Aug 15 14:58:00 UTC 2018 x86_64 GNU/Linux
```
GloVeを学習する

# はじめに

[GloVe](https://nlp.stanford.edu/projects/glove/)はStanfordによる単語分散表現の教師なし学習手法です。詳細は省きますが、Stanford版のword2vecと考えれば、使用シーン的には問題ないでしょう（単語のちかさをとる、深層学習の埋め込み表現の初期値にする）。word2vecよりも学習が遅いだとか、代わりに精度が高いだとか言われることもありますが、タスクによりけりというのが実際のところのように感じます。

word2vecの学習しょっちゅうやるのですが、はじめてGloVeの学習をしたので備忘録として記載します。

# やったこと

## 準備

特に私の環境では追加インストールは必要ありませんでした。適当なCコンパイラだけ入ってればいいんじゃないかな。

```bash
git clone http://github.com/stanfordnlp/glove
cd glove
```

## データの準備

データはword2vecの学習などと同じ、単語がスペース区切りされたファイルを用意します。異なる文書は改行で表現します。改行がある場合は、改行をまたいでウィンドウを設置したりはしないようなので、同じ文書のだったら1つの行にまとめてしまったほうが良いかもしれません。

下記はDBPediaデータセットむけにデータを作った例。

```bash
wget https://github.com/le-scientifique/torchDatasets/raw/master/dbpedia_csv.tar.gz
tar -xf dbpedia_csv.tar.gz
cat dbpedia_csv/train.csv| sed 's/\(^[0-9]*,"[^"]*"," *\)\|\("$\)//g' > dbpedia.txt
```

## スクリプトの書き換え

GloVeを学習するためには複数のプログラムを実行する必要がありますが、GloVeレポジトリには一連の流れを記載したデモスクリプトが用意されています。使用データがベタ打ちされているので、上記で作ったデータを指すように修正します。

```diff
 make
-if [ ! -e text8 ]; then
-  if hash wget 2>/dev/null; then
-    wget http://mattmahoney.net/dc/text8.zip
-  else
-    curl -O http://mattmahoney.net/dc/text8.zip
-  fi
-  unzip text8.zip
-  rm text8.zip
-fi
 
-CORPUS=text8
+
+CORPUS=dbpedia.txt
 VOCAB_FILE=vocab.txt
```

## 学習の実行

`./demo.sh` を実行すると、自動的にMakeして学習を走らせてくれます。デフォルトの設定は1時間くらいで終わりました。