2016年9月23日 星期五

[vscode]extension 裡的 FileSystemWatcher 壞掉了?

Why is vs code’s FileSystemWatcher not working on my Windows 7?
You need .NET 4.5.

前言

這篇其實就是個一拳就解決的事情。但是為了要演滿20分鐘,所以傑諾斯一定要撐很久的情況。不能打贏對手,也不能一拳就躺下來休息。(我在講什麼?)

環境

出問題的環境多是 windows 7,其他的環境像是 windows 8, windows 10, mac os, linux 幾乎都沒人中招。

問題描述

這樣也可以撐三段,可以了。簡單來說,像是 Package-Watcher 這種會看某個檔案是否會被外部程式改變的。它需要一個 FileSystemWatcher 的實體,由 workspace.createFileSystemWatcher 產生,然後處理它的 onDidChage。
// 這是 TypeScript,微軟主推在 javascript 世界的前置語言,它會被編譯成合於 ES5、ES6、或 ES7 再交由 node.js 或瀏覽器執行。

let path = vscode.workspace.rootPath + "/package.json";
let watcher = vscode.workspace.createFileSystemWatcher(path);
watcher.onDidChange((e) => {
    console.log('package.json change')
})
但是!!這就是在我的 windows 7 裡不能執行。花了我快十個小時,弄到凌晨四、五點不得不去睡覺,但還是沒解。
今天上午去查 issue,看到這一句:
This issue is that Electron requires .NET 4.5 since it uses System.Threading.Tasks.Task.Delay(Int32) which came with .NET 4.5
來源:https://github.com/Microsoft/vscode/issues/5083
就是說,因為 windows 7 常常有人忘了要裝到 4.5,沒注意到的話,通常都留在 4.0。而其他版本,要嘛因為不能裝,要嘛太低使用者會自己裝,要嘛內建就 4.5,所以中招的就是 windows 7 最多!

解法

請裝 .NET 4.5。
一拳。

[atom]開啟多個視窗

前言

在使用上,如果已經開啟一個 atom 視窗。之後若是再開啟其他位置的檔案,會通通擠在一起視窗裡,在 tree view 也都放在同一個 project folder 裡。在我自己使用上,因為會在不同的位置開一些檔案做參考,不屬於同一個專案,全部擠在一起不方便。有時檔名一樣,很容易搞錯。

對手怎麼做?

我把vscode 視為 atom 的對手,它的行為就是不同目錄開起來就是會不同視窗。搞錯機會很低。

解決方法

網路上是有說用命令列參數 -n--new-window,例如 atom -n ~/file。但是在 windows 下,其實習慣的是右鍵來處理。可惜沒找到。

另一個方法則是開啟之後,對不同目錄的檔案的頁籤,按右鍵,會出現「open in new window」,按下去就會再開一個視窗。只是它會把原先那個目錄留在 tree view 裡,這樣就是兩個 project folder。像我比較龜毛就會去把它移掉。對著目錄按右鍵,選擇「remove project folder」這樣就比較乾淨一點。

更新: 我找到更簡單的方法。如果在其他目錄也要開檔案,不要直接開啟那個檔案,而是開啟那個目錄,這樣就會再開一個 atom 視窗。這就正合我意。‧‧‧‧‧

2016年9月20日 星期二

[sozi]大改版

[sozi]大改變

sozi 16 的大改變

前言

除了 inkscape 版本快速之外,sozi 從 15 開始的大變動我沒跟上,今天才知道,那就是它脫離了 inkscape 而獨立了。

主要變動

說是獨立,應該也可以說它換到一個新環境,叫做 nw.js,據說是 intel 主導的一個開發專案。軟體堆疊是 node.js 與 Chromium engine。開發時使用 html , css, javascript,平台移植性相當好。

因為它現在不在是個外掛,所以,直接下載 zip 檔,解開之後,執行裡面的執行檔就行了。

下載地方:https://github.com/senshu/Sozi/releases/tag/16.02-fix344

操作流程大改變

在執行 sozi 之前,請先看一下教程,免得浪費時間瞎摸。 http://sozi.baierouge.fr/pages/tutorial-first.html

操作流程大改變,因為它本身只做簡報編輯動作,所以必須要先把 svg 檔準備好,這是第一個大不同的地方。

在選好 svg 檔之後,第一個動作是建立新的 frame。那個「+」按鈕在視窗下方。按下去之後,調整 frame 的 title 在右方欄,改一個文字框,記得要按 enter。

調整 carema 的方法,用滑鼠:
* 移動:滑鼠左鍵按住、拖動
* zoom:滑鼠左鍵、鍵盤 alt 鍵按住、拖動
* 旋轉:滑鼠左鍵、鍵盤 shift 鍵按住、拖動

存檔基本上不用擔心,它會自動存,也有按鈕可以按。原始的 svg 不會動到,你要播放的所有東西都放在 {檔名.sozi.html} 那個檔案裡了。

結語

這樣的改變還喜歡嗎?第一個優點是不用再擔心安裝的問題、再來不擔心平台的問題、之前跟 inkscape 整合有點不順手的問題也沒了。缺點我個人認為是要先把 svg 準備好。有愛就繼續支持囉!

[超譯]設定vscode markdown 環境

[超譯]VS code 的 markdown

譯序

參考文件是 https://code.visualstudio.com/docs/languages/markdown
內建支援 preview (預覽),也可多裝 extension 加強能力。
本來是想寫心得的,不小心就變超譯了。既然是超譯,就代表有些地方我會增減。有興趣還請看原文。

前言

在 Visual Studio Code 裡使用 markdown 可以非常有趣,也有很多 markdown 的特色讓你更有生產力。

markdown extension

內建的功能之外,還有一些 extension 增加功能。

譯註:這段在文章裡是動態產生一組 markdown 相關的 extension 列表,所以會是什麼會隨時間演進。

開啟預覽

要開一個預覽是用 ctrl-shift-v,會多開一個 tab (頁籤) 顯示。這個我覺得不好用,我喜歡 side by side (也就是視窗並列)的方式。按鍵是 ctrl-k v (先按 ctrl-k,然後放開,再按 v,這個不能在中文輸入法裡,如果卡在輸入法中,會抓不到 v 這個鍵) 叫出視窗並列的預覽。

使用自己的 css

可以改變預覽的樣子,當然,對於後續的編譯成 html 也有用途。要更新 "markdown.styles": [] 的設定。

例如我有一個 css 長這樣:

body {
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}

h1 {
    color: cornflowerblue;
}

用 File > Preferences > Workspace Settings 開啟設定 settings.json 更新裡面的內容為:

// Place your settings in this file to overwrite default and user settings.
{
    "markdown.styles": [
        "Style.css"
    ]
}

## snippets for markdown
有幾個內建的 snippets,用 ctrl-space 來驅動,這就會依語境提供一串建議。

譯註:ctrl-space 在中文輸入法啟用的時候,悲劇。

編譯成 html

VS code 整進一個 task runner 可以用它與 markdown 編譯器合作完成編譯工作。可以把 .md 檔變成 .html 檔。

  1. 背後是使用 node.js 來處理,所以要安裝 node.js 之外,再加上 marked。用 npm 安裝 npm install -g marked
  2. 建立一個 md 檔。記得開啟一個「目錄」再開一個新檔案 sample.md (多餘的我不想翻…) 把底下的文字放進去:

    Hello Markdown in VS Code!
    ====================
    
    This is a simple introduction to compiling Markdown in VS Code.
    
    Things you'll need:
    
    * [node](https://nodejs.org)
    * [marked](https://www.npmjs.com/package/marked)
    * [tasks.json](/docs/editor/tasks)
    
    ## Section Title
    
    > This block quote is here for your information.
    
  3. 建立 task.json。打開 Command Palette (用 ctrl-shift-p),然後在裡打字 Configure Task Runner,然後按 enter。它會列出可能的 tasks.json 模板,選 Others,因為我們要執行外部命令。這會在你的 Workspace 的 .vscode 目錄裡產生一個 tasks.json 檔案,長成這樣:

    {
        // See http://go.microsoft.com/fwlink/?LinkId=733558
        // for the documentation about the tasks.json format
        "version": "0.1.0",
        "command": "echo",
        "isShellCommand": true,
        "args": ["Hello World"],
        "showOutput": "always"
    }
    

    因為我們要使用 marked 編譯 markdown 檔,所以要改成以下這樣:

    {
    // See http://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "marked",
    "isShellCommand": true,
    "args": ["sample.md", "-o", "sample.html"],
    "showOutput": "always"
    

    }

    這設定的意思是把 marked 當成一個外部任務執行者,只執行一項任務,把 markdown 檔編譯成 html 檔,它的命令是 marked sample.md -o sample.html

  4. 執行建立任務。以上只是在檔案裡設定,要執行它可以按 ctrl-shift-b (Run Build Task)。此時,你應該可以看到一個增加的 sample.html 檔案出現在檔案列表裡。

    這個範例不會出現什麼問題所以執行任務完會有對應的 sample.html 被建立。

自動編譯

再進一步,想要自動編譯的話,需要多做些事。

  1. 加裝 gulp npm install -g gulp gulp-markdown。多裝 gulp-markdown 會讓事情簡單一點。

  2. 建立 gulp task。在 simple.md 那個目錄開新檔案 gulpfile.js。把以下內容放進去:

    var gulp = require('gulp');
    var markdown = require('gulp-markdown');
    
    gulp.task('markdown', function() {
        return gulp.src('**/*.md')
            .pipe(markdown())
            .pipe(gulp.dest(function(f) {
                return f.base;
            }));
    });
    
    gulp.task('default', function() {
        gulp.watch('**/*.md', ['markdown']);
    });
    

    以上程式會做這些事:

    1. 在 Workspace 裡看哪些檔案有變動。
    2. 把有改變的 markdown 檔案們,用 markdown 編譯器處理一遍。(gulp-markdown)
    3. 這樣我們就會有一堆名字對應的 markdown 檔與 html 檔在同一目錄裡。
  3. 修改 tasks.json 以完成監視。要完整把任務整合進 VS code,還需要修改任務設定。改成以下的樣子:

    {
        "version": "0.1.0",
        "command": "gulp",
        "isShellCommand": true,
        "tasks": [
            {
                "taskName": "default",
                "isBuildCommand": true,
                "showOutput": "always",
                "isWatching": true
            }
        ]
    }
    
  4. 執行 gulp Build Task。以上仍是一個檔案內的設定,要執行它要按 ctrl-shift-b (Run Build Task)。但這次我們是設定一個監視,所以 Status Bar 應該會在左手邊指示。

    現在,如果建立或改變其他的 markdown 檔,你會看到對應的 html 被產生出來或是存檔時反應改變。你也可以啟用 Auto Save 讓事情更流暢。

    如果你要停止監視,你可以按 ctrl-shift-b,然後在 message box 裡點 Terminate Running Task。或者你可以用 Command Palette (用 ctrl-shift-p 叫出來),然後找到 terminate command。

接下來

你可以往下看的是:

幾個常見問答

  • 有無拼字檢查?
    • 內建沒有,但是可以加裝 spell checking extension
  • 有無支援 github 風格的 markdown?
    • 沒有,VS code 以支援 CommonMark 為目標,使用 markdown-it 函式庫(它實作 CommonMark 標準)。
  • 上面的過程裡我在 Command Palette 找不到 Configure Task Runner 命令?
    • 你應該是一開始選擇開啟檔案,而不是開啟目錄。你可以用 File > Open Folder…開啟目錄,或是用命令列 cd 到目的地,再執行 code . 開啟目錄。

2016年9月12日 星期一

[atom]設定 python 開發環境

前言

要知道好不好用,就得用心體會,就拿來試試開發 python 程式吧。

材料

谷歌到一系列 youtube ,就照本宣科試試。

https://www.youtube.com/watch?v=uve1tjVIQ6c

步驟:格式設定

  1. 顯示縮排的尺 (Show Indent Guide)。 在 1.10.2 的版本是放在 Settings > Editor 這裡。
  2. 使用 Soft Tabs
  3. Tabs length 設成 4

步驟:套件安裝

  1. 啟用 autosave。對 Settings 也要啟用。
  2. 安裝 atom-runner。這個可執行 python。如果你是 apple 系統,要在 config 加東西,請參照影片。

步驟:執行

  1. 寫一段程式

    import random
    
    for i in range(5):
        print(random.random())
    
  2. 執行請按(我是用 windows) alt-r

還有 autocomplete 與 debugger

autocomplete 與 refactor

照那個 youtube 設定只有能執行 python。但是沒有加裝 autocomplete-python 這個套件的話,基本上它所提示的只是你已經輸入過的關鍵字,當然不夠用。「跳到定義去 go-to-definition 」這個 IDLE 沒有的夢幻功能就可以用 ctrl-alt-g 來使用。因為一次按三個按鍵太糟,請安裝 hyperclick 套件,這樣就可以按住 ctrl 用滑鼠去點你想找定義的關鍵字。

https://atom.io/packages/autocomplete-python

為了寫程式 refactor 方便,Python Tools 加進來是最好的。

https://atom.io/packages/python-tools

debugger

debugger 目前有兩個套件,我選擇 https://atom.io/packages/python-debugger 。我不選 https://atom.io/packages/atom-python-debugger 的原因是不想多改 code 插 trace。

python-debugger 它使用的 alt-r 與 atom-runner 重覆,所以必須要使用選單 Packages > python-debugger > Toggle 來開啟執行視窗。這是要注意的地方。如果直接按 alt-r 會直接執行 python code。

[atom]編輯器體驗

起因

之前網路上看到有人把 sublime 跟 atom 比,才知道 github 出了一個 atom editor。但還沒有想要用看看。但是後來遇到朋友已開始用了,所以也來試試看,主要想要看看它能否當做 python IDE 與 markdown 編輯器。

背景

因為我會常常在 windows, linux, mac 環境跑來跑去。所以會需要一個通用的編輯器。我現在是在 windows 裡裝 notepad++,在 linux 用 pico/vi/gedit,在 mac 則是用 python IDLE 來暫用。目前來說,我在 mac 開文章的機會非常少,多是開來寫 python 所以就是用 python IDLE 就好了。原本有考慮 sublime,但是要讓我碰到的電腦都要裝 sublime 的話又好像太過份。而且 sublime 在討論上、套件上又好像比較少,也許是因為它屬於專有軟體的關係。所以,先試試 atom。他的用戶多,套件也會比較多一點。將來若是有自己開發套件,要連同主體一起散佈的話,也比較不會被說話。當然,應該也可以開發 sublime 套件,要賣給別人的時候請客戶再多付 sublime 的錢。這個方面我要再多些時間考慮。

擴充性

以擴充性來說,我當然還是喜歡 sublime 的 python api。atom 是用 node.js,對我來說還是不如 python 習慣。尤其 javascript 的非同步特性是不是合適套件開發,這不試過真不知道。

markdown 支援

最近喜歡使用 markdown 來寫文章,atom 上有官方內建的 markdown preview,也有社群加強版的 markdown preview plus。而 sublime 就要找看看。這也就是我會選擇多數人用的原因,這樣比較容易 google 到套件及使用方法。少人用的就會難找及難學。從 markdown 的角度來看,現在是有免費線上的 StackEdit 可用,但是若要固定下來,的確還是選執行檔編輯器會比較好。

ps. 其實 sublime 的 markdown preview 用 google 一下就出來了。https://www.youtube.com/watch?v=XnPkdcBGBlw 。但是它的 preview 不是即時,也不是在 sublime 裡,而是讓你指定轉成 html ,再用瀏覽器開啟。(也可以換成其他格式再用其他程式開啟。)這樣就不如 atom 的好了。

小發現

現在使用上有幾個感覺:
* 啟動比 notepad++ 慢很多,跟 jedit 有得拼了(比慢)。
* 一開始中文字型怪怪的。也許用到大陸字體,「置」這個字裡面是一豎而不是兩個橫。
於是按照以下連結,改成 Noto Sans CJK TC。
http://lsymind.blogspot.tw/2015/06/atom_22.html

官方說明文件

https://atom.io/docs

2016年9月11日 星期日

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

前言

因為有點不知道除了 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 的東西跑出來。

2016年9月6日 星期二

[python]改用 requests

源起

最近發現一些程式都不正常結束。查看了一下,有幾個是 http 已經不提供了,被導去 https,所以讓 urllib 的呼叫失敗。目前來看,可以用 requests 來解決這問題。

過程

在安裝 requests 之後,的確程式碼少了一些。只是有個警告一直出現:

InsecurePlatformWarning: A true SSLContext object is not available.

雖然還是正常執行,只是 console 視窗一直被洗很討厭。有人說換到 python 2.7.9 就可以或是 pip install requests[security] ,我換到 2.7.12 也 pip install requests[security] 但只是換了一個訊息,但是還是洗畫面。

InsecureRequestWarning: Unverified HTTPS request is being made.

結局

首先參考 https://urllib3.readthedocs.io/en/latest/security.html

正規解法應該參考 https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl 來解決問題。

但是我使用裡面偷懶的做法,在程式一開始加入

import requests.packages.urllib3

requests.packages.urllib3.disable_warnings()