2019/03/15

JavaScript の習得

2019 年 3 月 15 日 Emil Hozan 著

以前にお話したことを実行に移し、JavaScript(JS)を学ぶという新たな挑戦を始める時を迎えました。以前の記事では、コーディングにあたって必要な、プログラミング言語について知っておくべきことを解説しました。今回は、Python を例として使いつつ、私がこれまでに JS で学んだことと Python について私が知っていることを比較し、説明したいと思います。JS も Python と同様、スクリプト言語ですが、フロントエンドの Web 開発を目的としています。JS をバックエンドの開発に使用できないという意味ではなく、そのために利用できるフレームワークは存在します。ただし、JS は HTML のデフォルトのフロントエンドスクリプト言語であり、Web ブラウザによって解釈されます。

この、JS を学ぶというタスクに私が取り組むことにしたのは、我々のセキュリティサービスで捕捉されるマルウェアサンプルをリバースエンジニアリングできるようになりたいと考えたからです。プログラミング全般についてのある程度の(基本的には、JS で読んだコードと Python についての知識を比較できる程度の)知識があり、変数の割り当て方法などについて少しは知っていたことから、最初は、このタスクをそれほど難しいものと考えていませんでしたが、始めるとすぐに、やや圧倒されるような気持ちになりました。率直に言えば、マルウェアのサンプルによってはかなり長いものもあり、Python ほど読みやすいものではありませんでした。そして、これをきっかけに、少なくとも前述のブログ記事で説明したような基本を学ぶ必要があると考えるようになりました。

基本的要素の比較と相違

ほとんどの点で、JS での変数や関数の定義は Python とよく似ています。データ値を入れるために使用する変数の名前には、正しい識別子を使用する必要があります。主な違いは、変数を宣言する前に JS ではキーワード「var」を使用する必要があるのに対し(たとえば、var varName;)、Python ではこのようなキーワードは必要ありません。

もう 1 つの類似点は、変数に入れるデータの型を特定する必要がなく、数値と文字列を相互に入れ替えて使用できることです。たとえば、ある変数(var emilsVar とします)を文字列に割り当て(たとえば、var emilsVar = “Let’s learn JavaScript together!”;)、その直後にその変数を数値データ型に再割り当てすることができます(たとえば、emilsVar = 2019;)。言語によっては、変数に値を割り当てる前にデータ型を特定する必要があるものもあります。

値をまとめて保存する方法として、JS には配列があり、これは、Python のリストに相当します。JS では、たとえば、var languagesEmilKnows = [‘python’, ‘javascript’]; となりますが、Python では、「var」キーワードも「;」も必要ありません。

JS でも Python のディクショナリ(さらにはクラスも)に似たオブジェクトを利用でき、どちらもキー/値のペアです。たとえば、JS の var emilsObject = {firstName:”Emil”, lastName:”Hozan”}; を Python で記述すると、emilsDictionary = {“firstName”: “Emil”, “lastName”: “Hozan”} になります。

すでにお気付きかもしれませんが、ここで指摘しておかなければならない非常に重要な点として、JS では、すべてのステートメントの末尾にセミコロン(;)を付けて終了する必要があります(ステートメントとは、実行する一連の命令のことです)。たとえば、変数の宣言と定義には、末尾にセミコロンを記述する必要があります。配列やオブジェクトにも同じことが言えますが、必要なのは、配列やオブジェクト全体の定義の後だけです。Python には、このような要件はありません。

言語要素の比較と相違

予約語であるキーワードの概念についてはほとんど同じであり、詳しい説明は省略しますが、論理プログラミングに利用できるものだということだけは知っておく必要があるでしょう。一般的なものとしては、条件付きロジックやコードのテスト、エラーの検出を可能にする「if」や「try」がありますが、「&&」、「!」、「||」などの論理演算子があり、これらはそれぞれ、Python の「and」、「not」、「or」に相当します。

値が等しいか否かを比較することができます(例:var x = 8; x == 8;)。この例の最初の部分は、変数「x」に数値「8」を割り当てます。そして、次の部分で x が再び 8 と比較され、両者が等しいことを確認します。

Python と JS で大きく異なるのは、JS には「===」があり、これは、データの値と型が変数間で一致することを検証するものです(例:var x = “8”; x == 8; x === 8;)。

この例では、もう一度「x」に文字列の値「8」を割り当てますが、言語によっては、文字列の値が対応する数値に変換されるものもあります(これについては、私の記事で説明したことはありませんが、JS では覚えておく必要があります)。これを前提に「x == 8;」を使用すると、文字列「8」は数字 8 に対応する値であるため、この結果は true(真)ということになるはずですが、ここで注目すべきは、2 つのデータ型が異なることです。したがって、「==」の自動変換が true であっても、この変換によってデータ型が文字列値から数値データ型の値に変わるわけではないため、「x === 8;」は false(偽)になります。

その他の機能の比較と相違

Python と JS の大きな違いの 1 つは、データをローカルに簡単に保存できるかどうかということです。Python の場合はこの機能がネイティブであるため、プログラムは入力を受け取って、永続的にそれをマシンに保存できます。JS にもその機能はありますが、Python ほど簡単ではないようです。本題から外れるため、この件の詳細については、StackOverflow のこの質問の JS におけるクライアントマシンでのデータの保存方法の説明を参照するか、Mozilla のこのリンクを使用して調べてみてください。

JavaScript についての個人的感想

私は、ウォッチガードの脅威ラボに参加する前に、プログラミングの仕事に就くことを検討したことがありました。私自身にとって興味があるのはバックエンドであり、それは、フロントエンドの開発を経験したことはあったものの、それほど熱中できるものではなかったためで、個人的には、人を引きつけるコンテンツの色、フォント、あるいはスタイルを考えて選ぶのが得意ではありません。また、JS とその使い方を学んだときに、「フロントエンドの開発をこれ以上追求したくない」という考えが強くなりました。

しかしながら、その後のいくつかの基本的な知識の習得によって、JS に対する見方が変わり、コードを追うのはそれほど難しくなく、構文はかなり理解しやすいもののようだと考えるようになりました。JS のいくつかの不正サンプルの調査を始めるまでに抱いていた、JS に対する考えは、大きく変わりました。そして、JS について他の人がどのように考えているのかにも興味を持って調べたところ、面白い意見を持つ人が多いことがわかりました。JS を好きではない人が多いようであり、それは、スクリプトの長さなどを考えれば理解できることですが、今回の経験によって、Web 開発においてはいくつもメリットがあることがわかりました。

私にとって、これまでの JS の習得が楽しいものだったことは事実であり、これからも JS の学習を続けたいと思います。私が JS を学ぶ主な目的は、読者やウォッチガードのユーザに対して不正スクリプトをわかりやすく解説し、脅威ラボにさらなる価値を付加し、個人としても成長することにあります。ただし、フロントエンドの開発に実務として関わりたいかと問われれば、丁寧にお断りすることになるでしょう。それでは、Web 開発に興味がある人に対し、その道に進むよう勧めるかと聞かれれば、もちろん、お勧めします!最近の Web サイトは動的 Web サイトの集まりであり、JS は、サーバサイドのプロセスと検証の軽減に役立ち、これらのタスクのクライアントのマシンでの処理を可能にします。

まとめ

今回の記事の要点をまとめると、私が JavaScript を学び、これからも学ぼうと考えているのは、プロフェッショナルとして成長し、不正スクリプトをリバースエンジニアリングできるようになるためです。その過程で、時にはフラストレーションを感じることもありますが、このような目的に基づき、今後も学び続けたいと思います。1 日あるいは 1 週間ですべてを習得したいと考えているわけではなく、入手した不正スクリプトを分析しながら、いくつかのまとまりに分割し、それを 1 つ習得するという方法で学習を続ける予定です。学習にあたっては、開発者として取り組む場合と同じように調査が必要になるでしょう。すべてを記憶できるとは考えておらず、実際に不可能であり、いつでもインターネットを利用できるので、その必要もないはずです。

最終目標を常に忘れないようにすることが重要であり、そうすることで、やる気を失ったり、本題を忘れたりするのを防ぐことができるはずです。我々は、生まれた日から歩く練習を始めたわけではなく、時間と努力を積み重ねて歩くことを覚え、前進できるようになりました。JS の学習にも同じことが言えます。私自身、JS を学びたいと考えた理由を明確にし、前回の記事で解説したような基本を思い出しながら、新しい言語を習得するための正しい手順に従うことで、現在の場所にたどり着くことができました。毎日少しずつでも前進する努力を続けることが重要です。それでは、次回の記事でまたお会いしましょう!