OmniAICreator/Qiita-1.07M huggingface dataset:
node.jsでIncoming-webhookでslackメッセージ送る


node.jsからslackのメッセージを送りたい場合のメモ。

## WebHookの設定

[ここ](https://bluecode-jp.slack.com/apps/new/A0F7XDUAZ-incoming-webhooks)からチャネルなどを選びcURLとかでテストしておく。

>別にテストは必須ではない。

## 実装

AWSのLambdaで利用するつもりなので追加モジュールは利用しない。[こちら](https://utano.jp/entry/2018/02/js-lib-slack/)を参考にさせていただきました。
とりあえず下記の感じで動きます。

```js:index.js
const https = require('https');

//メッセージ設定
var data = JSON.stringify({"username":"node_bot","text": "こんばんわ","icon_emoji":":ghost:"});

//オプション情報設定
var  options = {
    hostname: 'hooks.slack.com',
    port: 443,
    path: '/services/AAAAAAAA/BBBBBBBB/CCCCCCCCCCCCCCC',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': Buffer.byteLength(data)
    }
};

//リクエスト
var req = https.request(options, (res) =>{
    if(res.statusCode===200){
        console.log("OK:"+res.statusCode);
    }else{
        console.log("Status Error:"+res.statusCode);
    }
});

//そもそもなエラー時
req.on('error',(e)=>{
    console.error(e);
});

//データ送信
req.write(data);
//終わり
req.end();
```

簡単ではありますが、以上です。
MACでrbenv入れようと思ったらいろいろ大変になっていた件について

久しぶりにrbenvでruby入れようと思ったらerrorがでた

```
checking if gmake is GNU make... ./configure: line 23192: gmake: command not found
```

gmakeがないだと、、

``` .bash_profile
ln -s /usr/bin/make /usr/bin/gmake
```
入ってるやん。。これは

```
ln -s /usr/bin/make /usr/bin/gmake
Operation not permitted
```
＃OS X 10.11 El Capitanより追加されたセキュリティ機能、SIP（System Integrity Protection）によって以下の領域がガードされています。
クッソ害悪w
bin.sbin.System以下は変更できないのね

把握した


1.Macを一度シャットダウンします。
2.立ち上げる時に、command + R を押し続けてマークが表示されたら離します。
3.しばらくするとリカバリーモードが起動します。
4.リカバリーモードになったら、「主に日本語を使用する」を選択して、次にいきます。
5.```$ csrutil status```
6 ```$ reboot ```
7 再ログイン
8 ```
$ csrutil status
System Integrity Protection status: disabled.
```
9 ```ln -s /usr/bin/make /usr/bin/gmake```

10 ```
$ ls -ltr /usr/bin/gmake
lrwxr-xr-x  1 root  wheel  13  5  7 16:38 /usr/bin/gmake -> /usr/bin/make
```

1年開発離れると環境も変わるのな
BrowserSyncでGZip対応

[BrowserSync](https://browsersync.io/)で、GZipファイル（圧縮済みファイル）を読み込む方法。
Content-EncodingとContent-Typeの設定を、middlewareオプションでします。

今回はGulpを通したんで、gulp.taskでの記述です。
ポイントは`middleware`の記述のところなので、gulpであろうとなかろうと、あまり関係ないと思いますが一応。

```javascript

const gulp = require('gulp');
const browserSync = require('browser-sync');

gulp.task('server', function() {
    return browserSync.init({
        server: {
            baseDir: './',
            middleware(req, res, next) {
                let url = req.url;

                // リクエストURLに.jz.gzが含まれる場合
                if (url.indexOf('.js.gz') > -1) {
                    res.setHeader('Content-Encoding', 'gzip');
                    res.setHeader('Content-Type', 'text/javascript');
                // リクエストURLに.css.gzが含まれる場合
                } else if (url.indexOf('.css.gz') > -1) {
                    res.setHeader('Content-Encoding', 'gzip');
                    res.setHeader('Content-Type', 'text/css');
                // リクエストURLに.html.gzが含まれる場合
                } else if (url.indexOf('.html.gz') > -1) {
                    res.setHeader('Content-Encoding', 'gzip');
                    res.setHeader('Content-Type', 'text/html');
                }

                next();
            }
        }
    });
});
```

Grunt版はこちら：[grunt-contrib-connectでGZip対応](https://qiita.com/kokoe/items/18d66458f5b2e2dcff08)

参考：https://stackoverflow.com/questions/30375699/use-gzip-file-locally
エックスサーバーにWP-CLIをインストール


### WP-CLIのインストール

置換はWP-CLIで行う

エックスサーバーでSSHの接続設定がしていない場合は設定する

```
$ cd ~
$ mkdir bin
$ cd bin
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x wp-cli.phar
```

ちゃんとインストールされたか確認

```
$ wp-cli.phar --info
```


wp コマンドが使えるように `wp` にエイリアスを張る

```
$ echo 'alias wp="~/bin/wp-cli.phar"' >> ~/.bashrc
# 環境によっては上記でなく下記
$ echo 'alias wp="/opt/php-7.1.2/bin/php ~/bin/wp-cli.phar"' >> ~/.bashrc
$ source ~/.bashrc
```


## 参考文献

https://qiita.com/kkotaro0111/items/26221712625e79c3ba8d
https://qiita.com/youcune/items/5803344dcf06b234c31b
ESLint&mochaで’describe’ is not definedと言われないために

ESLintで静的解析しているプロジェクトにmochaを導入した時に引っかかったので。

## はじめに
ESLintは言わずもがなソースコードの静的解析ツールであり、明らかなバグやコーディングスタイルから外れた記法をチェックしてくれます。
[ESLint - Pluggable JavaScript linter](https://eslint.org/)

ところが、mochaでテストコードを書いていると、mocha特有の`describe`や`it`が未定義であると指摘されてしまいます。
<img width="481" alt="スクリーンショット 2018-05-07 16.15.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/194498/ff51ed60-36e5-4b88-1c80-f2ddc2e4310f.png">

このままだと本来チェックしたい誤りを見落とすことになってしまいます。
それを避けるためにESLintを正しく設定しましょう。

## 設定方法
ESLintの設定で、以下のように`env`でmochaを使用することを明示する必要がありました。

```json:.eslintrc.json
{
    "env": {
        "mocha": true
    }
}
```

## 設定後
設定後、`describe`や`it`に引っかからずに、解析が完了しました。
<img width="421" alt="スクリーンショット 2018-05-07 16.23.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/194498/6a3677f7-34c3-430e-b15c-35c6c62a9b0c.png">


以下公式リファレンスでmocha以外にもjestやjasmineなど使用できるenvの設定値が記載されているので、mocha以外のライブラリで意図しない指摘が出力された際にはぜひ確認してみてください。
[Configuring ESLint - ESLint - Pluggable JavaScript linter](https://eslint.org/docs/user-guide/configuring)
仮想通貨APIとamchart

仮想通貨のデータを可視化したいという人や、仮想通貨のメディアで働いていて、チャートが作りたいという方も多いはず、今回は最初に便利な仮想通貨のAPIを紹介したのち、amchartの簡単な使い方を説明、最終的には仮想通貨のチャートを表示させるまでを行なって行きたいと思います。
## 仮想通貨系のAPI
### CoinMarketCap　https://coinmarketcap.com/ja/api/
とてもわかりやすいドキュメントがあるので、詳しい使い方についてはあまり触れませんが、主にその時の通貨の状態をとってくるために使います。

### coincap.io　https://github.com/CoinCapDev/CoinCap.io
こちらもとてもわかりやすいapi。documentは一応英語ですが、何を入れたら、何が返ってくるのかがとてもわかりやすい。CoinMarketCapにある機能はだいたいついているイメージで、さらに時系列順にもデータをとってこれる優れもの。こちらはCoinMarketCapにはないhistoryの機能を主に使ってきます。

## amchart　https://www.amcharts.com/
amchartは簡単にかっこいいchartが作れたり、mapが作れたりするライブラリ。demoが豊富で、何か作りたいグラフがあったら、demoの中から該当する部分をひっぱてくればだいたいできちゃう。美的センスがなくてもdemoのやつを引っ張ってきちゃえばかっこいいものができるので、とても助かる。
js 与えられた整数を二進数で返す

##お題

負でない整数nが与えられた場合、その数値を二進数で返す関数を書いてください。

```javascript
function toBinary(n){
 //write your code.
}
toBinary(10);//1010

```

##使ったもの
`parseInt();`
`toString();`


##コード
```javascript

toBinary = (n) => parseInt(n.toString(2));

```

##考え方
`toString()`の引数2とすることで二進数かつ文字へ変換する。`//'1010'`
`parseInt();`で二進数にした文字列を数値へ変換する。`//1010`
[parseInt();](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt)

##他code
```javascript
let toBinary = n => +n.toString(2)

```

他にも解答コードある方、コメントへどうぞ
FileMaker// カードウインドウ

#背景
ユーザから、「ポップアップメニューの項目が１００項目近くなってしまって、選ぶのが大変」という声が上がった
#別の選択方法を考える
・ドロップダウンリスト=幅が足りず、項目が全部表示されないので見えない部分があって困る
・ポップアップメニューで吹き出しにポータル＝なんだか動きがもっさり
#新規ウインドウにしようと思う
・開きっぱなしはよくない
・カードウインドウにしよう
・ポータルだけのレイアウトを一つ作って、カードウインドウとして表示させるようにした
##実装してみたときの注意点
・閉じるのチェックを外してはいけない（外すなら別の閉じるボタンを作らないと詰む）
・親ウインドウにデータを貼り付けるときは、子ウインドウ(カード)側のスクリプトを
1) 子ウインドウのデータを取得
2) ウインドウを閉じる
3) 親ウインドウのフィールドに設定
という手順にする必要がある（２のタイミングがわからなくて最初苦労した）
Angular Long Term Support(LTS) 図解

- 2018/05/07(Mon) 時点の情報に基づいています

## v5 も LTS になりました
先日 Angular 6 が出ました。
https://blog.angular.io/version-6-of-angular-now-available-cc56b0efa7a4

このブログの中で、ｖ4 以降の全てのメジャーバージョンを LTS 対象とする、とアナウンスされました。以前は ｖ4 と ｖ6 だけだったのですが、この度 ｖ5 も LTS 対象となりました。

## LTS 図解
ということで、現時点の LTS の状況がどうなっているのか、図でまとめてみました。
参照：https://angular.io/guide/releases
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70618/5bd50317-1c50-8f48-94a5-9f5eacabf6ee.png)

うん、わかりやすい。
WPFで親ウインドウが無いウインドウを作った際に前面に出す

### 背面で作られたりして悲しいのです

ちょいと覚え書き。
WPFでウインドウをつくった際に、 `NotifyIcon` からポップアップメニュー出してウインドウつくったりすると、親無しのウインドウを作ることになりますよね。
で、そうして作ったウインドウはなんだか悲しく背面に出て来たりします。
それを前面に出した状態で作ってしまおうと言う事。

### Topmostを使う

結局どうやるかというと、以下のコード。

```csharp
public static Window MakeKeyAndOrderFront(this Window wnd)
{
    if (!wnd.IsVisible)
    {
        wnd.Show();
    }
    if (wnd.WindowState == WindowState.Minimized)
    {
        wnd.WindowState = WindowState.Normal;
    }

    wnd.Active();
    wnd.Topmost = true;
    wnd.Topmost = false;
    wnd.Focus();
}
```

重要なのは最後の3行。

1. Topmostを使って最前面にする
2. 最前面を取り下げる
3. フォーカスを取得

最前面を取り下げて(2.)も元に戻る訳ではなく、最前面に居座ったままです。
その状態でフォーカスを当ててやると希望の状態に。
[php] 文字列を含んだ数値の四則演算

## Twitterで見かけたTweet
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ほげえええええええ <a href="https://t.co/kbpeYihu0A">pic.twitter.com/kbpeYihu0A</a></p>&mdash; かずきち (@h_tyokinuhata) <a href="https://twitter.com/h_tyokinuhata/status/993167418183725057?ref_src=twsrc%5Etfw">2018年5月6日</a></blockquote>

## 気になったので試した
下のコードを実行して見た
<img width="245" alt="スクリーンショット 2018-05-07 16.10.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/110131/0c4a8cf8-d5b3-3c8b-5450-eb6d216715fd.png">

結果はこうだ
<img width="130" alt="スクリーンショット 2018-05-07 16.10.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/110131/ada077c1-5544-a414-8069-c971eeb41eba.png">

## 結論
どうもTwitterの内容は本当なようだった。

## ネタバラシ
http://php.net/manual/ja/language.types.string.php#language.types.string.conversion

> 数値として文字列が評価された時、結果の値と型は次のように定義されます。

> 文字列の中に '.' や 'e'、'E' といった文字が含まれず、 数値が integer 型の範囲内 (PHP_INT_MAX で定義されています) におさまる場合は integer として評価されます。それ以外の場合は、すべて float として評価されます。

> 文字列の最初の部分により値が決まります。文字列が、 有効な数値データから始まる場合、この値が使用されます。その他の場合、 値は 0 (ゼロ) となります。有効な数値データは符号(オプション)の後に、 1 つ以上の数字 (オプションとして小数点を 1 つ含む)、 オプションとして指数部が続きます。指数部は 'e' または 'E' の後に 1 つ以上の数字が続く形式です。
vsqlでダブルクォーテーション付カンマ区切りで出力する方法@windows環境

## 概要
vsqlコマンドでcsvファイルを出力する際に、ダブルクォーテーションで各カラムアイテムを囲みつつ、「,」区切りする方法をまとめる。
vsqlコマンドでは区切り文字の設定はできるがダブルクォーテーションで囲むといいったオプションはない。そこで区切り文字を「","」に設定し、出力結果の各行の行頭と行末に「"」を付けることで実現する方法をまとめる。加えて邪魔な最後の行数表示も削除する。

## コマンド
\*\*\*には任意のオプションを入れる(-h、-U、-dや-cなど）

```
vsql *** -F """,""" *** | gawk "{gsub(/^|$/,""""\042"""");print}" | sed "$d" | sed "$d" > result.csv
```

## 解説
### 「-F ""","""」の表記について

```sh
vsql *** -F """,""" ***
```

`","`を区切り文字に使うよという意味。コマンドプロンプトでは`"`で囲まれた部分では`"`をエスケープ文字として使うためこんな表記になっています。
区切り文字を`","`にしたのは、各アイテムを`"`で囲むためです。ですが`-F ""","""`だけでは先頭と末尾のアイテムは`"`が足りないのでgawkの出番です。

### gawk部分でやってること

```sh
gawk "{gsub(/^|$/,""""\042"""");print}"
```

gsubをつかって行頭と行末に`"`を追加しています。

「`\042`」はASCIIコードのオクテット表記で「`"`」を表す。linuxのawkなら`gsub(^/$/,"\042")`で良いはずですが、Windowsではそれだとうまくいきませんでした。。なので「`""""`」と4つ並べています。
なぜこれでうまくいくのか分かりませんが「`"`」のエスケープ文字としての処理が2回行われている？かなんかで、「`""""`」はgawk的には「`"`」として解釈されているんだと思います。なぞ。

### sedでやってること

```sh
sed "$d" | sed "$d"
```

vsqlコマンドの最終行はヒットした行数と空白行が入るのでそのままcsvにするとゴミになります。なのでその最後の２行を削除しています。

`$`は最終行を表しており`d`でその行を削除している。
`vsql`の結果は最後に出力行数と空白行が入るためその2行を消すために2回sedをいれている。
`head -n -2`でも最終2行を消すことはできるがsedよりも遅い模様。
Railsが本番環境で500エラーが出た時の対処法

以下、自分への備忘録。

#本番環境で500エラーが発生
unicornの設定もnginxの設定も完了して、いざrailsを起動させてみるとまさかの「500エラー」が。。。

![500error.png](https://qiita-image-store.s3.amazonaws.com/0/187963/31f5d1a1-53e2-d5f8-5ee0-d74b20b16494.png)

もう一度各設定を見直す。
unicorn・・・OK
nginx・・・OK
エラーログ・・・OK

なんでかなーなんて思っていたら、単純に本番環境の「SECRET_KEY_BASE」のし忘れ。。。
早速対処します！

#本番環境にSECRET_KEY_BASEの変数を設定

まずはsecret keyの作成

```
# bundle exec rails secret
xxxxxxxxxxxxxxxxxxxxxxxxxx
````
文字列が表示されるので、どっかに保存。

環境変数に文字列を設定

```
$ export SECRET_KEY_BASE='xxxxxxxxxxxxxxxxxxxxxxxxxx'
```

設定が完了したら、uncornを再起動してら、無事に動いた。

![rails404.png](https://qiita-image-store.s3.amazonaws.com/0/187963/c8fffbe2-5255-5edb-7e96-64551af4e609.png)

参考にさせていただいた記事

[Rails5をproduction（本番環境）で起動する時に嵌ったこと - Qiita]
(https://qiita.com/qiugits/items/7cd01f4b5cff4a31e053)
[【Ruby on Rails】本番環境で500エラーが出た時の対処法]
(https://y-hilite.com/3132/)
Windowsでコマンドの実行時間を測定する雑だけど簡単な方法

```
date && [実効時間を測定したいcommand] && date
```

&&でコマンドをつなぐと&&の左側のコマンドが正常終了したあと、&&の右側のコマンドが実行される。
時間を測定したいコマンドの前後に&&ではさんでdateコマンドを実行すれば、実行開始時間と終了時間が取れるので、あとは手計算でかかった時間が分かる。
Macで書いたコードをEV3上で動かす

# 始めに
この記事は[元記事](http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnv#開発プラットフォームEV3RTのダウンロードインストール)の内容をMacで開発するために必要な部分のみを切り取ってペーストしているだけなため，内容は非常に酷似しています．
また，この記事はPC初心者でも分かるように書いているため，上級者にとってはかなり冗長に感じることが多いと思いますが，どうぞご容赦下さい．気に食わなければ[元記事](http://dev.toppers.jp/trac_user/ev3pf/wiki/DevEnv#開発プラットフォームEV3RTのダウンロードインストール)を見て下さい．

# 機材
## 必要なもの
- MacのPC
- microSD
- microSDにPCのデータをコピーすることができるもの(USB microSDアダプタ，WindowsPCなど)
- EV3

## あると便利なもの
- USB(A)-USB(Mini-B)ケーブル(EV3購入時に付属している)

# 環境構築
## 開発プラットフォームEV3RTのダウンロード＆インストール
[ダウンロードページ](http://dev.toppers.jp/trac_user/ev3pf/wiki/Download)から最新版のEV3RTのパッケージ(執筆時の最新版：ev3rt-beta7-1-release.zip)をダウンロード．

ダウンロードしたディレクトリに移動(コマンドはダウンロードしたファイルの保存場所がデフォルトのままの方向け．)
zipが解凍されていない場合は解凍してから移動して下さい．

```
$ cd ~/Downloads/ev3rt-beta7-1-release
```

tarコマンドを利用して解凍．

```
$ tar xvf hrp2.tar.xz
```

## gccのインストール
App StoreでXcodeをインストール([URL](https://itunes.apple.com/jp/app/xcode/id497799835?mt=12))．

## mkimageのインストール

```
$ brew install u-boot-tools
```

## GNUツールチェーンのインストール
[ここ](https://launchpad.net/gcc-arm-embedded/+download)からMac用の最新版をダウンロード(執筆時の最新版：gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2)．
ダウンロードフォルダをFinder上で開き，ダウンロードしたものをダブルクリックして解凍し，gcc-arm-none-eabi-5_4-2016q3/binまでのPATHを通す．

### PATHの通し方
解凍して生成されたディレクトリをホームディレクトリ下に移動

```
$ cd ~/Downloads
$ mv gcc-arm-none-eabi-5_4-2016q3 ~
```

viエディタを起動してホームディレクトリ下の.bashrcを編集する．

```
$ vi ~/.bashrc
```

([viエディタの使い方](https://net-newbie.com/linux/commands/vi.html))

書き込むPATHは下記．

```
export PATH=$PATH:~/gcc-arm-none-eabi-5_4-2016q3/bin
```

保存して終了した後，リロードする．

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

リロード後，下記のようにコマンドを入力し，正しく表示された場合は完了．
何も表示されなかった場合はPATHが通せていません．タイプミスなどをご確認ください．ダウンロードしたものが私が執筆したときと異なる場合は，PATHなどが異なりますので，ご注意ください．

```
$ which arm-none-eabi-gcc
/home/<ユーザ名>/gcc-arm-none-eabi-5_4-2016q2/bin/arm-none-eabi-gcc
```

## EV3RTのコンフィギュレータ（cfg）のインストール
[ここ](http://toppers.jp/cfg-download.html)からMac版バイナリファイル(執筆時の最新版：コンフィギュレータ Release 1.9.5(64bit MacOSX用バイナリ))をダウンロードし，EV3RTのhrp2/cfg/cfg/以下に置いてください．

```
$ cd ~/Downloads
$ mv cfg ev3rt-beta7-1-release/hrp2/cfg/cfg/
```

# EV3にアプリケーションローダを入れる
microSDのルートフォルダにev3rt-beta7-1-release/sdcard/uImageをコピー．
そのmicroSDをEV3に入れる．
起動してEV3RTの画面が出たら成功．
失敗したら，microSDを何回か抜き差しして頑張りましょう．

この後，USB(A)-USB(Mini-B)ケーブルがあれば，今後microSDを取り出す必要がなくなります．

# サンプルアプリケーションのビルドと実行
実行形式：動的ローディング形式

## サンプルアプリケーションのビルド
```
cd ~/Downloads/ev3rt-beta7-1-release/hrp2/sdk/workspace
make app=gyroboy
```

ビルドが正常に完了するとappという名前の実行ファイルが完成する．

## USB(A)-USB(Mini-B)ケーブルを用いてアプリケーションをmicroSDにコピー
microSDが挿さっているEV3とPCをケーブルを用いて接続すると，PC上でmicroSDが外部メモリとして認識される．
microSDの/ev3rt/apps/に作成した実行ファイルをコピーする．
ケーブルを正常に取り外し，EV3のアプリケーションローダのメニューで「SD card」を選択し、上下ボタンで実行したいアプリケーションを選び、選択ボタンを押すとアプリケーションを実行できます．
Hashidsを使って短いハッシュ値を生成する

# 概要
Hashidsというライブラリを使って短いハッシュ値を生成してみる。

ハッシュ関数には、MD5やSHA1などの有名ものがあるが、生成される桁数が多すぎて使いにくいときがある。

|関数|生成桁数(16進数)|
|:--|:--|
|MD5|32桁|
|SHA1|40桁|
|SHA2|64桁|

そういう時にHashidsを使うと簡単に短いハッシュ値を生成できる。
JavaScriptやRuby、Pythonなどの38種類の言語に対応している。(2018/5/7時点)
ただし、ハッシュ化対象は数値のみのため、文字列などは数値化してからハッシュ化する必要があるので注意。

# 使い方
## 基本
pipを使ってhashidsのライブラリをインストールする。
encodeメソッドにハッシュ化したい数値の対象を入れてあげれば、ハッシュ値が得られる。

```shell:install
pip install hashids
```

```python:generate_hash.py

from hashids import Hashids

hashids = Hashids()
id = hashids.encode(123) # encode(ハッシュ化対象の数値）

print('Hash: ' + id)
```
```python:output
Hash: Mj3
```

## Saltを付与する
Saltも簡単に付与できる。Saltについては以下参照。
https://qiita.com/chroju/items/3ddae568206b8bc3d8f9

ハッシュ対象にランダムの文字列(Salt)をつけてハッシュ化することで、辞書攻撃を受けにくくすることができる。

```python:generate_hash_with_salt.py

from hashids import Hashids

hashids = Hashids(salt='This is my salt') # saltにsalt値を指定
id = hashids.encode(123)

print('Hash: ' +  id)
```
```python:output
Hash: POm
```
↑ Saltが付与されたことで、さっきのハッシュ値と変わった。

## ハッシュ値の桁数を変更する
生成されるハッシュ値は与えたencode()に与えた桁数によって変わるみたいだが、ハッシュ対象は短くても○○桁以上のハッシュ値が欲しい、という場合は桁数の指定もできる。

```python:generate_hash_specified_length.py

from hashids import Hashids

hashids = Hashids(hashids = Hashids(min_length=8) # min_lengthに最小桁数を指定
id = hashids.encode(123)

print('Hash: ' +  id))
```
```python:output
Hash: N1aMj3bW
```
↑ ハッシュ値が8桁になった。

## ハッシュ値の文字種を指定する
ハッシュ値として生成できる文字を指定することもできる。
最小の文字種は16種類らしい。

```python:generate_hash_limited_chars.py
from hashids import Hashids

hashids = Hashids(
    min_length=8,  # 短すぎると分かりにくいので8文字以上にする
    alphabet='abcdefghijklmnopqrstuvwxyz' # 生成される文字を小文字ローマ字のみに指定
)
id = hashids.encode(123)
numbers = hashids.decode(id)

print('Hash: ' +  id)
```
```python:output
Hash: vpamrybl
```
↑ 小文字のローマ字のみになった。

# 衝突しないのか
ハッシュ値が短くなれば、生成できるハッシュ値の数も減るので衝突するのでは？と疑問思い調べて見たところ、公式に書いてあった。

>There are no collisions because the method is based on integer to hex conversion. As long as you don't change constructor arguments midway, the generated output will stay unique to your salt.

整数を16進数に変換しているから衝突はないらしい。なぜそうなのかはよく分からない...

# まとめ
ハッシュ化できるのは数値のみだが、さくっと短か目のハッシュ値が欲しいときはhashidsで簡単にできる。

# 参考
https://hashids.org/
https://github.com/davidaurelio/hashids-python
`ModuleNotFoundError: No module named 'distutils.sysconfig'`。2018-05-07

# 内容
Ubuntu 16.04 などで Python 3.6 を使いたい場合、 `ppa:jonathonf/python-3.6` を利用することがあります。
2018/05/03 にそのパッケージが3.6.5に置き換わったようで、そちらにUpgradeしたらエラーが出るようになりました。

**たとえば virtualenv なら**

```
Original exception was:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/virtualenv.py", line 25, in <module>
    import distutils.sysconfig
ModuleNotFoundError: No module named 'distutils.sysconfig'
```

とか

**pip だとちょっと内容が違いますが（python 3.6 で作ったvenv内）**

```
Traceback (most recent call last):
  File "/home/XXX/venv/bin/pip", line 7, in <module>
    from pip._internal import main
  File "/home/XXX/venv/lib/python3.6/site-packages/pip/_internal/__init__.py", line 42, in <module>
    from pip._internal import cmdoptions
  File "/home/XXX/venv/lib/python3.6/site-packages/pip/_internal/cmdoptions.py", line 16, in <module>
    from pip._internal.index import (
  File "/home/XXX/venv/lib/python3.6/site-packages/pip/_internal/index.py", line 25, in <module>
    from pip._internal.download import HAS_TLS, is_url, path_to_url, url_to_path
  File "/home/XXX/venv/lib/python3.6/site-packages/pip/_internal/download.py", line 35, in <module>
    from pip._internal.locations import write_delete_marker_file
  File "/home/XXX/venv/lib/python3.6/site-packages/pip/_internal/locations.py", line 10, in <module>
    from distutils import sysconfig as distutils_sysconfig
  File "/home/XXX/venv/lib/python3.6/distutils/__init__.py", line 25, in <module>
    from distutils import dist, sysconfig
ImportError: cannot import name 'dist'
```

など。

その解決方法を記します。

# 解決方法
`python3-distutils` のインストールで解決
参考: https://github.com/pypa/pip/issues/5367

```
% sudo apt-get install python3-distutils
```

# まとめ
`python3-distutils` のインストールで解決で解決しました。
エックスサーバーにWordPressサイトを移行する手順

プラグイン All in One WP migration のプロ版（有料ですが確実に元はとれる価値があります）を利用している事を前提としています。
※サイトの容量が300M以下程度なら無料版でも可能です。

## 事前準備

引っ越し元のサイトで プラグイン All in One Migration でデータをエクスポートする

https://www.vektor-inc.co.jp/post/all-in-one-wp-migration/

## 引っ越し先の準備

* 移転するサイトのドメインをエックスサーバーに追加する
* PHPのバージョンを上げる
* サーバーパネルの「サーバー情報」ページでIPアドレスを確認
* PCのhostsファイル（ Macなら /etc/hosts ）に IPアドレス ドメイン を追記して書き換えて 該当ドメインで新しいサーバーを確認出来るようにする<br>サーバーパネルのサーバー情報からIPアドレスは確認できるので、<br>xxx.xxx.xxx.xxx example.com のように書く<br>詳しくは以下ページの「hostsファイルを編集して確認する方法」の部分参照
<br>https://www.xserver.ne.jp/manual/man_domain_checkproxy.php#hosts
* エックスサーバーの自動インストールからWordPressをインストールする
* プラグイン All in One Migration と プロ版をインストール<br>
  ※更新があるかどうか確認＆アップデート（プロ版においてアップデートしていないとインポートが正常に行えない事がある）
* 引っ越しデータをインポート
* 切り替え完了がわかるように非公開で記事を投稿しておく

表示を一通り確認する

* ドメインを管理しているサイト側で、ドメインの向け先をエックスサーバーのネームサーバーに切り替える
* エックスサーバー側でSSLを設定する
* /etc/hosts ファイルに追記してあった行（IPアドレス ドメイン）を削除
* ドメインが切り替わっているか予め投稿しておいた非公開記事で確認
Let's  チアプログラミング!！  オリジナルが強み！ 良さがわかるのは未来志向の人

さあ、まず最初は、体を動かして、:runner_tone2:頭も体も柔軟にしましょう！
日本で最初のプログラミングチア体操:muscle_tone3:を開発をいろいろしています。他の人にはまねできないオリジナル！！が強み！
良さがわかるのは未来志向の人

　体の各部分を回します。　（アイソレーション）
　頭、首　肩　鎖骨　背中　肩甲骨、胸　溝尾　ウエストお腹、腰、膝　足首
股関節を回し、足を開いて、上体を倒す、左右と
鏡を見ながら、体のバランスを見る　　ここに音楽あると嬉しい。　

　　そこで、昨日、音楽を仲間と　IchigoJamで　してみました。
え？ あのトランプ型のichigoJamで音楽作れるの？　　　
　　はい！！

コード
PLAY"CDEFG"     で、　ドレミになります。

BEEP で、音出して、　してみてください！

　たまには　自然とお花見や、春の季節を　初夏を感じて、
自分の考えた　お弁当をお料理作って、飾ってデコして、それもプログラミングよ！
一つ一つ考えることが大事なのよ。
　マシンでしなくても、プログラミングをアクティブラーニングでしている活動もあるよ！
　そして、そこから、友達や、コミュニケーションが取れることも大事なの。


　春が来ている心の中にも　笑顔きてる！
mysql操作コマンド

いろんな言語や機能を片っ端から弄ってるとすぐにコマンドとか忘れてしまいます‥(°_°)

#データベース関連
データベースの作成
```create database hogehoge;```
重複予防線
```create database if not exists hogehoge;```
データベースに接続
```use hogehoge;```
現在接続中のデータベースを確認
```select database();```
データベースの削除
```drop database hogehoge;```

#テーブル関連
テーブルの作成
```create table db_hogehoge.tbl_hogehoge (col_name1 data_type1, col_name2 data_type2, col_name3 data_type3..... );```
作成されているテーブル確認
```show tables (from db_hogehoge);```
表示するテーブルを絞り込むことも可能
```show tables (from db_hogehoge) like 'fruit'; ```
テーブル情報を取得
```show table status```

#データ関連
データの追加(useを使ってdbに接続済の場合はdb指定は省略可能)
```insert into db_name.tbl_name (col_name1, col_name2, ...)
  values (value1, value2, ...); ```
【Unity Android】Unable to list target platforms... が出たときに試したこと

# 邂逅
UnityでAndroid向けアプリをBuild & Runするとこんなのに悩まされることがある。

![20170409155809.png](https://qiita-image-store.s3.amazonaws.com/0/255294/0cb62078-f4ee-a5a8-df52-9e037ad8e13f.png)

出やがったな。
後はBuildはできるけど、Build & Runができないとか。

それらに対抗すべく、僕が試したことをメモしておきます。
#環境
PCの環境
Windows 10 64bit
Unity 2017.4.2f2 64bit
Android SDK (28.0.0 rc1)

ターゲット端末 
HTC 10(HTV32) Android 7.0

# 古いAndroid SDKツールを使ってみる
これをそのままやってみる。
[UnityのAndroidビルドができなくなった時の対処法]("https://qiita.com/niusounds/items/bcbeee622b2114b4016e")

Android SDKのtoolsフォルダーを上書きする手法。
どうやら最新のSDKにUnityが対応しきれていないらしいが、僕はこれで改善しなかった。
これで改善することもある（らしい）のでお試しあれ。
#とりあえず.apkファイルをBuidだけしてみる。
File → Build Settings... とクリッククリックしていくと出てくるウィンドウの右下にある「Build」ボタンをクリック。
.apkを保存するフォルダーを選んでくれ～みたいになるので、適当な場所を選んでビルド。

これが正常に終われば、クラウドとかで端末に.apkさえコピーできればとりあえず実機動作はさせられる。

#スマートじゃないじゃん？
めっちゃくちゃめんどくさい。
という事でadbコマンドをつかって手動インストールしてみよう。

##Android SDKツールをWindows Power Shellで使えるようにする
__環境変数を編集してAndroid SDK配下にある「platform-tools」にパスを通します。__
それで通じるのならこの段落は読み飛ばしちゃっておーけー。

エクスプローラーを開いて「PC」を右クリックしてプロパティをクリック。
Pause/BreakキーがあるキーボードならWindowsキーとPauseキー同時押しでも同じ画面が出せます。

ウィンドウの左側に並んでるやつの一番下「システム詳細設定」をクリック。
システムのプロパティのウィンドウが開いたら、下の方にある「環境変数」をクリック。

そしたら、環境変数のウィンドウが開くので画面上の「（ユーザー名）のユーザー環境変数」の「Path」をクリックして「編集(E)...」ボタンをクリック。
下のシステム環境変数の「Path」に書いてもいいけど、理由がなければユーザー環境変数でいいと思います。

そうすると、また変なウィンドウが開くので「新規(N)」をクリックして開いたダイアログでAndroid SDKフォルダー配下にある「platform-tools」を参照。

いろんなウィンドウの「OK」ボタンをポチポチして適当に閉じて、パスを通す作業を終了。
##Windows Power Shellで確認しよう
画面のWindowsボタンを右クリックしてWindows Power Shellかコマンドプロンプトを実行。

適当に「adb」と入力してなんかバラバラっと英語のメッセージが出てきたら成功。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/255294/efbd7dda-d7ca-6a9f-56b0-91ee5d6c8e6e.png)

赤字とかで日本語のエラーメッセージが出てきたら失敗してるので環境変数を確認してみましょう。

##ADBコマンドでインストールしてみる。
まずデバッグ可能なAndroid端末が接続されているかを確認する。

```console:WindowsPowerShell
User> adb devices
List of devices attached
ABCDE123456    device
```

なんか英語数字混じったやつが出てればおーけー。認識されてます。
ここでなんも出てこないとか、英語いっぱい出てきた時は端末のデバックが有効になっているか、認証しているか、そもそも接続されているのかを確認して、もっかい同じコマンドを実行してみましょう。
矢印キーの上を押せば同じコマンドを再度実行できます。

認識されてることを確認したら、インストールしてみましょう。

```console:WindowsPowerShell
User> adb install -r C:\Users\user\example\test.apk ←インストールする.apkファイルのパス
```

-rオプションは上書きを許可するオプションです。
デバッグは上書きしまくると思うのでつけといたほうが楽だと思います。

これで、ちょっと焦らしプレイされた後に「Success」と表示されたらインストールができているので端末で実行して確認しましょう。

なんか失敗したときはもう一回試してみるか、端末にインストール済みのデバッグ対象のアプリをアンインストールしてからまた試してみましょう。

##もっかいBuild & Runしてみる
ADBコマンドでインストールしてみた後に再びBuild & Runをやってみると不思議なことにできるようになっていることがあります。

ダメだったら...仕方ないね...
Unityでビルドした.apkをADBコマンドでインストールして実機動作させましょう。

#まとめ
1. Unityで.apkをBuildする！
2. Android SDKの「platform-tools」にパスを通す！
3. 「adb install -r (.apkのパス)」をPower Shellで実行してADBコマンドでインストールしてみる！
4. インストール出来たらUnityのBuild & Runをもう一回試してみる！

#ご意見とか質問とか
お気軽に[Twitter]("https://twitter.com/Denpa_Ghost")へどうぞ！
UnityもAndroidもお勉強中なので的確に解決に導けないとは思いますが、一緒に悩みます :)

個人でいろいろ開発もやってるのでフォローもお待ちしてます ( ˘ω˘)
Cordova で選択 or 撮影した動画のサムネイルを表示する

Cordova 関係なくスマホブラウザで動画のサムネイルを表示するのは面倒です。
少しハマったのでメモを残します。

1. video を load() する
2. video を play() する
3. vidoe を pause() する前に若干再生させる
4. 今度こそ video を　pause() する

サンプル
https://jsfiddle.net/AmataKasaP/9pryvjny/

参考
https://www.buraktokak.com/ios-safari-html5-video-thumbnail-load-kullanmadan-yuklenmiyor/
なんとなく理解したいWeb広告とSEO

この記事では、
WEBマーケティング全くの初心者の方に、「WEB広告とかSEOとかって何??」って聞かれた時に、
「この記事を見れば何となく分かるよ!」って言えるような記事を書きます。

# **目次**
1. WEBマーケティングって何?
2. WEB広告って何?
    3. WEB広告って何?
    4. WEB広告の種類
3. SEO対策って何?
    4. SEOって何?
    5. SEO対策って何?
    6. SEO対策って何するの?
4. まとめ

# **なんでWEB広告とSEO?**
元々はWebマーケティングとはで記事を書こうとしたんですが、広すぎてとても無理でした。
僕がなんとか話せるレベルのこの二つに絞っています。
と、この二つは汎用性が高いと思うのでこの二つにしました。

# **WEB広告って何?**
### **WEB広告って何?**
- WEB上(GoogleとかSNSアプリとかニュースアプリとか)で出てくる色んな広告の事です。
- 広告を配信したくなったら、GoogleやTwitterなどの広告を表示してもらう媒体にお金を払って広告を配信します。

### **WEB広告の種類**
基本的なものは大きく分けて、以下の４つがあります。

- 純広告
- リスティング広告
- ディスプレイ広告
- SNS広告
 
下に、それぞれの概要についてざっくり書いていきます。

##### **純広告**
- 特定のメディア（媒体）に、期間や、広告表示回数を決めて、配信される広告です。
- Yahoo!JAPANのTOPページなどに純広告の為の場所が設けられています。
- 他の広告は、成果報酬型で掲載結果によって料金が支払われますが、純広告の場合は先に期間や何回表示するなどを決めて料金を決定します。

##### **リスティング広告**
- GoogleやYahoo!などの検索結果のページに、表示されるテキスト広告のことです。
- 検索が行われる度に、オークション形式で配信される広告が決定されます。
- 検索語句と、広告主が設定しているKWがマッチするとオークションに参加します。
- 1回クリックされる度にお金がかかるクリック課金制です。
- 広告主が設定したクリックされた時に払える金額と広告の質で、オークションの結果が決まります。

##### **ディスプレイ広告**
- WEBサイト上に表示される広告のことです。
- テキストや画像、動画などが表示されます。
- クリック課金制と、表示ごとに料金がかかるインプレッション課金制があります。
- サイトが表示される度に、リスティング広告とほぼ同様のオークション形式で配信される広告が決定されます。

##### **SNS広告**
- SNSに表示される広告のことです。(厳密に言うとディスプレイ広告に属します)
- 有名なもので、Twitter,Facebook,LINEなどがあります。
- 他の広告に比べてシェアなど、SNSならではの媒体特性があります。
- こちらもリスティング,ディスプレイ広告同様にオークション形式で表示される広告が決定されます。

以上が、WEB広告って何?というものの答えになります。

もちろんこれは最低限の知識の部分で他にもめちゃめちゃくちゃくちゃ色んな細かいことがあり、更に実際にやるとなったら、売りたいものを考えて、競合を考えて、ターゲットを考えて、どういうターゲティングをするかを考えて、、、などたくさん考えないといけないことがあるのですが、最初の全体を掴みたいという方はこのくらいで良いと思います。

それでは次にSEOについてざっくり話したいと思います。

# **SEO対策って何?**
### **SEOって何?**
- Search Engin Optimizationの略称
- 日本語だと、検索エンジン最適化
- Googleとかが、ユーザーが求めている情報を提供する為に、色々すること。
- 検索結果の決め方とかとか
 
### **SEO対策って何?**
- 検索結果で上の方に表示されるよう、SEOの仕組みに沿って対策をすること

### **SEO対策って何するの?**
SEO対策ですることは、主に以下3つです。

- 内部対策
- 外部対策
- コンテンツ対策

この３つについて下にざっくりと概要を書いていきます。

##### **内部対策**
- 自社のサイト内で出来る対策をすること
- サイトの各ページで対策するKW(ユーザーのニーズがあるKW)を選定するなど
- HTML構造をSEOに合わせて最適化(titleタグに選定したKWを入れたりとか)すること

##### **外部対策**
- 質のいい外部のサイトにリンクを貼ってもらえるように対策すること。
    - 外部のサイトにリンクを貼ってもらうとページランクというのが上がって検索結果が良くなる。
- 質のいいというのは、スパムとかサクラではなく自然発生的な外部リンクのことです。
- 質が悪い外部リンク(スパム,サクラ)が多い場合、逆に検索結果が悪くなります。
- 質のいい外部リンクとは、具体的には下の3つがあります。
    - プレスリリース配信(まとめ媒体に紹介してもらうこと)
    - ディレクトリサービス(まとめ媒体に掲載してもらうこと)
    - サテライトサイトの作成(本サイトとは別だけど関係のあるサイトを作ること。(社長のブログとか...))
    

##### **コンテンツ対策**
- 選定したKWに合わせたコンテンツを作成すること
- ユーザーが求めているコンテンツを作成すること


# **まとめ**
- WEBマーケティングとは大きくWEB広告とSEOのことです。
- WEB広告はお金を払って(言い方が良くないのですが、)強制的に検索結果の上や、色々なサイト内に表示するのに対し、
SEO対策は、お金を払わないで、検索結果の上の表示させようと頑張ることです。
- WEB広告は強制的に表示しているので成果がすぐに現れるのに対し、SEO対策で成果が出てくるには時間にラグがあります。
ですが、WEB広告はお金を払うのをやめたら効果が薄くなるのに対し、SEO対策は成果が積み重ねとなり残り続けます。

上にまとめたように、双方にメリット,デメリットがあるので、商材やゴールに合わせてどちらを使うのか,両方とも使うのかなどを考えてWEBマーケティングを行うことが大切です。

以上がWeb広告とSEOのざっくりとした概要になります。
ご拝読ありがとうございます。
新しい Google Maps Platform では APIキーなしの呼び出しはサポートされなくなります

Google Maps JavaScript API や Google Places API などを含む地図・位置情報関連API群が、 **Google Maps Platform** として、2018年6月にアップデートされます。

* [Google MapsがそのAPIの構成と課金方式を抜本的に変えて単純化、月200ドルぶんまで無料 | TechCrunch Japan](https://jp.techcrunch.com/2018/05/03/2018-05-02-google-revamps-its-google-maps-developer-platform/)
* [Google Maps Platform: Introducing Google Maps Platform](https://mapsplatform.googleblog.com/2018/05/introducing-google-maps-platform.html)

この変更では、主に課金体系の単純化がクローズアップされていますが、他の影響点として、

* [User Guide ｜ Google Maps Platform ｜ Google Cloud](https://cloud.google.com/maps-platform/user-guide/)

にしれっと次のような記述があります。

> This will go into effect on June 11th, and keyless access will no longer be supported. At that time, keyless calls to the Maps JavaScript API and Street View API will return low-resolution maps watermarked with “for development purposes only.” Keyless calls to any of the following APIs will return an error: Maps Static API (including Static Street View), Directions API, Distance Matrix API, Geocoding API, Geolocation API, Places API, Roads API, and Time Zone API.

これによると、 **APIキー無しの呼び出しは2018/6/11以降サポートされなくなります**。
具体的には、

* APIキーなしの Maps JavaScript API や Street View API は、 **「低解像度」で「"開発用"と透かしの入った」 地図を返す**
* APIキーなしの Direction API, Places API(以下略)は、 **エラーを返す**

とのことです。
APIキーなしの利用は 2016年 からサポートされなくなる旨がアナウンスされていましたが、それが実効されるということです。

古くからメンテが滞っているWebアプリや、「とりあえず使ってみた」系のTipsなどは、影響を受けることになると思われるので、自身のプロダクトやコンテンツを確認してみることをおすすめします。
Android Studioをアップデートしてstyles.xmlやレイアウトファイルに「cannot resolve symbol theme」と出たときの解決方法

Android Studioをアップデートしたときに、「styles.xml」や「レイアウトファイル」の「Theme」「ThemeOverlay」「?attr/xxx」などに
```cannot resolve symbol theme```というエラーメッセージが出る場合の改善方法です

# 原因
どうやら原因は「Gradle」か「android plugin for Gradle」をアップデートしたのが原因っぽい（詳しくは分からない）

# 解決方法
プロジェクトを閉じて再度インポートする

## プロジェクトを閉じる

File
　↓
Close Project

## 再度importをする

閉じた直後の画面で↓を選択
Import project (Gradle, Eclipse ADT, etc.)
　↓
プロジェクトを選択

# 参考
- [Stack Overflow - Android Studio 3.1 Cannot Resolve Symbol (Themes, Widget, attr, etc.)
](https://stackoverflow.com/questions/49523302/android-studio-3-1-cannot-resolve-symbol-themes-widget-attr-etc)
ROSノードの実行時間プロファイリングしたかったメモ

# ROSノードの実行時間を知りたい
どうにも処理が重いnodeがいて、どこがボトルネックになっているのか知りたくプロファイリングをしたメモ。

#### 実行環境
* Ubuntu 16.04 LTS
* ROS Kinetic Kame

## pprofile
pythonで各行実行時間を知るにはcProfileなどいろいろある様子。
今回は特に理由はないがpprofileを使用。各行の実行時間を知りたいだけなので特にどれでも問題なし。

## launchファイルにprefix追加
pprofileをlaunchファイルから実行できるようにnodeタグにオプションを加える。
同じようなことを考える人たちはやはりいるようで、ROS標準でprefixをつけてノードを実行できるようになっている。
参考：[How to Roslaunch Nodes in Valgrind or GDB](http://wiki.ros.org/roslaunch/Tutorials/Roslaunch%20Nodes%20in%20Valgrind%20or%20GDB)

launchファイルの記述は下記のような形。

```
<launch>
 ...いろいろ

    <node pkg="pkgname" 
          name="nodename" 
          type="script.py" 
          launch-prefix="pprofile --out $(find pkgname)/log/script.pprofile" >
        ...いろいろ
    </node>

</launch>
```

これでlaunchファイルを実行すれば、prefixがついた状態で実行されるのでプロファイリングができる。

## 実行結果
`$(find pkgname)/log/script.pprofile`を開くと下記の通りpprofileの結果が出力されている。

```
File: /home/***/catkin_ws/src/pkgname/script/script.py
File duration: 0.018404s (0.79%)
Line #|      Hits|         Time| Time per hit|      %|Source code
------+----------+-------------+-------------+-------+-----------
     1|         0|            0|            0|  0.00%|#!/usr/bin/env python
     2|         0|            0|            0|  0.00%|
     3|         2|     0.018404|     0.009202|  0.79%|import sys
     4|         0|            0|            0|  0.00%|import rospy
(call)|         1|   1.5974e-05|   1.5974e-05|  0.00%|# /usr/lib/python2.7/dist-packages/pkg_resources/_vendor/six.py:184 find_module
(call)|         1|   2.7895e-05|   2.7895e-05|  0.00%|# /usr/lib/python2.7/dist-packages/pkg_resources/extern/__init__.py:22 find_module
     5|         0|            0|            0|  0.00%|import tf
     6|         0|            0|            0|  0.00%|import numpy as np
     7|         0|            0|            0|  0.00%|from sensor_msgs.msg import Image
     8|         0|            0|            0|  0.00%|from cv_bridge import CvBridge, CvBridgeError
...
```

やったね！



## その他雑感
* プロファイルした結果の出力先はパッケージ下のlogにしたけれど、こういう場合も.rosを使用していいもの…？ 今の形だと若干行儀が悪い感はある。
* pprofileを使ったけれど、cProfileやvalgrindなどもある様子。用途によるのだろうけれど、もう少し勉強せねば。
投資AI（人工知能）を作ろうかな！ 先行研究＆市場環境調査

# 最近の学術研究

下記でかなり徹底的にやられてる。
https://www.jstage.jst.go.jp/article/tjsai/33/1/33_A-H51/_pdf/-char/ja

- テクニカル分析（LSTM）
- ファンダメンタル分析（ロジスティック回帰、決定木、非線形サポートベクターマシン他）
- これらを、アンサンブル学習でまとめあげて、分析結果を得る感じ？


# 先行実績

アルゴリズム取引のシステムを開発・運用してみて分かったこと
https://www.slideshare.net/amedama/ss-72296136

まぁまぁな成績とのこと。そうかやりようによるのかぁ。


# 本で勉強

ウォール街のランダム・ウォーカー
 http://amzn.asia/0XMRqzD

> ファンダメンタル分析、テクニカル分析で、インデックス投資を上回るパフォーマンスを出せる科学的根拠は存在しない。

なるほど。。
確かにがんばった割に結果が出なそう。

> ポートフォリオに３０銘柄組み込んだ時点で、非システマチックリスクがかなり取り除かれる。

なるほど。。
３０銘柄くらいなら、インデックス投資とかに毎年手数料払うより、自分でできそうかも。


# インデックス投資の手数料

http://diamond.jp/articles/-/131949
> 日本株式（TOPIX型）
> ニッセイ 0.159% 1000万 で15,900円/年

> 先進国株式 インデックスファンド信託報酬
> EXE-iつみたて 0.1069％ 1000万 で10,690円/年

> 新興国株式 インデックスファンド信託報酬
> EXE-i つみたて 0.1804％ 1000万 で18,040円/年

あそうなのか。結構やすいのか。
でもせっかく株式投資するなら優待とかもらいたいよなぁ。

ちなみにTEHOは
https://theo.blue/fee

3000万までは 1％の信託報酬
3000万以上の部分は、0.5％
３０００万あずけて、毎年３０万かぁ。。ちょっとな。

# 検討

相当勉強しない限り、アクティブ運用するAIよりインデックス（広く分散投資）が結局パフォーマンスよさそう。じゃこれを最適化しよう！

海外への分散投資は、インデックスを使うしかなさそう。

国内の株式分散投資は、自分で組んで分散したほうが、余計手数料もかからないし、株主優待とかもとれてよいのではないか？
国内の最適な分散投資（上述の本によれば、30銘柄）ができれば良い気がする。
これを作ってみよう
flaskでjavascriptの変更が反映されない場合の対処法

flaskを使ってるときに、ちょっと問題が発生したので、その解決方法を書いておきます。

#発生した問題
更新してもjavascriptの変更が反映されなかった。

#おすすめの対処法
[静的ファイルの更新がブラウザのキャッシュで反映されない問題の対策](https://qiita.com/ymko/items/b03499aefcceec10ef8f)


#自分がやったこと
flaskのdocumentationにある下のコードで遊んでました。

```python:server.py
from flask import Flask, jsonify, render_template, request
app = Flask(__name__)

@app.route('/_add_numbers')
def add_numbers():
    a = request.args.get('a', 0, type=int)
    b = request.args.get('b', 0, type=int)
    return jsonify(result=a + b)

@app.route('/')
def index():
    return render_template('index.html')


if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)
```
```html:templates/index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Home</title>
    <script type=text/javascript src="{{ url_for('static', filename='jquery.js') }}"></script>
    <script type=text/javascript src="{{ url_for('static', filename='calculate.js') }}"></script>
    <script type=text/javascript>
      $SCRIPT_ROOT = {{ request.script_root|tojson|safe }};
    </script>
  </head>
  <body>
    <h1>jQuery Example</h1>
    <p><input type=text size=5 name=a> +
       <input type=text size=5 name=b> =
       <span id=result>?</span>
    <p><a href=# id=calculate>calculate server side</a>
  </body>
</html>
```

```javascript:static/calculate.js（変更前）
$(function() {
  $('a#calculate').bind('click', function() {
    $.getJSON($SCRIPT_ROOT + '/_add_numbers', {
      a: $('input[name="a"]').val(),
      b: $('input[name="b"]').val()
    }, function(data) {
      $("#result").text(data.result);
    });
    return false;
  });
});
```

入力フォームに数値を入力し、その計算結果を表示するサンプルプログラムです。

![a.PNG](https://qiita-image-store.s3.amazonaws.com/0/157216/12c5b753-fde8-28d3-5766-e3ce25f985f5.png)

これで、例えば以下のようにcalculate.jsを書き換えると計算結果のテキストが強調されて表示されるはずですが、表示されませんでした。

```javascript:static/calculate.js(変更後)
$(function() {
  $('a#calculate').bind('click', function() {
    $.getJSON($SCRIPT_ROOT + '/_add_numbers', {
      a: $('input[name="a"]').val(),
      b: $('input[name="b"]').val()
    }, function(data) {
      $("#result").html("<strong>" + data.result + "</strong>");
    });
    return false;
  });
});
```

左上にある更新ボタンを押したり、プログラムをいったん終了して再度動かしてみても計算結果が強調されて表示することはありませんでした。

で、調べてたら解決方法を見つけました。
https://stackoverflow.com/questions/41144565/flask-does-not-see-change-in-js-file
どうやらブラウザのキャッシュに問題があるようでブラウザを強制的に更新すればjavascriptの変更が反映されます。

```:解決方法
Windows -> Ctrl + Fn + F5
Mac     -> Cmd + Shift + R
Linux   -> Ctrl + Shift + R
```

ちゃんと表示されました。

![b.PNG](https://qiita-image-store.s3.amazonaws.com/0/157216/bf18c95e-c1a5-7668-85de-a64280c8c426.png)
Laradockでmysqlコンテナの立ち上げに失敗する

# 環境
windows10
Laradock
docker-compose 1.21.1

# エラー内容
docker-composeでmysqlを立ち上げたらエラーが出た


```
[ERROR] [MY-011071] [Server] /usr/sbin/mysqld: Error while setting value 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' to 'sql_mode'
```

# 対応
~/.laradock/data配下のデータを消す

my.cnfのNO_AUTO_CREATE_USERを外してビルドしなおすと正常起動する

もしくは
.envのMYSQL_VERSIONをlatest(現在8.0) → 5.7に変えると正常起動する
Facebook APIのアクセストークンのタイプや有効期限を確認する方法

Facebook APIで使用するアクセストークンのタイプや有効期限を確認する方法についてのメモ。

# アクセスデバッガーでタイプや有効期限を確認

Facebook開発者ツールの[アクセストークンデバッガー](https://developers.facebook.com/tools/debug/accesstoken/)を開き、対象のアクセストークンを入力して「デバッグ」を押すと、アクセストークンの取得者や有効期限、タイプ、紐付いたアプリIDなどの情報が確認できます。

![スクリーンショット_2018-05-07_12_22_32.jpg](https://qiita-image-store.s3.amazonaws.com/0/6380/8005036f-017a-2fe6-6417-18dd71730256.jpeg)

有効期限のあるアクセストークンは「有効期限」にいつ期限が切れるか表示されます。

![スクリーンショット 2018-04-27 15.34.27.png](https://qiita-image-store.s3.amazonaws.com/0/6380/12d52b79-6003-c40a-f78f-e342f84e4a38.png)

有効期限が無期限のアクセストークンは「有効期限」が「受け取らない」になっています。
![スクリーンショット 2018-09-18 15.53.34.png](https://qiita-image-store.s3.amazonaws.com/0/6380/dd45d08f-5913-114f-fac2-c8d5981eb01d.png)
[有効期限が無期限のFacebookページアクセストークンの取得方法 - Qiita](https://qiita.com/unsoluble_sugar/items/3faa5df64a219613d875)


「タイプ」にはアクセストークンの種類が記載されます。Facebookのアクセストークンは、以下の4種類が存在します。

- ユーザーアクセストークン
- アプリアクセストークン
- ページアクセストークン
- クライアントトークン

用途や取得方法はそれぞれ異なるため、詳細は公式ドキュメントを参照してください。
[アクセストークン - Facebookログイン](https://developers.facebook.com/docs/facebook-login/access-tokens?locale=ja_JP)
Python 今更ながらTweepyを使って、Twitterを操作する

前回に引き続き、Pythonライブラリを使ってTwitterを操作していきます。
今回は、ワード検索をして引っかかった人を「フォロー」かつそのコメントに「いいね」をさせていきます。

[前回の記事](https://qiita.com/gurensouen/items/279f59e0b946b70286de)

今回は、「フォロー」と「いいね」をしていくので、「Tweepy」を使っていきます。

<h1>Tweepyのインストール</h1>
    pip install tweepy
これで、「Tweepy」が使えるようになります。


<h1>ソースコード</h1>
    import tweepy

    consumer_key=''
    consumer_secret=''
    access_token_key=''
    access_token_secret=''
    
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token_key, access_token_secret)

    api = tweepy.API(auth)

    word = ["","","",""]
    set_count = 10
    results = api.search(q=word, count=set_count)

    for result in results:
        username = result.user._json['screen_name']
        user_id = result.id
        print("ユーザーID："+str(user_id))
        user = result.user.name
        print("ユーザー名："+user)
        tweet = result.text
        print("ユーザーのコメント："+tweet)

        try:
            api.create_favorite(user_id)
            api.create_friendship(username)
            print(user+"をフォローと「いいね」をしました\n\n")
        except:
            print(user+"はもうフォローしてます\n\n")



*「consumer_key」*
*「consumer_secret」*
*「access_token_key」*
*「access_token_secret」*
上記は前回同様、取得したTwitterで発行したトークンを入れます。

*word*に、検索ワードを入れます。

    word = ["","","",""]

上記のように書けば複数ワードを
     
    word = ""

このように書けば、単ワードでコメントを検索します。

*set_count*は検索数をセットします。
検索結果を分解。
ユーザーID、ユーザー名、そのユーザーのコメントを表示して、「フォロー」と「いいね」をしています。
もう「フォロー」しているユーザーを再度、フォローしようとすると例外が発生してしまうので、
*try:*   *except:*  で、例外処理を設けています。

**※このシステムで「フォロー」や「いいね」をやりすぎるとTwitter側からロックやアカウント削除などされることがありますので、やる際は、自己責任でお願いします**


感想としては、Pythonはすごく便利で、ライブラリ使うとホント楽だなって思います。

<h1>参考資料</h1>
[TWeepyドキュメント](http://tweepy.readthedocs.io/en/v3.4.0/api.html)

[【Python】Tweepyの使い方まとめ](https://review-of-my-life.blogspot.jp/2017/07/python-cloud9-tweepy.html)

[駆け出し眼鏡のプログラミング道場](http://taikomegane.hatenablog.jp/entry/2017/07/08/151110)
UE4 着せ替えシステムの仮実装

知人用なので抜けとかご了承ください


今回は頭、胴、腕、脚の4部位の着せ替えを行う
このようにスケルタルメッシュコンポーネントの子にスケルタルメッシュコンポーネントを追加し、
同じアニメーションBPを設定すればよい（おそらく継承すれば子BPでも可）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198123/be26c76a-9302-8ec2-2040-9e3eff2d590b.png)

##備考
下図のような直接スケルトンの角度を上書きする処理を入れている場合、
服側のスケルトンが1tick遅れて反映されるので注意
そのほか多少親子で変数の値がずれる可能性がある（条件が確立できなかったので原因は不明）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198123/5a208d3b-2b80-3b2b-47dd-16053207fefe.png)

#宣伝
弊サークルが開発中の魔装術師アカネをよろしくお願いします
（システムはA○NXオマージュ）
https://twitter.com/vak_DJregion/status/992688613958692866
Linux フォント関連コマンドまとめ

# fc-list

## インストールされているフォントのリストを表示する

```console
$ fc-list
```

## インストールされている日本語フォントのリストを表示する

```console
$ fc-list :lang=ja
```

## 名前でマッチするフォントを表示する

```console
$ fc-list "Noto Sans"
/usr/share/fonts/truetype/noto/NotoSans-Bold.ttf: Noto Sans:style=Bold
/usr/share/fonts/truetype/noto/NotoSans-Italic.ttf: Noto Sans:style=Italic
/usr/share/fonts/truetype/noto/NotoSans-BoldItalic.ttf: Noto Sans:style=Bold Italic
/usr/share/fonts/truetype/noto/NotoSans-Regular.ttf: Noto Sans:style=Regular
```

```console
$ fc-list "Noto Sans:style=Regular"
/usr/share/fonts/truetype/noto/NotoSans-Regular.ttf: Noto Sans:style=Regular
```

## フォントの詳細情報を表示する

```console
$ fc-list "Noto Sans:style=Regular" -v
```

# fc-match

## 名前で指定したときどのフォントが使われるか調べる

```console
$ fc-match "Noto"
fonts-japanese-gothic.ttf: "Takao Pゴシック" "Regular"
```

```console
$ fc-match "Noto Mono"
NotoMono-Regular.ttf: "Noto Mono" "Regular"
```

# fc-cache

## キャッシュを更新する

```console
$ sudo fc-cache -fv

-f   (force) キャッシュ済みのフォントも再度調べる
-v   (verbose) 詳細情報を表示する
```

# ImageMagickで使えるフォントの一覧を表示する

```console
$ convert -list font
```

# フォントに含まれる文字を調べるには？

`fonttools`パッケージをインストールしておく。

```console
$ ttx -t cmap -o ~/cmap.xml TakaoGothic.ttf
```

```cmap.xml
<?xml version="1.0" encoding="UTF-8"?>
<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">

  <cmap>
    <tableVersion version="0"/>
    <cmap_format_4 platformID="0" platEncID="3" language="0">
      <map code="0x20" name="aj231"/><!-- SPACE -->
      <map code="0x21" name="aj232"/><!-- EXCLAMATION MARK -->
（中略）
      <map code="0x41" name="aj264"/><!-- LATIN CAPITAL LETTER A -->
      <map code="0x42" name="aj265"/><!-- LATIN CAPITAL LETTER B -->
      <map code="0x43" name="aj266"/><!-- LATIN CAPITAL LETTER C -->
（中略）
      <map code="0x3402" name="aj13698"/><!-- CJK UNIFIED IDEOGRAPH-3402 -->
      <map code="0x3406" name="aj17242"/><!-- CJK UNIFIED IDEOGRAPH-3406 -->
      <map code="0x342c" name="aj17246"/><!-- CJK UNIFIED IDEOGRAPH-342C -->
（中略）
```

# フォントの見た目を確認するには？

[font-manager](http://fontmanager.github.io/)というパッケージがいい感じ。
フォントが多いと重いけど。
UE4　ブレンドスペースの使い方

知人用なので抜け等ご容赦ください

#ブレンドスペースとは
2軸の変数を使って複数のモーションを合成して滑らかなアニメーションを行う機能
ブレンドスペースを使うことで
立ちと走りを1つのステートで行うことができる（設定次第で歩行もいけるはず）
スティックに対応した方向に足を向けられる

[サンプル](https://twitter.com/vak_DJregion/status/993340364265148416)
##サンプルの説明
縦軸がスティック上下(speedという表現は正しくないです)
横軸がスティック左右
構成はこんな感じ
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/198123/96cc69c3-4b15-ed9e-a887-76fbebaba59f.png)

なおアニメーション速度は実際のゲームでの値を利用しています（あまり遅いとスローモーションに見えるがある程度なら対応可能）
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/198123/d6d58622-c492-cbf7-90ee-fc0f9d4ae0ba.png)

##備考
ポーンの変数はこれでとれます
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/198123/03cc3251-aa9d-b1c6-bafa-40997302eab1.png)
speed変数はそのままアクタの情報を反映
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/198123/b24b4a8c-65f4-c003-2f7b-620d781ded81.png)
格子の数を変えたい場合はここで
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/198123/fc1229c4-3457-a7a4-9723-364e5e504737.png)
新しいスケルトンでそもそもUE4上で新モーションを作れないと思ったらアニムコンポジットをつくれば作成するメニューが表示される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198123/88370673-1669-d117-028f-8138b9dfbc26.png)
プログラミングのための「算術の公理」

# はじめに
　この記事は [N 高等学校プログラミングクラス](https://nnn.ed.jp/commute_course/programming_class/)に向けたものです。

　プログラミングは（論理）数学を電気（回路）で置き換えたものをさらにメモリ上にソフトウェアとして構築したものであるという関係上、数学を上手に使うと有利な場面が出てきます。
　（様々な定理があるものの）算術に関しては最終的には次の公理に帰着すると考えると、少しは気が楽になりませんか？
　算術以外も「突き詰めると」シンプルな形に行き着くことが多いので、急がば回れの精神で順番にたどっていくのはどうでしょうか。

# 算術の公理
　以下、参考文献の 478 ページの補遺 8 からの引用です。

>1: 任意の数、$m,n$ に対して
$m+n=n+m$
および
$mn=nm$
が成り立つ。

----
>2: 任意の数、$m,n,k$ に対して
$(m+n)+k=m+(n+k)$
および
$(mn)k=m(nk)$
が成り立つ。

----
>3: 任意の数、$m,n,k$ に対して
$m(n+k)=mn+mk$
が成り立つ。

----
>4: 数 $0$ が存在し、任意の数 $n$ に対して次の性質を持つ。
$n+0=n$

----
>5: 数 $1$ が存在し、任意の数 $n$ に対して次の性質を持つ。
$n \times 1=n$

----
>6: すべての数 $n$ に対して、次式を満たす数 $k$ が存在する。
$n+k=0$

----
>7: 任意の数、$m,n,k$ に対して、
$k \neq 0$ であり、$kn=km$ ならば、$m=n$ である。

# プログラミングへの適用例
　例えば 3 の性質を利用すると、プログラムの処理速度を上げることが出来ます。次の式の左辺は
$m(n+k)=mn+mk$

* 乗算一回
* 加算一回

となっているのに対し、右辺は

* 乗算二回
* 加算一回

となっています。右辺は演算の回数が一回多くなっている上に、一般的に乗算の方が処理に時間がかかることを考えると、左辺の形の方が有利であることが分かります。式を変形するだけで処理速度を上げられるというのは数学を利用するメリットになるでしょう。

# 参考文献
Simon Singh (原著),「フェルマーの最終定理」，青木 薫(翻訳)，新潮社(2006/5/30)
https://www.amazon.co.jp/dp/4102159711
RDSでDatabaseLinkを作成する時のSQL文

すっかりオンプレ脳、サーバーにOracle入れる脳になっていた自分用メモ…

AWSのRDS(Oracle)から別のOracleデータベース向けにDB LINKを作成する時に
「ORA-12154: TNS: 指定された接続識別子を解決できませんでした」が出て困った。
よく考えたらEC2にTNSNames設定しても意味ないよね、っていう。

なので、RDSへのCreateDatabase文の中に接続情報が必要。
下記の[]内は環境に合わせて要変更。

```SQL:CREATE_DATABASELINK.SQL
CREATE DATABASE LINK [DBLINK-NAME] 
CONNECT TO [SCHEMA-NAME] 
IDENTIFIED BY [SCHEMA-PASSWORD] 
USING 
' ( DESCRIPTION = 
    ( ADDRESS = 
      ( PROTOCOL = TCP )
      ( HOST = [0.0.0.0] )
      ( PORT = [1521] )
    )
    ( CONNECT_DATA =
      ( SID = [SID-NAME] )
    )
  )'
;
```

＃セキュリティグループの設定もお忘れなく。
Sequel Proを使ったMySQLのテーブルデータ追加方法

MacのMySQLクライントソフト[Sequel Pro](https://www.sequelpro.com/)とCSVファイルを使って、DBにテーブルデータを追加するための手順メモです。

GUIでの操作とCSVファイルによる一括データ追加が可能なため、非エンジニアでも登録が容易だったり操作ミスが少なくなるメリットがあります。

# インポートするCSVファイルを用意する
まずはテーブルに追加するデータを埋めたCSVファイルを作成します。1行目にカラム名を入力し、2行目以降に必要なデータを埋めていきます。
<img width="627" alt="スクリーンショット_2018-05-02_19_07_25.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/6380/1e11f825-49ca-d58e-de2b-51176c4be18d.jpeg">

# Sequel ProでCSVファイルをインポートする
Sequel ProでDB接続後、データ追加対象のテーブルを選択。[ファイル] - [インポート] をクリック。
![スクリーンショット 2018-05-02 18.23.45.png](https://qiita-image-store.s3.amazonaws.com/0/6380/60f8914a-c1a1-6db0-2bf4-61d9d7d35e65.png)

事前に用意したCSVファイルを選択します。この時「最初の行にフィールド名を含む」にチェックがついていることを確認しましょう。
![スクリーンショット_2018-05-02_18_24_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/6380/19bf64de-afad-de28-717d-8f261335cdf0.jpeg)

CSVファイル選択後に「開く」をクリックすると追加データのプレビュー参照が出来ます。1ページ目でカラム名の確認。
![スクリーンショット_2018-05-02_18_34_42.jpg](https://qiita-image-store.s3.amazonaws.com/0/6380/f865f31f-e96d-a485-65f9-bab7982fd3ad.jpeg)

2ページ目以降で実際に追加されるデータの確認ができます。
![スクリーンショット_2018-05-02_18_34_53.jpg](https://qiita-image-store.s3.amazonaws.com/0/6380/4507f9f7-0cc3-5bdf-951a-b695d3201285.jpeg)
問題なければ右下の「インポート」をクリックしましょう。

これでテーブルにデータが追加されます。
![スクリーンショット_2018-05-02_18_37_45.jpg](https://qiita-image-store.s3.amazonaws.com/0/6380/3f30b3cf-8c6c-da3d-a267-9e2c307d848e.jpeg)
TypeScript　Node.js を連携して動かしてみた

#TypeScript, Node.js を連携して動かす

**(注意)** TypeScriptもNode.jsも手探りの学習中で、自分用メモです。

- エディタは Visual Studio Codeを使用
- npmコマンドはPowerShellから実行


```PowerShell
PS C:\Users\Taro\Desktop\ws> npm init -y
Wrote to C:\Users\Taro\Desktop\ws\package.json:

{
  "name": "ws",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}


PS C:\Users\Taro\Desktop\ws> tsc --init
message TS6071: Successfully created a tsconfig.json file.
PS C:\Users\Taro\Desktop\ws> npm install -D @types/node
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN ws@1.0.0 No description
npm WARN ws@1.0.0 No repository field.

+ @types/node@10.0.4
added 1 package in 0.586s
```

```TypeScript:index.ts
import * as fs from "fs"
{
fs.readFile("./test.txt",'utf-8',(err,data)=>{
    console.log(data)
})
}
```

```text:test.txt
吾輩は猫である。
名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。
しかしその当時は何という考もなかったから別段恐しいとも思わなかった。
ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。
この時妙なものだと思った感じが今でも残っている。
```

package.jsonのscriptsに、"build": "tsc"を入れる。

```json:package.json
{
  "name": "ws",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "tsc"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@types/node": "^10.0.4"
  }
}

```
tsconfig.json に、
> text
    "lib": ["es2016","dom"],

を追加

```json:tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "lib": ["es2016","dom"],
    "strict": true,
    "esModuleInterop": true
  }
}
```
```PowerShell
PS C:\Users\Taro\Desktop\ws> npm run build

> ws@1.0.0 build C:\Users\Taro\Desktop\ws
> tsc

PS C:\Users\Taro\Desktop\ws> node .\index.js
吾輩は猫である。
名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。
しかしその当時は何という考もなかったから別段恐しいとも思わなかった。
ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。
この時妙なものだと思った感じが今でも残っている。
第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。
その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷ
PS C:\Users\Taro\Desktop\ws>
```

npm install -D @types/node
の-Dオプション(--save-dev)をグローバル -g にするとエラーがでる。


[サンプルのソース](https://github.com/tkarasuma/TypeScript/blob/master/TypeScript%E3%80%80Node.js%20%E3%82%92%E9%80%A3%E6%90%BA%E3%81%97%E3%81%A6%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/ws.zip?raw=true)