エンジニアのはしがき

プログラミングの日々の知見を書き連ねているブログです

AngularをElectronでネイティブアプリ化する

f:id:tansantktk:20201229141545p:plain

ElectronはVSCode, Slack, Atomにも使われている技術でWebアプリをネイティブアプリとして出力できるパッケージです。 例えば、Angularアプリをお手軽にクロスプラットフォームにネイティブアプリ化ができます。

先日、実際に試してみたのでパッケージングまでの手順を記録しておきます。

動作環境

Windows10 20H2

$ node -v
v10.22.0

$ npm -v
6.14.6

$ ng --version
Angular CLI: 11.0.2
Node: 10.22.0

Angularプロジェクトを準備

まずは既に作成されたAngularプロジェクトを用意します。 今回の例ではsample-appという名前のプロジェクトを作成しました。

もし軽く試すだけなら、公式のチュートリアルに沿って新規プロジェクトを作るのが手っ取り早いのでおすすめです。

Angular 日本語ドキュメンテーション

Electronをインストール

まずはnpm installしていきます。

$ npm i --save-dev electron

Electron用の設定ファイルを作成

Angularプロジェクトのディレクトリ最上部にmain.jsを作成します。 このmain.jsはelectronでビルドする際の設定値を保持します。

$ touch main.js

main.jsの中身は以下のように記述します。

main.js

const { app, BrowserWindow } = require('electron')
function createWindow () {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  })
  win.loadFile('dist/sample-app/index.html')
}
app.whenReady().then(createWindow)
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})
app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow()
  }
})

注意すべき点は、win.loadFile('...')の引数は、Angularでビルドした後に出力されたindex.htmlへのパスになるように指定する必要があります。 ここで存在しないパスを指定してしまうと、Electronでビルドしたネイティブアプリを起動しても画面が真っ白になり動作しません。 (ここで何度かハマりました)

続いてpackage.jsonに追記します。

package.json

{
  ...
  "name": "sample-app",
  "version": "0.0.0",
  "author": "your name",
  "description": "My Electron app",
  "main": "main.js",
  "scripts": {
    "electron": "ng build --base-href ./ && npx electron ."
  ...
}

ng newで作成したAngularプロジェクトにはauthor, descriptionがありませんが、Electronでパッケージングするにはどちらも記述しておかないと、エラーになりますので必ず記述しておきます。

scriptsに追記をしたことで、npm run electronをターミナルで実行すれば、Angularのビルド完了後にElectronのビルドが実行されるようになります。

続いてindex.htmlを以下のように修正します。

index.html

...
<base href="./">
...

最後にangular.jsonのoutputPathにビルド後に出力されたプロジェクトのディレクトリを指定します。

angular.json

{
    "projects": {
      "sample-app": {
        "architect": {
          "build": {
            "options": {
              "outputPath": "dist/sample-app",
            },
            ...
        }
      }
    },
    ...
}

ElectronでWebアプリを起動してみる

ここまでの設定ができたら、後は以下のコマンドを実行するのみです。

$ npm run electron

新規ウィンドウが立ち上がり、Electron上でアプリが動作するはずです。

Electronでパッケージングする

ElectronでAngularアプリが動いたことを確認できたら、配布できるようにパッケージングします。 プロジェクトのルートで下記を実行します。

$ npx @electron-forge/cli import
$ npm run make

処理が終わるとoutディレクトリ内に実行ファイルの入ったディレクトリが作成されているはずです。 Windowsの場合は、out/{プロジェクト名}-win32-x64/{プロジェクト名}.exeを実行すれば、ネイティブアプリ化されたAngularアプリが動きます。

あとがき

Electronの嬉しいところは、Webアプリをそのままネイティブアプリ化できるという点と、 クロスプラットフォーム(Win, Mac, Linux)であることに尽きると思います。

HTML, CSS, JSといったWebアプリの知識がそのまま生かせるのも良いですね😊

ネイティブアプリ開発は専用の言語や仕様を覚える必要がある点で割と勉強コスト、保守コストが高めだったりするので 機会があれば業務にも積極導入していきたいと思いました。

.NETライブラリのClosedXMLでExcelファイルを生成する

Excelは好きですか?
僕は嫌いです。大概の内容はマークダウンで済むと思っています。 しかしながら、最近バックエンド(ASP.NET Core)でExcel出力機能の実装を強いられましたのでその方法を記録しておきたいと思います。

f:id:tansantktk:20201118205539p:plain

↓フロントエンド(Node.js)でエクセル生成する方法をお探しの場合は以下の記事へどうぞ!

tm-progapp.hatenablog.com

↓ClosedXMLで既存Excelファイルを編集する方法は以下の記事で紹介してます。

tm-progapp.hatenablog.com

続きを読む

プログラミングに関する情報をググる時のコツ

f:id:tansantktk:20201216122222p:plain

業務では、Google先生を使わない日はほぼありません。 エラーが表示されて解決方法を探したり、CUIのコマンドを思い出す為に検索したりするのですが、1つググり方を失敗すると無駄に時間がかかってしまいます。

今回はどうググれば求める答えにたどり着き易かったのかを、私なりの今までの経験からまとめていきますのでお役に立ててもらえればと思います😊

続きを読む

プログラミング勉強におすすめの書籍・サイト紹介

f:id:tansantktk:20201216113918p:plain

こんばんは! 今回は、今までに読んだプログラミング関連の書籍から私のお薦めの本を紹介していきたいと思います。

昨今では公式サイト等のドキュメントやチュートリアルも充実しているので、本を買わなくとも勉強できることも多くなってきました。 一方で、ネットでは断片的にしか見つけられない情報や、実践的なテクニックは書籍から情報を得る方が良いケースもありました。

他にも良い書籍・サイトがあれば追記していきたいと思います!

続きを読む

VSCodeからsshでRaspberry Pi Zero Wのソースコードを編集できなかった

VSCodeの拡張機能に「Remote Development」というものがあるのですが、 これを使うとssh接続で接続先のソースコードをVSCode上で記述・保存ができるという大変便利な機能となっています。

f:id:tansantktk:20201216112930p:plain

…が、残念ながらRaspberry Pi Zero WではCPU的にできませんでした😭

結論

  • Raspberry Pi Zero WのCPUはARM v6だが、Remote Developmentは未対応だった為、使えなかった…。
  • ARM v8なら対応しているようです。

ラズパイ バージョン別対応表

Zero系と昔のバージョンのラズパイはRemote Development未対応でした。 今から買うなら値段もお手頃ですし、ラズパイ4をとりあえず買っとくのが安牌ではないでしょうか😎

名称 CPU Remote Developmentの利用
Raspberry Pi Model A ARMv6 ×
Raspberry Pi 1 Model A+ ARMv6 ×
Raspberry Pi 1 Model B ARMv6 ×
Raspberry Pi 1 Model B+ ARMv6 ×
Raspberry Pi 2 Model B ARMv7 ×
Raspberry Pi 2 Model B V1.2 ARMv8(64bit)
Raspberry Pi 3 Model A+ ARMv8(64bit)
Raspberry Pi 3 Model B ARMv8(64bit)
Raspberry Pi 3 Model B+ ARMv8(64bit)
Raspberry Pi 4 Model B ARMv8(64bit)
Raspberry Pi Zero ARM v6 ×
Raspberry Pi Zero W ARM v6 ×
Raspberry Pi Zero WH ARM v6 ×

Remote Developmentってどう使うの?

下記のQiita記事で詳しく解説されていますので、そちらを見ていただいた方が早いと思います。

qiita.com

あとがき

結局、WindowsのVSCodeでソースを書いて、scpでラズパイにソースを渡す形で開発することで落ち着きました…。 ラズパイZero自体は動きがもっさりなので、コーディングの効率化ができればと思ったんですが、残念。

参考

qiita.com

ja.wikipedia.org

ガワネイティブを作るならFlutterが良いかもしれない

f:id:tansantktk:20201202224543p:plain

SwiftでiOSアプリを開発する傍ら、Androidアプリも楽して作れないものかとネットの海を彷徨ったところ、 Flutterというフレームワークにたどり着きました。

Flutterで単純なガワネイティブアプリを作るところまでを実践してみての所感を書いていきたいと思います。

続きを読む

【まとめ】プログラミング超初心者だった頃に苦戦したこと

f:id:tansantktk:20201205153346p:plain

エンジニアに転職して実務を続けて2年半が経過しました。
私がエンジニアになる前に最初にマトモに勉強した言語はRubyでしたが、最初はかなり苦戦したのを覚えています。

  • 動的型付け言語の為、コーディング時はスイスイかけても、デバッグするとエラー吐きまくりで悩み…
  • スコープの理解が甘く、異なるスコープ間で同名の変数があった時にそれぞれの扱いの違いが分からず悩み…
  • gemという概念の意味が分からず悩み…

かつての自分を思い返しながら、どういうところで躓いて、どう対処していったのかを記録として残していこうと思います。 人間の記憶は揮発性ですので、そのうち”かつて出来なかった自分”のことも忘れてしまう日が来るでしょう。

ただ、案外こういう"出来なかった自分"でいた時期(今も出来ないことだらけですが)があったことを自覚していくことが大事なのではというなんとなくの直感があり、今回このような記事にすることに決めました。 せっかくのブログという場ですので、いろいろな可能性を模索する場にもしたいという気持ちもあります。

ゆる~く書いていきますので、酒でも飲みながら読んでくださいね。

続きを読む

Angular5から11にアップデートしたらbuttonタグ同士の隙間が無くなった

f:id:tansantktk:20201123161350p:plain

先日、Angular5をAngular11にアップデートしました。
ページのレンダリングや変更検知がスムーズになり、喜んでいたのもつかの間。
f:id:tansantktk:20201124184918p:plain

なんかボタンが詰まってる……?🤔
(※スクリーンショットのボタンはイメージです)




ちなみに元々のボタンは↓のような感じでした。
f:id:tansantktk:20201124185044p:plain

Angularをアップデートしただけのはずだが何故…?と思いいろいろと調べてみました。

続きを読む

AngularのレンダリングエンジンIvyとは?

f:id:tansantktk:20201123161350p:plain

今年の11/12にAngular11が公開されました。

今までずっとAngular5で開発を続けてきており、流石にそろそろアプデしないとなと思い、実際にやってみた所感と、初めて体感したレンダリングエンジンIvyについて書いていきたいと思います。

続きを読む

おススメアイテム紹介 ~快適にプログラミングするために~

f:id:tansantktk:20201122162954p:plain

人間の心と身体は正直なもので、どちらか一方が弱ればプログラミングの効率は落ちます。 逆に言えば、心も身体も安定していれば素晴らしいパフォーマンスが出るはずです。

今回はいつもと趣旨を変えて、快適に日々のプログラミングをする為に私が使っているアイテムたちを紹介したいと思います。

このご時世、リモートワークの方も多いかと思いますので参考になれば幸いです。

続きを読む