分類
讀書

《中國歷代政治得失》——漢代政府組織

中國歷代政治得失

作者:錢穆


一、漢代政府組織

甲、皇室與政府

嚴格說來,要到秦漢才是中國歷史上正式有統一政府。秦以前的中國,只可說是一種封建的統一。只要到秦漢,中央方面才有一個更像樣的統一政府,而其所轄的各地方,也已經不是封建性的諸侯列國並存,而是緊密隸屬於中央的郡縣制度的行政區分了。因此講中國傳統政治,可以逕從秦漢講起,以前暫略不論。秦代只是漢代之開始,漢代大體是秦代之延續。所以秦代暫亦不講,而只講漢代。

現在專說漢代政府究是怎樣組織的?我們要看政府的組織,最重要的是看政府的職權分配。在此方面,我亦只想提出兩點來加以申說。第一是皇室與政府之職權劃分,第二是中央與地方的職權劃分。

我們知道:秦以後,中國就開始有一個統一政府,在一個統一政府裏,便不能沒有一個領袖。中國歷史上這一個政治領袖,就是皇帝。這皇帝又是怎樣產生的呢?在中國傳統政治裏,皇位是世襲的──父親傳給兒子。若用現代政治眼光來衡量,大家會懷疑,皇帝為什麼要世襲呢?但我們要知道,中國的立國體制和西方歷史上的希臘、羅馬不同。他們國土小,人口寡。如希臘,在一個小小半島上,已包有一百幾十個國。他們所謂的國,僅是一個城市。每一個城市的人口,也不過幾萬。他們的領袖,自可由市民選舉。只要城市居民集合到一曠場上,那裏便可表現所謂人民的公意。羅馬開始,也只是一城市。後來向外征服,形成帝國。但其中央核心,還是希臘城邦型的。中國到秦、漢時代,國家疆土,早和現在差不多。戶口亦至少在幾千萬以上。而且中國的立國規模,並不是向外征服,而是向心凝結。漢代的國家體制,顯與羅馬帝國不同。何況中國又是一個農業國,幾千萬個農村,散佈全國,我們要責望當時的中國人,早就來推行近代的所謂民選制度,這是不是可能呢?我們若非專憑自己時代判斷,來吞滅歷史判斷,我們應該承認皇位世襲,是中國已往政治條件上一種不得已或說是一種自然的辦法。況且世界各國,在歷史上有皇帝的,實在也不在少數。我們不能說,中國從前不用民主選舉制,而有一個世襲的皇帝,便夠證明中國傳統政治之黑暗與無理性。在封建時代,本來有很多家庭有他們世襲的特權,這些皆所謂貴族。但從秦漢以後,封建制度早已推翻。單只皇室一家是世襲的,除卻皇帝可以把皇位傳給他兒子以外,政府裏便沒有第二個職位,第二個家庭,可以照樣承襲。郡太守不能把郡太守的職位傳給他兒子,縣令不能把縣令的職位傳給他兒子。這已是政治制度上一項絕大的進步。從前封建時代,政府和家庭,有分不開的關係,現在則不然了。組織政府的是一個一個人,不再是一個一個家。不過在那時,還留下一個很大的問題:便是皇室和政府的關係。皇室是不是即算政府?若把皇室和政府劃開,這兩邊的職權又怎樣分?這是秦漢時代首先遇到的一個大問題,也是此下中國政治史上一向要碰到的一個大問題。

拿歷史大趨勢來看,可說中國人一向意見,皇室和政府是應該分開的,而且也確實在依照此原則而演進。皇帝是國家的唯一領袖,而實際政權則不在皇室而在政府。代表政府的是宰相。皇帝是國家的元首,象徵此國家之統一;宰相是政府的領袖,負政治上一切實際的責任。皇權和相權之劃分,這常是中國政治史上的大題目。我們這幾十年來,一般人認為中國從秦漢以來,都是封建政治,或說是皇帝專制,那是和歷史事實不相符合的。

要講漢代皇權和相權之劃分,讓我先舉一實例:當時皇帝宰相,各有一個﹁秘書處﹂,而兩邊的組織,大小不同。漢代皇帝有六尚,尚是掌管意。六尚是尚衣、尚食、尚冠、尚席、尚浴與尚書。五尚都只管皇帝私人的衣服飲食起居。只有尚書是管文書的,這真是皇宮裏的﹁秘書﹂了。漢代開始的尚書,其職權地位本不高,後來才愈弄愈大。最先尚書只是六尚之一,這是皇帝的秘書處。若說到宰相的秘書處呢?共有十三個部門,即是當時所謂的十三曹,一個曹等於現在一個司。我們且列舉此十三曹的名稱,便可看出當時宰相秘書處組織之龐大,與其職權之廣泛。

一西曹,主府史署用。

二東曹,主二千石長吏遷除,並包軍吏在內。二千石是當時最大的官,以年俸有兩千石穀得名。可見朝廷一切官吏任免升降,都要經宰相的秘書處。

三戶曹,主祭祀農桑。

四奏曹,管理政府一切章奏,略如唐代的樞密院,明代的通政司。

五詞曹,主詞訟,此屬法律民事部分。

六法曹,掌郵驛科程,這像現在的交通部,科程是指一切交通方面之時限及量限等。

七尉曹,主卒曹轉運,是管運輸的,略如清代之有漕運總督。

八賊曹,管盜賊。九決曹,主罪法。此兩曹所管屬於法律之刑事方面。

十兵曹,管兵役。

十一金曹,管貨幣鹽鐵。

十二倉曹,管倉穀。

十三黃閣,主簿錄眾事,這是宰相府秘書處的總務主任。

這十三個機關,合成一個宰相直轄的辦公廳。我們只根據這十三曹名稱,便可想見當時政務都要彙集到宰相,而並不歸屬於皇帝。因為皇帝只有一個籠統的尚書處,只有一個書房。最先的尚書也僅有四人,而宰相府下就有十三個機關。這相府十三曹,此諸皇室尚書的範圍大得多,而且此十三曹的權位也很重,也竟儼如後代之專部大臣。可見漢代一切實際事權,照法理,該在相府,不在皇室,宰相才是政府的真領袖。以上單據一例來講皇室和政府的區別。從中國傳統政治的大趨勢看,一般意見一向是看重這區別的。

乙、中央政府的組織

現在說到漢代中央政府的組織。當時有所謂三公、九卿,這是政府裏的最高官。

丞相太尉御史大夫稱三公,丞相管行政,是文官首長;太尉管軍事,是武官首長;御史大夫管監察,輔助丞相來監察一切政治設施。它是副丞相。按照漢代習慣,用現代語說,這裏有一種不成文法的規定,須做了御史大夫,才得升任為丞相。太尉雖與丞相尊位相等,實際除卻軍事外,不預聞其他政事。因此當時最高行政長官實在是丞相。

依照文字學原義,丞是副貳之意。所謂相,也是副。就如現俗稱嬪相,這是新郎新娘的副,新郎新娘不能做的事,由嬪相代理來做。所以丞是副,相也是副,正名定義,丞相就是一個副官。是什麼人的副官呢?他該就是皇帝的副官。皇帝實際上不能管理一切事,所以由宰相來代理,皇帝可以不負責任。為什麼又叫宰相呢?在封建時代,貴族家庭最重要事在祭祀。祭祀是最重要事在宰殺牲牛。象徵這一意義,當時替天子諸侯乃及一切貴族公卿管家的都稱宰。到了秦、漢統一,由封建轉為郡縣,古人稱﹁化家為國﹂,一切貴族家庭都倒下了,只有一個家卻變成了國家。於是他家裏的家宰,也就變成了國家的政治領袖。

本來封建時代,在內管家稱宰,出外作副官稱相,所以照歷史傳統講,宰相本來只是封建時代貴族私官之遺蛻。但正因如此,所以秦漢時代的宰相,他不但要管國家政務,還要管及皇帝的家務。這在周官書裏的天官冢宰的職權,便是如此的。但現在的宰相,他既要掌管國家政府的一切事情,他再沒有工夫管皇帝的家事,於是在御史大夫,即副丞相之下,設有一個御史中丞,他便是御史大夫的副,這個人就住在皇宮裏。那時凡具中字的官,都是指是住在皇宮的。皇室的一切事,照例都歸御史中丞管。御史中丞屬於御史大夫,御史大夫隸屬於宰相,如實則皇室一切事仍得由宰相管。從另一方面講,宰相的來歷,本只是皇帝的私臣,是皇帝的管家,自該管皇宮裏的事。那是封建舊制遺脫未盡。但從另一方面看,只好說,皇帝也不過市政府下面的一部分。所以宮廷事,也歸宰相來統治。那時,皇帝有什麼事,交待御史中丞,御史中丞報告御史大夫,御史大夫再轉報宰相。宰相有什麼事,也照這個手續,由御史大夫轉中丞,再轉入內廷,這是當時皇帝與政府關係之大概。

再說漢代的九卿,那是:太常、光祿勳、衛尉、太僕、廷尉、大鴻臚、宗正、大司農、少府。他們的官位都是二千石,又稱中二千石。因他們都是中央政府裏的二千石,以示別於郡太守地方行政首長之亦是二千石而名。若講到這些九卿職名的來歷,卻很有趣味:

太常在秦代叫泰常,這個常字,本當作嘗。他是管祭祀祖先鬼神的。依四時奉獻時物,讓祖先鬼神時時嘗新,故稱泰嘗。在古代,宗教意味猶在政治意味之上。古代的住宅,東偏是祠堂,即廟,西偏是家屋,即寢。生宅死宅,連在一起。後代民間此制雖廢,皇宮仍沿舊軌。直到清代,太廟不是緊貼在皇宮的東邊嗎?古代的家庭,最重要的,可說不是活人而是死人,祭祖自屬大事。宰就是掌管殺牛祭祖的。所以漢廷九卿的第一卿,也是管祭祀的。這個官,正名定義,該屬於皇家,管皇家的廟,管皇家祭祖的一個家務官。不好算是朝廷公職。

其次是光祿勳。這個官名,直到清代還有,但這三字的原義,卻早就忘失了。依文義講,勳該就是閽,古音相同,這是皇家的門房。光是大義,光祿該即是大麓,祿麓音同相借。為什麼門房稱大麓呢?此因古時代的皇帝,多半靠山住家,好像宋江在梁山泊,朱貴在山腳下開設酒店,好通報消息。所以皇帝居山,房門就設在山麓。尚書上說舜管堯的大麓,那便是舜做了堯的宰相。換言之,乃是當了堯的門房。因此光祿與勳是古今語,都指門房言。

衛尉是一個武職,掌門衛屯兵,這是皇宮的衛兵司令。當時凡屬軍事方面的官都稱尉。

太僕猶之是皇帝的車夫,︽論語︾ :﹁子適衛,冉有僕﹂,僕是趕車的。皇帝出去,太僕就替他趕車。那是皇帝的汽車司機。

廷尉是掌法的,犯了皇帝的法,都歸他管。

如此看來,太常管皇家太廟,光祿衛尉,一是門房頭兒,一是衛兵頭兒。這都是在裏面的。皇帝出門,隨帶的是太僕,在外面有人犯法,就是廷尉的事。

大鴻臚,一直相沿到清代,就等於外交部。也如現在之禮賓司,是管交際的。臚是傳呼義。古禮主賓交接,由主傳到主身邊的相,再由主身邊的相傳到賓邊的相,由是而再傳達到賓之自身。鴻即大義。大臚是傳達官。

宗正是管皇帝的家族,其同姓本家及異姓親戚的。

以上七個卿,照名義,都管的皇家私事,不是政府的公務。由這七卿,我們可以看出漢代政治,還有很多是古代封建制度下遺留的陳跡,然而那時已是化家為國了,原來管皇帝家務的,現在也管到國家大事了。譬如太常就兼管教育,因為古代學術都是在宗廟的。西方也一樣,直到現在,在他們,教育和宗教還是分不開。光祿勳原是皇帝的總門房,現在皇宮裏一切侍衛都要他管。那時皇宮裏的侍從,還不完全是太監,而且太監很少,大部分還是普通人。當時一般要跑入政府做官的人,第一步就得現進入皇宮裏,充侍衛,奉侍皇帝,讓皇帝認識,然後得機會再派出去當官。這些在皇宮裏服務的,多半是年輕人,當時稱作郎官,都歸光祿勳管。孔子十二世孫孔安國,也就做過郎官。太僕呢?因管車馬,所以國家一切武裝,好像﹁坦克車、飛機﹂之類,他也連帶管了。廷尉就變成司法,大鴻臚就變成外交。這是歷史演變。我們推尋出這一演變,卻並不是說漢代的中央政府還是一個封建政府,而當時的九卿還是皇帝之私臣。因此等卿都隸屬於宰相,而所管亦全是國家公事。

此外還有兩個卿,就是大司農和少府,都是管財政經濟的。大司農管的是政府經濟,少府管的是皇室經濟。大司農的收入支銷國家公費,少府收入充當皇室私用。皇室不能用大司農的錢。所以我們說當時皇室和政府在法理上是鮮明劃分的。當時全國田賦收入是大宗,由大司農管。工商業的稅收,譬如海邊的鹽,山裏的礦,原來收入很少,由少府管。

這九卿,全都隸屬於宰相。

我們上面講九卿,照名義來歷,都是皇帝的家務官,是宮職,而系統屬於宰相,豈不是宰相本是皇帝的總管家嗎?但換句話說,便是當時政府的首長,宰相,可以管到皇宮裏的一切。舉例來說,少府掌管皇室經費,而少府屬於宰相,宰相可以支配少府,即是皇室經濟也由宰相支配。這樣一講,豈不是皇室反而在政府之下了嗎?本來封建時代的宰相,就是皇帝的管家,但到了郡縣時代,化家為國,宰相管的,已經是國家了,不是私家了,所以他成了政府正式的首長。從前私家家庭中的各部門,也就變成公家政府的各部門。封建時代,以家為國,周天子是一個家,齊國也是一個家,魯國又是一個家,這樣的貴族家庭很多,天下為此許多家庭所分割。那時在大體上說,則只有家務,沒有政務。現在中國已經只剩了一家,就是當時的皇室。這一家為天下共同所戴,於是家務轉變成政務了。這個大家庭也轉變成了政府。原先宰相是這個家庭的管家,現在則是這個政府的領袖。

以上對漢代的三公九卿,已經講了一個大概。這是當時中央政府的組織情形。

丙、漢代地方政府

漢代的地方政府,共分兩級:即郡與縣。中國歷史上的地方政府以縣為單位,直到現在還沒有變。漢時縣的上面是郡,郡縣數當然也隨時有變動。大體說,漢代有一百多個郡,一個郡管轄十個到二十個縣。大概漢代縣數,總在一千一百到一千四百之間。中國歷史上講到地方行政,一向推崇漢朝,所謂兩漢吏治,永為後世稱美,這一點值得我們的注意。若以近代相比,今天的地方行政區域,最高為省。一省之大,等於一國,或者還大過一國。一省所轄縣,有六七十個以至一二百個,實在太多了。但就行政區域之劃分而論,漢制是值得稱道的。

漢代郡長官叫太守,地位和九卿平等,也是二千石。不過九卿稱為中二千石,郡太守是地方上的二千石。郡太守調到中央可以做九卿,再進一級就可當三公,九卿放出來也做郡太守。漢代官級分得少,升轉極靈活,這又是漢制和後來極大的不同。九卿放出來當太守,並不是降級。地方二千石來做中二千石,也不是升級,名義上還是差不多。當時全國一百多個郡,太守的名位,都和九卿差不多,因此雖是中央政府大一統的局面,雖是地方行政區域劃分得比較小,卻不感覺得這個中央政府高高在上。

丁、中央與地方之關係

說到中央與地方的關係。每郡每年要向中央上計簿,計簿就是各項統計表冊,也就是地方的行政成績。一切財政、經濟、教育、刑事、民事、盜賊、災荒,每年有一個簿子,分項分類,在九十月間呈報到中央,這叫做上計。

中央特派專員到地方來調查的叫刺史。全國分為十三個調查區,每一區派一個刺史,平均每一刺史的調查區域,不會超過九個郡。他的調查項目也有限制,政府規定根據六條考察,六條以外,也就不多管。地方實際行政責任,是由太守負責的。政府派刺史來調查,不過當一個耳目。所以太守官俸二千石,而刺史原始只是俸給六百石的小官。根據政府規定項目調查,縱是小官也能稱任。而且惟其官小,所以敢說敢講,無所避忌。

這些刺史,上屬於御史丞。皇宮裏還有十五個侍御史,專事劾奏中央乃及皇宮裏的一切事情的。部刺史和侍御史的意見,都報告到副宰相御史大夫,副宰相再報告到宰相。副宰相所輔助宰相的,便是這一個監察的責任。


下一篇:︽中國歷代政治得失︾-漢代選舉制度與經濟制

分類
软件

使用 Screen Stream 來分享安卓屏幕

Screen Stream 是一款由 Dmitriy Krivoruchko 開發的老牌(始於 2016 年)開源安卓屏幕共享軟件。使用方便,還支持中文,推薦有需要的朋友使用。

它主要是局域網共享屏幕,甲手機打開軟件,點擊開始即可。然後乙手機,在瀏覽器裏輸入甲手機的網址(或掃碼)就可以觀看了。就是這麼簡單!如果想要通過因特網分享屏幕,那麼你得確保你有公網 IP,使用方法是一樣的。

通過調教幀率和畫質,可以減輕手機網絡和性能消耗(少發一點熱)。通過設置安全選項,可以控制只通過 WiFi 網絡分享(即不通過手機網絡分享)或者只在本機分享(相當於是程序接口)。

通過服務器實現屏幕共享

由於沒有公網 IP,又想要分享屏幕給遠方親友,則可以通過服務器來實現。思路有很多,我有實現一個非常簡單辦法。對分享一方來說,可以通過 Termux 來把圖片 Post 到服務器,服務器收到圖片後展示出來即可。所用的 Termux 命令爲:

watch -n 3 "curl http://127.0.0.0.1:8080/stream.jpeg | curl -k -s -X POST --data-binary @- https://my.image.server/image_in"
#即每隔 3 秒,把圖片傳送到服務器一次

我的圖片服務是一個簡單的 Django 網站,免費部署在 pythonanywhere,等我有空了可以把代碼整理下發出來。我也測試過讓甲通過瀏覽器,用 Javascript 來把圖片轉發到服務器,Chrome 下是可以的,但是火狐裏網頁一到後臺,JS 就停止工作,搜了一下也沒找到火狐網頁保活的辦法。

理論上,把視頻流直接轉發到 Nginx,應該更加高效流暢,但是我沒有測試過。

分類
网站

Ten plugins and ten themes for WordPress

Here is a collection of plugins and themes from Chapter 16: The Part of Tens of the book WordPress for dummies by Lisa Sabin-Wilson.

Plugins

Custom Post Type UI

For custom post types and taxonomy.

Jetpack

A suit of plugins provided by wordpress.com.

Limit Login Attempts Reloaded

Limit Login Attempts.

Cookie Notice for GDPR & CCPA

Cookie Notice for GDPR & CCPA

Yoast SEO

Search engine optimization

BackupBuddy

For backing up and transfering website. Price strats from $80.

WP Super Cache

Create static HTML files from your dynamic WordPress content.

WooCommerce

Selling product or service on your website.

Google XML Sitemap

Create a Google-compliant XML site map of your entire site and submit it to major search engines.

Sucuri Security

Scan for malware, spam, blacklisting and other security issues hidden inside your code files.

Themes

Hybrid Core

Highly customizable parent theme. It's a WordPress Framework now.

Hestia

One-page theme built for use on a small-business website.

Responsive

Nine templates built on a fluid grid system as well as webmaster toos, logo management and multilingual support.

Ashe

Suit for personal website, lifestyle blog, bakery, travel agency.Support WooCommerce.

Prefer Blog

Simple blog with built-in Auther and Contact Us block.

BlackBird

Use your own logo, analytics code, customize featured text with an easy-to-use widget, post thumbnails, header image.

Storefront

For store with WooCommerce support, custom widgets and sidebars.

Sinatra

Good for general websites like restaurants, bakeries tech startups and blog.

Nisarg

A nice clean blog theme.

Optics

A minimalist theme featuring a grid layout. Clean and Simple.

分類
网站

在線 cron 定時請求

有時我們需要定時執行一些網絡任務,但是所使用的服務又不支持 crontab 定時任務,這時可以考慮使用在線的 cron-job.org 來觸發,它可以根據你的需要在在指定的時間或按照特定頻率執行網絡請求。是一個免費又開源的服務。

如果你的任務對於執行時間沒有那麼精確,也可以使用之前推薦過的 StatusCake ,它的 Push Test 也是非常好用的。如果是要監測網站或服務器的在線情況,則使用它的 Uptime test。

這兩個服務的免費版本個人使用應該都夠用,如果它們有幫到你,請量力考慮贊助它們。

分類
网站

使用 Django Q 方便地執行耗時任務

Django Q 是一個使用 Python 多進程製作的原生 Django 任务队列、调度器和 worker 应用。它具有很多優異特性但我只是粗淺使用了如下幾點:

  • 多進程 worker 池
  • 異步任務
  • 定時任務、cron 和重複的任務
  • 把失敗和成功結果保存到數據庫或緩存
  • 自動集成到 Django Admin,就可以在後臺添加和管理任務
  • 支持 Redis, Disque, IronMQ, SQS, MongoDB 或 ORM 這麼多種隊列代理方式,最方便的當然是 ORM
  • 注意:Django Q 的任務間隔粒度是 30 秒,如果你的任務頻率或精準度要求高於 30 秒,你需要嘗試修改源碼或使用其他任務隊列

安裝 Django Q

pip install django-q
#如果要使用 cron 規則,則也要安裝
pip install croniter
#在項目的 settings.py 文件 INSTALLED_APPS 裏加入 django_q
INSTALLED_APPS = (
    # other apps
    'django_q',
)
#設置代理方式,我選擇 ORM,
#只需把下面字段也加入 settings.py

#更多設置請參見 https://django-q.readthedocs.io/en/latest/configure.html
Q_CLUSTER = {
    'name': 'djangtasks',
    'workers': 2,
    'timeout': 180,
    'retry': 200,
    'queue_limit': 50,
    'bulk': 10,
    'orm': 'default'
}

#執行數據庫遷移來創建數據庫表
python manage.py migrate
#運行 Django Q 來處理任務隊列
python manage.py qcluster

我是使用 screen 來在後臺運行 qcluster,很方便的。

使用 Django Q 在 Django 後臺執行耗時任務

# file: views.py
import datetime
from django.http import HttpResponse
from django.utils import timezone
from django_q.tasks import async_task, schedule
from django_q.models import Schedule

def a_longtime_task(arg):
    time.sleep(30)
    return arg

def scheduled_task(arg):
    time.sleep(30)
    return arg

def a_longtime_task_request(request):
    #立即在後臺執行
    async_task(a_longtime_task,'args for the function')
    return HttpResponse('The longtime task has been started.')

def another_longtime_task_request(request):
    #三分鐘後執行
    schedule('YOURAPP.views.scheduled_task',
            'args for the function',
            schedule_type=Schedule.ONCE,
            next_run=timezone.now() + datetime.timedelta(minutes=3))
    return HttpResponse('The task has been scheduled.')

在 Django Admin 佈置定時任務

這個就比較直接,比如要每天 10 點都執行上面例子中的 scheduled_task,就點擊 Admin 頁面 Scheduled tasks 旁邊的「新增」。

Func(填入完整的函數路徑):YOURAPP.views.scheduled_task
Args:'args for the function'
Schedule Type:Daily
Next Run(設置要運行的時間如):2022-08-27 10:00

最後點擊「儲存」就可以了。

同樣的,如果選擇 Cron 類型,就需要在 Cron 輸入框填入 Cron 計劃。比如在 9 點到 23 點期間,每 5,15,25,35,45,55 各執行一次:
5,15,25,35,45,55 9-23 * * *
更多 Cron 用法和組合可以參考 crontab.guru 這個網站。

等待執行的任務、失敗的任務和成功的任務都可以方便的在Admin頁面查看和操作,非常方便。

管理隊列任務與已完成任務 Schedule Task

# file: tasks.py
from django_q.models import Schedule, Task
from django.db.models import Q
#your model to be checked
from app1.models import Race
from django.utils import timezone

import datetime
import operator
from functools import reduce

# Task to delete successful old tasks
def delete_old_tasks():
    len_task_20 = 0
    len_task_gen = 0
    now = datetime.datetime.now()
    days_passed_2 = timezone.utc.localize(now - datetime.timedelta(days=2))
    days_passed_7 = timezone.utc.localize(now - datetime.timedelta(days=7))
    task_q_list = []
    task_q_list.append(Q(group__startswith='20'))
    task_q_list.append(Q(started__lt=days_passed_7))
    task_q_list.append(Q(success__exact=True))
    task_20_queryset = Task.objects.filter(reduce(operator.and_, task_q_list))
    len_task_20 = len(task_20_queryset)
    for task in task_20_queryset:
        task.delete()

    task_q_list = []
    task_q_list.append(Q(group__exact='generate_0_task'))
    task_q_list.append(Q(started__lt=days_passed_2))
    task_q_list.append(Q(success__exact=True))
    task_gen_queryset = Task.objects.filter(reduce(operator.and_, task_q_list))
    len_task_gen = len(task_gen_queryset)
    for task in task_gen_queryset:
        task.delete()

    return f'{len_task_20} checked tasks and {len_task_gen} checking tasks have been removed.'

#generate 0 task every 5 minuts
def generate_0_task():
    res=[]
    now = datetime.datetime.now()
    dto_now = timezone.utc.localize(now)
    start_datetime_6 = now + datetime.timedelta(minutes=6)
    dto_plus6 = timezone.utc.localize(start_datetime_6)
    current_races = Race.objects.filter(post_time_live__lte=dto_plus6,
                                          post_time_live__gte=dto_now)
    if len(current_races) == 0:
        res.append('no current races')
        return res
    for race in current_races:
        if race.race_conditions.find('SIMULCAST')>-1:
            res.append(str(race)+': task passed SIMULCAST')
            continue
        tasks = Schedule.objects.filter(name=str(race))
        if len(tasks)==0:
            schedule('app1.views.zero_mtp_task',
                    race.id, race.track_id, race.race_number, race.race_date, race.post_time_live.isoformat(),
                    schedule_type=Schedule.ONCE,
                    next_run=race.post_time_live,
                    name=str(race))
            res.append(str(race)+': task added'+' post time:'+str(race.post_time_live))
        else:
            res.append(str(race)+': task already added'+' post time:'+str(race.post_time_live))
    return res

本文更新於 2023/01/27。

分類
网站

Django with PostgreSQL

參考 PostgreSQL:Linux downloads (Red Hat family) 來安裝PostgreSQL,比如 Fedora 35 可以這樣:

sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/F-35-x86_64/pgdg-fedora-repo-latest.noarch.rpm
sudo dnf install -y postgresql13-server libpq-devel
sudo /usr/pgsql-13/bin/postgresql-13-setup initdb
sudo systemctl enable postgresql-13
sudo systemctl start postgresql-13

安裝完成後來初始化一個數據庫和用戶。

#使用 root 登錄 PostgreSQL
sudo -u postgres psql
#創建數據庫
CREATE DATABASE project;
#創建新用戶
CREATE USER user42 WITH PASSWORD 'password42';
#下面這三行優化是 Django 推薦的
ALTER ROLE user42 SET client_encoding TO 'utf8';
ALTER ROLE user42 SET default_transaction_isolation TO 'read committed';
ALTER ROLE user42 SET timezone TO 'Asia/Taipei';
#把數據庫授權給新用戶
GRANT ALL PRIVILEGES ON DATABASE project TO user42;
#退出數據庫
\q

要在 Django 中使用 PostgreSQL 數據庫,需要還安裝 psycopg2:

pip install Django psycopg2
#如果像我一樣在 Fedora 安裝失敗了
#可以嘗試安裝編譯好的版本
pip install Django psycopg2-binary

之後在項目的設置中把默認的 SQLite 數據庫資料改成 PostgreSQL 就可以了。更像詳細的步驟與解釋,可以參考:How To Use PostgreSQL with your Django Application on Ubuntu 20.04

刪除 Django 數據庫中的表格並重建

這似乎不是正確的回滾數據庫的操作辦法,但是也可以一試。

#從 migrations 目錄找到要刪除的數據庫變更文件,刪除掉
#進入數據庫操作程序
python manage.py dbshell
#查看並找到要刪除的表名
SELECT * FROM pg_catalog.pg_tables;
#如果是MariaDB,這樣查看表名
show tables;
#比如表名爲 task_day,則這樣刪除
DROP TABLE task_day;
#退出數據庫操作程序
exit;
#刪掉數據庫裏的 migrations
python manage.py migrate --prune task

#現在可以重新建立表格了
python manage.py makemigrations
python manage.py migrate

本文更新於 2022/10/24。

分類
Linux 软件

Fedora 35 與 Nvidia GPU 驅動

TL;NR

如果電腦開啓了 Secure Boot, 又不想頭痛地處理簽名,可以關掉。然後跟隨這個網頁的方法安裝開源的 Nvidia 驅動: Howto/NVIDIA。或者跟隨這個網頁安裝 Nvidia 官方的驅動:Fedora 36/35/34 NVIDIA [515.57 / 510.73.05 / 470.129.06 / 390.151 / 340.108] Drivers Install Guide。這個網頁裏也有介紹如果禁用 Fedora 自帶的 Nouveau 驅動的方法。

The Story

打算嘗試在 Fedora 上編輯視頻,一番搜索後發現 DaVinci Resolve 好像很強大,而且還有 Linux 的免費版本。下載安裝很順利,但是打開後歡迎頁面是黑屏。禁用 Secure Boot 裝了 rpmfusion 推薦的驅動後可以打開了,但是 GPU 設置成 CUDA 模式提示無法渲染圖像,錯誤編碼 999,改成 OpenGL 模式不報錯,但是連 JPG 圖像的預覽都是花的,我以爲是 rpmfusion 的驅動不行(實際不是)。於是去裝官網驅動,禁用了 Nouveau 驅動後安裝成功,但是 DaVinci 還是無法使用,後來發現可能是筆記本自動選擇顯卡 Optimus 有關,可以參考 OptimusHow to Set Nvidia as Primary GPU on Optimus-based Laptops。我並沒有把 Nvidia 設置爲默認,因爲覺得平常板載就夠了。所以後來我使用環境變量的方法成功運行了 DaVinci Resolve

__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia /opt/resolve/bin/resolve

最後我發現相機拍攝的 mov 視頻文件導入後還是只有音頻,想要編輯的話要先對視頻進行轉碼。而且導出格式也有蠻多限制,所以就放棄了 DaVinci Resolve。

然後我搜索到 Linux 平臺另一款「強大」的視頻編輯器 Lightworks,到官網下載免費版體驗,發現需要註冊,註冊時發現有 recaptcha 人機驗證,我換了好幾個網絡居然都無法通過。無奈從網上找了個安裝包,安裝後打開軟件發現需要登錄才能使用所以還是要註冊。最後是第二天在手機瀏覽器裏註冊成功了。然後發現導出 1080p 的視頻居然是付費版本才有的功能,2022年了喂~

最後我去看 Fedora 的手冊,上面推薦 Kdenlive,從官網直接下載 AppImage 檔直接運行,視頻和圖片都順利導入,導出也都沒有什麼限制,h264、h265、ProRes 全都 OK!而且也支持視頻穩定和關鍵幀調整。雖然兩個視頻漸變過度的 Mixes 操作很怪異,但是至少能達到想要的效果。時間軸的操作可能由於還不會用,所有也感覺不太順手,但是至少可以正常導入、剪輯、調整顏色、加字幕和出片了。