デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理と英語を基礎からやり直す。https://qiita.com/yaju

機械学習の勉強再開 線形SVMの改善

はじめに

前回、R言語の線形SVMをPythonに移植しました。 yaju3d.hatenablog.jp

Pythonやscikit-learn に慣れていなかったので、もう少しいい方法があるのではないかと再調査しました。

SVMでは文字列は使えるのか

結論では、正解ラベル側には文字列が使えますが、学習データ側は文字列が使えないため数値型に変換する必要があります。
長くなったのでQiitaに別記事としました。 qiita.com

変更前の数値型変換ですが、イケてないですよね。

sze_row.loc[sze_row.X1 == "G", "X1"] = 1
sze_row.loc[sze_row.X1 == "C", "X1"] = 2
sze_row.loc[sze_row.X1 == "P", "X1"] = 3
sze_row.loc[sze_row.X2 == "G", "X2"] = 1
sze_row.loc[sze_row.X2 == "C", "X2"] = 2
sze_row.loc[sze_row.X2 == "P", "X2"] = 3
sze_row.loc[sze_row.X3 == "G", "X3"] = 1
sze_row.loc[sze_row.X3 == "C", "X3"] = 2
sze_row.loc[sze_row.X3 == "P", "X3"] = 3

これを改善しました。

# ラベルエンコーディング
rating = {'G' : 1, 'C' : 2, 'P' : 3}
sze_row.X1 = sze_row.X1.map(lambda x : rating[x])
sze_row.X2 = sze_row.X2.map(lambda x : rating[x])
sze_row.X3 = sze_row.X3.map(lambda x : rating[x])

SVC(kernel='linear')とsvm.LinearSVCの違い

線形SVMですが、kernel='linear' を指定する方法とLinearSVCを方法の2種類あります。
これが同じかというと微妙に違うの結果も変わってきます。
When should one use LinearSVC or SVC? - StackOverflow

LinearSVCがLIBLINEARライブラリーを基にしているに対し、SVC(kernel='linear')はLIBSVMライブラリーを基にしている。
LinearSVCの場合、デフォルトはヒンジ損失の2乗(loss='squared_hinge')を最小化するように設定されています。

LIBSVMはカーネル法を用いたサポートベクターマシン (SVM) の学習に使うSMOアルゴリズムを実装しており、分類と回帰に対応している[1]。 LIBLINEARは線形SVMと、座標降下法(英語版)アルゴリズムを用いて学習するロジスティック回帰を実装している LIBSVM - wikipedia

SVC(kernel='linear')

model = svm.SVC(kernel='linear', C=2.5, max_iter=5000, random_state=3383)

結果

0.6458333333333334

C G P
C 8 6 3
G 0 13 2
P 3 3 10

31勝10敗8分けとなります。

LinearSVC

デフォルトは、loss='squared_hinge' なので指定しなくても同じになります。

#model = svm.LinearSVC(C=2.5, max_iter=5000, random_state=3383)
model = svm.LinearSVC(loss='squared_hinge', C=2.5, max_iter=5000, random_state=3383)

結果

0.625

C G P
C 5 8 4
G 0 13 2
P 1 3 12

30勝11敗7分け

LinearSVCの補足

loss='hinge' に変更すると結果がかなり悪くなります。

model = svm.LinearSVC(loss='hinge', C=2.5, max_iter=20000, random_state=3383)

max_iter=5000 では下記の警告が発生します。Google翻訳すると「Liblinearは収束に失敗しました。反復回数を増やしてください。 」ということなので、max_iter=20000 まで上げたところ警告が出なくなりました。

/usr/local/lib/python3.6/dist-packages/sklearn/svm/_base.py:947: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  "the number of iterations.", ConvergenceWarning)

結果

0.5

C G P
C 4 6 7
G 0 6 9
P 0 2 14

24勝15敗9分け

ソースコード

import pandas as pd
import numpy as np
import urllib.request
from io import StringIO
from sklearn import svm
from sklearn.metrics import accuracy_score
import random

url = "https://raw.githubusercontent.com/yaju/Sazae_R/master/2017sze.csv"

# データの読み込み
res = urllib.request.urlopen(url)
res = res.read().decode("utf-8")
sze_row = pd.read_csv(StringIO(res), header=0)
# 末尾の日付削除
sze = sze_row.iloc[:, :-1]

# ラベルエンコーディング
rating = {'G' : 1, 'C' : 2, 'P' : 3}
sze.X1 = sze.X1.map(lambda x : rating[x])
sze.X2 = sze.X2.map(lambda x : rating[x])
sze.X3 = sze.X3.map(lambda x : rating[x])

#1992年~2016年までを学習用、2017年分をテスト用とする
train = range(0, 1253)
test = range(1254, 1302)

x_train = sze.iloc[train, 1:]
y_train = sze.iloc[train, 0]
x_test = sze.iloc[test, 1:]
y_test = sze.iloc[test, 0]

# 分類器svm
#seedはサザエさん(3383)とする
model = svm.SVC(kernel='linear', C=2.5, max_iter=5000, random_state=3383)

# 学習
model.fit(x_train, y_train) 

pred = model.predict(x_test)
tab = pd.crosstab(y_test, pred)
# 識別率
print(accuracy_score(y_test, pred))

tab
#print(y_test)
#print(pred)

調査

同じ列の優先順序

同じ列に異なる数値があるとモデルのデータによってはある種の順序(0 < 1 < 2)であると誤解するとのことで、値の順番を下記のように変更してみました。
結果は31勝10敗8分けと変わらなかったです。

rating = {'G' : 1, 'C' : 2, 'P' : 3} 
                       ↓
rating = {'G' : 3, 'C' : 2, 'P' : 1}

One Hot表現に変更

説明変数側(学習データ)は回帰でも分類でも基本的 One Hot表現を使用するのが一般的なようです。こうすると優先順序が関係なくなるからです。

# ラベルエンコーディング
rating = {'G' : 1, 'C' : 2, 'P' : 3}
sze.X1 = sze.X1.map(lambda x : rating[x])
sze.X2 = sze.X2.map(lambda x : rating[x])
sze.X3 = sze.X3.map(lambda x : rating[x])

上記の部分を下記に変更します。

# One-hotエンコーディング
sze = pd.get_dummies(sze, columns=['X1', 'X2', 'X3'])

pandasのget_dummiesを使うとカラム指定で、One-hotエンコーディングができます。
変換元の列は削除され、末尾にOne-hotの列が追加されます。

変換前

X X1 X2 X3 Q Grate Crate Prate
C G P G 1 0.333333 0.333333 0.333333

変換後

X Q Grate Crate Prate X1_C X1_G X1_P X2_C X2_G X2_P X3_C X3_G X3_P
C 1 0.333333 0.333333 0.333333 0 1 0 0 0 1 0 1 0

結果

0.6666666666666666

C G P
C 13 2 2
G 2 9 4
P 5 1 10

32勝11敗5分け

OneHotEncoderの使用

www.haya-programming.com

pandasのget_dummiesは便利だけど用途によっては使用を控えた方がいいようなので、OneHotEncoderの使い方も知っておく必要がある。
get_dummiesと同じことを、OneHotEncoderで実現してみました。
ColumnTransformerで複数列を変換できますが、列名ではなくインデックス番号の指定する。
numpy.ndarray で変換されるので一旦データフレームに変換、元のデータフレームで変換前の文字列の列を削除して変換されたデータフレームと結合させた。

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

ct = ColumnTransformer([('onehot', OneHotEncoder(sparse=False), [1,2,3])])
columns = ['X1_C', 'X1_G', 'X1_P',   'X2_C', 'X2_G', 'X2_P', 'X3_C', 'X3_G', 'X3_P']
df = pd.DataFrame(ct.fit_transform(sze), columns=columns)
sze = sze.drop(['X1', 'X2', 'X3'], axis=1)
sze = pd.concat([sze, df], axis=1)

参照

最後に

結果からすれば学習データはOne Hot表現にして問題ないですね、実際に結果を良かったですし。
One Hot表現にすることでクロス集計(tab)のところを修正する必要があるのかと気にしていたのですが、全く修正なしでした。
これからは、One Hot表現でやっていきます。

これでようやっと次の段階に入ります。

  • RBFカーネルを用いたSVM
  • randomForest
  • 決定木
  • naive bayes

機械学習の勉強再開 線形SVM

はじめに

2021年最初の記事となります。
昨年は機械学習の勉強に身が入らなかったため、はてな側に記事を書くことも少なったです。
今年は、競馬予想とか株価予想とかをやってみたいなと思うようになったので、改めて機械学習の勉強を再開することにしました。

手を動かす

競馬予想とか株価予想とかをやる前に、自分には先に片付けるものがあります。「サザエさんのじゃんけん データ分析」です。
サザエさんのじゃんけんをきちんとディープラーニングとかでやってみたいなと思ってはいたんですが、機械学習はこれまでやってきたパズル的にプログラムを組むと違って、理論的に理解した上でプログラムを組む必要があるわけです。本を読んだりしてもピンとこないんです。

ディープラーニングにこだわることはやめて、せっかく他の方法の機械学習でやり方を示して頂いたわけですから、まずこれを理解させていただきます。 r-std.hatenablog.com

この参考サイトは R言語で作成されていますので、これをPythonに移植することから始めることにしました。
データが2017年と古いですが学ぶ上では関係ありません。

R言語とR Studioのインストール

以前R言語をやったときはWindowsでしたが、MacになったのでMacにインストールします。
qiita.com

作業ディレクトリの変更

ファイルメニューのRStudio→PreferenceまたはTools→Global Optionで環境設定を開きます。
GeneralのDefault working directoryを初期値「~」から変更します。
Windows時に使用していたフォルダがあったので「~/workspace/Sazae_R」にしています。
作業フォルダを変更したら、R Studioを起動し直す必要があります。

ちなみにコマンドで「getwd()」とすると現在の作業フォルダが見れます。

線形SVM

R言語

###データの読み込み
sze_row=read.csv("2017sze.csv",header = T, stringsAsFactors=T)
sze=sze_row[,-9]
#1992年~2016年までを学習用、2017年分をテスト用とする
train=c(1:1254)
test=c(1255:1302)

###seedはサザエさん(3383)とする
set.seed(3383)

###線形SVM
library(e1071)
sze.svm=svm(X~.,sze[train,],method = "C-classification",
           kernel = "linear",
           cost = 2.5 )
test.svm=predict(sze.svm, sze[test,])
svm.tab=table(sze[test,1],test.svm)
svm.tab
sum(svm.tab[row(svm.tab)==col(svm.tab)])/sum(svm.tab) #識別率

結果

C G P
C 13 2 2
G 2 9 4
P 5 1 10

32勝11敗5分

苦労したところ

sze.svm=svm のところで、"Need numeric dependent variable for regression."のエラーが出て解決するまで時間がかかりました。
Rのバージョンを4にしたことで、read_csvのデフォルト設定が変わっていたことが原因でした。

qiita.com

Python

Google Colaboratoryで動作するようにしています。
Google Colaboratoryで複数行コメントする場合、コメントする行を選択して、[Command] + [/] を押しますと、"#" でコメントされます。外す場合も同様にします。
Pythonの複数行コメントにはダブルクォーテーション3つで挟むというのがあるのですが、Google Colaboratoryでは文字列として結果に表示されてしまうためです。

www.atmarkit.co.jp

import pandas as pd
import numpy as np
import urllib.request
from io import StringIO
from sklearn import svm
from sklearn.metrics import accuracy_score
import random

url = "https://raw.githubusercontent.com/yaju/Sazae_R/master/2017sze.csv"
###データの読み込み
res = urllib.request.urlopen(url)
res = res.read().decode("utf-8")
sze_row= pd.read_csv(StringIO(res), header=0)
sze_row.loc[sze_row.X == "G", "X"] = 1
sze_row.loc[sze_row.X == "C", "X"] = 2
sze_row.loc[sze_row.X == "P", "X"] = 3
sze_row.loc[sze_row.X1 == "G", "X1"] = 1
sze_row.loc[sze_row.X1 == "C", "X1"] = 2
sze_row.loc[sze_row.X1 == "P", "X1"] = 3
sze_row.loc[sze_row.X2 == "G", "X2"] = 1
sze_row.loc[sze_row.X2 == "C", "X2"] = 2
sze_row.loc[sze_row.X2 == "P", "X2"] = 3
sze_row.loc[sze_row.X3 == "G", "X3"] = 1
sze_row.loc[sze_row.X3 == "C", "X3"] = 2
sze_row.loc[sze_row.X3 == "P", "X3"] = 3

sze = sze_row.iloc[:, :-1]

#1992年~2016年までを学習用、2017年分をテスト用とする
train = range(0, 1253)
test = range(1254, 1301)

x_train = sze.iloc[train, 1:].to_numpy(dtype=int)
y_train = sze.iloc[train, 0].to_numpy(dtype=int)
x_test = sze.iloc[test, 1:].to_numpy(dtype=int)
y_test = sze.iloc[test, 0].to_numpy(dtype=int)

# 分類器svm seedはサザエさん(3383)とする
model = svm.LinearSVC(C=2.5, max_iter=5000, random_state=3383)
# 学習
model.fit(x_train, y_train) 
pred = model.predict(x_test)
tab = pd.crosstab(y_test, pred)
# 識別率
print(accuracy_score(y_test, pred))
tab

結果

1 2 3
1 13 0 2
2 8 4 5
3 3 0 13

30勝8敗10分

R言語版と結果が違いますが、機械学習なので多少違いは出るのは仕方ない。
R言語版は、Cが13勝です。Python版は、1=Gが13勝になっています。

結果の見方

f:id:Yaju3D:20210104100225p:plain

行(たて)が正解(実際に出された手)、列(よこ)が予測となります。
機械学習では出す手を予測するので勝ち手を選んだことにして勝敗を出しています。※勝ち手を選んだとこまでは現状でプログラムを組んでいません。

  • 黄色セルは、例えばチョキ(C)を出すと予測して勝ち手のグー(G)出した、実際に出された手はチョキ(C)なので勝ちになります。
  • 赤色セルは、例えばチョキ(C)が出ると予測して勝ち手のグー(G)出した、実際に出された手はパー(P)なので負けとなります。
  • 白色セルは、例えばチョキ(C)が出ると予測して勝ち手のグー(G)出した、実際に出された手はグー(G)なので引き分けとなります。

CGPに順序変更

R言語版は文字型が自動的に因子型になっているので、アルファベット順のCGPになっています。
Python版でも、1=G、2=C、3=Pに変換していましたが、これを 1=C、2=G、3=Pに修正して結果を出したところ勝率が減ってしまいました。これなら変更しない方がいいですよね。

1 2 3
1 11 4 2
2 4 6 5
3 4 2 10

27勝13敗8分

苦労したところ

これだけなのに、ものすごく苦労しています。
エラーが幾つか出たのですが、それを解決させるまでが大変。アルゴリズムが悪いわけではないのでデバッグするわけではない。地道にエラーで検索して解決方法を探っていく。
比較として、Irisのdatasetを使用して正しく分類ができることで何故正しく動くのかを理解する。

aiacademy.jp

model.fit で幾つかエラーになりました。

model.fit(sze.iloc[train, 1:], sze.iloc[train, 0]) 

ValueError: could not convert string to float: 'G'

PythonのSVMでは文字列は使えないと判断して、数値に変換するようにしました。しかし、この方法では下記の警告メッセージが表示されます。

sze_row.X[sze_row.X == "G"] = 1

/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:13: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  del sys.path[0]

qiita.com

下記コードに変更することで警告メッセージが表示されなくなりました。

sze_row.X[sze_row.X == "G"] = 1
              ↓
sze_row.loc[sze_row.X == "G", "X"] = 1

文字型は無くしたのですが、次に下記のエラーがでました。

model.fit(sze.iloc[train, 1:], sze.iloc[train, 0])

ValueError: Unknown label type: 'unknown'

fit には、データフレーム型は使えないようで Array型に変換する必要があります。
ただto_numpy()で Array型に変換しても同じエラーになったため、数値型と判断されるように to_numpy(dtype=int) で型を指定することでようやっとエラーが解消されました。

x_train = sze.iloc[train, 1:].to_numpy(dtype=int)
y_train = sze.iloc[train, 0].to_numpy(dtype=int)

model.fit(x_train, y_train) 

識別率のところで、警告が出てました。

print(accuracy_score(y_test, pred))

0.625
/usr/local/lib/python3.6/dist-packages/sklearn/svm/_base.py:947: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  "the number of iterations.", ConvergenceWarning)

neko-py.com

「 ConvergenceWarning:Liblinearは収束に失敗しました。反復回数を増やしてください。 「反復回数」、ConvergenceWarning) 」 テスト回数が少なくて設定値を上げろと言っているっぽい 引用元のライブラリの説明をみてみると「 max_iter 」がデフォルト値だと小さいみたいなので値を上げてみたら警告が解消されました。

LinearSVCのとことにmax_iter=5000 を追加することで、警告が表示がされなくなりました。

model = svm.LinearSVC(C=2.5, random_state=3383)
                                                       ↓
model = svm.LinearSVC(C=2.5, max_iter=5000, random_state=3383)

R言語版のtable関数がクロス集計で Pythonだと pandas.crosstab()関数を使えばクロス集計が出来るとわかりました。

tab = pd.crosstab(y_test, pred)
# 識別率
print(accuracy_score(y_test, pred))

tab

col_0   1  2  3
row_0           
1  13 0  2
2  8  4  5
3  3  0  13

R言語版と同じにするなら、予測値をGCPの文字に変換した上でクロス集計をすればいいです。

最後に

R言語からのPythonへの移植は簡単にできそうだと思ったのに、エラーと警告が表示されて結構苦労しまくりでした。
R言語だと文字型というか factor型(因子型)がサポートされているので、GCPの文字でも問題なく動くのは便利ですね。
Pythonでは factor型の代替として、pandasで Categoricalの型(dtype)がサポートされているようです。

qiita.com

線形SVM(サポートベクターマシン)のアルゴリズムの理解は置いておいた、どういう動きで学習と予測を求めているかの理解は出来ました。
次の方法も順々にやっていきます。

  • RBFカーネルを用いたSVM
  • randomForest
  • 決定木
  • naive bayes

最終的には2018年と2019年と2020年もやっていって、理解が進めばオリジナルに挑戦していきます。

Wifiの回線速度が遅いまたは接続が不安定になるのはBluetoothまたはUSB3との干渉が原因

はじめに

動画とか頻繁に観るようになってから、動画が遅かったり停止したりして不満がありました。
回線はSoftBank Airから2018年08月19日にTOKAIケーブルネットワークの光通信になっているので遅いはずがない訳です。
SoftBank Airの時でも動画が停止したりしてたんですが、これは光回線ではなかったのでこんなもんかと思ってたところがあります。 今年になって Mac を購入してPCもよくなったはずなのにと先日までほっておいたのです。
それでも気にはしていたので、Google Public DNS を設定するなどはしていました。

調査

Tverであるドラマを観ていて回線があまりにも不安定なので、回線速度チェッカーサイトで速度を調べてみました。
インターネット回線の速度テスト | Fast.com

動画を快適に観るには、30Mbpsくらいは欲しいところ。光回線の平均速度は70〜90Mbpsだそうです。
tsunaga-ru.net

Macで実行すると 1.2Mbpsとかですよ。そんな遅いのかとiPhoneで同じサイトを観てみると、12Mbps で目を疑いました。
Macだと10倍遅いってどういうことだ? それでやっとネットで本格的に調査してみた次第です。
tokyo.secret.jp

IPv6の設定を変更しても何も変わらず、Bluetoothをオフにしてから回線速度チェッカーサイトで速度を調べると、iPhoneと同じ12Mbps となりました。

原因

Bluetoothをオフにすると良くなるのはどういうことなのか、ネットで調べるとWiFiとBluetoothは、2.4GHz帯という同じ周波数帯を使っているため干渉は起こりやすいとのこと。
fuji-wifi.jp

他にも USB3.0 でも干渉してしまうようです。USBメモリとか使用していても起こりえます。
www.moreitfun.com homepage-reborn.com

対応

Bluetoothをオフにしてしまうと、ワイヤレスマウスが使えなくなって不便です。

自分のルーターは、5GHz帯が使えます。これまでネットワーク名の表示の末尾に5Gが付くものと付かないものがありました。付かないのは2.4GHz帯ですね。
これまでなんか回線の調子が悪いなと思った時はなんとなく5G側に切り替えたりしていたんです。
しかし、この5G側のネットワークが表示されてこないことがたまにあるんですよね。その時にはルーターの電源を一旦切って入れ直したりすれば復活してきます。

5GHz帯にして回線速度チェッカーサイトで速度を調べると、160Mbpsとなり目を疑いました。
だって、Bluetoothをオフ状態の2.4GHz帯の更に10倍以上ですよ、こんな違ったんだと。

最後に

これまで回線悪いなーと思いながらも観れるからいいかと先延ばししていたんですが、これで原因と対応が分かったので良かったです。
原因的にWindowsなどの他端末でも同じことなんですよね。もっと速く根本的に調べれば良かった。

もう絶対、2.4GHzにしないよ。

Mac初心者がWeb開発環境(Visual Studio CodeのTypeScript)を整える

はじめに

今年初めにMacを購入してネットを見たりブログを書く上ではMacを使ってきたのですが、開発する上ではParallels Desktop上のWindows 10でVisual Studioやサクラエディタを使ってました。 夏休みになりMac上で開発環境を整えることにして、出来るだけMac上で済ませるようにしていきます。

  • macOS Catalina ver 10.15.5
  • シェル zsh

開発環境の構築

Visual Studio Code と Visual Studio for Mac をインストールしました。
丁度、HandsontableのRichEdlitorシリーズのブログをQiitaで書いていて Javascript で構文チェックの ESLint をやりたいなと導入を試みました。 HTMLやJavascript系だとインデントはスペース 2 つ派が多いということでこれを採用、Pythonのインデントはスペース 4つが多いようです。

こういうのは構文チェックのデフォルトに則るのがいいでしょう。保存したら自動整形で変更されるように仕組みにしておくのがベストですね。

Windows歴が長いのでMacによるフォルダ構成がイマイチわかりにくいです。ドライブという概念がMacには無いです。

ターミナル画面のプロンプト名($手前部分) 変更

ターミナル画面を開いた時にプロンプト名($手前部分)の前にコンピューター名やユーザー名などが表示されており XXXXX@XXXXXXnoMacBook-Pro となっています。名前が正しいならまだいいですが本名の漢字変換した際の誤記状態で設定されてしまっていてカッコ悪い。

$echo $PS1 
%n@%m %1~ %# 

%n がユーザー名、%m がホスト名 %1 がカレントディレクトリ のようです、%m のホスト名を変更すればいい。
Mac - コンピュータ名(ホスト名)の確認・変更
システム環境設定の共有のコンピュータ名を編集しました。これでターミナル画面で正しい名前で表示されるようになりました。

スクリーン キャプチャ

これはブログを書く用にMacでスクリーン キャプチャの仕方を調べました。

  • 「command」+「shift」+「3」・・・ 全体のスクリーンショットをファイルに保存
  • 「command」+「shift」+「4」・・・ 選択した範囲のスクリーンショットをファイルに保存
  • 「command」+「shift」+「5」・・・ スクリーンショット.app によるスクリーン ショット

Launchpad のその他に「スクリーンショット.app」があります。

ESLintの導入

Visual Studio Code にESLintをインストールしました。 ESLintとVisual Studio CodeでJavaScriptコードの構文をリアルタイムにチェックする(macOS版)

.eslintrc.jsonファイルを編集するってあるんですけど Finderでみるとそんなファイルが見当たらないがターミナルだと普通に見れる。先頭がピリオドなのは隠しファイルらしくFinderで見えるように設定しました。
Mac - Finderで隠しファイル・フォルダを表示する方法

settings.jsonファイルの配置場所はどこなのか調べて、「$HOME/Library/Application Support/Code」ってことは分かったんですが、 Finderでみるとライブラリーフォルダはあるもののそこの配下にはCodeフォルダが見当たらない。見たいのはホームフォルダ配下のライブラリーフォルダ なんです、調べたら隠しフォルダになっていたのです。
settings.jsonファイルは Visual Studio Code の設定からアクセス出来るので Finderでみる必要はないんですが、今後のことも考えて ホームフォルダ配下のライブラリーフォルダは見えるようにしておくといいでしょう。

ということで、workspace¥Testフォルダ配下に Javascriptファイルを作成して Visual Studio Codeで開くことで、ESLint が機能するようになりました。

最初に「Fix all auto-fixable problems」で全部修正して、個々の部分で修正はしなくてもいいかなというところは「Disable indent for the entire file」にしています。
f:id:Yaju3D:20200815233231p:plain

Prettierの導入

Visual Studio Code に自動整形する Prettierをインストールしました。保存時に自動整形するようにしています。
【VSCode】Prettierの使い方&おすすめ設定を紹介

{
  "[html]": {
    "editor.tabSize": 2,
    "editor.suggest.insertMode": "replace"
  },
  "[javascript]": {
    "editor.tabSize": 2,
    "editor.suggest.insertMode": "replace"
  },
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
  "editor.formatOnType": true,
  "editor.formatOnSave": true
}

Typescriptの導入

Typescript は使えるようにしておいた方がいいだろうと、下記サイトを参照して導入。
TypeScriptの環境: Visual Studio Code で TypeScript の開発環境を構築する

npm自体は、ESLintの際に導入したので、下記コマンドで typescriptをインストールしたのですが、tsc -v で「zsh: command not found: tsc」となりバージョンが表示されません。

$ npm install -g typescript

$ tsc -v

tsc コマンドが認識されていないようなので、環境パスが悪さしているようです。
[TypeScript]zsh: command not found: tsc パスが分かりません

echo $PATHで見ても見当たらない、どうも ESLint を設定した際に下記コマンドをやり忘れたようです。下記コマンドを実行したところ tsc -v でバージョンが表示されるようになりました。

export PATH="$HOME/.node_modules_global/bin:$PATH"

ターミナル画面を閉じて開き直したら、 tsc コマンドが認識されてませんでした。プロセス単位の環境変数でプロセスが閉じたら元に戻るようです。
毎回コマンドを入力するのは馬鹿らしいので永続的にやる方法を探すと、.zprofile ファイルに追記すれば良いとのこと。

.zprofile ファイルはホーム直下にあるとのことですが自分の場合はまだ未作成だったので、Visual Studio Codeで新規作成して設定しました。
先述した通り、先頭がピリオドなのは隠しファイルなので見えるようにしておいた方がいいですよ。

export PATH="$HOME/.node_modules_global/bin:$PATH"

これでターミナル画面を再起動しても、tsc コマンドが認識されるようになりました。

Helloworldのビルドとデバッグ

TypescriptでHelloworldを書きました。これでビルドしてデバッグが出来れば開発の第一歩となります。

function main()
{
    console.log("Hello,World.");
}
 
main();

Visual Studio Codeのメニューのターミナルから「ビルド タスクの実行」をクリックすると「タスクはワークスペース フォルダーでのみ利用可能です。」となります。
この場合、Visual Studio Codeのメニューのファイルから「ワークスペースにフォルダーを追加」を選択します。 VS Codeのワークスペース

再度「ビルド タスクの実行」でビルドすると今度は zsh: command not found: tsc でtscコマンドが認識されずビルドすることが出来ませんでした。
.zshenvと.zshrcの場所・違い・設定方法を解説します!

どうも.zprofile はログインシェルだけなのでダメみたい、ではと.zshrc はログインシェル、インタラクティブシェルということでやってみましたがこれでもダメでした。
最終的にログインシェル、インタラクティブシェル、シェルスクリプトで有効な.zshenv にしました。 .zprofile ファイルを.zshenv ファイルにリネームしました。

export PATH="$HOME/.node_modules_global/bin:$PATH"

これでビルドすることが出来るようになりました。次はデバッグです。
console文のところにブレークポイントを置いてメニューの実行のデバッグを選択します。デバッグ環境の選択の一覧の中から node.jsを選択することでデバッグが開始されました。
無事にブレークポイントで止まりステップ実行して、コンソール画面に"Hello,World."が表示されました。

最後に

まだまだ環境整え中なので、随時追記していきます。

英語の -teen と -ty にまつわる話

はじめに

英語の teen と ty について、どっちか10台か迷うことってないですか? え、ないって、そうですよね。
確かに発音では迷うことはあっても、英単語として迷うことはないよね。

どちらか迷わなくなる方法として、単語を深く理解すると記憶に残りやすくなります。

teen と ty について

13(thirteen)以降の -teen は「加算(足し算)の10」を表し、13は「10足す3」という意味となります。 一方、twenty, thirty, forty などの -ty は「乗法(掛け算)の10」を表し、「2掛ける10」、「3掛ける10」などとなります。

これは日本語で表してみましょう。 13は「10足す3」という意味で、日本語で「じゅう・さん」となります。日本語では英語と違い加算の場合には「じゅう」を前に置く形になります。
20は 「2掛ける10」という意味で、日本語で「に・じゅう」となります。加算と違い乗法の場合には英語と同じく「じゅう」を後に置く形になります。 日本語では「じゅう」を置く位置で区別するのに対し、英語では置く位置は後ろで同じですが、-teen と -ty の語形で区別します。

11と12にはなぜ -teen がつかない?

英語を習った時に、11はeleven、12はtwelveとなり、13(thirteen)以降の -teen は付くようになることを覚えます。

eleven と twelve の語源は、もともとドイツ語(正確にはその昔使われていたゲルマン語)にあります。
einlif と tweilif で、どちらも後ろに lif が付いていることに気がつきます。この lif は leave の過去系の left が含まれています。

einlif :one left (over ten)…「10 に 1 あまる」⇒ eleven 11
tweilif:two left (over ten)…「10 に 2 あまる」⇒ twelve 12

これは諸説ありますが、12進数の名残りと考えられます。

12進法

10進法と並んで多くの文明で使われてきたのが、12進法の考えである。
現在も12進法は、時計の目盛りは12時間、1ダースは12個などに使われている。
何故かというと約数が多いからである。
10の約数は1,2,5,10の4種類
12の約数は1,2,3,4,6,12の6種類
数えることが主流な文化では10進法を用いたのに対して、分けることが主流な文化では12進法を用いました。天文学が発達した文明では方角を分ける際に、12という数が都合が良かったのです。

最後に

しばらくはてなブログの方には記事を書いていませんでした。GWは暇になるので機械学習に記事を作成していきたいと思います。

MacBook Proを買いました

はじめに

今年初めての記事になります。ここ数年は「サザエさんのじゃんけん データ分析」の結果報告を1月1日に書いていたりしましたが、結果報告をやめた訳ではないです。
ディープラーニングを使ってやりたいと思って出来ずに先延ばしで数年経ってしまったので、機械学習をきちんと理解した上で納得してから記事を書くつもりです。

今記事はタイトルにあるようにMacBook Proを購入しました。届いたのは2020/01/12(日)になります。
数ヶ月前からNEC「LaVie LL750/M」のCPUファンから異音がなるようになっていたので我慢ならなくなったんですよね。
ついに個人としてはWindowsメインから脱出したわけです。 まー仕事では相変わらずWindowsですからね。
Mac自体は2008/06/23にiMacを購入したのですが、ノートタイプではなかったのであまりメインで使うことはなく7年くらいしたらモニターが時間が経つとチラついて何も見えない状態になってしまい、2017/09/02に買取業者に700円で売却しました。しかし、今度はノートタイプですから肌にあっています。

購入内容

本体

16インチMacBook Pro - スペースグレイ ¥ 288,800
システム構成:
第9世代の2.3GHz 8コアIntel Core i9プロセッサ(Turbo Boost使用時最大4.8GHz)
16GB 2,666MHz DDR4メモリ
AMD Radeon Pro 5500M(4GB GDDR6メ‍モ‍リ搭載)
1TB SSDストレージ
True Toneを採用した16インチRetinaディスプレイ
Thunderbolt 3ポート x 4
Touch BarとTouch ID
バックライトキーボード - 日本語(JIS)
アクセサリキット

付属品

  • Magic Mouse 2 - スペースグレイ ¥ 9,800
  • USB-C - Lightningケーブル(1 m)¥ 1,800
  • USB-C - USBアダプタ ¥ 1,800

ソフトウェア

  • Microsoft Office Home and Student 2019(1ユーザー Mac 2台)¥ 23,800

別途購入

  • USB-C Digital AV Multiportアダプタ ¥ 6,800
  • Parallels Desktop 15 for Mac ¥ 6,480
    ベクターで購入
  • Windows 10 Home

最後に

消費税入れて35万円を超えるなど結構な額になりました。消費税 10%って30万超えたら3万円ですからね、痛いです。
ローンを組みたくなかったんですが、流石に24回払いにしました。5年以上は使える性能と考えれば仕方ないですね。

Macにおけるバックスラッシュ(\)の入力方法

スポンサーリンク