рдПрди 2 рдУ: рдПрд░рд▓рд╛рдВрдЧ рд╡реЗрдмрд╕реНрдХреЗрдЯ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ

рдПрди 2 рдУ рдПрд░рд▓рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ



рдкрд░рд┐рдЪрдп



рдпрд╣ рдкреЛрд╕реНрдЯ рд░реВрд╕реА рдореЗрдВ N2O рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред



Erlang / OTP рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ N2O рдХреНрдпрд╛ рд╣реИ рдФрд░ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЪрд┐рдк рдХреНрдпрд╛ рд╣реИ, рдЖрдк рдкреГрд╖реНрда рдкрд░ github рдФрд░ SynRC рдХреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред рд╕рдм рдХреБрдЫ рд╡рд╣рд╛рдБ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд░реЗрдЦрд╛рдВрдХрди рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред



рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рд╢реНрд╡рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред



N2O рдХрд╛ рдорд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг: 1.1.0

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдирд╛ рд╣рдореЗрд╢рд╛ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рд╣реИ; рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдПрди 2 рдУ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЗрдирдХреА рд╕реВрдЪрдирд╛ рджреЗрдВред рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗред



рдЖрдк рдЕрдкрдиреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ FreeNode.net рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ IRC # n2o рдЪреИрдирд▓ рдкрд░ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред



рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди



рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрд░реНрд▓рд╛рдВрдЧ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреАред



N2O рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:



git clone git://github.com/5HT/n2o.git cd n2o/samples make && make console
      
      





рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ: 127.0.0.1:8000/







рдПрди 2 рдУ: рд╕рдлрд╛рд░реА рдореЗрдВ рдПрд░рд▓рд╛рдВрдЧ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ



рдХрдИ рд╡рд┐рдВрдбреЛ рдЦреЛрд▓рдХрд░ рдЖрдк рдЦреБрдж рд╕реЗ рдЪреИрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдмрд╣реБрдд рд╕рд╛рд░реЗ



рдЖрд▓рд╛


рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрдо рд╡рд┐рд▓рдВрдмрддрд╛ рдХреЗ рд╕рд╛рде рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдСрдирд▓рд╛рдЗрди рдЧреЗрдо, рдЪреИрдЯ, рдЗрдВрд╕реНрдЯрд╛рдЧреНрд░рд╛рдо, рдЯреНрд╡реАрдЯрд░ - рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдПрд░рд▓рд╛рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдВ рдПрди 2 рдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред



рд▓рдХрдбрд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


N2O рдПрдХ рдкреБрди: рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдирд╛рдЗрдЯреНрд░реЛрдЬрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдереЛрдбрд╝рд╛ рджреБрдЦрдж рд╣реИред N2O рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдХрд╛рдЙрдмреЙрдп рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣реИ, рдЬреЛ WebSockets рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рднреА рд╕рдВрднрд╡ рд╣реЛ, рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, HTML рдФрд░ DTL рдЯреЗрдореНрдкрд▓реЗрдЯ, рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдПрдХ рдиреНрдпреВрдирддрдо рд░рд╛рд╢рд┐ред



Erlang рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рддреБрд▓рдирд╛ рдпрд╣рд╛рдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ ред



рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛:



рд╕рд┐рдВрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЦреБрд▓реЗ рд╕рддреНрд░реЛрдВ рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛ рднреА рдПрди 2 рдУ рдордХреНрдЦреА рдкрд░ рд╕рдВрдХрд▓рди рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдХрд╛рд╕ рдФрд░ рдЕрдзрд┐рдХ рдорд╛рдирд╡реАрдп рд╣реЛрддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рд╕рд┐рдВрдХ рдХреЗ рд╕рд╛рде, рдЖрдк рдЬрд░реНрдХрд┐рдВрдЧ (рдЯреНрд░рд╛рдВрд╕) рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред


рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреЛ рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдиреНрдпреВрдирддрдо рдУрд╡рд░рд╣реЗрдб рд╣реЛрддрд╛ рд╣реИред рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рд╛рд░реВрдк:



рд╡реЗрдм рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдФрд░ рдЧрд▓рддреА рд╕рд╣рд┐рд╖реНрдгреБрддрд╛ рдЕрдм рд╡рд┐рдХрд╛рд╕ рдХреА рдЕрдзрд┐рдХрддрдо рдЖрд╕рд╛рдиреА рдХреЗ рд╕рд╛рде, рдкрд╣рд▓реЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реБрд▓рдн рд╣реИред

_5HT: рддреЛ рдЖрдк ___ cya рдирд╣реАрдВ рдХрд░рддреЗред рдЖрдкрдХрд╛ рд╡реНрдпрд╡рд╕рд╛рдп рдХреНрд▓реИрдХ-рдХреНрд▓реИрдХ рдФрд░ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╣реИ




BEHAVIOR рдореЙрдбрд▓


N2O рдореИрд╕реЗрдЬрд┐рдВрдЧ рдкрд░ рд╣реА Erlang рдХреА рддрд░рд╣ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рди рдХреЗрд╡рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдХ, рдмрд▓реНрдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рд░реНрд╡рд░ рддрдХред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЗрд╡реЗрдВрдЯ рдореЙрдбрд▓ рдХрд╣реВрдВрдЧрд╛ред



рдЖрдЗрдП рд╣рдо рдПрди 2 рдУ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрджрд╛рд╣рд░рдг n2o_sample рдХреА рд╕рдордпрд░реЗрдЦрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВред

  1. рдЬрдм /index



    рдкреЗрдЬ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ HTML index:body()



    рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, index:body()



    рдлрд╝рдВрдХреНрд╢рди рдореЗрдВред
  2. рдкреЗрдЬ WebSocket рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реБрдП рдЪрд▓рддрд╛ рд╣реИред
  3. рдлрд┐рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд▓реЛрдб рдХреЛ WebSocket рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреГрд╖реНрда рддрддреНрд╡реЛрдВ рдХреЛ index:event(init)



    рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рднреВрдорд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЗрдПрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдПрдХ рдмрдЯрди рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдирд╛ рдмрдирд╛рдирд╛ рдЬреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрддрд╛ рд╣реИред
  4. рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдмреЗрд╕ -64 рдорд╢рд░реВрдо рдХреЗ рдиреАрдЪреЗ рдПрдХ рдмрд░реНрдЯ-рдПрдиреНрдХреЛрдбреЗрдб рд╕рдВрджреЗрд╢ рдЖрддрд╛ рд╣реИ рдФрд░ index:event(Term)



    рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ Term



    рдмрдЯрди рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╢рдмреНрдж рд╣реИ: #button.postback



    ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдЯрди #button{postback=sasay}



    рдмрдЯрди #button{postback=sasay}



    рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж index:event(sasay).



    рдХреЛ рдмрд▓ рджреЗрдЧрд╛ index:event(sasay).



    рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ index:event(sasay).



  5. рд╕рд░реНрд╡рд░, рдмрджрд▓реЗ рдореЗрдВ, рдХрд┐рд╕реА рднреА рд╕рдордп рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдбреЗрдЯрд╛ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛



    рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: index:event(init)



    рдХреНрд▓рд╛рдЗрдВрдЯ (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЯреИрдм) рдХреА рд╕реЗрд╡рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ wf:reg/1



    рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд╛рдо рдХреЗ рддрд╣рдд рдкрдВрдЬреАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЕрдВрдд рдХреЗ рдмрд╛рдж рдкреНрд░рдХреНрд░рд┐рдпрд╛



    рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреГрд╖реНрда рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ ( wf:insert/2



    , wf:wire/1



    , рдЖрджрд┐), wf:flush/1



    рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХреЛрдб рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдЗрд╕реЗ рддрдм JS рдорд╢реАрди рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред




рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдкреГрд╖реНрда рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдкрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред



рдФрд░ рдпрд╣ AJAX рдФрд░ LongPooling рдзреВрдордХреЗрддреБ рдЬреИрд╕реА рдмреИрд╕рд╛рдЦреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдореЛрдб рд╣реИред рднрд╡рд┐рд╖реНрдп рдпрд╣рд╛рдБ рд╣реИ, рдмрд┐рд▓реНрд▓реА рдХреЗ рдмрдЪреНрдЪреЗред рдЗрд╕рдХрд╛ рдирд╛рдо WebSockets рд╣реИред



рдЖрдк рдпрд╣рд╛рдБ WS рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рддрд╛рд▓рд┐рдХрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдБ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред



рдЖрд╡реЗрджрди рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА



рдпрджрд┐ рдПрд░реНрд▓реИрдВрдЧ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдпрд╛ рдЕрднреА рд╣реБрдЖ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╕рд╡рд╛рд▓ рдЙрдареЗрдВрдЧреЗ: рдЖрдкрдХреА рд░рдЪрдирд╛рддреНрдордХрддрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдВ рдФрд░ рдХрд┐рд╕ рд╕реНрдерд╛рди рдкрд░ рдЭреВрда рд╣реИред



рдЫрд╡рд┐



рд╕рдВрдкрд╛рджрди рдХреЗ рдЕрдзреАрди рд╣реЛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░ рдФрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдкреНрд░рдореБрдЦ рднрд╛рдЧреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред



n2o_sample


N2O рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ - n2o_sample ред n2o_sample рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдПрд░реНрд▓рд╛рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ N2O рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдЪрд┐рддреНрд░ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ apps/



рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ - рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЛ рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдкрдХреЛ n2o_sample рдХреЛ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рд╕реНрд╡рддрдВрддреНрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, n2o_sample, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдирд╛рдо рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдореИрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рдирд╣реАрдВ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред



рдЖрд╡реЗрджрди рд╕реВрдЪреА


рдЬрдм n2o_sample рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣, рдЬреИрд╕рд╛ рдХрд┐ рдПрд░рд▓реИрдВрдЧ рдЖрд╡реЗрджрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ( deps/



рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ deps/



рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрдХреНрддрд┐, рдпрджрд┐ рдХреЛрдИ рд╣реЛ, apps/



рд╕реЗ)ред рдпрд╣ рдХреЛрдб n2o_sample/src/web_app.erl



:



 -module(web_app). -behaviour(application). -export([start/2, stop/1]). start(_StartType, _StartArgs) -> application:start(crypto), application:start(sasl), application:start(ranch), application:start(cowboy), application:start(gproc), application:start(mimetypes), application:start(syntax_tools), application:start(compiler), application:start(erlydtl), application:start(rest), application:start(n2o), web_sup:start_link(). stop(_State) -> ok.
      
      







web_sup:start_link()



рдлрд╝рдВрдХреНрд╢рди web_sup:start_link()



рд╕реНрд╡рдпрдВ n2o_sample рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред



рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрд╡реЗрджрдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рджреЛ рдФрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: reltool.config



рдФрд░ .applist



, рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рдореЗрдХ рдХрдорд╛рдВрдб рдХреЗ рдмрд╛рдж рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рд╣реА рдЪреАрдЬ рдХреЛ рддреАрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд░рдЦрдирд╛ @ darkproger рд╕реЗ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдмреИрд╕рд╛рдЦреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕рдиреЗ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ (рд╡реЗ рд╡рд╛рджрд╛ рдХрд┐рдП рдЧрдП рддреАрди рд╕рд╛рд▓ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗ )ред



sys.config


рдпрд╣ рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВред рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХред рдлрд┐рд░ рдХреЛрдб рд╕реЗ рд╣рдо application:get_env(App,Key)



рдХреЙрд▓ рдХрд░рддреЗ application:get_env(App,Key)



рдФрд░ рд╡рд╣ рд╣реИред



vm.args


рдпрд╣рд╛рдВ рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ ( $ export SOME_PARAM=value



рдмрдЬрд╛рдп) рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдирд┐рдЬреА / рд╕реНрдерд┐рд░ /


рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ "рд╕реНрдерд┐рд░" рдлрд╝рд╛рдЗрд▓ рдХреНрд▓реАрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдЙрдмреЙрдп рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдпрд╣рд╛рдВ рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб, рдкрд┐рдХрдЪреА рдФрд░ рд╣реЗрдВрддрд╛рдИ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред n2o_sample/src/web_sup.erl



:



 dispatch_rules() -> cowboy_router:compile( [{'_', [ {"/static/[...]", cowboy_static, {priv_dir, ?APP, <<"static">>, [{mimetypes,cow_mimetypes,all}]}}, ****
      
      







рдкреГрд╖реНрдареЛрдВ



рдбрд╛рдпрдиреЗрдорд┐рдХ рдкреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, N2O рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ HTML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ DTL рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред deps/erlydtl/



рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ ErlyDTL рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИ рдЬреЛ Erlang bytecode рдореЗрдВ DTL рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реНрд╡рдпрдВ n2o_sample/priv/templates/



рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ рдФрд░ HTML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рджреЛрд╣рд░реЗ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ {{ }}



рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╢рдмреНрджреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВред



рдЗрд╕ рддрд░рд╣, рд╣рдо HTML рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕реНрдереИрддрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде "рдЗрдВрдЬреЗрдХреНрдЯ" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХрдиреЗрдХреНрд╢рди {{ }}



рдорд╛рдзреНрдпрдо рд╕реЗ Erlang рдореЗрдВ рдХреЛрдб рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧрд┐рди рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдореБрдЦреНрдп / 0 рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдкреГрд╖реНрда рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдкрддреЗ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ http://127.0.0.1/login/



:



 #dtl{ file = "login", app=n2o_sample, bindings=[ {title,title()}, {body,body()} ]}.
      
      











рдШрдЯрдирд╛рдПрдБ



рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдПрди 2 рдУ рдореЗрдВ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ /deps/n2o_scripts/n2o/bullet.js



(WebSocket рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛) рдФрд░ n2o.js



(рдкреЗрдЬреЛрдВ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛)ред



рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░, рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╣реИрдВ: /n2o/src/endpoints/cowboy/bullet_handler.erl



(рдПрдХ n2o_bullet.erl



рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛) рдФрд░ n2o_bullet.erl



(рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ)ред



рдПрдкреАрдЖрдИ



рдЖрдЗрдП рдореБрдЦреНрдп рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдПрди 2 рдУ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рд╡рд╛рд▓ рдЙрдарддреЗ рд╣реИрдВред



wf: рдзреВрдордХреЗрддреБ / 1, wf: async / 1, wf: async / 2


global:register_name/2



рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЛрдб рдХреЗ рднреАрддрд░ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо ( comet/1



рдФрд░ async/1



) рдХреЗ рд▓рд┐рдП тАЬcometтАЭ



рддрд╣рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ global:register_name/2



ред рдпрджрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдкрдВрдЬреАрдХреГрдд рд╣реИ, рддреЛ рдЙрд╕рдХрд╛ рдкреАрдЖрдИрдбреА тАЛтАЛрд╡рд╛рдкрд╕ рдХрд░реЗрдВред



wf: рдлреНрд▓рд╢ / 1


рдпрд╣ wf_context:actions/0



рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╢реИрд▓реА рдореЗрдВ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗ рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ wf:send/2



рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрддрд╛ рд╣реИ wf:send/2



рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ wf:send/2



(рдиреЛрдб рдХреЗ рднреАрддрд░) wf:send/2



, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



wf: reg / 1, wf: reg / 2 (? REGISTRATOR = n2o_mq)


GProc рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЛрдб рдХреЗ рднреАрддрд░ рдПрдХ рдЧреИрд░- рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдХреЗ рддрд╣рдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рддрд╣рдд GProc рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдкрдВрдЬреАрдХрд░рдг рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ ( get/1



, put/1



) рдФрд░ рд╢рдмреНрдж skip



( n2o_mq.erl



) рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред Gproc рджреНрд╡рд╛рд░рд╛ рд░реВрд╕реА рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ ред



рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ n2o_mq



рдореЙрдбреНрдпреВрд▓ рд╣реИ n2o_mq



рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреБрдирд░реНрдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рднреАрддрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ред



wf: send / 2 (! REGISTRATOR = n2o_mq)


рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢ рдХреЛ wf:reg/1



рдпрд╛ wf:reg/2



рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



wf: q / 1


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрдерд╛рдХрдерд┐рдд рдкреЛрд╕реНрдЯрдмреИрдХ рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:



 body() -> [ #textbox{ id=message }, #button{ postback={button_pressed}, source=[message] } ]. event({button_pressed}) -> wf:info("Message: ~p",[wf:q(message)]);
      
      





рдХрдВрд╕реЛрд▓ рдкрд╛рда рдмреЙрдХреНрд╕ рдореЗрдВ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдирд┐рд╣рд┐рдд рдкрд╛рда рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛ред



wf: qs / 1


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, HTTP рдлрд╝реЙрд░реНрдо рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ:

wf:qs(<<"x">>)



рдирд┐рдХрд╛рд▓реЗрдЧрд╛ <<"ABC">>



рдЕрдЧрд░ URL рд╣реЛрдЧрд╛ localhost:8000/index?x=ABC



localhost:8000/index?x=ABC



ред



wf: рддрд╛рд░ / рез


рдпрд╣ /n2o/include/wf.hrl



рдлрд╝рд╛рдЗрд▓ рдХреЗ "рдХрд╛рд░реНрдп" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдШреЛрд╖рд┐рдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рда рдФрд░ рдШрдЯрдирд╛ рд░рд┐рдХреЙрд░реНрдб рджреЛрдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: wf:wire(#alert{text="!"})



ред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ #wire{actions=JS}



рдореЗрдВ рднреА рд▓рдкреЗрдЯрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк wf:wire(#wire{sctions=JS})



рдирд┐рд░реНрдорд╛рдг рд╣реЛрдЧрд╛ред



wf: update / 2, wf: insert_top / 2, wf: remove / 1 рдФрд░ рдЕрдиреНрдп


рдпреЗ wf:wire/1



рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рд╣реИрдВ wf:wire/1



, рдЬрд┐рд╕рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ DOM рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред



wf: рдЬрд╛рдирдХрд╛рд░реА, wf: рдЪреЗрддрд╛рд╡рдиреА, wf: рддреНрд░реБрдЯрд┐


рдпреЗ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдХреНрд░рдорд╢рдГ error_logger:info_msg/1



рдФрд░ рдЕрдиреНрдп рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА error_logger:info_msg/1



рдХреА error_logger:info_msg/1



рд╣реИред



wf: f, wf: to_list, wf: to_binary, wf: html_encode, wf: url_encode, wf: hex_encode рдФрд░ рдЕрдиреНрдп


рд╡реЗ /n2o/src/wf.erl



рдлрд╝рд╛рдЗрд▓ рдХреЗ "рдХрдиреНрд╡рд░реНрдЯ рдФрд░ /n2o/src/wf.erl



рдПрдкреАрдЖрдИ" /n2o/src/wf.erl



рд╣реИрдВред рд╡реЗ рд╕рднреА рдорд╛рдирдХ Erlang рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдПрдб-рдСрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдмреБрджреНрдзрд┐рдорд╛рди рдФрд░ рдЗрддрдиреА рд▓рдХрдбрд╝реА рдирд╣реАрдВред wf:f



- io_lib:format



рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ io_lib:format



, рдлрд┐рд░ рдХрдирд╡рд░реНрдЯрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рд╕реВрдЪреА рдкрд░ рдЬреЛ рдХрд┐рд╕реА рднреА рд╢рдмреНрдж рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЕрдзрд┐рдХ рд╡реЗрдм-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рдиред рдпрд╣рд╛рдБ рдЙрди рд╕рднреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ; рд▓рдХреНрд╖реНрдп рдХреЗрд╡рд▓ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдерд╛ рдХрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВред



wf: рдЕрдЪрд╛рд░ / 1, wf: depickle / 1 (? PICKLER = n2o_pickle)


рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдирдХреЛрдбрд░ рдФрд░ рдбрд┐рдХреЛрдбрд░ рдХреА рд╢рд░реНрддреЗрдВред n2o_pickle



Base64 рдореЗрдВ рдПрдирдХреЛрдб рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ n2o_secret AES / RIPEMD160 рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреБрдВрдЬреА рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред



рдпрд╣ рд╕рдм рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдПрди 2 рдУ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧреЛрджреА рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ ред



рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп



рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рдореБрдлреНрдд SynRC рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЙрддреНрдкрд╛рдж рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ Erlang рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЛ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рджрд╕ рдЧреБрдирд╛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред



рдХреЗрд╡реАрдПрд╕


KVS рдПрдХ рдЕрдореВрд░реНрдд KV рдиреЛрдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЙрдбрд▓ рд╣реИ рдЬреЛ рджреЛрдЧреБрдиреА рдЬреБрдбрд╝реА рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рджреНрд╡рд┐рддреАрдпрдХ рдЕрдиреБрдХреНрд░рдорд┐рдд ( kvs:index/3



) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдлреАрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрд╣ рдорд╛рдиреЗрд╕рд┐рдпрд╛, рдЖрд░рдЖрдИрдПрдХреЗ рдФрд░ рдХреЗрдПрдЖрдИ рдХреЗ рд╕рд╛рде рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



AVZ


рдПрд╡реАрдЬреЗрдб рдЯреНрд╡рд┐рдЯрд░, рдЧреВрдЧрд▓, рдлреЗрд╕рдмреБрдХ, рдЬреАрдердм рдФрд░ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рд╣реИред



рд╢реЗрди


рд╢реЗрди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрдВрдЯрд░рд▓рд╛рдВрдЧ рдХреЛрдб рдХрд╛ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╣реИред рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Erlang рд╕рдВрдХрд▓рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



MQS


MQS - RabbitMQ рдХреЗ рд▓рд┐рдП MQ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред



рдлрд╝реАрдб


рдлрд╝реАрдбреНрд╕ - рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕рднреА рдиреЛрдбреНрд╕ рдкрд░ рдбреЗрдЯрд╛ рд╕реНрдерд┐рд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдкреВрд▓, рдПрдХ рдХреИрд╢ рд╕рд░реНрд╡рд░ рднреАред



рдХреНрд╖рд┐рддрд┐рдЬ


рд╕реНрдХрд╛рдИрд▓рд╛рдЗрди рдПрди 2 рдУ рдкрд░ рдПрдХ рдСрдирд▓рд╛рдЗрди рд╕реНрдЯреЛрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред



рдХрд╛рдКрдВрддрд╛рдЪ


рдХрд╛рдЙрдВрдЯрдЪ рдПрдХ рд╕рд╛рдорд╛рдЬрд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдФрд░ рдПрдХ рдЙрдиреНрдирдд рдПрдкреНрд▓реАрдХреЗрд╢рди рд╕реНрдЯреЛрд░ рд╣реИред рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ред рдХреЗрд╡реАрдПрд╕, рдПрд╡реАрдЬреЗрдб рдФрд░ рдлреАрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред VOXOZ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред



VOXOZ


VOXOZ - рдПрдХ рдЦреБрд▓рд╛ рдПрд░реНрд▓рд╛рдВрдЧ рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (PaS)ред рдбреЙрдХрд░, рдПрд░реНрд▓рд╛рдВрдЧрдСрдирдПрдХреНрд╕рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП blog.docker.io ред



рдирд┐рд╖реНрдХрд░реНрд╖



рддрд╛рдХрд┐ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЖрддреНрдорд╕рд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЕрдм рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЪреБрдирдиреЗ рдФрд░ рдирд╛рдЗрдЯреНрд░реЛрдЬрди рдФрд░ рдПрди 2 рдУ рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП @ mtreskin рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдзрдиреНрдпрд╡рд╛рдж; рдФрд░ рдЕрдирдВрдд 24/7 рдЖрдИрдЖрд░рд╕реА рдкрд░рд╛рдорд░реНрд╢ рдХреЗ рд▓рд┐рдП @ 5HT ред



All Articles