重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
這選擇顯然是因人而異的。。至于怎么選,要看你是初學(xué)者,還是老手?。。對性能有要求,還是沒要求?
贛縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
如果是完全沒有基礎(chǔ),我建議哪個都不選,如果非要選一個,那就選PYTHON。。如果你是初學(xué)者,把網(wǎng)上的教程看個遍,再買上幾本書。。。你所學(xué)會的也僅僅是語法,而根本不會編程。。。因為這些教程,也僅僅是教你語法,而沒有教你編程。。你甚至把網(wǎng)上的教程看個精光,卻連個最基本的OA系統(tǒng)都做不出來。。。只能在一個黑乎乎的控制臺上,打印一堆破字符。。
-------網(wǎng)上的所有教程都會教你的:
怎么定義一個變量?怎么在控制臺打印變量?
怎么寫一個循環(huán)?怎么在控制臺打印一堆變量?
怎么寫一個函數(shù)?怎么在控制臺打印返回值?
怎么創(chuàng)建一個對象?怎么在控制臺打印對象屬性?
------高級一點的教程,會教你的:
怎么用PYTHON的模塊,寫一個爬蟲?
怎么用RUBY的ROR框架,獲取一個表單?
怎么用GO的beego,寫一個博客?
-------而這些的教程,從來不教你的:
面向?qū)ο笥惺裁从茫?委托是什么?事件是什么? 工廠模式,單例模式,觀察者模式,這些都是啥?套接字是啥?UDP是啥?TCP/IP是啥?二叉樹是什么玩意?狀態(tài)機又是什么玩意?啥叫逆變?啥叫協(xié)變?啥叫異步?啥叫反射?
---------------------------------------------------------------------------------------------
如果一套教程,要把這些都講明白。。。可能需要上千集。。。所以這些教程,都跳過了這些內(nèi)容。。但如果你不明白這些,就根本學(xué)不會編程。。。如果你打算學(xué)一門語言,而手上只有幾十集教程,外加三五本書。。。那你只能學(xué)會玩控制臺。。。
所以初學(xué)者選擇一門語言,首先要保證這門語言作為主要開發(fā)語言,常年被公司使用,這樣才能真正學(xué)會編程。然而這三門語言都不具備這樣的特點。它們通常都是被當(dāng)成第二語言,做一些輔助開發(fā)的工作。其中Python只在極少數(shù)情況下,才被用來作為主要開發(fā)語言。至于Go與Ruby,我目前還沒聽說過它們有被當(dāng)作主要開發(fā)語言的例子。我所推薦的是從C#和JAVA兩者之間,二選一。。。學(xué)精其中一門之后,再來考慮PYTHON或GO作為第二語言。。。不然無論你選哪個,都幾乎不可能靠一門語言找到工作。
近期正在探索前端、后端、系統(tǒng)端各類常用組件與工具,對其一些常見的組件進行再次整理一下,形成標(biāo)準(zhǔn)化組件專題,后續(xù)該專題將包含各類語言中的一些常用組件。歡迎大家進行持續(xù)關(guān)注。
本節(jié)分享一個基于Go語言的HTML和CSS網(wǎng)站生成器 hugo ,它針對速度、易用性和可配置性進行了優(yōu)化。Hugo 獲取一個包含內(nèi)容和模板的目錄,并將它們呈現(xiàn)為一個完整的 HTML 網(wǎng)站。Hugo 依賴于 Markdown 文件和元數(shù)據(jù)的前端,你可以從任何目錄運行 Hugo。這適用于您沒有特權(quán)帳戶的共享主機和其他系統(tǒng)。例如我們?nèi)粘>帉懸恍┎┛臀恼拢M行快速生成一套靜態(tài)頁面進行分享時可以使用它來進行生成一套靜態(tài)頁面作為我們的博客部署基礎(chǔ)。
它支持大量的主題模板,我們可以通過 進行選擇相關(guān)的主題使用,有興趣的小伙伴可以進行深入研究一下
Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成為現(xiàn)實。Go 團隊實施了一個看起來比較穩(wěn)定的設(shè)計草案,并且正以源到源翻譯器原型的形式獲得關(guān)注。本文講述的是泛型的最新設(shè)計,以及如何自己嘗試泛型。
例子
FIFO Stack
假設(shè)你要創(chuàng)建一個先進先出堆棧。沒有泛型,你可能會這樣實現(xiàn):
type?Stack?[]interface{}func?(s?Stack)?Peek()?interface{}?{
return?s[len(s)-1]
}
func?(s?*Stack)?Pop()?{
*s?=?(*s)[:
len(*s)-1]
}
func?(s?*Stack)?Push(value?interface{})?{
*s?=?
append(*s,?value)
}
但是,這里存在一個問題:每當(dāng)你 Peek 項時,都必須使用類型斷言將其從 interface{} 轉(zhuǎn)換為你需要的類型。如果你的堆棧是 *MyObject 的堆棧,則意味著很多 s.Peek().(*MyObject)這樣的代碼。這不僅讓人眼花繚亂,而且還可能引發(fā)錯誤。比如忘記 * 怎么辦?或者如果您輸入錯誤的類型怎么辦?s.Push(MyObject{})` 可以順利編譯,而且你可能不會發(fā)現(xiàn)到自己的錯誤,直到它影響到你的整個服務(wù)為止。
通常,使用 interface{} 是相對危險的。使用更多受限制的類型總是更安全,因為可以在編譯時而不是運行時發(fā)現(xiàn)問題。
泛型通過允許類型具有類型參數(shù)來解決此問題:
type?Stack(type?T)?[]Tfunc?(s?Stack(T))?Peek()?T?{
return?s[len(s)-1]
}
func?(s?*Stack(T))?Pop()?{
*s?=?(*s)[:
len(*s)-1]
}
func?(s?*Stack(T))?Push(value?T)?{
*s?=?
append(*s,?value)
}
這會向 Stack 添加一個類型參數(shù),從而完全不需要 interface{}。現(xiàn)在,當(dāng)你使用 Peek() 時,返回的值已經(jīng)是原始類型,并且沒有機會返回錯誤的值類型。這種方式更安全,更容易使用。(譯注:就是看起來更丑陋,^-^)
此外,泛型代碼通常更易于編譯器優(yōu)化,從而獲得更好的性能(以二進制大小為代價)。如果我們對上面的非泛型代碼和泛型代碼進行基準(zhǔn)測試,我們可以看到區(qū)別:
type?MyObject?struct?{
X?
int
}
var?sink?MyObjectfunc?BenchmarkGo1(b?*testing.B)?{
for?i?:=?0;?i??b.N;?i++?{
var?s?Stack
s.Push(MyObject{})
s.Push(MyObject{})
s.Pop()
sink?=?s.Peek().(MyObject)
}
}
func?BenchmarkGo2(b?*testing.B)?{
for?i?:=?0;?i??b.N;?i++?{
var?s?Stack(MyObject)
s.Push(MyObject{})
s.Push(MyObject{})
s.Pop()
sink?=?s.Peek()
}
}
結(jié)果:
BenchmarkGo1BenchmarkGo1-16?????12837528?????????87.0?ns/op???????48?B/op????????2?allocs/opBenchmarkGo2BenchmarkGo2-16?????28406479?????????41.9?ns/op???????24?B/op????????2?allocs/op
在這種情況下,我們分配更少的內(nèi)存,同時泛型的速度是非泛型的兩倍。
合約(Contracts)
上面的堆棧示例適用于任何類型。但是,在許多情況下,你需要編寫僅適用于具有某些特征的類型的代碼。例如,你可能希望堆棧要求類型實現(xiàn) String() 函數(shù)
現(xiàn)在個人博客通常有比較多的選擇,如果不想要自己購買服務(wù)器實現(xiàn)靜態(tài)博客的發(fā)布,可以在、CSDN等平臺建立自己的賬號并發(fā)布,但是原始數(shù)據(jù)無法在本地管理;如果想要數(shù)據(jù)完全自己管理,可以使用GitHub或者Gitee Pages功能發(fā)布自己的博客,利用Hugo或Hexo等成熟的靜態(tài)博客將md文件轉(zhuǎn)換成靜態(tài)網(wǎng)站文件進行快速發(fā)布。本文就用來記錄如何快速將博客發(fā)布到、GitHub以及Gitee Pages三個平臺。
我希望的流程當(dāng)然是主要精力用在寫文章,發(fā)布的流程最好完全不需要手動處理,但實際情況下手動發(fā)布博客的流程大體是:
之前有使用過Travis CI+GitHub+Hexo自動發(fā)布到GitHub Pages,但是GitHub的訪問經(jīng)常不那么靠譜,因此想著也能同步到Gitee,并且自動構(gòu)建Hexo的速度受Nodejs環(huán)境部署影響,速度很慢,因此本次計劃采用Hugo來構(gòu)建網(wǎng)站文件,整體流程設(shè)計如下:
為了滿足博客自動發(fā)布流程,首先需要在本地準(zhǔn)備好生產(chǎn)環(huán)境,以滿足快速發(fā)布,以此的復(fù)雜是為了長期的簡單,因此在環(huán)境準(zhǔn)備階段我會把所有涉及的工具都記錄下來,以方便大家使用以及后邊自己回顧,環(huán)境準(zhǔn)備包含:
Obsidian完成知識積累后,按照ZK-Project-Archive-Blog的流程發(fā)布Blog,但是Obsidian的文件相互關(guān)聯(lián),且附件如何快速復(fù)用,需要對Typora和Obsidian都進行簡單的配置,確保后續(xù)Blog能夠快速完成并發(fā)布,并且文件仍在Obsidian工程中正常顯示;
Typora非常的簡潔,而且可以實時預(yù)覽,在寫博客的時候經(jīng)常會插入一些圖片,截圖后可以直接粘貼進去,圖片也會自動保存在本地,這里需要注意圖片的保存路徑,在偏好設(shè)置里,設(shè)置插入圖片時復(fù)制到指定路徑(./resource/),這樣復(fù)制的圖片就會自動保存在當(dāng)前文件夾下的resource文件夾里,方便后續(xù)管理與轉(zhuǎn)移。
在.ssh文件生成id_rsa和id_rsa.pub兩個文件;
Hugo 是一個基于Go語言開發(fā)的靜態(tài)博客框架,號稱世界上最快的構(gòu)建網(wǎng)站工具;
命令為: hugo new site myblog
myblog為博客的目錄名,可以修改為你自己想取的名字,生成的目錄如下:
由于默認(rèn)主題生成的文章頁面有些功能是不需要的,因此需要對themes下文件進行修改:
將config、content和themes三個目錄拷貝到新創(chuàng)建的站點目錄,將content下替換為文章文件即可。
utterances 是一款基于Github Issue的Github工具,優(yōu)點主要是無廣告、加載快、配置簡單,輕量開源。
由于 utterances 是一款Github App,因此 安裝utterances 非常簡單,只需要授權(quán)特定repo權(quán)限給 utterances 就可以了,注意一個點:授權(quán)的這個repo必須是public的,可以選擇多個repo,但是建議選擇一個就可以了,也比較安全。
這是當(dāng)前最簡單的配置方法, 也可以在 utterances官方 查看其他配置方法,以及詳細(xì)的配置參數(shù)說明。
Obsidian的安裝和使用可參考我的另一篇文章: Obsidian作為第二大腦工具的基本使用和配置
所有環(huán)境準(zhǔn)備好后,終于要開始啟動我們的自動化流程的實現(xiàn)了;
同之前步驟相同,將Gitee密碼配置到GitHub Secrets,命名為:GITEE_PASSWORD,所有配置結(jié)果如下:
synctogitee.yml
需要綁定Gitee賬號到微信公眾號,否則最后一步reload pages自動部署Gitee Pages會登錄失敗,原因是需要短信驗證;綁定公眾號后則不需要短信驗證;其他問題解決可以參考 gitee-pages-action
在Typora完成文章編寫后,一鍵上傳所有圖片到Gitee圖床,拷貝發(fā)布到,然后提交到GitHub repo master分支,即可自動部署到GitHub和Gitee Pages;
以上就是我利用GitHub-Actions將Hugo博客自動發(fā)布到GitHub和Gitee Pages,希望可以幫助大家快速構(gòu)建自己的個人網(wǎng)站;后邊我會繼續(xù)完善我的第二大腦系統(tǒng)的構(gòu)建思路和方法。