クラデュラの戊いたたは䜜戊戊争マグネット

Sanya ingspree 、Sergey Joes 、Roma rofhずずもにClojure Cup 2013に参加したした。 おそらく、あなたはカットを芋たかもしれたせんし、kloskurscriptずリアクティブプログラミングに぀いおのサニによる完党なプレれンテヌションを芋たかもしれたせん。 そこで、これらの技術を詊しおみる機䌚が生たれたした。



競争の䞻題は、ClojureたたはClojureScriptを䜿甚しお48時間以内に䜕かを提出するこずです。 さたざたなオプションの䞭で、特に既存のアプリケヌションはすべお、Flashで曞かれたむンタヌフェヌス、さらに悪いこずにSilverlight、たたは他の方法で嚯楜を台無しにするむンタヌフェヌスによっお砎壊されるため、ブラりザヌのRiskを削枛するこずが決定されたした。 りォヌマグネットずいう良い名前をたずめお思い぀いた。



よく考えるこずなく、共通のコヌドを䜿甚しお、ClojureでサヌバヌずClojureScriptでクラむアントの䞡方を䜜成するこずにしたした。 4人の参加者のうち、少なくずも断面で曞く経隓があったのはSaniのみで、残りは4clojureで数十個の問題を解決した経隓しかありたせんでした 。

サヌバヌ



サヌバヌ偎に぀いおはあたり語りたせん。競争の党期間を通じお、サヌバヌ偎に䞀床も觊れたこずはありたせん。 デヌタベヌスずしお、2぀のオプションから遞択したした。



Clojureず「デヌタベヌス」ずいう単語を組み合わせるずきに最初に頭に浮かぶのは、 Datomicです。 詊しおみるのは非垞に興味深いですが、私たちの誰も、数時間もしないで、アトミックの経隓がたったくありたせんでした。たた、プロゞェクトの別のたったく新しいコンセプトがむニシアチブを台無しにし、成功したせん。



そのため、ここ数幎で最もファッショナブルなデヌタベヌスであるPostgreSQLを遞択したした。



圌らはsi14のクロヌニヌをワヌクピヌスずしお䜿甚しようずしたしたが、私たちにずっお難しすぎるこずがわかりたした。 開始から半日埌、圌らはクロヌンなしで新しいリポゞトリを䜜成し、そこですべおの䜜業を迅速に転送したした。



サヌバヌで䜿甚したラむブラリ、compojure、ring、korma、friend、cheshire、http-kitをリストしたす。 私の耳からは、船尟に぀いお䞍快なコメントを聞いたので、セルゲむはこの䞻題に関する他のすべおの詳现を圌のブログで説明するこずを玄束したした。



お客様



クラむアントで䜿甚するテクノロゞヌを遞択したす。 新しくできたcore.asyncがありたすが、すべおのチュヌトリアルずマニュアルがデヌタを管理するのがいかに玠晎らしいかを曞いおいるずいう事実のために消え、 セレクタヌによっおDOMにOMられたす。 これは欠陥のある抂念であるずいう意芋がありたすが、HTMLがむンタヌフェヌスを構築する方法であるこずを受け入れなければなりたせん。 そしお、セレクタヌに参加する堎合、私たちはそれず同じように、その偎で䜜業しおいたす。むンタヌフェヌスの構造が倉曎されたため、これらのセレクタヌを非垞に慎重に退屈に芋なければなりたせん。



ClojureScript甚の栌奜良い反応ラむブラリがありたす- ゞャベリンずホップロンの束です。 抂念的な芳点からは優れおいたすが、最適化には誰も関䞎しおいないため、非垞に遅くなりたす。最も単玔なTodoの䟋は 、デスクトップFirefoxでも顕著に遅くなりたす。 より耇雑なアプリケヌションの開発は、むンタヌフェヌスの絶え間ないブレヌキのために痛みに倉わり、圌らは拒吊するこずにしたした。



最新のプロゞェクトでは、SanyaずRomaはFacebook Reactをコヌヒヌスクリプトず組み合わせお䜿甚​​しおおり、圌らは本圓に気に入っおいたす。 圌らは圌を連れお行きたした。 競争が始たる前の金曜日に、私はReactを少しず぀扱い始め、圌のためにバむンディングラむブラリを曞き始めたした。 最初のバヌゞョンは、土曜日に午埌1時に完成したした。



これは、Reactの倖芳です。



var HelloMessage = React.createClass({ displayName: 'HelloMessage', componentWillMount: function() { ... }, render: function() { return <div class="smth">{'Hello ' + this.props.name}</div>; } });
      
      







このXMLに䌌た構文は䟿利であり、javascriptで理解できたす。 しかし、Clojureに統合するこずすら考えおいたせんでした。 しゃっくり構文に觊発されお、このオプションを䜜成したした。



 (defr HelloMessage :component-will-mount (fn [] ...) [this props state] [:div.smth (str "Hello " (:name props))])
      
      





スクリプトずリアクションの亀差点でいく぀かの問題が発生したした。 たずえば、最初にClojureScript'ovyeデヌタ構造を状態ずしお盎接䜿甚しようずしたしたが、プロトタむプを転送せずに自分自身の内郚での反応が浅いコピヌを䜜成し、すべおが壊れたした。 束葉杖ずしお、圌らはstate.state



フィヌルドに私たちの状態を远加し始めたした。



もちろん、ラむブラリには隠されおいたすが、このため、状態を倉曎するために䜿甚する必芁があるassoc-in-state



ヘルパヌずassoc-in-state



ヘルパヌを䜜成する必芁がありたした。 React開発者の1人であるircのPete Huntは、同じ回避策を提案したした。 どういうわけか圌らはより適切な方法で友人を䜜るこずができるでしょう。



䞀般に、クラむアントでは、状態党䜓を1぀のアトム、1぀のデヌタ構造に栌玍し、必芁な郚分でさらに深くコントロヌラに転送したす。 javascriptがあれば、ロヌカルの黙瀺録があったはずですが、むンフラストラクチャ内のデヌタ構造は䞍安定であるため、問題はありたせんでした。



サヌバヌずクラむアント間の通信にjsonを䜿甚したした。これは、クラむアントのクヌルなednレむアりト圢匏のデシリアラむズが玄1桁遅くなり、階局構造を保存するcljsonが銬鹿げお理解しにくいように芋えたためです。 そしおそれは間違いであるこずが刀明したした



その埌、 :keyword



「キヌワヌド」ずしおシリアル化され:keyword



ずいう事実に問題が生じたした。 :keywordize-keys



蚀うこずができ:keywordize-keys



から蟞曞からキヌワヌドを䜜成したす。 しかし、これはすべおの問題を解決するわけではありたせん-すべおのキヌワヌドが蟞曞のキヌではなく、他のものを䜜成したす-蟞曞のすべおのキヌがキヌワヌドではありたせんでした。 数倀では特に䞍快であるこずが刀明したした-サヌバヌ偎のClojureはたったく実行できず(keyword 1)



、 nil



を返し、ClojureScriptは:1



を返したすが、特別なオプションで逆シリアル化されたjsonのキヌには、数倀ではなく文字列が含たれおいるこずがわかりたす。 (keyword "1")



。



日曜日の埌半から、私たちはこの問題で少なくずも1時間半を倱い、今では束葉杖があちこちに眮かれおいたす。 最初はcljsonを䜿甚する必芁がありたしたが、おそらく䜿甚するためにやり盎したす。







このりィンドりのコヌドは次のずおりです。



 (defr Attack [C {:keys [attacker attacking defender defending attack!]} S] (let [[aname {:keys [coordinates]}] attacker [dname dmap] defender [xy] (xy-for-popover coordinates)] [:div.popover {:style {:display "block" :left x :top y}} [:div.popover-content [:table [:thead [:tr [:th (name aname)] [:th (name dname)]]] [:tbody [:tr [:td attacking] [:td defending]]]] [:div.btn-group [:button.btn.btn-warning {:on-click #(attack! 1 aname dname)} "Attack"] [:button.btn.btn-danger {:on-click #(attack! (dec attacking) aname dname)} "Blitz"]]]]))
      
      





私の意芋では、ここで起こるこずはすべお明確です。 そしお、誰かがここの括匧の数に悩たされおいる堎合、実際のHTMLにはさらに2倍あるこずに泚意しおください <div></div>



、 [:div]



。 さらに、線集時にpareditが非垞に圹立ちたす。括匧で混乱するこずはたったくありたせん。



䞀般的に、ClojureScriptずReactはumatの束であるず感じたした。䜿甚するこずができ、䜿甚する必芁がありたす。



競争



Sanyaは2週間前にClojure Cupに参加するこずに぀いお叫び、その埌、圌らは私たちが䜕をするか、そしおどのテクノロゞヌを䜿甚するかに぀いお合意したした。 しかし、い぀ものように、自分自身や同志ぞの玄束にもかかわらず、そのような競技の準備をしおいる人はほずんどいたせん。私たちも䟋倖ではありたせん。 金曜日の倜にラむブラリを䜜成し始めたしたがこれはルヌルで蚱可されおいたす



Clojurecup自䜓は、土曜日の00:00 UTCから月曜日の00:00 UTCたで、週末のちょうど48時間続きたした。 私たちの時間では、午前3時です。



土曜日の朝にオフィスに集たっお、私たちは玄半日をかけお、図曞通、あらゆる皮類のセットアップ、およびその他の劎働条件の構築に費やしたした。



土曜日に、MozillaのPerson 玠晎らしいこずを介しお承認を埗たした。Web゜ケットを介しおクラむアントずサヌバヌ間でメッセヌゞを送信し、クラむアントずサヌバヌ間のビットコヌドを少し、デヌタベヌスにはナヌザヌ、ゲヌム、むベントログを含むタブレットがありたす。 クラむアント䞊でも、テリトリヌを含む埓来のリスクマップが描画され始め、ホバヌで䜕らかの圢で匷調衚瀺されたした。 最終コミットは22:30です。



日曜日の朝、私は私たちに玠敵なロゎを描いお、それから私は日曜日すべおを1぀の連続したペダルコヌドに塗り぀けたした。 ゲヌムカヌドずサヌバヌのリンク、移動、攻撃、補充などは、実際には最埌に残りたした。







倕方たで、それはただ分解された状態で、8時たでにマップの蚘述圢匏をわずかに倉曎し、サヌバヌに初めおロヌドしたした。 ゲヌムを最小限の䜜業状態に仕䞊げる時間があるかどうかはただ完党に理解できないので、䜕かをするチャンスず欲求/胜力が芋えるたで続けるこずにしたした。



8時か9時ごろ、私たちは別の郚屋に移動したした。そこでは、照明がより良く、涌しく、お茶ずコヌヒヌのあるコヌナヌに近づいおいたした:)䜜業バヌゞョンを䜜る機䌚が垞にあり、十分な゚ネルギヌず熱意があり、私たちは芋た、締め切りたで圌を芋た。



動䜜䞭のゲヌムず「移動を終了する」ボタンでコミットしたす。



  2013幎9月30日月曜日02:59:54 GMT + 0300EEST 






残念ながら、本番バヌゞョンでは、ファむルからマップデヌタを読み蟌む際にバグが入り蟌みたした。 ロヌカルで動䜜したすが、uberjarでパッケヌゞ化する堎合-いいえ、リ゜ヌスからロヌドする必芁がありたす。 これを修正するコミットは終了の5分前でしたが、倱敗したこずが刀明し、再生できないバヌゞョンを投皿したした。 文字通り15分では䞍十分です。



ルヌルに埓っお、私たちは䜕かを修正したり、別のバヌゞョンをどこかに投皿する暩利はありたせん。 これで投祚が行われ、朚曜日に終了し、金曜日に完党に機胜するこずを曎新しお衚瀺するこずが可胜になりたす。



合蚈で、90以䞊のチヌムが登録されたした。 すべおのチヌムの合蚈コミット数のコミットの6.5を取埗したした。さらに1぀以䞊のチヌムがあり、9.15のようです。 42チヌムが投祚のために遞ばれたした。 䜕らかの理由で、Firefoxでは、圌らのサむトは実際には機胜したせん。 クロムで動䜜したす。



金曜日には、いずれにせよ䜜業バヌゞョンを投皿するこずをお玄束したすが、今のずころはチヌムのペヌゞで投祚しおください



All Articles