рдЧреЛ (Google рдРрдк рдЗрдВрдЬрди) рдФрд░ рд▓реБрдЖ (рдХреЛрд░реЛрдирд╛ рдПрд╕рдбреАрдХреЗ) рдкрд░ рдкреЗрдВрдЧреБрдЗрди рдбреЗрдХреЗрдпрд░ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рд▓рд┐рдЦрдирд╛



1. рдкрд░рд┐рдЪрдп



рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ Google рдРрдк рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред



рд╕рд░реНрд╡рд░ рднрд╛рдЧ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреЗрдВрдЧреБрдЗрди рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдореЛрдмрд╛рдЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ HTTP рдпрд╛ HTTPS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред

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

рдкреНрд░рддреНрдпреЗрдХ рдкреЗрдВрдЧреБрдЗрди рдореЗрдВ Name



, Bio



рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рдлрд╝реАрд▓реНрдб рдХреЗ Bio



рдлрд╝реАрд▓реНрдб рд╣реЛрддреЗ рд╣реИрдВред



2. рдЕрдиреБрд╡рд╛рдж рдХреА рд╕реВрдХреНрд╖реНрдорддрд╛



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



3. рддреИрдпрд╛рд░реА



рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Google рдРрдк рдЗрдВрдЬрди рдЧреЛ рдПрд╕рдбреАрдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ Google рдРрдк рдЗрдВрдЬрди рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, "рдЕрднреА рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдПрдХ рдирд╛рдо рджреЗрдВ, рдЧреЛ рдЪреБрдиреЗрдВ, рдПрд╕рдбреАрдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ ( PATH



, GOROOT



, GOPATH



, APPENGINE_DEV_APPSERVER



) APPENGINE_DEV_APPSERVER



рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ goapp



рдореЗрдВ goapp



рдХрдорд╛рдВрдб рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ GAE рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╕рд░рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ goapp deploy



рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд╣ рдЖрдкрд╕реЗ Google рдЦрд╛рддреЗ рдХрд╛ рдИрдореЗрд▓ рдкреВрдЫреЗрдЧрд╛, рдЬрд┐рд╕ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрдерд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо app.yaml рдФрд░ рд╕рд╛рдЗрдЯ рдкрд░ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓реЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИред



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



4. рдХреНрд▓рд┐рдВрдЯ рд╕рд░реНрд╡рд░



рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ рдХреНрд▓рд╛рдЗрдВрдЯ (рдмрд╛рдПрдВ) рдФрд░ рд╕рд░реНрд╡рд░ (рджрд╛рдПрдВ) рдХреЗ рдмреАрдЪ рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рд╕рдВрдЪрд╛рд░ рдпреЛрдЬрдирд╛ рджрд┐рдЦрд╛рддреА рд╣реИред









рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЧреНрд░рд╛рд╣рдХ рдХреЗрд╡рд▓ рдкреЗрдВрдЧреБрдЗрди рдХреА рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рддреАрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИред HTTP рдкрд░ рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк HTTPS рдХрд╛ рдореБрдлреНрдд рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдЬреАрдПрдИ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдПрд╕рдПрд╕рдПрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред



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



penguin-daycare-simulator.appspot.com

рдПрдХ рд╕рд░рд▓ рдЧреНрд░реАрдЯрд┐рдВрдЧ, рдореЛрдмрд╛рдЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реЗрд╡рд╛ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИред рдЖрдк http рдХреЛ https рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



penguin-daycare-simulator.appspot.com/penguins

рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдз рд╣реИред рдЗрд╕рдХреА рдорджрдж рд╕реЗ, рдореЛрдмрд╛рдЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЙрди рд╕рднреА рдкреЗрдВрдЧреБрдЗрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рдЧрд░рд╛рдиреА рдореЗрдВ рд╣реИрдВред

рдЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреНрд░реЛрдо рдХреЗ рд▓рд┐рдП JSONview рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ ред



penguin-daycare-simulator.appspot.com/stat/visit

penguin-daycare-simulator.appspot.com/stat/fish

penguin-daycare-simulator.appspot.com/stat/bellyrub

рдпреЗ рддреАрдиреЛрдВ рдкреНрд░рд╢реНрди рдкреЗрдВрдЧреНрд╡рд┐рди рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдЧрдгрдирд╛ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдкреЗрдВрдЧреБрдЗрди Id



POST рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк Id



рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ "рдУрдХреЗ" рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдлрд▓ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдПрдХ рдФрд░ рд╕рдВрдХреЗрдд рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред



5. рдЕрдзрд┐рдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ, рдЕрдзрд┐рдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ!






рд▓реЗрдЦ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рд╕реЗ рдкрд╣рд▓реЗ рд╣реА, рдореБрдЭреЗ рдЗрд╕ рдкреЗрдВрдЧреБрдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рдЖ рдЧрдпрд╛:

рд╕рдХрд╛рд░рд╛рддреНрдордХ рджреЗрдЦреЗрдВ


6. рд╕рд░реНрд╡рд░ - Google рдРрдк рдЗрдВрдЬрди



рдЕрдм рд╣рдо рд╕реАрдзреЗ рдХреЛрдб рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЧреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

 PenguinDaycareSimulatorServer/ тФЬтФАтФА default/ тФВ  тФЬтФАтФА app.go тФВ  тФЬтФАтФА default.yaml тФВ  тФФтФАтФА penguins.json тФЬтФАтФА static/ тФВ  тФЬтФАтФА favicon.ico тФВ  тФФтФАтФА static.yaml тФФтФАтФА dispatch.yaml
      
      





default



рдФрд░ static



рдореЙрдбреНрдпреВрд▓ рд╣реИрдВред рдЬреАрдПрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рддреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЗрд╡рд▓ рддреАрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА app.yaml



: app/app.go



, app/app.go



рдФрд░ app/app.go



penguins.json



app/app.go



ред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдорд╛рдорд▓рд╛ рдерд╛ (рдЖрдк GitHub рдкрд░ рдкрд╣рд▓рд╛ max_concurrent_requests



рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдореИрдВ max_concurrent_requests



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



рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗрд╡рд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдФрд░ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ GAE рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо 2 рдореЙрдбреНрдпреВрд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╡рд╣ рдЗрд╕реЗ рдореЙрдбреНрдпреВрд▓рд░ рд╕рдордЭ рд╕рдХреЗред



static



рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬрд┐рд╕реЗ (рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд GAE рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ) рдХреЗ рд╕рд╛рде рддрд┐рд░рд╕реНрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ favicon.ico



рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рджреВрд░ рдХрд░рдирд╛ рд╣реИред



default



- рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓, рдЬреЛ рд╕рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



*.yaml



рдлрд╛рдЗрд▓реЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рд╡рд┐рд╡рд░рдг рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдПрдХ dispatch.yaml



рдлрд╛рдЗрд▓ рдЬреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ URL рдХреМрди рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВред

dispatch.yaml
 application: penguin-daycare-simulator dispatch: - url: "*/favicon.ico" module: static - url: "*/" module: default
      
      





static.yaml
 application: penguin-daycare-simulator module: static version: 1 runtime: python27 api_version: 1 threadsafe: true handlers: - url: /favicon.ico static_files: favicon.ico upload: favicon.ico
      
      





default.yaml
 application: penguin-daycare-simulator module: default version: 1 runtime: go api_version: go1 automatic_scaling: max_concurrent_requests: 500 handlers: - url: /.* script: _go_app
      
      





рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ static.yaml



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

рдмрдВрдж рд╡рд┐рд╖рдп
рдпрд╣рд╛рдБ рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдпрд╣ рддрд░реНрдХ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ "рд╕реНрдереИрддрд┐рдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП PHP рдкрд╛рдпрдерди рд╕реЗ рднреА рдмрджрддрд░ рд╣реИ" рдФрд░ рдкрд╡рд┐рддреНрд░рддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдХрд░реАрдм рд╣реИ, рдЗрд╕реАрд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪреБрдирд╛ рд╣реИред рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рд╕рдм рд╡реНрдпрд░реНрде рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рди рддреЛ рдкрд╛рдпрдерди рдФрд░ рди рд╣реА рдкреАрдПрдЪрдкреА рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред



default.yaml



рдореЗрдВ handlers



рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА URL рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, app.go рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ (рдЦрд╛рддрд╛ dispatch.yaml



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



рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдпрдорд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдпрд╣рд╛рдБ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред



penguins.json



- рдПрдХ JSON рдлрд╝рд╛рдЗрд▓ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреЗрдВрдЧреБрдЗрди рдХреЗ рдирд╛рдо рдФрд░ рд╡рд┐рд╡рд░рдг рд╣реИрдВред

penguins.json
 [ {"id": "1", "name": "Tux", "bio": "Beloved Linux mascot" }, {"id": "2", "name": "Skipper", "bio": "Small combat squad leader" }, {"id": "3", "name": "Lolo", "bio": "Russian adventurer" }, {"id": "4", "name": "Gunter", "bio": "The darkest character in Adventure Time" }, {"id": "5", "name": "The Penguin", "bio": "Na, na, na, na, na, na, na, na, na, na... The Penguin! " } ]
      
      





рдкреЗрдВрдЧреБрдЗрди рдЬреЛрдбрд╝рдирд╛, рд╕рдВрдкрд╛рджрди рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИред



рдЕрдм рд╣рдо app.go



рдЖрддреЗ рд╣реИрдВ - рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рджрд┐рд▓ред рдкреВрд░реА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ GitHub рдкрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ - app.go.



рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд░рдЪрдирд╛:

 package app    . import (...)   : Id, , , . type penguin struct {...}  ()  . var penguins []penguin     . type penguinEntity struct {...} . func init() {...}  penguins.json   penguins. func loadPenguinsJson() {...}  / -   . func rootHandler(w http.ResponseWriter, r *http.Request) {...}  /penguins -        JSON. func penguinsHandler(w http.ResponseWriter, r *http.Request) {...}   /stat/visit -  . func visitHandler(w http.ResponseWriter, r *http.Request) {...}   /stat/fish -   . func fishHandler(w http.ResponseWriter, r *http.Request) {...}   /stat/bellyrub -    . func bellyrubHandler(w http.ResponseWriter, r *http.Request) {...}
      
      





рдЬрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ init () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ p рдкреЗрдВрдЧреБрдЗрдиins.json рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдХреМрди рд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЖрдк рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдВрдХ рдкрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



json.Marshal()



рдкреЗрдВрдЧреБрдЗрди json.Marshal()



рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреЗрдВрдЧреБрдЗрди рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ fmt.Fprint()



рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рджреЗрддрд╛ рд╣реИред



visitHandler()



, fishHandler()



, bellyrubHandler()



рдПрдХ рд╣реА рддрд░реНрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рдкреЗрдВрдЧреБрдЗрди рд▓реЗрддреЗ рд╣реИрдВ, рдПрдХ рд╕реЗ рдПрдХ рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдбреЗрдЯрд╛рдмреЗрд╕ - рдбреЗрдЯрд╛рд╕реНрдЯреЛрд░ - SQL рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рдПрдХ NoSQL рд╕рдорд╛рдзрд╛рди рд╣реИред рдЙрд╕рдХреЗ рдХрд╛рдо рдХрд╛ рд╡рд░реНрдгрди рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рдпреЛрдЧреНрдп рд╣реИред



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



рдкреЗрд╢ рдХрд┐рдпрд╛ - penguins



рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдЕрдВрддрд┐рдо рдЕрджреНрдпрддрди рдХрд╛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ /penguins



рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде, рдореИрдВ updatePenguinsStatistics()



рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ updatePenguinsStatistics()



, рдЬреЛ рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреИрд╢ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЪрдХреНрд░ рдореЗрдВ penguins



рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреЗрдВрдЧреБрдЗрди рдХреЗ рд▓рд┐рдП рдХрд╛рдЙрдВрдЯрд░ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред



рдЕрдкрдбреЗрдЯ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрд░реЛрдз / рдЕрдкрдбреЗрдЯ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд updateHandler()



рд╣реИрдВрдбрд▓рд░ рдкреЗрд╢ рдХрд┐рдпрд╛ред



рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЧреЛрд░реЛрдЗрди рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп penguins



рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдПрдХ рд╕рд╛рде рд▓рд┐рдЦрдиреЗ рдпрд╛ рдкрдврд╝рдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, RWMutex



рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореНрдпреВрдЯреЗрдХреНрд╕ред рд╕рд╛рдзрд╛рд░рдг Mutex



рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реИред



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



рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ GAE рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рддреАрди рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 goapp deploy default/default.yaml goapp deploy static/static.yaml appcfg.py update_dispatch .
      
      





рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЬрдм app.go рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдХреЗрд╡рд▓ goapp deploy default/default.yaml



рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред



рдЕрдВрдд рдореЗрдВ, рдореИрдВ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рдореБрдлреНрдд рдмрд┐рд▓рд┐рдВрдЧ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХреА рдЧрдИ рдмрд┐рд▓рд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдкреНрд░рддрд┐ рджрд┐рди рдЕрдзрд┐рдХрддрдо рд▓рд╛рдЧрдд $ 1 рдХреЗ рдмрд░рд╛рдмрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕реА рд╕рдордп, рдХреБрдЫ рдореБрдлреНрдд рдХреЛрдЯрд╛ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рдХреБрдЫ рднреА рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред



7. рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ - рдХреЛрд░реЛрдирд╛ рдПрд╕рдбреАрдХреЗ



рдХреЛрд░реЛрдирд╛ рдПрд╕рдбреАрдХреЗ рдПрдВрдбреНрд░реЙрдЗрдб, рдЖрдИрдУрдПрд╕, рд╡рд┐рдВрдбреЛрдЬ рдлреЛрди (рдЬрд▓реНрдж рд╣реА рдЖ рд░рд╣рд╛ рд╣реИ) рдФрд░ рдПрдЪрдЯреАрдПрдордПрд▓ 5 (рд╡рд┐рдХрд╛рд╕ рдореЗрдВ) рдХреЗ рд▓рд┐рдП рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рдореИрдВ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдЗрд╕ рдЙрддреНрдкрд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рджреЛрдиреЛрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреНрд░реАрд▓рд╛рдВрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП рдЧреЗрдо рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рд╕рднреНрдп рдЧрддрд┐ рдФрд░ рдЧрддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВред



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

рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛
 PenguinDaycareSimulator/ тФЬтФАтФА images/ тФВ  тФЬтФАтФА penguins/ тФВ  тФВ  тФЬтФАтФА 1.png тФВ  тФВ  тФЬтФАтФА 1@2x.png тФВ  тФВ  тФЬтФАтФА 2.png тФВ  тФВ  тФЬтФАтФА 2@2x.png тФВ  тФВ  тФЬтФАтФА 3.png тФВ  тФВ  тФЬтФАтФА 3@2x.png тФВ  тФВ  тФЬтФАтФА 4.png тФВ  тФВ  тФЬтФАтФА 4@2x.png тФВ  тФВ  тФЬтФАтФА 5.png тФВ  тФВ  тФФтФАтФА 5@2x.png тФВ  тФЬтФАтФА background.jpg тФВ  тФЬтФАтФА background@2x.jpg тФВ  тФЬтФАтФА button-over.png тФВ  тФЬтФАтФА button-over@2x.png тФВ  тФЬтФАтФА button.png тФВ  тФЬтФАтФА button@2x.png тФВ  тФЬтФАтФА dot-off.png тФВ  тФЬтФАтФА dot-off@2x.png тФВ  тФЬтФАтФА dot.png тФВ  тФЬтФАтФА dot@2x.png тФВ  тФЬтФАтФА fish.png тФВ  тФЬтФАтФА fish@2x.png тФВ  тФЬтФАтФА hand.png тФВ  тФЬтФАтФА hand@2x.png тФВ  тФЬтФАтФА popup.png тФВ  тФФтФАтФА popup@2x.png тФЬтФАтФА lib/ тФВ  тФЬтФАтФА api.lua тФВ  тФЬтФАтФА app.lua тФВ  тФФтФАтФА utils.lua тФЬтФАтФА scenes/ тФВ  тФЬтФАтФА choose.lua тФВ  тФЬтФАтФА menu.lua тФВ  тФФтФАтФА penguin.lua тФЬтФАтФА Default-568h@2x.png тФЬтФАтФА Icon-60.png тФЬтФАтФА Icon-60@2x.png тФЬтФАтФА Icon-72.png тФЬтФАтФА Icon-72@2x.png тФЬтФАтФА Icon-76.png тФЬтФАтФА Icon-76@2x.png тФЬтФАтФА Icon-Small-40.png тФЬтФАтФА Icon-Small-40@2x.png тФЬтФАтФА Icon-Small-50.png тФЬтФАтФА Icon-Small-50@2x.png тФЬтФАтФА Icon-Small.png тФЬтФАтФА Icon-Small@2x.png тФЬтФАтФА Icon-hdpi.png тФЬтФАтФА Icon-ldpi.png тФЬтФАтФА Icon-mdpi.png тФЬтФАтФА Icon-ouya.png тФЬтФАтФА Icon-xhdpi.png тФЬтФАтФА Icon-xxhdpi.png тФЬтФАтФА Icon.png тФЬтФАтФА Icon@2x.png тФЬтФАтФА build.settings тФЬтФАтФА config.lua тФФтФАтФА main.lua
      
      





рдЖрдк рдЕрднреА рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд▓реБрдЖ рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред



config.lua



, build.settings



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



рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд░реВрдЯ рдореЗрдВ рдЖрдкрдХреЛ рдЖрдИрдУрдПрд╕ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдЖрдЗрдХрди рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдорд┐рд▓реЗрдЧрд╛, рд╕рд╛рде рд╣реА iPhone 5 рдкрд░ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП Default-568h@2x.png



ред рдЫрд╡рд┐рдпреЛрдВ / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рдирд┐рдпрдорд┐рдд рдлрд╛рдЗрд▓реЗрдВ рдФрд░ рдЙрдирдХреЗ рджреЛрдЧреБрдиреЗ рдПрдЪрдбреА рд╕рдВрд╕реНрдХрд░рдг @2x



ред рдЕрдм, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдЕрдм iPhone 3GS рдЬреИрд╕реА рд╕реНрдХреНрд░реАрди рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЙрдирдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЧреИрд░-рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред рдкреВрд░реНрдг iPad рд░реЗрдЯрд┐рдирд╛ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА @4x



рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ config.lua



рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ config.lua



, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреЗрдо рд╡реИрд╕реЗ рднреА рдареАрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред



рдХреЛрд░реЛрдирд╛ рдПрд╕рдбреАрдХреЗ рдиреЗ main.lua



рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛, рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рдХреБрдЫ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рджреГрд╢реНрдп рдХреЛ "рдПрдВрдЯрд░ рдж рдбреЗрдХреЗрдпрд░" рдмрдЯрди рдХреЗ рд╕рд╛рде рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рджреГрд╢реНрдпреЛрдВ (рд╕реНрдХреНрд░реАрди) рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ scenes/



рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ lib/



рдореЗрдВ рд░рдЦрд╛ рд╣реИред рдбреЗрд╡рд▓рдкрд░ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдЬреИрд╕рд╛ рд╡рд╣ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИред



lib/



рдореЗрдВ app.lua



рдФрд░ utils.lua



- рд╕рд╛рде рдореЗрдВ рдпрд╣ рдХреЛрд░реЛрдирд╛ рдПрд╕рдбреАрдХреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдореЗрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИред app.lua



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



main.lua



рд╕реЗ scenes/menu.lua



рддрдХ рдХрд╛ рд╕рдВрдХреНрд░рдордг рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ scenes/menu.lua



рд╣реИ

 storyboard.gotoScene('scenes.menu')
      
      





рдЬрд╣рд╛рдВ, рдмрджрд▓реЗ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдкрд░ рдкреЗрдВрдЧреБрдЗрди рдЕрдиреБрд░реЛрдз рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдБ menu.lua



рд╕реЗ рдХреЛрдб рдХрд╛ рдореБрдЦреНрдп рдЯреБрдХрдбрд╝рд╛ рд╣реИред

 function scene:createScene (event) local group = self.view app.newText{g = group, text = 'Penguin Daycare', size = 32, x = _CX, y = _CY - 150} app.newText{g = group, text = 'Simulator', size = 32, x = _CX, y = _CY - 110} local pleaseWait = app.newText{g = group, text = 'Please Wait', size = 16, x = _CX, y = _CY} local button = app.newButton{g = group, x = _CX, y = _CY, text = 'Enter the Daycare', onRelease = function() storyboard.gotoScene('scenes.choose', {effect = 'slideLeft', time = app.duration}) end} button.isVisible = false app.api:getPenguins(function() pleaseWait.isVisible = false button.isVisible = true end) end
      
      





рдЯреЗрдХреНрд╕реНрдЯ рдХреА рддреАрди рд▓рд╛рдЗрдиреЗрдВ рдФрд░ рдПрдХ рдмрдЯрди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рддрдХ рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓рддреА рддрдм рддрдХ рдмрдЯрди рдЫрд┐рдкрд╛ рд░рд╣рддрд╛ рд╣реИред рдЕрдиреБрд░реЛрдз рдЦреБрдж app.api:getPenguins()



рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ app.api:getPenguins()



рдлрд╝рдВрдХреНрд╢рди, рдЗрд╕рдореЗрдВ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред



рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреЗрдВрдЧреБрдЗрди рдЪрдпрди рджреГрд╢реНрдп рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдореИрдВ рдХреЛрдб рдХрд╛ рдХреЗрд╡рд▓ рдореБрдЦреНрдп рднрд╛рдЧ рднреА choose.lua



ред рдлрд╛рдЗрд▓ рдлрд╝рд╛рдЗрд▓ рд╕реЗред

 function scene:createScene(event) local group = self.view self.backButton = app.newButton{g = group, x = _L + 10, y = _T + 10, w = 48, h = 32, rp = 'TopLeft', text = 'Back', fontSize = 14, onRelease = function() storyboard.gotoScene('scenes.menu', {effect = 'slideRight', time = app.duration}) end} local function gotoPenguin(ind) storyboard.gotoScene('scenes.penguin', {effect = 'slideLeft', time = app.duration, params = ind}) end local slideView = newSlideView{g = group, x = 0, y = _CY, dots_y = 180, onRelease = gotoPenguin} for i = 1, #app.api.penguins do local p = app.api.penguins[i] local slide = display.newGroup() app.newImage('images/popup.png', {g = slide, w = 300, h = 335}) app.newImage('images/penguins/' .. p.id .. '.png', {g = slide, w = 200, h = 256}) app.newText{g = slide, x = 0, y = -140, text = p.name, size = 18, color = 'white'} app.newText{g = slide, x = 0, y = 140, text = p.bio, size = 14, color = 'white', w = 220, align = 'center'} slideView:addSlide(slide) end slideView:makeDots() slideView:gotoSlide(1) end
      
      





рдпрд╣рд╛рдБ newSlideView()



рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рд╕рд░рд▓ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдкреЗрдВрдЧреБрдЗрди рд╕реНрд▓рд╛рдЗрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ choose.lua



рдореЗрдВ рд╕рд╣реА рд╕реНрдерд┐рдд рд╣реИред



рдкреНрд░рддреНрдпреЗрдХ рдкреЗрдВрдЧреБрдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд▓рд╛рдЗрдб рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдкреЗрдВрдЧреБрдЗрди рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдПрдкреНрд▓реАрдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреЗрдВрдЧреБрдЗрди рдХреА рдЖрдИрдбреА рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЬреАрдПрдИ рд╕рд░реНрд╡рд░ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдХреЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрд░реЛрдирд╛ рдПрд╕рдбреАрдХреЗ рдореЗрдВ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд╣реИ display.loadRemoteImage()



рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХрд╛ network.download()



ред



рд╕реНрд▓рд╛рдЗрдб рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, gotoPenguin()



рдлрд╝рдВрдХреНрд╢рди рдХреЛ gotoPenguin()



, рдЬреЛ рд╕рднреА рдкреНрд░рд╛рдкреНрдд рдкреЗрдВрдЧреБрдЗрди рдХреА рд╕рд░рдгреА (рддрд╛рд▓рд┐рдХрд╛) рдореЗрдВ рдкреЗрдВрдЧреБрдЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ ( Id



рдирд╣реАрдВ) рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрдВрддрд┐рдо penguin.lua



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

penguin.lua
 function scene:createScene(event) local group = self.view local background = app.newImage('images/background.jpg', {g = group, w = 384, h = 640, x = _CX, y = _CY}) self.backButton = app.newButton{g = group, x = _L + 10, y = _T + 10, w = 48, h = 32, rp = 'TopLeft', text = 'Back', fontSize = 14, onRelease = function() storyboard.gotoScene('scenes.choose', {effect = 'slideRight', time = app.duration}) end} local ind = event.params local p = app.api.penguins[ind] local visitsLabel = app.newText{g = group, x = _CX, y = _T + 20, text = 'Visits: ' .. p.visit_count, size = 18, color = 'white'} local fishLabel = app.newText{g = group, x = _CX, y = _T + 40, text = 'Fish: ' .. p.fish_count, size = 18, color = 'white'} local bellyrubsLabel = app.newText{g = group, x = _CX, y = _T + 60, text = 'Belly rubs: ' .. p.bellyrub_count, size = 18, color = 'white'} local penguin = app.newImage('images/penguins/' .. p.id .. '.png', {g = group, w = 200, h = 256, x = _CX, y = _CY - 25}) app.newButton{g = group, x = _CX - 80, y = _B - 50, w = 128, h = 48, text = 'Fish', fontSize = 14, onRelease = function() local fish = app.newImage('images/fish.png', {g = group, x = penguin.x, y = penguin.y + 200, w = 512, h = 188}) fish.alpha = 0.8 transition.to(fish, {time = 400, alpha = 1, y = penguin.y, xScale = 0.1, yScale = 0.1, transition = easing.outExpo, onComplete = function(obj) transition.to(fish, {time = 400, alpha = 0, onComplete = function(obj) display.remove(obj) end}) end}) app.api:sendFish(p.id) p.fish_count = p.fish_count + 1 fishLabel:setText('Fish: ' .. p.fish_count) end} app.newButton{g = group, x = _CX + 80, y = _B - 50, w = 128, h = 48, text = 'Belly rub', fontSize = 14, onRelease = function() local hand = app.newImage('images/hand.png', {g = group, x = penguin.x - 40, y = penguin.y + 30, w = 80, h = 80, rp = 'TopLeft'}) transition.to(hand, {time = 1200, x = penguin.x + 40, transition = easing.swing3(easing.outQuad), onComplete = function(obj) display.remove(obj) end}) app.api:sendBellyrub(p.id) p.bellyrub_count = p.bellyrub_count + 1 bellyrubsLabel:setText('Belly rubs: ' .. p.bellyrub_count) end} app.api:sendVisit(p.id) p.visit_count = p.visit_count + 1 visitsLabel:setText('Visits: ' .. p.visit_count) end
      
      





penguin.lua



, рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╡рд┐ рднрд░реА рд╣реБрдИ рд╣реИ, рдЪрдпрдирд┐рдд рдкреЗрдВрдЧреБрдЗрди рдХреА рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИ, рдХрдИ рдкрд╛рда рд▓реЗрдмрд▓ рдФрд░ рджреЛ рдПрдХреНрд╢рди рдмрдЯрди рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рдЖрдк рдЙрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдПрдирд┐рдореЗрдЯреЗрдб рд╣реЛрддреА рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ app.api:sendFish()



рдФрд░ app.api:sendBellyrub()



рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ app.api:sendVisit()



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



рдЕрдВрдд рдореЗрдВ, рд╕рднреА рд╕рд░реНрд╡рд░ рдХрд╛рдо lib/api.lua



рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

api.lua
 local _M = {} local app = require('lib.app') _M.hostname = 'http://penguin-daycare-simulator.appspot.com' function _M:getPenguins(callback) local url = '/penguins#' .. math.random(1000, 9999) network.request(self.hostname .. url , 'GET', function (event) if not event.isError then local response = json.decode(event.response) if response then self.penguins = response callback() end end end) end function _M:sendVisit(id) local url = '/stat/visit' local request = {body = 'id=' .. id} network.request(self.hostname .. url , 'POST', function (event) if event.isError then app.alert('Network error') end end, request) end function _M:sendFish(id) local url = '/stat/fish' local request = {body = 'id=' .. id} network.request(self.hostname .. url , 'POST', function (event) if event.isError then app.alert('Network error') end end, request) end function _M:sendBellyrub(id) local url = '/stat/bellyrub' local request = {body = 'id=' .. id} network.request(self.hostname .. url , 'POST', function (event) if event.isError then app.alert('Network error') end end, request) end return _M
      
      





рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╕рд░рд▓ POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред getPenguins()



рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ JSON рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдПрдХ рд╕рд░рдгреА (рддрд╛рд▓рд┐рдХрд╛) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрдХрд░ json.decode()



рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ (рд╕рдВрдкрддреНрддрд┐) рдлрд╝реАрд▓реНрдб рдореЗрдВ рд░рдЦреА рдЬрд╛рддреА рд╣реИред



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, POST рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рдФрд░ рдХреЛрд░реЛрдирд╛ SDK рдореЗрдВ рдЙрдирдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рддрджрдиреБрд╕рд╛рд░, Google рдРрдк рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдерд╛ред рдореИрдВ рдкреЗрдВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд╣рдЬ рд╣реИред



8. рд╕рдВрджрд░реНрдн



рд╕реНрд░реЛрдд рдореЗрд░реЗ GitHub рдкрд░ рд╣реИрдВ:



рдЖрдк рдПрдВрдбреНрд░реЙрдЗрдб 2.3.3+ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд╛рд░реНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рдПрдкреАрдХреЗ ( рдорд┐рд░рд░ ) рд╣реИред

рдпрд╛ рдХреЛрд░реЛрдирд╛ рдПрд╕рдбреАрдХреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЧрд┐рдЯрд╣рдм рд╕реЗ рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдХреЛрд░реЛрдирд╛ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рдЪрд▓рд╛рдПрдВред



рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдореЗрд░реА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП M0sTH8 рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж ред



рдЯреНрд╡рд┐рдЯрд░ @SergeyLerg рдкрд░ рдореБрдЭреЗ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ



рд╡рд╣ рд╕рдм рд╣реИред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!



All Articles