Sign in

圖片來自 Getty Images

對於 web 自動化測試,一路走來我們用過許多方案,剛開始是用最多人知道的 Selenium,那是前端框架還不盛行的時代,也是要手動寫測試腳本的時代。

手動寫測試腳本這件事對工程師們來說,是繁重又缺乏創造力的工作,當時流行的 jQuery web 元件讓「抓 id / class」變成一件相當繁瑣的事,而最大的問題是人力的耗損,算式很簡單:,任何有成本概念的人都不會想把人力投放在測試上。(投放在測試上/投資在品質上,是兩個不同的概念,不要混為一談。)

第二階段,我們找到了 Sikuli,它是以比對螢幕圖像與位置為基礎的測試工具,也有寫與錄腳本的能力,操作也夠親切,只要有基礎的程式與邏輯概念的人都可以無痛寫(錄)出所有實境操作的劇本,但 Sikuli 的問題是只要換個解析度或換個作業系 …


圖片來自 Mozilla

Firefox Beta

Firefox 除了一般的版本之外,還另外有 Beta、Developer、Nightly 版,這些額外的預覽版本是用來供應給網頁開發者等等的早期用戶,這些早期用戶可以透過預覽版的 Firefox 來測試新的網頁技術,當然既然是預覽版那麼它們的穩定性一定是不如一般版的,喜歡嚐鮮或工作上對新的網頁技術有需求的朋友可以斟酌安裝。

elementary OS

elementary OS 是以 Ubuntu Desktop 為基礎,再改用 elementary OS 自己的桌面環境而來,提供了比原本 Ubuntu Desktop 更美觀也更友善的桌面體驗,並且依然保留了 Ubuntu 的系統架構與沿用 Debian 流派的套件管理系統 APT,所以網路上對 Debian / Ubuntu 的文章大多也可以適用於 elementary OS。

PPA

前面提到過 elemantary OS 是基於 Ubuntu 的,並且也是用 APT 作為套件管理系統,因此若要安裝普通版的 Firefox,則只要一行簡單的指令:

sudo apt install firefox

因為普通版的 Firefox 有被收錄在 Ubuntu 的套件庫內,而 elementary OS 也是有沿用 Ubuntu 的套件庫,才能安裝的這麼輕鬆寫意。

然而如果想嘗試 Firefox Beta,你會發現好像有難度,在 Firefox Beta 的下載頁雖然有列出 Linux 版的下載包,但是它只提供 .tar.bz2 的壓縮包,雖然解開免安裝就可以用,但並未整合入 elementary OS 的 app 選單內,有點像以前 Windows 上的綠色軟體,但這不是我想要的,本人還是較偏好與 OS 能夠做到整合的做法,因此我們必須手動把 Firefox Beta 的 PPA 套件庫加入系統內。

PPA,即 Personal Package Archive,是讓任何大眾可以寄存自己的 DEB 套件的平台,最大的 PPA 平台 Launchpad 也是由 Ubuntu 背後的公司 Canonical 所營運的。

Firefox Beta PPA 的專案頁面。裡面的說明有教導我們如何把這個 PPA 套件庫加入我們的 elementary OS 之內,依照頁面的指示加入 PPA 套件庫:

sudo add-apt-repository ppa:mozillateam/firefox-next

然後重整套件庫清單:

sudo apt update

最後安裝 Firefox Beta:

sudo apt install firefox

注意到,套件的名稱還是 ,也就是說這個 PPA 內的 Firefox Beta 的套件名稱還是 ,並且取代了原本 Ubuntu 套件庫的那個普通版的

安裝完之後我們的系統內的 Firefox 應該就會被取代成 Firefox Beta。


圖片來自 Ricardo Gomez Angel

古早的年代想在網頁內埋 Java 還有 Java applet 可以用,在 Java applet 式微後,找來找去比較可以的辦法大概就是編譯成 WebAssembly 了吧!

想要把 Java 編譯成 WebAssembly,有下面三個工具可以選用:

TeaVM

TeaVM 是個 Java 到 JavaScript 的轉碼工具。TeaVM 接受的來源是 Java bytecode,意即不只是 Java,只要能編譯成 Java bytecode 的語言,包括 Kotlin 等,都可以透過 TeaVM 編譯成 WebAssembly 或轉碼成 JavaScript。

不過 Java 到 WebAssembly 這一部份還只在實驗階段,只適合拿來當玩具,不適合拿來做工具。

CheerpJ

與樓上一樣是 Java bytecode 到 WebAssembe 或 JavaScript 的工具。背後有商業公司支持,因此令人感覺發展的完整度也較高,相對來說,商業用途就必須付費,只有非商業用途免費,付費除了買授權外,同時也會有顧問提供技術支援,果然天下沒有白吃的午餐啊。

JWebAssembly

從名字就可以聯想到 JWebAssembly 只專注於 Java bytecode 到 WebAssembly 的轉換。一樣比較偏玩具性質。

小結

一輪調查完畢,雖然三個工具各有特色,也都各有限制,技術上的限制可能是某一些 Java 的特性很難被完整的轉換,非技術上的限制就是錢錢的問題啦,目前並沒有既免費又傻瓜的轉換器這樣的東西存在,不過還是謝謝佛心的 CheerpJ 有提供非商用的免費版給大家。


W3C 有原生的條碼辨識 API 草案:https://wicg.github.io/shape-detection-api/index-zh-cn.html#barcode-detection-api,幾年前試過只有 Chrome 有實驗性支援,而 Chrome 底層好像也是用 Zxing 實現的,但不論是 Zxing 或 Zbar,他們對扭曲或反光或其他干擾下的辨識度都不是很好,如果是高干擾的場景建議用商用的辨識元件較佳。


(來源:Albert Moreno

之前寫過一篇〈初探 Orator ORM〉,有介紹了 Orator ORM 的基礎操作,而此篇文章就專門介紹 Orator ORM 的 seeding 機制,本篇的範例也都延續自〈初探 Orator ORM〉,還沒讀過的朋友請趕快手刀點擊閱讀。


(來源:Thomas Koukas

這篇主題談的並不是《從 A 到 A+》的什麼廉價低配版,並不是

之前寫過一篇〈你的程式是資產還是負債?〉,裡面分享了把程式比喻成負資產的危害,以及如何活化資產的幾種方式,這一篇我想延續「資產」的概念,分享我對正資產程式的成長循環的觀點。

即便我們把手中有活躍客戶(以及收入)的產品視為正資產,但這樣的資產和房地產/股票/存款還是有本質上的不同——產品是不會生利息的,不會就是不會。

那麼要如何實現產品的成長?最直覺不經思考的策略大概會是「靠業務努力衝啊!」這種愚公移山式的努力。

在網路和 app 商店還不存在的年代,當時的軟體產品的確只能靠實體通路與業務,實體通路負責套裝軟體的分銷,業務進行專案型系統的推廣,隨著後續網路、app 商店、雲端等技術的出現,軟體逐漸變成服務——為了解決用戶問題的服務, …


(來源:Joe Dudeck

在幾年以前,我曾經陸續讀到過幾個相似的概念——5S斷捨離、《怦然心動的人生整理魔法》,它們在我心中逐漸建構起一個共同的核心觀念——「物品的價值在於被有效的使用」,這個概念成立的基礎在於人們能掌握的資源是有限的,特別是時間與空間。當一個物件被閒置在某個角落,而那個堆雜物的角落假設佔了一坪的空間,那麼相當於我花了成本相當於市價一坪的錢買了那塊地,上頭卻供奉著僅僅是被歸類於雜物的物件們,他們紮紮實實的佔據了那一坪空間不是嗎?也因此你與家人的走動空間也確實少了那一坪沒錯吧!

前面提到的概念,在個人的階段,如同斷捨離所倡導的,「斷絕不需要的東西;捨去多餘的事物;脫離對物品的執著」,具體的行為如《怦然心動的人生整理魔法》所實踐的——取出那些閒置物件,一件一件思考它對你的意義,如果它不再令你感到「怦然心動」,那麼就謝謝它曾經帶給你的意義與價值,然後就妥善地將它交給回收車,告別彼此展開新的生活。

如果我們把層次拉高到社會的層面,也會發現社會中也有類似的角落,試著回想你家附近是否曾經有過一個小孩不敢進去的公園,又或者是蓋到一半的爛尾樓發生過火災的猛鬼大樓等,這些閒置設施(甚至是嫌惡設施)不論是私有的或公家的,顯然不像個人物件那樣能被輕易的斷捨離,必須採取斷捨離以外的手段,像是「都市更新」與「資產活化」都是常看到的做法,政府藉由推動都市更新,改建老舊建物,不僅提升城市形象,對民眾來說生活品質也有所提升,更有感的可能是區段地價房價的上漲,對政府來說則是經濟活動活絡之後帶來的人口與稅收的增加。資產活化則常見於閒置廠房土地的重建,賦予不動產新的附加價值,帶來經濟上(永豐餘)或文化上(西門紅樓松菸林百貨)的收益。

程式是資產還是負債?


(來源:Edurne Chopeitia

Orator 是 Python 世界內的一套 ORM,介紹 Orator 前先簡單介紹 ORM,ORM 全稱 object-relational mapping,它是協助程式語言操作資料庫的中間人,ORM 把資料庫的 table 對應到程式內的 class,而 table 內的一筆紀錄則是對應到程式內的物件,紀錄內的欄位則是對應到物件的屬性,除了資料的對應外,其他增刪改動作也都有 ORM API 函式可以呼叫,如果 table 是有關聯性的,在程式內也可以設定 class 間的關聯性。

ORM 把資料庫的操作物件化後,在程式專案內就可以不用寫 SQL,可以以操作一般物件的方式去對待資料庫,有了 ORM 的基礎觀念之後,再引入 MVC 架構的 model 角色——model 是抽象化的概念,具 …


(來源:Lars Kienle

這篇是某個晚上試玩 Strapi 這套 headless CMS 的心得,主要是談 Strapi 和 headless CMS 帶來的變革,不太會談到具體的操作過程。

先談談 headless CMS。

Headless CMS

Headless CMS 是前後端分離概念下的產物,headless CMS 可以簡單的理解為剝去前端的 CMS,headless CMS 以 API 的方式(通常是 RESTful API 或 GraphQL) 供應前端內容,前端(通常是 AureliaSvelte、Vue、React、Angular)也透過 API 與 headless CMS 溝通,取得內容呈現,或發送內容回 headless CMS。

在上面的前後端分離的架構下,headless CMS 必須具備幾項特性:

  1. 管理內容的能 …


(來源:AaronJOlson

Python 的版本

Python 進入 3.x 的時代也好幾年了,但至今 Python 2.7.x 即便已經不再維護,它還是以某種殭屍的型態存活在各個陳年專案上,對一個沒有舊包袱的新專案來說,Python 3.x 的 x 就必須是在開立專案時要考慮的問題,在 Python 的網站上有 Python 各版本目前的生命週期表

Leon

產品開發的「思想的巨人、行動的侏儒」。https://leonh.space/

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store