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

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╡рд┐рдВрдбреЛрдЬ рдПрдЬрд╝реНрдпреЛрд░ рдореЛрдмрд╛рдЗрд▓ рд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдФрд░ рдПрдЬрд╝реНрдпреЛрд░ рдХреНрд▓рд╛рдЙрдб рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдмреИрдХреЗрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдХреНрд░реИрдо-рдмреЛрд░реНрдб рдмрд╛рдЗрдХ рдмрдирд╛рдиреЗ рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред


рдпрд╣ рдкрд┐рдХреА рдкрд╛рдардХреЛрдВ рдХреЛ рддреБрд░рдВрдд рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕рд╛рджрдЧреА рдФрд░ рд╕рдордп рдХреА рдиреНрдпреВрдирддрдорддрд╛ рдереАред рдЕрдВрдд рдореЗрдВ, рдлреБрд░реНрддреАрд▓реА рд╡рд┐рдХрд╛рд╕ рдХреА рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд▓рд╛рдХреГрддрд┐ рдХрд╛рдЧрдЬ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рдПрдХ рд╕рдлреЗрдж рдмреЛрд░реНрдб рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдЖрднрд╛рд╕реА рдореВрд░реНрддрд┐ рдореЗрдВ рдХреЗрд╡рд▓ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реЛрдЧреАред
Windows Azure рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЛ рд╕рдВрдпреЛрдЧ рд╕реЗ рдирд╣реАрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреА рддрд░рд╣ рдПрдЬрд╝реНрдпреЛрд░ рд╣рдорд╛рд░реЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рд╕рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрдм рдПрдХ рдЫреЛрдЯрд╛ рдлреБрд░реНрддреАрд▓реА рдЯреАрдо рдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рддреЛ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдЦрд░реНрдЪ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдпрд╣ рдЖрд▓реЗрдЦ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд┐рдВрдбреЛрдЬ рдПрдЬрд╝реНрдпреЛрд░ рд╕реЗ рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╣реИред
рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб https://bitbucket.org/savamura/scrumboard рдкрд░ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдЖрдк рдпрд╣рд╛рдВ рдмрд┐рдирд╛ рдмреИрдХрдПрдВрдб рдХреЗ рдпреВрдЖрдИ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ ред

рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рд╣реИред рдпрд╣ рдЙрдирдХрд╛ рд▓реЗрдЦрди рдерд╛ рдЬрд┐рд╕рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрд╛)ред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХреЛрдб рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛ред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ HTML5 рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ , jQuery , jQuery рдпреВрдЖрдИ , рдиреЙрдХрдЖрдЙрдЯ.рдЬреЗрдПрд╕ , рдЕрдВрдбрд░рд╕реНрдХреЛрд░.рдЬреЗрдПрд╕ , рдереЛрдбрд╝рд╛ рдмреИрдХрдмреЛрди.рдЬреЗрдПрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ред MVVM рд╕рд▓рд╛рдж рдореЗрдВ рд╕рдм рдХреБрдЫ рдорд┐рд▓рд╛рдПрдВ, рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдирдордХ рдЬреЛрдбрд╝реЗрдВред
рд╡реНрдпреВ рджреЛ рдмрдЯрди (рдирдпрд╛ рд╕реНрдЯрд┐рдХрд░, рд╕реЗрд╡ рдмреЛрд░реНрдб) рдХреЗ рд╕рд╛рде рдПрдХ html рдкреГрд╖реНрда рд╣реИ, рдЬреЛ рд╕реНрдЯрд┐рдХрд░ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╡рд╛рдж рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реИ рдЬрд╣рд╛рдБ рдпреЗ рд╕реНрдЯрд┐рдХрд░ "рдЫрдбрд╝реА" рд╣реЛрддреЗ рд╣реИрдВред рд╢реАрд░реНрд╖ рдкрд░ рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкрдЯреНрдЯреА рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдЖрдк рд╕реНрдЯрд┐рдХрд░ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ - рдпрд╣ рд╕реНрдЯрд┐рдХрд░, рдПрдХ рд╢рд┐рд▓рд╛рд▓реЗрдЦ, рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИред рд╕реНрдЯрд┐рдХрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЗрд╕реЗ рдЦреАрдВрдЪрдХрд░, рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ - рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдбреНрд░реИрдЧ-рдПрдВрдб-рдбреНрд░реЙрдк рд╕реНрдЯрд┐рдХрд░ рдФрд░ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рдЕрдирд╛рдпрд╛рд╕ jQuery.UI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдиреЙрдХрдЖрдЙрдЯ.рдЬреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдЗрд╕ рджреГрд╢реНрдп рдХреЗ рддрддреНрд╡реЛрдВ рд╕реЗ рдкреНрд░рд╕реНрддреБрддрд┐ рддрд░реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрд╡реЗрджрди рдХреЗ рджреМрд░рд╛рди, рддреАрди ViewModel рд╣реИрдВ: BoardViewModel, StickerViewModel рдФрд░ StickerPropertiesDialogViewModelред
рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдкрд╛рд╕ рд▓реМрдЯ рдЖрдПрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореЛрдмрд╛рдЗрд▓ рд╕реЗрд╡рд╛ рдХрд╛ рдмреИрдХрдПрдВрдб рдмрдирд╛рдПрдВред

Azure рдореЛрдмрд╛рдЗрд▓ рд╕реЗрд╡рд╛ рдФрд░ рдХрд╕реНрдЯрдо API

Windows Azure рдореЛрдмрд╛рдЗрд▓ рд╕реЗрд╡рд╛рдПрдБ рдиреЛрдб.рдЬреЗрдПрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреНрд▓рд╛рдЙрдб рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рд╣реИред REST API рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреБрд╢ рд╕реВрдЪрдирд╛рдПрдБ рдореБрдЦреНрдп рдореЛрдмрд╛рдЗрд▓ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдкрд╣рдЪрд╛рди рдкреНрд░рджрд╛рддрд╛рдУрдВ (Google, Facebook, Twitter, Microsoft) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдк рд╕реАрдзреЗ рд╡реЗрдм рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд▓реЛ рджреЛрдиреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЛред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, Azure рд╡реЗрдм рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рдирдИ рдореЛрдмрд╛рдЗрд▓ рд╕реЗрд╡рд╛ рдмрдирд╛рдПрдВред рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╛рдо, рдХреНрд╖реЗрддреНрд░ рдФрд░ "рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ 20 рдПрдордмреА рдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдПрдВ" рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рддреБрд░рдВрдд рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдкрд░рд┐рддреНрдпрд╛рдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ REST API рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: SQL рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рдХрд╕реНрдЯрдо API рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдореВрд▓ CRUD API, рдЬрд╣рд╛рдБ рдЖрдк рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИ рдХрд┐ рдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрддрдиреА рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЗрд╕рдХреА рд▓рд╛рдЧрдд рдХреА рддреБрд▓рдирд╛ рдиреЛ рдПрд╕рдХреНрдпреВрдПрд▓ рднрдВрдбрд╛рд░рдг рдХреА рд▓рд╛рдЧрдд рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛)ред рдмреЗрд╢рдХ, рд╣рдо рдПрдХ SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП 20 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛ рдореЗрдВ рдХреНрд▓рд╛рдЙрдб рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдХрд╕реНрдЯрдо рдПрдкреАрдЖрдИ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ рдФрд░ рдПрдЬрд╝реНрдпреЛрд░ рдЯреЗрдмрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗред
рддреЛ, рдПрдкреАрдЖрдИ рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдмрдирд╛рдПрдВред "рдмреЛрд░реНрдб" рдирд╛рдо рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдХреНрд╕реЗрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ: "рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреБрдВрдЬреА рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐"ред рдмрд╛рдж рдореЗрдВ, рдЗрди рдорд╛рдиреЛрдВ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд╡ рдирд┐рд░реНрдорд┐рдд рдПрдкреАрдЖрдИ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдСрдирд▓рд╛рдЗрди рдХреЛрдб рд╕рдВрдкрд╛рджрдХ рдЦреБрд▓ рдЬрд╛рдПрдЧрд╛ред рдпрд╣, рд╢рд╛рдпрдж, рдСрдирд▓рд╛рдЗрди рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред
рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рд╕реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ "рдХреЙрдиреНрдлрд╝рд┐рдЧрд░" рдЯреИрдм рдореЗрдВ рдХреНрд░реЙрд╕-рдСрд░рд┐рдЬрд┐рдирд▓ рд░рд┐рд╕реЛрд░реНрд╕ рд╢реЗрдпрд░рд┐рдВрдЧ (рдХреЛрд░) рдирд┐рдпрдо рд▓рд┐рдЦрдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдпрд╛ рд╕рд┐рд░реНрдл * рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдПрдкреАрдЖрдИ рдХреЛ рдХрд╣реАрдВ рд╕реЗ рднреА рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Git рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╛рдЙрдб рдкрд░ рдирд┐рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ

рдПрдЬрд╝реНрдпреЛрд░ рдореЛрдмрд╛рдЗрд▓ рд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдЖрдкрдХреЛ рдПрдХ рдирд┐рдЬреА рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЖрдЗрдП рдЗрд╕ рд╢рд╛рдВрдд рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рд╣рдореЗрдВ рдЖрдкрдХреЗ рдкрд╕рдВрджреАрджрд╛ рдЖрдИрдбреАрдИ рдореЗрдВ рдХреЛрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рджреЗрдЧрд╛ред
рд╣рдо "рдбреИрд╢рдмреЛрд░реНрдб" рдЯреИрдм рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ "рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░" рдХреЙрд▓рдо рдореЗрдВ "рд╕реЗрдЯрдЕрдк рд╕реНрд░реЛрдд рдирд┐рдпрдВрддреНрд░рдг" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдерд╛ред



рдЖрдкрдХреЛ git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдпреВрдЬрд╝рд░рдиреЗрдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж Azure рдереЛрдбрд╝рд╛ рд╕реЛрдЪреЗрдЧрд╛ рдФрд░ рдкреНрд░рд╛рдЗрд╡реЗрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рд╕реАрдХреНрд░реЗрдЯ URL рдХрд╛ рд░рд╛рд╕реНрддрд╛ "рдХреЙрдиреНрдлрд╝рд┐рдЧрд░" рдЯреИрдм рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬреЛ рд░рд┐рдкреЙрдЬрд┐рдЯ рдХреЛрдб рдХреЛ рд╡рд░реНрдХрд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рд╣реА рд╕рд┐рдВрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдЖрдк рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдЧрд┐рдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЧрдП рднрдВрдбрд╛рд░ рдХреЛ рдХреНрд▓реЛрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЛрд░реНрд╕рдЯреНрд░реАред рд╕рд╛рде рд╣реА bitbucket.org/savamura/scrumboard.git рдкрд░ рдХреНрд▓реЛрди рдХрд░реЗрдВред рдЕрдВрджрд░, рдЖрдкрдХреЛ рд╕реЗрд╡рд╛ рдлрд╝реЛрд▓реНрдбрд░ рдорд┐рд▓реЗрдЧрд╛ рдЬрд┐рд╕реЗ рдПрдЬрд╝реНрдпреЛрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХреНрд▓рд╛рдЙрдб рдкрд░ рдзрдХреЗрд▓реЗрдВ, рдЖрдЗрдП рд╕рд░реНрд╡рд░ рдХреЛрдб рджреЗрдЦреЗрдВред

рд╕рд░реНрд╡рд░ рдХреЛрдб

рд╕реЗрд╡рд╛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЪрд╛рд░ рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рд╣реИрдВ: рдХрд╕реНрдЯрдо рдПрдкреАрдЖрдИ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдкреАрдЖрдИ, рд╢реЗрдбреНрдпреВрд▓ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдиреБрд╕реВрдЪрдХ, рд╕рд╛рдЭрд╛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб, рдПрдирдкреАрдПрдо рдореЙрдбреНрдпреВрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рддрд╛рд▓рд┐рдХрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдЙрди рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд SQL рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреА рд╣реИрдВред
рдПрдкреАрдЖрдИ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рддреНрдпреЗрдХ js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдпреБрдЧреНрдорд┐рдд json рдлрд╝рд╛рдЗрд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред
Board.js рдПрдХ рдиреЛрдб.рдЬреЗрдПрд╕ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рдПрдЬрд╝реНрдпреЛрд░ рдореЛрдмрд╛рдЗрд▓ рд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдХреЗ рдЕрдВрджрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рд╡реЗрдм рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╕, рдПрдЬрд╝реНрдпреЛрд░ рдФрд░ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
var express = require("express"); var azure = require("azure"); var _ = require("underscore"); 


рдЪреВрдВрдХрд┐ рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдЯреЗрдмрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдЬрд╝реНрдпреЛрд░ рдореИрдиреЗрдЬрдореЗрдВрдЯ рд╡реЗрдм рдХрдВрд╕реЛрд▓ рдкрд░ рд▓реМрдЯреЗрдВ, рдПрдХ рдЕрд▓рдЧ рдХреНрд▓рд╛рдЙрдб рд╕реНрдЯреЛрд░реЗрдЬ рдмрдирд╛рдПрдВ, рдФрд░ рдПрдХреНрд╕реЗрд╕ рдХреА рдХреЙрдкреА рдХрд░реЗрдВред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Microsoft рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд TableService рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
 function createTableService() { return azure.createTableService( "your_storage_acount", "your_storage_account_key"); } 


рдЬрд┐рд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реНрдЯрд┐рдХрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЙрд╕реЗ рд╡реЗрдм рдХрдВрд╕реЛрд▓ рдФрд░ рдХреЛрдб рд╕реЗ рджреЛрдиреЛрдВ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рдЖрд╡реЗрджрди рдмрд╣реБрдд рд▓реЛрдб рдирд╣реАрдВ рд╣реИ рдФрд░ рдЪрд┐рддреНрд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЛрдб рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рддрд╛рдХрд┐ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рди рдХрд░реЗрдВред
рд╣рдорд╛рд░рд╛ рдПрдкреАрдЖрдИ рдХреЗрд╡рд▓ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛: рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдкреВрд░реЗ рдмреЛрд░реНрдб рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ) рдФрд░ рдкреЛрд╕реНрдЯ (рдЗрд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ)ред
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрдВрджрд░, рдЖрдк рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ рдЯреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЙрдЧ рд╡реЗрдм рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рддрд░рд╣ рдЖрдк рдЗрд╕реЗ рдбрд┐рдмрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЪреВрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЛрдб.рдЬреЗрдПрд╕ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдХреЛрдб рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИред рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ (request.respond рдпрд╛ response.send)ред рдкреВрд░реНрдг рдкреНрд░рд▓реЗрдЦрди MSDN рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ CreateTableIfNotExists рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рддреЗ рд╣реИрдВред рддрд╛рд▓рд┐рдХрд╛ рдирд╛рдо рдФрд░ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдзрд┐ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 exports.post = function(request, response) { console.log(request.body); var tableService = createTableService(); tableService.createTableIfNotExists("Stickers", function(error) { if (!error) { console.log("Table Stickers created or existed"); saveBoard(tableService, request.body, response); } else { console.error(error); response.send( statusCodes.INTERNAL_SERVER_ERROR, { message: "Table creation failed. " + error }); } }); }; 

рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рд╕рд╣реЗрдЬреЗрдВ:
 function saveBoard(tableService, boardModel, response) { tableService.beginBatch(); _.each( boardModel.stickers, function(sticker) { sticker.PartitionKey = boardModel.boardId; sticker.RowKey = sticker.id; tableService.insertOrReplaceEntity(stickersTableName, sticker); }); tableService.commitBatch( function(error, operationResponses, batchResponse) { var batchErrors = ""; _.each( operationResponses, function(opresp) { if (opresp.error) batchErrors += opresp.error }); console.log("Stickers saved. Error: " + error + " " + batchErrors); console.log(operationResponses); console.log(batchResponse); if (error || batchErrors !== "") { response.send( statusCodes.INTERNAL_SERVER_ERROR, { message : error + " " + batchErrors }); } else { response.send(statusCodes.OK, { message : 'Batch commited!' }); } }); } 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрди рд╕реНрдЯрд┐рдХрд░ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмреИрдЪреЛрдВ рдХреА рдХреБрдЫ рд╕реАрдорд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рднреА рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрдЯрд┐рд╢рдирдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ 100 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рднреА рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЗ 100 рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдмреИрдЪреЛрдВ рдореЗрдВ рдХреЛрдИ рд╡рд┐рднрд╛рдЬрди рдирд╣реАрдВ рд╣реИред
рдХрд┐рд╕реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдСрдмреНрдЬреЗрдХреНрдЯ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рд░реИрдЦрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MongoDB, рдЖрдк рдЯреНрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдирд╣реАрдВ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд░реИрдЦрд┐рдХрдХрд░рдг рд╣реЛрддрд╛ рд╣реИред PartitionKey рдХреЗ рд░реВрдк рдореЗрдВ, рдмреЛрд░реНрдб рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЧрд╛рдЗрдб) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред StickerId (рдЧрд╛рдЗрдб), рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рднреА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реЛрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреНрд╡реЗрд░реА рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
 exports.get = function(request, response) { console.log(request); var boardId = request.query.boardId; if (!boardId) { response.send(statusCodes.BAD_REQUEST, { message : 'boardId is undefined.' }); } var query = azure.TableQuery.select() .from(stickersTableName) .where('PartitionKey eq ?', boardId); var tableService = createTableService(); tableService.queryEntities( query, function(error, entities) { if(!error) { response.send(statusCodes.OK, entities); } else { response.send(statusCodes.INTERNAL_SERVER_ERROR, error); } }); }; 

рдпрд╣рд╛рдБ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рднреА рдореВрд▓ рд╕рд░реНрд╡рд░ рдХреЛрдб рд╣реИред рдмреЗрд╢рдХ, рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛, рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдХрд╛ рднреА рд╕рддреНрдпрд╛рдкрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрдЯрд┐рдХрд░ рд╣рдЯрд╛рдиреЗ рдФрд░ xss рд╣рдорд▓реЛрдВ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╣рдо рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдмрд╛рдд рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред
рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛрдб рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

MobileServicesClient

рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдПрдХ рдЕрд▓рдЧ StorageClient рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ: рдмреЛрд░реНрдб рдХреЛ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдмреЛрд░реНрдб рдХреЛ рдмрдЪрд╛рдПрдВред рд╕рднреА рд╕реНрдЯрд┐рдХрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рддреБрд░рдВрдд рд░реИрдЦрд┐рдХ, рдХреНрд░рдордмрджреНрдз рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдмреЗрд╢рдХ, рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛ред
рдХрд╕реНрдЯрдо API рдореЗрдВ рджреВрд░рд╕реНрде рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк Microsoft рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП WindowsAzure.MobileServicesClient рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЗ_custom_api.azure-mobile.net/client/MobileServices.Web-1.0.3.min.js (рд╕рдВрд╕реНрдХрд░рдг рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ) рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдЖрдк "рдбреИрд╢рдмреЛрд░реНрдб" рдХреЗ рдЖрдЧреЗ рдмрд┐рдЬрд▓реА рдХреЗ рдмрд╛рджрд▓ рдЖрдЗрдХрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдПрдЬрд╝реНрдпреЛрд░ рд╡реЗрдм рдХрдВрд╕реЛрд▓ рд╕реЗ рднреА рд▓рд┐рдВрдХ рдХреЛ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ HTML / рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЪреБрдиреЗрдВ рдФрд░ рдПрдХ рдореМрдЬреВрджрд╛ HTML рдРрдк рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдЖрдк рдПрдкреАрдЖрдИ рдПрдХреНрд╕реЗрд╕ рдХреБрдВрдЬреА рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдкреНрд░рдмрдВрдзрди рдХреБрдВрдЬреА - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреБрдВрдЬреА рдмрдЯрди рдХреЗ рдиреАрдЪреЗ)ред рдХреБрдВрдЬреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдкреБрд░рд╛рдирд╛ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред
StorageClient рдирд┐рд░реНрдорд╛рддрд╛:
 var StorageClient = function() { this.azureClient = new WindowsAzure.MobileServiceClient( 'https://your_custom_api.azure-mobile.net/', 'your_application_key_goes_here'); }; 

рд╣рдорд╛рд░реЗ рдХрд╕реНрдЯрдо рдПрдкреАрдЖрдИ рдХреЛ рдмреЛрд░реНрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреЛрд░реНрдб рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ:
 StorageClient.prototype.saveBoard = function(data) { this.azureClient .invokeApi( "board", { method: "POST", body: data }) .done( function(response) { console.log(response); $.jGrowl("Board saved!"); }, function(error) { var xhr = error.request; $.jGrowl("Error calling azure API " + xhr.status + " " + xhr.responseText); }); }; 

azureClient.invokeApi рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рд╕рджрд╕реНрдпрддрд╛ рд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рд╡рд┐рдзрд┐ рд╕рдорд╛рди рджрд┐рдЦрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЗ рднреА рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
 StorageClient.prototype.loadBoard = function(boardId, onBoardLoaded, onBoardLoadFailed) { var query = this.azureClient .invokeApi( "board", { method: "GET", parameters: { boardId: boardId } }) .done( function(xmlHttpRequest) { console.log(xmlHttpRequest); onBoardLoaded(xmlHttpRequest); }, function(error) { var xhr = error.request; onBoardLoadFailed(xhr); }); }; 


рдмреНрд▓реЙрдм рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддреИрдирд╛рддреА

рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдбреАрдмрдЧ рдХрд┐рдпрд╛ред рдЗрд╕реЗ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, Azure Blob Storage рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреА рдореЗрдЬрдмрд╛рдиреА рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдЬрд╝реНрдпреЛрд░ рд╡реЗрдм рдХрдВрд╕реЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдордп, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдмреВрдБрдж рдкрд╣реБрдВрдЪ рд╕реНрддрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рднреА рдмреНрд▓реЙрдмреНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдХрдВрдЯреЗрдирд░ рдХрд╛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕реНрд╡рдпрдВ рдирд┐рдЬреА рд░рд╣реЗрдЧрд╛ред
рдЕрдм рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ рдХреЛ рдХреНрд▓рд╛рдЙрдб рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХрдВрд╕реЛрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ AzCopy, рдЬрд┐рд╕реЗ Microsoft рдбрд╛рдЙрдирд▓реЛрдб рдХреЗрдВрджреНрд░ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рд╣реИред рдбрд╛рдЙрдирд▓реЛрдб рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ WindowsAzureStorageTools.msi рдЪреБрдиреЗрдВред рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж, рдЙрди рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреНрд▓рд╛рдЙрдб рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ
AzCopy <рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░> <рдХрдВрдЯреЗрдирд░ рдкрде> / destKey: <рдкрд╣реБрдВрдЪ рдХреБрдВрдЬреА> / S

рдпрджрд┐ рдЗрд╕рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ (index.html) рдореЗрдВ рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рдЦреЛрд▓реЗрдЧрд╛ред рдХрд╛рд░рдг рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рдмреВрдБрдж рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдСрдХреНрдЯреЗрдЯ-рд╕реНрдЯреНрд░реАрдо рдкрд░ рд╕реЗрдЯ рд╣реИред
рдЗрд╕реЗ C # рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдХрд░ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдореЗрдВ рд╣рдо рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рднреА рдмреНрд▓рдмреНрд╕ рдкрд░ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╛рдирдХ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрдирдЧреЗрдЯ рд╡рд┐рдВрдбреЛрдЬ рдПрдЬрд╝реНрдпреЛрд░ рд╕реНрдЯреЛрд░реЗрдЬ рдкреИрдХреЗрдЬ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред

 namespace BlobMetadataChanger { class Program { static void Main(string[] args) { var connectionString = args[0]; var containerName = args[1]; var storageAccount = CloudStorageAccount.Parse(connectionString); var blobClient = storageAccount.CreateCloudBlobClient(); var container = blobClient.GetContainerReference(containerName); var blobs = container.ListBlobs(useFlatBlobListing: true).Cast<CloudBlockBlob>(); foreach (var blob in blobs) { UpdateBlobContentTypeIfExtensionMatch(blob, ".html", "text/html; charset=UTF-8"); UpdateBlobContentTypeIfExtensionMatch(blob, ".css", "text/css; charset=UTF-8"); UpdateBlobContentTypeIfExtensionMatch(blob, ".js", "application/javascript"); UpdateBlobContentTypeIfExtensionMatch(blob, ".png", "image/png"); UpdateBlobContentTypeIfExtensionMatch(blob, ".gif", "image/gif"); UpdateBlobContentTypeIfExtensionMatch(blob, ".jpg", "image/jpg"); } } static void UpdateBlobContentTypeIfExtensionMatch( CloudBlockBlob blob, string extension, string contentType) { if (blob.Name.EndsWith(extension)) { blob.Properties.ContentType = contentType; blob.SetProperties(); } } } } 

рд╕рдм рдХреБрдЫ, рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рд╕рд╣реА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг

рдпрд╣, рд╢рд╛рдпрдж, рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдпрд╛рдж рдХрд┐рдпрд╛: рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ред рдЕрдм рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рдЪ рдореЗрдВ, рдЖрдкрдХреА рдпреЛрдЬрдирд╛рдУрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЧрд╛рдЗрдб рдХреЛ рдХрдВрдЯреЗрдирд░ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рднреА рд╣реЛрддрд╛ рд╣реИ рдФрд░, рдпрджрд┐ рдЖрдк рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
Azure рд╡реЗрдм рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ, рдЕрдкрдирд╛ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдвреВрдВрдвреЗрдВ рдФрд░ "рдкрд╣рдЪрд╛рди" рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЯреАрдо рдореЗрдВ рд╕рднреА рдХрд╛ рдЯреНрд╡рд┐рдЯрд░ рдЕрдХрд╛рдЙрдВрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ рдмреЛрд░реНрдб рдХреЛ рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╣рд╛рдВ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВрдЧреЗ: https://dev.twitter.com/apps/new ред рд╕рднреА рдлрд╝реАрд▓реНрдб рднрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдкреЛрд╖рд┐рдд рдЙрдкрднреЛрдХреНрддрд╛ рдХреБрдВрдЬреА рдФрд░ рдЙрдкрднреЛрдХреНрддрд╛ рдЧреБрдкреНрдд рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ "рдкрд╣рдЪрд╛рди" рдЯреИрдм рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЯреНрд╡рд┐рдЯрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдХреЙрд▓рдмреИрдХ URL рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреА рдореЛрдмрд╛рдЗрд▓ рд╕реЗрд╡рд╛ рдХреЗ рдореБрдЦреНрдп URL рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╕рд╛рде рд╣реА рдмреЙрдХреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ "рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЯреНрд╡рд┐рдЯрд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ"ред рдореБрдЭреЗ рдпрд╣ рддреБрд░рдВрдд рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдиреБрдХрд╕рд╛рди рдЙрдард╛рдирд╛ рдкрдбрд╝рд╛ред
рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрд╡рд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдмреЛрд░реНрдб рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, http рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрдм рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдХреЙрд▓ рдХрд░реЗрдВ
 azureClient.login("twitter").then(loadBoard, onError); 

рдЗрд╕ рдкрд╛рда рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╡рд░реНрдгрд┐рдд рд╣реИред
рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХрд╕реНрдЯрдо рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
 function CheckUser(request) { var allowedUsers = [ тАЬTwitter:1111111тАЭ, тАЬTwitter:22222222тАЭ ]; return _.find( allowedUsers, function(allowedUser) { request.user.userId == allowedUser }) !== undefined; } 


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

рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд╣реБрдВрдЪреЗ, рд▓реЗрдХрд┐рди рд╡рд┐рд╖рдп рдХреЗ рдЕрдВрдд рддрдХ рдирд╣реАрдВред рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ, рдХреНрд▓рд╛рдЙрдб рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ CORS рд╕рдорд░реНрдерди рдХреА рд╢реБрд░реБрдЖрдд рд╕рд╣рд┐рдд Azure рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛ рдЕрдкрдбреЗрдЯ рдХрд╛ рдПрдХ рдирдпрд╛ рдмреИрдЪ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдЯреЛрд░реЗрдЬ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдХреЛрд░ рдирд┐рдпрдореЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдХреЗ, рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдЯреЗрдмрд▓ рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ Azure рдореЛрдмрд╛рдЗрд▓ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд┐рд╕реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рд╣реИред рдмреЗрд╢рдХ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЦреЛ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рд╕реЗ рдпреБрдХреНрдд рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд┐рд▓реЗрдЧрд╛ред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╣реЗрдмреНрд░рд╕реНрддреНрдп рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рдХрдЯ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/In204394/


All Articles