안녕하세요, LCBO API에 오신 것을 환영합니다.
여기에서 "LCBO API가 무엇인가요?"가 궁금하신 경우 설명해 드리겠습니다. 캐나다 온타리오에서 모든 주류 판매는 온타리오주 주류통제위원회(LCBO)라는 정부 소유 기업을 통해 이루어지며, 이 회사는 주 전체에 걸쳐 알코올 음료의 소매 및 유통을 담당합니다. LCBO에는 수많은 소매점과 모든 제품, 매장, 심지어 재고 수준에 대한 카탈로그를 호스팅하는 웹사이트가 있습니다. 그들은 요리법, 사설 및 Food & Drink라는 기타 콘텐츠가 포함된 계절 카탈로그를 게시합니다. 또한 그들은 매년 공공 의료 시스템에 수십억 달러의 수익을 기여합니다. 생각해 보면 매우 흥미로운 상황입니다. 다른 곳에서도 비슷한 시스템이 있지만 제가 아는 한 LCBO만큼 폭과 깊이가 있는 곳은 없습니다. 이제 그것이 무엇인지 아시겠죠? 꽤 멋지죠?
다음과 같은 경우 캐나다 온타리오에 거주하지 않더라도 이 내용이 흥미로울 수 있습니다.
이 프로젝트를 진행하는 동안 저는 재정적 지원을 받는 것에 대해 많은 고민을 했습니다. 한편으로는 LCBO API가 필요했지만 다른 한편으로는 그것이 초래할 합병증에 지쳤습니다. 자, 이제 나는 이 문제에 대한 완벽한 해결책을 가지고 있습니다!
저는 지금 혈액암, 특히 미만성 거대 B세포 림프종 치료를 받고 있습니다. 이에 대해서는 곧 다른 곳에서 더 자세히 쓸 예정이지만 지난 한 해 동안 모든 곳에서 온 사람들이 저를 지원해 주었고 그것이 저를 변화시켰습니다. 나는 우리도 관심을 갖고 있다는 것을 보여주기 위해 큰 일을 하고 싶습니다!
과거에 이 프로젝트를 지원하고 싶었던 적이 있다면 LCBO API를 대신하여 Hamilton Health Sciences에 기부해 주세요. 그들이 제 생명을 구하고 있습니다.
해밀턴 건강 과학에 기부
저는 Juravinski Cancer Center에서 치료를 받고 있지만 실제로는 아무 옵션이나 선택하거나 기본 옵션을 그대로 둘 수 있습니다. 금액이 적든 많든 상관없이 기부하시면 알려드립니다. 총액을 추적하기 위해 목록을 표로 만들겠습니다. 얼마나 모금할 수 있는지 봅시다!
마지막으로 제가 일하는 곳인 Crowdmark에 대해 특별히 언급하고 싶습니다. 그들은 이 모든 과정에서 믿을 수 없을 만큼 친절하고 이해심이 많았으며, 그들 없이는 문자 그대로 이 일을 할 수 없었을 것입니다. 우리는 고등교육 평가의 현 상태를 발전시키기 위해 끊임없이 노력하고 있습니다. 교육과 학습에 관심이 있다면 우리를 확인해 보시기 바랍니다.
2008년 가을에 저는 수년간의 경험을 쌓은 갓 태어난 웹 개발자가 되었습니다. 나는 도전과 인정을 갈망했습니다. 당시에는 앱이 인기를 끌었고 저는 앱을 만들고 싶었습니다. 나는 먼저 이 API를 구축해야 하는 API를 구축하기로 결정했습니다. 나는 그 앱을 만든 적이 없나요?
이 코드베이스를 충분히 오랫동안 살펴보면 좌절, 막다른 골목, 혼란스러운 문제 등의 순간을 발견할 가능성이 높습니다. 나는 여러분이 그 점이나 발견할 수 있는 부정적인 점에 집중하지 않기를 정말로 바랍니다. 나는 더 이상 그런 사람이 아니며, 당신도 그런 사람이 되는 것을 원하지 않습니다. 나는 이것에 대한 공개 책입니다! 이슈를 열고 저에게 질문하세요. 저는 최대한 정직하고 정중하게 대하겠습니다. 여러분도 그렇게 해주시기를 부탁드립니다.
나는 이 프로젝트를 GNU GPLv3에 따라 공개할 예정입니다. 저는 이것이 이와 같은 프로젝트에 대한 가장 공정하고 책임감 있는 선택이라고 생각합니다. 생각이 다르다면 문제를 공개하세요. 그러면 우리는 이에 대해 공개적으로 토론할 수 있습니다. 브랜딩과 디자인을 재사용하지 마시기 바랍니다. 문서를 다시 사용해도 괜찮지만 이 앱의 격리된 버전을 배포하려면 스타일, ID 및 브랜딩을 변경해야 합니다.
모든 것을 한 곳에서 한 스타일로 처리하려는 모놀리식 애플리케이션 대신 더 크게 생각한다면 어떨까요? 크롤러가 데이터 수집 및 정규화를 담당하는 별도의 프로젝트이고, 다른 사람들이 원하는 플랫폼에서 API 노드를 구축할 수 있다면, 해당 노드는 데이터 공급자에 등록되어 업데이트된 데이터가 제공될 때 수신되고 해당 데이터를 다른 사람에게 제공할 수 있다면 어떨까요? 다양한 유형의 사용자.
동일한 작업을 수행하려는 수십 개의 유사한 API 서버 대신, LCBO.com의 리소스를 놓고 싸우는 대신, 소유권을 놓고 싸우는 대신 이 데이터에 가치를 구축하는 데 노력을 집중할 수 있습니다. 우리는 명백한 것 이상의 새로운 가치를 창출하기 위해 다른 분야를 참여시키고, 수제 맥주와 와인 커뮤니티를 참여시키고, 이를 기반으로 온타리오보다 더 크게 만들 수 있습니다.
그런 일이 얼마나 실현 가능한지는 모르겠지만, 다른 사람들도 관심이 있다면 이런 토론을 하고 싶습니다.
또한 기업 사용자에게 API 노드에 액세스하기 위해 합리적인 수수료를 부과하는 것을 고려해야 할 수도 있습니다. 그 돈은 지속 가능한 호스팅 비용을 조달하는 데 사용될 수 있으며 술을 못하는 사람들을 위한 지원 프로그램에 자금을 지원하는 데 사용될 수도 있습니다. 또는 술을 마시고 싶지 않은 사람, 술을 덜 마시고 싶은 사람이 지역사회에 환원하고 실제로 변화를 일으키고자 하는 것입니다.
하지만 저는 이 모든 것을 유지하고 관리하는 부담을 공유하는 데 도움을 줄 다른 사람들이 필요합니다. 나와 내 가족의 건강과 행복이 최우선이고 그 다음이 내 경력, 그 다음이 내 친구와 커뮤니티입니다. 이 프로젝트는 더 이상 나에게 가장 중요한 시간 낭비가 될 수 없으며 지속 가능하지도 않고 건강에도 좋지 않습니다. 하지만 이 메시지에서 영감을 받았다면 이상적으로는 공개적으로 연락해 주세요. 처음에는 개인적으로 사용해도 괜찮습니다.
이것이 당신을 흥분시키기를 바랍니다!
나는 스스로를 도울 수 없었고 이에 대한 내 아이디어에 대해 더 많이 썼습니다: doc/lcboapi-proposed.md
이제 그 일을 제쳐두고, 내가 정말로 누구를 위해 이 일을 했는지, 처음에 내가 이 일을 하게 된 동기와 영감이 무엇인지, 즉 배우고 성장할 수 있는 기회와 다른 사람들도 그렇게 하도록 도울 수 있는 기회에 대해 알아볼 수 있습니다. 궁금하신 분들을 위해 이것이 어디로 가는지 살펴볼까요?
호스트 환경에서 직접 앱을 실행할 수 있으며 시스템 종속성에 관한 한 너무 멋진 것은 필요하지 않습니다. 저는 Apple 하드웨어에서 개발합니다. 여러분도 그렇게 한다면 Postgres.app 및 Homebrew를 사용하여 Redis를 설치하는 데 성공할 수 있습니다. 그렇지 않으면 Docker를 사용할 수 있습니다.
다른 플랫폼에 대한 경험이 있는 경우 PR이나 이슈를 작성해 주시면 귀하의 플랫폼을 README에 추가해 드리겠습니다.
또한 여기에 나오는 내용이 이해가 되지 않는다면 이슈를 열어서 프로세스를 보여주기 위해 스크린캐스트를 할 수도 있고, 아니면 그 일을 잘하는 누군가가 그 일을 맡을 수도 있겠죠?
아래에서 설명하는 내용은 컴퓨터에서 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
반복해서 입력하는 것이 지루하다면 쉘 별칭을 살펴보세요.
alias dc=docker-compose
와 같은 별칭 줄을 셸 프로필에 추가한 다음 매번docker-compose
입력하는 대신dc
만 입력하면 됩니다. ✅이를 더욱 개선하기 위해 만들 수 있는 다른 별칭을 생각해 보십시오.
이제 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
) 여기에는 Middleman 사이트가 포함되어 있습니다. lcboapi.com을 방문하면 이것이 표시됩니다. 또한 홈페이지 오른쪽에 "한 번 사용해 보세요"라는 매우 작은(역시 오래된) React 앱이 포함되어 있습니다. 자체 Gemfile과 빌드 스크립트 static/generate
있으며, 실행 시 사이트를 빌드하고 변경 사항을 public
폴더에 동기화합니다. Rails 앱에서 public
폴더는 정적 콘텐츠로 제공됩니다.
이 코드베이스에는 막다른 골목, 기능에 대한 40-60-80% 진행 후 정체된 분기, 실험 등이 많이 있습니다. 항상 그렇듯이 마음에 드는 것을 찾으면? 문제를 제출해 주시면 최대한 빨리 답변해 드리겠습니다.
여기에 막다른 골목을 묶을 수 있다면 좋을 것입니다. 마침내 JSON:API 및 GraphQL을 추가하는 데 매우 관심이 있을 것입니다. 현재 API 응답 디자인은 2008년의 것입니다!!! 어떤면에서는 아무도 그것에 대해 불평하지 않는다는 사실에 다소 놀랐습니다.
내가 구현하지 않은 가장 많이 요청된 기능 1위는 카테고리였습니다. 이 기능은 여기에 있습니다. 왜 출시하지 않았는지 잊어버렸고, 최종적으로 어떤 항목이 있어야 하는지 기억이 나지 않지만, 아마 그게 좋은 첫 번째 기능이 될 것입니다. 처리할 일? 결코 마무리되지 않은 Producers와 Origins도 있습니다.
나는 또한 수년에 걸쳐 다른 저장소와 작은 실험을 많이 가지고 있으며 항상 재고 수준 예측 아이디어에 매료되었습니다. 어딘가에는 특정 제품 재고에 대한 CSV 덤프를 분석하기 위해 Go로 작성된 데이터 세트 덤프 분석 도구가 있습니다. 일정 시간 동안. 관심이 있다면 그 자료도 공개해 드리겠습니다.
지금은 여기에 남겨두고 답변을 기다리겠습니다. 나는 사람들이 보고 싶어하는 방식(스크린캐스트, 인터뷰, 인라인 문서 등)으로 이 지식 기반을 계속해서 추가하고 싶습니다. 확실하지 않은 경우에는 여러분도 똑같이 하시기를 바랍니다. ❤️