Node.jsでシェルスクリプト実行
Node.jsでシェルスクリプトを実行するのになぜか手間取ったので備忘録として記録。
公式ドキュメントを参考にしました。
https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
環境
- Node.js : v10.12.0
コマンド実行
main.js
const child_process = require('child_process');
child_process.exec('ls ./', (err, stdout, stderr) => {
if (err) { console.log(err); }
console.log(stdout);
});
・結果
hello_world.sh
main.js
package.json
シェルスクリプト実行
main.js
const child_process = require('child_process');
child_process.exec('./hello_world.sh', (err, stdout, stderr) => {
if (err) { console.log(err); }
console.log(stdout);
});
hello_world.sh
echo 'Hello world!'
・結果
Hello world!
シェルスクリプト実行(引数あり)
main.js
const child_process = require('child_process');
child_process.exec('./hello_world.sh \'hello world!\'', (err, stdout, stderr) => {
if (err) { console.log(err); }
console.log(stdout);
});
hello_world.sh
echo $1
・結果
hello world!
今回はchild_process.exec()を使用してシェルスクリプトを実行しましたが、他にもchild_process.execSync(), child_process.spawn()を使用して実行できるようですが、理解できていません。。
下記リンクが参考になりそうです。
Electron導入編
今回使用する環境は下記のとおりです。
ElectronはNode.jsに付いてくるnpm(Node Package Manager)を使用してインストールします。
そのため、Electronの導入は、
Node.jsインストール→npmを使用してElectronをインストール
で完了します。
Node.jsインストール
インストールには、下記サイトにお世話になりました。
正直なところ、上記リンク先の情報以外に書くことがありませんが一応備忘録として、実際の手順を記載します。
Node.jsのバージョン管理用ツールnodebrewをhomebrewを使用してインストール
$ brew install nodebrew
nodebrewのインストールを確認。バージョン情報が表示されれば成功。
$ nodebrew nodebrew 1.0.1 Usage: nodebrew help Show this message nodebrew installDownload and install (from binary) nodebrew compile Download and install (from source) nodebrew install-binary Alias of `install` (For backword compatibility) nodebrew uninstall Uninstall nodebrew use Use nodebrew list List installed versions nodebrew ls Alias for `list` nodebrew ls-remote List remote versions nodebrew ls-all List remote and installed versions nodebrew alias Set alias nodebrew unalias Remove alias nodebrew clean | all Remove source file nodebrew selfupdate Update nodebrew nodebrew migrate-package Install global NPM packages contained in to current version nodebrew exec -- Execute using specified Example: # install nodebrew install v8.9.4 # use a specific version number nodebrew use v8.9.4
~/.bash_profile に下記内容を追記
NODEBREW_HOME=/usr/local/var/nodebrew/current
export NODEBREW_HOME
export NODEBREW_ROOT=/usr/local/var/nodebrew export PATH=$PATH:$NODEBREW_HOME/bin
Node.jsの安定版をインストール
$ nodebrew install-binary stable
Node.jsがインストールされたことを確認
$ nodebrew list v10.14.1
インストールしたNode.jsの使用設定
$ nodebrew use 10.14.1 use v10.14.1
Node.js のバージョン確認
$ node -v v10.14.1
以上でNode.jsの準備完了です。
Electronインストール
Electronのインストールには、Node.jsに含まれるnpmを使用します。
npmのバージョンを確認
$ npm -v 6.4.1
- 任意のディレクトリでnpm init
$ cd ~/workspace/electron/hello $ npm init $ npm init -y Wrote to /Users/user/workspace/electron/hello/package.json: { "name": "hello", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
- 1.と同じディレクトリでnpm install electron
$ npm install electron --save // package.json の dependencies に electronが追加されます。
- electron を実行。
$ ./node_modules/electron/dist/Electron.app/Contents/MacOS/Electron
すると下記の画面が表示されました。
想像以上に簡単かつ迅速に環境を用意することができ、Node.jsの魅力を感じました。
次回から画面の作成に取り掛かります。
デスクトップアプリ作成
業務でAruduinoを使用してテストをしていて、Aruduinoを操作する用のデスクトップアプリを作ると便利そうだなと思ったので、今更(?)ですが、「Electron」を使ってデスクトップアプリ作成に挑戦してみます。
「Electron」を選定した理由は下記2つです。
- 1つのコードでwindows, macで動作可能だからです。
- 今まであまり触れることがなかったjavascriptを学習する機会にできる。
※他に良いフレームワークがあれば教えていただけると幸いです。
Electronとは
Electronは、GitHubが開発したオープンソースのソフトウェアフレームワークである。
ChromiumとNode.jsを使っており、HTML、CSS、JavaScriptのようなWeb技術で、macOS、Windows、Linuxに対応したデスクトップアプリケーションをつくることができる。
GitHubやAtomに使われている言語で使いがいがありそうです。
次回、導入編を追加します。
mallocとfree
ソースコードレビューにてmalloc(sizeof(int))したポインタをvoid*でポインタ渡しし、
ポインタ渡しした先でvoid*をfreeした場合、型情報がわからないのにメモリ解放がなぜできるの?という話題があったので、調べた結果を記録。
// sample
int main()
{
int* a = malloc(sizeof(int));
funcA( a );
}
void funcA( void* a )
{
free( a ); // なぜint分のメモリ解放できる?
}
答えは、↓のサイトにありました。
まだ、理解できていませんが、要約すると、
・malloc()はプロセスから要求されたサイズに応じてmalloc()の管理するchunkという単位で、確保したプールからメモリを切り出し、要求側にはchunkの管理部を除いた領域の先頭アドレスを返す。
・free()では、chunk管理部から確保しているメモリ領域を取得し解放する。
malloc、freeを呼んだ先でchunk管理部が存在するため、void*でもメモリ解放できるとのこと。
考えてみれば、当たり前のような仕組みなのですが、改めて基本的な知識不足を感じました。
後日説明&ソースコードを整理して追記します。。