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

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

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におけるバックスラッシュ(\)の入力方法

TensorFlow 2.xによる sin波予測

はじめに

時系列データを使用した予測をやりたいと思って、良さげな教材が下記サイトになります。
qiita.com qiita.com

記事自体が、2016~2017年ということで少し古いですが、機械学習のリハビリもかねて動かしてみました。

環境

  • Google Colaboratory
  • TensorFlow 2.1.0-rc1

現時点(2019/12/30)ではGoogle Colaboratoryでは標準で「TensorFlow 2.x」になってないですが、もうすぐなると思います。
下記コードを入力することで「TensorFlow 2.x」に切り替えることができます。

%tensorflow_version 2.x
import tensorflow as tf
print(tf.__version__)

ソース

説明

4000件(50 x 80)のノイズ入りのサイン関数データを用意します。
左図は全体、右図は先頭160件(80 x 2)です。
f:id:Yaju3D:20191231204538p:plain

これを訓練データ、テストデータに分類し、100ステップ分の入力Xがあった際の出力yが101ステップ目になる様なデータセットを作ります。
この「100ステップ分の入力Xがあった際の出力yが101ステップ目になる」をしている意味がよく分からなくて悩んでいたところ、下記サイトに「普通の regression と異なるのは、履歴 sequence から next value を予測することです。」と書かれていて、なるほどと思いました。
https://tensorflow.classcat.com/2016/09/17/sine-wave-prediction-by-rnn-lstm/

つまり、1~100の履歴値の予測値は101番目の値、2~101の履歴値の予測値は102番目の値、3~102の履歴値の予測値は103番目の値というようにするわけです。

訓練データは、全体の9割 4000 \times (1 - 0.1) = 3600 件で、テストデータは残りの 400 件となります。

in_out_neurons = 1
hidden_neurons = 300

model = Sequential()  
model.add(tf.keras.layers.LSTM(hidden_neurons, batch_input_shape=(None, length_of_sequences, in_out_neurons), return_sequences=False))  
model.add(Dense(in_out_neurons))  
model.add(Activation("linear"))

ニューラルネットの構造は model にさまざまなレイヤを add() することで構築できます。
300個の LSTM 中間層に投げ、それを1個の出力層に集約し、linear 活性化関数を掛け合わせています。

model.compile(loss="mean_squared_error", optimizer="rmsprop")

modelのコンパイル時に、誤差関数(平均二乗誤差)、最適化アルゴリズム(RMSprop)を指定しています。

学習データを用いた予測は、predict() を用いて行います。

predicted = model.predict(X_test) 

dataf =  pd.DataFrame(predicted[:200])
dataf.columns = ["predict"]
dataf["input"] = y_test[:200]
dataf.plot(figsize=(15, 5))

予測値と入力値の 200 件分を同時に表示します。

最後に

ちゃんと中身を理解していかないとですね。

英語の勉強の習慣化

はじめに

毎年数ヶ月もすれば何もしないで終わっていた英語の勉強ですが、11ヶ月経った今でも続けることが出来ています。
平日の会社終わりにコワーキングの「エニシア静岡 丸井店」に行って、そこで英語の勉強をしています。

ただ時間が30分~40分くらいと確かに短いかなと思いますが、仕事終わりということで長いと集中力が続かないですね。たまに寝てしまうし・・・

何をしているか

瞬間英作文のiPhoneアプリ版を使用して、ひたすら繰り返しています。
そして疑問に思ったことは調べて下記にまとめています。 yaju3d.hatenablog.jp

以前は、英文法の整序問題で正しい順序にして英文法を作成する「英語組み立てTOWN」もやっていたのですが、今はやめてしまっています。
これは瞬間英作文を結構やっているのに進歩がないような気がしていて、瞬間英作文のみに絞っています。

家でやる習慣を付ける

家だと何もしたくない。でも、それだと平日の30分しかしていないわけで、土日も何もしていないわけです。
当然、進捗が遅いわけですよ。TOEIC受験なんて今のレベルでは全然駄目だと思って今年も受けなかったです。

今後は家でやる習慣を付けるようにしたいですね。

Audio版「Doraemon」は半年前くらいに準備だけして、その後に何もしていなかったので家ではこれをひたすら聞いていこうと思います。
「Doraemon」は勉強って感じではなく、気分転換で読むイメージですからね。

最後に

ひらすら続けるのみ。

ステップ関数を理解してみる

はじめに

活性化関数としてステップ関数がある、ニューラルネットワークの起源となるアルゴリズムのパーセプトロンでAND回路やOR回路の構成に使用されたものです。

yaju3d.hatenablog.jp

過去にシグモイド関数をやってきてるのに、なんで初期の活性化関数であるステップ関数に戻るのかというと、それは微分不可能だから。
活性化関数 Relu も微分不可能なのにディープラーニングの隠れ層では推奨されています。

私の方で活性化関数で「微分不可能」というところに理解が引っかかっているので、原点に戻って整理しようと考えたのです。

あとで追記します。

参考

ステップ関数

形式ニューロン

f:id:Yaju3D:20170528144340p:plain f:id:Yaju3D:20170528154127p:plain
左図が本物の神経細胞(ニューロン) で、右図が形式ニューロンです。
形式ニューロンをWikipediaから引用します。

形式ニューロン(けいしきニューロン、英: formal neuron)や Threshold Logic Unit とは、1943年に神経生理学者・外科医であるウォーレン・マカロックと論理学者・数学者であるウォルター・ピッツが発表した最初の人工ニューロン(英: artificial neuron)[1]。伝達関数としてはヘヴィサイドの階段関数を使い、入出力の値は 0 または 1 の二値だけをとる。

簡単に説明すると、入力が2つあり各入力に対して重みが掛け算され、その値が閾値を超えれば出力は「1」、そうでなければ出力は「0」となります。 たとえば、入力が(1,0)、重みが(0.5, 0.7)だとすると、1×0.5 + 0×0.7 = 0.5 を計算して閾値と比較します。

形式ニューロンの場合、入力が「0」か「1」、重みが「実数」、出力が「0」か「1」となります。

単位ステップ関数

後述するヘヴィサイド関数との違いは、x = 0 の時も1の値を持つものとして定義していること。

f(x) = \begin{cases} 1 & (x \geq 0) \\ 0 & (x < 0) \end{cases}

機械学習のサンプルプログラムで使用されるステップ関数は、x = 0 の時は0の値になっているので用途によって定義が違うんでしょうね。

def step(x): 
    return 1 if x > 0 else 0
f(x) = \begin{cases} 1 & (x > 0) \\ 0 & (x \leq 0) \end{cases}

f:id:Yaju3D:20170603024904p:plain

ヘヴィサイド関数

ヘヴィサイドの階段関数 は、正負の引数に対しそれぞれ 1, 0 を返す階段関数となります。

f(x) = \begin{cases} 1 & (x > 0) \\ 0 & (x < 0) \end{cases}

又は、原点を埋めて

f(x) = \begin{cases} 1 & (x > 0) \\ \frac{1}{2} & (x = 0)  \\ 0 & (x < 0) \end{cases}

パーセプトロン

単純パーセプトロン

単純パーセプトロンの活性化関数としてステップ関数を使用しています。
qiita.com

rightcode.co.jp

多層パーセプトロン

多層パーセプトロンの活性化関数としてステップ関数を使用しています。
rightcode.co.jp

ステップ関数の限界

多層パーセプトロンの精度をよくするための誤差逆伝播(バックプロパゲーション)が生み出されたのですが、ステップ関数は微分が出来ないため、ラメルハートらは誤差を伝播できるような微分可能な活性化関数として、シグモイド関数を用いるようになりました。
rightcode.co.jp

最後に

今の自分は本やWebサイトを見て知識を得ているだけで、本当の意味で理解出来ていないことがあらためて分かったので、ちゃんと理解するようにプログラムを組んでみることにします。

スポンサーリンク