現在お買い物カゴには何も入っていません。
ブログ
-
入門書
Perplexity AIや他のLLMの知恵を借りて、サーバ管理やプログラミングに役立つ知識を紹介していきます。その他の記事もたまに書きます。
-
新装開店
サーバー移設中につき、暫く御不便をかけます。
旧サイトのアカウントは削除しますので、御注文前に新たに登録し直して下さい。
-
キャパシタ
以下は私が2025年5月31日にJDIへお問い合わせフォームを通して株主提案書を送信した内容です。
JDIが開発可能なキャパシタ技術(スーパーキャパシタ)を、充電池として新規事業化することを提案します。スーパーキャパシタは、リチウムイオン電池と比較して急速充電・放電性能、長寿命、安全性、広い温度耐性に優れ、近年では自動車の回生システムやウェアラブル端末、IoT機器、非常用電源など多様な分野で採用が進んでいます。
例えば、スイスの電動バスでは15秒の急速充電で走行が可能となり、メンテナンスコスト削減と信頼性向上を実現しています。また、スーパーキャパシタは100万回以上の充放電サイクルに耐え、長期運用コスト低減にも寄与します。JDIの精密な薄膜・パターニング技術を活かせば、より高性能なキャパシタの量産化が期待できます。
今後、エネルギー密度向上やハイブリッド型電池との組み合わせで、更なる市場拡大が見込まれるため、JDIの新たな成長分野として積極的な開発・事業化を提案いたします。
-
AIデバイス
以下は私が2025年5月31日にJDIへお問い合わせフォームを通して株主提案書を送信した内容です。
OpenAIによるIo社の買収を受け、AIハードウェア分野での新端末開発が加速する中、JDIが開発中の先端半導体パッケージング技術をIoデバイス向けに積極的に提案・展開することを要望します。
Io社は元Appleのジョナサン・アイブ氏らが設立し、AIを活用した新しい消費者向けハードウェア製品を開発しており、今後OpenAIグループの中核的なデバイス開発拠点となる見通しです。こうした次世代AIデバイスは、高速・大容量データ処理、高密度実装、省電力化、放熱対策など、半導体パッケージ基板に従来以上の性能が求められます。
JDIのガラス基板技術は、表面粗さ0.01μm未満という極めて滑らかな表面を実現し、高周波数帯域(28GHz以上)でも伝送損失を大幅に低減できます。また、ガラス基板は剛性・熱安定性に優れ、チップレット化や大型化が進むAIプロセッサ基板において、歪みや反りを抑えつつ高密度配線(L/S=5/5μm)が可能です。さらに、PanelSemi社との共同開発により、ディスプレイ由来のTFT技術やセンサー用フレキシブル基板も展開でき、Io社の多様なデバイス設計要求に柔軟に対応できます。
AI半導体パッケージング市場は2034年までに年20兆円規模へ成長が見込まれており、JDIの技術はIoデバイスの競争力強化に大きく貢献できると確信します。
つきましては、JDIがIo社およびOpenAIグループに対し、積極的な技術提案と協業体制の構築を推進されることを強く提案いたします。
-
トランプ政権下での米国内製造拠点の確立について
以下は私が2025年3月20日にJDIへお問い合わせフォームを通して株主提案書を送信した内容です。
1. 米国内製造拠点の確立
貴社はOLEDWorksとの戦略的提携を通じて米国内に製造拠点を設立する計画を発表しました。この取り組みを加速し、ディスプレイ製造に加えて半導体パッケージング事業も米国内で展開することを提案します。これにより、地政学的リスクの軽減と米国市場へのアクセス強化が期待できます。
2. インテルとの戦略的提携の模索
経営難でもインテルのアーキテクチャは依然として業界に大きな影響力を持っています。貴社の強みを活かした提携を提案します:
- セラミック基板技術: PanelSemiとの提携で開発中の高性能セラミック基板は、AIチップの熱問題解決に貢献します。
- BBCube: TEXが保有するBBCube製造技術をインテルは次世代三次元集積技術の開発に活かせます。
貴社や貴社の提携会社にとって、インテルとの提携は、技術開発のみならず、インテルが持つ販路の獲得にも繋がるので、提携交渉すべきです。
3. IR情報の頻繁な更新
新規事業、特にデータセンターや半導体パッケージングの進捗状況について、毎月の詳細な報告を提案します。これにより、株主との信頼関係を強化し、貴社の成長戦略への理解を深めることができます。
以上の施策により、貴社の競争力強化と企業価値向上を図ることができると考えます。ご検討のほど、よろしくお願いいたします。
-
Doom Emacsのキーバインドと管理コマンド:標準Emacsとの違い
Doom EmacsはEmacsの機能を拡張し、Vimライクな操作性を取り入れた強力なエディタです。本記事では、標準Emacsとの主要な違いを中心に、キーバインドと管理コマンドについて解説します。
主要なキーバインドの違い
1. 基本操作
操作 標準Emacs Doom Emacs コマンド実行 M-x
SPC :
またはM-x
ファイルを開く C-x C-f
SPC .
ファイルを保存 C-x C-s
SPC f s
または:w
(Evilモード)バッファ切り替え C-x b
SPC b b
バッファ削除 C-x k
SPC b d
2. ウィンドウ操作
操作 標準Emacs Doom Emacs ウィンドウ分割(垂直) C-x 3
SPC w v
ウィンドウ分割(水平) C-x 2
SPC w s
3. 検索と置換
操作 標準Emacs Doom Emacs インクリメンタル検索 C-s
/
(Evilモード) またはC-s
プロジェクト内検索 なし(追加パッケージが必要) SPC s p
4. その他
操作 標準Emacs Doom Emacs キーバインドのヘルプ C-h k
SPC h k
プロジェクト切り替え なし(追加パッケージが必要) SPC p p
設定ファイル編集 手動でファイルを開く SPC f p
スクロールのキーバインド
Doom EmacsはVimライクなスクロール操作を採用しています:
- 1ページ分下にスクロール:
Ctrl-f
または<PageDown>
- 1ページ分上にスクロール:
Ctrl-b
または<PageUp>
- 半ページ分下にスクロール:
Ctrl-d
- 半ページ分上にスクロール:
Ctrl-u
コメントアウトとアンコメント
Doom Emacsでは以下のキーバインドでコメント操作を行います:
- 選択した行をコメントアウト/アンコメント:
gcc
- 選択範囲をコメントアウト/アンコメント:
gc
(ビジュアルモードで範囲選択後)
テキスト選択(Visual Mode)
標準EmacsではCtrl+SPCでマーク開始しますが、Doom Emacsではvimのようにvisual modeで選択します:
- 文字単位の選択:
v
- 行単位の選択:
V
(Shift + v) - 矩形選択:
Ctrl-v
- 単語選択:
viw
- 選択モードの終了:
ESC
またはCtrl-[
選択後の操作:
- コピー:
y
- 切り取り:
d
- 削除:
x
- 置換:
c
- コメントアウト/アンコメント:
gc
Doomコマンドの基本
Doom Emacsの管理には
doom
コマンドを使用します。主要なコマンドは以下の通りです:- doom sync: 設定の変更を反映し、パッケージを更新
- doom upgrade: Doom Emacsとそのパッケージを最新版にアップグレード
- doom doctor: Doom Emacsの環境に問題がないかチェック
- doom env: Doomの環境変数を更新
- doom purge: 不要なパッケージや古いビルドファイルを削除
設定ファイルを変更した後は、必ず
doom sync
を実行して変更を反映させましょう(init.el
、packages.el
。config.el
は不要)。Doom Emacsにインストールされているパッケージによってはaptでインストールしなければならないソフトウェアを呼び出すことがあるので注意が必要です。doom doctor
で確認しましょう。1sudo apt install ripgrep fd-find shellcheck
以下はREADMEからの機械翻訳です。マニュアルには更に詳しい説明があります:
- doom sync は、不足しているパッケージをインストールし、孤立したパッケージを削除し、キャッシュを再生成することで、プライベート設定を Doom と同期します。プライベート init.el または packages.el を変更するとき、または OS パッケージ マネージャーを介して Emacs パッケージ (mu4e や agda など) をインストール/削除するときは、必ずこれを実行します。
- doom upgrade は、Doom を最新リリースおよびインストールされているすべてのパッケージに更新します。
- doom doctor は、システムと設定の一般的な問題を診断します。
- doom env は、起動時に Doom が読み込むファイルにシェル環境のスナップショットをダンプします。これにより、Emacs は PATH などを継承できます。
まとめ
Doom Emacsは標準Emacsとは異なるキーバインドを採用していますが、これにより直感的で効率的な操作が可能になっています。ただし、従来のEmacsユーザーにとっては学習曲線がある点に注意が必要です。
doom
コマンドを効果的に使用することで、環境を最適な状態に保ち、スムーズな編集体験を維持することができます。 - 1ページ分下にスクロール:
-
Doom Emacsのインストールと設定
インストール手順
-
Doom Emacsのリポジトリをクローンする
git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.config/emacs
-
Doom Emacsをインストールする
~/.config/emacs/bin/doom install
これにより、設定ファイルは
~/.config/doom/
に、Doom Emacs用のユーザーディレクトリuser-emacs-directory
は~/.config/emacs/
にインストールされます。従来のEmacsのユーザーディレクトリは~/.emacs.d/
のままですので、影響を受けることはありませんが、バックアップを取ることをお勧めします。 -
パスの設定
Doomコマンドのパスは~/.config/emacs/bin/doom
です。システム全体で利用できるようにパスを通すには、以下の方法があります。-
.bashrcや.zshrcに追加
echo 'export PATH=$PATH:$HOME/.config/emacs/bin' >> ~/.bashrc source ~/.bashrc
または
echo 'export PATH=$PATH:$HOME/.config/emacs/bin' >> ~/.zshrc source ~/.zshrc
.bashrc
以外のファイルでもパスを設定できますが、使用するシェルやログイン方法によって読み込まれるタイミングが異なります。.bashrc
: 通常、ターミナルを新しく開くたびに読み込まれます。.profile
: ログインシェル時に読み込まれます。ターミナルを新しく開くたびに読み込まれないため、反映するにはターミナル内でsource ~/.profile
を実行する必要があります。.bash_aliases
: 通常、.bashrc
内で読み込まれるように設定されています。.bashrc
が読み込まれるたびに自動的に読み込まれます。
-
Doom Emacsの起動
Doom Emacsを起動するには、以下のコマンドを使用します(Emacs 29以降)。Emacsの変数
user-emacs-directory
を指定して起動するためです。1 2emacs --maximized --init-directory ~/.config/emacs/
--maximized
オプションは画面を最大化するためのもので、省略可能です。ショートカットキーに登録すると便利です。
Ubuntuの場合は以下の通りです:- 設定
- キーボード
- ショートカットの表示と設定
- 独自のショートカット
- +をクリック
~/.bash_aliases
にエイリアスを登録しても良いでしょう。alias emacs.doom='emacs --maximized --init-directory ~/.config/emacs/'
基本的な使い方
Doom EmacsはVimユーザーにも親しみやすい設定が整っています。基本的な操作はVimと似ていますが、Emacs独自の機能も多く利用できます。
All-the-icons fontsの文字化けはM-x nerd-icons-install-fonts
を実行すれば解消されます。3Doomコマンドの基礎
Doomコマンドは、Doom Emacsの設定やパッケージ管理に利用されます。例えば、パッケージをインストールする際には、Doom Emacs内で特定のコマンドを実行します。
予めインストールされるパッケージ
Doom Emacsには、多くの便利なパッケージがデフォルトでインストールされています。これにより、すぐにでも効率的な開発環境を構築できます。
多くは~/.config/doom/init.el
の各行をアンコメントし、doom sync
することですぐに有効化出来ます。4Doom Emacsでパッケージをインストールする方法
Doom Emacsでは、
straight.el
がデフォルトのパッケージマネージャーとして使用されています。新しいパッケージをインストールするには、設定ファイルを編集してからdoom sync
コマンドを実行する必要があります。Codeium.elのインストールと設定
-
Codeium.elのインストール
Doom Emacsでは、codeium.el
を直接インストールする方法は通常のEmacsと異なります。まず、~/.config/doom/packages.el
に以下のコードを追加します:(package! codeium :recipe (:host github :repo "Exafunction/codeium.el"))
編集後は、以下のコマンドで設定を反映させます:
~/.config/emacs/bin/doom sync
次にDoom Emacs内で以下のコマンドを実行します:
M-x codeium-install
APIキーを自動取得するオプションが表示されます。autoを選択すると、Webブラウザでログイン画面が表示され、ログイン後にAPIキーが自動取得されます。
~/.config/doom/custom.el
に保存されます。 -
設定
codeium.el
の設定は、customize-variable
コマンドではなく、~/.config/doom/config.el
を直接編集する必要があります。編集後は、doom sync
は不要です。以下のコードは、
codeium-completion-at-point
をcompletion-at-point-functions
に追加するものです:(add-to-list 'completion-at-point-functions #'codeium-completion-at-point)
このコードにより、Codeiumの補完機能が有効になります。また、codeium.elの設定をコピーしても良いでしょう。ただし、
codeium.el
が正しくインストールされ、他の設定が競合していないことを確認する必要があります。
-
-
株主提案:データセンター事業における戦略的提携の推進について
以下は私が2025年1月10日にJDIへお問い合わせフォームを通して株主提案書を送信した内容です。
貴社のデータセンター事業参入にあたり、以下の提案を行います。
-
国内データセンター事業者との戦略的提携
さくらインターネット等の国内データセンター事業者との戦略的提携を進めるべきと考えます。理由は以下の通りです。
・国内企業との提携により、意思決定の迅速化が可能
・既存のデータセンター運営ノウハウの活用による初期投資・運営コストの削減
・日本市場特有の規制やニーズへの効率的な対応 -
基盤技術パートナーとの提携
以下の企業との技術提携を推進すべきと考えます。
・Canonical Japan(Ubuntu/OpenStack環境の構築・運用)
・NVIDIA(GPU/AI技術)
・AMD(CPU/GPU技術)
・Red Hat(OpenShift、エンタープライズLinux)
・IBM(クラウド/AI技術)
理由:
・クラウド基盤の迅速な構築が可能
・AI/ディープラーニング向け環境の最適化
・エンジニア育成プログラムの活用 -
人材確保・育成
データセンター運営には以下の専門人材が必要です。
・OpenStack等のクラウド基盤管理者
・AI/ディープラーニング専門家
・システム運用エンジニア
上記の人材を短期間で確保することは困難であり、パートナー企業のリソース活用が不可欠です。 -
投資対効果
戦略的提携により以下が期待できます。
・初期投資の大幅な抑制
・運営リスクの低減
・市場参入時期の前倒し
・専門的な技術・ノウハウの効率的な獲得
以上の理由により、貴社のデータセンター事業展開において、上記企業との戦略的提携を積極的に推進することを提案いたします。
-
-
VimとNeovimの基本とパッケージマネージャ、そしてCodeiumについて
Vimtutorについて
Vimは非常に強力なテキストエディタであり、特にプログラマーやシステム管理者に人気があります。しかし、初めてVimを使う人にとっては、その操作方法が少し難解に感じられるかもしれません。そこで登場するのがVimtutorです。
Vimtutorは、Vimの基本的な操作方法を学ぶためのチュートリアルです。多くのUnix系オペレーティングシステムには、Vimtutorが標準でインストールされています。ターミナルで
vimtutor ja
と入力するだけで、インタラクティブな学習環境が提供されます。このチュートリアルを通じて、基本的な移動、編集、保存、そしてVimのモード(ノーマルモード、インサートモード、ビジュアルモードなど)について学ぶことができます。Tagファイルの併用
Emacsで定義元へ移動するために
etags
を使用しtagファイルを作成していれば、Vimと併用できます。例えば:set tags=~/.venv3.12/TAGS
のように選択できます。Tabキーで入力補完できます。Ctrl-]
で定義元へ移動し、Ctrl-t
で戻ります。頻繁に使用するならば~/.vimrc
に書いておきましょう。因みにコロンは不要です。1Vimの標準装備のパッケージマネージャについて
Vim自体には標準でパッケージマネージャが含まれています。Vim 8.0以降では、ネイティブのパッケージ管理機能が導入されています。これにより、プラグインのインストールや管理が非常に簡単になりました。
使い方
-
パッケージのインストール:
- パッケージをインストールするには、
~/.vim/pack/<namespace>/start/
ディレクトリにプラグインを配置します。 - 例えば、
~/.vim/pack/plugins/start/
にプラグインをダウンロードして配置すると、Vimが自動的にそのプラグインを読み込みます。
- パッケージをインストールするには、
-
パッケージのアップデート:
- パッケージのアップデートは、プラグインのリポジトリから最新のバージョンをダウンロードして、同じディレクトリに置き換えるだけです。
人気のあるパッケージマネージャ
Vimの標準パッケージマネージャ以外にも、いくつかの人気のあるパッケージマネージャがあります。
- Vundle: Vundleは、Vim用のプラグインマネージャで、簡単にプラグインをインストール、アップデート、削除することができます。
- Pathogen: Pathogenは、プラグインを簡単に管理するためのツールで、プラグインを特定のディレクトリに配置するだけで自動的に読み込まれます。
- Plug: Plugは、Vim用の軽量なプラグインマネージャで、Vundleと同様に簡単にプラグインを管理できます。
Neovimについて
Neovimは、Vimのフォークであり、Vimの機能を拡張し、よりモダンなエディタとしての機能を提供します。Neovimは、Vimと互換性があり、Vimのプラグインや設定ファイルをそのまま使用することができます。
Neovimの特徴
- 非同期ジョブ: Neovimは非同期ジョブをサポートしており、バックグラウンドでの処理が可能です。
- リモートプラグイン: Neovimはリモートプラグインをサポートしており、PythonやLuaなどの言語でプラグインを作成することができます。
- パフォーマンス: NeovimはVimよりも高速で、メモリ使用量も少ないです。
Codeiumについて
Codeiumは、AIを活用したコード補完ツールで、開発者の生産性を大幅に向上させることができます。Codeiumは、VimやNeovimだけでなく、他の多くのエディタやIDEでも利用可能です。
Codeiumの特徴
- AIによるコード補完: Codeiumは、AIを使用してコードの補完を行います。これにより、コーディングの速度が向上し、エラーの発生を減少させることができます。
- 多言語対応: Codeiumは、JavaScript、Python、Java、C++など、多くのプログラミング言語に対応しています。
- インテグレーション: Codeiumは、VimやNeovimだけでなく、VSCode、IntelliJ、Sublime TextなどのエディタやIDEとも統合されています。
Codeiumのマニュアルインストール
Ubuntuでのインストールを想定しています。
Vimの場合:
git clone https://github.com/Exafunction/codeium.vim ~/.vim/pack/Exafunction/start/codeium.vim
Neovimの場合:
git clone https://github.com/Exafunction/codeium.vim ~/.config/nvim/pack/Exafunction/start/codeium.vim
インストール後に
:Codeium Auth
を実行するとProvide Authentication Tokenページへ飛びますのでログインし、あなたに与えられたトークンをVim / Neovimにコピー&ペーストして下さい。まとめ
VimとNeovimは、非常に強力なテキストエディタであり、その機能を最大限に引き出すためには、Vimtutorやパッケージマネージャを活用することが重要です。また、CodeiumのようなAIツールを組み合わせることで、さらに効率的な開発環境を構築することができます。これらのツールを駆使して、あなたの開発生産性を最大限に引き出しましょう!
-
-
PywebviewでPythonとJavaScriptを連携:Promiseの役割と具体例
Pywebviewは、PythonとJavaScriptを連携させたデスクトップアプリケーション開発に役立つフレームワークです。しかし、Pythonプログラマーにとって慣れない「非同期処理」や「Promise」に直面することもあります。本記事では、py-chessboardjsを例に、以下を詳しく解説します:
- Promiseとは何か、なぜ必要か
- Pythonのメソッド戻り値をJavaScriptの関数に活用する方法
- 具体例:PGNファイルの読み込み
Promiseとは?
Promiseは、非同期処理の結果を待つためのオブジェクトであり、成功(
resolved
)または失敗(rejected
)の状態を持ちます。- Pythonでは、関数は通常即座に戻り値を返します(同期処理)。
- 一方、JavaScriptでは処理が非同期になることが多く、処理完了後に値を受け取る必要があります。
Pythonでは処理が終わるのを待って変数等に代入してくれますが、JavaScriptでは待ってくれません。
これを解決するために、PywebviewはPythonのメソッド呼び出し結果をPromiseでラップします。これにより、JavaScript側でthen
を使って結果を受け取れるようになります。
Pythonメソッドの戻り値をJavaScriptで利用する
以下は、py-chessboardjsのPGNファイル読み込み機能を使い、Pythonのメソッド結果をJavaScriptで処理する例です。
Python側のコード
PythonでPGNファイルを読み込み、その状態(FEN文字列)を返すメソッドを定義します:
class Api: def open_pgn_dialog(self): """ ユーザーにファイルダイアログを表示し、選択したPGNファイルを読み込み、 そのゲーム状態をFEN文字列で返す。 """ file_types = ('PGN File (*.pgn)', 'All files (*.*)') file_path = self.window.create_file_dialog(webview.OPEN_DIALOG, file_types=file_types)[0] if os.path.exists(file_path): self.pgn = open(file_path) self.load_games_from_file() return self.board.fen() # 現在のFEN文字列を返す return None
JavaScript側のコード
JavaScriptで、このPythonメソッドを呼び出し、結果(FEN文字列)を利用します:
function openPgnDialog() { // Python API を呼び出し pywebview.api.open_pgn_dialog().then(fen => { if (fen) { console.log('FEN文字列:', fen); // 必要に応じてフロントエンドで処理 updateBoardWithFen(fen); } else { console.error('PGNファイルの読み込みに失敗しました。'); } }).catch(error => { console.error('エラーが発生しました:', error); }); } // FEN文字列でボードを更新する例(仮) function updateBoardWithFen(fen) { alert('新しいFEN: ' + fen); }
ポイント:
pywebview.api.open_pgn_dialog()
はPromiseを返し、then
で結果を受け取り処理しています。
Promiseの基本的な使い方(Pythonプログラマー向け)
PromiseはPythonの「関数の戻り値」をJavaScriptの非同期処理に適応するための仕組みです。
- Pythonの戻り値はPromiseの成功状態(resolved value)として扱われます。
- JavaScriptでは、
then
を使って成功時の値を受け取ります。
Promiseの流れ
- Pythonメソッドが値を返す。
- PywebviewがPromiseに変換。
- JavaScriptで
then
を使い値を処理。
フロントエンドのUIデザイン:Bootstrapを活用
PywebviewはHTML/CSS/JavaScriptフレームワークを使用できるため、py-chessboardjsではBootstrapを活用し、ユーザーにとって使いやすいUIを構築しています。
実装例
以下は、
index.html
のナビゲーションバー部分です(省略のために一部改変):<nav class="navbar navbar-expand-sm navbar-dark bg-dark"> <div class="container-fluid"> <a class="navbar-brand" href="#">Py-Chessboardjs</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavDarkDropdown" aria-controls="navbarNavDarkDropdown" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNavDarkDropdown"> <ul class="navbar-nav"> <li class="nav-item"><a class="nav-link" href="#">Home</a></li> <li class="nav-item"><a class="nav-link" href="#">Settings</a></li> </ul> </div> </div> </nav>
結果、レスポンシブなナビゲーションバーが表示され、簡単にカスタマイズできます。
まとめ
Promiseは、PythonとJavaScriptの動作の違いを吸収するために必要な仕組みです。今回の例では、py-chessboardjsを使いながら以下を学びました:
- PythonメソッドをJavaScriptから呼び出し、戻り値をPromiseで扱う方法。
- Bootstrapを利用したスタイリッシュなフロントエンドデザイン。
これらを応用すれば、直感的で高性能なアプリケーションを構築できます。
アロー関数を使う理由
今回、ChatGPTとClaudeに記事を書いてもらう際にpy-chessboardjsのコードを標準の書き方に修正してもらい、その理由を解説してもらいました。以下はその内容です。
JavaScriptの=>
はアロー関数(arrow function)を意味し、関数を簡潔に書くための記法です。従来のfunction
キーワードを使った関数定義と同じ動作をしますが、以下のような利点があります。-
簡潔な記法:
- 従来の
function
キーワードを省略できます。 -
例えば、以下のようなコードが簡略化されます:
// 通常の関数 function add(a, b) { return a + b; } // アロー関数 const add = (a, b) => a + b;
- 従来の
-
this
の挙動が直感的:-
アロー関数は親スコープの
this
をそのまま使用します。一方、従来のfunction
は呼び出し方によってthis
が変わるため、意図しない挙動を防げます。例:
function Example() { this.value = 42; // 通常の関数(意図した
this
ではない可能性あり) setTimeout(function() { console.log(this.value); // undefined(this
はグローバルを指す) }, 1000); // アロー関数(意図したthis
を保持) setTimeout(() => { console.log(this.value); // 42 }, 1000); } new Example();
-
-
Promiseチェーンでの一般的な書き方:
- Promiseチェーン(
then
やcatch
)内で、アロー関数を使うのが一般的です。 -
シンプルなコールバック処理に適しています:
// 通常の関数 pywebview.api.get_data().then(function(result) { console.log(result); }); // アロー関数 pywebview.api.get_data().then(result => { console.log(result); });
- Promiseチェーン(
アロー関数が好まれるケース
- 短い関数(関数リテラル): アロー関数は、数行で完結する関数リテラルに適しています。
- コールバック関数: 非同期処理(
setTimeout
やPromise
など)で使うと直感的です。
アロー関数を避けるべきケース
アロー関数は
this
の挙動が予測しにくいケースがあります。this
を明示的に保持する必要がある場合: メソッド内やイベントリスナーなど、this
の挙動が重要な場合は、従来の関数式を使用する方が安全です。-
this
の再定義が必要な場合: アロー関数ではthis
を新たに定義できません。そのため、例えばイベントリスナーの削除が必要な場合は避けるべきです。// イベントリスナーの登録 button.addEventListener('click', () => console.log('clicked')); // イベントリスナーの削除(動作しない) button.removeEventListener('click', () => console.log('clicked')); // 別の関数として扱われる
アロー関数は実際には
this
を明示的に保持するのに適していません。むしろ、アロー関数はthis
を現在のスコープから継承するため、メソッドやイベントリスナーでは注意が必要です。アロー関数は
this
の挙動が独特で、以下のような特徴があります:- アロー関数は、定義された場所の
this
コンテキストを継承します。 - 自身の
this
を持たず、外側のスコープのthis
をそのまま使用します。 - メソッドやイベントリスナーでは、通常の関数式の方が
this
の参照が明確です。
結論
=>
(アロー関数)を使った理由:
本記事ではPromiseチェーンでの一般的な記法を重視し、可読性と簡潔さのためにアロー関数を使用しました。特に短いコールバック関数を記述する場合、アロー関数が現代的で簡潔な書き方として推奨されるケースが多いです。
ただし、もし従来のfunction
キーワードに慣れている場合、どちらを使うかは個人のスタイルやプロジェクトのコーディング規約に依存します。 -
JDIへの株主提案
以下は私が2024年11月19日にJDIへお問い合わせフォームを通して株主提案書を送信した内容です。実際に送信した内容は文字数制限のために文章の一部を削除してあります。
ジャパンディスプレイ株式会社 御中
株主提案書
ディスプレイの高付加価値化とモジュール化に関する提案
-
統合型ディスプレイモジュールの開発
小型ディスプレイに、プロセッサー、メインメモリー、記憶媒体を含む基盤を内蔵することで、付加価値を大幅に高めることを提案します。この統合により、以下の利点が期待できます:- 製品の差別化と競争力強化
- 顧客のデバイス設計簡素化によるコスト削減
- IoTデバイスやウェアラブル機器市場での新たな需要創出
-
RISC-Vアーキテクチャの採用
オープンソースのRISC-Vアーキテクチャを採用することで、以下のメリットが得られます:- カスタマイズ性の向上
- 開発コストの削減
- 省電力化と性能向上の両立
-
大日本印刷との技術提携強化
大日本印刷(DNP)の持つ先進技術を活用し、ディスプレイのモジュール化を推進します。
DNPの技術が本提案に寄与する点は以下の通りです:a. 印刷エレクトロニクス技術
DNPの印刷エレクトロニクス技術を用いることで、薄型・軽量・フレキシブルな電子回路の形成が可能となります。
DNPのナノインプリント技術により、ディスプレイへの回路内蔵が容易になり、モジュール化を効率的に進められます1。b. 光学フィルム技術
DNPの高機能光学フィルム技術を活用することで、ディスプレイの視認性向上が可能となります。
これは、統合型モジュールの性能向上に直結します2。c. メタバース関連技術
DNPが開発中のメタバース技術を活用することで、統合型ディスプレイモジュールに新たな付加価値を付与できる可能性があります。
例えば、XRコミュニケーション技術を組み込むことで、より没入感の高い表示が可能になります3。d. デジタルアーカイブ技術
DNPのデジタルアーカイブ技術を応用することで、統合型ディスプレイモジュールにコンテンツ管理機能を付加し、
より高度な情報表示システムを構築できます4。 -
新市場戦略
開発した統合型ディスプレイモジュールを、スマートフォン、スマートウォッチ、ヘッドマウントディスプレイのメーカーに積極的に提案し、採用を促進します。
これらの施策により、ジャパンディスプレイの小型ディスプレイ事業の競争力を飛躍的に高め、新たな成長機会を創出できると考えます。大日本印刷との技術提携を通じて、印刷技術とエレクトロニクス技術の融合による革新的な製品開発が可能となり、市場での優位性を確立できるものと確信しております。
-
-
Self-Debuggingの先駆け:bolt.new
bolt.newは、AIを活用した革新的なWeb開発プラットフォームです。自然言語での指示だけで、フルスタックのWebアプリケーションを簡単に作成できる画期的なツールとして注目を集めています。
AIが生み出す驚異のシミュレーション:bolt.newの実力
最新のAI駆動型Web開発プラットフォーム、bolt.newの驚くべき能力をご紹介します。私自身がbolt.newを使って作成したシミュレーション「Kinzhal Busters」をご覧ください。このプロジェクトは、現代の軍事技術と防衛システムを模したインタラクティブな3Dシミュレーションです。
Kinzhal Busters: https://github.com/akuroiwa/kinzhal-busters
このシミュレーションでは、発電所に飛来するKinzhal(キンジャール)ミサイルと、それを迎撃しようとする複数のドローンによる防衛システムの動きを再現しています。Three.jsを駆使した立体的な表現により、複雑な軌道や迎撃のプロセスを視覚的に理解しやすい形で表現しています。
bolt.newの驚異的な点は、このような高度な3Dシミュレーションを、プログラミングの詳細な知識がなくても、自然言語での指示だけで作成できることです。AIが要求を理解し、適切なライブラリやフレームワークを選択し、必要なコードを生成してくれるのです。
Self-Debugging: エラー解決の新たなアプローチ
bolt.newの特筆すべき機能の一つが、Self-Debuggingです。開発中に発生したエラーを、AIが自動的に解析し修正案を提示します。「Fix problem」ボタンをクリックするだけで、AIがエラーを修正し、アプリケーションを正常に動作させることができます。
Self-Debuggingについては、論文Teaching Large Language Models to Self-Debugを参照してください。これは、これからのコード生成サービスで主流になる可能性が高い機能です。
Viteとパッケージのインストール
bolt.newでプロジェクトを作成すると、デフォルトでViteが選択されます。Viteは高速な開発サーバーと最適化されたビルドツールを提供する次世代のフロントエンドツールです。
ノーコードで全てが完結する訳ではありません。Stackblitzならば自前でインストールせずともWebブラウザで確認できますが、お気に入りのエディタでコードを手直しし、気軽に動作確認したいでしょう。ここでは、その方法を説明します。
Ubuntuでの必要なパッケージのインストール
- Node.jsとnpm:
sudo apt update sudo apt install nodejs npm
- 必要に応じてNode.jsのバージョンを更新:
sudo npm install -g n sudo n stable hash -r npm -v node -v
npmでインストールする必要があるもの
プロジェクトのルートディレクトリで以下のコマンドを実行します:
npm install
これにより、
package.json
に記載されている全ての依存関係がインストールされます。また、bolt.newで生成されるプロジェクトの.gitignoreファイルには、通常
components/
ディレクトリが含まれ、バージョン管理から除外されます。Viteプロジェクトの起動
- 開発サーバーの起動:
npm run dev
これにより、開発用のサーバーが起動し、通常はhttp://localhost:5173でアプリケーションにアクセスできます。
h
を入力しenter
を押せば、使い方を表示してくれます。- プロダクションビルド:
npm run build
これにより、プロダクション用のビルドが作成されます。
- プロダクションビルドのプレビュー:
npm run preview
ビルドされたプロダクションバージョンをローカルでプレビューできます。
StackBlitzとGitHub連携
StackBlitzは、GitHubリポジトリとの連携機能を提供しています。
bolt.newに作成してもらったプロジェクトをGitHubリポジトリとして登録できます。
プロジェクトの動作確認も出来るので、Webブラウザさえあれば、いつでも作業できます。StackblitzもNetlifyも、bolt.newと同じくGitHubアカウントでアカウント登録したりサインインしたりできます。
bolt.newからNetlifyへのデプロイとユーザー権限移譲
bolt.newで作成したプロジェクトをNetlifyにデプロイした直後に表示される「claim URL」をクリックすることで、
アプリケーションの所有権があなたのNetlifyアカウントに移行されます。
この過程で、デプロイ時に表示されたURLを控えておくことが重要です。新しい所有者がプロジェクトにアクセスする際に必要となります。また、GitHubで更新し、Netlifyのアプリも更新したい場合にはリポジトリの登録が必要です。
bolt.newは、AIの力を借りてWeb開発のプロセスを大幅に簡素化し、効率化する革新的なツールです。プログラミングの経験が浅い方でも、複雑なWebアプリケーションを作成できる可能性を秘めています。