2020年12月27日 星期日

javascript 的 optional chaining 對應到 node 14 以上版本,即 electron 12 以上(但都還在beta中,這…)

這件事滿令人吃驚的,錯誤訊息出來千奇百怪,但沒有一條告訴你是 optional chaining 的問題…

optional chaining 語法需要 node 14 請參 https://stackoverflow.com/questions/59574047/how-to-use-optional-chaining-in-node-js-12

electron和node 的對應請參 https://www.npmjs.com/package/electron-releases

結論就是手動升級 electron 到 12 以上,安裝方式參 https://www.electronjs.org/releases/beta

另外 v12 因為是 beta ,品質還不是很穩定,主選單目前是無法工作的,參 https://github.com/electron/electron/issues/26717

2020年12月6日 星期日

12/6開始 pietty 無法以 SSH 登入 PTT,改用 PUTTY 的設定

錯誤訊息是說和主機認證相關,畢PIETTY已經很久沒更新了…

PUTTY一樣是終端機模擬軟體,直到今年都還有更新

安裝及設定請參考 putty安裝設定教學

不過中文輸入有時仍然無法切換,詳情要再研究一下



2020年10月3日 星期六

Emacs 升級到 27.1 時的一些問題

 org.el 中的 time-to-inactive-org-timestamp 呼叫到了 format-time-string 函數,根據 這篇文章 的說法,它使用了系統本身的 locale ,因此在不同機器上常常因設置不同,而得到不同的結果。新版的 Emacs 似乎(?)在傳回日期字串時,省略了 charset,因此在某些相關操作上會有問題。為了統一日期格式,可以在設定加上一行,強制所有 day of week 以英文表示:

(setq system-time-locale "C")

其次,安裝過  org-roam 後,設定會出現 " :export org-roam-server-export-file-id :face org-roam--file-link-face :store org-roam-store-link" 字串,這在  org-roam 移除後會造成問題,必需手動移除。(嚴格來說這不是 emacs 27.1 的問題…)

此外,某些模組原來以 org- 開頭,被改成 ol- 開頭,請調整(M-x customize-options)設定(org-modules)為對應的檔名:



2020年9月27日 星期日

也來聊聊「Notion 筆記軟體」及「子彈筆記Dot Journaling/子彈思考整理術THE BULLET JOURNAL METHOD」

 可能因為之前 YT 上看過筆記軟體的比較影片「Why I Switched from Bullet Journalling to Emacs: My Org-Mode and Journal Workflow」,推薦跳出了「為什麼許多人都改用 Notion 做為主力筆記軟體?看完這個你就明白了 」這部30萬點閱的短片。這部短片的點閱甚至超過Notion原廠所有影片,真是非常驚人。主要原因應該是搭上了子彈思考整理術THE BULLET JOURNAL METHOD的順風車。(相關出版品還有一本子彈筆記術:隨時都能開始的超簡單記事法,輕鬆掌握生活大小事。 Dot Journaling 特指使用的筆記本不是用線來畫格子,而是用點 (DOT)。)

思考是高度的心智勞動,如果能將所需的材料適切的安排,以在一個頁面/畫面之內就能呈現出來,可以降低勞動的耗能,提高產出的品質和數量。然而概念間有隨數量而指數增加的關聯,本質就是難以在有限頁面下同時呈現;子彈筆記試著提供少量武斷(dogmatic)的法則來提供固定型式的視圖(view),以降低複雜度,提供一個良好的起點。

然而建立的關聯是會不斷增加的,機器自動產生的關聯常常不盡理想,此時加以搜尋並建立人工連結是必然的。這兩年 iPad 的手寫功能,間接催生了好些個混合手寫/打字功能的筆記軟體;而手寫辨識後,才能納入搜尋,這也隨著機器學習的成熟而成為標準功能。相對於紙本的子彈筆記,軟體因連結間的跳轉方便,逐漸成為新一代的學習方法。相信未來仍會有更多類似產品問世。



2020年9月12日 星期六

也來聊聊「Zettelkasten Method 卡片盒筆記法」--從 programmer 的觀點來看,其實就是交互參考(Xref)

 前幾天在 github 上閒晃,想找找有沒有 org mode 相關的專案時,org-roam 的讚數吸引了我的目光…超過2300個讚,還是相對冷門的 emacs 的套件…看了看說明發現是 roam research 的相關作品,才發現之前是 survey 過 roam research ,只是操作看來有點繁瑣,當時不是很想深究。

這個命名「Zettelkasten Method 卡片盒筆記法」應該是來自於一位一燈大叔(顯然是天龍八部裏一燈大師的諧音)。若只想看一篇簡介,我推他寫的「卡片盒筆記法#2」。英文的我推薦以下3篇:

  1. https://writingcooperative.com/zettelkasten-how-one-german-scholar-was-so-freakishly-productive-997e4e0ca125
  2. https://zapier.com/blog/zettelkasten-method/
  3. https://leananki.com/zettelkasten-method-smart-notes/
關鍵應該就是所謂的雙向索引,而這對寫程式的人一定再熟悉也不過,就是所謂的 Cross Reference, Xref (交互參考、交叉索引)。它的重要性在於進行重構等工作時,要知道會影響到哪些程式碼,不能搞成 monkey patch 那樣。目前的應用強調於寫作方面,感覺上 wiki 等工具也是類似的想法,真要說有什麼新的視角,我覺得是把文章/索引間的關聯可視化;但是當數量太龐大時,可視化能提供的資訊其實好不了太多。

Obsidian (黑曜石)筆記軟體,是目前除了 roam research 外的一個新選項,它不但不收費,而且可以存放成 markdown 或 org 檔,這相對於 roam research 是優點還是缺點,就見仁見智了。

另一個問題是連結的"粒度(granularity)";連結是以檔案為節點,因此衍生了一些對筆記內容的要求,以使得這樣的連結不致於太鬆散。是優點還是缺點,也是見仁見智。



2020年8月25日 星期二

emacs 27.1 發佈啦~~

 windows 版本請下載 https://ftp.gnu.org/gnu/emacs/windows/emacs-27/

不過要正確工作還有一些細節,類似當初 26.1 剛出的時候

有空再把心得寫一寫

一開始更新套件會遇到PGP相關問題,先到 https://www.gpg4win.org/ 裝個 gpg4win

M-x customize-option ,按 enter,輸入 epg-gpg-program 將其值改為 C:\Program Files (x86)\GnuPG\bin\gpg.exe

然後重啟 emacs 即可

ref: 

https://stackoverflow.com/questions/52661839/gpg-keyblock-resource-pubring-kbx-not-found-because-the-repo-path-is-prefixed-t

https://notes.kiranbusi.com/emacs-with-gpg2.html

2020年8月17日 星期一

Stanford 的 Stanza 自然語言工具包發佈新版 1.1.1

 Github 上的專案在 https://github.com/stanfordnlp/stanza/

生醫方面的語料訓練,提供的模型列表可參見 https://stanfordnlp.github.io/stanza/available_biomed_models.html 

測試頁請前往 http://stanza.run/bio ,速度飛快




2020年7月8日 星期三

2020年6月25日 星期四

Perl 7 一年內釋出,接續 Perl 5 的語法…(那Perl 6呢?XD)

詳官網 https://www.perl.com/article/announcing-perl-7/

這樣也好啦, legacy code 實在太多了,而 perl 語法又是如此邪惡簡潔


2020年5月19日 星期二

Stanford CoreNLP 發佈 4.0 版,指代消解功能大躍進

Stanford CoreNLP 發佈 4.0 版,可於 https://stanfordnlp.github.io/CoreNLP/index.html#download 下載

看看範例句子:

Stanford University is located in California. It is a great university.


試試正體中文,結果斷詞依然不太行


簡體中文則正常工作,指代消解如文件所言是working的


此次提供的語言模型只有中英法德西阿6種,日印俄語表示或許過一段時間會有其它語種?且中英文以外均無指代消解功能

德文:
Die Stanford University befindet sich in Kalifornien. Es ist eine großartige Universität.

法文:
L'université de Stanford est située en Californie. C'est une grande université.


2020年4月27日 星期一

org mode 中執行 anaconda python 的設定(三)--ipython via ob-ipython(需裝 jupyter)

上篇文章的作法需指定檔名,感覺有點冗。這回我們試著用 melpa 的套件 ob-ipython 來解決

假設我們用的是 anaconda 下的 py35 環境,在此環境下安裝 jupyter,然後在 emacs 的設定:

(setq python-shell-interpreter "/Anaconda3/envs/py35/python.exe")
(org-babel-do-load-languages
 'org-babel-load-languages
 '((python . t) (ipython . t) ))

windows 平台需針對 windows 修改,參 https://github.com/jawatech/ob-ipython/blob/master/ob-ipython.el

或者直接在設定檔中改寫:

(defun ob-ipython--get-python ()
(let ((buf ( or python-shell-interpreter "python")))
(locate-file buf exec-path)))

缺點的話如同 John Kitchin 所言,只能顯示一個圖,且無法顯示其它文字。JK 在該文提出了一些改良,但是後來融合到 scimax 而集其大成。這個小改我就跳過了,直上 scimax 真的是一個爽,有空再來寫一篇心得分享。


2020年4月1日 星期三

org mode 中執行 anaconda python 的設定(二)

依之前所寫的文章 org mode 中執行 anaconda python 的設定 完成設定後,在 org mode 中可以執行程式片段,至於顯示圖片的寫法可參考 https://orgmode.org/worg/org-contrib/babel/languages/ob-doc-python.html

有幾個地方要注意

  1. 不再使用 :session 參考
  2. :results 設定傳回 file ,實際上是一個連結
  3. 需將圖片儲存為一個可顯示的檔案
  4. 需以 return 關鍵字回傳檔名



2020年3月17日 星期二

StanfordNLP 更名為 Stanza

這是 2020/3/6 所做的變更,首頁提供了 Colab 的執行方式


測試一下,感覺滿順的


如同其說明所言,特點如下:

  1. 無痛安裝(尤其是 Colab 很讚)
  2. 全神經網路化工作流程
  3. 支援 66 個人類語言(相當程度上受益於 UD 計劃)
  4. 仍支援 CoreNLP 後端
我滿看好整合 UD 的雄心壯志,感覺是座巴別塔(誤)


2020年3月4日 星期三

以 scrapy 爬蟲抓 ptt 文章,兼論 Anaconda 下 venv 的使用

從頭刻一個當然可以,但有人已經寫好了,在 https://github.com/afunTW/ptt-web-crawler/tree/master/ptt_web_crawler

ptt-web-crawler 是一個沒有使用 scrapy 的專案,協作者 afunTW 將它 fork 了以後以 scrapy 進行改寫。我猜抓下來還是不能直接用,因此 fork 了以後才 clone。為了不影響原環境,並順便解答一些疑問,我在 anaconda 下先安裝了 scrapy ,然後在 clone 下來的目錄中,執行 python -m venv venv。然後新開一個 cmd 並進入 venv 環境,在同一目錄中執行 pip install -r requirements.txt。然後執行 scrapy crawl ptt-web -a board=Gossiping -a pages=1,2 發生三個問題,依序記錄如下

scrapy 指令無法執行

我修改了 requirements.txt ,在最後加入 scrapy 一行,執行 pip install -r requirements.txt。然後執行 scrapy crawl ptt-web -a board=Gossiping -a pages=1,2 發生第二個問題

ModuleNotFoundError: No module named 'scrapy.conf'

出自此行 from scrapy.conf import settings

試著直接comment掉,結果沒問題。可能是我在上一步沒有指定 scrapy 的版本,結果直上 scrapy 2.0 的關係。diff 如下:

--- a/ptt_web_crawler/ptt_web_crawler/spiders/ptt_web_spider.py
+++ b/ptt_web_crawler/ptt_web_crawler/spiders/ptt_web_spider.py
@@ -8,7 +8,7 @@ from six import u

 import scrapy
 from ptt_web_crawler.items import PttWebCrawlerItem
-from scrapy.conf import settings
+# from scrapy.conf import settings
 from scrapy.exceptions import CloseSpider
 from scrapy.http import FormRequest
 from scrapy.spidermiddlewares.httperror import HttpError

執行 scrapy crawl ptt-web -a board=Gossiping -a pages=1,2 發生第三個問題

ImportError: DLL load failed: 找不到指定的模組。

  File "C:\Anaconda3\envs\python 3.7\lib\sqlite3\dbapi2.py", line 27, in
    from _sqlite3 import *

別的專案也遇到相同問題,迫使我回到 python 3.5 開發。看來直接由 cmd 進入新建的 venv 時無法取用 anaconda 已安裝的 sqlite3(以及 scrapy ,如果已經安裝了的話) ,因此必需在 anaconda 的 python 3.7 內進入 venv ,才能正常工作。至於若在新建的 venv 下重新安裝 scrapy ,也無法正常工作,仍然必需使用 anaconda 的套件才能正常工作。

Results

結果會存在 data\Gossiping\Gossiping_page_1_2.json

光兩頁就快 1M 了,改天再來寫一篇這個 json 檔的後處理


2020年3月3日 星期二

generator, generator, 多少 iterator 假汝之名而行

Design Patterns (1994) 自從寫就以來,對程式語言本身似乎沒什麼影響,因為大家都找到自己的方法去實踐。一個例外是 python 的 yield 指令,它嘗試以原生的機制來做到迭代子 (iterator) 功能,通常配合的是 for / next。

拋開這些術語不談,實務上當我們使用迴圈時,會有個邏輯來告訴我們如何取得下一個元素,以及如何回傳結果(如果需要的話)。最簡單的情況,下個元素是累加 1 ,結果則寫入一個串列,並在迴圈結束時回傳 (return)。當下個元素不是累加 1 這麼單純時,若不先生成整個序列,那麼如何能達成相同的目的呢? 直觀上我們可以先生成所要迭代的元素序列。

然而出於記憶體的考量,類似檔案處理為何要走 streaming ,如果能生成每個元素時都立即進行所要的運算,那麼即使整個序列很大也沒關係。其次,生成下個元素的邏輯可以獨立於對元素的運算而抽象化,成為一個可重用的架構,這是第二個好處。

實作上典型的 yield 迭代因此就會有兩層迴圈,內層產生序列,外層逐一取得序列的元素,進行所要的運算。內層迴圈約定好去寫成一個函數,稱為 generator (定義上就是一個有回傳值的 iterator) ,外層則是第一段提到的 for / next 。內層迴圈一旦產生新元素,就必需有個機制暫停內圈執行、保存狀態、回傳元素,這就是 yield 的功用。外層迴圈以 for 迭代 generator ,隱式呼叫了 next 函數,暫停外圈執行、保存狀態、啟動/繼續內圈執行。內圈被執行後會執行到 yield (或結束迴圈產生例外,外圈依約定結束迭代,太細了處不談)暫停內圈執行、保存狀態並回傳元素。外圈取得元素並繼續執行,直到再回到 for 而隱式呼叫 next ,如此週而復始。

說實在的不用 yield 也能依 design pattern 做到相同的事,但是 yield 的工作條件實在太特殊了,這就是一個見仁見智的語言設計。隱約看得到 goto 的影子,不是嗎XD

下圖取自 python yield 語法與 generator 物件介紹

2020年2月10日 星期一

Flask 的 Blueprint -- 元件協定

Flask 有個全域的 app 變數,這樣 expose 出一個執行期物件的做法, Delphi 或更早的 smalltalk 都做過,效果也都不錯,甚至還能提供元件熱插拔的神奇功能

但 Blueprint 只是著眼在對一個專案的元件化,沒有(也不需要)熱插拔。所以使用它的套件模組只能算得上是個"準"套件。

一個 web app 必需提供對網址的解析,http 的規範讓 uri 幾乎可以無縫接軌到介面端 soap / web service 及實做端的 views/templates/statics,而 Blueprint 則為這樣的積木提供了膠水,把元件們組合成一個 app。

照例上幾個參考的網址

https://stackoverflow.com/questions/24420857/what-are-flask-blueprints-exactly

A blueprint is a template for generating a "section" of a web application.

目前已經有很多套件可以在安裝後利用少許設定嵌入專案,flask 流多是使用 Blueprint

http://docs.jinkan.org/docs/flask/blueprints.html

這是官方文件的說明,對某些領域解決方案這可能對應到所謂的 router

https://spacewander.github.io/explore-flask-zh/7-blueprints.html

這是有點長的介紹,有人翻譯為中文,舉的例子不錯

http://www.bjhee.com/flask-ad6.html

程式多了起來,此文著重程式設定

https://hackmd.io/@shaoeChen/H1HIg0kqW?type=view

純使用者觀點

https://martychen920.blogspot.com/2017/09/python-flask.html

另一個使用者觀點


2020年1月6日 星期一

Augmenting Neural Networks with First-order Logic 讀書筆記

長久以來,嘗試要將 first order logic 嵌入 DNN 的各種研究一直沒有停過,也一直不斷的在推出新的嘗試。這篇2019的文章整理出三種目前的發展:


  1. Artificial Neural Networks and Logic - knowledge distillation (Hinton et al., 2015)
  2. Regularization with Logic - guide training neural networks
  3. Learning with Structures - Constrained Conditional Model(this paper)

舉例偏 NLP 的應用,感覺很有潛力,但是好像沒有結合到最近很熱門的知識圖譜,測試的數據有稍比 benchmark 好上一點,但感覺上仍然是個練蠱練出來的結果。放個文首的圖,對 NLP 的 QA 任務算是不錯的說明。