こんにちは、LCBO API へようこそ?
ここで「LCBO API とは何ですか?」と疑問に思われた方には、説明させていただきます。カナダのオンタリオ州では、すべての飲料用アルコールの販売は、オンタリオ州酒類管理委員会 (LCBO) と呼ばれる政府所有の法人を通じて行われ、この法人が州全体でのアルコール飲料の小売と流通を担当しています。 LCBO には多数の小売店と、あらゆる製品、店舗、さらには在庫レベルのカタログをホストする Web サイトがあります。彼らは、フード&ドリンクと呼ばれるレシピ、論説、その他のコンテンツを含む季節のカタログを発行しています。彼らはまた、毎年何十億ドルもの収益を私たちの公的医療制度に貢献しています。考えてみると、これは興味深い状況です。他の場所にも同様のシステムがありますが、私の知る限り、LCBO ほど幅広く奥深いところはありません。さて、これが何であるかわかりましたね、かなりクールですね?
以下の場合は、カナダのオンタリオ州に住んでいない場合でも、これは興味深いかもしれません。
このプロジェクトの全過程を通じて、私は資金援助を受け入れるかどうかで非常に苦労しました。 LCBO API はそれを必要としていた一方で、それが引き起こすであろう複雑さにうんざりしていました。さて、この問題に対する完璧な解決策が見つかりました。
私は現在、血液のがん、具体的にはびまん性大細胞型b細胞リンパ腫の治療中です。このことについては、近いうちに別の場所で詳しく書くつもりですが、この 1 年間、世界中の人々があらゆる方法で私をサポートしてくれて、それが私を変えてくれました。私たちも気にかけていることを示すために、何か大きなことをしたいと思っています。
過去にこのプロジェクトをサポートしたいと思ったことがある方は、LCBO API に代わってハミルトン ヘルス サイエンスに寄付してください。彼らは私の命を救ってくれています。
ハミルトン ヘルス サイエンスに寄付する
私はジュラビンスキーがんセンターで治療を受けていますが、実際には任意のオプションを選択することも、デフォルトのままにすることもできます。金額が少額でも多額でも、寄付すると通知が届きます。合計を追跡するためにリストを作成します。どれくらい集められるか見てみましょう!
最後に、私の職場であるクラウドマークについて特筆したいと思います。彼らはこのすべての間、信じられないほど親切で理解を示してくれました。文字通り、彼らなしでは私はこれを行うことができなかったでしょう。私たちは、高等教育における評価の現状を改善するためにたゆまぬ努力を続けています。教育や学習に関心がある方は、ぜひチェックしてみてください。
2008 年の秋、私は数年の経験を積んだ新卒の Web 開発者でした。私は挑戦と、何らかの評価に飢えていました。当時アプリが流行っていたので、どうしてもアプリを作りたいと思っていました。最初にこの API を構築する必要があるものを構築したいと考えました。私はそのアプリを構築したことがありませんか?
このコードベースを十分に詳しく調べると、フラストレーションの瞬間、行き詰まり、わかりにくい難解な点などに遭遇する可能性があります。その点や、見つかる可能性のある否定的な点に焦点を当てないことを心より願っています。私はもうそのような人間ではありませんし、あなたにもそのような人間になってほしくありません。私はこれに関してはオープンブックです!問題を開いて質問してください。私はできる限り正直かつ敬意を払います。あなたにも同じようにしていただくようお願いします。
私はこのプロジェクトを GNU GPLv3 に基づいてリリースしています。これがこのようなプロジェクトにとって最も公平で責任ある選択肢だと思います。違うと思われる場合は、問題を開いてください。それについて公開で話し合うことができます。謹んでお願いしますが、ブランド名やデザインを再利用しないでください。ドキュメントの再利用には問題ありませんが、このアプリの独自のサイロ化バージョンを展開する場合は、スタイル、アイデンティティ、およびブランドを変更する必要があります。
すべてを 1 つのスタイル、1 か所で実行しようとするモノリシック アプリケーションの代わりに、もっと広い視野で考えてみたらどうでしょうか?クローラーが再び別個のプロジェクトであり、データの収集と正規化を担当し、他の人が希望するプラットフォームで API ノードを構築でき、それらのノードがデータプロバイダーに登録され、利用可能になった更新データを受け取り、そのデータをあらゆるタイプのユーザー。
数十の同様の API サーバーが同じことをしようとして LCBO.com のリソースを争う代わりに、このデータの所有権を争うのではなく、このデータの価値を構築することに努力を集中することができます。他の専門分野を巻き込んで、当たり前のことを超えた新たな価値を生み出し、クラフトビールやワインのコミュニティを巻き込み、これを発展させて、オンタリオ州だけよりも大きくすることができるでしょう。
そのようなことがどれほど実現可能かはわかりませんが、他の人が興味を持っているのであれば、ぜひこのような議論をしたいと思っています。
また、API ノードにアクセスするために企業ユーザーに妥当な料金を請求することも検討すべきかもしれません。そのお金は、物事を持続可能に保つためのホスティング費用の資金として使用でき、お酒を飲めない人のためのサポート プログラムの資金としても使用できます。お酒を飲みたくない人、あるいは飲酒量を減らしたい人は、コミュニティに還元し、実際に変化をもたらしたいと考えています。
しかし、これらすべてを維持し管理する重荷を分かち合ってくれる他の人が必要です。私と私の家族の健康と幸福が最優先事項であり、次に私のキャリア、そして私の友人とコミュニティが続きます。このプロジェクトはもう私にとって一番の時間の無駄にはなりえませんし、私にとって持続可能ではなく、私にとって健康的でもありません。ただし、このメッセージに触発された場合は、理想的には公開で、でも最初はプライベートでも構いませんので、私に連絡してください。
これがあなたを興奮させることを願っています!
私は自分自身を助けることができなかったので、これについて自分のアイデアを詳しく書きました: doc/lcboapi-proused.md
さて、それは邪魔にならないので、私が本当に誰のためにこれをしたのか、そしてそもそも私がこれをすることに興奮し、インスピレーションを与えた理由、つまり学び、成長し、他の人が同じことをするのを助ける機会に入ることができます。興味のある方は、これがどうなるか見てみましょう。
おそらくアプリはホスト環境で直接実行できます。システムの依存関係に関する限り、それほど複雑なものは必要ありません。私は Apple ハードウェアで開発していますが、あなたもそうするなら、Postgres.app と Redis のインストールに Homebrew を使用して成功するかもしれません。それ以外の場合は、Docker を使用できます。
別のプラットフォームの使用経験がある場合は、PR または問題を作成してください。ご使用のプラットフォームを README に追加する作業を行います。
また、ここに続く内容が意味をなさない場合は、問題を開いてください。スクリーンキャストを行ってプロセスをデモンストレーションすることもできます。あるいは、それが得意な誰かが引き受けてくれるかもしれません。
以下で説明することは、コンピューター上で LCBO API を実行するための開発環境をセットアップする 1 つの方法にすぎません。他の人に改善点 (開発データベースをブートストラップするためのエントリポイント スクリプトなど、多くの余地があります) や、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 にデータベース スキーマを作成し、2 行目はデータベース ダンプを開発データベースにロードします。進行状況バーには、データベースにパイプされたデータの量が表示され、完了するとインデックスが構築されます。かなりの量のデータが必要になるため、マシンによっては時間がかかる場合があります。その後、アプリを再度起動できます。
docker-compose up
この時点で、アーカイブと抽出された SQL ファイルをtmp
ディレクトリから安全に削除することもできます。
docker-compose
何度も入力するのが面倒だと感じる場合は、シェル エイリアスを調べてください。
alias dc=docker-compose
のようなエイリアス行をシェル プロファイルに追加すると、毎回docker-compose
と入力する必要がなく、dc
と入力するだけで済みます。 ✅これをさらに改善するために作成できる他のエイリアスを考えてみませんか?
次に、http://localhost:3000/products/438457 に移動します。
ブーム。コンピューター上で LCBO API が実行されています。 ? ? ?
アプリでの作業が完了したら、 Ctrl+C
押してすべてをシャットダウンします。次回再び作業する場合は、 docker-compose up
実行すれば準備完了です。
新しい gem をGemfile
に追加する場合は、パッケージを再インストールし、依存関係を更新する必要があります。 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 の一部であり、すべてのことを可能にします。複雑な Web サイト用のクローラーは構築と保守が困難です。 LCBO API の最初のバージョンにはクローラー用の完全なテスト スイートが含まれていましたが、何年も前にすべてが変わったとき、私はそのコードベースを諦め、このコードベースでできる限り高速に何かを構築することにしました。
クローラー ロジックはlib/crawler.rb
にあり、そこから、LCBO Web サイトの完全なクロールを含む、連続して発生するさまざまなタスクがすべて表示されます。
パーサー ロジックはlib/lcbo.rb
とlib/lcbo/*
内のさまざまなファイルすべてにあります。これには、発生する必要があるさまざまなリクエストすべてと、それらのリクエストからのデータを構造化データに変換するコードが含まれます。最終的にはデータベースに保存される可能性があります。
リクエストを連続して実行するようにクローラーを設計しました。これは、1 つの Web サイトをクロールする場合に非常に優れたアプローチです。可能であれば常に最善のルートを選択する人にとってはシンプルであり、丁寧です。 n 個のAWS Lambda ジョブを起動して、LCBO.com 上のすべてのページを数秒でクロールすることはできますが、それは失礼ですし、おそらく彼らの Web サイトを一時的に 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 年のものです。ある意味、誰もそれについて文句を言わないことに私はある意味驚いています。
私が実装したことのない最も要望の多かった機能はカテゴリでした。それはここにあるようなものです。出荷しなかった理由は忘れました。最終的にどのようなものを配置する必要があったのか覚えていません。しかし、最初はそれが良いかもしれません取り組むべきことは?また、完全にまとめられることのなかったプロデューサーやオリジンズもあります。
他にもたくさんのリポジトリと、何年にもわたって行った小さな実験があります。私は常に在庫レベルの予測というアイデアに魅了されていました。特定の製品在庫の CSV ダンプを分析するための、Go で書かれたデータセット ダンプ分析ツールがどこかにありました。一定の時間にわたって。興味があればそういったものも公開していきたいと思います。
とりあえずここに残しておきますので、ご連絡お待ちしております。私は、人々が見たいあらゆる方法 (スクリーンキャスト、インタビュー、インライン ドキュメントなど) でこの知識ベースに追加し続けたいと思っています。また、あなたにも同じようにしてほしいです。よくわからない場合は、質問してください。 ❤️