C#: 位元旗標 (Bit flag) 與列舉

前陣子碰到個資料表儲存方式,因為這種位元運算的方式也常用在權限管理等地方,這邊就順手紀錄一下。

平常遇到二元的情形(例如 開/關、有/沒有),我們會直接宣告個 Boolean 來處理。例如 bool isNice = false

但這次遇到的是同時有多組「有/沒有」的狀況,而我遇到的程式碼並沒有分成多個 Bool 去做處理,而是直接儲存成一個數值。

這是因為「有/沒有」只佔據一個位元,那麼將多個狀況按照位元順序排列的話,就只需要一個數字就可以紀錄並傳遞給其他系統了。

例如最常見的權限系統:假設我們有「讀」、「寫」、「執行」的權限,接著就可以按照這個順序,用 1 和 0 來代表「有/沒有」來排列位元,

也就是說,如果權限是 讀=可、寫=不可、執行=可 的時候,就記做 101 = 5

這種直接用一組位元來表示狀態的方式,就叫做位元旗標(Bit flag)

1 讀   = 可
0 寫   = 不可
1 執行 = 可

/* 橫放 */
=> 101 (2進位) 
=> 5 

Enum & Flags

假使某天老闆靈光一現,決定接下來的新人員工都要記錄他們會的程式語言,並且他們報到的時候就會發一張公司列好的程式語言清單請他們勾選。這時候要怎麼做呢?

在 C# 中已經有方便的工具可以處理位元旗標,我們可以建一組叫做 SkillEnum 的列舉(Enum),並且按照上面說明的,將老闆提到的每個技能各自用一個位元來表示。

[Flags]
public enum SkillEnum
{
    C = 1,     // 0001
    PHP = 2,   // 0010
    SQL = 4,   // 0100
    Java = 8,  // 1000
}

註:[Flags]的標籤是指 C# 專門提供給位元旗標使用的 Enum,請參見 FlagsAttribute

只要在 enum 上加上 Flags 的屬性,除了自動按照 2 的次元增加以外,在使用 ToString() 也能更方便看見旗標內容

有了這個列舉之後,我們就可以表達不同排列組合的狀況了。例如:

* C: C
* P: PHP
* S: SQL
* J: Java
===========
J S P C
0 0 0 0 => 什麼都不會
0 0 0 1 => 只會 C
0 0 1 1 => 同時會 C 和 PHP
1 0 1 0 => 同時 PHP 和 Java
1 1 1 1 => 全部都會
……

閱讀全文



WakaTime —— 我 Coding 了多久?

這一周又是 偷懶週 繁忙週,因此就跟大家分享一個有趣的網站:WakaTime

WakaTime 能夠幫你自動記錄寫程式的時間、常用語言及專案,只要簡單地在常用的 IDE 設定好擴充套件就可以達成。 WakaTime 支援的 IDE 可以參閱 WakaTime - Plugin

註冊相當簡單,此處就不贅述。稍微介紹一下儀表板的各區塊的功能:

左上會有最近的專案及花費時間,每個色塊都是一個專案,滑鼠移上去就會顯示專案名稱。

點擊其中一天更會顯示當天的時間軸,可說是無所遁形。至於它判斷專案名稱的方法是看你編輯的檔案所在的資料夾名稱。

……

閱讀全文



我要訂便當 (5): Heroku 填坑小記

在上一集的 將 Python 腳本部署上 Heroku 中,記錄了將 Python 腳本放上 Heroku 的過程,但仍然沒有將我們的 訂便當小幫手 給放上去。之前有稍微提到是因為過程中遇到了一些問題,最後決定將這些問題和找到的前人解決文記錄在這一篇,將來再遇到的時候就可以參考。

  1. SQLite 要改成用 PostgreSQL
  2. 在 Heroku 上執行 Selenium

一、SQLite 要改成用 PostgreSQL

在之前的 我要訂便當(2) —— 用 Python + Sqlite 儲存訂單 中,為了方便及簡單性,選擇了較輕便的 SQLite 來儲存我們爬回來的訂單資訊。然而,SQLite 將資料儲存在小檔案以便於攜帶的做法,在 Heroku 上將會遭遇像是各個 dyno 的資料不同步等許多問題,因此 Heroku 是不建議使用 SQLite 的。

在 Heroku 的開發文件中的 SQLite on Heroku 有關於這部分的詳細說明,並直接提到「If you were to use SQLite on Heroku, you would lose your entire database at least once every 24 hours.」同時,官方也提供了他們的建議:PostgreSQL。相較於輕便但只能同時單一寫入而且還會在 dyno 炸掉的 SQLite,PostgreSQL 的完整性更符合 Heroku 對服務的要求。

關於在 Heroku 上使用 PostgreSQL 的做法,這篇 佈署 Python Flask 網站留言板應用程式到 Heroku + PostgreSQL 資料庫系統 說明得相當詳細。

……

閱讀全文





Carbon —— 把程式碼片段截成有質感的圖片吧

開始挑戰每週寫文之後,發現最大的敵人根本不是寫文這件事,而是自己的惰性啊。像這次母親節假期過太爽,差點兒就忘記發文…… 所以這週就還是 偷懶 工具介紹囉。

今天要分享的是 Carbon 這個工具,它能夠將貼上的程式碼輸出成圖片,並且支援程式碼上色,還可以自選字型、背景色等等,產出的圖可以說相當有質感。

當傳送圖片比較快或排版比較好的場合(例如Line, Facebook..),或是在部落格和文件中想直接放漂亮圖片,以及需要示範給對方看可是又不想要對方直接複製貼上的時候可謂是相當實用。

先來一張成果圖鎮樓

……

閱讀全文



我要訂便當 (4): 將 Python 腳本部署上 Heroku

2024.10 更新: Line Notify 將於 2025 年 3 月停止服務(LINE Notify 結束服務公告),有看到這篇的朋朋請選擇一組新的通知服務來串吧 QQ

目標:紀錄一下如何將 Python 寫好的東西丟上 Heroku

在先前的 訂便當系列 中已經建立了一個替我們去爬便當網並通知我們的小工具,但還存在一個相當大的問題:要在哪跑?總不能就只放在家裡電腦有開機就跑、沒開機就算了吧?因此我們必須找個主機把它放上去。而在上一篇做 Line Notify 的時候所參考的 如何快速建置一個 LINE Notify 的服務 中提到了將服務放上 Heroku 的部分,因此馬上嘗試看看。

結果過程中碰了不少壁,因此特地紀錄下來。

Heroku 是一個雲端平台,讓使用者可以把服務丟上去跑,同時最讚的部分是,免費用戶就提供了每月 450 小時可以使用(但有每半小時會進入休眠的限制),詳情可以參閱 Heroku 的計費頁面

更新:Heroku 已經改為收費方案了 QQ

本系列最後一階段的目標就是要將訂便當爬蟲整套丟上去雲端上運行,達到被動接收通知的效果。但由於訂便當爬蟲還牽涉到用 Selenium 開瀏覽器互動,以及使用 Sqlite 儲存的部分,轉移到 Heroku 的環境上還需要進行一些調整。因此這一階段將會分成兩篇(或以上)文章進行,上篇會先簡單地紀錄如何將服務放上 Heroku,下篇開始則著重於紀錄將訂便當系統放上 Heroku 時遇到的問題和解決過程

本篇主要的參考來源來自於 搭配 Git 在 Heroku 上部署網站的手把手教學發布網站到 Heroku 以及 網站部署(使用 Heroku) 這幾篇,其餘參考將附於文末,感謝各位前人大大留下的優質文。

……

閱讀全文



CSS: 變數 (Variables)

這禮拜忙了些,只好先偷懶打張安牌。這邊就記一下前陣子同學弄主題切換時用到的 CSS 變數(Variables)功能用法

原本使用 CSS 時就會有許多重複使用的部分,例如說網站的主色彩和副色彩等,然而在管理上,或是要修改的時候就會很麻煩,通常都要另外借助工具來處理。然而 CSS 其實原生就有變數可以使用,大大地增加了改動時的方便性。用法上也相當簡單。

在 CSS 宣告變數時,建議放在 :root 裡,並使用 --變數名 的方式宣告。例如

:root{
    --color: #000000;
}

而使用的時候只要 var(--變數名) 就可以囉。例如

body {
  background: var(--color);
}
……

閱讀全文



Feedly —— 用 RSS 訂閱來主動篩選資訊吧

「你看,我認為人的腦子本來就像一間空空的小閣樓,應該有選擇地把傢俱放進去,傻瓜才會把他見到的所有破爛一古腦兒的裝進去。這樣一來,那些對他有用的知識反而被擠了出來;或者,最多不過是和許多其他的東西摻雜在一起,在取用的時候也會很困難。所以一個會工作的人,在要把一些東西裝進他那間小閣樓似的頭腦中的時候,確實是非常小心謹慎的。」

  ——《福爾摩斯探案記:血字的研究》

在咱們寫程式這行中,幾乎所有人都必須要在網路上找尋資料;而就算非這一行的朋友們,也會在網路上多方攝取資源。隨著時間的累積,都會開始有一份列表,諸如一些崇拜的大神或是固定追蹤的部落格,又或是文風比較喜歡、素質感覺比較高的新聞或評論等等。

然而列表越來越長,就算加到書籤也總不能沒事就逛一大圈,也常常逛到不知道到底在幹嘛囧。因此把多個資訊來源集中起來整理就成了面對資訊爆炸的關鍵一步。

Feedly 就是一個協助資訊來源管理的工具,可以很方便地把不同訂閱來源整理在一起,例如你可能追隨了五六個大神的部落格,只要這些大神都有提供 RSS 訂閱,Feedly 就會將大神更新的文章收集到平台上。

每天只需要上去 Feedly 看一下有沒有哪位大神更新,就可以化主動為被動,穩定接收新資訊。並且由於集中管理的關係,也可以檢視是否有哪個資料來源,如新聞網站,實際上更新的文章並不太合你胃口,或是哪些已經停止更新了,就可以進行剪枝的動作,建立自己的篩選機制。

……

閱讀全文



EPPlus —— 輕鬆處理 Excel

前陣子工作需要匯出一些資料表,因此用到了 EPPlus 這套工具來把資料匯出成 Excel。由於這需求似乎會挺常遇到的,決定記一下。

目標:稍微紀錄一下這次碰到 EPPlus 的用法。

EPPlus 是在 .NET Framework 或 .NET Core 上提供控制 Excel 的元件,操作簡單好懂,當有需要在網頁上讓人將表格資料下載成 Excel 的功能時就可以試著使用。常常一併被提起的還有另一個一樣老牌的相似功能元件 NPOI,不過我個人只用過 EPPlus 便不再贅述。關於更詳細的介紹,可以參閱黑暗執行緒的這篇 比 NPOI 更討喜的 Excel 元件 - EPPlus!,儘管是有些久遠的文章但仍能迅速了解 EEplus 的賣點和差異。

我在使用 EPPlus 時主要的參考來自於 EPPlus 的 Wiki,每個功能都有說明及範例,同時也有範例專案可以下載,寫得相當詳細。另外還找了如 導出 Excel 之 Epplus 使用教程 - Wico’s Blog使用 EPPLUS 操控 Excel - 碼農的學習日誌 這些有逐步說明的文章,在此感謝。

……

閱讀全文



我要訂便當 (3): 用 Python + Line Notify 傳送通知

前情提要:

我要訂便當(1) —— 用 Python + Selenium 控制瀏覽器取得訂單 中,我們嘗試了用 Selenium 控制瀏覽器去取回訂便當團購網的訂單內容

而在 我要訂便當(2) —— 用 Python + Sqlite 儲存訂單 中,我們使用 Sqlite 達到將訂單儲存起來以判斷是否有新的訂單,因此這邊的下一步就是需要進行通知。

目標:使用 Line Notify,當有新訂單的時候就發送通知

Line Notify 是 Line 上面的通知服務,不像 Line@ 一樣可以有品牌有互動等等,Line Notify 純粹就是訊息通知;但同時對比 Line@ 最近吵得沸沸揚揚的收費和大量跳槽,Line Notify 則是免費的服務。

Line Notify 的運作上分為發送訊息和接受訊息。當我們使用 Line 帳號申請 Line Notify 的服務後就可以得到一個 Access Token,藉由這組 Access Token 就能夠讓我們的程式和服務去發送通知。這些通知會由一個叫做 LINE Notify 的官方帳號發送給有訂閱這個通知的人。

基於這個工作原理,像是需要經營品牌的服務就不太適合 Line Notify,反之像是伺服器斷線、設備超載等等這些個人通知性質比較高的服務就很適合使用 Line Notify。這點從 Line Notify 網頁 下方的示意圖也可以略知一二。

當然像我們這次的需求是「如果有新的團購便當 就 通知我」,相當符合使用場景,因此這邊就嘗試使用看看並記錄下來。

如果需要更多 Line Notify 的說明,保哥的這篇 上手 LINE Notify 不求人:一行代碼都不用寫的推播通知方法 介紹的更為完整,推薦參閱。當然,也可以閱讀 Line Notify 官方文件。那麼,我們開始吧~

……

閱讀全文



系列文

轉貼文

最近文章

分類

標籤

友鏈

統計資訊

工商服務

    DDDTaiwan