狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

拒絕背鍋!39 歲失業(yè)后,我寫(xiě)出了一個(gè)超一萬(wàn)億使用量的數(shù)據(jù)庫(kù)SQLite

admin
2024年8月15日 14:30 本文熱度 2061
編譯 | 核子可樂(lè) 褚杏娟
SQlite 如今走過(guò)了24個(gè)年頭,如今有了超一萬(wàn)億的活躍使用量,它被許多頂尖的網(wǎng)頁(yè)瀏覽器、操作系統(tǒng)、移動(dòng)電話(huà)和其他嵌入式系統(tǒng)使用,是部署最廣泛的數(shù)據(jù)庫(kù)引擎之一,許多編程語(yǔ)言都有與 SQLite 庫(kù)綁定。但SQlite 背后的貢獻(xiàn)開(kāi)發(fā)者卻只有三人,其中項(xiàng)目最初的開(kāi)發(fā)者Richard也已經(jīng)63歲。Richard 如何失業(yè)后“閑著也是閑著”,然后搞出了這么一個(gè)使用范圍超級(jí)廣的通用關(guān)系數(shù)據(jù)庫(kù)?
“不想背鍋”

1992 年,31 歲的 D. Richard Hipp 在 Hwaci. 公司負(fù)責(zé)技術(shù)開(kāi)發(fā),他的專(zhuān)項(xiàng)團(tuán)隊(duì)中有一個(gè)客戶(hù)是巴斯鋼鐵廠,負(fù)責(zé)為 DDG-79 Oscar Austin 號(hào)開(kāi)發(fā)軟件——那是一艘龐大、復(fù)雜、隨時(shí)都會(huì)出毛病的戰(zhàn)艦。

當(dāng)時(shí)的數(shù)據(jù)庫(kù) Informix 運(yùn)行得并不好,有時(shí)候服務(wù)器會(huì)宕機(jī),導(dǎo)致應(yīng)用程序無(wú)法運(yùn)行。船員雙擊這款軟件后會(huì)彈出對(duì)話(huà)框報(bào)錯(cuò):“無(wú)法連接到數(shù)據(jù)庫(kù)服務(wù)器”,而負(fù)責(zé)此項(xiàng)目的 Richard 團(tuán)隊(duì)對(duì)此無(wú)可奈何,因?yàn)樗麄儫o(wú)權(quán)控制數(shù)據(jù)庫(kù)服務(wù)器。

Richard 之所以被選中,是因?yàn)樗騺?lái)以能解決難題而聞名。“頭頂著技術(shù)團(tuán)隊(duì)的名號(hào),出的問(wèn)題還是要由我們背鍋,畢竟對(duì)話(huà)框這塊可是我們負(fù)責(zé)的。”Richard 說(shuō)道。

Richard 團(tuán)隊(duì)的思路是哪怕在戰(zhàn)斗中受損,整個(gè)船舶系統(tǒng)也應(yīng)該能夠正常工作,因此數(shù)據(jù)庫(kù)必須可靠。事實(shí)上,他們做的事情很簡(jiǎn)單,就是把數(shù)據(jù)讀入 RAM——不做事務(wù)處理、不做任何類(lèi)似的操作,只是把數(shù)據(jù)拉入內(nèi)存。

這給了 Richard 這樣的領(lǐng)悟:我們?yōu)槭裁捶堑眯枰?wù)器?為什我不能直接從磁盤(pán)驅(qū)動(dòng)器上把數(shù)據(jù)提取出來(lái)?這樣如果計(jì)算機(jī)運(yùn)行狀態(tài)良好,它就能運(yùn)行應(yīng)用程序,整個(gè)流程中不再存在可能導(dǎo)致失敗的依賴(lài)項(xiàng)。

但四處打探后,他發(fā)現(xiàn)當(dāng)時(shí)根本就沒(méi)有能做到這一點(diǎn)的 SQL 數(shù)據(jù)庫(kù)引擎。之后,Richard 的一位同事提醒道:

“Richard,你為什么不自己寫(xiě)一個(gè)呢?”
“行啊,我試試吧。”

Richard 回應(yīng)了,但并沒(méi)有立馬動(dòng)手。2000 年左右,公司資金中斷,當(dāng)時(shí)恰逢紐特·金里奇和比爾·克林頓就國(guó)會(huì)預(yù)算案發(fā)生了爭(zhēng)執(zhí),導(dǎo)致所有政府合同都被取消了,Richard 被迫失業(yè)了好幾個(gè)月。

“閑著也是閑著,正好來(lái)寫(xiě)那個(gè)數(shù)據(jù)庫(kù)引擎。”就這樣,Richard 開(kāi)始了 SQLite 的研發(fā)。

2000 年時(shí),人們主要使用撥號(hào)上網(wǎng),只有 1% 的美國(guó)家庭擁有網(wǎng)絡(luò)帶寬,因此 Richard 不像現(xiàn)在的人們那樣可以谷歌搜索學(xué)會(huì)構(gòu)建數(shù)據(jù)庫(kù)。

但他根據(jù)自己先前的編譯器構(gòu)建經(jīng)驗(yàn)制定了一項(xiàng)清晰的計(jì)劃:如果把每一條 SQL 語(yǔ)句視為一個(gè)程序,那自己的任務(wù)就是把這些程序編譯成某種可執(zhí)行的代碼。

因此,Richard 編寫(xiě)了一套能夠?qū)嶋H運(yùn)行查詢(xún)的字節(jié)碼引擎,之后又編寫(xiě)了一款編譯器,用于將 SQL 轉(zhuǎn)換成相應(yīng)的字節(jié)碼。就這樣,SQLite 誕生了。

可惜它并沒(méi)有在 Richard 當(dāng)時(shí)從事的戰(zhàn)艦項(xiàng)目上發(fā)揮作用,因?yàn)槟莻€(gè)項(xiàng)目被關(guān)閉了。后來(lái)項(xiàng)目重啟,Richard 嘗試把 SQLite 引入其中進(jìn)行測(cè)試。不過(guò)遺憾的是客戶(hù)堅(jiān)持使用 Informix。“倒是可以理解,但 Informix 在開(kāi)發(fā)方面的使用感受真的很差。”Richard 說(shuō)道。

為了不浪費(fèi),Richard 把它放在了互聯(lián)網(wǎng)上,于是有更多人開(kāi)始使用。“當(dāng)時(shí)還沒(méi)有 Twitter 之類(lèi)的東西,但已經(jīng)有帖子說(shuō)‘哇,我在自己的 Palm Pilot PDA 設(shè)備上運(yùn)行 SQL 數(shù)據(jù)庫(kù)啦!’不開(kāi)玩笑,這樣的事情當(dāng)時(shí)確實(shí)吸引到很多人的關(guān)注,這也激勵(lì)著我繼續(xù)做研究和開(kāi)發(fā)。”Richard 表示。

“其實(shí)我只是在到處借鑒”

“我最早開(kāi)始編寫(xiě) SQLite 的時(shí)候,曾經(jīng)到處搜尋,想要看看有沒(méi)有關(guān)于如何編寫(xiě) SQL 數(shù)據(jù)庫(kù)引擎的參考資料。可我什么都沒(méi)找到,所以只能邊做邊學(xué)邊發(fā)明。這是個(gè)完全由自己摸索出來(lái)的路徑。”Richard 說(shuō)道。

大部分理論都是由麻省理工學(xué)院、哈佛大學(xué)、劍橋大學(xué)或者伯克利大學(xué)的研究小組提出的,而如果大家沒(méi)上過(guò)這些學(xué)校,就很可能完全沒(méi)聽(tīng)說(shuō)過(guò)這些理論,更沒(méi)有靠譜的方式能夠查詢(xún)相關(guān)資料。

但奇怪的是,如果回頭看看 Postgres 使用的火山模型和 SQLite 曾經(jīng)使用的字節(jié)碼模型,就會(huì)發(fā)現(xiàn)大家都不約而同選擇了類(lèi)似的方向。這些方案雖然從宏觀來(lái)講起點(diǎn)各不相同,但大家在如何提高速度表現(xiàn)方面卻意見(jiàn)統(tǒng)一,所以 Richard 認(rèn)為這也是對(duì)理論的一種印證,兩條獨(dú)立的開(kāi)發(fā)路徑得出了同樣的答案。

例如,Richard 就從來(lái)沒(méi)聽(tīng)說(shuō)過(guò)覆蓋索引。只是在一場(chǎng)位于德國(guó)的 PHP 大會(huì)上,他見(jiàn)到了 MySQL 初創(chuàng)團(tuán)隊(duì)成員之一的 David Axmark,Axmark 解釋了 MySQL 是如何實(shí)現(xiàn)覆蓋索引的。Richard 想,“哇哦,這個(gè)想法簡(jiǎn)直天才!”于是在回途的飛機(jī)上就開(kāi)始為 SQLite 編寫(xiě)覆蓋索引。

“其實(shí)我只是在到處借鑒。”Richard 說(shuō)道,人們會(huì)分享自己的心得,有人會(huì)主動(dòng)找他:

“你為什么不試試這種優(yōu)化方法?”
“我沒(méi)想到啊。”
“那你看能行嗎?”
“那就試試唄。”

之后它就成了 SQLite 的一部分。這就是邊做邊學(xué)邊發(fā)明的好處。

SQLite,“三戰(zhàn)”成名

SQLite 開(kāi)發(fā)出來(lái)的頭一兩年,Richard 忙于推進(jìn)他的數(shù)據(jù)庫(kù)項(xiàng)目。突然,有一天他接到了當(dāng)時(shí)科技巨頭摩托羅拉打來(lái)的電話(huà)。

“你好,我們正在設(shè)計(jì)一款新的手機(jī)操作系統(tǒng),而且打算將 SQLite 納入其中。你能為我們提供支持嗎?”
“哦,可以的。我沒(méi)問(wèn)題。”
“那能不能給報(bào)個(gè)價(jià)?”
“好的,這樣吧,明天咱們?cè)俅騻€(gè)電話(huà),到時(shí)候我給你答復(fù)。”

當(dāng)時(shí) Richard 的內(nèi)心一陣狂跳——居然還能靠做開(kāi)源軟件賺錢(qián)?真有這樣的事?我該定多少錢(qián)?怎么辦怎么辦……Richard 四下搜索,想出了幾種定價(jià)策略。摩托羅拉當(dāng)時(shí)還有改進(jìn)要求,需要適應(yīng)手機(jī)硬件,于是 Richard 報(bào)了 8 萬(wàn)美元左右。“在當(dāng)時(shí)的我看來(lái),那數(shù)字簡(jiǎn)直就是在明搶?zhuān)梢哉f(shuō)貴得離譜。”

后來(lái),Richard 又找來(lái)三位前同事一起做這個(gè)項(xiàng)目,而這就是 SQLite 項(xiàng)目起飛的原點(diǎn)。

而真正讓 SQLite 走上成功道路的是諾基亞手機(jī)的操作系統(tǒng)塞班。塞班打電話(huà)希望 Richard 在感恩節(jié)那天能飛一趟倫敦總部。去了之后,Richard 才發(fā)現(xiàn),塞班之前已經(jīng)搞了一場(chǎng)大規(guī)模的招標(biāo),從中挑選出塞班系統(tǒng)的數(shù)據(jù)庫(kù)引擎。

當(dāng)時(shí)參加選拔的大約有 10 種不同的數(shù)據(jù)庫(kù)引擎,其中有兩款是開(kāi)源項(xiàng)目,另外七款屬于專(zhuān)有產(chǎn)品。塞班在數(shù)據(jù)集上運(yùn)行了這些引擎,想看看哪種最適合自己的需求,最后 SQLite 順利勝出。塞班還給了其他九家調(diào)整的機(jī)會(huì),但最后又是 SQLite 贏了。

Richard 過(guò)去后,塞班的人對(duì) SQLite 大加贊賞,同時(shí)又提出了一些改進(jìn)要求。之后,雙方簽訂了合同,由 Richard 負(fù)責(zé)做相應(yīng)的開(kāi)發(fā)。

當(dāng)時(shí) Richard 幾人真的是盡心盡力,Richard 本人差不多是全職在做這方面工作了。

但是,后來(lái)塞班的人告訴他們:“不好意思,你得想辦法提高巴士因子。”他們覺(jué)得 SQLite 的巴士因子不夠……所以希望建立一個(gè) SQLite 聯(lián)盟,讓更多人參與進(jìn)來(lái)以保證項(xiàng)目長(zhǎng)期存續(xù)。

注:所謂巴士因子,就是說(shuō)一支團(tuán)隊(duì)里有多少成員意外被巴士撞了(或者受其他偶發(fā)因素影響而無(wú)法繼續(xù)工作),才會(huì)導(dǎo)致項(xiàng)目陷入停滯。

接到需求后,Richard 開(kāi)始推動(dòng)這項(xiàng)重要工作,但他其實(shí)也不知道該怎么做。后來(lái),當(dāng)時(shí) Mozilla 基金會(huì)的負(fù)責(zé)人 Michell Baker 聽(tīng)到了風(fēng)聲,主動(dòng)給他打電話(huà)說(shuō):“Richard,你的做法有問(wèn)題,讓我來(lái)告訴你怎么建立一個(gè)聯(lián)盟。”

Baker 制定了規(guī)則,強(qiáng)調(diào)“開(kāi)發(fā)者必須掌控一切,開(kāi)發(fā)者的決定就是最終決定。對(duì)于批準(zhǔn)哪些內(nèi)容加入項(xiàng)目,其他人沒(méi)有投票權(quán)。企業(yè)參與者只有享受成果和貢獻(xiàn)資金的榮譽(yù)頭銜,但決定還是要由你自己掌握。”她對(duì)此非常堅(jiān)定,而且對(duì)我可以說(shuō)是知無(wú)不言、言無(wú)不盡。

Baker 是律師出身,我問(wèn)她“那要怎么吸引人們加入?得設(shè)置怎樣的激勵(lì)措施?”她回答道,“別擔(dān)心,人們肯定會(huì)加入的。只要按我的辦法來(lái),Mozilla 首先就會(huì)成為創(chuàng)始成員之一。”而在聯(lián)盟計(jì)劃公布后,果然吸引到了 Mozilla、塞班和 Adobe 的支持,各方共同成立了 SQLite 聯(lián)盟。

值得一提的是,SQLite 的版權(quán)聲明中還有一條:Open-Source, not Open-Contribution(開(kāi)源,但是并不開(kāi)放代碼貢獻(xiàn))。因此,至今 SQLite 項(xiàng)目總共只有三位開(kāi)發(fā)人員 D. Richard Hipp、Dan Kennedy 和 Joe Mistachkin。

構(gòu)建智能手機(jī)這樣的嵌入式開(kāi)發(fā)是個(gè)緩慢的過(guò)程,需要長(zhǎng)時(shí)間的迭代循環(huán),更需要花時(shí)間等待各種功能在原型設(shè)計(jì)中一一體現(xiàn),人們只能在看起來(lái)跟成品完全不同的“坯子”上進(jìn)行開(kāi)發(fā)。

谷歌聯(lián)系了 Richard,當(dāng)時(shí)的搜索巨頭還跟手機(jī)或者嵌入式開(kāi)發(fā)牽不上半點(diǎn)關(guān)系。

2005 年左右,Richard 幾人正在跟 Android 開(kāi)會(huì),那時(shí)候這款如今聲名大噪的操作系統(tǒng)還沒(méi)真正出現(xiàn),當(dāng)時(shí)也沒(méi)有 iPhone。那時(shí)候的手機(jī)下方是完整的 QEWRTY 全鍵盤(pán),上方則是個(gè)較小的顯示窗口。

Richard 團(tuán)隊(duì)使用 SQLite 進(jìn)行調(diào)試:端連著手機(jī),另一端在工作站上運(yùn)行調(diào)試器。“這種感覺(jué)挺神奇的。其他人都不會(huì)干,而當(dāng)我們把手機(jī)接入調(diào)試器時(shí),電話(huà)響了。這位同事看了一眼說(shuō),‘哦,是我老婆,我得接個(gè)電話(huà),不好意思。’我離開(kāi)了房間,留他慢慢跟妻子聊天。”

當(dāng)時(shí) Richard 雖然表面上不露聲色,但腦袋里卻炸開(kāi)了鍋。“我們居然在接著公共網(wǎng)絡(luò)的手機(jī)上調(diào)試應(yīng)用程序,而且完全不耽誤正常通話(huà),這真是太令人震驚了。無(wú)論是摩托羅拉、塞班還是諾基亞,當(dāng)時(shí)都沒(méi)人能做到這一點(diǎn)。就在那個(gè)瞬間,我就知道 Android 絕對(duì)會(huì)大獲成功。”

“我真的以為能寫(xiě)出沒(méi)有 bug 的軟件”

不過(guò)幸福之后,煩惱也會(huì)隨之而來(lái)。

“我們?cè)?jīng)天真地宣傳,SQLite 從不出錯(cuò),至少不會(huì)搞出嚴(yán)重的 bug。但 Android 證明我們還是太過(guò)年輕、有時(shí)幼稚。我以前真的以為能編寫(xiě)出沒(méi)有 bug 的軟件,可一旦軟件被發(fā)布到數(shù)百萬(wàn)臺(tái)設(shè)備上時(shí),引發(fā)的 bug 數(shù)量絕對(duì)會(huì)多到難以想象。”Richard 回憶道。

當(dāng)時(shí)還在為航空電子設(shè)備制造商 Rockwell Collins 工作的 Richard,了解到了 DO-178B 的概念,他意識(shí)到其中最有價(jià)值、最關(guān)鍵的理念之一,就是要求實(shí)現(xiàn) 100% 的 MCDC 測(cè)試覆蓋率。

注:MCDC,指的是確定代碼修改條件的決策覆蓋率。也就是說(shuō)測(cè)試必須保證所生成二進(jìn)制代碼中的每個(gè)分支操作至少跑通一次。

受到啟發(fā)后的 Richard 決定通過(guò)編寫(xiě)測(cè)試讓 SQLite 也達(dá)到 100% 的 MCDC 覆蓋率,而這花了他整整一年的時(shí)間,每周要工作 60 個(gè)小時(shí)。

“這項(xiàng)工作相當(dāng)相當(dāng)艱苦,我每天要干 12 個(gè)小時(shí)。這段經(jīng)歷真的讓我感到厭倦,而且相信大家都聽(tīng)過(guò)一句老生常談:我們用前 95% 的預(yù)算干完了 95% 的工作,再用另外 95% 的預(yù)算做完最后 5%。實(shí)際情況確實(shí)如此,把測(cè)試覆蓋率推到 90% 甚至 95% 都很容易,可最后這 5% 則是難而又難,我花了大約一年時(shí)間才達(dá)成這個(gè)目標(biāo)。”Richard 回憶時(shí)說(shuō)道。

對(duì)于典型的發(fā)布周期,他們要運(yùn)行十億級(jí)別的測(cè)試,大約有 10 萬(wàn)個(gè)不同的測(cè)試用例。他們的第一項(xiàng)測(cè)試是用 TCL 編寫(xiě)的,真正 100% 覆蓋的 MCDC 測(cè)試名叫 TH3,屬于專(zhuān)有成果。Richard 本來(lái)希望把這些測(cè)試出售給航空電子設(shè)備制造商賺點(diǎn)錢(qián),但一份都沒(méi)賣(mài)出去。

團(tuán)隊(duì)有一個(gè)叫 SQL 邏輯測(cè)試的工具,目的是設(shè)法讓每種數(shù)據(jù)庫(kù)引擎都出現(xiàn)段錯(cuò)誤,其中也包括 SQLite。“我們搞崩過(guò) Oracle,包括 Oracle 的商用版本。我們搞崩過(guò) DB2,嘗試把我們能接觸到的所有數(shù)據(jù)庫(kù)并努力把它搞崩。”Richard 提到,唯一的例外就是 Postgres,它的穩(wěn)定性給 Richard 留下了非常深刻的印象。

總之,提高測(cè)試覆蓋率成了一項(xiàng)深遠(yuǎn)影響的決策,Richard 團(tuán)隊(duì)在接下來(lái)的八、九年里再也沒(méi)遇到過(guò)任何 bug。

“我的項(xiàng)目聽(tīng)我的”

SQLite 基本上全都是 Richard 親自動(dòng)手開(kāi)發(fā)的依賴(lài)項(xiàng)。除了 C 編譯器和 libc 之類(lèi)的現(xiàn)成方案,他甚至構(gòu)建了自己的源代碼控制系統(tǒng)和 bug 跟蹤器。總之,Richard 的項(xiàng)目都由他來(lái)掌握。

“人們?nèi)ケ嘲眯谢蛲讲剑砻嫔峡词欠N自由,但實(shí)際上途中到底如何取決于他們的背包準(zhǔn)備得是否充足。因此,他們討論的自由其實(shí)就是自己到底為此付出了多少心力。”Richard 說(shuō)道,“所以當(dāng)我們編寫(xiě)自己的項(xiàng)目時(shí),肯定可以享受其中的自由、不再受到其他人的約束。畢竟我們不依賴(lài)于不同供應(yīng)商直接提供的現(xiàn)成方法。”

就像當(dāng)初選擇使用本來(lái)開(kāi)源的 Berkeley DB 作為 SQLite v2 版本的存儲(chǔ)引擎的話(huà),當(dāng)它被賣(mài)給甲骨文、成了雙源專(zhuān)有模型后,本來(lái)理想的情況就變得相當(dāng)被動(dòng)。

SQLite 中的解析器生成器 Lemon 是多年之前 Richard 親手編寫(xiě)的。“每當(dāng)我需要一些無(wú)法從 Yacc 或者 GNU Bison 處獲得的新型語(yǔ)言功能時(shí),由于擁有對(duì)解析器生成器的掌控權(quán),我可以隨時(shí)調(diào)整 SQLite 的版本控制系統(tǒng)并做出自己想要的調(diào)整。”

他最初使用 CSV,因?yàn)?2000 年那會(huì)兒每個(gè)項(xiàng)目都在使用 CVS, 而進(jìn)入 2000 年代中期后則需要更好的系統(tǒng)。Richard 先后研究了 Git、Mercurial,又回顧了自己的需求,突然發(fā)現(xiàn)“得自己寫(xiě)一個(gè)才行”。于是 Richard 編寫(xiě)了自己的版本控制系統(tǒng),而現(xiàn)在它本身也成了獨(dú)立的項(xiàng)目,而且效果非常好。

“因?yàn)槭亲约河H力親為,所以它能夠充分滿(mǎn)足我的需求,可以跟一切原有、現(xiàn)有及未來(lái)將要出現(xiàn)的工作場(chǎng)景相契合。”Richard 說(shuō)道,“這種自己動(dòng)手方式能把命運(yùn)把握在自己指尖,以擺脫第三方的方式真正擁抱自由。”

原文鏈接:

https://corecursive.com/066-sqlite-with-richard-hipp/


該文章在 2024/8/19 18:35:19 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved