<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5756693843338209436</id><updated>2026-09-11T23:44:15.224-07:00</updated><category term="философия"/><category term="unity3d"/><category term="development"/><category term="unity"/><category term="разработка"/><category term="ios"/><category term="мысли"/><category term="android"/><category term="philosophy"/><category term="игры"/><category term="цели"/><category term="game development"/><category term="ios dev"/><category term="ngui"/><category term="objective c"/><category term="optimization"/><category term="plugins"/><category term="presentations"/><category term="road smash"/><category term="беллетристика"/><category term="никто не читает теги"/><category term="30 дней"/><category term="app store"/><category term="asset store"/><category term="clumsy fino"/><category term="continuous integration"/><category term="effects"/><category term="facebook"/><category term="flurry"/><category term="fonts"/><category term="hack day"/><category term="kiss"/><category term="localizations"/><category term="ms"/><category term="performance"/><category term="review"/><category term="scrum."/><category term="seminar"/><category term="serialization"/><category term="shaders"/><category term="sozluk"/><category term="technoball"/><category term="useful links"/><category term="windows"/><category term="windows phone"/><category term="Арас"/><category term="Дуров"/><category term="Стив Джобс"/><category term="баги"/><category term="бег"/><category term="виндакапец"/><category term="вопросы"/><category term="говнокод"/><category term="делать"/><category term="дизайнер vs программист"/><category term="игра"/><category term="идеи"/><category term="корпорация"/><category term="лкш"/><category term="ненавижу винду"/><category term="нытье"/><category term="провал"/><category term="продукт"/><category term="проекты"/><category term="скриншоты"/><category term="стартап"/><category term="строки"/><category term="успех"/><title type='text'>Пум-пурум-пурум</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-2432710660132524107</id><published>2014-10-21T18:10:00.000-07:00</published><updated>2014-10-22T02:29:45.630-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="game development"/><category scheme="http://www.blogger.com/atom/ns#" term="игры"/><category scheme="http://www.blogger.com/atom/ns#" term="провал"/><category scheme="http://www.blogger.com/atom/ns#" term="разработка"/><category scheme="http://www.blogger.com/atom/ns#" term="успех"/><category scheme="http://www.blogger.com/atom/ns#" term="философия"/><title type='text'>Весело о грустном или почему твоя первая игра провалится</title><content type='html'>&lt;br /&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;- А вы слышали об энгри бердс? Такая тупая игра и она взлетела!!!111!&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;- Почему такая тупая механика, и эта игра успешная?&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;- Что сделать, чтобы твою игру качали?&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;-А как заработать на игре?&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;-О, у меня отличная идея! Короче,&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;давай я поделюсь, ты сделаешь, прибыль - пополам?&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;(с)ОЛОЛОШИ&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;- Если хочешь заработать на играх - сыграй лучше в казино,&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;там вероятность больше&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;(с)Денчик&lt;/i&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://pp.vk.me/c608219/v608219777/45ea/Crz8wVf9Al4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://pp.vk.me/c608219/v608219777/45ea/Crz8wVf9Al4.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;(геймдевелопер: ожидание)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Покажите мне хотя бы одного разработчика игр, у кого первая игра &quot;пошла&quot;. Покажите мне хотя бы одного продюссера, гейм-дизайнера, который создал сильную механику, приносящую ему хотя бы сотню долларов в день. Таких тупо не существует.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;Печальный факт №1: ваша игра не оправдает ваших ожиданий&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;div style=&quot;font-style: italic; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-style: italic; text-align: center;&quot;&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
А причин этому несколько:&lt;/div&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;разработка игры - это не разработка приложения. Если приложение решает ПРОБЛЕМУ, то игра приносит УДОВОЛЬСТВИЕ. И если можно более-менее оценить пользу от решения проблемы(&quot;приложение экономит 15 минут в день&quot; или &quot;оно заставит Вас заниматься спортом&quot;), то понятие удовольствия оценить адекватно сложно.&lt;/li&gt;
&lt;li&gt;первая игра - это первый ребенок. Поскольку ты его не рожаешь, а как двоечник Папа Карло, будешь строгать, то он получится инвалидом, с одной рукой, тремя щупальцами и уродливым лицом. Тебе все будут говорить, что это отстой, что надо первое, пятое, десятое, но ты не будешь слушать - ведь ты &lt;a href=&quot;http://bormor.livejournal.com/259880.html&quot; target=&quot;_blank&quot;&gt;защищаешь своего лебедя&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;ты нифига не знаешь. Ни как сделать красивую графику, ни оптимизировать под все устройства, ни придумать game loops, ни начальный траффик влить, не говоря уже о банальном маркетинге - тебе ведь достаточно уметь создавать коллайдеры в юньке.&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTPgdHZwuljlkUnQjn-oBRgEp1IHhsjmffLw0nINWxYnvYbrYSxRg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTPgdHZwuljlkUnQjn-oBRgEp1IHhsjmffLw0nINWxYnvYbrYSxRg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;
&lt;i&gt;&lt;b&gt;Печальный факт №2: если ты начинаешь делать игру, чтобы заработать &quot;свой миллион&quot;, то, естественно, ты сделаешь клон чего-нибудь. И он провалится.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;div&gt;
Не, нуачо, вот на твоих глазах flappy bird - саксесс стори, у тебя игра, естественно, лучше чем другие десятки клонов (синдром &lt;a href=&quot;http://en.wikipedia.org/wiki/Not_invented_here&quot; target=&quot;_blank&quot;&gt;not invented here&lt;/a&gt;, ага). Но первоначальный восторг и ажиотаж сменится полным разочарованием. А все потому что ты не до конца изучил существующую механику оригинала, не позаботился о начальных пользователях, не поработал над retention-ом.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;b&gt;Печальный факт №3: если ты геймер с рождения, то ты выпустишь игру с клевым геймплеем. Но ты не заработаешь. Проект провалится.&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
А провалится он по простой причине: ты получил ровно то, что хотел. Ты хотел сделать игру - ты ее сделал, ты не хотел заработать на этом деньги. Если изначально не подумать, на чем ты будешь зарабатывать, ничего не получишь.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Геймдизайнеры бывают трех видов:&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;люди, пришедшие из бизнеса - они смотрят на игру как на бизнес. А предприниматели на игру смотрят в ключе &quot;вложил - получил&quot;. Монетизация - ок, игры - нет.&lt;/li&gt;
&lt;li&gt;геймеры, позже устраивающиеся геймдизами. Умеют делать игры, монетизировать - нет.&lt;/li&gt;
&lt;li&gt;объединяющие свойства первых двух. &lt;a href=&quot;http://siliconrus.com/2014/10/no-gamedesign/&quot; target=&quot;_blank&quot;&gt;Таких не существует :)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;b&gt;Печальный факт №4: На свою первую игру ты потратишь неимоверное количество времени, сил. Но от этого она не станет лучше&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
Core-часть будет готова через три месяца, обвязочки-эффектики наклепаешь через пять месяцев, багофикс закончишь через девять месяцев после начала проекта. Так вот, если бы ты запустил игру сразу после core-части, результат был бы тем же самым, что и после девятимесячного марафона. &lt;a href=&quot;http://rustam-kot.blogspot.ru/2014/02/blog-post.html&quot; target=&quot;_blank&quot;&gt;Делайте быстрее&lt;/a&gt;, помните?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
Игровая индустрия является самой доходной нишей если не на всем IT-поле, то на мобильных уж точно. И не секрет, что в индустрии крутятся миллиарды-триллионы долларов. Печальный факт заключается в том, что большинство из этой лавины достается динозаврам индустрии. Инди, работающие ради искусства и питающиеся роллтонами, миллионов не видят.&lt;/div&gt;
&lt;div&gt;
Так что же делать?&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Сделать свою первую игру. Да, она провалится. Да, будет отстой. Зато наберешься опыта. И либо уйдешь, либо захочешь еще попробовать. Оба варианты ведут к лучшему.&lt;/li&gt;
&lt;li&gt;Если уже есть игра - ты крут. Это не сарказм. Всего лишь 20% людей берутся делать и заканчивают. Если ты зарелизил - ты уже в тех 20%.&lt;/li&gt;
&lt;li&gt;Не берись за все подряд. Сделай анализ рынка, определись со своей нишей.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Изучи, что популярно, поиграйся. Пойми, что цепляет, если не понимаешь - проведи &lt;a href=&quot;http://habrahabr.ru/post/219699/&quot; target=&quot;_blank&quot;&gt;коридорное тестирование&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Читай. МНОГО. Начиная от &lt;a href=&quot;http://artofgamedesign.com/&quot; target=&quot;_blank&quot;&gt;Art of Game design&lt;/a&gt;, заканчивая блогами успешных разработчиков и геймдизов.&lt;/li&gt;
&lt;li&gt;Работай. Вкалывай. Не, не так. Вджобывай. Клепай десятки игр, экспериментируй, пробуй, ошибайся.&lt;/li&gt;
&lt;li&gt;Учись. На своих ошибках, на чужих. Принимай знания и перерабатывай.&lt;/li&gt;
&lt;li&gt;Когда количество выпущенных игр перевалит за пяток, у тебя появится ощущение, как надо делать &quot;правильно&quot;. Это как увидел тучи, значит скоро будет дождь - ты будешь на уровне интуиции понимать, что если сделать так, получишь такой импакт. Объяснить не сможешь, но будешь осознавать.&lt;/li&gt;
&lt;li&gt;Делай на совесть. Чтобы игра была успешной(то есть с большим количеством закачек, с хорошим процентом ретеншна), она должна быть ИГРОЙ, а не плевком в лицо игроку. Делайте годноту - получите лояльных клиентов.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Слушай пользователей, прислушивайся к фидбеку. Чаще показывай свое &quot;тварение&quot; другим, получай фидбек. Чем раньше получишь предупреждение, тем раньше сможешь среагировать.&lt;/li&gt;
&lt;li&gt;Контактируй с другими людьми из индустрии. Дружи командами. Помогай. Это никогда не вредно.&lt;/li&gt;
&lt;li&gt;Получай удовольствие от геймдева. Разработка игр - это ведь действительно фан:)&lt;/li&gt;
&lt;li&gt;И еще раз &lt;b&gt;РАБОТАЙ&lt;/b&gt;. Сделай уже свою angry birds!&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://s5.pikabu.ru/post_img/2014/07/07/9/1404744590_1052167488.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://s5.pikabu.ru/post_img/2014/07/07/9/1404744590_1052167488.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;i&gt;(как пацаны к успеху пришли)&lt;/i&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/2432710660132524107/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2014/10/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/2432710660132524107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/2432710660132524107'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2014/10/blog-post.html' title='Весело о грустном или почему твоя первая игра провалится'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-129977036019857162</id><published>2014-07-28T12:38:00.001-07:00</published><updated>2014-07-29T15:11:25.135-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="unity"/><category scheme="http://www.blogger.com/atom/ns#" term="unity3d"/><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><category scheme="http://www.blogger.com/atom/ns#" term="windows phone"/><category scheme="http://www.blogger.com/atom/ns#" term="виндакапец"/><category scheme="http://www.blogger.com/atom/ns#" term="ненавижу винду"/><category scheme="http://www.blogger.com/atom/ns#" term="разработка"/><title type='text'>Unity + winphone = ?</title><content type='html'>&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;UPD: всех мусульман с праздником ураза-байрам! По этому случаю &lt;a href=&quot;https://itunes.apple.com/us/app/tatarskij-slovar/id880937765?mt=8&quot;&gt;татарский словарь на ios&lt;/a&gt;&amp;nbsp;в течение трех дней будет&amp;nbsp;бесплатным. Православных поздравляем с днем крещением Руси и тоже советуем скачать этот словарик :)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Ок, опыт по разработке и паблишингу win phone приложений появился.&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; outline: none !important;&quot; /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Я научился делать как нативные приложения (к примеру, на основе дефолтного шаблона сделан &lt;a href=&quot;http://www.windowsphone.com/en-us/store/app/lugat-sozluk/e6079c9e-b291-4542-a8ef-1ed381fb5543&quot;&gt;словарь lugat&lt;/a&gt;, а также мультипайвотный &lt;a href=&quot;http://www.windowsphone.com/en-us/store/app/turkish-russian/cc149577-c086-4f23-acbe-64f1acea20e0&quot;&gt;турецко-русский и русско-турецкий словарь&lt;/a&gt;), так и unity игр. При разработке нативных приложений надо следовать тем же паттернам, что при разработке на iOS. Если понимаешь, что такое делегат и как работает data provider, проблем не будет. Однако верстка страницы больше напоминает андроид - там больше работаешь вручную с XML-ками, нежели тянешь курсором за констрейны.&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; outline: none !important;&quot; /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Как и ожидалось, больше всего проблем было с юнити. Процесс портирования пробовали на старом бедном матаке, который уже пережил &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.LuckyDog.LaneRush&quot;&gt;100к закачек на андроиде&lt;/a&gt; и только недавно &lt;a href=&quot;https://itunes.apple.com/us/app/lane-rush-3d/id901823099?ls=1&amp;amp;mt=8&quot;&gt;вышел на iOS&lt;/a&gt;. Не хочется особо рассусоливать, пройдемся списком по граблям, которые встретил в процессе:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;&amp;nbsp;винфоны в большинстве своем слабые, идут с оперативкой 512 Мб - будьте готовы, что придется оптимизировать. Конечно, можно в dev центре ограничить список, но таким образом мы отсечем 80% рынка&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;unity для винфона собирает с настройкой mscorlib, поэтому вовсю использовать силу c# не получится.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;предыдущий пункт может также означать, что некоторые либы, собранные на моно, не пойдут. К примеру, надо качать отдельную сборку для &lt;a href=&quot;http://hotween.demigiant.com/&quot;&gt;hotween на его официальном сайте&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;каким образом происходит сборка &amp;nbsp;unity проектов: солюшн собирается в либу unityplayer.dll, далее линкуется с другими плагинах лежащими в соответствующей папке. Два очень важных момента:&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;&lt;ol&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;в редакторе все компилится под моно, а для винды на .net. Они разные, поэтому можно ожидать кучу приколов&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;б) для проверки совместимости библиотек используется Mono.Cecil. Ну так вот, если используются платформозависимые библиотеки (Microsoft ads, к примеру), не поставляемые по умолчанию windows phone sdk, mono.cecil может ругаться на отсутствующие рефы. Самый простой и топорный способ разрешить проблему - тупо скопировать dll в&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: monospace; font-size: 1em; line-height: 1.2em;&quot;&gt;C&lt;/span&gt;&lt;span style=&quot;border-bottom-left-radius: 0px !important; border-bottom-right-radius: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; color: green; font-family: monospace; font-size: 1em; line-height: 1.2em;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;font-family: monospace; font-size: 1em; line-height: 1.2em;&quot;&gt;\Program Files&lt;/span&gt;&lt;span style=&quot;font-family: monospace; font-size: 1em; line-height: 1.2em;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;border-bottom-left-radius: 0px !important; border-bottom-right-radius: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; font-family: monospace; font-size: 1em; line-height: 1.2em;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;font-family: monospace; font-size: 1em; line-height: 1.2em;&quot;&gt;x86&lt;/span&gt;&lt;span style=&quot;border-bottom-left-radius: 0px !important; border-bottom-right-radius: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; font-family: monospace; font-size: 1em; line-height: 1.2em;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-family: monospace; font-size: 1em; line-height: 1.2em;&quot;&gt;\Reference Assemblies\Microsoft\Framework\WindowsPhone\v8.0&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;и т. д.&amp;nbsp;Правильный же способ - пересобрать Cecil со включенными библиотеками, начальный взять из гита. Вот эта тема очень полезна для осознания происходящего -&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;&lt;a href=&quot;http://forum.unity3d.com/threads/wp8-adcontrol-mono-cecil-assemblyresolutionexception.196766/&quot;&gt;http://forum.unity3d.com/threads/wp8-adcontrol-mono-cecil-assemblyresolutionexception.196766/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; outline: none !important;&quot; /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Microsoft ads легко интегрируется в сборку, но учетка Microsoft ads недоступна для жителей России - вы попросту не получите честно заработанные деньги. Меня такой вариант не устраивал, поэтому ставил admob с помощью плагинов от Reign studios.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Да, не надо считать себя самым умным и сходу попытаться написать плагин под винфон. Для начала надо читать документацию - в unity очень клево все расписано :)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Я так и не понял, почему никто не использует postprocessbuildplayer, хотя его использование очень уместно. К примеру, нужно выставить необходимые разрешения. Или внедрить платформозавсимый код (как в случае инициализации плагинов от Reign Studios). Короче, все разленились, поэтому надо делать кучу неавтоматизированной ручной работы самому.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Неприятная детская грабля - unity собирает проект, где все иконки и сплеш скрины идут по умолчанию. Настроек в unity как в других платформах нет. Надо делать руками в сгенерированном проекте. Более того, в винде есть так называемые плитки - куча мороки и никто их не использует. Плюс один гемморой от майкрософта.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Я так понял, в винфоне нет локальных нотификаций. Remote есть, а локальных - нет. Обидно, очень полезный инструмент.&lt;br /&gt;&lt;br /&gt;В оправдание мелкомягким можно сказать, что аппрув у них довольно быстрый, проходит в течение пары часов. Вот, к примеру, &lt;a href=&quot;http://www.windowsphone.com/en-us/store/app/lane-rush-3d/4d75ef65-5607-4448-adf2-263df46e0456&quot;&gt;мотоцикл пошел покорять топы винфонов&lt;/a&gt;. Что из этого получится - увидим.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/129977036019857162/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2014/07/unity-winphone.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/129977036019857162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/129977036019857162'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2014/07/unity-winphone.html' title='Unity + winphone = ?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-164102281841141419</id><published>2014-06-01T14:55:00.000-07:00</published><updated>2014-06-01T14:55:39.564-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="бег"/><category scheme="http://www.blogger.com/atom/ns#" term="беллетристика"/><category scheme="http://www.blogger.com/atom/ns#" term="философия"/><title type='text'>Сопливый пост: о помощи, о беге, о процессе</title><content type='html'>&lt;i&gt;Disclaimer: поскольку более-менее технические и полезные посты собираюсь писать на technoballgame.com, в этом блоге буду писать свои мысли, вести сопливый дневник. Вряд ли ты что-нибудь полезное почерпнешь отсюда, дорогой читатель, это все я пишу для себя.&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;br /&gt;
&lt;h3&gt;
О помощи&lt;/h3&gt;
&lt;div&gt;
Несколько советов о том, как надо помогать (некоторые из разряда вредных):&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Если не можешь помочь, то не трать свое и чужое время - скажи, что не можешь. Не делай медвежью услугу, просто осознай, что не будешь делать. Если есть маленькая возможность - не обнадеживай.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Не предлагай помощь, если не уверен в своих силах. Отсутствие помощи хуже чем невыполненное обещание&lt;/li&gt;
&lt;li&gt;Если взялся, то делай на совесть&lt;/li&gt;
&lt;li&gt;Не лезь помогать, когда тебя не просят. Тебя не ждут, так зачем строить из себя всезнающего? В случае, когда человек явно тупит, можно заметить, что &quot;что-то не так&quot;, но помогать тогда и только тогда, когда человек попросит помочь. Наверное, этот совет применим везде, кроме обучения детей&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
&lt;b&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;О беге&lt;/b&gt;&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
Где-то месяц тому назад начал бегать. Огромное спасибо тем, кто меня подвел к бегу, дал практические советы - без вас бы это не получилось.&lt;/div&gt;
&lt;div&gt;
А сейчас напишу ощущения, которые пролетают:&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
Вот бегаешь ты на одной дистанции и собрался побить свой рекорд, пробежать больше, намного больше привычного расстояния. На своей дистанции ты чувствуешь себя довольно уютно, даже не устаешь. Хочется попробовать новое, проверить свой лимит. В мозгу обязательно появляется мысль: ты еще не готов, давай на следующей неделе. Но смотришь на статистику, на своих друзей - и видишь, что это более чем возможно, надо просто попытаться. Но мысль не проходит.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Начинаешь бег с верой в успех, но коварная мысля где-то там таится. Первую половину расстояния пролетаешь на автомате, ты готов к этому.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Где-то на половине ощущения усталости нет, но есть ощущение, что ты многого достиг и можно уже останавливаться. На практике ощущаешь, что начинаешь сдавать по скорости. Сдаешь по скорости - начинаешь потеть.&lt;/div&gt;
&lt;div&gt;
На 70% дистанции мозг начинает подсказывать, что ты устал. Физической усталости нет, но &quot;разумно, что ты раньше так не бегал - значит, должен устать&quot;. В такие моменты начинаешь вслушиваться в играющую в наушниках аудиокнигу, только лишь чтобы подавить свой внутренний голос.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
На 80% дистанции уже начинаешь чувствовать усталость в мышцах. Пытаешься &amp;nbsp;экспериментировать с ходом бега, есть боль в определенных участках. Понимаешь, что мышцы напряжены и скоро будут болеть. В этот момент коварная мысля &quot;ты не сможешь&quot; вовсю витает над тобой.&lt;/div&gt;
&lt;div&gt;
85%: организм сам переходит на энергосберегающий режим(с) - не потеешь, не смотришь, что происходит вокруг, просто ловишь какую-нибудь точку вдали на пути и тупо бежишь к ней. Потом следующая точка, следующая. Иногда кажется, что это не ты бежишь, а кто-то там шевелит ногами, в то время ты смотришь на него со стороны.&lt;/div&gt;
&lt;div&gt;
90%: в наушниках слышишь: &quot;Your distance is ..., average pace: ...&quot;. Эта фраза работает как триггер - из неоткуда появляется энергия, непонятными усилиями начинаешь ускоряться. Правда, через минуту устаешь и переходишь в старый режим, потом снова вспоминаешь, что осталось немного и ускоряешься.&lt;/div&gt;
&lt;div&gt;
95%: Все, что надо - просто поддерживать ритм. Ты уже не можешь остановиться. Надо просто добежать. Мозг как ни странно, включается на полностью, мышцы забывают об усталости. Это очень клевое ощущение&lt;/div&gt;
&lt;div&gt;
100%: Есть результат! Но ты не останавливаешься сразу, пробегаешь на автомате еще десяток метров, чувствуешь свое дыхание и уже предчувствуешь, что на следующей неделе ты захочешь еще раз испытать себя, уже на большей дистанции.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;
О процессе:&lt;/h3&gt;
&lt;div&gt;
Несколько выводов:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;если не можешь быстро и доходчиво объяснить идею - значит, идея говно&lt;/li&gt;
&lt;li&gt;если идея приводит к усложнениям - идея говно&lt;/li&gt;
&lt;li&gt;делегируй правильно!&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Иногда просто взять и нафигачить лучше, чем заресерчить и сделать правильно. Но будь готов, что это аукнется в далеком будущем&lt;/li&gt;
&lt;li&gt;Не стесняйся делать //TODO&lt;/li&gt;
&lt;li&gt;Не стесняйся записывать, все равно не запомнишь&lt;/li&gt;
&lt;li&gt;Не стесняйся переспрашивать. Лучше перепонять, чем недопонять&lt;/li&gt;
&lt;li&gt;Лучше заплатить и получить качество, чем иметь головную боль и в конечном счете заплатить намного больше. Да, в asset store сейчас есть абсолютно все!&lt;/li&gt;
&lt;li&gt;Будь готов, что твои знания инвалидируются в один момент и все надо будет изучать заново&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/164102281841141419/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2014/06/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/164102281841141419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/164102281841141419'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2014/06/blog-post.html' title='Сопливый пост: о помощи, о беге, о процессе'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-5421308141292963099</id><published>2014-05-22T13:23:00.002-07:00</published><updated>2014-05-22T13:32:55.211-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="30 дней"/><category scheme="http://www.blogger.com/atom/ns#" term="делать"/><category scheme="http://www.blogger.com/atom/ns#" term="игра"/><category scheme="http://www.blogger.com/atom/ns#" term="никто не читает теги"/><category scheme="http://www.blogger.com/atom/ns#" term="цели"/><title type='text'>Мысли об игре</title><content type='html'>&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Ок, &lt;a href=&quot;https://vk.com/rganeyev?w=wall3371777_1819%2Fall&quot;&gt;игра&lt;/a&gt; закончилась.&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; outline: none !important;&quot; /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Она не является новой, это вольная интерпретация игры бм (которая в свою очередь является интерпретацией тренингов Кови), в которой, если выражаться игровой терминологией, были исправлены некоторые косяки баланса&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; outline: none !important;&quot; /&gt;
&lt;br style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; outline: none !important;&quot; /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;По свежим ощущениям, кратко:&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;игра держит в тонусе&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;ты реально начинаешь ценить свое время, пытаться его максимально эффективно использовать&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;ты начинаешь более детально планировать свой день, отказываться от ненужных временных затрат&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;начинаешь делать то, что не сильно хочешь, но надо.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;создаешь привычку, даже иногда не связанные с целями&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;переосмысливаешь свои приоритеты - некоторые из целей оказываются ненужными: хрен ты будешь делать, если это действительно не надо&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;начинаешь активно размышлять, искать варианты, идешь на риск&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;из неоткуда появляются новые возможности&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; outline: none !important;&quot; /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Есть минусы:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;- зацикливаешься на том, что надо делать. Это как повязка на глазах у лошадей - видишь только дорогу, по которой будешь идти. Хотя на практике на мне это не отразилось&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;- если ты по глупости проспал выполнение чего-нибудь - очень тяжело восстановить прогресс&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;- в какой-то момент начинаешь игру делать своей целью, а не средством для достижения целей. Если вовремя не опомниться, то начинаешь уделять усиленное внимание самой игре. Это уже не здорово.&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; outline: none !important;&quot; /&gt;
&lt;br style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; outline: none !important;&quot; /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Игра держит тремя аспектами:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;1) спор - ты споришь, что при не выполнении теряешь. Надо сделать условие, что теряешь что-то значимое, но не сильно критичное. Не отдаешь во благо, не спасаешь голодающих негров, тупо теряешь. И в этом никто кроме тебя не виноват&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;2) общественное обещание: ты на всю Ивановскую &amp;nbsp;заявляешь о своих целях, обещаешь выполнять&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;3) контроль - каждый день ты следишь за ходом своих действий&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; outline: none !important;&quot; /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Будет ли игра работать при послаблении или отсутствии какого-то из параметров?&lt;/span&gt;&lt;br /&gt;
&lt;br style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px; outline: none !important;&quot; /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;Давайте проверим гипотезу:&lt;br /&gt;в понедельник мы определяемся с целями, во вторник начинается новая игра. Какие будут изменения:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;есть закрытая группа vk.com/thatgame, куда приглашаются все желающие поиграть. Можно играть&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;&amp;nbsp;&quot;в закрытую&quot;: писать прогресс только на стене в этой группе. Можно играть стандартно &quot;в открытую&quot;: дублировать/шарить себе на стену. Каждый выбирает как хочет. Я лично буду играть вторым способом.&lt;br /&gt;&lt;br /&gt;Остальные правила остаются те же: поставить десять целей, выполнить хотя бы пять, в случае проигрыша отдать 10% своей зарплаты (для неработающих придумать себе наказание), отписываться каждый день о прогрессе. Подробнее о постановке и тонкостях напишу завтра.&lt;br /&gt;&lt;br /&gt;Играть стоит, если:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;относиться к этому серьезно&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;хочется изменить свое положение&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;нужно добиться нового&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;нужно выработать новые привычки&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;Играть не стоит, если:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;не готов выполнять правила&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;читер&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;&quot;просто попробовать&quot;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;color: #222222; font-family: arial, sans-serif; font-size: x-small;&quot;&gt;Итак, кто готов?&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/5421308141292963099/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2014/05/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/5421308141292963099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/5421308141292963099'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2014/05/blog-post.html' title='Мысли об игре'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-6423082296642925117</id><published>2014-04-20T10:33:00.000-07:00</published><updated>2014-04-21T10:53:54.639-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="facebook"/><category scheme="http://www.blogger.com/atom/ns#" term="ms"/><category scheme="http://www.blogger.com/atom/ns#" term="unity"/><category scheme="http://www.blogger.com/atom/ns#" term="Арас"/><category scheme="http://www.blogger.com/atom/ns#" term="Дуров"/><category scheme="http://www.blogger.com/atom/ns#" term="Стив Джобс"/><category scheme="http://www.blogger.com/atom/ns#" term="корпорация"/><category scheme="http://www.blogger.com/atom/ns#" term="мысли"/><category scheme="http://www.blogger.com/atom/ns#" term="никто не читает теги"/><category scheme="http://www.blogger.com/atom/ns#" term="стартап"/><category scheme="http://www.blogger.com/atom/ns#" term="философия"/><title type='text'>Большие и маленькие компании</title><content type='html'>&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;i style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span style=&quot;background-color: white; line-height: 35px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;i&gt;Ты хочешь всю оставшуюся жизнь продавать сладкую газировку? Или хочешь пойти со мной и изменить мир?&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
(с)Джобс&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;blockquote style=&quot;line-height: 25px; margin: 0px 0px 17px; padding: 11px 22px; text-align: right;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: inherit;&quot;&gt;&lt;i&gt;&lt;span class=&quot;goog_qs-tidbit goog_qs-tidbit-0&quot; style=&quot;border: 0px; display: inline !important; margin: 0px; outline: 0px; padding: 0px; text-decoration: inherit; vertical-align: top;&quot;&gt;Небольшой совет молодым и&amp;nbsp;талантливым разработчикам, которые ищут работу,&amp;nbsp;&lt;/span&gt;— никогда не&amp;nbsp;идите работать в&amp;nbsp;большие компании. Никогда, ни&amp;nbsp;за&amp;nbsp;какие деньги, ни&amp;nbsp;при каких обстоятельствах. Даже если&amp;nbsp;Вы проработаете всего год, оттуда&amp;nbsp;Вы уйдете уже другими людьми, лишитесь лучшего, что у&amp;nbsp;Вас сейчас есть. Поработав «по&amp;nbsp;графику» с&amp;nbsp;унылым пузатым менеджерьем, Вы&amp;nbsp;станете беспомощным отработанным материалом с&amp;nbsp;рабско-потребительской ментальностью. Ваш опыт работы в&amp;nbsp;Google, Яндексе или&amp;nbsp;&lt;a href=&quot;http://mail.ru/&quot; rel=&quot;nofollow&quot; style=&quot;border: 0px; color: #9c30b6; cursor: pointer; margin: 0px; outline: 0px; padding: 0px; vertical-align: top;&quot;&gt;Mail.ru&lt;/a&gt;&amp;nbsp;— мощная антирекомендация для любого здравого руководителя маленькой команды.&lt;/i&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: inherit;&quot;&gt;&lt;i&gt;&lt;span style=&quot;line-height: 25px;&quot;&gt;Бездельничайте, учитесь, играйте, рисуйте, создавайте музыку, занимайтесь фрилансом, открывайте стартапы, делайте никому не&amp;nbsp;нужные проекты, голодайте&amp;nbsp;— но&amp;nbsp;никогда не&amp;nbsp;идите работать в&amp;nbsp;корпорации. Помните: всякий раз, когда молодой и&amp;nbsp;талантливый разработчик идет работать в&amp;nbsp;большую компанию, умирает котенок.&lt;/span&gt;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: inherit;&quot;&gt;(с)Дуров&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white; font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;i&gt;&lt;b&gt;Все совпадения случайны и являются выдумками читающего индивидуума&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: inherit;&quot;&gt;Как-то меня спросили: куда идти работать юристом - в Тошиба или менее известную DS Law. Вопрос был непрофильным для меня, тем не менее его можно перефразировать как-то так: где лучше работать - в большой компании-корпорации или маленькой студии-стартапе?&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;Для меня ответ простой: it depends.&lt;br /&gt;У каждой стороны есть свои &quot;особенности&quot;. Плюсами или минусами это назвать сложно, потому что положительность зависит от восприятия человека, поэтому просто опишу эти особенности. Начнем с больших компаний:&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;У больших компаний есть имя, статус. Это очень клево, когда при знакомстве с незнакомыми людьми можешь описать работу в двух словах.&lt;/li&gt;
&lt;li&gt;Хорошие плюшки. Бесплатная еда, лазерные шоу на корпоративах, интересные события, недоступные простым смертным - все это для тебя.&lt;/li&gt;
&lt;li&gt;Как правило, большие деньги. А если редкий специалист, то платят непомерно много.&lt;/li&gt;
&lt;li&gt;Своя субкультура - начиная от стиля кода, заканчивая отношениями между сотрудниками. Это вправляет мозги, особенно если ты зеленый джуниор, но жди беды, если ты не согласен с такой субкультурой - ты идешь против большой системы.&lt;/li&gt;
&lt;li&gt;В больших компаниях найдется человек, у которого можно поучиться новому. Иногда даже по непрофилю. Достаточно подойти и спросить.&lt;/li&gt;
&lt;li&gt;Большие парни имеют свою экосистему управления - трекинг времени, документация, дизайны, концепт-документы, бла-бла-бла. Это сделано с разумными целями - для контроля, оптимизации организации (как известно, в команде с N людьми количество взаимоотношений O(N^2) ) и т. д. На quora спрашивали, &lt;a href=&quot;http://www.quora.com/Why-does-Facebook-have-so-many-employees/answer/Balaji-Viswanathan-2&quot;&gt;почему так много людей работают на фейсбук&lt;/a&gt;, офигенное сравнение дал&amp;nbsp;Balaji Viswanathan(кофаундер belimitless.co)&amp;nbsp;- почитайте, вы не пожалеете.&lt;/li&gt;
&lt;li&gt;Бюрократия на своем уровне. У кого-то в меньшей степени, в гос. корпорациях РФ - просто over9000. Проявляется это чаще всего необходимостью никому не нужные отчеты, писать документацию, будто их будут читать одни идиоты, читать простыню документации и в каждой строке чувствовать себя идиотом.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Иметь шефа, шефов, контролирующих тебя людей. С одной стороны, можно иметь китайское видение жизни и думать, шеф - это твой наставник. С другой - а если работа строится по принципу &quot;я начальник - ты дурак&quot;?(Вот именно поэтому разрабы ненавидят продюссеров и подобных)&lt;/li&gt;
&lt;li&gt;Иметь строгий распорядок дня: прийти на работу, отработать 8 часов, уйти. Идеально для женатых людей или людей с советским укладом жизни. Есть особо непонятные компании, которые ставят нормативные часы выше выполненным целям. Я таких не понимаю.&lt;/li&gt;
&lt;li&gt;Ты станешь узким специалистом. Всего ты не сможешь знать просто из-за объема данных, поэтому будешь отвечать только за одну часть всего проекта.&lt;/li&gt;
&lt;li&gt;В больших компаниях трудно вырасти. Как в карьерном плане, так и профессионально-личностном. Ты являешься одной деталью в огромном механизме, который работает неведомым образом. Ты делаешь одну маленькую вещь в огромном конвейере. Более того, если занимаешься одной лишь работой, ты ступоришься, начинаешь видеть мир слишком однобоко. Поэтому очень важно кроме основной работы заниматься еще чем-то другим для себя.&lt;/li&gt;
&lt;li&gt;Еще в больших компаниях не приветствуется, чтобы ты занимался чем-то другим, кроме работы :) Это вполне объяснимо - они платят тебе деньги и хотят выжать из тебя весь максимум.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;В больших компаниях стирается ответственность. Вот серьезно, в любых МС и прочих есть люди, которые являются балластом - они вроде чем-то занимаются, а результата - ноль.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Вот как-то так. А теперь поговорим про малышей:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Тебя никто не знает. Это ок, смирись с этим :)&lt;/li&gt;
&lt;li&gt;Никто не организует для тебя ничего. Как ты проведешь праздник, корпоратив и т.д. - зависит только от тебя.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://demotivators.to/media/posters/426/8350069_korporativ-frilansera.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://demotivators.to/media/posters/426/8350069_korporativ-frilansera.jpg&quot; height=&quot;212&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: inherit;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Своя субкультура. Только она уже не корпоративная, а &quot;семейно-котанская&quot;. Все друг друга знают, нет чинов и погонов.&lt;/li&gt;
&lt;li&gt;Как следствие, нет шефа &quot;за спиной&quot;, ты любому человеку можешь сказать: &quot;Чувак, ты не прав&quot;, &quot;Твоя идея - говно&quot;, и никто не обидится и не даст в бубен (конечно, если ты сможешь аргументировать свою точку зрения или внезапно являешься внуком Мохамеда Али :-) ).&lt;/li&gt;
&lt;li&gt;По минимуму бюрократии. Никого не интересует, что ты делаешь, как это работает изнутри. Главное, чтобы это работало и легко модифицировалось и ты успевал в оцененные сроки.&lt;/li&gt;
&lt;li&gt;Не ожидай, что вступив в проект в студии, ты увидишь get-started, how-to, вообще, нечто похожее на документацию. Скажи спасибо, если кто-то иногда пишет тесты. В конце каждого проекта каждый разраб может написать вот такую книгу:&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-prn1/t31.0-8/p640x640/858600_670651682994494_1637760402_o.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-prn1/t31.0-8/p640x640/858600_670651682994494_1637760402_o.jpg&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
Как следствие предыдущих двух - минимум бюрократии. Тебе не надо собирать консилиум, не надо документировать каждое слово. Надо взять - договориться с котаном и зафигачить. Иногда удобнее сделать наоборот - зафигачить, а потом договориться с котаном :-)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
У тебя будет больше выбора - от используемых инструментов до договоренности по рабочему дню. Сейчас мы приезжаем в офис в двенадцать, ухожу в восемь вечера. Это ок, если ты пришел в два дня или ушел довольно рано или наоборот поздно. Это норм поработать из дома или выйти поработать в выходные дни. Да, и не надо ждать, пока прогонят плагин за 10 баксов через всю тикет систему &amp;nbsp;- ты тупо берешь и покупаешь.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
В маленьком стартапе ты должен уметь делать все - потому что кроме тебя больше никого нет. И такой подход нехило тебя развивает. Ты начинаешь разбираться везде, где раньше все это было rocket science.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
Как следствие, ты очень быстро растешь, всегда учишься новому. Чем больше обязанностей и меньше времени - тем быстрее ощущается ускорение.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
Большая свобода - ты можешь привнести идей, даже если ты вроде как не этим занимаешься. Поскольку направлений обязанностей там много, ты можешь заниматься почти всегда чем хочешь.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
Ответственность. Ты не имеешь права сказать: &quot;это говно, потому что мы делаем по его указанию&quot;, ведь ты когда-то ему не сказал: &quot;Чувак, это говно&quot;. Только ты ответственен за то, что ты делаешь этот проект. &amp;nbsp;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;
Да, саморазвитие только приветствуется. К примеру, вот &lt;a href=&quot;https://www.assetstore.unity3d.com/#/content/12695&quot;&gt;continuous integration в asset store&lt;/a&gt;&amp;nbsp;- плагин, выросший из ресерча на тему&amp;nbsp;&lt;a href=&quot;http://rustam-kot.blogspot.ru/2014/03/unity.html&quot;&gt;разных сжатий текстур в андроиде&lt;/a&gt;. Сейчас используется повсеместно. Каждый опыт активно переиспользуется. И твои знания РЕАЛЬНО работают.&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Как примерно делается большой проект в больших компаниях:&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Здравствуйте, у нас есть идея проекта, сейчас продюсеры напишут диссертацию на 100500 страниц&quot;&lt;/li&gt;
&lt;li&gt;&quot;Бюджет проекта - овер9000 долларов, вот вам команда художников, программистов, массажистов&quot;&lt;/li&gt;
&lt;li&gt;Каждый менеджер в команде собирает скрам, задает цели, работящие люди скурпулезно вникают в детали, пишут свою оценку.&lt;/li&gt;
&lt;li&gt;Менеджер умножает оценку на (e+pi)/2, все начинают фигачить.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Позже команды начинают скрещивать результаты, у них ничего не получается, собирается митинг, долго обсуждается, начинают переделывать.&lt;/li&gt;
&lt;li&gt;Позже происходит тестирование, находится фатальный недостаток, надо переделывать, времени мало&lt;/li&gt;
&lt;li&gt;С опозданием на два месяца выпускается продукт.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Как делается в маленьком стартапе:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;-&quot;Котаны, я тут внезапно подумал...&quot; -&quot;О, ты думать умеешь?&quot; -&quot;Да слушай же! Короче так...&quot; -&quot;Клево, давайте зафигачим!&quot;&lt;/li&gt;
&lt;li&gt;(Около доски, где есть еще место для новых идей) &quot;А давайте&amp;nbsp;добавим&amp;nbsp;няш-мяш &amp;nbsp;и вертолет&amp;nbsp;взрывающийся!&quot;&lt;/li&gt;
&lt;li&gt;&quot;Короче, у нас всего три месяца, быстрее делаем&quot;. &amp;nbsp;&lt;/li&gt;
&lt;li&gt;Быстрая приблизительная оценка, фигачим.&lt;/li&gt;
&lt;li&gt;&quot;Нет времени объяснять, пиши в api магический метод FixEverything()&quot;&lt;/li&gt;
&lt;li&gt;&quot;Так, мы не успеваем. Либо продлеваем, либо урезаем фичи. И давайте хоть в этот раз протестируем что ли?&quot;&lt;/li&gt;
&lt;li&gt;С опозданием на два месяца выпускается продукт :)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
Конечно, у разных компаний разные цели. Нельзя маленьким стартапом сделать операционку типа винды. Неразумно подходом больших компаний делать простые и легкие вещи. Тут важно понять, что ты делаешь и какие средства ты вкладываешь.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Можно ли так сделать, чтобы объединить плюсы больших компаний с плюсами маленьких(и при этом постараться выкинуть минусы). Можно, но не каждая компания в состоянии. Вернее даже так - почти никто не может. Я знаю всего две компании, умудрившиеся успешно объединить первое со вторым. Это facebook и unity.&amp;nbsp;&amp;nbsp;Вот, к примеру, &lt;a href=&quot;http://aras-p.info/texts/files/201312-BuildStuffLightweightChaos.pdf&quot;&gt;слайды из выступления Араса&lt;/a&gt; по поводу, как работает unity. У меня все.&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;span style=&quot;background-color: white; font-family: inherit;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/6423082296642925117/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2014/04/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/6423082296642925117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/6423082296642925117'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2014/04/blog-post.html' title='Большие и маленькие компании'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-1404226159243457323</id><published>2014-03-14T14:15:00.000-07:00</published><updated>2014-03-14T14:22:07.928-07:00</updated><title type='text'>Сжатие текстур андроида в Unity</title><content type='html'>В айфонах почти все хорошо. Сделал приложение, потестил на паре девайсов (iphone 4s, ipad2) и можешь быть почти уверен, что с остальными не будет головной боли.&lt;br /&gt;
&lt;br /&gt;
У андроида зоопарк устройств. Это приносит огромные проблемы. В первую очередь, с тестированием и оптимизацией. Далеко не факт, что оптимизация для одних девайсов положительно скажется для других девайсов тоже.&lt;br /&gt;
&lt;br /&gt;
Поскольку очень много оптимизации связывается с отрисовкой, нужно уделить большое внимание отрисовываемым текстурам, а именно сжатию. Unity поддерживает несколько видов сжатия для разных видеокарт: ETC1, ATC, DXT, PVRTC, ETC2. Более того, можно не только руками для каждой текстуры выставлять желаемое сжатие, а задать &lt;a href=&quot;http://docs.unity3d.com/Documentation/ScriptReference/AndroidBuildSubtarget.html&quot;&gt;AndroidBuildSubtarget&lt;/a&gt;&amp;nbsp;- при билде все запакуется в лучшем виде.&lt;br /&gt;
Внимание, вопрос: в какой формат нужно запаковывать? Ответ: зависит от того, сколько APK вы хотите вылить в google-play.&lt;br /&gt;
Дело в том, что магазин приложений гугл поддерживает &lt;a href=&quot;http://developer.android.com/google/play/publishing/multiple-apks.html&quot;&gt;выливку нескольких билдов для разных девайсов&lt;/a&gt;. Это сделано специально для того, чтобы приложения поддерживало как можно больше устройств. Там можно задать разные apk для разных видеокарт, разных пропорций экранов, разных разрешений и т.д. Но есть одно большое НО: рекомендуется использовать эту возможность только тогда, когда есть полное понимание, что одним билдом не обойтись. &amp;nbsp;Потому что разработку нескольких билдов тяжело поддерживать, а также должна быть правильная систематизация версий, ведь в том же мануале сказано, что гугл отдает поддерживаемый билд с наивысшей версией. То есть, если видеокарта поддерживает etc билд и для нее предпочтительнее atc, но версия etc &amp;gt; версии atc, гугл отдаст etc билд.&lt;br /&gt;
&lt;br /&gt;
Короче говоря, если вы не хотите запариваться, юзайте только один билд и сжимайте в etc. Конечно, вы немного потеряете в производительности (потому что не-etc видеокарты&amp;nbsp;распаковывают&amp;nbsp;etc-сжатую&amp;nbsp;текстуру), но можете быть почти уверены, что ваши текстуры будут выглядеть нормально.&lt;br /&gt;
Что делать тем, кто хочет по максимуму: надо организовать правильную генерацию номера версии и в будущем всегда ее поддерживать. Я для себя поставил за правило следующую схему генерации версии:&lt;br /&gt;
&lt;br /&gt;
0411079, или более наглядно 04 1 1079, где первые две цифры - min android sdk(04 - это что-то типа android froyo или еще древнее), второе число - это номер сжатия(об этом позже), а последние цифры - это номер версии билда, без точек(1.07.9).&lt;br /&gt;
&lt;br /&gt;
Как правильно выбрать номер сжатия, чтобы приоритетный билд попал в нужное устройство. Надо исходить из логики: что реже используется, то и надо выше ставить приоритет. А статистика такова: etc &amp;gt; atc &amp;gt; dxt &amp;gt; pvrtc &amp;gt; etc2. Именно в таком порядке их можно и занумеровать.&lt;br /&gt;
&lt;br /&gt;
А чтобы не мучиться каждый раз с генерацией билда и билд-номера, стоит завести один маленький скрипт:&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;html&gt;&lt;body style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;pre&gt;
[MenuItem(&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;Custom/Build apks for all Texture Compressions&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;)]
    &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;void&lt;/span&gt; BuildApksForAllCompressions()
    {
        BuildAndroid(AndroidBuildSubtarget.DXT);
        BuildAndroid(AndroidBuildSubtarget.ATC);
        BuildAndroid(AndroidBuildSubtarget.PVRTC);
        BuildAndroid(AndroidBuildSubtarget.ETC);

        Debug.Log(&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;Finished building&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;);
    }

    &lt;span style=&quot;color: #3f7f59;&quot;&gt;//Version code looks like this: 04 1 1079&lt;/span&gt;
    &lt;span style=&quot;color: #3f7f59;&quot;&gt;//first two numbers = API LEVEL (04)&lt;/span&gt;
    &lt;span style=&quot;color: #3f7f59;&quot;&gt;//second two numbers = Android Subtarget (1)&lt;/span&gt;
    &lt;span style=&quot;color: #3f7f59;&quot;&gt;//Last numbers = version number, revision (1079, got from &quot;1.07.9&quot;)&lt;/span&gt;
    &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; GenerateVersionCode(AndroidBuildSubtarget target)
    {
        &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;string&lt;/span&gt; number = &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;string&lt;/span&gt;.Format(&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;{0}{1}{2}&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;, ((&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt;) PlayerSettings.Android.minSdkVersion).ToString(&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;D2&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;),
            GetTargetVersion(target), PlayerSettings.bundleVersion);
        number = number.Replace(&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;);
        &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; result = &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt;.Parse(number);
        Debug.Log(&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;Android &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt; + target + &lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt; version: &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt; + number + &lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt; + result);
        &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;return&lt;/span&gt; result;
    }

  &lt;span style=&quot;color: #3f7f59;&quot;&gt;//all devices support etc, so it has lowest value&lt;/span&gt;
    &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; GetTargetVersion(AndroidBuildSubtarget target)
    {
        &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;switch&lt;/span&gt; (target)
        {
            &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;case&lt;/span&gt; AndroidBuildSubtarget.ETC:
                &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;return&lt;/span&gt; 4;
            &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;case&lt;/span&gt; AndroidBuildSubtarget.ATC:
                &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;return&lt;/span&gt; 5;
            &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;case&lt;/span&gt; AndroidBuildSubtarget.DXT:
                &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;return&lt;/span&gt; 6;
            &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;case&lt;/span&gt; AndroidBuildSubtarget.PVRTC:
                &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;return&lt;/span&gt; 7;
            &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;default&lt;/span&gt;:
                &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;return&lt;/span&gt; 0;
        }
    }

    &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;void&lt;/span&gt; BuildAndroid(AndroidBuildSubtarget target)
    {
        &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;if&lt;/span&gt; (EditorUserBuildSettings.activeBuildTarget != BuildTarget.Android)
            EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTarget.Android);
        EditorUserBuildSettings.androidBuildSubtarget = target;

        &lt;span style=&quot;color: #3f7f59;&quot;&gt;//to include more build options use bitwise OR, for instance: BuildOptions options = BuildOptions.Development | BuildOptions.ShowBuiltPlayer;&lt;/span&gt;
        var bo = BuildOptions.None;
        PlayerSettings.Android.keystoreName = &lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;keystore_location&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;;
        PlayerSettings.Android.keyaliasName = &lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;alias&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;;
        PlayerSettings.Android.keystorePass = &lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;;
        PlayerSettings.Android.keyaliasPass = &lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;password&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;;

        PlayerSettings.bundleIdentifier = &lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;yourbundle&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;;
        PlayerSettings.Android.bundleVersionCode = GenerateVersionCode(target);

        &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;try&lt;/span&gt;
        {
            &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;string&lt;/span&gt; apkName = &lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;your_apk_name&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;
            BuildPipeline.BuildPlayer(
                (from scene &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;in&lt;/span&gt; EditorBuildSettings.scenes where scene.enabled select scene.path).ToArray(), apkName,
                BuildTarget.Android, bo);
        }
        &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;catch&lt;/span&gt; (Exception e)
        {
            Debug.Log(&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;Error: &lt;/span&gt;&lt;span style=&quot;color: #2a00ff;&quot;&gt;&quot;&lt;/span&gt; + e.Message);
        }
    }
&lt;/pre&gt;
&lt;/body&gt;&lt;/html&gt;&lt;/pre&gt;
Как-то так. Да, при выливании в сторы, нужно заливать билды в том же порядке. Если перепутать, то стор просто отвергнет билд с меньшим номером.</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/1404226159243457323/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2014/03/unity.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/1404226159243457323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/1404226159243457323'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2014/03/unity.html' title='Сжатие текстур андроида в Unity'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-6629148833282178618</id><published>2014-03-13T14:46:00.002-07:00</published><updated>2014-03-21T13:35:09.490-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="clumsy fino"/><category scheme="http://www.blogger.com/atom/ns#" term="road smash"/><category scheme="http://www.blogger.com/atom/ns#" term="unity"/><category scheme="http://www.blogger.com/atom/ns#" term="unity3d"/><category scheme="http://www.blogger.com/atom/ns#" term="игры"/><category scheme="http://www.blogger.com/atom/ns#" term="философия"/><title type='text'>Успешная игра - каждому по приоритету</title><content type='html'>&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;Мою квартиру обокрали. Тупо взломали дверь ломом. Видно, взломали первую попавшуюся квартиру, все шкафчики открыты - видимо, искали повсюду. Самое странное - сперли только ноутбук. Хотя у меня, гиканутого нерда, окулусов, райзер хидр и прочей техники было на гораздо большую сумму. Люди не знали их стоимость, поэтому сперли только один ноутбук - можно сказать, легко отделался.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
У каждого вида деятельности при разработке игр есть свои приоритеты. Например, для предпринимателей - количество принесенных денег, маркетологов - количество пользователей и ARPPU. У разработчиков игр свои приоритеты, свои идеалы: количество и качество фичей, а так же реакция пользователей на них. Вполне очевидно, что проггер становится счастливым, когда он добавляет вроде как маленькую фичу, а юзеры оценивают ее, начинают играть, радуются. Таким же образом программист бесится, когда чувствует, что фича не приносит ожидаемого отклика, ведь по факту, он делает ее зря. Всегда лучше ничего не делать, чем делать ничего.&lt;br /&gt;
&lt;br /&gt;
Совсем недавно нам удалось реализовать игру, которая подходит под мое определение успешности, как программиста. Нет, это не &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.creativemobile.roadsmash&quot;&gt;road smash&lt;/a&gt;, хотя, &lt;a href=&quot;http://www.appannie.com/apps/google-play/app/com.creativemobile.roadsmash/app-ranking/#daily=2014-03-13&amp;amp;type=ranks&quot;&gt;судя по статистике&lt;/a&gt;, она очень понравилась пользователям и наверняка приносит хороший доход.&lt;br /&gt;
&lt;br /&gt;
Игра называется &lt;a href=&quot;http://bit.ly/andclumsy&quot;&gt;Clumsy Fino&lt;/a&gt;&amp;nbsp;(&lt;a href=&quot;https://itunes.apple.com/us/app/clumsy-fino/id821228910?mt=8&quot;&gt;тыц для ios&lt;/a&gt;), это очередной клон Flappy Bird с респавном и дракончиком. Вроде ничего примечательного, но игра успешна. Объясню почему:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;У нас отличная команда - множество непересекающихся скиллов. Альберт Александровский взял на себя роль издателя, он занимался продвижением, поиском подходящих запросов, делал завораживающие картинки. Игорь Фомичев делал игровую часть, делал баланс. Я прикручивал плагины, занимался неигровой частью. Каждый занимался тем, что он лучше всего умеет. В условиях &quot;экстремальной разработки&quot; эта тактика сыграла как нельзя лучше.&lt;/li&gt;
&lt;li&gt;С самого начала мы решили делать максимально быстро. Первая версия игры была сделана за два дня по вечерам, содержала в себе &lt;a href=&quot;http://rustam-kot.blogspot.ru/2013/12/5-things-you-need-to-implement-in-any.html&quot;&gt;все мастхэвы&lt;/a&gt; и вылита в сторы. Это была самая продуктивная итерация на моей памяти.&lt;/li&gt;
&lt;li&gt;Вторая итерация заняла чуть больше времени(пять дней &quot;грязного времени&quot;, где-то три человекодня на всех), за это время мы полностью обновили GUI, добавили важную фичу - респавн птицы при смерти. После апдейта количество скачиваний удвоилось (спасибо, Альберт!), а игровая сессия стала больше в среднем на три минуты (спасибо, Игорь).&lt;/li&gt;
&lt;li&gt;В разработке не было факапов. Вообще. Причины две:&amp;nbsp;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;мы делали только те фичи, которые казались нам нужными. Те, которые не очень привлекательны игрокам или трудозатратны - мы не делали. Наконец-то смогли применить принцип Парето.&lt;/li&gt;
&lt;li&gt;Никто не лез в чужую область, каждый делал то, что умел лучше всего. Минимум ресерча, просто берешь и получаешь результат. А через четыре часа люди радуются этому результату.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Не знаю, как остальные ребята, лично я получил огромное удовольствие. Это было подобно очень короткому кэмпу, где ты просто делаешь то, что тебе нравится. Результат не заставил себя ждать.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Эта игра уже окупила наши трудозатраты. Доход до сих пор растет :)&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
Не знаю, как другие программисты, но я очень хочу, чтобы моими продуктами пользовались. Очень сладостно ощущение того, что ты делаешь не зря. И совершенно пофиг, сколько денег от этого ты зарабатываешь.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;За ноутбук не сильно обидно - там стоял deep freeze, хрен они там смогут им воспользоваться. При более тщательной ревизии всех вещей оказалось, что эти уроды сперли купленный вчера торт! Спереть ноутбук и торт вместо того, чтобы спереть дорогостоящую технику?&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;i style=&quot;font-size: small;&quot;&gt;У меня нет слов.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;/ol&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/6629148833282178618/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2014/03/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/6629148833282178618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/6629148833282178618'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2014/03/blog-post.html' title='Успешная игра - каждому по приоритету'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-771169625535312434</id><published>2014-02-13T20:43:00.000-08:00</published><updated>2014-02-13T20:46:45.559-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="road smash"/><category scheme="http://www.blogger.com/atom/ns#" term="technoball"/><category scheme="http://www.blogger.com/atom/ns#" term="беллетристика"/><category scheme="http://www.blogger.com/atom/ns#" term="игры"/><category scheme="http://www.blogger.com/atom/ns#" term="мысли"/><category scheme="http://www.blogger.com/atom/ns#" term="разработка"/><category scheme="http://www.blogger.com/atom/ns#" term="философия"/><title type='text'>Делайте быстрее!</title><content type='html'>&lt;br /&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; font-size: 13px; line-height: 17.333332061767578px;&quot;&gt;Вася и Петя одновременно начали писать один и тот же продукт.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; font-size: 13px; line-height: 17.333332061767578px;&quot;&gt;Вася был «ориентирован на результат» и начал сразу писать говнокод не продумав толком архитектуру.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;/span&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; font-size: 13px; line-height: 17.333332061767578px;&quot;&gt;А Петя месяц разрабатывал архитектуру, месяц делал удобный интуитивный интерфейс, которому позавидывал бы Джони Айв, потом месяц писал тесты, потом два месяца писал сам код и получил идеальное стабильное приложение.&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;
&lt;/span&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; font-size: 13px; line-height: 17.333332061767578px;&quot;&gt;Но Вася выпустил уже через месяц первую версию программы, пусть и не идеальную, пусть с багами, но рабочую, и начал её продавать. Ещё через месяц выпустил вторую версию исправляющие баги первой и добавляющие новые баги. Ещё через месяц на доходы от продаж нанял двух толковых программеров, которые за два месяца перелопатили весь код, согласно пожеланиям пользователей допилили интерфейс и выпустили третью версию программы.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/span&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; font-size: 13px; line-height: 17.333332061767578px;&quot;&gt;Итого, через пять месяцев у Васи было два работника, куча клиентов и сносно работающее приложение отвечающее желаниям клиентов.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/span&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; font-size: 13px; line-height: 17.333332061767578px;&quot;&gt;У Пети было вылизанное никому не известное приложение, минус на банковском счёте и ни одного клиента.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;div style=&quot;font-weight: normal; text-align: right;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; font-size: 13px; line-height: 17.333332061767578px;&quot;&gt;В завершение этого выдуманного примера можно&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;goog_qs-tidbit goog_qs-tidbit-0&quot; style=&quot;border: 0px; display: inline !important; font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; font-size: 13px; line-height: 17.333332061767578px; margin: 0px; padding: 0px; text-decoration: inherit; vertical-align: baseline;&quot;&gt;сказать, что через полгода Вася купил все наработки Пети, Петю взял в штат тестировщиком, а сам по пьяни разбился на своём новеньком Туареге&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span class=&quot;goog_qs-tidbit goog_qs-tidbit-0&quot; style=&quot;border: 0px; display: inline !important; line-height: 17.333332061767578px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace; font-size: x-small;&quot;&gt;&lt;i&gt;(с)&lt;a href=&quot;http://bash.im/quote/420672&quot;&gt;http://bash.im/quote/420672&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span class=&quot;goog_qs-tidbit goog_qs-tidbit-0&quot; style=&quot;border: 0px; display: inline !important; line-height: 17.333332061767578px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace; font-size: x-small;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace;&quot;&gt;&lt;span style=&quot;line-height: 17.333332061767578px;&quot;&gt;&lt;b&gt;История №1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span class=&quot;goog_qs-tidbit goog_qs-tidbit-0&quot; style=&quot;border: 0px; display: inline !important; line-height: 17.333332061767578px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace;&quot;&gt;&lt;span style=&quot;line-height: 17.333332061767578px;&quot;&gt;В мае 2013 мы начали &lt;a href=&quot;http://technoballgame.com/hello-technoworld/&quot;&gt;делать технобол&lt;/a&gt;, сделали &lt;a href=&quot;http://technoballgame.com/%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D1%82%D0%B8%D0%BF-%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%B1%D0%BE%D0%BB%D0%B0/&quot;&gt;прототип&lt;/a&gt;, придумывали фишки, участвовали в конкурсах (в результате которых появлялись &lt;a href=&quot;http://technoballgame.com/technoball-hotseat-version/&quot;&gt;забавные модификации&lt;/a&gt;). Все вроде хорошо. Первая действительно хорошая демка была готова к ноябрю. Между маем и ноябрем было сделано две промежуточные версии, людям была показана вообще только одна. И совершенно немногие знали о том, что делается игра.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;К первой демке мы осознали, что делаем все неправильно и надо сильно менять геймплей (техническим языком - выкидывать половину того, что все написано).&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;Было принято волевое решение: выливаем существующую демку как есть и, учитывая ошибки, начинаем делать нормально.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Итог&lt;/b&gt;: &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.technogame.technowasteland&quot;&gt;игра на гугл-плее&lt;/a&gt;, утонувшая в тысячах ей подобных, получен бесценный опыт.&lt;br /&gt;&lt;b&gt;Совершенные ошибки&lt;/b&gt;: распыление на фичи, что повлекло за собой долгий срок разработки, разработка, никому не показывая - не было объективного фидбека.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;&lt;b&gt;Вывод: &lt;/b&gt;не бояться показывать продукты, делать мало, но быстро.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: white; border: 0px; color: #4d4d4d; font-family: &#39;PT Sans&#39;, helvetica, &#39;segoe UI&#39;, arial, sans-serif; line-height: 1.3em; margin-bottom: 25px; outline: 0px; padding: 0px; quotes: none; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;line-height: 1.3em;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; color: #4d4d4d; font-family: &#39;PT Sans&#39;, helvetica, &#39;segoe UI&#39;, arial, sans-serif; line-height: 1.3em; margin-bottom: 25px; outline: 0px; padding: 0px; quotes: none; text-align: right; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;line-height: 1.3em;&quot;&gt;&lt;i&gt;Давайте отвернем кресло от монитора, направим взгляд в левый верхний угол и задумаемся. Вот игра, которую мы вынашиваем, тайно вырисовываем скетчи и неохотно обсуждаем с самыми близкими людьми, она делается для себя или для игроков? Только честно, не обманывая себя, хорошо так подумаем... Если игра для людей, то зачем затворничать? Пускай лидеры индустрии и будущие игроки помогут вам разработать вашу игру.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; color: #4d4d4d; font-family: &#39;PT Sans&#39;, helvetica, &#39;segoe UI&#39;, arial, sans-serif; line-height: 1.3em; margin-bottom: 25px; outline: 0px; padding: 0px; quotes: none; text-align: right; vertical-align: baseline;&quot;&gt;
&lt;span style=&quot;line-height: 1.3em;&quot;&gt;&lt;i&gt;(с) &lt;a href=&quot;http://kanobu.ru/articles/sudi-gamesjamkanobu-oleg-pridyuk-unity-technologies-367880/&quot;&gt;Олег Придюк&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: white; border: 0px; color: #4d4d4d; font-family: &#39;PT Sans&#39;, helvetica, &#39;segoe UI&#39;, arial, sans-serif; line-height: 1.3em; margin-bottom: 25px; outline: 0px; padding: 0px; quotes: none; text-align: right; vertical-align: baseline;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace;&quot;&gt;&lt;span style=&quot;line-height: 17.333332061767578px;&quot;&gt;&lt;b&gt;История №2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace;&quot;&gt;&lt;span style=&quot;line-height: 17.333332061767578px;&quot;&gt;Игра &lt;a href=&quot;http://vk.com/roadsmash&quot;&gt;road smash&lt;/a&gt;&amp;nbsp;делается с февраля 2013, скоро ожидается полноценный релиз,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;я присоединился в конце сентября.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;Ребята делали игру, завели &lt;/span&gt;&lt;a href=&quot;http://vk.com/laikaboss&quot; style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;блог разработчика&lt;/a&gt;&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;, к &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.laikaboss.ual.roadsmash&quot;&gt;первой публичной бете&lt;/a&gt; (которая была, честно говоря, пре-альфой) были фанаты, игра за месяц набрала миллион загрузок без рекламы и продвижения. Мы пережили падение сервера, кучу клиенстких багов, вопли детей &quot;Разраб, верни галду!&quot;, факапы длиной в месяц, разработка фич, которые никому не нужны. Большинство факапов связано с привычкой все усложнять, болезнью &lt;a href=&quot;http://habrahabr.ru/post/209386/&quot;&gt;абстрактно ориентированного программиста&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;&lt;b&gt;Итог&lt;/b&gt;: игра делается в сумме год, публичная бета(которая пре-альфа) неожиданно взлетела.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;&lt;b&gt;Совершенные ошибки&lt;/b&gt;: over-engineering, построение сложных систем, вместо того, чтобы сделать по простому. Разработка того, что не принесет пользы.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;&lt;b&gt;Вывод&lt;/b&gt;: &lt;a href=&quot;http://en.wikipedia.org/wiki/You_aren&#39;t_gonna_need_it&quot;&gt;yagni&lt;/a&gt;&amp;nbsp;и почаще думать головой. Головой думать всегда полезно, не только в разработке.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;&lt;i&gt;Простота - ключ к надежности&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;&lt;i&gt;(с)Дейкстра&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: right;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, &#39;Liberation Mono&#39;, &#39;Droid Sans Mono&#39;, &#39;Ubuntu Mono&#39;, &#39;Lucida Console&#39;, &#39;Helvetica Neue&#39;, monospace; line-height: 17.333332061767578px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace;&quot;&gt;&lt;span style=&quot;line-height: 17.333332061767578px;&quot;&gt;Хотел еще историю написать, лучше ограничусь этими двумя.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace;&quot;&gt;&lt;span style=&quot;line-height: 17.333332061767578px;&quot;&gt;&lt;b&gt;Общая мораль&lt;/b&gt;: никому не интересен идеальный продукт, выпущенный поздно. Всем нужно прямо здесь и уже вчера. Поэтому если вы собрались делать мобильные приложения, то лучше делать максимально просто и быстро, получая фидбек как можно скорее. И в первую очередь нужно делать самое важное, а потом уже остальное.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;P.S. Потратил полтора часа на написание статьи, а у самого лежит бизнес-план, пишущийся с января и сделанный на 80%. Ну не идиот ли я?&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace; font-size: x-small;&quot;&gt;&lt;span style=&quot;line-height: 17.333332061767578px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace; font-size: x-small;&quot;&gt;&lt;span style=&quot;line-height: 17.333332061767578px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: Monaco, Liberation Mono, Droid Sans Mono, Ubuntu Mono, Lucida Console, Helvetica Neue, monospace; font-size: x-small;&quot;&gt;&lt;span style=&quot;line-height: 17.333332061767578px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/771169625535312434/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2014/02/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/771169625535312434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/771169625535312434'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2014/02/blog-post.html' title='Делайте быстрее!'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-5588675012435043192</id><published>2014-01-25T15:56:00.001-08:00</published><updated>2014-01-25T15:56:10.686-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="objective c"/><title type='text'>UIViewController for dummies</title><content type='html'>UIViewControllers became harder to understand with Storyboards - there are lots of auto-layouts you might not handle.&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Just a liitle hint to help debugging:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: white; border: 0px; clear: both; font-family: Arial, &#39;Liberation Sans&#39;, &#39;DejaVu Sans&#39;, sans-serif; font-size: 14px; line-height: 17.804800033569336px; margin-bottom: 1em; padding: 0px; vertical-align: baseline;&quot;&gt;
UIViewController&#39;s method invoke sequence is as below&lt;/div&gt;
&lt;ul style=&quot;background-color: white; border: 0px; font-family: Arial, &#39;Liberation Sans&#39;, &#39;DejaVu Sans&#39;, sans-serif; font-size: 14px; line-height: 17.804800033569336px; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1em 30px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;li style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;awakeFromNib&lt;/li&gt;
&lt;li style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;viewDidLoad&lt;/li&gt;
&lt;li style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;viewWillAppear&lt;/li&gt;
&lt;li style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;viewWillLayoutSubviews&lt;/li&gt;
&lt;li style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;viewDidLayoutSubviews&lt;/li&gt;
&lt;li style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;viewDidAppear&lt;/li&gt;
&lt;li style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;viewWillLayoutSubviews&lt;/li&gt;
&lt;li style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;viewDidLayoutSubviews&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style=&quot;font-family: Arial, Liberation Sans, DejaVu Sans, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 14px; line-height: 17.804800033569336px;&quot;&gt;So, if you have views building by code, make sure that storyboard layout will not break it into mess.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/5588675012435043192/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2014/01/uiviewcontroller-for-dummies.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/5588675012435043192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/5588675012435043192'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2014/01/uiviewcontroller-for-dummies.html' title='UIViewController for dummies'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-6781959498787927640</id><published>2013-12-09T12:57:00.003-08:00</published><updated>2013-12-11T10:45:01.175-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="game development"/><category scheme="http://www.blogger.com/atom/ns#" term="ios"/><category scheme="http://www.blogger.com/atom/ns#" term="unity"/><category scheme="http://www.blogger.com/atom/ns#" term="unity3d"/><title type='text'>5 things you need to implement in any mobile game</title><content type='html'>&lt;i&gt;&lt;a href=&quot;http://technoballgame.com/5-%D1%84%D0%B8%D1%87%D0%B5%D0%B9-%D0%B1%D0%B5%D0%B7-%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D1%85-%D0%BD%D0%B5-%D0%BE%D0%B1%D0%BE%D0%B9%D0%B4%D0%B5%D1%82%D1%81%D1%8F-%D0%BD%D0%B8-%D0%BE%D0%B4%D0%BD/&quot;&gt;русская версия - здесь&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;I have three posts in drafts(called &quot;You don&#39;t need server&quot; and &quot;3 reasons to switch from Asset Server&quot;, &quot;Execute impossible to pardon: how to deal with hackers&quot;), but decided to write this one just because it seems more timely than others.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://pp.vk.me/c320827/v320827909/3677/2REdp3OtDwU.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://pp.vk.me/c320827/v320827909/3677/2REdp3OtDwU.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;We had discussion with Yuri about what makes any game perfect and what features must be implemented and come up with some common and must-have features:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;in-app-purchases&lt;/b&gt;. No comments here. If you want to make money from your game, you&#39;d better have well-tested, stable in-apps;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;analytics&lt;/b&gt;. The thing is you can not predict user behaviour unless you have any clue what your user is doing in the game. And it&#39;s better to have as much information as possible - you know where is your problem in your game mechanics and can easily fix it up;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;local and remote push notifications&lt;/b&gt;. We didn&#39;t implement them in the first releases of Road Smash and we feel regret about it. What is the easiest way to let the users play updated game? Obviously, push notifications.I know that users may hate pushes and remove your app just because they are got annoyed by your app, but in 70% it works.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Anticheat protection. &lt;/b&gt;You know, cheaters always exist, especially on android and you need to prevent your game from being hacked. Somebody may say that you need to protect everything, somebody have an opinion that you need to give up on hackers and let them play. I think that hackers wouldn&#39;t pay. They would keep hacking the game until they find something or even delete it from their devices, but they would never pay. So I came up with the decision here: &lt;i&gt;protect only that things that cost money or may affect other users&lt;/i&gt;. In business terms there are two&amp;nbsp;most important&amp;nbsp;things for developer: users that bring money. When I say money, I mean in-apps, when I say affect other users, I mean scoreboard, social, competition parts of your game. And you need to keep tiny balance between letting gamers play comfortably and prevent players from stealing your money.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ads. &lt;/b&gt;I underestimated role of ads, thought it&#39;s annoying and may push your user away. But I was wrong. Firstly, you can integrate ads, so they will become part of your gameplay. Users will want to see some ads just to get some goods instead. And of course, it is a great chance to &amp;nbsp;get money from users that will never pay :)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
The main purpose of any game is to have a lot of users in game and keep them as long as long as possible, letting them pay for any reason. In that meaning these five features described must be implemented, well-tested as soon as possible.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
And to make this post more concrete, I have some links to assets to share with you to get that features implemented in the easiest way.&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;in-apps&lt;/b&gt;: use &lt;a href=&quot;http://outlinegames.com/unibill-documentation/&quot;&gt;&lt;b&gt;unibill&lt;/b&gt;&lt;/a&gt;. It supports app store, google play, windows store out-of-box, including receipts, subscriptions, etc. Must-have!&lt;/li&gt;
&lt;li&gt;&lt;b&gt;analytics&lt;/b&gt;: there&#39;s a wonderful and free plugin, called &lt;a href=&quot;http://www.gameanalytics.com/&quot;&gt;&lt;b&gt;GameAnalytics&lt;/b&gt;&lt;/a&gt;. It supports events, heat maps, gameplay stats. If you are fan of old-school analytics, you may check out for my wrapper to &lt;b&gt;Flurry plugin&lt;/b&gt; in my &lt;a href=&quot;https://github.com/rganeyev&quot;&gt;github repository&lt;/a&gt;, I&#39;ll push all the code as soon as I find free time for it.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;push notification&lt;/b&gt;: there are too many good plugins in assets, so I don&#39;t know what&#39;s the best option here. I&#39;d recommend &lt;a href=&quot;http://www.pushwoosh.com/&quot;&gt;pushwoosh&lt;/a&gt; service, because it provides a lot of features out-of-box, but let me leave this topic open.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;anticheat&lt;/b&gt;: well... there&#39;s no common solution as it really depends on what kind of game you are working on. Maybe some kind of playerprefs encryption, in-apps encryption? Did I miss something?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ads&lt;/b&gt;: there is a bunch of different options: admob, tapjoy, adcolony, applifier. Some of them provide banner and image ads, some of them kind of video or partnership ads. Choose one you like the most.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/6781959498787927640/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/12/5-things-you-need-to-implement-in-any.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/6781959498787927640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/6781959498787927640'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/12/5-things-you-need-to-implement-in-any.html' title='5 things you need to implement in any mobile game'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-7273071798064303973</id><published>2013-11-19T14:39:00.001-08:00</published><updated>2013-11-19T14:41:11.487-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="asset store"/><category scheme="http://www.blogger.com/atom/ns#" term="continuous integration"/><category scheme="http://www.blogger.com/atom/ns#" term="flurry"/><category scheme="http://www.blogger.com/atom/ns#" term="plugins"/><category scheme="http://www.blogger.com/atom/ns#" term="unity"/><category scheme="http://www.blogger.com/atom/ns#" term="unity3d"/><title type='text'>Unity Continuous Integration</title><content type='html'>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3gA2qt66KyoAh33npT1eQcopfR4kYIXUUlOejDzcvvycNMzNd3UvF8RibXYWxcbGNR2-Av312U14IFo95SOU_BOHnEZyV-Hrxgp1ncageafm08iFXF-G_fWSxQWi6XQjAEPUzUcFqV7Q/s1600/ci_unity_128.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3gA2qt66KyoAh33npT1eQcopfR4kYIXUUlOejDzcvvycNMzNd3UvF8RibXYWxcbGNR2-Av312U14IFo95SOU_BOHnEZyV-Hrxgp1ncageafm08iFXF-G_fWSxQWi6XQjAEPUzUcFqV7Q/s1600/ci_unity_128.png&quot; /&gt;&lt;/a&gt;And finally Unity Continuous Integration (CI) plugin is on Unity Asset Store! Check it out:&amp;nbsp;&lt;a href=&quot;https://www.assetstore.unity3d.com/#/content/12695&quot;&gt;https://www.assetstore.unity3d.com/#/content/12695&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I spent a day setting up Jenkins build machine on &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.laikaboss.ual.roadsmash&quot;&gt;Road Smash&lt;/a&gt; project and spent one more day to unify builder script and writing documentation, so I can use it on any unity project with any CI framework and any CVS systems, including asset server, git, svn. It works out-of-box, the only thing you need is to call the right method(like BuildAndroid, BuildIOS) from command line(OSX, Windows).&lt;br /&gt;
&lt;br /&gt;
For now Unity CI supports:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;iOS build&lt;/li&gt;
&lt;li&gt;Android builds (including different builds for different textures format, including ATC, ETC, DXT &amp;amp; PVRTC). You can call a method to build 5 different apks, which will support different textures from AndroidManifest.xml and &lt;a href=&quot;http://developer.android.com/google/play/publishing/multiple-apks.html&quot;&gt;may be uploaded to Google Play as multiple apks&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I didn&#39;t include changing version code to plugin, because every project may have its own policy and I may break it, but it is really easy to add there. I&#39;ll write another post about all android building stuff later.&lt;br /&gt;
&lt;br /&gt;
I&#39;m planning to include unit-testing plugin to CI and make it portable. I&#39;ll finish it up as soon as I&#39;ll have a free time for it.&lt;/div&gt;
&lt;br /&gt;
P.S. Unity Technologies rejected my Flurry plugin(full iOS &amp;amp; Android, Windows Phone beta support) for its own internal business reasons. Is anybody interested in it?</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/7273071798064303973/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/11/unity-continuous-integration.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/7273071798064303973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/7273071798064303973'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/11/unity-continuous-integration.html' title='Unity Continuous Integration'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3gA2qt66KyoAh33npT1eQcopfR4kYIXUUlOejDzcvvycNMzNd3UvF8RibXYWxcbGNR2-Av312U14IFo95SOU_BOHnEZyV-Hrxgp1ncageafm08iFXF-G_fWSxQWi6XQjAEPUzUcFqV7Q/s72-c/ci_unity_128.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-4369321789407156040</id><published>2013-11-13T04:24:00.002-08:00</published><updated>2013-11-13T04:29:41.758-08:00</updated><title type='text'>Codility prefix problem</title><content type='html'>I got a problem from codility site and was asked to solve it. Here&#39;s a &lt;a href=&quot;http://stackoverflow.com/questions/19869262/latest-codility-time-problems?noredirect=1&quot;&gt;link on stackoverflow&lt;/a&gt;. In two words: assume we have a string S and we need to choose such a prefix P of S, that product of its length and occurrence in S will be maximum.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;background-color: white; border: 0px; clear: both; font-family: Arial, &#39;Liberation Sans&#39;, &#39;DejaVu Sans&#39;, sans-serif; font-size: 14px; line-height: 18px; margin-bottom: 1em; padding: 0px; vertical-align: baseline;&quot;&gt;
For example, S = &quot;abababa&quot; has the following prefixes:&lt;/div&gt;
&lt;pre class=&quot;lang-cs prettyprint prettyprinted&quot; style=&quot;background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, &#39;Lucida Console&#39;, &#39;Liberation Mono&#39;, &#39;DejaVu Sans Mono&#39;, &#39;Bitstream Vera Sans Mono&#39;, &#39;Courier New&#39;, monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;&quot;&gt;&lt;code style=&quot;border: 0px; font-family: Consolas, Menlo, Monaco, &#39;Lucida Console&#39;, &#39;Liberation Mono&#39;, &#39;DejaVu Sans Mono&#39;, &#39;Bitstream Vera Sans Mono&#39;, &#39;Courier New&#39;, monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;str&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; whose product equals &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;ab&quot;&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; whose product equals &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;aba&quot;&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; whose product equals &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;abab&quot;&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; whose product equals &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;ababa&quot;&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; whose product equals &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;ababab&quot;&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; whose product equals &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;str&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&quot;abababa&quot;&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; whose product equals &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;7.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;I like problems like that. It has obvious solution in O(N ** 3) time, elegant and easy to guess if you know &lt;a href=&quot;http://www.cs.cmu.edu/~ckingsf/bioinfo-lectures/zalg.pdf&quot;&gt;z-algorithm&lt;/a&gt; O(N ** 2) solution and tricky O(N) solution.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
Ok, first solution is naive brute-force. You choose length from 1 to N, get a prefix of its length and count occurences by brute-force searching. So, choosing length takes O(N) time and brute force takes O(N ** 2) time, totally O(N ** 3).&lt;br /&gt;
&lt;br /&gt;
Ok, it doesn&#39;t really what we want to achieve. Let&#39;s think how we can reduce complexity. Anyone who ever learned strings knows that string occurence can be searched in O(N) time, so with a little code we can achieve O(N ** 2) time compexity solution. I used Z-algorithm. Here&#39;s the code:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;html&gt;&lt;body style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;pre&gt;
&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;vector&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt;&amp;gt; z_function(&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;string&lt;/span&gt; &amp;amp;S); &lt;span style=&quot;color: #3f7f59;&quot;&gt;//z-function, z[0] = S.length()&lt;/span&gt;

&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; calculate(&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;string&lt;/span&gt; &amp;amp;S) {
 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;vector&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt;&amp;gt; z = z_function(S);

 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; ans = 0;
 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; i = 1; i &amp;lt;= S.length(); ++i) { &lt;span style=&quot;color: #3f7f59;&quot;&gt;//iterate on length&lt;/span&gt;
  &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; k = 0; &lt;span style=&quot;color: #3f7f59;&quot;&gt;//counter of occurrences&lt;/span&gt;
  &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; j = 0; j &amp;lt; S.length(); ++j) 
   &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;if&lt;/span&gt; (z[j] &amp;gt;= i) ++k;  

  &lt;span style=&quot;color: #3f7f59;&quot;&gt;//update answer&lt;/span&gt;
  ans = &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;max&lt;/span&gt;(ans, i * k);
 }
        &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;return&lt;/span&gt; ans;
}
&lt;/pre&gt;
&lt;/body&gt;&lt;/html&gt;&lt;/pre&gt;
&lt;br /&gt;
But it is still not enough though. How we can get rid of nested loop? We can precalc prefix occurences with Z-algo and finding them in constant time. Initially Z-algo returns an array, where z[i] is the length of longest substring starting from S[i], which is also prefix of S. For &quot;abacaba&quot; it will return {7, 0, 1, 0, 3, 0, 1}. And we know that if prefix of S with length i has N occurrences, then all smaller prefixes of S will have at least N occurrences. So, we create an array of occurrences, iterate over z-array, updating new created array and finally iterate over it backwards, updating as explained above.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;html&gt;&lt;body style=&quot;background: #ffffff; color: black;&quot;&gt;&lt;pre&gt;
&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;vector&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt;&amp;gt; z_function(&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;string&lt;/span&gt; &amp;amp;S); &lt;span style=&quot;color: #3f7f59;&quot;&gt;//z-function, z[0] = S.length()&lt;/span&gt;

&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; calculate(&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;string&lt;/span&gt; &amp;amp;S) {
 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;vector&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt;&amp;gt; z = z_function(S);

 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; n = S.length(); 
 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;vector&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt;&amp;gt; cnt(n + 1);


 &lt;span style=&quot;color: #3f7f59;&quot;&gt;//cnt[i] - count of i-length prefix occurrences of S &lt;/span&gt;
 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; i = 0; i &amp;lt; n; ++i) 
  ++cnt[z[i]];

 &lt;span style=&quot;color: #3f7f59;&quot;&gt;//if cnt[i] is in S, cnt[i - 1] will be in S&lt;/span&gt;
 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; previous = 0;
 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; i = n; i &amp;gt; 0; --i) {
  cnt[i] += previous;
  previous = cnt[i];
 }

 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; ans = 0;
 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; i = 1; i &amp;lt;= S.length(); ++i) { &lt;span style=&quot;color: #3f7f59;&quot;&gt;//iterate on length&lt;/span&gt;
  &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;int&lt;/span&gt; test = cnt[i] * i;
  &lt;span style=&quot;color: #3f7f59;&quot;&gt;//update answer&lt;/span&gt;
  ans = &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;max&lt;/span&gt;(ans, test);
 }

 &lt;span style=&quot;color: #7f0055; font-weight: bold;&quot;&gt;return&lt;/span&gt; ans;
}
&lt;/pre&gt;
&lt;/body&gt;&lt;/html&gt;&lt;/pre&gt;
&lt;br /&gt;
We separately count occurrences in O(N) time and find the answer in O(N) time as wanted.&lt;br /&gt;
&lt;br /&gt;
For me it is the most easiest way to solve this problem. If anyone knows better solution, please kindly share.</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/4369321789407156040/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/11/codility-prefix-problem.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/4369321789407156040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/4369321789407156040'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/11/codility-prefix-problem.html' title='Codility prefix problem'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-8067699726692247441</id><published>2013-10-31T04:07:00.003-07:00</published><updated>2013-10-31T04:07:55.878-07:00</updated><title type='text'>Сжатие текстур андроида и Unity3d</title><content type='html'>&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Unity! Я тебя обожаю! Ты из под-коробки поддерживаешь разные типы сжатия в билдах! Не надо руками конвертить, нет больше извратов с AndroidManifest. Поменял опцию и билди! It just automagically works!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Для любителей CI - поменять значение&lt;div&gt;
EditorUserBuildSettings.androidBuildSubtarget&lt;div&gt;
&lt;a href=&quot;http://docs.unity3d.com/Documentation/ScriptReference/AndroidBuildSubtarget.html&quot;&gt;http://docs.unity3d.com/Documentation/ScriptReference/AndroidBuildSubtarget.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Для ленивых: разные типы сжатия и девайсы, поддерживающие их:&lt;br /&gt;&lt;table class=&quot;class-member-list&quot; style=&quot;background-color: white; border-bottom-color: rgb(136, 133, 128); border-bottom-style: solid; border-collapse: collapse; border-top-color: rgb(136, 133, 128); border-top-style: solid; border-width: 1px 0px; font-family: Helvetica, Arial, sans-serif; font-size: 13px; margin-bottom: 2em; width: 700px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;th class=&quot;memberTableName&quot; style=&quot;font-weight: normal; padding: 0px 20px 0px 0px; vertical-align: top; width: 120px;&quot;&gt;&lt;a href=&quot;http://docs.unity3d.com/Documentation/ScriptReference/AndroidBuildSubtarget.html&quot; style=&quot;color: #145d7b; text-decoration: none;&quot;&gt;DXT&lt;/a&gt;&lt;/th&gt;&lt;td style=&quot;font-size: 12px; padding: 0px; vertical-align: top;&quot;&gt;S3 texture compression, nonspecific to DXT variant. Supported on devices running Nvidia Tegra2 platform, including Motorala Xoom, Motorola Atrix, Droid Bionic, and others.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class=&quot;memberTableName&quot; style=&quot;font-weight: normal; padding: 0px 20px 0px 0px; vertical-align: top; width: 120px;&quot;&gt;&lt;a href=&quot;http://docs.unity3d.com/Documentation/ScriptReference/AndroidBuildSubtarget.html&quot; style=&quot;color: #145d7b; text-decoration: none;&quot;&gt;PVRTC&lt;/a&gt;&lt;/th&gt;&lt;td style=&quot;font-size: 12px; padding: 0px; vertical-align: top;&quot;&gt;PowerVR texture compression. Available in devices running PowerVR SGX530/540 GPU, such as Motorola DROID series; Samsung Galaxy S, Nexus S, and Galaxy Tab; and others.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class=&quot;memberTableName&quot; style=&quot;font-weight: normal; padding: 0px 20px 0px 0px; vertical-align: top; width: 120px;&quot;&gt;&lt;a href=&quot;http://docs.unity3d.com/Documentation/ScriptReference/AndroidBuildSubtarget.html&quot; style=&quot;color: #145d7b; text-decoration: none;&quot;&gt;ATC&lt;/a&gt;&lt;/th&gt;&lt;td style=&quot;font-size: 12px; padding: 0px; vertical-align: top;&quot;&gt;ATI texture compression. Available on devices running Adreno GPU, including HTC Nexus One, &lt;br /&gt;Droid Incredible, EVO, and others.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th class=&quot;memberTableName&quot; style=&quot;font-weight: normal; padding: 0px 20px 0px 0px; vertical-align: top; width: 120px;&quot;&gt;&lt;a href=&quot;http://docs.unity3d.com/Documentation/ScriptReference/AndroidBuildSubtarget.html&quot; style=&quot;color: #145d7b; text-decoration: none;&quot;&gt;ETC&lt;/a&gt;&lt;/th&gt;&lt;td style=&quot;font-size: 12px; padding: 0px; vertical-align: top;&quot;&gt;ETC1 texture compression (or RGBA16 for textures with alpha), supported by all devices.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/8067699726692247441/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/10/unity3d.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/8067699726692247441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/8067699726692247441'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/10/unity3d.html' title='Сжатие текстур андроида и Unity3d'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-6046812849679618370</id><published>2013-10-23T09:14:00.000-07:00</published><updated>2013-10-23T09:14:46.716-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="shaders"/><category scheme="http://www.blogger.com/atom/ns#" term="unity"/><category scheme="http://www.blogger.com/atom/ns#" term="unity3d"/><category scheme="http://www.blogger.com/atom/ns#" term="баги"/><title type='text'>Баг шейдера при операции mul</title><content type='html'>Натолкнулись на баг в шейдере unity:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;шейдер ломается частично, а именно: чем ярче пиксель, тем больше он стробит (если оттенок черного - все норм, ярче - становится заметней). То есть шейдер работает, fallback-a не происходит!&lt;/li&gt;
&lt;li&gt;происходит &lt;b&gt;только &lt;/b&gt;при операции умножения матрицы 4x4 на вектор4.&lt;/li&gt;
&lt;li&gt;воспроизводится &lt;b&gt;только &lt;/b&gt;на адрено устройствах.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
И это при условии, что мы потом отбрасываем последнюю часть и приводим полученный ответ к vector3.&lt;/div&gt;
&lt;div&gt;
Называется, поймали эксепшн, который никак нельзя додуматься поймать.&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://s1.developerslife.ru/public/images/gifs/b520124b-9066-426b-9945-0170fd04a4ee.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://s1.developerslife.ru/public/images/gifs/b520124b-9066-426b-9945-0170fd04a4ee.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;br /&gt;В общем, у кого стробление пикселей в шейдере, напишите собственный mul (благо, это просто несколько операций dot).&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/6046812849679618370/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/10/mul.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/6046812849679618370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/6046812849679618370'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/10/mul.html' title='Баг шейдера при операции mul'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-3977809868019577621</id><published>2013-10-08T20:29:00.000-07:00</published><updated>2013-10-08T22:37:21.908-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="app store"/><category scheme="http://www.blogger.com/atom/ns#" term="ios"/><category scheme="http://www.blogger.com/atom/ns#" term="review"/><title type='text'>Интересное об app store review</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://cdn1.sbnation.com/entry_photo_images/4577485/itunes_app_store_icon_field_640_large_verge_medium_landscape.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;183&quot; src=&quot;http://cdn1.sbnation.com/entry_photo_images/4577485/itunes_app_store_icon_field_640_large_verge_medium_landscape.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
Кто хоть раз заливал приложение в app store, знает, что нужно пройти &amp;nbsp;этапы ожидания ревью, самого ревью и ready for sale. Ну так вот, несколько интересных моментов об ожидании в app store и ускорении ожидания (только ios и под каждым словом надо ставить имхо, ибо только мой опыт):&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Среднее время review - 5 рабочих дней&lt;/li&gt;
&lt;li&gt;Походу действительно весь штат apple сидит в США, поэтому надо еще рассчитывать их часовой пояс(где-то&amp;nbsp;-7 UTC), их локальное рабочее время. Это важно в случае написания писем.&lt;/li&gt;
&lt;li&gt;Expedited app review(это запрос на review без ожидания в случае, если там оказался критический баг или вот-вот начнется пиар-кампания) работает магическим образом. Более того, мне кажется, это сильно зависит от настроения отвечающего на запрос. Однажды я нашел некритичный баг после двух часов релиза и получил добро на expedited review. В другом случае я за пять дней до пиар-выставки отправил приложение и получил отказ в досрочном ревью. В общем, сделал следующий вывод: на expedited app review нельзя полагаться.&lt;/li&gt;
&lt;li&gt;Форма Contact us работает оперативно. Даже если они не отвечают, в течение часа что-то происходит.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://habrahabr.ru/post/139949/&quot;&gt;Статья хабра&lt;/a&gt;&amp;nbsp;не сработала. Или я не перескочил минимальный порог приложений для ожидания, или звезды ушли в параллельную вселенную, но это нисколько не повлияло на время ожидания.&lt;/li&gt;
&lt;li&gt;Если прошло более пяти рабочих дней, то стоит черкнуть письмецо через Contact us. Реально, они начинают проверять!&amp;nbsp;&lt;/li&gt;
&lt;li&gt;А теперь самое интересное: если в ожидании ревью висит несколько приложений и написать письмо(а там в форме надо написать id-шник приложения, у которого ты хочешь обновить статус проверки/ожидания проверки), то начинают проверять сначала не то приложение, которое ты упомянул в письме. Я думал, это одноразовый баг, но такое поведение повторялось у меня несколько раз! И до сих пор в ожидании ревью висит приложение, на которое я отправил запрос проверить в первую очередь, хотя остальные давно проверены. &lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/3977809868019577621/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/10/app-store-review.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/3977809868019577621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/3977809868019577621'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/10/app-store-review.html' title='Интересное об app store review'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-2560192761480569987</id><published>2013-09-20T17:33:00.001-07:00</published><updated>2013-09-20T17:33:32.109-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="optimization"/><category scheme="http://www.blogger.com/atom/ns#" term="presentations"/><category scheme="http://www.blogger.com/atom/ns#" term="unity3d"/><title type='text'>Unity3d optimization in one presentation</title><content type='html'>Let me just leave this here:&lt;br /&gt;
&lt;a href=&quot;http://malideveloper.arm.com/downloads/Unite_2013-Optimizing_Unity_Games_for_Mobile_Platforms.pdf&quot;&gt;presentation&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
... and that links...&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://docs.unity3d.com/Documentation/Manual/iphone-PracticalGuide.html&quot;&gt;Practical Guide to Optimization for Mobiles (Unity Manual)&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://docs.unity3d.com/Documentation/Manual/OptimizingGraphicsPerformance.html&quot;&gt;Optimizing Graphics Performance (Unity Manual)&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://docs.unity3d.com/Documentation/Manual/Profiler.html&quot;&gt;Profiler (Unity Manual)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blogs.unity3d.com/2012/03/23/shadowgun-optimizing-for-mobile-sample-level/&quot;&gt;ShadowGun: Optimizing for Mobile Sample Level (Unity Blog)&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://blogs.unity3d.com/wp-content/uploads/2011/08/FastMobileShaders_siggraph2011.pdf&quot;&gt;“Fast Mobile Shaders” talk at SIGGRAPH 2011 (Unity Blog)&lt;/a&gt;&amp;nbsp;- highly recommend to anyone who writes unity shaders&lt;br /&gt;
&lt;a href=&quot;http://malideveloper.arm.com/&quot;&gt;http://malideveloper.arm.com/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://malideveloper.arm.com/develop-for-mali/features/opengl-es-3-0-developer-resorces/&quot;&gt;OpenGL ES 3.0 Developer Resources (Mali Developer Center)&lt;/a&gt;&amp;nbsp;- now it&#39;s not widespread, but it seems to be very popular and effective in near future!&lt;br /&gt;
&lt;a href=&quot;http://blogs.arm.com/multimedia/643-astc-texture-compression-arm-pushes-the-envelope-in-graphics-technology/&quot;&gt;ASTC Texture Compression: ARM Pushes the Envelope in Graphics Technology (ARM Blogs)&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/2560192761480569987/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/09/unity3d-optimization-in-one-presentation.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/2560192761480569987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/2560192761480569987'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/09/unity3d-optimization-in-one-presentation.html' title='Unity3d optimization in one presentation'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-8306245929573714316</id><published>2013-09-16T14:19:00.001-07:00</published><updated>2013-09-16T15:05:54.694-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="optimization"/><category scheme="http://www.blogger.com/atom/ns#" term="performance"/><category scheme="http://www.blogger.com/atom/ns#" term="unity"/><category scheme="http://www.blogger.com/atom/ns#" term="unity3d"/><title type='text'>Optimize performance in Unity3d: practical notes </title><content type='html'>&lt;a href=&quot;http://technoballgame.com/%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-unity-%D0%BD%D0%B0-%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%B0%D1%85-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87/&quot;&gt;(Russian post goes here)&lt;/a&gt;&lt;br /&gt;
I wrote an &lt;a href=&quot;http://rustam-kot.blogspot.ru/2013/03/unity-3d.html&quot; target=&quot;_blank&quot;&gt;article in russian&lt;/a&gt; about unity performance optimization recently. In this topic I want to share some small, but efficient practical tips with you. Here we go:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil9x6gxPB-NWfkols4coKVZMolvNeKhUBQHhx-0HHtyLpL4cbUMpWdP8dTpyTHCMk9oBqVHORPGQub8MIKl50l51k-bfehXdhZW9WfZfHKOmj5HhpKuhUy-0pc4aCoVydqUw0ygD2Z_Qw/s1600/file.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;304&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil9x6gxPB-NWfkols4coKVZMolvNeKhUBQHhx-0HHtyLpL4cbUMpWdP8dTpyTHCMk9oBqVHORPGQub8MIKl50l51k-bfehXdhZW9WfZfHKOmj5HhpKuhUy-0pc4aCoVydqUw0ygD2Z_Qw/s320/file.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;
&lt;li&gt;if you&#39;re running out of memory, use proper texture compression. PVRTC is acceptable for iOS, DXT for android. And don&#39;t forget about mip-maps. I know, it gonna increase binary size by 30%, but it&#39;s worth it. Don&#39;t be so modest to limit max size to textures.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;If you don&#39;t need shadows in renderers (for example, in UI or something), just uncheck &quot;Receive shadows&quot; &amp;amp; &quot;Cast shadows&quot; options. They are always on by default.&lt;/li&gt;
&lt;li&gt;Don&#39;t forget about batching. And yes, static batching allows much more than dynamic, so you don&#39;t move object, mark it as static. If you want to combine meshes runtime, use &lt;a href=&quot;http://docs.unity3d.com/Documentation/ScriptReference/StaticBatchingUtility.Combine.html&quot;&gt;StaticBatchingUtility.Combine&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-KoQ4QdlWcpQUhsHPel1TkwuP5U37lNddHM9yS38J6Zl-7AOIzlCx-zWGLCSSFMdYbThXZYljK-g8NPBLLCQ-2UmPPLJYf6I-u2gw2uV6UDy2ELHTl27T7CL2ylLgbDAJxaBG9jelMLY/s1600/Screen+Shot+2013-09-17+at+12.32.14+AM.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-KoQ4QdlWcpQUhsHPel1TkwuP5U37lNddHM9yS38J6Zl-7AOIzlCx-zWGLCSSFMdYbThXZYljK-g8NPBLLCQ-2UmPPLJYf6I-u2gw2uV6UDy2ELHTl27T7CL2ylLgbDAJxaBG9jelMLY/s1600/Screen+Shot+2013-09-17+at+12.32.14+AM.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Take into account renderer settings, physics settings of project (Edit-&amp;gt;Project settings)&lt;/li&gt;
&lt;li&gt;Anti-aliasing, texture quality, shadows and vsync have many options. Just experiment with them to gain best performance/quality.&lt;/li&gt;
&lt;li&gt;Uncheck layer collision checks you don&#39;t need to calculate.&lt;/li&gt;
&lt;li&gt;If you don&#39;t really need physics, change fixed timestep.&lt;/li&gt;
&lt;li&gt;Don&#39;t move static objects.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Design your level, so your camera will not take a lot of objects, then camera culling will save a lot of frames for you.&lt;/li&gt;
&lt;li&gt;Mesh collider checks are very expensive! It&#39;s better to use double-check technique: firstly make a capsule or box collider and check with it&#39;s collision, then check with mesh collider.&lt;/li&gt;
&lt;li&gt;Lights. Know the difference between point &amp;amp; directional, use them properly.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Cache &amp;nbsp;transform, collider, rigidbody. We use &lt;a href=&quot;http://pastebin.com/gqS5n3cm&quot;&gt;CachedMonoBehaviour&lt;/a&gt; in our projects and happy with that (P.S. From 4.1 Unity did a lot of work with GetComponent optimization, but CachedMonoBehaviour is still faster).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
You may achieve better results if you know instruments you use. These tips are really easy to use and sometimes they give more performance than it&#39;s expected. Use it and know, premature optimization is root of all evil.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
P.S. We are applying all this tips in &lt;a href=&quot;http://technoballgame.com/&quot;&gt;game&amp;nbsp;named technoball&lt;/a&gt;, so please free to try it and tell me what you think about it.&lt;br /&gt;
P.P.S We made a lot of work and prepared an awesome update, stay in touch!</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/8306245929573714316/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/09/optimize-performance-in-unity3d.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/8306245929573714316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/8306245929573714316'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/09/optimize-performance-in-unity3d.html' title='Optimize performance in Unity3d: practical notes '/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil9x6gxPB-NWfkols4coKVZMolvNeKhUBQHhx-0HHtyLpL4cbUMpWdP8dTpyTHCMk9oBqVHORPGQub8MIKl50l51k-bfehXdhZW9WfZfHKOmj5HhpKuhUy-0pc4aCoVydqUw0ygD2Z_Qw/s72-c/file.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-2363512828883680373</id><published>2013-09-08T13:14:00.000-07:00</published><updated>2013-09-08T13:14:19.780-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="идеи"/><category scheme="http://www.blogger.com/atom/ns#" term="мысли"/><category scheme="http://www.blogger.com/atom/ns#" term="скриншоты"/><title type='text'>Мысля про скриншоты</title><content type='html'>Оказывается, &quot;бухгалтероподобным&quot; людям тяжело сделать скриншот и поделиться с друзьями. И вправду, я не умею стандартными средствами делать скриншот быстрее, чем следующими операциями:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;нажать prtscr&lt;/li&gt;
&lt;li&gt;открыть paint(быстрее, чем нажать пуск, набрать mspaint я не умею)&lt;/li&gt;
&lt;li&gt;вставить рисунок&lt;/li&gt;
&lt;li&gt;сохранить&lt;/li&gt;
&lt;li&gt;открыть файлопомойку, залить файл&lt;/li&gt;
&lt;li&gt;получить ссылку, поделиться&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
Как можно убыстрить этот процесс:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Воспользоваться связкой макинтош+дропбокс(кхе-кхе).&amp;nbsp;В маке я делаю в три операции: делаю скриншот сразу в десктоп (cmd+shift+3), кидаю в паблик дропбокс, получаю ссылку из дропбокса&lt;/li&gt;
&lt;li&gt;Воспользоваться сервисом &lt;a href=&quot;http://snag.gy/&quot;&gt;snag.gy&lt;/a&gt;. Смысл таков: нажимаете prtscr, открываете сайт, нажимаете вставить(если нужно, корректируете встроенным редактором), сохраняете, делитесь. Примерно так же быстро, как в маке.&lt;/li&gt;
&lt;li&gt;Наверняка есть уже готовые сервисы-демоны, которые висят в системе, при нажатии магического шортката делают скриншот, аплодят в файловую помойку и показывают ссылку. Если кто знает о таких, пожалуйста, поведайте! Если нет, скажите, если бы была такая прога, скажите, пользовались бы вы им?&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/2363512828883680373/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/2363512828883680373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/2363512828883680373'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/09/blog-post.html' title='Мысля про скриншоты'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-1781973784399202040</id><published>2013-08-22T10:11:00.000-07:00</published><updated>2013-08-22T10:11:01.755-07:00</updated><title type='text'>Facebook left-side menu with storyboards</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i51.tinypic.com/2112zwh.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://i51.tinypic.com/2112zwh.png&quot; width=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Well, facebook-like left-side menus became really trendy UI pattern, so everyone tries to insert it to their projects.&lt;br /&gt;
Functionally it&#39;s primitive: you have left-view in background, and there&#39;s drag gesture recognizer, which &quot;catches&quot; foreground view and moves it on xz-direction.&lt;br /&gt;
&lt;br /&gt;
There are lots of open source implementations for ios:&lt;br /&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/Inferis/ViewDeck&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;ViewDeck&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/stefanoa/SASlideMenu&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;SASlideMenu&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/jeremieweldin/JWSlideMenu&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;JWSlideMenu&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/devindoty/DDMenuController&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;DDMenuController&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/pkluz/PKRevealController/&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;PKRevealController&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/edgecase/ECSlidingViewController&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;ECSlidingViewController&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/meiwin/MWFSlideNavigationViewController&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;MWFSlideNavigationViewController&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/mikefrederick/MFSideMenu&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;MFSideMenu&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/gloubibou/HHTabListController&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;HHTabListController&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/myell0w/MTSlideViewController&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;MTSlideViewController&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/andrewroycarter/SlideViewController&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;SlideViewController&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/willowtreeapps/MTStackViewController&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;MTStackViewController&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;border: 0px; font-size: 14px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;&quot;&gt;&lt;a href=&quot;https://github.com/mutualmobile/MMDrawerController&quot; style=&quot;border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;&quot;&gt;MMDrawerController&lt;/a&gt;&lt;/li&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
I&#39;d recommend to use ViewDeck and SASlideMenu, because they are the most functional and easiest to integrate (&lt;span style=&quot;font-size: 14px;&quot;&gt;For android developers&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;it&#39;s worth to mention&lt;/span&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&amp;nbsp;this&amp;nbsp;&lt;a href=&quot;http://stackoverflow.com/questions/8657894/android-facebook-style-slide&quot; target=&quot;_blank&quot;&gt;stackoverflow answer&lt;/a&gt;).&lt;/span&gt;&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But there was a problem related to storyboards: there&#39;s no out-of-box solution to integrate left-side menu with storyboards power! Recently I found really easy to use framework: &lt;a href=&quot;https://github.com/simonrice/ViewDeckStoryboardExample&quot; target=&quot;_blank&quot;&gt;ViewDeckStoryBoards&lt;/a&gt;. Hooray, there&#39;s no need to revert back to xibs nightmare! It&#39;s based on viewDeck, there&#39;s a little code needed(just to overwrite left side &amp;amp; main windows). It supports arc, storyboards.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/1781973784399202040/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/08/facebook-left-side-menu-with-storyboards.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/1781973784399202040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/1781973784399202040'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/08/facebook-left-side-menu-with-storyboards.html' title='Facebook left-side menu with storyboards'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://i51.tinypic.com/2112zwh_th.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-7060526751548125250</id><published>2013-06-29T14:37:00.001-07:00</published><updated>2013-07-03T23:19:31.064-07:00</updated><title type='text'>Принцип самурая или почему надо радоваться преждевременным ошибкам</title><content type='html'>Делаем игру с командой и часто инспектируем код друг друга.&lt;br /&gt;
Натолкнулся вот на это:(&lt;a href=&quot;http://pastebin.com/S3Ac5q5V&quot;&gt;ссылка&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Awake ()&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;saveDirPath = Application.dataPath + &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;/Levels/&quot;&lt;/span&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (buttonSave != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;) {&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIEventListener.Get (buttonSave.gameObject).onClick += OnButtonSave_Click;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (buttonLoad != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;) {&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIEventListener.Get (buttonLoad.gameObject).onClick += OnButtonLoad_Click;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (buttonInputDialogOk != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;) {&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIEventListener.Get (buttonInputDialogOk.gameObject).onClick += OnButtonInputDialogOk_Click;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (buttonInputDialogCancel != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;) {&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIEventListener.Get (buttonInputDialogCancel.gameObject).onClick += OnButtonInputDialogCancel_Click;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (buttonselectLevelDialogClose != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;) {&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIEventListener.Get (buttonselectLevelDialogClose.gameObject).onClick += OnButtonselectLevelDialogClose_Click;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
Коротко: есть кнопки, и при запуске подписываются обработчики. Все хорошо, код абсолютно безопасен. Но он плох. Почему?&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
Все очень просто. Если кто-нибудь забудет указать связь кнопки с кодом, то это значение будет равно null =&amp;gt; подписка обработчиков не будет работать =&amp;gt; обработчик никогда не вызовется. &amp;nbsp;То есть как-бы все хорошо, все работает, но по факту кнопки не работают, ничего не работает.&lt;br /&gt;
&lt;br /&gt;
Казалось бы, фигня вопрос, мы при первом нажатии это заметим. Но на самом деле проблема лежит глубже, чем хотелось бы.&lt;br /&gt;
Это хорошо, если наш код будет простым, там не будет цепочки действий, мы сможем легко локализовать проблему. Но при разрастании навигация по коду утяжеляется, ошибку приходится искать бинарным поиском по коду, тратится куча времени. Более того, каждый раз ловя критическую ошибку и продолжая при этом работать, любая программа становится полурабочей, обваливает другие системы. Грубо говоря, такая программа - &amp;nbsp;бомба замедленного действия.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Как в таких ситуациях поступать? Очень просто - используем &lt;a href=&quot;http://habrahabr.ru/post/128397/&quot; target=&quot;_blank&quot;&gt;принцип самурая&lt;/a&gt;, любой код должен придерживаться его:&amp;nbsp;&lt;span style=&quot;background-color: white; font-family: Verdana, sans-serif; font-size: 13px; line-height: 20px;&quot;&gt;е&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: white; font-size: 13px; line-height: 20px;&quot;&gt;сли функции переданы &lt;b&gt;неверные входные параметры&lt;/b&gt; или она вызывается &lt;b&gt;в некорректном состоянии&lt;/b&gt; – &lt;b&gt;генерируйте исключение&lt;/b&gt;; если при выполнении своей работы внутренняя функция генерирует исключение, то это означает, что и ваша функция свою работу выполнить не сможет.&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;background-color: white; border: 0px; font-size: 13px; line-height: 20px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;В этом случае нужно либо пробрасывать исключение, либо завернуть его в другое исключение.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsxlzpcOnpTUmXN2JSbw5VLsq5m58mQvzSMJo_KyXPeEBHjKkmvKniJ3sUZP0kz1OU5hXso4QtuDJDMTCxGGJfYkELOeOTI8ku7akUWiJJfLQyk5UZsID06BYLnaPqwKpKF9NS1daKXE/s1280/advice.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;254&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsxlzpcOnpTUmXN2JSbw5VLsq5m58mQvzSMJo_KyXPeEBHjKkmvKniJ3sUZP0kz1OU5hXso4QtuDJDMTCxGGJfYkELOeOTI8ku7akUWiJJfLQyk5UZsID06BYLnaPqwKpKF9NS1daKXE/s320/advice.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;br style=&quot;background-color: white; font-size: 13px; line-height: 20px;&quot; /&gt;&lt;span style=&quot;background-color: white; font-size: 13px; line-height: 20px;&quot;&gt;Из этого принципа следует, что «глотать» исключения – это плохо, поскольку вы, фактически, скрываете свои проблемы от глаз вызывающего кода и не даете внешнему коду возможности узнать об этом. Не нужно брать на себя слишком многого, пусть голова болит у вашего «клиента», что делать с «вашим телом» (то есть с исключением), когда вы не справились со своей задачей и решили последовать принципам самурая.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: white; font-size: 13px; line-height: 20px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: white; font-size: 13px; line-height: 20px;&quot;&gt;Как поступить в этом примере?&lt;br /&gt;Первое, что приходит в голову - просто убрать проверки на null. Поскольку это делается в awake(то есть конструктор-методе Unity),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: white; font-size: 13px; line-height: 20px;&quot;&gt;этот способ применим, потому что этот код вызовется сразу же, упадет c null-pointer-ом, мы сразу о нем узнаем. Но в общем случае, это родственник предыдущего кода.&lt;br /&gt;&lt;br /&gt;Более общим и правильным решением является старый assert(&lt;a href=&quot;http://pastebin.com/hdS5PyEh&quot; target=&quot;_blank&quot;&gt;ссылка&lt;/a&gt;), знакомый всем составителям задач:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;background-color: white; font-size: 13px; line-height: 20px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Awake ()&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;saveDirPath = Application.dataPath + &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;/Levels/&quot;&lt;/span&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Tools.Assert (buttonSave != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;buttonSave is not assigned&quot;&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIEventListener.Get (buttonSave.gameObject).onClick += OnButtonSave_Click;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Tools.Assert (buttonLoad != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;buttonLoad is not assigned&quot;&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIEventListener.Get (buttonLoad.gameObject).onClick += OnButtonLoad_Click;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Tools.Assert (buttonInputDialogOk != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;buttonInputDialogOk is not assigned&quot;&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIEventListener.Get (buttonInputDialogOk.gameObject).onClick += OnButtonInputDialogOk_Click;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Tools.Assert (buttonInputDialogCancel != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;buttonImputDialogCancel is not assigned&quot;&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIEventListener.Get (buttonInputDialogCancel.gameObject).onClick += OnButtonInputDialogCancel_Click;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Tools.Assert (buttonselectLevelDialogClose != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;buttonselectLevelDialogClose is not assigned&quot;&lt;/span&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UIEventListener.Get (buttonselectLevelDialogClose.gameObject).onClick += OnButtonselectLevelDialogClose_Click;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;//in Tools class&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt; Assert (&lt;span style=&quot;color: blue;&quot;&gt;bool&lt;/span&gt; condition, &lt;span style=&quot;color: blue;&quot;&gt;string&lt;/span&gt; message)&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;#if&lt;/span&gt; UNITY_EDITOR&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (!condition) {&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;new&lt;/span&gt; UnityException (message);&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;#endif&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;span style=&quot;color: black; font-family: Courier New; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
Значит ли это, что надо везде придерживаться предусловий и постусловий? И да, и нет. Конечно, можно начинать любой метод с кучи проверок на случай ядерной войны. Можно поступить лучше: для каждого метода должно быть объявлено некое соглашение - &lt;a href=&quot;http://sergeyteplyakov.blogspot.ru/2010/05/blog-post.html&quot; target=&quot;_blank&quot;&gt;контракт&lt;/a&gt;, на основании которого он работает. Если по контракту обработка неправильного поведения происходит на уровне интерфейсов, тогда функция, у которой core обязанности, никогда не примет невалидные данные.</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/7060526751548125250/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/06/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/7060526751548125250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/7060526751548125250'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/06/blog-post.html' title='Принцип самурая или почему надо радоваться преждевременным ошибкам'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDsxlzpcOnpTUmXN2JSbw5VLsq5m58mQvzSMJo_KyXPeEBHjKkmvKniJ3sUZP0kz1OU5hXso4QtuDJDMTCxGGJfYkELOeOTI8ku7akUWiJJfLQyk5UZsID06BYLnaPqwKpKF9NS1daKXE/s72-c/advice.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-3052495708626257491</id><published>2013-06-23T10:50:00.003-07:00</published><updated>2013-06-25T08:39:00.848-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="unity"/><category scheme="http://www.blogger.com/atom/ns#" term="unity3d"/><category scheme="http://www.blogger.com/atom/ns#" term="философия"/><title type='text'>Почему Unity?</title><content type='html'>Меня попросили написать короткую статью о том, зачем нужен unity3d и почему я пользуюсь именно им. Решил поделиться своими мыслями здесь, в блоге и постраться не создать очередной холливарной статьи :)&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0mM1NBPZh1DtkPxniv8_bUcSPw6_Ex0khE7yGoiIehapCeCJYgvcRHCp7vID_QEMOKxqTs51fYTzf1-twkUZr4L_jVcHdT94fEcuxU-FEH5vQMJooLIBDJP4fwTmcbdFzXIcjgHqBPFK1/s400/Mobile+Game+Development+India.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;122&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0mM1NBPZh1DtkPxniv8_bUcSPw6_Ex0khE7yGoiIehapCeCJYgvcRHCp7vID_QEMOKxqTs51fYTzf1-twkUZr4L_jVcHdT94fEcuxU-FEH5vQMJooLIBDJP4fwTmcbdFzXIcjgHqBPFK1/s200/Mobile+Game+Development+India.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Рынок мобильных приложений, в частности, мобильного гейм-дева, такой, как сейчас, появился совсем недавно - в 2008-2009 году, почти сразу после появления революционного по тем меркам гаджета под названием iphone. А поскольку игры на мобильных начали пользоваться бешенным спросом, то программисты начали делать все, чтобы этот спрос удовлетворить. Совсем скоро начали появляться движки для создания мобильных игр, такие как &lt;a href=&quot;http://www.stonetrip.com/what-is-shiva-3d.html&quot; target=&quot;_blank&quot;&gt;shiva3d&lt;/a&gt;, &lt;a href=&quot;http://www.cocos2d-x.org/&quot; target=&quot;_blank&quot;&gt;cocos2d&lt;/a&gt;, &lt;a href=&quot;http://www.madewithmarmalade.com/&quot; target=&quot;_blank&quot;&gt;airplay sdk&lt;/a&gt;(сейчас marmalade),&lt;a href=&quot;http://www.coronalabs.com/products/corona-sdk/&quot; target=&quot;_blank&quot;&gt; corona sdk&lt;/a&gt;, &lt;a href=&quot;http://www.unrealengine.com/udk/&quot; target=&quot;_blank&quot;&gt;unreal engine&lt;/a&gt; для мобилок(ограниченный udk), &lt;a href=&quot;http://unity3d.com/&quot; target=&quot;_blank&quot;&gt;unity3d&lt;/a&gt; и так далее. У меня был совсем маленький опыт разработки под marmalade, немножко поигрался с udk, но больше всего мне понравился unity3d.&lt;br /&gt;
&lt;br /&gt;
Чем же привлекателен лично для меня unity3d:&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://download.unity3d.com/unity/download/images/editor.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;234&quot; src=&quot;http://download.unity3d.com/unity/download/images/editor.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;огромные возможности. Действительно, у unity, как у любого высокоуровнего движка, огромный потенциал: графический, физический движок, звуковая система, использование нативных плагинов, импорт моделей, текстур в два клика - и все это работает из-под коробки. Те, кто перешли на &lt;strike&gt;темную сторону силы&lt;/strike&gt;&amp;nbsp;юньку с низкоуровневых движков, отмечают, что много функционала уже написано за них и надо написать только логику;&lt;/li&gt;
&lt;li&gt;сама экосистема unity3d. У юнити огромное общество, сидящее на форумах и &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://3dgep.com/wp-content/uploads/2012/07/Unity-Asset-Store.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;243&quot; src=&quot;http://3dgep.com/wp-content/uploads/2012/07/Unity-Asset-Store.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
стэковерфловах, помогающее тебе при проблемах. Также хитрые юнитеки сделали очень важную фичу - запилили удобные инструмены для создания собственных плагинов. Более того, они сделали Asset Store - это магазин плагинов, созданные пользователями. Хочешь добавить оплату - ищи in-app purchases в ассет сторе, нужно быстро сделать поддержку жестов, 2d, плейлистов музыки - обязательно найдется нужный плагин. Теперь создание игры представляет собой некий конструктор, где ты собираешь из мелких деталей одну большую игру. Использование плагинов в подавляющем большинстве оправдывает себя, несмотря на то, что ты можешь реализовать все это сам: плагин за 20 баксов вполне заменит день твоей разработки. &quot;&lt;span style=&quot;background-color: #fefdfa; color: #333333; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 13px; font-style: italic; line-height: 18px; text-align: justify;&quot;&gt;К сожалению, слишком много компаний отказываются потратить 500 долларов на инструмент, способный устранить противную ошибку за несколько минут, но с легкостью тратят тысячи долларов, платя разработчикам за барахтанье в коде в течение нескольких недель в попытках решить ту же проблему.&quot; &lt;/span&gt;&lt;span style=&quot;background-color: #fefdfa; color: #333333; font-family: Georgia, Utopia, &#39;Palatino Linotype&#39;, Palatino, serif; font-size: 13px; line-height: 18px; text-align: justify;&quot;&gt;(с)Джон Роббинс, отладка приложений для Microsoft.Net.&amp;nbsp;&lt;/span&gt;Советую прочитать, годная книжка&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;ну и конечно же удобство разработки. Тут можно провести аналогию между wysiwyg &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.blogcdn.com/www.engadget.com/media/2012/06/unity4announced-06-19-12-02-1340108319.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;215&quot; src=&quot;http://www.blogcdn.com/www.engadget.com/media/2012/06/unity4announced-06-19-12-02-1340108319.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
редакторами и чистым текстом. &amp;nbsp;Первые хороши тем, что ты видишь результат непосредственно в процессе редактирования и ты получаешь фидбек почти мгновенно и на основе этого можешь получать потрясающие результаты(более красиво эту мысль раскрыл Брет Виктор -&amp;nbsp;&lt;a href=&quot;http://vimeo.com/36579366&quot; target=&quot;_blank&quot;&gt;inventing on principle&lt;/a&gt;). Вторые рулят там, где нужна экстрафункциональность (естественно, при должном уровне знаний). Те, кто пользовались tex-ом, понимают о чем я говорю. unity примечателен тем, что в нем есть редактор, позволяющий человеку, совершенно незнакомому с программированием,&amp;nbsp;визуально создавать невообразимые фичи, в&amp;nbsp; то же время ты можешь переключиться на уровень &quot;хард-кодинг&quot; и сделать свой собственный лунапарк(c). И конечно, все кроссплатформенно.&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
В разработке больше всего важен результат, нежели процесс. Конечно, unity имеет свою область применимости и всегда можно сделать производительнее или красивее. Но функцию &amp;nbsp;сделать качественно и с минимальными временными затратами unity выполняет безукоризненно.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/3052495708626257491/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/06/unity.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/3052495708626257491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/3052495708626257491'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/06/unity.html' title='Почему Unity?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0mM1NBPZh1DtkPxniv8_bUcSPw6_Ex0khE7yGoiIehapCeCJYgvcRHCp7vID_QEMOKxqTs51fYTzf1-twkUZr4L_jVcHdT94fEcuxU-FEH5vQMJooLIBDJP4fwTmcbdFzXIcjgHqBPFK1/s72-c/Mobile+Game+Development+India.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-6836261401224562192</id><published>2013-06-21T05:07:00.000-07:00</published><updated>2013-07-11T06:46:44.137-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="plugins"/><category scheme="http://www.blogger.com/atom/ns#" term="serialization"/><category scheme="http://www.blogger.com/atom/ns#" term="unity3d"/><title type='text'>All you need to know about serialization in Unity3D</title><content type='html'>&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;270&quot; src=&quot;//www.youtube.com/embed/FXlk3Db0TZA&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
upd: video is removed, so check out this &lt;a href=&quot;http://blogs.unity3d.com/2012/10/25/unity-serialization/&quot; target=&quot;_blank&quot;&gt;link&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/6836261401224562192/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/06/all-you-need-to-know-about.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/6836261401224562192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/6836261401224562192'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/06/all-you-need-to-know-about.html' title='All you need to know about serialization in Unity3D'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-1726169318616072876</id><published>2013-06-12T19:23:00.000-07:00</published><updated>2013-06-12T19:23:22.278-07:00</updated><title type='text'>Lugat sozluk</title><content type='html'>Do you remember our &lt;a href=&quot;https://itunes.apple.com/us/app/cep-lugat/id521577502?mt=8&quot; target=&quot;_blank&quot;&gt;osman-turkish ios dictionary&lt;/a&gt;? I&#39;ve been asked for android version many times.&lt;br /&gt;To those people: there&#39;s &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.yukselis.lugat&amp;amp;hl=en&quot; target=&quot;_blank&quot;&gt;android version&lt;/a&gt;&amp;nbsp;with more than &lt;b&gt;50000 words&lt;/b&gt;! It&#39;s really cool app!&lt;br /&gt;
&lt;br /&gt;
On these holidays I reverse-engineered it and now I have their words database. I just need to convert it to my own format, solve licence issues. I think to finish this by the end of June.</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/1726169318616072876/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/06/lugat-sozluk.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/1726169318616072876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/1726169318616072876'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/06/lugat-sozluk.html' title='Lugat sozluk'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-8715805299527407118</id><published>2013-05-24T01:35:00.002-07:00</published><updated>2013-05-24T01:35:45.711-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="продукт"/><category scheme="http://www.blogger.com/atom/ns#" term="философия"/><title type='text'>Так, ни о чем</title><content type='html'>&lt;span style=&quot;background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;один файл, а внутри: два энама, три класса, две руками написанные стейт-машины, 400 строк кода.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18px;&quot;&gt;Здравствуй, быдлокод:&lt;/span&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://i.imgur.com/wGUTG.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;279&quot; src=&quot;http://i.imgur.com/wGUTG.gif&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br style=&quot;background-color: white; color: #404040; font-family: Roboto, arial, sans-serif; font-size: 13px; line-height: 18px;&quot; /&gt;</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/8715805299527407118/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/05/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/8715805299527407118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/8715805299527407118'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/05/blog-post.html' title='Так, ни о чем'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5756693843338209436.post-4782639833672175072</id><published>2013-05-14T01:56:00.000-07:00</published><updated>2013-05-29T01:10:51.051-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="presentations"/><category scheme="http://www.blogger.com/atom/ns#" term="seminar"/><category scheme="http://www.blogger.com/atom/ns#" term="unity3d"/><category scheme="http://www.blogger.com/atom/ns#" term="useful links"/><title type='text'>Some materials from knowledge sharing seminar</title><content type='html'>&lt;br /&gt;
&lt;br /&gt;
Two months ago we started our unity knowledge sharing seminars. I forgot to share materials I promised to, so let me do it here.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2D UI - NGUI (Presentation on russian)&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;486&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; mozallowfullscreen=&quot;&quot; scrolling=&quot;no&quot; src=&quot;http://www.slideshare.net/slideshow/embed_code/18868680&quot; style=&quot;border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px;&quot; webkitallowfullscreen=&quot;&quot; width=&quot;597&quot;&gt; &lt;/iframe&gt; &lt;br /&gt;
&lt;div style=&quot;margin-bottom: 5px;&quot;&gt;
&lt;strong&gt; &lt;a href=&quot;http://www.slideshare.net/rustamganeyev/2d-in-unity3d&quot; target=&quot;_blank&quot; title=&quot;2D in Unity3D&quot;&gt;2D in Unity3D&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/rustamganeyev&quot; target=&quot;_blank&quot;&gt;Рустам Ганеев&lt;/a&gt;&lt;/strong&gt; &lt;br /&gt;
&lt;br /&gt;
Useful links:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;NGUI: &amp;nbsp;&lt;a href=&quot;http://www.tasharen.com/?page_id=140&quot;&gt;http://www.tasharen.com/?page_id=140&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Optimizations for mobile devices: &lt;a href=&quot;http://docs.unity3d.com/Documentation/Manual/iphone-OptimizedGraphicsMethods.html&quot;&gt;http://docs.unity3d.com/Documentation/Manual/iphone-OptimizedGraphicsMethods.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Developing apps for different resolutions (russian):&amp;nbsp;&lt;a href=&quot;http://rustam-kot.blogspot.ru/2013/03/blog-post_25.html&quot;&gt;http://rustam-kot.blogspot.ru/2013/03/blog-post_25.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cool plugin for NGUI speeds up development and make life easier:&amp;nbsp;&lt;a href=&quot;http://u3d.as/content/monster-juice/fast-gui-for-ngui/3vJ&quot;&gt;http://u3d.as/content/monster-juice/fast-gui-for-ngui/3vJ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
Unity shaders (Presentation on russian)&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;486&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; mozallowfullscreen=&quot;&quot; scrolling=&quot;no&quot; src=&quot;http://www.slideshare.net/slideshow/embed_code/18889827&quot; style=&quot;border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px;&quot; webkitallowfullscreen=&quot;&quot; width=&quot;597&quot;&gt; &lt;/iframe&gt; &lt;br /&gt;
&lt;div style=&quot;margin-bottom: 5px;&quot;&gt;
&lt;strong&gt; &lt;a href=&quot;http://www.slideshare.net/rustamganeyev/shaders-18889827&quot; target=&quot;_blank&quot; title=&quot;Shaders&quot;&gt;Shaders&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/rustamganeyev&quot; target=&quot;_blank&quot;&gt;Рустам Ганеев&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;
Useful links:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.unity3d.com/Documentation/Components/SL-Reference.html&quot;&gt;http://docs.unity3d.com/Documentation/Components/SL-Reference.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter01.html&quot;&gt;http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter01.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cgcookie.com/unity/category/tutorials/shaders-tutorials/&quot;&gt;http://cgcookie.com/unity/category/tutorials/shaders-tutorials/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
UPD: Dustin Lee, the Unity evangelist kindly shared awesome slides about shaders, just check it out:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;486&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; mozallowfullscreen=&quot;&quot; scrolling=&quot;no&quot; src=&quot;http://www.slideshare.net/slideshow/embed_code/20985055&quot; style=&quot;border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px;&quot; webkitallowfullscreen=&quot;&quot; width=&quot;597&quot;&gt; &lt;/iframe&gt; &lt;br /&gt;
&lt;div style=&quot;margin-bottom: 5px;&quot;&gt;
&lt;strong&gt; &lt;a href=&quot;http://www.slideshare.net/MrDustinLee/unity-shadersystemfinal&quot; target=&quot;_blank&quot; title=&quot;Unity Shader System Introduction&quot;&gt;Unity Shader System Introduction&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/MrDustinLee&quot; target=&quot;_blank&quot;&gt;Lee Dustin&lt;/a&gt;&lt;/strong&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
UPD #2:&lt;br /&gt;
&lt;br /&gt;
Habr: 2D in Unity3D &lt;a href=&quot;http://habrahabr.ru/post/122197/&quot;&gt;http://habrahabr.ru/post/122197/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
46 advices on 2D game development. &lt;a href=&quot;http://sicklebrick.com/?p=411&quot;&gt;http://sicklebrick.com/?p=411&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;Orthelo 2D. &lt;a href=&quot;http://www.wyrmtale.com/products/unity3d-components/orthello&quot;&gt;http://www.wyrmtale.com/products/unity3d-components/orthello&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;SM1. &lt;a href=&quot;http://wiki.unity3d.com/index.php?title=SpriteManager&quot;&gt;http://wiki.unity3d.com/index.php?title=SpriteManager&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;SM2. &lt;a href=&quot;http://www.anbsoft.com/middleware/sm2/&quot;&gt;http://www.anbsoft.com/middleware/sm2/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;ex2D (&lt;a href=&quot;http://www.ex-dev.com/ex2d/&quot;&gt;http://www.ex-dev.com/ex2d/&lt;/a&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;2D Toolkit (&lt;a href=&quot;http://unikronsoftware.com/2dtoolkit/&quot;&gt;http://unikronsoftware.com/2dtoolkit/&lt;/a&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://rustam-kot.blogspot.com/feeds/4782639833672175072/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rustam-kot.blogspot.com/2013/05/some-materials-from-knowledge-sharing.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/4782639833672175072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5756693843338209436/posts/default/4782639833672175072'/><link rel='alternate' type='text/html' href='http://rustam-kot.blogspot.com/2013/05/some-materials-from-knowledge-sharing.html' title='Some materials from knowledge sharing seminar'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/05764360320005965789</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>