2017年1月18日 星期三

[electron]vscode debug

electron debug

因為 electron 本身有兩個行程, vscode 所以在 debug 的時候,在 main.js 這裡沒有問題,但是在 renderer.js 這裡就比較多問題。我搜尋了一下解法。

用 vscode 做 debug

我把原始教程 electron-quick-start 叫做 electron-quick-start-vanilla。要使用 vscode 對它做偵錯。

{
    // Use IntelliSense to learn about possible Node.js debug attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "node",
            "request": "launch",
            "name": "啟動程式",
            "program": "${workspaceRoot}/main.js",
            "cwd": "${workspaceRoot}",
            "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd",
            "runtimeArgs": [
                ".",
                "--enable-logging"
            ],
            "env": {},
            "externalConsole": false,
            "sourceMaps": false,
            "outDir": null
        },
        {
            "type": "node",
            "request": "attach",
            "name": "附加至處理序",
            "port": 5858
        }
    ]
}

因為我是在 windows 環境所以才是 electron.cmd,如果是其他 os 就是 electron 即可。

這樣子的設定能做到:
1. 在 vscode 中,main.js 設中斷點可停下來,console.log 能寫到 vscode 的偵錯視窗,無法寫到 devTool 的偵點視窗。
2. renderer.js 設中斷點停不下來,console.log 能寫到 vscode 的偵錯視窗,也會寫到 devTool 的偵錯視窗。
3. 可以在 devTool 的 Source 視窗對 renderer.js 做中斷點偵錯。console.log 可寫到 devTool 的偵錯視窗。
4. 在 vscode 按下綠色三角之後,renderer.js 不在 Sources 頁籤裡,此時在程式主畫面要按 ctrl-r 重載程式,renderer.js 就會被載入 Sources 頁籤,就可以在 devTool 裡偵錯了。

小結:main.js 在 vscode 偵錯,renderer.js 在 devTool 偵錯。

參考

用 vscode 加 Debuger for Chrome 做 debug

要安裝 extension Debuger for Chrome, launch.js 改成如下:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Renderer Process",
      "type": "chrome",
      "request": "launch",
      //"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron",
      // Use the following for Windows
      "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron.cmd",
      "runtimeArgs": [
        "${workspaceRoot}/main.js",
        "--remote-debugging-port=9222"
      ],
      "webRoot": "${workspaceRoot}"
    }
  ]
}

這樣子的設定能做到:
1. 在 vscode 中,main.js 中斷點與 console.log 都無法寫到 vscode 的偵錯視窗裡。
2. 在 vscode 按下綠色三角之後,console.log 能寫到 vscode 的偵錯視窗,再按 ctrl-r 之後,renderer.js 的中斷點就可在 vscode 裡正常工作,據說是第一趟是 electron 啟動,remote debugger 還沒連上。
3. 因為 remote debugger 要連上,所以 electron 裡的 devTool 要關掉。不然 remote debug 會無法 attach。所以,DOM inspection 就沒辦法用了。

小結:這樣子用 vscode 專門偵錯 renderer.js 的部份。

參考

vscode 對 react jsx 加 webpack 做 debug

因為現在多數的前端開發,都會需要用到 babel 轉譯成 javascript,以及用到 webpack 做自動工作(例如打包),所以,以上的方法還需要做改進。xpbug 的方法是採用 main.js 用 vscode 偵錯,ui.js (renderer.js) 用 devTool 偵錯。

快速建構

下載原始碼

>git clone https://github.com/xpbug/electron-react-webpack.git

然後安裝所需套件

>npm install

生成程式,產生 app 目錄

>node node_modules\webpack\bin\webpack.js

執行程式

>node_modules\.bin\electron app

然後就可以在 devTool 裡對 ui.js 做偵錯,因為是轉譯過的,所以要對 webpack:///./src/ui/ui.js 做偵錯。這裡人比較好看得懂。

至於一步一步製作的方法,就請至 xpbug 的部落格參考。

這樣子的設定能做到:
1. 在 vscode 對 main.js 做偵錯,在 devTool 裡對 ui.js 做偵錯。

參考

[nodejs]打造自己的開發環境閱讀心得

前言

因為有點不知道除了 visual studio 之外的開發環境會長怎樣,所以研究了一下以下的文章,稍微了解一下現在的世界長怎樣了。 http://larry850806.github.io/2016/09/04/es7-environment/

我這篇算是心得報告,只有把我不會的地方加一些描述。要了解全部還請記得去原來的地方看。記得一定要感謝原作者 Larry Lu http://larry850806.github.io/about/
https://github.com/Larry850806/nodejs-ES7-template

了解生字

  • babel
    它看來是一個編譯器,把你寫的 javascript 轉成另一種寫法的 javascript。這大概就是目前 javascript 最有趣的地方吧…。 https://babeljs.io/
    類似的有:TypeScript, CoffeeScript

  • gulp
    這個看起來像是 gcc make 的系統,依照你寫的設定標,自動把編譯、複製、散佈等工作做完的系統。是 node.js 的套件之一。
    http://gulpjs.com/ http://abgne.tw/web/gulp/gulp-tuts-install-gulp-js.html

目錄安排

文章中的建議是因為有用了 gulp 做自動處理,所以會把檔案很乖地很分散在各個不同的目錄裡。

package.json
node_modules
gulpfile.js
index.js
src
    index.js
    utils.js
build
    index.js
    utils.js

package.json 與 node_modules 是 node.js 需要的。
gulpfile.js 是 gulp 的設定
最外面的 index.js 是程式執行的起點。但它只是轉一手讓 build/index.js 來執行。為了不要讓人太傷腦筋。
src 裡,原文是放 ES7 的程式,build 是被轉成 ES5 的程式。

註:ES7 與 ES5 是指 ECMA Script 7 與 ECMA Script 5。是 Javasript 目前的正式學名。兩個在語法上有不同,所以必須要分兩個名字來講。目前可以靠程式把新語法轉成舊語法,以利舊瀏覽器/舊環境執行,減少大家開發上轉換的痛苦。這一點也是獨特之處。

開發流程

開發時只動 src 裡的東西,其他的動作靠 gulp 來幫忙。
真正執行的起點是 ./index.js,而它會去執行 build/index.js。

gulp 設定

因為是靠 gulp 來處理轉譯與搬檔案,所以要了解一下它的用法。https://github.com/nimojs/gulp-book

文章內使用的設定是:

// gulpfile.js

var gulp = require('gulp');
var babel = require('gulp-babel');

gulp.task('babelify', function(){
    return gulp.src('src/**/*.js')
        .pipe(babel({
            presets: ['es2015', 'es2016', 'es2017'],
            plugins: [
                [
                    "transform-runtime", {
                        "polyfill": false,
                        "regenerator": true
                    }
                ]
            ]
        }))
        .pipe(gulp.dest(build))
});

使用方法是在命令列輸入 gulp babelify,gulp 就會把 src 裡所有的 js 用 babel 轉成 ES5 的程式碼,丟到 build 裡去。所需要的模組是:

{
    "babel-plugin-transform-runtime": "^6.12.0",
    "babel-preset-es2015": "^6.13.2",
    "babel-preset-es2016": "^6.11.3",
    "babel-preset-es2017": "^6.14.0",
    "gulp-babel": "^6.1.2"
}

babel 轉譯錯誤的輸出

若是在 babel 轉譯的時候有錯誤,要把錯誤寫出來,需要在 .pipe(babel({…}) 後面加上 on error 的處理函式

.on('error', function(err){
    console.log(err.stack);
    this.emit('end');
})

debug 用的 source map

在轉譯之後,有 exception 發生時,會 dump 出來的是已轉譯的程式碼(也就是 build/index.js),但是那個我們人類很難看,所以可借用所謂的 source map 來讓錯誤對應到 src/index.js 我們比較好修正。(本來設計也只能在 src 那裡動程式碼。)所以在 on(‘error’, … )的後面加上:

.pipe(sourcemaps.write({
            includeContent: false,
            sourceRoot: 'src'
}))

要讓 node 知道要採用 source map 來對應錯誤行號與內容,要在執行的 index.js 加上:

require('source-map-support').install();

要做到如此,source map 需要兩個模組:

{
    "gulp-sourcemaps": "^1.6.0",
    "source-map-support": "^0.4.2"
}

程式碼變動自動轉譯

這個功能原作者是用 gulp 來監視檔案有無變動,有的話就自動轉譯。要在 gulpfile.js 加上一段:

gulp.task('watch', function(){
    return gulp.watch(['src/**/*.js'], ['babelify']);
});

gulp.task('default', ['babelify', 'watch']);

最後

還可以多看一篇 http://larry850806.github.io/2016/07/25/react-optimization/ 這裡大概就可以知道為什麼 python 會有 mutable、immutable 的東西跑出來。

2017年1月4日 星期三

[rpi]apt-get 小抄

apt-get 小抄

rasbpberry pi 官方採用的 raspbian 是 debian 系統,ubuntu 也是源自於 debian。它們的套件管理系統是兩層建構(加上圖形化是三層),也就是 dpkg、apt,圖形化的第三層是 synaptic。

在以指令為主的環境中,主要使用的是 apt 層,它的指令是 apt-get。與 dpkg 的差別是它幫你處理相依性。

apt-get 的指令功能

  1. 安裝套件 apt-get install <package name>
  2. 移除套件 apt-get remove <package name>
  3. 移除套件及設定檔 apt-get remove --purge <package name>
  4. 更新套件列表 apt-get update
  5. 自動升級新套件 apt-get upgrade -y
  6. 清除套件暫存 /var/cache/apt/archives apt-get clean apt-get autoclean
  7. 搜尋套件 apt-cache search <keyword>
  8. 顯示套件詳細資訊 apt-cache show <package name>
  9. 移除沒用的套件 apt-get autoremove
  10. 列出已安裝套件 apt list --installed

dpkg 的指令功能

有時候不得已要手動處理套件,可能是相依性有的問題。這時就要用 dpkg 的指令。

  1. 不檢查相依性,直接安裝 dpkg -i <package name>
  2. 列出系統上已安裝的套件 dpkg -list
  3. 移除套件且清楚設定檔 dpkg -P <package name>
  4. 移除套件 dpkg -r <packag name>

圖形化套件管理程式

synaptic,這裡不介紹。請參考: http://blog.xuite.net/yh96301/blog/251085515-Ubuntu+14.04%E5%AE%89%E8%A3%9DSynaptic%E5%A5%97%E4%BB%B6%E7%AE%A1%E7%90%86%E7%A8%8B%E5%BC%8F

參考