
今週の週末、 Clojure Cupが開催されました-48時間のClojureハッカソン。 これは、彼が私たちのチームでどのように進んだかについての比較的長い投稿であり、技術的な詳細などがあります。 さて、ポストの最後で、それなしで、私たちのプロジェクトについてかなり話します。 読むのが面倒な人は、すぐにCodeNotesにアクセスして、Clojure Cupページで投票することさえできます。
作業環境
ハッカソンへの参加には、喜びと勝利への参加という2つの異なる「モード」があります。 最初のケースでは、クールなものを2日間遅延的にコーディングします。 第二に、ハードコアと準備の早期開始で、すべてが少し異なります。 2番目のオプションを選択しました。
チームには4人がいました。私とsi14を含む2人はサンクトペテルブルクに、1人はチュメニ( zloy_alu )に、もう1人はミュンヘンにいます。 しかし、コミュニケーションの問題は発生しませんでした。タスクの分離はほぼ成功し、優れたTrelloサービスと神聖なFlowDockが役に立ちました 。 私の意見では、後者はチーム内の相互作用にとって理想的なサービスです。 自分で判断してください-チャット、ファイル共有、個別のディスカッションスレッド、さまざまなイベント(デプロイ、リポジトリへのプッシュ、trelloでの新しいタスク、Twitterでの言及)に関する通知があります。 すべて次のようになります。

明らかに勝つことを計画していたので、事前に準備を始めました。 特に:
- 選択したライブラリとアプリケーション全体の構造を確認しました(詳細については、以下のClonyを参照)。
- NewRelicのようなサードパーティサービスとの統合テスト済み。
- ブログとTwitterを開始しました。
- 迅速かつ便利に展開する方法を学びました(MakefilesおよびAnsible)。
- サーバーとWebアプリの間にJSON APIのドキュメントを用意しました。これにより、これらの部分を多かれ少なかれ独立して書くことができました。
- 紙上のインターフェイスのスケッチを準備しました。
- ドメインを購入し、SSL証明書を発行しました。
- Webソケットと静的リソースを使用した通常の作業のためにnginxを構成する方法を学びました。
- ベータテスタープールの連絡先を準備しました(ここにファイルがあります-スケジュールに遅れて、11モスクワでのみメールを送信したため、ハッカソンの終了前にレビューを1つしか取得できませんでした)。
技術的な詳細
そして今、ClojureのWeb開発者にとって何が役立つのかを詳しく説明します。
小さなClonyアプリケーションを作成した経験は非常に有用であることが判明しました。 これは、ClojureでフロントエンドWebソケットと通信するhttp-kit (Clojureのhttpサーバーおよびクライアント)およびCompojure (ルーター)を使用する非常に簡単なことです。 Stuart Sierraのワークフローを使用して、開発をより快適にします。アプリケーション(またはその一部)のすべてをnreplから完全に再起動しました。 ハッカソン中に、クローニーでのバックポートを待っているいくつかの改善を行いました。
初日
仮想マシンにデプロイすることを事前に知っていたため、 Ansibleの使用方法を学びました。 彼のおかげで、私たちは競争の開始から4時間後にオンラインになりました-完全に開発された生産構成とテストアプリケーションがありました。 これは、参加者のホスティングを提供するDigitalOceanの問題がなければ、以前に起きていたはずです(参加者は詐欺の疑いでアカウントを禁止しました)。 また、ローカル仮想マシン( Vagrant -super!)も完全に同一の構成で使用していましたが、最終的には全員がそれらにスコアを付け、すぐに運用環境に展開しました。 これは、MariaDBの設定(これらのANSI_QUOTESを気にせず!Postgresをすぐに使用しなければなりませんでした)から始まり、ログをディスクに書き込むのを忘れたという事実で終わる、サーバー上でその場ですぐに変更する必要があるためにも起こりました。 さらに、 NewRelicとかなり完全に統合しました。 彼が私たちを決定的に助けてくれたとは言えませんが、サーバーの応答時間、クライアントによるDOMレンダリング時間、ネットワークの待ち時間、サーバーの空きメモリ量、GC JVM統計など、非常に多くのパラメーターを簡単に見ることができたことで、神経が落ち着きました。 統合用のライブラリは非常に小さいことが判明したため、オープンソースで間違いなく投稿します。
初日は、 clangを取得するために多くの時間を費やしました-Angular.jsとClojureScriptの統合。 わずかなトラブルが多かったため、最終的にはClojureScriptを完全に放棄し、JavaScriptのみに切り替えました。 ClojureScriptは言語よりもはるかに優れていますが、ハッカソンでは、その微妙さの誤解と戦う時間がありませんでした。
すべてを可能な限り正しく実行しようとして、プロジェクトにSQL移行用のライブラリを追加することにしました。 非常に人気のあるLobos移行ライブラリがまったく機能しないことを見つけるのは興味深いことでした。 その結果、新しいものを検索して処理するのに約1時間かかりました。 Ragtimeで停止しました。
その結果、最初の日の終わりには、美しいホームページとリポジトリの半作業リストがありました(プロジェクトの簡単な説明はやや低めです)。 22時から00時の間に、チームは眠りについた(この時点までに、午前4時に寝ていた人はいなかった)。また、日曜日の午前8時に再び集まった。
二日目
日曜日には事態は改善しましたが、かなりの数の問題がありました。
- OAuth認証の一部をやり直す必要がありました。
- ある時点で、GitHubはAPIリクエストの制限を禁止しましたが、これは非常に不快であり、送信するリクエストの数を減らす必要がありました。
- 画像を生成するために、まず純粋なJavaで何かを使用しようとしましたが、最終的にはImageMagickにバインダーを使用しました。 それらの2つがあります:1つはshとパイプを介して動作し、もう1つはJNIを介して動作します。 最初のものは遅くなり(写真あたり30 + ms)、2番目のものを開始することはできませんでした。
- 遅いイメージ生成とGitHubへのリクエストの数の両方で、 core.cacheは私たちを助けました-優れた「コア」Clojureライブラリ。
- サーバー上のイベントを処理するためにcore.asyncを使用するという危険な決定を下しました。 その結果、これは良い解決策であることが判明しました:それを使用するコードの最初の動作バージョンは、チームの誰もそれを使用していなかったという事実にもかかわらず、1時間半で生まれ、実質的に問題はありませんでした。 core.asyncを使用して、コードの任意の場所から特定のユーザーをWebソケットに簡単に書き込むことができ、サーバーの過負荷の場合にリポジトリスキャンを再開する複雑なロジックを作成しました。スキャン要求キューを処理し、キューをオーバーフローするすべてのものを破棄し、メインにタスクがない場合オーバーロード中にスローされたものをベースから選択したキュー。 コードは非常にコンパクトで動作するようです。
- クライアントのバグ。そのうちのいくつかは、残念ながら、ハッカソンの終わりまで修正する時間がありませんでした。
一般的に、2日目は生産的でした。 私たちは第一印象に集中しようとしたので、私たちはささいなことに注意を払いました:独自のドメインへのリダイレクト、美しい「使い方」、メインのクリアテキスト、素敵なデザイン、「ごめん、リポジトリにTODOがありません。バグレポートフォームは次のとおりです。そうではありません。」 もちろん、 Bootstrapを使用して開発をスピードアップしましたが、すべてを可能な限り美しく、「デフォルトではない」ようにしようとしました。 これが審査員から最高の点数を得るのにどれだけ役立つかは、金曜日にわかります。
最も興味深い-それは何ですか?
私たちのプロジェクトについて何も言わないのは奇妙です。

人類はまだ完璧なバグトラッカーを考え出していないようです。 しかし...なぜバグトラッカーが必要なのですか? 私たちのプロジェクトの本質は、あなたの人生から別のバグトラッカーを削除することです。 そして、彼がこのように見えるように、さらに試みました。
def somefun ( ) :
#TODO:@ si14、リリース前にこれを修正してください
真を返す
そして、残りを行います-ユーザーにタスクを作成したという通知をユーザーに送信し、インターフェイスに表示します。また、コミットを監視し、新しいTODO、FIXMEおよびNOTEのコードをスキャンします。 さらに、GitHubリポジトリの美しいイメージを生成して、コードに含まれるTODOの数とその情報へのリンクを示すことができます。 CodeNotesプロジェクトにはまだ必要な機能がすべて備わっていません(さらに、隠すのに十分な厄介なバグがいくつかあります)が、投票が終了すると、すぐに改善を続け、小規模プロジェクトに最適なバグトラッカーにします。
ところで、あなたは私たちに投票し 、アイデア、ハッカソン、Clojure Webプログラミング全般についてあなたが思うことについてコメントにコメントすることができます。