您好,歡迎使用LCBO API?
如果您發現自己想知道“什麼是 LCBO API?”,請讓我解釋一下。在加拿大安大略省,所有飲料酒精銷售均透過一家名為安大略省酒類管制委員會 (LCBO) 的政府公司進行,該公司負責全省酒精飲料的零售和分銷。 LCBO 擁有眾多零售店和一個網站,其中包含每個產品、商店甚至庫存水準的目錄。他們出版了一份季節性目錄,其中包含食譜、社論和其他稱為「食品和飲料」的內容。他們每年也為我們的公共醫療保健系統貢獻數十億美元的收入。想想看,這是一個令人著迷的情況,其他地方也有類似的系統,但據我所知,沒有一個地方具有 LCBO 的廣度和深度。所以,現在你知道它是什麼了,很酷吧?
即使您不住在加拿大安大略省,如果您符合以下條件,您可能也會對此感興趣:
在這個計畫的整個過程中,我一直在接受財務支持的想法上掙扎。一方面 LCBO API 需要它,另一方面我厭倦了它會導致的併發症。好吧,現在我有這個問題的完美解決方案!
我現在正在接受血癌治療,特別是瀰漫性大 B 細胞淋巴瘤。我很快就會在其他地方寫更多相關內容,但在過去的一年裡,來自世界各地的人們以各種方式支持我,這改變了我。我希望我們做一些大事來表明我們也關心!
如果您過去想支持這個項目,請代表 LCBO API 向 Hamilton Health Sciences 捐款,他們正在拯救我的生命。
捐贈給漢密爾頓健康科學
我正在 Juravinski 癌症中心接受治療,但實際上您可以選擇任何選項,也可以保留預設選項。不管金額是大是小,捐款的時候他們都會通知我。我將列出一個清單來追蹤總數,讓我們看看我們可以籌集多少!
最後我想特別提及我的職場 Crowdmark。在這一切過程中,他們都非常友善和理解,如果沒有他們,我根本無法做到這一點。我們正在不懈地努力改善高等教育評估的現狀。如果您關心教育和學習,我強烈建議您關注我們。
2008 年秋天,我是一名剛出道的 Web 開發人員,擁有幾年的經驗。我渴望挑戰,也渴望得到認同。當時應用程式正在成為一種趨勢,我非常想建立一個應用程式。我決定要建立一個需要我先建立此 API 的 API。我從來沒有建立過那個應用程式?
如果你研究這個程式碼庫足夠長的時間,你可能會發現挫折感、死胡同、令人困惑的問題等。我不再是那個人了,我也不希望你成為那個人。我對此是一本打開的書!打開一個問題並向我提問,我會盡可能誠實和尊重,我只要求你也這樣做。
我正在 GNU GPLv3 下發布這個項目,我認為對於這樣的項目來說這是最公平、最負責任的選擇。如果您有不同的感覺,請提出問題,我們可以公開討論。我只是恭敬地請求您不要重複使用品牌和設計。我同意重複使用文檔,但如果您想部署此應用程式自己的孤立版本,則必須更改樣式、標識和品牌。
如果我們不是嘗試在一個地方以一種風格完成所有事情,而是考慮更大的單一應用程序,會怎麼樣?如果爬蟲是另一個單獨的項目,負責收集和規範化數據,其他人可以在他們希望的任何平台上建立API 節點,這些節點將向數據提供者註冊並在可用時接收更新的數據,並將該數據提供給所有不同類型的使用者。
我們可以集中精力為這些數據創造價值,而不是爭奪數據的所有權,而不是讓數十個類似的 API 伺服器嘗試做同樣的事情,爭奪 LCBO.com 的資源。我們可以讓其他學科參與進來,以產生超越顯而易見的新價值,讓精釀啤酒和葡萄酒社區參與進來,在此基礎上發展,使其比安大略省更大。
我不知道這樣的事情有多可行,但我知道如果其他人有興趣,我很樂意進行這些討論。
此外,也許我們應該考慮向企業用戶收取訪問 API 節點的合理費用,這筆錢可以用來支付託管成本以保持可持續發展,也可以用來資助針對不能喝酒的人的支持計劃,或者不想喝酒,或者想少喝酒,回饋我們的社區並真正做出改變。
但我需要其他人幫忙分擔維護和管理這一切的負擔,我和家人的健康和幸福是第一要務,其次是我的事業,然後是我的朋友和社區。這個項目不再是我的第一大時間消耗點,它對我來說不可持續,對我來說也不健康。但如果您受到此訊息的啟發,請與我聯繫,最好是公開聯繫,但一開始私下也可以。
我希望這能讓你興奮!
我無法控制自己,我寫了更多關於我的想法:doc/lcboapi-propose.md
現在,把這些都搞清楚了,我們可以開始了解我這樣做的真正目的是為了誰,以及是什麼讓我興奮和受到啟發去做這件事:學習和成長的機會,以及幫助其他人做同樣的事情的機會。對於那些好奇的人來說,讓我們看看這是怎麼回事?
您可以直接在主機環境上運行該應用程序,就係統依賴性而言,它不需要任何太花哨的東西。我在Apple硬體上開發,如果你也這麼做,你可能會成功使用Postgres.app和Homebrew來安裝Redis。否則,您可以使用 Docker。
如果您有使用其他平台的經驗,請提出 PR 或問題,我們可以將您的平台新增至自述文件中。
另外,如果接下來的內容對您來說沒有意義,請提出一個問題,也許我們可以做一個截圖影片來演示該過程,或者也許有擅長這方面的人來承擔這個任務?
我下面描述的只是設定開發環境以在電腦上運行 LCBO API 的一種方法。如果其他人有改進(有很多空間,例如引導開發資料庫的入口點腳本)或甚至不同的方法,例如使用 Vagrant + VirtualBox、開啟問題或 PR,我很樂意添加它們。
如果你想幫忙,我想為你提供幫助。
config/secrets.yml
和.env
首先,您需要設定一些公共儲存庫中未提供的配置。這樣做的原因是為了保護 API 金鑰和秘密令牌等私有數據,但也因為一些開發人員可能更喜歡根據個人喜好和類似的事情使用稍微不同的設定。
您需要建立幾個檔案: config/secrets.yml
和.env
。倉庫中的config/secrets.yml.example
和.env.example
下方有一個範本版本,您可以複製這些檔案來開始:
cp config/secrets.yml.example config/secrets.yml
cp .env.example .env
如果您只想啟動應用程式並在本地存取它,那麼此時您應該可以開始了。如果您希望能夠使用爬網程式並將快照儲存到 Amazon S3,則需要將 AWS 憑證和儲存桶新增至config/secrets.yml
。
其餘的設定要么只在生產環境中真正重要,要么沒有真正使用,或者僅在您不喜歡預設首選項時才重要。像往常一樣,如果您需要澄清,請公開並提出問題,我很樂意提供協助。
首先,您需要為您的系統安裝 Docker 用戶端,您可以在此處找到相關資訊。安裝 Docker 後,您就可以開始使用了:
接下來,您需要建置容器:
docker-compose build
完成後,您可以透過發出以下命令來啟動整個過程:
docker-compose up
此時,資料庫中還沒有任何數據,因此如果載入應用程序,http://localhost:3000,它不會做太多事情,它畢竟提供數據,而且裡面沒有數據。那麼讓我們為此做點什麼吧。
繼續並關閉容器:
Ctrl-C
這意味著,同時按下Control
+ C
鍵。
您可以在此處從我的個人 Amazon S3 帳戶下載最新生產資料庫轉儲的存檔。請注意,存在敏感表(電子郵件、使用者、金鑰)且資料已從該文件中排除。
下載並解壓縮該項目的tmp
目錄中的存檔:
cd tmp
curl -O https://heycarsten.s3.amazonaws.com/lcboapi-2019-01-21.tgz
tar xzf lcboapi-2019-01-21.tgz
cd ..
該檔案約為 300MiB,因此下載可能需要一段時間,具體取決於您的連線速度(這種情況發生在以curl
開頭的行上)。
下載並解壓縮資料庫檔案後,您可以將資料載入到資料庫中:
docker-compose run --rm app rake db:create
docker-compose run --rm app bash -c 'pv tmp/lcboapi-2019-01-21.sql | psql -q -h db -U $POSTGRES_USER $POSTGRES_DB > /dev/null'
第一行以rake db:create
結尾,將在 Postgres 中建立資料庫模式用於開發和測試,第二行將資料庫轉儲載入到開發資料庫中。進度條指示有多少資料已透過管道傳輸到資料庫中,一旦完成,將建立索引。這可能需要一些時間,具體取決於您的機器,這是相當大量的數據。然後您可以再次啟動該應用程式:
docker-compose up
此時,您也可以安全地從tmp
目錄中刪除已存檔和提取的 SQL 檔案。
如果您發現輸入
docker-compose
一遍又一遍地乏味,請查看 shell 別名您可以將別名行新增至您的 shell 設定檔中,例如
alias dc=docker-compose
,然後您只需鍵入dc
而不必每次都鍵入docker-compose
。 ✅想想您可以創建其他別名來進一步改進這一點嗎?
現在,導航到 http://localhost:3000/products/438457
繁榮。您的電腦上已經運行了 LCBO API! ? ? ?
當您完成應用程式的工作後,只需按Ctrl+C
即可關閉所有內容。下次你想再處理它時,執行docker-compose up
就可以了!
如果您在Gemfile
中新增新的 gem,則需要重新安裝軟體包並更新相依性。 Docker 非常擅長做到這一點,它可以告訴Gemfile
何時發生變化,並且它知道為您重建app
容器。
要啟動 Rails 控制台並檢查應用程式內的物件:
docker-compose exec app rails c
一旦運行,您可以執行以下操作:
取得資料庫中的第一個產品:
Product.first
找到 LCBO 零售店 #25(我當地的商店):
Store.find(25)
如果您更改應用程式中的程式碼,則需要重新reload!
控制台中的命令刷新更改。
在spec
資料夾內,您將找到 LCBO API 的測試套件。遺憾的是它並不全面,但也不算太糟。我在整個職業生涯中都在努力維護我滿意的測試套件。我們應該改進這些測試!
運行測試套件:
docker-compose exec app rspec
你會看到一堆綠點.
,其中每一個都代表一個通過的測試案例。那挺好的。如果發生故障,您會看到一個紅色的F
,這很糟糕......只是開玩笑!其實也挺好的!測試使您能夠更改現有程式碼庫中的內容,並查看是否會導致現有功能出現任何回歸。當然,沒有什麼是完美的,但我可以毫無疑問地告訴你,從經驗來看,測驗是好的。
隨著應用程式變得越來越大、越來越複雜,沒有測試就變成了一場真正的噩夢,這使得更改應用程式和添加功能成為一個極其脆弱的過程。使用具有類型系統的語言和其他各種不同的程式設計範式也可以在很大程度上幫助解決這個問題,但我認為至少有一個可靠的驗收測試套件是無可替代的。
這是 LCBO API 的一部分,它使整個事情成為可能。複雜網站的爬蟲很難建造和維護。 LCBO API 的第一個版本有一個完整的爬蟲測試套件,當很多年前一切都發生了變化時,我放棄了那個程式碼庫,只是在這個程式碼庫中盡可能快地建立一些東西。
爬蟲邏輯位於lib/crawler.rb
中,從那裡您將看到連續發生的所有各種任務,以包含 LCBO 網站的完整爬行。
解析器邏輯位於lib/lcbo.rb
以及lib/lcbo/*
中的所有各種文件中,這包括需要發生的所有各種請求,以及負責將這些請求中的資料轉換為結構化資料的程式碼最終可以進入資料庫。
我設計的爬蟲以串行方式執行請求,這是爬行一個網站時非常好的方法。這對一個人來說很簡單,如果可以的話,這總是最好的選擇,而且很有禮貌。我們可以啟動n 個AWS Lambda 作業並在幾秒鐘內抓取 LCBO.com 上的每個頁面,但這很粗魯,而且我們可能會暫時對他們的網站進行 DDoS,這不好。
/manager
)這包括一個 Ember 應用程序,當您註冊/登入 LCBO API 並產生 API 金鑰時,這就是您正在與之互動的內容。它已經過時了,我還沒有嘗試過建造它。我從零天起就開始使用 Ember,所以如果您對此有任何疑問,請提出問題。實際上,我很樂意討論 LCBO API 的這一部分,並與大家一起改進它。
/static
)這包含一個中間人站點,當您訪問 lcboapi.com 時,這就是您正在查看的內容。它還包含一個非常小的(也過時的)React 應用程序,它是主頁右側的“嘗試一下”。它有自己的 Gemfile 和建置腳本static/generate
,運行時它會建置網站並將變更同步到public
資料夾中。在 Rails 應用程式中, public
資料夾是作為靜態內容提供。
這個程式庫中有很多死胡同,分支已經完成了 40-60-80% 的功能,然後停滯不前,實驗等等。只要提出問題,我會盡快回覆。
如果我們能在這裡解決一些死胡同,那就太酷了,我對最終添加 JSON:API 和 GraphQL 非常感興趣。在某種程度上,我有點驚訝沒有人對此抱怨。
到目前為止,我從未實現過的最受歡迎的功能是類別,它就在這裡,我忘記了為什麼我從未發貨它,我不記得最終的東西必須到位,但也許這將是一個很好的第一個要解決的事情?還有《Producers》和《Origins》,這些都從未完全包裹起來。
我還有一大堆其他儲存庫和多年來所做的小實驗,我總是對庫存水準預測的想法著迷,某處有一個用Go 編寫的資料集轉儲分析工具,用於分析特定產品庫存的CSV 轉儲在一段時間內。如果有興趣的話我也很樂意發布這些東西。
我暫時把它留在這裡,等待你的回覆。我很樂意以人們希望看到的任何方式(截圖影片、訪談、內聯文件等)繼續添加這個知識庫。 ❤️