OmniAICreator/Qiita-1.07M huggingface dataset:
RaspberryPiを学内Wi-Fiに接続する

#はじめに
この記事は[情報通信システム工学科 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ics2018)の8日目です。

情報通信システム工学科3年のdainbe(@dainbe )です。

昨日は、@kazu1496 がCSS設計について熱く語ってくれましたね。

私はそっち寄りには疎いのでマイコンについて書きます。

#ラズパイを学内wifiにつなぎたいっ!
RaspberryPiで遊んでいると誰しも学内wifiにつなぎたくなることがあると思います。
ありますよね？
そう、あるんですよ

つなぎたくなったことがない人は、つなぎたくなるor見なくて大丈夫です。

我々の大学ではwifiの接続のためにWEB認証しています。めんどくさいですよね。
認証ページのソースを見ると、~~醜い~~見にくいものになってますね!!

##やり方

まずはいつもどうりwifi設定をしていきます。

```wpa_supplicant.conf
network={
        ssid="hogehoge-ap1"
        psk="パスワード"
        priority=1
}
```
でとりあえず接続して

```terminal
sudo nano /etc/rc.local
```
に移動して

```rc.local_
IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

#コ↑コ↓に追記
curl -X POST https://auth.it-chiba.ac.jp/cgi-bin/adeflogin.cgi -d name=自分の学籍番号 -d pass=パスワード -d cmd=authenticate

exit 0
```
を追記してください。
そうすると起動時にPOSTして認証されるはずなので無事に接続することができます。

#おわりに
さらっと書いたので自分のものでしかテストしてませんが、他の人でも接続されれば幸いです。

明日は@tai_4s_cit が無線について話してくれるようなんで心して待ちましょう!

ラズパイはいいゾ
Swap領域作成

AWSなどのクラウドでメモリの少ないサーバを作成した時にSwap領域が作成されて無く、メモリ不足でアプリケーションが停止または起動しない場合があるのでSwap領域の作成方法を記載します。

#作成方法

1.freeコマンドで作成済みか確認する。

```
# free
              total        used        free      shared  buff/cache   available
Mem:         982508       71020      310296         356      601192      737772
Swap:             0           0           0
```

2.ddコマンドでファイルを作成する。countにはtotalメモリと同じサイズのものを設定する。

```
# dd if=/dev/zero of=/swapfile bs=1024 count=982508
982508+0 records in
982508+0 records out
1006088192 bytes (1.0 GB) copied, 5.6524 s, 178 MB/s
```

3.mkswapコマンドで作成したファイルにSwap領域を準備する。

```
# mkswap /swapfile
mkswap: /swapfile: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 959.5 MiB (1006084096 bytes)
no label, UUID=41212cd9-f214-4ace-865d-6bf15f834d77
```

4.swaponコマンドでSwap領域を有効化する。

```
# swapon /swapfile
swapon: /swapfile: insecure permissions 0644, 0600 suggested.
```

5.freeコマンドで作成できたか確認する。

```
# free
              total        used        free      shared  buff/cache   available
Mem:         982508       56892       70332         356      855284      749184
Swap:        982504           0      982504
```

#OSが再起動されたときにも設定を有効化する方法

1.fstabをバックアップする。

```
# cp -a /etc/fstab /etc/fstab.org
```

2./etc/fstabに以下の内容を追記する。

```
swap        /swapfile    swap    defaults        0   0
```

#Swap領域を無効化する方法

1.swapoffコマンドを実行する。

```
# swapoff /swapfile
```
MYSQLで部分一致順にソートして取得

#テーブルから複数の部分一致で取得し、かつ入力された条件順に表示する方法
LIKEがWHERE以降で利用できないっぽかったのでどうしたもんかと思ってたら
ずばりここにあった
[Mysql: Order by like?](https://stackoverflow.com/questions/3609166/mysql-order-by-like)

```php
// 検索ワード複数入力時は入力順に表示する
$words = ['hoge','fuga'];
$order = " ORDER BY CASE ";
$no = 0;
$last = count($words) - 1;
foreach ($words as $word) {
	$order .= " WHEN word LIKE '%".$word."%' THEN ".($no+1);
	if ($last == $no) {
		// 最終処理
		$order .= " END";
	}
	$no++;
}
dump($order);
```

```sql
ORDER BY 
  CASE WHEN word LIKE '%hoge%' THEN 1 
       WHEN word LIKE '%fuga%' THEN 2 END
```
bindしろよとかいろいろあるけど直接SQL発行している分はとりあえずこれで乗り切れそう
docker, docker-composeでMySQLが起動しない

# 原因
**MYSQL_ROOT_PASSWORD** が必須。

# docker編

```
docker run -it --name mysql -d mysql
```

起動しない。

```
docker run -it --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 -d mysql
```

起動します。

# docker-compose編

```
# docker-compose ps

     Name                         Command             State                                  
----------------------------------------------------------------
mysql_1_e6c3b5334932    docker-entrypoint.sh mysqld   Exit 1
```

起動してくれないと困るんじゃが。

```
> docker-compose logs | findstr mysql

Attaching to mysql_1_bff667044a7f, python_1_9815f4b12db2
error: database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
```

Windowsなのでfindstrになっていますが、Linuxならgrepです。

**データベースが初期化されてないしパスワードオプションも指定してない** というエラーでした。

```docker-compose.yml
  mysql:
    image: mysql
    environment:
      MYSQL_DATABASE: dbname
      MYSQL_ROOT_PASSWORD: P@ssw0rd
```

そんな訳で、データベース名とパスワードオプションを指定して無事起動しました。 :tada:
MATLABのBODEが離散と連続で一致しない

現象メモ

連続プラントとそれを離散化したプラントのBODE線図が結構一致しないという問題です。
高周波部分が合わないというのはわかりますが，何故か低周波部分が合わないです。

なにか見落としているのかな。。。

```matlab
sysc = tf([1 2 1 1 2],[1 2 1 2 2 2 1 2 1]);
Tsys = 1000e-6;
sysd = c2d(sysc,Tsys,'tustin');
sysc2t = d2c(sysd,'tustin');
sysc2z = d2c(sysd,'zoh');

figure(1)
bode(sysc,sysd)
legend('c','d')
figure(2)
bode(sysc,sysc2t)
legend('c','c2')
figure(3)
bode(sysc2t,sysc2z)
legend('c2t','c2z')
```
## グラフ
Fig1:青が連続，赤がTustinで離散化したやつ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188863/f61bcb26-bcfb-3955-e2c5-2d47d544b84c.png)

Fig2:青が連続，赤が離散化したプラントを再度d2cで連続に戻したやつ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188863/b3e2dd99-7adf-8042-ced9-30a71d0b1508.png)

Fig3：青がTustinでd2cしたもの，赤がZohでd2cしたもの。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188863/69cd4a3b-18cd-42f0-07b1-57af5008d47a.png)


## 考察
どうもc2dとd2cは逆変換の対応にないらしい（Fig2）。
離散化したプラントをd2cしたもののBode線図と離散プラントのBode線図は似通っているので連続化の処理のせいと思われるがなんでだろう？
CDN版Vue.jsのCDNサーバーが落ちている場合の対策

わけあってCDN版のVue.jsを使ってますが、CDN版 = 他社サーバーの状態に影響を受ける状態となっています。
基本的には大丈夫ですが、万が一止まった場合うちのサービスが動かなくなってしまいます。それの対策をします。

### CDN版を基本的に読み込んで、サーバーが落ちてる場合のみローカルのファイルを読むようにする

ようするにこちらです。この記事を参考にしました。[パブリックCDNからのロードに対して、フォールバックを行う](https://qiita.com/jkr_2255/items/6c195a0de5e3ebaf4ac1)

ただこれはjQueryのパターンで、Vueのwindowグローバルオブジェクトが何かわからないと使えませんね。自分も知らなかったので調べてみます

```html

<script> console.log(window) </script>
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/178351/ed325332-8f99-d1e9-3e4a-752ab4e2d6e3.png)

これですね。 というか、CDN版のVue.jsを使うには `new Vue` と宣言するので Vue という名前のグローバルオブジェクトがあるのは当たり前ですね。この辺の仕組みを理解せず使っていたので勉強になりました。
一応あっているか中身確認します

```html

<script> console.log(window.Vue) </script>
```

![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/178351/1bc90b37-c1ba-5eb1-da6d-1e6101f84016.png)

Vueはコンストラクタだからnewで呼び出せって警告メッセージがあるので、間違いないですね。こいつを真偽値に使います。

```html

<script src="//cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>                                        
<script>window.Vue || document.write('<script src="/hoge/fuga/vue.js"><\/script>')</script>
```

これでフォールバックができました！
macOS を Mojave にアップデートした後にやったこと

macOS を Mojave にアップデートした後、brew を upgrade するまでにやったことを備忘録として残しておきます．

[Command Line Toolsのインストール方法](https://qiita.com/mym/items/8bc079b7d0f5f55c49dc) を参考に Mojave 用 Command Line Tools をインストール

1. [https://developer.apple.com/download/more/](https://developer.apple.com/download/more/) から **Command Line Tools (macOS 10.14) for Xcode 10.1** をダウンロード
2. Xcode の Preferences の Location で Command Line Tools を指定
3. ライセンスの確認（必要なら同意)
```
sudo xcodebuild -license
```

この後、```brew upgrade --cleanup``` を実行
S3パブリックアクセス設定を試してみる

##目的

2018/11/16にS3の公開設定をブロックするパブリックバケットポリシーがリリースされたので試してみます。
https://aws.amazon.com/jp/blogs/aws/amazon-s3-block-public-access-another-layer-of-protection-for-your-accounts-and-buckets/

ACLとバケットポリシーがありますがここでは、バケットポリシーについて記載したいと思います。

バケットポリシーに対する設定項目としては、以下の２つがあります。
・新規のパブリックバケットポリシーをブロックする (推奨)
・バケットにパブリックポリシーがある場合、パブリックアクセスとクロスアカウントアクセスをブロックする (推奨)

####新規のパブリックバケットポリシーをブロックする (推奨)
新規の公開設定の禁止
既存の公開設定はそのまま有効

####バケットにパブリックポリシーがある場合、パブリックアクセスとクロスアカウントアクセスをブロックする (推奨)
既存の公開設計の禁止
新規の公開設定は可能

また、アカウントIDを指定したクロスアカウントアクセスは、パブリックバケットポリシーを有効にしても引き続き可能です。パブリックバケットポリシーは、「"Principal": "*"」な設定が禁止の対象となる。

表にしたものが以下になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/6a4f97fc-5b47-2c2c-c411-b1af44523c26.png)

ちなみに、新規にバケットを作成するとデフォルトすべてTrueになっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/bbea6bd1-8667-2a6f-20c0-dc4940fa3ec6.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/781e373f-bd0f-3b19-e42b-4673041d748f.png)

状況の設定で、バケットポリシーで公開設定しようとすると以下の様なエラーになります。

```json

{
    "Id": "Policy1542641668505",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1542641665444",
            "Action": [
                "s3:getobject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<S3バケット名>/*",
            "Principal": "*"
        }
    ]
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/3dae30d0-c109-4417-488d-63f2c9f37524.png)

###試してみます

####前提
すべての設定がfalseです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/7e46729f-f09c-9c3f-6823-8057357c8d7d.png)

公開設定が可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/5bbbc1c3-bbc8-30b7-5a96-ef76f17ddb0d.png)

ファイルをアップロードしてダウンロードしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/286a178c-fe5c-1723-f8f9-b4a68196d3f3.png)

URLをクリックしてファイルをダウンロードする
→OK

####既存の公開設計の禁止してみる

バケットにパブリックポリシーがある場合、パブリックアクセスとクロスアカウントアクセスをブロックする (推奨)をTrueにする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/524b0f7b-12ae-0316-5025-0fd386fbb84f.png)

ファイルのURLを開くとAccess Deniedになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/9a6e9473-09d4-b2b7-ec25-5d9e44670e1a.png)

####新規の公開設定の禁止してみる
公開設定のバケットポリシーを削除します。
新規のパブリックバケットポリシーをブロックする (推奨)をTrueにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/b0f838f4-186e-bbca-76ba-ff603a55cca5.png)

バケットポリシーで公開設定を使用とするとアクセスが拒否される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/f8d545e2-ed6c-738d-1ce2-15cf58e10144.png)

この状態でクロスアカウント設定する

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Example",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<AWSアカウントID>:root"
            },
            "Action": "s3:getobject",
            "Resource": [
                "arn:aws:s3:::<S3バケット名>*",
                "arn:aws:s3:::<S3バケット名> "
            ]
        }
    ]
}
```

s3 cliでファイルをダウンロードしてみます。

```
$ aws s3 cp s3://<S3バケット名>/test.txt .
download: s3://<S3バケット名>/test.txt to ./test.txt
```

問題なくダウンロードできます。

##約束
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
SQLite3のJSON機能が便利だった

#SQLite3のJSON

　SQLite3.9からJSON関連の機能が追加されたのは[Sqlite 3.9 の Json1を試した](https://qiita.com/smith/items/c0bd002666a23a6fe8e4) で詳しく紹介されている
　今回、Node.jsでプログラミングしている際、データの保存を簡単にできないかと試していたら、SQLiteのJSONが想像以上に便利だったので、その部分を伝えたい

##　1．テーブルの作成
```SQL
create table json_table(name text primary key,value json)
```
　単純なテーブルの作成。データの型をjsonにしているが、SQLiteでは現時点でテキストデータとして保存される

##　2．データの挿入
```SQL
replace into json_table values('aaaa',json_array(1,2,3));
replace into json_table values('bbbb',json_object('あいうえお','ABC'));
replace into json_table values('cccc','{"abcd":123}')
```
　insertではなくreplaceで挿入しているのは、Node.jsからデータを書き換える際に変数のように使用するためだ。他のDBにも上書き挿入はあるが、SQLiteのreplace文が一番扱いが簡単だ

　ちなみにJSONのデータを入力する際は、json_arrayやjson_objectで入れても良いし、文字列の形でもかまわない

##　3．データの抽出

###　　3.1普通にselect
```SQL
select * from json_table
```

|name|value|
|:---|:---|
|aaaa|[1,2,3]|
|bbbb|{"あいうえお":"ABC"}|
|cccc|{"abcd":123}|

　普通にselectすると普通に結果が返ってくる。jsonなので、受け取るときの形式は文字列だ


###　　3.2オブジェクト一つにまとめて抽出
```SQL
select json_group_object(name,json(value)) from json_table
```

|json_group_object(name,json(value))|
|:---|
|{"aaaa":[1,2,3],"bbbb":{"あいうえお":"ABC"},"cccc":{"abcd":123}}|

　今回、無茶苦茶便利だと思った結果がこれだ。json_group_objectを使うと、複数のレコードを1つのJSONオブジェクトとしてまとめてくれる。たったこれだけと思うかもしれない。しかし受け取り側で余計な処理を加えずに、一発でデータを取得できるのはとにかく便利なのだ


###　　3.3配列一つにまとめて抽出
```SQL
select json_group_array(json_object(name,json(value))) from json_table
```
|json_group_array(json_object(name,json(value)))|
|:---|
|[{"aaaa":[1,2,3]},{"bbbb":{"あいうえお":"ABC"}},{"cccc":{"abcd":123}}]|

　複数の結果を配列一つにまとめて返す。これも便利なので、そのうち使うことがあるかもしれない


##　まとめ
　JSONを扱うことに関しては、NoSQL系のDBを選択した方が便利かもしれない。しかしSQL系のDBもJSON機能が当たり前のように使えるようになった現在、後者を使った方が速度と利便性の良いとこ取り出来るのだ。特にJSONと相性の良い言語では、これを使わない手は無いと思う
State space (local level) model by stan

##Library
```python
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

import pystan
```

##Data
```python
path = '...'

m_return = pd.read_csv(path + 'monthly_return.csv')

x = m_return['686480'][-30:].values.astype(float)

plt.figure(figsize = (5, 3))
plt.scatter(range(len(x)), x)
plt.title('686480')
plt.show()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254604/95a9e267-55cd-f2d8-2e2e-4ddedb3a1470.png)

##Model
```python
s_data = {'n': len(x), 'x': x}

s_code = """
  data {
    int n; 
    real x[n]; 
  }
  parameters {
    real mu_zero;      
    real mu[n];   
    real<lower=0> sig_v;  # observation
    real<lower=0> sig_w;  # state
  }
  model {
    # initial state
    mu[1] ~ normal(mu_zero, sqrt(sig_w));  

    # state 
    for(i in 2:n) {
      mu[i] ~ normal(mu[i-1], sqrt(sig_w));
    }

    # observation
    for(i in 1:n) {
      x[i] ~ normal(mu[i], sqrt(sig_v));
    }
  }
"""  

stm = pystan.StanModel(model_code=s_code)

n_itr = 2000
n_warmup = 1000
chains = 3

fit = stm.sampling(data=s_data, iter=n_itr, chains=chains, n_jobs=-1, 
                   warmup=n_warmup, algorithm="NUTS", verbose=False)
```

```python
fit
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254604/f22407ae-0979-43c0-204d-dd70e19e5f41.png)

```python
eap = fit.summary()['summary'][1:31, 0]
lower95 = fit.summary()['summary'][1:31, 3] 
upper95 = fit.summary()['summary'][1:31, 7] 

print ('mean of mu: ')
print (eap)
print ()
print ('2.5% of mu:')
print (lower95)
print ()
print ('97.5% of mu:')
print (upper95)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/254604/93641dc0-a12e-b414-f674-6a137c49f99f.png)

```python
plt.figure(figsize = (5, 3))
plt.scatter(range(len(x)), x, label='actual')
plt.plot(eap, 'r', label='EAP')
plt.plot(lower95, 'b--')
plt.plot(upper95, 'b--')
plt.title('686480')
plt.legend(loc='best')
plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/254604/5e5381b8-c679-cf70-5d32-ef55a577dde9.png)
カスタム投稿タイプを登録する

新しい投稿記事用に、カスタム投稿タイプを登録します

#1. functions.phpに登録します
- 登録したいカスタム投稿タイプをfunctions.phpに追加します

```
//カスタム投稿タイプ
function create_post_type() {
  register_post_type(
    'newtype', //投稿タイプ名
    array(
      'label' => '新しいタイプの投稿',
      'labels' => array(
         'all_items' => '新しいタイプの投稿一覧',
         ),
      'description' => '新しいタイプの投稿の紹介です',
      'public' => true,
      ‘menu_position’ =>5,    
      'has_archive' => true,
      'supports' => array( 
        'title',
        'editor',
        'author',
        'custom-fields',
      ),
    )
  );
}
add_action( 'init', 'create_post_type' );

```
#2. 対応する投稿ページを用意します
- single.phpをコピーして、single-カスタム投稿名.php（上記の例では"single-newtype.php"）を用意します

<img width="235" alt="スクリーンショット 2018-11-20 17.18.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/358f0c58-80af-5294-85f6-f483b0c35cb1.png">


#3. 管理画面から確認します
- 管理画面に新しいメニューが登録され、新たに用意したsingle-カスタム投稿名.phpで新規の投稿が可能になっていることを確認します。

<img width="296" alt="スクリーンショット 2018-11-20 17.19.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/6126c254-864c-b440-1d0c-8d191ab0c7ac.png">
Let’s Encryptの証明書更新の失敗(error: ’ascii’ codec can’t decode ...)への手当

初投稿です。よろしくお願いします。
本題ですが、
運営サイトのletsencryptの証明書更新が失敗していることに気づき、手当したのでその内容を記載します。
#環境
centos 6.10
certbot-auto 0.28.0
#状況
certbot-autoの実行結果で次のエラーがでる。(xxxxxはサイト名）

```
Attempting to renew cert (xxxxx.com) from /etc/letsencrypt/renewal/xxxxx.com.conf produced an unexpected error: 'ascii' codec can't decode byte 0xe8 in position 9: ordinal not in range(128). Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/xxxxx.com/fullchain.pem (failure)
```

#原因分析
これまで調子よく動いていたが、

```
Upgrading certbot-auto 0.27.1 to 0.28.0
```

の後からおかしくなった模様。
いろいろ調べた結果、nginx.confの日本語コメントが処理できなくなった不具合ぽい。
#対策(暫定)
nginx.confとそこから呼び出している*.confのコメントを(置換コマンドを使って)すべて削除。
#結果
無事、認証が更新された。

以上です。
ServiceWorkerの読み込みエラーでハマった

ServiceWorkerを導入時にMIMEtypeのエラーが発生し、なんのこっちゃと思いましたが、.htaccessでAddTypeの指定漏れが原因だった模様。。。

### エラー内容
```
Uncaught (in promise) DOMException: Failed to register a ServiceWorker: The script has an unsupported MIME type ('text/html').
```

### .htaccessに追加した記述
AddType、AddCharsetに.JSを追加。

```
AddType application/javascript .js 
AddCharset utf-8 .js 
```
JavaScript (超個人的)配列操作3種の神器

# はじめに
普段、Reactを書いていることが多いのですがその際によく使っている配列操作関数を紹介したいと思います。
（初歩的な内容かもしれませんがご了承ください。。。）

# ①Array.prototype.filter
[詳しくはこちら](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)

```js
/* 概要 */
// 配列から条件に一致した値を抽出して配列を返す
// ※１．index, array, thisArgは省略可能
// ※２．thisArgはコールバック関数内でthisとして扱う値

/* 使い方 */
const arr = [1,2,3,4,5,6].filter((element, index, array) => {
  console.log(element, index, array);
  return 3 < element;
}, thisArg);
console.log('arr', arr);

/* 結果 */
// (1, 0, [1,2,3,4,5,6])
// (2, 1, [1,2,3,4,5,6])
// (3, 2, [1,2,3,4,5,6])
// (4, 3, [1,2,3,4,5,6])
// (5, 4, [1,2,3,4,5,6])
// (6, 5, [1,2,3,4,5,6])
// (arr, [4,5,6])
```

# ②Array.prototype.map
[詳しくはこちら](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)

```js
/* 概要 */
// forEachとの違いは戻り値があるかどうか
// 配列の各要素で処理して新しい配列を生成する
// ※１．index, array, thisArgは省略可能
// ※２．thisArgはコールバック関数内でthisとして扱う値

/* 使い方 */
const arr = [1,2,3,4].map((currentValue, index, array) => {
  console.log(currentValue, index, array);
  return currentValue * 2;
}, thisArg);
console.log('arr', arr);

/* 結果 */
// (1, 0, [1,2,3,4])
// (2, 1, [1,2,3,4])
// (3, 2, [1,2,3,4])
// (4, 3, [1,2,3,4])
// (arr, [2,4,6,8])
```

# ③Array.prototype.reduce

[詳しくはこちら](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)

```js
/* 概要 */
// アキュムレータと配列の各要素に対して（左から右へ）関数を適用し、単一の値を返す
// ※１．アキュムレータ：コールバックの戻り値を累積
// ※２．currentIndex, array, initialValueは省略可

/* 使い方 */
const initialValue = 10;
const res = [1,2,3,4,5].reduce((accumulator, currentValue, currentIndex, array) => {
  console.log(accumulator, currentValue, currentIndex, array);
  return accumulator + currentValue;
}, initialValue);
console.log(res);

/* 結果 */
// (10,1,0,[1,2,3,4,5])
// (11,2,1,[1,2,3,4,5])
// (13,3,2,[1,2,3,4,5])
// (16,4,3,[1,2,3,4,5])
// (20,5,4,[1,2,3,4,5])
// 25
```

# 処理色々

## 配列を色々加工して配列を返したい時

```jsx

// 例：10掛けした偶数だけを表示するReactコンポーネントを返す
const hoge = () => (
<ul>
{
  [1,2,3,4,5,6].filter(v => v % 2 === 0)
  .map(v => <li>{v*10}</li>)
}
</ul>);

/* 結果 */
// <ul>
//   <li>20</li>
//   <li>40</li>
//   <li>60</li>
// </ul>
```

## 配列から色々と処理し合成した文字列を返したい時

```js
// 例：style(object)を文字列に
const style = {
  color: 'red',
  border: '1px solid black',
  'background-color': 'blue'
}
console.log(
  Object.keys(style).reduce((a, c) => `${a} ${c}: ${style[c]};`, '')
);

/* 結果 */
// color: 'red'; border: 1px solid black; background-color: blue;
```

## オブジェクト操作

~~lodash使え~~

```js
// 例：style(object)から値にredがあるものだけ抽出
const style = {
  color: 'red',
  border: '1px solid red',
  'background-color': 'blue'
}
console.log(
  Object.keys(style)
  .filter(k => style[k].includes('red'))
  .reduce((a, c) => Object.assign(a, {[c]: style[c]}), {})
);

/* 結果 */
// { color: 'red', border: '1px solid red' }

```

# まとめ
上記以外にもJavaScriptの配列操作関数はたくさんありますので[リファレンス](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array)を眺めてみると思わぬ発見があるかもしれません。
自分の場合は割となんでもかんでも配列にしてゴリゴリにやっちゃいますが、それってどうなんだろ？とか思いつつ書いています。
もっとこうした方が良いみたいなのがありましたらご意見くださると幸いです。
【更新中】FI勉強会(総勘定元帳の流れ)

####勘定グループの定義→定义会计科目→指定特殊科目→凭证编号范围

总之是：欲做凭证,必先有科目，欲定义科目,必先有科目组，凭证需要编号，因此指定编号范围。

科目组—account group

定义会计科目时,必须指定科目组,科目组的用途:

- 用哪一个间隔来编号
- 当创建科目主数据时,哪些字段是必须,哪些是可选的
- 当创建科目主数据时,哪些是隐藏

######注意与字段状态组区别：字段状态组是针对录入凭证时的字段项目；而科目组是控制科目主数据的。

#####1.1 勘定グループの定義
勘定グループを使用して以下の制御ができます。

- 勘定コードマスタ登録時に、どの番号範囲を採番するか。

- 勘定コードマスタの登録時および更新時にどの項目を入力待ち、または入力必須にするか。
- ↑　T-cd:OBD4　定義: 勘定グループ
- 勘定コードの長さを決定　
- ↑　T-cd:OB13　更新: 勘定コード表一覧


#####1.2 定义科目组属性
科目组主要有三大类：资产负债类（BSA）、损益类（PLA）、统驭类（RAA），科目组属性分为六大类：科目控制、账户管理、凭证录入、银行/财务明细账、利息计算、合资企业。

######三大类科目组的特征描述：

- 资产负债类科目（BSA），最常见的科目组，一般取自公司科目表，不需要设置统驭科目
- 损益类科目（PLA），在会计科目表中创建损益类科目之前，需要确定损益结转入的留存收益科目。系统设计了一特殊程序将损益类帐户的损益金额自动结转入该科目。因此，必须在系统中定义留存收益科目的号码。每一个损益类科目都需要分配给一个留存收益科目。
- 统驭类科目（RAA），分为三类：供应商类别(K)、客户类别(D)、固定资产类别(A)，主要是针对应收账款、应付账款、固定资产等模块过入的金额，他们的交易是不通过总账模块进行的，但在各自模块完成的同时，会将相应的金额过入总账。

下面是对上述三个组的设置的总结

| 帐户组       |       统驭科目|    字段状态组|末清项管理|
|:---------|:------------|:-------------|:------------|
| BSA-资产负债类      |隐|必须|可选|
| PLA-损益类          |可选|必须|隐|
| RAA-统驭科目        |必须|必须|可选|

常见的几个字段状态变式的概念：

| 字段名称       |       字段解释涵义|
|:---------|:------------|
| 未清项目管理|主要是用于须清账的科目，如GR／IR，银行的过渡科目、工资的清算等。激活了未清项目管理，必须同时激活行项目显示的功能，但在总账主数据的设置中，应收、应付、固定资产等是不能激活未清项目管理及行项目显示功能。未清项管理指一个帐户的项目可被该帐户的其他项目结清或核销掉。在清帐或核销过程中涉及到的项目的合计金额必定为零。因此该帐户的余额总是等于未清掉的项目的合计金额。|
|行项目显示          |设置此项时，系统会有向下挖掘(Drilldown)的功能，当我们在查看总账的某个科目时，若对某金额有怀疑，可将鼠标对准该金额连续点击两下，系统可显示明细账的金额，再对准明细账的金额连续点击两下，系统会显示某凭证的金额。|
| 允许自动记账        |选择该字段表示该总账科目必须由其他模块自动过入，不用手工输入凭证，如销售收入一购销，因为该总账科目是在销售及分销模块完成“出具发票”功能时自动产生的，所以仅允许自动过账。|
| 排序码|在会计凭证的供应商行项目中，系统对‘定位’字段的缺省值。也决定供应商行项目的排列顺序。如果该供应商主要发生与采购订单有关的业务，一般选择014-采购订单号+行项目号，其它情况选择记帐日期+凭证号。|

#####1.3 创建会计科目
创建会计科目主要有三种方法：1，通过【FSP0】在科目表中创建，需要制定帐目表和科目组；2，通过【FSS0】在公司代码中创建，需要指定控制数据和银行利息；3，通过【FS00】集中创建，即集中设置上述两个屏幕的字段页签信息。
1.     统驭科目(AR/AP)

这也是创建一些总账会计科目。不同的是这些科目，如应收帐和应付账款会有相应的明细分类账模块。如客户账户，供应商账户。业务入账只能记入这些明细分类账中，通过集成自动更新总账，而不能直接记入总账。这样杜绝了明细分类账和总账不付的情况发生。这些总账科目就为统驭科目

2.     材料采购科目（GR/IR）

材料采购科目由于存在 –收货/收票时间点上的不一致性,导致出现”末清”的情形出现。为了反应过两个分离的点(收货/收标),常采用一个过渡科目—材料采购,而这个科目需要”逐笔逐清”，也叫做GR/IR(收货/收票)。

在收货时系统自动生成会计凭证。借:库存贷:材料采购.

收货时:Dr:库存  Cr: 材料采购-GR/IR

而收发票时，系统也自动生成会计凭证。借:材料采购，贷:应付账款.

收票时:Dr:材料采购-GR/IR  Cr:应付帐款

两边的"材料采购"凭证行相互匹配的过程叫"清账"，对上的叫"已清项"，对不上的叫"未清项"，未清项反映了货或者发票有一方未到。这是个风险点，其他需要用"清账"来管理的科目大多是一些中间过渡科目，如银行未达科目。或者是反映债权债务(但又不用应付应收模块管理)科目，如长期借款。客户和供应商明细账就是采用清账来管理的。

3.     损益类科目

损益类科目的特点是在做年结的时候，损益类科目的年末余额会结转到"未分配利润"(或者本年利润)科目的年初余额。而他们自己的年初余额清为0。

会计科目的小结

ü  科目组一般定义以下三类:BSA、RRA、PLA。

ü  科目组用于定义会计科目的主数据,作用于帐户表中。

ü  字段状态变式一般定义以下几类:

GBS-一般资产负债类

EXP—一般费用类

REV-收入

MMA—物料采购 (需要清帐管理)

RRA—应收应付科目

ü  它用于录入会计凭证时对凭证项目的控制,作用于公司代码级。

ü  科目组中可以强制是否必须录入FSV(字段状态变式)

#####1.4 指定特殊科目
留存收益科目（Retained earning account）

年终结帐时,会将PL科目余额过帐至留存收益科目. 你可以为每一个科目表定义一个或多个此类型的科目.

通过【OB53】，指定损益表科目类型和账户

类型为X类型（系统固定，不能修改），指定的科目依赖于你定义的科目。

自动税务科目

定义不同的税类型的记帐科目,以便自动记帐(税务)，常见的要记帐的税类型有:MWS—销项税，

VST—进项税

通过【OB40】，指定自动税务科目和过账码。

[FROM:　CSDN](https://blog.csdn.net/qq_42127511/article/details/80578504)
SoftEtherサーバー構築(memo)

```
1. タイムゾーン修正
sudo timedatectl set-timezone Asia/Tokyo

2. パッケージ最新化
sudo yum -y update

3. 必要なパッケージをインストール
sudo yum -y install git gcc

※　ソースをダウンロード

1. 解凍
cd ~/
curl -L -O   https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.28-9669-beta/softether-vpnserver-v4.28-9669-beta-2018.09.11-linux-x64-64bit.tar.gz
tar zxvf softether-vpnserver-v4.28-9669-beta-2018.09.11-linux-x64-64bit.tar.gz
cd vpnserver

2. ビルド
yes 1 | make
cd ..


1. 設置場所を移動
sudo mv vpnserver /opt/vpnserver

2. systemd用の起動ファイルを作成
sudo vi /etc/systemd/system/vpnserver.service

[Unit]
Description=Softether VPN Server Service
After=network.target
 
[Service]
Type=forking
User=root
ExecStart=/opt/vpnserver/vpnserver start
ExecStop=/opt/vpnserver/vpnserver stop
Restart=on-abort
WorkingDirectory=/opt/vpnserver/
ExecStartPre=/sbin/ip link set dev eth0 promisc on
 
[Install]
WantedBy=multi-user.target

3. パーミッション変更
sudo chmod 755 /etc/systemd/system/vpnserver.service

4. 起動ファイルを読み込み
sudo systemctl daemon-reload

5. SoftEtherを起動
sudo systemctl start vpnserver

6. SoftEtherの自動起動を設定
sudo systemctl enable vpnserver
React-Navigation v3の変更点

React-navigationで今までできていたものがエラーで返ってきてしまった、、、


[React-Navigatorを利用してみる（基礎編）](https://qiita.com/zaburo/items/5b69a65db1b4d181896a#screenssingle2js)
ーStack Navigatorの実装のところでハマりました。

##エラー内容
>Invariant Violation: The navigation prop is missing for this navigator. In react-navigation 3 youmust set up your app container directly. More info: https://reactnavigation.org/docs/en/app-containers.html

エラー内容でググってみると、同じような人が！！
https://stackoverflow.com/questions/53367195/invariant-violation-the-navigation-prop-is-missing-for-this-navigator

そして、[React-Navigation.org](https://reactnavigation.org/docs/en/app-containers.html) にも記載がありました。

>Note: In v2 and earlier, the containers in React Navigation are automatically provided by the create*Navigator functions. As of v3, you are required to use the container directly. In v3 we also renamed createNavigationContainer to createAppContainer.

どうやら、v2ではcreate*Navigator関数を書くことで、勝手にコンテナの中に入れてくれていたみたい。
v3は自分でコンテナに入れる必要があるとのこと。


###修正前コード

```diff:App.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { createStackNavigator, createBottomTabNavigator, createDrawerNavigator } from 'react-navigation';

//import creens
import Single1 from './screens/Single1';
import Single2 from './screens/Single2';
import Stack1 from './screens/Stack1';
import Stack2 from './screens/Stack2';
import Tab1 from './screens/Tab1';
import Tab2 from './screens/Tab2';

//stack
const Stack = createStackNavigator(
  {
    Stack1: { screen: Stack1 },
    Stack2: { screen: Stack2 },
  },
  {
    initialRouteName: 'Stack1'
  }
);

export default class App extends React.Component {
  render() {
    return (
      <Stack />
    );
  }
}

```

###修正後コード

```diff:App.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
+ import { createStackNavigator, createBottomTabNavigator, createDrawerNavigator,createAppContainer } from 'react-navigation';

//import creens
import Single1 from './screens/Single1';
import Single2 from './screens/Single2';
import Stack1 from './screens/Stack1';
import Stack2 from './screens/Stack2';
import Tab1 from './screens/Tab1';
import Tab2 from './screens/Tab2';


const Stack = createStackNavigator(
  {
    Stack1: { screen: Stack1 },
    Stack2: { screen: Stack2 },
  },
  {
    initialRouteName: 'Stack1'
  }
);

+ const AppContainer = createAppContainer(Stack);


export default class App extends React.Component {
  render() {
    return (
+      <AppContainer 
+      ref={nav => {
+        this.navigator = nav;
+      }}
+      />
    );
  }
}

```

無事表示されました。

<img width="393" alt="スクリーンショット 2018-11-20 16.24.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/252667/3785657a-0918-f830-68c5-7082a4194d85.png">
Mac Mojaveで常に半角スペースにする

私の環境ではGoogle日本語入力なのでその環境での方法を説明しますが、他の入力機能でも大体同じような方法で可能だと思います。

## 方法

画面上部にあるIMEのアイコンをクリックします。
 
<img width="93" alt="スクリーンショット 2018-11-20 16.11.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/191025/55afe2b8-775e-6c6a-3bd9-df22a6fa8571.png">


開いたウィンドウに環境設定がありますので、それをクリックします。

<img width="247" alt="スクリーンショット 2018-11-20 16.11.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/191025/237b33ba-8679-19c9-5d6c-91474e0f86f6.png">

環境設定に**「スペースの入力」**という項目があるので、**「半角」**を選択します。

<img width="525" alt="スクリーンショット 2018-11-20 16.11.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/191025/81c75269-5a63-0657-178c-c22779fc22cd.png">

半角を選択している状態で全角スペースを入力したい場合は**Shift+Space**で入力できます。
あとは**「OK」**を押せば完了です。
AWS LightsailでWordpress起動したときにいつもしていること



AWS LightsailでWordpress起動後、画面右下のロゴを消す方法がいつもわからなくなる。
また、Wordpressのログインパスワードがわからなくなる。それぞれ、やり方をメモ。

### 起動時に右下にbitnamiのロゴが出るので削除する

```
$ sudo /opt/bitnami/apps/wordpress/bnconfig --disable_banner 1
```

### Wordpressのログインパスワードの確認

```
$ cat bitnami_application_password
```
### Wordpressにuserでログイン後にすること
- Adminのユーザーアカウントを追加して再ログイン、デフォルトのuserアカウントは消してしまう
- General Settingsで言語設定、タイムゾーン、Date Formatを変更
- パーマリンク設定にて、カスタム構造を選んで、「/%category%/%postname%/」を設定する

### 独自ドメインの設定
独自ドメインを設定するときは以下。コンソールでログイン後、wp-config.phpを編集。

```
$ vim /opt/bitnami/apps/wordpress/htdocs/wp-config.php
```
WP_SITEURL、WP_HOMEをコメントアウトして、２行を追加。

```
//define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/');
//define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST'] . '/');

define('WP_SITEURL', 'http://自分のドメイン/');
define('WP_HOME', 'http://自分のドメイン/');
```

### Apache再起動
```
$ sudo /etc/init.d/bitnami restart apache
```
iPhoneでクリックしても動かない場合の対処法

PCでテストしても問題なく、android,iPhoneでテストを行った時にiPhoneだけ動かなかったのでその時の解決方法です。

jsで以下の処理をしようとしたのですが、iPhoneだけ動きませんでした。

	$(document).on("click",'[id*="hogehoge"]',function(){
		// 処理
	}
原因はiPhoneでaタグ以外の動作を認識してくれないみたいです。

	.hogehoge{
	cursor: pointer;
	}
上記のようにカーソルを設定すると認識してくれるようになります。
よく使うGit関連コマンド

# 概要

備忘録

# :pen_ballpoint: 備忘録

* gitは黒い画面で操作してる想定
* リモートリポジトリ利用してる想定

### 初級

```sh
git init
git add .
git commit -m '当たり前体操'
```

#### 作業を始める時

```sh
git checkout -b feature/work-name origin/master
```

#### 作業を終える時

```sh
git add [作業ファイル]
git commit -m 'おわたん'
git push origin feature/work-name
# そしてプルリク作成
```

# 中級

#### リモートのブランチリストの状況をローカルに反映させる

```sh
git fetch --prune
```

#### リモートでコンフリクトしてプルリクがマージできないと怒られたとき

```sh
git fetch
git branch -la # 対象のプルリクのブランチを確認
git merge remotes/origin/feature/conflict-something
# そして手元のエディタでコンフリクトを修正し、コミットしてプッシュ
```

#### ブランチ名変更

```sh
git branch -m <古いブランチ名> <新しいブランチ名>

# 現在いるブランチのリネーム
git branch -m <新しいブランチ名>
```

## develop運用

masterは公開用、開発はdevelopブランチで行いたいときに使いそうなコマンド

```sh
# プッシュするとき
git push origin develop
# ※リモートのdevelopに変更があるときにはプルでマージしてから
git pull origin develop
```

## グローバルでgitignoreしたいとき

```sh
# グローバル設定の有効化
git config --global core.excludesfile ~/.gitignore_global

# 設定を追加 .DS_Store などいれとく
vi ~/.gitignore_global
```
goの継承の仕組みを試してみて

ちょっとgoはモックが一筋縄では以下なさそう（特に既存のパッケージをモックしたい場合）なので、その解決策をひねり出すべく、一旦継承の仕組みについて調べてみたのでまとめ。
やっぱり自分が覚えるのは書くのが一番なので。。。

## main.go

```go
package main

import (
	"fmt"
	"time"
)

/*
User という構造体を定義する。
これがオブジェクトの基本になるイメージ。
*/
type User struct {
	Name string
}

/*
funcで始まるが、これはメソッドであり関数とは違うもの。
宣言のイメージ的に、第一引数のUserに対して、Nowというメソッドを
使えるようにしてあげますよ・・・という感じになる。
*/
func (u User) Now() time.Time {
	fmt.Println("User::Now() has called")
	return time.Now()
}

/*
ChikokuUser (遅刻ユーザー) という構造体を定義する。
これは継承先のオブジェクトの基本になるイメージ。
一応 ExtParam というものを追加で持っている。
*/
type ChikokuUser struct {
	User
	ExtParam string
}

/*
ChikokuUser の Now をオーバーライドする。
同じように ChikokuUser 構造体に対して同名のメソッドを追加し、
事実上のオーバーライドをしている。
*/
func (cu ChikokuUser) Now() time.Time {
	fmt.Println("ChikokuUser::Now() has called")
	n := time.Now()
	// 俺的にはまだ5時間余裕がある。なので遅刻する。
	n = n.Add(-5 * time.Hour)
	return n
}

func main() {
	// 遅刻ユーザーを宣言する。第一引数はUser構造体で、第二引数が文字列(->ExtParamになる)
	cu := ChikokuUser{User{"keiichi"}, "this is ext param"}
	fmt.Println(cu.ExtParam) // --> ExtParamである "this is ext param" が表示される

	oretekiNow := cu.Now() // --> 俺的Nowは5時間前。overrideされた ChikokuUser::Now() が呼ばれる
	layout := "2006-01-02 15:04:05 MST"
	fmt.Println(oretekiNow.Format(layout)) // --> 整形して表示
}

```

実際に実行するとこうなる。

```bash
% date ; go run main.go
Tue Nov 20 16:14:31 JST 2018
this is ext param
ChikokuUser::Now() has called
2018-11-20 11:14:31 JST <-- 5時間前の時刻になっている
```
もし、この状態で、 `func (cu ChikokuUser) Now() time.Time` のブロックだけをコメントアウトした上（オーバーライド解除）で実行するとこうなる。

```bash
% date ; go run main.go
Tue Nov 20 16:14:11 JST 2018
this is ext param
User::Now() has called
2018-11-20 16:14:12 JST <-- ちゃんと今の時刻
```

とりあえずオーバーライドは成功していたということになるのではないかと。

まずgoを覚えていて最初に理解が出来てなかったのは、 `関数` と `メソッド` が違うものであるということ。
オブジェクト指向ではないため、構造体にメソッドを埋め込む様なイメージで宣言する感じ。
イメージ的にPerlのblessに近い感じがした。

大筋はコード中のコメント参照。具体的には継承先のstruct側で同名メソッドを定義することで事実上オーバーライドをしている。

pythonでいうsuperとかしたい場合はどうするといいのかな・・・とは思っているが今は触れないでおく。

これで、既存のパッケージを使いつつ、引数をうまいことinterface化できればいけるのではないか・・・頭では考えているが、そう上手くいくかどうかは次回また考える。

## 追記

```go
oretekiNow := cu.User.Now()
```

のようにすると、Python でいう `super.Now()` 的に呼び出すことが出来るそうです。

※ zetamatta さんありがとうございます。
【SQL】カラムの文字列が部分的に一致するレコードを検索

#サンプルテーブル

| Column1          |Column2          |
|:-----------------|-----------------|
| ABCDEFG          |This             |
| ACCDEEE          |column           |
| ABCDEFH          |will             |
| ABCXYXZ          |be               |
| ZBCDEFZ          |left             |

テーブル内の Column1 にある文字列の部分的に一致するレコードを抽出
例えば、 
・先頭から ABCDEF まで一致するレコード
・２文字目から BCDEまで一致するレコード
の事です

# 先頭からABCDEFまで一致 SQL
```SQL:substring.sql
SELECT
    s.*
FROM
    sample s
WHERE
    SUBSTRING(s.Column1,1,6) IN (
    SELECT
        SUBSTRING(s2.Column1,1,6) c1
    FROM
        sample s2
    GROUP BY
        SUBSTRING(s2.Column1,1,6)
    HAVING
        COUNT(c1) > 1
    );
```
一度 GROUP BY で一致するレコードを抽出してからデータを検索

| Column1          |Column2          |
|:-----------------|-----------------|
| ABCDEFG          |This             |
| ABCDEFH          |will             |

# ２文字目から BCDEまで一致 SQL
```SQL:substring2.sql
SELECT
    s.*
FROM
    sample s
WHERE
    SUBSTRING(s.Column1,2,4) IN (
    SELECT
        SUBSTRING(s2.Column1,2,4) c1
    FROM
        sample s2
    GROUP BY
        SUBSTRING(s2.Column1,2,4)
    HAVING
        COUNT(c1) > 1
    );
```

| Column1          |Column2          |
|:-----------------|-----------------|
| ABCDEFG          |This             |
| ABCDEFH          |will             |
| ZBCDEFZ          |left             |

SQLも奥が深いですね・・・
spring boot アクセス認可 RESTful API

## 概要
特定のURLにアクセスするために必要な権限を設定する

## 環境
JDK 1.8.0_144
spring-boot 1.5.10
spring-security 4.2.4

## 前提条件
ログイン時などにあらかじめ権限情報は取得しておく。(今回はそこじゃないので)
今回はすでにADMIN権限を取得できることが前提。

## 実装する箇所
- SecurityConfig
- Controllerメソッド

## 実装
- SecurityConfig

```java
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //...
}
```
すでにある(あるよね？)SecurityConfigクラスにアノテーション
`@EnableGlobalMethodSecurity(prePostEnabled = true)`
を追加する。

- Controllerメソッド

```java
@PreAuthorize("hasAuthority('ADMIN')")
//Controller
public void sampleAuth() {
    //…
}
```
アノテーション
`@PreAuthorize("hasAuthority('ADMIN')")`
を追加すると、このControllerメソッドには"ADMIN"権限を持つユーザーのみがアクセスできるようになる。

## @PreAuthorizeの特性
式が利用できる
例えば、[ADMIN] と [MEMBER] という権限を持つユーザーのリクエストのみを認可したい場合
@PreAuthorize("hasAuthority('ADMIN OR hasAuthority('MEMBER')")
という使い方ができる。これ以外にも [AND] [OR] [NOT(!)] などが使用できる。
ツールまとめ

##ツールまとめ

開発に必要だったものや自分が使って便利だったツールまとめ。

###テキストエディタ
  1. サクラエディタ
  1. Sublime Text
  1. Visual Studio Code (plantUML用)
  2. Atom (Sphinx用)

###統合開発環境(IDE)
  1. Eclipse
  1. Visual Studio
  1. Spring Tool Suite  
       参考: https://qiita.com/segur/items/4cd283d9763a1953f336
  1. IntelliJ

###SSH接続
  1. Tera Term  
     → Vagrantで使うとき  

    ```
     vagrant plugin install vagrant-teraterm
    ```    


     参考 : https://blog.pg1x.com/2015/10/31/20151031233246/
  1. RLogin

###圧縮・解凍ツール
  1. 7zip

###その他
  1. QTTab bar
  2. A5M2 (テーブル設計作成)
Maven [ERROR] ブートストラップ・クラスパスが-source 1.7と一緒に設定されていません

# Maven install エラー

パッケージをいじった後などに、以下のようなエラーが出た場合。pom.xmlを修正することで改善できる。

>[ERROR] ブートストラップ・クラスパスが-source 1.6と一緒に設定されていません

###修正前
```pom.xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <compilerArgument>-Xlint:all</compilerArgument>
        <showWarnings>true</showWarnings>
        <showDeprecation>true</showDeprecation>
    </configuration>
</plugin>
```

上記の中で、「1.6」となってる部分2か所を、ビルドパスに設定してある JREシステム・ライブラリーのバージョンと合わせる（1.8など）。

###修正後
```pom.xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <compilerArgument>-Xlint:all</compilerArgument>
        <showWarnings>true</showWarnings>
        <showDeprecation>true</showDeprecation>
    </configuration>
</plugin>
```
【SE】若い社会人向けの持つべきスキル①ー要件定義

【はじめに】
皆さん、こんにちは。いつもの外人です。久しぶりに戻って来ました。今回はAIや機械学習とは少し離れて社会人もしくはSEとして持つべきのスキルを共有していきたいと思います。今回のテーマは<b>要件定義</b>です。ちなみに筆者はSE2年目でございます。（笑）

##概要
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309361/c61dc954-a7e3-7c72-4b96-34b7e3350a08.png)
SEの皆さんがよく知っているV字モデルです。開発においてこの流れはとても大事です。実際筆者がある企業でやる際いきなりコーディング＆実装でしたのですごく困りました。

##要件定義とは
システム開発において要件定義とはどういった機能を持つシステムをいつまでに、どういったスケジュールで作っていき、いつ納品するのかを<b>顧客</b>と<b>システム開発側</b>で合意することです。その合意の内容をまとめたものが<b>要件定義書</b>となります。
つまり、要件定義は顧客が<b>何が</b>必要なのかを定義する段階でそれを<b>どのように</b>実現するのかは後の工程の話になります。

##要件定義の工程で必要な観点
<b>1.業務のフローの把握</b>
実際定義する前に顧客の業務フローに何か問題はないのか、営業ツールはできているのかなどをある程度可視化する<b>業務フロー図</b>を作ります。そういったフロー図を基づいて最終的にどういったシステムを作ろうかを設定します。
これで既存のシステムの対応が可能になったり、新たなシステムを開発しなくてもいい状況になったりします。

<b>2.ヒアリング</b>
打ち合わせの際にどれぐらい顧客の要求、要件を正確に理解しているのかによって<b>ドキュメント</b>の<b>正確度（品質）</b>にも影響があります。単に顧客の要件を<b>理解することだけではなく</b>その要件が今回作ろうとするシステムに必要なのか、提案した予算より低い金額でもっと立派なシステムが出来上がるのか、納期の時間が縮小できるのか、などこういった状況をきちんと共有することによって顧客側はもっと喜んでいるはずです。

<b>3.スケジュールの設定</b>
世の中のすべてのプロジェクトはこのスケジュールが大切です。いつかのうきなのかを確認し、各フェーズにどれぐらいの日数が必要なのか、などこの全体で来なマスタースケジュールがないとプロジェクトが失敗になる原因の一つになります。

<b>4.ドキュメント</b>
どのドキュメントも同じだと思うんですが、やはり<b>ドキュメントってそれを書いた人だけが見ることではないので誰が見ても筆者が理解した意味で理解できるドキュメント</b>が完成度が高いドキュメントだと思います。プロジェクトって機関に関係なく事情が変わるのでいきなり新しい人が入っても混乱が発生しないようにすることがドキュメントのぞんざい理由だと僕は思っています。

##まとめ
<b>簡単な書類作成だと思うけどそんなに重要なの？</b>と思っている方がもしいらっしゃいましたら<b>その考えは綺麗に手に持って燃えるゴミに捨てて下さい</b>。ただの書類が今後のプロジェクトの未来を決めます。それほどどのプロジェクトにも最初の段階はとても重要です。

【まとめ】
今回も足りない知識で何かを書きましたね。いつも思っている通りこの記事が皆さんに少しでも役に立つとそれで筆者を幸いです。もちろん何か間違えた部分があったら是非是非コメント残して下さい。見ますんで。ではでは、またお会いしましょう。
Vue.jsプロジェクトをサブディレクトリで配信するときの注意点

# はじめに
この記事は以下の説明をしているものです。

- vue-cliでビルドした静的ファイルを配信する方法(Nginx)
- vue-cliでビルドした静的ファイルをサブディレクトリで配信する方法(Nginx)

## 環境
- vue 2.5.17
- vue-cli 3.1.1

# vue.js (vue-cli) でビルドした静的ファイルをnginxで配信する

vue-cliはハッシュモードとヒストリーモードを設定できます。
デフォルトはハッシュモードであり、vue-cliでプロジェクトを作るとデフォルトではURLが https://example.or.jp/#/ のように勝手に#がついているのが分かります。
URLが変化したときにブラウザのリロードにもしっかり対応してくれるのでラクなのですが、見た目があまりよろしくないのでヒストリーモードにします。
しかし、ヒストリーモードではvue-cliで作った静的ファイルを配信するnginxなどのウェブサーバーアプリケーションの設定をしっかり行わないとassetを一切読み込んでくれなくなったりします。
その設定が以下です。

```nginx
server {
  listen 80;
  server_name example.or.jp;
  return 301 https://$host$request_uri;
}
server {
  listen 443 ssl http2;
  server_name example.or.jp;
  root /var/apps/example.or.jp/dist;
  ssl_certificate /etc/letsencrypt/live/example.or.jp/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.or.jp/privkey.pem;

  location / {
    try_files $uri $uri/ /index.html;
  }
  location /favicon.ico {
    root /var/apps/example.or.jp/static;
  }
}
```

httpsへのリダイレクトをしたくない場合は適宜省略していただいて、location / ディレクティブのように設定してしまえば問題ありません。

[HTML5 History モード](https://router.vuejs.org/ja/guide/essentials/history-mode.html)にも記載があります。

# サブディレクトリで配信

APIとViewが別アプリケーションなのに同じドメインで動かそうとする場合、注意が必要です。
ここでは、
View: https://example.or.jp/aaa/view/....
API: https://example.or.jp/aaa/[view以外]

で使い分けるようにします。また、APIはRails、unicornで作っているとします。
locationディレクティブだけピックアップすると以下のようになります。

```nginx
location / {
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Client-IP $remote_addr;
  proxy_set_header X-Forwarded-For $remote_addr;
  proxy_pass http://new-example-http;
}
location ~ ^/aaa/view/(.+\..+$) {
  alias /var/apps/example.or.jp/dist/$1;
}
location ~ ^/aaa/view/(.+) {
  alias /var/apps/example.or.jp/dist/;
  try_files $uri $uri/ /index.html = 404;
}
```

正規表現で書かれたlocationがまず優先されて、合致しなかった場合location / に到達します。
'/var/apps/example.or.jp/dist/'がvue-cliでビルドしたファイルのindexが置かれている場所です。
location / の中のproxy_passはunicornの設定によるもので、upstreamに任意につける名前です。
/aaa/view/(.+\..+$)は、.を含むファイル(aaa.pngやhoge.textなど)を表し、静的ファイルにも対応できるようにします。

本来は/aaa/view/(.+\..+$)と/aaa/view/(.+)で分ける必要ないと思われますが、ファイルを見に行こうとしているのかvue-routerにリクエストを渡そうとしているのか区別を付ける必要があります。

※https://example.or.jp/aaa/view （末尾のスラッシュ無し）はAPIの方に行ってしまうので、もしそれがまずい場合は別の対応を取る必要があります。~ ^/aaa/view(.+)ではうまく動きませんでした。


# vue-cli側の対応
アプリ側でもbase urlを設定する必要があります。
以下はrouter.jsの例です。

```js
export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/list/:roman_name',
      name: 'index',
      component: Index
    },
    {
      path: '/:id',
      name: 'show',
      component: () => import('./views/Show.vue')
    }
  ]
})
```

process.env.BASE_URLを変える必要があります。
ルート (package.jsonがあるところと同じ階層) に vue.config.js というファイルを作り以下のように記述します。

```js
module.exports = {
  baseUrl: '/aaa/view',
}
```


# 最後に
Nginx力がそんなに高くないのでもっと良い記述方法があるかもしれません。
何かありましたらコメントでご教授してくださると幸いです。
Android 5.0 Lolipop で電池残量をエミュレートする

備忘録的

Pieまで進んでいるのに今更Lolipopの話でとても恐縮ですが，ACアダプタの接続状態などを実機でエミュレーションしたかったのです．
しかし，出てくる情報はAndroid 6で実装された `adb shell dumpsys battery unplug` のコマンド
Lolipopでもこのコマンドが欲しい！

# Lolipop

`adb shell dumpsys battery set` とするとヘルプを出してくれますが

```
⋊> ~ adb shell dumpsys battery set                                      14:49:32
Dump current battery state, or:
  set [ac|usb|wireless|status|level|invalid] <value>
  reset
```

具体的にどんな値をセットするのかよく分かりません．
が，すべて int値でした． 
`adb shell dumpsys battery` とすると，`AC powered: false` とか表示されるので `true/false` かと思ったのですが…

（なお，invalidだけなんの値かよくわからない）

## コマンド

`adb shell dumpsys battery set ac 0` --> AC給電を切る
`adb shell dumpsys battery set usb 0` --> USB給電を切る
`adb shell dumpsys battery set wireless 0` --> ワイヤレス給電を切る
`adb shell dumpsys battery set status 0` --> OSの認識する給電状態をOFFにする

`adb shell dumpsys battery set level 50` --> OSの認識するバッテリー残量を50%にする

実際に給電しながら，表示上の給電だけをOFFにすることもできます（たぶん）．（ac/usb/wireless 1, status 0の場合）

## reset（通常に戻る）

`adb shell dumpsys battery reset`
sshをちゃんと理解する

私は、環境構築やコマンド操作が苦手です。
いつもコピペでなんとかしのいできました。
わからない時には近くに座っているエンジニアに解決してもらっていました。
が、いよいよそんな甘えたこと言ってられなくなってきたので、ふわっとをなるべくなくそうと、インフラの勉強をし直しています。
まず手始めに`SSH`について。

※私が理解している単語や仕組みの解説は飛ばしているので、初心者の方はよくわからない単語がでてきたら、しっかり調べてみてください。

## 参考

[SSHとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word11722.html)
[はじめてのssh](http://iatlex.com/linux/ssh)
[TCP/IP - Telnet / SSH](https://www.infraexpert.com/study/tcpip19.html)
[SSHの仕組み!ぼんやりとした理解だったものをすっきりさせようの会](http://nigohiroki.hatenablog.com/entry/2013/08/18/221434)
[SSHなるものをよくわからずに使っている人のための手引書](https://qiita.com/kenju/items/b09199c4b3e7203a2867)

## SSHとは

いろいろみて、すごく分かりやすかったのはこれ

**SSHとは、パワーアップしたTelnetのこと。**
Telnetとは、ネットワークに接続された機器を **遠隔操作** するために使用するアプリケーション層プロトコルのこと。
何がパワーアップしたのかというと、通信途中のすべての情報を **暗号化** する。


SSHとは、「Secure SHell」の略。
その名のとおり、セキュアな（安全な）シェル。
セキュアとは、通信内容をすべて暗号化しているので、もし通信途中で見られてしまっても、問題ないということ。

### まとめます。

一言でいうと、**通信内容を暗号化して、遠隔操作するよ！**ってこと。

これが、

> SSHとは、安全な通信プロトコルです。

みたいな感じでいろいろなところで説明されており、この言葉だけをみると、今ひとつピンとこないって思っていました。

#### おまけ（軽く）

どうやってセキュアにするかというと、パスワード認証か公開鍵認証の方法を使う。

パスワード認証とは、一般的なパスワードと同じで、予め合言葉を決めておき、正しい合言葉を唱えれば開きます。
つまりは、暗号化するときも、暗号化を解くときも同じパスワードを使います。
パスワード認証の問題点は、じゃあ、そのパスワードはどうやって渡すの？ってことです。
パスワードを送るときも、パスワードを設定する？じゃあそのパスワードはまた別のパスワードで・・・？
パスワードを暗号化せずに渡すのであれば、そもそも遠隔操作にパスワードはあまり意味がありません。

公開鍵認証とは、公開鍵という鍵をかける鍵と、秘密鍵という鍵を開ける鍵の2つでセットになっています。
特徴は、公開鍵でかけた暗号化を、公開鍵を使って解くことはとても困難であるということです。
秘密鍵を使えばすぐに解けます。
文字通り、公開鍵は見られても安全なので、誰でも見ることができるように公開し、秘密鍵は秘密にしておきます。

お分かりのように、ほとんどで公開鍵認証が使われています。


## SSHとSSL

そして、もうひとつ私の頭をクリアにしてくれたのはこれ

よく考えてみればわかったことだが、たしかに今までよく考えたことがなかった。

SSHは、遠隔操作用。
SSLは、インターネット用。

SSHにすると、**他のコンピュータを遠隔操作する際のやり取り**が暗号化される。
SSLにすると、**インターネットのやり取り**が暗号化される。

どちらも通信を暗号化する。
どんな通信を暗号化するのかが違う。



## まとめ

暗号化して安全な通信を行う、ということはわかっていましたが、実際コマンドをたたきながら、いったい今何をしているんだろうと思っていたので、私は今、**遠隔操作**しているんだ！と思ったら、かなりすっきりしました。

また、それがわかった上で作業を行うので、何をすればいいのかを考えやすくなりました。

まあ、遠隔操作すると書いてある記事は多くあり、その単語に私が目を止めなかったことと、何か、よりもどうやって使うのか系の記事を今までよく見ていたんだなぁ〜と思いました。
そのおかげで、鍵周りのことは割とちゃんと理解していたので。

また何か私の中のふわっとが解決したら書くと思います。

今立てている仮説
よくわからないのは、そもそもを理解していないからなのではないか
（コマンド（作業手順）を覚えていないからだけではないのではないか）

引っかかりをひとつずつとって、ふわっとをちゃんとにすることが目標です。
SpacemacsのPython Layerにpipenvで構築した仮想環境を認識させる方法

# はじめに

現在（2018-11-20）`pipenv`がPythonの仮想環境管理ツールとして公式推薦されていますが、Spacemacsの[Python Layer](https://github.com/syl20bnr/spacemacs/tree/master/layers/%2Blang/python)は`pipenv`で行う仮想環境管理はまだ一部対応していないようです。なんとかSpacemacsのPython Layerと`pipenv`を一緒に使えるように設定できましたのでやり方を共有します。

## 前提条件

* `pipenv`がインストールされています。
* `pipenv`の使い方を覚えています。
  * まだ覚えていない方は[こちら](https://qiita.com/cschappert/items/d2454c8264c2a9cf81ae)をご参照ください。 
* Spacemacsの基本、Layerの使い方を覚えています。

# `pipenv`の使い方は変わらないです

* `pipenv`は通常の使い方で大丈夫です。
* 初期設定ですと仮想環境は`~/.local/share/virtualenvs/`の下に作成されますがそのままにしてください。

# シンボリックリンクを作ります

```bash
$ cd ~
$ ln -s .local/share/virtualenvs/ .virtualenvs
```

# `.venv`ファイルを作成します

* ProjectのWorking Directory（Pipfileが置いてあるDirectory）に作成します。
* 内容は仮想環境の相対パスだけです。
* 以下のコマンドで作れます。

```bash
$ echo "$(basename $(pipenv --venv))" > .venv
```

## 確認

```bash
# 仮想環境の絶対パスを確認
$ pipenv --venv
/Users/chris/.local/share/virtualenvs/scripts-JqqYlDna

# リンクも作ったので ~/.virtualenvs/ の下にもあります
$ ls ~/.virtualenvs
my_project-AZnI3gEY                             scripts-JqqYlDna

# ~/.virtualenvsに入ったら相対パスがscripts-JqqYlDnaになります。.venvにもこのパスが載っています
$ cat .venv
scripts-JqqYlDna
```

# 最後に

対策方法は他にもあると思うので追加や訂正がある場合コメントを残していただければ幸いです。
検索オプションで新着投稿一覧を表示する方法

### 検索から新着一覧表示できないかなー
って考えてて、URL に Sort 含まれてるので `sort:created` って検索してみたんです。
そしたら行けました :yum: 

### ちなみに
検索結果画面にある「検索オプション」に
> `created:>2018-10-20`
> 2018-10-20 以降に作成された

ってありますけど、`>=` じゃないから **以降** じゃないですよね...
（細かくてすみません）

### ちなみちなみに
右下の「投稿」ってリンクを押すと旧 UI の「すべての投稿」に行けるみたいでした :sweat_smile: 

##### 参考
:link: [Qiitaの新着記事のURL](https://qiita.com/kino15/items/b49909a6418a4e64fb96)
プログラミング初学者向け Go入門 #1

## 概要
Golangの勉強のついでに、Go初学者向け、はたまたプログラミング初学者と共有できないかと考えた為。
なので、今回はツールなどは使用せずGolangだけで書いて行こうと思う。
第1回なので、まずは準備したhtmlを表示させるところまで作成。
####今回のソース
https://github.com/takuma-goto310/sample_golang
## 準備
Macbook

Goのインストール
参考サイト
[初めてのgo！インストールまで。](https://qiita.com/shirayoshi/items/08dce692894c92ae08ee)
#### 適当なディレクトリでサンプルソースをgit cloneする
```terminal
tanakataro $ git clone https://github.com/takuma-goto310/sample_golang.git
```
## ディレクトリ構成

```terminal
.
├── README.md
├── app
│   ├── controller
│   │   └── app.go
│   └── view
│       ├── footer.html
│       ├── header.html
│       └── index.html
├── public
│   ├── css
│   │   └── bootstrap-3.3.6.min.css
│   ├── fonts
│   │   ├── glyphicons-halflings-regular.ttf
│   │   ├── glyphicons-halflings-regular.woff
│   │   └── glyphicons-halflings-regular.woff2
│   ├── img
│   │   └── favicon.png
│   └── js
│       ├── bootstrap-3.3.6.min.js
│       └── jquery-2.2.4.min.js
└── run
    ├── main
    └── main.go
```
正直publicには使っていないものもあるが、今後使う予定なので無視。

## 起動方法
ターミナルでrunディレクトリに移動する。

```terminal
run $ go run main.go
```
## 内容
重要な部分だけここで紹介。

- sample_golang/app/controller/app.go

```go
// Index is method to render Top page.
func Index(rw http.ResponseWriter, request *http.Request) {

	log.Println("call Index")

	// htmlを表示
	err := parseTemplate().ExecuteTemplate(rw, "index.html", "")
	if err != nil {
		outputErrorLog("HTML 描画 エラー", err)
		log.Fatalln("エラーのため強制終了")
	}
}

// parse HTML
func parseTemplate() *template.Template {
	tmpl, err := template.ParseGlob("../app/view/*.html")
	if err != nil {
		outputErrorLog("HTML パース 失敗", err)
	}
	return tmpl
}

// output error log
func outputErrorLog(message string, err error) {
	log.Println(message)
	log.Println(err)
}
```
準備したhtmlを表示し、失敗すればエラーログを吐く。

- sample_golang/run/main.go

```go
func main() {
	setRoute()
	// 指定したポートをListen
	http.ListenAndServe(":8080", nil)
}

// ルーティング設定
func setRoute() {
	// 静的ファイルのルーティング
	http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./public"))))
	// TOP画面
	http.HandleFunc("/index", controller.Index)
}

```
ポート番号8080へ通し、`/index`へのリクエストの際には上記のcontrollerのIndexメソッドを呼ぶ。

- sample_golang/app/view.index.html

```html
<header class="jumbotron">
    <div class="container">
        <div class="row">
            <h1>SAMPLE GO</h1>
        </div>
    </div>
</header>
```
大きく`SAMPLE GO`と表示するだけ。

## 実際に動かしてみる
<img width="1522" alt="スクリーンショット 2018-11-20 14.37.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/317878/8d1eabec-b07a-a266-5f41-8734a1c2ac65.png">

動いた。

次は、これよりは難しいけど簡単なwebアプリケーションを作成する。
Visual Studio Code ではじめるTypeScript(1)~環境構築~

# はじめに
かなり今更感はありますが、Visual Studio Code（以下VSCode）でTypeScriptを開発してみたいので、自分で理解するためにもアウトプットしていきます。

Windows構築でVSCodeとTypeScriptを利用し、最終的にはフロントエンドフレームワークとASP.NETなどと組み合わせて簡単なWebサービスを作成するのが目標です。

# 対象読者
- VSCodeを使用したTypeScriptの入門
- フロントエンドフレームワークの入門（だいぶ後半になるかと）
- Webサービスの構築の入門（同じく、だいぶ後半になるかと）

# インストール作業
まず、VSCodeとNode.js、TypeScriptの3つをインストールします。

## Visual Studio Code
下記リンクからインストーラーをダンロードして実行。
https://code.visualstudio.com/

とくになにもなくインストール可能です。

## Node.js
下記リンクからインストーラーをダンロードして実行。
https://nodejs.org/en/  

PATHを通す必要がありますが、YESYESしてればインストーラーが通してくれます。

## TypeScript
コマンドプロンプトからも可能ですが、せっかくなので、VSCodeからインストールします。
1. VSCodeの起動。
2. 『Ctrl + Shift + @』キーを押下しターミナルを起動。
3. 起動したターミナルに以下のコマンドを入力。
　``npm install -g typescript``

これで実装は可能になりますが、TypeScriptを扱ううえで必要になるツールがあるので、それらもインストールします。

### tslint
tslintはTypeScript用の静的解析ツールです。
（静的解析ツールとはコードを実行せずに、検証を行ってくれるツールです。
コーディング時という早い段階でエラーを検出できるので、バグ修正のコストが減ります。）

 ターミナルに以下のコマンドを入力。
　``npm install -g tslint``

### vscode-tslint
vscode-tslintはtslintのVSCode用の拡張機能です。tslintの結果をVSCode上に出力します。
下記リンクからダウンロードしてインストールするか、VSCodeから拡張機能をでインストールします。
https://marketplace.visualstudio.com/items?itemName=eg2.tslint  

VSCodeのメニュー『表示』→『拡張機能』で『tslint』で検索。 
![tslint.png](https://qiita-image-store.s3.amazonaws.com/0/70325/595e685a-a889-cfde-ad34-7236782385bf.png)

# おわりに
今回は、本当に環境構築だけで終了します。
Webを調べるとこの方法以外にも少し違ったパターンの構築方法が散見されますが、この方法でも構築はできました。
次回は、とりあえず動かす！ということで、実装に必要な設定と恒例の『Hello World!!』をやりたいと思います。

# 追記（2018/11/28）
今回VSCodeを対象にすすめていくつもりでしたが、色々と調べているとVisual Studio 2017(communityも含む)でも
TypeScriptの開発が可能なことがわかりました。（まぁ、当然といっちゃ当然なのでしょうが。。。）
私自身、仕事でガッツリVisual Studioを使っているので、今後は[『Visual Studio 2017 ではじめるTypeScript』](https://qiita.com/yoshiati/items/4563274035c07228a306)に変更したいと思います。