Ubuntu 美化 – 安裝主題與插件

在執行以下步驟之前,請確認你可以訪問以下這兩個網站:

  • https://extensions.gnome.org/
  • https://www.gnome-look.org/

安裝依賴

在命令行執行以下命令。

sudo apt install gnome-shell-extensions # 安裝插件管理器
sudo apt install gnome-tweak-tool # 安裝主題管理器

訪問 Chrome 在線商店下載 瀏覽器配套插件。(使用其他瀏覽器就去網上搜插件)

點擊前往Chrome在線商店

然後訪問 extensions.gnome.org, 安裝 User Themes 和 Extensions。

配置完成之後訪問 Installed Extensions 應該看到如下畫面。

然後點進以下網址安裝 ocs-url 。這個軟件使你無需手動下載安裝主題,可以一鍵安裝。

OCS-URL: https://www.opendesktop.org/p/1136805/

定製外觀

安裝鼠標指針

我中意的鼠標指針是 Oreo Cursors,鏈接在下方

Oreo Cursors: https://www.gnome-look.org/p/1360254/

安裝完後請到 優化(Tweaks) 中設置。

安裝圖標包

我中意的圖標包是 這款 8.9 分高分的 Material 風格圖標包。

Tela Circle icons: https://www.gnome-look.org/s/Gnome/p/1359276/

這個還有一個姊妹包 叫 Tela icons, 辨識度比這個略高。不過我嫌那個風格不如這個統一,就選擇略這個。

安裝主題

請自行點擊下列鏈接安裝 Materia.

Materia: https://github.com/nana-4/materia-theme

注意! 你在裝完主題之後還可以進行一些配套設置!

Materia配套設置: https://github.com/nana-4/materia-theme#recommendations

安裝 額外的Shell

如果你喜歡一個看起來更加緊湊,更加 responsible 的工作環境,你可以選擇下面一款插件。

Material Shell: https://github.com/material-shell/material-shell

這一款插件算是 Material 在 Linux 上的集大成之作,將 你的 Linux 直接改造成一個類似安卓的界面。充分利用的屏幕空間使得工作區最大化,直接將工作區選項擺在屏幕左邊,而且如果你擁有一個類似 surface 的支持觸屏的設備,這個插件就是你的最佳選擇。
這個插件推薦的主題是 Plata, 但是也和 Materia 主題無縫結合。

定製 Grub

推薦下載這個主題,

Tela Grub theme: https://www.gnome-look.org/p/1307852/

然後解壓後直接

sudo bash ./install.sh

配置完成!

至此所有的配置都已經完成了!

安裝並配置 Fcitx 輸入法

OS: Ubuntu20.04 LTS

剛剛手賤重裝了我的 Ubuntu 系統,发現自帶的輸入法 ibus 中文體驗極差,故更新一篇安裝 fcitx 加配置主題的教程。

iBus 重新定義了 “垃圾”

下載安裝 fcitx

# fcitx-rime 屬於繁體輸入法,可選安裝
sudo apt install fcitx fcitx-googlepinyin fcitx-rime fcitx-module-cloudpinyin

apt 會自動把 fcitx 以及其依賴裝上。

注意! 某些直接安裝 fcitx-googlepinyin 其實是將 fcitx 作為依賴裝上了,這樣會導致依賴樹的關系雜亂,可能在未來 (你想刪除谷歌拼音的時候造成不可預料的事故)

接著輸入以下命令並按照提示配置輸入法為 fcitx.

im-config

現在重啟系統, 重啟完成之後應該可以看到 fcitx 將 ibus 取而代之了。
現在可以卸載 ibus.

sudo apt purge ibus

配置 中州韻

中州韻 不是默認在輸入法列表里,你需要點擊左下角的加號添加。(之後按 Ctrl + Shift 添加。)
而且我發現中州韻比簡體的谷歌拼音真的要好用太多,強烈推薦。

請在這裏下載輸入法的附加詞庫。

請看這裏配置模糊音方案:

如果你想要針對中州韻輸入法的某一個輸入方案(比如明月拼音),你需要在 ~/.config/fcitx/rime/ 目錄下新建一個專門的 yaml 來配置。比如說 朙月拼音的yaml 可以是 luna_pinyin.custom.yaml , 格式請見Github.

以下配置我希望全局生效,所以在 default.custom.yaml 中配置如下幾行:

# default.custom.yaml
patch:
  # 候選詞個數
  "menu/page_size": 9 

(模糊音請參照正則的語法進行查找替換,我是南方人分不清前鼻音後鼻音,所以配置這兩行。如果你不明白正則的語法請點擊 模糊音 參考大神配置。)

# luna_pinyin.custom.yaml
patch:
  # 模糊音
  'speller/algebra':
    - erase/^xx$/  

    # 模糊音定義
    - derive/([ei])n$/$1ng/            # en => eng, in => ing
    - derive/([ei])ng$/$1n/            # eng => en, ing => in

配置主題

主題配置的話我推薦以下這個主題 (個人感覺比較清爽,你也可以自己選擇。)

目前deepin論壇抽風訪問不了,等恢復訪問後我會繼續把步驟補上。
deepin論壇已經恢復訪問,我將兩款主題的壓縮包連同網頁archive放在我的網盤裏了,鏈接就在下方,請自取~

原帖地址: 點擊前往深度BBS論壇
原帖備份: 點擊前往web.archive.org
附件下載: 點擊從博客網盤下載 alaph 亮色主題
附件下載: 點擊從博客網盤下載 darkK 暗色主題

deepin論壇已經翻修完畢,恢復訪問了。這裏是我找到的使用體驗最好的兩款主題,由同一個大神製作,主題取自搜狗。
是的fcitx 是可以裝 搜狗輸入法的,但是出於一種奇怪的心理,我不想讓國產軟件姦污我這一台乾淨的linux機,所以沒有選擇裝 搜狗輸入法。

兩款可愛的主題截圖

請將兩款主題解壓後分別拷貝到 /usr/share/fcitx/skin/ 目錄下。

安裝 Tor 瀏覽器

OS: Ubuntu20.04 LTS

我主要用 tor 來測試我的網站的部署情況和打開一些不太好打開的網站。(很奇怪,像膜乎之類的網站即使在牆外也打開很慢,但是一掛上 Tor 速度就立馬飛起來。)

網上有相當一部分教程建議從軟件源安裝 tor 瀏覽器, 然而我記得在 Tor 官網上聲稱從軟件源獲取的 Tor-Brower 使用了 Tor 軟件包作為依賴, 但是 Tor 已經很長時間沒有更新, 存在安全隱患, 因此強烈不推薦, 所以我直接從官網下載安裝. 理論上之後 Tor-Browser 都能自動更新, 無需這樣手動安裝.

下載安裝 Tor

請猛擊 Tor 官網鏈接點擊 Linux 按鈕自行下載。

下載完畢後,在檔案所在目錄執行以下操作。

tar -xvJf tor-browser-linux64-10.0.2_en-US.tar.xz
sudo mv tor-browser_en-US/ /opt
sudo chown -R $USER:$USER /opt/tor-browser_en-US/
./start-tor-browser.desktop --register-app

配置完畢之後你可能需要重啓設備。

Tor-Browser 已經能夠啓動了

如果你的代理在歐美,建議直接鏈接到 tor 網路。如果你的代理在日韓, 你可能需要使用網橋。不建議在大陸直接使用tor ( 又被重點關注的風險 ) , 而網橋在大陸也被 Ban 的差不多, 請搭配雙重代理獲得最佳手感.

戰狼政策

《 戰狼 2》 是前幾年,比較火的一部電影; 上映的時候家家電影院基本是一票難求。
盡管我一向對國產電影沒什麽好感,我還是經不住朋友圈中的大吹大擂,下了槍版的電影 ( 我的確不該下載槍版電影, 我應當根本不看, 這不, 被噁心到了 )。


看完之後, 我的第一印象是《 戰狼 2》 是一部非常煽動民族情感的影片,某些橋段里面有非常明顯的斧鑿痕跡,比如豆瓣上網友扒出來的這一段:

(反派說英文,和吳京邊打邊懟)
 反派:Look at them. You're gonna die for these people.(你看她們。沒錯,你將會為這些人而死。)
 吳京:我就是為他們而生的。(I was born for them.)
 反派:People like you will always be inferior to people like me. Get used to it. Get fucking used to it.(這個世界只有強者和弱者,你們這種劣等民族永遠屬於弱者。你要習慣,你必須習慣。)
 吳京:那他媽是以前。(That's fucking history.)

信達雅連“信”都沒有做到,赤裸裸的煽動。國情之下,票房有十個億並不讓人驚訝, 也許經歷了近代的這麽多磨難,中華民族缺乏的自信需要通過一些宣傳來彌補; 況且戰狼是確有其事,我看完電影並沒有什麽特殊的感覺,就扔在硬盤的旮旯里了。

今天找課件的時候突然翻到這部影片,我意識到,《 戰狼 》真是講了一個讓人熱淚盈眶的笑話。

雙陰性政策

就在最近,十一月六號,中國突然出台了“雙陰性”政策,限制以留學生為主的華人回國。

人在家中坐, 禍從天上來?

“雙陰性” 就是 核酸檢測和igM(肺炎抗體)檢測 都為陰性。igM 測試是為了彌補核酸不能測試剛剛感染還沒有癥狀的病毒攜帶者的缺陷。聽著很正常? 政策遇到抵制又是帝國主義反動勢力從中作梗? 那麼請看這段分析:

這個要求一出,便宜的中轉機票基本是沒戲了——中轉地也是需要48小時的檢測的,根本弄不到。那只有選擇高價的直飛票了吧?還是不行,48小時內根本出不了結果。以美國為例:在這個政策之前,絕大多數的檢測機構都在 72小時之後 甚至一個星期內 出檢測結果,如果你選擇開車前往少數幾家可以快速出結果的醫院,趕路的時間也足夠你崩潰。目前也沒有機場提供現場檢測的服務。

所以說,這個政策一出,基本是斷了留學生回國的路。

熱搜話題

# 韭菜收割機

逼站

留學生的反映是可以理解的。想像一下一場大災難爆發,你正好在異國他鄉。
你手頭錢根本不多,在很多大學紛紛關閉的情況下,你必須要自己找到住宿的地方,但是沒有一份穩定的工作,你根本負擔不起房子的租金。
那你怎麼辦?這個政策一下來,還沒來得及回去的同學是不是要露宿街頭?

螻蟻尚且偷生,他們在疫情期間更加渴望回到安全溫暖的家。這些喪性病狂的五毛們根本就舍棄了基本的人道主義,為了虛無飄渺的愛國,他們對自己處境窘迫的同胞施加了滿滿的惡意。
且不說 “萬里投毒” 根本就是刻薄惡毒的攻擊,我在這里就像質問一句,到底誰更象是巨嬰?

是誰足不出戶而侃侃談天下大事 抓住媒體生造出來的要害惡意攻擊?
是誰喊著 你的國家你的黨,打著 自由平等文明和諧, 現在在網路上宣泄暴力的?
是誰整天刷著今日頭條看著抖音,腦子裏全是八卦新聞 現在還將川普叫做“川建國”的?
是誰在四月份的原油期貨圈套瘋狂買入,然後被資本主義鐵拳狠狠教訓的?
是誰到現在叫囂著拳打美利堅 腳踢小日本 打出 “疫帆風順” 的旗號的?

比起在外苦讀,回國創業的實業家,這些打著農藥刷著抖音心甘情願慢性自殺的人彘、整天被牽著狗繩騮的團團轉的自幹五、腦袋中充斥著仇恨教育的小學生、用監獄公共電腦訪問互聯網希望自己被摘腎時麻藥打足的社會渣滓們,有 什麽資本 來嘲諷留學生是巨嬰?

反觀吳京的台詞,

“現在的中國護照還不能帶你去世界任何一個地方,
但是,不管你身在何方,只要帶著那一本中國護照,
當有災難或戰亂发生時,祖國總能第一時間來到你身旁,
然後把你安全接回家。 ”

 “中華人民共和國公民:
當你在海外遭遇危險,不要放棄!
請記住,在你身後,有一個強大的祖國!”

還有哪一個國家,在疫情期間如此堅定、迅速的拒絕了自己的國民入境呢?

這次 “中國制造” 的疫情,又刷新我們對 “中國速度” 的認識。

總結 & 後記

你不去關心國家政策,國家政策來在乎你。我作為準留學生群體的一部分不得不去關心這一方面的局勢。希望學長學姐們在疫情期間安好,用功學習,早日拿到 Green card, 對你國的戰狼政策 Say goodbye.

5月 18日 附: 去海外考雅思的基本沒有了, 不算上回國機票問題, 就算沒感染肺炎, 回家來也 28 天隔離. ( 如果不注意感染病毒更加夠嗆, 就甭想被當人看啦 )

因為這句夾帶私貨的台詞翻譯,《戰狼2》至少多賣10個億 –豆瓣
留學圈炸了!回國要“雙陰性”檢測急壞無數人!附美國核酸檢測機構匯總 –網易號
關於搭乘航班赴華人員須憑新冠病毒核酸檢測及血清抗體檢測雙陰性證明乘機的通知 –中國大使館

偶然發現學長的機場

今天剛剛基友告訴我說,他发現了一個 “疑似是我校大神” 搭建的機場。 我正好無聊,就去瞄了幾眼。。。將結果記錄在這里,覺得還蠻有意思的。

首先把我 無聊隨便 幹出來的結果放在這里,聊勝與無嘛…


  • 機場名稱: 2MB Cloud
  • 機場地址: 2mb.network
  • 真实IP: 47.57.13.58(阿里云)
  • 注冊時間: 2020年三月29號
  • 注冊站點: namecheap
  • 托管服務: cloudflare
  • 機場框架: sspanel + malio 主題
  • 建站框架: 寶塔 (8767 端口)

機場框架是從 /staff頁面看出來的。。現在的機場基本都是用sspanel做的,主題是malio 的都會有這個staff頁面,還不給刪,煩的一忒。

網站截圖:

可以看出來,首頁斌沒有太大的變化。上面那個tofel和頁腳的幾個友連都直接指向自己,沒有什麽好玩的。網站並沒有綁定TG.

Whois截圖

基本沒什麽有用的信息。(別去定這個玩意的包年套餐,說不定域名一到期就跑路,just kidding…)

然后通过对这个网站443端口的证书进行全网搜索,可以搜出来这个服务器的真实地址是 47.57.13.58

所以说这个看到的机场是用阿里云搭建的吗…真的不怕被喝茶吗?
然后就没有意思了。我和他无怨无仇,也不打算进行下一步,大概率也不可能成功(以我的半吊子水平)。那就先点到为之吧,希望这位老兄耗子尾汁,别用lets encrypt的证书了–用cloudflare的服务器证书+clouflare的代理服务难道他不香吗?(你的阿里云服务器地址都给人扒出来了,怕不是别想混了哦)

PS: 我還沒有這個網站的邀請碼,回頭問朋友要一下。下面是基友的截圖。

我不知道這是什麽鬼,不過服務名稱好像就是在瞎填。。。

郭沫若下飯詩歌合集

前言

郭沫若 是我國現代著名作家、文學家、詩人、劇作家、考古學家、思想家、古文字學家和著名的革命活動家。他才華橫溢,學貫中西,早期詩歌作品正氣凜然,警世勵人,是值得人們景仰的文化巨匠,在“魯郭茅巴老曹”中名列第二, 還獲得過蘇聯列寧和平獎.

我恰巧讀到郭老的幾篇 構思精巧 文筆優美 的大作, 感極而泣, 故把他們紀錄在這篇博文中.

大腦升級

毛主席賽過我親爺爺
天安門上紅旗揚,毛主席畫像掛墻上,    
億萬人民齊聲唱毛主席萬歲萬萬歲!     
萬歲萬歲壽無疆!     
毛主席呀毛主席,你真賽過我親爺爺!
題毛主席在飛機中工作的攝影
在一萬公尺的高空,在圖104的飛機之上,
難怪陽光是加倍地明亮,機內和機外有著兩個太陽!不倦的精神啊,崇高的思想,凝成了交響曲的樂章,
象靜穆的叢山峻嶺,也象浩渺無際的重洋!
獻給在座的江青同志
親愛的江青同志,你是我們學習的好榜樣   
你善於活學活用戰無不勝的毛澤東思想   
你奮不顧身地在文化戰線上陷陣沖鋒   
使中國舞台充滿了工農兵的英雄形象
水調歌頭——粉碎四人幫
本詩寫於1976年10月21日,打倒四人幫之後

大快人心事 揪出四人幫
政治流氓文痞 狗頭軍師張

還有精生白骨 自比則天武後
鐵帚掃而光 篡黨奪權者 一枕夢黃梁 

野心大 陰謀毒 詭計狂
真是罪該萬死 迫害紅太陽

接班人是俊傑 遺志繼承果斷
功績何輝煌 擁護黨中央
聲聲快
為使 "形式服從內容" ,郭沫若把詞牌“聲聲慢”改為“聲聲快”,在詞前序語中說:“我如今和她(李清照)一首,但一反其意,以反映當前‘一天等於二十年’的大躍進高潮,因而把詞牌名改為‘聲聲快’。

轟轟烈烈,喜喜歡歡,親親熱熱密密,
六億人民躍進,天崩地裂。   
一窮二白面貌,要使它幾年消失!  
多益善,看今朝,遍地英雄豪傑。   
八大煌煌決議,十九字,已將路線總結。   
鼓足幹勁,爭赴上遊須力!   
多快更兼好省,更增添,億噸鋼鐵。   
加緊地將社會主義建設。
百花齊放 節選
1958年4月郭沫若出版了一本詩集《百花齊放》,載有101首寫花的詩,每種花都有一副木刻,十分精美。但是這些詠花詩,很多都負載著沈重的政治使命。

向日葵
我們的植物油,你可不要藐視,
促進工業化,才好趕上約翰牛。
美人蕉
我們總是嘔心喋血地從事生產,
誰學得這種精神,就能又紅又專。
雞冠花
'鼓足幹勁,力爭上遊,乘風破浪!'
誰還沒聽見嗎?聾得太不像樣!
水仙花
碧玉琢成的葉子,銀白色的花,
簡簡單單,清清楚楚,到處為家。   
我們倒是反保守、反浪費的先河,
活得省、活得快、活得好、活得多。   
人們叫我們是水仙,倒也不錯,
只憑一勺水、幾粒石子過活。   
我們是促進派,而不是促退派,
年年春節,為大家合唱迎春歌。
臘梅花
在冬天開花已經不算希奇,   
掌握了自然規律可以改變花期。  
不是已經有短日照菊開在春天?   
我們相信臘梅也可以開在夏。
我向你高呼萬歲
我向你高呼萬歲,斯大林元帥,   
你是全人類的解放者,   
今天是你的70壽辰,我向你高呼萬歲。  

原子彈的威力在你面前只是兒戲,
細菌戰的威協在你面前只是夢囈。   
你的光暖使南北兩冰洋化為暖流,
你的潤澤使撒哈拉沙漠化為沃土。   

不朽的馬克思和你同在,
你和馬克思一樣永遠不朽了!   
不朽的恩格斯和你同在,
你和恩格斯一樣永遠不朽了!   
不朽的列寧和你同在,
你和列寧一樣永遠地不朽了!  
紅透專深(調寄十六字令)
紅!雙反之火正熊熊,燒五氣,努力學工農。   
透!鍛煉須從勞動受,新八路,今日又從頭。   
專!技術革新在眼前,學科學,戰向地球宣!
宇宙充盈歌頌聲
國慶年年益光輝,今年又有新景象。   
人民英雄紀念碑,屹立天安門廣場。   
廣場浩蕩人如海,豐碑巍峨天變矮。   
人間出現雙太陽,天上地下增光彩。
水調歌頭——慶祝無產階級文化大革命十周年
本詩寫於1976年5月12日,打倒四人幫之前

四海《通知》遍 文革卷風雲
階級鬥爭綱舉 打倒劉和林

十載春風化雨 喜見山花爛漫
鶯梭織錦勤 茁茁新苗壯 天下凱歌聲

走資派 奮螳臂 鄧小平
妄圖倒退 奈“翻案不得人心”

“三項為綱”批透 覆辟罪行怒討
動地走雷霆 主席揮巨手 團結大進軍
迎春序曲 節選
趕上英國只需要十五年,   
農業綱要七年就可實現;   
一個大躍進連著一個大躍進,   
英雄氣概可以覆地翻天。   
看吧,要把珠穆朗瑪鏟平!   
看吧,要把大戈壁變成良田!   
勞動人民歷來就是創世主,   
在今天更 表示了他的尊嚴。  
全民大煉鋼鐵時期《鋼,鐵定的一0七0萬噸!》:  
鋼,鐵定的一0七0萬噸! 
今天知道了你已提前完成,   
把去年的產量整整翻了一番, 
六億五千萬人民都衷心慶幸。  
……   
鋼,元帥真有高度的紀律性,  
 你一馬當先地跑上了高嶺。  
咒麻雀
 全民“滅四害”(“四害”為蒼蠅、蚊子、老鼠、麻雀。後來證明麻雀不是害蟲,而是益鳥)時,在1958年4月21日他寫了一首《咒麻雀》
 此外,還有一篇《四害余生四海逃》,共有4首:一、蒼蠅逃向英國;二、麻雀逃向美國;三、蚊子逃向日本;四、老鼠逃向西德。

麻雀麻雀氣太官,天垮下來你不管。   
麻雀麻雀氣太闊,吃起米來如風刮。  
麻雀麻雀氣太暮,光是偷懶沒事做。   
麻雀麻雀氣太傲,既怕紅來又怕鬧。  
麻雀麻雀氣太嬌,雖有翅膀氣太高。   
你真是些混蛋鳥,五氣俱全到處跳。   
犯下罪惡幾千年,今天和你總清算。   
轟打毒掏齊進攻,最後放把烈火烘。   
連同五氣齊燒空,四害俱無天下同。 

來源

本文的內容部分轉載自:
新浪博客
編程隨想

2021年 1月 補充:
人民日報 49-03 備份
參考消息 57-02 備份

2021年 5月 補充:
這個網站還是蠻有意思的, 把人民日報的歷史文章都 Archive 了下來.
比如 四害餘生四海逃 這幾篇詩歌可以在網站上找到,

這個網站真的非常有意思.

C語言多線程編程實戰

我沒有專門學習過多線程,非常可能有更簡單的方法,我說了一大堆廢話只是繞了遠路。不過這次嘗試中應該還是有很多自己的感悟的,所以如果你是大神,覺得很滑稽,這個家夥寫得都是什麽垃圾啊,笑一笑就好啦 : ) 如果你是和我一樣的小白,歡迎共勉共同進步。

想要實現一個Text UI (我對命令行情有獨鐘,因為我做不出圖形界面) ,要控制光標同時繪制多個區域以及時響應。那麽這個就很明顯用到多線程了,奈何我對多線程一竅不通,於是…

  • 這是我理想中的窗體:
  • 實際畫出來的效果是這樣的:

這一坨坨條形碼,讓我頓時感到世界對自己充滿了惡意…

第一次排錯

這個其實很明顯。控制台的標準輸出就一個,多個線程控制著光標滿屏亂跑,A線程抱著光標鉆到草叢里還沒幹事請呢就被B線程橫刀奪愛,最後搞出來的東西自然是誰都不像。

我於是用了一個隊列,思路是這樣的:

  • 新建一個隊列q,函數queLock()、函數queUnlock()、Bool類型變量queueLock
  • 當A函數想要執行敏感操作(比如修改同一個變量)的時候,就去使用queLock()。這個函數會給它添加一個標識到隊列尾部。然後不斷檢查隊列頭和queueLock,如果queueLock變成false且隊頭輪到這個標識符了,就瞬間取出這個標識符然後鎖上queueLock
  • 當敏感操作完畢後,用queUnlock取消queueLock的鎖。
  • 這就相當於queLock()暫時鎖住了這個線程。雖然降低了部分效率,但是還是可以體現多線程的優勢的。

我的代碼是這樣的。

bool queueLock=false;
int ident=0;
queue<int> q;
inline void queLock(){
    int id=++ident;
    q.push(id);
    while(1){
        if(!queueLock&&q.front()==id){
            queueLock=true;
            q.pop();
            return;
        }
    }
}
inline void queUnlock(){
    queueLock=false; //inline會在編譯的時候直接插入代碼,因此無需擔心調用費時。
}

這應該解決了吧?

然鵝…

基本沒有變化!

圖樣圖森破啊!

第二次排錯

經過研究,我終於发現了問題所在。如果你正在看(且你不是我),你估計早就发現問題了。

int id=++ident;

這個完美無缺的函數第一行就出現了問題。

這個操作先給ident+1,然後將此時的ident賦值給id。這個連在一起寫可能看不出來,那麽我分開。

//上面的代碼等價於:
ident++;
int id;
id=ident;

這就很明顯了吧。另外一個線程完全有可能在前兩行或者後兩行中間橫插一腿。

所以這個id放在這里就是個花瓶。等於把問題從stdout的訪問沖突轉嫁到了ident的訪問沖突上。確實訪問效率更高了,但是沒有從根本上解決問題。

解決方案其實也很簡單。關鍵在於ident訪問沖突,這個ident是幹什麽的啊?用來區別線程的。區別線程我幹嘛要專門弄一個標識符,這不是畫蛇添足嗎??

直接上改正過的代碼了。

bool queueLock=false;
queue<HANDLE> q;
inline void queLock(HANDLE hThread){ //排隊+加鎖
    q.push(hThread);
    while(1){
        if(!queueLock&&q.front()==hThread){ 
            queueLock=true;
            q.pop();
            CloseHandle(hThread); 
            return;
        }
    }
}
inline void queUnlock(){
    queueLock=false;
}

經過這次調整,效果很明顯。发生問題的幾率降低了50%,錯亂也含蓄了很多,從大塊錯亂變成了標題移位。

還是不給力啊!百分之五十算個毛線??標題移位算個毛線???

第三次排錯

經過又一翻的 苦(拔) 思(禿) 冥(頭) 想(发) ,終於OK了。

仔細看下第二次的代碼,先留出一炷香的時間思考那里有問題。



想出來了嗎?

這個if語句看起來與世無爭,屬於誰都不會去考慮的類型,在一般的程序中是絕對沒有任何問題的。但是這是多線程編程,即使代碼寫的再緊湊,每條語句中間還是有延遲的。

上面的if語句可以拆解成下面的語句:

//與上面的語句等價
if(!queueLock){  //第一個判斷 
    if(q.front()==hThread){ //第二個判斷
            queueLock=true;
            q.pop();
            CloseHandle(hThread); 
            return;
    }
 }
inline void queUnlock(){
    queueLock=false;
}

那麽,如果甲線程在執行第一個判斷的時候,丙線程剛剛執行完畢,把queueLock給取消掉了。這個時候甲和乙齊頭並進,都完成了第一重判斷。這個時候甲線程率先完成第二重判斷並pop掉了自己,於是乙再次完成第二重判斷,和甲線程一起進入了多線程狀態。
(這里的乙可以換成任意一個非甲線程,丙丁戊己庚辛 隨便那個都可以。在這個程序里面肯定有一堆線程等著要出這個頭。)

解決方案就是,把if中的兩個條件調換一下順序。理解了BUG存在的原因,那麽怎麽去掉他就非常容易了。

代碼我就不貼了,直接貼圖我方便,你看著也方便。

那麽這樣運行出來之後就穩定的得到了本文的第一張圖,多次測試沒有變過,應該是成功了。

現在可以來驗證一下我的猜想,到底是不是這樣。

如果我的猜想成立的的話,那麽這個BUG发生的條件是”同時存在三個及以上的線程“。我於是去掉了一個線程(框框)反覆嘗試,確實,一直都沒有发生問題。

為什麽出現錯誤時只有標題移位我還沒有搞清楚。我猜想是系統提供的輸出函數會使用自己的方法去後移坐標位置,方法應該比我的SetCursorPosition()更加基礎,也更快一點。這種速度跟我的慢速沖突了,所以系統的輸出爭先恐後的湧到前面來導致了錯亂。

總結

在這個程序里我完成的事請事實上是在特定條件下把並行改為並发,用了隊列的這個結構。隊列中其實同時存在的元素上限恒等於同時存在的進程數上限。這個是使用了隊列結構的特性。

第一個問題(第零次排錯)的发生,只是用來作為本文的開頭提出問題的。可以對問題有個直觀認識,我畢竟還沒蠢到那個程度。

第二個問題(第一次排錯所引发的)是沒有認清楚解決問題的本質。我實際上幹了轉移問題的操作,而沒有從實質解決問題。問題從進程搶光標變成了進程搶標識符。

第三個問題(第二次排錯所引发的)是沒有細節。多線程編程是很講究細節的,if判斷還是建議分開來寫,不然大大延長出現bug後拔頭发的時間。

而且多線程編程還是對調試不太友好的(特別是命令行情況下)。你不能開一個調試窗格去搞它,你一開,結果又不一樣了。你不能去增大延時去仔細看輸出順序,因為你開延時之後就沒問題了。這個有點像薛定諤的貓,開箱之後你最終只能看到貓的死活,你看不到貓是怎麽死掉的。所以處理這種問題的時候還是建議自己開思維導圖逐行的推斷,給自己大腦編個碼,也許問題就解決了。

後話

剛剛发現,手動的一遍遍穩定性測試弱爆了….

其實如果真的要測試到底有沒有問題,寫一個線程不停搶資源就是了。

void cpu_eater(void*){
    while(1){
        queLock(getHandle());
        queUnlock();
    }
}
int main(void)  
{  
    _beginthread(win_playlist,0,NULL);
    _beginthread(win_menu,0,NULL); 
    _beginthread(win_progressbar,0,NULL);
    //下面是搶資源線程
    _beginthread(cpu_eater,0,NULL);
    _beginthread(cpu_eater,0,NULL);
    _beginthread(cpu_eater,0,NULL);
    //上面是搶資源線程
    sleep(LIFETIME_DELAY);
    return 0;  
}

一旦有問題,在三個線程不停跟他搶資源的情況下肯定立即就暴露出來了。這樣可以非常方便的一遍檢出問題。我剛剛寫完才发現有此等操作,真是冤煞我的Ctrl+F5。

下面是開了三個搶資源線程的動圖。

還蠻美觀的蛤。(這就完全沒問題了)

思考題

留一道思考題。

如果你不像我這樣戰五渣就試試看這道題。

上面的代碼我通過修正判斷的順序解決了問題。但是我如果不去修正判斷順序,而是修正執行順序,即:

調換這兩行順序,能不能一樣達成目的呢?

(偷偷透露下,不行。)

那麽為什麽不行呢?

答案:image-20200407183057649

自製 Goose 愚人節小病毒

愚人節前我亂翻小衆軟件,突然發現了這個東西,於是就有了靈感:
點擊前往: Desktop-Goose 小衆軟件

這是什麽

程序全屏運行示意圖

這是一個可以瘋狂啓動上述 呆鵝 的小程序,只有按照指令敲入句子才可以將其關掉。
簡而言之,這是一個 啓動器,用來啓動和關閉 Goose 程序,僅此而已。

技術細節

整個程序是我用蹩脚的 C++ 編寫的,使用了 辣鷄 DevC++ ,因此你可以猜到這個東西跑起來是什麽樣子。
代碼比較凌亂。而且因爲我是趕出來的,直接一個文件解決問題,相信我你絕對不會想要去讀這個代碼的 🙂

Debug 模式下可以看到 Daemon

一些值得 Mark的 小技巧有:

  • 適當使用了 Windows Api, 實現了自由控制 文字顔色 和窗口 全屏
  • 用命令控制開啓和 一次性 關閉所有進程
  • 不同的 啓動參數 可以改變程序的行爲
  • 可以通過改變 預編譯 命令 來決定程序的惡心程度
  • 簡單的多綫程實現
  • 開啓了一個 守護進程 來檢查並阻止關閉程序(守護進程也無法關閉)
  • 檢測到嘗試關閉程序會有 懲罰
  • 長時間沒有輸入也有懲罰(多綫程實現)
  • 隱藏了一個 “上帝指令” 允許優雅的關閉程序

下載程序

在下載前,你需要知道:

  • 壓縮包裏只有 文本文件和圖片資源,你需要自己編譯 main.cpp
  • Goose程序需要分別下載,下載完之後放到程序的同級目錄

Goose: 跳轉至官網
程序源碼: 點擊下載

程序沒有任何的傳播性(不會自我複製),隱藏性(不會僞裝),破壞性(不會讀寫其他文件),且不會自動運行(若想達到這一點你可以讓程序自己複製到啓動),因此嚴格來説這個東西并不能被稱作病毒。請在編譯前仔細閲讀代碼,確定沒有問題后運行,一切後果 雨我無瓜.

病毒一般具有 传播性、隐蔽性、感染性、潜伏性、可激发性、表现性或破坏性, 一般具有兩種即以上就可以被稱作電腦病毒。具體請參考 維基百科 – 計算機病毒的特徵