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()を使用して実行できるようですが、理解できていません。。

下記リンクが参考になりそうです。

qiita.com

Electron導入編

今回使用する環境は下記のとおりです。

macOS Sierra 10.12.6

 

ElectronはNode.jsに付いてくるnpm(Node Package Manager)を使用してインストールします。

そのため、Electronの導入は、

Node.jsインストール→npmを使用してElectronをインストール

で完了します。

 

Node.jsインストール

インストールには、下記サイトにお世話になりました。

qiita.com

正直なところ、上記リンク先の情報以外に書くことがありませんが一応備忘録として、実際の手順を記載します。

 

Node.jsのバージョン管理用ツールnodebrewをhomebrewを使用してインストール

$ brew install nodebrew

nodebrewのインストールを確認。バージョン情報が表示されれば成功。

$ nodebrew
nodebrew 1.0.1

Usage:
    nodebrew help                         Show this message
    nodebrew install             Download 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
  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"
    }
    
  2. 1.と同じディレクトリでnpm install electron
    $ npm install electron --save
    // package.json の dependencies に electronが追加されます。
    
  3. electron を実行。
    $ ./node_modules/electron/dist/Electron.app/Contents/MacOS/Electron
    
    すると下記の画面が表示されました。

f:id:oga1123:20181204032442p:plain

想像以上に簡単かつ迅速に環境を用意することができ、Node.jsの魅力を感じました。

 

次回から画面の作成に取り掛かります。

デスクトップアプリ作成

業務でAruduinoを使用してテストをしていて、Aruduinoを操作する用のデスクトップアプリを作ると便利そうだなと思ったので、今更(?)ですが、「Electron」を使ってデスクトップアプリ作成に挑戦してみます。

 

「Electron」を選定した理由は下記2つです。

  • 1つのコードでwindows, macで動作可能だからです。
  • 今まであまり触れることがなかったjavascriptを学習する機会にできる。

※他に良いフレームワークがあれば教えていただけると幸いです。

f:id:oga1123:20181128224031p:plain

Electronとは

Electronは、GitHubが開発したオープンソースソフトウェアフレームワークである。

ChromiumNode.jsを使っており、HTMLCSSJavaScriptのようなWeb技術で、macOSWindowsLinuxに対応したデスクトップアプリケーションをつくることができる。

GitHubAtomに使われている言語で使いがいがありそうです。

 

次回、導入編を追加します。

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分のメモリ解放できる?

}

答えは、↓のサイトにありました。

www.valinux.co.jp

 

まだ、理解できていませんが、要約すると、

malloc()はプロセスから要求されたサイズに応じてmalloc()の管理するchunkという単位で、確保したプールからメモリを切り出し、要求側にはchunkの管理部を除いた領域の先頭アドレスを返す。

・free()では、chunk管理部から確保しているメモリ領域を取得し解放する。

malloc、freeを呼んだ先でchunk管理部が存在するため、void*でもメモリ解放できるとのこと。

 

考えてみれば、当たり前のような仕組みなのですが、改めて基本的な知識不足を感じました。

後日説明&ソースコードを整理して追記します。。

はじめまして

はじめまして。

SE3年目の社会人です。

絶賛C++勉強中です。

 

・文章が下手くそ(日本語をうまく扱えない)

・インプットを整理できていない(すぐ記憶から抜け曖昧になってしまう。。)

といったことからブログを書いたら良いと思いはじめてみました。

プログラミングの勉強、気になる技術等に関して記載しようと思います。

 

これからよろしくお願いします。