標籤:style blog http ar io 使用 sp on 檔案
本文探討的主要是互連網軟體的構建,雖然文中提到的技術也可以用在傳統離線環境。
我們都知道,在擁有互連網的情況下,構建軟體最讓人嚮往的方式應該是像web網站一樣,我寫了什麼,使用者不需要升級神馬的,在瀏覽器重新整理一下就能看到了,我們暫且稱這種軟體構建方式為web構建方式。他最大的特點有前後端分離,動態載入,即時交付(這包括軟體本身和新的內容的分發),可控,維護方便。
反觀傳統的軟體構建方式,耗時耗力,而且基本都要內建精密的升級模組,bug報告模組,但這種軟體提供的特性目前來講是web方式構建的軟體所沒有的。原生的ui,更精良的使用者體驗,某些地方保持高度機密和效能。
如果能結合兩者的利處,相信是很好的。很多項目或者團隊也做過這一方面的努力,就我所知的有道有個什麼hex,包括qt自家的webengine。。。
貼一張mac版的有道詞典,windows版的不想安裝,更不想使用,就不了
從我個人的審美角度來講,原生ui能給我更親切更舒適的體驗,而基於hex的windows版的有道詞典,說實話,讓我有點反感,感覺不倫不類。
綜上所述,我們發現當前大家幾乎都是想依靠web來類比native,即所謂的hybrid,將部分web無法表達的交給native。但如果我們反過來想想問題,native比web差的只是方便,而web則是不能,那我們何不補齊native相對於web差的那一部分。當然我們主要不是探討native和web(htmlx)哪個更適合做ui,我傾向native,native的資源更加豐富,所以我們團隊的解決方案是基於native補齊web構建方式的優點。
我們選擇了python作為我們的膠水語言,核心部分則是c和c++,但真的只是很少很少的一點核心部分,如果不是為了保密和效能的需要,可能我們都不會用c/c++。畢竟python帶來的效率的提升真的很可觀。而且它和c天成的互動能力實在讓人印象深刻。
我們將python解譯器內嵌在一個c編寫的很小的引導程式當中,這個c的引導程式只有一個功能,能夠載入我們託管在http網站(或者其他比如ftp網站,任何可託管內容的地方)處的py指令碼。我們約定這個指令碼叫boot.py(或者pye,這是因為它可以支援載入加密壓縮過的py指令碼),這個引導程式啟動boot模組裡面的start函數,一個樣本的boot.py會是這樣。
__author__ = 'shawhen'from PyQt5.QtWidgets import *def start(*args): from . import main_window as m_main_window app = QApplication([]) main_window = m_main_window.MainWindow() main_window.show() app.exec()
(實際上在我們的生產伺服器上它是boot.pye檔案,內容看起來是這樣的:
0
?蘂8堰捋? 蔯=蘩q-?淅塯&Htk-v??搖:2E榁冖觻檾紳潎弾[EQoL??^己?=硯}詅瀳dLJ璡>=禰紆?竇聱<傫娓靿爒?鑲?鷴皀*E
鱟Ag塼L?2埮鰊?c?玭 淫!硲W母pmk
屆OA硶7灑?衉<舺綾k鐖&偸礎諱相G!閑;洠Jf7吐M,跒Q濗S?
)
在引導程式裡面,也只是很少的一些代碼:
#include <python_importer_loader.h>#include <stdio.h>#include <stdlib.h>int main(int argc,char** argv){ char whats_wrong[4096] = {0}; int exit_code = 0; python_importer_init(__WEB_IMPORTER__ | __LOCAL_IMPORTER__, 3004002); python_importer_enable_crypto(1, "your password here", strlen("your password here")); python_importer_register_domain("your.domain.here", "http"); python_importer_load("your.domain.here.boot", argc, argv, whats_wrong); exit_code = python_importer_exit(); return (exit_code);}
是的,我們依靠Qt的Python綁定版PyQt作為ui庫,這會使得我們使用Python構建出native的應用。和傳統python程式不同的地方就在於這些指令碼像web網站一樣,託管在遠程伺服器上。我們不需要主動去更新使用者的xx檔案,將新的指令碼放在伺服器上就好了。使用這個程式,就像瀏覽一個web網站一樣,但使用者獲得的體驗是完全的native。甚至於我可以隨意載入系統動態連結程式庫,實現一個系統剛剛發布的新的api,而這些在現有的web中是幾乎不可能的。
當然,即使沒有這個c的引導程式,我們也一樣可以獲得這種魔法,我們將這個c的引導程式和它真正做的事情託管在github的這裡:https://github.com/shawhen/pywebimporter
當然,還有更多的事情等待我們去做,這隻是一個開始。
我們團隊如何構建軟體