Angular向けのVSCode拡張機能をインストールする

Visual Studio CodeでAngularプロジェクトの開発をするために必要な拡張機能をインストールしていきます。

ここで紹介する拡張機能は以下の3つです。

  • Angular Language Service
  • Angular Snippets (Version 16)
  • EditorConfig for VS Code

ここに掲載している拡張機能は必須といえるものを選んでいます。すべての拡張機能がAngularプロジェクトの作成直後から使用可能です。

では、一つずつ見ていきましょう。

Angular Language Service

Angularチーム公式の拡張機能で、テンプレートファイル内でのIntelliSense機能や定義へのジャンプなど、様々な便利な機能を提供しています。

Angularアプリケーションの開発を行う際は必ず入れておきましょう。

Angular Snippets (Version 16)

いくつかのバージョン対応版が見つかると思いますが、今回使用するバージョンは16.xですので、対応するバージョンの拡張機能を使用しています。

強力な拡張機能であることは間違いありませんが、人によっては使用する/しないがはっきり分かれると思います。最近ではGitHub CopilotなどのAIを活用したコード生成も手段としてあるので、必要性を感じない場合はインストールしなくても問題ありません。

EditorConfig for VS Code

Angularプロジェクトを作成すると、.editorconfigファイルが作成されていますので、これを有効化させるために導入します。

実務のことを考えるとPrettierやESLintを導入する必要がありますが、プロジェクト作成直後では使える状態になっていないため、今回の拡張機能から除外しました。

EditorConfigを使うべきか否か

Prettierを導入する場合、EditorConfigは必要かどうか、という議論があるようです。機能的には重複している部分があるため、EditorConfigを使わずにPrettierのみを使用する、という選択肢もアリという主張はそれなりに筋が通っています。

ただ、PrettierとEditorConfigは共存可能で、VSCode以外のIDEを自由に使用するという選択肢がある場合、多くのIDEでサポートされているEditorConfigの設定ファイルを残しておくことで、Prettierの設定が行われていない場合やGitのpre-commit時にしかPrettierが動作しない状況などにおいても必要最低限のフォーマットが行われるというメリットがあります。

そのため、本記事では必要な拡張機能にEditorConfig for VS Codeを挙げています。

まとめ

今回はAngularプロジェクトの開発に最低限必要なVisual Studio Codeの拡張機能3つをインストールしていきました。

実用面を考えると、PrettierとESLintの導入は必要ですので、次回はPrettierとESLintの導入とHuskyによるpre-commitフックの設定を行っていきましょう。

Angular CLIのインストールとプロジェクトの作成

AngularはGoogleによって開発され、維持されているオープンソースのJavaScriptフレームワークであり、主にSingle Page Application(SPA)の開発に使用されます。AngularはTypeScriptで書かれており、高度なツールやエディタのサポートを享受できます。

Angularの特徴

以下がAngularの主な特徴です。

  1. コンポーネントベースのアーキテクチャ: Angularはコンポーネントベースのアーキテクチャを採用しており、アプリケーションは再利用可能なコンポーネントに分割されます。これにより、コードの管理が容易になり、再利用性と可読性が向上します。
  2. 依存性注入: Angularは依存性注入パターンを採用しており、依存オブジェクトをコンポーネントに提供します。これにより、コードの再利用性とテストのしやすさが向上します。
  3. データバインディング: Angularは双方向データバインディングをサポートしており、モデルとビュー間の同期を自動的に保つことができます。
  4. ルーティング: Angularのルーティング機能により、アプリケーション内でのページ間の移動が容易になります。
  5. Angular CLI: Angular Command Line Interface(CLI)を使用すると、プロジェクトの作成、開発、テスト、ビルドが容易になります。
  6. テスト容易性: Angularは単体テストからエンドツーエンド(E2E)テストまで、テストを容易にするツールとライブラリを提供します。

他の主要なJavaScriptフレームワーク、特にReactやVue.jsと比較した場合、Angularはフルスタックなフレームワークで、多くの機能を提供します。一方で、ReactやVue.jsはライブラリとしてスタートし、他のライブラリやツールと組み合わせて使用することでフレームワークのような機能を達成します。そのため、ReactやVue.jsはより柔軟性がありますが、セットアップや学習曲線が少し複雑になる可能性があります。

また、AngularはTypeScriptを使用しますが、ReactやVue.jsはJavaScriptを使用します(ただし、TypeScriptのサポートもあります)。TypeScriptは静的型付けを提供し、大規模なプロジェクトでは開発効率やコードの品質を向上させますが、一方で学習コストがかかることも事実です。

Angularは日本国内においてはReactやVue.jsと比べるとメジャーではありませんが、まったく使われていないというわけではありません。主に企業向けシステムを中心に利用されています。

Angular CLIのセットアップとプロジェクトの作成

Angularのプロジェクト作成およびコードのひな形の生成にはAngular CLIを使用します。

本記事では、執筆時点で最新版の16.1.6を使用します。基本的にAngularで使用するNode.jsは同時期の安定版をサポートしているため、ここではNode.jsは18.17.0、npmは9.8.1を使用します。また、全体を通してパッケージマネージャーはnpmを使用します。

$ node -v
v18.17.0
$ npm -v
9.8.1

以下のコマンドを入力してAngular CLIをインストールします。

$ npm install -g @angular/cli

added 240 packages in 13s

36 packages are looking for funding
  run `npm fund` for details

Angular CLIのインストール成功すると、ngコマンドが使用可能になります。versionサブコマンドでインストールしたAngular CLIのバージョンを確認してみましょう。

$ ng version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/


Angular CLI: 16.1.6
Node: 18.17.0
Package Manager: npm 9.8.1
OS: darwin arm64

Angular:
...

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.1601.6 (cli-only)
@angular-devkit/core         16.1.6 (cli-only)
@angular-devkit/schematics   16.1.6 (cli-only)
@schematics/angular          16.1.6 (cli-only)

Angular CLI、Node.js、パッケージマネージャー(npm)およびインストールしたパッケージのバージョンを確認することができます。

開発者全員で同じバージョンのAngular CLIを使用する場合は、latestの部分を指定のバージョンに変更します。

$ npm install -g @angular/cli@16.1.6

added 240 packages in 15s

36 packages are looking for funding
  run `npm fund` for details

システム開発においてはバージョンを明示的に指定するこちらの方法でインストールしてください。

Angularプロジェクトの作成

Angular CLIのインストールが完了したら、Angularプロジェクトを作成します。

プロジェクト名は任意の名前で構いませんが、本記事ではangular-tutorialというプロジェクト名にします。

Angular CLIでAngularプロジェクトを作成するには、newサブコマンドを使用します。

$ ng new angular-tutorial

使用するAngular CLIのバージョンによって変わる場合がありますが、コマンド実行後にいくつか質問が表示されます。ここではすべてデフォルト値のまま進めることにします。

$ ng new angular-tutorial
? Would you like to add Angular routing? No
? Which stylesheet format would you like to use? CSS
CREATE angular-tutorial/README.md (1069 bytes)
CREATE angular-tutorial/.editorconfig (274 bytes)
CREATE angular-tutorial/.gitignore (548 bytes)
CREATE angular-tutorial/angular.json (2750 bytes)
CREATE angular-tutorial/package.json (1047 bytes)
CREATE angular-tutorial/tsconfig.json (901 bytes)
CREATE angular-tutorial/tsconfig.app.json (263 bytes)
CREATE angular-tutorial/tsconfig.spec.json (273 bytes)
CREATE angular-tutorial/.vscode/extensions.json (130 bytes)
CREATE angular-tutorial/.vscode/launch.json (470 bytes)
CREATE angular-tutorial/.vscode/tasks.json (938 bytes)
CREATE angular-tutorial/src/main.ts (214 bytes)
CREATE angular-tutorial/src/favicon.ico (948 bytes)
CREATE angular-tutorial/src/index.html (301 bytes)
CREATE angular-tutorial/src/styles.css (80 bytes)
CREATE angular-tutorial/src/app/app.module.ts (314 bytes)
CREATE angular-tutorial/src/app/app.component.css (0 bytes)
CREATE angular-tutorial/src/app/app.component.html (23083 bytes)
CREATE angular-tutorial/src/app/app.component.spec.ts (922 bytes)
CREATE angular-tutorial/src/app/app.component.ts (220 bytes)
CREATE angular-tutorial/src/assets/.gitkeep (0 bytes)
✔ Packages installed successfully.
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: 	git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: 	git branch -m <name>
    Successfully initialized git.

質問は2つありますので、1つずつ見ていきましょう。

Would you like to add Angular routing?

ルーティングモジュールを追加するかについて訪ねられています。ルーティングモジュールを使用しないことはほとんどないので、yを回答しても構いませんが、後で追加するのでここではデフォルト値のままにしておきます。

Which stylesheet format would you like to use?

スタイルシートのフォーマットを選択することができます。デフォルトはCSSですが、SCSSやSASS、LESSなどを選択できます。UIをどのように開発するか決まっていればそれに合わせて選択していただくのがよいと思います。本記事執筆時点ではいくつかのCSSフレームワークを試そうと思っていますので、デフォルトのCSSのままにしておきます。

hint: Using ‘master’ as the name for the initial branch. This default branch name

プロジェクトの作成が成功したあと、いくつかhint:で始まるメッセージが表示されています。

私の環境では最初に作成されるGitのブランチがmasterになっているため、このメッセージが表示されています。変更しなくても動作には支障はありませんが、不適切なブランチ名であるというのが業界における共通認識になっていると思いますので、GitHubの方針に合わせてmainブランチに変更しておきましょう。

また、git config --global init.defaultBranch <name>でデフォルトのブランチ名を変更しておくことも可能です。毎回変更するのが面倒な場合はこちらでデフォルトブランチを変更してください。ただし、次回以降の作成で有効になる点にはご注意ください。(すでに作成済みのGitリポジトリは変更されません)

これ以降ではVisual Studio Codeを使って開発を進めていきますので、作成したプロジェクトをcodeコマンドで表示し、ターミナルを開きます。

$ code angular-tutorial

Visual Studio CodeでAngularプロジェクトを開くと、拡張機能をインストールを勧めるメッセージが表示されますが、あとでインストールするので、ここでは閉じておいてください。

$ git branch
* master

ブランチを確認すると、masterブランチになっています。これをgit branch -mコマンドでmainに変更します。

$ git branch -m main
$ git branch
* main

ブランチ名がmainに変わったことを確認できました。

まとめ

Angular CLIのインストールとAngularプロジェクトの作成までを行いました。

次回はVisual Studio CodeでのAngularの開発を円滑に進めるための拡張機能をインストールしていきます。

AutoMLの現在と今後

機械学習と言えば、人工知能技術の中でも特に注目されている分野です。機械学習は、私たちが日常的に利用している様々なサービスやアプリケーションの背後にある技術として存在しています。しかし、機械学習は専門知識が必要な分野であり、特にモデルの選択や最適化のプロセスは非常に難解です。そこで、最近注目を集めているのが「AutoML」という分野です。本記事では、AutoMLについておさらいしつつ、自動化によってどのような利益をもたらすのか、そして今後の展開について考えます。

AutoMLとは

AutoML(Automated Machine Learning)とは、機械学習モデルの設計や最適化の工程までを自動化する技術の総称です。データの前処理、特徴量選択、モデル選択、ハイパーパラメータのチューニングなどを効率化し、専門知識がないユーザーでも高品質なモデルを作成可能にします。

「AutoML」という言葉が初めて使われた正確な時期を特定するのは難しいですが、その概念自体は2000年代後半から存在し、2010年代に入ってから注目を集め始めました。

機械学習とは

機械学習についておさらいしてきましょう。

機械学習は、人工知能の一分野で、アルゴリズムと統計を使用して、コンピュータがタスクを自動的に改善する能力を持つように設計されています。つまり、明示的なプログラミングなしにコンピュータが学習し、新しいデータに対する予測や決定を行う能力を持ちます。

機械学習の手法は大きく分けて、教師あり学習、教師なし学習、強化学習の3つのカテゴリーに分けられます。教師あり学習では、既知のデータ(ラベル付きデータ)を使ってモデルを訓練し、新たなデータに対する予測を行います。教師なし学習では、ラベルが付けられていないデータからパターンや構造を見つけ出します。強化学習は、試行錯誤を通じて最適な行動を学習する方法で、特定の目標を達成するために最適な行動を選択する能力を獲得します。

これらの手法は、画像認識、自然言語処理、医療診断、株価予測など、様々な分野で広く応用されています。

また、昨今注目されているディープラーニングは機械学習の一部となります。

AutoMLに対する懸念や疑問

AutoMLに触れたことの方にとっては様々な懸念や疑問があると思います。よく聞くものをいくつか挙げておきます。これらの懸念や疑問はすでに解決しているものもありますが、これから解決していくものもあります。

AutoMLがどのように動作しているのかがよくわからない

AutoMLツールはデータに基づいて最適なモデルを選択し、そのパラメータを調整します。しかし、その内部のプロセスは専門的な知識がなければ理解するのが難しい場合があります。これは、「ブラックボックス問題」とも呼ばれ、どのようにそれが最終的な結果を生成したのか明確ではないことを意味します。

数式や内部の理論まで必要になることは少ないと思いますが、少なくとも手法について概要やメリット・デメリット、適している問題領域などについては理解しておくことが必要となると思います。

データ品質の影響を強く受けるのではないか

AutoMLは提供されたデータに基づいて学習と予測を行います。したがって、データの品質や適切な前処理がモデルのパフォーマンスに大きく影響します。データが不適切または偏っていると、モデルの結果も偏るか、不正確になる可能性があります。

現実の問題においてはデータの品質が常に高いとは限りません。AutoMLは先に触れたように「ブラックボックス問題」があるため、データの品質がモデルや予測にどの程度影響があるのかがわからないという不安を感じやすいといえます。

ただ、AutoMLではデータやモデルの学習結果を可視化できるものも多く存在するため、そういった機能を活用してしっかり確認していくことが重要です。

モデルの適用範囲が十分ではない

すべての問題がAutoMLに適しているわけではありません。特に複雑な問題や専門的な知識を必要とする問題では、手動で設計された特定のモデルの方が適している場合があります。

また、AutoMLにも種類があり、色々な問題に適用できるAutoMLもあれば、特定の問題に特化しているAutoMLもあります。具体的な製品については後ほど説明します。

コストと時間がかかる

AutoMLの多くはサービス、特にクラウドサービスとして提供されており、大規模なデータセットや複雑なモデルを扱う場合、AutoMLの訓練と評価にはかなりの時間とコンピューティングリソースが必要になることがあります。

直感的にはマニュアルよりもオートの方が余計な処理を行っているような気がしてしまうので、余計なコスト・料金がかかっているのではないかという懸念は当然かもしれません。

とはいえ、AutoMLの製品・サービスは日々アップデートを繰り返して高性能化していますし、クラウドサービスは規模の経済性によって利用者が増えることによってコストが安くなっていくので、こういった不安は今後解消してくものと思います。

プライバシーとセキュリティに不安がある

機密性の高いデータを扱う際には特定のセキュリティリスクをもたらす可能性があります。データが適切に保護されているかどうか、またそのデータがどのように使用されるかについて明確な理解が必要です。

これはAutoMLに限ったことではなく、機密性の高いデータが学習に使われて何かの拍子に流出するようなことがないか、という懸念はAutoMLに限らず話題になることでしょう。

AutoMLはどのような問題を解決するのか

AutoMLはどのような問題を解決するのでしょうか。

AutoMLによって、モデルの選択や最適化のプロセスを自動化できます。これによって、専門的な知識やスキルを持つ人材がいなくても、機械学習を導入することができます。また、自動化によって、機械学習の開発時間やコストを削減することができます。その結果、機械学習がビジネスや研究に利用される可能性が高まります。

AutoMLの製品・サービス

以下に、AutoMLの具体的な製品とサービスを汎用的な問題に対応した製品・サービス、特定の領域に特化したいくつか挙げておきます。

汎用的な問題に対応した製品・サービス

  1. Google Cloud AutoML:Googleが提供しているサービスで、非専門家でも高品質なカスタムモデルを構築できるようにすることを目指しています。データのアップロードからモデルの訓練、評価、デプロイまでの一連のプロセスを自動化しています。
  2. AutoML in Microsoft Azure:Microsoft Azure内のMachine Learningサービスの一部として提供されています。AzureのAutoMLは、データの前処理、モデル選択、ハイパーパラメータ調整を自動化し、ビジネス上の問題に対する最適なモデルを導き出すことを可能にします。
  3. Amazon SageMaker Autopilot:機械学習モデルの全体的なプロセスを自動化するサービスです。このサービスは、まずデータセットを自動的に解析し、データの前処理や適切なアルゴリズムの選択を自動で行います。次に、様々なモデルとパラメータを試し、最も性能の良いモデルを見つけ出します。
  4. H2O.ai’s AutoML:H2O.aiが提供しているオープンソースのAutoMLフレームワークで、複数の機械学習モデルの訓練と評価を自動化します。

特定の領域に特化した製品・サービス

  1. Vertex AI:機械学習(ML)モデルの開発、デプロイメント、管理を統合的に行うためのフルマネージド型プラットフォームです。機械学習のライフサイクル全体をカバーし、データサイエンティストやMLエンジニアが独自のモデルを効率的に開発、訓練、デプロイするためのツールとサービスを提供します。
  2. DataRobot:データサイエンティストとビジネスアナリストが効率的にデータから洞察を得るために設計されたAutoMLプラットフォームです。特定の業界や業務に適用可能なモデルを自動的に生成します。

AutoMLの動作原理

AutoML(Automated Machine Learning)の動作原理は、一連の機械学習の工程を自動化することにあります。主な工程は、データの前処理、特徴選択、モデル選択、そしてハイパーパラメータの最適化となります。以下にそれぞれ詳しく説明します。

  1. データ前処理: これは、欠損値の補完、カテゴリ変数のエンコーディング、スケーリングや正規化など、モデルがデータを効率的に処理できる形に変換する工程です。AutoMLはこれらのタスクを自動的に行います。
  2. 特徴選択: これは、モデルが最も重要で意味のある情報に集中できるように、不要または冗長な特徴を取り除く工程です。AutoMLは、特徴の重要度を評価し、最も意味のある特徴だけを選択します。
  3. モデル選択: 機械学習にはさまざまな種類のモデルがあります。AutoMLは、問題のタイプ(分類、回帰、クラスタリングなど)とデータに基づいて最適なモデルを自動的に選択します。
  4. ハイパーパラメータ最適化: ハイパーパラメータはモデルの性能に大きな影響を与える設定値です。AutoMLは、さまざまなハイパーパラメータの組み合わせを試し、最良の性能を出す組み合わせを見つけ出します。

これらのプロセスを通じて、AutoMLはデータから予測モデルを自動的に生成します。その結果、非専門家でも効率的に高品質な機械学習モデルを構築することが可能になります。

AutoMLの限界について

しかし、AutoMLには限界もあります。

例えば、AutoMLによって自動化されるプロセスは限定されており、データ前処理や特徴量エンジニアリングなどの一部のタスクには対応していない場合があります。また、自動化が進んだ場合、技術的なノウハウが失われてしまう可能性もあります。このため、AutoMLの導入には慎重な検討が必要です。

  1. 一部のカスタマイズが難しい:AutoMLは、データの前処理やモデルの訓練といった工程を自動化しますが、その自動化により一部の細かな調整やカスタマイズが難しくなる場合があります。特に、特定の問題に特化した独自のモデルを作りたい場合、AutoMLだけでは不十分な場合があります。
  2. 解釈可能性と透明性に疑問がある:AutoMLは最適なモデルを自動的に選択しますが、その選択プロセスはユーザーにとって不透明で、選択されたモデルがどのように機能しているか、なぜそのモデルが選ばれたのかを理解するのが難しい場合があります。
  3. データの質を保つための準備が大変:AutoMLは、高品質なモデルを構築するためには、クリーンで整形されたデータが必要となります。つまり、データが不完全であったり、欠損値や異常値が含まれていると、モデルの性能に影響を与える可能性があります。
  4. コストがかかる:AutoMLサービスは、大量の計算リソースを使用することがあり、それによりコストが高くなる可能性があります。また、AutoMLが行うモデルの探索やハイパーパラメータチューニングのプロセスは、長時間にわたることが多く、これがさらにコストを増加させる要因となります。
  5. 一般的なソリューションに過ぎない: AutoMLは非常に有用なツールですが、特定の問題に対して最適化されたソリューションを提供するわけではありません。それは一般的なソリューションを提供するツールであり、特定の問題に最適なモデルを作成するためには、専門的な知識と手動のチューニングが依然として必要な場合があります。

これらの問題は現時点での問題で、今後改善していくことが期待されています。

最後に

本記事では、AutoMLについて説明しました。

AutoMLは、機械学習におけるモデルの選択や最適化のプロセスを自動化する技術であり、専門的な知識を持たないユーザーでも機械学習を利用することができます。自動化によって、機械学習の開発時間やコストを削減することができ、機械学習がビジネスや研究に利用される可能性が高まります。しかしながら、AutoMLには限界や懸念もあり、その導入には慎重な検討が必要です。

AutoMLは進歩の目覚ましい分野でもあります。現在抱えている疑問や不安、AutoML自体の限界は徐々に解消されていくことでしょう。また、最近ではRPA、ノーコード・ローコード開発・プロンプトエンジニアリングなど、小さい労力でシステムを開発することに注目が集まっています。この傾向は今後も続くと考えられ、AutoMLもその一つとなると思います。

AutoMLの可能性に期待しつつ、今後の展開に注目していきましょう。

AIベースのサイバーセキュリティは私たちに何をもたらすのか

現在のインターネット時代において、オンライン上には多大な情報が流通しているため、多くの企業や個人がサイバーセキュリティに関心を持っています。

しかし、発展したテクノロジーにより、サイバー攻撃も進化し続けているのが現状です。そのため、AIベースのサイバーセキュリティが注目されています。この記事では、AIベースのサイバーセキュリティについて、概要と具体的な製品・事例を説明し、今後どのような製品が発表されいくのか、我々を取り巻くセキュリティ事情がどう変わっていくのかについて展望します。

AIによってサイバーセキュリティはどう変わるのか


AIベースのサイバーセキュリティは、従来のセキュリティプログラムに比べ、より高度な脅威を特定し、より速く対処することができます。それは、AIが大量のデータを学習し、自己のアルゴリズムを改善することができるためです。具体的には、マルウェアやスパムフィルター、フィッシング攻撃などのサイバー攻撃を特定し、AIが自動的に対処することができます。また、AIは攻撃を予測することも可能で、攻撃を未然に防ぐための情報提供も行えます。

AIベースのサイバーセキュリティ製品

AIベースのサイバーセキュリティ製品としては、国内外の多くの企業がこれに注力しています。いくつか具体的な製品をご紹介します。

CylancePROTECT (開発企業: Cylance Inc. / BlackBerry Limited)

CylancePROTECTは、AIと機械学習を使用してマルウェアやランサムウェアを検出し、予防するセキュリティソフトウェアです。マルウェアの特徴や挙動を学習し、新たな脅威をリアルタイムで検知します。Cylance Inc.が開発し、後にBlackBerry Limitedによって買収されました。

Darktrace (開発企業: Darktrace Limited)

Darktraceは、自己学習型のサイバーセキュリティプラットフォームであり、AIアルゴリズムを使用してネットワークの異常な挙動や攻撃を検出します。ネットワーク全体を監視し、内部および外部の脅威から組織を保護します。

Palo Alto Networks Cortex XDR (開発企業: Palo Alto Networks)

Palo Alto Networks Cortex XDRは、エンドポイント、ネットワーク、クラウド上のセキュリティイベントを統合的に分析し、高度な脅威を検出するプラットフォームです。AIと機械学習による挙動分析や自動化により、リアルタイムの脅威インテリジェンスを提供します。

Symantec Endpoint Protection (開発企業: Broadcom Inc.)

Symantec Endpoint Protectionは、AIとマシンラーニングを活用したエンドポイントセキュリティソリューションです。悪意のあるファイルや不正な挙動をリアルタイムで検知し、防御します。また、攻撃者の手法やパターンを学習し、未知の脅威にも対応します。

残されている課題

AIを採用したサイバーセキュリティでは、予測不可能な脅威に対応することができるため、今後ますます多くの企業がこの技術に着目することが予想されます。例えば、既存の情報セキュリティプログラムを補完することで、企業がより高度な防御を実現できるようになります。また、AIによって攻撃が未然に防止された場合、企業は慎重な情報管理やプライバシー保護についても評価されます。

しかし、良いことばかりではなく、いくつかの課題が残されています。これらの課題は裏を返せば、サイバーセキュリティ製品を導入する個人や企業が製品を選定する際に注意しなければならない点であり、運用する上で知っておかなければならないことであるとも言えます。

偽陽性と偽陰性

AIはデータとパターンを学習して予測や判断を行いますが、完全な正確性を保証することは難しい場合があります。AIモデルは誤って正常な活動を異常と判断する「偽陽性」や、悪意のある活動を見逃す「偽陰性」の問題を抱えることがあります。

トレーニングデータの品質とバイアス

AIモデルはトレーニングに使用されるデータの品質に大きく依存します。セキュリティ分野では、正確なラベル付けされたトレーニングデータを収集することが困難な場合があります。また、トレーニングデータに偏りがある場合、モデルにバイアスが生じ、誤った判断をする可能性があります。

進化する攻撃手法への適応

サイバー攻撃者は常に新たな手法やテクニックを開発しています。AIモデルは過去のデータに基づいて学習するため、未知の攻撃に対しては対応が難しい場合があります。攻撃者がAIを迂回する手法を開発することもあります。

プライバシーと倫理の問題

AIを活用したセキュリティ製品は、ユーザーのデータを収集・分析する場合があります。個人のプライバシーや倫理的な観点から、データの収集や使用に関する懸念が存在します。適切なデータ保護措置や透明性が求められます。

誤った学習や攻撃への悪用のリスク

AIモデルは、誤った学習や故意に攻撃される可能性があります。攻撃者がモデルを欺くために誤ったデータを提供したり、モデル自体に対して攻撃を行ったりすることがあります。また、AIを悪用して攻撃を行う可能性もあります。

最後に

企業や個人がサイバー攻撃を受けるリスクが高まる中、AI技術を採用したセキュリティシステムが注目を集め、目覚ましい進化を遂げています。AIが予測と反応を行うことで、未知の脅威に対して高度な防御が可能になっていきます。しかしその一方で、AIを使ったセキュリティシステムは高い技術水準が求められるだけでなく、学習するという性質を逆手に取った攻撃のリスクもあります。

課題は多く残っていますが、今後、それらの課題が解決されていくことを期待しています。

AIがプログラマの仕事を奪うのか?

近年、AI技術が急速に発展しているため、懸念される一部の人がいます。彼らは、AI技術がプログラマの仕事を奪うことを心配しています。確かに、AI技術はコンピューターの処理能力を高めたため、プログラマの役割が変わりつつあることは確かです。しかし、AI技術はプログラマを置き換えるものではありません。今回の記事では、AI技術がプログラマに及ぼす影響について説明します。

生成AIの登場

近年、人工知能(AI)の高度化が進み、プログラマーを含む職の奪い合いが懸念されています。プログラミング界隈で話題を呼んだAIソフトウェアの例として、ChatGPTやGithub Copilotなどの生成AIがあります。

ChatGPTは、テキストベースの会話に対して人間のような応答を生成することができるAI搭載のチャットボットです。OpenAIのGPT(Generative Pre-trained Transformer)モデルをベースにしており、ディープラーニングを用いて大量のテキストデータのパターンを分析することができます。ChatGPTは、自然な会話を行い、ユーザーに役立つ回答を提供することができると評価されています。

一方、Copilotは、MicrosoftとGitHubが開発したAI搭載のコーディングアシスタントです。開発者がコードを入力する際に、コードスニペットを提案したり、コード行を補完したりすることで、より速く、より効率的にコードを書くことを支援するよう設計されています。Copilotは、機械学習を利用して既存のコードリポジトリを分析し、新しいコードの提案を行う。著作権侵害の可能性をめぐる批判もありますが、多くの開発者は便利なツールとして歓迎しています。

ChatGPTやCopilotのようなツールは、プログラミングのプロセスをより速く、より効率的にするのに役立ちますが、プログラマーを完全に置き換えることを目的としているわけではありません。むしろ、人間のプログラマーのアシスト役として、より速くコードを書き、仕事の質を向上させる手助けをするものです。しかし、あくまでも人間のスキルを補うためのものであり、人間の代わりになるものではないことを忘れてはいけません。

AIはプログラミングに変革をもたらした

AIは、あくまで人間が設計してプログラムしているものです。つまり、AIはプログラマがいなければ存在しません。プログラマがAI技術に向かい、それを構築し、設計し、アルゴリズムを開発しています。プログラマはAI技術の精度を向上させるため、自動機能の設定、AI技術の維持や世話など、AI技術に関する維持管理業務をしています。AIがプログラマを補完するものであり、置き換えるものではないのです。

専門家たちはAI技術に対する懸念を持っていますが、彼らはAI技術が必ずしも仕事を奪うものではないと言います。むしろ、AI技術を利用することで、プログラマは効率と正確性を向上させることができます。AI技術は書き物を検査し、曝露を見つけることができます。それによって、プログラマはより正確なコードを作成し、プログラムの品質を向上させることができます。

創造的な作業は人間にしかできない

プログラミングは、創造的なプロセスでもあります。人間が設計し、人間がアートワークを制作するのか、機械が機能を制作するのか、この選択には適切な答えはありません。新しいプログラマーのスキルが必要になることもあります。今のプログラマには創造的で高度なスキルが求められます。技術が進化するにつれて、プログラマーは適応しなければなりません。ここでAI技術はプログラムの効率を向上することで、人が創造的で革新的なアプローチに時間を費やすことを可能にします。

記憶することができないAIは、特定のプログラマが持つ専門知識や知識を持ちません。AIは、あくまで人間による制御下にあります。コンピュータに保持されていないノウハウ、知識、スキル、経験は、人間であるプログラマにのみ保持されています。

補完的な役割がAIに与えられることで、プログラマーよりも多くの時間と機会が提供されます。自動化されたプログラマーを持つ利点は、時間の節約、一貫した品質、より正確なプログラムであるため、ニーズが非常に高いです。学問に従事しているプログラマーにとって、AIは改善効果が得られます。

私はAIとどう向き合っているか

私自身も普段の開発では、 ChatGPTやGithub Copilot、Amazon CodeWhispererなどを使用しています。

ChatGPTにはうろ覚えのプログラムの書き方を聞いたり、DB設計の草案を考えてもらったり、トラブルの解決方法を聞いたりしています。とはいえ、情報の少ないニッチな内容については正確な答えが返ってこないことが多いですし、うまく伝わらないこともあります。最終的には真偽を確かめて、修正が必要な場合もあります。

Github Copilot、Amazon CodeWhispererを使ってお決まりのコードを生成してもらったり、単純なコピペではない似たようなコードを生成してもらったり、コメントを書いてそれに沿ったプログラムを生成してもらったりしています。よりインテリジェントでより柔軟なスニペットな使い方が中心になっています。

以前と比べると、同じものを作るにしてもタイピング量は格段に減りましたし、習熟度の低いプログラミング言語でもサクサク作れるようになりました。自身に合う/合わないもありますが、生産性を高めるツールはできるだけ試して、取り込んでいくことが大切だと思います。

最後に

技術が進化していくにつれて、プログラマーの役割が変化していくことは確かです。しかし、AI技術によって人間のプログラマーが排除されることはないことがわかりました。AI技術は、プログラマーが自分たちの能力を最大限に発揮するのに役立つ補完的な役割を持っていることがわかりました。AI技術をオプションとして導入することで、さまざまな業界でのプログラマーにとって、より生産的で成功したキャリアを築くことができます。プログラマは、AI技術を活用して、より正確なコード、益を上げるプログラム、より高い生産性などを目指すことができます。AI技術がいかにプログラマーに貢献するかを理解することが重要です。

楽観的排他制御と悲観的排他制御

楽観的排他制御(optimistic exclusive control)と悲観的排他制御(pessimistic exclusive control)は、両方の方法が大規模なスケーラビリティを持つため、システムの排他制御において非常に一般的な方法論です。

近年のWebシステムでは、特に楽観的排他制御が用いられることがほとんどです。本記事では、楽観的排他制御と悲観的排他制御のどちらが適しているのかを考察し、それらがシステム設計に及ぼす影響について説明します。

排他制御とは

排他制御は、同時に複数のスレッド/プロセス/ユーザーがデータを更新しようとする問題を解決するために使用されます。排他制御方法には悲観的排他制御と楽観的排他制御の2つの主要な方法があります。

悲観的排他制御(pessimistic exclusive control)

悲観的排他制御は、データ更新リクエストについての楽観的な予測を行わない方法です。つまり、一度に1人のユーザーしかデータを操作できないように、予約をすることで競合を回避しようとします。悲観的排他制御は、ロック機構やトランザクションを使用することが一般的です。

楽観的排他制御(optimistic exclusive control)

一方、楽観的排他制御は、データを更新する前に、競合を検出して回避するための最適な方法論を提供することにフォーカスしています。これは、別のユーザーがデータを更新したときに、その影響を判断することができるデータバージョン管理を含むことがよくあります。ユーザー操作中に競合が発生した場合、変更をロールバックするか、サーバから新しいデータを取得してマージするか選択できます。

楽観的排他制御では、競合を検出するためにバージョンまたは更新日時を使用することが一般的です。更新日時を使用する場合には日付の精度に注意が必要で、精度が低いと他ユーザーの更新を検出できない場合があります。

排他制御がシステムに与える影響

悲観的排他制御は、大規模なWebシステムのパフォーマンスに深刻な影響を与える可能性があります。つまり、トランザクションロックが長時間存在する場合には、他のトランザクションによってコミットされたデータに対して待たなければならず、それによって生じる遅延リスクがあります。一方、楽観的排他制御には、ユーザーが変更したい場合には非常に簡単であるため、パフォーマンスの限界に到達する前に、他のタイプの制御よりも多数のデータ更新を許容できます。

また、トランザクションが複数のデータをロックする場合、ロック順番に気をつけないとデッドロックが発生するリスクがある点についても注意が必要です。

楽観的排他制御は、特にオンラインWebアプリケーションにおいて、より親和性があると考えられています。ただし、その欠点が存在する場合があります。書き込みの競合性が高い場合、やはり悲観的排他制御で処理することが必要であるかもしれません。そしてこの場合、楽観的排他制御は厳密ではありません。Webアプリケーションには、トランザクション処理スレッド特有の問題も存在するため、慎重に検討する必要があります。

ただし、頻繁にデータ競合が発生する場合は、ユーザーの生産性やパフォーマンスに悪影響を与える場合があります。

アクセス制御による排他制御

楽観的排他制御とも悲観的排他制御とも異なるアプローチで排他制御を行うという選択肢もあります。

例えば、以下のような方法があります。

  • データを更新する前にデータに対するロックを獲得し、ロックしているユーザーのみがデータを更新できるようにする
  • ワークフローによってデータをユーザーに割り当て、割り当てられているユーザーのみが更新できるようにする

いずれの方法においても、ユーザーに与えて、アクセス権限を有しているユーザーだけが更新を行うことができるようにシステムを設計しています。これにより、更新時に排他制御を行わなくても安全にデータを更新することができるようになりますし、楽観的排他制御で安全に排他制御することができます。

結論

楽観的排他制御と悲観的排他制御は、両方とも重要な排他制御手法です。また、これら以外にも排他制御の手法はあります。システム環境、データ同期の頻度、書き込みの競合状況に応じて、適切な排他制御方法を選択し、最適な手法を使用することが重要です。

楽観的排他制御を使用することで、システムのパフォーマンスが向上し、ユーザーエクスペリエンスを向上させることができます。悲観的排他制御を使用することで、強力なトランザクション管理と競合回避制御を実現できます。

したがって、基本的には、両者が制御戦略の好みに応じて異なる選択肢であり、特定のシナリオと目的に基づいて使用されるべきです。

Yarnをインストールする(v3系)

過去にYarnを使っていましたが、最近は全然使用していませんでした。ふと使おうかと思ったのですが、インストール方法がだいぶ変わっており、初めてインストールを行う人やしばらくぶりにインストールをしようとすると手順に戸惑いそうだったので、基本的なインストール手順をまとめました。

前提条件

まずは記事執筆時点でのLTSバージョンである18.16.0を使用してインストールを行います。

$ node -v
v18.16.0
$ npm -v
9.6.6

npmについても執筆時点の最新バージョンにアップデートしています。

手順はmacOS上で確認していますが、特にシェルコマンドなどは使っていないので、どの環境でも同様の手順でインストール可能です。

また、インストール手順は公式の手順に準じて進めます。

公式の手順で十分な方はそちらを参照してください。

corepackを有効化する

corepacknpmyarnなどのパッケージマネージャを管理するツールです。デフォルトでは有効になっていないため有効します。

$ corepack enable

以前はnpmコマンドでインストールしていましたが、今はcorepackでインストールします。npm install yarnでもインストールできるのですが、v1系がインストールされるため、最新バージョンをインストールしたい場合はcorepackコマンドを使用する必要があります。

yarnをインストールする

次にcorepack を使ってyarnをインストールします。執筆時点では3.5.1が最新版のようですので、3.5.1をインストールすることにします。

yarnリポジトリはv1系のリポジトリとなっているのでご注意ください。

corepack prepareコマンドでインストールと有効化を行います。

$ corepack prepare yarn@3.5.1 --activate
Preparing yarn@3.5.1 for immediate activation...

Node.jsをasdfでインストールしている場合は、追加で以下のコマンドを実行してyarnコマンドを使用できるようにします。

$ asdf reshim

指定したバージョンがインストールできていることを確認します。

$ yarn -v
3.5.1

これでインストールが完了しました。

package.jsonを作成する

ついでにyarnコマンドを使ってpackage.jsonを作成してみましょう。

$ yarn init -y
{
  name: 'test',
  packageManager: 'yarn@3.5.1'
}

corepackの管理下にあるパッケージマネージャを使ってpackage.jsonを作成すると、packageManagerというプロパティが追加されるようになります。これがあるとyarn以外のパッケージマネージャを使用するとエラーが出るようになります。

Apple Silicon MacにStable Diffusion WebUIをインストールする

Stable DiffusionをApple SiliconのmacOSにインストールしてみましたが、少しコツが必要でした。

インストール時期やApple Siliconの種類によっては若干変わるかもしれませんが、私がM1 Maxチップ搭載のMacBook Proで成功した手順をまとめてみました。

必要なパッケージをインストールする

こちらは公式に従ってインストールします。私の環境では最終的にPythonはここでインストールしたものではなく、Asdfで導入したものを使用しているので、3.10系であればここでインストールしなくてもよいと思われます。

brew install cmake protobuf rust python@3.10 git wget

Stable Diffusion WebUIをダウンロードする

GithubのReleasesでもダウンロードできそうですが、macOSの場合はリポジトリをクローンする必要があります。

任意のディレクトリにリポジトリをcloneしてください。

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui

追加データをダウンロードする

手順の中でここが一番面倒かもしれません。ここでは執筆時点最新のv2.1を使用します。

上記サイトからvae-ft-mse-840000-ema-pruned.ckptというファイルをダウンロードし 、stable-diffusion-webui/models/Stable-difusionに保存してください。

保存後、ファイル名をv2-1_768-ema-pruned.vae.ptに変更してください。

上記サイトからv2-1_768-ema-pruned.safetensorsというファイルをダウンロードし、stable-diffusion-webui/models/Stable-difusionに保存してください。

ここを開いて、表示された内容をコピーし、stable-diffusion-webui/models/Stable-difusionv2-1_768-ema-pruned.yamlというファイル名で保存してください。

Stable Diffusion WebUIを起動する

cd stable-diffusion-webui
./webui.sh

起動すると、以下のようなログが表示されます。URLが出ているので、ここにアクセスしてください。

Model loaded in 3.6s (load weights from disk: 0.3s, create model: 0.2s, apply weights to model: 1.8s, apply half(): 0.6s, load VAE: 0.1s, move model to device: 0.5s).
Running on local URL:  http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.
Startup time: 11.2s (import torch: 2.1s, import gradio: 1.7s, import ldm: 0.4s, other imports: 2.9s, load scripts: 0.3s, load SD checkpoint: 3.6s, create ui: 0.2s).

ブラウザでアクセスすると、以下のような画面が表示されます。

設定変更を行う

同じようにApple Silicon Macにインストールしている方の記事で、この点に触れていない方も結構見かけるので、もしかすると環境依存かもしれませんが、私の環境ではv2.1でGenerateしようとすると以下のようなエラーが表示されました。

  0%|                                                                                                                                                                                                                                    | 0/20 [00:02<?, ?it/s]
Error completing request
Arguments: ('task(6gvckovujc9xon0)', 'sailing ship', '', [], 20, 0, False, False, 1, 1, 7, -1.0, -1.0, 0, 0, 0, False, 512, 512, False, 0.7, 2, 'Latent', 0, 0, 0, [], 0, False, False, 'positive', 'comma', 0, False, False, '', 1, '', 0, '', 0, '', True, False, False, False, 0) {}
Traceback (most recent call last):
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/call_queue.py", line 56, in f
    res = list(func(*args, **kwargs))
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/call_queue.py", line 37, in f
    res = func(*args, **kwargs)
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/txt2img.py", line 56, in txt2img
    processed = process_images(p)
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/processing.py", line 503, in process_images
    res = process_images_inner(p)
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/processing.py", line 653, in process_images_inner
    samples_ddim = p.sample(conditioning=c, unconditional_conditioning=uc, seeds=seeds, subseeds=subseeds, subseed_strength=p.subseed_strength, prompts=prompts)
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/processing.py", line 869, in sample
    samples = self.sampler.sample(self, x, conditioning, unconditional_conditioning, image_conditioning=self.txt2img_image_conditioning(x))
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/sd_samplers_kdiffusion.py", line 358, in sample
    samples = self.launch_sampling(steps, lambda: self.func(self.model_wrap_cfg, x, extra_args={
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/sd_samplers_kdiffusion.py", line 234, in launch_sampling
    return func()
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/sd_samplers_kdiffusion.py", line 358, in <lambda>
    samples = self.launch_sampling(steps, lambda: self.func(self.model_wrap_cfg, x, extra_args={
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/venv/lib/python3.10/site-packages/torch/autograd/grad_mode.py", line 27, in decorate_context
    return func(*args, **kwargs)
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/repositories/k-diffusion/k_diffusion/sampling.py", line 145, in sample_euler_ancestral
    denoised = model(x, sigmas[i] * s_in, **extra_args)
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
    return forward_call(*input, **kwargs)
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/sd_samplers_kdiffusion.py", line 152, in forward
    devices.test_for_nans(x_out, "unet")
  File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/devices.py", line 152, in test_for_nans
    raise NansException(message)
modules.devices.NansException: A tensor with all NaNs was produced in Unet. This could be either because there's not enough precision to represent the picture, or because your video card does not support half type. Try setting the "Upcast cross attention layer to float32" option in Settings > Stable Diffusion or using the --no-half commandline argument to fix this. Use --disable-nan-check commandline argument to disable this check.

ちなみに、v1.4やv1.5ではこの事象は起きなかったので、v2.x系固有のエラーかもしれません。

これを解消するために、設定変更を行います。画面上部のタブからSettingsを選択し、

左のメニューからStable Diffusionを選択します。

バージョンにもよるかもしれませんが、一番下にUpcast cross attention layer to float32というチェックボックスがあるので、ここにチェックをつけてください。

最後に設定を反映させるため、画面上部のApply settingsボタンを押してください。

これでエラーが出ずに画像生成ができるようになります。

気になった話題のまとめ(2023/04/11)

M3チップが出るんじゃないかという噂も出ていますが、こんなハイペースで出されるといつで買おうか迷いますよね。

私もしばらくは買わないと思いますが、持ち運びしやすい13インチMacBook Airはどこかのタイミングで買いたいなと思っています。

最初、「新しいモバイルモニターか」と思っていましたが、よくよく読んでみるとモバイルモニターを縦置きするためのスタンドでした。価格的には3千円程度と手頃な価格ですので、モバイルモニターを使っている方にはお勧めできそうです。

ただ、ベニア板などから切り出せる人からすると自分で作ったほうが早いかもしれません。

気になった話題のまとめ(2023/04/07)

Tailwind CSSの拡張機能、結構増えているんですね。本記事では以下の4つの拡張機能を紹介していますが、tailwindで検索すると、他にも星5の拡張機能はたくさんありました。拡張機能パックでも他の拡張機能がパックされていたりするので、自分に合う拡張機能が他にもあるかもしれません。

気になった話題のまとめ(2023/04/06)

折りたたみ機能は昨今のエディタやIDEには大抵備わっていますが、それをより見やすくするVS Codeの拡張機能です。

折り畳んだ行数が表示されるのと、閉じブラケットも折りたたんでくれるので、より見やすくよりわかりやすくなります。

ショートカットを覚えられたら使いやすいんだろうなとは思いますし、コードを綺麗に保つことでより可読性が向上することが見込めるので、これを機に使ってみようと思います。

気になった話題のまとめ(2023/04/05)

ChatGTPに関する話題

ChatGPT、使っていますか?

私は仕事では結構使っているのですが、正直普段の生活ではあまり活用してきませんでした。

ふと目に入った知らない言葉を説明してもらう、というのであれば確かに普段の生活でも使えそうです。仕事で使っていると、最終的に正しいかどうかを検証するようにしているためか、レシピとかを生成するのはちょっと抵抗がありますね。

ChatGPTを活用したいけど、自社の情報を学習したことによってどこかで流出したらどうしよう、自社や業界に特化して学習してほしいという要望は多いと思います。

ただ、自社で運用するにはコストが高すぎる、そういったことを叶えるサービスになります。これからもこういったサービスは出てくると思いますが、クラウドベンダーからも提供されるのも時間の問題だと思います。

低価格化が進むだけでなく、ChatGPTのミドルウェア化、サービス化が加速していきそうです。

いくつか入れていますが、注意点としては自動から手動へ設定を変えたほうがいいということです。自動は楽ですが、ChatGPTのログがどんどん残るので使いたい時に限定して使ったほうがいいです。

直接ChatGPTに聞いた内容が流れていってしまっては元も子もないですからね。ログを外部に出力して検索できるようなサービスが出てくれば自動でもいいと思いますね。

モバイルバージョンを終了