CMSおよびメディア発行サイト用の一連のRubyライブラリ





CMSメディア出版物を開発するための一連のライブラリは、実際には他のアプリケーションと変わりません。 TapeとVedomostiのサンプルアプリケーションを使用して、各ライブラリの選択についてコメントすることにしました。 説明は、各gemのディスカッション形式です。



前のレビュー記事: Media Editionの再起動:概要



CMS Tapes.ru



テープについて書かれたものは2014年4月まで関連がありました。



gem 'unicorn'
      
      





foxweb :Pumaでない理由を説明する必要があります。

7even :存在しません。

zaur :これは私の保守的なアプローチで、Puma Webサーバーの可能性を解き放つ自由を人々に与えません。 複数のプロセスが実行されている場合、クラシックWebサーバーモデルを使用することを好みます。 また、ハンドラーが従来のインタープリターの異なるスレッドで要求を競争的に処理するモデルは好きではありません。 MRIインタープリターのスレッドセーフに対する信頼の欠如と、jRubyまたはRubiniusに切り替えることを誰もが嫌がり、選択が事前に決定されました。

7even :ルビーに切り替える準備ができました。

foxweb :さて、はい。

zaur7even 、最近では異なる意見がありました。

7evenルビニウスは急速に発展しています。 数ヶ月前、彼は%i(foo bar)



という形式の構造に落ちました。



 gem 'newrelic_rpm' gem 'newrelic-redis'
      
      





foxweb :RedisのRailsアプリケーションとメッセージキューは、NewRelicサービスの常時監視の下で機能しました。 財政が許せば、すべての重要なプロジェクトで間違いなくこのツールを使用する必要があります。 NewRelicは、数時間と就業日を節約し、開発者の静かな眠りを助け、解雇や怪我からさえ救助します。 編集スタッフの誰かが「何も動作しません!」と叫ぶ前に、どのサーバーで、どのような理由で動作しなかったのか、誰が壊れたのか、誰が修理したのか、誰が切断されるのかをすでに知っていました。 HTMLページにいくつかのグラフを配置し、壁の大きなモニターで1日24時間回転させました。 誰もが常に「サイトの内容」を知っていました。 1人の開発者の寄せ集めは、チーム全体で見られます。 NewRelicは、「ドロップ-上昇」する反応時間を可能な限り短縮します。 オンラインメディアの場合、これは特に重要です。

zaur :モジュールをセットアップするときは、テスト環境と開発環境を除外することを忘れないでください。 設定ファイルで行われます。







 gem 'rails', '~> 3.2'
      
      





foxweb :これはRailsです。

zaur :それで、古いレール。 彼らは新しいものに切り替えませんでした、誰もが「すべてが壊れる」ことを恐れていました。

foxweb :より正確には、当時のほとんどの宝石はRails 4に適合していませんでした。



 gem 'faye'
      
      





foxweb :Fayeは、WebSockets pub / subの単純な実装であり、同じサイトに座っている異なるユーザー間でメッセージを交換することに焦点を当てています。 最初は、これはWebソケットでの非常に便利なチャットです。 私たちのプロジェクトでは、フェイは管理エリアの編集者間でメッセージを送受信しました。 誰かが新しいテキストを保存し、誰かが10枚の写真をアップロードしました-受信したメッセージ。 しばらくすると、サーバーは写真が生成および公開されたことを報告します。この記事に現在関与している全員がメッセージを受信しました。 これはすべて編集者にとって非常に便利であり、相互作用のレベルを高め、編集者全体の作業を加速しました。 Skypeで「みんな、このニュースに触れないで、今すぐ保存します!」または「ギャラリーに行って、作成しました!」と書く必要はありませんでした。 ジャーナリングおよびバージョニングシステム、差分比較サービスとの組み合わせにより、編集チームは同じ資料で作業することが非常に便利になりました。 実装する時間がなかったのは、通知システムのロールとアクセスレベルによる分離だけです。 たとえば、編集長が特別なページですべてを見ることができ、どこでも「シャイニング」する必要がなく、研修生が特定の種類のメッセージを受信できるようにすることは興味深いでしょう。 ただし、フェイを横から使用できないようにするために多くの作業が行われました。 何でも起こります。 たとえば、Redisに保存されたCookieおよびトークンを介した承認は、ある程度実装されました。 トークンは、特定の編集者のアカウントに関連付けられていました。 これにより、編集者は作成者に代わって「Vasily Petrovが文書を保存した」かのようにメッセージを見ることができました。 基本バージョンでは、fayeはユーザー認証とメッセージ保護を一切扱わず、Rails環境とはまったく接続しません。

ksavelyev :ええ、実際にはそれほど単純ではありません。フェイは誰にとっても良いのですが、スケールしません。



 gem 'faye-redis'
      
      





foxweb :名前が示すように、pub / subメッセージの中間ストレージとしてRedisを使用できるfayeのプラグイン。 トークンの承認と保管にのみ使用しました(そうです)。

zaur :...そして、ResqueやCloudy(ビデオを操作するための自作のクラフト)などのバックグラウンドプロセスのキューを保存します。



 gem 'thin'
      
      





foxweb :ThinはFayeのサーバーです。

zaur :お気に入りのプーマではありません。

7even :ここで、 zaurは非同期サーバーを気にしません:)

ksavelyev :Zaurには選択の余地がありません。そうでなければFayeは動作しません;)



 gem 'pg'
      
      





foxweb :MySQLからPostgresへの素晴らしい移行。 彼らはgitで別のブランチを作成し、そこですべてを微調整し、テストし、ステージングしました。 最初に、構造をSQLファイルにダンプしました。 当然、Postgresへの直接インポートには適さないことが判明しました。 たとえば、ファイル全体で引用符を置き換える必要がありましたが、いくつかの問題は手動で修正されました。 7evenは、そのようなプロジェクトのMySQLがなぜ悪いのかについて素晴らしい物語を書くと思います。

7even :MySQLにはhstoreがありません:)実際、真剣に、RubyコミュニティのPostgresははるかに人気があり、その結果、問題の解決策をグーグルで検索するのが簡単です。 さらに、カスタムデータ型(配列、json、同じhstore)により、作業が楽になります。 Psql(コンソールクライアント)の方がはるかに便利です(少なくとも少し習得するには)。

zaur :しかし、 ksavelyevは、MongoDBに完全に切り替える必要があると考えています。



 gem 'postgres_ext' gem 'activerecord-postgres-json', github: 'michaelbn/activerecord-postgres-json' gem 'activerecord-postgres-hstore'
      
      





zaur :MySQLからPostgreSQLに切り替えるとき、レールは3番目のバージョンでした。 これらのライブラリを使用して、PostgreSQL拡張をサポートしました。



 gem 'marionette-rails'
      
      





ksavelyev :MarionetteライブラリーをAsset Pipeliteに追加します。 Marionetteは、Bacbonに別のレベルの抽象化を追加し、モジュール、アプリケーションの概念を導入し、コレクションの視覚的表現での作業を便利にします。 ベーコンからほとんどその角を作ります。

zaur :角度は最後まで無視されました。



 gem 'haml_assets' gem 'dust_assets' gem 'haml_coffee_assets'
      
      





ksavelyev :haml / dustテンプレートのサポートを追加し、指定された構文でテンプレートを記述し、Asset Pipeline内で使用できるようにします。その結果、JSアプリケーション内で、もともとhaml / dustで記述されたコンパイル済みのすぐに使用可能なテンプレートを含む変数を取得します。



 gem 'turbo-sprockets-rails3'
      
      





ksavelyev :rakeアセットの実行を高速化します。変更されたアセットのみをコンパイルおよびマージしてプリコンパイルし、古いアセットを削除するための追加機能が含まれます。



 gem 'terminal-notifier-guard'
      
      





foxweb :システムのポップアップ通知ユーティリティへのGemインターフェイス。 LinuxおよびOS Xでのテスト中に、ポップアップステータスメッセージが表示されます-成功、失敗。 便利:テストは単独で実行されます。この時点で別のウィンドウに切り替えることができ、ポップアップ通知によりテストの完了が通知されます。



 gem 'guard' gem 'guard-rspec' gem 'guard-zeus'
      
      





foxweb :Springは、バックグラウンドコードのプリロードのためにRails 4.1で導入されました。 Rails 3では、同じ目的でZeusを使用する必要がありました。 開発者がファイルを変更すると、Zeusは直ちにファイルを再起動し、それに関連するRSpecテストを実行します。 Guardは、プロジェクトファイルの変更に関連するイベントを追跡するツールとして多くの人に知られています。 guard-rspec



は、ファイルを保存するときにテストを実行するだけです。

zaur :あれ、2番目のほうが不便だった。 必要なテストを手で直接実行する方が簡単です。 そして、ルビーのパフォーマンスの悪さに対する堅実な言い訳です。

7even :「ルビーの低パフォーマンス」ではなく、鉄道アプリケーションの開始が遅いことです。 当然、数秒で起動した場合、これらの松葉杖は必要ありません。

foxweb :14秒で470スペックで十分高速です。







 gem 'rspec-rails', '~> 2.14'
      
      





foxweb :以前はTestUnitを使用していたようですが、その後7evenが提供されたため、すぐにRSpecに切り替えました。 これにより、テストプロセスが新しいレベルになりました。 完全なTDDがありました。 その後、新しいコードがほとんどなかったため、テストの作成を停止しました。一部のコードはテストでカバーするのが非常に困難または非実用的でした。

zaur :議論の余地のある決定で、大多数を獲得しました。 そして、この新しいレベルは「nafigテスト」と呼ばれます。



 gem 'ffaker'
      
      





foxweb :新しいエンティティを作成する場合、ランダムなデータ(名前、姓、電子メール、位置など)をテストして入力する必要がありました。 デバッグの過程で、通常のプログラマは1〜3エントリを作成できますが、その後退屈し、コードは未開発のままです。 実際、このgemのクラスを使用すると、非常に多様で、最も重要なこととして、信頼できる情報を生成できます。 7evenはロシアの名前と姓のジェネレーターを追加することでそれに貢献しました。 したがって、実稼働環境に展開する前に、さまざまなデータセットのパフォーマンスをデバッグできました。 このgemの使用はテストに関連付けられていません。 たとえば、テストの作成時には、標準のレール固定具が使用されました。



 gem 'quiet_assets'
      
      





foxweb :サイレントアセット?

ksavelyev :まったく、静かです。 レールアプリケーションが開発者のマシンで開発モードでローカルに実行されると、Webサーバーは静的自身を提供します。 本番環境では、Nginxがこれを行い、アセットのログを個別に管理します。 開発では、Webサーバーがアセットのバンドルに提供した情報は通常、誰も必要としません。このgemは、静的ファイルがブラウザーに提供されたガベージメッセージをブロックします。 必要に応じて、そのようなgemがない場合、grepを使用してログをいつでもフィルタリングできます。たとえば、 tail -f development.log | grep SELECT



tail -f development.log | grep SELECT



は、ログ内のSQLクエリの出現を監視します。



 gem 'colorize'
      
      





foxweb :コンソールにデータを出力するとき(インポートログまたは何らかのrakeタスクなど)、コンソールメソッドを使用して色付きの線を表示でき、ログの一般的な読みやすさが向上しました。



 gem 'rails-erd'
      
      





foxweb :ある時点で、エンティティとそれらの間の関係の数が非常に増えたため、それらを覚えて新しい従業員に知識を伝達することが難しくなりました。 このgemを使用すると、リンクとさまざまなオプションを含むモデルの図をいくつかのアクションで生成できました。 その後、図はA3の大きなシートに印刷され、よく考えられました。

zaur :それから彼らはそれを投げてボードにペイントしました。



 gem 'ruby_parser'
      
      





foxweb :誰かがRubyの解析を試していました。 おそらく、独自のファイル注釈エンジン用です。

7even :私ではありません。



 gem 'capistrano'
      
      





foxweb :Capistranoでは、Minaが登場するまではすべて順調でした。 Capistranoはゆっくりと動作しましたが、マルチサーバー展開を行うことができました。 ミーナは高速で、彼女の出力はずっと読みやすくなっています。 CMSとフロントエンドをMinaに転送することはできませんでしたが、Minaの助けを借りて特別なプロジェクトと、たとえばDom.lenta.ruが最初に展開されました。 マルチサーバー展開は、ホストのリストを単純なサイクルを使用して非常に単純に「エミュレート」されました(せいぜい4つしかなかったようです)。 つまり、1回の実行で4つのホストに4つのデプロイメントのみが実行されます。

zaur :現在、どちらも展開に使用されていません。 ansibleを使用して制御回路に切り替えました。 サービスを中断せずに展開すると、HAProxyが提供されます。

7even :鉱山の5倍遅くなりましたが、停止時間はゼロになりました。

foxweb :秘密をお伝えします。現在の設定ではダウンタイムさえゼロではありません;)



 gem 'better_errors' gem 'binding_of_caller'
      
      







ksavelyev :better_errorsは、500番目のエラーの標準情報画面を大幅に改善します。 コールスタックブラウザとインタラクティブなrubyコンソールが表示され、オブジェクトのステータスを表示できます。

foxweb :ブラウザのコンソールなしでレールアプリケーションをデバッグする方法がわかりません。

7even :ブラウザではなく、手動でリンクをテストして、テストを作成する必要があります。

ksavelyev :フロントエンドがバックエンドでテストを作成し、バックエンドがシャドウを作成してフォントをページに統合すると、世界は間違いなく良くなります。

foxweb :たとえば、通常のコンソールでレイアウトエラーをキャッチすることが不可能な場合を意味します。



 gem 'jazz_hands'
      
      





7evenこじ開け 、awesome_print、およびいくつかのこじ開けパンのセット。

foxweb :標準のレールコンソールのコンソールに、美しい色付け、構文の強調表示、出力の書式設定を追加します。 多くの場合、稼働中のサーバーのコンソールに登らなければならなかったため、本番環境に残されました。



 gem 'active_record-annotate'
      
      





7even :モデルに注釈を付けるために、最初はannotate_modelsを使用していましたが、ある時点でPostgreSQLの新しいデータ型に分解し始めました-そして、独自の実装を記述することにしました。

foxweb :決めた、書いた。

7evenGithub



 gem 'rabl' gem 'jbuilder' gem 'gon'
      
      





zaur :シリアル化のために、 Rablの使用を開始しました。 決定が非常に遅い。 徐々にJBuilderに切り替え始めました。 そして、HTML生成の段階でJSONをページに転送するために、彼らはGonを使用しました。



 gem 'fast_seeder'
      
      





foxwebFfakerと同じカテゴリのものですが、CSVファイルのデータをソースとして使用できます。



 gem 'oj'
      
      





7even :最速のJSONパーサー。

foxweb :Peterはモスクワよりも優れています。 何がいいですか? モスクワより。



 gem 'slim'
      
      





foxweb :最初はHamlでしたが、Slimは読み書きが簡単であるだけでなく、レンダリングも高速であることがわかりました。 プロジェクト全体でHamlをSlimに置き換えるには、たとえばhaml2slimを使用できます。



 gem 'russian'
      
      





foxweb :日付と標準の鉄道メッセージのロシア化の有名な宝石。



 gem 'whenever', require: false
      
      





foxweb :Cronifix-Rubyでクラウンクラウンを管理するためのライブラリ。 1日1回、ニュースで何かが起こりました。



 gem 'redcarpet'
      
      





foxweb :Markdownを操作するための逸品ですが、どこで使用したのか誰も覚えていません。



 gem 'kaminari'
      
      





foxweb :Paginator-大きなリストをページ(1,2,3 ... 100)に分割します。



 gem 'truncate_html'
      
      





ksavelyev :母の怠inessは 、1つの関数からgemファイルにgemを追加します。 この場合、正規表現を使用してHTMLを正しく食い止めるのは面倒でした。

foxweb :それについては知りませんでした。



 gem 'devise' gem 'devise-encryptable'
      
      





zaur :サイトで承認を作成するためのジャンルの古典。



 gem 'mini_magick'
      
      





foxweb :ImageMagickの宝石。



 gem 'mimemagic'
      
      





foxweb :ダウンロードされるコンテンツのタイプを決定するための宝石。



 gem 'foreman'
      
      





foxweb :開発者向けのシンプルなプロセスマネージャー。 大規模なプロジェクトで作業している場合、多くの小さなサービスを実行する必要があります。 Foremanは、必要なすべてを1つのコマンドで起動します。 この例では、これらはRails、Faye、テスト、公開、および画像処理のキューサービスです。

7even :Foremanでテストを実行すると、出力が非常に読みにくくなるため、Procfileからすぐにそれらを見つけました。

foxweb :覚えていましたが、Fayeメッセージやアプリケーションログなど、テストとともにすべてが一般的な出力になったようです。



 gem 'faraday'
      
      





7even :Faradayは、外部ネットワークリソースにアクセスするために不可欠なライブラリです。 ミドルウェアシステム(Rackに類似)のおかげで、リクエストとレスポンスの両方のすべての変換を一度設定できます。たとえば、リクエストに送信する前にOAuth認証ヘッダーを追加したり、レスポンスJSONを解析してHashie :: Mashでラップしたりできます。

foxweb :「外部ネットワークリソース」-古いバージョンのサイトへの通常の HTTP要求。

7even :わかりました、ネットワークリソースに。 この場合、サイトの古いバージョンですが、さまざまな状況でFaradayを使用しました-APIとHTML-kiの両方がありました。



 gem 'faraday_middleware'
      
      





7even :このgemにはファラデーに役立つ多くのミドルウェアがあります。

foxweb :これは、たとえばJSONですか?

7even :そして、例えば、 mashify



 gem 'hashie'
      
      





7even :Hashie-ハッシュ拡張のコレクション。 Hashie :: Mash-要素へのアクセスがキーにアクセスするのではなく、同じ名前のメソッドの呼び出しとしてハッシュのバリエーションを使用しました(たとえば、 user[:name]



ではなくuser.name



)。 残念ながら、将来この宝石は悪用され、モデルの代替品として使用されました。

foxwebレイアウトデザイナーは新しい形式を気に入っており、「ドット表記」と呼びました。

7even :だから私はこれについて話している。



 gem 'nokogiri'
      
      





foxweb :有名なXML / HTML解析ライブラリ。 古いアーカイブの解析に積極的に使用されます。 インポートプロセス中にこれを使用して、古いリンク、画像タグを置き換え、無関係なコード、ゴミなどを削除しました。 閉じられていないタグも閉じているようです。



 gem 'eventmachine' gem 'em-synchrony' gem 'em-hiredis'
      
      





7even :ビデオを処理するために、サードパーティのサービスE **** ******* mが使用され、その相互作用はREST APIを介して行われました。 デーモンが私たちの側で働​​き、大根のキューを介して、エディターによってロードされたビデオファイルへのパスを取得し、それをE ****サーバーに送信し、別のRedisキューに転送し、5分ごとにサーバーをポーリングしました-処理がE ***側にあったとき*が完了し、デーモンは完成したファイルを送り出しました。 これらのプロセスはすべて並行して実行する必要があるため、デーモンはEventMachineで作成されました。

zaur :マットはアスタリスクで塗りつぶされていません。



 gem 'streamio-ffmpeg'
      
      





7even :ffmpegのこのラッパーにより、ビデオファイルの幅、高さ、ビットレート、継続時間、およびその他のメタデータを取得できます。

foxweb :このデータは、サイトのページにビデオコンテンツを表示するために使用されました。



 gem 'ruby-progressbar'
      
      





foxweb :コンソールの進行状況バーの簡単な実装。 古いデータベースから新しい形式にデータをインポートするときに使用されます。 500,000以上の資料があなたを待っているとき、プログレスバーはあなたの時間を計画し、その過程で瞑想するのに役立ちます。 クラスは非常に単純です。 入力では、サイクルの最終番号、すべての種類のビュー設定などのパラメーターが設定されます。 撤回するとき、彼自身が興味、時間を計算し、カウンターをひねり、バーを動かし、一般に、OSの通常のプログレスバーが行うすべてを行います。 編集長に古いデータをインポートするのに3日かかることを通知することは貴重です。



 gem 'version'
      
      





foxweb :リクエストに応じてVERSIONファイルのバージョン番号をインクリメントし、Gitのコミットに対応するタグを付けるギミックガジェット 。 プレイして忘れました。



 gem 'environment'
      
      





zaur :異なる環境に設定を配布するための自転車の1つ。そのうち3つ以上ありました。 設計エラー、計算。

7even :忘却に沈んだ。



 gem 'settings'
      
      





7even :configatronとrails_configの両方が、異なる時間にアプリケーション設定を保存するために使用されました。 しかし、どこかでgemがRailsコンテキストの外で機能しなかった-イベントマシン上のFayeとデーモンから設定にアクセスする能力を奪われた-しかし、他のどこかに他の問題があった。 したがって、結果として、独自の実装が作成されました。 現在、 Githubで入手できます。



 gem 'bluepill'
      
      





7even :すべてが単純です:監視サービス。

foxweb :多くの場合、クラッシュしたサービスまたはハングしたサービスを実稼働環境で直接再起動する必要がありました。 その後、疲れてBluepillを入れました。 Foremanと同様、サーバーのみ。

zaur :サービスのひどい監視。 しかし、他の人は良くありませんでした。 PIDを変更できるプロセスに従うことが必要でした。 同時に、これを行うことができる人は多くありませんでした。 ゼロダウンタイム再起動時のWebサーバーのプロセスを変更しました。 たとえば、展開中、アプリケーションの円滑な運用のために、彼らはそのような素晴らしいUnicorn機能を使用しました。



 gem 'diffy'
      
      





foxweb :非常に便利な編集ツール。 ウィキペディアのように、テキスト編集の履歴を見ることができます。 当然、比較するものを得るために、バージョン履歴を保存する必要があります。 彼女はすでに私たちのために働いており、そのような器具を固定するのに数時間かかりました。 .

zaur : , . - , RSS . , , .

ksegoh : .







zaur : . , . , . , . , .



 gem 'roo'
      
      





foxweb:Excelスプレッドシートからデータを抽出するための宝石。編集者やコンテンツプロバイダーが、競技会や参加者に関するデータを表形式で提供したオリンピックの際に役立ちました。テーブルを操作するためのWebインターフェースを大騒ぎする時間も欲求もありませんでした。



 gem 'net-scp'
      
      





foxweb:また、「Olympic」gemは、ファイルサーバーからSSHでこれらのまさにテーブルをピックアップする機能を提供しました。



 gem 'resque' gem 'resque-web' gem 'resque-pool'
      
      





zaur : . ImageMagick. ( ) Sidekiq ( ). , , , . , . Resque, ImageMagick. .

foxweb : , . , JPEG , , PNG , , ImageMagick.

zaur : . “” . – . , , HTTP …







 gem 'ar_after_transaction'
      
      





zaur : , .

ksavelyev : ? .



API-



 gem 'rails-api'
      
      





7even : API, JSON, , rails-api.



 gem 'active_model_serializers'
      
      





7even : rabl jbuilder JSON rails-api, .



 gem 'awesome_pry'
      
      





7even : jazz_hands Ruby (, , - ), — -, pry awesome_print.



 gem 'ice_nine', require: %w(ice_nine ice_nine/core_ext/object)
      
      





7even : . , #freeze



; #freeze



— , . #deep_freeze



.



 gem 'highline'
      
      





7even : - API-, highline.



 gem 'rack-cors'
      
      





7even : CORS-.



 gem 'database_cleaner'
      
      





7even : , database_cleaner.

zaur : , rake task . - , pow . , , , .



 gem 'guard-yard'
      
      





7even : guard, YARD- .



 gem 'apiaryio'
      
      





7even : API apiary.io, HTML .



 group :development do gem 'puma' end
      
      





foxweb : Puma, production - Unicorn.



 group :production do gem 'unicorn' end
      
      





foxweb : Unicorn, development - Puma.



CMS



 source 'https://rubygems.org' source 'https://rails-assets.org'
      
      





ksavelyev : rails-assets.org . , rails-assets github . , , bower-. - gem 'rails-assets-BOWER_PACKAGE_NAME'



. JS/CSS Asset Pipeline , .



 gem 'puma' gem 'unicorn', group: :production
      
      





zaur : , .







 gem 'compass-rails'
      
      





ksavelyev : , , . . — SASS/SCSS. , , CSS, , , , . , .



 gem 'rails-assets-angular' gem 'rails-assets-angular-cookies' gem 'rails-assets-angular-animate' gem 'rails-assets-angular-sanitize' gem 'rails-assets-angular-ui-router' gem 'rails-assets-angular-promise-tracker' gem 'rails-assets-angular-loading-bar' gem 'rails-assets-restangular' gem 'rails-assets-angular-contenteditable' gem 'rails-assets-angular-ui-ace' gem 'rails-assets-angular-bootstrap-colorpicker' gem 'rails-assets-ng-sortable'
      
      





ksavelyev : bower-, rails-assets, .



:




All Articles