2020/08/26

Windows10とVT-x有効化

前回の続き。

VT-xが有効に戻ったので、もう一度やってみよう。
T460sでどうやるとVT-xが無効になるか、だ。

 

「Linux用Windowsサブシステム」「仮想マシンプラットフォーム」をONにして再起動。

image

VT-x関係が無効になった。
念のため電源OFFして3分おいてみたが、同じ結果になった。

image

 

この状態で、以前動いていたゲストOSを起動するとこうなる。
まあ、確かにVT-xは有効になってないね。

image


なんか情報ないかと検索すると、いいのがあった。

WSL2とHyper-Vの関係 - Qiita
https://qiita.com/matarillo/items/ca1eecf8f9a3cd76f9ce#%E3%81%A7%E3%81%AA%E3%82%93%E3%81%A7wsl2%E3%81%AFvm%E3%81%98%E3%82%83%E3%81%AA%E3%81%8F%E3%81%A6%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%83%BC%E3%81%AA%E3%81%AE

どうやら「Windowsハイパーバイザープラットフォーム」も有効にするらしい。

有効にしてみたが、それだけではWindows再起動は不要だった。
だが、Intelのツールで見てもVT-xは無効なままだった。
再起動、いや電源OFFだ。

image

ツールによる結果は変わらずでした。

VirtualBoxの方は期待したけど、こちらも同じエラーでダメ。まあVT-xは有効になってないしね。
元に戻していこう。


この設定でも、まだVT-xは無効のままだ。
再起動しかしていないので、電源OFFを試してみるか。。。

...

......

結局、全部OFFにして再起動したらVT-xも有効になったし、VirtualBoxのゲストOSも起動するようになった。

image

 

 

VirtualBoxのバージョンが関係しているかもしれないので、載せておこう。
v6.1.12 r139181だ。

image 

2020/08/25

Intel VT-xがなかなか有効にならなかった

まだWSL2とVirtualBoxの件を引きずっている。

私はThinkPad T460sを使っているのだが、それ以外にもデスクトップPCを使っている。
そして会社から持って帰っているT460sもあるので、3台似たようなPCがある。

先週末にWSL2を有効にする設定をしてしまい、VirtualBoxが起動しなくなっていた。
WSL2の方をあきらめて元に戻すことにした。なんか最初は「仮想マシンプラットフォーム」をオフにしただけではだめだったので、「Linux用Windowsサブシステム」もオフにした。
今はこうなっている。

image

 

で、この設定でデスクトップPCと会社から持ち帰ったT460sはVirtualBoxが起動するようになった。
デスクトップPCで動かしているゲストOSは、VT-xを無効にすると動かなかったので元に戻した、というのは前回のブログ記事になる。

 

そしてもう1台のT460sだが、これはWSL2を使うように設定したままなのを忘れてゲストOSが動かなくなったと悩んでいた。
その時のVirtualBoxが出したエラーメッセージが、文言は忘れたのだがVT-xが有効になっていない、みたいなことを書いていたのだ。

そんなことはなかろう、とBIOS設定を見たが、有効になっている。
念のためIntelのツールをインストールして確認したところ、確かに無効だと出てくる。
(下の赤で囲んだところが無効になっていた)

image

 

試しにWindows10でHyper-Vを有効にしたり無効にしたりしたけど変わらない。

 

なんでじゃー、と会社T460sとBIOS設定から比較していったところ・・・何もせずに有効になっていた。
BIOS設定を見るときに、それまでは再起動していたのを電源OFFしたからよかったとか?

直ったポイントがさっぱり分からなくて、モヤモヤする。。。
これは怒りにまかせて、また「仮想マシンプラットフォーム」をONにするところからやってみるしかないのか。

2020/08/22

[wsl]何も考えずにWSL2にしたらVirtualBoxが起動しなくなった

しまった・・・何も考えてなかった・・・。

 

きっかけは、こちらの記事。

「WSL 2」が「Windows 10 バージョン 1903/1909」でも利用可能に ~Microsoftが旧OSに移植 - 窓の杜
https://forest.watch.impress.co.jp/docs/news/1272017.html

インストールはうまくいったのだが、VirtualBoxのゲストOSを起動したらこうなった。

image

 

Windows10のバージョンは1909だ。

image

さて、どうしよう。


FAQ

WSL 2 についてよく寄せられる質問 | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-faq

VirutualBox6だとサポートしていそうなことが書いてある。

 

そういえば、ダイアログも「ダメだー」ではなく、nested VT-x/AMD-Vはnested-pagingとunrestricted guest executionなしだと有効にできない、みたいなメッセージだった。

が、WSL2環境を2マシンで作ったので、まず1台は元に戻す。
ただ・・・試しにゲストOSの「ネステッドVT-x/AMD-Vを有効化」のチェックを外したところ、項目がグレーアウトして元に戻らなくなってしまった。
その状態だとWSL環境を戻してもゲストOSは起動しない。
Linuxサブシステムもアンインストールしたが、ダメ。そういう問題ではなさそうだ。

virtualization - Virtualbox enable nested vtx/amd-v greyed out - Stack Overflow
https://stackoverflow.com/questions/54251855/virtualbox-enable-nested-vtx-amd-v-greyed-out

コマンドラインからならできるそうで、実際できた。
助かった!


そしてもう1台の方は、ゲストOSが起動できた。
なんでかと思ったら、ネステッドVT-x/AMD-Vを元々有効にしていなかった。
VM作成時にネステッドVT-x/AMD-Vを有効にしていると、後から取り外すとうまく行かないのか?

 

まずは、ネステッドVT-x/AMD-Vの有効化は何をしているのか?からだ。

VirtualBox で仮想マシンが入れ子 (Nested Virtualization) できるようになった - CUBE SUGAR CONTAINER
https://blog.amedama.jp/entry/virtualbox-nested-virtualization

こちらは2020/02/02の記事で、VirtualBox v6.1になったときの話だ。
この方は、ホストOSがMacで、VirtualBoxのゲストOSにUbuntu、その中でさらにVagrantでCentOSを動かすようなことをされている。
Vagrantは知らなかったのだが、仮想化ソフトウェアの運用をサポートするツールらしい。ということは、仮想かはVagrant自身は行わないのかな?

 

ということは、私が使いそうなところだと、ホストOSがWindowsで、VirtualBoxのゲストOSがUbuntu、その中でdockerを使っう、というのはネステッドにしていないとできないのだろうか?
docker使うからVirtualBox使うか、くらいの気持ちでいたのだが、それが間違っていたのだろうか。。。

動いている環境で試してみよう。

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:7f0a9f93b4aa3022c3a4c147a449bf11e0941a1fd0bf4a8e6c9408b2600777c5
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
....

うーん、動いていると思うのだが。


CPUに依存するという情報もあった。

VirtualBox 6.0 から Hyper-V と共存できるはず - Qiita
https://qiita.com/takotakot/items/94d3218cf8de5b2c1da8

さっきdockerも動いたと書いた方は、Intelのi5-6200Uだ。
それより前に動かなかったと書いた方は、Intelのi5-6500だ。

 

などとのんびりしていたのだが、元に戻した方の環境でVirtualBoxのゲストOSの動きがおかしくなった。
Xubuntu20.04を使っているのだが、なんというか、おかしい、くらいの表現しかできない。ログインするとCrash Reportのダイアログが出てくるのはまあいいとして、ウィンドウマネージャーがあまり動かない。ツールバーにランチャーでコンソールが起動できるようにしているのだが、立ち上げると他のクリックができなくなってしまうし、ウィンドウの移動も拡大縮小もできない。ゲストOSのウィンドウもダメなので、なんかよろしくないことになっているようだ。

 

ちょっとWSL2を触ってみたかっただけなのに、なんか大ごとになってしまった。。。
ゲストOSの件は、VirtualBoxのインストールを修復したら直ったような気がする。

2020/08/21

[lmdb][win10]もう少しlmdbがうまく動作しない件をWSL2で調査

Windows10がversion 2020でなくてもWSL2が使えるという情報が!

WindowsUpdateと再起動を何回か繰り返し、たぶんWSL2になった。
見た目が変わらないので確信が得られないのだが。

 

WSL2になって確認したかったのは、これ。

hiro99ma blog: [lmdb][win10]もう少しlmdbがうまく動作しない件を調査
https://hiro99ma.blogspot.com/2018/06/lmdbwin10lmdb.html

LMDB以外のDBでも似たようなissueが上がっていたので、ファイルシステムが原因だろう。
そしてWSL2になって改善されたということでさっそく動作確認した。

 

記憶がおぼろげなのだが、1回目の実行はDBファイルを新規作成するので成功。
2回目からがエラーになって、最初の起動から5~10秒くらい経過すると成功する、とかだったか。

やってみると・・・・エラーにならない!
WSL2で解決されたんだ!!

胸のつかえが下りましたな。

2020/08/18

[js]npm install -gしていいのはツール類だけ?

前回、TypeScriptでprocessを使うのに@types/nodeをインストールしたけど-gを付けていたのでダメだった、という話をした。

そういえば・・・nodeのライブラリ検索は常に"node_modules"というディレクトリ名で、それをカレントからルートまで順にたどっていくというやり方だったと思う。

ならば、ツールのように実行するものは-gでインストールして動くが、ライブラリは-gだとダメなんじゃなかろうか?

 

いや・・・しかし importも requireもないのに検索するのだろうか?

コンパイルして生成したファイルには、node.d.tsのような記載はない。というか、ほとんどtsファイルと同じだ。
package.jsonの"dependencies"に"@types/node"が追加されたので見に行っているのかと思ったが、外しても動作した。

ということは、Node.jsか?
でも、Node.jsが処理するなら declareは使えないんじゃないだろうか。
あれ、そういえば declareは TypeScript専用なのだろうか? Mozilla.orgでは出てこなかったのだが。もし TypeScriptの予約語なら Node.jsでは解釈できないと思うのだ。

しかし、 node_modules/@types/node には tsファイルしかない。まあ、拡張子が tsでも Node.jsは気にしないだろうが、TypeScriptにしかないキーワードが出てくれば処理できないだろう。
それに、node_modules/@types/node/process.tsをリネームしてみたが、関係なくコンパイルも実行もできた。node_modules を削除しても実行できるので、 process.exit()を tscするときに使うのだな。


関係ないけど、インストールするときに"--save-dev"と書いてあるのが気になった。
どういう意味なのか?

common options: [-P|--save-prod|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [-B|--save-bundle] [--no-save] [--dry-run]

他にもsaveのオプションがあるのか。

* `-P, --save-prod`: Package will appear in your `dependencies`. This is the
                     default unless `-D` or `-O` are present.

* `-D, --save-dev`: Package will appear in your `devDependencies`.

* `-O, --save-optional`: Package will appear in your `optionalDependencies`.

何も付けない場合は "--save-prod" と同じ扱いで "dependencies"に追加される。

製品版と開発版とか、そういうのをきっちり分けるときに使い分けるのだろうか?
ここら辺はそのうち調べよう。

2020/08/17

[js][ts]node.d.tsはローカルにインストールした場合だけなのか

TypeScriptの勉強中で、tscでコンパイルするのと、型がある、くらいのところまで把握した。

 

今日は、これ。

グローバル変数の宣言 - TypeScript Deep Dive 日本語版
https://typescript-jp.gitbook.io/deep-dive/type-system/intro/variables

ここに、node.d.tsがあればprocessを使うのに何もしなくていい、みたいなことが書かれている。
なので私はこうしていた。

npm i @types/node -g

プロジェクト作成のところにも書いてあったし、tscは勉強中はグローバルにインストールしておいた方がわかりやすかったので、@types/nodeも-gでインストールしたのだ。

 

しかし、これだとprocessが見えなくてね。
なにかimportみたいなことがいるのかと思って調べたのだが、node.d.tsをどうやって使うのか見つけられなかった。

そういえば、以前グローバルにインストールすると使えないものがあったことを思いだし、-gなしでインストールした。
うん、そうするとコードとしては何も書かずにprocessが使えるようになった。

 

こういうのが、まだよくわかってないのだな。。

2020/08/15

[js]typescript (3)

さて、夏休みのTypeScript勉強の3回目だ。

 


プロジェクトの環境設定

プロジェクトの環境設定
https://typescript-jp.gitbook.io/deep-dive/project

宣言空間

TypeScriptには型宣言空間(type declaration space)と変数宣言空間(variable declaration space)がある、と。

「型アノテーションとして使用できるものが含まれている」と書いてあるのだが、そもそも型アノテーションがわからん。
調べた感じからすると、変数宣言で型指定するあれのことをそう呼んでいるようである。TypeScriptだと変数宣言の後ろにコロンと型名を書くやつだ。
あってもなくても動作するからアノテーションなのかな?

 

型はまあいいとして、変数の方がよくわからん。
変数の宣言は、まあいい。型宣言したものも全部ではないが変数として扱えるらしい。たぶん右辺値だけだとは思うが。。。どうだろう。。。

varだけ書いてあるが、letやconstも変数宣言空間にいるんだろうか?
いてほしいな。

 

モジュール

オリジナルだと”Modules”で、項目も”Global Module”と”File Module”だった。後からオリジナルが更新されたのかもしれん。

ともかく、ファイルの中に普通に宣言するとグローバル扱いになって、別ファイルだろうと名前が衝突する可能性がある。importとかしなくてもいいのか?

ともかく、極力ファイルモジュールにしましょう、ということだった。
external moduleとも呼ぶそうだ。

そのファイルモジュールだが、TypeScriptファイルにimportかexportがあるだけでローカルスコープになると書いてある。
本当か?

 

いろいろ疑わしくなったので試そう。

まず、mod1.tsにfooを、mod2.tsにfooを代入するbarを用意し、tscしてnodeでmod2.tsを実行。
・・・うん、bar is not definedでエラーになるね。

そういえば、そもそもグローバルにいるとかいっていても、mod1.tsとmod2.tsをコンパイルしてリンクするわけでもないので、何かしらプロジェクトみたいな概念があるはずだ。

先にそっちを整えないとTypeScriptの勉強にならんな。
3回目にしてようやくそういう課題が見つかるとは。。。


Node.js & TypeScriptのプロジェクト作成

Node.js & TypeScriptのプロジェクト作成 - TypeScript Deep Dive 日本語版
https://typescript-jp.gitbook.io/deep-dive/nodejs

npmを使うようだ。どこかでnpmは略語じゃないと書いてあったが、ここには関係ない話だ。

tscはプロジェクトでインストールするようだ。まあ、これは-gでもよかろうが、バージョンで挙動が変わるかもしれんので安全に行くならローカルか。
そのうち、nvmみたいにバージョン管理されるようになるんだろうか。

@types/nodeというのもインストールする。これは知らなかった。
node.d.tsらしいが、importして使うのだろうか?

そしてtsconfig.jsonももちろんいる。
パラメータを見ると、srcとlibになっている。ここら辺はNodeのお作法なのかな。

package.json の”scripts”にコマンドを書いておくと、 npm runでコマンドが実行できるようだ。
npm のお作法なんだろうけど、そういうのを私は知らんのだ。
取りあえず”build”に”tsc –p .”を書いておくと、npm run buildでビルドできる。


モジュール再び

さて、これでビルドはできるようになったが、今は他のモジュールも使っていないので手動でコンパイルするのとほとんど変わらん。

Node.jsには globalというオブジェクトもあるらしい。

https://nodejs.org/docs/latest-v12.x/api/globals.html#globals_global

Node.jsではそのモジュール内でのローカルになると書いてあるので、他のファイルにあってもグローバルだから見える、というのはブラウザでの話だろうか?

global.fooなどとしても globalは見つからないと言われるから、うん、そういうものだと思い込もう。

 

コンパイルしてリンクする言語じゃないから、1ファイル内で完結しないといかんのかな。
1ファイルといっても、そこからimportしていくだけだろうけど。

 

ファイルモジュールの詳細

ファイルモジュールの詳細 - TypeScript Deep Dive 日本語版
https://typescript-jp.gitbook.io/deep-dive/project/modules/external-modules

公開する方は、 exportを付けておけばよい。
その付け方がいくつかあるので混乱してしまうのだが、どれか1種類だけ覚えておいて、自分が使うときはそれを、他の人が違うのを使っていたらツールに任せる、くらいでいいか。

問題はimportだ。
なんかいろいろ書き方があるのだが、これからやるんだったらES module syntaxというやつだけにしましょう、ということか。

ES module syntaxは、exportされたものをimportするときに fromを使うやつだと思っている。
そうじゃないやつはCommonJS syntaxとかいう呼び方で、exportされたものをimportするときにrequire()を使う。
require()の方が良く使われていたし、使い方もシンプルだったのでそうしていたのだが、どうも時代はfromを使うタイプのようだ。

試しにNode.jsでfromを使ってみたらエラーになって、そういえば拡張子を.mjsにしないと動かないんだった、というのを思い出した。


 

力尽きました・・・。

さすがに3回でたどり着くのは無理でした。
まあ、環境の作り方が分かったのと、前提となるJavaScriptの知識が足りてないのがわかったから、じわじわやりますかね。

2020/08/14

[js] typescript (2)

では、2回目はJavaScriptについてだ。
TypeScriptというタイトルなのに・・・なのだけど、TypeScript全開で書いたコードはNode.jsでは動かせないけれども、JavaScript全開で書いたものはTypeScriptでも有効なのだから、まずはJavaScriptのところを見ておかねばなるまい。

といっても、JavaScriptを全部やるわけではなく、TypeScriptとの比較という意味でそういう章立てになってるのだろう。


JavaScript

JavaScript - TypeScript Deep Dive 日本語版
https://typescript-jp.gitbook.io/deep-dive/recap

等価演算子の同一

null/undefinedチェック以外は===使っておけ、ということか。
自動型変換は気付きにくいのでやっかいだな。

 

Object型については、===で比較できるのは同一のアドレスを指しているかどうかだけのようだ。
むかしC言語の話で「C言語には値渡ししかない」と説明されて、ポインタもアドレス値を渡しているだけだから値渡ししかないのだ、と納得したのだが、そんな感じだな(なにがだ)。

 

nullとundefined

nullとundefinedについては、基本的に==でnullをチェックすれば良い。
==nullだと==undefinedもチェックできるからだ。
ただし、その変数がそもそも定義されていないという場合には、nullだろうとundefinedだろうと比較したら例外が発生するので、もしそんなことをしたいならtypeofを使う。

むしろ、じゃあどこでundefinedを気にする使い方をするのかというと、構造体とか戻り値とかだそうだ。
戻り値でundefinedを使うくらいなら、golangのようにerrを使うのがよいのか。型アノテーションというのがそういうやつなのかな。

 

JSONのシリアライズは、JSON仕様にnullはあるけどundefinedはないので、nullだったらメンバになるけどundefinedは除外されるらしい。ほほぅ。

まとめとして、TypeScriptのコーディングガイドラインとしてはnullを使わずundefinedだけにするのが推奨らしい。
まあ、変数定義後のデフォルト値がundefinedだから、わざわざnullを突っ込む必要はなかろうということか。
ともかく、==nullでチェックしてる分にはいいんじゃないの、ということだった。

 

クロージャ

聞くね、クロージャという言葉。いくつかの言語で出てきたと思う。

クロージャ - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures

「クロージャは、関数と、その関数が宣言されたレキシカル環境の組み合わせです」。既に意味が分からん。

うーん・・・C++のtemplateみたいな使い方ができる?というほどtemplateにも詳しくないのだが、可変にできそうなところを可変のままにして関数の枠を作っておき、そこに値を与えて新たな関数として使えるようにしてしまう、という感じなんじゃなかろうか。新たな関数にするのも1段だけじゃなく、その新しい関数にパラメータを与えてさらに新しい関数を作る、みたいなこともできるようだ。

まあ・・・使い道が思いつくまでは放置だな。

 

 

Number型

この前かった「開眼!JavaScript」にも書いてあったが、JavaScriptにはネイティブなオブジェクトもあるし、プリミティブ型ももちろんあるのだった。
数値に関してはNumberしかない。

で、Numberっていったいどういうものかと思っていたのだが、倍精度の64bitらしい。double相当か。
最近の言語だからか、2進数による誤差や64bitを超える値を扱うことが考慮されているようで、big.jsというものがあるそうだ。golangのbigみたいなもんか。C言語にはなかったのだけど、最近の動向は調べてないなぁ。

あとは、NaN、無限大、無限小の定義があるらしい。
NaNは、他の言語だとエラーだったり例外だったりするやつか。例では√-1が挙げられていた。
無限大と無限小は、この範囲を超えたら無限になるという閾値ね。外れるとInfinity(あるいは-Infinity)になる。

 

Truthy

「Trueと評価される値」だそうな。反対語はfalsyね。
ちょっとC言語っぽく、0以外がtruthyだ。空文字列でなければtruthyだし、nullやundefinedでなければtruthy。

でもやっぱりbooleanっぽいのがいいよねー、という場合は、これもCっぽく!!が使えるそうだ。
まあ、!が使えるなら!!も使えるわな。
個人的には!を使う時点でtruthyを認めてるんだから!!しなくていいんじゃないの、とも思うのだけど、全体的にそうコーディングしておくと静的解析ツールなんかで間違いを検出しやすいんじゃなかろうか。最初booleanだったものがnumberに変更になったのを忘れてたとか。


モダンなJavaScriptの機能

モダンなJavaScriptの機能 - TypeScript Deep Dive 日本語版
https://typescript-jp.gitbook.io/deep-dive/future-javascript

 

classes

確かに本で出てこなかったな、class。
JavaScriptのObjectでも同じようなことはできた・・・というか、できないとTypeScriptでも実現できないんだった。

 

アロー関数

アロー関数はthisの束縛だっけ、あれがコールバックと違うということだったと思うのだが、今やサポートしていないのはIEだけらしいから全環境で使えるという扱いでいいのかな。

あまり理解はできていないのだが、実際にアロー関数じゃないとダメだった場合に遭遇してしまったので、嫌でも覚えないといかんだろうという気がしている。

 

let, const

varじゃなくてlet使っておけばいいと思う。
constも使える。
ブロックスコープじゃないのがあるというのは思ってもなかった。

 

分割代入, スプレッド演算子

困るのがこういうやつなのよ。。。
こういう記法があるんだろうということはコードを読んでいてわかるのだけど、キーワードが分からなくて検索できないのだ。

「スプレッド演算子」といっても、そういう演算子があるわけでもなさそうだし。
検索すると「スプレッド構文」が出てくるのだが、ここではSpread Operatorになっているから誤訳ではなさそうだ。

 

for...of

golangだとrange戻り値の1番目がindex、2番目が要素だったっけ。
for...inがindexを返すやつで、for...ofが要素を返すやつ、ということか。

最近、forでぐるぐる回すのを書いた気がするが、for...ofを知っていればすっきりしただろうに。というか、知ってる人がコード見たら「この人for...of知らんのか」って思うんだろうな。

 

テンプレートリテラル

知ってしまえば「文字列をシングルやダブルで囲む代わりにバッククォートで囲むやつ」なのだけど、あの書き方とこの名前は結びつかないな。今も出てこない。

まあ、便利になるだけで、今の書き方でもなんとかなるから、思い出せたら使うくらいでいいだろう。

 

Promise

わしの若い頃はPromiseがなくてのぅ、と言いたくなったが、単に知らんかっただけだろう。
最近はPromiseを使うところではasync-awaitで事足りることが多かったのだが、あれはあれでPromiseの違う運用みたいなものだったと思う。

ともかく、ここの例になっている非同期とtry-catchのところを読んだだけでも、自分で正しく実装できる自信がない。

 

ジェネレータ

これもコードを見ても名前が思いつかないパターンだ。幸い「function*」が検索できるのでセーフだが。

イテレータの作成をするもので、関数ポインタではない。


 

疲れた・・・。

TypeScriptだったら、みたいなのがほとんど出てこなかった。
3回だけブログにするつもりだったので、あと1回なのだが、はてさて何をやるべきかね。

[js] typescript (1)

やはり TypeScript は避けられなさそうだ。
勉強するしかあるまい。

ブログにでもしないと続かないので、3回くらいやろう。


ここを見ながら。

TypeScript Deep Dive 日本語版について - TypeScript Deep Dive 日本語版
https://typescript-jp.gitbook.io/deep-dive/

JavaScriptについても書いてあるので助かる。

 

tsc 自体は JavaScriptへのコンパイラというかプリプロセッサとか、とにかくそういうものだという認識だ。
TypeScript で書かれたファイルを tscで JavaScriptに変換する。

TypeScript の特徴は型システムの追加で、これは JavaScriptにはないもののようだ。
なので、型システムを使って TypeScriptを書くと Node.jsなんかでは実行できなくなる。あるいはこういう言い方もできよう。型システムを使わずに TypeScriptで書けば Node.jsでもそのまま動かせる、と。


TypeScript といえば Microsoft。
Microsoft といえば Visual Studio Code。
というわけで、 Visual Studio Code を使えば TypeScript開発は楽なはずだ。

TypeScript tutorial with Visual Studio Code
https://code.visualstudio.com/docs/typescript/typescript-tutorial

バージョンが毎月上がるツールは変化が激しいからなぁ。
これを書いている時点では Version 1.48.0だ。

 

いくら Visual Studio Code とはいえ、デフォルトのままで TypeScript は扱えないようだ。

  • tsc のインストール
  • tsconfig.json を作る
  • コンパイル

tscのインストールは npm install –g typescriptでいける。

tsconfig.jsonは、tsc --initでいける。
そのあと、ちょちょっと変更するとよさそう。

  • “sourceMap”をtrueにする。そうせんとデバッガが使えんらしい。
  • “outDir”でコンパイルで生成されたjsファイルの置き場所を指定。ここは個人の好みだろう。

“outDir”は、tscコマンドで単体のtsファイルを指定したときには効果が無いようだ。tsc、だけで実行すると指定したディレクトリ内にjsファイルが生成されていた。

 

コンパイルはコマンドラインから打っても良いが、Ctrl+Shift+Bでもうまいことビルドしてくれるようだ。
プロジェクトがまだ簡単だからそれでいけるのかな?
Visual Studio Code はショートカットキーもカスタマイズできて、私が結構いじるので、人によっては違うキーかもしれん。

 

デバッガを動かしたが、これはtsファイルの方でブレークポイントが止まってくれた。
mapファイルがうまいことやってくれてるのだろう。

このくらいであれば、.vscode/launch.jsonや.vscode/tasks.jsonなどがなくても使えるようだ。


最初はこのくらいで良かろう。
・・・あと2回でどこまでいくのやら。